diff --git a/firmware/config.h b/firmware/config.h old mode 100755 new mode 100644 index 75f1f61..2703b24 --- a/firmware/config.h +++ b/firmware/config.h @@ -1,4 +1,3 @@ - #ifndef __CONFIG_H__ #define __CONFIG_H__ @@ -44,4 +43,4 @@ #define INITIAL_WEBSERVER_TIME 20 -#endif +#endif diff --git a/firmware/firmware.ino b/firmware/firmware.ino old mode 100755 new mode 100644 index 615067b..14481da --- a/firmware/firmware.ino +++ b/firmware/firmware.ino @@ -1,16 +1,33 @@ -#include +// Standard ESP8266 libs #include #include #include #include #include -#include // WiFiManager -#include // https://github.com/hwwong/ESP8266Influxdb auchecken und den ordner in das arduino\library verzeichnis kopieren -#include // Package Adafruit Unified Sensor -#include // Adafruit APDS9960 - https://www.makerfabs.com/index.php?route=product/product&product_id=281 -#include // BME280 - https://www.roboter-bausatz.de/1704/bmp280-barometer-luftdrucksensor?gclid=EAIaIQobChMIlpumj8Hp2wIVFWYbCh01PgmFEAQYAyABEgIwBvD_BwE +// External libs +// We decided to put these libs inside the project folder, because we have a lot +// of issues with finding the right libs (some libs need a specific version, some +// libs have no unique name, some libs are broken, ...). This is not a fine +// software engineering practice, but it was too much of a hassle to get this right, +// so we decided to put everything in version control. This way, we also can control +// the version of the lib, which makes the build process of this project more +// robust to changes. +// IMPORTANT: You need to set the sketch location of your Arduino IDE to the firmware +// folder in order to use the libs. (File -> Preferences -> Sketchbook Location) +#include // WiFiClient +#include // WiFiManager +#include // https://github.com/hwwong/ESP8266Influxdb auchecken und den ordner in das arduino\library verzeichnis kopieren +#include // Package Adafruit Unified Sensor +#include // Adafruit APDS9960 - https://www.makerfabs.com/index.php?route=product/product&product_id=281 +#include // BME280 - https://www.roboter-bausatz.de/1704/bmp280-barometer-luftdrucksensor?gclid=EAIaIQobChMIlpumj8Hp2wIVFWYbCh01PgmFEAQYAyABEgIwBvD_BwE + +// Project includes #include "config.h" + +// IMPORTANT: If you compile the sourcecode and it can't find this file, this is +// indended :) You need to create a config_user.h with your own settings. Use the +// config_user.h.example as a starting point. #include "config_user.h" //*************************************************************************// @@ -246,4 +263,4 @@ void _loop() { } -//*************************************************************************// +//*************************************************************************// diff --git a/firmware/influxdb.ino b/firmware/influxdb.ino old mode 100755 new mode 100644 index a2a3e70..d63e166 --- a/firmware/influxdb.ino +++ b/firmware/influxdb.ino @@ -1,4 +1,3 @@ - void pushToInfluxDB(String device, float sensorValues[]) { uint8_t tries = 0; diff --git a/firmware/libraries/Adafruit_APDS9960_Library/Adafruit_APDS9960.cpp b/firmware/libraries/Adafruit_APDS9960_Library/Adafruit_APDS9960.cpp new file mode 100644 index 0000000..61eadff --- /dev/null +++ b/firmware/libraries/Adafruit_APDS9960_Library/Adafruit_APDS9960.cpp @@ -0,0 +1,577 @@ +/**************************************************************************/ +/*! + @file Adafruit_APDS9960.cpp + @author Ladyada, Dean Miller (Adafruit Industries) + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2017, Adafruit Industries + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/**************************************************************************/ + +#ifdef __AVR + #include +#elif defined(ESP8266) + #include +#endif +#include +#include + +#include "Adafruit_APDS9960.h" + +/*========================================================================*/ +/* PRIVATE FUNCTIONS */ +/*========================================================================*/ + +/**************************************************************************/ +/*! + @brief Implements missing powf function +*/ +/**************************************************************************/ +float powf(const float x, const float y) +{ + return (float)(pow((double)x, (double)y)); +} + +/**************************************************************************/ +/*! + Enables the device + Disables the device (putting it in lower power sleep mode) +*/ +/**************************************************************************/ +void Adafruit_APDS9960::enable(boolean en) +{ + _enable.PON = en; + this->write8(APDS9960_ENABLE, _enable.get()); +} + +/*========================================================================*/ +/* PUBLIC FUNCTIONS */ +/*========================================================================*/ + +/**************************************************************************/ +/*! + Initializes I2C and configures the sensor (call this function before + doing anything else) +*/ +/**************************************************************************/ +boolean Adafruit_APDS9960::begin(uint16_t iTimeMS, apds9960AGain_t aGain, uint8_t addr) +{ + _i2c_init(); + _i2caddr = addr; + + /* Make sure we're actually connected */ + uint8_t x = read8(APDS9960_ID); + if (x != 0xAB) + { + return false; + } + + /* Set default integration time and gain */ + setADCIntegrationTime(iTimeMS); + setADCGain(aGain); + + // disable everything to start + enableGesture(false); + enableProximity(false); + enableColor(false); + + disableColorInterrupt(); + disableProximityInterrupt(); + clearInterrupt(); + + /* Note: by default, the device is in power down mode on bootup */ + enable(false); + delay(10); + enable(true); + delay(10); + + //default to all gesture dimensions + setGestureDimensions(APDS9960_DIMENSIONS_ALL); + setGestureFIFOThreshold(APDS9960_GFIFO_4); + setGestureGain(APDS9960_GGAIN_4); + setGestureProximityThreshold(50); + resetCounts(); + + _gpulse.GPLEN = APDS9960_GPULSE_32US; + _gpulse.GPULSE = 9; //10 pulses + this->write8(APDS9960_GPULSE, _gpulse.get()); + + return true; +} + +/**************************************************************************/ +/*! + Sets the integration time for the ADC of the APDS9960, in millis +*/ +/**************************************************************************/ +void Adafruit_APDS9960::setADCIntegrationTime(uint16_t iTimeMS) +{ + float temp; + + // convert ms into 2.78ms increments + temp = iTimeMS; + temp /= 2.78; + temp = 256 - temp; + if (temp > 255) temp = 255; + if (temp < 0) temp = 0; + + /* Update the timing register */ + write8(APDS9960_ATIME, (uint8_t)temp); +} + +float Adafruit_APDS9960::getADCIntegrationTime(void) +{ + float temp; + + temp = read8(APDS9960_ATIME); + + // convert to units of 2.78 ms + temp = 256 - temp; + temp *= 2.78; + return temp; +} + +/**************************************************************************/ +/*! + Adjusts the color/ALS gain on the APDS9960 (adjusts the sensitivity to light) +*/ +/**************************************************************************/ +void Adafruit_APDS9960::setADCGain(apds9960AGain_t aGain) +{ + _control.AGAIN = aGain; + + /* Update the timing register */ + write8(APDS9960_CONTROL, _control.get()); +} + +apds9960AGain_t Adafruit_APDS9960::getADCGain(void) +{ + return (apds9960AGain_t) ( read8(APDS9960_CONTROL) & 0x03 ); +} + + +/**************************************************************************/ +/*! + Adjusts the Proximity gain on the APDS9960 +*/ +/**************************************************************************/ +void Adafruit_APDS9960::setProxGain(apds9960PGain_t pGain) +{ + _control.PGAIN = pGain; + + /* Update the timing register */ + write8(APDS9960_CONTROL, _control.get()); +} + +apds9960PGain_t Adafruit_APDS9960::getProxGain(void) +{ + return (apds9960PGain_t) ( read8(APDS9960_CONTROL) & 0x0C ); +} + +void Adafruit_APDS9960::setProxPulse(apds9960PPulseLen_t pLen, uint8_t pulses) { + if (pulses < 1) pulses = 1; + if (pulses > 64) pulses = 64; + pulses--; + + _ppulse.PPLEN = pLen; + _ppulse.PPULSE = pulses; + + write8(APDS9960_PPULSE, _ppulse.get()); +} + +/**************************************************************************/ +/*! + Enable proximity readings on APDS9960 +*/ +/**************************************************************************/ +void Adafruit_APDS9960::enableProximity(boolean en) +{ + _enable.PEN = en; + + write8(APDS9960_ENABLE, _enable.get()); +} + +void Adafruit_APDS9960::enableProximityInterrupt() { + _enable.PIEN = 1; + write8(APDS9960_ENABLE, _enable.get()); + clearInterrupt(); +} + +void Adafruit_APDS9960::disableProximityInterrupt() { + _enable.PIEN = 0; + write8(APDS9960_ENABLE, _enable.get()); +} + +void Adafruit_APDS9960::setProximityInterruptThreshold(uint8_t low, uint8_t high, uint8_t persistance){ + write8(APDS9960_PILT, low); + write8(APDS9960_PIHT, high); + + if (persistance > 7) persistance = 7; + _pers.PPERS = persistance; + write8(APDS9960_PERS,_pers.get()); +} + +bool Adafruit_APDS9960::getProximityInterrupt() +{ + _status.set(this->read8(APDS9960_STATUS)); + return _status.PINT; +}; + +/**************************************************************************/ +/*! + Read proximity data +*/ +/**************************************************************************/ +uint8_t Adafruit_APDS9960::readProximity(void) +{ + return read8(APDS9960_PDATA); +} + + +bool Adafruit_APDS9960::gestureValid() +{ + _gstatus.set(this->read8(APDS9960_GSTATUS)); + return _gstatus.GVALID; +} + +void Adafruit_APDS9960::setGestureDimensions(uint8_t dims) +{ + _gconf3.GDIMS = dims; + this->write8(APDS9960_GCONF3, _gconf3.get()); +} + +void Adafruit_APDS9960::setGestureFIFOThreshold(uint8_t thresh) +{ + _gconf1.GFIFOTH = thresh; + this->write8(APDS9960_GCONF1, _gconf1.get()); +} + +void Adafruit_APDS9960::setGestureGain(uint8_t gain) +{ + _gconf2.GGAIN = gain; + this->write8(APDS9960_GCONF2, _gconf2.get()); +} + +void Adafruit_APDS9960::setGestureProximityThreshold(uint8_t thresh) +{ + this->write8(APDS9960_GPENTH, thresh); +} + +void Adafruit_APDS9960::setGestureOffset(uint8_t offset_up, uint8_t offset_down, uint8_t offset_left, uint8_t offset_right) +{ + this->write8(APDS9960_GOFFSET_U, offset_up); + this->write8(APDS9960_GOFFSET_D, offset_down); + this->write8(APDS9960_GOFFSET_L, offset_left); + this->write8(APDS9960_GOFFSET_R, offset_right); +} + +/**************************************************************************/ +/*! + Enable gesture readings on APDS9960 +*/ +/**************************************************************************/ +void Adafruit_APDS9960::enableGesture(boolean en) +{ + if(!en){ + _gconf4.GMODE = 0; + write8(APDS9960_GCONF4, _gconf4.get()); + } + _enable.GEN = en; + write8(APDS9960_ENABLE, _enable.get()); + resetCounts(); +} + +void Adafruit_APDS9960::resetCounts() +{ + gestCnt = 0; + UCount = 0; + DCount = 0; + LCount = 0; + RCount = 0; +} + +uint8_t Adafruit_APDS9960::readGesture(void) +{ + uint8_t toRead, bytesRead; + uint8_t buf[256]; + unsigned long t; + uint8_t gestureReceived; + while(1){ + int up_down_diff = 0; + int left_right_diff = 0; + gestureReceived = 0; + if(!gestureValid()) return 0; + + delay(30); + toRead = this->read8(APDS9960_GFLVL); + + bytesRead = this->read(APDS9960_GFIFO_U, buf, toRead); + + if(abs((int)buf[0] - (int)buf[1]) > 13) + up_down_diff += (int)buf[0] - (int)buf[1]; + + if(abs((int)buf[2] - (int)buf[3]) > 13) + left_right_diff += (int)buf[2] - (int)buf[3]; + + if(up_down_diff != 0){ + if(up_down_diff < 0){ + if( DCount > 0){ + gestureReceived = APDS9960_UP; + } + else UCount++; + } + else if(up_down_diff > 0){ + if( UCount > 0){ + gestureReceived = APDS9960_DOWN; + } + else DCount++; + } + } + + if(left_right_diff != 0){ + if(left_right_diff < 0){ + if( RCount > 0){ + gestureReceived = APDS9960_LEFT; + } + else LCount++; + } + else if(left_right_diff > 0){ + if( LCount > 0){ + gestureReceived = APDS9960_RIGHT; + } + else RCount++; + } + } + + if(up_down_diff != 0 || left_right_diff != 0) t = millis(); + + if(gestureReceived || millis() - t > 300){ + resetCounts(); + return gestureReceived; + } + } +} + +/**************************************************************************/ +/*! + Set LED brightness for proximity/gesture +*/ +/**************************************************************************/ +void Adafruit_APDS9960::setLED(apds9960LedDrive_t drive, apds9960LedBoost_t boost) { + // set BOOST + _config2.LED_BOOST = boost; + write8(APDS9960_CONFIG2, _config2.get()); + + _control.LDRIVE = drive; + write8(APDS9960_CONTROL, _control.get()); +} + +/**************************************************************************/ +/*! + Enable proximity readings on APDS9960 +*/ +/**************************************************************************/ +void Adafruit_APDS9960::enableColor(boolean en) +{ + _enable.AEN = en; + write8(APDS9960_ENABLE, _enable.get()); +} + +bool Adafruit_APDS9960::colorDataReady() +{ + _status.set(this->read8(APDS9960_STATUS)); + return _status.AVALID; +} + +/**************************************************************************/ +/*! + @brief Reads the raw red, green, blue and clear channel values +*/ +/**************************************************************************/ +void Adafruit_APDS9960::getColorData (uint16_t *r, uint16_t *g, uint16_t *b, uint16_t *c) +{ + + *c = read16R(APDS9960_CDATAL); + *r = read16R(APDS9960_RDATAL); + *g = read16R(APDS9960_GDATAL); + *b = read16R(APDS9960_BDATAL); + +} + +/**************************************************************************/ +/*! + @brief Converts the raw R/G/B values to color temperature in degrees + Kelvin +*/ +/**************************************************************************/ +uint16_t Adafruit_APDS9960::calculateColorTemperature(uint16_t r, uint16_t g, uint16_t b) +{ + float X, Y, Z; /* RGB to XYZ correlation */ + float xc, yc; /* Chromaticity co-ordinates */ + float n; /* McCamy's formula */ + float cct; + + /* 1. Map RGB values to their XYZ counterparts. */ + /* Based on 6500K fluorescent, 3000K fluorescent */ + /* and 60W incandescent values for a wide range. */ + /* Note: Y = Illuminance or lux */ + X = (-0.14282F * r) + (1.54924F * g) + (-0.95641F * b); + Y = (-0.32466F * r) + (1.57837F * g) + (-0.73191F * b); + Z = (-0.68202F * r) + (0.77073F * g) + ( 0.56332F * b); + + /* 2. Calculate the chromaticity co-ordinates */ + xc = (X) / (X + Y + Z); + yc = (Y) / (X + Y + Z); + + /* 3. Use McCamy's formula to determine the CCT */ + n = (xc - 0.3320F) / (0.1858F - yc); + + /* Calculate the final CCT */ + cct = (449.0F * powf(n, 3)) + (3525.0F * powf(n, 2)) + (6823.3F * n) + 5520.33F; + + /* Return the results in degrees Kelvin */ + return (uint16_t)cct; +} + +/**************************************************************************/ +/*! + @brief Calculate ambient light values +*/ +/**************************************************************************/ + +uint16_t Adafruit_APDS9960::calculateLux(uint16_t r, uint16_t g, uint16_t b) +{ + float illuminance; + + /* This only uses RGB ... how can we integrate clear or calculate lux */ + /* based exclusively on clear since this might be more reliable? */ + illuminance = (-0.32466F * r) + (1.57837F * g) + (-0.73191F * b); + + return (uint16_t)illuminance; +} + +void Adafruit_APDS9960::enableColorInterrupt() { + _enable.AIEN = 1; + write8(APDS9960_ENABLE, _enable.get()); +} + +void Adafruit_APDS9960::disableColorInterrupt() { + _enable.AIEN = 0; + write8(APDS9960_ENABLE, _enable.get()); +} + +void Adafruit_APDS9960::clearInterrupt(void) { + this->write(APDS9960_AICLEAR, NULL, 0); +} + + +void Adafruit_APDS9960::setIntLimits(uint16_t low, uint16_t high) { + write8(APDS9960_AILTIL, low & 0xFF); + write8(APDS9960_AILTH, low >> 8); + write8(APDS9960_AIHTL, high & 0xFF); + write8(APDS9960_AIHTH, high >> 8); +} + +void Adafruit_APDS9960::write8(byte reg, byte value) +{ + this->write(reg, &value, 1); +} + +uint8_t Adafruit_APDS9960::read8(byte reg) +{ + uint8_t ret; + this->read(reg, &ret, 1); + + return ret; +} + +uint32_t Adafruit_APDS9960::read32(uint8_t reg) +{ + uint8_t ret[4]; + this->read(reg, ret, 4); + + return (ret[0] << 24) | (ret[1] << 16) | (ret[2] << 8) | ret[3]; +} + +uint16_t Adafruit_APDS9960::read16(uint8_t reg) +{ + uint8_t ret[2]; + this->read(reg, ret, 2); + + return (ret[0] << 8) | ret[1]; +} + +uint16_t Adafruit_APDS9960::read16R(uint8_t reg) +{ + uint8_t ret[2]; + this->read(reg, ret, 2); + + return (ret[1] << 8) | ret[0]; +} + +void Adafruit_APDS9960::_i2c_init() +{ + Wire.begin(); +} + +uint8_t Adafruit_APDS9960::read(uint8_t reg, uint8_t *buf, uint8_t num) +{ + uint8_t value; + uint8_t pos = 0; + bool eof = false; + + //on arduino we need to read in 32 byte chunks + while(pos < num && !eof){ + + uint8_t read_now = min(32, num - pos); + Wire.beginTransmission((uint8_t)_i2caddr); + Wire.write((uint8_t)reg + pos); + Wire.endTransmission(); + + Wire.requestFrom((uint8_t)_i2caddr, read_now); + + for(int i=0; i +#include + +#define I2CDEBUG + +/*========================================================================= + I2C ADDRESS/BITS + -----------------------------------------------------------------------*/ + #define APDS9960_ADDRESS (0x39) +/*=========================================================================*/ + +/*========================================================================= + REGISTERS + -----------------------------------------------------------------------*/ + + enum + { + APDS9960_RAM = 0x00, + APDS9960_ENABLE = 0x80, + APDS9960_ATIME = 0x81, + APDS9960_WTIME = 0x83, + APDS9960_AILTIL = 0x84, + APDS9960_AILTH = 0x85, + APDS9960_AIHTL = 0x86, + APDS9960_AIHTH = 0x87, + APDS9960_PILT = 0x89, + APDS9960_PIHT = 0x8B, + APDS9960_PERS = 0x8C, + APDS9960_CONFIG1 = 0x8D, + APDS9960_PPULSE = 0x8E, + APDS9960_CONTROL = 0x8F, + APDS9960_CONFIG2 = 0x90, + APDS9960_ID = 0x92, + APDS9960_STATUS = 0x93, + APDS9960_CDATAL = 0x94, + APDS9960_CDATAH = 0x95, + APDS9960_RDATAL = 0x96, + APDS9960_RDATAH = 0x97, + APDS9960_GDATAL = 0x98, + APDS9960_GDATAH = 0x99, + APDS9960_BDATAL = 0x9A, + APDS9960_BDATAH = 0x9B, + APDS9960_PDATA = 0x9C, + APDS9960_POFFSET_UR = 0x9D, + APDS9960_POFFSET_DL = 0x9E, + APDS9960_CONFIG3 = 0x9F, + APDS9960_GPENTH = 0xA0, + APDS9960_GEXTH = 0xA1, + APDS9960_GCONF1 = 0xA2, + APDS9960_GCONF2 = 0xA3, + APDS9960_GOFFSET_U = 0xA4, + APDS9960_GOFFSET_D = 0xA5, + APDS9960_GOFFSET_L = 0xA7, + APDS9960_GOFFSET_R = 0xA9, + APDS9960_GPULSE = 0xA6, + APDS9960_GCONF3 = 0xAA, + APDS9960_GCONF4 = 0xAB, + APDS9960_GFLVL = 0xAE, + APDS9960_GSTATUS = 0xAF, + APDS9960_IFORCE = 0xE4, + APDS9960_PICLEAR = 0xE5, + APDS9960_CICLEAR = 0xE6, + APDS9960_AICLEAR = 0xE7, + APDS9960_GFIFO_U = 0xFC, + APDS9960_GFIFO_D = 0xFD, + APDS9960_GFIFO_L = 0xFE, + APDS9960_GFIFO_R = 0xFF, + }; + + +/*=========================================================================*/ + +typedef enum +{ + APDS9960_AGAIN_1X = 0x00, /**< No gain */ + APDS9960_AGAIN_4X = 0x01, /**< 2x gain */ + APDS9960_AGAIN_16X = 0x02, /**< 16x gain */ + APDS9960_AGAIN_64X = 0x03 /**< 64x gain */ +} +apds9960AGain_t; + + +typedef enum +{ + APDS9960_PGAIN_1X = 0x00, /**< 1x gain */ + APDS9960_PGAIN_2X = 0x04, /**< 2x gain */ + APDS9960_PGAIN_4X = 0x08, /**< 4x gain */ + APDS9960_PGAIN_8X = 0x0C /**< 8x gain */ +} +apds9960PGain_t; + + +typedef enum +{ + APDS9960_PPULSELEN_4US = 0x00, /**< 4uS */ + APDS9960_PPULSELEN_8US = 0x40, /**< 8uS */ + APDS9960_PPULSELEN_16US = 0x80, /**< 16uS */ + APDS9960_PPULSELEN_32US = 0xC0 /**< 32uS */ +} +apds9960PPulseLen_t; + + +typedef enum +{ + APDS9960_LEDDRIVE_100MA = 0x00, /**< 100mA */ + APDS9960_LEDDRIVE_50MA = 0x40, /**< 50mA */ + APDS9960_LEDDRIVE_25MA = 0x80, /**< 25mA */ + APDS9960_LEDDRIVE_12MA = 0xC0 /**< 12.5mA */ +} +apds9960LedDrive_t; + + +typedef enum +{ + APDS9960_LEDBOOST_100PCNT = 0x00, /**< 100% */ + APDS9960_LEDBOOST_150PCNT = 0x10, /**< 150% */ + APDS9960_LEDBOOST_200PCNT = 0x20, /**< 200% */ + APDS9960_LEDBOOST_300PCNT = 0x30 /**< 300% */ +} +apds9960LedBoost_t; + +enum +{ + APDS9960_DIMENSIONS_ALL = 0x00, + APDS9960_DIMENSIONS_UP_DOWM = 0x01, + APGS9960_DIMENSIONS_LEFT_RIGHT = 0x02, +}; + +enum +{ + APDS9960_GFIFO_1 = 0x00, + APDS9960_GFIFO_4 = 0x01, + APDS9960_GFIFO_8 = 0x02, + APDS9960_GFIFO_16 = 0x03, +}; + +enum +{ + APDS9960_GGAIN_1 = 0x00, + APDS9960_GGAIN_2 = 0x01, + APDS9960_GGAIN_4 = 0x02, + APDS9960_GGAIN_8 = 0x03, +}; + +enum +{ + APDS9960_GPULSE_4US = 0x00, + APDS9960_GPULSE_8US = 0x01, + APDS9960_GPULSE_16US = 0x02, + APDS9960_GPULSE_32US = 0x03, +}; + +#define APDS9960_TIME_MULT 2.78 //millisec + +#define APDS9960_UP 0x01 +#define APDS9960_DOWN 0x02 +#define APDS9960_LEFT 0x03 +#define APDS9960_RIGHT 0x04 + +class Adafruit_APDS9960 { + public: + Adafruit_APDS9960(void) {}; + ~Adafruit_APDS9960(void) {}; + + boolean begin(uint16_t iTimeMS = 10, apds9960AGain_t = APDS9960_AGAIN_4X, uint8_t addr = APDS9960_ADDRESS); + void setADCIntegrationTime(uint16_t iTimeMS); + float getADCIntegrationTime(void); + void setADCGain(apds9960AGain_t gain); + apds9960AGain_t getADCGain(void); + void setLED(apds9960LedDrive_t drive, apds9960LedBoost_t boost); + + // proximity + void enableProximity(boolean en = true); + void setProxGain(apds9960PGain_t gain); + apds9960PGain_t getProxGain(void); + void setProxPulse(apds9960PPulseLen_t pLen, uint8_t pulses); + void enableProximityInterrupt(); + void disableProximityInterrupt(); + uint8_t readProximity(void); + void setProximityInterruptThreshold(uint8_t low, uint8_t high, uint8_t persistance = 4); + bool getProximityInterrupt(); + + // gesture + void enableGesture(boolean en = true); + bool gestureValid(); + void setGestureDimensions(uint8_t dims); + void setGestureFIFOThreshold(uint8_t thresh); + void setGestureGain(uint8_t gain); + void setGestureProximityThreshold(uint8_t thresh); + void setGestureOffset(uint8_t offset_up, uint8_t offset_down, uint8_t offset_left, uint8_t offset_right); + uint8_t readGesture(void); + void resetCounts(); + + // light & color + void enableColor(boolean en = true); + bool colorDataReady(); + void getColorData(uint16_t *r, uint16_t *g, uint16_t *b, uint16_t *c); + uint16_t calculateColorTemperature(uint16_t r, uint16_t g, uint16_t b); + uint16_t calculateLux(uint16_t r, uint16_t g, uint16_t b); + void enableColorInterrupt(); + void disableColorInterrupt(); + void clearInterrupt(void); + void setIntLimits(uint16_t l, uint16_t h); + + // turn on/off elements + void enable(boolean en = true); + + + private: + uint8_t _i2caddr; + + uint32_t read32(uint8_t reg); + uint16_t read16(uint8_t reg); + uint16_t read16R(uint8_t reg); + + void write8(byte reg, byte value); + uint8_t read8(byte reg); + + uint8_t gestCnt; + + uint8_t UCount; + uint8_t DCount; + + uint8_t LCount; + uint8_t RCount; + + uint8_t read(uint8_t reg, uint8_t *buf, uint8_t num); + void write(uint8_t reg, uint8_t *buf, uint8_t num); + void _i2c_init(); + + struct enable { + + //power on + uint8_t PON : 1; + + //ALS enable + uint8_t AEN : 1; + + //Proximity detect enable + uint8_t PEN : 1; + + //wait timer enable + uint8_t WEN : 1; + + //ALS interrupt enable + uint8_t AIEN : 1; + + //proximity interrupt enable + uint8_t PIEN : 1; + + //gesture enable + uint8_t GEN : 1; + + uint8_t get() { + return (GEN << 6) | (PIEN << 5) | (AIEN << 4) | (WEN << 3) | (PEN << 2) | (AEN << 1) | PON; + }; + }; + struct enable _enable; + + struct pers { + //ALS Interrupt Persistence. Controls rate of Clear channel interrupt to the host processor + uint8_t APERS : 4; + + //proximity interrupt persistence, controls rate of prox interrupt to host processor + uint8_t PPERS : 4; + + uint8_t get(){ + return (PPERS << 4) | APERS; + }; + }; + pers _pers; + + struct config1 { + uint8_t WLONG : 1; + + uint8_t get(){ + return WLONG << 1; + }; + }; + config1 _config1; + + struct ppulse { + + /*Proximity Pulse Count. Specifies the number of proximity pulses to be generated on LDR. + Number of pulses is set by PPULSE value plus 1. + */ + uint8_t PPULSE : 6; + + //Proximity Pulse Length. Sets the LED-ON pulse width during a proximity LDR pulse. + uint8_t PPLEN : 2; + + uint8_t get(){ + return (PPLEN << 6) | PPULSE; + } + }; + ppulse _ppulse; + + struct control { + //ALS and Color gain control + uint8_t AGAIN : 2; + + //proximity gain control + uint8_t PGAIN : 2; + + //led drive strength + uint8_t LDRIVE : 2; + + uint8_t get(){ + return (LDRIVE << 6) | (PGAIN << 2) | AGAIN; + } + }; + control _control; + + struct config2 { + /* Additional LDR current during proximity and gesture LED pulses. Current value, set by LDRIVE, + is increased by the percentage of LED_BOOST. + */ + uint8_t LED_BOOST : 2; + + //clear photodiode saturation int enable + uint8_t CPSIEN : 1; + + //proximity saturation interrupt enable + uint8_t PSIEN : 1; + + uint8_t get(){ + return (PSIEN << 7) | (CPSIEN << 6) | (LED_BOOST << 4) | 1; + } + }; + config2 _config2; + + struct status { + /* ALS Valid. Indicates that an ALS cycle has completed since AEN was asserted or since a read + from any of the ALS/Color data registers. + */ + uint8_t AVALID : 1; + + /* Proximity Valid. Indicates that a proximity cycle has completed since PEN was asserted or since + PDATA was last read. A read of PDATA automatically clears PVALID. + */ + uint8_t PVALID : 1; + + /* Gesture Interrupt. GINT is asserted when GFVLV becomes greater than GFIFOTH or if GVALID + has become asserted when GMODE transitioned to zero. The bit is reset when FIFO is + completely emptied (read). + */ + uint8_t GINT : 1; + + //ALS Interrupt. This bit triggers an interrupt if AIEN in ENABLE is set. + uint8_t AINT : 1; + + //Proximity Interrupt. This bit triggers an interrupt if PIEN in ENABLE is set. + uint8_t PINT : 1; + + /* Indicates that an analog saturation event occurred during a previous proximity or gesture + cycle. Once set, this bit remains set until cleared by clear proximity interrupt special function + command (0xE5 PICLEAR) or by disabling Prox (PEN=0). This bit triggers an interrupt if PSIEN + is set. + */ + uint8_t PGSAT : 1; + + /* Clear Photodiode Saturation. When asserted, the analog sensor was at the upper end of its + dynamic range. The bit can be de-asserted by sending a Clear channel interrupt command + (0xE6 CICLEAR) or by disabling the ADC (AEN=0). This bit triggers an interrupt if CPSIEN is set. + */ + uint8_t CPSAT : 1; + + void set(uint8_t data){ + AVALID = data & 0x01; + PVALID = (data >> 1) & 0x01; + GINT = (data >> 2) & 0x01; + AINT = (data >> 4) & 0x01; + PINT = (data >> 5) & 0x01; + PGSAT = (data >> 6) & 0x01; + CPSAT = (data >> 7) & 0x01; + } + }; + status _status; + + struct config3 { + //proximity mask + uint8_t PMASK_R : 1; + uint8_t PMASK_L : 1; + uint8_t PMASK_D : 1; + uint8_t PMASK_U : 1; + + /* Sleep After Interrupt. When enabled, the device will automatically enter low power mode + when the INT pin is asserted and the state machine has progressed to the SAI decision block. + Normal operation is resumed when INT pin is cleared over I2C. + */ + uint8_t SAI : 1; + + /* Proximity Gain Compensation Enable. This bit provides gain compensation when proximity + photodiode signal is reduced as a result of sensor masking. If only one diode of the diode pair + is contributing, then only half of the signal is available at the ADC; this results in a maximum + ADC value of 127. Enabling PCMP enables an additional gain of 2X, resulting in a maximum + ADC value of 255. + */ + uint8_t PCMP : 1; + + uint8_t get(){ + return (PCMP << 5) | (SAI << 4) | (PMASK_U << 3) | (PMASK_D << 2) | (PMASK_L << 1) | PMASK_R; + } + }; + config3 _config3; + + struct gconf1 { + /* Gesture Exit Persistence. When a number of consecutive “gesture end” occurrences become + equal or greater to the GEPERS value, the Gesture state machine is exited. + */ + uint8_t GEXPERS : 2; + + /* Gesture Exit Mask. Controls which of the gesture detector photodiodes (UDLR) will be included + to determine a “gesture end” and subsequent exit of the gesture state machine. Unmasked + UDLR data will be compared with the value in GTHR_OUT. Field value bits correspond to UDLR + detectors. + */ + uint8_t GEXMSK : 4; + + /* Gesture FIFO Threshold. This value is compared with the FIFO Level (i.e. the number of UDLR + datasets) to generate an interrupt (if enabled). + */ + uint8_t GFIFOTH : 2; + + uint8_t get(){ + return (GFIFOTH << 6) | (GEXMSK << 2) | GEXPERS; + } + }; + gconf1 _gconf1; + + struct gconf2 { + /* Gesture Wait Time. The GWTIME controls the amount of time in a low power mode between + gesture detection cycles. + */ + uint8_t GWTIME : 3; + + //Gesture LED Drive Strength. Sets LED Drive Strength in gesture mode. + uint8_t GLDRIVE : 2; + + //Gesture Gain Control. Sets the gain of the proximity receiver in gesture mode. + uint8_t GGAIN : 2; + + uint8_t get(){ + return (GGAIN << 5) | (GLDRIVE << 3) | GWTIME; + } + }; + gconf2 _gconf2; + + struct gpulse { + /* Number of Gesture Pulses. Specifies the number of pulses to be generated on LDR. + Number of pulses is set by GPULSE value plus 1. + */ + uint8_t GPULSE : 6; + + //Gesture Pulse Length. Sets the LED_ON pulse width during a Gesture LDR Pulse. + uint8_t GPLEN : 2; + + uint8_t get(){ + return (GPLEN << 6) | GPULSE; + } + }; + gpulse _gpulse; + + struct gconf3 { + /* Gesture Dimension Select. Selects which gesture photodiode pairs are enabled to gather + results during gesture. + */ + uint8_t GDIMS : 2; + + uint8_t get(){ + return GDIMS; + } + }; + gconf3 _gconf3; + + struct gconf4 { + /* Gesture Mode. Reading this bit reports if the gesture state machine is actively running, 1 + = Gesture, 0= ALS, Proximity, Color. Writing a 1 to this bit causes immediate entry in to the + gesture state machine (as if GPENTH had been exceeded). Writing a 0 to this bit causes exit of + gesture when current analog conversion has finished (as if GEXTH had been exceeded). + */ + uint8_t GMODE : 1; + + /* Gesture interrupt enable. Gesture Interrupt Enable. When asserted, all gesture related + interrupts are unmasked. + */ + uint8_t GIEN : 2; + + uint8_t get(){ + return (GIEN << 1) | GMODE; + } + void set(uint8_t data){ + GIEN = (data >> 1) & 0x01; + GMODE = data & 0x01; + } + }; + gconf4 _gconf4; + + struct gstatus { + /* Gesture FIFO Data. GVALID bit is sent when GFLVL becomes greater than GFIFOTH (i.e. FIFO has + enough data to set GINT). GFIFOD is reset when GMODE = 0 and the GFLVL=0 (i.e. All FIFO data + has been read). + */ + uint8_t GVALID : 1; + + /* Gesture FIFO Overflow. A setting of 1 indicates that the FIFO has filled to capacity and that new + gesture detector data has been lost. + */ + uint8_t GFOV : 1; + + void set(uint8_t data){ + GFOV = (data >> 1) & 0x01; + GVALID = data & 0x01; + } + }; + gstatus _gstatus; + +}; + +#endif diff --git a/firmware/libraries/Adafruit_APDS9960_Library/examples/color_sensor/color_sensor.ino b/firmware/libraries/Adafruit_APDS9960_Library/examples/color_sensor/color_sensor.ino new file mode 100644 index 0000000..938394f --- /dev/null +++ b/firmware/libraries/Adafruit_APDS9960_Library/examples/color_sensor/color_sensor.ino @@ -0,0 +1,59 @@ +/*************************************************************************** + This is a library for the APDS9960 digital proximity, ambient light, RGB, and gesture sensor + + This sketch puts the sensor in color mode and reads the RGB and clear values. + + Designed specifically to work with the Adafruit APDS9960 breakout + ----> http://www.adafruit.com/products/3595 + + These sensors use I2C to communicate. The device's I2C address is 0x39 + + Adafruit invests time and resources providing this open source code, + please support Adafruit andopen-source hardware by purchasing products + from Adafruit! + + Written by Dean Miller for Adafruit Industries. + BSD license, all text above must be included in any redistribution + ***************************************************************************/ + +#include "Adafruit_APDS9960.h" +Adafruit_APDS9960 apds; + +void setup() { + Serial.begin(115200); + + if(!apds.begin()){ + Serial.println("failed to initialize device! Please check your wiring."); + } + else Serial.println("Device initialized!"); + + //enable color sensign mode + apds.enableColor(true); +} + +void loop() { + //create some variables to store the color data in + uint16_t r, g, b, c; + + //wait for color data to be ready + while(!apds.colorDataReady()){ + delay(5); + } + + //get the data and print the different channels + apds.getColorData(&r, &g, &b, &c); + Serial.print("red: "); + Serial.print(r); + + Serial.print(" green: "); + Serial.print(g); + + Serial.print(" blue: "); + Serial.print(b); + + Serial.print(" clear: "); + Serial.println(c); + Serial.println(); + + delay(500); +} \ No newline at end of file diff --git a/firmware/libraries/Adafruit_APDS9960_Library/examples/gesture_sensor/gesture_sensor.ino b/firmware/libraries/Adafruit_APDS9960_Library/examples/gesture_sensor/gesture_sensor.ino new file mode 100644 index 0000000..fcbfa1e --- /dev/null +++ b/firmware/libraries/Adafruit_APDS9960_Library/examples/gesture_sensor/gesture_sensor.ino @@ -0,0 +1,47 @@ +/*************************************************************************** + This is a library for the APDS9960 digital proximity, ambient light, RGB, and gesture sensor + + This sketch puts the sensor in gesture mode and decodes gestures. + To use this, first put your hand close to the sensor to enable gesture mode. + Then move your hand about 6" from the sensor in the up -> down, down -> up, + left -> right, or right -> left direction. + + Designed specifically to work with the Adafruit APDS9960 breakout + ----> http://www.adafruit.com/products/3595 + + These sensors use I2C to communicate. The device's I2C address is 0x39 + + Adafruit invests time and resources providing this open source code, + please support Adafruit andopen-source hardware by purchasing products + from Adafruit! + + Written by Dean Miller for Adafruit Industries. + BSD license, all text above must be included in any redistribution + ***************************************************************************/ + +#include "Adafruit_APDS9960.h" +Adafruit_APDS9960 apds; + +// the setup function runs once when you press reset or power the board +void setup() { + Serial.begin(115200); + + if(!apds.begin()){ + Serial.println("failed to initialize device! Please check your wiring."); + } + else Serial.println("Device initialized!"); + + //gesture mode will be entered once proximity mode senses something close + apds.enableProximity(true); + apds.enableGesture(true); +} + +// the loop function runs over and over again forever +void loop() { + //read a gesture from the device + uint8_t gesture = apds.readGesture(); + if(gesture == APDS9960_DOWN) Serial.println("v"); + if(gesture == APDS9960_UP) Serial.println("^"); + if(gesture == APDS9960_LEFT) Serial.println("<"); + if(gesture == APDS9960_RIGHT) Serial.println(">"); +} \ No newline at end of file diff --git a/firmware/libraries/Adafruit_APDS9960_Library/examples/proximity_sensor/proximity_sensor.ino b/firmware/libraries/Adafruit_APDS9960_Library/examples/proximity_sensor/proximity_sensor.ino new file mode 100644 index 0000000..61cbadd --- /dev/null +++ b/firmware/libraries/Adafruit_APDS9960_Library/examples/proximity_sensor/proximity_sensor.ino @@ -0,0 +1,56 @@ +/*************************************************************************** + This is a library for the APDS9960 digital proximity, ambient light, RGB, and gesture sensor + + This sketch puts the sensor in proximity mode and enables the interrupt + to fire when proximity goes over a set value + + Designed specifically to work with the Adafruit APDS9960 breakout + ----> http://www.adafruit.com/products/3595 + + These sensors use I2C to communicate. The device's I2C address is 0x39 + + Adafruit invests time and resources providing this open source code, + please support Adafruit andopen-source hardware by purchasing products + from Adafruit! + + Written by Dean Miller for Adafruit Industries. + BSD license, all text above must be included in any redistribution + ***************************************************************************/ + +#include "Adafruit_APDS9960.h" + +//the pin that the interrupt is attached to +#define INT_PIN 3 + +//create the APDS9960 object +Adafruit_APDS9960 apds; + +void setup() { + Serial.begin(115200); + pinMode(INT_PIN, INPUT_PULLUP); + + if(!apds.begin()){ + Serial.println("failed to initialize device! Please check your wiring."); + } + else Serial.println("Device initialized!"); + + //enable proximity mode + apds.enableProximity(true); + + //set the interrupt threshold to fire when proximity reading goes above 175 + apds.setProximityInterruptThreshold(0, 175); + + //enable the proximity interrupt + apds.enableProximityInterrupt(); +} + +void loop() { + + //print the proximity reading when the interrupt pin goes low + if(!digitalRead(INT_PIN)){ + Serial.println(apds.readProximity()); + + //clear the interrupt + apds.clearInterrupt(); + } +} \ No newline at end of file diff --git a/firmware/libraries/Adafruit_APDS9960_Library/library.properties b/firmware/libraries/Adafruit_APDS9960_Library/library.properties new file mode 100644 index 0000000..87306de --- /dev/null +++ b/firmware/libraries/Adafruit_APDS9960_Library/library.properties @@ -0,0 +1,9 @@ +name=Adafruit APDS9960 Library +version=1.0.5 +author=Adafruit +maintainer=Adafruit +sentence=This is a library for the Adafruit APDS9960 gesture/proximity/color/light sensor. +paragraph=This is a library for the Adafruit APDS9960 gesture/proximity/color/light sensor. +category=Sensors +url=https://github.com/adafruit/Adafruit_APDS9960 +architectures=* diff --git a/firmware/libraries/Adafruit_BME280_Library/Adafruit_BME280.cpp b/firmware/libraries/Adafruit_BME280_Library/Adafruit_BME280.cpp new file mode 100644 index 0000000..373b5a7 --- /dev/null +++ b/firmware/libraries/Adafruit_BME280_Library/Adafruit_BME280.cpp @@ -0,0 +1,530 @@ +/*************************************************************************** + This is a library for the BME280 humidity, temperature & pressure sensor + + Designed specifically to work with the Adafruit BME280 Breakout + ----> http://www.adafruit.com/products/2650 + + These sensors use I2C or SPI to communicate, 2 or 4 pins are required + to interface. + + Adafruit invests time and resources providing this open source code, + please support Adafruit andopen-source hardware by purchasing products + from Adafruit! + + Written by Limor Fried & Kevin Townsend for Adafruit Industries. + BSD license, all text above must be included in any redistribution + ***************************************************************************/ +#include "Arduino.h" +#include +#include +#include "Adafruit_BME280.h" + +/*************************************************************************** + PRIVATE FUNCTIONS + ***************************************************************************/ +Adafruit_BME280::Adafruit_BME280() + : _cs(-1), _mosi(-1), _miso(-1), _sck(-1) +{ } + +Adafruit_BME280::Adafruit_BME280(int8_t cspin) + : _cs(cspin), _mosi(-1), _miso(-1), _sck(-1) +{ } + +Adafruit_BME280::Adafruit_BME280(int8_t cspin, int8_t mosipin, int8_t misopin, int8_t sckpin) + : _cs(cspin), _mosi(mosipin), _miso(misopin), _sck(sckpin) +{ } + + +/**************************************************************************/ +/*! + @brief Initialise sensor with given parameters / settings +*/ +/**************************************************************************/ +bool Adafruit_BME280::begin(TwoWire *theWire) +{ + _wire = theWire; + _i2caddr = BME280_ADDRESS; + return init(); +} + +bool Adafruit_BME280::begin(uint8_t addr) +{ + _i2caddr = addr; + _wire = &Wire; + return init(); +} + +bool Adafruit_BME280::begin(uint8_t addr, TwoWire *theWire) +{ + _i2caddr = addr; + _wire = theWire; + return init(); +} + +bool Adafruit_BME280::begin(void) +{ + _i2caddr = BME280_ADDRESS; + _wire = &Wire; + return init(); +} + +bool Adafruit_BME280::init() +{ + // init I2C or SPI sensor interface + if (_cs == -1) { + // I2C + _wire -> begin(); + } else { + digitalWrite(_cs, HIGH); + pinMode(_cs, OUTPUT); + if (_sck == -1) { + // hardware SPI + SPI.begin(); + } else { + // software SPI + pinMode(_sck, OUTPUT); + pinMode(_mosi, OUTPUT); + pinMode(_miso, INPUT); + } + } + + // check if sensor, i.e. the chip ID is correct + if (read8(BME280_REGISTER_CHIPID) != 0x60) + return false; + + // reset the device using soft-reset + // this makes sure the IIR is off, etc. + write8(BME280_REGISTER_SOFTRESET, 0xB6); + + // wait for chip to wake up. + delay(300); + + // if chip is still reading calibration, delay + while (isReadingCalibration()) + delay(100); + + readCoefficients(); // read trimming parameters, see DS 4.2.2 + + setSampling(); // use defaults + + delay(100); + + return true; +} + +/**************************************************************************/ +/*! + @brief setup sensor with given parameters / settings + + This is simply a overload to the normal begin()-function, so SPI users + don't get confused about the library requiring an address. +*/ +/**************************************************************************/ + + +void Adafruit_BME280::setSampling(sensor_mode mode, + sensor_sampling tempSampling, + sensor_sampling pressSampling, + sensor_sampling humSampling, + sensor_filter filter, + standby_duration duration) { + _measReg.mode = mode; + _measReg.osrs_t = tempSampling; + _measReg.osrs_p = pressSampling; + + + _humReg.osrs_h = humSampling; + _configReg.filter = filter; + _configReg.t_sb = duration; + + + // you must make sure to also set REGISTER_CONTROL after setting the + // CONTROLHUMID register, otherwise the values won't be applied (see DS 5.4.3) + write8(BME280_REGISTER_CONTROLHUMID, _humReg.get()); + write8(BME280_REGISTER_CONFIG, _configReg.get()); + write8(BME280_REGISTER_CONTROL, _measReg.get()); +} + + +/**************************************************************************/ +/*! + @brief Encapsulate hardware and software SPI transfer into one function +*/ +/**************************************************************************/ +uint8_t Adafruit_BME280::spixfer(uint8_t x) { + // hardware SPI + if (_sck == -1) + return SPI.transfer(x); + + // software SPI + uint8_t reply = 0; + for (int i=7; i>=0; i--) { + reply <<= 1; + digitalWrite(_sck, LOW); + digitalWrite(_mosi, x & (1< beginTransmission((uint8_t)_i2caddr); + _wire -> write((uint8_t)reg); + _wire -> write((uint8_t)value); + _wire -> endTransmission(); + } else { + if (_sck == -1) + SPI.beginTransaction(SPISettings(500000, MSBFIRST, SPI_MODE0)); + digitalWrite(_cs, LOW); + spixfer(reg & ~0x80); // write, bit 7 low + spixfer(value); + digitalWrite(_cs, HIGH); + if (_sck == -1) + SPI.endTransaction(); // release the SPI bus + } +} + + +/**************************************************************************/ +/*! + @brief Reads an 8 bit value over I2C or SPI +*/ +/**************************************************************************/ +uint8_t Adafruit_BME280::read8(byte reg) { + uint8_t value; + + if (_cs == -1) { + _wire -> beginTransmission((uint8_t)_i2caddr); + _wire -> write((uint8_t)reg); + _wire -> endTransmission(); + _wire -> requestFrom((uint8_t)_i2caddr, (byte)1); + value = _wire -> read(); + } else { + if (_sck == -1) + SPI.beginTransaction(SPISettings(500000, MSBFIRST, SPI_MODE0)); + digitalWrite(_cs, LOW); + spixfer(reg | 0x80); // read, bit 7 high + value = spixfer(0); + digitalWrite(_cs, HIGH); + if (_sck == -1) + SPI.endTransaction(); // release the SPI bus + } + return value; +} + + +/**************************************************************************/ +/*! + @brief Reads a 16 bit value over I2C or SPI +*/ +/**************************************************************************/ +uint16_t Adafruit_BME280::read16(byte reg) +{ + uint16_t value; + + if (_cs == -1) { + _wire -> beginTransmission((uint8_t)_i2caddr); + _wire -> write((uint8_t)reg); + _wire -> endTransmission(); + _wire -> requestFrom((uint8_t)_i2caddr, (byte)2); + value = (_wire -> read() << 8) | _wire -> read(); + } else { + if (_sck == -1) + SPI.beginTransaction(SPISettings(500000, MSBFIRST, SPI_MODE0)); + digitalWrite(_cs, LOW); + spixfer(reg | 0x80); // read, bit 7 high + value = (spixfer(0) << 8) | spixfer(0); + digitalWrite(_cs, HIGH); + if (_sck == -1) + SPI.endTransaction(); // release the SPI bus + } + + return value; +} + + +/**************************************************************************/ +/*! + +*/ +/**************************************************************************/ +uint16_t Adafruit_BME280::read16_LE(byte reg) { + uint16_t temp = read16(reg); + return (temp >> 8) | (temp << 8); +} + + +/**************************************************************************/ +/*! + @brief Reads a signed 16 bit value over I2C or SPI +*/ +/**************************************************************************/ +int16_t Adafruit_BME280::readS16(byte reg) +{ + return (int16_t)read16(reg); +} + + +/**************************************************************************/ +/*! + +*/ +/**************************************************************************/ +int16_t Adafruit_BME280::readS16_LE(byte reg) +{ + return (int16_t)read16_LE(reg); +} + + +/**************************************************************************/ +/*! + @brief Reads a 24 bit value over I2C +*/ +/**************************************************************************/ +uint32_t Adafruit_BME280::read24(byte reg) +{ + uint32_t value; + + if (_cs == -1) { + _wire -> beginTransmission((uint8_t)_i2caddr); + _wire -> write((uint8_t)reg); + _wire -> endTransmission(); + _wire -> requestFrom((uint8_t)_i2caddr, (byte)3); + + value = _wire -> read(); + value <<= 8; + value |= _wire -> read(); + value <<= 8; + value |= _wire -> read(); + } else { + if (_sck == -1) + SPI.beginTransaction(SPISettings(500000, MSBFIRST, SPI_MODE0)); + digitalWrite(_cs, LOW); + spixfer(reg | 0x80); // read, bit 7 high + + value = spixfer(0); + value <<= 8; + value |= spixfer(0); + value <<= 8; + value |= spixfer(0); + + digitalWrite(_cs, HIGH); + if (_sck == -1) + SPI.endTransaction(); // release the SPI bus + } + + return value; +} + + +/**************************************************************************/ +/*! + @brief Take a new measurement (only possible in forced mode) +*/ +/**************************************************************************/ +void Adafruit_BME280::takeForcedMeasurement() +{ + // If we are in forced mode, the BME sensor goes back to sleep after each + // measurement and we need to set it to forced mode once at this point, so + // it will take the next measurement and then return to sleep again. + // In normal mode simply does new measurements periodically. + if (_measReg.mode == MODE_FORCED) { + // set to forced mode, i.e. "take next measurement" + write8(BME280_REGISTER_CONTROL, _measReg.get()); + // wait until measurement has been completed, otherwise we would read + // the values from the last measurement + while (read8(BME280_REGISTER_STATUS) & 0x08) + delay(1); + } +} + + +/**************************************************************************/ +/*! + @brief Reads the factory-set coefficients +*/ +/**************************************************************************/ +void Adafruit_BME280::readCoefficients(void) +{ + _bme280_calib.dig_T1 = read16_LE(BME280_REGISTER_DIG_T1); + _bme280_calib.dig_T2 = readS16_LE(BME280_REGISTER_DIG_T2); + _bme280_calib.dig_T3 = readS16_LE(BME280_REGISTER_DIG_T3); + + _bme280_calib.dig_P1 = read16_LE(BME280_REGISTER_DIG_P1); + _bme280_calib.dig_P2 = readS16_LE(BME280_REGISTER_DIG_P2); + _bme280_calib.dig_P3 = readS16_LE(BME280_REGISTER_DIG_P3); + _bme280_calib.dig_P4 = readS16_LE(BME280_REGISTER_DIG_P4); + _bme280_calib.dig_P5 = readS16_LE(BME280_REGISTER_DIG_P5); + _bme280_calib.dig_P6 = readS16_LE(BME280_REGISTER_DIG_P6); + _bme280_calib.dig_P7 = readS16_LE(BME280_REGISTER_DIG_P7); + _bme280_calib.dig_P8 = readS16_LE(BME280_REGISTER_DIG_P8); + _bme280_calib.dig_P9 = readS16_LE(BME280_REGISTER_DIG_P9); + + _bme280_calib.dig_H1 = read8(BME280_REGISTER_DIG_H1); + _bme280_calib.dig_H2 = readS16_LE(BME280_REGISTER_DIG_H2); + _bme280_calib.dig_H3 = read8(BME280_REGISTER_DIG_H3); + _bme280_calib.dig_H4 = (read8(BME280_REGISTER_DIG_H4) << 4) | (read8(BME280_REGISTER_DIG_H4+1) & 0xF); + _bme280_calib.dig_H5 = (read8(BME280_REGISTER_DIG_H5+1) << 4) | (read8(BME280_REGISTER_DIG_H5) >> 4); + _bme280_calib.dig_H6 = (int8_t)read8(BME280_REGISTER_DIG_H6); +} + +/**************************************************************************/ +/*! + @brief return true if chip is busy reading cal data +*/ +/**************************************************************************/ +bool Adafruit_BME280::isReadingCalibration(void) +{ + uint8_t const rStatus = read8(BME280_REGISTER_STATUS); + + return (rStatus & (1 << 0)) != 0; +} + + +/**************************************************************************/ +/*! + @brief Returns the temperature from the sensor +*/ +/**************************************************************************/ +float Adafruit_BME280::readTemperature(void) +{ + int32_t var1, var2; + + int32_t adc_T = read24(BME280_REGISTER_TEMPDATA); + if (adc_T == 0x800000) // value in case temp measurement was disabled + return NAN; + adc_T >>= 4; + + var1 = ((((adc_T>>3) - ((int32_t)_bme280_calib.dig_T1 <<1))) * + ((int32_t)_bme280_calib.dig_T2)) >> 11; + + var2 = (((((adc_T>>4) - ((int32_t)_bme280_calib.dig_T1)) * + ((adc_T>>4) - ((int32_t)_bme280_calib.dig_T1))) >> 12) * + ((int32_t)_bme280_calib.dig_T3)) >> 14; + + t_fine = var1 + var2; + + float T = (t_fine * 5 + 128) >> 8; + return T/100; +} + + +/**************************************************************************/ +/*! + @brief Returns the temperature from the sensor +*/ +/**************************************************************************/ +float Adafruit_BME280::readPressure(void) { + int64_t var1, var2, p; + + readTemperature(); // must be done first to get t_fine + + int32_t adc_P = read24(BME280_REGISTER_PRESSUREDATA); + if (adc_P == 0x800000) // value in case pressure measurement was disabled + return NAN; + adc_P >>= 4; + + var1 = ((int64_t)t_fine) - 128000; + var2 = var1 * var1 * (int64_t)_bme280_calib.dig_P6; + var2 = var2 + ((var1*(int64_t)_bme280_calib.dig_P5)<<17); + var2 = var2 + (((int64_t)_bme280_calib.dig_P4)<<35); + var1 = ((var1 * var1 * (int64_t)_bme280_calib.dig_P3)>>8) + + ((var1 * (int64_t)_bme280_calib.dig_P2)<<12); + var1 = (((((int64_t)1)<<47)+var1))*((int64_t)_bme280_calib.dig_P1)>>33; + + if (var1 == 0) { + return 0; // avoid exception caused by division by zero + } + p = 1048576 - adc_P; + p = (((p<<31) - var2)*3125) / var1; + var1 = (((int64_t)_bme280_calib.dig_P9) * (p>>13) * (p>>13)) >> 25; + var2 = (((int64_t)_bme280_calib.dig_P8) * p) >> 19; + + p = ((p + var1 + var2) >> 8) + (((int64_t)_bme280_calib.dig_P7)<<4); + return (float)p/256; +} + + +/**************************************************************************/ +/*! + @brief Returns the humidity from the sensor +*/ +/**************************************************************************/ +float Adafruit_BME280::readHumidity(void) { + readTemperature(); // must be done first to get t_fine + + int32_t adc_H = read16(BME280_REGISTER_HUMIDDATA); + if (adc_H == 0x8000) // value in case humidity measurement was disabled + return NAN; + + int32_t v_x1_u32r; + + v_x1_u32r = (t_fine - ((int32_t)76800)); + + v_x1_u32r = (((((adc_H << 14) - (((int32_t)_bme280_calib.dig_H4) << 20) - + (((int32_t)_bme280_calib.dig_H5) * v_x1_u32r)) + ((int32_t)16384)) >> 15) * + (((((((v_x1_u32r * ((int32_t)_bme280_calib.dig_H6)) >> 10) * + (((v_x1_u32r * ((int32_t)_bme280_calib.dig_H3)) >> 11) + ((int32_t)32768))) >> 10) + + ((int32_t)2097152)) * ((int32_t)_bme280_calib.dig_H2) + 8192) >> 14)); + + v_x1_u32r = (v_x1_u32r - (((((v_x1_u32r >> 15) * (v_x1_u32r >> 15)) >> 7) * + ((int32_t)_bme280_calib.dig_H1)) >> 4)); + + v_x1_u32r = (v_x1_u32r < 0) ? 0 : v_x1_u32r; + v_x1_u32r = (v_x1_u32r > 419430400) ? 419430400 : v_x1_u32r; + float h = (v_x1_u32r>>12); + return h / 1024.0; +} + + +/**************************************************************************/ +/*! + Calculates the altitude (in meters) from the specified atmospheric + pressure (in hPa), and sea-level pressure (in hPa). + + @param seaLevel Sea-level pressure in hPa + @param atmospheric Atmospheric pressure in hPa +*/ +/**************************************************************************/ +float Adafruit_BME280::readAltitude(float seaLevel) +{ + // Equation taken from BMP180 datasheet (page 16): + // http://www.adafruit.com/datasheets/BST-BMP180-DS000-09.pdf + + // Note that using the equation from wikipedia can give bad results + // at high altitude. See this thread for more information: + // http://forums.adafruit.com/viewtopic.php?f=22&t=58064 + + float atmospheric = readPressure() / 100.0F; + return 44330.0 * (1.0 - pow(atmospheric / seaLevel, 0.1903)); +} + + +/**************************************************************************/ +/*! + Calculates the pressure at sea level (in hPa) from the specified altitude + (in meters), and atmospheric pressure (in hPa). + @param altitude Altitude in meters + @param atmospheric Atmospheric pressure in hPa +*/ +/**************************************************************************/ +float Adafruit_BME280::seaLevelForAltitude(float altitude, float atmospheric) +{ + // Equation taken from BMP180 datasheet (page 17): + // http://www.adafruit.com/datasheets/BST-BMP180-DS000-09.pdf + + // Note that using the equation from wikipedia can give bad results + // at high altitude. See this thread for more information: + // http://forums.adafruit.com/viewtopic.php?f=22&t=58064 + + return atmospheric / pow(1.0 - (altitude/44330.0), 5.255); +} diff --git a/firmware/libraries/Adafruit_BME280_Library/Adafruit_BME280.h b/firmware/libraries/Adafruit_BME280_Library/Adafruit_BME280.h new file mode 100644 index 0000000..61aeeed --- /dev/null +++ b/firmware/libraries/Adafruit_BME280_Library/Adafruit_BME280.h @@ -0,0 +1,300 @@ +/*************************************************************************** + This is a library for the BME280 humidity, temperature & pressure sensor + + Designed specifically to work with the Adafruit BME280 Breakout + ----> http://www.adafruit.com/products/2650 + + These sensors use I2C or SPI to communicate, 2 or 4 pins are required + to interface. + + Adafruit invests time and resources providing this open source code, + please support Adafruit andopen-source hardware by purchasing products + from Adafruit! + + Written by Limor Fried & Kevin Townsend for Adafruit Industries. + BSD license, all text above must be included in any redistribution + ***************************************************************************/ +#ifndef __BME280_H__ +#define __BME280_H__ + +#if (ARDUINO >= 100) + #include "Arduino.h" +#else + #include "WProgram.h" +#endif + +#include +#include + +/*========================================================================= + I2C ADDRESS/BITS + -----------------------------------------------------------------------*/ + #define BME280_ADDRESS (0x77) +/*=========================================================================*/ + +/*========================================================================= + REGISTERS + -----------------------------------------------------------------------*/ + enum + { + BME280_REGISTER_DIG_T1 = 0x88, + BME280_REGISTER_DIG_T2 = 0x8A, + BME280_REGISTER_DIG_T3 = 0x8C, + + BME280_REGISTER_DIG_P1 = 0x8E, + BME280_REGISTER_DIG_P2 = 0x90, + BME280_REGISTER_DIG_P3 = 0x92, + BME280_REGISTER_DIG_P4 = 0x94, + BME280_REGISTER_DIG_P5 = 0x96, + BME280_REGISTER_DIG_P6 = 0x98, + BME280_REGISTER_DIG_P7 = 0x9A, + BME280_REGISTER_DIG_P8 = 0x9C, + BME280_REGISTER_DIG_P9 = 0x9E, + + BME280_REGISTER_DIG_H1 = 0xA1, + BME280_REGISTER_DIG_H2 = 0xE1, + BME280_REGISTER_DIG_H3 = 0xE3, + BME280_REGISTER_DIG_H4 = 0xE4, + BME280_REGISTER_DIG_H5 = 0xE5, + BME280_REGISTER_DIG_H6 = 0xE7, + + BME280_REGISTER_CHIPID = 0xD0, + BME280_REGISTER_VERSION = 0xD1, + BME280_REGISTER_SOFTRESET = 0xE0, + + BME280_REGISTER_CAL26 = 0xE1, // R calibration stored in 0xE1-0xF0 + + BME280_REGISTER_CONTROLHUMID = 0xF2, + BME280_REGISTER_STATUS = 0XF3, + BME280_REGISTER_CONTROL = 0xF4, + BME280_REGISTER_CONFIG = 0xF5, + BME280_REGISTER_PRESSUREDATA = 0xF7, + BME280_REGISTER_TEMPDATA = 0xFA, + BME280_REGISTER_HUMIDDATA = 0xFD + }; + +/*=========================================================================*/ + +/*========================================================================= + CALIBRATION DATA + -----------------------------------------------------------------------*/ + typedef struct + { + uint16_t dig_T1; + int16_t dig_T2; + int16_t dig_T3; + + uint16_t dig_P1; + int16_t dig_P2; + int16_t dig_P3; + int16_t dig_P4; + int16_t dig_P5; + int16_t dig_P6; + int16_t dig_P7; + int16_t dig_P8; + int16_t dig_P9; + + uint8_t dig_H1; + int16_t dig_H2; + uint8_t dig_H3; + int16_t dig_H4; + int16_t dig_H5; + int8_t dig_H6; + } bme280_calib_data; +/*=========================================================================*/ + +/* +class Adafruit_BME280_Unified : public Adafruit_Sensor +{ + public: + Adafruit_BME280_Unified(int32_t sensorID = -1); + + bool begin(uint8_t addr = BME280_ADDRESS); + void getTemperature(float *temp); + void getPressure(float *pressure); + float pressureToAltitude(float seaLevel, float atmospheric, float temp); + float seaLevelForAltitude(float altitude, float atmospheric, float temp); + void getEvent(sensors_event_t*); + void getSensor(sensor_t*); + + private: + uint8_t _i2c_addr; + int32_t _sensorID; +}; + +*/ + +class Adafruit_BME280 { + public: + enum sensor_sampling { + SAMPLING_NONE = 0b000, + SAMPLING_X1 = 0b001, + SAMPLING_X2 = 0b010, + SAMPLING_X4 = 0b011, + SAMPLING_X8 = 0b100, + SAMPLING_X16 = 0b101 + }; + + enum sensor_mode { + MODE_SLEEP = 0b00, + MODE_FORCED = 0b01, + MODE_NORMAL = 0b11 + }; + + enum sensor_filter { + FILTER_OFF = 0b000, + FILTER_X2 = 0b001, + FILTER_X4 = 0b010, + FILTER_X8 = 0b011, + FILTER_X16 = 0b100 + }; + + // standby durations in ms + enum standby_duration { + STANDBY_MS_0_5 = 0b000, + STANDBY_MS_10 = 0b110, + STANDBY_MS_20 = 0b111, + STANDBY_MS_62_5 = 0b001, + STANDBY_MS_125 = 0b010, + STANDBY_MS_250 = 0b011, + STANDBY_MS_500 = 0b100, + STANDBY_MS_1000 = 0b101 + }; + + // constructors + Adafruit_BME280(void); + Adafruit_BME280(int8_t cspin); + Adafruit_BME280(int8_t cspin, int8_t mosipin, int8_t misopin, int8_t sckpin); + + bool begin(void); + bool begin(TwoWire *theWire); + bool begin(uint8_t addr); + bool begin(uint8_t addr, TwoWire *theWire); + bool init(); + + void setSampling(sensor_mode mode = MODE_NORMAL, + sensor_sampling tempSampling = SAMPLING_X16, + sensor_sampling pressSampling = SAMPLING_X16, + sensor_sampling humSampling = SAMPLING_X16, + sensor_filter filter = FILTER_OFF, + standby_duration duration = STANDBY_MS_0_5 + ); + + void takeForcedMeasurement(); + float readTemperature(void); + float readPressure(void); + float readHumidity(void); + + float readAltitude(float seaLevel); + float seaLevelForAltitude(float altitude, float pressure); + + + private: + TwoWire *_wire; + void readCoefficients(void); + bool isReadingCalibration(void); + uint8_t spixfer(uint8_t x); + + void write8(byte reg, byte value); + uint8_t read8(byte reg); + uint16_t read16(byte reg); + uint32_t read24(byte reg); + int16_t readS16(byte reg); + uint16_t read16_LE(byte reg); // little endian + int16_t readS16_LE(byte reg); // little endian + + uint8_t _i2caddr; + int32_t _sensorID; + int32_t t_fine; + + int8_t _cs, _mosi, _miso, _sck; + + bme280_calib_data _bme280_calib; + + // The config register + struct config { + // inactive duration (standby time) in normal mode + // 000 = 0.5 ms + // 001 = 62.5 ms + // 010 = 125 ms + // 011 = 250 ms + // 100 = 500 ms + // 101 = 1000 ms + // 110 = 10 ms + // 111 = 20 ms + unsigned int t_sb : 3; + + // filter settings + // 000 = filter off + // 001 = 2x filter + // 010 = 4x filter + // 011 = 8x filter + // 100 and above = 16x filter + unsigned int filter : 3; + + // unused - don't set + unsigned int none : 1; + unsigned int spi3w_en : 1; + + unsigned int get() { + return (t_sb << 5) | (filter << 3) | spi3w_en; + } + }; + config _configReg; + + + // The ctrl_meas register + struct ctrl_meas { + // temperature oversampling + // 000 = skipped + // 001 = x1 + // 010 = x2 + // 011 = x4 + // 100 = x8 + // 101 and above = x16 + unsigned int osrs_t : 3; + + // pressure oversampling + // 000 = skipped + // 001 = x1 + // 010 = x2 + // 011 = x4 + // 100 = x8 + // 101 and above = x16 + unsigned int osrs_p : 3; + + // device mode + // 00 = sleep + // 01 or 10 = forced + // 11 = normal + unsigned int mode : 2; + + unsigned int get() { + return (osrs_t << 5) | (osrs_p << 3) | mode; + } + }; + ctrl_meas _measReg; + + + // The ctrl_hum register + struct ctrl_hum { + // unused - don't set + unsigned int none : 5; + + // pressure oversampling + // 000 = skipped + // 001 = x1 + // 010 = x2 + // 011 = x4 + // 100 = x8 + // 101 and above = x16 + unsigned int osrs_h : 3; + + unsigned int get() { + return (osrs_h); + } + }; + ctrl_hum _humReg; +}; + +#endif diff --git a/firmware/libraries/Adafruit_BME280_Library/README.md b/firmware/libraries/Adafruit_BME280_Library/README.md new file mode 100644 index 0000000..ed49542 --- /dev/null +++ b/firmware/libraries/Adafruit_BME280_Library/README.md @@ -0,0 +1,59 @@ +This is a library for the Adafruit BME280 Humidity, Barometric Pressure + Temp sensor + +Designed specifically to work with the Adafruit BME280 Breakout + * http://www.adafruit.com/products/2652 + +These sensors use I2C or SPI to communicate, up to 4 pins are required to interface + +Use of this library also requires [Adafruit_Sensor](https://github.com/adafruit/Adafruit_Sensor) +to be installed on your local system. + +Adafruit invests time and resources providing this open source code, +please support Adafruit and open-source hardware by purchasing +products from Adafruit! + +Check out the links above for our tutorials and wiring diagrams + +Written by Limor Fried/Ladyada for Adafruit Industries. +BSD license, all text above must be included in any redistribution + +To download. click the DOWNLOAD ZIP button, rename the uncompressed folder Adafruit_BME280. +Check that the Adafruit_BME280 folder contains Adafruit_BME280.cpp and Adafruit_BME280.h + +Place the Adafruit_BME280 library folder your arduinosketchfolder/libraries/ folder. +You may need to create the libraries subfolder if its your first library. Restart the IDE. + +We also have a great tutorial on Arduino library installation at: +http://learn.adafruit.com/adafruit-all-about-arduino-libraries-install-use + + +## Compatibility + +MCU | Tested Works | Doesn't Work | Not Tested | Notes +------------------ | :----------: | :----------: | :---------: | ----- +Atmega328 @ 16MHz | X | | | +Atmega328 @ 12MHz | X | | | +Atmega32u4 @ 16MHz | X | | | Use SDA/SCL on pins D2 & D3 +Atmega32u4 @ 8MHz | X | | | Use SDA/SCL on pins D2 & D3 +ESP8266 | X | | | I2C: just works, SPI: SDA/SCL default to pins 4 & 5 but any two pins can be assigned as SDA/SCL using Wire.begin(SDA,SCL) +ESP32 | X | | | I2C: just works, SPI: SDA/SCL default to pins 4 & 5 but any two pins can be assigned as SDA/SCL using Wire.begin(SDA,SCL) +Atmega2560 @ 16MHz | X | | | Use SDA/SCL on pins 20 & 21 +ATSAM3X8E | X | | | Use SDA/SCL on pins 20 & 21 +ATSAM21D | X | | | +ATtiny85 @ 16MHz | | X | | +ATtiny85 @ 8MHz | | X | | +Intel Curie @ 32MHz | | | X | +STM32F2 | | | X | + + * ATmega328 @ 16MHz : Arduino UNO, Adafruit Pro Trinket 5V, Adafruit Metro 328, Adafruit Metro Mini + * ATmega328 @ 12MHz : Adafruit Pro Trinket 3V + * ATmega32u4 @ 16MHz : Arduino Leonardo, Arduino Micro, Arduino Yun, Teensy 2.0 + * ATmega32u4 @ 8MHz : Adafruit Flora, Bluefruit Micro + * ESP8266 : Adafruit Huzzah + * ATmega2560 @ 16MHz : Arduino Mega + * ATSAM3X8E : Arduino Due + * ATSAM21D : Arduino Zero, M0 Pro + * ATtiny85 @ 16MHz : Adafruit Trinket 5V + * ATtiny85 @ 8MHz : Adafruit Gemma, Arduino Gemma, Adafruit Trinket 3V + + diff --git a/firmware/libraries/Adafruit_BME280_Library/examples/advancedsettings/advancedsettings.ino b/firmware/libraries/Adafruit_BME280_Library/examples/advancedsettings/advancedsettings.ino new file mode 100644 index 0000000..68b22b9 --- /dev/null +++ b/firmware/libraries/Adafruit_BME280_Library/examples/advancedsettings/advancedsettings.ino @@ -0,0 +1,157 @@ +/*************************************************************************** + This is a library for the BME280 humidity, temperature & pressure sensor + + Designed specifically to work with the Adafruit BME280 Breakout + ----> http://www.adafruit.com/products/2650 + + These sensors use I2C or SPI to communicate, 2 or 4 pins are required + to interface. The device's I2C address is either 0x76 or 0x77. + + Adafruit invests time and resources providing this open source code, + please support Adafruit andopen-source hardware by purchasing products + from Adafruit! + + Written by Limor Fried & Kevin Townsend for Adafruit Industries. + BSD license, all text above must be included in any redistribution + ***************************************************************************/ + +#include +#include +#include +#include + +#define BME_SCK 13 +#define BME_MISO 12 +#define BME_MOSI 11 +#define BME_CS 10 + +#define SEALEVELPRESSURE_HPA (1013.25) + +Adafruit_BME280 bme; // I2C +//Adafruit_BME280 bme(BME_CS); // hardware SPI +//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI + +unsigned long delayTime; + +void setup() { + Serial.begin(9600); + Serial.println(F("BME280 test")); + + if (! bme.begin(&Wire1)) { + Serial.println("Could not find a valid BME280 sensor, check wiring!"); + while (1); + } + + Serial.println("-- Default Test --"); + Serial.println("normal mode, 16x oversampling for all, filter off,"); + Serial.println("0.5ms standby period"); + delayTime = 5000; + + + // For more details on the following scenarious, see chapter + // 3.5 "Recommended modes of operation" in the datasheet + +/* + // weather monitoring + Serial.println("-- Weather Station Scenario --"); + Serial.println("forced mode, 1x temperature / 1x humidity / 1x pressure oversampling,"); + Serial.println("filter off"); + bme.setSampling(Adafruit_BME280::MODE_FORCED, + Adafruit_BME280::SAMPLING_X1, // temperature + Adafruit_BME280::SAMPLING_X1, // pressure + Adafruit_BME280::SAMPLING_X1, // humidity + Adafruit_BME280::FILTER_OFF ); + + // suggested rate is 1/60Hz (1m) + delayTime = 60000; // in milliseconds +*/ + +/* + // humidity sensing + Serial.println("-- Humidity Sensing Scenario --"); + Serial.println("forced mode, 1x temperature / 1x humidity / 0x pressure oversampling"); + Serial.println("= pressure off, filter off"); + bme.setSampling(Adafruit_BME280::MODE_FORCED, + Adafruit_BME280::SAMPLING_X1, // temperature + Adafruit_BME280::SAMPLING_NONE, // pressure + Adafruit_BME280::SAMPLING_X1, // humidity + Adafruit_BME280::FILTER_OFF ); + + // suggested rate is 1Hz (1s) + delayTime = 1000; // in milliseconds +*/ + +/* + // indoor navigation + Serial.println("-- Indoor Navigation Scenario --"); + Serial.println("normal mode, 16x pressure / 2x temperature / 1x humidity oversampling,"); + Serial.println("0.5ms standby period, filter 16x"); + bme.setSampling(Adafruit_BME280::MODE_NORMAL, + Adafruit_BME280::SAMPLING_X2, // temperature + Adafruit_BME280::SAMPLING_X16, // pressure + Adafruit_BME280::SAMPLING_X1, // humidity + Adafruit_BME280::FILTER_X16, + Adafruit_BME280::STANDBY_MS_0_5 ); + + // suggested rate is 25Hz + // 1 + (2 * T_ovs) + (2 * P_ovs + 0.5) + (2 * H_ovs + 0.5) + // T_ovs = 2 + // P_ovs = 16 + // H_ovs = 1 + // = 40ms (25Hz) + // with standby time that should really be 24.16913... Hz + delayTime = 41; + + /* + // gaming + Serial.println("-- Gaming Scenario --"); + Serial.println("normal mode, 4x pressure / 1x temperature / 0x humidity oversampling,"); + Serial.println("= humidity off, 0.5ms standby period, filter 16x"); + bme.setSampling(Adafruit_BME280::MODE_NORMAL, + Adafruit_BME280::SAMPLING_X1, // temperature + Adafruit_BME280::SAMPLING_X4, // pressure + Adafruit_BME280::SAMPLING_NONE, // humidity + Adafruit_BME280::FILTER_X16, + Adafruit_BME280::STANDBY_MS_0_5 ); + + // Suggested rate is 83Hz + // 1 + (2 * T_ovs) + (2 * P_ovs + 0.5) + // T_ovs = 1 + // P_ovs = 4 + // = 11.5ms + 0.5ms standby + delayTime = 12; +*/ + + Serial.println(); +} + + +void loop() { + // Only needed in forced mode! In normal mode, you can remove the next line. + bme.takeForcedMeasurement(); // has no effect in normal mode + + printValues(); + delay(delayTime); +} + + +void printValues() { + Serial.print("Temperature = "); + Serial.print(bme.readTemperature()); + Serial.println(" *C"); + + Serial.print("Pressure = "); + + Serial.print(bme.readPressure() / 100.0F); + Serial.println(" hPa"); + + Serial.print("Approx. Altitude = "); + Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA)); + Serial.println(" m"); + + Serial.print("Humidity = "); + Serial.print(bme.readHumidity()); + Serial.println(" %"); + + Serial.println(); +} \ No newline at end of file diff --git a/firmware/libraries/Adafruit_BME280_Library/examples/bme280test/bme280test.ino b/firmware/libraries/Adafruit_BME280_Library/examples/bme280test/bme280test.ino new file mode 100644 index 0000000..e8b5563 --- /dev/null +++ b/firmware/libraries/Adafruit_BME280_Library/examples/bme280test/bme280test.ino @@ -0,0 +1,82 @@ +/*************************************************************************** + This is a library for the BME280 humidity, temperature & pressure sensor + + Designed specifically to work with the Adafruit BME280 Breakout + ----> http://www.adafruit.com/products/2650 + + These sensors use I2C or SPI to communicate, 2 or 4 pins are required + to interface. The device's I2C address is either 0x76 or 0x77. + + Adafruit invests time and resources providing this open source code, + please support Adafruit andopen-source hardware by purchasing products + from Adafruit! + + Written by Limor Fried & Kevin Townsend for Adafruit Industries. + BSD license, all text above must be included in any redistribution + ***************************************************************************/ + +#include +#include +#include +#include + +#define BME_SCK 13 +#define BME_MISO 12 +#define BME_MOSI 11 +#define BME_CS 10 + +#define SEALEVELPRESSURE_HPA (1013.25) + +Adafruit_BME280 bme; // I2C +//Adafruit_BME280 bme(BME_CS); // hardware SPI +//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI + +unsigned long delayTime; + +void setup() { + Serial.begin(9600); + Serial.println(F("BME280 test")); + + bool status; + + // default settings + // (you can also pass in a Wire library object like &Wire2) + status = bme.begin(); + if (!status) { + Serial.println("Could not find a valid BME280 sensor, check wiring!"); + while (1); + } + + Serial.println("-- Default Test --"); + delayTime = 1000; + + Serial.println(); +} + + +void loop() { + printValues(); + delay(delayTime); +} + + +void printValues() { + Serial.print("Temperature = "); + Serial.print(bme.readTemperature()); + Serial.println(" *C"); + + Serial.print("Pressure = "); + + Serial.print(bme.readPressure() / 100.0F); + Serial.println(" hPa"); + + Serial.print("Approx. Altitude = "); + Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA)); + Serial.println(" m"); + + Serial.print("Humidity = "); + Serial.print(bme.readHumidity()); + Serial.println(" %"); + + Serial.println(); +} \ No newline at end of file diff --git a/firmware/libraries/Adafruit_BME280_Library/library.properties b/firmware/libraries/Adafruit_BME280_Library/library.properties new file mode 100644 index 0000000..189c369 --- /dev/null +++ b/firmware/libraries/Adafruit_BME280_Library/library.properties @@ -0,0 +1,9 @@ +name=Adafruit BME280 Library +version=1.0.7 +author=Adafruit +maintainer=Adafruit +sentence=Arduino library for BME280 sensors. +paragraph=Arduino library for BME280 humidity and pressure sensors. +category=Sensors +url=https://github.com/adafruit/Adafruit_BME280_Library +architectures=* diff --git a/firmware/libraries/Adafruit_Unified_Sensor/Adafruit_Sensor.h b/firmware/libraries/Adafruit_Unified_Sensor/Adafruit_Sensor.h new file mode 100644 index 0000000..7742afc --- /dev/null +++ b/firmware/libraries/Adafruit_Unified_Sensor/Adafruit_Sensor.h @@ -0,0 +1,154 @@ +/* +* Copyright (C) 2008 The Android Open Source Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software< /span> +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +/* Update by K. Townsend (Adafruit Industries) for lighter typedefs, and + * extended sensor support to include color, voltage and current */ + +#ifndef _ADAFRUIT_SENSOR_H +#define _ADAFRUIT_SENSOR_H + +#if ARDUINO >= 100 + #include "Arduino.h" + #include "Print.h" +#else + #include "WProgram.h" +#endif + +/* Intentionally modeled after sensors.h in the Android API: + * https://github.com/android/platform_hardware_libhardware/blob/master/include/hardware/sensors.h */ + +/* Constants */ +#define SENSORS_GRAVITY_EARTH (9.80665F) /**< Earth's gravity in m/s^2 */ +#define SENSORS_GRAVITY_MOON (1.6F) /**< The moon's gravity in m/s^2 */ +#define SENSORS_GRAVITY_SUN (275.0F) /**< The sun's gravity in m/s^2 */ +#define SENSORS_GRAVITY_STANDARD (SENSORS_GRAVITY_EARTH) +#define SENSORS_MAGFIELD_EARTH_MAX (60.0F) /**< Maximum magnetic field on Earth's surface */ +#define SENSORS_MAGFIELD_EARTH_MIN (30.0F) /**< Minimum magnetic field on Earth's surface */ +#define SENSORS_PRESSURE_SEALEVELHPA (1013.25F) /**< Average sea level pressure is 1013.25 hPa */ +#define SENSORS_DPS_TO_RADS (0.017453293F) /**< Degrees/s to rad/s multiplier */ +#define SENSORS_GAUSS_TO_MICROTESLA (100) /**< Gauss to micro-Tesla multiplier */ + +/** Sensor types */ +typedef enum +{ + SENSOR_TYPE_ACCELEROMETER = (1), /**< Gravity + linear acceleration */ + SENSOR_TYPE_MAGNETIC_FIELD = (2), + SENSOR_TYPE_ORIENTATION = (3), + SENSOR_TYPE_GYROSCOPE = (4), + SENSOR_TYPE_LIGHT = (5), + SENSOR_TYPE_PRESSURE = (6), + SENSOR_TYPE_PROXIMITY = (8), + SENSOR_TYPE_GRAVITY = (9), + SENSOR_TYPE_LINEAR_ACCELERATION = (10), /**< Acceleration not including gravity */ + SENSOR_TYPE_ROTATION_VECTOR = (11), + SENSOR_TYPE_RELATIVE_HUMIDITY = (12), + SENSOR_TYPE_AMBIENT_TEMPERATURE = (13), + SENSOR_TYPE_VOLTAGE = (15), + SENSOR_TYPE_CURRENT = (16), + SENSOR_TYPE_COLOR = (17) +} sensors_type_t; + +/** struct sensors_vec_s is used to return a vector in a common format. */ +typedef struct { + union { + float v[3]; + struct { + float x; + float y; + float z; + }; + /* Orientation sensors */ + struct { + float roll; /**< Rotation around the longitudinal axis (the plane body, 'X axis'). Roll is positive and increasing when moving downward. -90°<=roll<=90° */ + float pitch; /**< Rotation around the lateral axis (the wing span, 'Y axis'). Pitch is positive and increasing when moving upwards. -180°<=pitch<=180°) */ + float heading; /**< Angle between the longitudinal axis (the plane body) and magnetic north, measured clockwise when viewing from the top of the device. 0-359° */ + }; + }; + int8_t status; + uint8_t reserved[3]; +} sensors_vec_t; + +/** struct sensors_color_s is used to return color data in a common format. */ +typedef struct { + union { + float c[3]; + /* RGB color space */ + struct { + float r; /**< Red component */ + float g; /**< Green component */ + float b; /**< Blue component */ + }; + }; + uint32_t rgba; /**< 24-bit RGBA value */ +} sensors_color_t; + +/* Sensor event (36 bytes) */ +/** struct sensor_event_s is used to provide a single sensor event in a common format. */ +typedef struct +{ + int32_t version; /**< must be sizeof(struct sensors_event_t) */ + int32_t sensor_id; /**< unique sensor identifier */ + int32_t type; /**< sensor type */ + int32_t reserved0; /**< reserved */ + int32_t timestamp; /**< time is in milliseconds */ + union + { + float data[4]; + sensors_vec_t acceleration; /**< acceleration values are in meter per second per second (m/s^2) */ + sensors_vec_t magnetic; /**< magnetic vector values are in micro-Tesla (uT) */ + sensors_vec_t orientation; /**< orientation values are in degrees */ + sensors_vec_t gyro; /**< gyroscope values are in rad/s */ + float temperature; /**< temperature is in degrees centigrade (Celsius) */ + float distance; /**< distance in centimeters */ + float light; /**< light in SI lux units */ + float pressure; /**< pressure in hectopascal (hPa) */ + float relative_humidity; /**< relative humidity in percent */ + float current; /**< current in milliamps (mA) */ + float voltage; /**< voltage in volts (V) */ + sensors_color_t color; /**< color in RGB component values */ + }; +} sensors_event_t; + +/* Sensor details (40 bytes) */ +/** struct sensor_s is used to describe basic information about a specific sensor. */ +typedef struct +{ + char name[12]; /**< sensor name */ + int32_t version; /**< version of the hardware + driver */ + int32_t sensor_id; /**< unique sensor identifier */ + int32_t type; /**< this sensor's type (ex. SENSOR_TYPE_LIGHT) */ + float max_value; /**< maximum value of this sensor's value in SI units */ + float min_value; /**< minimum value of this sensor's value in SI units */ + float resolution; /**< smallest difference between two values reported by this sensor */ + int32_t min_delay; /**< min delay in microseconds between events. zero = not a constant rate */ +} sensor_t; + +class Adafruit_Sensor { + public: + // Constructor(s) + Adafruit_Sensor() {} + virtual ~Adafruit_Sensor() {} + + // These must be defined by the subclass + virtual void enableAutoRange(bool enabled) {}; + virtual bool getEvent(sensors_event_t*) = 0; + virtual void getSensor(sensor_t*) = 0; + + private: + bool _autoRange; +}; + +#endif diff --git a/firmware/libraries/Adafruit_Unified_Sensor/README.md b/firmware/libraries/Adafruit_Unified_Sensor/README.md new file mode 100644 index 0000000..8388b12 --- /dev/null +++ b/firmware/libraries/Adafruit_Unified_Sensor/README.md @@ -0,0 +1,218 @@ +# Adafruit Unified Sensor Driver # + +Many small embedded systems exist to collect data from sensors, analyse the data, and either take an appropriate action or send that sensor data to another system for processing. + +One of the many challenges of embedded systems design is the fact that parts you used today may be out of production tomorrow, or system requirements may change and you may need to choose a different sensor down the road. + +Creating new drivers is a relatively easy task, but integrating them into existing systems is both error prone and time consuming since sensors rarely use the exact same units of measurement. + +By reducing all data to a single **sensors\_event\_t** 'type' and settling on specific, **standardised SI units** for each sensor family the same sensor types return values that are comparable with any other similar sensor. This enables you to switch sensor models with very little impact on the rest of the system, which can help mitigate some of the risks and problems of sensor availability and code reuse. + +The unified sensor abstraction layer is also useful for data-logging and data-transmission since you only have one well-known type to log or transmit over the air or wire. + +## Unified Sensor Drivers ## + +The following drivers are based on the Adafruit Unified Sensor Driver: + +**Accelerometers** + - [Adafruit\_ADXL345](https://github.com/adafruit/Adafruit_ADXL345) + - [Adafruit\_LSM303DLHC](https://github.com/adafruit/Adafruit_LSM303DLHC) + - [Adafruit\_MMA8451\_Library](https://github.com/adafruit/Adafruit_MMA8451_Library) + +**Gyroscope** + - [Adafruit\_L3GD20\_U](https://github.com/adafruit/Adafruit_L3GD20_U) + +**Light** + - [Adafruit\_TSL2561](https://github.com/adafruit/Adafruit_TSL2561) + - [Adafruit\_TSL2591\_Library](https://github.com/adafruit/Adafruit_TSL2591_Library) + +**Magnetometers** + - [Adafruit\_LSM303DLHC](https://github.com/adafruit/Adafruit_LSM303DLHC) + - [Adafruit\_HMC5883\_Unified](https://github.com/adafruit/Adafruit_HMC5883_Unified) + +**Barometric Pressure** + - [Adafruit\_BMP085\_Unified](https://github.com/adafruit/Adafruit_BMP085_Unified) + - [Adafruit\_BMP183\_Unified\_Library](https://github.com/adafruit/Adafruit_BMP183_Unified_Library) + +**Humidity & Temperature** + - [Adafruit\_DHT\_Unified](https://github.com/adafruit/Adafruit_DHT_Unified) + +## How Does it Work? ## + +Any driver that supports the Adafruit unified sensor abstraction layer will implement the Adafruit\_Sensor base class. There are two main typedefs and one enum defined in Adafruit_Sensor.h that are used to 'abstract' away the sensor details and values: + +**Sensor Types (sensors\_type\_t)** + +These pre-defined sensor types are used to properly handle the two related typedefs below, and allows us determine what types of units the sensor uses, etc. + +``` +/** Sensor types */ +typedef enum +{ + SENSOR_TYPE_ACCELEROMETER = (1), + SENSOR_TYPE_MAGNETIC_FIELD = (2), + SENSOR_TYPE_ORIENTATION = (3), + SENSOR_TYPE_GYROSCOPE = (4), + SENSOR_TYPE_LIGHT = (5), + SENSOR_TYPE_PRESSURE = (6), + SENSOR_TYPE_PROXIMITY = (8), + SENSOR_TYPE_GRAVITY = (9), + SENSOR_TYPE_LINEAR_ACCELERATION = (10), + SENSOR_TYPE_ROTATION_VECTOR = (11), + SENSOR_TYPE_RELATIVE_HUMIDITY = (12), + SENSOR_TYPE_AMBIENT_TEMPERATURE = (13), + SENSOR_TYPE_VOLTAGE = (15), + SENSOR_TYPE_CURRENT = (16), + SENSOR_TYPE_COLOR = (17) +} sensors_type_t; +``` + +**Sensor Details (sensor\_t)** + +This typedef describes the specific capabilities of this sensor, and allows us to know what sensor we are using beneath the abstraction layer. + +``` +/* Sensor details (40 bytes) */ +/** struct sensor_s is used to describe basic information about a specific sensor. */ +typedef struct +{ + char name[12]; + int32_t version; + int32_t sensor_id; + int32_t type; + float max_value; + float min_value; + float resolution; + int32_t min_delay; +} sensor_t; +``` + +The individual fields are intended to be used as follows: + +- **name**: The sensor name or ID, up to a maximum of twelve characters (ex. "MPL115A2") +- **version**: The version of the sensor HW and the driver to allow us to differentiate versions of the board or driver +- **sensor\_id**: A unique sensor identifier that is used to differentiate this specific sensor instance from any others that are present on the system or in the sensor network +- **type**: The sensor type, based on **sensors\_type\_t** in sensors.h +- **max\_value**: The maximum value that this sensor can return (in the appropriate SI unit) +- **min\_value**: The minimum value that this sensor can return (in the appropriate SI unit) +- **resolution**: The smallest difference between two values that this sensor can report (in the appropriate SI unit) +- **min\_delay**: The minimum delay in microseconds between two sensor events, or '0' if there is no constant sensor rate + +**Sensor Data/Events (sensors\_event\_t)** + +This typedef is used to return sensor data from any sensor supported by the abstraction layer, using standard SI units and scales. + +``` +/* Sensor event (36 bytes) */ +/** struct sensor_event_s is used to provide a single sensor event in a common format. */ +typedef struct +{ + int32_t version; + int32_t sensor_id; + int32_t type; + int32_t reserved0; + int32_t timestamp; + union + { + float data[4]; + sensors_vec_t acceleration; + sensors_vec_t magnetic; + sensors_vec_t orientation; + sensors_vec_t gyro; + float temperature; + float distance; + float light; + float pressure; + float relative_humidity; + float current; + float voltage; + sensors_color_t color; + }; +} sensors_event_t; +``` +It includes the following fields: + +- **version**: Contain 'sizeof(sensors\_event\_t)' to identify which version of the API we're using in case this changes in the future +- **sensor\_id**: A unique sensor identifier that is used to differentiate this specific sensor instance from any others that are present on the system or in the sensor network (must match the sensor\_id value in the corresponding sensor\_t enum above!) +- **type**: the sensor type, based on **sensors\_type\_t** in sensors.h +- **timestamp**: time in milliseconds when the sensor value was read +- **data[4]**: An array of four 32-bit values that allows us to encapsulate any type of sensor data via a simple union (further described below) + +**Required Functions** + +In addition to the two standard types and the sensor type enum, all drivers based on Adafruit_Sensor must also implement the following two functions: + +``` +bool getEvent(sensors_event_t*); +``` +Calling this function will populate the supplied sensors\_event\_t reference with the latest available sensor data. You should call this function as often as you want to update your data. + +``` +void getSensor(sensor_t*); +``` +Calling this function will provide some basic information about the sensor (the sensor name, driver version, min and max values, etc. + +**Standardised SI values for sensors\_event\_t** + +A key part of the abstraction layer is the standardisation of values on SI units of a particular scale, which is accomplished via the data[4] union in sensors\_event\_t above. This 16 byte union includes fields for each main sensor type, and uses the following SI units and scales: + +- **acceleration**: values are in **meter per second per second** (m/s^2) +- **magnetic**: values are in **micro-Tesla** (uT) +- **orientation**: values are in **degrees** +- **gyro**: values are in **rad/s** +- **temperature**: values in **degrees centigrade** (Celsius) +- **distance**: values are in **centimeters** +- **light**: values are in **SI lux** units +- **pressure**: values are in **hectopascal** (hPa) +- **relative\_humidity**: values are in **percent** +- **current**: values are in **milliamps** (mA) +- **voltage**: values are in **volts** (V) +- **color**: values are in 0..1.0 RGB channel luminosity and 32-bit RGBA format + +## The Unified Driver Abstraction Layer in Practice ## + +Using the unified sensor abstraction layer is relatively easy once a compliant driver has been created. + +Every compliant sensor can now be read using a single, well-known 'type' (sensors\_event\_t), and there is a standardised way of interrogating a sensor about its specific capabilities (via sensor\_t). + +An example of reading the [TSL2561](https://github.com/adafruit/Adafruit_TSL2561) light sensor can be seen below: + +``` + Adafruit_TSL2561 tsl = Adafruit_TSL2561(TSL2561_ADDR_FLOAT, 12345); + ... + /* Get a new sensor event */ + sensors_event_t event; + tsl.getEvent(&event); + + /* Display the results (light is measured in lux) */ + if (event.light) + { + Serial.print(event.light); Serial.println(" lux"); + } + else + { + /* If event.light = 0 lux the sensor is probably saturated + and no reliable data could be generated! */ + Serial.println("Sensor overload"); + } +``` + +Similarly, we can get the basic technical capabilities of this sensor with the following code: + +``` + sensor_t sensor; + + sensor_t sensor; + tsl.getSensor(&sensor); + + /* Display the sensor details */ + Serial.println("------------------------------------"); + Serial.print ("Sensor: "); Serial.println(sensor.name); + Serial.print ("Driver Ver: "); Serial.println(sensor.version); + Serial.print ("Unique ID: "); Serial.println(sensor.sensor_id); + Serial.print ("Max Value: "); Serial.print(sensor.max_value); Serial.println(" lux"); + Serial.print ("Min Value: "); Serial.print(sensor.min_value); Serial.println(" lux"); + Serial.print ("Resolution: "); Serial.print(sensor.resolution); Serial.println(" lux"); + Serial.println("------------------------------------"); + Serial.println(""); +``` diff --git a/firmware/libraries/Adafruit_Unified_Sensor/library.properties b/firmware/libraries/Adafruit_Unified_Sensor/library.properties new file mode 100644 index 0000000..fa7eefa --- /dev/null +++ b/firmware/libraries/Adafruit_Unified_Sensor/library.properties @@ -0,0 +1,9 @@ +name=Adafruit Unified Sensor +version=1.0.2 +author=Adafruit +maintainer=Adafruit +sentence=Required for all Adafruit Unified Sensor based libraries. +paragraph=A unified sensor abstraction layer used by many Adafruit sensor libraries. +category=Sensors +url=https://github.com/adafruit/Adafruit_Sensor +architectures=* diff --git a/firmware/libraries/ESP8266Influxdb/ESP8266Influxdb.cpp b/firmware/libraries/ESP8266Influxdb/ESP8266Influxdb.cpp new file mode 100644 index 0000000..caf16bc --- /dev/null +++ b/firmware/libraries/ESP8266Influxdb/ESP8266Influxdb.cpp @@ -0,0 +1,176 @@ +#include "Arduino.h" +#include "ESP8266Influxdb.h" +#include + +#define DEBUG_PRINT // comment this line to disable debug print + +#ifndef DEBUG_PRINT +#define DEBUG_PRINT(a) +#else +#define DEBUG_PRINT(a) (Serial.println(String(F("[Debug]: "))+(a))) +#define _DEBUG +#endif + +Influxdb::Influxdb(const char *host, uint16_t port) : WiFiClient() { + _port = port; + _host = host; +} + +DB_RESPONSE Influxdb::opendb(String db, String user, String password) { + _db = "db=" + db + "&u=" + user + "&p=" + password; +} + +DB_RESPONSE Influxdb::opendb(String db) { + _db = "db=" + db; + +} + +DB_RESPONSE Influxdb::write(FIELD data) { + return write(data.postString()); +} + +DB_RESPONSE Influxdb::write(String data) { + if (!connect(_host, _port)) { + DEBUG_PRINT("connection failed"); + _response = DB_CONNECT_FAILED; + return _response; + } + String postHead = "POST /write?" + _db + " HTTP/1.1\r\n"; + postHead += "Host: " + String(_host) + ":" + String(_port) + "\r\n"; + // postHead += "Content-Type: application/x-www-form-urlencoded\r\n"; + postHead += "Content-Length: " + String(data.length()) + "\r\n\r\n"; + + DEBUG_PRINT("Writing data to " + String(_host) + ":" + String(_port)); + print(postHead + data); + DEBUG_PRINT(postHead + data); + + uint8_t t = 0; + // Check the reply whether writing is success or not + while (!available() && t < 200) { + delay(10); + t++; + } + if (t==200) {_response = DB_ERROR; return DB_ERROR; } // Return error if time out. + +#if !defined _DEBUG + if (available()) { + _response = (findUntil("204", "\r")) ? DB_SUCCESS : DB_ERROR; + return _response; + } +#else + _response=DB_ERROR; + while (available()) { + String line = readStringUntil('\n'); + if (line.substring(9,12)=="204") + _response = DB_SUCCESS; + DEBUG_PRINT("(Responsed): " + line); + } + return _response; +#endif + return DB_ERROR; +} + +DB_RESPONSE Influxdb::query(String sql) { + + if (!connect(_host, _port)) { + DEBUG_PRINT("connection failed"); + _response = DB_CONNECT_FAILED; + return _response; + } + + String url = "/query?"; +#if defined _DEBUG + url += "pretty=true&"; +#endif + url += _db; + url += "&q=" + URLEncode(sql); + DEBUG_PRINT("Requesting URL: "); + DEBUG_PRINT(url); + + // This will send the request to the server + print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + _host + + ":" + _port + "\r\n" + "Connection: close\r\n\r\n"); + + // Read all the lines of the reply from server and print them to Serial + uint8_t t = 0; + while (!available() && t < 200) { + delay(10); + t++; + } + if (t==200) {_response = DB_ERROR; return DB_ERROR; } // Return error if time out. + + DEBUG_PRINT("Receiving...."); + uint8_t i=0; + String line = readStringUntil('\n'); + DEBUG_PRINT("[HEAD] " + line); + + if (line.substring(9,12) == "200") { + while (available()) { + line = readStringUntil('\n'); + DEBUG_PRINT("(HEAD) " + line); + if (i < 6 ) i++; else return _response; + } + _response = DB_SUCCESS; + } + else{ + _response = DB_ERROR; +#if defined _DEBUG + while (available()) { + line = readStringUntil('\n'); + DEBUG_PRINT("[HEAD] " + line); + } +#endif + } + + return _response; +} + +DB_RESPONSE Influxdb::response() { + return _response; +} + +/* -----------------------------------------------*/ +// Field object +/* -----------------------------------------------*/ +FIELD::FIELD(String m) { + measurement = m; +} + +void FIELD::empty() { + _data = ""; + _tag = ""; +} + +void FIELD::addTag(String key, String value) { + _tag += "," + key + "=" + value; +} + +void FIELD::addField(String key, float value) { + _data = (_data == "") ? (" ") : (_data += ","); + _data += key + "=" + String(value); +} + +String FIELD::postString() { + // uint32_t utc = 1448114561 + millis() /1000; + return measurement + _tag + _data; +} + +// URL Encode with Arduino String object +String URLEncode(String msg) { + const char *hex = "0123456789abcdef"; + String encodedMsg = ""; + + uint16_t i; + for (i = 0; i < msg.length(); i++) { + if (('a' <= msg.charAt(i) && msg.charAt(i) <= 'z') || + ('A' <= msg.charAt(i) && msg.charAt(i) <= 'Z') || + ('0' <= msg.charAt(i) && msg.charAt(i) <= '9')) { + encodedMsg += msg.charAt(i); + } else { + encodedMsg += '%'; + encodedMsg += hex[msg.charAt(i) >> 4]; + encodedMsg += hex[msg.charAt(i) & 15]; + } + } + return encodedMsg; +} diff --git a/firmware/libraries/ESP8266Influxdb/ESP8266Influxdb.h b/firmware/libraries/ESP8266Influxdb/ESP8266Influxdb.h new file mode 100644 index 0000000..4b0f78e --- /dev/null +++ b/firmware/libraries/ESP8266Influxdb/ESP8266Influxdb.h @@ -0,0 +1,72 @@ +/* Influxdb library + + MIT license + Written by HW Wong + */ + +#ifndef INFLUXDB_H +#define INFLUXDB_H +#include "Arduino.h" +#include + +enum DB_RESPONSE {DB_SUCCESS, DB_ERROR, DB_CONNECT_FAILED}; + +// Url encode function +String URLEncode(String msg); + +class FIELD +{ +public: + FIELD(String m); + + String measurement; + + void addField(String key, float value); + void addTag(String key, String value); + void empty(); + String postString(); + +private: + String _data; + String _tag; + +}; + +class Influxdb : private WiFiClient +{ +public: + Influxdb(const char* host, uint16_t port); + + DB_RESPONSE opendb(String db); + DB_RESPONSE opendb(String db, String user, String password); + DB_RESPONSE write(FIELD data); + DB_RESPONSE write(String data); + DB_RESPONSE query(String sql); + //uint8_t createDatabase(char *dbname); + DB_RESPONSE response(); + + using WiFiClient::available; + using WiFiClient::read; + using WiFiClient::flush; + using WiFiClient::find; + using WiFiClient::findUntil; + using WiFiClient::peek; + using WiFiClient::readBytes; + using WiFiClient::readBytesUntil; + using WiFiClient::readString; + using WiFiClient::readStringUntil; + using WiFiClient::parseInt; + using WiFiClient::setTimeout; + +private: + uint16_t _port; + const char* _host; + String _db; + DB_RESPONSE _response; + +}; + + + + +#endif diff --git a/firmware/libraries/ESP8266Influxdb/README.md b/firmware/libraries/ESP8266Influxdb/README.md new file mode 100644 index 0000000..99ad2ec --- /dev/null +++ b/firmware/libraries/ESP8266Influxdb/README.md @@ -0,0 +1 @@ +# ESP8266Influxdb diff --git a/firmware/libraries/ESP8266Influxdb/examples/influxdb_write/influxdb_write.ino b/firmware/libraries/ESP8266Influxdb/examples/influxdb_write/influxdb_write.ino new file mode 100644 index 0000000..c89fc0b --- /dev/null +++ b/firmware/libraries/ESP8266Influxdb/examples/influxdb_write/influxdb_write.ino @@ -0,0 +1,63 @@ + +#include +#include +#include +#include + +const char *INFLUXDB_HOST = "host_or_ip"; +const uint16_t INFLUXDB_PORT = 8086; + +const char *DATABASE = "dbname"; +const char *DB_USER = "dbuser"; +const char *DB_PASSWORD = "dbpassword"; + +ESP8266WiFiMulti WiFiMulti; +Influxdb influxdb(INFLUXDB_HOST, INFLUXDB_PORT); + +void setup() { + Serial.begin(115200); + WiFiMulti.addAP("SSID", "PASSWORD"); + while (WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + Serial.println("Ready"); + influxdb.opendb(DATABASE, DB_USER, DB_PASSWORD); +} + +void loop() { + // Writing data with influxdb HTTP API + // https://influxdb.com/docs/v0.9/guides/writing_data.html + Serial.println("Writing data to host " + String(INFLUXDB_HOST) + ":" + + INFLUXDB_PORT + "'s database=" + DATABASE); + String data = "analog_read,method=HTTP_API,pin=A0 value=" + String(analogRead(A0)); + influxdb.write(data); + Serial.println(influxdb.response() == DB_SUCCESS ? "HTTP write success" + : "Writing failed"); + + // Writing data using FIELD object + // Create field object with measurment name=analog_read + FIELD dataObj("analog_read"); + dataObj.addTag("method", "Field_object"); // Add method tag + dataObj.addTag("pin", "A0"); // Add pin tag + dataObj.addField("value", analogRead(A0)); // Add value field + Serial.println(influxdb.write(dataObj) == DB_SUCCESS ? "Object write success" + : "Writing failed"); + + // Empty field object. + dataObj.empty(); + + // Querying Data + // https://influxdb.com/docs/v0.9/query_language/query_syntax.html + Serial.println("Querying data ........"); + + String sql = "select * from analog_read order by time desc limit 2"; + if (influxdb.query(sql) == DB_SUCCESS) { + while (influxdb.available()) { + String line = influxdb.readStringUntil('\n'); + Serial.println(line); + } + } + else + Serial.println("Query Failed"); + delay(30000); +} diff --git a/firmware/libraries/ESP8266Influxdb/keywords.txt b/firmware/libraries/ESP8266Influxdb/keywords.txt new file mode 100644 index 0000000..6b493f8 --- /dev/null +++ b/firmware/libraries/ESP8266Influxdb/keywords.txt @@ -0,0 +1,24 @@ +################################################## +# Syntax Coloring Map For ESP8266 Influxdb library +################################################## + +################################################## +# Datatypes (KEYWORD1) +################################################## + +Influxdb KEYWORD1 +FIELD KEYWORD1 +DB_RESPOND KEYWORD1 + +################################################## +# Methods and Functions (KEYWORD2) +################################################## + +addField KEYWORD2 +addTag KEYWORD2 +empty KEYWORD2 +opendb KEYWORD2 +write KEYWORD2 +query KEYWORD2 +postString KEYWORD2 +response KEYWORD2 diff --git a/firmware/libraries/WiFi/README.adoc b/firmware/libraries/WiFi/README.adoc new file mode 100644 index 0000000..82a56c2 --- /dev/null +++ b/firmware/libraries/WiFi/README.adoc @@ -0,0 +1,27 @@ += WiFi Library for Arduino = + +With the Arduino WiFi Shield, this library allows an Arduino board to connect to the internet. + +For more information about this library please visit us at +http://www.arduino.cc/en/Reference/WiFi + +== License == + +Copyright (c) 2011-2014 Arduino LLC. All right reserved. +Copyright (C) 2006-2008, Atmel Corporation All rights reserved. +Copyright (c) 2001-2004 Swedish Institute of Computer Science. +Copyright (c) 2009-2010, H&D Wireless AB All rights reserved. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +This library 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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA diff --git a/firmware/libraries/WiFi/examples/ConnectNoEncryption/ConnectNoEncryption.ino b/firmware/libraries/WiFi/examples/ConnectNoEncryption/ConnectNoEncryption.ino new file mode 100644 index 0000000..e12dfe3 --- /dev/null +++ b/firmware/libraries/WiFi/examples/ConnectNoEncryption/ConnectNoEncryption.ino @@ -0,0 +1,127 @@ +/* + + This example connects to an unencrypted Wifi network. + Then it prints the MAC address of the Wifi shield, + the IP address obtained, and other network details. + + Circuit: + * WiFi shield attached + + created 13 July 2010 + by dlf (Metodo2 srl) + modified 31 May 2012 + by Tom Igoe + */ +#include +#include + +char ssid[] = "yourNetwork"; // the name of your network +int status = WL_IDLE_STATUS; // the Wifi radio's status + +void setup() { + //Initialize serial and wait for port to open: + Serial.begin(9600); + while (!Serial) { + ; // wait for serial port to connect. Needed for native USB port only + } + + // check for the presence of the shield: + if (WiFi.status() == WL_NO_SHIELD) { + Serial.println("WiFi shield not present"); + // don't continue: + while (true); + } + + String fv = WiFi.firmwareVersion(); + if (fv != "1.1.0") { + Serial.println("Please upgrade the firmware"); + } + + // attempt to connect to Wifi network: + while (status != WL_CONNECTED) { + Serial.print("Attempting to connect to open SSID: "); + Serial.println(ssid); + status = WiFi.begin(ssid); + + // wait 10 seconds for connection: + delay(10000); + } + + // you're connected now, so print out the data: + Serial.print("You're connected to the network"); + printCurrentNet(); + printWifiData(); +} + +void loop() { + // check the network connection once every 10 seconds: + delay(10000); + printCurrentNet(); +} + +void printWifiData() { + // print your WiFi shield's IP address: + IPAddress ip = WiFi.localIP(); + Serial.print("IP Address: "); + Serial.println(ip); + Serial.println(ip); + + // print your MAC address: + byte mac[6]; + WiFi.macAddress(mac); + Serial.print("MAC address: "); + Serial.print(mac[5], HEX); + Serial.print(":"); + Serial.print(mac[4], HEX); + Serial.print(":"); + Serial.print(mac[3], HEX); + Serial.print(":"); + Serial.print(mac[2], HEX); + Serial.print(":"); + Serial.print(mac[1], HEX); + Serial.print(":"); + Serial.println(mac[0], HEX); + + // print your subnet mask: + IPAddress subnet = WiFi.subnetMask(); + Serial.print("NetMask: "); + Serial.println(subnet); + + // print your gateway address: + IPAddress gateway = WiFi.gatewayIP(); + Serial.print("Gateway: "); + Serial.println(gateway); +} + +void printCurrentNet() { + // print the SSID of the network you're attached to: + Serial.print("SSID: "); + Serial.println(WiFi.SSID()); + + // print the MAC address of the router you're attached to: + byte bssid[6]; + WiFi.BSSID(bssid); + Serial.print("BSSID: "); + Serial.print(bssid[5], HEX); + Serial.print(":"); + Serial.print(bssid[4], HEX); + Serial.print(":"); + Serial.print(bssid[3], HEX); + Serial.print(":"); + Serial.print(bssid[2], HEX); + Serial.print(":"); + Serial.print(bssid[1], HEX); + Serial.print(":"); + Serial.println(bssid[0], HEX); + + // print the received signal strength: + long rssi = WiFi.RSSI(); + Serial.print("signal strength (RSSI):"); + Serial.println(rssi); + + // print the encryption type: + byte encryption = WiFi.encryptionType(); + Serial.print("Encryption Type:"); + Serial.println(encryption, HEX); +} + diff --git a/firmware/libraries/WiFi/examples/ConnectWithWEP/ConnectWithWEP.ino b/firmware/libraries/WiFi/examples/ConnectWithWEP/ConnectWithWEP.ino new file mode 100644 index 0000000..93070f5 --- /dev/null +++ b/firmware/libraries/WiFi/examples/ConnectWithWEP/ConnectWithWEP.ino @@ -0,0 +1,132 @@ +/* + + This example connects to a WEP-encrypted Wifi network. + Then it prints the MAC address of the Wifi shield, + the IP address obtained, and other network details. + + If you use 40-bit WEP, you need a key that is 10 characters long, + and the characters must be hexadecimal (0-9 or A-F). + e.g. for 40-bit, ABBADEAF01 will work, but ABBADEAF won't work + (too short) and ABBAISDEAF won't work (I and S are not + hexadecimal characters). + + For 128-bit, you need a string that is 26 characters long. + D0D0DEADF00DABBADEAFBEADED will work because it's 26 characters, + all in the 0-9, A-F range. + + Circuit: + * WiFi shield attached + + created 13 July 2010 + by dlf (Metodo2 srl) + modified 31 May 2012 + by Tom Igoe + */ +#include +#include + +char ssid[] = "yourNetwork"; // your network SSID (name) +char key[] = "D0D0DEADF00DABBADEAFBEADED"; // your network key +int keyIndex = 0; // your network key Index number +int status = WL_IDLE_STATUS; // the Wifi radio's status + +void setup() { + //Initialize serial and wait for port to open: + Serial.begin(9600); + while (!Serial) { + ; // wait for serial port to connect. Needed for native USB port only + } + + // check for the presence of the shield: + if (WiFi.status() == WL_NO_SHIELD) { + Serial.println("WiFi shield not present"); + // don't continue: + while (true); + } + + String fv = WiFi.firmwareVersion(); + if (fv != "1.1.0") { + Serial.println("Please upgrade the firmware"); + } + + // attempt to connect to Wifi network: + while (status != WL_CONNECTED) { + Serial.print("Attempting to connect to WEP network, SSID: "); + Serial.println(ssid); + status = WiFi.begin(ssid, keyIndex, key); + + // wait 10 seconds for connection: + delay(10000); + } + + // once you are connected : + Serial.print("You're connected to the network"); + printCurrentNet(); + printWifiData(); +} + +void loop() { + // check the network connection once every 10 seconds: + delay(10000); + printCurrentNet(); +} + +void printWifiData() { + // print your WiFi shield's IP address: + IPAddress ip = WiFi.localIP(); + Serial.print("IP Address: "); + Serial.println(ip); + Serial.println(ip); + + // print your MAC address: + byte mac[6]; + WiFi.macAddress(mac); + Serial.print("MAC address: "); + Serial.print(mac[5], HEX); + Serial.print(":"); + Serial.print(mac[4], HEX); + Serial.print(":"); + Serial.print(mac[3], HEX); + Serial.print(":"); + Serial.print(mac[2], HEX); + Serial.print(":"); + Serial.print(mac[1], HEX); + Serial.print(":"); + Serial.println(mac[0], HEX); +} + +void printCurrentNet() { + // print the SSID of the network you're attached to: + Serial.print("SSID: "); + Serial.println(WiFi.SSID()); + + // print the MAC address of the router you're attached to: + byte bssid[6]; + WiFi.BSSID(bssid); + Serial.print("BSSID: "); + Serial.print(bssid[5], HEX); + Serial.print(":"); + Serial.print(bssid[4], HEX); + Serial.print(":"); + Serial.print(bssid[3], HEX); + Serial.print(":"); + Serial.print(bssid[2], HEX); + Serial.print(":"); + Serial.print(bssid[1], HEX); + Serial.print(":"); + Serial.println(bssid[0], HEX); + + // print the received signal strength: + long rssi = WiFi.RSSI(); + Serial.print("signal strength (RSSI):"); + Serial.println(rssi); + + // print the encryption type: + byte encryption = WiFi.encryptionType(); + Serial.print("Encryption Type:"); + Serial.println(encryption, HEX); + Serial.println(); +} + + + diff --git a/firmware/libraries/WiFi/examples/ConnectWithWPA/ConnectWithWPA.ino b/firmware/libraries/WiFi/examples/ConnectWithWPA/ConnectWithWPA.ino new file mode 100644 index 0000000..56ae372 --- /dev/null +++ b/firmware/libraries/WiFi/examples/ConnectWithWPA/ConnectWithWPA.ino @@ -0,0 +1,122 @@ +/* + + This example connects to an unencrypted Wifi network. + Then it prints the MAC address of the Wifi shield, + the IP address obtained, and other network details. + + Circuit: + * WiFi shield attached + + created 13 July 2010 + by dlf (Metodo2 srl) + modified 31 May 2012 + by Tom Igoe + */ +#include +#include + +char ssid[] = "yourNetwork"; // your network SSID (name) +char pass[] = "secretPassword"; // your network password +int status = WL_IDLE_STATUS; // the Wifi radio's status + +void setup() { + //Initialize serial and wait for port to open: + Serial.begin(9600); + while (!Serial) { + ; // wait for serial port to connect. Needed for native USB port only + } + + // check for the presence of the shield: + if (WiFi.status() == WL_NO_SHIELD) { + Serial.println("WiFi shield not present"); + // don't continue: + while (true); + } + + String fv = WiFi.firmwareVersion(); + if (fv != "1.1.0") { + Serial.println("Please upgrade the firmware"); + } + + // attempt to connect to Wifi network: + while (status != WL_CONNECTED) { + Serial.print("Attempting to connect to WPA SSID: "); + Serial.println(ssid); + // Connect to WPA/WPA2 network: + status = WiFi.begin(ssid, pass); + + // wait 10 seconds for connection: + delay(10000); + } + + // you're connected now, so print out the data: + Serial.print("You're connected to the network"); + printCurrentNet(); + printWifiData(); + +} + +void loop() { + // check the network connection once every 10 seconds: + delay(10000); + printCurrentNet(); +} + +void printWifiData() { + // print your WiFi shield's IP address: + IPAddress ip = WiFi.localIP(); + Serial.print("IP Address: "); + Serial.println(ip); + Serial.println(ip); + + // print your MAC address: + byte mac[6]; + WiFi.macAddress(mac); + Serial.print("MAC address: "); + Serial.print(mac[5], HEX); + Serial.print(":"); + Serial.print(mac[4], HEX); + Serial.print(":"); + Serial.print(mac[3], HEX); + Serial.print(":"); + Serial.print(mac[2], HEX); + Serial.print(":"); + Serial.print(mac[1], HEX); + Serial.print(":"); + Serial.println(mac[0], HEX); + +} + +void printCurrentNet() { + // print the SSID of the network you're attached to: + Serial.print("SSID: "); + Serial.println(WiFi.SSID()); + + // print the MAC address of the router you're attached to: + byte bssid[6]; + WiFi.BSSID(bssid); + Serial.print("BSSID: "); + Serial.print(bssid[5], HEX); + Serial.print(":"); + Serial.print(bssid[4], HEX); + Serial.print(":"); + Serial.print(bssid[3], HEX); + Serial.print(":"); + Serial.print(bssid[2], HEX); + Serial.print(":"); + Serial.print(bssid[1], HEX); + Serial.print(":"); + Serial.println(bssid[0], HEX); + + // print the received signal strength: + long rssi = WiFi.RSSI(); + Serial.print("signal strength (RSSI):"); + Serial.println(rssi); + + // print the encryption type: + byte encryption = WiFi.encryptionType(); + Serial.print("Encryption Type:"); + Serial.println(encryption, HEX); + Serial.println(); +} + diff --git a/firmware/libraries/WiFi/examples/ScanNetworks/ScanNetworks.ino b/firmware/libraries/WiFi/examples/ScanNetworks/ScanNetworks.ino new file mode 100644 index 0000000..7203207 --- /dev/null +++ b/firmware/libraries/WiFi/examples/ScanNetworks/ScanNetworks.ino @@ -0,0 +1,119 @@ +/* + + This example prints the Wifi shield's MAC address, and + scans for available Wifi networks using the Wifi shield. + Every ten seconds, it scans again. It doesn't actually + connect to any network, so no encryption scheme is specified. + + Circuit: + * WiFi shield attached + + created 13 July 2010 + by dlf (Metodo2 srl) + modified 21 Junn 2012 + by Tom Igoe and Jaymes Dec + */ + + +#include +#include + +void setup() { + //Initialize serial and wait for port to open: + Serial.begin(9600); + while (!Serial) { + ; // wait for serial port to connect. Needed for native USB port only + } + + // check for the presence of the shield: + if (WiFi.status() == WL_NO_SHIELD) { + Serial.println("WiFi shield not present"); + // don't continue: + while (true); + } + + String fv = WiFi.firmwareVersion(); + if (fv != "1.1.0") { + Serial.println("Please upgrade the firmware"); + } + + // Print WiFi MAC address: + printMacAddress(); +} + +void loop() { + // scan for existing networks: + Serial.println("Scanning available networks..."); + listNetworks(); + delay(10000); +} + +void printMacAddress() { + // the MAC address of your Wifi shield + byte mac[6]; + + // print your MAC address: + WiFi.macAddress(mac); + Serial.print("MAC: "); + Serial.print(mac[5], HEX); + Serial.print(":"); + Serial.print(mac[4], HEX); + Serial.print(":"); + Serial.print(mac[3], HEX); + Serial.print(":"); + Serial.print(mac[2], HEX); + Serial.print(":"); + Serial.print(mac[1], HEX); + Serial.print(":"); + Serial.println(mac[0], HEX); +} + +void listNetworks() { + // scan for nearby networks: + Serial.println("** Scan Networks **"); + int numSsid = WiFi.scanNetworks(); + if (numSsid == -1) { + Serial.println("Couldn't get a wifi connection"); + while (true); + } + + // print the list of networks seen: + Serial.print("number of available networks:"); + Serial.println(numSsid); + + // print the network number and name for each network found: + for (int thisNet = 0; thisNet < numSsid; thisNet++) { + Serial.print(thisNet); + Serial.print(") "); + Serial.print(WiFi.SSID(thisNet)); + Serial.print("\tSignal: "); + Serial.print(WiFi.RSSI(thisNet)); + Serial.print(" dBm"); + Serial.print("\tEncryption: "); + printEncryptionType(WiFi.encryptionType(thisNet)); + } +} + +void printEncryptionType(int thisType) { + // read the encryption type and print out the name: + switch (thisType) { + case ENC_TYPE_WEP: + Serial.println("WEP"); + break; + case ENC_TYPE_TKIP: + Serial.println("WPA"); + break; + case ENC_TYPE_CCMP: + Serial.println("WPA2"); + break; + case ENC_TYPE_NONE: + Serial.println("None"); + break; + case ENC_TYPE_AUTO: + Serial.println("Auto"); + break; + } +} + + + diff --git a/firmware/libraries/WiFi/examples/SimpleWebServerWiFi/SimpleWebServerWiFi.ino b/firmware/libraries/WiFi/examples/SimpleWebServerWiFi/SimpleWebServerWiFi.ino new file mode 100644 index 0000000..c9cc5a6 --- /dev/null +++ b/firmware/libraries/WiFi/examples/SimpleWebServerWiFi/SimpleWebServerWiFi.ino @@ -0,0 +1,132 @@ +/* + WiFi Web Server LED Blink + + A simple web server that lets you blink an LED via the web. + This sketch will print the IP address of your WiFi Shield (once connected) + to the Serial monitor. From there, you can open that address in a web browser + to turn on and off the LED on pin 9. + + If the IP address of your shield is yourAddress: + http://yourAddress/H turns the LED on + http://yourAddress/L turns it off + + This example is written for a network using WPA encryption. For + WEP or WPA, change the Wifi.begin() call accordingly. + + Circuit: + * WiFi shield attached + * LED attached to pin 9 + + created 25 Nov 2012 + by Tom Igoe + */ +#include +#include + +char ssid[] = "yourNetwork"; // your network SSID (name) +char pass[] = "secretPassword"; // your network password +int keyIndex = 0; // your network key Index number (needed only for WEP) + +int status = WL_IDLE_STATUS; +WiFiServer server(80); + +void setup() { + Serial.begin(9600); // initialize serial communication + pinMode(9, OUTPUT); // set the LED pin mode + + // check for the presence of the shield: + if (WiFi.status() == WL_NO_SHIELD) { + Serial.println("WiFi shield not present"); + while (true); // don't continue + } + + String fv = WiFi.firmwareVersion(); + if (fv != "1.1.0") { + Serial.println("Please upgrade the firmware"); + } + + // attempt to connect to Wifi network: + while (status != WL_CONNECTED) { + Serial.print("Attempting to connect to Network named: "); + Serial.println(ssid); // print the network name (SSID); + + // Connect to WPA/WPA2 network. Change this line if using open or WEP network: + status = WiFi.begin(ssid, pass); + // wait 10 seconds for connection: + delay(10000); + } + server.begin(); // start the web server on port 80 + printWifiStatus(); // you're connected now, so print out the status +} + + +void loop() { + WiFiClient client = server.available(); // listen for incoming clients + + if (client) { // if you get a client, + Serial.println("new client"); // print a message out the serial port + String currentLine = ""; // make a String to hold incoming data from the client + while (client.connected()) { // loop while the client's connected + if (client.available()) { // if there's bytes to read from the client, + char c = client.read(); // read a byte, then + Serial.write(c); // print it out the serial monitor + if (c == '\n') { // if the byte is a newline character + + // if the current line is blank, you got two newline characters in a row. + // that's the end of the client HTTP request, so send a response: + if (currentLine.length() == 0) { + // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK) + // and a content-type so the client knows what's coming, then a blank line: + client.println("HTTP/1.1 200 OK"); + client.println("Content-type:text/html"); + client.println(); + + // the content of the HTTP response follows the header: + client.print("Click here turn the LED on pin 9 on
"); + client.print("Click here turn the LED on pin 9 off
"); + + // The HTTP response ends with another blank line: + client.println(); + // break out of the while loop: + break; + } else { // if you got a newline, then clear currentLine: + currentLine = ""; + } + } else if (c != '\r') { // if you got anything else but a carriage return character, + currentLine += c; // add it to the end of the currentLine + } + + // Check to see if the client request was "GET /H" or "GET /L": + if (currentLine.endsWith("GET /H")) { + digitalWrite(9, HIGH); // GET /H turns the LED on + } + if (currentLine.endsWith("GET /L")) { + digitalWrite(9, LOW); // GET /L turns the LED off + } + } + } + // close the connection: + client.stop(); + Serial.println("client disonnected"); + } +} + +void printWifiStatus() { + // print the SSID of the network you're attached to: + Serial.print("SSID: "); + Serial.println(WiFi.SSID()); + + // print your WiFi shield's IP address: + IPAddress ip = WiFi.localIP(); + Serial.print("IP Address: "); + Serial.println(ip); + + // print the received signal strength: + long rssi = WiFi.RSSI(); + Serial.print("signal strength (RSSI):"); + Serial.print(rssi); + Serial.println(" dBm"); + // print where to go in a browser: + Serial.print("To see this page in action, open a browser to http://"); + Serial.println(ip); +} diff --git a/firmware/libraries/WiFi/examples/WiFiChatServer/WiFiChatServer.ino b/firmware/libraries/WiFi/examples/WiFiChatServer/WiFiChatServer.ino new file mode 100644 index 0000000..11b3268 --- /dev/null +++ b/firmware/libraries/WiFi/examples/WiFiChatServer/WiFiChatServer.ino @@ -0,0 +1,117 @@ +/* + Chat Server + + A simple server that distributes any incoming messages to all + connected clients. To use telnet to your device's IP address and type. + You can see the client's input in the serial monitor as well. + + This example is written for a network using WPA encryption. For + WEP or WPA, change the Wifi.begin() call accordingly. + + + Circuit: + * WiFi shield attached + + created 18 Dec 2009 + by David A. Mellis + modified 31 May 2012 + by Tom Igoe + + */ + +#include +#include + +char ssid[] = "yourNetwork"; // your network SSID (name) +char pass[] = "secretPassword"; // your network password (use for WPA, or use as key for WEP) + +int keyIndex = 0; // your network key Index number (needed only for WEP) + +int status = WL_IDLE_STATUS; + +WiFiServer server(23); + +boolean alreadyConnected = false; // whether or not the client was connected previously + +void setup() { + //Initialize serial and wait for port to open: + Serial.begin(9600); + while (!Serial) { + ; // wait for serial port to connect. Needed for native USB port only + } + + // check for the presence of the shield: + if (WiFi.status() == WL_NO_SHIELD) { + Serial.println("WiFi shield not present"); + // don't continue: + while (true); + } + + String fv = WiFi.firmwareVersion(); + if (fv != "1.1.0") { + Serial.println("Please upgrade the firmware"); + } + + // attempt to connect to Wifi network: + while (status != WL_CONNECTED) { + Serial.print("Attempting to connect to SSID: "); + Serial.println(ssid); + // Connect to WPA/WPA2 network. Change this line if using open or WEP network: + status = WiFi.begin(ssid, pass); + + // wait 10 seconds for connection: + delay(10000); + } + + // start the server: + server.begin(); + // you're connected now, so print out the status: + printWifiStatus(); +} + + +void loop() { + // wait for a new client: + WiFiClient client = server.available(); + + + // when the client sends the first byte, say hello: + if (client) { + if (!alreadyConnected) { + // clead out the input buffer: + client.flush(); + Serial.println("We have a new client"); + client.println("Hello, client!"); + alreadyConnected = true; + } + + if (client.available() > 0) { + // read the bytes incoming from the client: + char thisChar = client.read(); + // echo the bytes back to the client: + server.write(thisChar); + // echo the bytes to the server as well: + Serial.write(thisChar); + } + } +} + + +void printWifiStatus() { + // print the SSID of the network you're attached to: + Serial.print("SSID: "); + Serial.println(WiFi.SSID()); + + // print your WiFi shield's IP address: + IPAddress ip = WiFi.localIP(); + Serial.print("IP Address: "); + Serial.println(ip); + + // print the received signal strength: + long rssi = WiFi.RSSI(); + Serial.print("signal strength (RSSI):"); + Serial.print(rssi); + Serial.println(" dBm"); +} + + diff --git a/firmware/libraries/WiFi/examples/WiFiUdpNtpClient/WiFiUdpNtpClient.ino b/firmware/libraries/WiFi/examples/WiFiUdpNtpClient/WiFiUdpNtpClient.ino new file mode 100644 index 0000000..118279d --- /dev/null +++ b/firmware/libraries/WiFi/examples/WiFiUdpNtpClient/WiFiUdpNtpClient.ino @@ -0,0 +1,182 @@ +/* + + Udp NTP Client + + Get the time from a Network Time Protocol (NTP) time server + Demonstrates use of UDP sendPacket and ReceivePacket + For more on NTP time servers and the messages needed to communicate with them, + see http://en.wikipedia.org/wiki/Network_Time_Protocol + + created 4 Sep 2010 + by Michael Margolis + modified 9 Apr 2012 + by Tom Igoe + + This code is in the public domain. + + */ + +#include +#include +#include + +int status = WL_IDLE_STATUS; +char ssid[] = "mynetwork"; // your network SSID (name) +char pass[] = "mypassword"; // your network password +int keyIndex = 0; // your network key Index number (needed only for WEP) + +unsigned int localPort = 2390; // local port to listen for UDP packets + +IPAddress timeServer(129, 6, 15, 28); // time.nist.gov NTP server + +const int NTP_PACKET_SIZE = 48; // NTP time stamp is in the first 48 bytes of the message + +byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets + +// A UDP instance to let us send and receive packets over UDP +WiFiUDP Udp; + +void setup() { + // Open serial communications and wait for port to open: + Serial.begin(9600); + while (!Serial) { + ; // wait for serial port to connect. Needed for native USB port only + } + + // check for the presence of the shield: + if (WiFi.status() == WL_NO_SHIELD) { + Serial.println("WiFi shield not present"); + // don't continue: + while (true); + } + + String fv = WiFi.firmwareVersion(); + if (fv != "1.1.0") { + Serial.println("Please upgrade the firmware"); + } + + // attempt to connect to Wifi network: + while (status != WL_CONNECTED) { + Serial.print("Attempting to connect to SSID: "); + Serial.println(ssid); + // Connect to WPA/WPA2 network. Change this line if using open or WEP network: + status = WiFi.begin(ssid, pass); + + // wait 10 seconds for connection: + delay(10000); + } + + Serial.println("Connected to wifi"); + printWifiStatus(); + + Serial.println("\nStarting connection to server..."); + Udp.begin(localPort); +} + +void loop() { + sendNTPpacket(timeServer); // send an NTP packet to a time server + // wait to see if a reply is available + delay(1000); + if (Udp.parsePacket()) { + Serial.println("packet received"); + // We've received a packet, read the data from it + Udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer + + //the timestamp starts at byte 40 of the received packet and is four bytes, + // or two words, long. First, esxtract the two words: + + unsigned long highWord = word(packetBuffer[40], packetBuffer[41]); + unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]); + // combine the four bytes (two words) into a long integer + // this is NTP time (seconds since Jan 1 1900): + unsigned long secsSince1900 = highWord << 16 | lowWord; + Serial.print("Seconds since Jan 1 1900 = "); + Serial.println(secsSince1900); + + // now convert NTP time into everyday time: + Serial.print("Unix time = "); + // Unix time starts on Jan 1 1970. In seconds, that's 2208988800: + const unsigned long seventyYears = 2208988800UL; + // subtract seventy years: + unsigned long epoch = secsSince1900 - seventyYears; + // print Unix time: + Serial.println(epoch); + + + // print the hour, minute and second: + Serial.print("The UTC time is "); // UTC is the time at Greenwich Meridian (GMT) + Serial.print((epoch % 86400L) / 3600); // print the hour (86400 equals secs per day) + Serial.print(':'); + if (((epoch % 3600) / 60) < 10) { + // In the first 10 minutes of each hour, we'll want a leading '0' + Serial.print('0'); + } + Serial.print((epoch % 3600) / 60); // print the minute (3600 equals secs per minute) + Serial.print(':'); + if ((epoch % 60) < 10) { + // In the first 10 seconds of each minute, we'll want a leading '0' + Serial.print('0'); + } + Serial.println(epoch % 60); // print the second + } + // wait ten seconds before asking for the time again + delay(10000); +} + +// send an NTP request to the time server at the given address +unsigned long sendNTPpacket(IPAddress& address) { + //Serial.println("1"); + // set all bytes in the buffer to 0 + memset(packetBuffer, 0, NTP_PACKET_SIZE); + // Initialize values needed to form NTP request + // (see URL above for details on the packets) + //Serial.println("2"); + packetBuffer[0] = 0b11100011; // LI, Version, Mode + packetBuffer[1] = 0; // Stratum, or type of clock + packetBuffer[2] = 6; // Polling Interval + packetBuffer[3] = 0xEC; // Peer Clock Precision + // 8 bytes of zero for Root Delay & Root Dispersion + packetBuffer[12] = 49; + packetBuffer[13] = 0x4E; + packetBuffer[14] = 49; + packetBuffer[15] = 52; + + //Serial.println("3"); + + // all NTP fields have been given values, now + // you can send a packet requesting a timestamp: + Udp.beginPacket(address, 123); //NTP requests are to port 123 + //Serial.println("4"); + Udp.write(packetBuffer, NTP_PACKET_SIZE); + //Serial.println("5"); + Udp.endPacket(); + //Serial.println("6"); +} + + +void printWifiStatus() { + // print the SSID of the network you're attached to: + Serial.print("SSID: "); + Serial.println(WiFi.SSID()); + + // print your WiFi shield's IP address: + IPAddress ip = WiFi.localIP(); + Serial.print("IP Address: "); + Serial.println(ip); + + // print the received signal strength: + long rssi = WiFi.RSSI(); + Serial.print("signal strength (RSSI):"); + Serial.print(rssi); + Serial.println(" dBm"); +} + + + + + + + + + + diff --git a/firmware/libraries/WiFi/examples/WiFiUdpSendReceiveString/WiFiUdpSendReceiveString.ino b/firmware/libraries/WiFi/examples/WiFiUdpSendReceiveString/WiFiUdpSendReceiveString.ino new file mode 100644 index 0000000..1cd384b --- /dev/null +++ b/firmware/libraries/WiFi/examples/WiFiUdpSendReceiveString/WiFiUdpSendReceiveString.ino @@ -0,0 +1,118 @@ + +/* + WiFi UDP Send and Receive String + + This sketch wait an UDP packet on localPort using a WiFi shield. + When a packet is received an Acknowledge packet is sent to the client on port remotePort + + Circuit: + * WiFi shield attached + + created 30 December 2012 + by dlf (Metodo2 srl) + + */ + + +#include +#include +#include + +int status = WL_IDLE_STATUS; +char ssid[] = "yourNetwork"; // your network SSID (name) +char pass[] = "secretPassword"; // your network password (use for WPA, or use as key for WEP) +int keyIndex = 0; // your network key Index number (needed only for WEP) + +unsigned int localPort = 2390; // local port to listen on + +char packetBuffer[255]; //buffer to hold incoming packet +char ReplyBuffer[] = "acknowledged"; // a string to send back + +WiFiUDP Udp; + +void setup() { + //Initialize serial and wait for port to open: + Serial.begin(9600); + while (!Serial) { + ; // wait for serial port to connect. Needed for native USB port only + } + + // check for the presence of the shield: + if (WiFi.status() == WL_NO_SHIELD) { + Serial.println("WiFi shield not present"); + // don't continue: + while (true); + } + + String fv = WiFi.firmwareVersion(); + if (fv != "1.1.0") { + Serial.println("Please upgrade the firmware"); + } + + // attempt to connect to Wifi network: + while (status != WL_CONNECTED) { + Serial.print("Attempting to connect to SSID: "); + Serial.println(ssid); + // Connect to WPA/WPA2 network. Change this line if using open or WEP network: + status = WiFi.begin(ssid); + + // wait 10 seconds for connection: + delay(10000); + } + Serial.println("Connected to wifi"); + printWifiStatus(); + + Serial.println("\nStarting connection to server..."); + // if you get a connection, report back via serial: + Udp.begin(localPort); +} + +void loop() { + + // if there's data available, read a packet + int packetSize = Udp.parsePacket(); + if (packetSize) { + Serial.print("Received packet of size "); + Serial.println(packetSize); + Serial.print("From "); + IPAddress remoteIp = Udp.remoteIP(); + Serial.print(remoteIp); + Serial.print(", port "); + Serial.println(Udp.remotePort()); + + // read the packet into packetBufffer + int len = Udp.read(packetBuffer, 255); + if (len > 0) { + packetBuffer[len] = 0; + } + Serial.println("Contents:"); + Serial.println(packetBuffer); + + // send a reply, to the IP address and port that sent us the packet we received + Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); + Udp.write(ReplyBuffer); + Udp.endPacket(); + } +} + + +void printWifiStatus() { + // print the SSID of the network you're attached to: + Serial.print("SSID: "); + Serial.println(WiFi.SSID()); + + // print your WiFi shield's IP address: + IPAddress ip = WiFi.localIP(); + Serial.print("IP Address: "); + Serial.println(ip); + + // print the received signal strength: + long rssi = WiFi.RSSI(); + Serial.print("signal strength (RSSI):"); + Serial.print(rssi); + Serial.println(" dBm"); +} + + + + diff --git a/firmware/libraries/WiFi/examples/WiFiWebClient/WiFiWebClient.ino b/firmware/libraries/WiFi/examples/WiFiWebClient/WiFiWebClient.ino new file mode 100644 index 0000000..33285c1 --- /dev/null +++ b/firmware/libraries/WiFi/examples/WiFiWebClient/WiFiWebClient.ino @@ -0,0 +1,126 @@ + +/* + Web client + + This sketch connects to a website (http://www.google.com) + using a WiFi shield. + + This example is written for a network using WPA encryption. For + WEP or WPA, change the Wifi.begin() call accordingly. + + This example is written for a network using WPA encryption. For + WEP or WPA, change the Wifi.begin() call accordingly. + + Circuit: + * WiFi shield attached + + created 13 July 2010 + by dlf (Metodo2 srl) + modified 31 May 2012 + by Tom Igoe + */ + + +#include +#include + +char ssid[] = "yourNetwork"; // your network SSID (name) +char pass[] = "secretPassword"; // your network password (use for WPA, or use as key for WEP) +int keyIndex = 0; // your network key Index number (needed only for WEP) + +int status = WL_IDLE_STATUS; +// if you don't want to use DNS (and reduce your sketch size) +// use the numeric IP instead of the name for the server: +//IPAddress server(74,125,232,128); // numeric IP for Google (no DNS) +char server[] = "www.google.com"; // name address for Google (using DNS) + +// Initialize the Ethernet client library +// with the IP address and port of the server +// that you want to connect to (port 80 is default for HTTP): +WiFiClient client; + +void setup() { + //Initialize serial and wait for port to open: + Serial.begin(9600); + while (!Serial) { + ; // wait for serial port to connect. Needed for native USB port only + } + + // check for the presence of the shield: + if (WiFi.status() == WL_NO_SHIELD) { + Serial.println("WiFi shield not present"); + // don't continue: + while (true); + } + + String fv = WiFi.firmwareVersion(); + if (fv != "1.1.0") { + Serial.println("Please upgrade the firmware"); + } + + // attempt to connect to Wifi network: + while (status != WL_CONNECTED) { + Serial.print("Attempting to connect to SSID: "); + Serial.println(ssid); + // Connect to WPA/WPA2 network. Change this line if using open or WEP network: + status = WiFi.begin(ssid, pass); + + // wait 10 seconds for connection: + delay(10000); + } + Serial.println("Connected to wifi"); + printWifiStatus(); + + Serial.println("\nStarting connection to server..."); + // if you get a connection, report back via serial: + if (client.connect(server, 80)) { + Serial.println("connected to server"); + // Make a HTTP request: + client.println("GET /search?q=arduino HTTP/1.1"); + client.println("Host: www.google.com"); + client.println("Connection: close"); + client.println(); + } +} + +void loop() { + // if there are incoming bytes available + // from the server, read them and print them: + while (client.available()) { + char c = client.read(); + Serial.write(c); + } + + // if the server's disconnected, stop the client: + if (!client.connected()) { + Serial.println(); + Serial.println("disconnecting from server."); + client.stop(); + + // do nothing forevermore: + while (true); + } +} + + +void printWifiStatus() { + // print the SSID of the network you're attached to: + Serial.print("SSID: "); + Serial.println(WiFi.SSID()); + + // print your WiFi shield's IP address: + IPAddress ip = WiFi.localIP(); + Serial.print("IP Address: "); + Serial.println(ip); + + // print the received signal strength: + long rssi = WiFi.RSSI(); + Serial.print("signal strength (RSSI):"); + Serial.print(rssi); + Serial.println(" dBm"); +} + + + + + diff --git a/firmware/libraries/WiFi/examples/WiFiWebClientRepeating/WiFiWebClientRepeating.ino b/firmware/libraries/WiFi/examples/WiFiWebClientRepeating/WiFiWebClientRepeating.ino new file mode 100644 index 0000000..9953824 --- /dev/null +++ b/firmware/libraries/WiFi/examples/WiFiWebClientRepeating/WiFiWebClientRepeating.ino @@ -0,0 +1,131 @@ +/* + Repeating Wifi Web Client + + This sketch connects to a a web server and makes a request + using an Arduino Wifi shield. + + Circuit: + * WiFi shield attached to pins SPI pins and pin 7 + + created 23 April 2012 + modified 31 May 2012 + by Tom Igoe + modified 13 Jan 2014 + by Federico Vanzati + + http://www.arduino.cc/en/Tutorial/WifiWebClientRepeating + This code is in the public domain. + */ + +#include +#include + +char ssid[] = "yourNetwork"; // your network SSID (name) +char pass[] = "secretPassword"; // your network password +int keyIndex = 0; // your network key Index number (needed only for WEP) + +int status = WL_IDLE_STATUS; + +// Initialize the Wifi client library +WiFiClient client; + +// server address: +char server[] = "www.arduino.cc"; +//IPAddress server(64,131,82,241); + +unsigned long lastConnectionTime = 0; // last time you connected to the server, in milliseconds +const unsigned long postingInterval = 10L * 1000L; // delay between updates, in milliseconds + +void setup() { + //Initialize serial and wait for port to open: + Serial.begin(9600); + while (!Serial) { + ; // wait for serial port to connect. Needed for native USB port only + } + + // check for the presence of the shield: + if (WiFi.status() == WL_NO_SHIELD) { + Serial.println("WiFi shield not present"); + // don't continue: + while (true); + } + + String fv = WiFi.firmwareVersion(); + if (fv != "1.1.0") { + Serial.println("Please upgrade the firmware"); + } + + // attempt to connect to Wifi network: + while (status != WL_CONNECTED) { + Serial.print("Attempting to connect to SSID: "); + Serial.println(ssid); + // Connect to WPA/WPA2 network. Change this line if using open or WEP network: + status = WiFi.begin(ssid, pass); + + // wait 10 seconds for connection: + delay(10000); + } + // you're connected now, so print out the status: + printWifiStatus(); +} + +void loop() { + // if there's incoming data from the net connection. + // send it out the serial port. This is for debugging + // purposes only: + while (client.available()) { + char c = client.read(); + Serial.write(c); + } + + // if ten seconds have passed since your last connection, + // then connect again and send data: + if (millis() - lastConnectionTime > postingInterval) { + httpRequest(); + } + +} + +// this method makes a HTTP connection to the server: +void httpRequest() { + // close any connection before send a new request. + // This will free the socket on the WiFi shield + client.stop(); + + // if there's a successful connection: + if (client.connect(server, 80)) { + Serial.println("connecting..."); + // send the HTTP PUT request: + client.println("GET /latest.txt HTTP/1.1"); + client.println("Host: www.arduino.cc"); + client.println("User-Agent: ArduinoWiFi/1.1"); + client.println("Connection: close"); + client.println(); + + // note the time that the connection was made: + lastConnectionTime = millis(); + } else { + // if you couldn't make a connection: + Serial.println("connection failed"); + } +} + + +void printWifiStatus() { + // print the SSID of the network you're attached to: + Serial.print("SSID: "); + Serial.println(WiFi.SSID()); + + // print your WiFi shield's IP address: + IPAddress ip = WiFi.localIP(); + Serial.print("IP Address: "); + Serial.println(ip); + + // print the received signal strength: + long rssi = WiFi.RSSI(); + Serial.print("signal strength (RSSI):"); + Serial.print(rssi); + Serial.println(" dBm"); +} + + diff --git a/firmware/libraries/WiFi/examples/WiFiWebServer/WiFiWebServer.ino b/firmware/libraries/WiFi/examples/WiFiWebServer/WiFiWebServer.ino new file mode 100644 index 0000000..c777d23 --- /dev/null +++ b/firmware/libraries/WiFi/examples/WiFiWebServer/WiFiWebServer.ino @@ -0,0 +1,138 @@ +/* + WiFi Web Server + + A simple web server that shows the value of the analog input pins. + using a WiFi shield. + + This example is written for a network using WPA encryption. For + WEP or WPA, change the Wifi.begin() call accordingly. + + Circuit: + * WiFi shield attached + * Analog inputs attached to pins A0 through A5 (optional) + + created 13 July 2010 + by dlf (Metodo2 srl) + modified 31 May 2012 + by Tom Igoe + + */ + +#include +#include + + +char ssid[] = "yourNetwork"; // your network SSID (name) +char pass[] = "secretPassword"; // your network password +int keyIndex = 0; // your network key Index number (needed only for WEP) + +int status = WL_IDLE_STATUS; + +WiFiServer server(80); + +void setup() { + //Initialize serial and wait for port to open: + Serial.begin(9600); + while (!Serial) { + ; // wait for serial port to connect. Needed for native USB port only + } + + // check for the presence of the shield: + if (WiFi.status() == WL_NO_SHIELD) { + Serial.println("WiFi shield not present"); + // don't continue: + while (true); + } + + String fv = WiFi.firmwareVersion(); + if (fv != "1.1.0") { + Serial.println("Please upgrade the firmware"); + } + + // attempt to connect to Wifi network: + while (status != WL_CONNECTED) { + Serial.print("Attempting to connect to SSID: "); + Serial.println(ssid); + // Connect to WPA/WPA2 network. Change this line if using open or WEP network: + status = WiFi.begin(ssid, pass); + + // wait 10 seconds for connection: + delay(10000); + } + server.begin(); + // you're connected now, so print out the status: + printWifiStatus(); +} + + +void loop() { + // listen for incoming clients + WiFiClient client = server.available(); + if (client) { + Serial.println("new client"); + // an http request ends with a blank line + boolean currentLineIsBlank = true; + while (client.connected()) { + if (client.available()) { + char c = client.read(); + Serial.write(c); + // if you've gotten to the end of the line (received a newline + // character) and the line is blank, the http request has ended, + // so you can send a reply + if (c == '\n' && currentLineIsBlank) { + // send a standard http response header + client.println("HTTP/1.1 200 OK"); + client.println("Content-Type: text/html"); + client.println("Connection: close"); // the connection will be closed after completion of the response + client.println("Refresh: 5"); // refresh the page automatically every 5 sec + client.println(); + client.println(""); + client.println(""); + // output the value of each analog input pin + for (int analogChannel = 0; analogChannel < 6; analogChannel++) { + int sensorReading = analogRead(analogChannel); + client.print("analog input "); + client.print(analogChannel); + client.print(" is "); + client.print(sensorReading); + client.println("
"); + } + client.println(""); + break; + } + if (c == '\n') { + // you're starting a new line + currentLineIsBlank = true; + } else if (c != '\r') { + // you've gotten a character on the current line + currentLineIsBlank = false; + } + } + } + // give the web browser time to receive the data + delay(1); + + // close the connection: + client.stop(); + Serial.println("client disonnected"); + } +} + + +void printWifiStatus() { + // print the SSID of the network you're attached to: + Serial.print("SSID: "); + Serial.println(WiFi.SSID()); + + // print your WiFi shield's IP address: + IPAddress ip = WiFi.localIP(); + Serial.print("IP Address: "); + Serial.println(ip); + + // print the received signal strength: + long rssi = WiFi.RSSI(); + Serial.print("signal strength (RSSI):"); + Serial.print(rssi); + Serial.println(" dBm"); +} + diff --git a/firmware/libraries/WiFi/extras/binary/wifiHD.elf b/firmware/libraries/WiFi/extras/binary/wifiHD.elf new file mode 100644 index 0000000..d4a8bde Binary files /dev/null and b/firmware/libraries/WiFi/extras/binary/wifiHD.elf differ diff --git a/firmware/libraries/WiFi/extras/binary/wifiHD.hex b/firmware/libraries/WiFi/extras/binary/wifiHD.hex new file mode 100644 index 0000000..0122587 --- /dev/null +++ b/firmware/libraries/WiFi/extras/binary/wifiHD.hex @@ -0,0 +1,16358 @@ +:0200000480007A +:10000000E08F100000000000000000000000000071 +:1000100000000000000000000000000000000000E0 +:1000200000000000000000000000000000000000D0 +:1000300000000000000000000000000000000000C0 +:1000400000000000000000000000000000000000B0 +:1000500000000000000000000000000000000000A0 +:100060000000000000000000000000000000000090 +:100070000000000000000000000000000000000080 +:100080000000000000000000000000000000000070 +:100090000000000000000000000000000000000060 +:1000A0000000000000000000000000000000000050 +:1000B0000000000000000000000000000000000040 +:1000C0000000000000000000000000000000000030 +:1000D0000000000000000000000000000000000020 +:1000E0000000000000000000000000000000000010 +:1000F0000000000000000000000000000000000000 +:1001000000000000000000000000000000000000EF +:1001100000000000000000000000000000000000DF +:1001200000000000000000000000000000000000CF +:1001300000000000000000000000000000000000BF +:1001400000000000000000000000000000000000AF +:10015000000000000000000000000000000000009F +:10016000000000000000000000000000000000008F +:10017000000000000000000000000000000000007F +:10018000000000000000000000000000000000006F +:10019000000000000000000000000000000000005F +:1001A000000000000000000000000000000000004F +:1001B000000000000000000000000000000000003F +:1001C000000000000000000000000000000000002F +:1001D000000000000000000000000000000000001F +:1001E000000000000000000000000000000000000F +:1001F00000000000000000000000000000000000FF +:1002000000000000000000000000000000000000EE +:1002100000000000000000000000000000000000DE +:1002200000000000000000000000000000000000CE +:1002300000000000000000000000000000000000BE +:1002400000000000000000000000000000000000AE +:10025000000000000000000000000000000000009E +:10026000000000000000000000000000000000008E +:10027000000000000000000000000000000000007E +:10028000000000000000000000000000000000006E +:10029000000000000000000000000000000000005E +:1002A000000000000000000000000000000000004E +:1002B000000000000000000000000000000000003E +:1002C000000000000000000000000000000000002E +:1002D000000000000000000000000000000000001E +:1002E000000000000000000000000000000000000E +:1002F00000000000000000000000000000000000FE +:1003000000000000000000000000000000000000ED +:1003100000000000000000000000000000000000DD +:1003200000000000000000000000000000000000CD +:1003300000000000000000000000000000000000BD +:1003400000000000000000000000000000000000AD +:10035000000000000000000000000000000000009D +:10036000000000000000000000000000000000008D +:10037000000000000000000000000000000000007D +:10038000000000000000000000000000000000006D +:10039000000000000000000000000000000000005D +:1003A000000000000000000000000000000000004D +:1003B000000000000000000000000000000000003D +:1003C000000000000000000000000000000000002D +:1003D000000000000000000000000000000000001D +:1003E000000000000000000000000000000000000D +:1003F00000000000000000000000000000000000FD +:1004000000000000000000000000000000000000EC +:1004100000000000000000000000000000000000DC +:1004200000000000000000000000000000000000CC +:1004300000000000000000000000000000000000BC +:1004400000000000000000000000000000000000AC +:10045000000000000000000000000000000000009C +:10046000000000000000000000000000000000008C +:10047000000000000000000000000000000000007C +:10048000000000000000000000000000000000006C +:10049000000000000000000000000000000000005C +:1004A000000000000000000000000000000000004C +:1004B000000000000000000000000000000000003C +:1004C000000000000000000000000000000000002C +:1004D000000000000000000000000000000000001C +:1004E000000000000000000000000000000000000C +:1004F00000000000000000000000000000000000FC +:1005000000000000000000000000000000000000EB +:1005100000000000000000000000000000000000DB +:1005200000000000000000000000000000000000CB +:1005300000000000000000000000000000000000BB +:1005400000000000000000000000000000000000AB +:10055000000000000000000000000000000000009B +:10056000000000000000000000000000000000008B +:10057000000000000000000000000000000000007B +:10058000000000000000000000000000000000006B +:10059000000000000000000000000000000000005B +:1005A000000000000000000000000000000000004B +:1005B000000000000000000000000000000000003B +:1005C000000000000000000000000000000000002B +:1005D000000000000000000000000000000000001B +:1005E000000000000000000000000000000000000B +:1005F00000000000000000000000000000000000FB +:1006000000000000000000000000000000000000EA +:1006100000000000000000000000000000000000DA +:1006200000000000000000000000000000000000CA +:1006300000000000000000000000000000000000BA +:1006400000000000000000000000000000000000AA +:10065000000000000000000000000000000000009A +:10066000000000000000000000000000000000008A +:10067000000000000000000000000000000000007A +:10068000000000000000000000000000000000006A +:10069000000000000000000000000000000000005A +:1006A000000000000000000000000000000000004A +:1006B000000000000000000000000000000000003A +:1006C000000000000000000000000000000000002A +:1006D000000000000000000000000000000000001A +:1006E000000000000000000000000000000000000A +:1006F00000000000000000000000000000000000FA +:1007000000000000000000000000000000000000E9 +:1007100000000000000000000000000000000000D9 +:1007200000000000000000000000000000000000C9 +:1007300000000000000000000000000000000000B9 +:1007400000000000000000000000000000000000A9 +:100750000000000000000000000000000000000099 +:100760000000000000000000000000000000000089 +:100770000000000000000000000000000000000079 +:100780000000000000000000000000000000000069 +:100790000000000000000000000000000000000059 +:1007A0000000000000000000000000000000000049 +:1007B0000000000000000000000000000000000039 +:1007C0000000000000000000000000000000000029 +:1007D0000000000000000000000000000000000019 +:1007E0000000000000000000000000000000000009 +:1007F00000000000000000000000000000000000F9 +:1008000000000000000000000000000000000000E8 +:1008100000000000000000000000000000000000D8 +:1008200000000000000000000000000000000000C8 +:1008300000000000000000000000000000000000B8 +:1008400000000000000000000000000000000000A8 +:100850000000000000000000000000000000000098 +:100860000000000000000000000000000000000088 +:100870000000000000000000000000000000000078 +:100880000000000000000000000000000000000068 +:100890000000000000000000000000000000000058 +:1008A0000000000000000000000000000000000048 +:1008B0000000000000000000000000000000000038 +:1008C0000000000000000000000000000000000028 +:1008D0000000000000000000000000000000000018 +:1008E0000000000000000000000000000000000008 +:1008F00000000000000000000000000000000000F8 +:1009000000000000000000000000000000000000E7 +:1009100000000000000000000000000000000000D7 +:1009200000000000000000000000000000000000C7 +:1009300000000000000000000000000000000000B7 +:1009400000000000000000000000000000000000A7 +:100950000000000000000000000000000000000097 +:100960000000000000000000000000000000000087 +:100970000000000000000000000000000000000077 +:100980000000000000000000000000000000000067 +:100990000000000000000000000000000000000057 +:1009A0000000000000000000000000000000000047 +:1009B0000000000000000000000000000000000037 +:1009C0000000000000000000000000000000000027 +:1009D0000000000000000000000000000000000017 +:1009E0000000000000000000000000000000000007 +:1009F00000000000000000000000000000000000F7 +:100A000000000000000000000000000000000000E6 +:100A100000000000000000000000000000000000D6 +:100A200000000000000000000000000000000000C6 +:100A300000000000000000000000000000000000B6 +:100A400000000000000000000000000000000000A6 +:100A50000000000000000000000000000000000096 +:100A60000000000000000000000000000000000086 +:100A70000000000000000000000000000000000076 +:100A80000000000000000000000000000000000066 +:100A90000000000000000000000000000000000056 +:100AA0000000000000000000000000000000000046 +:100AB0000000000000000000000000000000000036 +:100AC0000000000000000000000000000000000026 +:100AD0000000000000000000000000000000000016 +:100AE0000000000000000000000000000000000006 +:100AF00000000000000000000000000000000000F6 +:100B000000000000000000000000000000000000E5 +:100B100000000000000000000000000000000000D5 +:100B200000000000000000000000000000000000C5 +:100B300000000000000000000000000000000000B5 +:100B400000000000000000000000000000000000A5 +:100B50000000000000000000000000000000000095 +:100B60000000000000000000000000000000000085 +:100B70000000000000000000000000000000000075 +:100B80000000000000000000000000000000000065 +:100B90000000000000000000000000000000000055 +:100BA0000000000000000000000000000000000045 +:100BB0000000000000000000000000000000000035 +:100BC0000000000000000000000000000000000025 +:100BD0000000000000000000000000000000000015 +:100BE0000000000000000000000000000000000005 +:100BF00000000000000000000000000000000000F5 +:100C000000000000000000000000000000000000E4 +:100C100000000000000000000000000000000000D4 +:100C200000000000000000000000000000000000C4 +:100C300000000000000000000000000000000000B4 +:100C400000000000000000000000000000000000A4 +:100C50000000000000000000000000000000000094 +:100C60000000000000000000000000000000000084 +:100C70000000000000000000000000000000000074 +:100C80000000000000000000000000000000000064 +:100C90000000000000000000000000000000000054 +:100CA0000000000000000000000000000000000044 +:100CB0000000000000000000000000000000000034 +:100CC0000000000000000000000000000000000024 +:100CD0000000000000000000000000000000000014 +:100CE0000000000000000000000000000000000004 +:100CF00000000000000000000000000000000000F4 +:100D000000000000000000000000000000000000E3 +:100D100000000000000000000000000000000000D3 +:100D200000000000000000000000000000000000C3 +:100D300000000000000000000000000000000000B3 +:100D400000000000000000000000000000000000A3 +:100D50000000000000000000000000000000000093 +:100D60000000000000000000000000000000000083 +:100D70000000000000000000000000000000000073 +:100D80000000000000000000000000000000000063 +:100D90000000000000000000000000000000000053 +:100DA0000000000000000000000000000000000043 +:100DB0000000000000000000000000000000000033 +:100DC0000000000000000000000000000000000023 +:100DD0000000000000000000000000000000000013 +:100DE0000000000000000000000000000000000003 +:100DF00000000000000000000000000000000000F3 +:100E000000000000000000000000000000000000E2 +:100E100000000000000000000000000000000000D2 +:100E200000000000000000000000000000000000C2 +:100E300000000000000000000000000000000000B2 +:100E400000000000000000000000000000000000A2 +:100E50000000000000000000000000000000000092 +:100E60000000000000000000000000000000000082 +:100E70000000000000000000000000000000000072 +:100E80000000000000000000000000000000000062 +:100E90000000000000000000000000000000000052 +:100EA0000000000000000000000000000000000042 +:100EB0000000000000000000000000000000000032 +:100EC0000000000000000000000000000000000022 +:100ED0000000000000000000000000000000000012 +:100EE0000000000000000000000000000000000002 +:100EF00000000000000000000000000000000000F2 +:100F000000000000000000000000000000000000E1 +:100F100000000000000000000000000000000000D1 +:100F200000000000000000000000000000000000C1 +:100F300000000000000000000000000000000000B1 +:100F400000000000000000000000000000000000A1 +:100F50000000000000000000000000000000000091 +:100F60000000000000000000000000000000000081 +:100F70000000000000000000000000000000000071 +:100F80000000000000000000000000000000000061 +:100F90000000000000000000000000000000000051 +:100FA0000000000000000000000000000000000041 +:100FB0000000000000000000000000000000000031 +:100FC0000000000000000000000000000000000021 +:100FD0000000000000000000000000000000000011 +:100FE0000000000000000000000000000000000001 +:100FF00000000000000000000000000000000000F1 +:1010000000000000000000000000000000000000E0 +:1010100000000000000000000000000000000000D0 +:1010200000000000000000000000000000000000C0 +:1010300000000000000000000000000000000000B0 +:1010400000000000000000000000000000000000A0 +:101050000000000000000000000000000000000090 +:101060000000000000000000000000000000000080 +:101070000000000000000000000000000000000070 +:101080000000000000000000000000000000000060 +:101090000000000000000000000000000000000050 +:1010A0000000000000000000000000000000000040 +:1010B0000000000000000000000000000000000030 +:1010C0000000000000000000000000000000000020 +:1010D0000000000000000000000000000000000010 +:1010E0000000000000000000000000000000000000 +:1010F00000000000000000000000000000000000F0 +:1011000000000000000000000000000000000000DF +:1011100000000000000000000000000000000000CF +:1011200000000000000000000000000000000000BF +:1011300000000000000000000000000000000000AF +:10114000000000000000000000000000000000009F +:10115000000000000000000000000000000000008F +:10116000000000000000000000000000000000007F +:10117000000000000000000000000000000000006F +:10118000000000000000000000000000000000005F +:10119000000000000000000000000000000000004F +:1011A000000000000000000000000000000000003F +:1011B000000000000000000000000000000000002F +:1011C000000000000000000000000000000000001F +:1011D000000000000000000000000000000000000F +:1011E00000000000000000000000000000000000FF +:1011F00000000000000000000000000000000000EF +:1012000000000000000000000000000000000000DE +:1012100000000000000000000000000000000000CE +:1012200000000000000000000000000000000000BE +:1012300000000000000000000000000000000000AE +:10124000000000000000000000000000000000009E +:10125000000000000000000000000000000000008E +:10126000000000000000000000000000000000007E +:10127000000000000000000000000000000000006E +:10128000000000000000000000000000000000005E +:10129000000000000000000000000000000000004E +:1012A000000000000000000000000000000000003E +:1012B000000000000000000000000000000000002E +:1012C000000000000000000000000000000000001E +:1012D000000000000000000000000000000000000E +:1012E00000000000000000000000000000000000FE +:1012F00000000000000000000000000000000000EE +:1013000000000000000000000000000000000000DD +:1013100000000000000000000000000000000000CD +:1013200000000000000000000000000000000000BD +:1013300000000000000000000000000000000000AD +:10134000000000000000000000000000000000009D +:10135000000000000000000000000000000000008D +:10136000000000000000000000000000000000007D +:10137000000000000000000000000000000000006D +:10138000000000000000000000000000000000005D +:10139000000000000000000000000000000000004D +:1013A000000000000000000000000000000000003D +:1013B000000000000000000000000000000000002D +:1013C000000000000000000000000000000000001D +:1013D000000000000000000000000000000000000D +:1013E00000000000000000000000000000000000FD +:1013F00000000000000000000000000000000000ED +:1014000000000000000000000000000000000000DC +:1014100000000000000000000000000000000000CC +:1014200000000000000000000000000000000000BC +:1014300000000000000000000000000000000000AC +:10144000000000000000000000000000000000009C +:10145000000000000000000000000000000000008C +:10146000000000000000000000000000000000007C +:10147000000000000000000000000000000000006C +:10148000000000000000000000000000000000005C +:10149000000000000000000000000000000000004C +:1014A000000000000000000000000000000000003C +:1014B000000000000000000000000000000000002C +:1014C000000000000000000000000000000000001C +:1014D000000000000000000000000000000000000C +:1014E00000000000000000000000000000000000FC +:1014F00000000000000000000000000000000000EC +:1015000000000000000000000000000000000000DB +:1015100000000000000000000000000000000000CB +:1015200000000000000000000000000000000000BB +:1015300000000000000000000000000000000000AB +:10154000000000000000000000000000000000009B +:10155000000000000000000000000000000000008B +:10156000000000000000000000000000000000007B +:10157000000000000000000000000000000000006B +:10158000000000000000000000000000000000005B +:10159000000000000000000000000000000000004B +:1015A000000000000000000000000000000000003B +:1015B000000000000000000000000000000000002B +:1015C000000000000000000000000000000000001B +:1015D000000000000000000000000000000000000B +:1015E00000000000000000000000000000000000FB +:1015F00000000000000000000000000000000000EB +:1016000000000000000000000000000000000000DA +:1016100000000000000000000000000000000000CA +:1016200000000000000000000000000000000000BA +:1016300000000000000000000000000000000000AA +:10164000000000000000000000000000000000009A +:10165000000000000000000000000000000000008A +:10166000000000000000000000000000000000007A +:10167000000000000000000000000000000000006A +:10168000000000000000000000000000000000005A +:10169000000000000000000000000000000000004A +:1016A000000000000000000000000000000000003A +:1016B000000000000000000000000000000000002A +:1016C000000000000000000000000000000000001A +:1016D000000000000000000000000000000000000A +:1016E00000000000000000000000000000000000FA +:1016F00000000000000000000000000000000000EA +:1017000000000000000000000000000000000000D9 +:1017100000000000000000000000000000000000C9 +:1017200000000000000000000000000000000000B9 +:1017300000000000000000000000000000000000A9 +:101740000000000000000000000000000000000099 +:101750000000000000000000000000000000000089 +:101760000000000000000000000000000000000079 +:101770000000000000000000000000000000000069 +:101780000000000000000000000000000000000059 +:101790000000000000000000000000000000000049 +:1017A0000000000000000000000000000000000039 +:1017B0000000000000000000000000000000000029 +:1017C0000000000000000000000000000000000019 +:1017D0000000000000000000000000000000000009 +:1017E00000000000000000000000000000000000F9 +:1017F00000000000000000000000000000000000E9 +:1018000000000000000000000000000000000000D8 +:1018100000000000000000000000000000000000C8 +:1018200000000000000000000000000000000000B8 +:1018300000000000000000000000000000000000A8 +:101840000000000000000000000000000000000098 +:101850000000000000000000000000000000000088 +:101860000000000000000000000000000000000078 +:101870000000000000000000000000000000000068 +:101880000000000000000000000000000000000058 +:101890000000000000000000000000000000000048 +:1018A0000000000000000000000000000000000038 +:1018B0000000000000000000000000000000000028 +:1018C0000000000000000000000000000000000018 +:1018D0000000000000000000000000000000000008 +:1018E00000000000000000000000000000000000F8 +:1018F00000000000000000000000000000000000E8 +:1019000000000000000000000000000000000000D7 +:1019100000000000000000000000000000000000C7 +:1019200000000000000000000000000000000000B7 +:1019300000000000000000000000000000000000A7 +:101940000000000000000000000000000000000097 +:101950000000000000000000000000000000000087 +:101960000000000000000000000000000000000077 +:101970000000000000000000000000000000000067 +:101980000000000000000000000000000000000057 +:101990000000000000000000000000000000000047 +:1019A0000000000000000000000000000000000037 +:1019B0000000000000000000000000000000000027 +:1019C0000000000000000000000000000000000017 +:1019D0000000000000000000000000000000000007 +:1019E00000000000000000000000000000000000F7 +:1019F00000000000000000000000000000000000E7 +:101A000000000000000000000000000000000000D6 +:101A100000000000000000000000000000000000C6 +:101A200000000000000000000000000000000000B6 +:101A300000000000000000000000000000000000A6 +:101A40000000000000000000000000000000000096 +:101A50000000000000000000000000000000000086 +:101A60000000000000000000000000000000000076 +:101A70000000000000000000000000000000000066 +:101A80000000000000000000000000000000000056 +:101A90000000000000000000000000000000000046 +:101AA0000000000000000000000000000000000036 +:101AB0000000000000000000000000000000000026 +:101AC0000000000000000000000000000000000016 +:101AD0000000000000000000000000000000000006 +:101AE00000000000000000000000000000000000F6 +:101AF00000000000000000000000000000000000E6 +:101B000000000000000000000000000000000000D5 +:101B100000000000000000000000000000000000C5 +:101B200000000000000000000000000000000000B5 +:101B300000000000000000000000000000000000A5 +:101B40000000000000000000000000000000000095 +:101B50000000000000000000000000000000000085 +:101B60000000000000000000000000000000000075 +:101B70000000000000000000000000000000000065 +:101B80000000000000000000000000000000000055 +:101B90000000000000000000000000000000000045 +:101BA0000000000000000000000000000000000035 +:101BB0000000000000000000000000000000000025 +:101BC0000000000000000000000000000000000015 +:101BD0000000000000000000000000000000000005 +:101BE00000000000000000000000000000000000F5 +:101BF00000000000000000000000000000000000E5 +:101C000000000000000000000000000000000000D4 +:101C100000000000000000000000000000000000C4 +:101C200000000000000000000000000000000000B4 +:101C300000000000000000000000000000000000A4 +:101C40000000000000000000000000000000000094 +:101C50000000000000000000000000000000000084 +:101C60000000000000000000000000000000000074 +:101C70000000000000000000000000000000000064 +:101C80000000000000000000000000000000000054 +:101C90000000000000000000000000000000000044 +:101CA0000000000000000000000000000000000034 +:101CB0000000000000000000000000000000000024 +:101CC0000000000000000000000000000000000014 +:101CD0000000000000000000000000000000000004 +:101CE00000000000000000000000000000000000F4 +:101CF00000000000000000000000000000000000E4 +:101D000000000000000000000000000000000000D3 +:101D100000000000000000000000000000000000C3 +:101D200000000000000000000000000000000000B3 +:101D300000000000000000000000000000000000A3 +:101D40000000000000000000000000000000000093 +:101D50000000000000000000000000000000000083 +:101D60000000000000000000000000000000000073 +:101D70000000000000000000000000000000000063 +:101D80000000000000000000000000000000000053 +:101D90000000000000000000000000000000000043 +:101DA0000000000000000000000000000000000033 +:101DB0000000000000000000000000000000000023 +:101DC0000000000000000000000000000000000013 +:101DD0000000000000000000000000000000000003 +:101DE00000000000000000000000000000000000F3 +:101DF00000000000000000000000000000000000E3 +:101E000000000000000000000000000000000000D2 +:101E100000000000000000000000000000000000C2 +:101E200000000000000000000000000000000000B2 +:101E300000000000000000000000000000000000A2 +:101E40000000000000000000000000000000000092 +:101E50000000000000000000000000000000000082 +:101E60000000000000000000000000000000000072 +:101E70000000000000000000000000000000000062 +:101E80000000000000000000000000000000000052 +:101E90000000000000000000000000000000000042 +:101EA0000000000000000000000000000000000032 +:101EB0000000000000000000000000000000000022 +:101EC0000000000000000000000000000000000012 +:101ED0000000000000000000000000000000000002 +:101EE00000000000000000000000000000000000F2 +:101EF00000000000000000000000000000000000E2 +:101F000000000000000000000000000000000000D1 +:101F100000000000000000000000000000000000C1 +:101F200000000000000000000000000000000000B1 +:101F300000000000000000000000000000000000A1 +:101F40000000000000000000000000000000000091 +:101F50000000000000000000000000000000000081 +:101F60000000000000000000000000000000000071 +:101F70000000000000000000000000000000000061 +:101F80000000000000000000000000000000000051 +:101F90000000000000000000000000000000000041 +:101FA0000000000000000000000000000000000031 +:101FB0000000000000000000000000000000000021 +:101FC0000000000000000000000000000000000011 +:101FD0000000000000000000000000000000000001 +:101FE00000000000000000000000000000000000F1 +:101FF00000000000000000000000000000000000E1 +:08200000481F000080013E04AE +:102008003038F00C19005EBC5C7C4848F00C003994 +:10201800F00C093BB22A5EFC000011C0F80815015B +:102028003039F20C1800E08800035EFDF00B000B5D +:102038004828F00B032C5EFC00007B08580CC0D02D +:1020480048787829F00900293008720A143CC060E1 +:102058002FF82F895848CFA13FF85EF800007B0879 +:102068003038F00C18005EBCF60C001C30094838FB +:10207800F00C09295EFC000000007B085EFFD70316 +:10208800D4011988301EB6881998B6BEEA18FFFF21 +:10209800E818FF80B6AEB698580AC0301588C0A8B0 +:1020A80048981188F4081800C0303038C03848788B +:1020B80011B8B6C83EE8B6D83008B6E8302C306853 +:1020C800B208D802000016AB00000008D40130188E +:1020D800198EB68E199CB6A8EA1CFFFFE81CFF8073 +:1020E800B6B8B69C580AC0A0158CE06A00FFF00C80 +:1020F8001800F4081710F9B80001B6C83EE8B6D8B9 +:102108003008B6E8302C3068B208D802D421202D27 +:102118004AAA189E1698129674075807C071FACAE8 +:10212800FFF814F7F01F0026C4681989B6891999B1 +:10213800EA19FFFFE819FF80B6993039B0A9740988 +:102148007219F20C1618B0F9B0CCF9D9C108F3D944 +:10215800C208B0ECB0D9304BB0BB74097229F20C8C +:102168001618F169000CF16C0009F9D9C108F3D906 +:10217800C208F16C000BF16B0008F169000A7409E0 +:10218800300A7239F16A00133EEAF16A0012F20A63 +:102198001618F1690011F16A000EF16B000DF5D9FE +:1021A800C108F3D9C208F16A0010F169000F302C98 +:1021B8003138AC082FEDD8220000152C800020D42F +:1021C8003038F00C18005EBCF60C001B48F8F00B19 +:1021D800032858085E0C704958195E1C7029581954 +:1021E800C09148B8F00C003C9828B42878089508A5 +:1021F8005EFC71E85808F0091700F1F91001F1F8D0 +:10220800120A9509B4285EFC00007B08000011C082 +:10221800D4314BC8300A10941499910A1893301A83 +:102228004B984BA7910A3EE14B921296C0280A9907 +:10223800E0682710C0485808C5602018664AE21AA6 +:102248000201E04A0201CF81C4F8F2C5FFFFE20AA9 +:102258001800CEE10F9BF7DBC0C15825E0890005C7 +:102268003038300AC2E80FAA3038C148580BC0A02D +:10227800EE08070EEE08000CA96E2FE8199C1C0842 +:10228800C058F0CCFFFFEE080708201AF80800082D +:102298005C5A10395F9CEC0A18005F9EFDEC000C3C +:1022A800EC0C1800CE4110395F09F9DAC008EC0CC3 +:1022B80018005F0CF9E90009EC091800C020D83AA9 +:1022C800840C3009F20C1900CB34201D5C6A1ADB2F +:1022D8001AD849081ADA490C1AD51AD8F01F000F6B +:1022E8002FADCA6BDA3A662A68085C5A2FF8EE09ED +:1022F8000B0A8908E0480063FE9AFFA9305CD832CF +:10230800000014B0000011B8000014B8000016A2B4 +:102318008003792C80037AB0800094C4D431202DB6 +:102328004C68149570081896169712945808C0713E +:10233800FACAFFF814F8F01F0042CC38198830198F +:10234800B6881998B6A9EA18FFFFE818FF80B6986A +:102358004BC89088EDB80002C171189330023EE175 +:102368000788201D4B8C1AD8F01F00382FF22FED4C +:102378000788E2081800C0502FF3E0420400CF118C +:102388004B3CF01F00320DC83099F2081800E08865 +:1023980000114B09920A3009F20A1900E0840091F1 +:1023A8001AD84AD84ADC1AD8F01F00282FEDC88856 +:1023B800E0450032C290A3684A99E0450033C5D091 +:1023C800129B7209F2080309EECAFFFCF3360020DB +:1023D8003009AEB6C088760CF808030CF809070C6B +:1023E8002FF914CCEC091900CF7349A99289EDB9DA +:1023F8000004C5F149A97209F2080308499C1AD8D2 +:1024080049581AD8C538304BA368495A7409F20894 +:10241800030972C9AEBBF20B1618AEC9AEFBF7D9E9 +:10242800C108F3D9C208AEDBAEE948A99289EDB973 +:102438000004C1903046C3D80000152C800020D479 +:10244800000016A080037AF0800094C4800384D42E +:10245800000016A28003785880037AF8000015203F +:1024680080037B187409F208030870C8496C1AD8ED +:10247800304649681AD8C1A8301AAEBA720AF408A8 +:10248800030AF53A0038AECA491A948AEDBA00042C +:10249800C0303016C0E87209F2080308F138003875 +:1024A80048CC1AD8301648981AD8F01F000B2FEDD0 +:1024B8003EE80C07AEC83008AED82FB6A806302CB8 +:1024C8002FEDD83280037B2880037858000016A2AD +:1024D80080037B38800094C4D421204D4A981897F3 +:1024E800118A580AC0313FF6C0D84A7811BC118EFB +:1024F800119611A8B166EDEE1186EDE81086F9E6A1 +:1025080010064A289088EDB80002C0E14A08201D4C +:102518004A0C1ADA1AD61AD8505B5049F01F001E16 +:102528002FCD4009401B49D870085808C081FACA05 +:10253800FFF00E9C14F8F01F001AC2080F88B68826 +:102548000F98EA18FFFFE818FF80B6983018B6A869 +:102558003048B6B8F1D6C108B6E83EE8EC0A161815 +:10256800B6F6F7680008B6CA3008EDD6C208F768AC +:102578000009B6D63098302CB2082FCDD8220000EA +:102588000000152800007B28000016A28003782090 +:1025980080037B48800094C40000152C800020D460 +:1025A800D401580BC0313FF8C0C8178A17B917981B +:1025B800B168F1EA118817AAF1EA1088F3E810085F +:1025C800F00A161848E9B28AF5D8C208B2B8B29A21 +:1025D800F5D8C108B2AA48B99289EDB90002C0A1DC +:1025E800201D1AD848881ADC488C1AD8F01F000811 +:1025F8002FCD30194878B089D802000000007B2818 +:10260800000016A28003799C80037B74800094C428 +:1026180000001528D431204D4AE8189570081697FF +:1026280012965808C071FACAFFF014F8F01F002A71 +:10263800C4D84AA89088EDB80002C1711894300334 +:102648003EE20988201D4A6C1AD8F01F00262FF395 +:102658002FED0988E4081800C0502FF4E043040067 +:10266800CF114A1CF01F001F0B880BCCAE880B98AB +:10267800EA18FFFFE818FF80AE983004BA445014F7 +:102688003025FACAFFFCAEA5301BF01F0018304AEF +:10269800EF64000CEF6500084018F0091618AEF852 +:1026A800AEC99A49AEBAF5D8C108F1D8C208EF69DF +:1026B800000AAED8AEEA3EE8F3D9C108EF68000BCD +:1026C800EF69000930C8302CAC082FCDD832000093 +:1026D8000000152C800020D4000016A080037AF09A +:1026E800800094C4800384D4800021C8D40148A801 +:1026F8009088EDB80002C0E148887008201D1AD8FB +:10270800487811881AD84878487C1AD8F01F0007EA +:102718002FCDDA0A000016A200000008000016AB50 +:10272800800379E480037BA8800094C4D42148E620 +:10273800189E30076C0C580CC0A02FF72EC6E04727 +:102748000024CF91489CF01F000ADC2A4866EE0757 +:102758000027EC070027EF680010AECE8F0B8F2AFA +:102768008F39D822000011E080037BC4800094C414 +:10277800D4214C8618970C9A302830094C6B310CB0 +:10278800F01F00460C9A302830094C5B311CF01FB2 +:1027980000430C9A302830094C2B312CF01F003F95 +:1027A8000E990C9A30284C0B314CF01F003C0E99B6 +:1027B8000C9A30284BDB315CF01F00383018300998 +:1027C8004BBA4BCB320CF01F003530184BA73009F1 +:1027D8000E9B4BAA321CF01F00310E9B301830099B +:1027E8004B7A322CF01F002D4B6532390A9A0E9B1A +:1027F8003018129CF01F002932490A9A0E9B301893 +:10280800129CF01F002632590A9A0E9B3018129C0F +:10281800F01F00220A9A32690E9B3018129CF01F92 +:10282800001F0C9A302830094A7B336CF01F001BBC +:102838000E9B301830094A5A327CF01F00180C9A47 +:10284800302830094A2B330CF01F00144A1533394D +:102858000A9A0E9B3018129CF01F001033190A9A1E +:102868000E9B3018129CF01F000D0A9A33290E9BFC +:102878003018129CF01F00090C9A30283009496B57 +:10288800334CF01F00060E9B30183009493AC278C5 +:10289800800020D48000427C8000273480004118CA +:1028A8008000433080003FD080003EA88000208810 +:1028B800800026F48000208480002114800035ECFC +:1028C80080003514800034A480004B5480003740C9 +:1028D8008000232480003678800024E0335CF01FD9 +:1028E80000370C9A302830094B5B328CF01F0033CC +:1028F8000C9A302830094B3B32DCF01F00300C9A20 +:10290800302830094B0B32ECF01F002C0E9B30188E +:1029180030094AEA329CF01F00290E9B3018300912 +:102928004ABA32CCF01F00250E9B301830094A9A5B +:1029380032BCF01F00220C9A304830094A6B344CE4 +:10294800F01F001E0E9B301830094A4A32ACF01FA7 +:10295800001B0E9B301830094A1A345CF01F001710 +:102968000E9B3018300949FA32FCF01F00140E9BF8 +:102978003018300949CA337CF01F00100E9B3018FC +:10298800300949AA338CF01F000D0C9A30483009E1 +:10299800497B346CF01F00090C9A30283009495BD8 +:1029A800339CF01F00060E9B30183009492A33ACBF +:1029B800F01F0002D82200008000273480003D88E4 +:1029C80080003AC8800038B4800033FC800030D4DE +:1029D800800032848000375C800032088000300438 +:1029E8008000332880002F8C80002EC4800038841B +:1029F800800037CC8000261CD4013038580B5F1972 +:102A0800F00C18005F88F3E80008C060F40C0019A7 +:102A180048D8F009092B48D89088EDB80001C111B1 +:102A280048B848C9580AF20A1700F00A171048A807 +:102A38001ADA1ADB1ADC489C1AD8F01F00092FCDC5 +:102A4800D802000000007B08000016A280037BDC8F +:102A580080037BE4800378C080037BF0800094C40B +:102A6800D401580BF60A1700F7FA180BF01F0002EA +:102A7800D802000080002A00D401320A300B483CFA +:102A8800F01F0003D802000000007B088002E8BCA9 +:102A9800D421206D3087FAC6FFF00E9A4C6B18953A +:102AA8000C9CF01F0046304B0C9CF01F0045300872 +:102AB800FB68000DBA88FB680009FB68000BFB681F +:102AC800000CEE784240501830480E9BFB67000817 +:102AD800FB68000A300AFE7C2400F01F003A1897B1 +:102AE800C0F04B989088EDB80002C0814B78201D4B +:102AF8004B7C1AD8F01F00372FED301CC5A8E06AB0 +:102B0800F980EA1A03371A9BFE7C2400F01F003272 +:102B1800582CC0D14AC89008EE081900C0844AB899 +:102B2800201D4AEC1AD8F01F002B2FEDD303300AD2 +:102B3800E06B01204AACF01F002BD503E1B8000080 +:102B4800EE180001F5D8C201C020D303FE78240096 +:102B58003019705BF7D9D001915B705BF7D9D0C1A0 +:102B6800915B705BF7D9D081915B580AC020D5037F +:102B7800FE7C2400F01F001C0A9CF01F001C364A33 +:102B8800300B49BCF01F001BE06A0400300B49AC55 +:102B9800F01F0018E06A0400300B498CF01F001584 +:102BA800F01F0017497830079107F01F00170E9C97 +:102BB8002FADD822800382078002E7368000A280EA +:102BC8008000A618000016A2800379BC80037C0848 +:102BD800800094C48000A73C80037C2880002C10CF +:102BE8008000A3A08000A7EC80002778000014B81C +:102BF8008002E8BC00000DB8000009B880002A80F7 +:102C0800000000088000751CD401E1B80000EE182F +:102C18000001F5D8C201C020D303FE782400301982 +:102C2800706BF7D9D001916B706BF7D9D0C1916BEC +:102C3800706BF7D9D081916B580AC020D503FE7C00 +:102C480024007848EDB80000C0F1F01F0016C0C19C +:102C5800319CF01F0015495890092FF9B009301917 +:102C68004938B089C1B8E1B80000EE180001F5D8BC +:102C7800C201C020D303FE7824003019705BF7D955 +:102C8800D001915B705BF7D9D0C1915B705BF7D9CC +:102C9800D081915B580AC020D503D402D603000026 +:102CA800800022188000A2E6000014B40000151C61 +:102CB800D4313006189714931694950618983E093F +:102CC800C2C81095118A2FF8F20A1800C251580686 +:102CD800C21049E890093008F0091900C064089B3F +:102CE8000E9C5C7BF01F001A49A890093008F00977 +:102CF8001900C1040C070F98201D1AD849681AD466 +:102D08001AD690881AD84958495C1AD8F01F001565 +:102D18002FAD8706C1882FF60836CD4548D89009CB +:102D28003008F0091900C0353005C0D8201D48A862 +:102D38001AD690881AD8489848BC1AD83005F01F77 +:102D480000092FCD0A9CD832000016A680013DB498 +:102D5800000016A2000014B4800378D080037C48D9 +:102D6800800094C480037C6CD42118971696F01FB9 +:102D780000325F080E3C5F191895F1E91009C03060 +:102D88005808C5710B893E08F0091800C5210B9930 +:102D98003008F0091800C4D5E2190040C0E1EACAB9 +:102DA800FFFD0BAC1298C068158B2FF92FFB160A84 +:102DB80016081839CFA5C2384A089088EDB800021D +:102DC800C0D149F8201D49FC1AD8F01F001FF7D6BA +:102DD800C0100E9CF01F001D2FED3009EACAFFFD40 +:102DE8000BAC1298C0A81587159B2FF9F7E7108B25 +:102DF8002FEB160AF60800081839CF6510053EE9CA +:102E08000BB8F2081800C021DA2A4919920A3009C9 +:102E1800F20A1900C0E4201D1AD848E890881AD888 +:102E2800487848DC1AD8F01F0008300C2FCDD8227B +:102E3800D82A000080002CB8000016A080037974FE +:102E480080037C84800094C480013DB4000016A2F5 +:102E5800000014B480037C8CD4014918581CC0713C +:102E68003039334C9109F01F000FC0683049334C9A +:102E78009109F01F000D48D89088EDB80002C0D124 +:102E880048787008201D1AD848981AD8489848AC2D +:102E98001AD8F01F000A2FCDD80200000000000841 +:102EA8008000A2E68000A300000016A280037A3CFE +:102EB8008003821080037CB0800094C4D421FACDB2 +:102EC80001004AC81697700512965805C071FACACB +:102ED800FF0014F5F01F0028C4A81989301AB68914 +:102EE8001999B6AAEA19FFFFE819FF80B69919B926 +:102EF800F4091800C20119C53FF8F0051800C1B05F +:102F0800E06A00FF300B1A9CF01F001C1A9430086E +:102F1800C048E8080B082FF80A38CFC51A94AEB590 +:102F2800EEC8FFFCFA050009C038093A10CA123485 +:102F3800CFD1C15849256A0CF01F00120A98EECA71 +:102F4800FFFCEBDCC0083009AEB5C068700BF609B1 +:102F5800070B2FF914CBEA091900CF933EE80A07AB +:102F6800AEC83008AED82FB5302CAC052C0DD82201 +:102F78000000152C800020D48002E8BC0000011459 +:102F88008002EDD0D421202D49981697700E129604 +:102F9800580EC071FACAFFF814FEF01F0016C25886 +:102FA8001989B6891998EA18FFFFE818FF80B698BA +:102FB80030184915B6A86A0CF01F0010EEC9FFFCBE +:102FC8005C5C3008AEBCC0686A0AF408070A2FF8CF +:102FD80012CAF8081900CF933EE818072FBCAEC8EC +:102FE8003008AED8AC0C302C2FEDD8220000152CB0 +:102FF800800020D4000001148002EDD0D421202DBF +:103008004AE818967008169712955808C071FACAB7 +:10301800FFF814F8F01F002AC4D84AA811D4303891 +:10302800F0041800E08B0046FACAFFFC1A9B089CC3 +:10303800F01F00250D88C300AE880D98EA18FFFF21 +:10304800E818FF80AE983018AEA81BC8AEB89A280A +:10305800AEC83008C0B8F3D8C010400BF1DAB010D1 +:10306800EE09000AF6090709B4D9F0CAFFFF9A2940 +:10307800F2081900CF13F1D9C010EE0800083EEA93 +:10308800B0DA9AA82FA910073008AEE8AA09089C58 +:10309800F01F000EC0E8AE880D98EA18FFFFE81888 +:1030A800FF80AECCAE98AEAC3EE8AEB83048AA08C9 +:1030B800302C2FEDD82200000000152C800020D4E1 +:1030C80000000DB880006BF480006FBCD431202D57 +:1030D8004C5818967008169712955808C071BAE897 +:1030E800FACAFFFAF01F0041C728F8C8FFFDC3C09D +:1030F80011842FF4F0040004C37009893018F00912 +:103108001800C67109993EE8F0091800C6214B88D5 +:1031180090093008F0091900C5C44B681AD44B6CE3 +:103128001AD8F01F00362FEDC548099309A9F3E313 +:1031380010835C83C54809893018F0091800C1510B +:1031480009993EE8F0091800C1014A989009300829 +:10315800F0091900C0A44A781AD44A7C1AD8F01F7A +:1031680000272FEDC02830030DB43018F0041800E4 +:10317800C2D10DCC3038F00C1800E08B0028F5D304 +:10318800C008FACBFFF9F01F001E0D88C120AE88D9 +:103198000D98EA18FFFFE818FF80AEB4AE98AEA409 +:1031A8001BF8AEC83EE8AED83008AEE83068C0D8E4 +:1031B800AE880D98EA18FFFFE818FF80AE983EE841 +:1031C800AECCAEB8AEAC3048AA08302C2FEDD83211 +:1031D80009883029F2081800CA9030032FF8100423 +:1031E800CAB1CC3B0000152C800020D4000016A2E8 +:1031F8008003780C80037CBC800094C480006FE05E +:10320800D421202D49A81697700E1296580EC07119 +:10321800FACAFFF814FEF01F0017C2681989301A9D +:10322800B6891999B6AAEA19FFFFE819FF80B69975 +:1032380019B9F4091800C0D119C83039F2081800B2 +:10324800E08B000848C9F208033CF01F000CC028B6 +:10325800300C3018AEB83EE8AECCAED83008AEE888 +:10326800302C3068AC082FEDD82200000000152C57 +:10327800800020D400007B0880004D78D421202DC8 +:103288004A181697700E1296580EC071FACAFFF8AF +:1032980014FEF01F001EC3481989301AB6891999FF +:1032A800B6AAEA19FFFFE819FF80B69919B9F40917 +:1032B8001800C0B119CC3038F00C1800E08B0006AB +:1032C800F01F00135C8CC028300C3028AEB83EE8E4 +:1032D800AECCAEE85C7CF8081608AED83008AEF87C +:1032E8003078AC0848B89088EDB80002C08148A88A +:1032F8001ADC48AC1AD8F01F000A2FED302C2FED3D +:10330800D82200000000152C800020D480006D38E1 +:10331800000016A8800378A880037CD8800094C495 +:10332800D421202D4AA81697700512965805C07109 +:10333800FACAFFF814F5F01F0027C4781989301A63 +:10334800B6891999B6AAEA19FFFFE819FF80B69954 +:10335800303819B919C5F40918005F09F0051800C3 +:103368005F881268C19049C8F00503345804C060EA +:10337800089C301BF01F0019C10849989009E809FA +:103388001900C0A449781AD5497C1AD8F01F00172B +:10339800089C2FEDC028300C3018AEB83EE8AECCF3 +:1033A800AED83008AEE83068AC0849189088EDB857 +:1033B8000002C0A148B8201D1ADC48EC1AD51AD85A +:1033C800F01F000A2FCD302C2FEDD8220000152C2D +:1033D800800020D400007B0880004F1C000016A647 +:1033E8008003794080037CEC800094C4000016A818 +:1033F80080037D10D421202D4A181697700E12963E +:10340800580EC071FACAFFF814FEF01F001EC34818 +:103418001989301AB6891999B6AAEA19FFFFE81965 +:10342800FF80B69919B9F4091800C0F119C83039E4 +:10343800F2081800E08B000A4939F2080038300B0E +:10344800701CF01F0012C028300C3018AEB83EE8CF +:10345800AECCAED83008AEE83068AC0848C8908822 +:10346800EDB80002C08148B81ADC48BC1AD8F01F71 +:10347800000B2FED302C2FEDD82200000000152C6A +:10348800800020D400007B0880004F1C000016A894 +:1034980080037A6480037D28800094C4D40149584D +:1034A8009088EDB80002C08149381ADC493C1AD826 +:1034B800F01F00132FED49383009118AF20A18005D +:1034C800C021DC0AB089F01F0010581CC1004898C0 +:1034D80090093008F0091900C025DA0A48681ADC92 +:1034E80048AC1AD8F01F0006301C2FEDD802000097 +:1034F800000016A28003798480037D38800094C47C +:10350800000016AA80019EF880037D54D421202D46 +:103518004B281496700E16971295580EC071FACA59 +:10352800FFF814FEF01F002EC5681989B68919988E +:10353800EA18FFFFE818FF803014B698B6A4F01F09 +:103548000029C3E0E0460025C260E0460026C3200B +:10355800EEC9FFFCE0460024C0F0129AF9380020BA +:103568003009AEB8C058F809070B2FF914CBF00989 +:103578001900CFA3C28830682DACAEB8306A3008C5 +:10358800198B12CB2FF8201C5C88F4081900CF91F6 +:103598003068C19878C8F0091618AEF93049AEC835 +:1035A800AEB9F3D8C108F1D8C208AED9AEE83048F0 +:1035B800C0A8AEB4F9380038AEC83018C048AEB4A8 +:1035C800AECC18983EE91007AEC93009AED92FB86D +:1035D800302CAA082FEDD8220000152C800020D40A +:1035E8008001997CD421202D49F8189670081697E7 +:1035F80012955808C041FACAFFF8C1881988B688D8 +:103608001998EA18FFFFE818FF803019B698306853 +:10361800B6A9B6B81A9CF01F0015581CC0B00A9974 +:103628000E9B0C9CFACAFFF8300814F8F01F001023 +:10363800C1881BD8AEC81BC8AED81BB8AEE81BA83B +:10364800AEF81B98EF6800081B88EF6800093EE891 +:10365800EF68000A3008EF68000B302C30B8AA0871 +:103668002FEDD8220000152C80019128800020D44D +:10367800D421FACD010016961A971A9C173AF01F12 +:103688000025FAC9FF000D88F20800083009F16921 +:10369800FF004A189088EDB80002C08149F81AD78F +:1036A80049FC1AD8F01F001F2FED300849E749FAE6 +:1036B800AE88AE98AEA8AEB8B488109949CA0E9B29 +:1036C8001A9C1A96F01F001B5C5CC040E06C00FF5F +:1036D800C1E849189088EDB80002C1510F8A0FB9A6 +:1036E8000F98B168F1EA11880FAAF1EA1088F3E897 +:1036F8001008201D1AD848981AD648FC1AD8F01F66 +:1037080000092FCD30194898301CB0892C0DD822CB +:103718008002E736000016A280037A7C80037D646D +:10372800800094C400007B2800001528800025A88C +:103738008000C4C080037D84D401F01F0006E068C7 +:1037480000FF581CF00C1710F9BC0001D80200004B +:10375800800199CCD42118971696335CF01F001677 +:103768005827C1F10D980D89F1E910893018F00931 +:103778001900C1710DA80DBA0DC9303BF608180023 +:10378800E0880004300CC04848CBF608033CA96A1E +:10379800ECCBFFFB120A5C7AF01F00091897C028CF +:1037A8003FF7335CF01F0007E06C00FF5817F9BCC7 +:1037B8000001D8228000A30000007B08800053C0CD +:1037C8008000A2E6D421202D581CC4211789F809AD +:1037D8001800C3E1F6C8FFFE1796C170118AF20AF5 +:1037E8001800C131119A3EE9F20A1800C0E149B93E +:1037F800920A3009F20A1900C0841AD84988499CEB +:103808001AD8F01F00192FED3008FACAFFF8300B4C +:1038180014E80C9CF01F00159A3A18973038F006F7 +:103828001800E0880004300CC0484918F006033C32 +:103838005C7A0E9BF01F000F18950C9CF01F000E71 +:103848000E9CF01F000E5815C0310A9CC038E06C61 +:1038580000FF2FEDD8220000000016A28003795C3B +:1038680080037CBC800094C4800072DC00007B086C +:103878008000514080006E188002E28CD401582CE0 +:10388800C13117981789F1E910893018F009190022 +:10389800C0B117C817BA17ACA96A2FBBF00A000A3B +:1038A8005C7AF01F0002DA0A80007380D421581C69 +:1038B800C391580BC0311697C1E81788F80818004B +:1038C800C3411797C33817893018F0091800C13158 +:1038D80017993EE8F0091800C0E1497890093008C6 +:1038E800F0091900C08449581ADB495C1AD8F01F3E +:1038F80000152FED49089088EDB80002C08148F8FE +:103908001AD7491C1AD8F01F000F2FED3038F007CE +:103918001800E08B000848D8F007033CF01F000CA3 +:10392800DA2AE06C00FFD82230072FF8100BCCC140 +:10393800CE2B0000000016A2800379F880037CBC1F +:10394800800094C480037DA800007B088000599CF7 +:10395800D421202D4B981896169414971295908878 +:10396800EDB80002C1314B694B685805F2081700E1 +:10397800201D1AD816985C781ADA1AD84B281ADC3F +:103988004B2C1AD8F01F00322FAD3038F007180032 +:10399800E0880005E06C00FFC8584AE8F0070338E3 +:1039A80050085808C1504A59920A3009F20A1900B9 +:1039B800C0841AD84A484A8C1AD8F01F00252FED1F +:1039C800400CF01F002630094A28F00709391A9CD4 +:1039D800E06A04005016300B1ADC14981AD75C748D +:1039E8001ADB16991AD5089C1ADA169A1AD6F01FF5 +:1039F800001C49282FAD580CC3819088EDB80002EF +:103A0800C1511AD71AD41AD6403850461AD848D8AD +:103A180048B95805F2051700F005171048A81AD537 +:103A2800490C1AD8F01F000A2FAD0E9C400BF01F4E +:103A3800000E301CC3780000000016A280037DC869 +:103A480080037DC4800379C480037DCC800094C446 +:103A580000007B0880037DF88000599C80005D642D +:103A680080037E2480002A689088EDB80002C15146 +:103A78001AD71AD41AD6403850461AD848B848C95E +:103A88005805F2051700F005171048A81AD548ACD4 +:103A98001AD8F01F000A2FAD300948983FFCF007EC +:103AA80009392FEDD822000080037DC480037DC82A +:103AB800800379C480037E50800094C400007B0892 +:103AC800D431584CE081008E580BC2A01785F805F8 +:103AD8001800E081008A179817A7B167EFE81187E7 +:103AE80017B8EFE8108717C8F1E71007C7E80B8980 +:103AF8003018F0091800C7E10B993EE8F0091800E2 +:103B0800C7914C2890093008F0091900C7344C08AF +:103B18001AD54C0C1AD8F01F00402FEDC6B81697CE +:103B28003006C1F80B960BA8F1E610865C86C688AD +:103B380007893018F0091800C72107993EE8F009ED +:103B48001800C6D14B1890093008F0091900C6743E +:103B58004AF81AD34AFC1AD8F01F002F2FEDC5F8DF +:103B68003005C1B80795C61809893018F00918003A +:103B7800C61109993EE8F0091800C5C14A389009EC +:103B88003008F0091900C5644A181AD44A1C1AD812 +:103B9800F01F00212FEDC4E83003C1A80993C50820 +:103BA80009893018F0091800C13109993EE8F0096F +:103BB8001800C0E1495890093008F0091900C0847C +:103BC80049381AD4493C1AD8F01F00132FED06992A +:103BD8000A9AF7D6C0100E9CF01F0010581CC0306F +:103BE800E06C00FFD83230072FF5F6050005C80154 +:103BF800C98B0B833028F0031800C95030062FF307 +:103C0800EA030003C961CADB000016A280037A98A0 +:103C180080037CBC800094C4800039580784301825 +:103C2800F0041800CA0030052FF4E6040004C9D1D6 +:103C3800CB4B09883019F2081800CB1030032FF845 +:103C48001004CAF1CC5B0000D421202D3038169620 +:103C58001494F00B1800E08B0072300750074BA843 +:103C68001188EE081800C0B04B889008EE081900BB +:103C7800C654201D4B684B7C1AD8C0F84B69138971 +:103C8800F0091800C0E14B589008EE081900C56407 +:103C9800201D4AF84B2C1AD8F01F00322FEDC4E82B +:103CA8001A9AE0690400501712981ADAEBDCC0106F +:103CB8001ADB0E9A1AD70E9B1AD40A9C1AD93019F5 +:103CC8001AD7F01F00294A182FAD580CC1B1908897 +:103CD800EDB80002C1114A584A595804F2041700B5 +:103CE800F004171049A81AD64A2C1AD51AD41AD88B +:103CF800F01F001C2FCD0C9C400BF01F001F301C28 +:103D0800C1F89008EE081900C11449884989580477 +:103D1800F2041700F004171048D81AD6497C1AD5AF +:103D28001AD41AD8F01F000F2FCDA17630092FF61C +:103D380049383FFCF0060929C038E06C00FF2FED38 +:103D4800D822000000007B07000016A280037A102A +:103D580080037E80000016AB000016A680037EA0BC +:103D6800800094C480005D6480037DC480037DC8A6 +:103D780080037EB880002A6880037EDC00007B0810 +:103D8800D421583CC661580BC24017843028F0042F +:103D98001800C621179717A8F1E710875C87C5D8C0 +:103DA80009893018F0091800C5D109993EE8F009C9 +:103DB8001800C5814B6890093008F0091900C5241E +:103DC8004B481AD44B4C1AD8F01F00342FEDC4A816 +:103DD80016973006C1B80996C4B80B893018F0098F +:103DE8001800C4B10B993EE8F0091800C4614A886C +:103DF80090093008F0091900C4044A681AD54A6CB9 +:103E08001AD8F01F00262FEDC3883004C1A80B94E0 +:103E1800C3A80B893018F0091800C1310B993EE886 +:103E2800F0091800C0E149A890093008F009190004 +:103E3800C08449881AD5498C1AD8F01F00182FED6C +:103E48000E9C089A0C9B5C7CF01F0015581CC03017 +:103E5800E06C00FFD82230072FF4F6040004CA11E2 +:103E6800CB9B09853018F0051800CB6030062FF57C +:103E7800E8050005CB31CCAB0B883019F2081800E7 +:103E8800CC7030042FF81005CC51CDBB000016A221 +:103E98008003791480037CBC800094C480003C506B +:103EA800D431204D1495740A501A18961788301971 +:103EB800F2081800C771F6C7FFFE1794C1700F8982 +:103EC800F0091800C1310F993EE8F0091800C0E167 +:103ED8004B7890093008F0091900C0844B581AD75C +:103EE8004B5C1AD8F01F00352FED4B189088EDB8B1 +:103EF8000002C0A14AF81AD44B1C1AD61AD51AD8EF +:103F0800F01F002E2FCD3028F0041800E08B004B56 +:103F18003006304030114A624A63C3E80F88E0082F +:103F28001800C4010F990FA8B168F1E911880FB9F9 +:103F3800F1E910880FC92FB7F3E810085807C170C6 +:103F48000F89E2091800C1310F993EEAF4091800F7 +:103F5800C0E18409300AF4091900C0941AD7496CE1 +:103F68001AD35028F01F00152FED400850388489C7 +:103F7800EDB90002C0A11AD84029492C1AD91AD67D +:103F88001AD3F01F000E2FCDF9D6C008FACBFFF4D4 +:103F98002FF6F01F000D0836CC253008301CAAC8B3 +:103FA800C038E06C00FF2FCDD8320000000016A208 +:103FB80080037A4C80037CBC800094C480037F0813 +:103FC80080037F308000C19CD431203D3019149487 +:103FD800189674051788F2081800E0810085F6C75E +:103FE800FFFE1792C1700F89F0091800C1310F99AF +:103FF8003EE8F0091800C0E14BD890093008F009F4 +:104008001900C0844BB81AD74BBC1AD8F01F003B14 +:104018002FED4B789088EDB80002C0A14B581AD20A +:104028004B7C1AD61AD41AD8F01F00342FCD30384A +:10403800F0021800E08B005830064AD04AD1FAC383 +:10404800FFF8C4B80F88304AF4081800C4C10F99A3 +:104058000FA8B168F1E911880FB9F1E910880FC903 +:104068002FB7F3E810085807C1800F89301AF409F0 +:104078001800C1310F993EEAF4091800C0E180091F +:10408800300AF4091900C0941AD749BC1AD150282B +:10409800F01F001A2FED400850288089EDB9000262 +:1040A800C0911AD8497C1AD51AD61AD1F01F001314 +:1040B8002FCD5816C0805826C0B0069B0A9CF01F0A +:1040C8000012C0A8069B0A9CF01F0010C058069B4F +:1040D8000A9CF01F000F2FF60436CB553008301C11 +:1040E800A8C8C038E06C00FF2FDDD832000016A247 +:1040F800800378F080037CBC800094C480037F0830 +:1041080080037F308000CBC88000CA748000CA92C8 +:10411800D421FACD00884C6816979088EDB8000233 +:10412800C0B14C48201D1ADC1AD84C384C3C1AD85F +:10413800F01F00432FCD344A300BFAC6FFFC0C9C0D +:10414800F01F0040306AE06B00FFFACCFFDBF01F85 +:10415800003D0F8A31F8F00A1800E08B008930889A +:10416800EECBFFFFFB68003C0C9CF01F00370F896B +:10417800FB6900244AE89088EDB80002C0A14AE82B +:10418800201D4B2C1AD91AD61AD8F01F002D2FCD66 +:104198000F882FF8FAC6FFB810070C9C0E9B173A29 +:1041A800F01F002BFAC9FF780F88F20800083009C1 +:1041B800F169FFC049E89088EDB80002C0B10F88E6 +:1041C800201D1AD849C81AD64A2C1AD8F01F001C24 +:1041D8002FCD0F8A3018FAC7FFFC3089FACBFFB809 +:1041E8000E9CF01F001D581CC0C0491890093008CB +:1041F800F0091900C3C44908498C1AD81AD8C0E86C +:10420800497CF01F000F0E9C300BF01F001618970A +:10421800581CC080201D1ADC493CF01F00092FEDF6 +:10422800C268492CF01F00060E9CC238000016A276 +:1042380080037A248003787080037F50800094C4C0 +:104248008002E8BC8002E73680037CB08002EE0C76 +:1042580080037F648001908480037F7880037FA03F +:10426800800099A880037FB880037FC0E06C00FFBE +:104278002DEDD822D42120AD4A461697178A31F859 +:10428800F00A1800E08B002FFAC5FFF92FFB0A9CF3 +:10429800F01F001F0F88FAC9FFD8FB680027100914 +:1042A8003008F368FFDF8C88EDB80002C0814998B8 +:1042B8001AD5499C1AD8F01F00192FED300BFACCEB +:1042C800FFF9F01F00171897581CC1B048F890095B +:1042D8003008F0091900C1541ADC48E8491C1AD8FA +:1042E800C0D88C093008F0091900C0353FF7C098CC +:1042F800201D488848CC1AD83FF7F01F00082FED3A +:104308000E9C2F6DD8220000000016A28002E7360E +:10431800800378E080037B18800094C4800099A80B +:1043280080037D5480037FC4D431216D4D281697B6 +:104338009088EDB80002C0B14D08201D1ADC1AD8CB +:104348004CF84D0C1AD8F01F00502FCD321AFAC66F +:10435800FFFD300B0C9CF01F004D0F8A31F8F00A5E +:104368001800E08B0085EECBFFFF0C9CF01F004887 +:104378000F88FB6800234C089088EDB80002C081C4 +:104388004BF81AD64C3C1AD8F01F003F2FED0F8679 +:104398002FF6EE060006FAC7FFAC0C9B0E9C173AE8 +:1043A800F01F003D0D88FAC9FFA8F20800080E9C0E +:1043B8003003F163FFFCF01F00393038EFDCC00830 +:1043C8000D89F00718005FB53018F00918005F185C +:1043D80010450A94E6051800C4A1ECCBFFFDFAC30A +:1043E800FFDC2FE6069C0D8AF01F002B0D88FAC90A +:1043F800FFA8F2080008069BF165FFCCFAC5FFC0CC +:104408000A9CF01F002730D81896F00C18005F1986 +:104418003058F00C18005F18F3E80008E808180096 +:10442800C261FAC4FFB2306AE06B00FF089CF01F5B +:1044380000170C9B08990A9A0E9CF01F001A0E9CF4 +:10444800F01F0019300BFACCFFFDF01F0018581CA4 +:10445800C100489890093008F0091900C0844888BC +:104468001ADC493C1AD8F01F00082FEDE06C00FF59 +:104478002EADD832000016A280037888800379AC6C +:1044880080037F50800094C48002E8BC8002E73635 +:1044980080037FE48002EE0C8002DC2C80009868A8 +:1044A8008001927080019258800099A880037D5401 +:1044B800D401319CF01F0010E06B00EFFE7C280057 +:1044C800F01F000E581CC060FE7C2800F01F000C76 +:1044D800CFC0319CF01F000B48B890093008F00994 +:1044E8001900C0844898201D489C1AD8F01F00095C +:1044F8002FEDD8028000A3008000A7FA8000A7F261 +:104508008000A2E6000016A28003790880037FF0ED +:10451800800094C4D431202D3008FAC7FFF81696CD +:10452800189514930EE81694098B0A9C2FF4F01F23 +:104538000009581CC0B00E9B0A9CF01F0007089881 +:104548000C18E6081900CF13300C2FEDD8320000F4 +:104558008000A7FA8000A816D421202D30081496D0 +:10456800F80C002C129AFAC9FFF812E84A88F00CE5 +:10457800002C169578280C9B0A9C5D184A583049DF +:10458800319C9109F01F00249ABA0C9BFE7C2400F0 +:10459800F01F00221897319CF01F00214A189088BC +:1045A800EDB80002C0414A0CF01F002049D890889D +:1045B800EDB80002C0D149E8201D49EC1AD8F01F17 +:1045C800001B49D80A9C908BF01F001C2FED4958FE +:1045D8009088EDB80002C041499CF01F00144918AA +:1045E8009088EDB80002C0C14918201D491C1AD88E +:1045F800F01F000E9AFB0C9CF01F00102FED9A394B +:1046080049080E9CB0092FEDD8220000000011E0E7 +:10461800000011B88000A3008000451C8000A2E6BD +:10462800000016A080038008800094C480037800EE +:1046380080037C84000011BE80013DB48003800C9F +:10464800000011BCD431202D4BC43048E8C3FFF022 +:10465800BAF81897199616910C90F8C2FFFD2FC456 +:104668003005E21000400988EC081800C4B107883A +:104678003029F2081800C1F10A9C4B08EA05002508 +:10468800029AF00500240E9BE8C5FFF46839F01F74 +:10469800002CC030301CC4E868086A0A049B0FACC0 +:1046A8005D18BAFCE216004030181BF9F009180032 +:1046B800C3C1C3D85800E00A1700F9BA0100E8F8E6 +:1046C800FFFC049B0FAC5D18BAFC30190788F20890 +:1046D8001800C0B10A9C4998EA050025029AF0051D +:1046E80000250E9B6A39C0A83049F2081800C0A1FD +:1046F800029A0E9B0A9CFAC9FFF9F01F0011C170BB +:10470800C1882FF52EC42EC3E0450024CAD148D84D +:1047180090093008F0091900C08448B81AD648BC76 +:104728001AD8F01F000B2FED302CC048304CC02891 +:10473800300C2FEDD8320000000011E080004560F9 +:10474800000016A28003789880038010800094C42B +:10475800D421202D4BD8910C30094BD8118AF20A5C +:104768001800E08000DAB08930085018E1B800007D +:10477800EE180001F5D8C201C020D303FE7824004A +:104788003019706BF7D9D001916B706BF7D9D0C124 +:10479800916B706BF7D9D081916B580AC020D50303 +:1047A8004AC7FACAFFFC6E0B4ABCF01F002C1896C9 +:1047B800C6E04AB8303A6E09910A401B4A98161961 +:1047C800B009E06A03FFF4091900E0880005E06910 +:1047D8000400B0094A064A37EC0B000B4A2C8E8AB3 +:1047E800F01F002230084A2BAC8849FCF01F00213A +:1047F800584CC2204A089088EDB80002C0C149F858 +:10480800201D49FC1AD8F01F001F8E8B496CF01F21 +:10481800001E2FED49889088EDB80002C0D1497874 +:10482800201D497C1AD8F01F00174988490C908B25 +:10483800F01F00152FED4879300893084899B20801 +:1048480048799308C46800000000152C0000151C66 +:10485800000014B0000014B880002D70000011B8DA +:10486800000011BE00000DB88002E736000009B84C +:104878008000464C000016A0800379D880037C8411 +:10488800800094C480013DB4000011BCF01F0024D6 +:104898004A489008EC081900C0A44A3890881AD8E9 +:1048A8004A284A3C1AD8F01F00232FED4A289009BD +:1048B8003008F0091900C0644A084A1C909BF01F90 +:1048C80000214A19300893084A09B20849C9B28830 +:1048D800E06B0120FE7C0D80F01F001DE1B8000098 +:1048E800EE180001F5D8C201C020D303FE782400D9 +:1048F8003019705BF7D9D001915B705BF7D9D0C1E3 +:10490800915B705BF7D9D081915B580AC020D503C1 +:10491800319CF01F00102FEDD8220000800044B811 +:10492800000016A2000014B4800379D88003802CFC +:10493800800094C4000016A6000014B0000014B84B +:1049480080013DB4000011B8000011BE8000A20033 +:104958008000A300D431207D4B6730054B664B782F +:104968001188EA081800EC081710EE0817004B4CDD +:104978001AD8F01F00344B481188EA081800EC07D1 +:1049880017104B2C50074B2230074B23F01F002DDC +:104998000E942FED4B01CBD86A005800E08000B28E +:1049A80080286009201D1AD95028F01F002C602A81 +:1049B8002FFD580AE60A1700E20A171040185C781B +:1049C80060491AD84A681ADC1ADA4A6A5809F40996 +:1049D8001700F00917104A4C1AD91AD01AD61AD744 +:1049E800F01F001860482F8D5808C431E0C9FFBC7B +:1049F800720A580AC0E0744B201D49CC1ADB1ADA37 +:104A08001AD850595048F01F000F2FCD40084019B0 +:104A18002FF82FC95848CED161585808C610704988 +:104A2800493C1AD91AD8F01F00072FEDC598000085 +:104A3800800380548003805C000016AB8003806094 +:104A4800800094C400007B078003807400007B080A +:104A580080037BE480037BDC800096A880037DC410 +:104A680080037DC880038088800380B8800380D05D +:104A780061E85808C350F11900127008201D1AD8AF +:104A8800507850395028F01F002761EA2FFDF53B78 +:104A9800001040291AD940281AD81ADC4A2C1ADBE7 +:104AA8001ADA50B8F01F0021FACAFFE00C9B5084B4 +:104AB800FB5400240E9CF01F001E2FBD40305050A8 +:104AC8001AD0FB1800145028F01F00162FFD4018AC +:104AD8001AD81AD01ADC497CF01F00142FCD0E9C6E +:104AE800F01F001549594968580CF2081710201D85 +:104AF800494C1AD8F01F000D493CF01F000C2FED4F +:104B08002FF62FC55826FE91FF492FF75847C0505A +:104B1800E40700353006C41BF01F000C2FADD83257 +:104B2800800096A8800380E8800094C4800021C893 +:104B380080038114800070788003812C8003812891 +:104B480080038130800381408000D680D431204D9D +:104B58004BE812911896169711895809C1A119881E +:104B6800B6881998EA18FFFFE818FF80B6C9B69802 +:104B7800B6A93EE8B6B83048A2084B589088EDB8B8 +:104B88000002E08100E7201D4B284B3C1AD8C228C0 +:104B9800FACCFFF4F01F0031403366105800C1E131 +:104BA8000D88AE880D98EA18FFFFE818FF80AEA0C0 +:104BB800AE9830093EE8AEC9AEB83048A2084A48B7 +:104BC8009088EDB80002E08100C5201D4A184A4CC3 +:104BD8001AD8F01F00242FEDCBC858B0F9B0020A3C +:104BE80030044A12C0786408F004032C2FF4F01F34 +:104BF800001F641849C51034CF736A0C3004F01FC5 +:104C0800001B8B14661B580BC460A36B301CF01F71 +:104C180000188B0CC3A1497CC1486608F002030B3D +:104C28006A080408501B5008F01F00134008910C34 +:104C3800401B6A082FF4F002030C580CC20148FC10 +:104C4800F01F0008C2880000000016AA000016A283 +:104C58008003783C8003816080018F048003817C1D +:104C6800800094C4000015208002E28C8002DC3CA5 +:104C7800800381988002E2A4800381C0344AF01F37 +:104C880000376A182FF88B18E8021502344C66189A +:104C98001034CC430D88AE880D98EA18FFFFE81849 +:104CA800FF803005AE98AEA030364AD20A984AD96D +:104CB8000E93640AEA0B1502F40B030AF537002079 +:104CC800F4070B08ECCCFFFF2FF7E60C000C5C5741 +:104CD800300AE6060B07C0886404E80B0304E80AF8 +:104CE80007042FFA18C40E9EEE0A1900CF630E9A15 +:104CF8002FFAF4060006928A5C56EDBA0002C1D17A +:104D0800640A202DF40B0304503950281A9C306A89 +:104D1800E8CBFFDFF01F001168CA1ADAE93A003859 +:104D28001ADA491A1AD7491C1AD41AD51ADAF01FEE +:104D380000102F8D400840192FF50035CBB53EE8FF +:104D4800E6060B08069730080C07AE982FF6A20661 +:104D5800302C2FCDD83200008002E7360000152015 +:104D6800000016A28003783C800381E4800094C48C +:104D780048781188580CC0215EFF5C68100C300818 +:104D8800F9390015F00918005F1C5EFC00001530A9 +:104D9800D4211897580CC2A04968F129000030089E +:104DA800F2CA0004F00900065836F5D8E9062FF8CB +:104DB800EE06002C791C163CC17148F89088EDB8B5 +:104DC8000001C0A148D81ADB48DC1AD61AD71AD86D +:104DD800F01F000C2FCDF9D6C00830082F06EE06BC +:104DE80000278F18D8225848CDE1E06C00FFD82260 +:104DF80000001530000016A2800382688003830437 +:104E0800800094C4D42118971695580CC2B04978DC +:104E1800F12900003008F2CB0004F00900065836EA +:104E2800F7D8E9062FF8EE06002A751A580AC03096 +:104E38000A3AC16148E89088EDB80001C0A148D895 +:104E48001AD548DC1AD61AD71AD8F01F000C2FCD5D +:104E5800EE060027F9D6C008EF450044D822584886 +:104E6800CDD1E06C00FFD82200001530000016A25A +:104E780080038CF080038304800094C4D4211897A5 +:104E8800580CC2A049E8F12A00003008F4CC00040C +:104E9800F00A00065836F9D8E9062FF8EE06002978 +:104EA80073195809C170580BC0F049689088EDB85B +:104EB8000001C0A149481AD9494C1AD61AD71AD89C +:104EC800F01F00132FCDEE06002748D8B0866F1CC0 +:104ED800D8225848CDE1580BC10048A8900930089D +:104EE800F0091900C0A448881AD748AC1AD8F01F8E +:104EF8000008300C2FEDD822D82A00000000153009 +:104F0800000016A280038CB880038304800094C438 +:104F180080038324D4214CB816951188189730063D +:104F2800EC081800E08000B6300BF01F004718941A +:104F38005807E0800097580C5F19EC0518005F08C7 +:104F4800F3E81008EC081800E080008C4BF8908813 +:104F5800EDB80002C3314BE811894BE89088EDB8F1 +:104F68000001C2C15C69EE09002871185808C041E7 +:104F7800109E1096C098EE09000AF53E0015F2CA78 +:104F8800FFF8EE0A03266F5A201D580AF40C170082 +:104F9800F5FC10045808F00B1700F1FB10041ADE9A +:104FA8001AD61ADC1ADA1ADB1AD84AB81AD74ABC3F +:104FB8001AD91AD8F01F002A2F6D5805C3D068488F +:104FC80058485F1958085F181268C3304A08118991 +:104FD8004A089088EDB80001C2C15C69EE09002852 +:104FE80071185808C04110951096C098EE09000A2B +:104FF800F5350015F2CAFFF8EE0A03266F5A201D90 +:10500800580AF40C1700F5FC10045808F00B1700A8 +:10501800F1FB10041AD51AD61ADC1ADA1ADB1AD8D8 +:1050280048D81AD748DC1AD91AD8F01F000D2F6DA6 +:10503800E93C0013D8226F58F13C0013D822000035 +:10504800000016AB80004E84000016A80000153042 +:10505800000016A28003828C80038348800094C4D9 +:1050680048D890093008F0091900C1345807EE08EB +:105078001700EE041700EFF810151AD848781AD45C +:10508800487C1AD71AD8F01F0007300C2FCDD82229 +:10509800D82A0000000016A88003828C8003838C25 +:1050A800800094C4D421580CC25049D8F12900007A +:1050B8003008F2CA0004F00900075837F5D8E907A4 +:1050C8002FF8F807002E7D1E163EC12149589088FA +:1050D800EDB80001C0A149481ADB1AD71ADC493CCF +:1050E8001AD8F01F00132FCD0E9C5C5CD8225848AC +:1050F800CE31490890093008F0091900C045E06C24 +:1051080000FFD8224888201D1ADB1ADC48AC1AD8C0 +:10511800F01F0007E06C00FF2FCDD82200001530EB +:10512800000016A6800382BC80038304800094C418 +:10513800000016A2800383C0D421580C5F18580BB6 +:105148005F1918961695F3E800081494C590580A44 +:10515800C5704AC89088EDB80001C0C114985C7841 +:10516800201D1AD84A881ADB4A8C1AD8F01F002842 +:105178002FCD4A889088EDB80001C0D14A28201D5B +:105188004A5C1AD8F01F0022089B0A9C5C7BF01F1F +:1051980000232FED300A5C74149C089BF01F00203C +:1051A8001897C0E149789008F8081900C29449682E +:1051B8001AD649CC1AD8F01F00162FEDC1C8089A84 +:1051C8000A9B781CF01F00180E9B6DECF01F00174F +:1051D8005C5CC12048B890093008F0091900C08407 +:1051E80048981AD6492C1AD8F01F00092FED0E9CA2 +:1051F800F01F0010DC2A0E9CF01F000EDA2ADC2AB1 +:10520800000016A280038CE4800383E8800094C425 +:10521800000016A080037C8480013DB48000D31870 +:10522800800383FC8002E7368001153880038428D8 +:105238008000D13CD421149518971696580CC0417B +:10524800E06C00F6D822F01F00163FF8E9DCC00831 +:10525800F0041800C041E06C00FFD822491890887B +:10526800EDB80001C0E16C48201D1AD848E85C651B +:1052780048EC1AD51AD61AD71AD8F01F000D2FAD38 +:105288006C4858485F0948B8B0893008EE040004F3 +:10529800E9680068F01F00088F7CD82A800050ACAD +:1052A800000016A280038D1080038450800094C4EF +:1052B80000007B0780009504D43118971695F01FDD +:1052C80000353FF8EDDCC008F0061800C5E0EE0632 +:1052D80000083009F1690015ECC8FFF8EE0803244E +:1052E8005804C5304AC89088EDB80001C0A14AB832 +:1052F800201D4ABC1AD41AD41AD8F01F002A2FCD60 +:10530800EB1800726EF91238F20817B00838F0047A +:1053180017804A589088EDB80001C051F01F00234B +:105328004A38910CECC8FFEA3019EE08032B089AAA +:105338000A9C5C7AF01F001FE7DCC008C19049A8EE +:105348009088EDB80001C0F16A48201DF3D3B00879 +:105358001AD91AD41AD849181AD5497C1AD8F01F5C +:1053680000112FAD0C073008EF680015C10830197F +:10537800ECC8FFF8EE060006ED690015EE080329F3 +:105388000819EE080929C038E06300FF069CD832E6 +:10539800800050AC000016A680038C7880038474CB +:1053A800800094C4000016A2800095040000153403 +:1053B800800109C08003848CD43116941493189703 +:1053C800580CC1014AB89008F8081900E08400D3C5 +:1053D8004A98201D4A9C1AD8F01F00293FFC2FED3F +:1053E800D832300BF01F0027189B18960E9CF01F20 +:1053F80000263FF8EBDCC008F0051800E08000BB91 +:105408004A289088EDB80001C0E1F1D3C010201DF2 +:105418001AD849981AD449EC1AD61AD71AD8F01FAC +:1054280000182FAD49B89088EDB80001C0D14928BF +:10543800201D499C1AD8F01F0012F7D3C010089CF1 +:10544800F01F00162FED49189088EDB80001C4B17F +:105458004938118948789088EDB80001C4415C69E1 +:10546800EE09002871185808C1C11092109EC21880 +:10547800000016A280038D20800384C0800094C49D +:1054880080004E84800050AC000016A6800384D8AB +:10549800000016A080037C8480013DB40000153014 +:1054A800EE09000AF5320015F2CAFFF8EE0A032EDB +:1054B8006F5A201D580AF40C1700F5FC1004580800 +:1054C800F00B1700F1FB10041AD21ADE1ADC1ADAF4 +:1054D8001ADB1AD84A881AD74A8C1AD91AD8F01F50 +:1054E80000282F6D5806C46058045F183009F2036D +:1054F80019005F1AF5E80008F2081800C3B0EAC8F6 +:10550800FFEAEE08032C580CC3506C4858785F0B20 +:1055180058485F0AF7EA100AF20A1800C0515828DA +:10552800C0305838C2715C73089B069AF01F00158A +:10553800EAC9FFEA300AEE090328F0030B0A4928F2 +:105548009088EDB80001C0A1EE0903281AD848A830 +:1055580048EC1AD8F01F000A2FED48DB0C9C2F8569 +:10556800EE050923F01F000B0C9B0E9CF01F000A90 +:10557800DA3ADC3A80038D2080038348800094C4A3 +:105588008002E736000016A6800384FC800055A040 +:105598008000D662800052C0D431149518971696B0 +:1055A800580CC041E06C00F6D832F01F001D3FF8DF +:1055B800E9DCC008F0041800C041E06C00FFD832F4 +:1055C8003009EE040008F16900683019F169001526 +:1055D80049489088EDB80001C171E8C8FFF8EE08A5 +:1055E8000323F01F00114918201D1AD37008F8086A +:1055F80001081AD848E85C7548EC1AD51AD61AD8A2 +:10560800F01F000D2FAD2F84EE04032C580CC06042 +:105618000C9B0E9CF01F0009300CD832800050AC57 +:10562800000016A2800095040000153480038D50F8 +:1056380080038508800094C4800052C0D421189744 +:10564800580CC1C0F01F000E18965BFCC060EF3B01 +:10565800000B5C5CF01F000B48B89088EDB80001A7 +:10566800C0A148A8201D48AC1AD61AD71AD8F01FCE +:1056780000092FCD30094888B089D82280002044FD +:1056880080002068000016A280038D3C80038538C6 +:10569800800094C400007B07D4314898189711897A +:1056A80048889088EDB80001C3015C69F8090028B2 +:1056B80071185808C08110951096C0D80000153090 +:1056C800000016A2F809000AF5350015F2CAFFF81D +:1056D800F80A03266F5A201D580AF40C1700F5FC27 +:1056E80010045808F00B1700F1FB10041AD51AD64D +:1056F8001ADC1ADA1ADB1AD84C281AD74C2C1AD901 +:105708001AD8F01F00422F6D0E9C3005F01F004084 +:10571800EEC6FFBC0A924BF34BA45C5CF01F003E44 +:105728006C08300B2FF5109C5808C1D0F01F003BB7 +:105738006C0C300BF01F003A6C0C300BF01F00396A +:105748006C0C300BF01F00388688EDB80001C0B132 +:10575800201D1AD26C0870484B4C1AD81AD4F01F66 +:10576800002B2FCD2FC65845CDC16F5C580CC1D02A +:10577800300BF01F002A300B6F5CF01F002D6F5CA0 +:10578800F01F002C4A385C5C9088EDB80001C0D14D +:10579800201D5C6C1ADC6F5870481AD849984A6CFE +:1057A8001AD8F01F001A2FCD6FEC580CC060F01FEC +:1057B80000236FECF01F00224A28F1260000495808 +:1057C8009088EDB80001C0E1ECC8FFEAEE080328B4 +:1057D800201D1AD848B81AD649BC1AD8F01F000B91 +:1057E8002FCD2EA6EE06032C580CC060F01F001714 +:1057F8003008EE0609280E9CF01F0014D83200006D +:1058080080038CC880038348800094C480002044AF +:10581800000016A280006F288000D6588000D6624B +:105828008000D65C8000D668800385608000D66ED4 +:105838008000E50480038588800111C88001122852 +:1058480000001530800385B08002E28CD4211897BF +:10585800580CE080007EF01F00413FF8EDDCC008E6 +:10586800F0061800C750EE0600287114089CF01FB7 +:10587800003CEBDCC008C0D10A9B089CF01F003933 +:105888000A9B089CF01F00380A9B089CF01F0037F1 +:105898004B789088EDB80001C0D1F1D5B0081AD87E +:1058A80068481AD84B381AD44B3C1AD8F01F003322 +:1058B8002FCD4AF43FF8F0051800C1718809300867 +:1058C800F0091900C0D4EE0600287118201D1AD856 +:1058D8004AB81AD64ABC1AD8F01F00282FCD0C0790 +:1058E8003018EF68006CC368EE0600083009F169EB +:1058F800006CEE0600280E9C711BF01F00238888A0 +:10590800EDB80001C0E1ECC8FFEAEE080328201D4D +:105918001AD849B81AD649DC1AD8F01F00182FCD62 +:105928002EA6EE06032C580CC060F01F0019300894 +:10593800EE06092848E89088EDB80001C0B149088A +:10594800201D494C1AD8F01F000D2FEDC038E06516 +:1059580000FF0A9CD8220000800050AC8000E504BB +:105968008000D6588000D6628000D65C000016A25F +:1059780080038D2C800385CC800094C480038CD850 +:10598800800385F880004D98800385B08002E28C02 +:1059980080038624D4211897580CC0E14BE890085E +:1059A800F8081900C7744BD8201D4BDC1AD8F01F13 +:1059B800003D2FEDD82278264BB85806C121F12595 +:1059C8000000F01F003A0E9CEF34000BF01F003867 +:1059D800089B5C5CF01F00370A07EF660068D82256 +:1059E80011894AD89088EDB80001C2C15C69F809EC +:1059F800002871185808C04110951096C098F809E9 +:105A0800000AF5350015F2CAFFF8F80A03266F5A9E +:105A1800201D580AF40C1700F5FC10045808F00B68 +:105A28001700F1FB10041AD51AD61ADC1ADA1ADB99 +:105A38001AD849A81AD74A0C1AD91AD8F01F001927 +:105A48002F6D4998F1260000ECC5FFF0EE05002502 +:105A58006A1C580CC1F078485898C1C05808C1A0B1 +:105A6800F01F001648C85C5C9088EDB80001C0C102 +:105A7800201D5C6C1ADC6A181AD84888490C1AD898 +:105A8800F01F00082FCDEE0600260E9C6D1BF01FA0 +:105A9800000DD822000016A2800382988003864455 +:105AA800800094C400001530800056A08000204477 +:105AB800800020688003834880010CEC8003865CAA +:105AC80080005854D4214B0818979009169630082E +:105AD800F0091900C0F44AD8F12800001AD8F1DBFF +:105AE800B0081AD84AA81ADC4AAC1AD8F01F002AFB +:105AF8002FCD4AA811893008F0091800C0414A8CF6 +:105B0800F01F00253FB8F0061800C3C15807C110A0 +:105B180049E830091188F2081800C0B53039F20890 +:105B28001800E08900075C68EE080028711BC0288F +:105B3800300B0E9CF01F001B49389088EDB800010F +:105B4800C1114928F1280000201DF0C9FFEAEE091B +:105B580003291AD91AD848E8493C1AD8F01F000E68 +:105B68002FCD48A6ED2800002EA8EE08032C580CCF +:105B7800C090F01F000EED28000030092EA8EE0896 +:105B88000929D822000016A200001530800382A837 +:105B980080038680800094C4000016AB800386B41E +:105BA80080004D98800385B08002E28CD42118973C +:105BB8001696580CC4E04A8890093008F009190074 +:105BC800C0C4F1DBB0081ADC1AD84A481ADC4A4CBF +:105BD8001AD8F01F00242FCD4A3811893008F0094F +:105BE8001800C0414A1CF01F001F3FB8F0061800FB +:105BF800C301499890093008F0091900C084497810 +:105C08001AD749BC1AD8F01F00172FED0E9CF01FA9 +:105C180000194998F126000048F89088EDB800016D +:105C2800C0E1ECC8FFEAEE080328201D1AD848B8DE +:105C38001AD6492C1AD8F01F000B2FCD2EA6EE0627 +:105C4800032C580CC060F01F000E3008EE0609281F +:105C5800D8220000000016A2800382D0800386C8E4 +:105C6800800094C4000016AB800386B4800386F8D5 +:105C78008000564400001530800385B08002E28C15 +:105C8800D4311897149678CC94CAF80A000A8FCAA7 +:105C98001093169512946E385808C1504A5CF01F3C +:105CA8000026EF18001A3509F0090D083008F00928 +:105CB8001900C0414A1CF01F0020EF08001A2FF8F5 +:105CC800EF58001A49E89088EDB80001C171202DFD +:105CD800304A1A9C089BF01F001BF01F001BEF386E +:105CE8000014F3D3C01050091ADC1AD849781AD610 +:105CF800497C1AD8F01F00102FAD0A9AEF3B001408 +:105D08000C9CF01F001409890998B168F1E9118801 +:105D180009A9F1E9108809BBEF3C0014F5D3C010BC +:105D2800104BF01F000D0C9CF01F000CD832000027 +:105D380080037FB4800094C4800384D4000016A23A +:105D48008002E736800096A88003827C800387184B +:105D580080007130800020088000D13CD431204D73 +:105D6800502C503BFAC4FFCC10916800681268238D +:105D780068386846129568545819E088000E4B58E0 +:105D880090093008F0091900E08402B0201D4B2862 +:105D98004B2C1AD8C2F85801C0C14AE89008E2084A +:105DA8001900E08402A3201D4AB84ADC1AD8C22888 +:105DB8005802C0C14A789008E4081900E0840296A5 +:105DC800201D4A584A7C1AD8C158501A500837CB57 +:105DD800301CF01F0025401A18974008C10149D807 +:105DE8009008F8081900E0840281201D49A849FCA0 +:105DF8001AD8F01F001F2FEDE08F0278402999383C +:105E0800B829300840395C729900B831992599DA77 +:105E180099E999F29943F9480050F9480044F9483A +:105E28000048F948004C5803E080008C3058F95875 +:105E38000074F01F0010EF4C00784865580CC1D171 +:105E48008A08F8081900E084020C1AD748A8C8582C +:105E5800000016A280038CA880038744800387640F +:105E6800800387848002DC3C800387A8800094C478 +:105E780080011200800382F88A88EDB80001C131E0 +:105E88006E08201D8EA51AD8F01F00366FE8500541 +:105E98001ADC1AD84B481AD84B484B5C1AD8F01F52 +:105EA80000352FAD6E258EAA6FEC5805C1210E9BCB +:105EB800F01F00315C5CC2504B089008EA081900DA +:105EC800E08401CF1AD74A984ADC1AD8E08F0175C6 +:105ED8004ACBF01F002DF5DCC008C0E04A789009D5 +:105EE8003008F0091900E08401BC201D5C6A49F8FB +:105EF8001ADA1AD7C499EF3C0014149BF01F002338 +:105F08006FEC0E9A4A2BF01F002349C8908CE21CB4 +:105F18000002E08001A76FE8F11900141AD970197E +:105F28001AD9F11900121AD970081AD848E81AD8DB +:105F380048E8499C1AD8F01F000F2FADE08F018F59 +:105F4800F01F00161892C2F148C89008F808190006 +:105F5800E08401871AD749281AD8492CC2D90000E9 +:105F6800800096A88003825C800382F88003880CF6 +:105F7800800094C480011320000016A280038824A6 +:105F88008003B409800112608000200880005C88CA +:105F9800800111F8800388848000E34080038C6CC2 +:105FA800800387E04B880E9BB083F01F0038EF63B7 +:105FB800006FEF63006CEF63006DEF63006E6E2897 +:105FC8004B355808E08100BD049B0E9CF01F003142 +:105FD800E7DCB0086EFCF01F0030E6C8FFEAEE0808 +:105FE800092C8A88EDB80001C0A14AC8201D1ADC16 +:105FF8004ABC1AD31AD8F01F002B2FCD2EA34A451E +:10600800EE0303285808C0B18A09F0091900E08492 +:1060180001281AD74A184A4C1AD8CCE84A3B049C9B +:10602800F01F00234A3B049CF01F00234A3B049CBA +:10603800F01F0023304A4A3B049CF01F00234A38D3 +:106048003009B0898A88EDB80001C0C1EE03032881 +:10605800201D1AD849181AD249DC1AD8F01F001185 +:106068002FCD4898118948A89088EDB80001C5310E +:106078005C69EE09002871185808C2B11093109590 +:10608800C3080000000015308000D658000016A292 +:1060980080004E0C8002E2A480038C6C800388A8E8 +:1060A800800094C4800388C480005BB48000D668F4 +:1060B800800069888000D65C800055A08000D66288 +:1060C800800067B48000D67200007B07800388F4E4 +:1060D800EE09000AF5330015F2CAFFF8EE0A0325A7 +:1060E800201D5808F00B1700F1FB10046F5A580ACE +:1060F800F40C1700F5FC10041AD31AD51ADC1ADAB6 +:106108001ADB1AD84B681AD74B6C1AD91AD8F01F51 +:1061180000362F6D049C4B598EAA0E9BF01F00343D +:106128005C5CE080009F4B3890093008F00919004A +:10613800E08400971AD74AA84AFC1AD8C3D88A8894 +:10614800EDB80001C0F1301B0E9CF01F002C6F58F9 +:106158001ADC1AD84A281AD74A9C1AD8F01F0022E3 +:106168002FCD8EAA4A7B049CF01F00275C5CC120BF +:106178004A0890093008F0091900C724201D5C6CF2 +:1061880049781ADC1AD71AD84A0CF01F00172FCDF5 +:10619800C678049CE06B00FFF01F001DEF4C005414 +:1061A8004945580CC0D18A08F8081900C5941AD76F +:1061B80048B8498C1AD8F01F000C2FEDC5188A88EA +:1061C8004959E21800021389C4505C69EE09002895 +:1061D80071185808C2211095109BC27880038C6CE6 +:1061E80080038348800094C48000523C8000E350C0 +:1061F800000016A28003891080004E84800389382D +:106208008003B4098000D7708003884C8000DC04C8 +:106218008003896400001530EE09000AF535001581 +:10622800F2CAFFF8EE0A032B7843201D5808F00A3B +:106238001700F1FA10041AD51ADB1AD31ADC1ADA85 +:106248001AD84AC81AD74ACC1AD91AD8F01F002B1C +:106258002F6D4ABB6F5CF01F002B300CC0283FFC31 +:106268004A95580CC0E08A093008F0091900C3A4FF +:106278004A68201D4A6C1AD8F01F00202FEDC32849 +:106288008A88EDB80001C2914A284A396E204A31FD +:106298005800F2001700F00017108E226E484A09C5 +:1062A8006EF35808F20117108E355818C0316FEC8C +:1062B800C058301B0E9CF01F001B49481AD05C7256 +:1062C8001AD15C751AD21AD31AD51ADC496C1AD7A6 +:1062D8001AD8F01F000A2F8D8907EF660014300CBA +:1062E800C0580E9CF01F00113FFC2FCDD832000083 +:1062F80080038C6C80038348800094C480006434DD +:106308008000D66E000016A280038CA880038988BE +:1063180080037BDC80037BE480037DC880037DC42D +:1063280080004E84800389A8800056A0D431203D87 +:10633800300730194B38E06504001892169191091E +:10634800E06007D00A9350070E964AF4C22826CC7C +:1063580058ACE08B001F4ADEFC0C032F3016C198A6 +:106368003006C178680CF01F002AE7DCB010C118AD +:1063780030185008C0E8680CF01F0025EBDCB0109E +:10638800C0883017C068680CF01F0021E1DCB0102D +:106398004A0A029B049CF01F00205BFCCD91580622 +:1063A800C161498870080438C0A4E208032BFACCFC +:1063B800FFF8F01F001A402B580BC0A14988201D78 +:1063C800498C1AD8F01F00182FEDC198300B502BAC +:1063D800F1D5C0100C99FAC5FFFC300650161AD535 +:1063E8001AD6402E5C731ADEF9D0C0101AD70C9A50 +:1063F8001AD31ADB0C9BF01F000D2FAD2FDDD83AF6 +:1064080000007AB800007AC0800382208002DC2C69 +:10641800800389E08002E278800098FC0000000C8C +:10642800800389EC800094C480005D64D4211897AF +:106438001696580CC041E06C00F6D8224C1890888B +:10644800EDB80001C0A14C08201D1ADB1ADC4BFC7A +:106458001AD8F01F003F2FCD4BA89088EDB8000147 +:10646800C0F16C481AD8ED1800241AD8ED18001C91 +:106478001AD84B584B7C1AD8F01F00352FCD0C9BDF +:106488000E9CF01F0035EDDCB008ECC8FFEAEE0802 +:1064980003285808C0804B18201D4B1C1AD8F01F21 +:1064A800002C2FED6EFCF01F002FECC8FFEAEE0861 +:1064B800092C4A489088EDB80001C0A14A28201D3F +:1064C8001ADC4A9C1AD61AD8F01F00212FCDECC826 +:1064D800FFEAEE0803285808C10149A99209F00902 +:1064E8001900C08449881AD74A0C1AD8F01F001816 +:1064F8002FEDE06C00FFD8220E9B2F06EE0600263B +:106508006C1CF01F001B49BB6C1CF01F001B49BB17 +:106518006C1CF01F001B6C1C304A49ABF01F001AA2 +:106528000E9CF01F001A583CE08B00075C5C300A98 +:106538000E9BF01F0017F01F00178F7CD82A000051 +:10654800000016A2800382E8800389F0800094C4CA +:1065580080038A1480004E0C80038A3880039DC013 +:106568008002E2A4800388A8800388C48000D658EB +:10657800800069888000D65C80005ACC8000D6688C +:106588008000659C8000D6728000204480002A002C +:1065980080009504D43118971695580CC041E06CCA +:1065A80000F6D832F01F00473FF8EDDCC008F006CF +:1065B8001800C041E06C00FFD832ECC8FFF8EE08C4 +:1065C80003285808EFD6E108F1F91868F7B901FF70 +:1065D800F1F91E68EE0600083049F1380068F20843 +:1065E8001800E088001E4B89920A3009F20A190047 +:1065F800C0A41AD84B581AD74B5C1AD51AD8F01F12 +:1066080000352FCD0C070A9C3006301BEF6600685A +:10661800F01F0031E06C00FBEF66006CD8325805C3 +:10662800C1504AE89088EDB80001C101EAF800A815 +:106638001AD8EAF8009C1AD8EB3800AD1AD84A38AC +:106648004A7C1AD8F01F00232FCDECC8FFF8EE08BB +:1066580003245804C1D049C89088EDB80001C1810D +:10666800EE060008301BF1330068F132006C0E9C16 +:10667800F01F001C4958201D1AD41AD21AD31AD751 +:106688001AD51ADC498C1AD8F01F00122F8D0A9BD4 +:106698000E9CF01F0016EE0600033002E738006C6F +:1066A800E4081800C7100A9CF01F00113FF8E9DC45 +:1066B800C008F0041800C1D13018E768006CC4A8FD +:1066C800800050AC000016A280038C8C80038A4C9A +:1066D800800094C48000E124000016A880038A7C0E +:1066E80080004E8480038AB0800052C08000E50498 +:1066F800EE060028E762006C711B0E9CF01F002359 +:106708004A389088EDB80001C0E1ECC8FFEAEE080D +:106718000328201D1AD849F81AD649FC1AD8F01FA0 +:10672800001F2FCDECC3FFEAEE03032C580CC0600A +:10673800F01F001B3008EE03092849589088EDB86F +:106748000001C0814938201D496C1AD8F01F001378 +:106758002FED48F89088EDB80001C1610E9C301B00 +:106768000C07EF37006CF01F001048A81AD65C64BD +:106778001AD41AD71ADC48DC1AD51AD8F01F000721 +:10678800300C2FADD832D83A80004D98000016A2B0 +:1067980080038C8C800385B0800094C48002E28CD6 +:1067A8008003862480004E8480038AF0D4311897B1 +:1067B8001695580CC041E06C00F6D832F01F003E28 +:1067C8003FF8EDDCC008F0061800C041E06C00FF9F +:1067D800D8324BA89088EDB80001C1A1EE06000898 +:1067E800F1340068F133006C4B58301B11820E9C59 +:1067F800F01F00344B48201D1AD21AD31AD41AD7C6 +:106808001AD51ADC4B1C1AD8F01F00312F8DEE0652 +:1068180000083009F13A006CF20A1800C060F1393A +:1068280000682FF9F1690068EE060008F134006885 +:106838003088F0041800E08800224A68900930087F +:10684800F0091900C104301B0E9CF01F001E49E816 +:10685800201D1AD41AD71ADC49FC1AD51AD8F01FE9 +:10686800001C2FAD30080C070A9CEF680068301B2D +:10687800F01F001AE06C00FBD83249181189300863 +:10688800F0091800C0500A9B0E9CF01F0015EE0678 +:1068980000043008E939006CF0091800C6100A9C99 +:1068A800F01F00103FF8F00C1800C1D13018E9684B +:1068B800006CC3E8800050AC000016A800007B07FD +:1068C80080004E848003824C80038B2C800094C40B +:1068D800000016A280038B6C8000E124800052C067 +:1068E8008000E5040E9CF01F001F49F89088EDB861 +:1068F8000001C0E1ECC8FFEAEE080328201D1AD801 +:1069080049A81AD649AC1AD8F01F001A2FCDECC4E2 +:10691800FFEAEE04032C580CC060F01F0017300883 +:10692800EE040928EE0600083009F169006C48E811 +:106938009088EDB80001C1410E9C301BEE060006A0 +:10694800ED37006CF01F000D48881AD71ADC48CCC8 +:106958001AD51AD8F01F0007300C2FCDD832D83AE4 +:1069680080005644000016A28003824C800385B044 +:10697800800094C48002E28C80004E8480038B984F +:10698800D4311294580A5F1830091497F204180089 +:106998005F0318961695E7E80008F2081800C55036 +:1069A800335CF01F00406CC98EC8F20800088DC81F +:1069B8006C385808C0614BC89088EDB80001C231E6 +:1069C8004BA89088EDB80001C0918EC81AD84B88A2 +:1069D8004B8C1AD8F01F00382FED4B889088EDB8F3 +:1069E8000001C0C14B28201D4B5C1AD8F01F003293 +:1069F8008ECB6E1CF01F00332FEDED08001A2FF818 +:106A0800ED58001A0A9AED3B00140E9CF01F002E58 +:106A18004A689088EDB80001C1218EC8201D1AD897 +:106A28001ADCED38001430091AD91AD71AD51AD831 +:106A380049F84A6C1AD8F01F00202F8D0E9CF01FC1 +:106A48000024335CF01F002358075F081063C160FF +:106A580049689088EDB80001C0C1201D1AD5ED38ED +:106A680000141AD8492849CC1AD8F01F00132FCD82 +:106A78000A9B0C9CF01F0019C1385804C11048B873 +:106A880090093008F0091900C0B44898201D5C64CA +:106A98001AD7493C1AD41AD8F01F00072FCDD83A74 +:106AA8008000A300000016A6000016A280038C98A0 +:106AB80080038BC8800094C4000016A080037C84E7 +:106AC80080013DB48000713080038BD88000D13CB8 +:106AD8008000A2E680038C108000585480038C3C10 +:106AE800D42148C8189716969088EDB80001C0A11F +:106AF8004898201D1ADB1ADC488C1AD8F01F0008A9 +:106B08002FCDF7D6C0100E9CF01F0006D82200002B +:106B1800000016A280038D0480038C50800094C46A +:106B28008000D984D4213007C1B80C9C0E9B2FF665 +:106B3800F01F000D1895C0F078485808C0C1F01F24 +:106B4800000B0A9CEB35000BF01F00090A9B5C5CEC +:106B5800F01F00085846CEA12FF75827C03030063E +:106B6800CE5BD82280002024800056A080002044DC +:106B780080002068D4214978F00C07085808C071B3 +:106B88004959F20C070AF00A1800C1F04929F20C19 +:106B9800070AF4081800C1904909F80C001CF0080D +:106BA8000017A567EE0C0027120748D99289EDB99E +:106BB8000004C0C11AD848B81ADA48BC1AD71AD87B +:106BC800F01F000A2FCDC02830070E9CD8220000E5 +:106BD8000000153C0000153800007B2C000016A6AC +:106BE8008003901080038DE0800094C4D421169710 +:106BF8001496F01F0005C0609828AC087808301C6F +:106C08008F08D82280006B7CD43149B849B91092DA +:106C1800F00C0708F20C070718961AD7498C1AD8EF +:106C2800EC060014F01F001749732FEDA36431E53B +:106C3800EE070018A568E8080008E60800087009CB +:106C48005809C0C090BA90AB1ADB1AD9702848FC12 +:106C58001AD81ADAF01F000B2FCD2FF7E406070811 +:106C68005C57EE051800F9B70000EE081800CE11C1 +:106C7800D8320000000015380000153C80038DF460 +:106C8800800094C400007B2C80038E0CD431201D1E +:106C98004A181896F00C07073005F80C001849F048 +:106CA800A36849F149F231E349F4EE070019A569EF +:106CB800F0090009E0090009720A580AC1D0923B9C +:106CC800922A8289F40B010CE2190010F8050005DC +:106CD8005C855809C1105C7B5C7AF3D5C010201D17 +:106CE800492C1AD91ADB1ADA1AD61AD25068F01FA8 +:106CF80000102FAD40082FF7E80607095C57EE0390 +:106D08001800F9B70000EE091800CD010A9C2FFD04 +:106D1800D83200000000153C00007B2C000016A6AD +:106D280080038DA00000153880038E28800094C44D +:106D3800D421F01F000B48B8EFDCB0109088EDB8F4 +:106D48000004C0A10E985C781AD84878487C1AD8F4 +:106D5800F01F00072FED0E9CD822000080006C94D5 +:106D6800000016A680038D7080038E4C800094C4AA +:106D7800D4214A181897169631D9F20C1800E088D1 +:106D8800000F90093008F0091900C33449B81ADC1B +:106D980049BC1AD8F01F001B2FEDD822F60B001A99 +:106DA8009088F80C0019E2180010A569F20A002969 +:106DB800495AF40903055808C0A04908201D1ADCDF +:106DC800492C1AD51AD8F01F000F2FCD0A9CF01F96 +:106DD80000103008EC060016EE07001748A9A56752 +:106DE800EE060026F20600068D288D08AC28AC3881 +:106DF800D8220000000016A280038DD080038E6880 +:106E0800800094C400007B2C80038E888002E28C72 +:106E1800D4314948F80C00121896F00C0707A36201 +:106E2800491331E44915EE070018A568E40800087D +:106E3800E60803085808C0500E9C0C9BF01F000C75 +:106E48002FF7EA0607085C57EE041800F9B70000A8 +:106E5800EE081800CE914839300CF2060B08D832EB +:106E68000000153C00007B2C0000153880006D7870 +:106E7800D4211897580CC0E14A189008F80819004E +:106E8800C3C44A08201D4A0C1AD8F01F00202FED51 +:106E9800D82249FAF40B070CF8CEFFFFF80C001CB7 +:106EA800A56CF40B0B0E3008F60B0019F809002935 +:106EB800498CF809000993289308B228B23831E9B7 +:106EC800F20E1800C031F40B0B0848D89088EDB8C2 +:106ED8000004C10148E8F00B07081AD848E8F00B8D +:106EE80007081AD848781AD748CC1AD8F01F0007CC +:106EF8002FCD0E9CF01F000AD8220000000016A219 +:106F080080038D8480038E98800094C40000153C13 +:106F180000007B2C0000153880038DE08002E28C95 +:106F2800D42118970E9CF01F0005C060780C0E9BAA +:106F3800F01F0003CF8BD82280006B7C80006E7816 +:106F4800D421496818971696149512949088EDB82C +:106F58000001C0C14928201D1AD91ADA1ADB1ADC27 +:106F6800490C1AD8F01F00102FAD301B0A9CF01FD7 +:106F7800000FC080301B0A9CF01F000C784858088E +:106F8800C0510C9B0E9CF01F000A5804C0500A9B6D +:106F9800089CF01F0008D822000016A280038D600C +:106FA80080038EAC800094C48000202480006AE8AE +:106FB80080006E78D4211897F01F00061898C02119 +:106FC800D8220E9A782C700990ABF01F0003DA2AA9 +:106FD80080006B7C80006F48D42116961494189515 +:106FE800F01F001E1897C021D8229838982B7809CE +:106FF800F6081900C2B2F5D8C0105804C050F20AF9 +:107008000708AC88C068F20A0709AC892FF8B838B5 +:1070180049389088EDB80004C0D10D881AD86E0898 +:107028001AD88EB81AD848F848FC1AD8F01F000F9A +:107038002FCD8E3B8E28F6081900C0710A9A5C7B0A +:107048006E2C6E09F01F000ADA2A0A9A5C7B782CEB +:10705800F01F0007D82A000080006B7C000016A6ED +:1070680080038D9080038ED4800094C480006F4884 +:10707800D4211897F01F00231896C021D8224A2837 +:107088009088EDB80004C0D178081AD898A81AD802 +:107098008CB81AD849D849EC1AD8F01F001E2FCD41 +:1070A8008C398C28F0091900C020DA2A49A8908860 +:1070B800EDB80004C1614998201DF0070709498807 +:1070C8001AD9F00707081AD8F20818005F191AD950 +:1070D8006C081AD848D8493C1AD8F01F000E2FADB2 +:1070E8006C2C6C090E9A8CABF01F000F48C8F00787 +:1070F800070948A8F0070708F00918005F1CD822FC +:1071080080006B7C000016A680038DBC80038EE88F +:10711800800094C4000016A2000015380000153C39 +:1071280080038F0080006F48D43118951697149308 +:10713800580CC0311894CBD8F60B001A4A58F00BEB +:107148000708F0080019A569F20A00294A2AF40973 +:1071580003095809C1604A1A940B300AF40B190044 +:10716800C0A4201D1AD849E81AD949EC1AD8F01F2A +:10717800001E2FCD49780E9BF007070CF01F001B4F +:10718800301B8ACCF01F001A18961894E0800092E1 +:10719800189B30098ACA0A9CF01F00168A485C8C22 +:1071A800F00C1900C2C048D9920A3009F20A190035 +:1071B800C0B45C781AD848A81AD648FC1AD51AD888 +:1071C800F01F00092FCD0C9C3004F01F000CC718CD +:1071D8000000153800007B2C000016A280039004E4 +:1071E80080038F2C800094C480006D788002DC3C82 +:1071F8008000CEC480038F548002E28C4AE9F207F3 +:10720800070AF4CBFFFFF40A001AA56AEE07001874 +:10721800F2070B0BF40800284A8AF4080008300A21 +:107228009123B02C9106B03A31E8F00B1800C03128 +:10723800F2070B0A4A084A29F0070708F207070964 +:10724800F0091800C1C149F9920A3009F20A190077 +:10725800C0A4201D1AD81AD849B849CC1AD8F01F8A +:10726800001C2FCD4948F00707095809F9BA01FF52 +:10727800F3DAE109F9B9001DF0070B0949189088FC +:10728800EDB80004C1618AC848DAF407070A201D6E +:107298000D891ADA488AF407070A1ADA1AD91AD8A5 +:1072A80048981AD648BC1AD71AD8F01F00092F8D4B +:1072B800089CD8320000153800007B2C0000153CD3 +:1072C800000016A28003900480038F90800094C46D +:1072D80080038FBCD431203D1690502A1895F01F9A +:1072E8000021301BE5DCB010F9D2C010F01F001EE1 +:1072F8001896C2C049D8EA050019F0050707A3691E +:10730800189431E849A1189349ABEE070016A56611 +:10731800F2060006F60600066C0B580BC0B0089C77 +:107328008CAA50095018F01F00148CAA4018140495 +:1073380040092FF7E205070A5C57EE081800F9B76D +:107348000000EE0A1800CE110696402A5800E1F611 +:107358001A00580AF5F21C000C9C2FDDD8320000E8 +:1073680080006C948002DC3C0000153C000015385D +:1073780000007B2C8002E736D431303818971693FA +:107388001494F00C1800E088001B48989009300805 +:10739800F0091900C0353005CA2848681ADC3005DC +:1073A8001AD8485CF01F00052FEDC998000016A2F6 +:1073B80080038DB080038FE0800094C4F80C001A1D +:1073C8004C88F00C0708F0080019A569F20A002992 +:1073D8004C5AF40903095809C1604C4A940B300A05 +:1073E800F40B1900C0A4201D1AD84C181AD94C1C2B +:1073F8001AD8F01F00412FCD4BA80E9BF007070CA1 +:10740800F01F003E0892301B5C72049CF01F003C89 +:1074180018961895C640049A069BF01F003AEE0786 +:1074280000184B03E6070702E4020012A562E4080D +:1074380000224AD83001F0020002300B8506A4244D +:10744800A4310E9CF01F0030852CE60707082FF8A2 +:10745800E6070B0831E9F2081800C031E6070B010E +:107468004A084AA9F0070708F2070709F0091800AF +:10747800C1C149E9920A3009F20A1900C0A4201DC5 +:107488001AD81AD849A84A2C1AD8F01F001B2FCD91 +:107498004948F00707095809F9BA01FFF3DAE10981 +:1074A800F9B9001DF0070B0949089088EDB80004E8 +:1074B800C1610D884959F2070709201D1AD9489951 +:1074C800F20707091AD91AD848985C74491C1AD4C3 +:1074D8001AD61AD71AD8F01F00082F8D0A9CD8324E +:1074E8000000153800007B2C000016A280038DB028 +:1074F80080038F2C800094C480006D788002DC3C6F +:107508008002E736800020240000153C80038F901D +:1075180080038FBCD401E06A05A0300B482CF01F13 +:107528000003D80200007B2C8002E8BCD421202D67 +:10753800FE782800501C500B3FF7109E301CC308E3 +:10754800300B7049EDB90001CFD17049EDB9000990 +:10755800CFD140195809C0B01396F2C5FFFE138960 +:107568005015EDE91089F7D9D010C038F7D7D010E9 +:10757800913B7049EDB90000CFD17C2B40095C8B61 +:107588005809C080B29BF7DBC108B28B40092FE9CC +:107598005009F80A1900E0880006202A5C8A580A6F +:1075A800CD01FE78280070482FEDD822580CC06015 +:1075B800FE782800300A7019C058FE78280030FA82 +:1075C8007019F3DAD20491195EFC202D3008E069B5 +:1075D80013885018F8090249C058401A2FF82FFA92 +:1075E800501A1238CFB12FED5EFCD703D401303CCE +:1075F800F01F0005C060303CF01F0004F01F0004BD +:10760800D402D6038000A3708000A38880014014B0 +:10761800D401580CC060300B303CF01F0004D80275 +:10762800303CF01F0003D8028000A31A8000A35C3E +:10763800D401202D3008B888303CF01F0022303C9F +:10764800F01F0021309CF01F001F307CF01F001D30 +:107658003008501840192FF950192FF8E04861A840 +:10766800CFA1309CF01F00193008501840192FF98D +:1076780050192FF8E05886A0CFA1307CF01F0013D6 +:10768800340B300A492CF01F0013FE782800302AEA +:1076980070C9F3DAD108308A91C970C9F3DAD08495 +:1076A800301A91C970C9F3DAD06191C970C9F3DA97 +:1076B800D001303C91C9F01F00082FEDD80A000016 +:1076C8008000A2A88000A2BE8000A2E6800075F417 +:1076D8008000A3A08000A388D42120AD4C68E3B823 +:1076E8000001D5533017FE6810007109F3D7D20294 +:1076F800303AF1490040E06B1B00EA1B00B7FE7C02 +:107708000C00F01F003E310A201D30081ADA0E99CD +:10771800109B308AFE7C0C00F01F003930080E994F +:107728000E9A109BFE7C0C00F01F0036300BFE7C7E +:107738000C00F01F0035FE7C0C00F01F0034300CEC +:107748001ADC18981899189A1ADC189BFE7C0C00F9 +:10775800F01F002F0E9CF01F002F302BFE7C0C001A +:10776800F01F002DF01F002DD503304AFAC7FFD0B7 +:107778004ABB0E9CF01F002B302B0E9CF01F002ADA +:10778800FAC8FFDC4A99722C109B912CE06AF980A8 +:10779800EA1A0337F2E40000FE7C1800F0E5000066 +:1077A800F01F0023308A4A3B0E9CF01F001E310A4E +:1077B800FAC6FFEC300B0C9CF01F001F3018304B42 +:1077C800FB68002149DCF01F00180C9BFE7C280098 +:1077D800F01F001B3009FE7C2800129B129AF01F34 +:1077E80000190E9C0E96304BF01F000F2FCDFAC7D4 +:1077F800FFD8C2D8800376008000A5088000A4B016 +:107808008000A4CE8000A4E68000A4F48000A470C8 +:107818008000A2228000A4FE8000A3D080039038BC +:107828008002E7368000A2808003901C8000AA1C9A +:10783800800390308002E8BC800390288000A66214 +:107848008000A69C0D8C2FE6F01F000F0E36CFB1DE +:10785800FACBFFFCFE7C2800F01F000C3009FE7CF0 +:107868002800129A129BF01F000AFE7C2800F01FC5 +:107878000009302CF01F0008FE7C2800F01F0005CE +:107888002F6DD8228000A2BE8000A6628000A69C30 +:107898008000A7EC8000A2E6D42130A81896F00C4E +:1078A8001800C0C1E067271020175BF7C13030DB34 +:1078B800FE7C1800F01F0008CF81E0672710201712 +:1078C8005BF7C0800C9BFE7C1800F01F0003CF8183 +:1078D800D822DC2A8000A9AED401178A17B91798D4 +:1078E800B168F1EA118817AAF1EA1088F3E81008DC +:1078F8001AD81ADC483CF01F00042FEDD80200000B +:1079080080039064800094C4D421202D4AB811D9F2 +:10791800BAD97009500911C8BAC81A961895169498 +:10792800581CE08900064A6CF01F0026C448761CE3 +:10793800F01F0025201DEFDCC0084A4C1AD7F01FA5 +:1079480000212FED5825C2A0682CF01F001F201D14 +:10795800EDDCC00849EC1AD6F01F001A30182FEDDC +:10796800F0061800C111305A49AB0E9CF01F001ADE +:1079780030AA49AB0E9CF01F00180E9C308A498B28 +:10798800F01F0015C1883028F0061800C141300AE0 +:107998000E9C149BF01F0013C0E83038F007180045 +:1079A800E08B000A300B0E9CF01F000F1A9B306A08 +:1079B800F01F000E2FEDD82A800396B88003909808 +:1079C800800094C48002DC2C800390C4800390D093 +:1079D800800390E480007380800390EC800390F82B +:1079E800800072DC8000202480005140D421189649 +:1079F8001695582CC45176174B3B0E9CF01F00333C +:107A08001896C1014B2CF01F00334B38FE798000CB +:107A1800B0094B28B0064B28B0064B28B006E08FBB +:107A280001C44B1B0E9CF01F0029C1D14AA89088A5 +:107A3800201D4AEC1AD8F01F00274A8890884ACCA3 +:107A48005008F01F00244A6890884AAC5008F01F7C +:107A580000214A4890884A8C5008F01F001E2FEDDC +:107A6800E08F01A30E9C4A5BF01F0018C0C14A4C6E +:107A7800F01F0018E06900FF4978E08F0195582C45 +:107A8800E089000749FCF01F0013E08F018E762C77 +:107A9800F01F001D18975836E08101876A1649BB08 +:107AA8000C9CF01F000AC53148B85807E08A000846 +:107AB8009009A1A9B0095817C2A1C3089009A1C982 +:107AC800B009C2C8800391048002ECC88003910801 +:107AD800800094C4000016A2000016A6000016A09C +:107AE800000016A8800391148003911C8003913430 +:107AF8008003914C800391648003E18C8003917C26 +:107B0800800391888002DC2C800392144B799208C0 +:107B1800A1A8B2085827C071C0D84B499208A1C87B +:107B2800B208C0884B299208A1A8B2085837C0717A +:107B3800C0A84AF99208A1C8B208C0584AD9920800 +:107B4800A1A8CAC84AB99208A1C8CA884AAB0C9C5D +:107B5800F01F002AC2F14AA85807E08A00089009D5 +:107B6800A3A9B0095817C061C0C89009A3C9B00932 +:107B7800C08849E99208A3A8B2085827C071C0D89C +:107B880049A99208A3C8B208C08849999208A3A82D +:107B9800B2085837C071C0A849599208A3C8B2089A +:107BA800C05849499208A3A8C79849299208A3C868 +:107BB800C758494B0C9CF01F0011C3E149085807EE +:107BC800E08A00089009A1B9B0095817C061C1B886 +:107BD8009009A1D9B009C17848499208A1B8B2085A +:107BE8005827C161C1C80000000016A6000016A0F1 +:107BF800000016A88003921C8002ECC8000016A2A0 +:107C0800800392204B699208A1D8B208C0884B59CA +:107C18009208A1B8B2085837C071C0A84B19920889 +:107C2800A1D8B208C0584B099208A1B8C3784AE94C +:107C38009208A1D8C3384ADB0C9CF01F002DC30161 +:107C48004AC85807E08A00089009A3B9B00958172C +:107C5800C061C0C89009A3D9B009C0884A09920870 +:107C6800A3B8B2085827C071C0D849D99208A3D878 +:107C7800B208C08849B99208A3B8B2085837C07189 +:107C8800C0A849899208A3D8B208C058496992087F +:107C9800A3B8C04849499208A3D8B208C858496B44 +:107CA8000C9CF01F0013C3D149285807E08A00082C +:107CB8009009A5A9B0095817C061C0C89009A5C9FD +:107CC800B009C08848699208A5A8B2085827C151C8 +:107CD800C1B848399208A5C8B208C168000016A6FC +:107CE800000016A0000016A8800392248002ECC8A9 +:107CF800000016A2800392284AC99208A5A8B208D3 +:107D08005837C071C0A84A999208A5C8B208C05887 +:107D18004A799208A5A8CC2B4A599208A5C8CBEB5A +:107D28000C9C4A4BF01F0024C3F14A485807E08ACC +:107D3800000B9009EA19FFFFE8198000B0095817ED +:107D4800C071C1089009F3D9C00FB009C0B849C9BA +:107D58009208EA18FFFFE8188000B2085827C08187 +:107D6800C11849789009F3D9C00FB009C0B848F9CB +:107D78009208EA18FFFFE8188000B2085837C08157 +:107D8800C0E848A89009F3D9C00FB009C08848894D +:107D98009208EA18FFFFE8188000C80B48489009C5 +:107DA800F3D9C00FB009D82A000016A0000016A801 +:107DB800800392308002ECC8000016A2000016A6CC +:107DC800D421582CC2717617495B0E9CF01F001500 +:107DD800C1211897494CF01F0015201D494C1AD78E +:107DE800F01F00120E9C2FF7F01F00122FED5847BE +:107DF800CF51C1380E9CF01F0010201DEFDCC008C9 +:107E080048BC1AD7F01F00090E9CF01F000A2FED7E +:107E1800C04848ACF01F0005D82A000080039238FB +:107E28008002ECC88003923C800094C4800390C414 +:107E380080006C108002DC2C80039250D421207DBD +:107E4800306A18951696FAC7FFEAE06B00FF0E9C99 +:107E5800F01F00385825C1B16C1C4B7BF01F003750 +:107E68001896C4B14B6CF01F00370E9B0C9CF01F8A +:107E780000360E9B301CF01F00340E9B0A9CF01F2E +:107E880000320E9B303CF01F0030C5085825E08AB0 +:107E980000356C1CF01F002D6C2B1897500B169C8E +:107EA800F01F002B58DC5F04585C5F08E9E81008F5 +:107EB800ECC5FFFC109418963008FACCFFF8400B7C +:107EC800F0041800C0500C9AF01F0022C238F01FAE +:107ED800002258375F98580C5F091896F3E8100885 +:107EE800E8081800C0A15807C085C0916A08118920 +:107EF8003308F0091800C030498CC098585C5F18E6 +:107F080058DC5F19F3E80008C050495CF01F000D09 +:107F1800C0D85C570C9BFAC9FFEAFACAFFF80E9C56 +:107F2800F01F00100E9CF01F00102F9DD82A000093 +:107F38008002E8BC800392808002ECC880039288AB +:107F4800800094C48001921C8002DC2C8002EDD059 +:107F58008002EE0C800098688003929C800392DC7B +:107F68008001927080019258D421204D4ABC149609 +:107F7800F01F002B1A9CF01F002B581CC0504AAC55 +:107F8800F01F0027C0A81A9CF01F0028201D1ADC2B +:107F98004A7CF01F00232FEDF01F002618974A6C2B +:107FA800F01F001F5807C0514A4CF01F001DC04861 +:107FB8000E9CF01F00234A376E0CF01F0023C1F0FF +:107FC8006E087018201D1AD8F01F0020500C4A0C9B +:107FD800F01F00136E0870285008F01F001C500C8A +:107FE80049CCF01F000F6E0870385008F01F0017BA +:107FF800500C499CF01F000A2FEDC048497CF01F27 +:108008000008497CF01F00060DC93018F009180057 +:10801800C2A1494CC298000080039314800094C404 +:10802800800191288003932C8000967080039348E8 +:108038008001997C80039358800393A880009784DB +:10804800000080D08000CAE4800096A8800393686E +:10805800800393788003938880039398800393B078 +:10806800800393B8493CF01F0014FACCFFF4300B9E +:10807800F01F0012301B4037FACCFFF8F01F000F3A +:10808800201D1AD750574047F01F000D500C48DCF0 +:10809800F01F000950075047F01F0009500C48AC6A +:1080A800F01F0005F01F0009300C2FED2FCDD8224E +:1080B800800393C4800094C48000C1EC800096A81B +:1080C800800393D080039DC08000495CD421202D7B +:1080D8001695584CE089000649ECF01F001FC3684C +:1080E800FACCFFFC761BF01F001D6A2C4014F01F11 +:1080F800001C18976A3CF01F001A18966A4CF01F6B +:108108000018501418951ADC496C1AD61AD71AD4C4 +:10811800F01F0011089CF3D5C008F5D6C0080E9BC7 +:108128005C7BF01F00112FCD5BFCC10148F8900962 +:108138003008F0091900C0A448D81AD548DC1AD666 +:108148001AD71AD8F01F00042FCD2FEDD82A000017 +:10815800800393DC800094C4800098FC8002DC2CAF +:108168008003941480003958000016A280039054AC +:1081780080039448D4211695583CE089000649CCE0 +:10818800F01F001CC338761CF01F001B18976A2CC0 +:10819800F01F001918966A3CF01F00174978201D37 +:1081A80018941AD649651AD7580CF0051710495C67 +:1081B8001AD5F01F0010089AF7D6C0085C5A0E9C12 +:1081C8005C7CF01F00112FCD5BFCC10148F89009C1 +:1081D8003008F0091900C0A448D81AD648DC1AD7C4 +:1081E8001AD51AD8F01F00032FCDD82A80039488F7 +:1081F800800094C48002DC2C80037DC480037DC889 +:10820800800394B880003C50000016A28003969C1E +:10821800800394DCD421206D1697582CE089000641 +:108228004A4CF01F0025C438761CF01F00246E2B22 +:10823800F8C700011A9CF01F0022304A1A9BFAC6A0 +:10824800FFEC0C9CF01F001F201D40681AD8F01F7F +:10825800001E1ADC49DC1AD7F01F00170C9B0E9C75 +:108268005C5CF01F001BFACCFFE0300BF01F00191C +:10827800301B4087FACCFFE4F01F00162FDD505763 +:108288001AD74056F01F00101AD71ADC492C50870D +:10829800F01F00092FDD50461AD6F01F000B1AD622 +:1082A8001ADC48EC5076F01F00042FCD2FADD82AE9 +:1082B80080039510800094C48002DC2C800098FC18 +:1082C8008002E736800096A8800395388000C19C1C +:1082D8008000C1EC8003955480039564D421FACDC5 +:1082E8000108581CE0890006491CF01F0012C1D87B +:1082F800F6C9FFFCF8CA0001FAC7FFFCE06B0100F1 +:108308000E9CF01F000DC110300948CAFACBFEFCC4 +:108318000E9CF01F000B5C5CC0814418489C1AD866 +:108328001AD7F01F00042FED2BEDD82A800395747F +:10833800800094C480009710800078E08000C4C05A +:1083480080039064D43121AD18961695582CE08995 +:1083580000064A1CF01F0021C3B8FAC7FFFC344AC4 +:10836800300B0E9CF01F001E306AE06B00FFFACC49 +:10837800FFDBF01F001BFAC4FFB8EAC9FFFCECCA18 +:108388000002320B089CF01F00171893C210189AAD +:10839800089B0E9CF01F00143088FB6300242016F5 +:1083A800EA060326FB68003C0C9CF01F00100C9B9F +:1083B800189A30180E9C3089F01F000D581CC08088 +:1083C80048C8201D48CC1AD8F01F00042FED2E6D88 +:1083D800D83A000080039590800094C48002E8BCDD +:1083E800800097108002E7368002EDD080019084EB +:1083F80080039048800395B4D42121AD1696582C5B +:10840800C05049BCF01F001BC308FAC7FFFC344A20 +:10841800300B0E9CF01F0018306AE06B00FFFACC9E +:10842800FFDBF01F0015ECC9FFFC301AFAC6FFB8D5 +:10843800320B0C9CF01F00111895C170189A0C9BF8 +:108448000E9CF01F000F3088FB6500240E9CFB6813 +:10845800003CF01F000C581CC08048B8201D48BCC8 +:108468001AD8F01F00042FED2E6DD82A800395D45A +:10847800800094C48002E8BC800097108002E73630 +:1084880080018FF8800396AC800395ECD431204DA1 +:108498001493189516947406582CC091761C304A7B +:1084A8004A7BF01F0028C0513018C458584CC0806F +:1084B8004A5CF01F00264A6CF01F0024C3D8761BC4 +:1084C8001A9CF01F00240A9A1A9BFACCFFF4F01F9A +:1084D80000224A289088EDB80002C0B1201D40480B +:1084E8001AD849F81AD649FC1AD8F01F00182FCD07 +:1084F800FAC7FFF40C9C0E9BF01F001B682B1A9CFC +:10850800F01F0014304A1A9B0E9CF01F00130E9B9C +:108518000C9CF01F0016683B1A9CF01F000E304A96 +:108528001A9B0E9CF01F000C0E9B0C9CF01F001059 +:108538001A953008A6C82FCDD83A0000800392803B +:108548008002EDE680039610800094C48003964074 +:10855800800098FC8002E736000016A28003903C59 +:10856800800396688000CBC88000CA928000CA74D5 +:10857800D421212D581CE0890006491CF01F001148 +:10858800C1C8F6C9FFFCF8CA0001FAC7FFD8320B08 +:108598000E9CF01F000D1896C1000E9B189AFAC782 +:1085A800FFF90E9CF01F0009300BFB6600270E9C9C +:1085B800F01F0007F01F00072EEDD82A80039684CD +:1085C800800094C4800097108002E736800099A844 +:1085D8008000998CD401F01F0003F01F0003D80A13 +:1085E80080019EF880009820D40148BE1898300970 +:1085F8007C0C580CC0A1F2090019487EFC0900291E +:10860800932A9318930BD8022FF92F4E58F9CF11AC +:10861800DC0A000000001544D401484CF01F000497 +:1086280030194848B089D802800396C0800094C4A5 +:10863800000015F8D4314B68169570065806C050DE +:108648005816E08100BAC938580CE08000B5F01F10 +:1086580000314B18910C1897580CE08000AD19891F +:10866800EC091800C0415805C460C4284AB44AC37C +:108678008906C188EC060018E60800287012049CD8 +:108688005802C0E0F01F002718910E9CF01F00252B +:108698000E9BE20C0D4A049CF01F0023C3102FF61A +:1086A8008906680649D258E6FE98FFE658F6C28160 +:1086B8005805C210049749DCF01F001D3008498690 +:1086C8008508C128F0080018EC0800287009580926 +:1086D800C0807018201D497C1AD8F01F00152FED96 +:1086E8006E082FF88F086E0858E8FE98FFED492CA1 +:1086F800F01F000F4888700CF01F0010C5C80E9CB2 +:1087080048FB49074906F01F0011C2C8000016407F +:108718008002ED8400001644000015400000154456 +:108728008002EDD08002EDE6800396C8800094C4F4 +:10873800800396E0800396C48002E28C80039364F1 +:10874800000015FC000016008002EEB86E08EC0868 +:10875800092C2FF88F085908C070498B300CF01F6E +:108768000018580CCF41301949689109496949786E +:108778007008F0080018F20800284959702A720C8D +:108788007008494B5D18581CC1705805C040492CE9 +:10879800F01F001248E83007340A0E9B910748DCA6 +:1087A800F01F000F48F8700CF01F000F4858301CDD +:1087B8009107D832D83ADA3A800393648002EEB847 +:1087C800000016400000154400001540000015FC8C +:1087D80000001600800396C4800094C48002E8BCA0 +:1087E800000016448002E28CD421202D1897FACB81 +:1087F800FFFCFE7C1800F01F0012583CC080584C4B +:10880800C081E0690100FE7818009109301CC15848 +:10881800401C58DCC03130ACC0B8588CC081F01F47 +:108828000009320CF01F00071BFCC0285C5CF01F1D +:1088380000054018300CAE882FEDD8228000A9C260 +:10884800800078A0D431202D30A1FAC0FFF930D2B1 +:10885800308349B749B630043005009CF01F001A30 +:10886800C2A11BF8E20818005F0AE40818005F09B3 +:10887800124AF80A1800C0904929491A1298740B2C +:10888800950CF20B0B0CC188E6081800C0916E0815 +:108898002018F00C17708F0CEC0C0B04C0686E09D4 +:1088A800EC090B082FF98F096E08E0480050CD61DC +:1088B8008F05CD4B3008109C2FEDD832000016489C +:1088C8000000164C800087F0D401F01F0004301B14 +:1088D800F01F0003D80200008000884C8000863C0E +:1088E800D4314974169714951293580BC0B1680C7B +:1088F800580CC0311896C2181696F01F0012890736 +:10890800C1C868085808C0C1E06C0200F01F000E1A +:10891800890CC061189648DCF01F000DC0E80A9C5D +:10892800E066020048650C33E60617806A0B0C9A6D +:10893800F01F00086A088F080C9CD8320000169CAB +:108948008002E28C8002E2A4800396E8800094C44E +:10895800800090B4D401F01F0002D80A800091086A +:10896800D4213008FAC4FFEC19C9F0091800F9B885 +:108978000100E9F81A01E9F81A02E9F81A004A1898 +:108988001AD84A1818971AD8089B3008E8C9FFF867 +:10899800E8CAFFFC780CF01F001D8F0C2FED580C57 +:1089A800C021DC2AF01F001A300949AA301BE06CEC +:1089B8001388F01F00193009498A301BE06C00FA4F +:1089C800F01F00153009496A301BE06C01F4F01FF4 +:1089D80000123009493A301BE06CEA60F01F000EC3 +:1089E8003009491A301BE06C03E8F01F000B30090E +:1089F80048EA301BE06C03E8F01F0007DA2A0000A1 +:108A08008001365C80013C948000CCA88000CAB00C +:108A180080008A708000956C80008A6480008A5883 +:108A280080008A4C80008A4080008A34D401F01F7C +:108A38000002D8028000C664D401F01F0002D802E8 +:108A480080012984D401F01F0002D8028000B8B048 +:108A5800D401F01F0002D8028000C074D401F01FB6 +:108A68000002D8028000E68CD401F01F0002D80270 +:108A78008001326430194828B0895EFC000016AACB +:108A8800D401319CF01F0003319CF01F0003D80271 +:108A98008000A2D28000A2E6D421204D3FF819C957 +:108AA8001897F0091800F9B80001EFF80E0430081B +:108AB800201D1AD850581AD81AD850685058F01F84 +:108AC800001C49CB6E0CF01F001C0E9949BA49CB0B +:108AD80049CCF01F001D2FCD581CC08049B8201D5F +:108AE80049BC1AD8F01F001B2FEDF01F001BF01F08 +:108AF800001B0E9CF01F001AC0F049A8900930080E +:108B0800F0091900C0F44988201D498C1AD8F01FB3 +:108B180000112FEDC07830194958319CB089F01FE9 +:108B280000153018EF6800082FCDD822800089681A +:108B380080008C5C8000CAEE80008B7C80008BDC1F +:108B480080008A7C80009A188003973C80039DC02F +:108B5800800094C48000998C80019EF880002A9837 +:108B6800000016A28003972880039758000016A4D7 +:108B78008000A300D4211897333CF01F000F300663 +:108B88000FD8EC081800C0C048CCF01F000D6E0CC0 +:108B9800F01F000C6E0CF01F000CAED6C07848BC5D +:108BA800F01F00076E0CF01F000A3FFCF01F0009C1 +:108BB800D82200008000A2E680039774800094C445 +:108BC8008000B1D88000AE50800397908000CABC66 +:108BD80080002E60D42116971896333CF01F00149D +:108BE8000C9CF01F0014201D1ADC493CF01F0013D8 +:108BF80030182FED0FC6F0061800C121490CF01FE0 +:108C0800000F6E0CF01F000F48F849095C5CF20C6D +:108C18001700F00C1710F01F0009AED6C0486E0CF4 +:108C2800F01F000BF01F000BD82200008000A300EB +:108C3800800096E48003979C800094C4800397B8D2 +:108C48008000B950800397D080037FC08000CB8814 +:108C58008000C690D42149471896F01F0014189533 +:108C6800C110301CF01F00126C18201D1AD8F01FFC +:108C78000011500C490CF01F001130182FEDAE8870 +:108C8800D822AE8CF01F000E48E89008EA081900B8 +:108C9800C08448D8201D48DC1AD8F01F00082FEDE2 +:108CA800D8220000000016AB8000CAE480002E60C5 +:108CB800800096A8800397D8800094C480006B2C0D +:108CC800000016A28003995C800397E8D4211897C6 +:108CD800F01F0027300A4A7B4A7CF01F0028300A20 +:108CE8004A7B4A8CF01F00254A7B300A4A7CF01FD9 +:108CF80000230E9A4A6B4A7CF01F0020300A4A6B08 +:108D08004A6CF01F001E4A6B300A4A6CF01F001BA9 +:108D18000E9A4A5B4A5CF01F0019300A4A4B4A5CBB +:108D2800F01F0016300A4A4B4A4CF01F0014300A54 +:108D38004A3B4A4CF01F0011300A4A3B4A3CF01F9C +:108D4800000F300A4A2B4A3CF01F000C300A4A2B0D +:108D58004A2CF01F000A300A4A1B4A2CF01F000751 +:108D6800300A4A1B4A1CF01F0005D82280008620C2 +:108D7800800085DC80039804800085F08000857879 +:108D88008003980C80007E448003981480007F70D4 +:108D98008003981C800079F48003982480007DC8A3 +:108DA8008003982C80008494800398348000633476 +:108DB800800398408000834C80039848800084009A +:108DC80080039850800082E4800398588000821CB9 +:108DD800800398608000817C80039868800080D43C +:108DE800800398748000791080039880D4211897A4 +:108DF800F01F000BF01F000BF01F000BF01F000B03 +:108E08006E0CF01F000B48B811893008F0091800E3 +:108E1800C0406E0CF01F0008D82200008000951496 +:108E2800800088D080009504800193A080013BBC1D +:108E3800000016A480004758D421202D3029EE7850 +:108E48000000F1D9D1A23019F1D9D0033007501858 +:108E58000E9B5007337CF01F000F1A9BFE7C3800D6 +:108E6800F01F000D0E9BE06A01A4FE7C3800F01F85 +:108E7800000B0E9BE06A0348FE7C3800F01F0008D8 +:108E88000E9BFE7C3800F01F00072FEDD822000053 +:108E98008000A2308000A8388000A8F08000A926B1 +:108EA8008000A8D4D401333CF01F0009334CF01FD4 +:108EB8000008335CF01F0006333CF01F0006334CFB +:108EC800F01F0004335CF01F0003D8028000A2A842 +:108ED8008000A2E6D421202DF01F0034F01F0034BA +:108EE800F01F0034F01F0034E06C1B00EA1C00B7D0 +:108EF800F01F00324B28201D4B2C1AD8F01F0032CF +:108F080030CB301CF01F00312FED1897580CC08162 +:108F18004AF8201D4AFC1AD8F01F002B2FED344BBD +:108F2800301CF01F002A8F0CC0814A98201D4A9CD3 +:108F38001AD8F01F00252FED3FF80E9CAEC8F01F81 +:108F48000026300B169CF01F0025F01F0025F01F8F +:108F58000025C0804A48201D49EC1AD8F01F001A85 +:108F68002FEDFACAFFFC0E9B4A0CF01F0021581C7B +:108F7800C0C1401A49FB0E9CF01F001F581CC0516D +:108F88000E9CF01F001ECFDB58CCC04058DCC061DF +:108F9800C03849BCC04849BCC02849BCF01F000AB9 +:108FA800F01F001ACFEB000080008A88800076E06E +:108FB80080008EAC80008E408000AAE88003970C69 +:108FC80080039888800094C48002DC3C800398A8C1 +:108FD80080039DC080008CD4800095C88000C8E4C0 +:108FE8008000895C800398B8800088E880013E880A +:108FF80080008AA0800193BC80008DF4800398E4EF +:109008008003990C8003993080009514D4314A1458 +:1090180058095F081296189716951493A888E06067 +:109028000100E06100FFC2E88920A868E203190096 +:10903800E069FFFFE7D9E828E9F88A02E06901005A +:1090480088E8F2080108682989151039E9F8BA0290 +:10905800EE021608049CF01F0010301CF01F000FD1 +:10906800F01F000F5806C090049CF01F000E301C23 +:10907800F01F000DF01F000D6828101310071005D1 +:109088005C83F1D7C0085803CD01069CD832000094 +:10909800000016AC8000A0408000A19880009ED4FB +:1090A80080009F5C8000A17080009E94D4013009EC +:1090B8005C7AF01F0002D80280009014D40148584E +:1090C80090E9701B120C702AF01F0003D8020000F0 +:1090D800000016AC8002E736D4014888189B118A34 +:1090E8003009F20A1800C07090E9701C120B702A3F +:1090F800F01F0003D8020000000016AC8002E7361B +:10910800D421208D48D8F0E60008FAE70008F0EAF4 +:109118000000FAC8FFF0FAEB0000F0E70008F0EBF7 +:109128000000E06CF980EA1C0337F01F0005300CE2 +:109138002FCD2FCDD82200008003996C8000A1C0CC +:10914800D401FAC9FFFCF01F0002D80280031C1CDE +:10915800D401F01F0002D8028002EE88D401F01F6B +:109168000002D8028002ECACD401F01F0002D80241 +:109178008002F0ECD401F01F0002D8028002E71050 +:10918800D401F01F0002D8028002EE2CD401F01F97 +:109198000002D8028002ED84D401F01F0002D80238 +:1091A8008002ECC8D401F01F0002D8028002EE0C45 +:1091B800D401F01F0002D8028002EDD0D401F01FC4 +:1091C8000002D8028002E87ED401F01F0002D80213 +:1091D8008002E8BCD401F01F0002D8028002E73602 +:1091E800D401F01F0002D8028002E28CD401F01FE3 +:1091F8000002D8028002E8D0D401F01F0002D80291 +:109208008002E2A4D401580CC0707808B08B7808AA +:109218002FF89908D802F9DBC008F01F0002D8021D +:10922800800078A0D431189616971495580AE08AC9 +:1092380000153008109AC0282FF8EE08070BF40B19 +:109248001800CFB10A38F9B50400EBD8E515EDB927 +:109258000001C0313303C0283203E9D9C001C090EE +:109268003004C1082FF42015069B0C9CF01F000D3C +:109278005805FE99FFF9C0682FF42FF70C9CF01FD2 +:1092880000090F8B580BCF91C0782FF42015069B3F +:109298000C9CF01F00045805FE99FFF9089CD83271 +:1092A8008000920CD431204DFAC4FFCC109368177B +:1092B800189568041698580BC0B13308BADB08999A +:1092C800069ABAC8FACBFFFCF01F001FC3985809CA +:1092D8005F1B58AA5F09F7E90009C0605808C04435 +:1092E8005C383016C0283006EECB003A3009FAC791 +:1092F800FFF00EF9C0B8F00A0D00029912985898BC +:10930800F1DBE9082D080EF800985808CF515806E7 +:10931800C1005803C0B0EDB40001C08132DB0A9C23 +:109328002013F01F000A3016C04832D830060EF855 +:109338000899069A0E9B0A9CF01F00030C0C2FCD6F +:10934800D83200008000922C8000920CD431203D4D +:109358003007500A18951696325432D3330230919A +:109368003730C978E8081800E081008E2FF60D889C +:109378005808E0800093E8081800E0800085E608B7 +:109388001800F9B90100F7B600FFF9B90001C038B3 +:109398002FF6A1B90D88E4081800CFB03008C048EE +:1093A800F80E00182FF60D8AF008002EF4CC0030C5 +:1093B800F4CB0030E20B1800FE98FFF4E00A180026 +:1093C800C0A1109A4008110B50084B98580BF00B8D +:1093D8001700C548364BF60A1800C0A1361B400ACC +:1093E8001ADB1AD93019740B2FCA502AC358370BF5 +:1093F800F60A1800C121361A40091ADAF2CAFFFC27 +:10940800501A308A1ADA720B3009310A0A9CF01F96 +:1094180000292FED1807C3C8378BF60A1800C0417A +:10942800400A361BC078358BF60A1800C091400AEE +:10943800341B1ADB1AD9740B2FCA502ACE6B375B30 +:10944800F60A1800C0B1361B400A1ADB1AD93009CF +:10945800740B2FCA502A30AACDAB363BF60A180037 +:10946800C171109A4008700B2FC8FB6B0008500898 +:10947800FACBFFF83008FB6800090A9CF01F000EC1 +:109488001807C0682FF70D8B0A9CF01F000C2FF6E9 +:109498000D885808FE91FF685805EBF81000F9B9D7 +:1094A8000100F1F91E000E9C2FDDD8328003997C53 +:1094B800800092AC8000922C8000920CD401189B02 +:1094C800FACAFFFC300CF01F0002D8028000935447 +:1094D800D40148A972082FF89308F2F800CC58086C +:1094E800C040F2FC00D45D18FE780D003019918957 +:1094F8007078D402D6030000000001184838F0F94B +:1095080000D0700CB33C5EFC00000118D431495601 +:1095180030020C9730152F46EEC1FF2C0E930E9497 +:109528000D88E4081800C18166086E291039E08B9F +:1095380000146C185808C0306C2C5D180D98EA0897 +:109548001800E9F80000EFF90001F3D8E008EFF897 +:109558000A02EDF51E002EC62EC70236CE21D832DD +:1095680000000118D431300E189830A5494C1C96CB +:109578002FCCFCC3FFFF1897F9340008EC0418003F +:10958800C071FDD3C0082ECCEA0E1800CF311C9C48 +:1095980048B530030A96FC0E002EEAF500D0F00517 +:1095A8000D048F040D08EF630008EC0E0026080870 +:1095B800EF6B00098F188D498D3AD83200000118D9 +:1095C800D421300A16971896328B495CF01F001583 +:1095D800300AFE7C0D00149BF01F00134935FE7CF9 +:1095E8000D00EAFB00D0F60B1073A19BF01F0010D2 +:1095F800FE7C0D00F01F000FFE7C0D00F01F000E1A +:10960800EAC9FF2CEB4600CCEB4700D430182F45B5 +:10961800AA882EC51235CFD1D8220000800094D850 +:109628008000A3A08000A594000001188000A580F8 +:109638008000A57A8000A562D401306AF01F00027C +:109648005F0CD8028002E710D401F93A0020F738FD +:109658000020F4081800C020D80AF01F00035F0C8F +:10966800D80200008002E710D42119D919881AD924 +:1096780019C91AD919B91AD919A91AD91999486732 +:109688001AD9486A1AD8312B0E9CF01F00050E9C77 +:109698002FADD822000016E0800399848002EC40A8 +:1096A800D4214058F5D8C008F00916181ADAF5D8A8 +:1096B800C108F1D8C2081ADA48671AD8486A1AD90C +:1096C800310B0E9CF01F00050E9C2FCDD8220000F8 +:1096D800000016F4800399A48002EC40D421488746 +:1096E8001896321A300B0E9CF01F00060C9BED3AB0 +:1096F80000200E9CF01F00040E9CD822000016BC0F +:109708008002E8BC8002E736D431300318971696F9 +:109718001491129218950694C1D805002FF4009C54 +:10972800F01F0012F80300030C33E0880009201D25 +:1097380048FC1AD6F01F000F2FEDC108201DEE05BA +:10974800010B1AD00A9C0C0B48BAF01F000C2FED25 +:1097580018050234CE350E35C021D83A30080AF83B +:10976800EA07010CD83200008002EDD0800399B4DA +:10977800800094C4800399CC8002EC40D4211897CF +:109788002DFCF01F001B201D1ADC49ACF01F001A2D +:109798000E9CF01F001A500C499CF01F00176EC851 +:1097A800498C5008F01F00146EF82FED5818C0416E +:1097B800495CF01F0011EF3800383049F2081800F2 +:1097C800C0E03059F2081800C0603029F2081800CB +:1097D800C091C03848DCC04848DCC02848DCF01FCD +:1097E800000648DCF01F0004D822000080009670B4 +:1097F800800399CC800094C4800096E4800399D0BB +:10980800800399D8800399E8800399F480039A0823 +:1098180080039A1C800384D4D421202DFACCFFFC29 +:10982800F01F000C401870185808C04148ACF01FD1 +:10983800000B3007C0887008F007032CF01F0008E1 +:109848002FF75C57401870191237CF632FEDD822C5 +:1098580080018F0480039A40800094C4800097841C +:10986800D431202D300818921696BAE8169CF01FAD +:10987800001DEDBC0000C04149BCF01F001C3007B2 +:109888002FF649B30E94FAC5FFFCC208660BF6081A +:109898000709E2190044C210E04700405F9C0D8AA6 +:1098A800F60A0709E21900445F09F9E91009E8090D +:1098B8001800C131BADABAC8310A300B0A9C2FE64F +:1098C800F01F000CE4070B0C2FF7ED38FFFF5808CA +:1098D800CDE10E9C5C5CC028300C2FEDD832000026 +:1098E8008002EDD080039A50800094C40000049C4C +:1098F8008002F0ECD421204D1A981AD8FAC8FFF843 +:109908001AD8FAC8FFF01AD8FAC8FFE818971AD870 +:10991800169C49BBF01F001B2FCD584CC221403864 +:10992800E04800FFE08B001E402B580BC1A5E04B20 +:1099380000FFE089001740195809C135E04900FFC8 +:10994800E0890010400A580AC0C5E04A00FFE089D3 +:109958000009B16BF7E811881448F1E91088C028AC +:109968003008F0091618AEB8AE890E9CF3D8C208B4 +:10997800F1D8C108AE99AEA82FCDD82280039A603D +:109988008002EBF4486870085808F9BC00FFF9B980 +:109998000101F1F91E10F9BC01015EFC0000170479 +:1099A800D4214988169770085808C021DC2A580C19 +:1099B800C080189B321AF0CCFFEFF01F0013C0389C +:1099C800F16C003148F85807C080700C0E9B306A63 +:1099D8002CECF01F000DC088700C306A2CECE06B8A +:1099E80000FFF01F000A48787008F139003130088C +:1099F800F0091800C021DA2AF01F0005DA2A000051 +:109A0800000017048002E7368002E8BC80019EF857 +:109A1800D4314A241896169714951292680358035D +:109A2800C3B1338B301CF01F001E890C189BC0B1CA +:109A380049C89088EDB80003C2F1201D49A849BC67 +:109A48001AD8C10849ACF01F001B49691891581C65 +:109A5800C0E09288EDB80003C1F1201D4928496C87 +:109A68001AD8F01F00163FFC2FEDD8326808913243 +:109A7800F16300109106911791259288EDB80003C3 +:109A8800C020D8324888201D48DC1AD8F01F000BA7 +:109A9800029C2FEDD832DC3A000017048002DC3C2F +:109AA800000016A280039A8080039AE080009AC87A +:109AB80080018F2480039AF8800094C480039B203F +:109AC800D431202D1697581CC290C083582CC670CC +:109AD8004A78583CE08101A8C998F01F00264A48F6 +:109AE80018969088EDB80003C0A1F01F00234A38EB +:109AF8001ADC4A3C1AD8F01F00232FED333CF01F24 +:109B08000022334CF01F00216E185808E08001979E +:109B18006E3B0C9C5D18E08F019249589088EDB817 +:109B28000003C08149A8201D49AC1AD8F01F0015B0 +:109B38002FED334CF01F0014333CF01F0014EF39A5 +:109B480000103008F0091800E0800179F01F0012B9 +:109B5800581CE080017448689088EDB80003E081E3 +:109B6800016E201D48A848DC1AD8C659000016A264 +:109B78008001997C800096E480039AC880039B3812 +:109B8800800094C48000A3008000A2E680039CE8C3 +:109B980080039B5480019EF880039B784B589088E3 +:109BA800EDB80003C0814B48201D4B4C1AD8F01F5C +:109BB80000342FED4AF89088EDB80003C0814B18A7 +:109BC800201D4B1C1AD8F01F002E2FED333CF01F20 +:109BD800002F6E285808C0306E3C5D18EF39001011 +:109BE8003008F0091800E080012AF01F0029581CED +:109BF800E080012549F89088EDB80003E081011F55 +:109C0800201D4A084A3C1AD8C1699088EDB800035B +:109C1800C0814A18201D4A1C1AD8F01F00192FEDC0 +:109C28006E085808C0306E3C5D18EF3900103008D7 +:109C3800F0091800E0800103EF390031F00918003D +:109C4800E08000FDF01F00161894FACCFFFCF01F0E +:109C58000015581CC591401870185808C550300593 +:109C6800EEC1FFEFEEC3FFCE0A960A92C488000049 +:109C7800000016A280039ABC80039BAC800094C4A9 +:109C880080039A9880039BC48000A2E680019EF816 +:109C980080039BE880039AA880039C1C8001997C20 +:109CA80080018F04EF390031E4091800C080700882 +:109CB800029CF005032BF01F0041C1F0306A4C0BE9 +:109CC800069CF01F0040C0A040187008069CF005D4 +:109CD800032B2DFBF01F003CC1005806C0A0401804 +:109CE8006CC97008F005032870C81039E0890006AF +:109CF80040187008F00503262FF55C5540187019B8 +:109D08001235CD13C02830060C34C0415804E08108 +:109D1800009658065F1858045F19F1E90009C20057 +:109D2800089B0C9CF01F0025C1D068C8FE58FFC0D6 +:109D3800E08400856CCAF0C9FFF71439E084007F1D +:109D48004A299289EDB90003C0D1201D1ADA1AD820 +:109D580049F84A0C1AD8F01F00202FCDC0385808EF +:109D6800C0C0202DECCBFFDF306A1A9CF01F001B0F +:109D7800F01F001B2FEDC17849489088EDB800030B +:109D8800C0C1EECCFFEFF01F001749181ADC496C70 +:109D98001AD8F01F00112FEDEECCFFEFEF3B00318A +:109DA800F01F0012588CC060589CC2F0581CC21199 +:109DB800C458F01F000FC4288000965080039C38B8 +:109DC8008002EDE680009640000016A280039A8C7F +:109DD80080039C40800094C48002E73680019DDCAB +:109DE800800096E480039C6880019EA0800199CC45 +:109DF80049489088EDB80003C0814938201D493C86 +:109E08001AD8F01F00132FEDF01F0012581CC16064 +:109E180048C89088EDB80003C111201D48A848EC37 +:109E28001AD8C0989088EDB80003C081201D48B8A2 +:109E380048BC1AD8F01F00062FED2FEDD8320000CD +:109E4800000016A280039A8C80039C94800094C41E +:109E580080019EF880039CB080039ABC80039CCC50 +:109E6800D4012FEC580BC080F7DCC008FE7C28001A +:109E7800F01F0005D802F7DCC008FE7C2800F01FA0 +:109E88000003D8028000A6C68000A716D42148C7C0 +:109E9800C098300BFE7C2800F01F000A6E082FF8CF +:109EA8008F086E0CF7DCC008CF51F9DCC288F01FB0 +:109EB800000630194858B089D82200000000170859 +:109EC8008000A7FA80009E680000170CD40148683B +:109ED800300B700CF9DCC288F01F000430094848C8 +:109EE800B089D8020000170880009E680000170C8F +:109EF800D421202D4948301B700CF9DCC288F01F92 +:109F08000013E06B00D7FE7C2800F01F0011FAC791 +:109F1800FFFAE06B00FFFE7C2800F01F000D0E9B8F +:109F2800FE7C2800F01F000B9AB8EDB80007CF217F +:109F38004858300B700CF9DCC288F01F00042FED74 +:109F4800D82200000000170880009E688000A7FA49 +:109F58008000A816D421202D49B8A96C910C49B8C5 +:109F680011893008F0091800C030F01F00193009B5 +:109F780049684957B0896E0C301BF9DCC288F01F5C +:109F88000015E06B0082FE7C2800F01F00136E08AD +:109F9800F3D8C008FAC7FFF8F7D8C10CFE7C280030 +:109FA800F3EB109B0EDBB18BF01F000B0FABFE7CAD +:109FB8002800F01F00090FBBFE7C2800F01F0006D8 +:109FC8002FEDDA2A000017080000170C80009EF811 +:109FD80080009E688000A7FAD42149381897118913 +:109FE8003008F0091800C0604908700CA98CF01FEF +:109FF8000010EEC6FF000F3BFE7C2800F01F000D8E +:10A008000C37CFA14898300B700CF8CCFF00910C9E +:10A01800F9DCC288F01F000830194838301CB089B4 +:10A02800D82200000000170C0000170880009F5C71 +:10A038008000A7FA80009E68D421202D4A78A96C58 +:10A04800910C4A7811893008F0091800C030F01FC7 +:10A05800002530094A284A17B0896E0C301BF9DCF4 +:10A06800C288F01F0021E06B00D2FE7C2800F01FA0 +:10A07800001F6E08F3D8C008FAC7FFF8F7D8C10C5C +:10A08800FE7C2800F3EB109B0EDBB18BF01F001752 +:10A098000FABFE7C2800F01F00150FBBFE7C2800CC +:10A0A800F01F0012E06B00FFFE7C2800F01F000F7D +:10A0B800E06B00FFFE7C2800F01F000CE06B00FF47 +:10A0C800FE7C2800F01F0009E06B00FFFE7C2800E2 +:10A0D800F01F00062FEDDA2A000017080000170C01 +:10A0E80080009EF880009E688000A7FAD421202D69 +:10A0F800498818973009118AF20A1800C070B08987 +:10A108004958700CA98CF01F0015FAC5FFFAEEC665 +:10A11800FF00E06B00FFFE7C2800F01F00110A9B87 +:10A12800FE7C2800F01F000F9A380EC80C37CF218C +:10A138004898300B700CF8CCFF00910CF9DCC28801 +:10A14800F01F000930194838301CB0892FEDD8228B +:10A158000000170C000017088000A0408000A7FA34 +:10A168008000A81680009E68D4211897C088F01F28 +:10A178000006486CF01F000620175C87483C58070B +:10A18800CF71DA2A800090C40000171080009FE089 +:10A19800D4211897C088F01F0006486CF01F0006ED +:10A1A80020175C87483C5807CF71DA2A8000A0F452 +:10A1B80000001710800090E0D4213027FAC4FFEC8B +:10A1C8001896A887C0C80C9A089BFE7C2800F01F28 +:10A1D8000009C020D82A09882FF8A8880988EE081D +:10A1E8001800FE98FFF230094838301CB089D82290 +:10A1F8008000A73C0000170CE1B80000EE18000131 +:10A20800F1D8C201C020D3033019F20B094B994B86 +:10A21800783958085E0CD5035EFCFE681400700996 +:10A22800F3DCD0C191095EFCF8081605A968E0289E +:10A23800F000581BC0D0C063582BC0F0583BC12059 +:10A248005EFF3019F20C0949916991A9C108F60C11 +:10A25800094B915B91ABC0B83019F20C094991696F +:10A26800C0583019F20C0949915991993019F20CDA +:10A27800094C912C5EFDD703D4213007189616940B +:10A288000E95C0880D9B0D8C2FF72FE6F01F00044C +:10A2980018450837CF830A9CD82200008000A230D6 +:10A2A8003018F00C0948A59CA96CE02CF000F9487E +:10A2B800004899185EFC3018F00C0948A59CA96C58 +:10A2C800E02CF000F94800745EFC3018F00C0948E6 +:10A2D800A59CA96CE02CF000F94800785EFC3018C9 +:10A2E800F00C0948A59CA96CE02CF000F948005432 +:10A2F800F948004499185EFC3018F00C0948A59CF0 +:10A30800A96CE02CF000F9480058F9480044991865 +:10A318005EFC301AF8081605F40C0949A968E0280B +:10A32800F000F14900C4143BC080C043582BC0F171 +:10A33800C098F14900A8C038F14900A4F14900B813 +:10A34800C078F14900A8F14900B4C0285EFAF14983 +:10A3580000945EFD3018F00C0948A59CA96CE02C0F +:10A36800F000F94800985EFCF8081605A968E0288E +:10A37800F000F0F800D0F00C0A4CF9DCC0015EFCEB +:10A388003018F00C0948A59CA96CE02CF000F9489D +:10A3980000D85EFCC008D703F3DBC0054898A59B2E +:10A3A800F00B00387018F009092C4878F5DAC0026B +:10A3B800F00A0329FE780800F00B09295EFC00006A +:10A3C80080039CFC8003773CD42148F8E3B8000163 +:10A3D80048E848F9700E48FC3008FE7B0800C0E8E1 +:10A3E8007216EC0A00262FFA8D0C0E3ACFA3F60847 +:10A3F800092E2F892FF85948C0407207300ACF6BB1 +:10A40800D8220000800376008003773C80039CFC00 +:10A418008000A39CE0680083FE790800F00C010C22 +:10A42800F20C0328F0CAFFC0F20A032C580C5E0C89 +:10A438004869F80C1200F2080038F80C111F70185F +:10A44800F00C032C5EFC000080039CFC78C83019DB +:10A45800F1D9D10399C85EFC78C83019F1D9D00177 +:10A46800F1DBD20399C85EFCD421FAC4FFEC68176B +:10A47800680EEFD7C003FDDEC0013004E9D7D00372 +:10A48800E9DED0E1E9D7D103E9DED1E1E9DAD203A7 +:10A49800E9DBD2E1E9D8D303E9D9D3E199147958B2 +:10A4A800EDB80005CFD1D822D4213007405E2F8BDC +:10A4B800EFD8D021EFD9D104EFDAD204EFDED306FA +:10A4C800F80B0927D822F5E910192F8BF3E8102883 +:10A4D800F80B0329F3D8D043F80B09295EFC2F8B1E +:10A4E800F80B0328A1A8F80B09285EFC7958EDB8E9 +:10A4F8000000CFD15EFC7808F1DBD00299085EFC41 +:10A50800EC5BBB9FE08B0004304BC138E068C6BFF2 +:10A51800EA18002D103BE08B0004305BC0A8E0680F +:10A528001200EA18007A103BF9BB0306F9BB0207D0 +:10A5380078A8F1DBD00399A878A8F1DAD10399A813 +:10A548007808A3A899087958EDB80007CFD17808FA +:10A558003019F1D9D00299085EFC7808EDB80004EA +:10A56800CFD07808A1A899087808EDB80004CFD012 +:10A578005EFC301899485EFC7808EDB80004CFD02E +:10A58800992B7808EDB80004CFD05EFCD42130F8C0 +:10A5980014951697F00A18005FBA30181896F00B41 +:10A5A80018005FB9F5E91009C020D82AF00B180087 +:10A5B800C0A1FE7C0C00F01F0015300BFE7C0C00C7 +:10A5C800F01F00136C08EDB80004CFD0A377B1A733 +:10A5D800EFE510878D076C08EDB80004CFD06C0844 +:10A5E800E2180010CFD18D186C08EDB80004CFD058 +:10A5F8006C08EDB80004CFD03FF88D286C08EDB892 +:10A608000004CFD0DA2A00008000A4548000A4609F +:10A618003038F00A18005FB93078F00B18005F88FE +:10A62800F3E81008C1913108F00B1800E08B001511 +:10A63800E06800809908208BF4081601F5DAC0015B +:10A64800F1EB104B580AF9BA0100F9BA0002F7EA1F +:10A65800100A99CA5EFD302C5EFCD4013019189896 +:10A66800F73B000DF20B1800E0880004302CD802EC +:10A67800300AE06900809909301E7019149CF3DED5 +:10A68800D001F3DBD081F3DAD0E130FAF3DAD20487 +:10A698009119D802D4013018F00B18005FBEF00AE7 +:10A6A80018005FB81C48C030302CD8027818F1DB8D +:10A6B800D021F1DAD041F1D9D3089918D80A7819FC +:10A6C8001898EA19000F9919781CE21C0004C100B7 +:10A6D80030E9F20B1800E08B001A7019B16B300CDE +:10A6E800EA1BFFF0E81BFFFF126B911B5EFC303981 +:10A6F800F20B1800E08B000B70192F0B301AF40BBB +:10A70800094B5CDB126B911B5EFC302C5EFCE06835 +:10A718002710C0585808C0215EFF20187849EDB9A5 +:10A728000009CF917818EA18000F9918FC18010051 +:10A7380099085EFDD4313036F737000CEC07180065 +:10A74800E08B0050F733000B301EFC031800E08B41 +:10A758000049F73800083079F2081800E08800420C +:10A768003109F2081800E08B003D7619F205160150 +:10A77800F4050005EA090D04E8C90001E04900FEF6 +:10A78800E08B0030F0CA00080E923008EC1200018D +:10A79800A197F1D7D001F1D2D021F1D3D061F1DA6C +:10A7A800D084F73A0009F1D4D1081789F1DAD20830 +:10A7B800F73A000AF1DAD308FC091800C0C0C093C0 +:10A7C800302AF4091800C090EC091800C0A1C0781C +:10A7D80099C8C06899D8C04899E8C02899F8D83A63 +:10A7E800302CD832301899085EFC784CF9DCC0213E +:10A7F8005EFCE0682710C0585808C0215EFF20188A +:10A808007849EDB90001CF915C7B993B5EFDE0682A +:10A818002710C0585808C0215EFF20187849E2194F +:10A828000201E0490201CF717828300CB6085EFCBD +:10A8380076095829E08800035EFE7618A769109B00 +:10A84800E61BC000120CF3D8C003AFB91649109B21 +:10A85800E61B30001649109BE61B0C001649109B9E +:10A86800E61B03001649109BE61B00C01649109B07 +:10A87800E61B00301649109BE61B000C1649109B7E +:10A88800E61B00031649109BE21B60001649109B4B +:10A89800E21B10001649109BE21B0C001649109B86 +:10A8A800E21B03002FCC1649109BE21B0080109A74 +:10A8B8001649E21A0008109BE2180030E21B00401B +:10A8C8001649F3E81008144899085EFDF6081506BD +:10A8D800582BF9BC0BFFF9D8E80CF9B80805F9F8BA +:10A8E8008A00F9BC08005EFC582BE08800035EFE75 +:10A8F800F6081506F80800082FC87008EDB8000F0C +:10A90800C0C1A76BF3DAC010160C2ECC7808E0187B +:10A918000000F3E810089908F9DAC0105EFC582B1B +:10A92800E08800035EFEA76B160C7818EDB8000FE0 +:10A93800C0A12E4CF3DAC0107808E0180000F3E844 +:10A9480010089908F9DAC0105EFCD401F60E150457 +:10A958001C3AF9BE0210F9BE0308FC0B024BF608BC +:10A968001601F00A003AF40B0D0AF4091603F2C8AE +:10A978000001E048FFFEE0880003DA0A7818E86B77 +:10A988000000E418FFF7E018FECF590EF60E171076 +:10A99800F9BE0000FDE810089918F5DAC003F3EADB +:10A9A80011099989D80A7858EDB80001C030302CBF +:10A9B8005EFCF7DBC009997B5EFD7858E21800E081 +:10A9C800C030304C5EFC7859EDB90000F9BC010389 +:10A9D800F9F90006F00C1700E06A01FFF3DAE02845 +:10A9E800F7F80A005EFCE1B80000EE180001F1D8A3 +:10A9F800C201C020D3033FF9993978595808C020BB +:10AA0800D50330089918999899A8EA68610C9908AB +:10AA18005EFCD703D421201D500A16961897F01F04 +:10AA2800002F400A5806C5500DC83049F2081800D2 +:10AA3800E08800503095EA081800E08B004B0DD9EB +:10AA48003078F0091800E08B00458C39E068010186 +:10AA5800F0091900E08B003EED3900083038F009A4 +:10AA68001800E08B00376C0B0E9CF01F001D581C63 +:10AA7800C3000DC8EA081800C0416E18B1B8C05824 +:10AA880020586E19F3E810688F186E19ED3A00080F +:10AA98000DD8A978F1EA10E812488F18302A8C38B6 +:10AAA800F3D8C010F4081900E08800086E18ADB893 +:10AAB8008F1820298FA9C0586E18F1E910C98F196D +:10AAC8006E18E018FFF08F18300C35088F08C02872 +:10AAD800301C2FFDD82200008000A9EE8000A9526A +:10AAE8004828910C5EFC0000000018E8D431189842 +:10AAF800783E580EC620F90600105806C5E0300901 +:10AB08003FF3129A3344C1780E91E8071800C0A1A8 +:10AB1800F2CAFFFEF4C9FFFF5C7A5C89FC0A070AE7 +:10AB2800C0A8F6071800C4A05C75FC050709E4096D +:10AB380000095C89EC091900C0F2F2C5FFFFF9D9D8 +:10AB4800C0105C85FC0C000CEAC2FFFF19870E914F +:10AB5800E6071800CDA1580AC3003019F20A1800F8 +:10AB6800C0617028E06900802948C0C87028302971 +:10AB7800F20A1800C0412D483409C0482D48E06940 +:10AB880000C0300C3FF7C0D8F60A1800C1705C7ED0 +:10AB9800F00E070CEC0C000C5C8CF20C1900C0D207 +:10ABA800F8CEFFFF5C7C5C8EF00C000CFCC6FFFF4F +:10ABB800198AEE0A1800CE91300CD832D401F9085F +:10ABC800001CF3D8C010F2CEFFFE140EE04E004475 +:10ABD800E088000F48F8201D1AD8E06804E31AD866 +:10ABE80048D848EC1AD8F01F000E2FCDC008786E50 +:10ABF800FC090009F36B00F02FF8786BF3D8C0104C +:10AC0800F6090009F36A00F02FF8F958001CD80279 +:10AC180080039DC480039E0880039D9C800094C48B +:10AC2800D4013439F908001CF2081900E088000F33 +:10AC380048C8201D1AD8E06804EE1AD848A848BCAD +:10AC48001AD8F01F000B2FCDC008786AF3D8C010AF +:10AC5800F4090009F36B00F02FF8F958001CD8022A +:10AC680080039DC480039E5080039D9C800094C4F3 +:10AC7800D401580CC0E14B18201D1AD8E068062BE7 +:10AC88001AD84AF84AFC1AD8F01F002F2FCDC0084E +:10AC9800786A580AC0E14A98201D1AD8E068062C3C +:10ACA8001AD84AA84A7C1AD8F01F00272FCDC00806 +:10ACB800F908001C3439F2081900E088000F49F837 +:10ACC800201D1AD8E068062D1AD84A1849DC1AD867 +:10ACD800F01F001D2FCDC008F7D8C010160A3FFB83 +:10ACE800F56B00F02FF8129B5C88300AF958001CAD +:10ACF800C1584928201D1AD8E06806321AD8494890 +:10AD0800490C1AD8F01F00102FCDC008F1DEB01082 +:10AD1800786EFC090009F36A00F0F0CEFFFFF3D863 +:10AD2800C010F6081900FE98FFF3F958001CF3D973 +:10AD3800C002CE01D802000080039DC480039E8C0F +:10AD480080039D9C800094C480039EB080039EDC99 +:10AD5800D401F908001CF3D8C010F2CAFFFEE04A7B +:10AD68000044E088000F4918201D1AD8E06804F54F +:10AD78001AD848F848FC1AD8F01F000F2FCDC00881 +:10AD8800786AF4090009F5DBC108F36A00F02FF8C6 +:10AD9800786AF3D8C010F4090009F36B00F02FF8B3 +:10ADA800F958001CD802000080039DC480039F1C32 +:10ADB80080039D9C800094C4D401F908001CF3D83A +:10ADC800C010F2CAFFFCE04A0044E088000F49B80E +:10ADD800201D1AD8E06804FD1AD84998499C1AD849 +:10ADE800F01F00192FCDC008786AF4090009F60A87 +:10ADF8001618F36A00F0786A2FF8F3D8C010F4092F +:10AE08000009F5DBC208F36A00F0786A2FF8F3D876 +:10AE1800C010F4090009F5DBC108F36A00F02FF847 +:10AE2800786AF3D8C010F4090009F36B00F02FF822 +:10AE3800F958001CD802000080039DC480039F605D +:10AE480080039D9C800094C4D421F9380035A3D890 +:10AE5800F9680035189678A75807C2406E1C580C38 +:10AE6800C050F01F001130088F186E285808C09184 +:10AE78006E355805C061EF090010EA091900C0E0F5 +:10AE880048A8201D1AD8E06804C51AD84888489CE4 +:10AE98001AD8F01F00092FCDC0080E9CF01F00071C +:10AEA8008DA5D8228001122880039DC480039FA00D +:10AEB80080039D9C800094C48002E28CD421189762 +:10AEC800782C580CC050F01F000830088F286E3CB2 +:10AED800580CC070F01F00043008EF5800108F386D +:10AEE800D82200008002E28CD4211896580CC0E1C8 +:10AEF8004AE8201D1AD8E06805D11AD84AC84ADCA1 +:10AF08001AD8F01F002D2FCDC00878A75807C0E128 +:10AF18004A68201D1AD8E06805D31AD84A784A5CCE +:10AF28001AD8F01F00252FCDC0086E585808C0E069 +:10AF380049E8201D1AD8E06805D41AD84A0849DC1F +:10AF48001AD8F01F001D2FCDC0086E655805C0E047 +:10AF58004968201D1AD8E06805D51AD84998495C6F +:10AF68001AD8F01F00152FCDC0080A9AE06B0134DB +:10AF78000A9CF01F00158F5CC041E06C00FFD822CE +:10AF88009859E0680133F0091900E08B00214878EE +:10AF9800201D1AD8E06805DD1AD848C8485C1AD8B8 +:10AFA800F01F00052FCDC00880039DC480039FB407 +:10AFB80080039D9C800094C480039FD880039FFCDD +:10AFC8008003A0288000D3188003A054EF38001312 +:10AFD800EA081800C0514D3870092FF991097818FE +:10AFE800301B8F684CF9720A8F0AB09BB08B306B9C +:10AFF800B0ABF40B1618B0CBF7DAC2083009B0FAC8 +:10B00800B0DBF5DAC108305BB0B9F1690008F16965 +:10B018000009F169000AF169000BF169000CF16996 +:10B02800000DF169000EF169000FB0EAEF3A001265 +:10B03800F60A18005F0C30ABF60A18005F0BF9EB44 +:10B04800100BF20B1800C0513049F20A1800C0D199 +:10B058000DC9F169000C0DD9F169000D0DE9F1690F +:10B06800000E0DF9F169000F3009ECCAFFD1F16942 +:10B078000010F1690011F1690012F1690013F1691A +:10B088000014F1690015F1690016F1690017F169FA +:10B098000018F1690019F169001AF169001BF0CB79 +:10B0A800FFE4ED35002E3106EA091900F9BC02006B +:10B0B800F5FC380016CC2FF92FFA5C89EC09190039 +:10B0C800CF413009F0CAFFD4129C340B14CC2FF9AD +:10B0D8005C89F6091900CFB13009F0CAFF94129CB7 +:10B0E800E06B008014CC2FF95C89F6091900CFB108 +:10B0F8003639F16900EFF16900EC3829F16900EDA2 +:10B108003539F16900EE344A3009F0C8FF10EF59BB +:10B11800001C10C92FF95C89F4091900CFB1D82A8D +:10B12800000001F0D421580CC0E14A28201D1AD88B +:10B13800E06806141AD84A084A0C1AD8F01F0020EA +:10B148002FCDC00878A75807C0E149A8201D1AD8F4 +:10B15800E06806161AD849B8498C1AD8F01F0018A2 +:10B168002FCDC0086E5C580CC0E14928201D1AD8A4 +:10B17800E06806171AD84948490C1AD8F01F001079 +:10B188002FCDC0086E685808C0E148A8201D1AD8FD +:10B19800E06806181AD848D8488C1AD8F01F000852 +:10B1A8002FCDC008F01F000A30088F688F58D822AA +:10B1B80080039DC48003A09880039D9C800094C454 +:10B1C8008003A0BC8003A0E08003A10C8000D13CD8 +:10B1D800D42130D878A7EF390012F0091800EFF819 +:10B1E8001E12F9B80100EFF81E13300818968FE800 +:10B1F8008F988FB88FA88FD88FC8EF48004CEF482A +:10B208000048EF480044F01F0029EBDCC008C201E9 +:10B21800301A335B0E9CF01F0026307B0E9CF01F0B +:10B2280000250E9CF01F00246E5CEF0B001CF6CB73 +:10B23800FF105C7BF01F00210C983439EECAFFDC4C +:10B248006E5B6E1CF01F001E0C9CF01F001EEF387A +:10B2580000132FF85C58EF6800133099F2081800B3 +:10B26800E0880005E0692710C058E06903E8F009A4 +:10B2780002495C79E06801F4F2C9FE0DF2080C0895 +:10B288000C9CEF58001EF01F00100C9C48FBF01F90 +:10B2980000100C9C48DBF01F000F0C9C48BBF01FF3 +:10B2A800000E0A9CD82200008000AEF08000ABC4DB +:10B2B8008000AC288000AC788000D2108001139008 +:10B2C8008000B12C8000CABC8003B4098000CBC8C0 +:10B2D8008000CA748000CA92D421305878A7EF3908 +:10B2E8000012F0091800EFF81E12F9B80100EFF883 +:10B2F8001E131896F01F0026EBDCC008C2A1301AF6 +:10B30800335B0E9CF01F0023303B0E9CF01F002285 +:10B31800302A339B0E9CF01F001FED1B002C0E9C47 +:10B32800F01F001E0E9CF01F001E6E5CEF0B001C31 +:10B33800F6CBFF105C7BF01F001B0C983439EECA6B +:10B34800FFDC6E5B6E1CF01F00180C9CF01F0017D2 +:10B35800EF3800132FF85C58EF6800133099F208A3 +:10B368001800E0880005E0694E20C058E06907D061 +:10B37800F00902495C790A9CF2C9FE0DE06801F403 +:10B38800F2080C08EF58001ED82200008000AEF02A +:10B398008000ABC48000AC288000AD588000AC7839 +:10B3A8008000D210800113908000B12CD42118960F +:10B3B800580CC0E14AF8201D1AD8E06802F51AD8DE +:10B3C8004AD84AEC1AD8F01F002E2FCDC00878A70B +:10B3D8005807C4E0EF3900123088F0091800C4811A +:10B3E80017B8178A1799B169F3EA118917AAF3EA06 +:10B3F8001089F1E910096EA81039C3A130C8EF68A7 +:10B4080000123008EF680013F01F001E5C5CC28158 +:10B41800301A335B0E9CF01F001C304B0E9CF01F43 +:10B42800001B304A332B0E9CF01F00176EAB0E9C8E +:10B43800F01F00170E9CF01F00176E5CEF0B001C2E +:10B44800F6CBFF105C7BF01F00140C983439493A96 +:10B458006E5B6E1CF01F00120C9CF01F0012EF3880 +:10B4680000132FF8EF6800133148EF58001ED82258 +:10B4780080039DC48003A13880039D9C800094C4F0 +:10B488008000AEF08000ABC48000AC288000ADC066 +:10B498008000AC788000D2108003B405800113903E +:10B4A8008000B12CD421303878A7EF390012F00988 +:10B4B8001800EFF81E12F9B80100EFF81E131896DD +:10B4C800F01F002AEBDCC008C321301A335B0E9C46 +:10B4D800F01F0027303B0E9CF01F0026302A339BBC +:10B4E8000E9CF01F0023E06B02400E9CF01F002210 +:10B4F800304A332B0E9CF01F001E6EAB0E9CF01FC3 +:10B50800001F0E9CF01F001E6E5CEF0B001CF6CB9C +:10B51800FF105C7BF01F001B0C98343949AA6E5B46 +:10B528006E1CF01F001A0C9CF01F0019EF38001356 +:10B538002FF85C58EF6800133099F2081800E0887B +:10B548000005E0692710C058E06903E8F0090249DE +:10B558005C790A9CF2C9FE0DE06801F4F2080C0857 +:10B56800EF58001ED82200008000AEF08000ABC467 +:10B578008000AC288000AD588000ADC08000AC7859 +:10B588008000D2108003B405800113908000B12C94 +:10B59800D4214BD811B9118B119A11A8B16AF5EBC6 +:10B5A800118AF5E81088F3E8100878A78FA8EF3912 +:10B5B80000123068F0091800EFF81E12F9B80100FF +:10B5C800EFF81E131896F01F0031EBDCC008C3E13A +:10B5D800301A335B0E9CF01F002E301B0E9CF01FA0 +:10B5E800002D302A339B0E9CF01F0029ED1B002CE8 +:10B5F8000E9CF01F0029304A337B0E9CF01F00245C +:10B60800301B0E9CF01F0023303B0E9CF01F0021C6 +:10B6180031CB0E9CF01F001F306B0E9CF01F001DDD +:10B628000E9CF01F001E6E5CEF0B001CF6CBFF108B +:10B638005C7BF01F001B0C98343949AA6E5B6E1CAA +:10B64800F01F00190C9CF01F0019EF3800132FF899 +:10B658005C58EF6800133059F2081800E0880005BC +:10B66800FE79EA60C058E06903E8F20809495C79A4 +:10B678000A9CF2C9FE0DE06801F4F2080C08EF58C4 +:10B68800001ED8228003B4098000AEF08000ABC44D +:10B698008000AC288000AD588000AC788000D210C3 +:10B6A8008003B405800113908000B12CD421301898 +:10B6B80078A7EF390012F0091800EFF81E12F9B850 +:10B6C8000100EFF81E131896F01F0039EBDCC008D4 +:10B6D800C501301A335B0E9CF01F0036303B0E9CC0 +:10B6E800F01F0035302A339B0E9CF01F0032ED1BF3 +:10B6F800002C0E9CF01F0031304A332B0E9CF01F9B +:10B70800002D6EAB0E9CF01F002E304A336B0E9C42 +:10B71800F01F00286E9B0E9CF01F0029304A337BD7 +:10B728000E9CF01F0024301B0E9CF01F0023303BA2 +:10B738000E9CF01F002131CB0E9CF01F001F306BB8 +:10B748000E9CF01F001D0E9CF01F001E6E5CEF0B80 +:10B75800001CF6CBFF105C7BF01F001B0C983439E3 +:10B7680049AA6E5B6E1CF01F001A0C9CF01F001992 +:10B77800EF3800132FF85C58EF6800133059F208BF +:10B788001800E0880005FE79EA60C058E06903E81F +:10B79800F20809495C790A9CF2C9FE0DE06801F4D7 +:10B7A800F2080C08EF58001ED82200008000AEF006 +:10B7B8008000ABC48000AC288000AD588000ADC0CC +:10B7C8008000AC788000D2108003B405800113900B +:10B7D8008000B12CD421304878A7EF390012F00945 +:10B7E8001800EFF81E12F9B80100EFF81E131896AA +:10B7F800F01F0025EBDCC008C291301A335B0E9CA9 +:10B80800F01F0022303B0E9CF01F0021302A339B92 +:10B818000E9CF01F001EED1B002C0E9CF01F001D3F +:10B828000E9CF01F001D6E5CEF0B001CF6CBFF108A +:10B838005C7BF01F001A0C983439499A6E5B6E1CB9 +:10B84800F01F00180C9CF01F0018EF3800132FF899 +:10B858005C58EF6800133099F2081800E08800057A +:10B86800E0692710C058E06903E8F00902495C79EB +:10B878000A9CF2C9FE0DE06801F4F2080C08EF58C2 +:10B88800001ED8228000AEF08000ABC48000AC2837 +:10B898008000AD588000AC788000D2108003B405D9 +:10B8A800800113908000B12CD4314A5830167007AB +:10B8B80030A20C9330043055C3E86EA85808C3A0D2 +:10B8C800F1090022F2CA0001F15A0022EC0919001C +:10B8D800C151F1380012E40818005F0AE6081800A0 +:10B8E8005F09F5E91009E8091800C041EA081800DD +:10B8F800C2110E9CF01F0013C1D8F1090020F2CA32 +:10B908000001F15A0020EC091900C141F138001278 +:10B91800E40818005F0AE60818005F09F5E910094D +:10B92800E8091800C041EA081800C0410E9CF01F41 +:10B9380000066E075807CC21D8320000000080CCE2 +:10B948008000B7DC8000B2E0D4211896580CC0E122 +:10B958004C08201D1AD8E068024E1AD84BE84BFC58 +:10B968001AD8F01F003F2FCDC008F9380035A3D8EA +:10B97800F968003578A7F909002CE068023FF0095A +:10B988001900E088008B5807C091350CF01F00356E +:10B998001897E08000838DACC2E86E1C580CC0304C +:10B9A800F01F00316E585808C0E04AA8201D1AD868 +:10B9B800E068026C1AD84AD84A8C1AD8F01F0028B6 +:10B9C8002FCDC0086E285808C0916E385808C0613D +:10B9D800EF090010F0091900C0E049E8201D1AD845 +:10B9E800E068026E1AD84A2849CC1AD8F01F001C01 +:10B9F8002FCDC008350A300B0E9CF01F001EF01F1B +:10BA0800001E8F1C1895C0610E9CF01F001C8DA590 +:10BA1800C178344A49ABF01F001B499B343A6E1C6D +:10BA2800F01F00190C9A499B6E1CF01F00190C9C02 +:10BA3800F01F00185C5CC0700C9CF01F0017E06CD5 +:10BA480000FFD822ED380035A3B8ED680035D822BC +:10BA580080039DC48003A13880039D9C800094C40A +:10BA68008002E2A4800112288003A14880039FA0DD +:10BA78008002E8BC800112008002E28C8003B409D5 +:10BA880080011260800113208000BBBC800111F886 +:10BA98008000B5988000AE50E06C00FFD82200000E +:10BAA800D421202D1896580CC0E14BA8201D1AD877 +:10BAB800E06803781AD84B884B8C1AD8F01F0038E6 +:10BAC8002FCDC00878A75807C0E14B28201D1AD8E9 +:10BAD800E068037A1AD84B384B0C1AD8F01F00309C +:10BAE8002FCDC0086F295BF9C1102E2933C8E06A31 +:10BAF800FFFFF2080D081438F40817B0EF580020BB +:10BB08005808F9B80001EFF80C106F395BF9C1104B +:10BB18002E2933C8E06AFFFFF2080D081438F4082C +:10BB280017B0EF5800225808F9B80001EFF80C11C7 +:10BB38006EB850185808C041FC18FF0050186EC85D +:10BB480050085808C0716EA84019F3E80008A1A869 +:10BB58005008EECBFFD80C9CF01F0013FACBFFFC6B +:10BB68000C9CF01F00121A9B0C9CF01F00110C9CDF +:10BB7800F01F0010EF39001230A8F0091800EFF894 +:10BB88001E12F9B80100EFF81E132FEDD82200009D +:10BB980080039DC48003A16080039D9C800094C4A1 +:10BBA8008003A17C8000CBC88000CA928000CA7440 +:10BBB8008000CB88D43178A71896149574186E290C +:10BBC8005809C0916E395809C061EF0B0010F20B8B +:10BBD8001900C0E04BE8201D1AD8E06805651AD89E +:10BBE8004BC84BDC1AD8F01F003D2FCDC0088A5B2C +:10BBF80032BAF40B1900E088020F118B302AF40BCB +:10BC08001800E0810209F93C002EECCBFFD1F0CA04 +:10BC1800FFE4C0982FF917345C59153EFC0418004E +:10BC2800E08101FAF8091800CF6311FA11CB11D994 +:10BC380011E8B169F3EB1189F3E810896E08F5E9A9 +:10BC480010091039E08101E80E9CF01F00258A4C8C +:10BC5800E06800F0F00C1900E088000FF8CC00F064 +:10BC6800EF5C00105C7CF01F001F8F3CC051EF5C44 +:10BC78000010E08F01D1E06C00F0F01F001A8F2C4B +:10BC88001894C0C16E3C580CE08001C6F01F001625 +:10BC9800EF5400108F34E08F01BF189B3009E06A21 +:10BCA80000F00A9CF01F0011E06800F0F00C190089 +:10BCB800C2004878201D1AD8E068052E1AD848C84E +:10BCC800485C1AD8F01F00052FCDC00880039DC41A +:10BCD80080039FA080039D9C800094C48000AEC414 +:10BCE8008002E2A48002E28C8000CEC48003A1948A +:10BCF8006E3B580BE08001B2E06900F0EF1A0010CB +:10BD08000A9CF01F0036EF080010F8081900E080C0 +:10BD180001A54B38201D1AD8E06805351AD84B18EC +:10BD28004B1C1AD8F01F00312FCDC00819A8305A63 +:10BD3800F4081800E0810100EF3800123019F20809 +:10BD48001800E08100EC30086CA4333B89D889B82E +:10BD580089C8089CF01F0026C0F0F8C8FFFC19AB82 +:10BD6800119919BA1188B16AF5EB118AF5E81088AA +:10BD78001248E948004433AB089CF01F001DC0E09E +:10BD8800F8C8FFFC19AB119919BA1188B16AF5EB1B +:10BD9800118AF5E810881248C0386918A198E9484E +:10BDA800004833BB089CF01F0012C0E0F8C8FFFC35 +:10BDB80019AB119919BA1188B16AF5EB118AF5E82E +:10BDC80010881248C0286918E948004C6828F0C94A +:10BDD800FFF0C0F11298C1C88000CEC480039DC492 +:10BDE8008003A1C880039D9C800094C48000AAF4AD +:10BDF800F1390013F13B0010F13A0011F13800124B +:10BE0800B16AF5EB118AF5E81088F3E8100889A8FB +:10BE1800301B089CF01F0084C0E0F8C8FFFC19AB79 +:10BE2800119919BA1188B16AF5EB118AF5E81088E9 +:10BE3800124889B8303B089CF01F007BC0E0F8C866 +:10BE4800FFFC19AB119919BA1188B16AF5EB118A7F +:10BE5800F5E81088124889C831CB089CF01F007299 +:10BE6800C0E0F8C8FFFC19AB119919BA1188B16A7A +:10BE7800F5EB118AF5E81088124889D8306B089CD0 +:10BE8800F01F00691892C2E01998A38889E8582819 +:10BE9800F9B80B02E9F8BA0E3003C1D8E608150262 +:10BEA800E6C9FFF22FE8E8090029E4080008113E76 +:10BEB800113AB16AF5EE118A118EF5EE108A1191D8 +:10BEC800069CF5E11001F2CBFFFC93112FF3F01F54 +:10BED80000575C5368E81033CE23069C4D4BF01F87 +:10BEE80000536CA43008E93A00123089EF58001E5C +:10BEF800F20A1800E9F91E12E9F81E130C9C300A20 +:10BF0800E8CBFFD8F01F004BE93800132FF8E96899 +:10BF180000133018E958001EC7E820383029F20805 +:10BF28001800E08B007930080C9CEF58001EF01FB9 +:10BF38000042C7183069F2081800C3513019EF38A9 +:10BF48000012F20818005F0B3039F20818005F0978 +:10BF5800F7E91009C0813049F2081800C040F40818 +:10BF68001800C5916CA40C9C3003EF53001EF01F01 +:10BF780000330C9C4AEBF01F00320C9C4ACBF01F9C +:10BF880000310C9C4AABF01F0030E939001230C870 +:10BF98000C9CF0091800E9F31E13E9F81E12F01FB3 +:10BFA800002BC398302AF4081800C351EF38001248 +:10BFB800F2081800C30130086CA4EF58001E336B58 +:10BFC800089CF01F0019C270F8C8FFFC19AB119942 +:10BFD80019BA1188B16AF5EB118AF5E81088124888 +:10BFE80089986828F0C9FFF0C0311298C108F13962 +:10BFF8000013F13B0010F13A0011F1380012B16A58 +:10C00800F5EB118AF5E81088F3E8100889A80C9C6C +:10C01800F01F000F0E9CF01F000F0A9CF01F000E6F +:10C02800D83200008000AAF48000C19C8003B409C3 +:10C038008001384C8000BAA88000CABC8000CBC8F8 +:10C048008000CA748000CA928000B5988000B6B497 +:10C058008000AEC48000D13C335B0E9CF01F00030F +:10C06800FE91FE66CD8B00008000AAF4D4314C18F6 +:10C07800301370073002069430813050C7686EA6BE +:10C088005806C720ED05001EE6051900E0880006E1 +:10C098002015ED55001EC688E6051900C651ED3875 +:10C0A8000012306AED52001EF40818005F0A30C909 +:10C0B800F20818005F09F5E91009300AF4091800B8 +:10C0C800C501E8081800C0B1ED380013E0081800F1 +:10C0D800E08B00360E9CF01F0028C468E2081800A8 +:10C0E800C191ED380013E8081800E08B0010300A01 +:10C0F800ECCBFFD80E9CF01F0021ED380013ED5556 +:10C10800001E2FF8ED680013C2F80E9CF01F001CEB +:10C11800C2B8E0081800C0510E9CF01F001AC248AF +:10C128003049F2081800C0F1ED380013E208180091 +:10C13800E08B00060E9CF01F0014C1680E9CF01FD7 +:10C148000013C0F83039F2081800C0E1ED380013C8 +:10C15800E8081800E08B00060E9CF01F000DC04890 +:10C168000E9CF01F000C6E075807C8A1D8320000BB +:10C17800000080CC8000B6B48001384C8000BAA89A +:10C188008000B2E08000B7DC8000B1D88000B4AC99 +:10C198008000B598D4013019F20C1800E08B001D0E +:10C1A800580B5F1A48D9720958095F19F5E900094F +:10C1B800C13017B9178E179A17A8B16AF5EE118A08 +:10C1C800F5E81088F3E81008C0704858304AF00CB9 +:10C1D800002CF01F0004D80200001D5800001D505C +:10C1E8008002E736D42130181897F00B1800E08B3E +:10C1F80000074868304AF00B002BC038304A484BDB +:10C20800F01F00040E9CD82200001D508003B409C2 +:10C218008002E736D4313013189516911492E60C43 +:10C228001800E088000F4BB8201D1AD8E0680246B5 +:10C238001AD84B984B9C1AD8F01F00392FCDC0083C +:10C248004B89F20C0028F20C072B11BA119911A88E +:10C25800B169F3EB1189F3E81088F5E81008C0E13B +:10C268004AC8201D1AD8E06802471AD84AE84ABCCA +:10C278001AD8F01F002B2FCDC008300AE06B011030 +:10C28800149CF01F002A1897C041E06600FFC758A9 +:10C2980078045804C0E049F8201D1AD8E068024D17 +:10C2A8001AD84A3849DC1AD8F01F001D2FCDC0080B +:10C2B800781630CA089B0C9CF01F001EECC9FFF4CE +:10C2C800AC92ACD3E5D2C110ACA3ACC42011AC8203 +:10C2D80032EC2FF1F2C8FFFF300AC05810CBF5D26C +:10C2E800C0082FF1038BF4C2FFFFE80B18005F139F +:10C2F800F80B18005F16E7E60006E8061800CEF10E +:10C30800B28A0389E8091800C1601099CE3B000081 +:10C318008003A1E48003A22880039D9C800094C42C +:10C3280000001D508003A2408000D3188003A2643F +:10C338008002E8BCF0CBFFFB10C9B089B0A9301966 +:10C34800B099B0B96E180E9C101B5C7BF01F000CE6 +:10C3580048C848D6F0050025335A6C0C0A9BF01FD4 +:10C36800000B6C0C0A9A33590E9BF01F0009EDDC88 +:10C37800C0080E9CF01F00070C9CD8328000D21019 +:10C3880000001D5000001D5880011320800114F08A +:10C398008000D13CD421189A303CF80A1800E08873 +:10C3A800000F4BE8201D1AD8E068028A1AD84BC83B +:10C3B8004BCC1AD8F01F003C2FCDC0084BB8E06713 +:10C3C8000118F4070247F007000730180F8B169979 +:10C3D800F00B1800C0A0C603302BF6091800C0F0F7 +:10C3E800F8091800C4C1C4383008AEABAEB8AE986E +:10C3F800EECBFFF43028300CAE88C3680FA92019A3 +:10C408005C59AEA9C4910FBB2FFB5C5BAEBB0F9C04 +:10C41800304EFC0B1800C251F20C1800C1214A4AD8 +:10C4280015FB15CE15DC15EAB16CF9EE118CF9EA9D +:10C43800108AF7EA100AC050AEB9AEA8AE98D82252 +:10C44800EEF801105808C070EEFA0114300BEECC6B +:10C45800FFF45D183008AE883008EF480110D82284 +:10C46800AEABEECBFFF4F01F0013D8226E282018D5 +:10C478008F28C121EF480110AE88D8224878201DA6 +:10C488001AD8E06802C61AD848B8486C1AD8F01FFB +:10C4980000062FCDC008D8228003A1E48003A28023 +:10C4A80080039D9C800094C4000018F000001D507B +:10C4B8008000C21C8003A29CD431580B5F081292E2 +:10C4C80016974BB914967209189558095F04F1E448 +:10C4D8001004E08100B6580CE08000B31989E8091F +:10C4E8001800E08000AEF01F0033E04C00FFE08B46 +:10C4F80000A84B1B0A9CF01F0031C08137F8AEA47E +:10C50800AE88AE9C3018AEB8D8320A9CF01F002C0A +:10C51800F8081618AE88F1DCC208AEBCAE98F1DC9B +:10C52800C108AEA85BFCE081008F4A63300430305C +:10C5380006910788E0081800C171E80400280A9CE1 +:10C54800F00B1503101B2FFBE20B003B2FCBF01F4A +:10C55800001BC0A1E0680118B13449A8F004000428 +:10C56800E8F8010CC0782FF4E6C3FEE85844CE2161 +:10C578003FF8F0091618AE89F3D8C208AEB8AE99DC +:10C58800F3D8C108AEA95BF8C5E1300748E848DB35 +:10C59800118A0E9C0E9930313043F2C0FFFF178488 +:10C5A80016985804C1211297C358000000001D585E +:10C5B8008002EDD08003A2BC8002ECC880011E106E +:10C5C800000018F0000018ECE2041800C0C117C8F9 +:10C5D800F4080104F40801081838E08A0005F9D4C1 +:10C5E800C0081297F3D0C008F6CBFEE8E609180099 +:10C5F800CD513039F2071800E08B0027494BE0682D +:10C608000118EE080248F6080008118BF20B180012 +:10C61800C1B1F4C9FFFFB0CAF1460110301AF142A6 +:10C628000114B08AF0CCFFF448A80A9BB089F01F27 +:10C63800000A0E9CF01F0009E06C00F2D832E06C92 +:10C6480000F7D832D83AE06C00FFD832000018F072 +:10C65800000018EC8002ED708000C39CD40148985B +:10C6680070085808C0D0300CF01F0007301CF01FAD +:10C678000006302CF01F0004303CF01F0003D802E5 +:10C6880000001D588000C39CD421494C4946F01F26 +:10C6980000156C0518975805C1E1F01F00138D0CA3 +:10C6A800C1A0492B0A9AF01F00120A9A491B6C0C68 +:10C6B800F01F00116C085808C0E05807C0C0EE0908 +:10C6C800161848E8B0B7B089F3D7C208EFD7C10841 +:10C6D800B099B0A7D82200008003A2C800001D5856 +:10C6E80080011E10800112008003B40980011260CD +:10C6F8008000C704800111F800001D50D431E068A3 +:10C7080002001496944AF00A1900E08B00E331986D +:10C71800F00A1900E08800DE4DF75C7A30090E9BBC +:10C728000C9CF01F005E8C48F8081900E08100D2CC +:10C738000F993038F0091800E08B00CCE06501183B +:10C74800AB394D75120530290B8AF20A1800E081C1 +:10C7580000C1AA880FBAF5DAC004AADA0FD80FCB3D +:10C76800F1EB108B0FF80FEC5C8BF1EC108C3009AF +:10C778005C8C0FA8F2081800E084009DF20A1800EB +:10C788005F18301AF40B18005F1AF5E81008F20861 +:10C798001800E0810090EAC4FFF42F4708980F8939 +:10C7A800129AE21A00C0E04A00C0C1502FF7C098A0 +:10C7B800F3DBC0082FF7118BF40B1800C7B12FF863 +:10C7C800F2CB00010F8A5809CF41F20A1800C03095 +:10C7D8002FF8CE6B4B0B30082F4B1739129AE21AF1 +:10C7E80000C0E04A00C0C060120B1789F0091800A9 +:10C7F800CF51F1DCC0082FBB300E301A3047C58846 +:10C808001739129CE21C00C0E04C00C0C060120B3B +:10C818001789FC091800CF512FFB17CC17D9B1691C +:10C82800F3EC118917ECF7330008F3EC108917A221 +:10C8380017FC1781F9E91009F73C0009F9E3108C96 +:10C8480017B35C8CE7E2108317925C83E5E11082F2 +:10C85800F4021900C281F4031900C251EE0C190048 +:10C86800C2218B29E8593A80E0880005E8783A80A7 +:10C878008B28EAC7FEF42F6B304A0E9CF01F000984 +:10C88800EAF801105808C250EAFA01140E9B089CF5 +:10C898005D18C1F800001D5C8000CEC4000018F0CF +:10C8A8008002E7365C7C20182F6C5C58180B5808FF +:10C8B800CA81EAF801105808C070EAFA0114300B6E +:10C8C800EACCFFF45D183008AA883008EB4801105C +:10C8D8000C9CF01F0002D8328000D13CD401F01F1C +:10C8E8000003F01F0003D8028000C8F88000C6903B +:10C8F800D42149A949ABF2CCFEC4F2C8FF54300A8E +:10C90800F2C9FF50910A930AB22A172EF14EFFFC82 +:10C918002F092F081838CF71492949382FD9149C65 +:10C92800E019FFFCF0C6FFDC48D7490E910CEE0A6F +:10C938000405189BC098700493042FFB9109FC0A06 +:10C9480005045C8B0809EA0B1900CF632FC82FEA8E +:10C958000C38CED1D8220000000080D48003A2D8A1 +:10C9680000001F5C000072E88003A394D401580BF8 +:10C97800C200F1DBC002C0E048F8201D1AD8E06808 +:10C98800016B1AD848D848EC1AD8F01F000E2FCDE2 +:10C99800C00848D8F00C03299709F00C092B48B8AF +:10C9A800A56CF00C000CF8CCFF54780820189908F6 +:10C9B800D80200008003A2EC8003A33080039D9C72 +:10C9C800800094C4000072E8000080D4D421189834 +:10C9D800588CE088000F49F8201D1AD8E068013DFE +:10C9E8001AD849D849DC1AD8F01F001D2FCDC00825 +:10C9F80049CE49D9FC0C032CF0CAFFF5580CC230BB +:10CA0800A56AF00B15047807F20B000BFC08092740 +:10CA1800F6CBFF5414097608720A2FF8103AF3F887 +:10CA28003A009708F1DCC002C13048A8201D1AD886 +:10CA3800E068014F1AD848D8488C1AD8F01F000867 +:10CA48002FCDC008A56A140992282FF8B228D82239 +:10CA58008003A2EC8003A35080039D9C800094C4B3 +:10CA6800000072E8000080D48003A370580BC0C097 +:10CA780017B8178A179917ABB169F3EA1189F3EB5D +:10CA8800108BF1EB100B993B5EFC580BC0C017B82C +:10CA9800178A179917ABB169F3EA1189F3EB108B71 +:10CAA800F1EB100B992B5EFC4828910C5EFC000002 +:10CAB800000080D0D4211897F9380035EDB800006F +:10CAC800C0D1A1C8F968003578885808C0205D1819 +:10CAD8006E785808C0300E9C5D18D822F93C003595 +:10CAE800F9DCC0015EFC580CF9FB1A075EFCD703A1 +:10CAF800D421300A18971696302C96CBF01F001ABE +:10CB08001895C041E06600FFC2B80C9BF01F0017E3 +:10CB1800EDDCC008C0500A9CF01F0015C2180A9826 +:10CB280070095809C0301298CFCB6EF95809C15016 +:10CB38006F095809C0E148F8201D1AD8E068025367 +:10CB48001AD848D848DC1AD8F01F000D2FCDC008D5 +:10CB58009305EF480040C048EF4800408FF50C9C13 +:10CB6800D82200008000D3188000CF988000D13CE4 +:10CB78008003A3A88003A44480039D9C800094C4E0 +:10CB8800D4211897F9380035EDB80000C170A1A874 +:10CB9800F968003578885808C0205D186E785808FC +:10CBA800C0300E9C5D18EF380035EDB80005C06147 +:10CBB8000E9CEECBFFFCF01F0002D8228001370C40 +:10CBC800D42117881799B169F3E8118917A8F3E8F0 +:10CBD800108917B81697F1E91009189678181039BE +:10CBE800C27049A8700CC0A8780978356C1810393B +:10CBF800C041301BF01F00160A9C580CCF614958E1 +:10CC08007008C14870095809C1006C1A1439C0D19C +:10CC18000F8A0F99B169F3EA11890FAAF3EA10890B +:10CC28000FBAF5E91009910970385808CEC10F8A72 +:10CC38000FB90F98B168F1EA11880FAAF1EA1088C4 +:10CC4800F3E810088D18D8220000820C8000E12437 +:10CC580000008214D421149712961895F01F001022 +:10CC68005807C0C00FB80F8A0F990FA7B169F3EA28 +:10CC78001189F3E71087F1E710078B275806C0C022 +:10CC88000DB80D8A0D990DA6B169F3EA1189F3E67D +:10CC98001086F1E610068B36D82200008000CBC83B +:10CCA800D4213006999899169926993699A6997695 +:10CCB800998699F6F94600404908FAC4FFEC681EBF +:10CCC8006804F96600351185F96500382FF5B085D7 +:10CCD8001897994EF01F000A0E9C5D145C5C4898EA +:10CCE800580CEC071710F1F90000EFF90A00F1F7FA +:10CCF8000A000E9CD82200000000730C8000CC5C57 +:10CD0800000080CC1898300CC0482FFC70085C5C80 +:10CD18005808CFC15EFC580CF9F81207F9B901019F +:10CD2800F1D9E108F9F81C075EFCD703D401580CC7 +:10CD38005F08580B5F09F3E81008C1304978201DD7 +:10CD48001AD8E068028F1AD84958496C1AD8F01FC7 +:10CD580000162FCDC008964AF4080008B848129C5F +:10CD6800984878095809CF819859F0091900C0E006 +:10CD780048A8201D1AD8E06802971AD848B8489CD5 +:10CD88001AD8F01F00092FCDC0089649990BF20850 +:10CD98000008B848D80200008003A4708003A4B437 +:10CDA80080039D9C800094C48003A4ECD421169732 +:10CDB800F01F00065807EFF81207F9B90101F1D979 +:10CDC800E108EFF81C07D8228000CD34D421580C94 +:10CDD800C0E14B58201D1AD8E06801B01AD84B386A +:10CDE8004B3C1AD8F01F00332FCDC008580BC03168 +:10CDF800169CD8223008F00B1900C154F60911000E +:10CE080098585C89F2081900C0F24A78201D1AD88F +:10CE1800E06801B71AD84A884A5C1AD8F01F00257A +:10CE28002FCDC0081699F93E000C300A3037F40EA1 +:10CE380019005F08EE0E19005F061497104678185F +:10CE4800F4061800C0A0F00B01099919F8CAFFF000 +:10CE58001439C2029918DA2A201E3017EE0E19006A +:10CE6800E08B000CF40B1900C1D4985AF20A19008F +:10CE7800C19316189918C0E848B8201D1AD8E06858 +:10CE880001E61AD848D848AC1AD8F01F000A2FCDA6 +:10CE9800C00898581608B8589848F00B000BB84BBB +:10CEA800D82ADA2A8003A47080039EA480039D9C5C +:10CEB800800094C48003A51C8003A53CD43116913E +:10CEC8001497580CC0E14AD8201D1AD8E068033ED0 +:10CED8001AD84AB84ABC1AD8F01F002B2FCDC00860 +:10CEE800580BC070300518960A920A930A90C388A6 +:10CEF8004A28201D1AD8E068033F1AD84A384A1C25 +:10CF08001AD8F01F00212FCDC0085809C0A08C588E +:10CF1800F208010AF0091900C043F3DAB010C1F8A9 +:10CF2800F1D9C0108C54E8090109EE091900EE097D +:10CF380017B06C1BE9D9B010F9D5C010100BE20C72 +:10CF4800000C089A5C7AF01F0012E8030003081727 +:10CF5800E80500055C835C855C8730096C0658062B +:10CF68005F1AE40719005F18F5E80008E0081800E0 +:10CF7800CCD1069CD83200008003A4708003A5B0F1 +:10CF880080039D9C800094C48003A5D08002E7366E +:10CF9800D431580C5F08580B5F0918961697F3E8B8 +:10CFA8001008C06198499648F0091900C0E24C7809 +:10CFB800201D1AD8E06802FE1AD84C584C5C1AD8C2 +:10CFC800F01F00452FCDC00830050A945806C0E16F +:10CFD8004BE8201D1AD8E06803031AD84BF84BDC3D +:10CFE8001AD8F01F003D2FCDC0088C5808995C79DD +:10CFF8008E53F5D8C010F7D3C010121AF3D5C0104D +:10D00800F6090109123AE7D5E413E8091750F1D9EE +:10D01800E51308985C786C1C100CF1D5C0105C8383 +:10D028006E1BF5D3C010100BF01F002DE604000492 +:10D038008C585C84F0041900E088000F4A38201DE1 +:10D048001AD8E068030F1AD84A684A2C1AD8F01F71 +:10D0580000222FCDC008F0041900EDF60000F9B445 +:10D068000000E60500058E585C85F0051900E0888B +:10D07800000F4968201D1AD8E06803151AD849A876 +:10D08800494C1AD8F01F00142FCDC008F00519001C +:10D09800EFF72000F9B502005807C2908E598E4864 +:10D0A800F0091900C2416E085808C2104878201DBE +:10D0B8001AD8E068031F1AD848C8486C1AD8F01F55 +:10D0C80000062FCDC00800008003A4708003A5F4DB +:10D0D80080039D9C800094C48003A6248002E736C8 +:10D0E8008003A6348003A64C8003A6685806C16056 +:10D0F8008C598C48F0091900C1116C085808C0E017 +:10D108004898201D1AD8E06803241AD84878488C13 +:10D118001AD8F01F00082FCDC0085807FE91FF58F5 +:10D128000E9CD8328003A4708003A66880039D9C5F +:10D13800800094C4D421189B580CC0E14AB8201D23 +:10D148001AD8E068021C1AD84A984AAC1AD8F01FB4 +:10D15800002A2FCDC008F939000C3038F009180022 +:10D16800E088000F4A18201D1AD8E06802281AD84B +:10D178004A284A0C1AD8F01F00202FCDC0083007C3 +:10D18800303530169679F2C800015C885809C0E13C +:10D198004968201D1AD8E06802351AD84988495CC0 +:10D1A8001AD8F01F00152FCDC008B6785808C1B19D +:10D1B800F738000C169CF0C900017604EA0819003B +:10D1C800C031308CC068EC091900E08B0006307C57 +:10D1D800F01F000CC038F01F000C2FF7089B5C579D +:10D1E8005804CD110E9CD8228003A47080039EA4FD +:10D1F80080039D9C800094C48003A6948003A6AC01 +:10D208008000C9748002E28CD421580CC0E14B988C +:10D21800201D1AD8E068015F1AD84B784B7C1AD8C1 +:10D22800F01F00372FCDC0083019F938000CF2086C +:10D2380018005F1A3039F20818005F19F5E900097B +:10D24800C1405808C1203029F2081800C0E04A98A7 +:10D25800201D1AD8E06801631AD84AA84A7C1AD84F +:10D26800F01F00272FCDC0089848F00B1900C3F213 +:10D27800F3D8C0101897F1DBB0105C7B121BC27892 +:10D28800E04BFFFEE08A000F49A8201D1AD8E0688D +:10D2980001771AD849C8499C1AD8F01F00192FCD10 +:10D2A800C0088E481608AE486E075807C0E14918EE +:10D2B800201D1AD8E068017B1AD8494848FC1AD8BA +:10D2C800F01F000F2FCDC008F1DAB0108E59F00909 +:10D2D800010AF2081900FE9BFFD5AE48AE586E0C45 +:10D2E800580CC030F01F000A30088F08D822000000 +:10D2F8008003A4708003A70080039D9C800094C4D1 +:10D308008003A7188003A7348003A7488000D13C76 +:10D31800D431202D16971495581CC0B0C083582CB2 +:10D32800C040583CC0B1C1783004C0583144C0280E +:10D3380030042EC42E445C84C0F84C08201D1AD832 +:10D34800E06800D11AD84BE84BEC1AD8F01F003E21 +:10D358002FCDC00830045825E08B00065815E08210 +:10D3680000DDCBF85835E08100E6308CF01F00373F +:10D378001896E08000F25C740E99E8C8FFFD5C79AD +:10D38800E018FFFCB847E06A02443000F4080108DE +:10D39800F8040004F0090D472ED4E014FFFCAC5744 +:10D3A8009914F965000C99005C77F8C3FDAC0E047C +:10D3B8000833C0E24A18201D1AD8E06800EB1AD8D2 +:10D3C8004A384A0C1AD8F01F00202FCDC008580838 +:10D3D800E089000F4998201D1AD8E06800ED1AD896 +:10D3E80049C8498C1AD8F01F00182FCDC008F20779 +:10D3F800010700980A9918943015E0610243B8753E +:10D40800E0620244C6A850195008308CF01F000F83 +:10D418000E9B189A5C8BF4CEFFF0F6011900F60CFF +:10D428001720E40C173040194008580AC1610C9CB9 +:10D438001496F01F0009C9088003A4708003A76030 +:10D4480080039D9C800094C48000C9D48003A77C7D +:10D458008003A7B08000D13C9508890AF569000CC3 +:10D46800F560000DE047FFFFC0E14BD8201D1AD83A +:10D47800E06801071AD84BB84BBC1AD8F01F003B1C +:10D488002FCDC008951EB45CB44BFDDEC002C0E0D1 +:10D498004B38201D1AD8E068010D1AD84B484B2C80 +:10D4A8001AD8F01F00322FCDC0085C7C8CDB18170F +:10D4B80014946C1CF80B000B1633C0E24A88201D2C +:10D4C8001AD8E06801101AD84AA84A7C1AD8F01F5E +:10D4D80000272FCDC008B4755807FE99FF96C3786A +:10D4E8000E985C782FD8E018FFFC5C74E8CCFFED50 +:10D4F800E01CFFFC100CF01F00201896C2D030086A +:10D50800F8040004AC572ED4B847E014FFFCF968BF +:10D51800000C99149908C1B8307CF01F00181896AF +:10D52800C1B03008AC57F965000CB847990899188C +:10D53800C0E848B8201D1AD8E068013D1AD8490843 +:10D54800489C1AD8F01F00092FCDC0083018AC78B5 +:10D558003008ED68000D0C9C2FEDD8328003A470C4 +:10D568008003A7E480039D9C800094C48003A7F8EF +:10D578008003A77C8002E2A48000C9D48003A82885 +:10D58800D43149B8781918951094300CF2C2FFF4C8 +:10D59800F3310009700718961893C1E8EF380010A6 +:10D5A8000238C1716E585808C1400A9A0E9B6E6CB9 +:10D5B80004995D18C0E05806C0410C95301CC0A8FD +:10D5C8006E388D3868088F388907301C3005C028B8 +:10D5D800300C0E966E37E60C18005F0858075F1976 +:10D5E800F3E80008E6081800CDA1D832000073104F +:10D5F800E06C00FB5EFCD421E067040078A8F90B1E +:10D60800002C78C9F5DBC010F90E003C100AEE0EAC +:10D618001900E0880005E06E0400C0285C7EF4096B +:10D628000107EE0E010EC076F95B002E78CCF40CE3 +:10D63800010CD822F009010A580AE08A00063008CD +:10D64800F958002ED82AF2080108F958002ED82ACD +:10D65800996B5EFCF94B008C5EFCF94B00885EFC14 +:10D66800F94B00985EFC998B5EFCF96A0039F94B1E +:10D6780000945EFC5EFC5EFC48A87008C028703808 +:10D688005808CFE148887008C02870385808CFE19A +:10D6980048687008C02870385808CFE15EFC000060 +:10D6A8000000820C0000821400008220D4014A6825 +:10D6B8007008C30870495809C0E14A48201D1AD8A3 +:10D6C800E06805AC1AD84A284A2C1AD8F01F00225C +:10D6D8002FCDC0085819C0E149C8201D1AD8E068E4 +:10D6E80005AD1AD849D849BC1AD8F01F001B2FCD50 +:10D6F800C00858A9C0E14958201D1AD8E06805AEED +:10D708001AD84978493C1AD8F01F00132FCDC00801 +:10D7180070385808CD0149387008C128704958A98F +:10D72800C0E048A8201D1AD8E06805B11AD848E812 +:10D73800488C1AD8F01F00082FCDC0087038580838 +:10D74800CEE1DA0A0000820C8003A8688003A8AC46 +:10D7580080039D9C800094C48003A8D88003A904FA +:10D76800000082208003A934D43118961497784891 +:10D778005808C0E04C48201D1AD8E068011A1AD889 +:10D788004C284C3C1AD8F01F00432FCDC008580A2B +:10D79800C3514C19720C4C19720A4C19109E9207FD +:10D7A8004C08E069100070052FF70A985C87EE0EA8 +:10D7B8001900F2071790C088F104001C0E93EE04BC +:10D7C8001900CF3070385808CF811898C088F104F4 +:10D7D800001C0E93EE041900CE8070385808CF81D3 +:10D7E8001498C088F104001C0E93EE041900CDD0E3 +:10D7F80070385808CF814AA8B0074A887008C1F81D +:10D80800F109001C0E93EE091900C181700A580A2B +:10D81800E0800099580BE0800096178C1799B16941 +:10D82800F3EC118917ACF3EC108917BCF9E910096E +:10D83800E0800089123AE080008670385808CE11DE +:10D8480049887008C1A8F109001CEE091900C141F6 +:10D85800700A580AC770580BC750178C1799B169C6 +:10D86800F3EC118917ACF3EC108917BCF9E910092E +:10D87800C690123AC67070385808CE6148A870052C +:10D888000A98C2D88003A8688003A96080039D9C79 +:10D89800800094C40000822000008214000001F877 +:10D8A8000000820C0000821CF109001C0E93EE0996 +:10D8B8001900C141700A580AC450580BC430178C5B +:10D8C8001799B169F3EC118917ACF3EC108917BCFF +:10D8D800F9E91009C370123AC35070385808CE518C +:10D8E80049A87008C158F109001CEE091900C0F1D7 +:10D8F800178A1799B169F3EA118917AAF3EA108907 +:10D9080017BAF5E91009700A123AC1C070385808F8 +:10D91800CEB1580BC11017891798B168F1E9118871 +:10D9280017A9F1E9108817B9F3E81008C050304A70 +:10D938000C9CF01F00078D354868ED57001C9106B8 +:10D94800D83AE06C00F5D832000082208002E73631 +:10D958000000821CD4211897169CF01F0008C0B044 +:10D96800F908002C5808C0702288EE081900F00742 +:10D9780017305C870E9CD82280012228D421F90810 +:10D98800002C1897F3D8C010E06CFFFFF5DBC0102F +:10D99800F8090109123AE08A000F4948201D1AD8EF +:10D9A800E06801BD1AD84928492C1AD8F01F00127E +:10D9B8002FCDC008100BE0680800EF5B002CF00BBF +:10D9C8001900EFF8BC160E9CF01F000CE04C01FF8C +:10D9D800E08A000AEF380026A1B80E9CEF680026FE +:10D9E800F01F0007D82200008003A8688003A988D8 +:10D9F80080039D9C800094C48000D5FE80010CECBF +:10DA0800D4211896304CF01F000A1897C0E0ECE8B3 +:10DA18000000F8E90000ECE80008F8E900086C48A4 +:10DA28009948781CF01F00030E9CD8228000C9D4A6 +:10DA38008000CD1ED4211896580CC0311897C0B854 +:10DA4800781C580CC030F01F000518970C9B304C00 +:10DA5800F01F00030E9CD8228000D13C8000C974BE +:10DA6800D42130071896C0880C9C6C06F01F00055E +:10DA7800F80700075C575806CF810E9CD822000093 +:10DA88008000DA3CD4217848189758A85F1A5808BB +:10DA98005F19F5E90009C2005818C1E0F8FC0084D4 +:10DAA800580CC060F01F000D3008EF4800843FF8A4 +:10DAB800EEFC0080EF58003AF01F000930066FECCA +:10DAC800EF460080F01F00066FFCF01F0005EF46D0 +:10DAD800007CEF460078D8228000D13C8000DA68CC +:10DAE800D421169778081638C04176389908C11895 +:10DAF8004B899308C0A870390E39C0614B599308F7 +:10DB08006E399139C06812985808CF614B1993083B +:10DB180030060E9C8F36F01F00306E4858A85F19EB +:10DB280058185F181268EC081800C0C0EF380026B3 +:10DB3800EDB80000C071A1B80E9CEF680026F01F78 +:10DB480000276E485818C3206FE85808C0E04A48B4 +:10DB5800201D1AD8E06804F91AD84A284A2C1AD87D +:10DB6800F01F00222FCDC0086FF85808C0E049C840 +:10DB7800201D1AD8E06804FA1AD849D849AC1AD82E +:10DB8800F01F001A2FCDC008EEF800805808C0E03A +:10DB98004938201D1AD8E06804FC1AD84958492C7D +:10DBA8001AD8F01F00122FCDC00830088F48F01F78 +:10DBB8000012C0E148A8201D1AD8E06805021AD84A +:10DBC80048E8489C1AD8F01F00092FCDC008D82271 +:10DBD800000082188000DA8C80010CEC8003A868B1 +:10DBE8008003A9AC80039D9C800094C48003A9C4D1 +:10DBF8008003A9E08000D6B48003A9F8D42118973F +:10DC080078485808C0E04A68201D1AD8E0680175AD +:10DC18001AD84A484A4C1AD8F01F00242FCDC008F9 +:10DC2800303CF01F00231896C380EF08001CF958F9 +:10DC3800001C6E6899688E48A1B8B8483018994891 +:10DC4800EF38000BF968000BEF38000AF968000A92 +:10DC58006E089908497972080E38C0316E38C108C3 +:10DC680049599308C0A870390E39C06149299308E9 +:10DC78006E399139C06812985808CF6148E99308FD +:10DC880030080E9B8F38302CF01F000C48C948D83C +:10DC98008D8970098D3991060C9CD8228003A8685B +:10DCA8008003AA1880039D9C800094C48000C9D476 +:10DCB8000000821C000082188000C9748000D5F81A +:10DCC80000008214D431204D4B583005700910964D +:10DCD8002FF90A9491090A934B2830627007E08F54 +:10DCE800019E6E485808C0E14AF8201D1AD8E0681D +:10DCF80002571AD84AD84AEC1AD8F01F002E2FCD4E +:10DD0800C0085818C0E14A88201D1AD8E06802588F +:10DD18001AD84A984A6C1AD8F01F00262FCDC00886 +:10DD280058A8C0E14A08201D1AD8E06802591AD834 +:10DD38004A2849FC1AD8F01F001F2FCDC0085828C0 +:10DD4800C071EF38004EE4081800E0800081EF3819 +:10DD5800004E30CAF4081800C7A0EF3800AC10997C +:10DD6800E8081800C300EEF900A82FF9EF4900A849 +:10DD7800493A100AF53AFFFF1439C6B33009EF499A +:10DD880000A8E4081800F9B90801F1D9E808EFF883 +:10DD98008EAC0E9CF01F000BC5C80000000082105E +:10DDA8000000820C8003A8688003AA3C80039D9C25 +:10DDB800800094C48003AA688003AA948003AC38C6 +:10DDC80080010A20EF08003AE6081900F9B90401B1 +:10DDD800F1D9E408EFF84C1D6FF85808C3A0EF0913 +:10DDE800003AEF08004CF0091900C3356E4858286E +:10DDF800C100EF09004AEF0800484CD1A3581208A7 +:10DE0800EF39004EE2090709F0090948EF58004CBC +:10DE1800EF080060EF090056F0091900F00917B083 +:10DE2800EF08003CF3D9C02FEF590058F00A15014C +:10DE3800F0091900EFFA3C2CEF08003CEF53003AC8 +:10DE4800EF5800560E9CF01F003BC0383018C02811 +:10DE580030086E495869C0B16C0B6EDAF60A010ACF +:10DE6800E04A0028E08800042FF85C588ECAEDBA12 +:10DE78000003C39158495F0A58795F091449E809B2 +:10DE88001800C3106C0AEEFC00A0EEF100A4F80123 +:10DE980002416ED9EEFB009CF4090109E20B000E69 +:10DEA800E06A01F4FC0A0D00FAE100080039E08894 +:10DEB80000062FF830115C58C178EF3100ADE20C44 +:10DEC800034BF60A0D0A1439E088000E50180E9C10 +:10DED800F01F0019EF3900AD30012FF9EF6900ADDF +:10DEE8004018C0283001EEFC0080580CC1106ED9D3 +:10DEF8006C0A121AEF09004CF2091006123AC08394 +:10DF08005018F01F000E30004018EF4000806E4996 +:10DF18005839C1516C0A6ED9F4090109E049002841 +:10DF2800E08800182FF85C58C14800008003A85802 +:10DF3800800110608001109C8000DA685899C091B7 +:10DF48006C0A6ED9F4090109E04900F0E08B00047D +:10DF58005808C4900E9CF01F00434C385805C14027 +:10DF680070081037C0E14C18201D1AD8E06802E488 +:10DF78001AD84BF84BFC1AD8F01F003F2FCDC00819 +:10DF88006E388B38C13870090E39C0E04B78201DC7 +:10DF98001AD8E06802E81AD84B884B6C1AD8F01FD8 +:10DFA80000362FCDC0086E399109EEF80098580850 +:10DFB800C0403FBB6E6C5D185801C0F0EF180024DC +:10DFC800201DEEC9FFFC1AD80E9AEF18001C6EAB84 +:10DFD8006F7CF01F002B2FED0E9B302C6E37F01F3F +:10DFE8000029C1C8EF3900382FF9EF690038EF3A36 +:10DFF8000039F20A1800E08B0010EF680038EEF8DC +:10E0080000945808C0600E9B6E6C5D185C5CC04143 +:10E018000E9CF01F001D0E956E375807FE91FE638B +:10E0280049A849B410957006C6086C4858A8C0E0BD +:10E0380048E8201D1AD8E068030C1AD8495848DC6B +:10E048001AD8F01F000D2FCDC00868096CD8F20847 +:10E058000108E04800F0E08B004C0C976C36C4587F +:10E068008000DA8C0000820C8003A8688003AAC4B0 +:10E0780080039D9C800094C48003AAF08001023430 +:10E088008000C97480010CEC00008220000082101E +:10E098008003AB1C6A081036C0E149A8201D1AD8B5 +:10E0A800E068031B1AD84988498C1AD8F01F001851 +:10E0B8002FCDC0086C388F38C1386A080C38C0E0DA +:10E0C8004908201D1AD8E068031F1AD8491848FCC7 +:10E0D8001AD8F01F000F2FCDC0086C388B080C9B86 +:10E0E800302C6C36F01F000C5806CA01C0780C9C06 +:10E0F800F01F000A5807CCF1CE1B2FCDD8320000F4 +:10E108008003A8688003AB4C80039D9C800094C466 +:10E118008003AB748000C9748000DA8CD431202D60 +:10E1280018951691784858A8C0A1189B4A2CF01F3A +:10E1380000230A9B302CF01F0022C3B8780850082F +:10E148007818F903001C5018F9020024797778A68A +:10E15800F8F400987860189B49ACF01F00186BFC25 +:10E16800580CC030F01F00186BEC580CC030F01F72 +:10E178000016EAFC0080580CC030F01F00130A9B00 +:10E18800302CF01F000F5804C040009C3FBB5D14AA +:10E198005801C0F0201D5C72F1D3C0101AD20C9B3C +:10E1A800FAC9FFF4FACAFFF80E9CF01F00082FED19 +:10E1B8002FEDD832000082208000DAE88000C97490 +:10E1C8000000820C8000DA6880010234D42118969D +:10E1D800302CF01F00511897C5114D084D0A189999 +:10E1E8007008740BC0A870DAF60A010A123AF4092A +:10E1F8001720F00C172070385808CF61580CC04011 +:10E20800301BF01F0048302CF01F00431897C30143 +:10E218004C584C3A18997008740E37FBC178F13A8B +:10E228000014EC0A1800E08B000DF60A1800E08BC9 +:10E23800000970D7FC0701071237C033109CC0389B +:10E24800169A12977038149B0E995808CE91580C4C +:10E25800C040301BF01F0033302CF01F002F1897E0 +:10E26800C5704B28F10900D42019F15900D44AF897 +:10E27800F10900D42019F15900D4E06A00B0300B3C +:10E288000E9CF01F002B3408EF6800143FF8EF686D +:10E29800000B4A384A7A70097408F2080008950891 +:10E2A800EF48006CEF480068EF48005CEF4800500A +:10E2B8003008EF6800ADEF680038E0680800EF58F4 +:10E2C800002EEF58002C3068EF58004AEF58004CE9 +:10E2D800E0681000EF580072E0680200EF58003C58 +:10E2E8003FF8EF58003A3018EF5800564928EF48E1 +:10E2F800008CE068DD00EA18006DEF48009CE078CB +:10E3080024F88FD9EF4800A03098EF4800A40E9C5D +:10E31800D82200008000C9D40000822000008210AA +:10E328008000E1240000820C000080D48002E8BC58 +:10E33800000001F48000E5ECD401340CF01F000269 +:10E34800D80200008000E1D4D431189714961293B3 +:10E35800169578445804C0E04C98201D1AD8E068F7 +:10E36800020A1AD84C784C8C1AD8F01F00482FCDC6 +:10E37800C008580BC041E06600F7CB78304A140C4F +:10E38800F01F0043EF560024EF08001CE8081900AE +:10E39800C34110944BF84C0970064C08720B700C72 +:10E3A8004BF9E06A100092082FF80C995C88F00489 +:10E3B8001900F4081790C078F30E001CF00E19002D +:10E3C800CF4072395809CF911899C078F30E001CC4 +:10E3D800F00E1900CEA072395809CF911699C0785D +:10E3E800F30E001CF00E1900CE0072395809CF91B7 +:10E3F8004AB9B208EF58001C4AA84AB9700A72080C +:10E40800F40800089308EF48005CF0C90001E068D0 +:10E418000800EF580060EF58002CEF58002E300825 +:10E428008FC88FA8E0680200EF49006CEF490050E0 +:10E43800EF58003C0A9BE06C0200F01F001C5C8C4B +:10E44800F808100AEF5800583018EF430090EF58BA +:10E458000056EF5C003C30288F48495972080E3846 +:10E46800C0316E38C2C849399308C26870390E394C +:10E47800C221490993086E399139C2288003A868D6 +:10E488008003AB9C80039D9C800094C48002E73687 +:10E498000000820C0000821400008220000001F8B5 +:10E4A80000008210000001F48000D95C0000821C8A +:10E4B8000000821812985808CDA148D9930848D866 +:10E4C80070098F3991073019201D30081AD9109A10 +:10E4D8003029109B0E9CF01F00082FEDEDDCC008C2 +:10E4E800C0410E9CF01F00050C9CD8320000821819 +:10E4F8000000820C8001035080010CECD421189795 +:10E5080078465826C390E08B00075806C0C05816B6 +:10E51800C071C2785846C370C3635876C3C030060A +:10E528000C97C4184A8972081838C0317838C1085D +:10E538004A699308C0A870390E39C0614A399308EE +:10E548006E399139C06812985808CF6149F9930813 +:10E5580030080E9B8F38302C1097F01F001DC0A874 +:10E56800189B49CCF01F001C0E9B303CF01F001874 +:10E5780030070E96C188189B498CF01F00170E9B18 +:10E588000C9CCF5B301BF01F0016EDDCC008C0B13F +:10E598003058C088301BF01F0012EDDCC008C031B5 +:10E5A80030988F4858075F193008F00618005F0A3E +:10E5B800F5E90009F0091800C0400E9CF01F000999 +:10E5C8000C9CD8220000821C000082188000C974AC +:10E5D800000082148000DAE80000820C80010A0042 +:10E5E80080010CECD421169C1497580AC08094CB57 +:10E5F800F01F00070E9CF01F0007D82A5809C030EA +:10E60800149CD822F01F00045C5CD8228000D984B6 +:10E618008000D13C8000E504D42149887007C2A855 +:10E62800EEFB0084580BC140169AEEF8008C58088F +:10E63800C06030090E9B6E6C5D18C078169A1099F0 +:10E648000E9B109CF01F000E5C5CEFFC0A21EF385B +:10E658000026EDB80000C0D1A1B80E9CEF680026D6 +:10E66800F01F0008EF380026E018FFFCEF680026CE +:10E678006E375807CD61D8220000820C8000E5EC87 +:10E6880080010CECD401F01F0007487913882FF89B +:10E698005C58B288EDB80000C031F01F0004D80201 +:10E6A8008000E620000073148000DCCCD4314A6876 +:10E6B80070063058ED3E000C2EC6A58EF00E1900DF +:10E6C800E0880040205E3008A36E30175C8E302151 +:10E6D8003042E7DEC010E06401FFE0650200C2E8F6 +:10E6E800F5D8C010EC0A070BEE0B1800C080C293D7 +:10E6F800EC0A0009E20B1800C1B1C0382FF8C1D8E4 +:10E70800139BE40B1800C1D12FDA063AC1A413BA3F +:10E718002FC813A95C88F5E910895C89F2CA000141 +:10E72800E80A1900EA0917B0F959003CC0781399AA +:10E738005809C070F20800085C88FC081900CD135D +:10E74800D832000000007318D4217848189616971C +:10E75800F138000DEDB80000C1C1169C3007F01F5C +:10E768000020C368F138000DEDB80000C0E16C4826 +:10E77800F13A000CF139000DF3EA1089A1A9F16909 +:10E78800000DA989F169000C6E07F01F0016C0285A +:10E7980049555807C1D06E4811C411DBB16BF7E475 +:10E7A800118B11E48EEEF7E4108B6A0A8CE911F4F0 +:10E7B8000E9CE9EB100B16191409F20E010ECD3759 +:10E7C800C098141B6C1CAC6B5C7BF01F00088D0799 +:10E7D800D8225809FE99FFF7CFBB00008000DA68FD +:10E7E8008000DA3C0000731C8000D210D4314C58F1 +:10E7F80018971188EDB80004E081020C79994C282B +:10E80800F90C006070086FAAF208010BC186103974 +:10E81800C0614BE87008F4080108C1164BB87008CD +:10E82800103AC2914BA87008F139000FF138000E68 +:10E83800F3E81088F8081900E088001E4B487009B2 +:10E84800F338000FF339000EF1E910884AE972092C +:10E858005C88EF490064EF5800604AC97209EF49C3 +:10E8680000685808C080EF3900AC3008F00918007B +:10E87800EFF81EAC4A586F497008F009010B580BA5 +:10E88800E089004C3006EF5600704A2B960BEC0BD3 +:10E898001900C3215C7CEF160060F80A000A6FAC0F +:10E8A800EC0C000C143CC281EF0A003AF60A19007D +:10E8B800C2351039C211EF3800542FF85C58EF6890 +:10E8C80000543039F2081800E088000FEF090056AC +:10E8D800EF08003C12085C88F2081900E088014A39 +:10E8E800EF580056C469F2081800E08101430E9CF5 +:10E8F800F01F0009C3E93008EF680054C3A90000FD +:10E90800000073280000731C0000732400007318B3 +:10E91800000073208001016A5CD91009E08600D1EB +:10E928006F7912185808E08900CCEF380026EDB846 +:10E938000002C081A3C8EF680026EF080058EF580E +:10E948000056300A4D39EF6A004E720BEF6A0054D8 +:10E9580072096F48EF490050F6080108EF09007284 +:10E96800EF580070F2080008EF09004AEF580072EB +:10E97800EF080048A358F2080008EF58004C6E480A +:10E988005838E0880066EF080056EF090058F0098B +:10E998001900E0880006EF09003C1009C0A8EF192B +:10E9A800003CB339F7D8C010F20B0C0AF408000980 +:10E9B8005C89F0091900E088004CEF590056C488BA +:10E9C8006C08EF030074EF48007C6C1CF01F0032E9 +:10E9D800F8031900C0E24B18201D1AD8E06803B3E9 +:10E9E8001AD84AF84AFC1AD8F01F002F2FCDC008B1 +:10E9F800EF0800705808C09020186C49F339000DD2 +:10EA0800EDB90000EFF80C38EF0300746C1CF01F30 +:10EA1800002218130C9CEF530074F01F0024EF0819 +:10EA28000074EA081900C1606FF85808C1316FE82E +:10EA38005808C1014998201D1AD8E06803BF1AD8A0 +:10EA480049B8498C1AD8F01F00182FCDC0084914AE +:10EA580030056FF65806C2D06C4811CBF139000D5D +:10EA6800F3D9C0025F1A11D9B169F3EB118911EB1F +:10EA7800F3EB108911F81248680912188CE9F409A7 +:10EA8800000912085808FE9AFF9DE08F045F0000F5 +:10EA9800000073248000CD0C8003AC608003ACA818 +:10EAA80080039D9C800094C48000DA3C8003ACD035 +:10EAB8003FF8EF58003A3008EF680038C5A830082A +:10EAC800EF580070C5686C08EF030074EF480078D1 +:10EAD8006C1CF01F0021F8031900C0E249F8201D42 +:10EAE8001AD8E06803E01AD849D849EC1AD8F01FB8 +:10EAF800001E2FCDC008EF0800705808C0902018DD +:10EB08006C49F339000DEDB90000EFF80C38EF034C +:10EB180000746C1CF01F001018130C9CEF53007449 +:10EB2800F01F0012EF080074EA081900C2406FF8DD +:10EB38005808C2116FE85808C1E14888201D1AD842 +:10EB4800E06803EA1AD848A8486C1AD8F01F0006EB +:10EB58002FCDC0088000CD0C8003AC608003ACA82A +:10EB680080039D9C800094C48000DA3C8003ACD074 +:10EB78004C5430056FE65806C2106C4811CCF13978 +:10EB8800000D11DAF3D9C002B16AF5EC118A11EC63 +:10EB980011F858095F1B6809F5EC108AF1EA100AA8 +:10EBA8008CE8F20A010AF6080008F4080108C066B1 +:10EBB8006F7810195809FE9AFF886F085808C29094 +:10EBC8004B196F1A7209F4090109C2374AFB760B0F +:10EBD800EF0A0048F6080108F40B140316185C88BD +:10EBE800F00A000A5C8AEF09004AF40B14035C4837 +:10EBF800EF5A0048F20A14021419F2080008F6083D +:10EC08000009EF58004AEF59004C3008EF4800401F +:10EC180049F84A09900A6EA8580AE0800381720BE5 +:10EC2800F60911FF1009E08600B15C7AF0C9FFFF10 +:10EC38001619F20A010A580AE08900A849697216E9 +:10EC48005806C0E14958201D1AD8E06804461AD869 +:10EC58004938494C1AD8F01F00142FCDC008F00BC2 +:10EC6800010BE04B7FFEE08A002348C8201D1AD81C +:10EC7800E06804471AD848D848AC1AD8F01F000AE8 +:10EC88002FCDC008000073240000821000007320FC +:10EC98000000731C000073348003AC608003ACF088 +:10ECA80080039D9C800094C48003AD008CD81638E6 +:10ECB800C3148C48F3D8C0101639C0E44AB8201DD4 +:10ECC8001AD8E06804491AD84A984AAC1AD8F01FEA +:10ECD800002A2FCDC0081618300A5C88C058AC48E6 +:10ECE800AC5A121B6C068CD91639CFA55C3B0C9C10 +:10ECF8005C8BF01F0022C21049C8201D1AD8E0689A +:10ED080004561AD849E849BC1AD8F01F001B2FCD61 +:10ED1800C0085C3B0C9C5C8BF01F0018C0E04938B5 +:10ED2800201D1AD8E068045B1AD84958491C1AD81B +:10ED3800F01F00112FCDC0086C1A4929932A492ABF +:10ED48006EA8740B926C9508F80B000A101AB26A38 +:10ED5800F00A16187249B2F8B2CAF5D8C208F1D842 +:10ED6800C108B2DAB2E8C1B88003AC608003AD1064 +:10ED780080039D9C800094C48000CDD48003AD2086 +:10ED8800000073340000731C101BC097EF38002676 +:10ED9800A1B80E9CEF680026F01F00424C256EA912 +:10EDA8006A08F009010AE08602B7F0CAFFFFEF1B04 +:10EDB800002C121A161A580AE08902AE1039E0819E +:10EDC80001F54BA8906A7048F139000DF3D9C002DB +:10EDD8005F19F40900094B6AB409EF0A002CF20A1A +:10EDE8001900C462F13A000CF139000DF3EA1089F8 +:10EDF8005C89EDB90000C081E219FFFEF169000DE0 +:10EE0800A989F169000C4A98EF0A002CB06A704988 +:10EE1800F339000DEDB90001C031201AB06A4A3645 +:10EE28008CEB6C1CF01F00238C696C48F138000DCA +:10EE3800F1D8C0025F18F208000849D9B20849A9F8 +:10EE480072095C78EF1A002C12086EA9F4090009FF +:10EE58001238C0E04988201D1AD8E068048B1AD8F7 +:10EE68004968497C1AD8F01F00172FCDC008EEF664 +:10EE780000805806E08000BE48C46848F138000D9C +:10EE8800EDB80000C080C4B8109C7008EF4800803E +:10EE9800F01F000DEEF800805808CF71CAA80000D6 +:10EEA80080010CEC0000731C000073340000732018 +:10EEB8008000D2108003AC608003AD3480039D9C39 +:10EEC800800094C48000DA3CF138000DEDB80000F1 +:10EED800C1F16848F139000DF13A000CF3EA108AE3 +:10EEE8005C8A1499A1A95C79F20B1608EDBA0001A5 +:10EEF800C0F0F169000DF16B000C68488869F138C1 +:10EF0800000DF1D8C0025F18F2080008A6086C05C9 +:10EF18000A96F01F00455805C041C6984C324C432C +:10EF28006C4811C5868A11D9B169F3E5118911E5D3 +:10EF38008CEBF3E510890C9C11F5EBE91009F40949 +:10EF48000109640A1409F20B010BCBF7E08F0201E7 +:10EF58004B89EEF80080704811FB11C511DC11E8EF +:10EF6800B16CF9E5118CF9E81088F7E81008F00A97 +:10EF7800010A5C8AB26A7248F138000DEDB80001E6 +:10EF8800C031201AB26A4AB58AEB6A1CF01F002AFF +:10EF98008A696A48F138000DF1D8C0025F18F20892 +:10EFA80000084A39B2085C784A097209F009000A6F +:10EFB800EEF80080704811FB11CC11D911E8B16945 +:10EFC800F3EC1189F3E81089F7E91009123AC0E067 +:10EFD80049A8201D1AD8E06804C31AD84988499C52 +:10EFE8001AD8F01F00192FCDC0080C95EF450080E6 +:10EFF80048F848E9908A7209F40900098FA990082D +:10F00800EF09002CF0091900C22248C8201D1AD89F +:10F01800E06804CD1AD848D848AC1AD8F01F000ABE +:10F028002FCDC0088000DA3C0000731C000073205C +:10F03800000073348000D2108003AC608003AD6C94 +:10F0480080039D9C800094C48003ADA810190E9C79 +:10F05800EF59002CF01F004A4CA8300A7019924B47 +:10F06800F40B1900C0504C8A9509300991194C5875 +:10F078007048F138000DEDB80000C5B14C3913885F +:10F08800A5B8B288C56881098CEAF13B000DF7DBA9 +:10F09800C0025F1BF60A000A14098FA9EF0A002CA8 +:10F0A800F138000D8C69F1D8C002F7D9C0105808A2 +:10F0B8005F1EF9DAC010FC0B000B163CC0E44B488D +:10F0C800201D1AD8E06804F21AD84B284B2C1AD8FD +:10F0D800F01F00322FCDC008F409010958085F1845 +:10F0E800F20801080E9CEF58002CF01F00256C1B3D +:10F0F8009648E2081900C090680C580CC040F01FF0 +:10F108000028C028890B8D126C48F138000DEDB825 +:10F118000000C0810B88A5B8AA886E485848EFF34C +:10F128000A046C080C9CEF480080F01F001EC07891 +:10F1380049D030014944300249453073EEF6008029 +:10F148005806C1006C4811CB11D9B169F3EB11898C +:10F1580011EB6EAAF3EB108911FBF7E910091439CA +:10F16800C930EF380026EDB80000C041A1C80E9C98 +:10F17800CE68A1A8EF680026D83200008000D5FE2E +:10F18800000073340000732C000073298003AC6006 +:10F198008003ADC880039D9C800094C48000CD345A +:10F1A8008000DA3C0000731C0E9CF01F0040EEF655 +:10F1B80000805806C0714BECF01F003EEF4C0080F9 +:10F1C800D8326A093005F2CCFFFF6C4811CB11DA4E +:10F1D800B16AF5EB118A11EBF5EB108A11FBF7EA2E +:10F1E800100A1439C1214B2C8C689869F009190050 +:10F1F800E08800B4F01F002FE08000B05805EBFC59 +:10F208001A00EFFC0A20C0D85805C0D1F20A010B39 +:10F21800C4574A7CF01F0027E08000A0EF4C008014 +:10F228000C9BC3986A4B17F417C217D317EBB1633B +:10F23800E7E21183E7EB108BE9EB100B5CDB120BB9 +:10F24800C2D6F80A010B580BE0890029498CF01F37 +:10F2580000191897E08000826A4811F911CA11DB79 +:10F2680011E8B16BF7EA118BF7E8108B4928F3EB3B +:10F27800100B70088AE9101916095809E08A000964 +:10F28800F00B010B6A1CAA6B5C7BF01F000C8B0750 +:10F298000C9B0E9CF01F000AD8326C0B0C95580B77 +:10F2A800C1001696C93B000080010BF000007334C2 +:10F2B8008000DA080000731C8000D2108000E7503C +:10F2C80014195809E08A004AF138000DEDB8000019 +:10F2D800C4404A3CF01F00238D0CC3F06C4811F960 +:10F2E80011CA11DB11E8B16BF7EA118BF7E8108B43 +:10F2F80049D8F3EB100B70088CE910191609580956 +:10F30800E08A002CF00B010B6C1CAC6B5C7BF01FD3 +:10F318000017D8320E9CF01F0016D832720BF60870 +:10F328000109C0A62FFBEF19002CF60801081218D6 +:10F338005808E08A00130E9CEF380026A1B8EF6841 +:10F348000026F01F000CD8323008FE9FFBB4580985 +:10F35800FE99FE00FE9FFE4BD83200000000733479 +:10F368008000DA080000731C8000D21080010BF0C6 +:10F3780080010CECD4314B86ED0800922FF87819F7 +:10F388004B65ED5800928B091388F1D8C004F20838 +:10F39800002818971693109C4B148908F01F003109 +:10F3A8006A080E9C118BF7DBC004A36B5C3BF01F53 +:10F3B800002EC0718E493138F0091900E08B000B1E +:10F3C8004A580E9CF109009A2FF9F159009AE08FDA +:10F3D80003026A0C069B2F0CF01F0024C0B16A0AB6 +:10F3E800FC19E000F5380010B968E618F00012388A +:10F3F800C0A149980E9CF10900A02FF9F15900A06D +:10F40800E08F02E9F4CBFFF48EC830692F0A0E9C16 +:10F41800F01F00175C8CC080ED0800980E9C2FF838 +:10F42800ED580098C11868080E9CF13B000CA58B9C +:10F43800F60B10FCF01F000CC1C0ED08009A0E9CE2 +:10F448002FF8ED58009AED0800962FF8ED58009621 +:10F45800E08F02C6000080D40000733000007318EB +:10F468008000D67C8000CDD48001255880011E2CD8 +:10F47800680811CA11D9B169F3EA118911EAF3EAE6 +:10F48800108911FAF5E91009F20A1618B0CAF5D967 +:10F49800C208B0F9B0DAF5D9C108B0EA4B28910929 +:10F4A8006808F1390008F13A0009B16AF5E9118AEA +:10F4B800F139000AF5E9108AF139000BF3EA100A6C +:10F4C800F4091618F1690008F3DAC208F16A000BAA +:10F4D800F1690009F3DAC108F169000A4A386804D9 +:10F4E800910AE938000DF5D8C002F1D8C0064A0BD8 +:10F4F800B6884A086A09580A5F1A8E4514055C8559 +:10F50800B00549D87006CA586C485808C0E149B8CF +:10F51800201D1AD8E06800B71AD84998499C1AD80B +:10F52800F01F00192FCDC00858A8C0E14938201D88 +:10F538001AD8E06800B81AD84948492C1AD8F01FD8 +:10F5480000122FCDC0085818C24148C8201D1AD82B +:10F55800E06800B91AD848E848AC1AD8F01F000A81 +:10F568002FCDC0080000731C00007324000073280E +:10F57800000073200000820C8003AC608003ADF0B3 +:10F5880080039D9C800094C48003AE188003AE4421 +:10F59800098A0998F1EA1088ED0A0024F00A19008E +:10F5A800C56109AA09B8F1EA1088ED0A001CF00A39 +:10F5B8001900C4D1F33A000CF338000DB168F1EA30 +:10F5C8001188F33A000EF1EA1088F33A000FF5E8D3 +:10F5D80010086C1A103AC3B1F33A0010F33800114E +:10F5E800B168F1EA1188F33A0012F1EA1088F33AA7 +:10F5F8000013F5E810086C0A103AC2916C380C3800 +:10F60800C0E14CA8201D1AD8E06800C21AD84C885E +:10F618004C8C1AD8F01F00482FCDC008580CC06079 +:10F6280099384C6870098D3991066C380C38E0812E +:10F6380001A14BE8201D1AD8E06800C81AD84C0868 +:10F648004BCC1AD8F01F003C2FCDC0080C9C6C3650 +:10F658005806FE91FF5BE08F05296C4858A8C0E06A +:10F668004B28201D1AD8E06800D21AD84B584B1CDA +:10F678001AD8F01F00312FCDC008098B0998ED0A60 +:10F688000024F1EB1088F00A1900C77109AC09BB16 +:10F69800ED08001CF7EC108BF6081900C6E1F33CE6 +:10F6A800000CF33B000DB16BF7EC118BF33C000E33 +:10F6B800F7EC108BF33C000FF9EB100B6C1C163CAD +:10F6C800C5C1F33C0010F33B0011B16BF7EC118B93 +:10F6D800F33C0012F7EC108BF33C0013F9EB100B22 +:10F6E8006C0C163CC4A1498B178CEDBC0002E08061 +:10F6F800013AEDBC0001C2D1494B6CAC760BF60C5B +:10F70800010CC2D6ED14002C081C580CE089002806 +:10F718005C7A201D5C751ADA48DCEA0B000B5C7811 +:10F72800F2CAFFF0780CC7688003AC608003AE6C47 +:10F7380080039D9C800094C40000820C8003AE98D6 +:10F748008003AEC4000073280000731C00007324FB +:10F75800EDBC0000C0414CC870088DD84CB8900969 +:10F768003008F0091900E08000FEED3800260C9CF6 +:10F77800A1B8ED680026CF486C365806FE91FF6F99 +:10F788004C3870050C98CF286A0A580AC130F33CE7 +:10F798000010F33B0011B16BF7EC118BF33C001236 +:10F7A800F7EC108BF33C0013F9EB100B163AE081E1 +:10F7B80000DC09AB09BAF5EB108AEB0B001CF40B63 +:10F7C8001900E08100D25808C0706A3991394B0895 +:10F7D80070098B3991054AF81188EDB80004C1F118 +:10F7E8004AD8700913AB139A13B8201D1389F1EB8B +:10F7F8001088F5E910894A5B1AD9968C4A794A8BA0 +:10F808007209760BF2CAFFF0F80B000B4A5C780C11 +:10F818002FFC2F49F01F00242FEDCA48EDB8000136 +:10F82800E08100A1EB3C0014F01F00201896C08175 +:10F8380049F8F109009C2FF9F159009CC938497819 +:10F848007008F0C9FFF0C0311298C108F1390013EF +:10F85800F13B0010F13A0011F1380012B16AF5EBF2 +:10F86800118AF5E81088F3E810088D08EB08001CE9 +:10F87800ED58001C48987008F0C9FFF4C1A112980F +:10F88800C27800000000821000007320000082147B +:10F898000000732800007318000073300000731C08 +:10F8A80000007324800102348000E1D4000080D479 +:10F8B800F139000FF13B000CF13A000DF138000E60 +:10F8C800B16AF5EB118AF5E81088F3E810088D188D +:10F8D8004C587008118B1199F3EB1089ED590024DD +:10F8E80030398D494C197209F2CBFFFF8DCB8DABA6 +:10F8F800F13B000FF138000EF7E81088ED5800587A +:10F90800ED5800608A48E2180199AC486A684B8A49 +:10F918002019740C8D688D3C6A889506ED49006441 +:10F928008D880C9CF01F0033ECCBFFFCED1C003CD9 +:10F93800F01F00313019ED5C003C201D30081AD949 +:10F94800109A3129109B0C9CF01F002C2FED5C5C49 +:10F95800C0600C9C300BF01F002AC0480C9CF01FA4 +:10F9680000290E9CC3C80A986A355805FE91FF0EF7 +:10F9780049D56A08F13C000DF9DCC006F01F0022E9 +:10F988005806E08003504A188E4A6A09911791492F +:10F99800B06A30096E1A9109912A49D8910949D853 +:10F9A800B089ECFA0084580AC3C0ECF8008C5808F7 +:10F9B800C0500C9B6C6C5D18C06810990C9B109C17 +:10F9C800F01F00155C5CC041ED4C0084C2A80E9C81 +:10F9D8004928F10900962FF9F1590096F01F0010F7 +:10F9E800D8320000000073180000731C0000820C5D +:10F9F8008000E6B48000D95C800103508000E124D7 +:10FA080080010CEC8000D67E000073340000732C5B +:10FA1800000073298000E5EC000080D48000D13C10 +:10FA28004A9891064A981188EDB80002C3216C489B +:10FA38005828C0814A6870096D781039E081026BD6 +:10FA4800C1D84A49720A6CA9F4090109E08602631F +:10FA5800ED1A002C14195809E089025DE08F032182 +:10FA680049D8201D1AD8E06802271AD849B849CCC5 +:10FA78001AD8F01F001C2FCDC00849B91388A3B8A5 +:10FA8800B288ED380026A1C8ED680026E08F024351 +:10FA9800EDB80001C0616C4820285818E08B00A21E +:10FAA800492870088DD830080C9CED6800ADF01F0F +:10FAB80000106C4820285878E08B022D48D9F208AD +:10FAC800032F000000008224000073280000732424 +:10FAD8000000731C8003AC608003AEF480039D9C1F +:10FAE800800094C400007329000082108000E6B4EE +:10FAF8008003AC404CF811891298E218001259287A +:10FB0800C7A14CD8700A6DF8704811FB11C711DCF9 +:10FB180011E8B16CF9E7118CF9E81088F7E81008DA +:10FB28002FF8103AC681ED0800722FF8ED580072D0 +:10FB38004C287008ED4A0050F0CA00012FF88DC813 +:10FB48008DA84BF87008F139000FF138000EF3E872 +:10FB58001088ED5800603048ED4A00648D48EC0884 +:10FB6800000BED1C003CF01F00375C8CF808100AF5 +:10FB7800ED5C003CED580058ED0900563018F009CE +:10FB88001900C021A17CED5C0056ED0800745808EE +:10FB9800C0E14AD8201D1AD8E06802591AD84AB8D4 +:10FBA8004ABC1AD8F01F002B2FCDC00820186DFCB6 +:10FBB800ED5800747808ED48007C5808F9B800FF43 +:10FBC800F9B80100EDF81E4EED58003AF01F00227A +:10FBD800ECF800905808C050300A0C9B6C6C5D180B +:10FBE800ED380026A1B80C9CED680026F01F001B1C +:10FBF800E08F0191EDB90004E081018D4908700999 +:10FC080013AB139A13B8201D1389F1EB1088F5E98B +:10FC18001089493B1AD9968C4929488B7209760B69 +:10FC2800F2CAFFF0F80B000B483C780CC7980000AC +:10FC380000007328000073240000731C0000731870 +:10FC48008000D95C8003AC608003AF1480039D9C66 +:10FC5800800094C48000DA3C80010CEC0000732022 +:10FC6800000073304C281188EDB80004C5E14C1829 +:10FC7800700C6D485CD81808C3D66D78F808010870 +:10FC88005808E089003830488D486C885808C0E129 +:10FC98004B98201D1AD8E068027E1AD84B784B8CF6 +:10FCA8001AD8F01F00382FCDC008300A0C9B6C6C96 +:10FCB8005D185C5CC0700C9C301BF01F0033E08F3B +:10FCC80001A7ED0700560C9CF01F0030ED080070EE +:10FCD8005808F9B901FFF1D9E108EDF81C383019D5 +:10FCE800ED08003CF2071900C021A178ED58005634 +:10FCF800C2E84A78700913AB139A13B81389F1EB69 +:10FD08001088F5E910894A3B201D1AD94A29968797 +:10FD180072094A2BF2CAFFF0760BEE0B000B2F4943 +:10FD2800F01F001F2FEDCF68EDB80001E08100F350 +:10FD380049A870096CA820181039E08100EC0C9CC7 +:10FD4800F01F0018CE780C9CF01F0010496811882D +:10FD5800EDB80005E08100DFED380026A1B80C9C65 +:10FD6800ED680026F01F00113078CC1800007328C9 +:10FD7800000073248003AC608003AF2C80039D9C3B +:10FD8800800094C48000E1248000E7F40000731828 +:10FD980000007320000073300000731C80010234DF +:10FDA800800101000000732980010CEC0C9CF01FFD +:10FDB800003E4BE84BE91188E2180020C2D01388B6 +:10FDC800EDB80004C1F14BB870096D781039C1A1C4 +:10FDD800ED380026A1B80C9CED680026F01F00360F +:10FDE8000C9CF01F00364B6972080C38C5604B59E3 +:10FDF8009308C05870390C39C69012985808CFB17A +:10FE0800C6D8ED380026A1B80C9CED680026F01F76 +:10FE1800002A3088C6C81388EDB80004E081007B4A +:10FE28004A4870096D781039C7513068C6080C9C6B +:10FE3800F01F001D49D81188EDB80005C6B1ED388E +:10FE48000026A1B80C9CED680026F01F001B0C9C36 +:10FE5800F01F001A49A972080C38C1F04999930893 +:10FE6800C05870390C39C32012985808CFB1C368EC +:10FE78000C9CF01F000D48E81188EDB80004C4A1DF +:10FE880048C870096D781039C4510C9CF01F000BDC +:10FE980048B972080C38C0316C38C21848999308B0 +:10FEA800C1B800008000E7F400007329000073283F +:10FEB8000000732480010CEC8000DA8C0000820CB6 +:10FEC8000000821870390C39C0614C0993086C39EC +:10FED8009139C06812985808CF614BC99308300807 +:10FEE8008D384BB870098D39910630A88D48C128D6 +:10FEF8000C9CF01F00384B881188EDB80004C0A195 +:10FF08004B6870096D781039C0514B591388A5A8F2 +:10FF1800B2884B381188EDB80003C091ECF800980E +:10FF28005808C0803FAB6C6C5D18C048EDB8000441 +:10FF3800C0A10C9B4ABCF01F002C0C9B302CF01F5E +:10FF4800002BC658ED0A0070580AC090ECF80088DB +:10FF58005808C0505C7A0C9B6C6C5D184A48700855 +:10FF68005808C24049C91389EDB90003F1F9080DD1 +:10FF7800F9BA0001F3DAE039F1F90E0D49CAECF8E3 +:10FF8800008C5808C070740A30090C9B6C6C5D18A2 +:10FF9800C0781099740A0C9B109CF01F00165C5CCA +:10FFA800C05049387008ED48008448D81188EDB829 +:10FFB8000005C271ECF8008C5808C1D030090C9BC0 +:10FFC800129A6C6C5D18C1D800008218000082205B +:10FFD8008000E7F4000073280000732400007329F0 +:10FFE8000000820C8000DAE88000C9740000732CDD +:08FFF8008000E5EC10990C9B60 +:02000004800179 +:10000000109A109CF01F002E30094AE80C9C9109B0 +:10001000F01F002D30064AB891064AC76E1C580CD6 +:10002000C330F01F002B8F16C2F86A0BF738000D93 +:10003000EDB80002C2604A78F10C00A02FFCF15C20 +:1000400000A0F10C00962FFCF15C0096179C17A6FF +:1000500017B8178BF9EB108B201D49F972091ADBC1 +:1000600049EB968CF2CAFFF0F1E6108849CB2F4994 +:10007000760BF80B000B49BC780CF01F001B2FED22 +:100080000E9CF01F0013F01F0019C1714988201D3C +:100090001AD8E06801771AD84968497C1AD8F01F45 +:1000A00000172FCDC0085808FE90FCE0FE9FFCEB27 +:1000B00049387006FE9FFB67D83200008000E5ECEF +:1000C0000000822480010CEC000073348000D13CDD +:1000D000000080D400007330000073200000731C07 +:1000E00000007324800102348000D6B48003AC6029 +:1000F0008003AF4080039D9C800094C40000822058 +:10010000D42179F95809C3107208F8CEFF88F9484C +:10011000007C79E8C038109E70085808C1C0704B48 +:1001200017F617C417D5B165EBE41185724A17EBC2 +:1001300015F7EBEB108B15C5EDEB100B15D615EA8B +:10014000B166EDE51186EDEA108AEFEA100AF60ACB +:10015000010ACE2693089D093008F9480040F93875 +:10016000004E2FF8F968004ED822D42179F95809A9 +:10017000C600F9380026EDB80002C5B07208F8CE06 +:10018000FF88F948007C79E8C038109E700858084C +:10019000C1C0704B17F617C417D5B165EBE41185D4 +:1001A000724A17EB15F7EBEB108B15C5EDEB100B47 +:1001B00015D615EAB166EDE51186EDEA108AEFEA8B +:1001C000100AF60A010ACE26930830089D09F9485C +:1001D0000040F938004E2FF8F9090056F968004E32 +:1001E000F5D9C02FF9080060F7D8C02FF009190021 +:1001F000F60817B0F4081780F9580058F908003CC1 +:10020000F00915015C78A178F91A0058103AF9F94B +:100210005C2CF9380026A3A8F909003CF9680026EF +:10022000F20815011009F90800581009F95900568B +:10023000D822D703D43118941693149112921096A1 +:100240004097300A314B301CF01F00391895C6D04A +:1002500098593138F0091900E08B000F4B58201DD8 +:100260001AD8E068031F1AD84B384B4C1AD8F01F25 +:1002700000342FCDC0080E9878175C78AEB8A988E6 +:10028000AEA8E0685014EF68000DA988EF68000C74 +:10029000E8081618AEC8F1D4C208AED8E608161899 +:1002A000EF680008F1D3C208F3D6C010EF68000968 +:1002B000AE993088A9893006AEF4EF63000BAE89A1 +:1002C000EF66000FEF660012EF660013EF66001096 +:1002D000EF660011EF68000E3069049A029BE9D4C2 +:1002E000C108E7D3C108AEE4EF63000A98C8F01F65 +:1002F00000155C7CEF6C0011A98CEF6C0010201DC8 +:10030000491C30671AD70C98F9070090049A2FF708 +:10031000029BE06900FFF95700900A9CF01F000B58 +:100320000A9CF01F000B2FEDD83200008000D3187C +:100330008003AF5C8003AFA480039D9C800094C4C5 +:1003400080011E2C000080D4800122948000D13CCA +:10035000D43120BD14915098414A505A12961897A2 +:100360003009F20119005F08F20A18005F0AF1EA89 +:10037000000AF20A1800C110F3D6C002C0E14C789E +:10038000201D1AD8E06800AD1AD84C584C5C1AD819 +:10039000F01F00452FCDC008580B5F195089126817 +:1003A000C0E04BE8201D1AD8E06800AF1AD84BF81F +:1003B0004BCC1AD8F01F003C2FCDC008EF080072BC +:1003C000E2081900C0B2EF380026EA18FFFFE8186B +:1003D000FF80EF680026E08F02E34058F3D8C001A9 +:1003E000E2180002F9B8010CF009002950296FB099 +:1003F000EF02007431F8F0021900E08800144AC8D6 +:10040000F109009C2FF9F159009CE06C00FFEF38D6 +:100410000026EA18FFFFE818FF80EF680026E08F4B +:1004200002C36FF85802C2605808C1404028A38830 +:100430002FB8AD685C883003503B50A8F7D1B0109E +:10044000409A504BF5DAC001069406980695506A1A +:10045000C3796FE85808CEB14908201D1AD8E06862 +:1004600000D01AD8493848FC1AD8F01F000F2FCDF9 +:10047000C0085808C0416FE85808CD904878201D42 +:100480001AD8E06800D31AD848B8486C1AD8F01FB8 +:1004900000062FCDC00800008003AF5C8003AFD4FE +:1004A00080039D9C800094C48003B028000080D409 +:1004B0008003B0688003B0A450195008EF03003CDB +:1004C000304CF01F0042401918954008E080023C73 +:1004D000300B990B991B5809C0301894C118580853 +:1004E000C0E14BB8201D1AD8E06800EF1AD84B982D +:1004F0004B9C1AD8F01F00392FCDC008910C5C73AB +:10050000402A4069E60A010840435C73E6080D434F +:100510005C835809C3904028300AE608000B149CFD +:100520005C7BF01F002F8B1CE080020EF5D3C01007 +:10053000402B98D9F40B00081039C0E44A48201D1C +:100540001AD8E06800FF1AD84A684A3C1AD8F01F47 +:1005500000232FCDC008501AF01F0023401A18980E +:1005600040895809C0A0402B6A195008721C160C0B +:10057000403BF01F001E4008F00200026A185C8237 +:1005800070188B28C3D8406A402B149CF01F0014AD +:100590008B1CE08001D9F01F0014407AF8020002A1 +:1005A0005C82580AC2D0F7D3C010301A303CF01F1A +:1005B000000C189B6A1C580BC1C1F01F000D40694C +:1005C0008B19E08F01C100008000C9D48003AF5CAB +:1005D0008003B0D880039D9C800094C48000D31811 +:1005E0008003B0E88000CD0C8002E7368000D13C6B +:1005F000403897182FF28B285C82F01F003F320B97 +:10060000F6021900E08B01A0AA63314B6A1CF01FAF +:10061000003BC0904BA8F10900A42FF9F15900A4A8 +:10062000E08F0192EF39001C6A1870188B48B0896E +:10063000EF39001DB099EF3900246A48B0A9EF39AD +:100640000025B0B9E00916186A48B0C9F3D0C2084D +:10065000B0F0B0D9F3D0C108B0E96A48F16C00132A +:10066000F16C00126A48F13A000CF139000DF3EA1E +:100670001089E019FFC0EDE910095C79F169000DFE +:10068000A989F169000C405AEB6A000E404806182F +:100690005C88F3D3C0105048403B6A48120B503B73 +:1006A00040AA1200F139000DF3D9C006F5E910098E +:1006B0005C79F169000DA989F169000C0A98300A8A +:1006C000404BF40B19005F1B507B169A58045F09CE +:1006D000300B124AF60A1800FE91FEF0F5D2B01067 +:1006E000503A6FE05800E08000C260085808C0909F +:1006F0001090CFCB8000CD348000CDD4000080D4CA +:1007000080EA6048F139000DF3D9C0025F1B140B79 +:10071000E08000C45809E08100C1F7D6C0025F0C38 +:10072000301BF60618005F0BF9EB100BF20B1800EC +:10073000E08000B488EBEF19003C140B123BE08919 +:1007400000ADE13B000EE939000EF20B1800E0812C +:1007500000A5684911FE13FB504B11CC11DBB16BA6 +:10076000F7EC118B11ECF7EC108BFDEB100B160A6C +:1007700013CB13D8B168F1EB118813EB4049F1EBBF +:100780001088F3E81008103AE08100884028681CBF +:10079000F00B11EC5C8BF01F0037C0E04B68201DA4 +:1007A0001AD8E06801691AD84B484B5C1AD8F01F78 +:1007B00000352FCDC0086818905AF80A1900C0A15A +:1007C00070098919910C4032109C20125C82F01F34 +:1007D000002EF1D6C001681BC220580BC05188689A +:1007E000F6081900C0E04A48201D1AD8E0680177D1 +:1007F0001AD84A684A2C1AD8F01F00222FCDC008F8 +:100800006048F13A000CF139000DF3EA1089A1A912 +:10081000F169000DA989F169000CC1E8580BC050BD +:100820009659F0091900C0E14938201D1AD8E0682E +:10083000017A1AD84968492C1AD8F01F00122FCD16 +:10084000C008601CF01F001380698868F208000867 +:10085000A068680881080835E0051700E1F3020682 +:10086000089B304CF01F000CC198EF440078C16821 +:100870008000CDD48003AF5C8003B11C80039D9CBD +:10088000800094C48000D13C8003B1308003B1501B +:100890008000CD348000C97481040C98EDB600014D +:1008A000C040EDB60000C0312FF15C81EDD6C00133 +:1008B000EFF81826F9B90120F1D9E138EFF81E2632 +:1008C0006FB9F1D1C010F2080008EF520074EF4880 +:1008D000006CEF0800720218EF5800725802C14015 +:1008E0006FF85808C1116FE85808C0E14AF8201D98 +:1008F0001AD8E06801A11AD84AD84AEC1AD8F01FD1 +:10090000002E2FCDC00858055F193008F0031900DC +:100910005F1AF5E90009F0091800C4406A48580850 +:10092000C410409CE21C0002C3D1F13A000CF13922 +:10093000000DF3EA1089A3B9F169000DA989F169E5 +:10094000000CC318EF380026EA18FFFFE818FF80F4 +:10095000EF6800264998F109009C2FF9F159009C95 +:100960005804C040089CF01F0016EF0900743008BE +:10097000F0091900C1406FF85808C1116FE8580814 +:10098000C0E148A8201D1AD8E06801B41AD84888E8 +:10099000488C1AD8F01F00082FCDC008E06C00FF6B +:1009A000C028300C2F5DD8328003AF5C8003B16467 +:1009B00080039D9C800094C4000080D48000DA688D +:1009C000D421784E1298587E5F07584E5F09EFE9A0 +:1009D0001009C081582EC060583EC040E06C00F83D +:1009E000D822580AC031149CD822201D30095C7AC4 +:1009F0001AD9F01F00032FED5C5CD8228001035050 +:100A0000D4013008201D109A16991AD8149B30185A +:100A1000F01F00032FED5C5CD80200008001035042 +:100A2000D431189679F45804C05179E45804E08020 +:100A300000CE6848F133000DE7D3C001C06088697B +:100A40003008F00919005F03300A5C53301C14337E +:100A5000F9BB0114F9BB0015F01F005D1895E0808B +:100A600000B698593138F0091900E08B000F4D9805 +:100A7000201D1AD8E068040F1AD84D784D7C1AD87A +:100A8000F01F00572FCDC008684811FA11CB11D9BB +:100A900011E8B169F3EB1189F3E81089ED38001C16 +:100AA0007817F5E91009AE88EF3A000CED38001D13 +:100AB000AE98EF38000DF1EA1088ED3A0024AEAAA6 +:100AC000ED3B0025AEBBF20B1618AEF9AECBF7D955 +:100AD000C208F3D9C108AEDBAEE9ED390028EF69F1 +:100AE0000008ED390029EF690009ED39002AEF69A6 +:100AF000000AED39002BE018FFC0EF69000BA5A834 +:100B00005C88F5D8C010EF6A000DF40B1608EF6B87 +:100B1000000CED39002EEF69000EF1D8C006300947 +:100B2000E8185000ED3A002F5C78EF6A000FEF688C +:100B3000000DEF690011EF690012EF690013EF6912 +:100B40000010A988EF68000CED19002E6CA8F208BF +:100B500000088DC85803C110EF39000CEF38000DA4 +:100B6000F1E91088E018FFC0E8180011EF68000DE7 +:100B7000A988EF68000CC068682811897818F169A5 +:100B80000014ECC4FFFC8AC83069089A0C9B0A9CCC +:100B9000F01F00145C7CEF6C0011A98C4929EF6CEC +:100BA0000010F30C00902FFCF35C0090306C201DC3 +:100BB000ED39000B089A1ADC0C9B30080A9CF01FD8 +:100BC000000B0A9CF01F000A2FEDD8328000D318CA +:100BD0008003AF5C8003AFA480039D9C800094C41D +:100BE00080011E2C000080D4800122948000D13C22 +:100BF000D431300A1895314B301CF01F003918934E +:100C0000C041E06C00FED832EB380026EB39001C06 +:100C1000E018FFFCEB6800266B787817AE89EB399B +:100C2000001DAE99EB390024F00B1618AEA9F3D8CD +:100C3000C208EB3A0025AEF8F1D8C108AECBAEBA87 +:100C4000AED9AEE86AA8F0091618EF690008F3D823 +:100C5000C208E06A5010EF690009F3D8C1083004F7 +:100C6000EF68000BEF69000AF40B1608EB19002E71 +:100C7000EF6B000CEF6A000DEF69000FEF640012DC +:100C8000EF640013EF640010EF640011F20A16081D +:100C9000F2080008EF6A000E8BC8EAC6FFFC0A9B48 +:100CA0000C9A98C83069F01F000F5C7CEF6C001143 +:100CB000A98CEF6C0010306CEB38000AEB39000B9C +:100CC000201D0C9A1ADC0A9B069CF01F0007069C4C +:100CD000F01F0006089C2FEDD83200008000D318CA +:100CE00080011E2C800122948000D13CD431202D23 +:100CF0004AE8189770081838E08001A3F9080056F0 +:100D0000F9090060F0091900F20817805C785008B2 +:100D100079E6F9380026E2180002C1E05806C170F1 +:100D20008CEB6C48794911CCF609010911DBB16BE8 +:100D3000F7EC118B11FA11E8F7E81088400BF5E891 +:100D40001008F20800081638E08800070E9CF01F13 +:100D500000185C5CC7696FF55805C0B1EEC9FF8427 +:100D6000EEC2FFFC5019300349214930C2B9109539 +:100D70006A085808CFD1CF3BF13C000CF139000D87 +:100D8000F3EC108C5C8CEDBC0002C1F148B8201D66 +:100D90001AD8E06802471AD8489848AC1AD8F01F09 +:100DA000000A2FCDC00800000000822480010BF053 +:100DB000000080D4000082108003AF5C8003B18407 +:100DC00080039D9C800094C46FF95809C150EF3B8B +:100DD00000261699E2190044C0F16FE95809E08035 +:100DE0000133720E580EC081926EEF09003CF20E74 +:100DF0001900E08301296C09EF4900786E495829F0 +:100E0000C0E0A5AC5C7CF16C000DA98CF16C000C11 +:100E1000EF390026E019FFFCEF6900266EA9F20AFF +:100E20001618F16A0008F5D9C208F16A0009F5D967 +:100E3000C108F169000BF16A000AEF1A002EF16A8D +:100E4000000FF40B1608F16B000EF40900098FC9AE +:100E5000ED39000EEDB90000C061E06B0200EA1B45 +:100E60000204915BEF08003A3FF9F2081900F9B863 +:100E70000000EFF80C1D6E085808C071049CF01FAC +:100E80000075C45078188F086F085808C121600990 +:100E90006C48EF49004011F911CB11DA11E8B16A41 +:100EA000F5EB118AF5E81088F3E81008EF480044E4 +:100EB0006C1C6C4478199848985A9914E8090109EF +:100EC000121A1218B85AB84830695C78049A0E9B06 +:100ED000E9630010E9630011F01F005F30695C7C7A +:100EE000E96C0011A98CE96C0010E30800902FF860 +:100EF000201DE35800901AD9049AEF38000AEF3900 +:100F0000000B0E9B6C1CF01F00552FED6C4811FA66 +:100F1000F139000DF3D9C0025F1B11CC8CE9F60941 +:100F2000000911DB11E8B16BF7EC118BF7E81088C1 +:100F3000F5E810086F7AF2080008101AC037EF4879 +:100F4000005C5809C3B08D036FF85808C041EF46E4 +:100F5000007CC3286C4A15FE15C46A4915DBB16BC9 +:100F6000F7E4118B15E4F7E4108BFDEB100B13CEB7 +:100F700013FC13DAB16AF5EE118A13EEF5EE108A5E +:100F8000144CF60C010CC177401AC058109A700826 +:100F90005808C0E0704913C413FC13DEB16EFDE4C1 +:100FA000118E13E4FDE4108E1C4C161CCF068D0828 +:100FB0009506C0788B060C95C0480C9CF01F002845 +:100FC0006FE65806C3706C4811CC6F4A8CEB11D990 +:100FD000141BB169F3EC118911ECF3EC108911FCCD +:100FE000F9E91009F6090009400B1639FE98FEC60A +:100FF000EF3900AC3008F0091800C1C18CEB6C4827 +:10100000F60A010A11F911CC11DB11E8B16BF7EC0A +:10101000118BF7E81088F3E81008100AEF18006049 +:10102000103AF9B80B00EFF8BA2AF9B80B01EFF84B +:10103000BEACEF380026F1D8C007EF680026300CB0 +:101040002FEDD832E21B00A0FE91FED7CD2B000081 +:101050008001222880011E2C800122948000DA3C2D +:10106000D401189879FA580AC170149B7609580966 +:10107000C030129BCFCB71EC970CF1490040F14985 +:10108000007CF139004E2FF9F14A0078109CF1698B +:10109000004EF01F0002D80280010CECD431300A5F +:1010A0001896314B301CF01F00401895C7B0985966 +:1010B0003138F0091900E08B000F4BC8201D1AD8F9 +:1010C000E06803C91AD84BA84BAC1AD8F01F003AF5 +:1010D0002FCDC008ED39001C78176D78AE89ED3939 +:1010E000001DAE99ED3900242018AEA9F00B16189A +:1010F000ED3A0025F3D8C208AEF8F1D8C108AECB5E +:10110000AEBAAED9AEE86CA8F0091618EF690008BF +:10111000F3D8C208E06A5010EF690009F3D8C1089B +:101120003004EF68000BEF69000AF40B1608ED19A4 +:10113000002EEF6B000CEF6A000DEF69000FEF64FB +:101140000012EF640013EF640010EF640011F20A64 +:101150001608F2080008EF6A000E8DC8ECC3FFFC09 +:1011600098C83069069A0C9BF01F00145C7CEF6CE9 +:101170000011A98C4929EF6C0010F30C00902FFC92 +:10118000F35C0090306C201DED39000B08981ADCE0 +:10119000069A0C9B0A9CF01F000B0A9CF01F000A89 +:1011A0002FEDD8328000D3188003AF5C8003AFA44A +:1011B00080039D9C800094C480011E2C000080D47C +:1011C000800122948000D13CF9390010A3C948A8BD +:1011D000F969001011BA118B119911A8B169F3EBDB +:1011E0001189F3E81088F5E8100899183008F958C3 +:1011F00000145EFC8003B409997A996B5EFCD703F6 +:10120000D421301CF01F00071897C080320A300B21 +:10121000F01F00053FF8EF68000B0E9CD82200007D +:101220008000C9D48002E8BCD40148C9189B720868 +:101230001838C0D178389308C0C870395809C060D0 +:101240001639F7F90003F1F90A0370385808CF612D +:10125000301CF01F0003D802000082288000C974EF +:10126000D4214AB83009700E1C98C148103CC111F5 +:101270005809C0E04A78201D1AD8E06802541AD8EC +:101280004A584A6C1AD8F01F00262FCDC0083019D2 +:1012900070385808CEC1580BC0C017B817861797BA +:1012A00017ABB167EFE61187EFEB108BF1EB100B8B +:1012B000990B580AC2211C98E06A1000E0667FFF73 +:1012C0003007C0C8F10B0012F40B1900C061F6CA58 +:1012D000FFFF1C985C8AC0287038EC0A19005F1563 +:1012E00058085F1BEBEB000BEE0B1800CEC1580843 +:1012F000C040E06C00F5D822F95A00125809C0200D +:10130000D82A993E4828910C129CD82200008228A5 +:101310008003B19C8003B1E080039D9C800094C455 +:10132000D4213008169614951897F9090012F0097F +:101330001900C071300A189BF01F00145C5CC231A8 +:101340005806C0C00DB80D8A0D990DA6B169F3EA13 +:101350001189F3E61086F1E61006EF380010A3A815 +:101360008F16EF680010EF55001448987008109C15 +:10137000C0581837C021D82A783C580CCFB18F38C4 +:1013800048389107D82200008001126000008228AE +:10139000D43112971093169414911895F9090012EC +:1013A0003008F0091900C091300A189BF01F004561 +:1013B000E5DCC008E0810084308B089CF01F00420F +:1013C000C0310896C0E8300A308B301CF01F003F57 +:1013D0001896C041E06200FFC728089BF01F003C40 +:1013E0008C593078F0091900E08B000F4B98201DC4 +:1013F0001AD8E06801C51AD84B784B8C1AD8F01F60 +:1014000000382FCDC008EB3900120E986C175C78AD +:10141000AE893009EB3A0013AEB8AE9AA988AEF99E +:10142000AEE9AEA86A085808C041E6C2FFFCC10890 +:1014300066191238C0C00836C041E06200F7C3F830 +:101440000C9CE06200F7F01F0027C3980A928CC83A +:10145000F0091608AED8AEC9EB390010EDB900009E +:10146000C1403119029A049B0C9CF01F001F5C8C38 +:10147000F1DCC010AEF8A988AEE8580CF9B800FF4E +:10148000EFF80E07EFF80E0631181AD3049BEB396C +:10149000000B029A1AD80C9CEB38000AF01F0013BC +:1014A0002FEDE5DCC0080836C0400C9CF01F000D95 +:1014B00048F8F10900782FF9F1590078049CD832E6 +:1014C000800112608000CDD48000D3188000CDB49C +:1014D0008003B19C8003B1EC80039D9C800094C488 +:1014E0008000D13C80011E2C80012064000080D44B +:1014F000D421202D1897501B149C500A1296F01FCF +:10150000000C401B1898400AC0A148A8E06C00FCE1 +:10151000F10900862FF9F1590086C078F3D6C01082 +:101520000E9CF01F00055C5C2FEDD8228001222864 +:10153000000080D480011390D401F8CAFFFCF9198F +:101540000014F01F00035C5CD8020000800114F05E +:10155000D431203D4D98F109007A2FF9F159007AE4 +:10156000781716910F8818955C8898CAF3D8C0042C +:101570002FE9A369123AC0A5F1D8C004F00B1502F7 +:101580005C3BF01F004F1894C0904CC80A9CF109B6 +:1015900000822FF9F1590082C1D96A12EECCFFF016 +:1015A000029B502CF01F004705980583F1E3108340 +:1015B00005B805AE1896F1EE108E5C835C8E34484B +:1015C000F00E1900C2413438F0031900E081008B9D +:1015D00062A85808E080008770145804E0800083F7 +:1015E00068185808E0800092EF3A000CEF39000DBF +:1015F000B169F3EA1189EF3A000EF3EA1089EF3A84 +:10160000000FF5E910091238C6D1C7F84AE8089961 +:10161000700A089B1498500AC618F10C0012FC0CB2 +:101620001900C5A15806C041700C580CC1B0EF306C +:101630000010EF3C0011B16CF9E0118CEF3000129A +:10164000F9E0108CEF300013F60618005F1AE1EC99 +:10165000100C700018305F0CF5EC100CF60C180034 +:10166000C3B05804E08100D6F13C0010E21C000435 +:10167000F0041700CCE8701C580CC150EF3A000C75 +:10168000EF30000DB160E1EA11805010401AEF30E8 +:10169000000EF5E010805010EF30000F401A14409B +:1016A000003CC1A1400A10945809C0F0703893382A +:1016B000893A48589104C148000080D48000CDD4B4 +:1016C00080012558000082284C88F109008E2FF9EE +:1016D000F159008EC058109970385808C9F1580453 +:1016E000C141EF3A0010EF380011B168F1EA1188FA +:1016F000EF3A00126219F1EA1088EF3A0013F5E8A8 +:1017000010081039C6D1300405F805E9F1E9108850 +:10171000C130402A8AC83119EECBFFF40A9CF01F71 +:1017200000345C8CC0904B180A9CF10900802FF9A2 +:10173000F1590080C4F83F8B0A9CF01F002EC0E0D6 +:101740004AD8201D1AD8E06801141AD84AB84ACCE1 +:101750001AD8F01F002C2FCDC0085804C0D06866DE +:101760005806C3E0089BF1D3C010EEC9FFF40A9AF3 +:10177000687C5D16C5585806C261EF380010FC1928 +:10178000E000B968E618F0001238C1D00F8B0A9C4F +:10179000F7DBC0042FEBA36BF01F00166A180E389E +:1017A000C0E04958201D1AD8E068012F1AD84968AE +:1017B000493C1AD8F01F00132FCDC008303B0A9CBB +:1017C000F01F001248980A9CF10900882FF9F1597E +:1017D0000088F109007E2FF9F159007EC0280A9C8B +:1017E000F01F000BC1D80000000080D480011E2C27 +:1017F0008000CDD48003B19C8003B11C80039D9CEC +:10180000800094C48003B21C800118FC8000D13C8D +:10181000F10C0014E60C1900FE91FF5FC2DB2FDD16 +:10182000D8320000D431189316921494324B300AF7 +:10183000301CF01F00241897C43098593238F00932 +:101840001900E08B000F4A08201D1AD8E068012E0D +:101850001AD849E849EC1AD8F01F001E2FCDC0084D +:101860007816661531CAAC94AC823004ACC4ACD4E2 +:10187000ACE4ACF4661B781C2F8CF01F00170C9C9A +:10188000ACA4ACB48EDBF01F00155C7CACBCA98CA6 +:10189000ACAC201D492C30161AD60898F906006009 +:1018A000EACAFFF4E06900FF089B2FF6F9560060D2 +:1018B0000E9CF01F000C0E9CF01F000B2FEDD83279 +:1018C0008000D3188003B2308003B27880039D9CDF +:1018D000800094C48002E73680011F4A000080D453 +:1018E000800122948000D13CD401F5DBC00830BBDC +:1018F000F01F0002D802000080011824D401F5DB9B +:10190000C008303BF01F0002D802000080011824FC +:10191000D4314C62E50800622FF81694E558006255 +:10192000781618970D85EBD5C004A365EA0311005E +:101930005C83069BF01F003EE08101788E493038C1 +:10194000F0091900E08801726E1811893088F009D9 +:101950001800E081015DED380010ED310011B1613A +:10196000E3E81181ED380012E3E81081ED3800134F +:10197000089BF1E11001ECCCFFF0F01F002EC071CC +:10198000E611F000FC18E0001031C0914A780E9C7E +:10199000F10900742FF9F1590074C4498E49307867 +:1019A000F0091900E08801420E9CF01F00235C8CB6 +:1019B000C0A00E9CF01F0021E50800682FF8E55834 +:1019C0000068D832330B0E9CF01F0019C6E00A9B4A +:1019D0000E9CF01F0017189AC0E04998201D1AD8D5 +:1019E000E06800981AD84978497C1AD8F01F001787 +:1019F0002FCDC0088ECB302CF01F00151892E08040 +:101A0000011F98D9EAC8FFF81039C25248C8201DF2 +:101A10001AD8E06800A21AD848E848BC1AD8F01FC3 +:101A2000000B2FCDC0080000000080D48000CDD472 +:101A30008001255880011FAC8000D13C8003B2306A +:101A40008003B2A480039D9C800094C48000D318BE +:101A50008003B2D80E9BF01F00445C5CC0E04C38A1 +:101A6000201D1AD8E06800A51AD84C184C1C1AD8AA +:101A7000F01F00412FCDC008069B6416049CF01F88 +:101A8000003FC0E04B98201D1AD8E06800AB1AD880 +:101A90004BB84B8C1AD8F01F00382FCDC0080E9CC5 +:101AA0000497F01F0038C1383D0B0E9CF01F003327 +:101AB000C0E04AE8201D1AD8E06800B51AD84B08E3 +:101AC0004ACC1AD8F01F002C2FCDC008ED3A000CDC +:101AD000ED39000DB169F3EA1189ED3A000EED3BE5 +:101AE0000010F3EA1089ED3A000FF5E91009ED3A1C +:101AF0000011B16AF5EB118AED3B0012F5EB108A8B +:101B0000ED3B0013F7EA100AF40B16186E18ED6A95 +:101B1000000FED6B000CF7DAC208F5DAC108ED6AC8 +:101B2000000EF20A1618ED690013ED6A0010ED6B55 +:101B3000000DF5D9C208F3D9C108ED6A0011ED69AD +:101B40000012300911AAB08911B9F3EA1089FE7A9E +:101B5000F7FE5C89F4091900E0880016F2C9F7FF66 +:101B6000C14800008000CF988003B2308003B310DA +:101B700080039D9C800094C48000CDD48003B33842 +:101B80008000D13CF2C9F8005C79B0B9A989B0A94C +:101B9000ED380009E818FF00ED680009A988ED6834 +:101BA00000083008314BED68000BED68000A0C9C12 +:101BB000F01F00284A885C7CED6C000BA98CED6C52 +:101BC000000AF10900602FF90A9BF15900600E9C90 +:101BD000F01F00221898C0E04A18201D1AD8E068AB +:101BE00000D71AD849F84A0C1AD8F01F00202FCD78 +:101BF000C00830191AD4189A1AD9ECCBFFF4E0694E +:101C000000FF0E9CF01F001A2FEDC0B8E508007011 +:101C10002FF8E5580070E50800662FF8E5580066D3 +:101C20000E9CF01F0014D8320E9CF01F001248A822 +:101C3000F109006A2FF9F159006AD8320E9CF01FA1 +:101C4000000D4858F10900742FF9F1590074D83289 +:101C500080011F4A000080D48000CDD48003B230C0 +:101C60008003B36C80039D9C800094C48001206439 +:101C70008000D13CD431205D30951988FAC9FFF03D +:101C8000FACEFFFC5009330231033056F0C9003060 +:101C9000EA091800E08B00BAE4081800C03030A749 +:101CA000C1582FFC35891988F20818005F0A378956 +:101CB000F20818005F09F5E91009F9B70008F7BC48 +:101CC00001FFF9B70110F9F81800F8CAFFFF300951 +:101CD0003191F2070244F0C000301004F4CC00014E +:101CE000EA001800E08B0005E8C90030C1E80E9456 +:101CF000E6071800C1D1F0C400615C54EC04180080 +:101D0000E088000EF0C00041EC001800E08B0011EC +:101D1000E2041800E0880004341CC028361C2F6838 +:101D2000F00C010CF9E9104915882FFACD3B32EA85 +:101D3000F4081800C0814008103EC6701CA92FFC92 +:101D40001988CA5B5808C28030CAF40818005F1CA2 +:101D5000320AF40818005F1A146C300AF40C1800E8 +:101D6000C1B030DCF80818005F1730ACF808180074 +:101D70005F1CEFEC000CF40C1800C0E030BC309796 +:101D8000F80818005F1CEE0818005F18F9E8000852 +:101D9000F4081800C3A1FAC8FFFC101EA34E2FFEC2 +:101DA000582EC0B0E0890005580EC2F0C298583EC7 +:101DB000C0F0584EC251C168E064FFFFEA1400FF52 +:101DC0000839E08B00234018F3E81189C198E049F5 +:101DD000FFFFE08B001B4018402AB968F1EA1108A8 +:101DE000C0D8E04900FFE08B0011402A4018B968D4 +:101DF000F1EA1108403AF1EA1088F1E91009580BAC +:101E0000F7F91A00301CC028300C2FBDD832D70388 +:101E1000D401202DFACBFFFCF01F0004F9BC00FF19 +:101E2000FBFC10012FEDD80280011C74D431202D51 +:101E3000300630110C9EC4A898557812E7D5B01022 +:101E4000049430075008C0B8E92800000990202306 +:101E5000E1E810805C835C702FE40007E203190066 +:101E6000FE9BFFF40A944008E214FFFEE7D5C00190 +:101E700008023000E0031900C0400584A964080787 +:101E8000E9D7C010B187E80700070E94E0140000FE +:101E9000C060E9D7C010B187E80700075C77EBD5D1 +:101EA000C001EE0E000EEFDEC010B18EEE0E000E81 +:101EB0005805C0B0EFDEC108EC061101A96E5C56F2 +:101EC000FDDEC010EFEE100E780C580CCB615806FA +:101ED000C080F9DEC108A96EFDDEC010F9EE100E5B +:101EE00017B715BC17851796B166EDE5118617ABC8 +:101EF0001585EDEB108B5C781596EFEB100B15AAA2 +:101F0000EFDBC010B166B18BEDE511860E0BEDEA8B +:101F1000108AF9EA100AF40C1610F5DAC010F60A65 +:101F2000000A180AF4090009F2080008F00E000E71 +:101F3000F1DEC010B18EF00E000EF9DEC010B18ED1 +:101F40001C0C5CDC5C8C2FEDD832D4213008189945 +:101F5000F5DBB010301EC0B8F32600001397202A1E +:101F6000EFE610875C8A5C772FE90E08FC0A1900FF +:101F7000FE9BFFF41699E219FFFE120CEDBB000068 +:101F8000C0411989A9691208F3D8C010B188F208B4 +:101F900000081099E0190000C060F3D8C010B188A3 +:101FA000F20800085CD8F9D8B010D822D431300A31 +:101FB000301414981495C488985B7816EFDBB01031 +:101FC0000C9E3009C0B8FD2200001D932027E7E2D7 +:101FD00010835C875C732FEE06090E93E8071900E7 +:101FE000FE9BFFF3169EE21EFFFE1C06FDDBC001FA +:101FF000EA0E1900C0400D8EA96E1C09FDD9C01053 +:10200000B189FC090009129EE01E0000C060FDD9E4 +:10201000C010B189FC0900095C79F7DBC001F20846 +:102020000008F3D8C010B188F2080008580BC0B0FF +:10203000F3D8C108F40A1101A9685C5AF1D8C0109C +:10204000F3E81008780C580CCB81580AC080F3D8FC +:10205000C108A968F1D8C010F3E810085CD8F9D815 +:10206000B010D832D431201DFAC4FFD8169712937D +:102070001092681518966801580AE0800091500A7D +:10208000314BF01F0055400AC0A04D48E06C00FEE7 +:10209000F109005C2FF9F159005CCC286C148C59C3 +:1020A0003138F0091900E08B000F4CD8201D1AD8E8 +:1020B000E068022C1AD84CB84CBC1AD8F01F004B60 +:1020C0002FCDC0085C53E3E310815C71E961000926 +:1020D000A981E9610008158B1598B168F1EB1188A9 +:1020E00015ABF1EB108815BBF7E81008F00B1618CC +:1020F000E9680013E96B0010F7D8C208F1D8C108ED +:10210000E96B0011E9680012E81245005C72A892C0 +:10211000E4031608A883ED380008A8A8ED380009E4 +:102120004B39A8FCA8B8A8EC9208F7D8C010A8DBD7 +:10213000A98BA8CB2FF8B2085807C0D00F8B0FB9C6 +:102140000F98B168F1EB11880FABF1EB1088F3E851 +:102150001008C051EAC8FFFCEBF81001F00916188E +:10216000E968000FE969000CF3D8C208F1D8C1088A +:10217000E969000DE968000E3008E968000BE968BC +:10218000000A500A314B089CF01F001A5C7CE96C75 +:10219000000BA98CE96C000A400AC038781A2F0A93 +:1021A00048E8F10900482FF9F1590048158B1599B5 +:1021B000B169F3EB118915AB6A18F3EB108915BB04 +:1021C000F7E910091039C1910C9B0A9CF01F000A15 +:1021D000C26800008000CDD4000080D48003B3909A +:1021E0008003B3D880039D9C800094C40000734892 +:1021F00080011F4A8000CAF8EB08002C5808C0B0C4 +:102200008C49F0091900E08800070A9B0C9CF01F1C +:102210000006C0580C9B0A9C6A585D185C5C2FFD38 +:10222000D8320000800125A0D42149781896700783 +:10223000C1680E9CF01F0015C1100D8B0D98B16880 +:10224000F1EB11880DAB6E1AF1EB10886E290DBB06 +:10225000F7E8100814581268C1306E075807CEA16D +:1022600048B66C0C580CC040F01F0008C08148985C +:10227000F10900562FF9F1590056C0286C070E9C41 +:10228000D8220000000080CC8000CAE4000080D08A +:10229000000080D4D421204D1897503B149C502A24 +:1022A000501950084096F01F000D403B402A40193D +:1022B0004008C0A148A8E06C00FCF10900562FF9C5 +:1022C000F1590056C0881ADC0E9C1AD6F01F000582 +:1022D0002FED5C5C2FCDD82280012228000080D415 +:1022E00080012064D4314C05EB08004A2FF87817A0 +:1022F000EB58004A0F980F831694F1E31083189659 +:10230000E609160C3048F0091900C090F01F00379C +:10231000EB08005C2FF8EB58005CC2980FB8E7D3CD +:10232000C1040FA2A363F1E2108298585C82E60810 +:102330001900C0539848E4081900C0B20C9CF01F63 +:10234000002B4A98F10900522FF9F1590052C86840 +:10235000069B0E9CF01F00265C8CC0F00C9CF01FAE +:102360000023EB0800502FF8EB580050EB08004E0C +:102370002FF8EB58004ECD48F7D2C0100C9CEEC0A1 +:10238000FFF0F01F001C0895301249B10A9CF01FA5 +:10239000001BC1D0EAC8FFFCC1A06A185808C17070 +:1023A000EF3A0010EF390011B169F3EA1189EF3A01 +:1023B0000012F3EA1089EF3A0013F5E91009103919 +:1023C000C2A00A9B009CF01F000EC2515802E3F508 +:1023D0001000EBF5000030020835EBF50000580561 +:1023E000CD61C9F8000080D48000D13C80011F4A33 +:1023F0008000D210000080CC8000CAE48001255803 +:10240000EE03000307B807A9F1E910893448F00981 +:102410001900C2A0EF39000CEF38000DB168F1E9E6 +:102420001188EF39000EF1E91088EF39000FF3E859 +:102430001008C1B0089BEECCFFF4F01F003DC0A116 +:10244000EF38000CFC19E000B968E618F00012380B +:10245000C0C10C9CF01F00374B78F109004E2FF9DA +:10246000F159004EC5D808955805C0510C9CF01F75 +:102470000031C5680FE90FF8F1E91088F1D8C00EF6 +:10248000C0700C9CF01F002D1896C4A078174AC885 +:1024900091044AC8089B91070C9CF01F002BC3B104 +:1024A000EF3800095868C0B05918C0405818C11119 +:1024B000C0B8089B0C9CF01F0025C2D8089B0C9C40 +:1024C000F01F0023C288089B0C9CF01F0022C2381A +:1024D000089BEECCFFF0F01F0016C0F1EF380010A3 +:1024E000FC19E000B968E618F0001238C0608D17DA +:1024F000302B0C9CF01F00180C9CF01F000E48E8BD +:10250000F10900582FF9F1590058F109004E2FF93F +:10251000F159004E48A93008930848A99308D83AC1 +:10252000EF3800095918FE91FF77C6BB8001255886 +:102530008000D13C000080D4800129BC0000822CA6 +:10254000000082308000D588800115508000F37C27 +:1025500080011910800118FC19B9198A1998B168FD +:10256000F1EA118819AAF1EA1088F3E81008F0C915 +:1025700000015BD9E08800035EFFF7390035EDB953 +:102580000001C0E1761A1438C0B07629105A126AD8 +:10259000C0715CD9F3E8000812385F0C5EFC5EFD88 +:1025A000D431209D503B506A781B403AF519002CDD +:1025B000F2C80013502B5078214917EA17F8F1EAB6 +:1025C00010885C88109BF1D8C00DE21B2000984356 +:1025D000505B2143308B5018F20B0C0A1897F3DA3A +:1025E000B0105C8312985049A37830025C88314067 +:1025F0005088C938401B405AF1DBC00D14485008C0 +:10260000E3D3B010F1D3C01040791039E08900064F +:10261000400B4081ADBB500B300A314B302CF01FCA +:1026200000421894C3708E58313AF4081900E08BB8 +:10263000000F4BE8201D1AD8E06802C31AD84BC817 +:102640004BCC1AD8F01F003C2FCDC008314A402B8C +:10265000781CF01F003A6E19F1D0C010F208000883 +:102660006816EBD1B0108F188E58F0000100AE50F4 +:10267000C2188E52EA021900EA0217205C82C19049 +:10268000302A300B303CF01F0028C071089CF01F2E +:10269000002CE06C00FFC4586E18B842B852189B6A +:1026A00099180415089C5C85F01F00265805C02069 +:1026B0006E075805CDF1ED65000B40085C78ACF86D +:1026C000A988ACE8E2C8FFEC5C78ACB8A988314BCB +:1026D000ACA8ED65000A0C9CF01F001B5C7CED6C47 +:1026E000000BA98CED6C000A4039406A7258089BB7 +:1026F000129C5D18495BF70800302FF8089CF758CA +:102700000030F01F000F40180213404AE1D2B01011 +:1027100014085C835C8850185803FE91FF6D069C7A +:102720002F7DD8328000D3188003B4108003B45CAE +:1027300080039D9C800094C48002E7368000D13CD9 +:102740008000CD3480011F4A000080D4D40148F8B5 +:1027500070091839C04178099109C128580BC0E1A6 +:1027600048B8201D1AD8E06801341AD8489848ACF7 +:102770001AD8F01F000A2FCDC00878089708189BB8 +:10278000305CF01F0007D8020000734C8003B410C7 +:102790008003B47C80039D9C800094C48000C97435 +:1027A000D43118971696183BC0E14BC8201D1AD893 +:1027B000E06800A41AD84BA84BAC1AD8F01F003A16 +:1027C0002FCDC008580BC11076081838C0E04B3820 +:1027D000201D1AD8E06800A61AD84B484B1C1AD8FE +:1027E000F01F00312FCDC0086E156A1811CA11D91B +:1027F000F3EA1089C0303004C1D8118A1199109CB5 +:10280000B169F3EA118911AA11B8F3EA10891248E3 +:10281000314A8F18EECBFFF8F01F0025301B0A9CC1 +:10282000F01F00240A9CF01F002418940A9CF01F3B +:1028300000236E15C1486A1811B9118A119311A8A5 +:10284000B163E7EA1183E7E81083F3E31003F01FB5 +:10285000001A18040A9C0695F01F00180A9C5805D7 +:10286000CEB10C9B0E9CF01F001649689009F5D95B +:10287000C010083AC0E44898201D1AD8E06800C784 +:102880001AD84918487C1AD8F01F00072FCDC00865 +:102890000819089CB009D8328003B4108003B4989A +:1028A00080039D9C800094C48003B4A48002E7361A +:1028B000800118E88000CD0C8000D13C8001274CBD +:1028C000000073508003B4B8D431300618971692C4 +:1028D0004AB30C94300566080A9B0A9CC3E8EF3A99 +:1028E000000CEF39000DB169F3EA1189EF3A000EDF +:1028F000F3EA1089EF3A000FF5E91009705A123A1D +:10290000C1B1EF3A0010EF390011B169F3EA118952 +:10291000EF3A0012F3EA1089EF3A0013F5E91009D3 +:10292000706A123AC0910FCA0FD9F3EA1089906AFF +:10293000F20A1900C0D02FF5580CC090F13A001FD0 +:10294000F939001FF20A1800E08B0003109C70098F +:102950005809F00B171012985808CC21580CC04099 +:10296000F01F0008180658155F9804365F59F3E801 +:102970000008E8081800CAF10C9CD8320000734C1B +:10298000800127A0D42148C83007700CC108F9384D +:10299000001F7806F0C900015808C050F969001FEF +:1029A0001897C0480E9BF01F00050C9C580CCF01D7 +:1029B000D82200000000734C800127A0D431201DD4 +:1029C0004CD8F10900322FF9F159003278161895D8 +:1029D0000D835C83F3D3C004A3695949C080F10916 +:1029E00000442FF9F1590044E08F02570DF80DE132 +:1029F000F1E110810DB80DA24C07F1E21082F01F39 +:102A000000408E885C815C821894F808000858A801 +:102A1000E08A000D189B0C9CF01F003AC5708E8850 +:102A2000E808000858A8E08900524B783009700780 +:102A30005009C3D8ED39000CED38000DB168F1E94B +:102A40001188ED39000EF1E91088ED39000FF3E837 +:102A500010086E591039C291ED390010ED3800118F +:102A6000B168F1E91188ED390012F1E91088ED390A +:102A70000013F3E810086E691039C1710DC90DD843 +:102A8000F1E910888E69F0091900C0F149A8F1092F +:102A900000462FF9F15900460DE90DF8F1E91088CB +:102AA000F1D8C00DC360C3F850076E075807CC318A +:102AB000E08F021E089B0C9CF01F0012083CC065B2 +:102AC000305CF01F00121897C09148B8F109003C23 +:102AD0002FF9F159003CE08F01E0320A300B0E9CD7 +:102AE000F01F000B30394888EF69001F70098F090B +:102AF0009107C138000080D4000073508000CD0CD5 +:102B0000800128C80000734C8000C9D48002E8BC52 +:102B10008EF8F1D8C00DC070314A0C9BEECCFFF896 +:102B2000F01F004F4CF89009F20400045C84B004DC +:102B30000DE8A598EDB80000C120EF38001EE3D1E4 +:102B4000C00DE7D3C004A371E60310FCE20200024B +:102B5000A1A80602EF68001EEF52001C6A1811BB04 +:102B6000300A11AEF7EE108E118BB09AB0AAB0BA3F +:102B7000B08A1499F5DBC00411FBF40A10FC11ECC7 +:102B8000F7EC108CF9DCB00DA37CF7DCC010B0DBE7 +:102B9000A98B180EB0CB140E10935C8E3016F5DE98 +:102BA000C010B0FAA98AB0EA6E11029BC548761A25 +:102BB00015C015D2E5E010825C82E40C1900C292C7 +:102BC000F6021618B0BBB082E5DBC208F7DBC1081D +:102BD000B092B0AB5809E080008213E213FBF7E239 +:102BE000108BF60C1900E08300FF15DB15CAF7EA1D +:102BF000108AF40E1900E08B00F7EA0A1618B2B535 +:102C0000B28AF5D5C208EBD5C108B29AB2A5C6788A +:102C1000E40C1900E08000E815E015FBF7E0108BEC +:102C2000F60C1900E08300E05809C09013FB13E98B +:102C3000F7E91089E4091900F9B601001582159B1E +:102C40001499B16BF7E2118B15A215BAF7E2108B4C +:102C5000F5EB100B580BCAC1C52900008002E736FE +:102C60000000735013EB13FA11CCF5EB108A11DB53 +:102C7000F7EC108BF60A1900E088000F4BC8201DF6 +:102C80001AD8E068018E1AD84BA84BBC1AD8F01F8E +:102C9000003B2FCDC008EA0B1618B28BF7D5C2083F +:102CA000B2B5B29BEBD5C108B2A511CB11D9F3EBEC +:102CB0001089F20A1900F9B60100C1185801C0E0E4 +:102CC0004AB8201D1AD8E06801971AD84AC84AACF9 +:102CD0001AD8F01F002A2FCDC0088F15EF39001E1B +:102CE000EDB90000E08100E45806E08000E16E19D3 +:102CF000721A15CB15D9F3EB1089E08100D9118B2D +:102D000011951099B165EBEB118511AB11B8EBEB97 +:102D10001085F1E51005C1A807F86A1907EB13CC77 +:102D2000F1EB108B13D8F1EC1088F00B1900E08157 +:102D300000BF13881395B165EBE8118513A81293B2 +:102D4000EBE8108513B8F1E510055805CE61123A8D +:102D5000C1A14878201D1AD8E06801B91AD848984E +:102D6000485C1AD8F01F00052FCDC0088003B410AE +:102D70008003B4D480039D9C800094C48003B4F489 +:102D80008003B52C138A1398B168F1EA118813AA4D +:102D9000F1EA108813BAF5E81008C0E04C68201D6D +:102DA0001AD8E06801BB1AD84C484C5C1AD8F01FFE +:102DB00000452FCDC00813F813E9F1E91088EF0999 +:102DC000001C5C88F0091900C1704BB8201D1AD88E +:102DD000E06801BD1AD84BC84B9C1AD8F01F0039C7 +:102DE0002FCDC0080A9CF01F00394B9818143006EC +:102DF000B0040A9CC5982EC8EF58001C6E187016B7 +:102E00000D880D94B164E9E811840DA8E9E81084F7 +:102E10000DB8314AF1E41004EECBFFF80C9CF01F22 +:102E2000002DEF38001CACA8EF38001D0C9CED65A0 +:102E3000000BACB8ACE5ACF5ED65000A314BF01F0A +:102E400000265C7CED6C000BA98CED6C000A6E1604 +:102E5000C1586815089C3ECBF01F0020089B0C9CB5 +:102E6000F01F001F0B890BB80B94B164E9E91184C2 +:102E70000BA9E9E91084F1E410045804CEB10E9CCA +:102E8000400BF01F00180C9C49178E05F01F000F17 +:102E90001815AE05C0D849480A9CF109003630061D +:102EA0002FF9F1590036F01F0011C02830060C9C94 +:102EB0002FFDD8328003B4108003B53C80039D9C65 +:102EC000800094C48003B5608000CD0C0000735076 +:102ED0008002E73680011F4A8000CDD48000CD34C7 +:102EE0008001274C000080D48000D13C305CF01F72 +:102EF00000061897FE91FDF3FE9FFDDE5809FE9136 +:102F0000FEB3CDDA8000C9D4D4211898F937002E49 +:102F1000761E306CF8071800C0E04948201D1AD80A +:102F2000E06801B41AD84928492C1AD8F01F0012B9 +:102F30002FCDC008306C201C5C5CF20C0706FC0C2A +:102F40000007EF66000EF40C0706EF660014580C3D +:102F5000CF313089FD6C001BFD69001A109C706830 +:102F60005D185C5CD82200008003B5948003B5DC5A +:102F700080039D9C800094C4D4211897580CC0E114 +:102F800049D8201D1AD8E06800941AD849B849CC0D +:102F90001AD8F01F001C2FCDC00878185808C0E1BF +:102FA0004958201D1AD8E06800951AD84968494C3C +:102FB0001AD8F01F00142FCDC0086E186E06109C92 +:102FC0005808C0E148C8201D1AD8E06800991AD8EE +:102FD00048E848BC1AD8F01F000B2FCDC008F01FDE +:102FE000000C0E9B306C0C97F01F000A5806CE6147 +:102FF000D82200008003B5948003B62080039D9CF6 +:10300000800094C48003B62C8003B63C8000D13C81 +:103010008000C974D431201D500B1897580CC0C0C3 +:103020004D084D19118CF80815031818F2080028DE +:1030300070495829C0D030AA30094CBE129C1C924D +:10304000129B2ECE1298149314911490C1980F8A4B +:103050000F99B169F3EA11890FAA7018F3EA108980 +:103060000FBAF5E910091039CE714C08F109002E9C +:103070002FF9F159002ECE480C990A9C089B30A6D6 +:10308000EC031800C0A1FCF6FFFC5806C0611296C4 +:10309000189516941093C498FCF6FFFC5816C2417C +:1030A0005807C0F00F860F95B165EBE611850FA6A6 +:1030B000EBE610850FB6EDE5100564160C35C26021 +:1030C00064051D865805C080F2061800C2B3189525 +:1030D0001694109AC2A80C94F6061800C2331296E1 +:1030E00018951090C2285826C1D15807C1300F86B4 +:1030F0000F95B165EBE611850FA6EBE610850FB6CF +:10310000EDE5100564160C35C0514969109CB28874 +:10311000C9781D85F8051800C053129616941091B1 +:10312000C0481296189516942FF82E4E5C582E42D1 +:1031300030A9F2081800CA11F2031800C061400655 +:10314000EDB60000E081007B4005E2150002E08161 +:1031500000763098F0031800E089000A5C53C498A8 +:103160000000735200007354000080D430A8F001B6 +:103170001800C180E7D1C0084B38E60915030619CD +:10318000F00903285808C2304B08201D1AD8E068FF +:1031900001761AD84AE84AFC1AD8F01F002F2FCD22 +:1031A000C008F0001800C040E7D0C008C108E20A1B +:1031B0001800C4404A48E7DAC008E60615030616B8 +:1031C000F00600266C0CF01F00258D053098F003EA +:1031D0001800E088000F49D8201D1AD8E068018C3B +:1031E0001AD849F849BC1AD8F01F001B2FCDC008C7 +:1031F0004959E6081503300A0618F2080028F0C9F4 +:10320000FFF0930A5807C0D00F8B0FBA0F99B1691E +:10321000F3EB11890FABF3EB1089F5E91009911964 +:103220004899E60815030618F20800282F08300907 +:10323000069CB0C948B8B083C038E06C00FF2FFDD1 +:10324000D8320000000073548003B5948003B64C5C +:1032500080039D9C800094C480012F788003B66415 +:1032600000007352D431494730050E963EF42EC704 +:10327000ECC3FED40F882FF85C58AE88EEF9FFFC43 +:103280005829C061E8081800E08B0009C0F85819F7 +:10329000C0D1F2081800E088000A6C0C580CC0403D +:1032A000F01F00068D05EF45FFFC2E472E46063722 +:1032B000CE21D8320000735480012F78D431306889 +:1032C0001293189616951497F939002EF0091800E4 +:1032D000C0E04B78201D1AD8E06801DA1AD84B58A4 +:1032E0004B5C1AD8F01F00352FCDC008580BC5C055 +:1032F00017891798B168F1E9118817A9F1E91088C1 +:1033000017B9F3E81008C500189B0A9CF01F002CA1 +:103310001894C4A10B88FC19E000B968E618F00005 +:103320001238C420069B0A9CF01F00265C5CE80C47 +:103330001800C3C55C6C4A49F8081503302AF00C24 +:10334000010CF20C00289166F0C9FFF0930A0FDA25 +:10335000F16A000D0FCAF16A000C0FBAF16A000B96 +:103360000FAAF16A000A0F9A1095F16A0009ECC3DE +:10337000FFD10F8AB2C4F16A0008C0F87009701456 +:103380008B09F01F00120E99069A089B0C9CF01FE7 +:103390000010089CF01F000F6A08306C109B580842 +:1033A000CEE1109CD832E06C00F6D8328003B594A0 +:1033B0008003B67880039D9C800094C480012558CA +:1033C00080013014000073548000C97480012F08FC +:1033D0008000D13CD421189E580CC0E14958201DD2 +:1033E0001AD8E068024A1AD84938494C1AD8F01F4E +:1033F00000142FCDC008761AF4C8FFE4F137000F8F +:10340000F136000CF139000DF138000E782BB1695E +:10341000F3E61189F3E810897818EFE910091059DB +:103420001669C061F4CBFFD82ECAF01F0006D8225F +:103430008003B5948003A13880039D9C800094C4D0 +:10344000800132BCD431202D189616911495580C59 +:10345000C0E14CA8201D1AD8E068027F1AD84C8819 +:103460004C8C1AD8F01F00482FCDC00894593378DF +:10347000F0091900E08B000A4C48149CF109002265 +:103480002FF9F1590022C3087414E8C7FFE40F981C +:103490000F89F1E910893018F0091900C1E10FD83E +:1034A0000FC9F1E91089E0680604F0091900C1515B +:1034B0000FB80FA9F1E91089E0680800F0091900B8 +:1034C000C0C1E938001BE939001AF1E91089E06848 +:1034D0000806F0091900C0E04AC80A9CF109002852 +:1034E0002FF9F1590028F109001E2FF9F159001E9A +:1034F000CA184A68F109001A2FF9E8C3FFD6F15932 +:10350000001AFAC2FFFC304A069B049CF01F002000 +:10351000EF380018EF390019B169F3E81189EF3875 +:10352000001AF3E81089EF38001BF1E910096C1854 +:103530005808C0C01039C0A1049B3019E8CAFFDC8C +:103540000C9CF01F00143018C0A83009EECAFFF818 +:10355000FACBFFFC0C9CF01F000F30080FEA0FF9AC +:10356000F3EA1089301AF4091900C1503028F00923 +:103570001900C591C52800008003B5948003A138C7 +:1035800080039D9C800094C4000080D48002E736B4 +:10359000800132BC5808C4D03008AEE83028304A28 +:1035A000AEF8EECBFFF2EECCFFE8F01F0025304A7C +:1035B000069CEC0A000BF01F0022ED39002E30684B +:1035C000F0091800C0E049F8201D1AD8E06802D9B7 +:1035D0001AD849D849DC1AD8F01F001D2FCDC008D1 +:1035E000306820185C58EE080009F33B0008F36BC4 +:1035F0000012E808000AF56B000EE208070BF36BF7 +:103600000008E2080709F56900145808CEB10C9CBF +:103610006C680A9B5D18C0D80C9CFACBFFFCF01FAD +:10362000000DC07848C8F109002C2FF9F159002C81 +:103630000A9CF01F000A2FEDD83200008002E73606 +:103640008003B5948003B5DC80039D9C800094C406 +:103650008000B3B4000080D48000D13CD42178191C +:10366000F338001BF339001A1697F1E91088189601 +:10367000E0690800F2081900C070E0690806F20865 +:103680001900C231C1C8189B0E9CF01F00173E4B99 +:103690000C9CF01F0016C0E04958201D1AD8E068A5 +:1036A00004A41AD84938494C1AD8F01F00142FCD59 +:1036B000C0080E9B0C9CF01F0012C148189A169C63 +:1036C0002D1BF01F0010C0E848F8F10900282FF961 +:1036D000F1590028F109001E2FF9F159001EF01FC1 +:1036E000000BD82A800133D48000CDD48003B59458 +:1036F0008003B36C80039D9C800094C4800122E40D +:1037000080013444000080D48000D13CD431300AA0 +:1037100018941691303C338BF01F0042E8C8FFD15B +:103720001895580CC0A14C08E06700FFF10900246F +:103730002FF9F1590024C738985A3379F20A190041 +:10374000E08B000F4B98201D1AD8E06804311AD87E +:103750004B784B8C1AD8F01F00382FCDC008300999 +:103760007813E6C7FFE4AEE93019AEF93069E93AFB +:10377000002EF20A1800C0E04AC8201D1AD8E068DE +:1037800004391AD84AD84ABC1AD8F01F002B2FCDBA +:10379000C00830664AAB4ABA20165C56F006070CE1 +:1037A000EE060009F36C0008F606070CF36C001235 +:1037B000F406070CE6060009F36C000EF006070C91 +:1037C000F36C00145806CE913042EECCFFF2E802C2 +:1037D000000B049AF01F001C049A029BEECCFFE839 +:1037E000F01F00193069AED2AEC9AEB6AE863088D1 +:1037F000301AAEA8AE9AE769001BE768001A089C69 +:1038000068680A9B5D184888F10900182FF9EFDCF9 +:10381000C008F15900180A9CF01F000C0E9CD83209 +:103820008000D318000080D48003B5948003B6A034 +:1038300080039D9C800094C48003B5DC8003B71690 +:103840008003B58D8002E7368000D13CD4211694E8 +:103850001896189B1497089CF01F00541895E08147 +:1038600000DF09890998B168F1E9118809A9F1E92E +:10387000108809B9FC1AE000F3E810081099E6195D +:10388000F0001439E08000CC5808E08000C9301BFB +:10389000089CF01F00475C5CEA0C1800C0545807F5 +:1038A000E08100CBCC184C39EBDCB008EA081503FA +:1038B0000A18F20800282F0870095809F9B9000100 +:1038C000F1F90A004BB9EA0815030A18F2080028B2 +:1038D0007048F0C900015819E088000F4B68201D9E +:1038E0001AD8E06803A51AD84B484B5C1AD8F01FC9 +:1038F00000352FCDC00858185F0858075F09F3E856 +:103900001008C041E06400FFC078089B0C9CF01FC9 +:10391000002EE9DCC0085807E08000854A5AEA0911 +:1039200015030A19A369F409000870485828C0B1A2 +:103930002F890E9BF40900090C9CECCAFFD1F01FE3 +:103940000023C6B85818C6E110990E98905B904AAB +:10395000F40B1900C111700A580AC0E04968201D13 +:103960001AD8E06803C41AD84998495C1AD8F01FDD +:1039700000152FCDC008F13A000CF20A1800C05112 +:1039800070085808CE41C51890CB300A303CF01F63 +:1039900000111896C4F00E9BF01F000F5C5CC1F084 +:1039A0000C9CF01F000EC468800125588001301463 +:1039B000000073548003B5948003B6D480039D9CAB +:1039C000800094C48001370C80012F088003B6FC6E +:1039D0008000D3188000CF988000D13C306CF01F5D +:1039E000001AC170300899169908EA081503F00505 +:1039F00001054968F00500256A045804C07008985C +:103A000068045804CFD1910CC0288B0C089CD82294 +:103A10000C9CF01F000F089C5C5CD822E06C00F648 +:103A2000D822089C5C5CD8220E960E9CF01F0009E0 +:103A3000CD6B089C5C5C4888F10900242FF9F15992 +:103A40000024D8228000C9D4000073548000D13CE7 +:103A50008000CD1E000080D4D421202D169618970A +:103A6000149531CB0C9CF01F0027C0804A68E06C95 +:103A700000FE90592FF9B059C4180E9B0A9CF01FF4 +:103A80000023C3410B890B98B168F1E911880BA998 +:103A9000F1E910880BB9FC1AE000F3E8100810995E +:103AA000E619F0001439C0F13019BAA935E9BAC9DC +:103AB000F3D8C207BAF8BAD9A988BABCBAE8FAC921 +:103AC000FFFEC1586E1912586E291268C0906E38E8 +:103AD0005808C041E06C00FCC118EEC5FFF40C9A18 +:103AE0000A9B0E9CF01F000AC08848A90C9B0E9CE4 +:103AF000EECAFFD1F01F00085C5C2FEDD822000059 +:103B00008000CDD4000080D4800125588001384C3D +:103B10008003B58D80012F0878983019B0895EFC3C +:103B2000D4217897EF380024EF390025F0091800E8 +:103B3000C021D82AEE080028201D701630086C1904 +:103B40008CCA8CDB20EA1AD620EBF2CCFFF2F01FF5 +:103B500000182FED587CC0F0581CC0310C95C138AE +:103B6000EF3800242FF8F1D8C0030C9CEF68002434 +:103B7000F01F0010E06C00F4D8228ADB6A1CF01FF2 +:103B8000000E6A055805CFA1EF3800242FF8F1D8B0 +:103B9000C0030C9CEF680024F01F00064878E06C1E +:103BA00000F290092FF9B009D82200008001933467 +:103BB0008000D13C80013F7C000080D4D421204D86 +:103BC0001896F01F002D5806C5306C955805C50095 +:103BD0000B885808C4D0E0680600300ABA68E06B69 +:103BE0000600303CF01F00251897C3F03008FACBD0 +:103BF000FFF4AA88781CF01F00229A6B580BC35060 +:103C00005C7BFAC8FFF2FAC9FFFCFACAFFF86E1C27 +:103C1000F01F001C586CC2606E18402B101B40181F +:103C20005C5B0E9C100B5C7BF01F001749789019B1 +:103C30002FF9B0196E19F338001BF339001AF1E9A6 +:103C40001088E0690800F2081900C060E069080601 +:103C5000F2081900C0716C480C9B0E9C5D185C5CEE +:103C6000C0400E9CF01F000A0C9CF01F000A2FCDD4 +:103C7000D822000080013FA08000D31880013F5867 +:103C8000800192DC8000D210000080D48000D13C02 +:103C900080013B20D4211897580CC0E149B8201D61 +:103CA0001AD8E06801491AD8499849AC1AD8F01FC7 +:103CB000001A2FCDC008499899983778F9680036CE +:103CC00036C8F9680037496899584968189B996857 +:103CD000495CF01F0016496CF01F00163628EF688B +:103CE00000353068EECCFFD1EF68002EF01F0012D7 +:103CF000581CC040E06C00F4D822E06805DC300CB1 +:103D0000EF58002CD82200008003B71C8003A13894 +:103D100080039D9C800094C40000746C80013A581C +:103D200080013D5880013B1880013E6880013D388C +:103D300080018F4480019128D40116985C7A189BE9 +:103D40002F29109C5C79F01F00045C7CF9BC00FFFB +:103D5000D80200008000CEC4D42131B918977898D9 +:103D6000965AF20A1900E08B0005E06C00F4D822A4 +:103D7000F1390025F13C0024F2CAFFFFF5DAC00357 +:103D8000183AC041E06C00F2D822F16A0025F0092F +:103D90000028169C911B3F26F01F00050E9CF01F6B +:103DA0000005EC0C1800CFB0D82A00008000CD1E12 +:103DB00080013B20D42130061897E9DBC01030A5E4 +:103DC000C138EE060708201D48BC1AD8F01F000BAA +:103DD0002FED5806C080EC050C085809C041488CEE +:103DE000F01F00062FF60836CED5486CF01F0003F2 +:103DF000D822000080037AF0800094C48003B76862 +:103E0000800384D448CD48D0E3B00001D55348C0E6 +:103E100048C10230C06248C2A505A1240230CFD3F8 +:103E200048A048B10230C06230023003A122023003 +:103E3000CFE3488F000100008003760000000008F7 +:103E4000000009B88003F480000009B800008CC8A5 +:103E500080008EDCD4013018F96800087808580812 +:103E6000C030781C5D18D802D4014869930C931BAC +:103E7000F33800085808C040129CF01F0003DA0A0B +:103E80000000749880013E54D421201D1895169688 +:103E90001494300B30CA49DCF01F001D300B49DC94 +:103EA000F01F001D300B49DCF01F001D497B49DC71 +:103EB000F01F001D1897581CC0400E9C2FFDD822E3 +:103EC000F01F001A1897581CCF910C9B0A9C49862A +:103ED0008D07F01F00181897581CC04030088D0837 +:103EE000CEDB30088D08F01F00141897581CCE61E7 +:103EF000FACBFFFD302CF01F0011F9B701FFFBF8E2 +:103F00000803E9F80A00CDAB00007498800091D056 +:103F100080013F8C80018F3080013F3C80019F6099 +:103F200080013E54800144588001440C0000749488 +:103F300080018F488001443080014110D401169CDB +:103F4000580BC041F01F0004D802300B301CF01F8A +:103F50000002D80280014110D4014879F3380008EA +:103F60005808C021DC0A3008F3680008F01F00037D +:103F7000DA0A00000000749880014284D4015C7B5E +:103F8000F01F0002DA0A00008001433CD401169CB5 +:103F9000F7DAC010F01F0002D80200008001433C95 +:103FA000EBCD40C0203DF01F00164969F3380008F2 +:103FB0005808C04072085808C0402FDDE3CD80C0CB +:103FC000E0680100FAC6FFF4E06C01000CE8F01FA5 +:103FD000000E0C9B1897F01F000D9A5B580BC0A0A9 +:103FE0005C7BFAC8FFF81A99FACAFFFC0E9CF01F16 +:103FF00000080E9CF01F0007CE1B0000800140A4AB +:10400000000074988000920080013F58800192DC8B +:10401000800091E8D40148583019701CF1690009FA +:10402000700A5D1AD8020000000074A8EBCD40CCE5 +:10403000206D49A6FAC7FFF46C2E8F2EECE200002B +:10404000EEE3000016961093FACEFFF0580CC22053 +:104050007C08FC1C8000F1EC100BF4081509BBB8BF +:10406000F1E611C812481648301C9D08F01F000CDC +:104070000E9C30CA1A9BF01F000BFB38000AA68862 +:10408000FB39000B300CA699F01F00052FADE3CDD6 +:1040900080CC7C0BCE3B00008003B774800075B4ED +:1040A00080007534EBCD4080201D4987EF38000833 +:1040B000EDB80000C071EF3900093008F0091800B0 +:1040C000C0402FFDE3CD808030091A98129B129CCE +:1040D000305AF01F000F3FF91B88F2081800CF205C +:1040E0001B98EDB80001CEE13008301C109B302940 +:1040F000E06A00F0F01F000630186E1CEF6800093F +:104100006E095D19CDFB0000000074A88001402CF1 +:10411000EBCD40C0201D301AF40C1800C1B0C08394 +:104120003028F00C1800C2602FFDE3CFC0C01A97F2 +:10413000300630091A98E06A00F1129B301CF01F1B +:1041400000161B98EC081800CF51300C2FFDE3CD62 +:1041500080C018961A9730191A98E06A00F1300B4F +:10416000129CF01F000D1B98EC081800CF51300C6A +:10417000CEEB48A8F1390008F9D9C001F7FA1E00C2 +:10418000F9BC0100F9B8005AF7F80E002FFDE3CD95 +:1041900080C000008001402C000074A8EBCD406876 +:1041A00048F516961893AA4B301CF01F000E0A9C77 +:1041B000310A300BF01F000C069BF5D6C010300CF6 +:1041C000F01F0009304A300B488CF01F0007300CFC +:1041D000F01F00040C9CE3CD80680000000002107A +:1041E000800075B4800075348003B780EBCD40400B +:1041F00020ED30083009FAE90018FAE90000FAE980 +:104200000008FAE9001049BBFAC6FFD4762A8D2AC5 +:10421000F6E80000301CECE90000F01F0017320A3D +:10422000300B1A9CF01F00150C9C30CAFACBFFE033 +:10423000F01F0012300CF01F00103019FB38002A5C +:10424000F2081800C0503FFC2F2DE3CD804048C835 +:10425000F1390008F9D9C001CF8030083039304A2F +:10426000109B301CF01F00072F2DE3CF8040000073 +:104270008003B784800075B480007534000074A892 +:104280008001402CD42130094A881695F169000933 +:104290001896320BF01F00268C085CC82FE8F7D860 +:1042A000B010AA0BEFDCB010F6C90007E06805F902 +:1042B000F0091900E08B00300D890D98F208180004 +:1042C000C220F6071900C182E0640200F9D7C010CD +:1042D0005C7B181BEC0C000CE04B0200E80B17B0E9 +:1042E0005C7BF01F00138A0B0E0CEFDCB010EE0BA2 +:1042F0001900FE9BFFED48F83009118AF20A1800F8 +:10430000C0D1D8220DA8F2081800CDC10DB8F2080E +:104310001800CD813008AA08D822F5DBC010486CFF +:104320000C9BF01F0006D822000074A88001419C5D +:10433000000074A48003B76C8001447CD4314A38F7 +:1043400018921695118A3009F20A1800C3615805AF +:10435000C33049F83004F0C0FFF4E0610200C22825 +:10436000E06602000C970C93301CA006F01F0019A9 +:10437000300B497C314AF01F0018E404000C0E9AFF +:10438000300BF01F0015304A300B494CF01F001263 +:10439000300CF01F0010EA0601080604EBD8B0103C +:1043A000C0B0E2051900FE9BFFDDEDD5B010EFD6E1 +:1043B000C0100E93CDABD832F5DBC010189B488CE3 +:1043C000F01F0008CC5B0000000074A4000001FC9A +:1043D000800075B4800075348003B7808003B770A7 +:1043E0008001447CD401201D3009301C1A98E06AF9 +:1043F00000F5129BF01F0004314CF01F00042FFD4C +:10440000D80200008001402C800075D2D401F01F3A +:104410000007F01F0007C03030CCD802F01F0003A7 +:10442000F01F0003CFA1DA0A800143E4800141ECD0 +:10443000D401314CF01F0006F01F0006C03030CC14 +:10444000D802301CF01F0004DA0A0000800075D288 +:10445000800141EC80007618D4014878910C911BC2 +:10446000F0CCFFF8F01F0005F9BC010CF9BC00010D +:10447000D8020000000074A8800076385EFCD703E4 +:10448000EBCD40F849C56A096A181039C2F08B0CA7 +:10449000EAC7FFF0EAC6FFF4EEC30010EAC4FF70FB +:1044A0000F89EDB90000C091EDB90001C0616C0940 +:1044B0006A081039E08800082F072F060837CF1147 +:1044C000E3CD80F86E19300B169C5D190F883FDA2A +:1044D000F1EA0009EDB80002C0716609EEF8FFF8D4 +:1044E00012088D08CEABAE89CE8B5809CD118B1C2E +:1044F0008B0CCCFB000074B8EBCD408048CE1897F5 +:10450000300AFCCBFFF0F408150417892F88FC084B +:10451000000CEDB90000C0512FFA2F0B588ACF4183 +:104520003018F96800088F0AE3CF9080000074B853 +:104530002FFC4849A56C18091388A1D8B2885EFCE5 +:10454000000074B82FFC4848A56C30091808B089E1 +:104550005EFC0000000074B8EBCD40E0189E14979C +:104560001295587BE08B002C496AF6C8FFFFA568BE +:10457000F408000C1989EDB90001C1F0F608150422 +:104580001296F4080008A1B6F60915012FF9F409EE +:10459000093E740AB8869157FC0A000A913A5805F8 +:1045A000F9BC0001F9B90104EDD9E138F9F81E00B0 +:1045B000F9BC0101E3CD80E0E3CF80E0E3CFC0E0D0 +:1045C000000074B848387019700C121C5EFC0000B2 +:1045D000000074B85EFC300899085EFC1899780CED +:1045E000580CF9B80001F3F80A005EFC300899088D +:1045F0005EFC300899085EFC5EFC5EFC5EFC5EFCC6 +:10460000D401580BC110F80B000B300A487E7C090E +:10461000F40900092FDAF208141FB98810091019DB +:1046200018C9163CCF51D802000074B85EFD5EFF79 +:104630005EFF5EFF5EFF3FDC5EFC78082FF89908A6 +:104640005EFCD401780820189908C020D80A5D1BA8 +:10465000DA0A301899085EFCD401F01F0002D80273 +:1046600080016D6CEBCD406048784889F5DBC01067 +:104670001895189B7006720C5D160A9CF01F0004BA +:10468000E3CF906000007540000074B4800091E8B2 +:10469000D401E06A0088300B485CF01F0006F01F70 +:1046A00000064868300C9118910CD802000074B8CC +:1046B000800091D0800146C000008B545EFCD7037F +:1046C000D401F01F0011F01F0011301B4909169C86 +:1046D000490AF01F00114919491A301B303CF01FDC +:1046E000000EF01F0010300A301BE06C00F0F01FCD +:1046F000000EF01F000E300A302C149BF01F000C2F +:10470000D80A0000800148C0800147888003B79024 +:10471000800146BC800148548003B794800157A4AF +:104720008001499C800147E0800149F480014730C5 +:104730004828F00C092B5EFC00007548EBCD40E0EA +:104740004905189716966A085808C0205D1848E869 +:10475000F007032C580CC061C088F0061800C09008 +:104760002F8C19885808CFA16A085808C080C00843 +:1047700078193028F0091800FE9BFFF8E3CD80E09F +:1047800000007544000075485EFCD703EBCD40FC8B +:104790004935189630120A94EAC3FFF46A0858089B +:1047A000C0D068385808C19030185806CF805816C5 +:1047B000C0305808CF40E3CD80FC48976E28701970 +:1047C000703C700B5D196E2870296E188F29103996 +:1047D000EFF20A003008CEAB0697CF1B000084B47E +:1047E000EBCD40C018961497580BC24049789009F9 +:1047F000F6091900E088001BF60B00184949F20879 +:10480000002C781A74085808C171741E7428103E60 +:10481000C1507C283009951895099D369D07FD6B80 +:10482000001078089D18E3CD80C0307B305CF01F0D +:104830000009E3CD80C0741ECEDB306B305CF01F0E +:104840000005E3CD80C00000000002200000755C80 +:104850008001473CEBCD408049281497129E581B9D +:104860005F8A9009F80919005FB81468C130F80C24 +:10487000001AF60B0019F4CCFFFF48BB48B8F60A43 +:10488000002AF0090029952EF60C09299507E3CD99 +:104890008080302B305CF01F0006E3CD808000006C +:1048A000000002200000755C000084B48001473CD9 +:1048B000D401307B305CF01F0002D8028001473CFD +:1048C000EBCD404030084AB9B2884ABA940858083B +:1048D000C4D04AA95C784AABF00800184A9EA36885 +:1048E000300C2F88F6CAFFF4F20800082F89930CC9 +:1048F000F34AFFFCF34EFFF82F491039CF91F6CE63 +:10490000FFE84A1A49EB301C970C972A971A14981B +:10491000F4C9FED42EC8F148FFF41238CFC1F54ACD +:1049200001342F4BF4CAFEC01C3BCEF1E06A00807C +:10493000300B496CF01F00164948F0C9FF902F0852 +:10494000F148FFFC491A1238CFB130064918F54634 +:10495000007C910A9116310A0C9B48FCF01F000C58 +:1049600048E80C9C9106E3CD8040485BCC9B00005E +:1049700000007598000002200000755C000084B4FF +:10498000800148B0000082340000759C800091D006 +:1049900000007630000076200000761C4848485918 +:1049A000485A91099119913A912A5EFC000002241B +:1049B000800149D4800149EC48484859485A911926 +:1049C0009109913A912A5EFC00000224800149D4A9 +:1049D000800149EC48494858311AEA1A4000143C11 +:1049E0005E085E19800149D480014A0C481C5EFCB7 +:1049F000800149ECD4013019300A303BFC1C4000E6 +:104A0000F01F0002D8020000800186C8EBCD408074 +:104A10004B373099EA194000123CC310E088001F60 +:104A200030B9EA194000123CC2A0C4233139EA1956 +:104A30004000123CC500E069078AEA198000123C78 +:104A4000C241761CF01F0027300A4A77149B314C74 +:104A5000F01F00260E9CE3CD80803019EA1940003B +:104A6000123CC320E08800153079EA194000123C5E +:104A7000C0603089EA194000123CC0713019300A18 +:104A8000303BF01F001B49B70E9CE3CD8080FC1922 +:104A90004000123CCFA130194978300AF149004456 +:104AA000304C149BF01F00110E9CE3CD8080301918 +:104AB000300A303B30ACEA1C4000F01F000D48D7F4 +:104AC0000E9CE3CD8080302B300CF01F000C0E9C30 +:104AD000E3CD808048470E9CE3CD808080014A0C66 +:104AE0008001DA2C800149D480014658800186C8B3 +:104AF000800152F0000087F480018390D401201DD2 +:104B00001A9CF01F0008C07040085818E088000682 +:104B1000F01F00052FFDD802F01F00042FFDD80262 +:104B200080015F4480015EDC80015EB4EBCD40F823 +:104B3000201DFEF805EA189716951496103AC3A0A2 +:104B4000FEF805E0103AC610FEF805DC103AC06029 +:104B50000C970E9C2FFDE3CD80F8E068018CEA18DD +:104B60008000103CE08000F7E068078AEA188000C7 +:104B7000103CE08000ADE0680186EA188000103C3F +:104B8000CE8176170E9CF01F0169F01F0169C0915C +:104B9000FEF805A0EEEA0000F0EB00006E29912976 +:104BA0000C97FEFA0592300BFEFC0590F01F016495 +:104BB000CD1BF01F015F1894C4D1E0680184EA188E +:104BC00080001037E0800185E08B00D2E0680107AB +:104BD000EA1880001037E08001A0E0680183EA183D +:104BE00080001037CB616A170E9CF01F0156E080E1 +:104BF0000230FEF905523048F34800440E9B334C16 +:104C00000C97F01F0152CA6BFEF4053CE0680112DC +:104C1000EA188000E8F300F8103CC540E08B006320 +:104C2000E0680107EA188000103CE08000F7E068C7 +:104C3000010DEA188000103CE080010DE0680105DC +:104C4000EA188000103CC851761C1497F01F0140F0 +:104C5000C81BFEF304F2E0680188EA188000E6F45D +:104C600000F81037E08001B0E08B00ABE068018312 +:104C7000EA1880001037E080018BE0680184EA18B0 +:104C800080001037E080016EE0680107EA188000BC +:104C90001037FE91FF5F6A18303CF13B000BF01FAC +:104CA000012D3019300A303B30CCEA1C4000F01F97 +:104CB000012A300AFEF70470149B301CF01F0127F4 +:104CC000C49B761C1497F01F0126C44B6A1CF01F6E +:104CD0000125300AFEF70490149B314CF01F011F90 +:104CE000C39BE068018AEA188000103CE08000CB9A +:104CF000E068078AEA188000103CCE90E068011551 +:104D0000EA188000103CFE91FF2576150A9CF01FE2 +:104D100001170BC93048F0091800E08001BBE08B97 +:104D2000019B3008F0091800E08001BF6738301996 +:104D300011EAF20A1800E08001DD0A9CF01F010C64 +:104D4000FE90FF08300A0C97305C149BF01F0103A3 +:104D5000C01B76170E9CF01F0107F01F00F5C4F171 +:104D60000E9B33DC0C97F01F00F9CF4AE068018AF4 +:104D7000EA1880001037E08000BDE068078AEA1872 +:104D800080001037E0800099E0680188EA18800010 +:104D90001037FE91FEDF6A170E9CF01F00F7C0A0CF +:104DA000F01F00F63069FEF8039EFEF60376F14927 +:104DB00000440E9B336C0C97F01F00E4CCBAE06803 +:104DC000018EEA1880001037E08000B7E068078A9B +:104DD000EA1880001037FE90FF7BE068018AEA182D +:104DE00080001037FE91FEB66A160C9CF01F00E49E +:104DF0001897E0800114FEF7032ACACA3099FEF81A +:104E000003460C97F1490044FEFA032C300BFEFCDC +:104E10000372F01F00CBC9EA76150A9CF01F00DA76 +:104E2000302B169CF01F00D9FEF702FCF01F00C0CB +:104E30001896E08100DD0A9B337CF01F00C40C9AB9 +:104E40003019303B30ECEA1C4000F01F00C3FE9FDD +:104E5000FE8276160C9CF01F00CE302B304CFEF7F5 +:104E600002C6F01F00CAF01F00B2E08000EC30194B +:104E7000300A303B310CEA1C4000F01F00B7FE9FA7 +:104E8000FE6A76150A9CF01F00BE1897E08000BAF3 +:104E9000300A302C149BF01F00B13078E9480044F0 +:104EA000F01F00A3FE91FE560A9B0C9733BCF01F27 +:104EB00000A7FE9FFE506A1CF01F00AA089AFEF78A +:104EC00002A6089B314CF01F00A5FE9FFE446A1706 +:104ED0000E9CF01F00B0C060FEF9026C3058F34821 +:104EE00000440E9B335C0C97F01F0098FE9FFE332E +:104EF0006A170E9CF01F00A2C0803069FEF80248BD +:104F0000FEF60220F14900440E9B33BC0C97F01FC3 +:104F1000008FFE9FFE206A1B337CF01F008C089AD6 +:104F2000FEF702043019303B30ECEA1C4000F01F61 +:104F3000008AFE9FFE106938301911EAF20A180043 +:104F4000FE90FE086A1CF01F0094FE91FE03189A62 +:104F5000189BFEF70246301CF01F0080FE9FFDFBF1 +:104F60006A150A9CF01F008B1897E08000874F2A73 +:104F7000300BFEFC022AF01F00721897E08000AE92 +:104F800030580C97E7480044FE9FFDE56A150A9CDF +:104F9000F01F006C1897E08000956938301911EA0D +:104FA000F20A1800FE91FDD64E3A300B4FDCF01F8E +:104FB00000641897E08000A930480C97E748004447 +:104FC000FE9FFDC96A160C9CF01F006B1897C2600B +:104FD000F01F006A30684D37E7480044FE9FFDBB74 +:104FE000EACBFFFC301A30DCF01F005C3019300ACD +:104FF000303B30CCEA1C4000F01F0057FE9FFDAB59 +:10500000F01F004BFE90FF4E0E9A3019303B30CC13 +:10501000EA1C4000F01F0050C44B303B30CCEA1C6F +:10502000400030190E9AF01F004C0DEB304CF01F71 +:1050300000490E9A0E9B301C4BB7F01F0048FE9F94 +:10504000FD8A0C9B33ACF01F0041FE9FFD844D3662 +:10505000FE9FFDD63068F0091800FE98FE693828DA +:10506000F0091800FE91FD76300A0C97325C149B13 +:10507000F01F003AFE9FFD6F189A303B30CCEA1CBF +:1050800040003019F01F0034EB3B000D303CCD0BDD +:105090003008FACBFFFC0C9716F8301A30ECF01FF2 +:1050A000002FFE9FFD580A9CF01F003FFE90FD520E +:1050B000300A0C97306C149BF01F0028FE9FFD4BAC +:1050C0000BCB302CF01F00230E9A0E9B301C4B375D +:1050D000F01F0022FE9FFD3F189A303B30CCEA1CA7 +:1050E00040003019F01F001CEB3B000D301CCA0BB8 +:1050F00048D7F01F000FFE91FF750A9B338CF01FFD +:105100000013FE9FFD28189A303B30CCEA1C40006B +:105110003019F01F00110BCB301CC8AB800152F0CE +:10512000800151A8800156388001D9AC800185E406 +:105130000000763880018E9C8001E03C8001EF20E9 +:105140008001E88C000087F480016D6C8001E2D45E +:1051500080018390800186C8800146588001E00864 +:105160008001DA2C800149D48001E2FC80016D4A83 +:105170008001D9C88001E4D080014AFC8001E4307C +:105180008001E0D48001D9FC800183A08001D9E8AE +:105190008001E81C8001E3DC80014A0C8001E7B853 +:1051A0008001E58880016D48EBCD40C04C96189792 +:1051B0003138EA184000103CE0800087E088002485 +:1051C000E068010DEA188000103CC150E088004002 +:1051D000E0680115EA188000103CC0D0E068018A40 +:1051E000EA188000103CC070E0680112EA188000E4 +:1051F000103CC3910E9C4B7AF01F003718960C9C04 +:10520000E3CD80C03018EA184000103CC510E0889B +:10521000002E30D8EA184000103CC1003108EA18CE +:105220004000103CC3F030C8EA184000103CC1B147 +:10523000301C302BF01F00290E9C3019300A303BF7 +:10524000F01F00274A760C9CE3CD80C0E068010582 +:10525000EA188000103CCCF0E0680107EA188000F2 +:10526000103CCC900C9CE3CD80C0E04C008ACC304C +:10527000FC184000103CCF71307949B8300AF14930 +:105280000044149B302CF01F0019300A30FC149B92 +:10529000F01F0016302B300CF01F00100C9CE3CDDB +:1052A00080C0303C302BF01F000D0E9CCC7B48E9B9 +:1052B0007298ABC8300A9398149B303CF01F000BD7 +:1052C0000C9CE3CD80C048A60C9CE3CD80C00000C0 +:1052D000800151A880014B2C800183A0800186C8E9 +:1052E00080015638000087F480014658800149D477 +:1052F000D421FACD00E4FEF602E21898FEF502E0B1 +:10530000ECF700F83109EA194000123CE08000D5C2 +:10531000E08B003630A9EA194000123CE08000C260 +:10532000E088005330C9EA194000123CE08000A830 +:10533000C6A330D9EA194000123CE080011930F9C7 +:10534000EA194000123CC3D1FEFA0298300BFEFC71 +:105350000296F01F00A61896C341189BFEFA02841D +:10536000FEFC028CF01F00A1304C301BF01F00A18E +:105370000C9A0C9B301CF01F00A0C238E06901841D +:10538000EA198000123CE0880011E0690188EA19FE +:105390008000123CC100E08B00A5E0690186EA199B +:1053A0008000123CC0E1C078E0690183EA19800006 +:1053B000123CC363109CFEFA0226F01F0090189561 +:1053C0000A9C2C7DD8223079EA194000123CC7C0D3 +:1053D000E08800973089EA194000123CE08000CF55 +:1053E0003099EA194000123CCEC14FEA300BFEFC66 +:1053F000020EF01F007E1894E08000CF3048ED4888 +:105400000044CDFB4F7A300B4FECF01F0078CD916C +:10541000189A189B4FC5301CF01F0077CD2BE06900 +:105420000107EA198000123CCC60E0690115EA1915 +:105430008000123CC1203139EA194000123CCC11E5 +:10544000300A301C149BF01F006C300A304C149B47 +:105450004EE5F01F0069CB5B6F38301911EAF20A94 +:105460001800C72076160C9CF01F00690C9CF01FDA +:1054700000694E98580CF0051710CA3B303B3019A4 +:10548000300AF01F0066302B303CF01F005A300A03 +:10549000301C149BF01F00584E150A9C2C7DD822FE +:1054A0004D0A300B4DFCF01F00511897C3B0305817 +:1054B000ED480044C86B303B3019300AF01F0057EC +:1054C000302B304CCE3B6C9BE21B0040C2414C5A0F +:1054D0004D5CF01F0046C9D03028ED480044C71B82 +:1054E000E069018AEA198000123CFE90FF65E069DC +:1054F000018EEA198000123CFE91FF64C5CBFC19B5 +:105500004000123CFE91FF5E300A149B149CF01F79 +:10551000003AC57B300A4BC5149B301CF01F003687 +:10552000C50B30481A9BBAE8336CF01F00400E9A46 +:105530003019303B30ECEA1C4000F01F00384B893A +:105540004BB89119C3EB76170E9CF01F00310FC9B1 +:105550003068F0091800FE9BFF354B15F01F003531 +:10556000C2A10E9B338CF01F0031C2BB4AC530195B +:10557000300A303BF01F0029C24B49AA300B4AAC1D +:10558000F01F001ACAA1304849F5BAC81A9B334C1B +:10559000F01F0026C16B306AEECBFFE2FACCFFFCB5 +:1055A000F01F002530481A9BBA68335CF01F001FBB +:1055B000089ACBFB3019300A303B30CCEA1C400053 +:1055C000F01F00160FCB305CF01F000A300A301CB1 +:1055D000149BF01F0009CF5A000087F4800152F09D +:1055E00080018E9C8001E7548001EF208001E03C27 +:1055F000800183908001465880014B2C8001E58812 +:105600008001DA5480014A0C800149D48001E2FC17 +:1056100080016D48800151A8800186C880015638FC +:105620008001E7B88001EA8C80016D6C00000224E3 +:10563000800185E48002E736EBCD40804C9731084D +:10564000EA184000103CC6F0E088001DE068018CBC +:10565000EA188000103CC3B0E088002EE068019397 +:10566000EA188000103CC440E0680194EA18800009 +:10567000103CC2714BC7761CF01F003C0E9CE3CD62 +:10568000808030C8EA184000103CC400E088001D4B +:1056900030D8EA184000103CC21030E8EA18400048 +:1056A000103CC0F14B2A300B4B2CF01F00330E9CEA +:1056B000E3CD8080E0680186EA188000103CC0706D +:1056C0000E9CE3CD8080E04C008ACFB14A5AF01F97 +:1056D000002B18970E9CE3CD8080F01F00294A4ACA +:1056E000300B4A8CF01F00240E9CE3CD8080761C8A +:1056F000F01F0025F01F0025C0514A5B33CCF01F7E +:10570000002549970E9CE3CD80804A39731858983C +:10571000CD803098496AF3480044300B49FCF01FB3 +:105720000016CCFB49C973185888CCB03088F348B0 +:105730000044F2F900F87338301911EAF20A18003F +:10574000C0A03019300A303B30DCEA1C4000F01FAA +:105750000014CB7B486A300B492CF01F0007CB1B91 +:105760008001563880014A0C8001DA4680018E9C07 +:105770008001E03C8001EF2080014B2C80015E34F1 +:105780008001DA448001DA48800185E4000076383F +:1057900080016D6C000087F48001E0D4800186C830 +:1057A0008001E094EBCD40F84A37189416956E18B6 +:1057B0006E090E930E96C118300B301CEA1C400087 +:1057C0005D19300B6C39FC1C40005D196C388D285C +:1057D0006E186E091238C2001039C190300B301C9F +:1057E000EA1C40005D19300B6E19FC1C40005D196D +:1057F0006E188F086E296E381039CDF10A9B089CFF +:105800005D19873C6629123CCF71CE3B0A9B089CF0 +:105810005D198F1CCF0B5805C0706A085818C060FE +:105820000A9CF01F0006E3CD80F8EACCFFFCF01FD5 +:105830000004CF7B00000224800091E88001D3A8FF +:105840004878F14C00F8580CF9F81004F9B9010146 +:10585000F1D9E108F9F81A045EFC0000000087F4B1 +:10586000EBCD40C04948FAC6FFF4F0F700F4580702 +:10587000C051C1E8F8C70008C1B0EECAFFDC740827 +:10588000204D502815C9FB69000C15D8FB68000D88 +:105890006C0850080DC9BAC90DD8BAD8F01F000756 +:1058A0002FCD580CC0516E2C580CCE5118970E9C11 +:1058B000E3CD80C0000087F480018898D40149D9E5 +:1058C000F2F800F41838C0B078285808C2B0784808 +:1058D000201899482F8CF01F0018D802580CF9F89E +:1058E0001004F9BA01FFF1DAE108F9F81A043008F6 +:1058F000F34800F448FA78285808C180F0C9000835 +:10590000F54900F4CE8072482FF89348F4F900F47A +:105910005809CE10724820182F8C9348F01F0006AB +:10592000D80278385808CD41D802F54800F4CD3B6C +:10593000000087F48001F2A0D4014989F2F800F058 +:105940001838C0A078085808C240784820189948EC +:10595000F01F0013D802580CF9F81004F9BA01FF2F +:10596000F1DAE108F9F81A043008F34800F0780A8F +:10597000F34A00F0580ACED074482FF89548487979 +:10598000F2F900F05809CE50724820189348CE1B07 +:1059900078185808CDB1CDFB000087F48001F2A043 +:1059A000EBCD40801897580AC2C07858F608010815 +:1059B0001438E08800274948F0FB00F8580BC190E4 +:1059C000F8CAFFDC15D8204DFB68000D740950297A +:1059D00015C8F6CAFFDCFB68000C7408500815C92E +:1059E000BAC915D8BAD8F01F00092FCD580CC091EC +:1059F0000E9CF01F00070E9CF01F0006E3CF908066 +:105A0000E3CF8080000087F48001889880015938B6 +:105A1000800158BCD4214A141895E8F700F05807C3 +:105A2000C27079383006704AC02810976F387049B4 +:105A30001439E08A00086E080E965808CF710E9649 +:105A400010970A37C0D06A085808C0B00A9CF01FE7 +:105A500000145806C1300A9B0C9CF01F0012D8227B +:105A60006A185808CF416A482FF88B48CF3BE94C59 +:105A700000F078482FF89948D8220A9B0E9CF01F16 +:105A800000090E9CE94500F0F01F00050E9B0A9CE2 +:105A9000F01F0004D8220000000087F48001F2A06B +:105AA0008001F28CEBCD40C04A48FAC7FFF4F0F613 +:105AB00000F05806C051C3D86C065806C3A06D3814 +:105AC000707C2F4CF8E80000212DFAE90024F8EA58 +:105AD0000008FAEB002CF8E80010FAE90034F8EAC4 +:105AE0000018FAEB003CF9380020FB680044F93953 +:105AF0000021FB690045EEE80000FAE90000EEEA4B +:105B00000008FAEB0008EEE80010FAE90010EEEAEF +:105B10000018FAEB0018EF380020FB680020EF397E +:105B20000021FB690021F01F00062EED580CCC501F +:105B30000C9CE3CD80C00000000087F48001891038 +:105B4000EBCD40E0205D7608502817C9FB69000CBA +:105B500017D81697FB68000DF8CBFFE2306A18964D +:105B60001A9CF01F0034F01F00342FCD580CC05188 +:105B7000300C2FFDE3CD80E06E7C2F4CF8E8000068 +:105B8000212DFAE90024F8EA0008FAEB002CF8E8E5 +:105B90000010FAE90034F8EA0018FAEB003CF93892 +:105BA0000020FB680044F9390021FB6900456D388D +:105BB000707C2F4CF8E80000FAE90000F8EA0008D1 +:105BC000FAEB0008F8E80010FAE90010F8EA00180B +:105BD000FAEB0018F9380020FB680020F9390021A1 +:105BE000FB690021F01F00152EED580CCC20320B64 +:105BF000300CF01F00131895CBC0189A0E99491B52 +:105C0000F01F00110BF93008F0091800EDF800132F +:105C1000F1F90807EBF90E07FACCFFFC6D3818D83C +:105C20001A9CED45004CF01F0009301CCA3B0000D7 +:105C30008002E73680018898800189108001D8DCD5 +:105C40008001D3EC8001AD408001D3A8EBCD40C0F2 +:105C500049C649D86C09700A1439C05530070E9CE2 +:105C6000E3CD80C0350CF01F00191897CF906C0859 +:105C70002FF8350A8D08300BF01F0015320B300C51 +:105C8000F01F0014EF4C004C1898C16030084929EF +:105C90008F680E9CF30A017C8F28EF5A001CEF6876 +:105CA000002A8FF88F488F58EF4800408F188F08D0 +:105CB0008F38E3CD80C00E9C1097F01F0008CD0BED +:105CC000000076440000025880009200800091D0CD +:105CD0008001D8DC00000260800091E8EBCD4080BC +:105CE000189778485808E08A0004E3CD8080793816 +:105CF0005808C0402B4CF01F000648697208201855 +:105D00000E9C9308F01F0004E3CD80808001D3A88F +:105D100000007644800091E8D4014899F2FC00F834 +:105D2000580CC0A07848201899483008F34800F86B +:105D3000F01F0004D802F34C00F8D802000087F4EA +:105D400080015CDCEBCD40F84B131894E6F700F8CB +:105D50005807C060189B0E9CF01F002EC1D1E6F7BB +:105D600000F05807C4203006C1285806C0706F38AC +:105D70006D39704A7248103AC064E6F800F80E387F +:105D8000EE0617106E070E955807C0900E9C089BE4 +:105D9000F01F0020CEB00E9CE3CD80F8F01F001E57 +:105DA00058065F18580C5F0918971069EA0918001F +:105DB000C201089B306AEECCFFDCF01F0018089B84 +:105DC000306AEECCFFE2F01F00156F3A0899149C80 +:105DD000493BF01F001430080E9C8F088F18F01FED +:105DE00000120E9CE3CD80F8F01F000B1897CE2B0D +:105DF0000C9CF01F000E0C9CF01F000D0C9CF01F63 +:105E0000000DF01F00051897CD51CC6B000087F4F2 +:105E100080015B4080015C4C800091DC8001D3EC10 +:105E20008001AD4080015A1480015938800158BC6E +:105E300080015CDCEBCD40E04905EAF700F458074F +:105E4000C0D1C158F0C600080E9CF01F000D0E9C7A +:105E5000F01F000C5806C0B00C976E285808CF31C0 +:105E60000E9CF01F00070E9CF01F00063008EB4848 +:105E700000F4E3CD80E00000000087F4800158BC0E +:105E800080015CDC580CC04078185B98C110489ABF +:105E900074991298EDB90001F9BC0101F9BB001029 +:105EA000F3DBE038F5F80A09F9BC00015EFC5EFDA1 +:105EB000000087F4489A7498109CF0091604E21CBC +:105EC0000002F9BB0110F1DBE138F5F81A09F9B865 +:105ED0000101F3D8E12C5EFC000087F4489A749825 +:105EE000109CF0091604E21C0002F9BB01EFF1DB83 +:105EF000E128F5F81A09F9B80101F3D8E12C5EFCA4 +:105F0000000087F448887099129CA589E21C000261 +:105F1000F9BA0101F3DAE148F9B90101F1D9E12C4B +:105F20005EFC0000000087F418994868709CE21C31 +:105F30000002F1F8103FF3F81A00F9BC01015EFC11 +:105F4000000087F418994868709CE21C0002F1F880 +:105F50001041F3F81A00F9BC01015EFC000087F45F +:105F600018984859729CE21C0002F3F81A41F9BCD7 +:105F700001015EFC000087F44839300C7298A7C814 +:105F800093985EFC000087F44839300C7298A5D8CD +:105F900093985EFC000087F4D401E06A0100300BA6 +:105FA000482CF01F0003DA0A00007648800091D0E8 +:105FB000EBCD40C04A0A18967498109CE21C00026F +:105FC000C1D0F4F700F85807C1801099E2190020F9 +:105FD000C270A5C8A7A8F4FB00BC95983009497AFF +:105FE000E06CEA60F01F00163008F0061800C100EF +:105FF0003018F0061800C040301CE3CD80C0311CC2 +:10600000EECBFFE2306AF01F000FE3CF90C0312CDF +:10601000EECBFFE2306AF01F000BE3CF90C0A5B8D3 +:10602000F4FB00B89598E06CEA60487AF01F000431 +:10603000CDCB0000000087F480015F7880014558D7 +:106040008001465880015F88D401F01F0002D80209 +:1060500080018040D40148687098E2180002C03185 +:10606000109CD802F01F0003D8020000000087F443 +:10607000800183FCD40148687098E2180002C031A6 +:10608000109CD802F01F0003D8020000000087F423 +:10609000800183D8D431FACD0188E06A0168300BE1 +:1060A0001A9CF01F002CFAC6FE541A901A9CF01F7E +:1060B000002A581CC03029EDD832FAC5FFF8401824 +:1060C000F0081016EA0800081035C4120A97FAC43E +:1060D000FE98ECC1FFF8C09840182EA7F0081016E3 +:1060E000EA0800081037C3326C08204D50280DC94B +:1060F000FB69000C0DD80E9BFB68000D306A1A9CE2 +:10610000F01F0016F01F00162FCD580CCE60EECBFE +:10611000FFFA310AFACCFE88F01F0010E2E8000016 +:10612000310AE8E90000089BE2E20008FACCFE88A8 +:10613000E8E30008F01F000BCD01189B316A0E9CAC +:10614000F01F0004009CF01F0008CB6B29EDD83A2B +:10615000800091D0800160748002E73680018898C9 +:106160008000917C80016054D431FACD018CE06ACA +:106170000168300BFACCFFFCF01F0050FAC5FE504E +:10618000FACCFFFCF01F004E581CC03029DDD8327D +:10619000402858F8E088007FF0081016FAC1FFF494 +:1061A000E20800081031E0820087E06801685018BA +:1061B000EACBFFF8FAC6FFF002973004FAC0FE946B +:1061C000500BC0C85804C36040282EA7F008101612 +:1061D0002EA6E20800081037C4926A08204D502805 +:1061E0000BC9FB69000C0BD80E9BFB68000D306AD5 +:1061F0001A9CF01F0034F01F00342FCD580CCE3005 +:10620000ECCBFFFE310AFACCFE84F01F002E400BCF +:10621000F6E80000310AE0E90000FACCFE84F6E27C +:106220000008009BE0E30008F01F0028CB005804A2 +:10623000CCC10F89E8091800CC810F98F20818002A +:10624000CC410FA9F0091800CC010FB8F2081800D2 +:10625000CBC10D89F0091800CB810FD8F2081800C6 +:10626000F9B40100EE041700CB0B5804C2400A9B9E +:10627000306A089CF01F0013EACBFFF8310AE8CC23 +:10628000FFFAF01F0010FACCFFFCF01F001129DD0F +:10629000D832F00A1110FAC1FFF4F40A1016E2081D +:1062A000000C300BF01F00053108E0690168502830 +:1062B0005019C7FB3FDCC6BB800091D080016074E1 +:1062C0008002E736800188988000917C80016054CC +:1062D000EBCD40C0208DBACBBA8A189B4968709C20 +:1062E000E21C0002C06118970E9C2F8DE3CD80C088 +:1062F0003008FAC6FFF8504850281A99FACAFFFC2D +:106300000C9CF01F000EC111189740285808C0407F +:106310000C9CF01F000B404C580CCE70F01F000975 +:106320000E9C2F8DE3CD80C00C9CF01F0007581CE5 +:106330005F07CECB000087F48001E1308001D3A855 +:10634000800091E880018E9CEBCD40C0201D491754 +:1063500018966E9CE21C0002C0412FFDE3CD80C068 +:106360001A9CF01F000DEF4600FCEEF801105808D3 +:10637000C051301C2FFDE3CD80C0EECCFEECEF3AD7 +:10638000011BEF3B011AF01F0005301CCF4B000032 +:10639000000087F4800177A4800162D0EBCD4080BB +:1063A000201DBA8C48C76E98EDB80001C0402FFD83 +:1063B000E3CF808030181A99300A308B487CF01F68 +:1063C0000008581CCF511B88EF4801202FFDE3CD5A +:1063D00080800000000087F48003B7A08001776C04 +:1063E000D401201D48B91898729CE21C0002C0E03C +:1063F000300AF368004C308BFAC9FFFC486C12F885 +:106400003018F01F0006581C5F0C2FFDD80200004A +:10641000000087F48003B7A88001776CD401203D89 +:10642000BA8C496A749CE21C0002C0312FDDD8028C +:106430001B8B3038F00B1800E089001DE06832003B +:10644000EA18312EE069352EEA19312EFAE90004F6 +:10645000F4F800F8F3DBB008300A5808F1F91A0F25 +:10646000308B30181A99FACCFFFCF01F0005581C2D +:10647000CDE03FECCDCB0000000087F48001776CCD +:10648000D421206D4A0618976C98EDB80001C040E1 +:10649000300C2FADD822584C5FB8E04C00FF5F198C +:1064A0001268C0303FECCF6B300814995028169A10 +:1064B0005008189B1A951A9CF01F0014CEA01A9C25 +:1064C000F01F0013400818945808C0401A9CF01F91 +:1064D0000011402C580CC030F01F000F5814CD9103 +:1064E0006C98EDB80007C0C15837E08B000AEE0881 +:1064F000150648A9300A1009089C930ACCBB301C29 +:10650000CC9B0000000087F48001E1A480018E9CF8 +:106510008001D3A8800091E800007648EBCD40C010 +:10652000202D496718966E98E2180002C2103FF8B5 +:10653000FACAFFFEBAF8BAA8BAB8BAC8BAD8BAE85E +:10654000300BF01F000F6E98EDB80007C0E1583611 +:10655000E08B000CEC081506300A48A9301C100925 +:10656000930A2FEDE3CD80C02FEDE3CF90C0109CB8 +:106570002FEDE3CD80C00000000087F4800164802F +:1065800000007648EBCD40C0202D49F66C9CE21C03 +:106590000002C2703FF8BAF8BAA8BAB8BAC8BAD8F6 +:1065A000BAE8ECFB00F8580BC260F6CCFFE2303AD8 +:1065B000300BF01F0016FAC7FFFE301CF01F00144E +:1065C000303B0E9A300CF01F00136C99300B129870 +:1065D000ED4B0110A3D88D98EDB90007C050301CC9 +:1065E0002FEDE3CD80C0E06A010048BCF01F000B36 +:1065F000301CCF7BFAC7FFFE303A0E9CF01F000321 +:10660000CDDB0000000087F4800162D08001651CB2 +:106610008001648000007648800091D0D43120DD74 +:10662000FB690010FB68000CFAC9FFA8FEF7023CEA +:1066300018956E981696149272307201E218000244 +:1066400072147223C041300C2F3DD832E04B002031 +:10665000E08800043FFCCF9B584CE08B002158DBC6 +:106660005FBA301BFB380010F60818005F09126A89 +:10667000C030580CC1413078FACCFFD4FB680033ED +:10668000F01F007B3008303C50785058F01F0079E4 +:1066900058D6C070E08B00315856C0303FECCD5B0F +:1066A00030683019FB680033EF49011CFACCFFCD8C +:1066B000F01F0071501C1AD31AD41AD1FB38001CD9 +:1066C00004991AD80C9AFB380043FACCFFDC0A9BD9 +:1066D000F01F006A2FCD580CC1B140585808C05067 +:1066E000FACCFFECF01F0066407C580CCAD0F01FBB +:1066F0000065300CCAAB5906C6C0E0460020CCF19C +:1067000030283029FB680033EF49011CCD0BFACC4F +:10671000FFECF01F005D500C40585808C050FACCF8 +:10672000FFECF01F0057407C580CC030F01F0055A4 +:1067300040085818C8915800EFF81009F9B9010835 +:10674000F1D9E138EFF81A093009FB380010F208E6 +:106750001800C051F9D5B008F01F004C6E98EDB884 +:106760000001C0514C18F0F800FC501840185808AF +:10677000C080FB3A0010FB3B000C089CF01F00445B +:10678000306A089BEECCFEECF01F0042301AFACBC8 +:10679000FFF4EECCFEE6F01F003FEECCFEE5301A33 +:1067A000FACBFFF0F01F003B3018EF480110FB68F8 +:1067B00000326E9C4AD7EDBC0001C120EDBC000741 +:1067C000C061FB38000C50285845C1E1301CC3DBC8 +:1067D00030483039FB680033EF49011CC68B300864 +:1067E0004ADB1099109A109CF01F002CC3401ADC51 +:1067F0003018FAC9FFCA300A308B4A9CF01F0029B2 +:106800006E9C2FFDCDCBEA0915064A780C9AF0094B +:106810000007049BEF650026EF560024EECCFFFC3A +:10682000F01F001C089BEF610036306AEECCFFD8E9 +:10683000F01F00185803C110069B308AEECCFFD21F +:10684000F01F001440288FF0EF68003830188F08D0 +:10685000109CCFBA6E9CCB3B069B308AEECCFFD20D +:10686000F01F0012CF0B0000000087F4800177A416 +:106870008001EF6C80017BD88001E2148001D3A8F5 +:10688000800091E880018E9C8001641C800162D0B0 +:10689000800091DC80015E8480016AF48003B798F7 +:1068A0008001773000007648800091D0EBCD40C069 +:1068B000300749A60E98A7682FF7EC08000B76085A +:1068C0005808C0F10E985847CF714957EF3C004C1B +:1068D000F01F0014EEFC0100F01F0013E3CF90C086 +:1068E00076F8F6C9FFD2F73C00261AD8F6C8FFD8CA +:1068F0001AD91AD8F7390036F6CAFFFC1AD9F73870 +:106900000038F7390027F71B0024F01F00082FCDAF +:10691000581CCD90E3CF80C000007648000087F47B +:10692000800163E0800163488001661C7808301CA8 +:10693000F80A094C201C106C5EFCD70348787008DC +:106940005808C0901838C041C078103CC05070B88A +:106950005808CFC15EFD5EFF0000778C189A48F89A +:10696000709CE21C00025E0C70A8EDB80000C03004 +:10697000305C5EFC48AC780B583BE089000D300978 +:106980004888F00B003891189109950BF6C8FFFF65 +:1069900099085EFF3FDC5EFC000087F4000077880A +:1069A0000000776848D972A8EDB80000C1313008FE +:1069B000780A99D848ABF60A003A741999E974181C +:1069C000F8C9FFCC910C7808301CF60800389119F2 +:1069D0005EFC305C5EFC0000000087F4000077681D +:1069E000EBCD40C0189778B95809C18078C893C8D2 +:1069F0006EC891096E3C580CC050F01F000B300857 +:106A00008F3833CA6EA635AB0E9CF01F00080C9B66 +:106A10000E9CF01F0007E3CF80C078C94858911939 +:106A200078B9CE7B800091E8800091D0800183B05E +:106A30000000778CEBCD40801897580CC180789877 +:106A40005D1848F972095809C051C11872B958093E +:106A5000C0E01237CFC16E785808C0B06E3C580CF9 +:106A6000C060F01F000830088F588F38E3CF908047 +:106A70000E9C301BF01F0004E3CF90800000778C49 +:106A8000800091E8800169E0EBCD4080496972A8FF +:106A9000EDB80000C040305CE3CD8080493870091B +:106AA0001839E08A001E4928F00C00376E09580991 +:106AB000C15072DA580AF3F8000EEFF80A01F3FA3F +:106AC000000DF3F8100EF5F81A0E72E8129C910AF8 +:106AD000F01F00086E095809CED1E3CF90803FCC5B +:106AE000E3CD8080000087F400007788000077689D +:106AF00080016A34EBCD40F81897169614951294DD +:106B0000109333CCF01F000CC1403008990799B89E +:106B10009938995899889996994599649973487ABA +:106B2000301899A8741999C9930CF8C8FFD495180E +:106B3000E3CD80F8800092000000778CD401202DF6 +:106B4000500A48C972A8EDB80000C040305C2FED73 +:106B5000D80248981A99F00B032A3048FA08000B1B +:106B6000F01F0006581CF9BC0001F9BC01FECF0B58 +:106B7000000087F4000077488001F1D8EBCD40C0D9 +:106B8000201D4AC618976CA8EDB80000C441580CE7 +:106B9000C3F0789B580BC3C0780A580AC3954A695A +:106BA000F20A033850085808C061C1A870D85008CC +:106BB0005808C1601037CFB1F40815036EDA580ACF +:106BC000F3D8E009EFF8000EF3F80A01EFF8100E21 +:106BD000F5F81A0E400870DA70E9930A6E9B3F9838 +:106BE0008F18580BC0300E9C5D1B6E8B581BC0500D +:106BF000582BC150580BC0516E2A1A9CF01F000F21 +:106C00000E9C301BF01F000E2FFDE3CF90C02FFD18 +:106C1000E3CF90C0305C2FFDE3CD80C0ECF801B82D +:106C20000E38CEF130094838F14901B8CEAB00003A +:106C3000000087F40000776880016B3C800169E008 +:106C4000D40148C9169E72A8F1D8C001C031305C89 +:106C5000D8024898304A76A9F00C032C1ADAF6C804 +:106C6000FFF833CAF01F00052FFD581C5F0CD80237 +:106C7000000087F4000077488001F164D431204D92 +:106C800030084931189650285018FAC5FFF4FAC256 +:106C9000FFF802901A93FAC4FFFCC098E006032A9A +:106CA000F01F000C0E9B401CF01F000B3049049B92 +:106CB0000A9AE206032CF01F0009304818970A9937 +:106CC0001A9B089C5817CEB02FCDD83200007748B9 +:106CD0008001F1D880016B7C8001F0B4EBCD40E005 +:106CE000201D49356AA8A1A8300A49298BA8149704 +:106CF000930A14984906EC08002C2FF748FA303B09 +:106D0000F01F000F581CC0F10E985887CF5148D87B +:106D1000300991189109301B1A9CF01F000B2FFDB0 +:106D2000E3CD80E06AA8A1C88BA8CF2B000087F430 +:106D300000007788000077488001692C8001F05CB2 +:106D40000000778C8001695C5EFD5EFFEBCD4080CA +:106D5000189778785808C030788C5D180E9CF01F12 +:106D60000003E3CD80800000800091E8D4314B1017 +:106D70001895169260095809C58030047258721926 +:106D80000A38F7B400FF5809CFA10891E80C1502A2 +:106D9000F01F00291893C46060075807C2303006FE +:106DA000C0486E175807C1E06E580A38CFB10E9C24 +:106DB000F01F0022E60609276E485808C0F06E1939 +:106DC0005809EFF80002E1F80A01EFF90001EFF8C5 +:106DD0001002F3F81A026E2891092FF66E17580761 +:106DE000CE415804C1A006953006C0380836C154BB +:106DF0006A07049C6E686E8B5D18491B0E9CF01F21 +:106E000000112FF62FC56E485808CF100E9C48CBA6 +:106E1000F01F000C0836CED5069CF01F000B029C1C +:106E2000D8321891029CD83212941291CB0B0000E8 +:106E300000007794800092008001463A80016D4CFA +:106E400080014642800091E8EBCD4080324CF01F3B +:106E500000081897C080324A300BF01F00060E9CC5 +:106E6000F01F00050E9CE3CD8080000080009200A2 +:106E7000800091D080014652EBCD40FC18961695CB +:106E80001494129310924077F01F000AC100995693 +:106E900099359964998799739942487A3008991875 +:106EA00074199929930CF8C8FFFC9518E3CD80FC60 +:106EB00080016E4800007794D431FACEFFDC189739 +:106EC00016901491129310927C157C04580CC26099 +:106ED00078095809C26049A66C085808C051C09882 +:106EE00070185808C0601039CFC13018109CD832C3 +:106EF000F01F0014C13099509931996399859972A6 +:106F00009944300899186C199929930CF8C8FFFC1A +:106F10008D188F0C3018109CD8323008109CD83245 +:106F200008981AD50499069A029B009CF01F000647 +:106F30002FFD580C5F188F0CCDAB0000000077942C +:106F400080016E4880016E78EBCD40404856ECCC15 +:106F5000FFF8F01F000530088D168D08E3CD804046 +:106F600000007794800145D6EBCD40807847785A71 +:106F70006E18103AE0880004E3CF8080783B6E0CF6 +:106F8000F01F000B6E285808C0406E1B6E0C5D1879 +:106F90006E3CE04C002BC050300A149BF01F0005E3 +:106FA0000E9CF01F0005E3CF90800000800091DC74 +:106FB00080014658800091E8EBCD40C0203D30086C +:106FC00018979928990814961A9C308AF01F001176 +:106FD000FACBFFF80E9CF01F00102FED580CC101EA +:106FE0006E085808C0400E9CF01F000C6E2C580C08 +:106FF000C040F01F000B300C2FFDE3CD80C05806C1 +:10700000FBF81000EDF81A002FFDE3CF90C0000050 +:107010008002E7368001DE6C8001D3A8800091E811 +:10702000EBCD40C0189778185B98C0C0783B580BE0 +:10703000C17078465806C04078685908C050E3CF00 +:1070400090C0E3CF80C0785A590AE08800153FF815 +:107050008D28ECCCFFF4F01F000CE3CF90C0784CEF +:10706000580CCEE06E685908CEB12F4CF01F0006C8 +:10707000E3CF90C06C0CF01F00056E5830198D18CE +:107080008D29CE8B8001A25C800091DCEBCD40E0AD +:10709000201D1697E04C0081E0800088E08A0027E0 +:1070A000E04C0083C2F0C2B4760A1A9C300BF01F89 +:1070B0000064E08A004F585CC490314CF01F0061BE +:1070C0004008913C4009723A580AC7A06E0830093E +:1070D000990899399919EF380008992840083149D9 +:1070E000301A91594008911AC1D8584CC4A0E04CAC +:1070F0000080C330300C2FFDE3CD80E0E04C0085F4 +:10710000CFA16E0A300B1A9CF01F004DE08A0022BE +:10711000585CC1C0EF3900084008300A9119400896 +:10712000915A301B400CF01F0048581CCE41400CB7 +:10713000F01F0046C0B0400B76785808C070300C85 +:10714000F01F0043581C5F0CCD7B2FFDE3CF90E078 +:107150003FEC2FFDE3CD80E07645760A1A9C300B9C +:10716000F01F0037FE9AFFF6585CCF005805C49117 +:1071700040089135400993550FCA4008911ACD2B0C +:107180007626760A1A9C300BF01F002DFE9AFFE23D +:10719000585CCDC05806C1914008301A913640095C +:1071A00093564008911ACBEB760A1A9C300BF01FCD +:1071B0000024FE9AFFCF585CCC900FC9CAEB3FD891 +:1071C00093184009935ACAEBECC5FFED0A9CF01FD7 +:1071D000001D4008913C1899400A743B580BC2406E +:1071E0006E080C9A93089336EECBFFF430162F0CF2 +:1071F0009316F01F00184008915540099316C92BAB +:1072000040060A9CF01F000F8D3C4009723C580C50 +:10721000C1000A9A6E5BF01F000F400891550FC91C +:1072200040089119C7FB3FD895184009935BC7AB3D +:107230003FD893184009935CC75B000080016B3C0A +:1072400080009200800169A48001693C80016C404B +:10725000800091DCEBCD40FC4C151696189476021C +:107260006A095909E088001B4BE7C15878BA580AE7 +:10727000F9F8000CEFF80A01F9F8100CF5F81A0CFF +:10728000201978C8910A8B09F01F00376A0959093B +:10729000E08800056E0C580CCEA16C2338086C36C3 +:1072A000ECCCFFCCF0041800C260F01F003018973F +:1072B000C2F0B8C464080C9A990899A6069B2CCC15 +:1072C0008F9CF01F002B3808F0041800C2303818CB +:1072D000F0041800C2B04A3B30088FB8761A8FCA43 +:1072E0009507EEC9FFD46A0897192FF8301C8B0850 +:1072F000E3CD80FC64495809CD90ECC8FFC9E01883 +:10730000FFFCF009000CF01F00191897CD31E3CDF8 +:1073100080FC318A049BEECCFFF4F01F00156E7ADE +:107320008F2A580AC1018F8ACD7BEEC6FFF4318ABD +:10733000300B0C9CF01F000F049B0C9C308AF01F3C +:10734000000CCCAB6EA82FD8E018FFFC6E9C100C84 +:107350008F8C645BF01F0006CBFB0000000077A061 +:1073600000000234800091E880009200800091DCEF +:10737000800091D0D421207D1297FACEFFD04B29E6 +:1073800018947298EDB80001C040300C2F9DD8229F +:10739000FCE800003006BB295C7A50265046FAC54E +:1073A000FFF8FAC9FFE00A9CF01F00282FED580CE7 +:1073B000C2D05807C0B08F368F5640680E9B0C9CC9 +:1073C0008F28F01F0023581CC2E11A9CF01F0021D7 +:1073D0005BBCC29040076E4C580CC070F01F001E82 +:1073E00030088F388F4840075807C0401A9CF01F5C +:1073F000001B402C580CC030F01F00175804FBF83D +:107400001006E9F81A002F9DDA2A40085808C040F3 +:107410001A9CF01F0012402C580CCB80F01F000E5D +:107420002F9DD82A40085808C0401A9CF01F000B16 +:10743000402C580CC0313FDCCAABF01F00073FDCCA +:10744000CA6B0000000087F48001DF7480016C408B +:1074500080018E9C800091E88001D3A8EBCD40E0B4 +:10746000208D149616951897308A300BF01F001354 +:1074700059F6E08800052F8DE3CF80E00A9B0C9A37 +:107480001A9CF01F000FFAC9FFE030080C09FACC73 +:107490000001F368FFE0F8C6FFFF300B30AA0C9C38 +:1074A000F01F000832EB0ECC0C9CF01F0007CF4100 +:1074B0002F8DE3CF90E00000800091D0800091DC20 +:1074C0008000917080009164D43120AD189E109599 +:1074D00014974C781292709CE21C0002C0511896CE +:1074E0000C9C2F6DD832169AFAC6FFE41C9B0C9C9C +:1074F000F01F00400C9BFAC3FFFCFACAFFDC069C9D +:10750000F01F003D1896581CCEC15807C2F10E91CD +:107510000E90069CF01F0039401818945808C0407F +:10752000069CF01F0037403C580CC030F01F00355F +:107530005BB4C4D05807C170E06B0BB8E0CCFFF46B +:10754000F01F00315BDCC3A0582CC07060285BF8D2 +:10755000C04060188508CC5B029C301B3006F01FD1 +:10756000002BCBFB40988B08CBCB3FF8310C8B0822 +:10757000F01F002718941890C280F8C8FFF4500834 +:10758000109CF01F00248907640930088919089AA3 +:1075900031094A1B109CF01F00211891C20040982D +:1075A000189B9928300CF01F001E581CCB300C9BE8 +:1075B000029C3FD6F01F001BC94B029C301BF01FE2 +:1075C000001340988B08C8DB3FD6C8BB5807CFD004 +:1075D000029C301B3FD6F01F000DC83B400CF01F33 +:1075E0000012089C3FD6F01F0007C7BB000087F4BD +:1075F0008001745C80016FB880018E9C8001D3A8EB +:10760000800091E88001A22880016B7C80009200BC +:107610008001A28C8001702080016AF480016C409E +:10762000800169E08001A27CEBCD40E0209D49F81B +:1076300018991495709CE21C0002C06118960C9C6D +:107640002F7DE3CD80E0169AFAC6FFE8129B0C9CD2 +:10765000F01F00170C9B1A97FACAFFE01A9CF01F44 +:1076600000151896581CCEC11A9CF01F0013400834 +:1076700018965808C0401A9CF01F0010402C580C57 +:10768000C030F01F000F5BB6C0313FD6CD9B300C31 +:107690008B3C8B5C40880A9B8B28F01F000A581C8F +:1076A000CCF03FD6CCDB0000000087F48001745C96 +:1076B00080016FB880018E9C8001D3A8800091E882 +:1076C00080016C40EBCD40FC1895169414921293F7 +:1076D00010974076310CF01F0012C1D099369905F1 +:1076E00099149927189A3008310948EB109CF01F1B +:1076F000000E1896C100069B049C0C9AF01F000B0C +:107700001897581CC0500C9C301BF01F00090E9C91 +:10771000E3CD80FC30070E9CE3CD80FC800092001E +:1077200080016F6880016AF480017628800169E039 +:10773000EBCD406E202D4086129310951491169A31 +:10774000189B1A9CF01F0008069B0C99FAE2000097 +:107750000A9ABB23029CF01F00052FED2FEDE3CD0D +:10776000806E00008001745C80017374EBCD406812 +:10777000202D129310961495169A189B1A9CF01FA0 +:107780000008FAE800000C9ABB29069B0A9C300905 +:10779000F01F00042FED2FEDE3CD80688001745CB5 +:1077A00080017374EBCD40401896303CF01F00040C +:1077B0007848301C8D08E3CD804000008001EF6CDC +:1077C000EBCD406048A618952F060C9CF01F0009D1 +:1077D000303CF01F0009310AF8CBFF8C0A9CF01FE7 +:1077E00000070C9CF01F0006E3CF9060000087F4B8 +:1077F000800145F88001EF6C800091DC800145FA42 +:10780000D42149461894ECC5FFF00A9CF01F0012E1 +:10781000ECF700F85807C0C06F38707B2F4B322A46 +:10782000089CF01F000E0A9CF01F000DDA2A303C65 +:10783000F01F000CC060F9380088EE081800C06026 +:10784000ECCCFFF0F01F0006D82AF8CBFF78CE8BE7 +:10785000000087F4800145F88002E736800145FA90 +:107860008001EF6CEBCD40E049061895ECC7FFF0C6 +:107870000E9CF01F000F303CF01F000EECF600F8DD +:107880005806C0C0ECCBFFE2306A0A9CF01F000A29 +:107890000E9CF01F000AE3CF90E00E9CF01F000743 +:1078A0000C9CE3CD80E00000000087F4800145F8E7 +:1078B0008001EF6C8002E736800145FAEBCD404055 +:1078C000209DE04B0020E08B001CBABB580BC1B1DF +:1078D0003FF8BAA849162F060C9CF01F0011303C47 +:1078E000F01F0010322AFACBFFFEF8CCFF78F01F11 +:1078F000000E0C9CF01F000D2F7DE3CF90402F7DDC +:10790000E3CFC0403008169ABAA8189BFACCFFFC07 +:10791000F01F0007CE0B0000000087F4800145FC3B +:107920008001EF6C8002E736800145FE800091DC2B +:10793000EBCD40E01895303CF01F000B1897C110BC +:1079400048A62F060C9CF01F000A0A9B306AEECC5A +:10795000FF56F01F00080C9CF01F0007E3CF90E0DB +:10796000E3CD80E08001EF6C000087F4800145FCEE +:10797000800091DC800145FED401F01F0002D80296 +:1079800080017930EBCD40EC202D18961697586B7E +:10799000C0503FFC2FEDE3CD80ECFACCFFF8E06364 +:1079A000312EEA13322EE0623100EA12312EB92371 +:1079B00016980C99300A308B1A9CF01F0010301C5E +:1079C000F01F000F48F81893F0C5FFF00A9CF01F55 +:1079D000000E5803C0C00E9A0C9B069CF01F000BB3 +:1079E0000A9CF01F000B2FEDE3CF90EC0A9CF01FD8 +:1079F0000008069CCD0B00008001776C8001EF6CC5 +:107A0000000087F4800145FC800091DC800145FE88 +:107A1000EBCD40E01897303CF01F0018EEC8000195 +:107A200018955818E0880004E3CF80E058175F09E4 +:107A300049366D1858385F0AF5E90009C0E1582742 +:107A40005F08F5E80008C030E3CF90E0F01F000DBC +:107A5000C0A18B47E3CF90E0F01F000B6D185838A2 +:107A60005F0ACEEB303CF01F000578485818CF2055 +:107A7000F01F0005CEFB00008001EF6C000087F4D2 +:107A800080017BC88001F340EBCD40F81696189337 +:107A900076085858E08A002A49A83064F0C5FFF0FB +:107AA00097040A9CF01F0018301CF01F001818974C +:107AB000C160202D189B089A1A9CF01F0015F01F1A +:107AC00000152FED580CC1616C0A0E9B069CF01F2F +:107AD00000120A9CF01F0011E3CF90F80A9CF01FDF +:107AE000000F0E9CE3CD80F830683FFC9708E3CD93 +:107AF00080F80A9CF01F00093FBCE3CD80F800002D +:107B0000000087F4800145F88001EF6C8002E736C1 +:107B1000800188B0800091DC800145FA0050F200BD +:107B2000000FAC003008F9480320F94803245EFC3C +:107B3000EBCD40C016971496F8FE0320FCCBFFFF58 +:107B4000F60A141FE069851FEA1951EBF60904488B +:107B5000A5591419F8FA0324F2091064121B143BF6 +:107B6000C0B0F94B0320F80E0927FCC8FF9CF808A9 +:107B70000926E3CF90C0E3CF80C0D401189EF8FC63 +:107B80000324FCF803201838C1F0F8C8FF9CFC0C53 +:107B9000032CFC08032930089709E069851FEA19BE +:107BA00051EBFCFB0324FC0B09282FFBF6090448CE +:107BB000F60A141FA5591419F2091064F6090109EF +:107BC000FD490324D802D80A4838F0F900F85809CA +:107BD0005F1C5EFC000087F43018198CF00C180054 +:107BE0005F0A3058F00C18005F09124AC0F1306883 +:107BF000F00C1800C0B03028F00C1800C080584CB1 +:107C0000F9BC0003F9BC01005EFC5EFF302C5EFC99 +:107C100048C8F0F800FC5818C0D0C0635828C0D03D +:107C20005838C0505EFF580C5F0C5EFC583C5F8CAF +:107C30005EFC581C5F8C5EFC582C5F8C5EFC000068 +:107C4000000087F4EBCD40C01897169E740A580ABE +:107C5000C0D0753A580AC0A0747A580AC0704FF85C +:107C6000F0F901045889E0880004E3CF80C04FC8D0 +:107C7000F009032F94D8EDB80004CF813008301CF0 +:107C80009D08E3CD80C0F53900C83FF8F009180021 +:107C9000CED0F51B00D2580BCE90F51C00D030266C +:107CA000F4FA00D8F40C002811B9EC091800E080AF +:107CB00000BFF8C8FFFF3009F40800280C9CF0CA88 +:107CC000FFFDC07815882FCAF8081800E08000B0C2 +:107CD0002FF91639CF85CCABF53900C83FF8F0093C +:107CE0001800CC40F51B00D2580BCC00F51C00D07E +:107CF0003016F4FA00D8F40C002811B9EC09180079 +:107D0000E08000A4F8C8FFFF3009F40800280C9CAC +:107D1000F0CAFFFDC07815882FCAF8081800E08067 +:107D200000952FF91639CF85CA1BF53900A43FF805 +:107D3000F0091800C9B0F51B00B2580BC970F51C4A +:107D400000B03026F4FA00B8F40C002811B9EC09A0 +:107D50001800C660F8C8FFFF3009F40800280C9C22 +:107D6000F0CAFFFDC06815882FCAF8081800C58042 +:107D70002FF91639CF95C7ABF53900A43FF8F009B4 +:107D80001800FE90FF74F51B00B2580BFE90FF6FB9 +:107D9000F51C00B03026F4FA00B8F40C002811B934 +:107DA000EC091800C3D0F8C8FFFF3009F408002818 +:107DB0000C9CF0CAFFFDC06815882FCAF80818008F +:107DC000C2F02FF91639CF95C51BF53900A43FF83D +:107DD000F0091800FE90FF4BF51B00B2580BFE9007 +:107DE000FF46F51C00B03016F4FA00B8F40C002879 +:107DF00011B9EC091800C220F8C8FFFF3009F408D7 +:107E000000280C9CF0CAFFFDC06815882FCAF8082E +:107E10001800C1402FF9123BFE99FFF9C27B3028B0 +:107E2000AE8830199D09129CE3CD80C03028AE8801 +:107E30003029301C9D09E3CD80C03018AE88301940 +:107E40009D09129CE3CD80C03018AE883029301CCB +:107E50009D09E3CD80C00000000087F48003B7B027 +:107E60003028F00C1800C390E088001B3048F00C5C +:107E70001800C3503058F00C1800C21030093028D8 +:107E8000F00B1800C160F00B1800E08B001B3018DD +:107E9000F00B1800C100300812385F5C5EFC30182F +:107EA000F00C1800CEC130193028F00B1800CEC1EC +:107EB0003038C02830181039CF045EFE3029CE0B80 +:107EC0003048F00B1800C0703058F00B1800CE414D +:107ED0003028CF2B3048CF0B3039CD2B3049CD0B4C +:107EE000D431307977387075B8891894581AC0D061 +:107EF000C043582AC4C0D83A7738707A94D9EDB9BB +:107F00000004E0800087DA3AEB3900A43FF8F0097A +:107F10001800CF20EB0800B03009F2081900CF405C +:107F2000149112923006307B30533060C1A8E007C4 +:107F30001800C2B03028F0071800C7A03048EE087B +:107F40001800F9BC0003F9BC0100F01F003CE9F780 +:107F50001E002FF6EB1800B00C38FE9AFFD6098BE6 +:107F6000EAF800B8F006002811B70E9CF01F0034A4 +:107F7000FE9AFFF1E20718005F08E60718005F09A4 +:107F80001248E4081800CD40301CCE0BEB3900C875 +:107F90003FF8F0091800CB00EB0800D03009F208D8 +:107FA0001900CB2012913006307B301230533060F4 +:107FB000C1A8E0071800C2B03028F0071800C3A01D +:107FC0003048EE081800F9BC0003F9BC0100F01FAE +:107FD000001BE9F71E002FF6EB1800D00C38FE9AB4 +:107FE000FF94098BEAF800D8F006002811B70E9C20 +:107FF000F01F0013FE9AFFF1E40718005F08E60780 +:1080000018005F091248E2081800CD40301CCE0B62 +:10801000307B305CF01F000AFE9AFF77301CF01FA7 +:108020000007FE90FF723058301CA888D832302CE0 +:10803000C8DB302CCCDB000080017C1080017E602E +:108040003008484A48499508951893085EFC000096 +:10805000000089EC00008C5CEBCD4080189E198BF1 +:10806000580BC130300A3017149CFC0A00092FFA53 +:1080700013982018EE080948F9E81008F9D8B0104C +:10808000163ACF45E3CD8080169CE3CD80807938C9 +:10809000707A3308F53900C8F0091800C0205EFD79 +:1080A000F51800D4E218000C5848C0E0E08A000837 +:1080B0005888C08058C8CF41310C5EFC5808CF01A9 +:1080C0005EFF304C5EFC302C5EFCD703EBCD40E015 +:1080D00030081896109A169C8D084927760E301590 +:1080E000109BC0A8F80A00082FFA11C9EE0B070868 +:1080F000A7D91039C0A01C3ACF652FFB58DBE08B05 +:10810000000E300A780ECF8B6C08EA0B0949124832 +:108110008D082FFB58DBFE98FFF6E3CF90E00000C0 +:108120008003B7F4EBCD40C030069906149EF8C723 +:10813000FFFC1799EC091800C0E00C9AF60A000839 +:1081400011A90EC978082FF899082FFA1798143832 +:10815000FE99FFF61D993008F0091800C0F0300BA9 +:10816000FC0B000811A9EE0B0B0978082FF89908F1 +:108170002FFB1D981638FE99FFF5E3CF90C0EBCD8D +:1081800040F816941897780B68065806E08A002C79 +:10819000F6C8FFFCE8C5FFFCF8080003300E2FCC42 +:1081A000EA0E070A580BE08A00130FC81458F1D8DA +:1081B000C007C1503009C078F80907081458F1D831 +:1081C000C007C0D02FF9123BFE99FFF8597BE08B16 +:1081D000000706CA6E0B2FFB8F0B68062FFE1C369E +:1081E000FE99FFE0E3CF90F8EBCD40FE1894169295 +:1081F0001497780676055805E08A0025ECC8FFFC40 +:10820000F6C3FFFCF8080001300EF4CCFFFCE60ECC +:10821000070A6E0B580BE08A00120FC81458F1D8E9 +:10822000C007C1203009C078F80907081458F1D8F0 +:10823000C007C0A02FF91639CF852FFE1C35FE9937 +:10824000FFE8E3CF90FE5976FE9BFFF902CA68066D +:108250002FF689062FFE64051C35FE99FFDACF2B19 +:10826000D42178045804E08A0027F8C7FFFC493875 +:108270000F8B700C11C6580CE08A0017F0C5FFFC7C +:10828000300EEDEB2008F1D8C007C0F00A9A300993 +:10829000C0782FFA15881658F1D8C007C0602FF99A +:1082A000123CFE99FFF8D82A2FFE2FF7083EC03463 +:1082B0000F8BCE8BDA2A00000000023CD4211897E5 +:1082C00076055805E08A0026F6C6FFFCF8CEFFFCCE +:1082D000300B1694C0482FFB0A3BC1B4EC0B070AC5 +:1082E000E80A1800CF946E0C580CE08A00120FC8F0 +:1082F0001458F1D8C007CF003009C078FC0907082E +:108300001458F1D8C007CE802FF91839CF85D82A54 +:10831000DA2A3248F00C1800C110E08800113488C5 +:10832000F00C1800C0B0E08800183608F00C1800F7 +:10833000C05036C8F00C1800C0E15EFF3128F00CC8 +:108340001800CFC03188F00C1800CF8030C8F00C76 +:108350001800CF405EFD3308F00C1800CFC1CEEB03 +:10836000EBCD40E078055805E08A0010F8C6FFFC28 +:108370003007C0380A37C0940D8C2FF72FF6F01F46 +:108380000004CF90E3CF90E0E3CF80E08001831240 +:108390004838F14B01DCF14C01D85EFC000087F459 +:1083A0004838F14B01ECF14C01E85EFC000087F429 +:1083B000EBCD40801697581BC050582BC080E3CFA0 +:1083C0008080F01F00050E9CE3CD8080F01F00022E +:1083D000E3CF9080800091E8D401580CC070486BC6 +:1083E000760AE04A0168E0880003D80AF01F00031B +:1083F000DA0A0000000089EC800091DCD401580CFE +:10840000C0A078185908E08B0007780AE04A016894 +:10841000E0880003D80A189B482CF01F0003DA0AF2 +:10842000000089EC800091DCEBCD4040350A1896C5 +:10843000F01F000330088D48E3CD8040800091DCC0 +:10844000D401306AF01F0002D8020000800091DCE5 +:10845000D401300CF01F0002DA0A000080016C7CAD +:10846000D421201D189414971296169A1095189BD3 +:108470001A9CF01F001CE08A0032585CC27058063B +:108480005F1858075F191268C241300840099338D5 +:10849000400A95584008301B9115400CF01F0012FF +:1084A000581CC100400C78785808C090189B089C54 +:1084B000F01F000E581CC0A03FDCC098301BF01FFE +:1084C000000C400C78785808CF21301C2FFDD822A2 +:1084D0004008913740099356CDEB3FEC2FFDD82251 +:1084E00080016B3C800169A480016C40800169E0DF +:1084F000EBCD40C018971696303CF01F00283DD8B1 +:108500003079AE88AE9935083F29300BAEB8AEC988 +:1085100030283019AED8EF6B0008AEABAEEBAEF939 +:1085200058065F1AF8F900BC58095F181468F60875 +:108530001800C310F8F800D05818F9B80008EFF880 +:108540000E08F8F800CC5818EFF80808F9B900043C +:10855000F1D9E038EFF80E08F8F800C85818EFF82D +:108560000808F9B90002F1D9E038EFF80E08F8F878 +:1085700000C45818EFF80808F9B90001F1D9E0383B +:10858000EFF80E08F8F900D4EF380008F1E91048C8 +:10859000EF680008E3CD80C08001EF6CEBCD404078 +:1085A0001896303C5C76F01F000E5876E088000488 +:1085B000E3CF804048B8F006032FF90C00C6E3CDA6 +:1085C0008040F90C00CAE3CD8040F90C00CEE3CD29 +:1085D0008040F90C00D2E3CD804000008001EF6CB8 +:1085E0008003B7D4D40130DCF01F0002784CD802ED +:1085F0008001EF6CEBCD40FC207D31CA1893300B2D +:108600001A9C1A92F01F001266045804E08A00189F +:10861000E6C6FFFC30070D852FF72FF60A9CF01FEA +:10862000000DC0A14008FACAFFE4F0C9FFFF100A1C +:108630005009F565FFE80E34FE99FFEF1A9B069C82 +:1086400031CAF01F00052F9DE3CD80FC800091D042 +:1086500080018312800091DCEBCD40E0207D300B67 +:10866000189731CA1A9CF01F00171A956E0B580BF9 +:10867000E08A0024300AFAC6FFFCEEC9FFFC0C9C1D +:10868000149EC0582FF9143BE08A000D2FFA13886E +:10869000FC081800CF8418C82FF96E0B143BFE9904 +:1086A000FFF7F80601061A9B50060E9C31CAF01F10 +:1086B00000062F9DE3CD80E0FAC6FFFC0C9CCF2B7B +:1086C000800091D0800091DCD421129618971695E5 +:1086D0001494580CC1205809C111314CF01F0009E5 +:1086E000C0C09907B8C599249936487A7419994930 +:1086F000930CF8C8FFF49518D822F01F0004D82274 +:1087000080009200000077A4800147E0EBCD40C0DC +:108710001896580CC110308CF01F000C1897C090A0 +:108720000C9CF01F000B8F1C1898C0A030188F08ED +:108730000E9CE3CD80C018970E9CE3CD80C00E9CAC +:108740001097F01F0004CF5B800092008001D920B9 +:10875000800091E8EBCD40C049566C075807C180B6 +:108760006E395809EFF80004EDF80A01EFF810042B +:10877000F3F81A046E4891096E2A0FCB6E0CF01FA5 +:10878000000D0E9CF01F000C6C075807CEA148B8D6 +:10879000F0C7FFEC0E9CF01F000AC071302CF01FD8 +:1087A00000090E9CF01F0008E3CD80C0000077A4F4 +:1087B000800147E0800091E8000087F4800145DCFB +:1087C0008001478C800145ECD4014848300991185C +:1087D0009109F01F0003D802000077A4800187549C +:1087E000EBCD40FE4A0618976C0816951494201895 +:1087F000E0480167E0880004E3CFC0FE580A5F1933 +:108800006C1A300B580A5F181268F6081800CF501F +:10881000183A5FB858FC5F891268F6081800CED085 +:1088200016910C92C0B82FF7641958F75F8A0E3969 +:108830005FB81468E2081800CE00EE031016306A24 +:10884000E6CCFFF80A9BEC0C000CF01F0008CEC130 +:10885000485B089C060B310A2F2BF01F00050E9C6D +:10886000E3CD80FE000089EC8000917C800091DCEB +:10887000EBCD40E018951697300C18960E9A0A9B8F +:108880002F07F01F0005C0452FF62FFCCF8B0C9C47 +:10889000E3CD80E0800187E0D401306AFACCFFFCB0 +:1088A000FACBFFF4F01F00025F0CD8028000917C2D +:1088B000EBCD4068205D3FF8FACAFFDC15D9FB68B4 +:1088C0000013FB68000EFB68000FFB680010FB68DC +:1088D0000011FB680012FAC6FFF8ACD974088D08C5 +:1088E00015C9FAC3FFFEACC93065FACBFFF20A9A8C +:1088F000069CF01F00060A9A069B0C9CF01F0004C1 +:108900005F0C2FBDE3CD80688002E7368000917C4C +:10891000D401FACBFFFCF73900241788F0091800BE +:10892000C020D80AF73A00251798F4081800CFA1FC +:10893000F6CCFFFE2DABF01F00035F0CD802000049 +:108940008000917CEBCD4040211D303CF01F001E8B +:10895000322A1896FACBFFB4FA0A000CF01F001B5B +:10896000ECC6FF78ECE80000FAE90000ECEA000849 +:10897000FAEB0008ECE80010FAE90010ECEA001845 +:10898000FAEB0018ED380020FB680020ED390021DB +:10899000FB690021FB3A00221B88F4081800C05034 +:1089A000300C2EFDE3CD80401B9AFB380023F408E9 +:1089B0001800CF71FACBFFFEFACCFFDCF01F0004E9 +:1089C0005F0CCF0B8001EF6C8002E7368000917C5A +:1089D000EBCD40E0203D4B571896EF3900943FF81F +:1089E000F0091800C3507938707C2F4CF8E800006B +:1089F000209DFAE90000F8EA0008FAEB0008F8E820 +:108A00000010FAE90010F8EA0018FAEB0018F9383B +:108A10000020FB680020F9390021FB690021F01FCC +:108A200000242F7D580CC0412FDDE3CD80E0202DA8 +:108A3000EEC7FF4A306A0E9B1A9CF01F001EF01F03 +:108A4000001E2FED580CC1C02FDDE3CF90E0F8CB16 +:108A5000FFE2306A1A9CF01F0017EECBFF4AFAC6FD +:108A6000FFFA306A0C9CF01F00130C9B1A9C306AB2 +:108A70001A95F01F00125F0C2FDDE3CD80E0ECCBE8 +:108A8000FFE2FAC5FFFA306A0A9CF01F000A0E9B4B +:108A9000306A1A9CF01F00071A9B0A9C306A1A96CB +:108AA000F01F00065F0CCC1B0000026080018944AF +:108AB0008002E736800188B08000917CD401201DBF +:108AC000500C580CC0401A9CF01F00022FFDD80219 +:108AD0008001D3A8D401201D500C580CC0401A9C12 +:108AE000F01F00022FFDD8028001D3A8EBCD40C0BB +:108AF000E06B00E41896300CF01F000A1897C0E0F5 +:108B0000E06A00E40C9BF01F0008ECC9FFF8EECA15 +:108B1000FFF8486B0E9CF01F00060E9CE3CD80C052 +:108B20008001D8DC800091DC8001D3EC8001ACA80E +:108B3000EBCD40C0E06B00EC1896300CF01F000A43 +:108B40001897C0E0E06A00EC0C9BF01F0008ECC92D +:108B5000FFF0EECAFFF0486B0E9CF01F00060E9C63 +:108B6000E3CD80C08001D8DC800091DC8001D3ECB3 +:108B70008001ACA8EBCD40FE129210914A88F0F92A +:108B800000F818933DD8733C316916977874AE8815 +:108B9000AE9930083509AEA8AEB93F283019301665 +:108BA00014954A0B303AAEC8AED9AE36EECCFFF8CB +:108BB000F01F001D069CEF65000BAE76AE66308B95 +:108BC000F01F001A8F5CC290303A496BF01F0016FC +:108BD0006E58B0B28EE86E5C303AF808002C491B33 +:108BE000F01F00116E598EE8F2080028B0B1E919A3 +:108BF00000B0E91800B21208E93900A5A3682F08EF +:108C00001039C030E3CF90FE0F9830092FE8EF59AC +:108C10000010AE98E3CF90FEE3CD80FE000087F415 +:108C200080017B1C800091DC8001D3ECD431201DBD +:108C3000314E1697330BAE9EAE8B1090FACBFFD809 +:108C40007618500818921493129176055805E08A08 +:108C50000006EA0815042EA8AE983016303AAE1673 +:108C600049E4EECCFFFCE8CBFFFCF01F001D049CA8 +:108C7000AEF3AE56AE46AE75EA0B15042F8BF01F61 +:108C800000198F4CC280303AE8CBFFFCF01F001473 +:108C90006E48B0B18EC86E4CE8CBFFFCF808002CD3 +:108CA000303AF01F000F6E498EC8F2080028B0B0AD +:108CB0003289AE695805E08A000D6E488EC98EDC97 +:108CC000EA0A1504120C400BF00C002CF01F0004F3 +:108CD0002FFDDA3A2FFDD83280017B1C800091DC19 +:108CE0008001D3ECEBCD40E0201D500B1897580CC1 +:108CF000C070169A4C4C0E9BF01F0044C6404C4668 +:108D000030080DA9F0091800C050301C2FFDE3CD2C +:108D100080E0ECCCFFE4F01F003FCF815807C2F0A9 +:108D2000301CF01F003DC3304B751A9B4B6CF01F7D +:108D3000003B1897C320F01F003A3018ED4C00CCD0 +:108D4000ACA80E9C3005400BED5500D04B07F01F32 +:108D500000351896581CC3F1EECCFFE4F01F00322A +:108D60004B28F1090142EA091900CD006E98EDB8CF +:108D7000000ECCC0F01F002E0C9CCC9B4A25EAF9BB +:108D80000320EAF803241039CCC1CD0BECCCFFE46E +:108D9000F01F0025301CCBBBECF801245818C04054 +:108DA000301CF01F0024ECCCFFE4F01F001FEAF998 +:108DB0000324EAF803201238CA90301CF01F001672 +:108DC000301CCA5B492AF50B00D2F80B1900C0A071 +:108DD0003FBCC9DBEECCFFE4AEA5F01F00133FBCE7 +:108DE000C96B3018F55800D24909F3080142F6085A +:108DF0001900CEF07498EDB8000ECEB0F01F000C44 +:108E00003FBCC85B000084CC80017B30000087F44D +:108E1000800145DC80019F3080017B7A800145C460 +:108E200080014664800145EC000002608001FBFC8B +:108E30008001A128EBCD40C01897F01F0015C1B0EC +:108E40006E4849468D186E598D2930096E2C8F2930 +:108E50006E486E3BE2180080F9B80001EDF80E0292 +:108E6000F01F000D1897581CC0803008300CACA8BB +:108E7000E3CD80C0E3CF90C0F01F00083008ED4C78 +:108E800000CCED5800D00E9CE3CD80C08001C6A080 +:108E9000000087F480014664800145C4EBCD40802A +:108EA000491A18977498EDB80001C111F4F801241B +:108EB0005818C0A07848951878599529F01F000BCC +:108EC000C091E3CD8080109CE3CD80803FBCE3CD9A +:108ED000808030086E2C6E3B8F28F01F0005E3CD9C +:108EE00080800000000087F48001C6A080018CE42F +:108EF000106104000000000040200700FFFFFFFF9A +:108F0000000000004869F2F802045828C0205EFE04 +:108F1000580CCFE0F2C8FFF099085EFF000077AC74 +:108F20005EFDD7034828912C913B5EFF000077AC93 +:108F300048384849910C930B5EFC000000007540D6 +:108F4000000074B45EFCD703D431202D500C3008DF +:108F5000FAC1FFF81690109402D84A424A43E269D7 +:108F60005A4C089A0819029B009C40085D181895F5 +:108F70005804C0B1584CF80A1780F9BA0B0449DB01 +:108F8000401CF01F001DC2E140165805C1000A97A1 +:108F90005907EE0A1780F9BA0B100C9B1417140628 +:108FA00064085C7A660C5D185807CF310A04E24405 +:108FB0005A4BFE98FFD65875E088000D4018EACC51 +:108FC000000848CBF00C000C2F8B308AF01F000AF1 +:108FD000C0913009009C129A129B40085D182FED39 +:108FE000DA3A30DC2FEDD83200007540000074B45E +:108FF00080018EF08000917CEBCD40FC49F8189404 +:10900000F0C3FDDCF0C7FFBC3072C0B8321A089B59 +:109010000A9CF01F001B1896C1D02C470637C16070 +:10902000EEC5002C5804CF316E08109C5808CF6054 +:10903000F01F00148F04EF44FFF86E185808CEE1BB +:109040008F248F322C470637CEC15804C0D0E3CFCF +:10905000C0FC6ABC580CC080F01F000A8B968BB60F +:109060006AC85808C030E3CF90FC8BD8301C3078E9 +:109070008BE8E3CD80FC0000000077AC8000917CA1 +:10908000800091E8EBCD40FE109114961895169251 +:109090001293F4C80008E0480037E08B00185859D4 +:1090A000C18049D8F0C4FE08F0C7FFE86EB8580880 +:1090B000C1300E9C321A0A9BF01F0018C1D02C47F9 +:1090C0000837CF51307CE3CD80FE30ACE3CD80FE5D +:1090D000129CE3CD80FEECCBFFFF049CF01F001040 +:1090E0000A9B8FBC8F968FD18FE30E9C321AF01F94 +:1090F000000DE3CF90FE6EBCF01F000B049CECCB88 +:10910000FFFFF01F00078FE38FBC8F968FD1E3CF57 +:1091100090FE0000000077AC8000917C8000918878 +:10912000800091DC800091E8D401487BF6F80204CD +:109130005828C020DC0AF6CBFE04306AF01F00037A +:10914000DA0A0000000077AC800091DCEBCD40FE35 +:10915000209D580B5F09580A5F08169314941069F4 +:10916000C341580BC4514A9264585808C2E03005B4 +:10917000FAC1FFFD0A970A9CC0D8ED3A0020FB38DF +:109180000023F4081800C2E00E9C64580E38E088F2 +:10919000001E64482FF7F00C03265803CEF1306A06 +:1091A000089B5804C0A0202D1A9CF01F0019F01F26 +:1091B00000192FED580CC0E05805C0506AC96CC8A2 +:1091C0001238CE350C95CE1B30050A9C2F7DE3CD91 +:1091D00080FE306A089BECCCFFDFF01F000FCD5102 +:1091E000CECB029B0C9CF01F000CCCF1CD9B189BAE +:1091F000069AFACCFFFDF01F0009FB6300234832FA +:1092000064585808CB51CE1B000077AC8002E7367B +:10921000800188B08000917C800091DCEBCD4060C3 +:10922000306A202D169618951A9CF01F0009F01F21 +:1092300000090C9A5F0B0A9CF01F00072FED581CC9 +:10924000F9BC0001F9BC01FFE3CD80608002E73684 +:10925000800188B080016480D4015C6CF01F000440 +:10926000581CF9BC0001F9BC01FFD8028001641C44 +:10927000EBCD406E202D1293189116921495300B61 +:10928000308A1A9CF01F0012306A069B1A96202D15 +:109290001A9CF01F0010F01F001030085F091AD848 +:1092A0000A9A1AD6049B1AD3029C1AD83038F01F97 +:1092B000000B2FAD5BFCC070581CF9BC01FF2FEDFB +:1092C000E3CD806E304C2FEDE3CD806E800091D0E9 +:1092D0008002E736800188B08001661CEBCD406ECD +:1092E00010911892169314951296F01F00113008E1 +:1092F0000C991AD80A9A1AD1069B049CF01F000DEB +:109300002FED583CE0890007582CC085306CE3CD28 +:10931000806E584CC070E3CFC06E5BECC050581CE0 +:10932000CFB1E3CF906E30BCE3CD806E8001A1DC85 +:109330008001F7D8EBCD4040201D10964978F0FE13 +:109340000204582EC0503FFC2FFDE3CD804030EE8C +:10935000FAC8FFFC10DE300E1A985C761ADE1AD6B8 +:10936000F01F000F2FEDFE5CFC17E0890010FE5C83 +:10937000FC16C114FE5CFB4FC070FE5CFBB4C0B0B9 +:10938000FE5CFAECCE11307CCE0B5BECC040581C7E +:10939000CDB1CDBB30BCCD9B000077AC8001F54496 +:1093A000D4014858F0F902045809C030F01F0003F6 +:1093B000D8020000000077AC80014480EBCD40E88B +:1093C0004D56189514971693E06A0218300B0C9CB2 +:1093D000F01F00524D288D05700C8D133005A36CC5 +:1093E000ED450204F01F004F8D4CC031E3CFC0E8C3 +:1093F0000A9CF01F004D581CCFA11AD5F1D7C00808 +:109400000A990A9A310B320CF01F00482FFD581CA4 +:10941000CEE1F01F0047581CCEA11AD50A980A9930 +:109420004C4A0A9B302CF01F00442FFD580CCDF005 +:1094300030670A981AD70A994BEA0A9B322CF01F18 +:10944000003E2FFD580CCD3030780A991AD84B9A2F +:109450000A980A9B323CF01F00382FFD580CCC7044 +:109460001AD50E9C0A980A994B2A0A9BF01F0032C3 +:109470002FFD580CCBC030270A981AD70A994ADA20 +:109480000A9B304CF01F002C2FFD580CCB001AD734 +:109490000A984A8A0A990A9B305CF01F00272FFD20 +:1094A000580CCA50301C0A981ADC0A994A1A0A9BAE +:1094B000F01F00212FFD580CC9A030390A981AD985 +:1094C00049CA0A990A9B31CCF01F001B2FFD580C8A +:1094D000C8E0F01F001A581CC8A1F01F0019581C42 +:1094E000FE91FF860A980C9730490C9A495B0A9CBA +:1094F000F01F0015FE90FF7C189A308B493CF01F3E +:109500000014581CFE91FF74ED4C0204EF45020C50 +:10951000E3CD80E8000077AC800091D000000258D5 +:1095200080009200800200AC8002067C8001FFB4C3 +:109530008001984C80016E788001FD8C8001A00034 +:109540008001955080016AF48003B8048001762878 +:10955000EBCD40E078185B98C031E3CFC0E078569F +:109560005866CFC1783B0C9A4985EAC7FE040E9C29 +:10957000F01F0017303A497B0E9CF01F0017C131D5 +:10958000F01F00163026EB460204F01F00150C9C5D +:10959000F01F00146A195809C14048C8700C5D19C1 +:1095A000E3CF80E037A83C49EB6801FC30E80C9B36 +:1095B0000E9CEB6901FDEB6801FEF01F000BCE1B5A +:1095C000129CE3CD80E00000000077AC800091DCCD +:1095D0008003B80C8000917C8001FD8080020290A5 +:1095E0008002023480017984EBCD40FC7875580B01 +:1095F000F9B80100F7F81A001693EB3900C83FF8E4 +:10960000F0091800C250EB0900D03008F009190029 +:10961000C4D0307430073022EE061502EAF800D8C4 +:109620000C082FF711BC089BF01F0027E08A0009E7 +:10963000EAF800D80C0811B45803E7F21A00EB1846 +:1096400000D00E38FE99FFEA089CE3CD80FCEB3891 +:1096500000A4F2081800C250EB0900B03008F0096D +:109660001900C240307430073012EE061502EAF8D5 +:1096700000B80C082FF711BC089BF01F0013E08AFC +:109680000009EAF800B80C0811B45803E7F21A0010 +:10969000EB1800B00E38FE99FFEA089CE3CD80FC81 +:1096A000787992D8EDB80004C040307CE3CD80FCDE +:1096B000307B305CF01F0004FE9AFFF9305CE3CD94 +:1096C00080FC000080017E60D431201D4D876E58E3 +:1096D0005808C0E030060C996E48F009032CF01FC2 +:1096E00000552FF66E580C990C38FE9BFFF730068C +:1096F0001A9B8F560C9CF01F00501A94400C580C6B +:10970000C0312FFDD832A36CF01F004C1890CFA0B1 +:10971000400A0C9BA36AF01F004A40085808E08AE0 +:1097200000260C950096C0782FF52FC640080A3801 +:10973000E08A001D350CF01F00418D0CCF614009FF +:109740005809E08A000F009530062FF66A0C580C75 +:10975000C040F01F003840092FC50C39FE99FFF7B3 +:10976000009CF01F00342FFDD8321A9B009CF01F84 +:1097700000324B4972084009F0090D488F585808CB +:10978000CE00300408930891A363E003000264084C +:109790006E467135344CF01F0029F9410040060631 +:1097A0008D0C6A796E48F2CBFFF2F0030306F33AB0 +:1097B000000D0C9CF01F00246A78F139000D306A0E +:1097C000ED690020ECCCFFDF640B2E2BF01F001E98 +:1097D000029B0A9CF01F001DED6C00386A498DC980 +:1097E0006A585808F9B805008DD86A79F338005ED0 +:1097F000ED6800276A7992C88DA80BF9ED59002C05 +:1098000030290BEAF20A1800E2081710F9B8000133 +:109810008DF830286E49F20309062FF4F00A18007B +:1098200008936E580838FE9BFFB1C8AB000077ACB8 +:10983000800091E88002105880009200800091D052 +:1098400000000258800091DC800195E8EBCD40C01B +:10985000201D1696582BC680E0880013586BC590C3 +:10986000587BC2D0583BC4804C076E295809C05061 +:109870004BE80C9C703B5D192FFDE3CD80C0580B6D +:10988000C0F14BA7EEF902085819C6C0EEF8020C59 +:109890003019A1D8EF690210EF48020CCE7B581B9B +:1098A000CE414B273008EEF9020C4B1AA3A9EF6802 +:1098B0000210A1D9B488EF49020CCD8B4ACA3008F6 +:1098C0001589F0091800C4C14A87EEF8020CEDB8FA +:1098D0000001CD31EF380210F2081800CCE1F01F82 +:1098E0000025F01F0025EEF8020C3016E018FFF9F5 +:1098F000EF48020CCBBBF01F002049C7EEF9020C69 +:10990000EDB90004CBA11298A5C8EF48020CCAEB30 +:1099100049673019EEF8020CEF690210A1D8300641 +:10992000EF48020CCA3B4917EEF8020CA3C81A9C78 +:10993000EF48020CF01F001140085828C050F01FDB +:10994000000DF01F000D300A4898B08AEF39021060 +:10995000F4091800C9204858F16A0210C87BB4887D +:10996000C8CB4838B089C89B000077AC000079C4E8 +:1099700080021298800196C8800177A4D401201D2E +:1099800048F9F2F802045828C0302FFDD80AF339FC +:1099900002103008F0091800C0711A9CF01F00096D +:1099A00040085828CF31F01F0008CF00F8CAFFE266 +:1099B000300B169CF01F00052FFDD802000077AC7D +:1099C000800177A4800210FC8001914CEBCD408097 +:1099D000201D4967EEF802045828C0503FFC2FFDB7 +:1099E000E3CD8080F01F0012C051302C2FFDE3CD5D +:1099F0008080EEF9020CEDB90002CF10EDB9000144 +:109A0000C031309CCEDB1A9CF01F000A4008580879 +:109A1000CED0F01F0009581CCE21EEF8020CA3A8EE +:109A2000EF48020CCDDB0000000077AC800210FC98 +:109A3000800211088001F370EBCD40C020AD189872 +:109A40001697580BC07076DC581CC0402F6DE3CDC4 +:109A500080C0109BF13A0020FAC6FFFE0C9CF01F5C +:109A6000001B0C9B209D322A1A9CF01F0019F01F2E +:109A700000192F7D580CCEB0793CFACBFFDCF01FDB +:109A8000001640985818C150C0923058F808180075 +:109A9000F9BC0003F9BC0102CDAB5828C030301C22 +:109AA000CD6B5807C0D06EC85808C0A0305CCCFB46 +:109AB0005807C0806EC85808C050304CCC8B307CE2 +:109AC000CC6B306CCC4B00008002113C8002E7363E +:109AD0008001F2BC800195E8D43120EDFEF3029CB8 +:109AE000FAC1FFA4E6F8020C18971694E2180006D3 +:109AF000C040309C2F2DD832F01F00A1C040308CC8 +:109B00002F2DD832E74C02085807C130BA8CF5D453 +:109B1000C008FAC6FFFEBA9A0E9B0C9CF01F009973 +:109B20000C9C1B9BF01F0098581CC0802F2DDC3A0A +:109B3000BA97BA87FAC6FFFECF4B029CF01F00937C +:109B40001892581CCF41029A089B0E9CF01F00905F +:109B50001890C580E6C7FFE8E6C6FE08EF3A002089 +:109B6000E1380020F4081800E08000A02C470C37F2 +:109B7000CF6130070E950E9B009CF01F0086E136EA +:109B800000381897CD40585CE08000C2E08B00B9E7 +:109B9000583CE08000B4584CC020300CF01F007ED0 +:109BA0003048F0061800E08000A83054E80618009D +:109BB000E08000983028F0061800E080009A300C11 +:109BC000F01F0076E8061800E080008F300CF01FD0 +:109BD00000745837E08B007960F85818C710301CB3 +:109BE000F01F0070300B4F0CF01F0070CA00F01F08 +:109BF0000070581CC9C1E6F8020CA1B8E748020C75 +:109C0000C7ABFAC5FFCE306A029B0A9CF01F005D0D +:109C1000FAC6FFDE0C9CF01F00673FF81AD00C9BC1 +:109C20001AD2310A1AD8204D1A9CF01F00630A9BE1 +:109C3000202D306A1A9CF01F00600499209DE6CC0C +:109C4000FDECFB380069FAEA0048FAE20050FB68D4 +:109C50000021FAEB0000FB380068FAEA0058FAE34A +:109C60000008FAE20060FAEB0010FAE30018FB6863 +:109C70000020303A0098129B4C03F01F00502EED4C +:109C80001895581CFE91FF54009BE6FC0214F01F2F +:109C9000004C5BBCC620580CC3E1189BE6FC0214C8 +:109CA000F01F00483FFCC27B0E9C009BF01F00464B +:109CB000FE91FF5E6EB55805EA071700C5DB302C34 +:109CC000F01F0038C90B5805FE90FF320A9AE13B9D +:109CD0000020009CF01F003D3018E7480208C7DB59 +:109CE000301CF01F002E301CF01F002DC73B302C05 +:109CF000F01F002AC6CB303CCFCB301CC50B586CB4 +:109D0000C080587CFE91FF4B308CC49B307CC47B60 +:109D1000305CC45B344CF01F002E089A18960E9BE2 +:109D2000F01F0018029B306AED640020ECCCFFDFCE +:109D3000F01F001400991AD60A984A6A009B31CC89 +:109D4000F01F00252FFD580CC0E0E6F8020C0A9C1D +:109D5000A1B8E748020CCCFA009BE6FC0214F01F05 +:109D60000019CC8A189BE6FC0214F01F00160C9C0C +:109D7000F01F001A3FFCCBFA000077AC800210FC09 +:109D8000800091DC800178BC800179788001914C61 +:109D900080019A3880015F60800163488001639C84 +:109DA00080017A1080018F208001FD408001F3A0A6 +:109DB000800177C08002E73680020BFC80020A70C7 +:109DC00080020B408000917C800214708000920021 +:109DD00080019E0080016E78800091E8D401202DE2 +:109DE000FACAFFF415D8BAD87409500915C8300B4F +:109DF000BAC8169CF01F00022FEDD80280019AD835 +:109E0000EBCD40E049F51697EAFC0214300BF01F49 +:109E1000001EF01F001EEEC6FFDFEF3B00200C9A75 +:109E20000E9CF01F001BC150EAF8020CA1D8202D97 +:109E30000C9BEB48020C306A1A9CEF360020F01F96 +:109E400000150C9B0E9CF01F00142FED581CC060D9 +:109E5000EAF8020CEDB80001C0600E9CF01F000F84 +:109E6000E3CD80E0301B300CF01F000D302B300CA8 +:109E7000F01F000B0E9CF01F0009E3CD80E00000F6 +:109E8000000077AC80020B40800196C88001914CA5 +:109E90008002E73680019AD8800091E88001984CD2 +:109EA000EBCD40E0202D18951697580CC0513FFC83 +:109EB0002FEDE3CD80E0580BCFB0E04B0020FE9BB0 +:109EC000FFF8FAC6FFFE306AE06B00FF0C9CF01F43 +:109ED0000008306A202D0C9B1A9CF01F00060E9B78 +:109EE0000A9CF01F00052FEDCE4B0000800091D0A2 +:109EF0008002E73680019AD8EBCD408048B7EEF873 +:109F000002045828C030E3CFC080F01F0009581C5D +:109F1000F9BC0109EFF80083F9B90010F1D9E03874 +:109F2000EFF80A83E3CD8080000077AC80020A84DA +:109F3000D40148B9F338000A104CF36C000A7218C7 +:109F40005808C0B05828C0803028726C9318301B55 +:109F500072595D19D80AD80ADA0A0000000079C8D7 +:109F60004828916B915C5EFC000079C8EBCD40C045 +:109F7000203D5CBBBA89502B109714965CC85C8856 +:109F80005807C0513FFC2FDDE3CD80C05C784959B4 +:109F90005018B28C3048FAC9FFF8300A306B492C9F +:109FA000F01F0012581CCEF11B89491A1898B48969 +:109FB000306B1A99300A48FCF01F000C581CCE3147 +:109FC00048D8300AB007306B304848CCFA0800094E +:109FD000F01F0006581CCD7148989146CD5B0000DB +:109FE00000007A288003B8108001776C0000025CC2 +:109FF0008003B8180000025E8003B820000079C812 +:10A00000EBCD40C030074A161AD78D078D17ED6784 +:10A010000008ED670009ED67000A8D378D470E983F +:10A020000E9949BA0E9B302CF01F001A2FFD580CC8 +:10A03000C0413FFCE3CD80C01AD70E980E99496A03 +:10A040000E9B304CF01F00132FFD580CCF301AD749 +:10A050000E980E99491A0E9B32ECF01F000E2FFD40 +:10A06000580CCE8031483019E06A138830AB0E9C12 +:10A07000F01F000B581CCDE10E9BECCCFFF4F01F41 +:10A080000009581CCD71CD7B000079C88001A0F07B +:10A0900080016E788001A1A08001A0A480019F6C46 +:10A0A000800144F8D401F01F000E48EA74085838C3 +:10A0B000C12030289508F539000A3008F009180049 +:10A0C000C020D8023018300B9518487C487AF01F11 +:10A0D0000008D80230089508D80200008001DA365E +:10A0E000000079C88001DA5880018E348001EF20A9 +:10A0F000EBCD408048973018EF6800086E4958094A +:10A10000C0A0308CF01F00066E4C3009485A6E3BE0 +:10A11000F01F0005E3CD8080000079C880019F30EA +:10A120008001A1CC80014558D4014989F80C11FF68 +:10A13000F338000A106CF36C000AC1E1F33800092F +:10A14000F8081800C19072185808C161F338000867 +:10A15000F8081800C06072085808C0F05818C0C04D +:10A160003018300B931848AA48ACF01F000B300B86 +:10A17000331CF01F000AD802301B485A930B488C3E +:10A18000F01F0005D8020000000079C880018E345D +:10A190008001DA588001EF2080016D6C8001DA8443 +:10A1A000EBCD404048766C3CF01F0007308CF01F30 +:10A1B000000730083009ED6800088D09E3CD8040C4 +:10A1C000000079C8800145308001A128D401308C7D +:10A1D000F01F0002D80A00008001A128EBCD4080CA +:10A1E00048E76E185828C030E3CD80806E58300B99 +:10A1F0006E6C5D18300B8F1B4899F2FA0324F2F84D +:10A2000003201438C040169CF01F0006300B332C7E +:10A21000F01F0005E3CD8080000079C8000084CCE9 +:10A2200080018CE480016D6CEBCD40C018971696D0 +:10A23000F01F0009C0C06E0C581CC0700C9B0E9C17 +:10A24000F01F0006CF91302CE3CD80C03FDCE3CD82 +:10A2500080C000008001462C80014636EBCD404096 +:10A26000301818969908F01F00040C9CF01F00038A +:10A27000E3CD80408001463280014634D401580C41 +:10A28000C030F01F0002D80280014630D4013008EF +:10A290009908F01F0002D8028001462ED401189EB2 +:10A2A000580AC0C196199688F9D9C010103CC165EA +:10A2B000F2C8FFFF973AB618D802581AC06096192C +:10A2C000F2C8FFFFB618D802969996881039C0F4E4 +:10A2D0007648F0090709B889CF3B1D897648F00C0C +:10A2E0000B099619F2C8FFFFB618D8023008973844 +:10A2F000B8889619F2C8FFFFB618D802EBCD408097 +:10A300001897580AC1D1961C9689FDDCC010FCC86C +:10A31000FFFF1238F7FA4A03F7F85004F1DEE508B8 +:10A32000EFF95801F1F95E00EFFA5800F1FA5E0119 +:10A33000F7FC5201F8C8FFFEB618E3CD8080581A2A +:10A34000C070961CF8C8FFFEB618E3CD8080969AC0 +:10A350009689F4C8FFFF1238C09476481408119902 +:10A36000B889118AB89A961CCEEB30089738B8088D +:10A37000961CF8C8FFFEB618E3CD8080EBCD408078 +:10A38000189E169C580AC0F1961B9889EFDBC010E6 +:10A39000EEC8FFFD1238C205F6C8FFFC993AB8189E +:10A3A000E3CD8080581AC070981BF6C8FFFCB8181F +:10A3B000E3CD8080969B9889F6C8FFFD1238C1C412 +:10A3C000784A160A15B8BC8815A9BC991598BCA876 +:10A3D0001589BCB9CEAB1DB8784A0E0AB4881DA940 +:10A3E000B4991D98B4A81D89B4B9981BF6C8FFFC90 +:10A3F000B818E3CD8080300899389D08981BF6C8BE +:10A40000FFFCB818E3CD8080EBCD4068189316951B +:10A410001496F01F000C0C9A0A9BE6CCFFFFF01F6D +:10A4200000090C9A0A9BE6CCFFFEF01F00060C9A6E +:10A430000A9BE6CCFFFDF01F0003E3CD806800001F +:10A440008001A29CD4211697189596141496F01F9B +:10A4500000080C9A0E9BEACCFFFEF01F00060BC80A +:10A460005808F1D4E108EFF81C01D8228001A2FCC1 +:10A470008001A408EBCD4068189316951496F01F40 +:10A4800000060C9A0A9BE6CCFFFCF01F0003E3CD0C +:10A49000806800008001A37CEBCD4068189316957E +:10A4A0001496F01F00090C9A0A9BE6CCFFFCF01FE3 +:10A4B00000070C9A0A9BE6CCFFFAF01F0004E3CDDC +:10A4C000806800008001A37C8001A2FCEBCD406885 +:10A4D000189316951496F01F000F0C9A0A9BE6CC61 +:10A4E000FFFCF01F000D0C9A0A9BE6CCFFFBF01F4F +:10A4F000000A0C9A0A9BE6CCFFFAF01F00070C9AA0 +:10A500000A9BE6CCFFF9F01F0004E3CD8068000051 +:10A510008001A37C8001A29CEBCD40681893169526 +:10A520001496F01F000C0C9A0A9BE6CCFFFCF01F5F +:10A53000000A0C9A0A9BE6CCFFFAF01F00080C9A5E +:10A540000A9BE6CCFFF9F01F0005E3CD8068000010 +:10A550008001A37C8001A2FC8001A29CEBCD40681D +:10A56000189316951496F01F00150C9A0A9BE6CCCA +:10A57000FFFCF01F00120C9A0A9BE6CCFFF8F01FBC +:10A5800000100C9A0A9BE6CCFFF6F01F000D0C9A07 +:10A590000A9BE6CCFFF4F01F00090C9A0A9BE6CC5C +:10A5A000FFF0F01F00070C9A0A9BE6CCFFEEF01FAD +:10A5B0000004E3CD806800008001A37C8001A2FC40 +:10A5C000EBCD4068189316951496F01F00090C9A6D +:10A5D0000A9BE6CCFFFCF01F00060C9A0A9BE6CC17 +:10A5E000FFF8F01F0003E3CD806800008001A37C2A +:10A5F000EBCD4068189316951496F01F00060C9A40 +:10A600000A9BE6CCFFFCF01F0003E3CD806800004E +:10A610008001A37CEBCD4068189316951496F01F2B +:10A62000000C0C9A0A9BE6CCFFFCF01F00090C9A68 +:10A630000A9BE6CCFFF8F01F00060C9A0A9BE6CCBA +:10A64000FFF4F01F0003E3CD806800008001A37CCD +:10A65000EBCD4068189316951496F01F00330C9AB2 +:10A660000A9BE6CCFFFCF01F00300C9A0A9BE6CC5C +:10A67000FFF8F01F002D0C9A0A9BE6CCFFF4F01FA8 +:10A68000002B0C9A0A9BE6CCFFF2F01F00280C9AD4 +:10A690000A9BE6CCFFF0F01F00250C9A0A9BE6CC43 +:10A6A000FFEEF01F00220C9A0A9BE6CCFFECF01F95 +:10A6B000001F0C9A0A9BE6CCFFEAF01F001C0C9AC4 +:10A6C0000A9BE6CCFFE8F01F00190C9A0A9BE6CC27 +:10A6D000FFE6F01F00160C9A0A9BE6CCFFE4F01F81 +:10A6E00000130C9A0A9BE6CCFFE2F01F00110C9AB3 +:10A6F0000A9BE6CCFFE1F01F000E0C9A0A9BE6CC09 +:10A70000FFE0F01F00090C9A0A9BE6CCFFDCF01F6B +:10A7100000060C9A0A9BE6CCFFD8F01F0005E3CD9B +:10A72000806800008001A37C8001A2FC8001A29CC3 +:10A73000EBCD4068189316951496F01F00120C9AF2 +:10A740000A9BE6CCFFFCF01F00100C9A0A9BE6CC9B +:10A75000FFFBF01F000D0C9A0A9BE6CCFFFAF01FDE +:10A76000000A0C9A0A9BE6CCFFF9F01F00070C9A2E +:10A770000A9BE6CCFFF8F01F0004E3CD80680000E0 +:10A780008001A37C8001A29CEBCD406818931695B4 +:10A790001496F01F00060C9A0A9BE6CCFFFCF01FF3 +:10A7A0000003E3CD806800008001A37CEBCD40680E +:10A7B000189316951496F01F00060C9A0A9BE6CC87 +:10A7C000FFFCF01F0003E3CD806800008001A37C44 +:10A7D000EBCD4068189316951496F01F00060C9A5E +:10A7E0000A9BE6CCFFFCF01F0003E3CD806800006D +:10A7F0008001A37CEBCD4068189316951496F01F4A +:10A8000000060C9A0A9BE6CCFFFCF01F0003E3CD88 +:10A81000806800008001A37CEBCD406818931695FA +:10A820001496F01F00060C9A0A9BE6CCFFFCF01F62 +:10A830000003E3CD806800008001A37CEBCD40687D +:10A84000189316951496F01F00060C9A0A9BE6CCF6 +:10A85000FFFCF01F0003E3CD806800008001A37CB3 +:10A86000EBCD4068189316951496F01F00060C9ACD +:10A870000A9BE6CCFFFCF01F0003E3CD80680000DC +:10A880008001A37CEBCD4068189316951496F01FB9 +:10A8900000060C9A0A9BE6CCFFFCF01F0003E3CDF8 +:10A8A000806800008001A37CEBCD4068189316956A +:10A8B0001496F01F00060C9A0A9BE6CCFFFCF01FD2 +:10A8C0000004E3CD806800008001A37C8001A650D5 +:10A8D000EBCD4068189316951496F01F00060C9A5D +:10A8E0000A9BE6CCFFFCF01F0003E3CD806800006C +:10A8F0008001A37CEBCD4068189316951496F01F49 +:10A9000000090C9A0A9BE6CCFFFCF01F00060C9A8B +:10A910000A9BE6CCFFF8F01F0003E3CD806800003F +:10A920008001A37CEBCD4068189316951496F01F18 +:10A9300000060C9A0A9BE6CCFFFCF01F0003E3CD57 +:10A94000806800008001A37CEBCD406818931695C9 +:10A950001496F01F00090C9A0A9BE6CCFFFCF01F2E +:10A9600000060C9A0A9BE6CCFFF8F01F0003E3CD2B +:10A97000806800008001A37CEBCD40681893169599 +:10A980001496F01F00090C9A0A9BE6CCFFFCF01FFE +:10A9900000060C9A0A9BE6CCFFF8F01F0003E3CDFB +:10A9A000806800008001A37CEBCD40681893169569 +:10A9B0001496F01F00060C9A0A9BE6CCFFFCF01FD1 +:10A9C0000003E3CD806800008001A37CEBCD4068EC +:10A9D000189316951496F01F00090C9A0A9BE6CC62 +:10A9E000FFFCF01F00060C9A0A9BE6CCFFF8F01F54 +:10A9F0000003E3CD806800008001A37CEBCD4068BC +:10AA0000189316951496F01F00060C9A0A9BE6CC34 +:10AA1000FFFCF01F0003E3CD806800008001A37CF1 +:10AA2000EBCD4068189316951496F01F00090C9A08 +:10AA30000A9BE6CCFFFCF01F00060C9A0A9BE6CCB2 +:10AA4000FFF8F01F0003E3CD806800008001A37CC5 +:10AA5000EBCD4068189316951496F01F00090C9AD8 +:10AA60000A9BE6CCFFFCF01F00060C9A0A9BE6CC82 +:10AA7000FFF8F01F0003E3CD806800008001A37C95 +:10AA8000EBCD4068189316951496F01F00060C9AAB +:10AA90000A9BE6CCFFFCF01F0003E3CD80680000BA +:10AAA0008001A37CEBCD4068189316951496F01F97 +:10AAB00000060C9A0A9BE6CCFFFCF01F0003E3CDD6 +:10AAC000806800008001A37CEBCD40681893169548 +:10AAD0001496F01F00060C9A0A9BE6CCFFFCF01FB0 +:10AAE0000003E3CD806800008001A37CEBCD4068CB +:10AAF000189316951496F01F00060C9A0A9BE6CC44 +:10AB0000FFFCF01F0004E3CD806800008001A37CFF +:10AB10008001A29CEBCD4068189316951496F01F07 +:10AB200000060C9A0A9BE6CCFFFCF01F0004E3CD64 +:10AB3000806800008001A37C8001D434EBCD4068A4 +:10AB4000189316951496F01F00330C9A0A9BE6CCC6 +:10AB5000FFDEF01F00310C9A0A9BE6CCFFD4F01FF9 +:10AB6000002F0C9A0A9BE6CCFFC2F01F002D0C9A16 +:10AB70000A9BE6CCFFBFF01F002B0C9A0A9BE6CC89 +:10AB8000FFBCF01F00290C9A0A9BE6CCFFB0F01F17 +:10AB900000270C9A0A9BE6CCFFACF01F00250C9A0C +:10ABA0000A9BE6CCFFA4F01F00230C9A0A9BE6CC7C +:10ABB000FF9CF01F00210C9A0A9BE6CCFF98F01F27 +:10ABC000001F0C9A0A9BE6CCFF8CF01F001D0C9A0C +:10ABD0000A9BE6CCFF72F01F001B0C9A0A9BE6CC86 +:10ABE000FF68F01F00190C9A0A9BE6CCFF44F01F87 +:10ABF00000170C9A0A9BE6CCFF50F01F00150C9A28 +:10AC00000A9BE6CCFF30F01F0013E3CD8068000004 +:10AC10008001D3448001D2DC8001D2748001CAF863 +:10AC20008001C9D88001D8608001CA688001CA9CAF +:10AC30008001CA0C8001C9A48001D4348001CDB444 +:10AC40008001CE848001D5588001D6B08001D4E443 +:10AC50008001CFFCEBCD4068189316951496F01F39 +:10AC6000000F0C9A0A9BE6CCFFFCF01F000D0C9A1B +:10AC70000A9BE6CCFFFAF01F000B0C9A0A9BE6CC6D +:10AC8000FFF9F01F00080C9A0A9BE6CCFFF8F01FB2 +:10AC90000006E3CD806800008001A37C8001A2FC57 +:10ACA0008001A29C8001AB3CEBCD406C14951296C8 +:10ACB00018921693E06A00DC129B0A9CF01F001A9F +:10ACC000ECC9FF98EACAFF98069B049CF01F001786 +:10ACD000ECC9FFBCEACAFFBC069B049CF01F001431 +:10ACE000ECC9FF68EACAFF68069B049CF01F0011CC +:10ACF000ECC9FF50EACAFF50069B049CF01F000EEF +:10AD0000ECC9FF44EACAFF44069B049CF01F000BF9 +:10AD1000ECC9FF30EACAFF30069B049CF01F000814 +:10AD2000E3CD806C8002E7368001D1588001D24C9F +:10AD30008001D1E88001D1C08001D21C8001CF9C6C +:10AD4000EBCD40EC1296F2E80000F4E90000ECE8EC +:10AD50000008F4E90008ECE20010F4E30010ECE86D +:10AD6000001814971695F4E90018E06B00E85D15DB +:10AD70008F7CC0D030CA6C7BF01F00066E7A6C7975 +:10AD8000149C0A9B2F492F4AF01F0003E3CD80EC4F +:10AD9000800091DC8001ACA8EBCD40C014971696E2 +:10ADA00074385808C160949E948AF60E00081438CE +:10ADB000F5DEE916F9B80900EFF89A03580CC090CF +:10ADC0005809C0C1189B0C9A6E4C1C0CF01F000A4D +:10ADD0008E180C08AE18E3CD80C05819CFA16E4B69 +:10ADE0000C9A1C0BF01F00048E180C08AE18E3CD53 +:10ADF00080C00000800091DCEBCD40E016971496F7 +:10AE00001895581AC0B0F01F000C0C99189B0E9A98 +:10AE10000A9CF01F000AE3CD80E09698968614996C +:10AE20001016169A0C9BF01F00053008EA060B0856 +:10AE3000E3CD80E0800091B88001AD98EBCD406813 +:10AE4000189316951496F01F00060C9A0A9BE6CCF0 +:10AE5000FFFCF01F0004E3CD806800008001A37CAC +:10AE60008001ADF8EBCD4068189316951496F01F4D +:10AE700000060C9A0A9BE6CCFFFCF01F0004E3CD11 +:10AE8000806800008001A37C8001ADF8EBCD4068B4 +:10AE9000189316951496F01F000F0C9A0A9BE6CC97 +:10AEA000FFFCF01F000C0C9A0A9BE6CCFFF8F01F89 +:10AEB00000090C9A0A9BE6CCFFF4F01F00060C99DF +:10AEC0000A9AE6CCFFF0320BF01F0003E3CD806856 +:10AED0008001A37C8001AD98EBCD40681893169556 +:10AEE0001496F01F000C0C9A0A9BE6CCFFFCF01F96 +:10AEF00000090C9A0A9BE6CCFFF8F01F00060C999B +:10AF00000A9AE6CCFFF4320BF01F0003E3CD806811 +:10AF10008001A37C8001AD98EBCD40681893169515 +:10AF20001496F01F000C0C9A0A9BE6CCFFFCF01F55 +:10AF300000090C9A0A9BE6CCFFF8F01F00070C9959 +:10AF40000A9AE6CCFFF7303BF01F0004E3CD80689F +:10AF50008001A37C8001A29C8001AD98EBCD40686C +:10AF6000189316951496F01F00180C9A0A9BE6CCBD +:10AF7000FFFCF01F00150C9A0A9BE6CCFFF8F01FAF +:10AF800000120C9A0A9BE6CCFFF4F01F000F0C9AFB +:10AF90000A9BE6CCFFF0F01F000C0C9A0A9BE6CC53 +:10AFA000FFECF01F000A0C9A0A9BE6CCFFEAF01FA8 +:10AFB00000080C990A9AE6CCFFE9303BF01F000527 +:10AFC000E3CD80688001A37C8001A2FC8001A29C6B +:10AFD0008001AD98EBCD4068189316951496F01F3C +:10AFE00000280C9A0A9BE6CCFFFCF01F00250C9A67 +:10AFF0000A9BE6CCFFF8F01F00220C9A0A9BE6CCD5 +:10B00000FFF4F01F00200C9A0A9BE6CCFFF2F01F21 +:10B01000001E0C9A0A9BE6CCFFF1F01F001B0C9A55 +:10B020000A9BE6CCFFF0F01F00180C9A0A9BE6CCB6 +:10B03000FFEFF01F00150C9A0A9BE6CCFFEEF01F05 +:10B0400000120C990A9AE6CCFFED306BF01F000F4E +:10B050000C9A0A9BE6CCFFE7F01F000B0C9A0A9BA8 +:10B06000E6CCFFE6F01F00080C990A9AE6CCFFE553 +:10B07000320BF01F0006E3CD806800008001A37C46 +:10B080008001A2FC8001A29C8001AD98EBCD4068BC +:10B09000189316951496F01F00150C9A0A9BE6CC8F +:10B0A000FFFCF01F00120C9A0A9BE6CCFFF8F01F81 +:10B0B000000F0C9A0A9BE6CCFFF4F01F000C0C9AD0 +:10B0C0000A9BE6CCFFF0F01F000A0C9A0A9BE6CC24 +:10B0D000FFEEF01F00080C990A9AE6CCFFED303B1A +:10B0E000F01F0005E3CD80688001A37C8001A2FCF5 +:10B0F0008001A29C8001AD98EBCD40681893169515 +:10B100001496F01F00120C9A0A9BE6CCFFFCF01F6D +:10B1100000100C9A0A9BE6CCFFFBF01F000D0C9967 +:10B120000A9AE6CCFFFA302BF01F000A0C9A0A9B11 +:10B13000E6CCFFF8F01F00050C9A0A9BE6CCFFF462 +:10B14000F01F0002E3CD80688001A37C8001A29CF7 +:10B150008001AD98EBCD4068189316951496F01FBA +:10B1600000120C9A0A9BE6CCFFFCF01F00100C9A10 +:10B170000A9BE6CCFFFBF01F000D0C990A9AE6CC67 +:10B18000FFFA302BF01F000A0C9A0A9BE6CCFFF85E +:10B19000F01F00050C9A0A9BE6CCFFF4F01F00029A +:10B1A000E3CD80688001A37C8001A29C8001AD98E2 +:10B1B000EBCD4068189316951496F01F000C0C9A6E +:10B1C0000A9BE6CCFFFCF01F000A0C9A0A9BE6CC17 +:10B1D000FFFBF01F00070C990A9AE6CCFFFA302B10 +:10B1E000F01F0004E3CD80688001A37C8001A29C55 +:10B1F0008001AD98EBCD4068189316951496F01F1A +:10B2000000090C9A0A9BE6CCFFFCF01F00070C9982 +:10B210000A9AE6CCFFFB303BF01F0004E3CD8068C8 +:10B220008001A37C8001A29C8001AD98EBCD406899 +:10B23000189316951496F01F00090C9A0A9BE6CCF9 +:10B24000FFFCF01F00070C990A9AE6CCFFFB303B8D +:10B25000F01F0004E3CD80688001A37C8001A29CE4 +:10B260008001AD98EBCD4068189316951496F01FA9 +:10B2700000090C9A0A9BE6CCFFFCF01F00070C9912 +:10B280000A9AE6CCFFFB303BF01F0004E3CD806858 +:10B290008001A37C8001A29C8001AD98EBCD406829 +:10B2A000189316951496F01F000C0C9A0A9BE6CC86 +:10B2B000FFFCF01F00090C9A0A9BE6CCFFF8F01F78 +:10B2C00000070C990A9AE6CCFFF7303BF01F000408 +:10B2D000E3CD80688001A37C8001A29C8001AD98B1 +:10B2E000EBCD4068189316951496F01F000C0C9A3D +:10B2F0000A9BE6CCFFFCF01F00090C9A0A9BE6CCE7 +:10B30000FFF8F01F00070C990A9AE6CCFFF7303BD4 +:10B31000F01F0004E3CD80688001A37C8001A29C23 +:10B320008001AD98EBCD4068189316951496F01FE8 +:10B33000000C0C9A0A9BE6CCFFFCF01F00090C9A4B +:10B340000A9BE6CCFFF8F01F00070C990A9AE6CC9E +:10B35000FFF7303BF01F0004E3CD80688001A37C41 +:10B360008001A29C8001AD98EBCD406818931695A2 +:10B370001496F01F000C0C9A0A9BE6CCFFFCF01F01 +:10B3800000090C9A0A9BE6CCFFF8F01F00070C9905 +:10B390000A9AE6CCFFF7303BF01F0004E3CD80684B +:10B3A0008001A37C8001A29C8001AD98EBCD406818 +:10B3B000189316951496F01F00090C9A0A9BE6CC78 +:10B3C000FFFCF01F00070C990A9AE6CCFFFB303B0C +:10B3D000F01F0004E3CD80688001A37C8001A29C63 +:10B3E0008001AD98EBCD4068169514961893F01F28 +:10B3F00000220C990A9AE6CCFFFC308BF01F001F4C +:10B400000C9A0A9BE6CCFFF4F01F001B0C9A0A9BD7 +:10B41000E6CCFFF0F01F00180C9A0A9BE6CCFFEC7C +:10B42000F01F00150C9A0A9BE6CCFFE8F01F0012F3 +:10B430000C9A0A9BE6CCFFE4F01F000F0C9A0A9BC3 +:10B44000E6CCFFE0F01F000E0C9A0A9BE6CCFFDE74 +:10B45000F01F000B0C9A0A9BE6CCFFDCF01F0008E3 +:10B460000C990A9AE6CCFFDA302BF01F0004E3CDEA +:10B47000806800008001A37C8001AD988001A2FC5F +:10B48000EBCD4068189316951496F01F00090C9A9E +:10B490000A9BE6CCFFFCF01F00070C990A9AE6CC49 +:10B4A000FFFB303BF01F0004E3CD80688001A37CEC +:10B4B0008001A29C8001AD98EBCD40681695149652 +:10B4C0001893F01F00060C990A9AE6CCFFFC308B0B +:10B4D000F01F0003E3CD80688001A37C8001AD985C +:10B4E000EBCD4068189316951496F01F00090C9A3E +:10B4F0000A9BE6CCFFFCF01F00070C990A9AE6CCE9 +:10B50000FFFB303BF01F0004E3CD80688001A37C8B +:10B510008001A29C8001AD98EBCD406818931695F0 +:10B520001496F01F00100C9A0A9BE6CCFFFCF01F4B +:10B53000000E0C990A9AE6CCFFFB306BF01F000B53 +:10B540000A9AE6CCFFF50C99306BF01F00080C9AB4 +:10B550000A9BE6CCFFEFF01F0004E3CD80680000FB +:10B560008001A37C8001A29C8001AD98EBCD406856 +:10B57000169514961893F01F000C0C990A9AE6CCB5 +:10B58000FFFC306BF01F00090C9A0A9BE6CCFFF61B +:10B59000F01F00070C9A0A9BE6CCFFF5F01F000491 +:10B5A000E3CD80688001A37C8001AD988001A29CDE +:10B5B000EBCD4068169514961893F01F000D0C996A +:10B5C0000A9AE6CCFFFC306BF01F000A0A9AE6CC20 +:10B5D000FFF60C99302BF01F00070C9A0A9BE6CC63 +:10B5E000FFF4F01F0005E3CD806800008001A37C1C +:10B5F0008001AD988001AB3CEBCD40681695149668 +:10B600001893F01F000D0C990A9AE6CCFFFC306BE2 +:10B61000F01F000A0A9AE6CCFFF60C99302BF01FB7 +:10B6200000070C9A0A9BE6CCFFF4F01F0005E3CD5F +:10B63000806800008001A37C8001AD988001AB3C54 +:10B64000EBCD4068169514961893F01F00100C99D6 +:10B650000A9AE6CCFFFC306BF01F000D0C9A0A9B97 +:10B66000E6CCFFF6F01F000B0C9A0A9BE6CCFFF429 +:10B67000F01F00080C990A9AE6CCFFF2302BF01F5D +:10B680000004E3CD806800008001A37C8001AD98B8 +:10B690008001A2FCEBCD4068169514961893F01F1C +:10B6A000000A0C990A9AE6CCFFFC306BF01F0007E9 +:10B6B0000C990A9AE6CCFFF6302BF01F0004E3CD7C +:10B6C000806800008001A37C8001AD98EBCD4068CC +:10B6D000169514961893F01F000A0C990A9AE6CC56 +:10B6E000FFFC306BF01F00070C990A9AE6CCFFF6BE +:10B6F000302BF01F0004E3CD806800008001A37CA4 +:10B700008001AD98EBCD4068189316951496F01F04 +:10B7100000220C9A0A9BE6CCFFFCF01F00200C9A3A +:10B720000A9BE6CCFFFAF01F001D0C9A0A9BE6CCA0 +:10B73000FFF8F01F001A0C990A9AE6CCFFF6306B5E +:10B74000F01F00170C9A0A9BE6CCFFF0F01F0015C3 +:10B750000C9A0A9BE6CCFFEFF01F00120C990A9A94 +:10B76000E6CCFFEE302BF01F000E0C9A0A9BE6CCC5 +:10B77000FFECF01F00090C9A0A9BE6CCFFE8F01FD3 +:10B7800000060C9A0A9BE6CCFFE4F01F0007E3CD0D +:10B79000806800008001A37C8001A2FC8001AD983C +:10B7A0008001A29C8001AB3CEBCD406816951496BD +:10B7B0001893F01F000C0C990A9AE6CCFFFC306B32 +:10B7C000F01F00090C9A0A9BE6CCFFF6F01F000759 +:10B7D0000C9A0A9BE6CCFFF5F01F0004E3CD8068CD +:10B7E0008001A37C8001AD988001A29CEBCD4068D4 +:10B7F000169514961893F01F000C0C990A9AE6CC33 +:10B80000FFFC306BF01F00090C9A0A9BE6CCFFF698 +:10B81000F01F00070C9A0A9BE6CCFFF5F01F00040E +:10B82000E3CD80688001A37C8001AD988001A29C5B +:10B83000EBCD4068189316951496F01F00120C9AE1 +:10B840000A9BE6CCFFFCF01F00100C9A0A9BE6CC8A +:10B85000FFFAF01F000D0C9A0A9BE6CCFFF8F01FD0 +:10B86000000A0A9AE6CCFFF60C99306BF01F00072D +:10B870000C9A0A9BE6CCFFF0F01F0005E3CD806830 +:10B880008001A37C8001A2FC8001AD988001AB3CCB +:10B89000EBCD4068189316951496F01F00100C9A83 +:10B8A0000A9BE6CCFFFCF01F000E0C9A0A9BE6CC2C +:10B8B000FFFAF01F000B0C990A9AE6CCFFF8306BE8 +:10B8C000F01F00080C990A9AE6CCFFF2302BF01F0B +:10B8D0000005E3CD806800008001A37C8001A2FC0C +:10B8E0008001AD98EBCD4068189316951496F01F23 +:10B8F00000090C9A0A9BE6CCFFFFF01F00060C998A +:10B900000A9AE6CCFFFE302BF01F0003E3CD8068DF +:10B910008001A29C8001AD98EBCD406816951496ED +:10B920001893F01F00130C990A9AE6CCFFFF306BB6 +:10B93000F01F00100C9A0A9BE6CCFFF9F01F000CD8 +:10B940000C9A0A9BE6CCFFF8F01F00090A9AE6CC95 +:10B95000FFF70C99306BF01F00070C9A0A9BE6CC9E +:10B96000FFF1F01F0003E3CD806800008001A29C7E +:10B970008001AD98EBCD4068189316951496F01F92 +:10B9800000060C9A0A9BE6CCFFFCF01F0004E3CDF6 +:10B99000806800008001A37C8001B918EBCD40686D +:10B9A0001696149518931499169A306BF01F000888 +:10B9B0000A9A0C9BE6CCFFFAF01F00060A9A0C9B31 +:10B9C000E6CCFFF9F01F0003E3CD80688001AD985D +:10B9D0008001A29CEBCD4068189316951496F01F39 +:10B9E00000060C9A0A9BE6CCFFFCF01F0004E3CD96 +:10B9F000806800008001A37C8001B99CEBCD406889 +:10BA0000189316951496F01F00090C9A0A9BE6CC21 +:10BA1000FFFFF01F00060C990A9AE6CCFFFE306B80 +:10BA2000F01F0003E3CD80688001A29C8001AD98E7 +:10BA3000EBCD4068189316951496F01F00060C9AEB +:10BA40000A9BE6CCFFFCF01F0004E3CD80680000F9 +:10BA50008001A37C8001B9FCD4011499169A308B23 +:10BA6000F01F0002D80200008001AD98EBCD4068C5 +:10BA7000169514961893F01F00090A9AE6CCFFFC5D +:10BA80000C99306BF01F00060C9A0A9BE6CCFFF66F +:10BA9000F01F0004E3CD80688001A37C8001AD9895 +:10BAA0008001A2FCEBCD4068189316951496F01F08 +:10BAB00000090C9A0A9BE6CCFFFCF01F00070C99CA +:10BAC0000A9AE6CCFFFB303BF01F0004E3CD806810 +:10BAD0008001A37C8001A29C8001AD98D4011499BF +:10BAE000169A320BF01F0002D80200008001AD98B8 +:10BAF000EBCD4068189316951496F01F00180C9A19 +:10BB00000A9BE6CCFFE0F01F00160C9A0A9BE6CCDD +:10BB1000FFDEF01F00140C9A0A9BE6CCFFDDF01F3D +:10BB200000110C990A9AE6CCFFDC306BF01F000E76 +:10BB30000C9A0A9BE6CCFFD6F01F000C0C9A0A9BCD +:10BB4000E6CCFFCEF01F00070C9A0A9BE6CCFFCD97 +:10BB5000F01F0004E3CD80688001BADC8001A2FC04 +:10BB60008001A29C8001AD988001BA58EBCD40685D +:10BB7000189316951496F01F00060C9A0A9BE6CCB3 +:10BB8000FFFCF01F0004E3CD806800008001A37C6F +:10BB90008001BAF0D4011499169A303BF01F0002CC +:10BBA000D80200008001AD98EBCD40E018971695C3 +:10BBB0001496F01F000D6E1C580CC0800C990A9A48 +:10BBC0006E0BF01F000AE3CD80E05816C0918A99F1 +:10BBD0006A4812088F186E098A181208AA18E3CD4D +:10BBE00080E000008001A37C8001AD98EBCD40682F +:10BBF000189316951496F01F00060C9A0A9BE6CC33 +:10BC0000FFFCF01F0004E3CD806800008001A37CEE +:10BC10008001BBA8EBCD4068189316951496F01FD1 +:10BC200000100C9A0A9BE6CCFFFCF01F000E0C994A +:10BC30000A9AE6CCFFFB303BF01F000B0A9AE6CCD9 +:10BC4000FFF80C99308BF01F00080C9A0A9BE6CC89 +:10BC5000FFF0F01F0006E3CD806800008001A37CA8 +:10BC60008001A29C8001AD988001BBA8EBCD40680B +:10BC7000169514961893F01F00090A9AE6CCFFFC5B +:10BC80000C99308BF01F00060C9A0A9BE6CCFFF44F +:10BC9000F01F0004E3CD80688001A37C8001AD9893 +:10BCA0008001BBA8EBCD40801697189B580AC0F1C5 +:10BCB0008E1C8E89FDDCC010FCC8FFF91238C285CD +:10BCC000F8C8FFF88F3AAE18E3CD8080581AC070DC +:10BCD0008E1CF8C8FFF8AE18E3CD80808E9A8E894E +:10BCE000F4C8FFF91238C2C46E48140811F9B889B3 +:10BCF00011EAB89A11D9B8A911CAB8BA11B9B8C914 +:10BD000011AAB8DA1199B8E9118AB8FACE2B17F846 +:10BD10006E4A1C0AB48817E9B49917D8B4A817C991 +:10BD2000B4B917B8B4C817A9B4D91798B4E8178923 +:10BD3000B4F98E1CF8C8FFF8AE18E3CD8080300B44 +:10BD4000308A8F3BF01F00028E1CCC4B800091D0BC +:10BD5000EBCD4068189316951496F01F000C0C9AC2 +:10BD60000A9BE6CCFFF8F01F000A0C9A0A9BE6CC6F +:10BD7000FFF6F01F00070C9A0A9BE6CCFFF4F01FB9 +:10BD80000005E3CD806800008001BCA48001A2FC16 +:10BD90008001AB3CEBCD40F8206D169714961499BA +:10BDA0001895169A306BF01F002D0C9A0E9BEACC5A +:10BDB000FFFAF01F002B0C9A0E9BEACCFFF9F01F44 +:10BDC00000280C9A0E9BEACCFFF8F01F00260C9A74 +:10BDD0000E9BEACCFFF0F01F00240C9A0E9BEACCDD +:10BDE000FFECF01F0021318A0E9B1A9CF01F001FF0 +:10BDF000EAC3FFE81A940C9A1A9B069CF01F001ADB +:10BE00005816C1801A9B0C9A6A7CF01F00199A98E8 +:10BE10008E992048F00901098B690C9A069C0E9BAB +:10BE2000F01F00116A698E181208AE182FADE3CD0D +:10BE300080F86A698E182FC81208E06B00E8BA080B +:10BE40006E5CF01F000C8B7CCF20505C1A9B0C9A10 +:10BE5000F01F0007CE3B00008001AD988001A29C3E +:10BE60008001BCA48001A37C800091DC8001BD50D6 +:10BE70008001D3ECEBCD4068189316951496F01F13 +:10BE800000120C9A0A9BE6CCFFFCF01F00100C9AE3 +:10BE90000A9BE6CCFFFAF01F000D0C9A0A9BE6CC39 +:10BEA000FFF8F01F00090C9A0A9BE6CCFFF4F01F84 +:10BEB00000060C9A0A9BE6CCFFF0F01F0005E3CDCC +:10BEC000806800008001A37C8001A2FC8001BD94F9 +:10BED000EBCD40E0189716951496F01F000B0C9AC6 +:10BEE0000A9BEECCFFFCF01F00090FD93008F009C7 +:10BEF0001800C0700C9A0A9BEECCFFF8F01F0004EB +:10BF0000E3CD80E08001A37C8001B8E48001BD9492 +:10BF1000EBCD4060202D301A18951696FACCFFFE16 +:10BF2000F01F00089A181BF92FE8F0090109AC0965 +:10BF30001BCA8B5A1BD88B482FEDE3CD80600000C5 +:10BF40008001A444EBCD40E07808975818971696E6 +:10BF50007859E049003FE0880004E3CF80E0FEF834 +:10BF6000029AF009032F78455815E0800127E04533 +:10BF70000080CF41780C301AF01F00A1E3CF90E091 +:10BF800078485808C391780C301AF01F009EE3CF10 +:10BF900090E07848F0C90005E049008FFE9BFFDF84 +:10BFA000FEF80264F009032F7848E0480081E08041 +:10BFB000010CE08A002BE0480083E0800118E08556 +:10BFC0000110E0480085CCA1780C301AF01F008FDA +:10BFD000E3CF90E0780C301AF01F008DE3CF90E0B3 +:10BFE0007848F0C90001E049009BFE9BFFB8FEF8CD +:10BFF0000222F009032FE0480081CB01780C301AAF +:10C00000F01F0085E3CF90E05848E08000E4E0486E +:10C010000080CA41781A300B780CF01F00806E0C3B +:10C020000C9B301AF01F007EE3CF90E0780C301AA2 +:10C03000F01F007CE3CF90E0780C301AF01F007AFC +:10C04000E3CF90E0780C301AF01F0078E3CF90E057 +:10C05000780C301AF01F0076E3CF90E0780C301A9D +:10C06000F01F0074E3CF90E0780C301AF01F0072DC +:10C07000E3CF90E0780C301AF01F0070E3CF90E02F +:10C08000780C301AF01F006EE3CF90E0780C301A75 +:10C09000F01F006CE3CF90E0780C301AF01F006ABC +:10C0A000E3CF90E0780C301AF01F0068E3CF90E007 +:10C0B000780C301AF01F0066E3CF90E0780C301A4D +:10C0C000F01F0064E3CF90E0780C301AF01F00629C +:10C0D000E3CF90E0780C301AF01F0060E3CF90E0DF +:10C0E000780C301AF01F005EE3CF90E0780C301A25 +:10C0F000F01F005CE3CF90E0780C301AF01F005A7C +:10C10000E3CF90E0780C301AF01F0058E3CF90E0B6 +:10C11000780C301AF01F0056E3CF90E0780C301AFC +:10C12000F01F0054E3CF90E0780C301AF01F00525B +:10C13000E3CF90E0780C301AF01F0050E3CF90E08E +:10C14000780C301AF01F004EE3CF90E0780C301AD4 +:10C15000F01F004CE3CF90E0780C301AF01F004A3B +:10C16000E3CF90E0780C301AF01F0048E3CF90E066 +:10C17000780C301AF01F0046E3CF90E0780C301AAC +:10C18000F01F0044E3CF90E0780C301AF01F00421B +:10C19000E3CF90E0780C301AF01F0040E3CF90E03E +:10C1A000780C301AF01F003EE3CF90E0780C301A84 +:10C1B000F01F003CE3CF90E0780C0A9AF01F003AA1 +:10C1C0000A9CE3CD80E0780C301AF01F0038E3CFF2 +:10C1D00090E0780C301AF01F0036E3CF90E0780C36 +:10C1E000301AF01F0034E3CF90E0780C301AF01FC3 +:10C1F0000032E3CF90E000008003B8288001AAEC71 +:10C200008001A4988003B9288001B3248001A37C15 +:10C210008003BB688001A4CC800091D08001BC1455 +:10C220008001BAA48001A4748001BA6C8001AC546E +:10C230008001AA808001AE8C8001AAC88001AAA4D6 +:10C240008001AA208001AF5C8001A9CC8001A9787F +:10C250008001A9488001A8F48001A8D08001A884A9 +:10C260008001A8608001B1548001B1B08001B1F4B7 +:10C270008001A8188001AA508001B0F88001A83C74 +:10C280008001A7F48001B4E08001B56C8001B5B0F5 +:10C290008001B5F88001B6408001BED08001B5189C +:10C2A0008001B9748001AE3C8001B3AC8001A6145A +:10C2B0008001B3688001B2E0EBCD40C012971499C1 +:10C2C0008E96109A582CC280E08A0008584CC360A1 +:10C2D000587CC190E3CF80C0580CC0A0581CCFB18F +:10C2E00058EBFE9BFFF9FEF80312F00B032F580BDF +:10C2F000CF21129C0E9BF01F00C28E98F006010CFD +:10C30000E3CD80C0202BE04B007FFE9BFFE5FEF8D5 +:10C3100002F2F00B032F582BE080015DE089001A38 +:10C32000580BC260581BCD71129C0E9BF01F00B6BB +:10C330008E98F006010CE3CD80C0580BCCC1129C46 +:10C340000E9BF01F00B28E98F006010CE3CD80C06A +:10C35000584BC170E0850148585BCBD1129C0E9BB5 +:10C36000F01F00AB8E98F006010CE3CD80C0129C4C +:10C370000E9BF01F00A88E98F006010CE3CD80C044 +:10C38000129C0E9BF01F00A48E98F006010CE3CDCA +:10C3900080C0129C0E9BF01F00A18E98F006010C2D +:10C3A000E3CD80C0129C0E9BF01F009D8E98F0067E +:10C3B000010CE3CD80C0129C0E9BF01F009A8E985A +:10C3C000F006010CE3CD80C0129C0E9BF01F00967E +:10C3D0008E98F006010CE3CD80C0129C0E9BF01FDE +:10C3E00000938E98F006010CE3CD80C0129C0E9B4A +:10C3F000F01F008F8E98F006010CE3CD80C0129CD8 +:10C400000E9BF01F008C8E98F006010CE3CD80C0CF +:10C41000129C0E9BF01F00888E98F006010CE3CD55 +:10C4200080C0129C0E9BF01F00858E98F006010CB8 +:10C43000E3CD80C0129C0E9BF01F00818E98F00609 +:10C44000010CE3CD80C0129C0E9BF01F007E8E98E5 +:10C45000F006010CE3CD80C0129C0E9BF01F007A09 +:10C460008E98F006010CE3CD80C0129C0E9BF01F4D +:10C4700000778E98F006010CE3CD80C0129C0E9BD5 +:10C48000F01F00738E98F006010CE3CD80C0129C63 +:10C490000E9BF01F00708E98F006010CE3CD80C05B +:10C4A000129C0E9BF01F006C8E98F006010CE3CDE1 +:10C4B00080C0129C0E9BF01F00698E98F006010C44 +:10C4C000E3CD80C0129C0E9BF01F00658E98F00695 +:10C4D000010CE3CD80C0129C0E9BF01F00628E9871 +:10C4E000F006010CE3CD80C0129C0E9BF01F005E95 +:10C4F0008E98F006010CE3CD80C0129C0E9BF01FBD +:10C50000005B8E98F006010CE3CD80C0129C0E9B60 +:10C51000F01F00578E98F006010CE3CD80C0129CEE +:10C520000E9BF01F00548E98F006010CE3CD80C0E6 +:10C53000129C0E9BF01F00508E98F006010CE3CD6C +:10C5400080C0129C0E9BF01F004D8E98F006010CCF +:10C55000E3CD80C0129C0E9BF01F00498E98F00620 +:10C56000010CE3CD80C0129C0E9BF01F00468E98FC +:10C57000F006010CE3CD80C0129C0E9BF01F004220 +:10C580008E98F006010CE3CD80C0129C0E9BF01F2C +:10C59000003F8E98F006010CE3CD80C0129C0E9BEC +:10C5A000F01F003B8E98F006010CE3CD80C0129C7A +:10C5B0000E9BF01F00388E98F006010CE3CD80C072 +:10C5C000129C0E9BF01F00348E98F006010CE3CDF8 +:10C5D00080C0129C0E9BF01F00318E98F006010C5B +:10C5E000E3CD80C0129C0E9BF01F002D8E98F006AC +:10C5F000010CE3CD80C000008003BDD88001A49869 +:10C600008003BE148001BC6C8001AE648001A5C0B3 +:10C610008001B4B88001A5F08001B8308001B29CDF +:10C620008001B6948001B6CC8001B9D48001BA30C3 +:10C630008001BB6C8001B7048001B7EC8001BA6C4B +:10C640008001B8908001BE748001A5188001A55CAE +:10C650008001B7A88001A7308001A7888001AE8C37 +:10C660008001AED88001A7D08001AB148001AF1843 +:10C670008001A9FC8001A9A88001AFD48001A92470 +:10C680008001B08C8001A8A88001B22C8001A7ACE9 +:10C690008001B2648001BBEC8001B4808001B3E40E +:10C6A000EBCD40FE208D306A18977853784578019D +:10C6B000FAC2FFE6300B049CF01F00384B88F139BA +:10C6C000010BE06AFFFFFB69001E300B1A9CF01F94 +:10C6D0000035302A1A9B049CF01F0033029A302840 +:10C6E0001A990A9B069CF01F00319A194B08F9D938 +:10C6F000C0101188103CF9B60200F1DCE318E06AC2 +:10C7000000FFF1DAE326EDD9E309FBF93C01F9D6A4 +:10C71000E30C1A944A78118A580AC060F4C80001E0 +:10C72000F9E80008C2918F3CF01F00238F2CC31042 +:10C730006E3A300BF01F0019FB66001F6E2BFB6377 +:10C74000001CFB65001D8E78F5D8C01020281A9CAF +:10C75000FB58001AF01F0013049C1A9B300AF01FAC +:10C7600000121A99029A0A9B069C3008F01F000FCB +:10C770002F8DE3CF90FE9A18F4C90001F9E9000962 +:10C78000F40901095C591208120CBA181206CCCB34 +:10C790002F8DE3CD80FE0000800091D0000087F453 +:10C7A0008001C7B88001A4448001C2B8000079E5C7 +:10C7B000000079E48000920030083019B838B818C9 +:10C7C000B828B80A3008994B993999285EFCD703E4 +:10C7D000EBCD4068189316951496F01F00090C9A3B +:10C7E0000A9BE6CCFFFFF01F00060C9A0A9BE6CCE2 +:10C7F000FFFEF01F0004E3CD806800008001A29CD2 +:10C800008001A2FCEBCD40681696149518931499FC +:10C81000169A303BF01F00050A9A0C9BE6CCFFFDF0 +:10C82000F01F0003E3CD80688001AD988001A29CD9 +:10C83000EBCD40681696149518931499169A303BD0 +:10C84000F01F00050A9A0C9BE6CCFFFDF01F0003C9 +:10C85000E3CD80688001AD988001A29CD431FACEEE +:10C86000FFDC189616971494129210907C157C0198 +:10C87000581AC2D0C153582AC1300D893FF8F00967 +:10C880001800C2100D98E2081900E08B0005E008BE +:10C890001900C6E23FF83009AC88AC99D83A8E1836 +:10C8A000AE383FF80D89F0091800C0D00C9C089AEA +:10C8B0000E9BF01F0034089A0E9BECCCFFFFF01F7C +:10C8C0000031CDCB3008300CAC98D83296285808BF +:10C8D000C4C0B618AE3830088B08AC983FFAAC8AA2 +:10C8E0008E198E08F2081900FE98FFEE1494ECC31E +:10C8F000FFFFC1D8E8081800EDF41E000D9A8E184D +:10C900008E89F408000B5C781019123AE089002631 +:10C91000AE1B6A082FF88B080D89E8091800CB3187 +:10C920008E198E08F2081900FE98FFCEAE39301A23 +:10C930000E9B0C9CF01F0013301A0E9B069CF01FE0 +:10C9400000110D88E4081800CD618E888E990D9A2B +:10C950001218103AE08A000E3FF83009AC88AC9902 +:10C960008E182028AE08C8AB9618B628CB4BDA3AFA +:10C970006A0A6E293018F00A094810498F29C7EB56 +:10C980008001A29CEBCD4040201D1A9E9AF65C7857 +:10C990001ADE1AD6F01F00032FED2FFDE3CD8040E5 +:10C9A0008001C85CEBCD40E0302818951AD8169667 +:10C9B00014973069F01F00072FFD580CC0700E9AB5 +:10C9C0000C9BEACCFFFEF01F0004E3CD80E00000EA +:10C9D0008001C9848001A2FCEBCD40E0301818959D +:10C9E0001AD81696149732A9F01F00072FFD580C7D +:10C9F000C0700E9A0C9BEACCFFFEF01F0004E3CD42 +:10CA000080E000008001C9848001A29CEBCD40E061 +:10CA1000305818951AD8169614973029F01F001020 +:10CA20002FFD580CC190EACCFFFE0E9A0C9BF01F14 +:10CA3000000D0E9A0C9BEACCFFFCF01F000B0E9A27 +:10CA40000C9BEACCFFFBF01F00080E9A0C9BEACC73 +:10CA5000FFFAF01F0005E3CD80E000008001C984EB +:10CA60008001A2FC8001A29CEBCD40E0301818951B +:10CA70001AD8169614973039F01F00072FFD580C5E +:10CA8000C0700E9A0C9BEACCFFFEF01F0004E3CDB1 +:10CA900080E000008001C9848001A29CEBCD40E0D1 +:10CAA000306818951AD8169614973049F01F001060 +:10CAB0002FFD580CC190EACCFFFE0E9A0C9BF01F84 +:10CAC000000D0E9A0C9BEACCFFFDF01F000A0E9A97 +:10CAD0000C9BEACCFFFCF01F00080E9A0C9BEACCE2 +:10CAE000FFFAF01F0005E3CD80E000008001C9845B +:10CAF0008001A29C8001A2FCEBCD40E0301818958B +:10CB00001AD81696149730A9F01F00072FFD580C5D +:10CB1000C0700E9A0C9BEACCFFFEF01F0004E3CD20 +:10CB200080E000008001C9848001A29CD43120BD36 +:10CB30005019500818961697581AC390C272E06898 +:10CB400000FDE06900DD1AD8300A3018F01F005CE3 +:10CB50002FFD580CC1E0300A0E9BECCCFFFEF01FFD +:10CB60000059300A0E9BECCCFFFDF01F0056300A36 +:10CB70000E9BECCCFFFCF01F0053ECCCFFFB0E9B9C +:10CB8000300AF01F0050301CC048582AC040301CEA +:10CB90002F5DD83219893FF8F0091800E080008B2A +:10CBA0009618301C2FA8B6182F5DD832761850581A +:10CBB000B1485038760A504AF6E80008F8C2FFFE3D +:10CBC000FAE90018F8C3FFFDF6EA0010F8C9FFFB08 +:10CBD000FAEB0020F8C4FFFC50293FF5FAC0FFD85B +:10CBE000E06100FDC0680D998E382FE81208AE286C +:10CBF0001AD030181AD1E06900DD109A0E9B0C9CF7 +:10CC0000F01F00312FED580CC4105805FBF5500AE9 +:10CC1000FBF8400AF9B90401F1D9E408EBD8E405BE +:10CC2000301A0E9B049CF01F0027301A0E9B069CA6 +:10CC3000F01F0024301A0E9B089CF01F00220DA844 +:10CC40003009F2081800CD010DB83509F2081800B6 +:10CC5000CCB10DC83F29F2081800CC61301A0E9BE8 +:10CC6000402CF01F00180DD84019F2081800CBC155 +:10CC70004038301CAE28F80509496E2812488F2824 +:10CC800040095809C8509305C84B4038FB58001458 +:10CC9000FAE80020EEE90010FAEA0010EEEB0000DE +:10CCA000FAE80018EEE90008AC9C3FF8AC882F5D6C +:10CCB000D8323008B898300CC6CB00008001C98447 +:10CCC0008001A29C8001C85CD431207D1895169704 +:10CCD00014961293581AC110C0B2300830290C9A19 +:10CCE0000E9B0A9CF01F0032C5712F9DD832582A26 +:10CCF000CF50301C2F9DD83276185018760AF0008D +:10CD00001410500A1A91F6E80008F8C4FFFAFAE97C +:10CD100000083FF6F6EA0010FAC2FFE8FAEB00104E +:10CD2000C1A85806FBF65006FBF84006F9B9040105 +:10CD3000F1D9E408EDD8E406301A0E9B089CF01FE8 +:10CD4000001D0BE8E6081800C1D00B998E382FE8BB +:10CD50001208AE2804983029301A0E9B0A9CF01F46 +:10CD60000014CE01BA20E2E80010EEE90010E2E87B +:10CD70000000EEE90000E2EA0008EEEB00082F9D5B +:10CD8000D83230186E29F006094AAE201449109C9A +:10CD90008F292F9DD8320B982FF8EACCFFFA0C9AE6 +:10CDA0000E9BAA98F01F0003301CCA5B8001CB2C9D +:10CDB0008001A29CEBCD40EC206D301918971693A2 +:10CDC0001495F01F002DC0412FADE3CD80ECEECCCB +:10CDD000FFF90A9A069BF01F00290A9A069BEECCDF +:10CDE000FFF8F01F00260A9A069BEECCFFF7F01F13 +:10CDF00000230A9A069BEECCFFF6F01F00210A9A48 +:10CE0000069BEECCFFF2F01F001E0A9A069BEECCAA +:10CE1000FFEEF01F001B0A9A069BEECCFFEAF01F04 +:10CE2000001858055F0858255F091248CCE06608CD +:10CE30005008661886160A9A5018EBD8B010BA1522 +:10CE4000E6E80008FAE900082026E6E20010E068BB +:10CE500000FD0A16AE961A9BFAE300100E9C1AD833 +:10CE6000E06900DD3018F01F00072FFD2FADE3CD86 +:10CE700080EC00008001CCC88001A29C8001C7D05A +:10CE80008001C984EBCD40EC206D18971693149562 +:10CE9000582AC18119893FF8F0091800F9F91801D9 +:10CEA000F7F81201F9BA0102F1DAE108F1D9E10863 +:10CEB000F7F81C01F9B80000F9F80E012FADE3CD29 +:10CEC00080EC3009F01F0019CFA0EECCFFF90A9AD0 +:10CED000069BF01F00170A9A069BEECCFFF8F01F86 +:10CEE00000145805CEC166085008661886160A9ABE +:10CEF0005018EBD8B010BA15E6E80008FAE90008B7 +:10CF00002026E6E20010E06800FD0A16AE961A9BA5 +:10CF1000FAE300100E9C1AD8E06900DD3018F01F0B +:10CF200000052FFDCCCB00008001CCC88001A29C65 +:10CF30008001C984D42112951497580A5F095805B5 +:10CF40005F08169A1248C2510B986E29F0C4FFFE72 +:10CF5000F2C800015BD8E08B0015129C089B5D1A9B +:10CF600018965806C0C06E086E192FF80809089A5E +:10CF70000A9B8F088F190C9CF01F00080C9CD8226C +:10CF8000089B5D1A300818968F2C8F188F08CEAB2F +:10CF900030060C9CD8220000800091DCEBCD40FCD8 +:10CFA00012951494580A5F0958055F0818921248A0 +:10CFB0001693C191300995296A085808E08A00162D +:10CFC00012966A270E99089A069B049CF01F000B84 +:10CFD0002FF6EEF7FFF86A085807F7B701F80C3894 +:10CFE000FE99FFF2E3CD80FCEAE80000F4E90000DE +:10CFF0006A2A892AE3CD80FC8001CF34EBCD40FC46 +:10D0000018931695581AC2C0C053582AC5E0E3CDEC +:10D0100080FC782778085808FE9AFFFB7819580991 +:10D02000FE9AFFF79698300612087649F208000437 +:10D030000F9A0E9B2FEA1414089CF01F00332FF652 +:10D04000EEF7FFF866085807F7B701F80C38FE99B5 +:10D05000FFF166198A181208AA18E3CD80FC9628F9 +:10D060005808C3C0B618F9D8B010AA3C300830121E +:10D0700087088718872810948A1C8A0E189AFC0C37 +:10D080001900C212F7DAC0106A46EC0B00081199B9 +:10D09000F2C7FFFE5827C250F1DEC0101618103735 +:10D0A000E0890020E40409496A2B2FF4F3EB00081F +:10D0B000C1C0F4070008AA18F9D8B010189AFC0CDF +:10D0C0001900CE13E3CD80FC781C580CFE9AFFA10A +:10D0D00096181808B618E3CD80FC961CB62CCC6BBD +:10D0E000AA0CFDDCB010CCBBF3EB1008069A8A99B1 +:10D0F0008B28EC090009485B6A5CF01F00058A1A5E +:10D100008A0ECD8B800091DC8001D3EC8001CF347E +:10D11000EBCD40F83FF510941697149340661388B2 +:10D12000EA081800C05130070E9CE3CD80F858047F +:10D130005F1858065F991268CF700C9B5D1718979F +:10D14000C0600C9A089BF01F0004CEFBA685A69C2D +:10D15000CECB0000800091DCEBCD40C0129EF2E807 +:10D160000000F4E9000014977C2A8F2A18961D8984 +:10D17000169C3FF8F0091800C1401D993058F0097D +:10D180001800E088000F2039E06A5556EA1A555514 +:10D19000F20B141FF20A04481619F2090019C028EC +:10D1A00030091AD9189B1C990C9C7C280E9AF01FE8 +:10D1B00000042FFD8F2CE3CD80C000008001D11032 +:10D1C000EBCD406CF2E20000F4E3000072289528F9 +:10D1D0001495722813961AD6F01F00032FFD8B2C7E +:10D1E000E3CD806C8001D110EBCD406FF2E2000006 +:10D1F000F4E30000F2E00008F4E10008F2E20010BD +:10D20000F4E300101495725813961AD6F01F000319 +:10D210002FFD8B5CE3CD806F8001D110EBCD406F93 +:10D22000F2E20000F4E30000F2E00008F4E100089C +:10D23000724895481495724813961AD6F01F000349 +:10D240002FFD8B4CE3CD806F8001D110EBCD406C76 +:10D25000F2E20000F4E30000722895281495722889 +:10D2600013961AD6F01F00032FFD8B2CE3CD806C94 +:10D270008001D110D421310418971AD41696149530 +:10D2800030183329F01F00142FFD580CC0B058057A +:10D29000C0E18C986C4C0F9A100CEECBFFFEF01F87 +:10D2A000000F0F998C181208AC18D8225815CFA16E +:10D2B0000F9AE80A1800E08800073FF83009AE88A6 +:10D2C000AE99CF0B8C986C4BEECCFFFE100BF01F81 +:10D2D0000003CE8B8001C984800091DCD4213018FA +:10D2E000189716961495308410991AD4F01F0014CC +:10D2F0002FFD580CC0B05805C0E18C986C4C0F9AAB +:10D30000100CEECBFFFEF01F000F0F998C181208C7 +:10D31000AC18D8225815CFA10F9AE80A1800E08857 +:10D3200000073FF83009AE88AE99CF0B8C986C4B54 +:10D33000EECCFFFE100BF01F0003CE8B8001C984E2 +:10D34000800091DCEBCD40E0320930081AD9189505 +:10D35000169714961099F01F00132FFD580CC0F06B +:10D360005806C0F18E986E4C0B9A100CEACBFFFE5B +:10D37000F01F000D0B998E181208AE18E3CD80E057 +:10D380005816CF918E986E4B0B9A100BEACCFFFE7D +:10D39000F01F00050B998E181208AE18CF0B000075 +:10D3A0008001C984800091ACD421201D7809189691 +:10D3B000F2C800015BD8E08B0014F2C80008C0E09E +:10D3C0001A943005C0280E98500870079105680C13 +:10D3D000F01F00068D055807CF712FFDD8223008A9 +:10D3E00099082FFDD8220000800091E8EBCD40C0C5 +:10D3F00018971696F6CCFFF8F01F000DC130EEF826 +:10D40000FFF8EEC900089908F8C7FFF8930C9916C1 +:10D410000C9AE06B00FF0E9CF01F00060E9CE3CD03 +:10D4200080C018970E9CE3CD80C000008000920061 +:10D43000800091D0EBCD40FC32E818931AD81692B8 +:10D44000149430683079F01F00232FFD580CC03140 +:10D45000E3CD80FC089A049BE6CCFFFEF01F001E83 +:10D4600007993058F0091800E088001F2039E06A59 +:10D470005556EA1A5555F20B141FF20A0448F20BDE +:10D4800001055814C18030060C972FF6662C0899B8 +:10D490000E0C049A2FD7303BF01F00100C35FE996C +:10D4A000FFF6E3CD80FC5814F9B80000E7F80A0253 +:10D4B000E3CD80FCEA050017645C0E9BF01F0008BA +:10D4C000872CCC700E9A300BF01F0006CDDB0000CD +:10D4D0008001C9848001BB948001AD988001D3ECA8 +:10D4E000800091D0D421189616951497582AC161BE +:10D4F00019893FF8F0091800F9F91801F7F8120135 +:10D50000F9BA0102F1DAE108F1D9E108F7F81C01F2 +:10D51000F9B80000F9F80E01D82230083049F01FA0 +:10D52000000CC0C00D98F0C400045817C0800E99BC +:10D530000A9A089B6C2CF01F0007D822089B6A5C93 +:10D54000F01F00058D2CCF41CF9B00008001CB2C1C +:10D550008001AD988001D3ECEBCD40FC206D189498 +:10D5600016951493582AC18119893FF8F0091800BB +:10D57000F9F91801F7F81201F9BA0102F1DAE10834 +:10D58000F1D9E108F7F81C01F9B80000F9F80E012B +:10D590002FADE3CD80FC30083019F01F0040CF9054 +:10D5A0006A1E501E6A0A500AEAE80008FAE90008F2 +:10D5B000EAEA0010FAEB0010EDDEB0105813C600D6 +:10D5C000E8C7FFFA0999ECC8FFFE12080E9CE5D8DF +:10D5D000B010069A0A9BF01F00328A18E40819005E +:10D5E000CD82069A0A9BE8CCFFF8F01F002E8A181D +:10D5F000E4081900CCE2E8CCFFF4069A0A9BF01F7D +:10D600000028685C88693008F0091900C0E01896A5 +:10D6100030070C9C2FF7069A0A9BF01F00222FC69A +:10D6200088E80E38FE99FFF78A18E4081900CB1233 +:10D63000069AE8CCFFF20A9BF01F0019685888E9A7 +:10D64000887AF009002C3008F00A1900C0E018961A +:10D6500030070C9C2FF7069A0A9BF01F00132FC669 +:10D6600088F80E38FE99FFF78A18E4081900C912E5 +:10D67000069A0A9BE8CCFFF0F01F0009C8ABE8C788 +:10D68000FFFA30EA300B0E9CF01F0008099B6A5C21 +:10D69000F01F0007895CC97B8001CB2C8001A2FCB4 +:10D6A0008001C8308001C804800091D08001D3EC93 +:10D6B000EBCD40FC206D189416951493582AC18127 +:10D6C00019893FF8F0091800F9F91801F7F8120163 +:10D6D000F9BA0102F1DAE108F1D9E108F7F81C0121 +:10D6E000F9B80000F9F80E012FADE3CD80FCE06839 +:10D6F00000FF33091AD83008F01F00532FFD580CD3 +:10D70000CF406A1E501E6A0A500AEAE80008FAE989 +:10D710000008EAEA0010FAEB0010EDDEB010581332 +:10D72000E0800085E8C7FFFE0999ECC8FFFE1208FB +:10D730000E9CE5D8B010069A0A9BF01F00448A1888 +:10D74000E4081900CD22069A0A9BE8CCFFFCF01FE2 +:10D7500000408A18E4081900CC82E8CCFFF8069A49 +:10D760000A9BF01F003A684C88493008F0091900FC +:10D77000C0E0189630070C9C2FF7069A0A9BF01F02 +:10D7800000342FC688C80E38FE99FFF78A18E408BF +:10D790001900CAB2069AE8CCFFF60A9BF01F002BCC +:10D7A000684888C9885AF009002C3008F00A190026 +:10D7B000C0E0189630070C9C2FF7069A0A9BF01FC2 +:10D7C00000252FC688D80E38FE99FFF78A18E4087E +:10D7D0001900C8B2069A0A9BE8CCFFF4F01F001BA0 +:10D7E0008A18E4081900C812069AE8CCFFF20A9BCE +:10D7F000F01F001688C988D81208684A8879F4088A +:10D80000002C3008F0091900FE90FF7018963007C0 +:10D810000C9C2FF706990A9A310BF01F000F2F0668 +:10D8200088F80E38FE99FFF6C60BE8C7FFFE30EA0F +:10D83000300B0E9CF01F0009099B6A5CF01F00086A +:10D84000894CC73B8001C9848001A2FC8001C8309B +:10D850008001C8048001AD98800091D08001D3EC94 +:10D86000EBCD40E0E06800FE18971AD816951496A4 +:10D8700030483059F01F00162FFD580CC031E3CD51 +:10D8800080E0EECCFFFE0C9A0A9BF01F00120C9A6F +:10D890000A9BEECCFFFDF01F000F0C9A0A9BEECC0A +:10D8A000FFFCF01F000C5816C0A00F9B0C990A9AA1 +:10D8B0006E2C203BF01F0008E3CD80E00F9B6A5CDC +:10D8C000203BF01F00068F2CCF11CDAB8001C98407 +:10D8D0008001A29C8001AD988001D3ECEBCD40E0AB +:10D8E00018951696F6CCFFF8F01F000CC12099167B +:10D8F00030089908F8C7FFF80C9A5805EBF71A0595 +:10D90000E06B00FF0E9CF01F00060E9CE3CD80E054 +:10D9100018970E9CE3CD80E080009200800091D0AB +:10D92000EBCD40C0201DF8C60008300C6C1BF01F6A +:10D930000014C1A0500C3007C1286C1B400CF01F14 +:10D9400000111897C1406C1AECCBFFF8EF4AFFFCAE +:10D950000E9CF01F000D6C065806C0505807CEE113 +:10D960004007CF2B400C2FFDE3CD80C01A9CF01F49 +:10D9700000070E9C2FFDE3CD80C000008001D8DCA5 +:10D980008001D3EC800091DC8001D3A8D401E06851 +:10D990000081301999489959189A7408129C11CE2F +:10D9A000F20E18005F089708D802D703486830398C +:10D9B000F0FA00F830089569985BF00B19005F0CDD +:10D9C0005EFC0000000087F419C8300A4869F2F9CB +:10D9D00000F8F4081800F9BC0001F9BC0100F3FCE0 +:10D9E0001A065EFC000087F448483009F0FA00F897 +:10D9F000301C95695EFC0000000087F448B8985A16 +:10DA0000F0FB00F83178F00A1900E08B000B3018B9 +:10DA1000F00A0948E4180080E01803FEC0205EFF09 +:10DA20003008301C97685EFC000087F478185808AE +:10DA30005F0C5EFC5EFF19C830192018F208180050 +:10DA40005FBC5EFC5EFD5EFD19C93008F009180080 +:10DA50005F0C5EFC5EFD5EFFEBCD4080308B189767 +:10DA6000991B300CF01F00078F0CC0803078E069E4 +:10DA700000818F588F49E3CF9080E3CD80800000F4 +:10DA80008001D8DCEBCD40C018971696308B991BDF +:10DA9000300CF01F00108F0CC160301830298F58E7 +:10DAA0008F4948D8B826118948C8B8E948C71189AC +:10DAB000B8F96EB899086EBC580CC0752FFC8FBCB5 +:10DAC000E3CF90C0E3CD80C0F01F0006CF9B0000E5 +:10DAD0008001D8DC00007A280000025C000087F496 +:10DAE00080018450EBCD40FE1897FACCFFE01694ED +:10DAF000781330CB14928F1B129178061095300C4E +:10DB0000F01F00118F0CC1A0307830498F588F4919 +:10DB10009905B8E6B8F1F9630008B8C4B8D248B8B6 +:10DB200048B9B084B28248B76EB899086EBC580C38 +:10DB3000C0752FFC8FBCE3CF90FEE3CD80FEF01FBD +:10DB40000006CF9B8001D8DC000079E5000079E475 +:10DB5000000087F480018450EBCD40FC1897FACC8C +:10DB6000FFE4314B781414938F1B129278061095B2 +:10DB7000300CF01F00158F0CC2003018F3D4C01009 +:10DB80008F488F589913B8429935F9560010F954B7 +:10DB9000001248E7F1D6C0100A481248F9B800FF51 +:10DBA000F9B80100B8586EB999096EBC580CC07527 +:10DBB0002FFC8FBCE3CF90FCE3CD80FCF01F000472 +:10DBC000CF9B00008001D8DC000087F480018450E6 +:10DBD000D401780A3009740B15F8129C129AF01FC0 +:10DBE0000002DA0A80018460D401780A3009740BDB +:10DBF000F538000B129C129AF01F0002DA0A00009E +:10DC000080018460D401780A3009740BF538000B68 +:10DC1000129C129AF01F0002DA0A00008001846050 +:10DC2000D401780A3009740BF538000B129C129A53 +:10DC3000F01F0002DA0A000080018460D401780A33 +:10DC40003009740BF538000B129C129AF01F000279 +:10DC5000DA0A000080018460D401780A3009740B6C +:10DC6000F538000B129C129AF01F0002DA0A00002D +:10DC700080018460D401780A3009740B15F8129C75 +:10DC8000129AF01F0002DA0A80018460EBCD40F89E +:10DC900030C618979916169414930C9B300CF01FED +:10DCA00000108F0C1895C160307831690C9A8F582C +:10DCB000089B8F49F01F000B48B66CB88B086CBCF2 +:10DCC000580CC0A52FFC8DBC301C6A088708E3CD1A +:10DCD00080F8E3CD80F8F01F0005CF6B8001D8DC21 +:10DCE000800091DC000087F480018450EBCD40F887 +:10DCF000308618979916169414930C9B300CF01FCD +:10DD000000108F0C1895C160307831490C9A8F58EB +:10DD1000089B8F49F01F000B48B66CB88B086CBC91 +:10DD2000580CC0A52FFC8DBC301C6A088708E3CDB9 +:10DD300080F8E3CD80F8F01F0005CF6B8001D8DCC0 +:10DD4000800091DC000087F480018450EBCD40F826 +:10DD500033C618979916169414930C9B300CF01F29 +:10DD600000108F0C1895C160307831390C9A8F589B +:10DD7000089B8F49F01F000B48B66CB88B086CBC31 +:10DD8000580CC0A52FFC8DBC301C6A088708E3CD59 +:10DD900080F8E3CD80F8F01F0005CF6B8001D8DC60 +:10DDA000800091DC000087F480018450EBCD40F8C6 +:10DDB000318618979916169414930C9B300CF01F0B +:10DDC00000108F0C1895C160307831190C9A8F585B +:10DDD000089B8F49F01F000B48B66CB88B086CBCD1 +:10DDE000580CC0A52FFC8DBC301C6A088708E3CDF9 +:10DDF00080F8E3CD80F8F01F0005CF6B8001D8DC00 +:10DE0000800091DC000087F480018450EBCD40F865 +:10DE1000330618979916169414930C9B300CF01F28 +:10DE200000108F0C1895C160307831090C9A8F580A +:10DE3000089B8F49F01F000B48B66CB88B086CBC70 +:10DE4000580CC0A52FFC8DBC301C6A088708E3CD98 +:10DE500080F8E3CD80F8F01F0005CF6B8001D8DC9F +:10DE6000800091DC000087F480018450D421189751 +:10DE7000169530CB991B300CF01F00128F0C1896A2 +:10DE8000FAC4FFEC580CC190302830098F588F49E4 +:10DE900048D76EB899086EBC580CC1052FFC8FBCD2 +:10DEA0005805EDF81000EBF81A00089BECCCFFFCCD +:10DEB000308AF01F0006DA2AD822F01F0005CF0BA7 +:10DEC0008001D8DC000087F4800091DC8001845060 +:10DED000EBCD40E018961695310B991B300CF01FD6 +:10DEE00000108D0C1897C1503078317A0A998D58EE +:10DEF0008D4A48CBF8CAFFFCF01F000B48B56AB842 +:10DF00008F086ABC580CC0752FFC8BBCE3CF90E027 +:10DF1000E3CD80E0F01F0006CF9B00008001D8DC3D +:10DF20008001D3EC8001D158000087F48001845037 +:10DF3000EBCD408078076E285808C0B0300C189A96 +:10DF40005C586E0B3109300CF01F0009E3CF908054 +:10DF5000310CF01F00086E189908EF390016991956 +:10DF60006E3899286E4999396E28CEAB800184604D +:10DF700080009200EBCD40FC189716931495314B1E +:10DF80001294991B300CF01F001C8F0C1896FAC2CB +:10DF9000FFE4580CC200302830198F588F495805BB +:10DFA000C1C18D455C7549576EB88D086EBC580C63 +:10DFB000C1F52FFC8FBC5804EDF81000E9F81A00E9 +:10DFC000049B308AECCCFFFCF01F000D301C8D351B +:10DFD000E3CD80FCE3CF80FC5C750A9CF01F000958 +:10DFE0008D4CCF90069B0A9AF01F0005CDDBF01FE9 +:10DFF0000006CE1B8001D8DC000087F4800091DC95 +:10E000008000920080018450EBCD40801897F93C4D +:10E01000000BF01F00084888F0F900F85809C0709C +:10E02000EECBFFFC310A313CF01F0004E3CF9080BF +:10E0300080015FB0000087F480014658D42130C8C9 +:10E040001896109B4904300CE8F500F88D18F01F65 +:10E05000000F8D0C1897C120301830D98D582FCC57 +:10E06000EACBFFE28D49F01F000A68B88F0868BC50 +:10E07000580CC0552FFC89BCDA2AD822F01F0005A5 +:10E08000CFBB0000000087F48001D8DC8001844011 +:10E0900080018450D42130CB1897991B300CF01F8D +:10E0A000000B8F0C1894C1004898301530868F559E +:10E0B0008F462FCCF0FB00F82E2BF01F00060A9C99 +:10E0C000E966000AD822D8228001D8DC000087F453 +:10E0D00080018440EBCD40E030CB1896991B300C8A +:10E0E000F01F00108D0C1897C1703018305948E59A +:10E0F0008D588D492FCCEAFB00F82E2BF01F000B1A +:10E100003028AE586AB98F096ABC580CC0752FFC0C +:10E110008BBCE3CF90E0E3CD80E0F01F0005CF9B08 +:10E120008001D8DC000087F48001844080018450A5 +:10E13000EBCD40FC30C518969915169414931292A5 +:10E140000A9B300CF01F00138D0C1897C1D03018AB +:10E150008D458D580A9A300BF01F000FEECCFFFC56 +:10E16000089BF01F000E078848D6EF68000A058953 +:10E17000EF69000B6CB88F086CBC580CC0752FFC95 +:10E180008DBCE3CF90FCE3CD80FCF01F0006CF9B5D +:10E190008001D8DC800091D080018440000087F4A9 +:10E1A00080018450EBCD40FC30C51896991516942B +:10E1B000149312920A9B300CF01F00128D0C1897CA +:10E1C000C1B0301830B98D588D490A9A300BF01F04 +:10E1D000000E306AAEC4AED3049BEE0A000CF01FF2 +:10E1E000000B48B66CB88F086CBC580CC0752FFC7F +:10E1F0008DBCE3CF90FCE3CD80FCF01F0006CF9BED +:10E200008001D8DC800091D0800091DC000087F490 +:10E2100080018450D431203D502B5018FACEFFD0CD +:10E2200033857C3499157C181896149312917C00D0 +:10E2300050087C220A9B300CF01F00228D0C18978E +:10E24000C370301830A98D580A9A8D49300BF01FD1 +:10E25000001E069A029BEECCFFFCF01F001CEF5341 +:10E2600000244028049BEF680026EF600027306AF6 +:10E27000EECCFFD8F01F00155804C1C0089B308AAF +:10E28000EECCFFD2F01F00114008EF6800364018B6 +:10E2900048F6EF6800376CB88F086CBC580CC05556 +:10E2A0002FFC8DBC2FDDDA3AF01F000ACFBB2FDD2B +:10E2B000D832089B308AEECCFFD2F01F0003CE5B31 +:10E2C0008001D8DC800091D0800091DC000087F4D0 +:10E2D00080018450D4012FCC7808202D500819C912 +:10E2E000BAC919D8BAD8F01F00052FED580CF9B8E3 +:10E2F000010DF9F81A06DA0A80015860D40148D8ED +:10E30000F8CBFFF5F0F900F8733C7808204D502861 +:10E3100019C9FB69000C19D8306AFB68000D1A9CFA +:10E32000F01F0005F01F00052FCD580C5F1CD80210 +:10E33000000087F48002E73680018898EBCD40FE2C +:10E340003007FAC5FFE0189116924A134A1466087E +:10E350000E38E08A00216A08204D50280BC9FB695D +:10E36000000C0BD8EE061504FB68000DE806000A49 +:10E3700015D8BAD87409500915C8BAC8F01F0016C4 +:10E380002FCD580CC0A12FF75907CE2118970E9CFE +:10E39000E3CD80FEEE061504E80600060A9B0C9C01 +:10E3A000F01F000EF3D2C001EE081501AC692FF882 +:10E3B000E808093166090E39FE99FFEBEEC9FFFF47 +:10E3C00048380E9C9109E3CD80FE000000008C5C73 +:10E3D00000008B5C8001889880018440EBCD4080F8 +:10E3E000300819C9F0091800C10048E8F0F700F832 +:10E3F0005807C130F01F000C0E9CF01F000C0E9C43 +:10E40000F01F000BE3CF8080486830A9F0FA00F8D5 +:10E41000301C9569E3CD80800E9CE3CD80800000A8 +:10E42000000087F480015D188001593880015CDCB0 +:10E43000EBCD40E01896F01F00224A2A0DE9F4F7D0 +:10E4400000F85809C1103018F0091800C32030280E +:10E45000F0091800C31030488F687498300CABC8AE +:10E460009598E3CD80E06F3930D8322A8F68496CB7 +:10E47000727B2F4BF01F00156F3C3FF8787BF7390C +:10E4800000C8F0091800C130202DF71600D47845D7 +:10E49000306AEECBFFE21A9CF01F000C0C9B0A9C2A +:10E4A000F01F000B301C2FEDE3CD80E0E3CF90E0B8 +:10E4B00030088F68CD3B30588F68CD0B8001F00459 +:10E4C000000087F400008C608002E7368001E33CA6 +:10E4D000EBCD40E01896F01F00284A8A0DE9F4F7CA +:10E4E00000F85809C1503018F0091800C3603028EE +:10E4F000F0091800C3906F0830492FF88F69EF4872 +:10E5000000407498300CABC89598E3CD80E06F392B +:10E5100030D8322A8F6849AC727B2F4BF01F00191C +:10E520006F3C3FF8787BF73900C8F0091800C1301C +:10E53000202DF71600D47845306AEECBFFE21A9C06 +:10E54000F01F00100C9B0A9CF01F000F301C2FEDD9 +:10E55000E3CD80E0E3CF90E06F0830092FF88F69BA +:10E56000EF480040CCFB6F0830592FF88F69EF4817 +:10E570000040CC8B8001F004000087F400008C6028 +:10E580008002E7368001E33CD421310B1896991BB9 +:10E59000300CF01F00198D0C1897C28030183049CC +:10E5A0008D588D494955302CEAF400F8F01F0014BD +:10E5B000E8CBFFE21896EECCFFF8F01F00126C38A3 +:10E5C000AE38EAF901045819C0D03008AE2830B886 +:10E5D00089686AB98F096ABC580CC0952FFC8BBC3E +:10E5E000DA2AEAF8011C5818CF20D82AF01F0006B2 +:10E5F000CF7B00008001D8DC000087F48001EF6C45 +:10E600008001844080018450EBCD40F81897169427 +:10E6100030CCF01F0046303CF01F00441895302CE1 +:10E62000F01F0042E06A00EC1896E06B00FF0E9CC1 +:10E63000F01F003FE8CBFFE2EECCFFF6F01F003DFD +:10E640006C384BD9AE289208AE483DD86939727BF8 +:10E65000F73A009AF00A1800C480F73900803DD8D4 +:10E66000F0091800C52030050A93F01F00349838CF +:10E67000AE381896F93900A83FF8F0091800C09094 +:10E68000F8C9FF58EECAFF584ADB0E9CF01F002D58 +:10E69000ED3900CC3FF8F0091800C1900E9CECC990 +:10E6A000FF34EECAFF344A6BF01F0027089CF01FAE +:10E6B0000027583CE089000C4A587099ABC99199E1 +:10E6C0003FFA301CEF6A009EE3CD80F85805CF502A +:10E6D000EECCFF62069BF01F001F49D9301C7298D8 +:10E6E000ABA89398E3CD80F8F73900A03008F00983 +:10E6F0001800CB41EAF900B85819CB01F72800A25D +:10E700001295F003161FCB2BF73900863018F0094D +:10E710001800CAA1EAFC00B8581CCA61F728008892 +:10E720001895F003161FCA2B8001EF6C800091D062 +:10E73000800184400000025E8001EFF88001D3EC8C +:10E740008001D1E88001D21C8001808E000087F416 +:10E75000800184F0D421E06800EC1897109B4924D4 +:10E76000300CE8F500F88F18F01F00108F0C189689 +:10E77000C090301830798F588F490A9BF01F000CD9 +:10E78000C021D82A0C9CF01F000B30C88B6868B9D8 +:10E790008D0968BC580CC0452FFC89BCDA2AF01FD3 +:10E7A0000006CFCB000087F48001D8DC8001E608AA +:10E7B0008001F03080018450D421E06800EC18978B +:10E7C000109B4924300CE8F500F88F18F01F00105A +:10E7D0008F0C1896C090301830698F588F490A9B5B +:10E7E000F01F000CC021D82A0C9CF01F000B30C871 +:10E7F0008B6868B98D0968BC580CC0452FFC89BC72 +:10E80000DA2AF01F0006CFCB000087F48001D8DCA5 +:10E810008001E6088001F03080018450EBCD40405B +:10E82000201D18961A9CF01F001849888C69F0FB6F +:10E8300000F85809C1203018F0091900C0B030287C +:10E84000F0091900C170770830492FF89769F74827 +:10E8500000402FFDE3CF80407738301911EA301C9B +:10E86000F20A1800F9B8000CF7F80A062FFDE3CDFC +:10E870008040770830592FF89769F74800402FFDFE +:10E88000E3CF8040800177A4000087F4D401496879 +:10E8900019C9F0FA00F85809C1803028F0091800A9 +:10E8A000C1803048F0091800C0503018F009180035 +:10E8B000C180750830492FF89569F548004019CB9B +:10E8C000302CF01F000AD80A3088301C9568D80216 +:10E8D000750830592FF89569F548004019CBCF1BC2 +:10E8E000301BCEFB000087F480018390D431215D82 +:10E8F000303C169614911290F01F00584D83F8C4C6 +:10E90000FFB0189531CA089B069CF01F0056C0A1A5 +:10E910006D3830AA707BE6CCFFE42D2BF01F005140 +:10E92000C7B06D38FAC7FFC8707B0E9CF6CAFFC827 +:10E930002D2BF01F004D089B0E9CF01F004CC0417A +:10E94000300C2EBDD83231CA0E9BFA0A0002049C4C +:10E95000F01F0047049CF01F004730080E9A500833 +:10E960001A97089B1A9CF01F00446D38707930E8A4 +:10E97000F33A005EF00A1800C670EB3A0074580AC9 +:10E98000CE006D387079EB380075F33B005EF60809 +:10E990001800C0F0EACCFF8A3009C0581938F608D0 +:10E9A0001800C0502FF9123AFE99FFFA123ACC9093 +:10E9B000049CF01F0032CC50049B1A9CF01F0030C6 +:10E9C0001A9B029CF01F002F049B009CF01F002D3F +:10E9D000089B31CA4A2CF01F00266D3830AA707B84 +:10E9E000E6CCFFE42D2BF01F00226D38312A707B1E +:10E9F000E6CCFFDA2C8BF01F001E029B304AE6CCDF +:10EA0000FFC8F01F001B009BE6CCFFC4304AF01F7C +:10EA10000018301CC97B6D38312A707BE6CCFFDAD8 +:10EA20002C8BF01F0010FE91FF7E304AE6CBFFC812 +:10EA3000029CF01F000FE6CBFFC4009C304AF01F81 +:10EA4000000C301CC7FB049CF01F000FFE90FF7AE7 +:10EA50001A9CF01F000EC92B8001EF6C000079E8B2 +:10EA60008000917C80018124800182BC800091DC47 +:10EA700080018658800181E8800182608001817E6A +:10EA8000800180CC80018360800185F4EBCD40FC67 +:10EA9000FACD0110300733095407FEF3022EE6F8D1 +:10EAA00000F854281896129B0E9C8D19F01F0088B0 +:10EAB0008D0C1895E080008A3018303C8D588D4CB4 +:10EAC000F01F0084FACBFEFC1894FACAFEF8FACCC8 +:10EAD000FEF2F01F0081442871390E9CE06B00ECBF +:10EAE0007277F01F007BC710540CE0680420B83820 +:10EAF000442B7738707992D9EDB90000C6B0EDB9E2 +:10EB00000001C06144099238A1B8B238442BE8F83A +:10EB100000B85808C0C07738707A94D9EDB90009A8 +:10EB2000C06144099238A9B8B238442BFAC2FEF148 +:10EB3000441A049CF01F006944185818E08000A58E +:10EB4000C6823079FB38010FF2081800C050440922 +:10EB50009238A5A8B238440CF01F0061049CF01F45 +:10EB600000614428E74C0100EACAFFF071390A9CB1 +:10EB70004DDBF01F005E6858AA286869AA394D3C31 +:10EB800069B85808C440442B773870793078F33A24 +:10EB90000074F00A1800C240EAC9FFF4EACAFFF89C +:10EBA000300CF01F0053581CC53030063018E748B1 +:10EBB000004444095809C0A0FACCFF00F01F004DE2 +:10EBC0000C9C2BCDE3CD80FC30060C9C2BCDE3CDF3 +:10EBD00080FC44099238A1A8B238442BC99BF8F8AC +:10EBE00001AC5808C050F8CCFE54F01F004230CBA6 +:10EBF000300CF01F0037E74C01AC189AC080442855 +:10EC0000713B76794B8B28C9F01F003B442BCC5BC2 +:10EC10005828CA51442C1A9B2E2CF01F00381A96E3 +:10EC20001AD61ADC442BFB380116FB390117EF3AD0 +:10EC300000CF169CF6CBFF34F01F003144283289F8 +:10EC4000F15900D8442CF01F00262FEDC88BE8F8AE +:10EC500000B85808C2916AB93FF8F368009A3028A2 +:10EC60003039E7480044442891694426F01F0025C4 +:10EC7000ED4C004466B88B0866BC580CC2352FFCBE +:10EC800087BC3016C94B440BEF3A00AF169CFB38DB +:10EC9000010EFB39010FF6CBFF58F01F001B440C8F +:10ECA000F01F000FC5CB44287139727A94D8EDB8A3 +:10ECB0000001CD21189B6ABCF8CCFF66F01F001341 +:10ECC000CCFBF01F0013CDDB000087F48001D8DC03 +:10ECD0008001EF6C80017C4480017EE08001F03097 +:10ECE00080017BD88001D3EC8001AD408001E8EC4D +:10ECF0008001D3A88001D1588001887080018C2CBC +:10ED0000800145C480018B74800184F080018450AF +:10ED1000D431203D189616971493303CF01F0070A4 +:10ED2000301831798D588D4930086C068F0858039A +:10ED3000EDF81805E7F81A0018950DC40898A7D83B +:10ED4000C0505898C0302FDDD83A0DD93018F0098E +:10ED50001800C1003008F0041800F9B80500EFF8F9 +:10ED60005A00F9BC0501F9BC0401EFFC4A002FDD93 +:10ED7000D832303CF01F005A6C98F93A0074F13BDD +:10ED8000005E580ACE80F9380075F6081800C0A059 +:10ED900028AC30092FF91439CDE41938F00B1800DC +:10EDA000CFA1ECC0FFF8009CF01F004E1891CD30B1 +:10EDB0006BB85808C090793870793078F33A00749D +:10EDC000F00A1800C6E0FACCFFF8F01F0047581C04 +:10EDD000C0A0F01F0046029B835C350A31DCF01FA7 +:10EDE0000044CB9B40285818CF51FACCFFFCF01FB1 +:10EDF0000041581CCEF1401820785818FE9BFFEBBC +:10EE00004BD8F0F900F85809CE501A9CF01F003B7F +:10EE1000581CCE01400820285818FE9BFFDC6C9E31 +:10EE20002F4EFCE80000212DFAE90024FCE8000840 +:10EE3000FAE9002CFCE20010FAE30034FCE80018C8 +:10EE4000FAE9003CFD3C0020FB6C0044FD38002149 +:10EE5000322AFB6800454AAB1A9CF01F002AF01FBB +:10EE6000002A2EED580CCB606C9A3FF8F53900C89B +:10EE7000F0091800CAF06008F51B00D4202D6C6C56 +:10EE8000500801C9BAC901D8BAD8F01F0020A56C32 +:10EE900049FB310A180B315CF01F00152FEDC9AB8F +:10EEA0004955EAF801AC5808C050EACCFE54F01FAE +:10EEB000001930CB300CF01F0018EB4C01AC189A45 +:10EEC00048D5580CFE90FF816338494B707928C9AA +:10EED000F01F00136A98ABB88B98C76B8001EF6C7A +:10EEE00080015D44800177A4800145C480014658BB +:10EEF00080015F44000087F480015F2800008C607F +:10EF00008002E736800189108001E33C00008B5CC1 +:10EF10008001D3A88001D8DC8001D3EC8001D158D6 +:10EF2000EBCD40E0206D300818991495502850081A +:10EF30001A9C1A965D191897C10140085808C040DC +:10EF40001A9CF01F0009402C580CC030F01F00071D +:10EF50000E9C2FADE3CD80E01A9C5D15581C5F0719 +:10EF6000CEDB00008001D3A8800091E858DCE08867 +:10EF700000035EFD49B8F00C032F49B8F0CCFFF454 +:10EF80005EFC4998F0CCFFE45EFC4978F0CCFFD4FD +:10EF90005EFC4958F0CCFFCC5EFC4938F0CCFFC495 +:10EFA0005EFC4918F0CCFF305EFC48F8F0CCFF1C4A +:10EFB0005EFC48D8F0CCFEF45EFC48B8F0CCFEBC59 +:10EFC0005EFC4898F0CCFE945EFC487C5EFC486891 +:10EFD000F0CCFFFC5EFC4848F0CCFE785EFC000004 +:10EFE0008003C01400000260483930089318930869 +:10EFF0005EFC000000008C844828700C5EFC000061 +:10F0000000008C84EBCD40C0487618976C1C580CDF +:10F01000C030F01F00060E9CF01F00058D1CE3CDD4 +:10F0200080C0000000008C8480018AD480018AECBA +:10F03000EBCD40C0487618976C0C580CC030F01FD0 +:10F0400000060E9CF01F00058D0CE3CD80C0000073 +:10F0500000008C8480018ABC80018B30D4211894FC +:10F060001696149530CCF01F00121897C1D03018A6 +:10F0700099069915F0060946EC0C1502F01F000CD4 +:10F080008F2CC0F05806E08A000B3009129A6E28C7 +:10F09000F009092A2FF91236FE99FFFB8907DA2AAF +:10F0A0000E9CF01F00043FDCD8220000800092007C +:10F0B000800091E8D4311893169214901291580C54 +:10F0C000C36078093018760CF0090945580CC390D4 +:10F0D000189468160A36C1A468075807C0606E48BD +:10F0E0000238C1B03FCCD832662CF8060327580747 +:10F0F000CF71ECC8FFFFF808002CC0582FF8190793 +:10F100005807CEE110960A38CFA5089CF01F0013CF +:10F1100030083FEC8508D832029A009C6E3BF01F05 +:10F120000010301C89166E088908D832760C580CED +:10F13000C040F01F000ADA3A66093018F0090945A4 +:10F14000308CF01F00081894C060850C30089918A6 +:10F150009908CC0BD8320000800091E8800091DC47 +:10F1600080009200D431109412907818409618952F +:10F17000169214910C9B780A089C5D181893318C98 +:10F18000F01F00131897C1F00C9CF01F00118F3C6A +:10F19000C170089B0C9AF01F000F30088F468F1229 +:10F1A0008F218F508F086A29F203002C78085808A5 +:10F1B000C0C0109970085808CFD19307DA3A0E9C56 +:10F1C000F01F00053FDCD8329907DA3A8000920040 +:10F1D000800091DC800091E8D431203D501C500B20 +:10F1E000149112921090580AC4307418009B740A3B +:10F1F000129C5D18A36C502C6228F00C0307580772 +:10F20000C3706E450A990035C3610E940E93C09881 +:10F210006E075807C2D008936E490A39C2C10E94CE +:10F220006E3B0A9A049CF01F00181896CF214019D3 +:10F230006E18930840086E2991098F1C8F2C6E3C24 +:10F24000F01F00128F468F3640296228F009000C0B +:10F2500078090E39EFF80000F9F80A00EFF810000D +:10F26000E7F81A000E9CF01F00092FDDDA3A3FEC98 +:10F270002FDDD8326E385808CFB00039CF903FCC50 +:10F280002FDDD8328000917C800091E8163C5E0C26 +:10F290007808971C990B97085808F1FB1A015EFC37 +:10F2A00078195809F9F81000F3F81A007808580886 +:10F2B000F1F91A013008990899185EFCD40149380F +:10F2C000FACEFFFC709CE21C0002C1D0209DFD3AEA +:10F2D0000021FB6A0021FCE80000FAE90000FCEADA +:10F2E0000008FAEB0008FCE80010FAE90010FCEA5C +:10F2F0000018FAEB0018FD380020FB680020F01F12 +:10F3000000042F7DD8020000000087F480015AA479 +:10F31000D4014898709CE21C0002C0C0300930CC77 +:10F32000EA1C4000303B129AF01F0004F01F00045A +:10F33000301CD802000087F4800186C88001875401 +:10F34000D4014898709CE21C0002C0C0300930DC37 +:10F35000EA1C4000303B129AF01F0004F01F00042A +:10F36000301CD802000087F4800186C880018754D1 +:10F37000D4014898709CE21C0002C0C03009310CD6 +:10F38000EA1C4000303B129AF01F0004F01F0004FA +:10F39000301CD802000087F4800186C880018754A1 +:10F3A000EBCD4080495818977098E2180002C04190 +:10F3B000109CE3CD8080F01F00126F38302911EAD5 +:10F3C000F20A1800C0D03009303B129A307CEA1C97 +:10F3D0004000F01F000CF01F000CE3CF90806E681F +:10F3E0005898CF213009303B129A30BCEA1C4000BB +:10F3F000F01F0004CF1B0000000087F4800158407C +:10F40000800186C88001875458DBE08A0012F939F0 +:10F41000000C3078F0091800E08B000C595BE08A92 +:10F420000008F939000E3AA8F0091800C0D05EFDB6 +:10F430003888F0091800CFC1F939000D38E8F00913 +:10F4400018005F0C5EFCF938000FF2081800CF01BD +:10F45000F93900103038F0091800CEA1F93900113F +:10F460003008F0091800CE41F93A0012F20A1800EB +:10F47000CDF1F9380013F4081800CDA1F9390014C2 +:10F480003888F0091800CD41F939001538E8F0093D +:10F4900018005F0C5EFCD7033019482891095EFC08 +:10F4A00000007A38EBCD40C0208D48D730088E0957 +:10F4B000F0091900C101E06AFFFF300B1A9CF01F30 +:10F4C00000091A9B302AFACCFFE8F01F00079A18AF +:10F4D0001A96AE088E0C2F8DE3CD80C000007A2ADC +:10F4E0008001C7B88001A498D401F01F00054858D6 +:10F4F000F139010B120C5C8CD80200008001F4A4DD +:10F50000000087F4EBCD4060208D306AFAC5FFE63D +:10F51000300B0A9CF01F00091A9CE06AFFFF300BB9 +:10F52000F01F00070A9C1A9B302AF01F00061A964B +:10F530009A1C2F8DE3CD8060800091D08001C7B8E8 +:10F540008001A444D43120DDFEF60234FACEFFA8B7 +:10F55000189516916C9C1494129310907C177C0251 +:10F56000E21C0002C0312F3DD832FEF802167009AD +:10F570005809C041FE7CFBB4CF7BECF8012458183D +:10F58000C041FE7CFC17CF0BECC9FFE85019129C60 +:10F59000F01F007D581CE08000E30D890D98F009F4 +:10F5A0001800E08200E6302CF01F0078E08000D2E6 +:10F5B0006CB850282FF88DB85807FBF91002EFF9F6 +:10F5C0001A00F01F0073C0E0029B0A9CF01F00713C +:10F5D000E08000C96C98EDB80006C0414E88402913 +:10F5E00091D9F01F006D6008EFDCB010F3D7C010A8 +:10F5F00050091039E08B006C0D882FF8AC880D99FC +:10F60000F0091800C061300A320C149BF01F00632F +:10F61000E8C800020E08FB58002EED38010B30043C +:10F62000FB680032400A300BFB640030FB640031A1 +:10F63000FB640033069CF01F005A069BFAC7FFF4D8 +:10F64000400A0E9CF01F0057300A0E9BFACCFFD2E6 +:10F65000F01F0055ED38010BF9D2C003BA78F01F46 +:10F660000053300CFB520028FB5C002AE041003EB6 +:10F67000E0880008EB39000C3888F0091800C2D087 +:10F680004028300A50980E9BFACCFFDCF01F00484F +:10F690004009ECCCFFE88109F01F0046F01F00464E +:10F6A0003008ED4C00CCED5800D04C49F30A014233 +:10F6B000F00A1900C0604B297298EDB8000EC031F5 +:10F6C000301CC52BF01F003E301CC4EBECCCFFE817 +:10F6D000F01F00383FFCC48BEB39000D38E8F0090F +:10F6E0001800CCF1EB39000E3018F0091800CC915D +:10F6F000EB39000F3038F0091800CC313028EB3BE3 +:10F700000012F00B18005F1A3FE8F00B18005F19A9 +:10F71000126AE80A1800CB51EB380013E218001DFA +:10F720005818CAF1EB380014E21800C85888CA917A +:10F73000189A31F9EA090708F4081800CA212FF9C4 +:10F74000E049003FCF81E0680400FB58002AC99BD4 +:10F75000401CF01F0018FE7CFAECC06BFE7CFC160F +:10F76000C03BECCCFFE8F01F00133FECCFDA401CAD +:10F77000F01F0010FE7CFB4FCF7A0000000087F4E2 +:10F7800000007A38800145DC80019F3080015F04F1 +:10F790008001F4088001F4E880014658800091D08F +:10F7A0008001C7B88001A4448001859C8001A49891 +:10F7B000800145EC800145C4000002608001FBFC33 +:10F7C000D401302CF01F0003300948389109D802C9 +:10F7D0008001A12800007A38D431FACD01385009CF +:10F7E000FACEFEA416971896FEFB031C14947C1305 +:10F7F0007C00F6F801245818C460FEFA030A749CD1 +:10F80000E21C0002C05118970E9C2B2DD832E068E4 +:10F8100000F8FAC5FEFCF5D7C0100C9B0A9C548872 +:10F82000549654A730025472F01F00B8FAC1FEE497 +:10F830000A9B029CF01F00B644C95879E08B00284F +:10F840003018F0090948E2180085C2104488FAC946 +:10F85000FFF45012502854D944D80A9B5478029C83 +:10F86000F01F00ACC1C1302744D95809CCE0FAC818 +:10F87000FFF41039CCA0FACCFECCF01F00A70E9CF0 +:10F880002B2DD83230270E9C2B2DD832448B300CA8 +:10F89000F01F00A2E08000B354DCCDFB44C9E04976 +:10F8A000003FE088000B300744B8EDB80007E08067 +:10F8B000009EF01F009BCD9BFEF80268F009032F0D +:10F8C000ECCAFFFC1588EC08000889080DD81589DA +:10F8D000400BEE0901093067F208010A970A44B8A3 +:10F8E000CE5B44B8F0C90001E0490097E088008988 +:10F8F000447CF01F008D44C8189A300944BC303B4A +:10F90000BFBCF9E8108CF01F0089F01F0085301B88 +:10F91000300CF01F008744B83027CC8B44B8E04847 +:10F920000082C090E08900A9E0480080C040E04823 +:10F930000081CEE10E9B0C9CF01F007ECE9B44B854 +:10F94000E0480082E08000C4E08900915978E080BE +:10F9500000C4E0480081CCD1029CF01F0077CD8B21 +:10F9600044B85808C7E144D65803EDF81000E7F84A +:10F970001A008C28A008FB1A0106445814088908AC +:10F98000FB190104F20A0105400A30EB95056807EE +:10F990000E9CF01F006AE08000AE4DB9F2F801D075 +:10F9A0005808E080009E0A9B0E9C5D18E08000993C +:10F9B00030270DE84D4BF768007B44B8C77B44B84F +:10F9C0005818CB90E0480080CA31CB5B447B44BCE4 +:10F9D000F01F005B44BCF8C800805818FE9BFF99DC +:10F9E000029B5C5CF01F0057C93B30084C69300B30 +:10F9F000B2A8169CF01F0054C5DB3FD7C06B4D3832 +:10FA0000F009032F029CF01F0052C82B029CF01F2C +:10FA10000051C7EB029CF01F0050C7AB029CF01FC7 +:10FA2000004FC76B029CF01F004EC72B029CF01FBB +:10FA3000004DC6EBF01F004C4B3AF54C00D4C68B82 +:10FA4000029CF01F004AC64B029CF01F0049C60BE7 +:10FA5000029CF01F0048C5CB447CF01F0047C58BBB +:10FA6000E0480081C1403027C21BF0C8008F5828F1 +:10FA7000FE9BFF40C4DBE0480084FE90FF5DFE95E6 +:10FA8000FF5BE0480085FE91FF44C55B49E91388B0 +:10FA900020185C58B28844D7C29049BB7698E218C7 +:10FAA0000040C20076D96E081039E088002944B8B9 +:10FAB000A7D854B85803F9B70003EFF81000E7F8D7 +:10FAC0001A00F9B70103FBF8104BCF0A447B32EC64 +:10FAD000F01F002AC1DB029CF01F0029C19B3047A8 +:10FAE000C69B0FD8F768007ACE3B302CF01F00255C +:10FAF000CD5BF01F0025CF403FE7C5CBF01F0023B3 +:10FB0000CD7B0000000087F48001C7B88001BF10E2 +:10FB10008001BF448001D3A88001D8DC80018754D4 +:10FB20008003C04C8001870C800186C880016A88F0 +:10FB3000800237E8800208948001F4088001708C0C +:10FB40008001725480018CE48003C14C8002084023 +:10FB50008002085880020864800208708002087CD5 +:10FB600080020888800145C48002084C8002083465 +:10FB7000800209B48001DA3480016D6C8002094092 +:10FB80008001A12880015F048001F310EBCD406863 +:10FB90003006493C1AD61AD649250C9899064929A7 +:10FBA000492A302B0A9CF01F001249231AD60C98C0 +:10FBB0001AD60699490A303BEACCFFFCF01F000C2C +:10FBC0000C981AD606991AD6EACCFFF848BA305BD8 +:10FBD000F01F0007301C2FADE3CD806800007A389D +:10FBE00000007A2C8001F4988003C3AC80016EB8C9 +:10FBF0008001F7C08003C3C48003C3E05EFCD70369 +:10FC0000EBCD40E0203D1897580CC1F07938707A60 +:10FC100094D9EDB90001C1D04C166C785828C15068 +:10FC20000E9CF01F0040C110ED3900943FF8F00920 +:10FC30001800C1405017FACAFFFC1A9BFACCFFF615 +:10FC4000F01F0039581CC180301C2FDDE3CD80E04F +:10FC50004B366C785818CE51CF8B202D306A1A9CB9 +:10FC60004AFBF6CBFF4AF01F0031F01F00312FEDA9 +:10FC7000580CCEB1CE0BFAC5FFF5400A401B0A9CCA +:10FC8000F01F002C581CCE113079FB38000BF20805 +:10FC90001800C35140187139727A94D8EDB8000435 +:10FCA000CD404A5AF4F801045818C3206DE85808AA +:10FCB000C1D1ED3B008049AA580BC2806F387079E2 +:10FCC000F5380081F33C005EF8081800C1F0F4CA72 +:10FCD000FF7E3009C0581538F8081800C0402FF9C9 +:10FCE0001639CFA516395F0CCB1B48D973F85808C5 +:10FCF000CE10F4F801AC5808CDD1CA7B0A9CF01F95 +:10FD0000000FF01F000FCA10CCDB3009CECB3059EA +:10FD1000FB38000BF2081800C981CC9B0000026080 +:10FD2000800189D080017C448002E736800188B060 +:10FD300080017EE0000087F480017BD880017C1088 +:10FD4000EBCD40E048D818961695F0F700F058072C +:10FD5000C0E00E9CF01F000AC0715806C0A00E9CA7 +:10FD60000A9B5D16C0606E075807CF41E3CF80E065 +:10FD70000E9CE3CD80E00000000087F48001FC00D1 +:10FD8000D401F01F0002D80280021500EBCD40F82C +:10FD9000204DE0683100EA18312EE069312EEA1971 +:10FDA000322E306CFAE90000F01F00631894E080F6 +:10FDB00000B9303CF01F00611896301CF01F005F46 +:10FDC000306A202D189B18951A9CF01F005DF01FBB +:10FDD000005D2FED580CE080008732B80A9C1AD8DD +:10FDE000308930084D8A306BF01F00582FFD1A9370 +:10FDF000ECFC00D8F01F0056ECFC00DCF01F0055B6 +:10FE0000ECFC00E4F01F0054ECFC00E8F01F005391 +:10FE1000ECFC00ECF01F0052ECFC00F0F01F005175 +:10FE2000ED3C00B7F01F00506DC85808F9B801014B +:10FE3000EDF81A1BED3C006FF01F004CECFC012CA0 +:10FE4000F01F004BF01F004BF01F004BF01F004B4A +:10FE5000F01F004BECF800F85808C6616D084C978D +:10FE6000EF4800D8ECFC0130F01F0047300830A903 +:10FE700032B54C6A1AD5E06B0080EECCFED8F01F8C +:10FE80000033EEC6FE58304A300B0C9CF01F004089 +:10FE900030081AD530594BFA0C9C304BF01F002B10 +:10FEA0004BD82FEDF10A01423009F20A1900C26065 +:10FEB0006E99EDB9000EC201A7B930688F9950381C +:10FEC0001A9CFAC8FFF8FAC9FFF4089A308BF01FA1 +:10FED00000331897581CC140089CF01F00312FCDEB +:10FEE000E3CF80F8189A0A991A933068308B1A9CDD +:10FEF000F01F002CC7EBF01F002C6E99CDEB089C77 +:10FF0000F01F00273009303B129A311CEA1C4000D8 +:10FF1000F01F0026F01F00260E9C2FCDE3CD80F8A9 +:10FF20002FCDE3CD80F8300A301B149CF01F002148 +:10FF3000C96B0000800092008001EF6C8002E73600 +:10FF4000800188B08003B804800176C480020594E3 +:10FF500080020538800204DC8002048080020424D0 +:10FF6000800203C8800202F880020374800202D477 +:10FF70008002078C800168AC8002017080020EFC58 +:10FF8000000087F48002031C8003C400800091D02D +:10FF90008003C40C00000260800174C8800091E8F6 +:10FFA0008001776C8001FBFC800186C8800187544A +:10FFB00080020B34EBCD406830094AF63068ACA9BA +:10FFC000AC893129314AAC988D99300530130A9BA0 +:10FFD000ED4500ECED4500E88DA58DC5ED550040E3 +:10FFE000ED550042ED55004EED4500D88DB3ECCCFB +:10FFF000FEF0F01F0022ED450124F01F0021ED5519 +:02000004800278 +:1000000000D0ED4C00CCED5500D249ECF01F001EA5 +:10001000F01F001EED4501B8F01F001DF01F001D70 +:10002000F01F001D0A9BECCCFF48F01F001C0A9B30 +:10003000ECCCFF44F01F0019069BECCCFF40F01FF6 +:100040000017069BECCCFF3CF01F0014ED4300446E +:10005000F01F0013F01F001330DCF01F0013F93CF9 +:10006000000FF01F0012F01F0006ED4C01CC069CA3 +:10007000E3CD8068000087F4800091D0800145C402 +:10008000000084CC80017B24800237D080016CDCAE +:100090008001FB8C8001EFE8800144F8800187C873 +:1000A000800205EC8001EF6C800202B8EBCD40606D +:1000B000E06A01F8300B49D518960A9CF01F001C25 +:1000C000F01F001C0C9CF01F001CEACCFFF4F01F7A +:1000D000001BEACCFFE0F01F0019EACCFFF0F01F94 +:1000E0000017EACCFFECF01F0016EACCFFE8F01F87 +:1000F0000014EACCFFE4F01F0012300930DC1AD9FA +:100100001298129A129BF01F000FF01F000FF01FA1 +:10011000000FF01F000FF01F000FF01F000F301C2A +:100120002FFDE3CD80600000000087F4800091D0B7 +:1001300080016F4880021124800145D6800145F27C +:100140008002067C80014690800149B88001804091 +:1001500080015F98800201584848300A4849911848 +:10016000910A930A5EFC000000007A3C00007A4489 +:10017000D421219D4A846808F3D8C001FB6900633B +:10018000E2180002C14030183005FB6800634A3CA9 +:10019000F01F00233018189BFAC9FF9D300A49FC54 +:1001A000F01F0020581CC2802E7DD8225809C1C0E3 +:1001B000109549D870065806CEB0EA050019FA091C +:1001C00000170C9B0E9C306A2FA72FF5F01F00170D +:1001D0006C265806CDD05905CF516808F1D8C0011A +:1001E000F0051700CD5B306AE06B00FF1A9C3015FC +:1001F000F01F000FCDFB48FCF01F0009EA050018B6 +:10020000189BA1781A99300A48ACF01F00062E7D81 +:10021000D822000000007A448003C414800091B802 +:100220008001776C00007A3C800091DC800091D0E6 +:100230008003C41CD40148697208104C930CEDBCB7 +:100240000002C021DA0AF01F0003D80200007A443D +:1002500080020170EBCD408048C76E095809C1305B +:10026000722A580AF3F80003EFF80A01F3F81003B2 +:10027000F5F81A037238129C910AF01F00056E09F6 +:100280005809CEF1E3CF908000007A3C800091E8DD +:10029000D401F01F0007581CC020D802485972082A +:1002A000EDB80002CFB0F01F0004D8028002025463 +:1002B00000007A4480020170F8C900013058F0094A +:1002C0001800E08B00054838B09C5EFF3FCC5EFC18 +:1002D000000087F4D401201DFAC9FFFC12DC1A9932 +:1002E0003048300A307B483CF01F00032FFDD80215 +:1002F0008003C43C8001776CD401201D3018BA8C77 +:100300001A99300A306B484CF01F0004581C5F0CDF +:100310002FFDD8028003C45C8001776CEBCD406870 +:10032000201D48F61893FAC5FFFC2F060AFC0C9C0A +:10033000F01F000C303CF01F000CF94301300C9C06 +:10034000F01F000A0A993018300A307B488CF01FE1 +:100350000009581C5F0C2FFDE3CD8068000087F476 +:10036000800145FC8001EF6C800145FE8003C46C78 +:100370008001776CEBCD4040201D48E6BA8C2F06FB +:100380000C9CF01F000D303CF01F000C1B88F9483E +:10039000006C0C9CF01F000A30181A99300A309B30 +:1003A000488CF01F0009581C5F0C2FFDE3CD8040E6 +:1003B000000087F4800145FC8001EF6C800145FE60 +:1003C0008003C4748001776CEBCD4068201D1898C1 +:1003D0005CB81895FAC3FFFC48D606D82F060C9CCB +:1003E000F01F000C303CF01F000CF94500F00C9C95 +:1003F000F01F000A1A993048300A309B488CF01FD1 +:100400000009581C5F0C2FFDE3CD8068000087F4C5 +:10041000800145FC8001EF6C800145FE8003C480B3 +:100420008001776CEBCD4068201D18985CB818955A +:10043000FAC3FFFC48D606D82F060C9CF01F000C10 +:10044000303CF01F000CF94500EC0C9CF01F000A3A +:100450001A993048300A309B488CF01F0009581C0C +:100460005F0C2FFDE3CD8068000087F4800145FC20 +:100470008001EF6C800145FE8003C48C8001776CA5 +:10048000EBCD4068201D18985CB81895FAC3FFFCA6 +:1004900048D606D82F060C9CF01F000C303CF01FED +:1004A000000CF94500E80C9CF01F000A1A9930482E +:1004B000300A309B488CF01F0009581C5F0C2FFD40 +:1004C000E3CD8068000087F4800145FC8001EF6C7B +:1004D000800145FE8003C4988001776CEBCD4068B5 +:1004E000201D18985CB81895FAC3FFFC48D606D8AA +:1004F0002F060C9CF01F000C303CF01F000CF9453F +:1005000000E40C9CF01F000A1A993048300A309B16 +:10051000488CF01F0009581C5F0C2FFDE3CD80684C +:10052000000087F4800145FC8001EF6C800145FEEE +:100530008003C4A48001776CEBCD4068201D18981F +:100540005CB81895FAC3FFFC48D606D82F060C9C59 +:10055000F01F000C303CF01F000CF94500DC0C9C37 +:10056000F01F000A1A993048300A309B488CF01F5F +:100570000009581C5F0C2FFDE3CD8068000087F454 +:10058000800145FC8001EF6C800145FE8003C4B012 +:100590008001776CEBCD4060201D48F5BABC2F057B +:1005A0000A9CF01F000E303CF01F000DFAC6FFFC45 +:1005B0000D78F94800D80A9CF01F000A0C993018F1 +:1005C000300A306B488CF01F0009581C5F0C2FFD5F +:1005D000E3CD8060000087F4800145FC8001EF6C72 +:1005E000800145FE8003C4BC8001776CEBCD40C028 +:1005F000206D49EC3008F939010DF93B010850082C +:1006000050281AD9F93A010C1ADAFAC7FFF8F93961 +:10061000010AF93A01090E9CF01F00152FED580C44 +:10062000C10140085808C0401A9CF01F0012402C1D +:10063000580CC040F01F0010300C2FADE3CD80C02F +:100640001A9CF01F000E400818965808C0401A9CCB +:10065000F01F0008402C580CC030F01F000758163F +:100660005F0C2FADE3CD80C0000087F48001DAE499 +:100670008001D3A8800091E880018E9CD4214C0792 +:10068000405EEF6C0108EF6B0109EF6E010D1495F0 +:100690001294109A3019F2081800C120EEF801B037 +:1006A0005808C3D05828C4C04B5CEF3B01B5338811 +:1006B000F00B1800C5403398F00B1800C440EF6AE7 +:1006C000010CF01F0030EDDCB010F01F002F0C0CFF +:1006D0005C5C5805C1E11895F01F002A1815EF65FC +:1006E000010AF01F0029EDDCB010F01F00260C0CF1 +:1006F0005C5C5804C3F11894F01F00221814EF64D6 +:10070000010B6E98EDB80001C031F01F0020DA2A0D +:10071000EA0C1800FE98FFE23FCCD822EF3901B571 +:100720003348F0091800CC11EF3901B63418F0093C +:100730001800FE98FFC630E8EF68010CCC3BEF696B +:10074000010CCC0BEF3901B63408F0091800FE9803 +:10075000FFB8301948A8F169010CCB4BF93901B643 +:100760003408F0091800FE98FFA835A8F968010CB4 +:10077000CA9BE80C1800FE9BFFD1CBFB000087F45E +:100780008001F4A48001F504800205ECEBCD40E08B +:10079000303CF01F002330CB18954A26300CF01F58 +:1007A0000022ED4C01AC1897C360303BF01F001FD6 +:1007B0008F2CECF901AC72275807C2903078300BBF +:1007C000B2883068ECFA01ACB498ECF901ACB2AB89 +:1007D000ECF801ACB0BBECF901ACB2CBECF801AC7D +:1007E000EB390075702AB489ECF801ACEB39007470 +:1007F000702AB499ECF801ACEAFB00847029B2AB22 +:10080000ECFC01ACF01F000AE3CF90E0ECCCFE540E +:10081000F01F00080E9CE3CD80E000008001EF6C2B +:10082000000087F48001D8DC8001D3EC800208D47A +:100830008001D3A8D401F01F0002DA0A8001DA5641 +:10084000D401F01F0002DA0A8001DF30D401F01F6A +:100850000002DA0A8001DBE8D401F01F0002DA0AA4 +:100860008001DC04D401F01F0002DA0A8001DC20E0 +:10087000D401F01F0002DA0A8001DC3CD401F01F31 +:100880000002DA0A8001DC58D401F01F0002DA0A03 +:100890008001DC74D401201D1A9BF01F000CC09055 +:1008A00040085808C06048AA7499EDB90000C030EB +:1008B0002FFDDA0A1298A1C831CC9598300A149B02 +:1008C000F01F00042FFDDA0A8001D98C000087F4A4 +:1008D00080014658EBCD40C0206D4958189B709C54 +:1008E000E21C0002C06118970E9C2FADE3CD80C0C2 +:1008F00030081A96502850081A9CF01F000EC1119B +:10090000189740085808C0401A9CF01F000B402C54 +:10091000580CCEB0F01F00090E9C2FADE3CD80C067 +:100920001A9C3017F01F0006CEDB0000000087F491 +:100930008001DED08001D3A8800091E880018E9CE8 +:10094000EBCD4080201D300A1A9BF01F0017C0F02D +:1009500040085808C0F149576E99EDB9000BC071B5 +:10096000EEF801A84917F1D8C001C1212FFDE3CF4E +:10097000908048E76E99EDB90000CF01A1C9300A17 +:100980008F9931CC149BF01F000A6E99CE7BEEFC40 +:1009900001ACF01F00086E98301CABD88F982FFD6B +:1009A000E3CD80808001ED10000087F4800146587F +:1009B000800208D4D401F01F0002DA0A8001DBD0E3 +:1009C000EBCD40FC206D4A5318951097169266980F +:1009D0001496109C1294E21C0002C2D05BF5C30175 +:1009E000303CF01F001F300BF3D7C010F5D4C010FF +:1009F0001AD90C981ADAF3D2C010504B502BFAC601 +:100A0000FFF8F93B00F70A9A0C9CF01F00162FED37 +:100A1000580CC1B1189740085808C0401A9CF01FE4 +:100A20000012402C580CC030F01F00100E9C2FAD4F +:100A3000E3CD80FC18970E9C2FADE3CD80FCEDB884 +:100A40000000CCF13FB7CF3B6698A1A81A9C8798CD +:100A50003017F01F0007CE0B000087F48001EF6C09 +:100A60008001DB588001D3A8800091E880018E9C32 +:100A7000D40130085C7B1099109AF01F0002D80254 +:100A8000800209C0D4013008364B1099109A109C8E +:100A9000F01F0002D8020000800209C0EBCD40E048 +:100AA00020AD3006507CFB6B00201497500650267A +:100AB0001A95FACAFFDCFACBFFE81A9CF01F00195E +:100AC000C111189640085808C0401A9CF01F001623 +:100AD000402C580CC030F01F00150C9C2F6DE3CD3E +:100AE00080E05807C09040980E9B0C9C8F28F01F08 +:100AF0000010581CC0611A9C3016F01F000ECE3B2F +:100B000040085808C0401A9CF01F0007402C580CA1 +:100B1000C0313FD6CE3BF01F00053FD6CDFB0000D5 +:100B20008001DC8C8001D3A8800091E880016C40BA +:100B300080018E9CD401F01F0002D80280020A9C22 +:100B4000EBCD40E0209D3018189A1697F00C09481C +:100B50004A5B7609F1E9000CC06118970E9C2F7D65 +:100B6000E3CD80E0F00811FF12683006507A970854 +:100B7000500650261A95FACAFFE0FACBFFE81A9CF5 +:100B8000F01F001AC1E05807C09040880E9B0C9CD3 +:100B90008F28F01F0017581CC1611A9C3017F01FD6 +:100BA000001540085808C0401A9CF01F0013402C44 +:100BB000580CCD50F01F00110E9C2F7DE3CD80E02E +:100BC0001897CF0B40085808C0401A9CF01F000A25 +:100BD000402C580CC0313FD7CC2BF01F00083FD71A +:100BE000CBEB000000007A4C8001DCEC80016C4013 +:100BF00080018E9C8001D3A8800091E8EBCD40F865 +:100C0000216DFAC6FF901897FB69000EFB68000F74 +:100C1000FB6B0010FB6A00116CF46D036D15ECCCDE +:100C2000FFD4F01F0038306ABA6CECCBFFDCFACC92 +:100C3000FFEDF01F00350D88FB6800190D99ECCB16 +:100C4000FFFEFB69001A320AFACCFFE5F01F002E06 +:100C50004AEE30097C0B301CF809094AF5EB000814 +:100C6000C0902FF95899CF9130060C9C2EADE3CD52 +:100C700080F8F7EA10089D085BF9CF705024FB63F9 +:100C8000001250195807EFF91A003006FAC7FFC4CE +:100C900050F65116FACAFFAC1A9B0E9CF01F001CAE +:100CA000C111189640F85808C0400E9CF01F00195A +:100CB000411C580CCDB0F01F00180C9C2EADE3CD9C +:100CC00080F85805C09041580A9B0C9C8B28F01F57 +:100CD0000013581CC0610E9C3016F01F0011CE3B53 +:100CE00040F85808C0400E9CF01F000A411C580CE8 +:100CF000C0313FD6CBBBF01F00083FD6CB7B0000F6 +:100D000080018058800091DC00007A4C8001DD4C2D +:100D10008001D3A8800091E880016C4080018E9C06 +:100D2000D42120DD4B0510946A0E4126F1DEC0016E +:100D3000C0B0EDBE0001C411EDBE0002C411300709 +:100D40000E9C2F3DD82210973018FB6B002A508A3A +:100D50005077FDE8100850998B08FB540028580C78 +:100D6000F9F71A001A953007FACAFFD05007502732 +:100D7000FACBFFE81A9CF01F001DC101189740082C +:100D80005808C0401A9CF01F001A402C580CCD90F7 +:100D9000F01F00180E9C2F3DD8225806C09040C866 +:100DA0000C9B0E9C8D28F01F0014581CC0C11A9C6F +:100DB0003017F01F0012CE4B30173028CC7B302775 +:100DC0003048CC4B40085808C0401A9CF01F00081F +:100DD000402C580CC0313FD7CB4BF01F00063FD7FB +:100DE000CB0B000000007A488001DDAC8001D3A865 +:100DF000800091E880016C4080018E9CEBCD40E04A +:100E0000207D300616975006189B50261A95FACA70 +:100E1000FFE81A9CF01F001AC111189640085808E4 +:100E2000C0401A9CF01F0017402C580CC030F01F17 +:100E300000160C9C2F9DE3CD80E05807C1904068C0 +:100E40000E9B0C9C8F28F01F0011581CC1104008ED +:100E50005808C0401A9CF01F000B402C580CC0D002 +:100E6000F01F000930060C9C2F9DE3CD80E01A9CFA +:100E70003016F01F0007CD3B1896CDCB8001DE0C5D +:100E80008001D3A8800091E880016C4080018E9C95 +:100E9000D40120CDFB5A0012FB590014FACAFFCC32 +:100EA000502874197408FB590016501874397428A6 +:100EB000FB59001AFB580018745974485039FB58F4 +:100EC000001C74797468FB590020FB58001E74994B +:100ED000748850A95098300974A8FB6C0022FB5B01 +:100EE0000010FB68002C74BBFB6900231A9CF01FE8 +:100EF00000032F4DD802000080020DFCEBCD40EE28 +:100F000020CD3FF94CC850A950B94CC93005303CF0 +:100F100091059305F01F004A322A18961A971A9CD9 +:100F20000A9BF01F0048FAC3FFDE306AE06B00FF47 +:100F3000069CF01F00441AD5ED38004F1AD86D28D2 +:100F40001AD86D191AD9ED1800361AD8ED190032D1 +:100F50001AD96CE81AD8ED19002E1AD9ED18002A02 +:100F60001AD8ED1900261AD9ED1800221AD86C6982 +:100F700030BB1AD9301C6D08ED1900FEED3A001F88 +:100F8000F01F0031ECFB01282F4DF6C80001581866 +:100F9000E0880045ED3100F7ECCAFF8C30153006D3 +:100FA0001AD61AD540D81AD8F4E80000206D069B4E +:100FB000FAE900081A9CF4E20008306AFAE300102B +:100FC000F01F0022EF380021209DFB680021EEE891 +:100FD0000000FAE90000EEE20008FAE30008EEE89B +:100FE0000010FAE90010EEE20018FAE30018EF38FA +:100FF0000020029BFB6800200A990C98FACCFF9015 +:10100000303AF01F00130C9A2EED0C9B40ACF01FF1 +:1010100000110A9C2F4DE3CD80EE1AD50A98FACC28 +:10102000FFD05C5B0A99FE7AFF6AF01F000B2FFD70 +:10103000CB2B000000007A4C00007A488001EF6C56 +:10104000800091D080020E908002E73680020BFC77 +:1010500080020A9C80020D20D431202D500B189163 +:101060004A1776026E9CE21C0002C350304C5011AD +:101070005801E2021700F01F001DEEF700F0189073 +:101080005807C2D030043013C0A82FF45802C1B1A1 +:101090005801F9B301FF5805C1100A9760B66E05F3 +:1010A000F01F00130C9A189B0E9CF01F0012CEE04C +:1010B0000E9CF01F00115805CF114008069C9104AA +:1010C0002FEDD83240182012110C0E9B5018F01F33 +:1010D000000BCE2B1893069C2FEDD8320E943013B4 +:1010E000CEDB0000000087F48001EF6C800145C476 +:1010F000800159A080015CDC800184284828F0FC34 +:1011000000F85EFC000087F4486871195879F9B856 +:101110000001F9F80A00F9B80100F9F81A005EFFB9 +:10112000000087F44828F14C007C5EFC000087F446 +:101130004828F14C01D05EFF000087F4EBCD40C0A1 +:1011400018971496E04A0020E088000830083FF91C +:10115000B898B889E3CF80C02FECF01F00043008A6 +:10116000AE96AE88E3CF90C0800091DCEBCD40FC22 +:10117000206D18941695F01F00431897C1A0F939F7 +:1011800000CC3FF8F0091800C3910896EF3900A889 +:101190003FF8F0091800C5414BB8F0F700F85807C0 +:1011A000C0A1EC040104301C8B042FADE3CD80FC06 +:1011B0000896CF3BE06AFFFF300B1A9CF01F00330C +:1011C0006F38302A707C1A9B2F4CF01F00311A9216 +:1011D0006A0A9A93063AC0442FADE3CFC0FC0C9B39 +:1011E0001A9C5C7AF01F00296F380606707C1A9BE7 +:1011F0002F4C300AF01F0026CD5BE06AFFFF300B5A +:101200001A9CF01F0022302AEEC2FF341A9B049C65 +:10121000F01F00201A966A0A9A93063ACDE55C7A86 +:10122000089B1A9CF01F00191A9B049C300AF01F9F +:1012300000196A08E803000606188B08CA8BE06AE2 +:10124000FFFF300B1A9CF01F0011302AEEC7FF5829 +:101250001A9B0E9CF01F00101A926A0A9A93063A83 +:10126000CBC50C9B5C7A1A9CF01F00081A9B0E9C45 +:10127000300AF01F00096A08060606188B08C8DB4A +:101280008001EFF8000087F48001C7B88001D344E3 +:101290008001D6B08001D558D401F01F0002D802D9 +:1012A00080015D18EBCD40F8FACD00803225149313 +:1012B00018941297BA85FAC6FFFF0C9CF01F001B0A +:1012C000300806063019AC85AC981A951A9A498BE5 +:1012D000089CF01F0018C0503FFC2E0DE3CD80F895 +:1012E0000E9CF01F0015E04C0040C1701AD7493A1F +:1012F000E06B00800A9CF01F00120A9A3019491B0B +:10130000089CF01F000C2FFD1897580CCE61089C0C +:10131000F01F000D0E9CCE2B0E9A089C3019489B96 +:10132000F01F0004CDB0CD9B800091DC8003C4FC95 +:1013300080023BB8800091B8800399D0800091482A +:101340008003C50480024328D421210D300B4B6655 +:10135000169CF01F00368D0CC2B078075807C2A04B +:101360006F985808C2704B283014EF4400641A95E7 +:10137000340B1AD84AFA0A9CF01F002F08990A9ACF +:101380004AEB0E9CF01F002E2FFD580CC2506C082B +:10139000700CF01F002C6C09300893086C08700961 +:1013A0004A98722A910A6C09300893486C0C2F0DE8 +:1013B000D822F01F00261897CF70F01F00254A583A +:1013C0004A59118A4A5B0E9CF01F0025C2056E29FE +:1013D00049D89109CE9B08994A2A4A3B0E9CF01F96 +:1013E0000018C1C14A18340B1AD8492A0A9CF01FA8 +:1013F000001208990A9A49EB0E9CF01F00112FFD6C +:10140000580CC0C13088EF480054CC9B0E9CF01F94 +:10141000000D6C0930089308CC7B0E9CF01F00096E +:10142000CB7B000000008C8C80023B4C8003C50805 +:10143000800399D0800091488003C4FC80023BB8AF +:1014400080024190000003FC80024F4080023B225A +:10145000000004000000042800000404800212A41C +:101460008003C5108003C5148003C5188003C538E8 +:10147000D421169849871495189B109A49740E9C8C +:10148000A888F01F00170A9B30064965EF66002008 +:10149000341A0A9CF01F001449484959EB66004071 +:1014A000700B720CF01F00131896C0C0F01F0012D2 +:1014B0000A99098A0E9B0C9CF01F00106D185808A1 +:1014C000C021D822ECCAFFDC0A9C3209341BF01F71 +:1014D000000CD8220000040400000400800091DC0D +:1014E00000000428800091AC000003FC00008C8CFC +:1014F00080023B0680023B22800212A480023A68EE +:10150000D421210D328A300B1A9CF01F00301A9C16 +:1015100030073014504750544AD5F01F002E8B0C22 +:101520001A96C4A0FAC6FFD8318A0E9B0C9CF01FF5 +:1015300000274A984A990C9B50E850A96A0CF01F62 +:1015400000281896C3B04A7CF01F00274A761AD7A5 +:10155000304B1AD70E984A694A6AEC0B000CF01F00 +:1015600000260E981AD74A591AD74A5A302B0C9C83 +:10157000F01F00210E981AD74A291AD74A2A311B80 +:10158000ECCCFFF8F01F001C0E981AD749F91AD7B7 +:1015900049FA312BECCCFFF4F01F00170E982F8D79 +:1015A000ECCCFFF01AD749B91AD749BA315BF01F12 +:1015B0000012089C2FED2F0DD8226A0CF01F001787 +:1015C0000C9C8B06CF9B0000800091D000007A50CD +:1015D00080022B4C8003C5448003C54C80022C0440 +:1015E000800216FC8002113000007A5480021670CE +:1015F0008003C55480016EB8800217408003C3ACDD +:10160000800216C48003C5708002168C8003C58CCE +:101610008002161C8003C5A480022AF8EBCD40C0CE +:1016200021AD189798E8EDB80000C181368A300BDB +:101630001A9CF01F000C306A0E9B1A9CF01F000AC7 +:101640006E2830195C3850395028488870091A962D +:101650001A9A720C306BF01F00062E6DE3CD80C01D +:10166000800091D0800091DC00007A508002792CBB +:10167000D40148587009300A720C301BF01F000367 +:10168000D802000000007A508002792CEBCD404057 +:1016900021AD368A300B1A9CF01F000830084889AB +:1016A000500872081A961A9A700C302BF01F000519 +:1016B0002E6DE3CD80400000800091D000007A5074 +:1016C0008002792CEBCD404021AD368A300B1A9C3C +:1016D000F01F000830184889500872081A961A9AA4 +:1016E000700C302BF01F00052E6DE3CD8040000004 +:1016F000800091D000007A508002792CD401487883 +:10170000700EF6C9000E189AF8CBFFFA2F2A7C0C3F +:10171000F01F0003DA0A000000007A50800224E083 +:10172000D401580CC051304CF01F0004D802304C8A +:10173000F01F0003D80200008001A12880019F3023 +:10174000EBCD40E0FACD0170FACCFE98F01F001905 +:10175000581CC22145A85818E088001FE068010005 +:10176000FACBFE901A9C16D8F01F00131A95189603 +:10177000FAC7FF00368A300B0E9CF01F0010581677 +:10178000C11048F870090E9A720C300BF01F000D52 +:101790002A4DE3CD80E0300CF01F000B2A4DE3CD45 +:1017A00080E045B85808FE9AFFEE540D5418CEABB1 +:1017B00080015F448002116C800091D000007A505B +:1017C0008002792C80021720000000000000000039 +:1017D000EBCD40C0F8F800D418971696F0F80088C2 +:1017E000F8FA00E85808C040F8FC00C45D185876C4 +:1017F000C1A058065F0858365F091248C11030185A +:10180000EF4800ECEEF900D473985808C050300B44 +:10181000EEFC00C45D18EF4600E8E3CD80C05846FA +:10182000CEF0CFABEEF800EC5808CF603008301B9C +:10183000EF4800ECEF4B00F0EEF800D47198580838 +:10184000CE81CEABD401F01F0002D802800217D0A7 +:10185000F8FC00E85EFCD401F8F800D471A8580840 +:10186000C050F8FC00C45D18D802109CD802D40106 +:10187000F8F800D471185808C050F8FC00C45D187E +:10188000D802DC0AD401F8F800D471285808C050F6 +:10189000F8FC00C45D18D802DC0AD703EBCD408009 +:1018A0003008F8F90108F94801085809C031C08822 +:1018B0000E997207129CF01F00045807CFA1E3CDC8 +:1018C00080800000800091E8D401F8FC00DCF01F6B +:1018D0000002D8028002B4A4D401F8FC0090F01FEA +:1018E0000002D80280023B8CD401F8FC0090F01F6B +:1018F0000002D80280023C84EBCD40C01696F8F777 +:1019000001085807C051C0B86E075807C080EECC18 +:10191000FFFC306A0C9BF01F0004CF710E9CE3CDDE +:1019200080C000008000917CD4011699F8F801185D +:101930005808C0A1F8F800D470285808C0C0F8FCB6 +:1019400000C45D18D802F8CBFF64306A129CF01F07 +:101950000003D80ADC0A0000800091DCEBCD40F8DF +:1019600020AD1897F8F801185808C06030070E9C91 +:101970002F6DE3CD80F8F8F800D470385808CF7098 +:10198000F8FC00C41A9B1A935D181895CF05EEF861 +:1019900001185808C431EEF800D470285808CE70E9 +:1019A000FAC4FFE0EEFC00C4089B5D18CE05EEFC17 +:1019B000009078465806C301EEF800D45808C2C01B +:1019C000700C49BBF01F001BEFFC0024F9B60001AE +:1019D000EFFC102478075807C111CCAB5806C0B0F3 +:1019E0006E885808CC50EECBFFE8306A089CF01F98 +:1019F0000012CBE06E075807CBB0EEF80194580800 +:101A0000CFA16E581035CEB16E4B0A9A1A9CF01FBA +:101A1000000ACE70CE4B3006CDEBFAC4FFE0306A40 +:101A2000EECBFF64089CF01F0005CC2B8003C65C46 +:101A3000800091A08000917C800091DCD401F01F97 +:101A40000002D8028002195CD42120AD3008FB5876 +:101A50000024508816961897F6F801845818C0404C +:101A60003FFC2F6DD82277185808CFB0F8F500B892 +:101A70005885C2205905CF512DCB0A9A1A9CF01FC8 +:101A800000171A940A9A303BEEFE00D47C5858088E +:101A9000CE801ADA1AD43009EF490104EEFC00C4F2 +:101AA00030681AD8FACAFFD430181ADA48CA7C56F5 +:101AB0005D162FCDCD7B2DCB318A1A9CF01F0007F0 +:101AC0000A9AECCBFFCCFACCFFE8F01F00041A9482 +:101AD000320A302BCDAB0000800091DC80039C38B3 +:101AE000D42118951696F01F000F1897C05078381B +:101AF0002FF89938D82A310CF01F000B1894C0F039 +:101B00000C9B306A2FCCF01F000930188938EAF995 +:101B100001088909EB4401080E9CD822DC2A000048 +:101B2000800218F880028F24800091DCEBCD40FC0D +:101B3000EDD9C010407218941693ECCCFFFC1495AC +:101B4000910CF01F00161897C190E8F800907039BA +:101B5000EC081608B893B889B8B6B8A85805C100FB +:101B60000C9A0A9BF8C6FFFC0C9CF01F000D0E9C03 +:101B70005802E5F61A00E3CD80FCE3CD80FC0C9A18 +:101B80000A9BF8C6FFFC0C9CF01F00060E9C580236 +:101B9000E5F61A00E3CD80FC80009200800091DC25 +:101BA000800091D0D401401E5C791ADEF01F000243 +:101BB0002FFDD80280021B2CEBCD40F8203DF8F819 +:101BC00000BC1493129458485F0A58285F0918976C +:101BD00016961449C0603FF70E9C2FDDE3CD80F8C8 +:101BE000F8FC00DCF01F002BC0305816CF50EEC5BB +:101BF000FF64306A4A8B0A9CF01F0028C0D1EEF8BF +:101C000000D470285808C060EEFC00C41A9B5D1810 +:101C1000C370EEC5FF043008F7D6C0081AD8F3D455 +:101C2000C010FAC8FFF4069A0E9CF01F001D2FFD8D +:101C30001896580CCD1040296E2C580CC1001298E3 +:101C40000A9B0C99E06A888EF01F001618970C9C6E +:101C5000F01F00150E9C2FDDE3CD80F8EEF800D4C8 +:101C600071845804C0B01298EEFC00C40A9B0C9911 +:101C7000E06A888E5D141897CEBB3FF7CE9B306A22 +:101C8000485B1A9CF01F0005CC501A95CC5B0000F5 +:101C900080028F78800217C88000917C80021B2C04 +:101CA00080028154800091E8EBCD40C0189EEFDAAD +:101CB000C010782C580CC0600E9AF01F0009E3CDBC +:101CC00080C0FCFA00D475865806C0700E9AFCFCE1 +:101CD00000C45D16E3CD80C0E3CFC0C08002815454 +:101CE000D421497A1894301BF01F0016300A089B43 +:101CF000495CE8C5FF64F01F0015E8F701085807C4 +:101D0000C1C03006C0680E966E0C580CC1601897A2 +:101D1000306A0A9BEECCFFFCF01F000DCF51580635 +:101D2000EFF80000E9F80A42EFF81000EDF81A00A9 +:101D30000E9CF01F0008D822D82200008003C66441 +:101D400080023A1A80023058800274008000917C30 +:101D5000800091E8D401F01F0002D80280021CE04C +:101D6000EBCD408048FA1897301BF01F000FEEF8BB +:101D700000BC5818C0F00E9B300A48CCF01F000C75 +:101D80000E9CF01F000C0E9C307BF01F000BE3CD6F +:101D900080800E9C305BF01F0008E3CD8080000047 +:101DA0008003C68880023A1A8002360080027400DE +:101DB00080021CE0800217D0EBCD4040486A1896A4 +:101DC000301BF01F00060C9B300A485CF01F00051A +:101DD000E3CD80408003C6A880023A1A8002360014 +:101DE00080027400EBCD40F81894F8FC00CC580C3D +:101DF000C360E8F800D05808E08A00321897E8C3BA +:101E0000FF643005C0A8580AC200EEC7FF64E8F8B6 +:101E100000D00A38E08A00242FF5E8F600B0306AD6 +:101E2000069B0E9CF01F0015CF115806C0E06C5A9F +:101E30006EA81438CE91EECCFFFA6C4BF01F000F59 +:101E4000C0406C5A580ACE215807C0906F5AEECB4A +:101E5000FFD4E8FC00DCF01F000AC0403FFCE3CDEB +:101E600080F8EECBFFA8E8FC00DCEEFA0080F01F63 +:101E70000005CF60CF4B00008000917C8002B58CC4 +:101E80008002B52CD4211895E06C009CF01F001B3B +:101E90001897C310EAF401185804C2A1EAF800D454 +:101EA00070C85808C250189B301AEAFC00C45D186C +:101EB0001898C1E50E9C3016E06B009CF0060D46AC +:101EC000EC0B024BF01F000E58065F09580C5F1810 +:101ED0001248E8081800F8071710EAFC00CCF01FB9 +:101EE0000009089CEB4600D0EB4700CCD8220E9CA2 +:101EF000F01F0004DC2A000080009200800091F4B2 +:101F0000800091E8EBCD40801897F01F0008C031A9 +:101F1000E3CD80800E9CF01F0006C0550E9CF01F84 +:101F20000003CF7BE3CFC08080021DE480021E84CB +:101F3000EBCD40FE208D18961697149512921091B5 +:101F4000580BC580F6FB0080580BC0E16F5B580B47 +:101F5000C3210C9CFEFA02E4303BF01F00B93FFCA9 +:101F60002F8DE3CD80FE7568EDB80001CF011A9A80 +:101F7000EECCFFA8F01F00B3CEA16B484029126839 +:101F8000CE606B3840191268CE206B584039126809 +:101F9000CDE0FEFA02B2301B0C9CF01F00A9EEC48B +:101FA000FFD4302A303BECFC00DCF01F00A8089C7A +:101FB0006F5AC4386B68EDB80000CCC1EEC4FFD4D2 +:101FC0001A9A089CF01F009FCC516B484029126858 +:101FD000CC106B3840191268CBD06B58403912685E +:101FE000CB90FEFA026A301B0C9CF01F0095301A51 +:101FF000CDAB7568E21800021A93F9B40102F9B486 +:102000000001F8FC00DC1A9BF01F0092C1F05BECB1 +:10201000C4001A9C320A300BF01F008F6B48502806 +:102020006B3950196B585038089A303BECFC00DC87 +:10203000F01F0086300C189A189BECFC00DCF01F97 +:102040000087C3602F8DE3CFC0FE402A6B49F3EABF +:102050000008C0D0401A6B39F3EA0008C110403ABA +:102060006B59F3EA0008C1B04004CDFB1AD9302BFC +:102070001ADA0C9C4FAAF01F00722FEDCCBB1AD9B4 +:10208000302B1ADA0C9C4F7AF01F006D2FEDCC2B01 +:102090004F5A302B0C9CF01F006ACBCB1AD9302B37 +:1020A0001ADA0C9C4F1AF01F00662FEDCB3B580735 +:1020B000EE0B1700F60A1700F9B80158EFD8E10B3C +:1020C000EFFA1020ECFC00DCF01F0069CBC16B487C +:1020D0004029F1E90009EDB90004C5D0EDB90003CC +:1020E000C750EDB90002E081009430484E1AED4827 +:1020F00000B8301B0C9CF01F00526B384019F1E9FE +:102100000009EDB90004C500EDB90003C7513088DE +:102110004D9AED4800B4301B0C9CF01F00496B58E1 +:102120004039F1E90009EDB90000E080007FEDB928 +:102130000001C55130284D1AED4800BC301B0C9CE5 +:10214000F01F003FECFA00BC306BECFC00DCF01F31 +:10215000003FECFA00B4304BECFC00DCF01F003B1D +:10216000ECFA00B8305BECFC00DCF01F0038029A9F +:10217000049BECFC00DCF01F00421894FE91FF640D +:102180006B57E2170002C191ECFC00DCF01F003D30 +:102190000E9CCE7A31084BCAED4800B8301B0C9C1F +:1021A000F01F0027CABB31084B8AED4800B4301B32 +:1021B0000C9CF01F0023CB4BECFC00DCEACBFFDCDB +:1021C000320AF01F0033089CCCCA30884B1AED4805 +:1021D00000B8301B0C9CF01F001AC90BEDB90004AD +:1021E000FE91FF3231084ACAED4800BC301B0C9CFE +:1021F000F01F0013CA8BEDB90000FE91FF25301BC4 +:102200004A6AED4B00B40C9CF01F000DC89BEDB961 +:102210000001FE91FF1930284A1AED4800B8301B22 +:102220000C9CF01F0007C6AB301B49EAED4B00BC0D +:102230000C9CF01F0003C87B8003C8EC80023A1A94 +:102240008002BD688003C6C08002B4D48003C6E0AB +:102250008002C04C800091D08002B58C8003C734CE +:102260008003C7788003C7008003C7BC8002B52CF9 +:102270008003C8288003C86C8003C8B08002B64CB5 +:102280008002B9EC8003C8008003C8588002B91CE2 +:102290008003C8148003C8CC8003C8808003C84072 +:1022A0008003C894EBCD40C07758EDB80003F9B86F +:1022B0000008F9F80A2FF9B80104F9F81A2F18974D +:1022C000300A1696F8FC00DC149BF01F0025300A3B +:1022D000EEFC00DC149BF01F0023300AEEFC00DC57 +:1022E000149BF01F002130183009ECCBFECCEF48D6 +:1022F00000B8EF4800B4EF4900C02FF976085858ED +:10230000E08B00225808C2512FCB5849CF71EEFA0A +:1023100000BC306BEEFC00DCF01F0014EEFA00B4E1 +:10232000304BEEFC00DCF01F0011EEFA00B8305B21 +:10233000EEFC00DCF01F000DEEFC00DCF01F000CDA +:10234000E3CD80C03048EF4800B8EF4800B4CE0B72 +:102350003028EF4800B8EF4800B4CDAB8002B58C10 +:102360008002B52C8002B5EC8002B4D480028F804C +:10237000EBCD40E0205D1897F8F600B0F8F800BC0F +:102380005828C57059085F0958485F081248C2901C +:10239000302BEEFC00E0F01F002F314A300B1A9C6E +:1023A000F01F002D1A95EEFA00BC588AC200EEF814 +:1023B00000905808C03070785028149958895F18D8 +:1023C00058195F191069ECF8017CEEFC00E01A9ACC +:1023D0000C9B50495038F01F00212FBDE3CD80E009 +:1023E000300BEEFC00E0F01F001BCD8B30085018C6 +:1023F000301B500BECF900F0F3EB0008FBFB1A016B +:10240000EDB90001C120EEF800905808C1F0EEFCD3 +:1024100000D4580CCD10780C491BF01F0012FBFCA7 +:102420000A01EEFA00BCCC4B4018A1B85018CECB34 +:10243000300BF8FC00E0F01F000C300BEEFC00E06D +:10244000F01F000AEEF800BCC9EB3089CB8B00000E +:1024500080026178800091D08002581C8003C65CA5 +:10246000800091A0800261A48002618CEBCD40E0ED +:10247000189716951496F8F800905808C0D0704830 +:102480005808C0A1F8FC00D4580CC060780C48EB88 +:10249000F01F000EC1501AD648DA1AD5301B0E9C18 +:1024A000F01F000C300A0E9B48BCF01F000C0E9968 +:1024B0000C9B0A9C3008488AF01F00092FEDE3CDE1 +:1024C00080E000008003C65C800091A08003C960AA +:1024D00080023A1A800230588002740080027474BC +:1024E000D4211295169614941897F8F900BC5849FF +:1024F000C1C0F8FA00F4580AC10158895F08581998 +:102500005F0B104BF40B1800F9BB000AF9BB014636 +:10251000F01F0019EEFA00F4F4C8FFFFEF4800F4D2 +:10252000EEF900945809C020D822306A0C9BEECCFA +:10253000FF04F01F0012EEF800BC5828C111EEF89D +:1025400000D471585808C040EEFC00C45D180A99C8 +:10255000089A0C9BEEFC00DCF01F0009D8220A99B7 +:10256000089A0C9BEEFC00E0F01F0006FE99FFDECF +:10257000CE7B00008002246C800091DC8002C3CC02 +:10258000800261FCEBCD406C1ADA18951ADB1692CA +:102590001493301B48AAF01F000B48B6300A0A9B60 +:1025A0000C9CF01F000A0A990C9A069B049C3008A8 +:1025B000F01F00072FEDE3CD806C00008003C99071 +:1025C00080023A1A8002360080027400800274741D +:1025D000D401F01F0002D80280022584EBCD40C058 +:1025E000189E1497109CFCF800BC5888C240580BE9 +:1025F000C1A0FCCAFF64FCF600D46C585808C19016 +:102600001ADC16981AD9300BFCFC00C41ADBFD4BFF +:102610000104490E0E991ADE301B6C565D162FCD43 +:10262000E3CD80C0FCF600D448BA6C585808CE916F +:10263000E3CFC0C0585CF9B80002F9B80104580BE8 +:10264000C040FD4800B4CD6BFD4800B8482ACD4BD2 +:1026500080037E2080039C38EBCD40F8FACEFFE863 +:1026600018967C35F8F400D47C037C17685C7C2ECB +:10267000580CC0F01AD51ADE300E1AD71AD3ED4E08 +:102680000104ECFC00C468565D162FCDE3CD80F844 +:10269000E3CFC0F8D42118951694F8F70104580731 +:1026A000C020D822F8F900D472585808C4C01AD7EC +:1026B000F94701041AD70E981AD74B6A1AD70E9BFE +:1026C0007256F8FC00C40E995D16EAF900D42FCDBD +:1026D00072585808C3801AD7EB4701041AD70E98CE +:1026E0001AD74ACA1AD70E9B7256EAFC00C4301990 +:1026F0005D16EAF900D42FCD72585808C2401AD797 +:10270000EB4701041AD70E981AD74A2A1AD70E9BFC +:102710007256EAFC00C430295D16EAF900D42FCDC8 +:1027200072585808C1001AD7EB4701041AD70E98FF +:102730001AD7498A1AD70E9B7256EAFC00C4303960 +:102740005D162FCD5804C200EAFA00D47458580818 +:10275000C12030091AD91AD9EB4901041AD91298A3 +:102760001AD9129B7456EAFC00C4089A5D16EAFA5C +:1027700000D42FCD75A85808C070089B3019300AB6 +:10278000EAFC00C45D183018EB480104D8220000B0 +:1027900080039C38D421204DF8F900D41897169561 +:1027A00073885808C2C11094F8C6FFEAC1C8EEFC8D +:1027B00000C45D1B1AD4189B0E984C19E06A888ED1 +:1027C0000C9CF01F00408F2C2FFD580CC111580598 +:1027D000C140189B305CF01F003CEEF900D47388B8 +:1027E0005808C0D1737B580BCE31169CCE4BEECB24 +:1027F000FFF0F01F0036C1302FCDDC2A7378580867 +:10280000C0B0EEFC00C45D18C070189B306AEECCFE +:10281000FFF0F01F002F6E2C580CCEA1EF39007A7C +:102820003008F0091800C3A1EEF800D47048580829 +:10283000C100301BEEFC00C45D18C0B4EEF800D43B +:1028400071485808C0601A9BEEFC00C45D18C214A1 +:10285000300B0E9CF01F001FEEF800D47099580941 +:10286000C070300BEEFC00C45D19EEF800D470A807 +:102870005808C050301BEEFC00C45D183018EF48FB +:1028800000C84959300C72082FF893082FCDD82270 +:102890004038F1D8C002CDD0CB0B300848891AD8C7 +:1028A000E06A888E0E98EECBFFF0EECCFF86F01F2C +:1028B00000058F3C2FFD580CCB81C9FB800224E022 +:1028C0008002819C80028F1C800281E4800091DC68 +:1028D0008002269400007A6CEBCD40E018971695A4 +:1028E000300BF01F001DEEC6FF64306A49BB0C9C24 +:1028F000F01F001BC2E0EEF801185808C1F00C9B55 +:102900000E9CF01F00183006EEFC00DC0C9BEF461E +:1029100000B0F01F00150C9A0C9BEEFC00E0F01FBD +:1029200000130C9BEEFC00E0F01F00110C9BEEFC72 +:1029300000E0F01F0010E3CD80E0EEF800D470D886 +:102940005808CDE00A9A0C9BEEFC00C45D18CD8BB4 +:102950001896CD6B800217D0800217C88000917C3A +:10296000800226948002B9D48002581C800261E85B +:10297000800261D4D401F01F0002D802800228D85E +:10298000EBCD40C01897F8F800C45808C230303B6F +:10299000F01F003DEEF800D470495809C070300BAC +:1029A000EEFC00C45D19EEF800D470A95809C0709F +:1029B000300BEEFC00C45D19EEF800D47098580896 +:1029C000C050300BEEFC00C45D18300B0E9CF01FA5 +:1029D000002F6E2C3006F01F002E8F266E3C580CF8 +:1029E000C040F01F002B8F36EEF800E45808F9B80D +:1029F0000100EFF81A39EEFC0090580CC060F01F8F +:102A000000253008EF480090EEFC008CF01F0022FB +:102A10003006EEFC00DC0C9BEF46008CF01F001F24 +:102A2000EEFC00E0F01F001EEEFC00DCEF4600E0D4 +:102A3000F01F001CEEFC00DCF01F001BEEFC00DCB5 +:102A4000F01F001A0E9CEF4600DCF01F0019EEFC90 +:102A500000CCF01F00110E9CEF4600D0EF4600CCDA +:102A6000F01F00140E9CF01F0014EEFC00C4580C64 +:102A7000C070EEF800D470785808C0205D18E3CD1F +:102A800080C00000800228D88002269480028174D1 +:102A9000800242B4800091E88002B4CC800256ECFF +:102AA00080029438800294088002C0788002189CCA +:102AB00080021DB880021CE0EBCD4080169778099B +:102AC0001639C0F1761899080E9CF01F000A0E9C6A +:102AD000F01F0009E3CF808072180E38C060109993 +:102AE0005809CFB1E3CFC0806E189318CEEB000029 +:102AF00080022980800091E8EBCD40801897580C27 +:102B0000C051C1980E9CF01F000D6E0B580BCFB139 +:102B1000F01F000BF01F000B6E4C580CC060F01F34 +:102B2000000A6E4CF01F00096E8CF01F00080E9C0E +:102B3000F01F0006E3CD808080022AB88002724C2C +:102B40008002728480028F20800091E8EBCD40C02B +:102B50001897580CC05130060C9CE3CD80C0F01F74 +:102B60000021CFA1334CF01F00201896CF606E08D3 +:102B70006E19991899296E286E89993899996E3C21 +:102B8000580CC040F01F00198D4C6E7C580CC04092 +:102B9000F01F00168D8C6E498D59495891096E5A57 +:102BA0008D6A4948910A49486E698D7991090C9C52 +:102BB000F01F0012C11130196C988DB95808EDF949 +:102BC0001A0C6C285808CC906C185808CC606C4CC7 +:102BD000F01F000BCC200C9C3006F01F000ACBDB52 +:102BE0008002720880028F24800091940000046C9F +:102BF00000007AA400007AA0800275F880028F1E7F +:102C000080022AF8D431204D580C5F08580B5F0918 +:102C1000189316971248C05030050A9C2FCDD83211 +:102C2000E06C011CF01F00C01895CF803018F948E7 +:102C3000010CFEF102F66E22620B580BC100580225 +:102C4000E0800144E2C4FFFC3006760B049CF01FD8 +:102C500000B8C0C02FF6090B580BCF810A9CF01F9B +:102C600000B50A9CF01F00B4CD8BE2060328EB48A8 +:102C700000D46E0C580CE0800122F01F00B0EB4C29 +:102C8000008CF01F00AFEB4C0090CE906E185808EF +:102C9000C0A0785CF01F00A86E1CEAF60090F01F40 +:102CA00000A78D5C6E385808C0C0EAF8009070BC70 +:102CB000F01F00A16E3CEAF60090F01F00A08DBC52 +:102CC000EAF800905808CCB06E4C580CCC80F01F3D +:102CD000009DE04C0063FE9BFFC3EAC1FFEA364A59 +:102CE0006E4B029CF01F00986E5C580CE08100F95E +:102CF0006620340CF01F008C1897CB10FEF8024CA5 +:102D00008F78FEF8024AFEF9024A8F98FEF80248D0 +:102D10008F058F458F658F898FC83006FEF4023C82 +:102D20008F168FA4FEF202388FB2EAF900907288F3 +:102D30008FD8EAF9009072988FE8EAF9009072A8AB +:102D40008FF8F01F0088EB4C00E0E08000C20C9B85 +:102D5000F01F00850C9BEAFC00E0F01F0084EAF8FD +:102D600000D470685808E08000A7029B0A9C5D1898 +:102D7000EB4C00C4FE90FF74EAF8009070BBEAF8D8 +:102D800000D470895809C0605D19FE95FF69EAF8A2 +:102D900000D471685808C0F0EAFC00C45D181897A8 +:102DA000C0A0029BF01F0062C0600E9B364A029CCE +:102DB000F01F006534CCF01F005CFE90FF514EC840 +:102DC0004EC9991899294EC84EC9993899494EC883 +:102DD0004EC9995899694EC84EC9997899894EC873 +:102DE0004EC9999899A94EC84EC999B899D94EC853 +:102DF0004EC999C899E94EC84EC9F9440040F942F4 +:102E00000044990599F8F9490048F01F0069EB4C16 +:102E100000DCFE90FF25EB39007A3008F00918003D +:102E2000C5C1300A029BF01F0063EAF80090EAFC7B +:102E300000DC707BF01F0060EAFB00E0EAFC00DCD5 +:102E4000F01F005EEAFA009074C85808C60174D8F2 +:102E50005808C52174EA580AC080302BEAFC00DC0F +:102E6000F01F0057FE91FEFC009B0A9CF01F0055CE +:102E7000FE95FEF6EACBFFF0EAFC00DCF01F005204 +:102E80003FF8EB4800E4EAF900D473485808C0D092 +:102E90001A9BEAFC00C45D18C0814038EDB80002FE +:102EA000C0413018EB4801188B0366088B18870562 +:102EB000FE9FFEB5EB4800C4CD2A6E3B6E1CF01F92 +:102EC0000043EB4C0090CFDAF94B00D4CD3A0E9C86 +:102ED000F01F0019FE9FFEC4EACAFF86CA4BF01F0E +:102EE000001958FCFE9BFEBC6E5B310AEACCFF86E3 +:102EF000F01F0015CFEA109A301BEAFC00DCF01F2F +:102F00000030FE91FEADEAFA0090CA5B109A300BD9 +:102F1000EAFC00DCF01F002AFE91FEA2EAFA009013 +:102F2000C97B000080028F2400000470800091A003 +:102F300080022980800091E88000919480021348EB +:102F4000800091B8800091AC80021D60800225DC79 +:102F500080021BB8800218C8800218E8800218D8C6 +:102F60008002609C800261E8800261D48002184483 +:102F700080021850800225D0800229748002304CD3 +:102F8000800226588002360080021A3C80021928EE +:102F900080021CA880021F0480021BA480021D5412 +:102FA0008002186E80021884800218568002C0DCED +:102FB0008002B4C08002B4B88002B4CC8002B4D421 +:102FC000800227948002B90480023B4CEBCD40E0A4 +:102FD000306A18971695F8C6FF64497B0C9CF01F61 +:102FE0000017C270EEF801185808C1800C9B0E9CA7 +:102FF000F01F00130E9CF01F00133006EEFC00DCE7 +:103000000C9BEF4600B0F01F00100C9A0C9BEEFCDE +:1030100000E0F01F000EE3CD80E0EEF800D470E891 +:103020005808CE500A9A0C9BEEFC00C45D18CDFBEC +:103030001896CDDB800217C88000917C8002269410 +:10304000800276648002B9D48002581CD401F01F3B +:103050000002D80280022FCCEBCD40C0499BF8C7BC +:10306000FF641896306A0E9CF01F0017EDFB189C49 +:10307000E06800A2EDD8E007EDFB08A20FD81AD84F +:103080000FC91AD90FB81AD80FA91AD90F9848FA28 +:103090001AD80C9C1ADB302BF01F000D0E9B0C9CD9 +:1030A000F01F000CECFC00DCF01F000B303B0C9C14 +:1030B000F01F000A30182FADED4800A8E3CD80C006 +:1030C000800217C88000917C8003C9B880023A1A38 +:1030D00080021AE08002BA1C80022FCCD431FACDD3 +:1030E00000D03007F94700A8189516941491580B92 +:1030F000E0800217F6F60084E8CCFFFA76ABF01F0A +:10310000012A1AD61ADC09D81AD809C91AD909B855 +:103110001AD809A91AD909981AD809890A9C1AD95A +:10312000FEFA0488302BF01F01220E9B306A2F8D8F +:10313000EACCFF64F01F011F306A089BEACCFF5EF7 +:10314000F01F011D0A9CF01F011D300AEAFC00DC83 +:10315000149BF01F011B635AEDBA0003C061E2F833 +:1031600001745808E08100B1301063795809C0E05B +:10317000E1D9C0011298EDB90001E08000A4EDB9D9 +:103180000002F9B80004E1D8E030EAF800D4710890 +:103190005808C060009BEAFC00C45D18635A5804DC +:1031A000C07069585808C5A0F1DAC002C6E114978A +:1031B000E2170013C5B1029B0A9CF01F0102FAC876 +:1031C000FF9453375028089B0A9CF01F00FFEAF831 +:1031D00000B45828E08001BAE089007F5818E080E8 +:1031E000017130285038EAF800B85828C7F058283C +:1031F000E08900805818E080016230285048EAF9E0 +:1032000000BC58495F0B58895F08F7E81008C78071 +:10321000E2C9FECCE2C8FF0C16963007EC1600019E +:103220005019500812931092505766095809E081BE +:1032300001122FF72FC32F025847CF81EAF900BCA4 +:103240005889C671E2F800F04059F1D8C002F3E89D +:103250001008E08101311096C5F8E8F800805808A0 +:10326000CA70F1DAC002CA40C1083509FAC8FF3095 +:1032700010D9029AFAC9FF94300B50290A9CF01F0A +:1032800000D3CA202CCDD832E2F801485808E0819A +:10329000010FEAF900B0089A300BEAFC00DCF01FDD +:1032A00000CCE080017A3509FAC8FF3010D9029AC3 +:1032B000FAC9FF94089B50290A9CF01F00C4C8401B +:1032C000CE2BA1B0C5DBE2F801785808F9B00004B4 +:1032D000F9B00105C4BB5848C8605908C831303935 +:1032E0005039EAF800B85828C83130195049C88B0D +:1032F0005848C8505908C82130395049C81B3008AF +:103300005058E2C8FECC30165018E2C8FF0C5008E6 +:103310005909E080011FEAF800D470A85808C0508D +:103320000C9BEAFC00C45D18303B0A9CF01F00A90E +:10333000354AFAC7FFE8300B0E9CF01F009E580478 +:10334000E0800126E8F8008450645098E8C8FFFA4D +:10335000507868A95089E2FA0184581AE080009EEA +:103360004029403850A950C84049433850D950B836 +:10337000EAF800BC5848E08000E7E0890088581867 +:10338000E08000A43018510A4014400350E850F087 +:10339000FACAFFAC0899069BFACCFF9C7208580841 +:1033A000C040F54BFFF0720814A82FC92F0B183A34 +:1033B000CF61E2F801445198EAF601185806E0801E +:1033C0000089FEFA0212302B0A9CF01F0079301996 +:1033D000EAF800BC5908E080008F5809E0800098A6 +:1033E000305B300A0A9CF01F007D40585808C1C06D +:1033F000EAF800D471485808C170FACBFF44EAFCDF +:1034000000C45D18C1114328EDB80001C0D1189760 +:103410004F30189268095809E08100A12FF72FC496 +:103420002F035847CF81EAF800B05808C070103118 +:10343000C050EAFC00E0F01F006BEAFC00DC029BDD +:10344000EB4100B0F01F00680A9CF01F00682CCD13 +:10345000D832EAFB00D4E2FA014476585808C13069 +:103460001AD91AD23009EB4901041AD94DC90E3ABA +:103470005F081AD94DEA76560E99301BEAFC00C453 +:103480005D162FCD30165056CD5A5888C2005908B7 +:10349000FE91FF7A3048C78BE2F901A45809FE9AE1 +:1034A000FF6140985808FBF90A09C5BB6368F1D869 +:1034B000C021CF0A50375047C2FB30085048CA0AD3 +:1034C00030085038FE9FFE913008C5EB3038C5CB30 +:1034D000EAF800D470F85808FE90FF750E9BEAFCDD +:1034E00000C45D18FE95FF6F0C99EAF800BC5908FE +:1034F000FE91FF75029B0A9CF01F003E0A9CF01F84 +:10350000003E307B0A9CF01F0033C70BEAF80090A6 +:1035100070495819F9BB000AF9BB013CC63B745B02 +:10352000744CF01F00214B5A1ADC302B0A9CF01F00 +:103530000020306A089BEACCFF5EF01F001E2FFDC2 +:10354000FE9FFE023028C20B30195039FE9FFE4DFF +:10355000029B0A9CF01F0027CDFAEAFB00D4E2FA96 +:10356000014476585808FE90FF5B1AD91AD3EB42F3 +:1035700001041AD20E3A5F081AD00E99765649CA3B +:10358000301BEAFC00C45D162FCDC49B6248507806 +:1035900062595089CE1A301BEAFC00E0F01F001877 +:1035A000FE9FFE8380023A1C8003C9F880023A1A0B +:1035B000800091D0800091DC80021DB88002B5ECC3 +:1035C000800222A48002269480021F308002938011 +:1035D000800217D08003CA6C8002246C80037E2096 +:1035E000800257488002B9D48002237080039C383F +:1035F00080021A4880021CE08003CA488002559667 +:10360000EBCD40C021AD1897F8F800AC5808C68142 +:10361000F8F6010CEEFB009076095809C061C8F875 +:1036200072095809E080008CF2F801945808CF9193 +:103630003008EF48010C76495809C670EEFC00D4FA +:10364000580CC0E04DAB780CF01F005AEFF8002486 +:10365000F1FC0A04EEFB009076485808C560EEF8CD +:1036600000E85818E088008D760AEEF800C858186F +:10367000C3F0580AC090103AC041C3981438C370C0 +:10368000740A580ACFC15826C04076485828C690B8 +:10369000580AEFFA1A32F9B80001EFF80A32EEF9D7 +:1036A00001105809C04176485818C710EEF80118A3 +:1036B0005808C4F1580AF40B1700F60A1700F5FB76 +:1036C0001004F5FA1005EEF800D470B85808C410CC +:1036D000EEFC00C45D18C3D12E6DE3CD80C0F8F6BA +:1036E000010C5806C9812E6DE3CD80C0740A580ABA +:1036F000CCB0F4F801945808CFA175885808CC4193 +:1037000076485828CF41CC0B0E9CF01F002BCE5092 +:10371000EEF800B05808EFFC0A2C0E9CF01F0027B2 +:10372000300B1A9C368AF01F00261A961A9A0E9CA5 +:10373000300BF01F00242E6DE3CD80C05806FE91A3 +:10374000FF790E9C301BF01F00202E6DE3CD80C052 +:103750000E9C300A30ABF01F001D2E6DE3CD80C0F3 +:10376000580AC1D074085808EFFA1A32F9B80001A3 +:10377000EFF80A320E9C300BF01F0015CAEB302B0D +:103780000E9CF01F0011EEFB0090C6FBEF480110ED +:10379000129A0E9C303BF01F000BC9FB30180E9C98 +:1037A000EF4800C8149BF01F0009C97B8003C65C6A +:1037B000800091A08002195C80022370800091D06B +:1037C0008002792C800217D080022584800230DCB0 +:1037D0004848300A48499118910A930A5EFF000050 +:1037E00000007A7000007A78EBCD40681695189347 +:1037F000F6CCFFEDF01F0022314A1896300BF01F77 +:1038000000210A9A8D15ECCCFFF0069BF01F001EDC +:1038100049EAF5090042AC09F50800422FF8F558CD +:10382000004249B530088D286A198D3993062F86D4 +:103830008B1649866C08F0C9FFFF8D095909E0888D +:1038400000180A936A0C782A580AF9F80003E7F876 +:103850000A01F9F81003F5F81A0320197838910ACB +:103860008D09F01F000D6C095909FE9BFFED300A10 +:10387000326C149BF01F0009E3CF90688000920027 +:10388000800091D0800091DC000087F400007A7005 +:1038900000007A78800091E880014658EBCD40E046 +:1038A00030961697305E300B33A51989F2C8003078 +:1038B000EC081800E08B0019F2CA0030580AC2C5A3 +:1038C0001999F2C80030EC081800E08B0017F2C814 +:1038D00000305808C215F1EA1048EE0B0B08585B8F +:1038E000C291E3CF80E0F2C80061FC081800E08BD1 +:1038F000000EF2CA0057CE3BF2C80061FC08180067 +:10390000E08B000DF2C80057CE5BF2C80041FC0806 +:103910001800E088000DE3CFC0E0F2C80041FC08C9 +:103920001800FE9BFFFAF2C80037CD4BF2CA0037F1 +:10393000CC6B19A8EA081800CEF12FFB586BCD20EC +:103940002FDCCB4BEBCD40E016961497580AC4C041 +:10395000300B3095305EC1B8F2CA0030580AC365EA +:103960001999F2C80030EA081800E08B0021F2C86B +:1039700000305808C2B5F1EA10485808C275EC0B7F +:103980000B082FFB1637E08800302FEC1989F2C89E +:103990000030EA081800FE98FFE1F2C80061FC0858 +:1039A0001800E08B000EF2CA0057CD9BF2C80061F0 +:1039B000FC081800E08B000DF2C80057CDBBF2C820 +:1039C0000041FC081800E088000DE3CFC0E0F2C819 +:1039D0000041FC081800FE9BFFFAF2C80037CCAB90 +:1039E000F2CA0037CBCBE3CF80E0F6CA00015E6CB1 +:1039F000F80A000913882FF85C58B2885E1CF6C8D4 +:103A00000002100CC08819882FF85C58B888201C58 +:103A100058085E1C201ACF875EFC5EFCEBCD40C0D0 +:103A200049071696189BE0460020F9B60B200E9C1D +:103A30000C9AF01F000D3008EE060B080F8858088E +:103A4000C0D00E9C35E935FA2208F2081800F9FAC0 +:103A5000BE002FFC19885808CF81482CE3CD80C0C8 +:103A600000007A7C800091DCEBCD40FE189114922E +:103A7000169C1293580BC2A0E20B00045809C20016 +:103A800002973006C0881835E08A001418070C33F6 +:103A9000E0880018E4060708E80701051AD80E9C1C +:103AA00048CA0A9B2FF6F01F000C2FFD580CCEC4FD +:103AB0003008EE01010CE968FFFFE3CD80FE0297BC +:103AC0003008EE01010CE968FFFFE3CD80FE000045 +:103AD0008003DA3080009148580CC140F8FC00D0D7 +:103AE000580CC1002FCCF8F8FFFC5808C0417809E9 +:103AF0005809C0901638C0302F8CCF6B7808143816 +:103B0000CFC15EFF5EF9780C580C5E0C7828163831 +:103B1000C0515EFC782816385E0C780C580CCFB17A +:103B20005EFC30383189F94800F0F9480058F9480E +:103B3000005431E8F949004CF94800503FF9E06879 +:103B40000576F949017CF948019C5EFCEBCD40E02B +:103B500018961695344CF01F000C1897C1103018A9 +:103B60009978993899485806C0500C9CF01F000766 +:103B70008F5C5805C0500A9CF01F00048FBC0E9C3F +:103B8000E3CD80E080028F2480009194EBCD40C093 +:103B9000169679075807C051C0C86E375807C090AD +:103BA0006E0C0C9BF01F0004CF910E9CE3CD80C0E7 +:103BB000E3CF80C0800091A0EBCD40FC1695189417 +:103BC000580C5F0B58055F081493104B1292C040BD +:103BD0003FFCE3CD80FC580ACFC048E73006C06800 +:103BE0002FF62E07E0460038CF406E0B0A9CF01FE0 +:103BF000000ACF710699049A089B0E9C6E185D18F6 +:103C0000F9BC01FFF9BC0000E0460038CE31CE1B04 +:103C10008003CC00800091A0EBCD40801897580C19 +:103C2000C0A0780CF01F00056E1CF01F00040E9C55 +:103C3000F01F0002E3CD8080800091E8D421189429 +:103C4000169579075807C1A03006C0680E966E3CDD +:103C5000580CC14018970A9B6E0CF01F0009CF71D9 +:103C60005806EFF81003EDF81A03EFF80003E9F82F +:103C70000A100E9CF01F0003D82ADC2A800091A0B5 +:103C800080023C18EBCD406016961895760BF01F1D +:103C900000056B088D38EB460040E3CD80600000E6 +:103CA00080023C3CD431202D500B129CF01F003C74 +:103CB0001890C730198A580AC670300118965011EA +:103CC000320230930294C0382FF60D8AE40A1800AD +:103CD0005F08E60A18005F091248E8081800CF518B +:103CE000580AC2C00D87E40718005F18E6071800DD +:103CF0005F191268E8081800C4505807C4300C95C2 +:103D0000C0385807C0D02FF50B87E40718005F189C +:103D1000E60718005F191268E8081800CF31AA8476 +:103D20004A0B0C9CF01F0020C171A1A15807C06074 +:103D3000EAC6FFFF0D8A580ACCA1009CF01F001BA9 +:103D40005801C2404008F141005C40195809C25175 +:103D5000129C2FEDD832496B0C9CF01F0013C03120 +:103D6000A1B1CE5B0C9C493BF01F000FF9B80004D9 +:103D7000E3D8E031FBF91001F7B901FFFBF91A01B3 +:103D8000CD6B0C95CCDBF01F0009300840093FFCDF +:103D9000F348005C2FEDD8322FEDDC3A800091948F +:103DA0008003D304800091A0800091E88003D30CAD +:103DB0008003D314EBCD40FE169CF01F00451891F4 +:103DC000C6B0198A580AC7A0189630023203309438 +:103DD000E80A18005F08E60A18005F091049300871 +:103DE000F0091800C0E0109B2FF60D8AE60A1800B3 +:103DF0005F08E80A18005F091248F6081800CF515A +:103E0000580AC4500D87E80718005F18E607180025 +:103E10005F1910693008F0091800C3705807C350C3 +:103E2000109A0C95C0385807C0D02FF50B87E607BD +:103E300018005F18E80718005F191268F4081800E6 +:103E4000CF3130084A3BAA880C9CF01F0023C0F1F8 +:103E5000A5A25807C060EAC6FFFF0D8A580ACB9199 +:103E6000029CF01F001E049CE3CD80FE49CB0C9CFD +:103E7000F01F0019C031A3B2CEDB49AB0C9CF01F80 +:103E80000016C0E1A3A2CE6B0C95CDCB029CF01F17 +:103E900000135802CE913FF2049CE3CD80FE492BE3 +:103EA0000C9CF01F000DC031A1B2CD4B0C9C48FB07 +:103EB000F01F0009C071A1A2CCDBF01F00083FF287 +:103EC000CD3B029C3FF2F01F0005CCEB80009194AB +:103ED00080039A74800091A0800091E880039A6C1E +:103EE0008003D31C8003D3248003C8E4EBCD40803F +:103EF0001697149C129BF01F00085BFCC031E3CFA7 +:103F0000C0801898E018FFE1CFB1EF4C0050109C32 +:103F1000E3CD808080023DB4EBCD40801697149CA9 +:103F2000129BF01F00085BFCC031E3CFC0801898E3 +:103F3000E018FFE6CFB1EF4C004C109CE3CD808041 +:103F400080023DB4D431201D500B129CF01F00485C +:103F50001891E080007F198A580AC6B0300218967E +:103F6000049032033094E80A18005F08E60A18004B +:103F70005F0910493008F0091800C0E0109B2FF6C7 +:103F80000D8AE60A18005F08E80A18005F0912485F +:103F9000F6081800CF51580AC2F00D87E80718003C +:103FA0005F18E60718005F1910693008F00918005B +:103FB000C3E05807C3C0109A0C95C0385807C0D04A +:103FC0002FF50B87E60718005F18E80718005F1940 +:103FD0001268F4081800CF3130084A6BAA880C9C8C +:103FE000F01F0025C161A1B25807C060EAC6FFFFFB +:103FF0000D8A580ACB91029CF01F00205802C1B0D4 +:104000004009F34200545800C241009C2FFDD832B1 +:1040100049BB0C9CF01F0018C031A1A2CE6B499B7C +:104020000C9CF01F0015C0E1A3B2CDFB0C95CD5B3D +:10403000F01F0012300840093FFCF34800542FFDE8 +:10404000D832491B0C9CF01F000CC051A3A2CCDB42 +:104050002FFDDC3A0C9C48DBF01F0007F9B800107C +:10406000E5D8E032F7B001FFCC0B0000800091945E +:104070008003C8C4800091A0800091E88003D32C05 +:104080008003D3348003C8E48003C8E0D431202DFA +:10409000500B129CF01F00391890C6D0198A580A8C +:1040A000C610300118955011320230930294C03876 +:1040B0002FF50B8AE40A18005F08E60A18005F096A +:1040C0001248E8081800CF51580AC2C00B87E4070D +:1040D00018005F18E60718005F191268E808180052 +:1040E000C3F05807C3D00A96C0385807C0D02FF67F +:1040F0000D87E40718005F18E60718005F191268BB +:10410000E8081800CF31AC8449DB0A9CF01F001D81 +:10411000C171A1A15807C060ECC5FFFF0B8A580A06 +:10412000CCA1009CF01F00185801C1E04008F141EB +:10413000005840195809C1F1129C2FEDD832493B63 +:104140000A9CF01F0010C031A1B1CE5B0A9C490B44 +:10415000F01F000CCFA040192FF95019CDCB0A96B3 +:10416000CD3BF01F0009300840093FFCF3480058E0 +:104170002FEDD8322FEDDC3A800091948003D340AC +:10418000800091A0800091E88003D3448003D3484D +:10419000EBCD40401896784CF01F00466D2CF01F78 +:1041A0000045ECFC00D0F01F00436DACF01F004157 +:1041B0006DCCF01F00406DECF01F003EECFC008069 +:1041C000F01F003CECFC0088F01F003AECFC009073 +:1041D000F01F0038ECFC0094F01F0036ECFC009857 +:1041E000F01F0034ECFC009CF01F0032ECFC00A03F +:1041F000F01F0030ECFC00A4F01F002EECFC00A827 +:10420000F01F002CECFC00ACF01F002AECFC00B00E +:10421000F01F0028ECFC00B4F01F0026ECFC00B8F6 +:10422000F01F0024ECFC00BCF01F0022ECFC00C0DE +:10423000F01F0020ECFC00C4F01F001EECFC00C8C6 +:10424000F01F001CECFC00CCF01F001AECFC00D4AA +:10425000F01F0018ECFC00D8F01F0016ECFC00DC8E +:10426000F01F0014ECFC00E0F01F0012ECFC00E872 +:10427000F01F0010ECFC00ECF01F000EECFC0150F5 +:10428000F01F000CECFC016CF01F000AECFC01803C +:10429000F01F0008ECFC018CF01F0006ECFC01A0F4 +:1042A000F01F00040C9CF01F0003E3CD80400000D1 +:1042B000800091E8EBCD40C0189678085808C031CE +:1042C000C0880E987007109CF01F00155807CFA1EA +:1042D0006D085808C031C0880E987037109CF01FC8 +:1042E00000115807CFA16C5CF01F000F6C6CF01F21 +:1042F000000E6C8CF01F000C6C9CF01F000B6CAC63 +:10430000F01F00096CBCF01F00086C1CF01F0006B9 +:104310000C9CF01F0005E3CD80C00000800241909E +:1043200080023C18800091E8EBCD4040320818969E +:104330001AD8E0691000F8C8FFDC785A784B792C5D +:10434000F01F000430182FFDED480044E3CD8040FD +:104350008002B254D421F60815011695F0C6FFFF6D +:1043600018940C9CF01F00061897C0600A99089AD0 +:104370000C9BF01F00040E9CD822000080028F24AA +:1043800080023A68EBCD40E016951896F6CCFFFD1A +:10439000F01F00091897C0C00C9B0A9A322618C655 +:1043A000F01F0006EE0500093008B296B2A80E9C78 +:1043B000E3CD80E080009200800091DCD401580CB5 +:1043C000C1D0580BC160198835E92208F2081800DD +:1043D000E08B0013129A3009C088F80907082208F8 +:1043E000F4081800E08B00092FF9123BFE9BFFF741 +:1043F000F01F0003D802F01F0003D802800243849C +:1044000080024354D4011698F6FC0140580CC06059 +:10441000189BF0CCFEDCF01F0002D802800243BCE7 +:10442000D4011698F6FC013C580CC060189BF0CCE7 +:10443000FEECF01F0002D802800243BCD4011698A3 +:10444000F6FC0138580CC060189BF0CCFEFCF01F45 +:104450000002D802800243BCD4011698F6FC013455 +:10446000580CC060189BF0CCFF0CF01F0002D80263 +:10447000800243BCEBCD40F831EC1694F01F0028CD +:104480001896C3906979F8C3FFE2EDB90000C360E4 +:104490001897EDB90001C1614A294A380C37F20872 +:1044A0001710E60701051AD84A0A0A9B0E9CF01F4E +:1044B00000202FFD580CC1C51835E08A001A1807D6 +:1044C0006979EDB90002C171496949780C37F20880 +:1044D00017100E9C1AD8E6070107496A0E9BF01FB9 +:1044E00000142FFD580CC0451837E089000530082E +:1044F000E768FFFF0C9CE3CD80F848B848EA1AD87B +:1045000031EBF01F000B2FFD580CCF2559DCFE9925 +:10451000FFF0EC0C00076979CBDB000080028F24F0 +:104520008003936480037E208003D35880009148E9 +:104530008003D3648003D350EBCD40F81894332C20 +:10454000F01F003E1896C650F8C3FFCEEDB400042D +:10455000C6301897EDB40003C1514B994B980C37F6 +:10456000F2081710E60701051AD84B7A0A9B0E9C31 +:10457000F01F00362FFD580CC4951835E08A00470F +:104580001807EDB40002C1514AD94AE80C37F208C5 +:104590001710E60701051AD84ADA0A9B0E9CF01F8D +:1045A000002B2FFD580CC3251835E08A0030180762 +:1045B000EDB40001C1514A294A280C37F2081710FE +:1045C000E60701051AD84A3A0A9B0E9CF01F001F05 +:1045D0002FFD580CC1B51835E08A00191807EDB445 +:1045E0000000C171496949780C37F20817100E9C18 +:1045F0001AD8E6070107498A0E9BF01F00142FFD09 +:10460000580CC0451837E08900053008E768FFFFFF +:104610000C9CE3CD80F848B8490A1AD8332BF01F18 +:10462000000B2FFD580CCF25E04C0031FE99FFEF19 +:10463000EC0C0007C90B000080028F2480039364F8 +:1046400080037E208003D374800091488003D37C54 +:104650008003D3888003D3908003D36CD401774C3C +:10466000F01F0002D802000080024538D401773CD8 +:10467000F01F0002D802000080024538EBCD40F860 +:10468000332C1693F01F00401896C6906759F8C453 +:10469000FFCEEDB90001C6601897EDB90000C16109 +:1046A0004BA94BB80C37F2081710E80701051AD8C8 +:1046B0004B8A0A9B0E9CF01F00382FFD580CC4C576 +:1046C0001835E08A004A18076759EDB90003C1613F +:1046D0004AE94AF80C37F2081710E80701051AD81A +:1046E0004AEA0A9B0E9CF01F002C2FFD580CC34574 +:1046F0001835E08A003218076759EDB90002C16128 +:104700004A294A380C37F2081710E80701051AD869 +:104710004A3A0A9B0E9CF01F00202FFD580CC1C581 +:104720001835E08A001A18076759EDB90004C171FD +:10473000496949780C37F20817100E9C1AD8E80717 +:104740000107498A0E9BF01F00142FFD580CC0452D +:104750001837E08900053008E968FFFF0C9CE3CDBD +:1047600080F848B8490A1AD8332BF01F000B2FFDE8 +:10477000580CCF25E04C0031FE99FFEFEC0C000700 +:104780006759C8CB80028F248003936480037E2006 +:104790008003D3A4800091488003D3B08003D390DA +:1047A0008003D3BC8003D398EBCD40C030AC1696C9 +:1047B000F01F00181897C1806D69EDB90000C17035 +:1047C000189A301BEDB90001C0F149384939580B2E +:1047D000F0091700149C1AD9EECBFFF6141B490AF6 +:1047E000F01F00102FFD0E9CE3CD80C048B848EAB2 +:1047F0001AD830ABF01F000B2FFD580CCF55589C2A +:10480000FE99FFF3EE0C000A6D69300BCDCB000072 +:1048100080028F248003936480037E208003D3D0A2 +:10482000800091488003D3C8EBCD40C01697768CAA +:10483000580CC05118960C9CE3CD80C0314CF01F31 +:1048400000101896CF90EF38001DEF3A00181AD8D4 +:10485000EF39001C1AD9EF38001B1AD8EF39001AAB +:104860001AD9EF380019314B1AD81ADA485AF01F02 +:10487000000630082FADED680013CDEB80009200EC +:104880008003DA4880009148EBCD40E078351696F9 +:10489000314CF01F000A1897C0C0EC050308488A85 +:1048A0001AD8314BF01F000730082FFDEF680013B6 +:1048B0000E9CE3CD80E00000800092008003DD6864 +:1048C00080009148EBCD40801697772C580CC09013 +:1048D000F01F0009189B6F2CF01F0008E3CD8080AB +:1048E000771C580CC060F6CCFFDC320BF01F0004C4 +:1048F000E3CD8080800091B88002438480024354DD +:10490000EBCD40807838F60800076E085808C0C024 +:10491000784C580CC0C0F60C030C189B109CF01F70 +:104920000007E3CD8080109CE3CD8080109CF01FB9 +:1049300000046E08CF3B0000800243BC800091B8A9 +:10494000EBCD40F83228169418961989F009180012 +:10495000C0A0F01F001BEBDCC001C19030070E9C13 +:10496000E3CD80F8F8C7FFFF322B0E9CF01F001537 +:10497000CF6019985808CF31B8880E9CF01F0010EE +:10498000890C0E9CF01F00101897CEABF80316018F +:10499000E6CCFFFFF01F000D1897CE200C9C069A66 +:1049A0000E9BF01F000BC051EE030B0C8903CD8B47 +:1049B0000E9C0A97F01F0007CD3B0000800091B8C5 +:1049C00080009158800091948000920080023944C8 +:1049D000800091E8D421205D18951094129C1696C1 +:1049E000F01F000F1897C1906C0A590AE08B001451 +:1049F000189B0A9CF01F000B0E9CF01F000B48BA7E +:104A00001AD4314BFACCFFFCF01F0009300C2FFDFB +:104A10002FBDD822F01F00042FBDDC2A80024940A0 +:104A2000800091DC800091E88003D3D88000914819 +:104A3000D4013038F6CCFEDCF6CBFEC0F01F00020D +:104A4000D8020000800249D4D4013028F6CCFEEC14 +:104A5000F6CBFEC4F01F0002D8020000800249D449 +:104A6000D4013018F6CCFEFCF6CBFEC8F01F0002D5 +:104A7000D8020000800249D4D4013008F6CCFF0CE3 +:104A8000F6CBFECCF01F0002D8020000800249D411 +:104A9000EBCD40F8201D18971693129C1A9BF01F1F +:104AA00000171895C2306E595809C0504008103987 +:104AB000E08B00206E695809C04040081039C133AE +:104AC0006E366E44E60600066C0CF01F000D8D0578 +:104AD0006E4C580CC0504008300CE60409082FFDFD +:104AE000E3CD80F80A9CF01F00062FFDE3CFC0F84D +:104AF000F01F00033FFCCF4B80024940800091E84B +:104B0000EBCD40FEF6F700D05807C0510E94089C3C +:104B1000E3CD80FE364CF01F00191894CF90EEC6FE +:104B2000FFFCF8C3FF9C189749514962ECFCFFFC5D +:104B3000580CC2116C0B580BC1A02F86F01F00122D +:104B4000CF600837E2081700E40817101ADCE60700 +:104B500001051AD80E9C48DA0A9BF01F000D2FEDB4 +:104B60001807580CC0451835FE99FFE23008E76871 +:104B7000FFFFCCEB6C0BCE2B80028F2480037E20BA +:104B800080039364800271BC8003D3E48000914869 +:104B9000D431205D500B129CF01F0056502CE08049 +:104BA000008E198A580AE080009B3009402650196F +:104BB000503912905049320230931294C0382FF677 +:104BC0000D8AE40A18005F08E60A18005F09124817 +:104BD000E8081800CF51580AC4E00D87E407180010 +:104BE0005F18E60718005F191268E8081800C64049 +:104BF0005807C6200C95C0385807C0D02FF50B8732 +:104C0000E40718005F18E60718005F191268E80843 +:104C10001800CF31AA842FF0403CE00B1503F01FA1 +:104C200000361891C4E040490C9CE20900060C9B38 +:104C3000F01F00328D1C6C085808C141580CC1018E +:104C400040182FF850185807C15040482F88504836 +:104C5000EAC6FFFF0D8A580AC3C05031CB3B591C2E +:104C6000C2404009F2F801782FF8F348017858075C +:104C7000CED15031E0C8FFFFF0071503402CF01FE4 +:104C800000200E9B403CF01F001CC2E0F8000039E1 +:104C90003008931893084008F14C00D04019580987 +:104CA000C0D1129C2FBDD8324009F2F801742FF800 +:104CB000F3480174CC9B0C95CAEB3FFC2FBDD83256 +:104CC000403CF01F000F402CF01F000D2FBDDC3AC0 +:104CD000E0C8FFFF5031F0071503CD1B501A308795 +:104CE000503A1490CCCB403CF01F00053FFCCE7BEB +:104CF00080009194800091F48002720C800091E811 +:104D0000D4213228129716951389F0091800C0A0F3 +:104D1000320A2DCB0E9CF01F00271896C2F03FFCE4 +:104D2000D822EEC6FFFF322B0C9CF01F0023C3C01D +:104D3000F8060107EEC80008E0480037FE9BFFF1C7 +:104D40006B2C580CC060F01F001D0E3CC2606B2C19 +:104D50003004EB440044F01F001AEECCFFFFF01FBC +:104D60000019EB4C0048CDC00C9B0E9AF01F0016AA +:104D70006B28089CF0070B04D822EF390040F80993 +:104D80001800CCE16B2CF01F000E3018EB460048E9 +:104D90000C9CEB480044D8220E9A0C9B6B2CF01F05 +:104DA000000BCD61CBEB0C9CF01F00041897CC3BA3 +:104DB0008002394480009158800091B8800091E8C9 +:104DC00080009200800091DC8000917CEBCD4080DF +:104DD0001697129C2E8BF01F0006F9BC01FFF9B844 +:104DE0000001EFF80A08E3CD808000008002389CC3 +:104DF000EBCD40C018976E38129CF00B000630AA1D +:104E0000300BF01F000C8D0C18996E585808C030EC +:104E1000103CC0956E6C580CC0401839E0890007F2 +:104E2000E3CF80C08D08E3CFC0C08D0CE3CFC0C0FE +:104E300080009170D42116941895782B580BE08A35 +:104E400000557817683E6E0C78381C38C410EECACE +:104E5000FFFC3009C058150C78381C38C3902FF966 +:104E60001639CFA52FFB0E9CA36BF01F00241896BC +:104E7000C3506A2C580CE08A003B6C08683E7039BD +:104E80001C39C355ECC8FFFC300AC0A81097700845 +:104E9000F40B15027039EEC8FFFC1C39C2052FFA5D +:104EA000143CFE99FFF5F4C8FFFFEC0A002BA36841 +:104EB0001697F80A010AEC08000CA36AF01F00100C +:104EC0008F048B166A28300C2FF88B28D82218985C +:104ED000781C580CCFD19114D822DC2AF4C8FFFFDB +:104EE000EC0B000BA368CE6B7817CBDB0C97300A6A +:104EF00030480C9BCDFB0000800091F4800091C4F1 +:104F0000D4211895781CF01F000D300C8B1C8B2CB5 +:104F10006A075807C0F0189618948F140E9B0A9CC5 +:104F2000F01F00076E07F9B605FF5807CF710C9CFC +:104F3000D8220E96CFDB0000800091E880024E342C +:104F4000D421189578095809C1E03FFAC028109972 +:104F50007228F4080C4A72085808CFA1F4C4FFFF65 +:104F60001296E06C01A8F01F000A1897C0A09924BF +:104F70005806EDFC1A00EBFC0A000A9CF01F000525 +:104F80000E9CD82212961294CEDB000080028F2451 +:104F900080024F005EFD5EFD5EFD5EFD5EFD5EFD1E +:104FA000D401584BC0E0E0880007586BC0A0587B84 +:104FB000C040D802580BC091300CF01F0005D80239 +:104FC000301CF01F0003D802D80200008002172016 +:104FD000D401581BC070300A323C149BF01F0005EE +:104FE000D80A300A322C149BF01F0002D80A0000A5 +:104FF00080014658EBCD40FE201D1094129216956C +:10500000F01F0057E8C8FFF25C7C4D69F00C000609 +:10501000F33A0109580AC060EC0A0D085809E0810A +:10502000008F3003500CE6060001029CF01F004E7A +:105030000A9B1897306A400CEE0C000CF01F004BD6 +:10504000400C306A4CAB140CEE0C000CF01F004707 +:10505000400C302A4C7B2F4CEE0C000CF01F004310 +:10506000400C089A049B2F2CEE0C000CF01F003F04 +:10507000FAC8FFFC3005114A0E991AD5EE0A000C49 +:105080001AD5EC0A010A30EBF01F003B2FED581C3B +:10509000C5914009EC090108E048003EE08B001092 +:1050A0008E085CC806085CC8AED3029B0E9CAE0896 +:1050B000F01F0032300C2FFDE3CD80FEEE09000E14 +:1050C0003888FD39000CF0091800CEB1FD39000D0B +:1050D00038E8F0091800CE51FD38000EF808180025 +:1050E000CE01FD39000F3038F0091800CDA130286D +:1050F000FD3A0012F00A18005F1B3FE8F00A1800A2 +:105100005F19126BEA0B1800CCC1FD380013E218CE +:10511000001D5818CC61FD380014E21800C85888EA +:10512000CC01FCCAFFC1FCC9FFE1C0482FF914390A +:10513000C0E01388F6081800CFA0CB3BF4090103A8 +:10514000C72B0E9CF01F000E3FFCCB6B0FC92FA985 +:10515000EE0900091388A3A8B288CA3B8001F4E8CD +:10516000000087F480009200800091DC00007AA8A3 +:105170008003D6548001F54480014664800091E8A4 +:10518000D401201D3068FACBFFFC16D81A9B486C5E +:10519000F01F00064848581CF00C1700F9BC01002D +:1051A0002FFDD80200007AA880017A88EBCD40401C +:1051B000310A1696300B0C9CF01F000630F930783F +:1051C0008D198D09300C30398D288D39E3CD804013 +:1051D000800091D0D401F01F0002D80A80016048FD +:1051E000EBCD4068206DFAC3FFEE1496069C306A42 +:1051F000F01F0010FAC5FFFE0C9B310A0A9CF01F3D +:10520000000D0A9B204D310A1A9CF01F000B069BD3 +:10521000202D306A1A9CF01F0008F01F00082FADE7 +:10522000581CF9BC01FFF9BC00002FADE3CD80682C +:10523000800091DC8002E73680016094EBCD40680D +:10524000206DFAC3FFEE1496069C306AF01F001022 +:10525000FAC5FFFE0C9B310A0A9CF01F000D0A9B49 +:10526000204D310A1A9CF01F000B069B202D306A3E +:105270001A9CF01F0008F01F00082FAD581CF9BC45 +:1052800001FFF9BC00002FADE3CD8068800091DC08 +:105290008002E73680016168D401F01F0005581CC8 +:1052A000F9BC01FFF9BC0000D80200008001F370D6 +:1052B000D401F01F0005581CF9BC01FFF9BC000027 +:1052C000D80200008001F310D401169CF01F0004E6 +:1052D000581CF9BC01FFF9BC0000D802800163E052 +:1052E000D431207DFACEFFC050287C027C387C1758 +:1052F00050087C2E501E16901894149B1293580A36 +:10530000C5C0FAC5FFEA306A0A9CF01F0031202DA3 +:10531000306A0A9B1A9CF01F002FF01F002F5802C2 +:105320005F1858075F1918912FED1268C181300678 +:105330005800C26168193018F0030948F00811FFDD +:10534000F1E9000C891C580CC365BFBC891CF01F17 +:10535000002318975817C2F02F9DDC3A5887FE9B00 +:10536000FFFDFAC6FFF2308A300B0C9CF01F001CC8 +:105370000E9A049B0C9CF01F00165800CDC04028CC +:1053800058015F091AD8069C1AD630381AD530163B +:10539000404A403B1AD6F01F00136819EC03094835 +:1053A0001248F1D8C01F189789180C9CF01F000EE6 +:1053B0002FCDCD1B2F9DD83AFAC5FFEA306AE06B9E +:1053C00000FF0A9CF01F0006CA3B0000800091DC31 +:1053D0008002E736800188B080016584800091D02A +:1053E0008001661C8001639CEBCD40C01896308C18 +:1053F000F01F00091897C0C0300899069918F01FCF +:105400000007301CF01F00060E9CE3CD80C0E3CDEA +:1054100080C0000080028F248001604880017A10E3 +:10542000EBCD4080209D1697FACCFFFEF01F0009BF +:10543000581CC0402F7DE3CFC0800E9C1BBAFACB16 +:10544000FFFCF01F00051BBC2F7DE3CD808000001A +:1054500080017800800091DCEBCD4080202D580B3E +:10546000C120FAC7FFFE306A0E9CF01F000C0E9C94 +:10547000F01F000B581CF9BC01FFF9BC00002FED18 +:10548000E3CD8080FAC7FFFE306AE06B00FF0E9C20 +:10549000F01F0004CEDB0000800091DC8001793039 +:1054A000800091D0EBCD4040485B1896F01F00057E +:1054B0000C9CF01F0005E3CD8040000080039C3869 +:1054C00080025458800091E8EBCD40C0202DFAC7EF +:1054D000FFFE16960E9CF01F0008581CC0402FEDD2 +:1054E000E3CFC0C00E9B0C9C306AF01F00042FED70 +:1054F000E3CF80C080017864800091DCEBCD40C0B8 +:1055000018977939580BC0305839C0E03018EF4837 +:1055100000BC3038EF48004C1039C0808F2830086C +:105520008F58E3CD80C0F949004C6F682FF8EEFA30 +:10553000010CEF4800586FA830098F288F59301B95 +:10554000746C7486487A5D16EEF80094EEF900905B +:105550002FF82FF9EF480094EF490090E3CD80C079 +:1055600080037E20580C5E0C580BF9FB4A19580A30 +:10557000F9FA4A225809F9F94A1A5808F9F84A1B5F +:105580005EFC580CF9F81024F9B90101F1D9E108D1 +:10559000F9F81A245EFC580C5E0C580BF9B801019E +:1055A000F9F81A45F9FB0A455EFCD703EBCD40C07C +:1055B0001897580CC04079385858C030E3CD80C097 +:1055C000F8F8010C3009706C7086488A301B5D1643 +:1055D000EEF80094EEF900902FF82FF9EF480094C0 +:1055E000EF490090E3CD80C080037E20580CF9FC89 +:1055F00010315EFC580CC0B0F8F800D45808C070E8 +:10560000F8F800D89708F8FC00D45EFC300897083A +:105610005EF8D703580CC040588BE08800035EFD4D +:1056200048D8F00B032FF8FC00E05EFCF8FC00DC2F +:105630005EFC78BC5EFCF8FC00805EFC79FC5EFCE5 +:10564000F8FC00845EFC784C5EFC797C5EFC786C37 +:105650005EFC00008003D6FC580C5E0C588B5EBCD0 +:1056600048E8F00B032FF94A00E05EFCF94A00DC41 +:105670005EFC99BA5EFCF94A00805EFCF94A007C47 +:105680005EFCF94A00845EFC994A5EFCF94A005CC3 +:105690005EFC996A5EFC00008003D720580CC05065 +:1056A000580BC031783C5EFC5EFD580C5E0C580B0C +:1056B000F9FA0A035EFCD401580CC0A0F8FC010CF6 +:1056C000580CC06078A85808C030780C5D18D80213 +:1056D000D401580CC021D80AF8FC010C580CCFC0DA +:1056E00078B85808CF90780C5D18D802EBCD408080 +:1056F0001897580CC1E0189A300B48FCF01F000FA7 +:105700000E9A300B48ECF01F000DEEFC00C0F01FAD +:10571000000DEEFC00CCF01F000CEEFC00D4F01FDE +:10572000000AEEFC010CF01F00080E9CF01F0006A2 +:10573000E3CD80808002608C800274008002602053 +:10574000800270E0800091E8D401580CC050F8FC51 +:1057500000C0F01F0002D80280026410D401580C6F +:10576000C050F8FC00C0F01F0002D802800264287C +:10577000D401189A580CC0A030583019F8FC00C059 +:10578000F548004C95C9F01F0002D802800263BAA8 +:10579000EBCD40801897580BC04079E85888C0403E +:1057A0003018EF4800BC30193088EF490044EF480A +:1057B00000788F99EEFC00C0F01F0004F9B80100DA +:1057C000EFF81A39E3CD8080800263B2EBCD40E080 +:1057D000201D189716951496580CC0513FFC2FFDAC +:1057E000E3CD80E0F8FC00C0F01F000ACF801A9BD8 +:1057F000EEFC00C0F01F0008189BCF10400C0C3CC2 +:10580000CEF30C9A0A9CF01F0005300CCE9B0000D2 +:10581000800263B2800263CE800091DCEBCD40C099 +:1058200018971496580CC1F0F94B00C4580AC1B02F +:1058300074087419F94800F8F94900FC7428F9480B +:105840000100F8FC00C0580CC0E0742BF01F0007EA +:105850006C3BEEFC00C0F01F00066C4BEEFC00C081 +:10586000F01F0004E3CD80C0800263A6800263AC19 +:1058700080026408D431FACD00A81897F8F600CC5D +:105880005806C0F0F8F800F85808C0B00DA80DB9D7 +:10589000F3E81089F8F800D02FC91039E088000427 +:1058A0002D6DD832ECC4FFFC0999500909A0F01FF6 +:1058B000006FFAC1FFF8340A029B0E9CF01F006CC7 +:1058C0001895CEF5590CE0800090580CCEA132020C +:1058D0005012EEF800E45808C7D1E8C5FFE4FAC357 +:1058E000FF68310A0A9B069CF01F0062310A300BE8 +:1058F0000A9CF01F00610DAA0DB9049BF3EA108900 +:10590000FACCFFD8EEFA00CC0A982FC9F01F005B42 +:10591000310A0A9B069CF01F005AC7614009E1E961 +:1059200010880DB9EBD8B0100DA8F3E81089320833 +:10593000F2CE002CF00519005FB9E04E00205F9A0E +:10594000124AF80A1800CAD15C751C35C630580EC8 +:10595000CA81FAC3FF88029B0A9A069CF01F004581 +:105960003018308AEF4800E4E8CBFFFDEECCFF189A +:10597000F01F0040EEFC010C78965806C0D0E93AC2 +:10598000001B0A98149B0699780CE21B0080F5DA3C +:10599000C0025D16C865E939001B3008F00918001F +:1059A000C5753018EF48011CEEF901185809C0718F +:1059B000EEF800FCEDB80000FE90FF7430188FD8B0 +:1059C000EEFC010C78785808FE90FF6C780C5D189E +:1059D000C68B308AE8CBFFFDEECCFF18F01F002805 +:1059E000FE94FF60C7BB189A029B0E9CF01F00201C +:1059F000FE91FF580A9A029BFACCFFD80A92F01F38 +:105A0000001D5015C67B069B0A9C310AF01F001929 +:105A1000C48BFAC6FFB8E8CBFFF50C9C310AF01F27 +:105A20000015049A029BFACCFFA8F01F0012FAC3DB +:105A3000FF880A9AE8CBFFD4069CF01F000E40199D +:105A40000C9A2F090A9B069CF01F000EC8AB301859 +:105A5000EF480118EEF9011C5809CB11EEF800FCD3 +:105A6000EDB80001CAC1C1DB8002575C800257CC8F +:105A7000800091DC800091D080028EF88000917CC3 +:105A800080029C38D431201D3003189730140695BD +:105A900030213040EF4500BC6F4A580AE08000C911 +:105AA0006F585808E08100C56E7C580CE08100C238 +:105AB0006EB85808E08000BE6F385828EFF41A2FEF +:105AC000EEF8010CEF41004C3009706C7086FEFA64 +:105AD000051E029B5D16EF4400548FC5EEF800983A +:105AE000EEF900902FF82FF9EF480098EF49009059 +:105AF0006E7C580CC0516EB85808E08100EC6FC83D +:105B0000EF4400705818EFF41A2F6FD85808E0814E +:105B100000F8580CE08100A76EE85808E08100A367 +:105B20006FE8F0C900015879E08B000EFEF804C45C +:105B3000F009032FEF4400BCEF410078EF4500402F +:105B4000EF4400C8EEFC00C0F01F012BE08000B560 +:105B5000EF4400BC2FF3E0430064C9D10E9A300B30 +:105B6000FEFC0498F01F012630090E98FEFA048C02 +:105B7000129B129CF01F0123EEF9010C72285808A9 +:105B8000C0E0EEF801105808C0A058185F0B3008AC +:105B90000E9CEF480110723A72285D182FFDD83222 +:105BA000EEF80088EF4400BCEF4000788F55EF45D9 +:105BB000007CEF4500C88F08CC6B6E585808E08118 +:105BC00000DF6E4B580BE08100D06E085808C161B1 +:105BD0003078EF4400BCEF480078EF440048CB3BFE +:105BE000EEF900845809E08101846FF85808E081DB +:105BF000015C6E4B580BE08100B86E685808CA30E3 +:105C00000E9CF01F0101C9FB6E485808E08100A9F5 +:105C10006E585808E08100B06E685808C9406F0897 +:105C20005808C910300B0E9CF01F00F7C8CB6E7CD3 +:105C30006EA95809C2F16F885808C2C06F38EF4585 +:105C400000605818EFF41A2FEF44004CEF4500584D +:105C5000EF4500548FC58FE4EF450118EF45011C57 +:105C6000C49B6FE8EEFC00CC5818EFF41A2FEF44F9 +:105C70000078F01F00E6EEFC00D4EF4500CCF01FEA +:105C800000E3EEFC00C0EF4500D4F01F00E18FE51B +:105C9000C5AB580CCD416EB85808CD105829C3B0CB +:105CA0005819C4706F3820185878FE9BFF26FEF9EB +:105CB0000362F208032FEEF800BC5808FE91FF4C77 +:105CC000C5CB6E585808E08100FE6ED85808E080B9 +:105CD00000FE6FC95819FE90FF1A5829FE91FF1E49 +:105CE0006FD85808FE90FF1A0E9CEF490070EF44E1 +:105CF00000BCF01F00C96E7CEF450074C0BB0E9C59 +:105D0000EF4400BCEF410070F01F00C36E7CEF4514 +:105D10000074C00B6F885828CC606F388FC45898B7 +:105D2000EFF41A2FEF4100603098EF48004CCE4A54 +:105D30006F885818CB806F3858A8EFF91A2FEEF9F2 +:105D4000010C30A88FC5EF440060EF48004CFEFA0C +:105D5000029E7286726C302B0A995D16CC0A6F080F +:105D60005808FE90FF573068EF4400BC8FF4EF48AE +:105D70000078CE9A6F085808FE90FF503038EF44F4 +:105D800000BC8F05EF440080EF480078CDCA6E69F3 +:105D90005809C0A06ED85808E0810117EEF800F845 +:105DA0005808E08100FC6E485808E08100EB6E88DE +:105DB0005808C0506ED85808E08000E46F28580892 +:105DC000C050300B0E9CF01F00956E7CC93A6F7866 +:105DD0005808C8018F88EF4400BCEF40004CEF48E2 +:105DE0000058EF4800448FF8EF4800488F98EF4480 +:105DF0000040C82A6E1B580BCE606E585808FE90A3 +:105E0000FF6A3089EF4400BCEF49004CEF44005C6E +:105E1000C73A6E2B580BC2716F696FB81039CD330A +:105E20006ED85808C2003058EF4400BCEF48004C10 +:105E30008FC4EF440110FE9FFE60580AFE91FF4B95 +:105E4000EF4A011CEF4400BCEF44004CEF4A0060F5 +:105E5000EF4A0058EF4A00548FCA8FE4EF4A011806 +:105E6000FE9FFE4B6E685808C7B16E485808C78140 +:105E70006E585808CC71580BFE91FF2D6F696FB8A2 +:105E80001039FE93FF286ED85808FE91FF24307811 +:105E90008FCBEF48004CEF4400BC6F98EF410110EE +:105EA0008F18FE9FFE2AEEF80088EF4900C8EF44E5 +:105EB00000BCEF4000788F59EF49007C8F08FE9FAF +:105EC000FE436ED85808E081008AEF4400BCEF44DE +:105ED000004CEF450060EF450058EF4500548FC57A +:105EE0008FE4EF450118EF45011CFE9FFE06305977 +:105EF000EF4400BCEF4900781A9BEEFC00C0F01F95 +:105F000000481892C290EEF8010C4009189A708669 +:105F1000706C300B5D16049CF01F003CEEF800C85E +:105F20005808EFF81028F9B90101F1D9E108EFF8A4 +:105F30001A28EFF80029F9B90001F1D9E008EFF8C3 +:105F40000A29EEF90090EEF8009C2FF92FF8EF499E +:105F50000090EF48009CEF450084FE9FFDF5EF4464 +:105F600000BCEF40004CEF450058EF4500448FF572 +:105F7000EF4500488F958F85EF440040FE9FFDBDA3 +:105F80003078EF4400BCEF48004C8FC56F98EF416C +:105F900001108F186E7CFE9FFDAEEEF800FC5808D5 +:105FA000FE91FF038FD4EEFC010C78785808C040B6 +:105FB000780C5D186E695809FE90FEF76ED8580887 +:105FC000FE90FEF36E7C3059EF4400BCEF49004C6C +:105FD0008FC4EF440110FE9FFD8E3088EF4400BC5B +:105FE000EF48004CEF44005CFE9FFD8780037E205D +:105FF0008003D744800268308002608C8002740085 +:106000008002747480025790800091E88002653CA1 +:106010008003D76480025874800254FC800263E6D7 +:10602000EBCD408076085808F9B901FFF1D9E108B5 +:10603000F7F81A0076185808F9B901FFF1D9E10804 +:10604000F7F81A0176285808F9B901FFF1D9E108E3 +:10605000F7F81A0276385808F9B901FFF1D9E108C2 +:10606000F7F81A03169718991698486A300B301CDF +:10607000F01F00050E9CF01F0005E3CD808000009E +:10608000800260208002747480025A84D401169CBD +:10609000F01F0002D802000080025A84D421203D63 +:1060A0001895E06C0120F01F00221897C38031E89A +:1060B0003039F9480088F948006833C8F949006C5C +:1060C000F9480064F945010C300430CA99A4089BD2 +:1060D0001A9CF01F00186AF850286ADA500A6AE819 +:1060E0005018EEF8010C1A99704A493B0E9CF01FAB +:1060F0000013EF4C00C01A961898C14030160E9C41 +:106100008F76F01F000F0E9C8F74F01F000D0E98FD +:1061100008990C9C48BA089BF01F000B0E9C2FDDC1 +:10612000D8220E9C1097F01F0009CF9B80028F246D +:10613000800091D0000004788002711C80025A8493 +:106140008002602080027474800091E8D401580CB1 +:10615000C090F8F800D45808C050F8F800805808EB +:10616000C020D8023018F94800809958F01F00026A +:10617000D802000080025A84D401580CC04099AB68 +:10618000F01F0002D802000080025A84D401580C8B +:10619000C060F94B00E0994BF01F0002D8020000EC +:1061A00080025A84EBCD40801897580CC090996BB0 +:1061B000F94B00DC580BC0610E9CF01F0005E3CDCD +:1061C0008080F8FC00C0F01F0003CF7B80025A845F +:1061D000800263BAD401580CC04099DBF01F000262 +:1061E000D802000080025A84D401580CC04099BBE8 +:1061F000F01F0002D802000080025A84EBCD40E07C +:10620000189714951296580CC3A0F8F8008C2FF824 +:10621000F948008C5839E08B0009F8F800A82FF8ED +:10622000F94800A8E3CF80E01588306AF94800B04B +:10623000F8CCFF4CF01F0042ECCA00040BA90BB8CD +:10624000F1E910861436E08B00130B99300CF80935 +:106250001800C4603038F0091800C130EEF800A80A +:10626000301C2FF8EF4800A8E3CD80E0EEF800AC3A +:10627000300C2FF8EF4800ACE3CD80E0E3CF80E0B6 +:10628000E046002BE088004C3FE80BCBF00B1800F9 +:106290005F0A3028F00B18005F09124AF80A18004C +:1062A000CEE13018F00B1800C3A1EEFC00CCF01FBB +:1062B00000252FC60C9CF01F0024EF4C00CCC2F030 +:1062C0000C9A0A9BF01F001E0E9CEF4600D0301661 +:1062D000EF460074F01F001D0C9CE3CD80E0EEF84B +:1062E00001145808C100300830398FC8EF48011434 +:1062F0008F29EF49004CEEFC010C78C85808C030DB +:10630000780C5D18EEFC00D4F01F000E0C9CEF46DC +:1063100000D8F01F000DEF4C00D4C031E3CF90E067 +:10632000EACBFFFCEEFA00D8F01F00050E9C3016F9 +:106330008F56F01F00060C9CE3CD80E0800091DCBE +:10634000800091E88000920080025A84EBCD40806A +:10635000189779685808C0B079BB580BC08070494D +:106360005D193008EF480058EF48006CE3CD80809D +:10637000EBCD40C01897580BC04078085878C04003 +:106380003018EF48006030786FA68F086F9C6C293A +:10639000300A305B5D196FA86F9C7029301A304B42 +:1063A0005D19E3CD80C0F94B00745EFCF94B00B081 +:1063B0005EFC580CF9FC10135EFC580CF9B8010196 +:1063C000F9F81A06F9B9010BF9F91A005EFC580C34 +:1063D000C08079485808C05079589708794C5EFCBD +:1063E000300897085EF8580CC0C0791A580AC09057 +:1063F000792897083009F9490048F94900445EFABC +:106400003008109A97085EFAF94B00C45EFCD70377 +:10641000D401580CC040483BF01F0003D8020000D4 +:106420008003D7B08002634CEBCD40801897580CA6 +:10643000C0F079A8300B7019799C5D19C0916E6815 +:106440005808C0606E2820385818E0880004E3CD52 +:1064500080806F485808F9B80101EFF81A136FA847 +:106460006F9C7029301A300B5D19EEFC00A4483A7D +:10647000302BF01F0003CECB8003D7BC80023A1A2A +:10648000EBCD40801897580BC040780858B8C040F2 +:106490003018EF4800606F4930B88F085809F9B8D4 +:1064A0000101EFF81A136FA86F9C7029301A300B96 +:1064B0005D196FA86F9C7029300A305B5D196FA859 +:1064C0006F9C301A7029304B5D19EEFC00A4484ACD +:1064D000302BF01F0004E3CD808000008003D81C27 +:1064E00080023A1AEBCD40C01897580BC04078088C +:1064F00058C8C0403018EF48006030C86FA68F08F9 +:106500006F9C6C29301A302B5D196FA86F9C702915 +:10651000300A305B5D196FA86F9C301A7029304BC0 +:106520005D19EEFC00A4484A302BF01F0004E3CDB7 +:1065300080C000008003D86080023A1AEBCD406032 +:106540001896784CF01F000B30056D1C8D45F01F20 +:1065500000096D4CED450044F01F00066DA8ED45A7 +:1065600000500A9A6D9C70290A9B5D19E3CD8060EA +:10657000800091E8EBCD40E01897580BC4F0780804 +:106580005808C4C130088F086FD95809C0B06F6867 +:106590005808C08070985808C0506FBB0E9C5D189A +:1065A000C4114A4B0E9CF01F00246FA83006301512 +:1065B0008F16EF4500408F268F666EFA70490C9B50 +:1065C0006F9C5D196FA80C9A70290C9B6F9C5D19CC +:1065D0006FA80C9A7029302B6F9C5D196F4CF01FBF +:1065E00000176FA80A9BEF460050EF46004C0C9A2C +:1065F00070296F9C5D193FF80C9A8F386FA5303B5E +:106600006F9C6A295D196FA80C9A7029304B6F9C9A +:106610005D19EF4600C0E3CD80E03018EF48006020 +:10662000CB2B6F686FBB70A90E9C5D19CBFB000074 +:106630008003D8948002634C800091E8EBCD40E069 +:10664000205D1897580BC04078085858C040301843 +:10665000EF48006030588F086F695809C4406FA830 +:10666000FACBFFF070596F9C5D19310A300B189509 +:106670001A9CF01F00256F1C6EE850086E295019F7 +:106680006E6850286F095039F01F002030086F6B7A +:10669000EF48005CEF480044EEC8FFB81A9A0A9928 +:1066A0001AD80E9C405876566FBB5D16EF4C0044CE +:1066B00040188FE82FFD5808C1616F785808C13124 +:1066C00040188F2840298F694038EF4800406F6894 +:1066D00070695809C08070785808C0506FBB0E9C14 +:1066E0005D19C0412FBDE3CD80E06F4CF01F000766 +:1066F0006F68EECAFFAC70796FBB0E9C5D19EF4CF2 +:106700000050CF1B800091D0800091E8EBCD4080FD +:106710001897580BC04078085868C0403018EF48A8 +:10672000006030686E4C8F08F01F001A6F18580810 +:10673000C2E0EEF800B05808C2216EA86F2C8F3866 +:10674000F01F00158F4CC0706F2A6F1BF01F0013D5 +:106750006F288F586FA8301A7029303B6F9C5D19D5 +:106760006FA86F9C7029300A305B5D196FA86F9C11 +:1067700070496EFA300B5D19E3CD8080310AEECBA3 +:10678000FF7CEECCFF6CF01F0005CD8B8F48CE9BBD +:10679000800091E880009200800091DCEBCD40FC0D +:1067A000201D79A81897169214931294799C700959 +:1067B0005D191896C2F06F685808C23070C8580842 +:1067C000C2000E9C1A9A6FBB5D181895C1A0400CB0 +:1067D0002FBC870CF01F0015C1D03028B892B888A4 +:1067E00030188699B8B9A9891897B8A9B8C80A9B6A +:1067F000400A2FBCF01F000E0E9C2FFDE3CD80FC45 +:106800005804C0416DCC580CC0A16DB86DA5580599 +:10681000C0A130070E9C2FFDE3CD80FC6DD81895EC +:106820005008CD6B5008CD4B80009200800091DC69 +:10683000D431209D3004F8C9FF7CF8C8FF6C18974C +:1068400050195008F8C0FFB808956FA8EF450060D0 +:10685000301B70196F9C5D19C0706FA8306B701978 +:106860006F9C5D19C2F16FA8306B70196F9C5D1938 +:10687000C140EEF800C45808C101EEF800C0E0487D +:106880000032E08A0025E0480033E080011C6F8878 +:106890005808C1003014CDAB6E085818F9B8010182 +:1068A000EFF81A18EF4500C030188F086F885808A5 +:1068B000CF216F7C580CE80C1700F9BC01012F7D2B +:1068C000D832301B0E9CF01F01EECE2B6E0958A95A +:1068D000FE9BFFDFFEF807ACF009032F30183029CC +:1068E000EF4800608F09CD4B300B0E9CF01F01E686 +:1068F000CCFB6E196EB81039C760300B0E9CF01FC0 +:1069000001E2CC6B6EA96E381039E0800137300B94 +:106910006E8E580EC1B06E685808C1806EAA6E396E +:10692000123AE08000BBEEF800B05808C0F0F2C8A0 +:10693000FFFFF1D8C008103AE08000B0F2C8FFFEB7 +:10694000F1D8C008103AE08000A96E2C582CC20083 +:106950006E985808E08001236E685828E080011F77 +:106960006EAA6E39123AE0800146EEF800B058087F +:10697000C0F0F2C8FFFFF1D8C008103AE080013B38 +:10698000F2C8FFFEF1D8C008103AE08001346E78FA +:1069900058085F1A3008F5EB0009F0091800E0818B +:1069A000010FEC1B0001F5EB0008F2081800E08075 +:1069B00001056EBB1699582BE080012A6E16580609 +:1069C000C071581BE080021B582BE08101630C3B17 +:1069D000E080014F0C995919C0F1580EC0416FE881 +:1069E0005808C0A0300B0E9CF01F01A8C51B6EEB11 +:1069F000580BFE90FF7C300B0E9CF01F01A5C48B42 +:106A00006FA8305B70196F9C5D19C7016FA8307B50 +:106A100070196F9C5D19C0506E685808FE91FF395F +:106A20006FA8300B70396F9C5D19C0516E68582883 +:106A3000FE90FF2F6FA8308B70196F9C5D19FE912F +:106A4000FF286FA8189B70396F9C5D19C0516E6844 +:106A50005828FE91FF1E6FA8307B70196F9C5D193E +:106A6000C0806E285828C0506E685808FE90FF11EC +:106A70006E185918E080025C5998FE91FF0AEEF8F2 +:106A800000805808FE90FF056E685808FE90FF01D0 +:106A90006E285848FE91FEFD300B0E9CF01F017DC4 +:106AA000CF7A6FA8306B70196F9C5D19FE90FEF164 +:106AB000EEFB00C4580BFE91FEEC0E9CF01F017023 +:106AC000CE7A3328EEFC00A4FEFA05CC1AD8302B7F +:106AD000F01F0172EEF800C0301B16080E9CEF4844 +:106AE00000C0F01F016F2FFDCD3A6FAA3038FACBEE +:106AF000FFE08F0830136F9CEF43006074595D19FD +:106B00008F95507C8F85EF4500788F758FA58FB559 +:106B10008FC58FD55F0A408B1896583B5F88104A07 +:106B2000EA0A1800C23119A919B8F1E910885068A9 +:106B3000103BC1C319988FA8EEF900B05809C09056 +:106B4000069C4019FACAFFE8FACBFFE4F01F015592 +:106B50000D893028F0091800E080011CE08B008DC1 +:106B60003018F0091800E0800123EEF800C02FF87B +:106B7000EF4800C0FE9FFE8D6E785808FE90FEC95B +:106B8000EEF800B05808C080310A400B401CF01FDE +:106B90000146FE91FEBE301BCBCA580EFE90FEF998 +:106BA0006E685808FE91FEF56E185918FE91FEDACF +:106BB000583CFE91FED7CECA6E19C0EB301830A9F2 +:106BC000EF4800608F096F1CF01F01386E485808AD +:106BD000C1A06E5CF01F0136EF4C0044FE90FE59E0 +:106BE0006E5A6E4BF01F01336E58EF480048FE9FFF +:106BF000FE50300B0E9CF01F012AFE9FFE4A30090A +:106C000050494048EF480044FE9FFE436F08580833 +:106C1000FE90FED6301830996FAA8F09EF480060B9 +:106C20007458FACBFFE86F9C5D1819A919B818962B +:106C3000F1E910885848E08B01476F1CF01F011BD9 +:106C4000305CEF450044EF4C00486EA6F01F011881 +:106C5000E08001853029B896B889EF18004AB8C994 +:106C6000B8B8A988B8A8EF4C0044FE9FFE12584C53 +:106C7000FE90FEB3CB8A3038F0091800E08000DCCB +:106C80003048F0091800FE91FF7230188F98C6EB5B +:106C900030181693EF48006030496FA8E04B00FEB3 +:106CA000EFF3000D8F096EC670096F9C5D19069A8F +:106CB0000C9BF01F0101E08100C36F1CF01F00FB63 +:106CC0006FA8EF4500446EA270096F9C5D19503C9F +:106CD000FACCFFE8F01F00F91893C9206EB8E0481D +:106CE00000FEE08101516FA8406670096F9C5D193C +:106CF00030C8505CA376EF480048ECCCFFECF01FA6 +:106D000000EC1891E080012E3FE9B892B8C9302913 +:106D1000B889F8C8FFFBB0A5B085B095F8C9FFF8F1 +:106D20003038B285B295B2A5B2B8504CF8C2FFF473 +:106D30000A96C298661A6ED81438C210405CF01FCA +:106D400000DE049AE4CBFFFC580CC1903FE814C865 +:106D50008689B4896608A988B4986609B4A907C861 +:106D6000B68886A9B6996618A988B6A86619B6B96C +:106D7000F6C2FFFC60082FF62F88810866F35803DF +:106D8000E0800099660B6EC81638CD50661ACD7B30 +:106D90006E185918FE91FEEB40685848FE98FEE7C1 +:106DA0003018EF4800780DC98FB9CE0A406A584AAA +:106DB000FE98FEDD30188F780DC98FB9E04900FECE +:106DC000FE91FED558BAFE98FED2ECC9FFFB139C8B +:106DD000138A13A8F1EA1108F1EC1088ECCBFFF844 +:106DE0008FC817AC17B81789179AF1E91188F1EA1B +:106DF0001108F1EC10888FD8CB9A6FA83089EF4B2F +:106E000000608F09FACBFFE0705A6F9C5D1AFEFAA2 +:106E100002AE302BEEFC00A4F01F00A06F1CF01F90 +:106E200000A30C99EF460044009A6EAB0E9CF01F35 +:106E300000A5C1AB30188F88FE9FFE990C9C069B65 +:106E4000F01F00A1FE90FF3B6FD85808C0906F6AFA +:106E5000580AC06074096EC81039E0800086FEFBD5 +:106E6000026A0E9C3006F01F009A6EB88F186F6C85 +:106E7000580CE08000CD5806C54078B86FBB0E9C1A +:106E80005D18EF4C006C6FB65806E08000CA6F6A60 +:106E90006ECB30188F287429FEFA02381AD91AD30B +:106EA0001ADB302BEEFC00A4F01F007C2FDDFE9FD0 +:106EB000FCF05806C4206F285C78A2B8A988A2A864 +:106EC000FE9FFEA1F0CC0004F0C20005F01F007888 +:106ED0001893FE90FEB45802C120ECCCFFFB300AA0 +:106EE00035DB1938F0C90021F6091800F9B80B5F35 +:106EF000E60A0B082FFA1432FE9BFFF53008E60273 +:106F00000B084F581AD34F5A1AD8302BEEFC00A456 +:106F1000F01F0062069CF01F00652FEDFE9FFE8FA4 +:106F200078380E9C5D18EF4C006CCAEB6FF858086F +:106F3000FE90FCAFFE9FFDAA04983FE910C9B0A6E1 +:106F4000B086B096E4C9FFFCB2B6B286B296B2A6DD +:106F50006F282F88EF480048CB0B0A9CFE9FFE85C8 +:106F60005045FE9FFE5074181033FE91FF7A7499BD +:106F70005809FE90FF766FBB0E9C5D19FE90FF7165 +:106F80003016C74B3058406CEF4800482FACF01F0C +:106F900000481896FE90FE35B89230283039B888EF +:106FA000B8C9504CF8C2FFFB50250A91C1A8661A17 +:106FB0006EB8103AC130403CF01F003FC0F0660888 +:106FC0005808C5A040285808C0913FE904C93018A6 +:106FD000502860082FF12FF8810866F35803C0602D +:106FE000660B580BCE50661ACE7B5801EFF8101284 +:106FF000E5F10E00EFF80012F7B800FFEFF80A1203 +:107000005C78ACB8A988ACA8FE9FFDFD069B6ECC51 +:10701000F01F002DEF4C0058FE90FE51C2DB6FA810 +:107020006F9C70095D196F6870291AD91AD36EC8E0 +:1070300018921AD8302B4AAAEEFC00A4F01F0017B1 +:10704000EF4600588F268F1658025F1B6EB92FDD52 +:1070500058D95F081668EC081800FE90FE30E4F876 +:1070600001605808FE91FC15E4F801685808FE908C +:10707000FE26FE9FFC0E661804C8CACB800265740B +:107080008003D7848002670C8002663C80026370B4 +:10709000800264808003D8A080023A1A800264E4EF +:1070A00080028D9C8000917C800091E8800092009D +:1070B000800091DC80023AD8800271E48003D8F02D +:1070C0008002679C800271908003D9248002634C07 +:1070D0008003D9708003D8D08003D3E48003D930F3 +:1070E000EBCD40801897580CC0E0488BF01F00088B +:1070F0000E9CF01F0008EEFC00ACF01F00070E9C79 +:10710000F01F0006E3CD80808003D9AC8002634C81 +:107110008002653C8002D298800091E8EBCD40F877 +:10712000203D1896169414931295E06C00C8F01F39 +:1071300000151897C1C033C8F946006499F8F9449E +:107140000068F94300A430CA300B1A9CF01F000EEF +:107150006A2850286A0950096A181A9C5018F01FAA +:10716000000BEF4C00AC1A961898C0500E9C2FDD07 +:10717000E3CD80F80E9C1097F01F0005CF8B000028 +:1071800080028F24800091D08002D2C4800091E8D8 +:10719000189948A8700C580CC051C0D878FC580CED +:1071A000C0A078081238CFB1781816385E0C78FC79 +:1071B000580CCF815EFD000000007AB01899489805 +:1071C000700C580CC051C0C878FC580CC09078089E +:1071D0001238CFB178181638CF81782C5EFC5EFD5E +:1071E00000007AB0189B4888700C580CC0A0189901 +:1071F000300A2FFA72F95809CFD1149897085EFC1B +:107200001898CFDB00007AB05EFDD703EBCD40E0ED +:1072100048D81896169570075807C051C0E86EF701 +:107220005807C0B06E2C0C9BF01F0008CF916E0861 +:107230008B086E1CE3CD80E030088B08109CE3CDFA +:1072400080E0000000007AB0800091A0EBCD40C04B +:1072500048B70E966E095809C0B072F88D08129C96 +:1072600072D85808C0705D186E095809CF71E3CD07 +:1072700080C0129CF01F0003CEEB000000007AB02B +:10728000800091E8EBCD40C048D66C485808C0312A +:10729000C0880E987057109CF01F000A5807CFA1A5 +:1072A0006C6CF01F000930086C3C8D68F01F000505 +:1072B0006C8CF01F0004E3CD80C0000000008C90B7 +:1072C000800091E880014544EBCD40F8495718967D +:1072D000169314946E2B12952FFB6E3CA56BF01F2A +:1072E0000012C1D06E28A568F80809066E29A569A4 +:1072F000F8090009932593146E2AF4081504F80878 +:10730000000891336E188F3C2FFA1036EFF69A0171 +:107310008F2A3018300C8FC8E3CD80F8E3CFC0F847 +:1073200000008C90800091F4EBCD404CE0634DD395 +:10733000EA1310621896F01F000DF8030648A7899B +:10734000E06A03E8F20A0248F8080109121CF20A8E +:10735000024AF80304428D1ABF5CA743E60C010CF5 +:107360008D0CE3CD804C0000800145C4EBCD408006 +:10737000202D4A076E495809C2C06E581039C29074 +:107380001A9CF01F001D6E484009700A1439C2444F +:107390007018401BF40901091618C276F00B141F6F +:1073A000E06A03E8F20A024AE0694DD3EA19106282 +:1073B000F0090448A7491619F20A000C580CE08A93 +:1073C000000E300948DA6E6BF01F000D6E488F58C2 +:1073D0002FEDE3CD80801439C030301CCF3B7018C6 +:1073E000401B103BCFB4CD7B2019F028BDC0CD7B16 +:1073F00000008C9080027328800275188001455827 +:10740000D43149A0189516931492604C580CC2B010 +:1074100030060C940C91785778480A38C09018962A +:107420000E9C5807CF91F01F0012089CD8325BF3D6 +:107430005F0A782906395F081448E2081800CF006F +:107440005BF25F0A783904395F081448E2081800D3 +:10745000CE705806E1F70A04EDF71A052FF4F01F75 +:107460000005CDFB1894CE0B00008C908002736C4D +:10747000800091E8EBCD40FC18961695149212947A +:107480001093318CF01F00211897C3A0F01F00202B +:107490006E0A6E1B0C0AEA0B000B8F0A8F1BEE5B49 +:1074A000423FE08A000B2FFAEE3B42408F0A8F1BCF +:1074B000EE5B423FFE99FFF98F248F338F423008F5 +:1074C0008F58494C78495809C1D072081438E0895E +:1074D000001A2F0CC0A8F2CCFFEC72595809C0A0BA +:1074E00072081438E0890007103ACF617218103B17 +:1074F000CF348F599907F01F0008E3CF80FCE3CF0A +:10750000C0FC2F0CCF7B000080009200800273280B +:1075100000008C908002736CEBCD40E0202D49661A +:107520001A9CF01F00166C475807C1F040096E08FE +:107530001238E089001B3005C05840096E08103928 +:10754000C1451039C0516E1940181238C0E56E5847 +:107550008D558D486E3B6E486E2C5D180E9CF01F4D +:1075600000086C475807CEA1F01F00062FEDE3CFAF +:1075700080E0000000008C9080027328800091E879 +:107580008002736CEBCD408049A76E3E580EC2B0AE +:107590006E2A580AC280E08A002B7C081838C27014 +:1075A000FCC9FFF0300BC05872082F091838C050C2 +:1075B0002FFB163AFE99FFFA143BC170201A163AB7 +:1075C000C0F0161AF60C1504A56AFC0C000C2FFB73 +:1075D000A56BFC0B000BF01F00086E2A201A301858 +:1075E0008F2A8FC8E3CD8080E3CD8080300BCE7BA7 +:1075F00000008C90800091C4EBCD406048861895C7 +:10760000334A300B0C9CF01F0007ECCCFFE88D05D3 +:10761000301BF01F0005E3CF8060000000008C905D +:10762000800091D0800144F80050F2010100000078 +:107630000000000000000000F6F800DC5808C05010 +:10764000F8F800F85808C0205EFDF6FB00D0580B93 +:10765000CFC076085808C04176185808CF602F8BE5 +:10766000CF9BD703EBCD4080300B1897F01F001352 +:10767000306A300BEECCFF64F01F0011306A300B23 +:10768000EECCFF5EF01F000E300BEEFC00E0F01FB2 +:10769000000D300BEEFC00E0F01F000BEEF800BC1C +:1076A0005828C030E3CD8080EEFC00E0300BF01FA6 +:1076B0000007E3CD80800000800217D0800091D0C9 +:1076C000800261E8800261D4800261A4EBCD408039 +:1076D0001897F8F800945808C160300BF94B0094E3 +:1076E000F8F800D470985808C040F8FC00C45D1841 +:1076F000486A302B0E9CF01F0006300A0E9C149B2B +:10770000F01F0004E3CD80808003D9D480023A1AB0 +:1077100080022584D431209D500C761558155F9831 +:107720007607169058075F1910693008F00918009D +:10773000E08000B8EEC4FFFF0989F2C6FFFE0C35F9 +:10774000E08500B010923DD33301C168E208180013 +:10775000C2800C0758155F9958075F181268E40833 +:107760001800E080009EEEC4FFFF0989F2C6FFFE0C +:107770000A36E08900960C150F88E6081800CE71CD +:10778000305AF4091800FE98FFE6EECCFFFE306A8E +:107790004DFBF01F0060C0B00F88E2081800CDA1BB +:1077A00009883019F2081800FE98FFD540080E9B92 +:1077B0000C9AF0FC00DCF01F00581897C711400A23 +:1077C000FACBFFFCF4FC00DCF01F0054C21540793A +:1077D0005809C1E040685808E0890007C19840682E +:1077E0001037C1644079EE0B1504F20B000B400911 +:1077F0003008F2FC00DC2FF71099109AF01F0048B7 +:10780000CEF14008301BF0FC00E0F01F004660465F +:10781000605558065F1958155F981069C760ECC429 +:10782000FFFF0989F2C7FFFE0E35C6F53003069249 +:107830000691C1A85802C0610D88330AF4081800E7 +:10784000C3A00E060E1558065F1858155F991268EA +:10785000E2081800C3F0ECC4FFFF0989F2C7FFFE7D +:107860000A37E08900385803CE610D883DDAF40804 +:107870001800CE113058F0091800FE98FFDD306A6C +:107880004A3BECCCFFFEF01F0023CD5140090E9A7D +:107890000C9BF2FC00DC3013F01F0023CCCB600704 +:1078A0005807CB604009300AF2FC00DC149BF01F43 +:1078B000001ACAEB09883019F2081800FE98FFC3B5 +:1078C00040080E9A0C9BF0FC00DC3012F01F0017F1 +:1078D000CB9B5803C0F05802C0B160485808C08024 +:1078E0004008049AF0FC00DC049BF01F00102F7D80 +:1078F000D83260465806CF004009300AF2FC00DC5E +:10790000149BF01F0009CE8B3002CF5B80027628DB +:107910008000917C8002B5EC8002C04C8002938094 +:10792000800255968002B58C8002B52CD431FACDF8 +:10793000009018911497586BE08B00C4FEF807482C +:10794000F00B032F580AC0A0F8F800907009739A42 +:10795000580AC0410E9BF01F01CD304B029CF01F16 +:1079600001CCE2F801185808E0810312FAC7FF942D +:10797000E2F800D470285808C4C00E9BE2FC00C492 +:107980005D18C475E2C6FF64306A0C9B0E9CF01F44 +:1079900001C1C3F0FB3800711AD8FB3900741AD941 +:1079A000FB3800771AD8FB39007A1AD9FB38007DEA +:1079B0001AD8FB390080FEFA06DE1AD9301B029C69 +:1079C000F01F01B6306A0E9B0C9CF01F01B5306AA7 +:1079D000300BE2CCFF5EF01F01B3E2FA00BC2FAD2A +:1079E000584A5F08590A5F091248C081588AE080E6 +:1079F000030C0E9B029CF01F01ACE2F80090704952 +:107A00005819E08102D5E2F800B05808E08002D0B1 +:107A1000FB3800711AD8FB3900741AD9FB3800778B +:107A20001AD8FB39007A1AD9FB38007D1AD8FB39ED +:107A30000080302B1AD9FEFA0672029CF01F0197C3 +:107A4000E2FB00B02FAD580BC040029CF01F019824 +:107A50000E9BE2FC00DCF01F0197622CF01F0196E8 +:107A6000300BE2FC00E0F01F0195300BE2FC00E07F +:107A7000F01F0193E2F800BC5828C061300BE2FC13 +:107A800000E0F01F0190301BE2FC00E0F01F018BD2 +:107A9000300BE34B00F4E2F900BC59095F0A584986 +:107AA0005F081448F6081800E0800216029CF01FD8 +:107AB0000186307B029CF01F0176029CF01F01833F +:107AC0002DCDD832580ACFD0149B7439F8FC00DC85 +:107AD000742AF01F017F2DCDD832F8FB00BC590B62 +:107AE000CF00F8F800E85858E08002355838E08BAD +:107AF0000234E2C7FF64306AFEFB05D80E9C2F8B70 +:107B0000F01F0164EE0B1710E06800A2E3D8E00B51 +:107B1000029CF01F0171E2FC00DCF01F0170FEFA14 +:107B200005BE302B029CF01F015DE2FA00BC584AF2 +:107B30005F08590A5F091248C0B1588AE08002976D +:107B400030080E9BE3480104029CF01F0157029C81 +:107B5000F01F01642DCDD832FEFA058C303BF01FAA +:107B6000014F5807E08002806E0858085F1B169A84 +:107B7000E2FC00DC301BF01F015DFACCFF94F01F2B +:107B8000015CE2F800985808E08001D541B9F2089C +:107B90000108E048003CE08A01A6E34900982DCDA9 +:107BA000D832F01F0154E08501EBE2F900907248F1 +:107BB0005828C870E2F800AC5808C831E2FA00CC86 +:107BC0001094500AE2F000D072285808E08A00A908 +:107BD000300850187218401AF00A032850585800FC +:107BE000E08A0097400530020A96C11808973003D2 +:107BF00030142FF2ECC6FF6404305F983009E9E8D6 +:107C00000008F2081800E08000970E940C9B029C7C +:107C10000C93F01F0139C05078385818FE99FFE8CE +:107C20006D585808C051ECF800805808CE004059F3 +:107C30005809CDD0ECC8FFFAECCAFFA8ECC9FFD4B4 +:107C40005048502A50394057C0486E175807CCF05A +:107C5000EEF801945808CFA16CAA6E58103ACF6183 +:107C60006E4B404CF01F010BCF116E885808E0811D +:107C700000E16F6AEDBA0001C061ECFB0080580BB7 +:107C8000E08100E3F1DAC001300AF4081800CDE029 +:107C90006D5B580BCDB0FACAFF94403CF01F011742 +:107CA000CD516F6841B91268CD106F3841C9126863 +:107CB000CCD06F4841D91268CC906F5841E9126816 +:107CC000CC5058065F04C96B149BF01F00F02DCDFB +:107CD000D832149B2EACF01F010A1896FE91FEF2CA +:107CE0006F9B580BE080012A581BFE91FEEBE34B83 +:107CF00000D8029CF01F00FB622CF01F01028326BB +:107D0000CE0A5803E08100BF0E94E2F900904018BB +:107D10002FF850187228401A103AFE95FF5DE2F8CD +:107D200001085808E0800121029CF01F00F7E2F9E9 +:107D30000090C4BB5804CE600E923006C108049770 +:107D4000089930032FF6EAC5FF640C305F98F3E81A +:107D500000083009F2081800CD500E920A9B029CD0 +:107D60000A93F01F00E5C05078385818FE99FFE9D3 +:107D700040585808CE50EACAFFFA4057506AC078B7 +:107D80006AA8103AC5006E175807CDA0EEF8019406 +:107D90005808CFA16E5A580ACF416E885808C1E1E1 +:107DA0006F5BEDBB0002C040EDBB0003CED1F1DB49 +:107DB000C002C0806B585808CE71EAF8008058089D +:107DC000CE31EEF8014C5808C110EB190088EDB91E +:107DD0000001CDA058055F09CB6B306AEECBFFE800 +:107DE0000A9CF01F00ACCD01CDCB1099EEC8FECCA3 +:107DF0002FF9700A580AC2612FC85849CFA1EDBBAC +:107E00000003C071EEF800F0F1D8C002F9BA010128 +:107E1000EB190088EDB90004C030580A5F0A580A0F +:107E2000CB30CD6B6E4B406CF01F009ACAD1CB6B40 +:107E3000306AEECBFFE80C9CF01F0096FE91FF0726 +:107E4000C19B301ACDDBFACAFF94402CF01F00AB67 +:107E5000C0306F6AC18B6F6A41B8F5E80008FE90C8 +:107E6000FF136F3841C91268FE90FF0E6F4841D969 +:107E70001268FE90FF096F5841E91268FE90FF04F6 +:107E8000C21BE2F800A85808C131306AE2CBFF6497 +:107E9000069CF01F0080C170E2F800E85838C081ED +:107EA000306AE2CBFF5E069CF01F007AC0C00E9BDA +:107EB000029CF01F007FE08100B50E9A069B029C99 +:107EC000F01F0092009A400BE2FC00DCF01F0090D3 +:107ED000FE9FFDF8169A029C30ABF01F008EFE9FAD +:107EE000FDEE3017FEFA0230303B029CE34700946F +:107EF000F01F006AE06B2710300CF01F0088E2F8DA +:107F000000D470985808C0500E9BE2FC00C45D1865 +:107F100030EB029CF01F0082300A029BFEFC020440 +:107F2000F01F0081300802994FEA109B33CCF01FFC +:107F3000007F41B9FE9FFE33E2F800D85808FE905A +:107F4000FDC1E34B00D8029C301BF01F0079FE9F5F +:107F5000FDB9582BC780E07A86A0300B029CF01F39 +:107F60000075FE9FFDC8305BE2F801105818C7206D +:107F7000029C300AF01F006FFE9FFDA4E2F9009002 +:107F800072485828FE90FD9E301BCEFBFAC7FF9426 +:107F9000E2C6FF64306A0C9B0E9CF01F0041E2F8C1 +:107FA00001185808FE91FCF8FE9FFCE4029CF01FAB +:107FB00000621896C230F8FB0194580BC1F1795851 +:107FC000E2180013C351189B029CF01F005CE2F8FA +:107FD00000B05808C0701036C050E2FC00E0F01F3E +:107FE0000058E2FC00DC0C9BE34600B0F01F00559B +:107FF000029CF01F0055FE9FFD0D029C303BF01FC0 +:108000000053FE9FFD5FE2F800B05808FE90FCF3BD +:10801000F0F800F0F1D8C002FE91FCEDFE9FFCEFFD +:10802000029C300A30ABF01F0043FE9FFD4B350928 +:10803000FAC8FF70189A10D9029CFAC9FFE4F01F21 +:108040000044CC6B4C3AF01F0015E2F800E8FE9FAC +:10805000FD4F72485818F9B80002E3F80A44F9BB1A +:108060000000C87B0E9BFE9FFD84E2F800B058081C +:10807000FE90FD68F0F800F0F1D8C002FE91FD62BC +:10808000FE9FFD678003D9B880027714800217D065 +:108090008000917C8003D9F880023A1A800091DC3C +:1080A000800091D0800226948003DA3880027638EE +:1080B0008002BA4C80028172800261E8800261D441 +:1080C000800261A480021CE080021DB88002979C9F +:1080D0008002762880021AE08002BA1C8003DAA8A7 +:1080E000800276648003DAE48002D19C80028F549F +:1080F00080021E84800218F88002BD68800091A072 +:10810000800281748002189C800230DC800298A476 +:108110008002246C8003DB0480028F1C800228D83C +:10812000800276CC800274008002747480022794EE +:10813000800225848002195C800222A480025748B4 +:108140008002B9D48002237080022FCC80021F30BD +:108150008003DA68580C5E0E5E1DD401201D3008C5 +:10816000767C3009BA881A9A7668129B5D182FFDC2 +:10817000D8025EFCEBCD40801897580CC090789CDC +:10818000580CC035F01F00040E9CF01F0004E3CD16 +:108190008080000080027584800091E8EBCD40F87B +:1081A0001896129510944063328CF01F000B1897AC +:1081B000C0F00C9B311AF01F00093FFC8F658F74D3 +:1081C0008F838F9C30090E9A485BF01F00060E9C2F +:1081D000E3CD80F880028F24800091AC8002815A28 +:1081E000800272C8D4011698306AF8CBFFEF109C59 +:1081F000F01F0002D80A0000800091DCD431213D3C +:1082000076FE511E760A503A761950497628505813 +:10821000763E506E764A507A7669508976785098D4 +:10822000768E50AE769A50BA76B950D976C850E864 +:1082300076DE189850FEF8C9FFF876EA510A7654AF +:1082400076AB500C5019E02BA44F50CB110EF8CB4D +:10825000FFF45008512E403A700340487205502BED +:10826000E069A478EA19D76AFC0900091409760ABA +:10827000E06BB756EA1BE8C7F40B000B100BF5E5F3 +:108280002008066814581009E06870DBEA182420FA +:10829000EBE3200AF20E1507FDE9139E060EFDEA38 +:1082A000000A0A5A1005140BFDE32008F606150C07 +:1082B000EDEB13461C06EDE800080658405AE0694D +:1082C000CEEEEA19C1BD14051005EDEE2008EA0B4B +:1082D0001511F7E512FB0C0BF7E800081C58120308 +:1082E0004069120310034078E6051516E0690FAFE8 +:1082F000EA19F57CEBE312A5F00900091605F7E68B +:108300002008EBE800080C581C091009EBEB2008CA +:10831000F2031507E7E913930A03E7E80008165884 +:10832000E06AC62AEA1A4787E80A000A0C0A100A15 +:10833000E7E52008F402150CE5EA13420602E5E839 +:1083400000080A58408EE0694613EA19A830FC0973 +:10835000000916091009E5E32008F2061511EDE9F8 +:1083600012F60406EDE800080658409AE06B950105 +:10837000EA1BFD46F40B000B0A0B100B40A840C98A +:10838000F60E1516FE395BB1FDEB12AEE06A98D819 +:10839000EA1A69800C0E40BBF00A000AEDE22008E0 +:1083A000FDE80008045840C1060A50C9100AE069F7 +:1083B000F7AFEA198B44FDE62008F6090009F40B33 +:1083C0001507F7EA139B1C0BF7E800080C58F7EEAB +:1083D000200A0C0104091009F206150CEDE91346F8 +:1083E0001606EDEB2008EDEA000A1C5A1401E2051E +:1083F0001511EBE112F50C05EBE80008165840DA10 +:10840000E069D7BEEA19895CF40900091C09100962 +:1084100040E8F20E1516E06A1122EA1A6B90FDE9A7 +:1084200012AEF00A000A0A0EEBE62008160AFDE872 +:10843000000840FB0C58E0697193EA19FD98100A96 +:10844000F6090009FDE52008F40B1507F7EA139B70 +:108450001C0BF7E800080A580C0910094108F2063D +:10846000150CE06A438EEA1AA679EDE91346F00A84 +:10847000000A1606F7EE2008EDE800081C580A0A64 +:10848000100A4118F4051511E0690821EA1949B4E8 +:10849000EBEA12F5F00900090C05EDEB2008EBE81A +:1084A000000816581C091009F2031516E7E912A373 +:1084B0000A03E7E520080C680A58404EE06A256286 +:1084C000EA1AF61EFC0A000A160A408B100A40D867 +:1084D000F40E1505E069B340EA19C040FDEA13BE89 +:1084E000F6090009060E403B0C09E0665A51EA16EF +:1084F000265EF0060006FDE320080A68065810090B +:10850000E062C7AAEA12E9B6F6020002F20B150908 +:10851000F7E9137B41191C0BF7EE200806681C587D +:108520000A0606021006E063E681EA13D8A1F20308 +:108530000003EC09150EF3E613291609F3EB2008E6 +:108540001C68165840CA10024078E065105DEA15B4 +:10855000D62FE0611453EA110244E8050005F40146 +:1085600000011C051601E40A1514E06EFBC8EA1EA2 +:10857000E7D3F5E212CAF00E000E120AF5E9200860 +:10858000166840BB125812031005E066CDE6EA16E5 +:1085900021E1F6060006EA0B1505F7E513BB140BFF +:1085A000F7EA2008126841091458E06507D6EA1571 +:1085B000C3371001F2050005E2091509F3E113794B +:1085C0001609F3EB20081468165810034068140EBF +:1085D0001606E60A150EE0620D87EA12F4D5F5E3F9 +:1085E000132AF0020002120AF5E92008166840ABCF +:1085F00012581205100EE06314EDEA13455AF60303 +:108600000003FC0B1514F7EE12CB140BF7EA20084D +:10861000126840F91458E061E905EA11A9E310066F +:10862000F2010001EC091505F3E613B91609F3EBA5 +:10863000200814681658100540581402E066A3F884 +:10864000EA16FCEFEA0A1509F0060006F5E5137ACA +:10865000120AF5E9200816681258409E1002160307 +:10866000E40B150EF7E2132B140BF7EA200812683F +:108670001458E06502D9EA15676F1003FC05000580 +:10868000E60E1514FDE312CE160EFDEB200814685D +:1086900016581201100140A840E91406E060F68166 +:1086A000EA108771E20A1505F0000000F5E113BA3F +:1086B0001C0AF5EE200816681C58E0624C8AEA1283 +:1086C0008D2A1006F2020002EC091509F3E613796F +:1086D0001409F3EA20081C681458160540DB10053D +:1086E0004108E434C6BEE0616122EA116D9DE80AEA +:1086F0000007F6010001E066380CEA16FDE5F00619 +:108700000006EA08150EF1E513281208F1E9200B1E +:10871000F7EA000A125A1C021402407A404E120074 +:108720001001E063CFA9EA134BDEF4030003E40A6F +:108730001514F5E212CA100AF5EB200BF5E8200833 +:10874000EE0B000BF6091504F3EB13C914091258CC +:1087500014061000F3EA200AE065EA44EA15A4BE14 +:10876000E008150BFC050005F1E01358120512088E +:10877000105A10031401F1E92009E20B1510F7E17A +:10878000130B100B1659F7E820081206EC0E1517FC +:10879000FDE6129E160E1C5810054098FDEB200AAF +:1087A000EA061504E0694B60EA19F6BBEDE513C66D +:1087B000F00900091C0616090C5AEDEE20081403F6 +:1087C00040CBE605150BEBE313550C050A58E06AA0 +:1087D000BC70EA1ABEBF1009F60A000AEBE62008D0 +:1087E000F20B1510F7E9130B0A0B16581C0A100AA6 +:1087F00040F8F40E1517E0697EC6EA19289BFDEAD9 +:10880000129EF0090009160EF7E520081C580C0905 +:1088100010094038F2061504E06A27FAEA1AEAA1BC +:10882000EDE913C6F00A000A1C06FDEB20080C58FF +:108830000A0A100A4068F405150BE0693085EA1948 +:10884000D4EFEBEA1355F00900090C05EDEE200812 +:1088500016090A58408B1009E06A1D05EA1A0488B7 +:10886000EBE62008F60A000AF20B1510F7E9130BE5 +:108870000A0B16581C0A100A40B8F40E1517E069C6 +:10888000D039EA19D9D4FDEA129EF0090009160E72 +:10889000F7E520081C580C09100940E8F2061504F9 +:1088A000E06A99E5EA1AE6DBEDE913C6F00A000A88 +:1088B0001C06FDEB20080C580A0A100A4118F405A2 +:1088C000150BE0697CF8EA191FA2EBEA1355F009D1 +:1088D00000090C05EDEE200816090A58405B100946 +:1088E000E06A5665EA1AC4ACEBE62008F60A000A0C +:1088F000F20B15101C0AF7E9130BE0692244EA1980 +:10890000F4290A0B1658100A4032F40E15171202F9 +:10891000FDEA129EEA0811FF160E409AFDE81008C3 +:10892000E069FF97EA19432A1658F40900090A0971 +:108930000C0241061002F60811FFE40A1506F5E2E2 +:1089400013AA1C0AF5E810081C58F2080005E06993 +:1089500023A7EA19AB941206FC0811FFEC0B000BDD +:10896000EA06150AEDE513661406EDE8100814583A +:10897000F6080008E069A039EA19FC93F00B150F1E +:10898000FA243942F7E8131BE80900050C0BEA0E3C +:10899000000EF40811FFF7E810080C58E06959C3FD +:1089A000EA19655BFC08000540E2EA0E15151202A3 +:1089B000FDE512BEEC0811FF160EFDE81008165872 +:1089C000E40A000AE069CC92EA198F0CF40800026C +:1089D0004068F00900090C09E40A1506F60811FFC1 +:1089E000F5E213AA1C0AF5E810081C58F208000268 +:1089F000E069F47DEA19FFEF40C1FC0811FF1201A4 +:108A0000E406150AE20B000BE0695DD1EA198584E2 +:108A1000EDE213661406EDE8100814584045F60818 +:108A200000011205E20B150FEA0E000EF7E1131B11 +:108A3000F40811FF0C0BE0697E4FEA196FA8F7E804 +:108A4000100840A30C581203E60A000AFC080005AF +:108A5000EC0811FFEA0E1515FDE512BE160EFDE835 +:108A600010081658F4080003411AF60811FFE069CF +:108A7000E6E0EA19FE2CF4090009E60A15060C09DD +:108A8000F5E313AA1C0AF5E810081C58F2080003C5 +:108A90004088E0694314EA19A301F00900091609A6 +:108AA000FC0811FF40FBE605150AEBE3136514050E +:108AB000EBE810081458F2080008E06911A1EA195F +:108AC0004E08F6090009F20E000EF006150FE069D7 +:108AD0007E82EA19F753EDE81316F40811FF0A062F +:108AE000EDE810080A58FC080001407E120EEA0862 +:108AF00011FFFC0A000AE20E1515FDE112BE0C0E74 +:108B0000FDE810080C58F40800094128F20A15067F +:108B1000F5E913AA1C0AF4080009E068F235EA181E +:108B2000BD3A990940D91009EC0811FFF205000B74 +:108B3000F5E8100840091C58720CF6080001E069BD +:108B4000D2BBEA192AD740581208E20B150AF006E0 +:108B50000009F7E1136BFC0811FF140BF7E810088C +:108B60001458F208000640B8E069D391EA19EB8680 +:108B7000F0090009F20E0008F40A11FF400EEC099A +:108B8000150FF3E613191609F20C000CF3EA100A9C +:108B9000165AF00A0006EC081515F1E612B8100C8A +:108BA0009D0C401A7408120895084028700916098F +:108BB00091092EDDD832D703EBCD40E03809764855 +:108BC000F1D8C066F608000AF56900181895F00A91 +:108BD000113F1697F6080008F0CCFFE7587AE08BB3 +:108BE0000056300BF01F002DEEC6FFE8EECCFFA8BC +:108BF0000C9B1798178917BAF3E8108917A8F1EAA0 +:108C00001088F3E8110916A9183BCF410C9B0E9C64 +:108C1000F01F0023338A300B0C9CF01F00200C9BAC +:108C2000ECCCFFC81798178917BAF3E8108917A872 +:108C3000F1EA1088F3E8110916A9183BCF416E48F4 +:108C40006E590C9B0E9CEF480050EF490054F01FEA +:108C500000140E9BEECCFFF01798178917BAF3E8B3 +:108C6000108917A8F1EA1088F3E8110916A9183B32 +:108C7000CF410E9B0A9C310AF01F000A0E9C304A1D +:108C8000300BF01F0006E3CD80E0208A300BEEC6EB +:108C9000FFE8F01F0002CC4B800091D0800281FCE5 +:108CA000800091DCEBCD40FC1493784AF40300384B +:108CB000103AF9F98005F9F9B005F7B90BFFF9F9A0 +:108CC000BA059948E608161DF20800089958189444 +:108CD0001692F1DAC066C381F8C5FFE8E043003FB1 +:108CE000E088002C3006EAC7FFC0E406000B340A17 +:108CF0000A9CF01F00290A9B1798178917BAF3E8F6 +:108D0000108917A8F1EA1088F3E8110916A90E3B9B +:108D1000CF410A9B089CF01F00212C06E6060108A3 +:108D2000E048003FFE9BFFE3E6C80040E7D8C006EE +:108D3000E018FFC02C081002069A049B0A9CF01F42 +:108D40000016E3CD80FCF00711402E88100C0E3386 +:108D5000C1D30E9AF01F0010E8C5FFE8E8CCFFA8C9 +:108D60000A9B1798178917BAF3E8108917A8F1EA30 +:108D70001088F3E8110916A9183BCF410E130E0213 +:108D80000A9B089CF01F0005CAAB069AF01F000260 +:108D9000E3CD80FC800091DC800281FCEBCD40FCC7 +:108DA000216DE0682301EA186745E06EAB89EA1E91 +:108DB000EFCD30075008501EE068DCFEEA1898BA84 +:108DC000E06E5476EA1E1032504750575028503EFD +:108DD00018931292580CC140149416951A962FF7B6 +:108DE000090A0B0B1A9CF01F00080E33FE9BFFF9BB +:108DF0001A9B049CF01F00052EADE3CD80FC1A9653 +:108E0000CF8B000080028CA480028BB8D431FACDC5 +:108E10000088501C500B14931292109142B0585A73 +:108E2000E08B0056E04B0040E08B0054FAC4FFF8A2 +:108E3000340A300B089CF01F002E400A401B089C8F +:108E40000896F01F002CFAC5FFB808970D88EC189B +:108E500000360CC80A36CFB1340851845128580363 +:108E6000C110FACCFF9CFACBFFB4300AE60E150213 +:108E7000E40A030818A8E20A030916A92FCA1C3A33 +:108E8000CF81E6CCFFFF00990A9AFAC3FFA0069BA8 +:108E9000F01F0019340A300B089CF01F0015400A1F +:108EA000401B089CF01F00130F88EC18005C0EC8D4 +:108EB0000C37CFB1310C3408513C5184519000999A +:108EC0000A9A069B5128302CF01F000B2DEDD8324A +:108ED000FAC6FF881A9A0C99FACBFFFC301CF01FD7 +:108EE0000006310850165008CA2B0000800091D0AF +:108EF000800091DC80028D9CD401202D501A5009F5 +:108F0000301A1AD8FAC9FFF8FAC8FFFCF01F00039C +:108F10002FFD2FEDD802000080028E0C5EFC5EFE5D +:108F20005EFCD703EBCD40C01896F01F00061897E3 +:108F3000C0500C9A300BF01F00040E9CE3CD80C093 +:108F400080009200800091D0D401F01F0002D80A66 +:108F500080014600D401F8CBFFFCF01F0002D80AC4 +:108F6000800145D4780C580C5E0C3008F948004C50 +:108F7000780C580CCFC15EFC580CF9FC10435EFC19 +:108F8000580CF9B80100F9F81A435EFCEBCD40E04B +:108F9000189716961495314CF01F0005F9F71A032F +:108FA000F9F61A04F9F51A02E3CD80E080028F2465 +:108FB000EBCD40E01696149578075807C160580627 +:108FC000C080306A0C9BEECCFFC0F01F000AC0A12D +:108FD0005805C0B0EECCFFFC310A0A9BF01F00051B +:108FE000C0406E075807CEC10E9CE3CD80E0000064 +:108FF0008000917CEBCD4040781820181696991887 +:10900000784B78390C9C5D190C9CF01F0003E3CD64 +:1090100080400000800091E8EBCD4080202D300A98 +:109020001897189B49BCF01F001C300A0E9B49BCC6 +:10903000F01F00196E085808C2201A9CF01F001873 +:109040006E08400A70EC0E993008141C109BF8084A +:109050000C4C490A2FFCF01F00136E2BF6FA010C82 +:10906000580AC1006E08400A712C0E99141C300871 +:1090700048AAF8080C4C109BF01F000A2FEDE3CD16 +:109080008080F6CBFEB80E9CF01F0007CF80CEBBD1 +:10909000800290E4800274008002913080028F543C +:1090A0008002747480028FB0EBCD40C01896580CCB +:1090B000C1407809300899085809C031C0880E9914 +:1090C0007207129CF01F00065807CFA10C9CF01FDE +:1090D00000050C9CF01F0002E3CD80C0800091E8E9 +:1090E00080029018EBCD4080202D18971A9CF01F1D +:1090F000000E6E0A580AC0C1C1087408149B8F087C +:10910000300A0E9CF01F00096E0A580AC06074E90C +:1091100040081039FE9AFFF30E9CF01F00052FED5A +:10912000E3CD808080028F5480028FF480029018FB +:10913000D4013008782AF548010C7829F2FC0104A2 +:10914000F01F0002D8020000800255ACD43120CDBF +:109150001096782814941293E04A00205FBAF0F930 +:109160000160189758295F18169241511448C05051 +:1091700030060C9C2F4DD832354CF01F00621890F1 +:10918000CF80089A049B2ECCF01F005F81D4FAC9CF +:10919000FFE450965083FAC5FFF84DC81AD5303A0F +:1091A000089B049C4DA65086F01F005AE0C8FFFCA7 +:1091B0000A9B5018310A109CF01F0053FACCFFD4C0 +:1091C000F01F0055E0C8FFC0502840BC6E29F2F8DF +:1091D0000150F808000881E86E2AF4FB0150F4F908 +:1091E0000154E06A851FEA1A51EBB739F20A0648C2 +:1091F000301AA599180981FAE1490048306A402CD3 +:10920000069BF01F0041E141004C2FFD6E06580601 +:10921000C2903005C0680C956C0C580CC58018962F +:10922000ECCBFFC0306A069CF01F003CCF516CD8DD +:109230000838C5505805EDF80000EFF80A00EDF8C1 +:109240001000EBF81A006E29F2F8010C0C38F9B88E +:109250000000F3F80A430C9B301A0E9CF01F0030FC +:109260006E066E1859F8E08A00155806C3200C9A4D +:1092700015088F086E28F0F90128ECCBFFC0720C9E +:1092800072F85D180C9B300A0E9CF01F00256E06CC +:109290005806C1F060EA6CE8103AC074C1A872E8E0 +:1092A0001438E089000612966C095809CF9181099B +:1092B0008D006E2C6E18400A401B2FF88F18F8F99D +:1092C00001280096720C72E85D18C54B6E06CCAB97 +:1092D00081068F000E9CF01F0013CECB089A049BD2 +:1092E000ECCCFFECF01F000DCA61310A400BECCC56 +:1092F000FFFCF01F000AC9F1009CF01F000BC3AB7C +:1093000080028F24800091DC8003DB248003DB9CBF +:109310008002B14480028F548000917C80028FF4DF +:1093200080029018800091E8EBCD4080189E78076D +:10933000580BC06116970E9CE3CD80806E075807CE +:10934000CFB06F381638CFB11AD814997C286EDA9E +:10935000F0C8FEC8EECBFFEC1C9CF01F00092FFDEF +:10936000580CF8071700EFF8100EF9F81A0EF80766 +:109370001710F9B80101F9F81A14CDEB8002914CDD +:10938000EBCD40FC1897300CEF4C010C1496129268 +:109390001094EEF50108580BC080169A189B0A9C91 +:1093A000F01F0016EF4C010C58065F13EEFC010C89 +:1093B000580C5F09F3E30008C16158045F18F3E833 +:1093C0000008C0A05803C0800C9A049B0A9CF01FA0 +:1093D000000CEF4C010C580CF9BC00FFF9BC01006B +:1093E000E3CD80FC300A0C9B0A9CF01F00045F094F +:1093F000EF4C010CCE3B000080028FB0800293281E +:109400000000000000000000EBCD4080580CC100BF +:10941000F8F901103008F94801105809C031C08826 +:109420000E997207129CF01F00045807CFA1E3CDDC +:1094300080800000800091E8EBCD40C01897580C68 +:10944000C250F8F801245808C210189B300A491C71 +:10945000F01F0011EEFC0124F01F00103006306AEE +:109460000C9BEF460124EECCFEE4F01F000DEEFC59 +:109470000114F01F000CEF460114EEFC0118580C0B +:10948000C050F01F0008EF460118E3CD80C0000077 +:109490008002996880027400800256EC800091D0AE +:1094A00080028174EBCD40F8205D189716951494D6 +:1094B000F8F601245806C0503FFC2FBDE3CD80F8DC +:1094C000F8FA012817D81AD817C91AD917B81AD80C +:1094D00017A91AD917981AD81789301B1AD9740CDA +:1094E0004C6AF01F0047EEC3FEC81AD60E984C59BE +:1094F000E06A88C7069BEEFC0140F01F0043EF4C7A +:1095000001142F9D580CC6F0EEFC0144580CC0E02D +:109510001AD6069B0E984BB9E06A88C7F01F003A2E +:10952000EF4C01182FFD580CC5E0340CF01F00372C +:109530001896C5B0EEF8012870099909EEF80128CF +:109540003019700A4B2899199928994A99374B185C +:10955000EEF9012C998899599967EEF8012871095B +:1095600099A9EEF80128711999B9F01F002BEF4C59 +:109570000124C3D0314A300B1A9CF01F0028EEF9A9 +:1095800001305804E9F8105FFBF81A03300650293F +:109590001A9A089B50165006EEFC0124F01F00207A +:1095A000306830593FFAEEFC0124149BF01F001D77 +:1095B000306A0A9BEECCFEE4F01F001B301BEEFC71 +:1095C0000124F01F001A301BEEFC0124F01F0018CC +:1095D0000C980E99497A0C9BEEFC0158F01F00166E +:1095E0000C9CC6CB3FECC6AB3FCCC68B0C9CF01F93 +:1095F00000133FDCC63B00008003DBA880023A1A60 +:1096000080029AF08002819C80028F2480029A243A +:10961000800299C48002609C800091D08002581C16 +:1096200080025564800091DC800261D4800261E890 +:109630008002996880027474800091E8EBCD40FC50 +:109640001897F8F801105808C6F0F8F801284CAA45 +:10965000700C301BF01F0049EEF801245808C0A020 +:10966000EEF801284C6A700C301BF01F0044E3CD6B +:1096700080FCEEF801605828CF41EEF80128700C0C +:1096800070295D19587CCED1EEF8016C5818CE9136 +:10969000EEF501105805C410EEC2FEB8EAC3FFFC97 +:1096A000300A069BEEFC0108F01F0036306A189461 +:1096B000069B049CF01F0034C0605804C3706948C6 +:1096C0005808C341EB3800091AD8EB3800081AD8FB +:1096D0000BF81AD80BE8EEF601281AD80BD91AD9CC +:1096E0000BC84AAA1AD8301B6C0CF01F00242FADEF +:1096F0005804C090EEF90128E8CAFFFC069B720CE2 +:1097000072E85D186A080A9CEF480110F01F0020FB +:10971000EEF501105805CC31EEF8012849DA700C4D +:10972000301BF01F0016E3CD80FCEB3800091AD87F +:10973000EB380008EEF601281AD80BF81AD80BE817 +:109740001AD80BD91AD90BC8493A1AD8301B6C0C45 +:10975000F01F000A6A08069BEEFA0134EF48011078 +:109760000E9CF01F000E0A9CF01F00092FADE3CDE8 +:1097700080FC00008003DBEC80023A1A8003DC14DA +:1097800080028FB08000917C8003DCA0800091E893 +:109790008003DCFC8003DC4C800294A4EBCD40F819 +:1097A0001695189414931297F8FB0134580BC05077 +:1097B000F6F801485808C5D15807C4C0E8F60110AA +:1097C0005806C4A03007C0680C976C0C580CC440F5 +:1097D0001896306A0A9BECCCFFFCF01F002CCF518E +:1097E0005807EDF81000EFF81A00EDF80000E9F85E +:1097F0000A44E04303E7E08A003BE8FA0110580A14 +:10980000C4006C3B74381638C065C3B8723816385B +:10981000C054129A74095809CFA18D0995061AD31C +:109820000BD80B8CE8F601281AD80BC91AD90BB83B +:109830001AD80BA91AD90B98495A1AD8301B1ADC16 +:109840006C0CF01F0014089CF01F00132F9DE3CD3B +:1098500080F8E3CD80F8310CF01F00101896C0F0AE +:10986000306A0A9BECCCFFFCF01F000D8D33CC6BF3 +:109870000A9AF8FC0108F01F000BC9FBE3CD80F841 +:109880008D0AE9460110CCCB8000917C8003DD2459 +:1098900080023A1A8002963C80028F24800091DC7C +:1098A00080029328EBCD40F8208D169414971895DC +:1098B000F8F801345808C470F01F0027EEC6000104 +:1098C000C426E068009C1A93EC080248E8080007E8 +:1098D000EAC4FEB8C0682016EEC7009C5806C3351F +:1098E000EAF901346EAA7258103ACF61724BEECC8D +:1098F000FFFAF01F001ACF01306A089B0E9CF01F80 +:109900000017CEA0EEFB0080580BCE601A9AEECC6A +:10991000FFA8F01F0013CE01189A0E9BEAFC010865 +:10992000F01F0010C13079485808CD604048EDB8AC +:109930000000CD213019E06A03E80E9B0A9CF01F5D +:10994000000ACCAB2F8DE3CD80F84048F3D8C0019E +:10995000CF3B0000800294088000917C8002BD68AB +:1099600080028FB08002979CEBCD4060F9380121D6 +:10997000F8F501281AD8F93901201AD9F938011F48 +:109980001AD8F939011E1AD9F938011D1AD8F9392E +:10999000011C489A1AD9302B18966A0CF01F000740 +:1099A0000C9CF01F00070C9CF01F00062FADE3CDB0 +:1099B000806000008003DD6C80023A1A80029438D7 +:1099C0008002963CEBCD40E0201D1897F8F801147A +:1099D0005808C0613FF60C9C2FFDE3CD80E0F8F8FD +:1099E0000128300C5C791ADC5C5B700C70D6FAC80C +:1099F000FFFC5D162FFD1895580CCED01899400825 +:109A0000E06A88C7EECBFEE4EEFC0114F01F000410 +:109A100018960A9CF01F0003CDFB000080028154C1 +:109A2000800091E8EBCD40E0208D14971896580BFC +:109A3000C2614A781AD8EEF60128EF3801211AD807 +:109A4000EF3901201AD9EF38011F1AD8EF39011E5A +:109A50001AD9EF38011D1AD8EF39011C49DA1AD981 +:109A6000302B6C0CF01F001C0E9CF01F001C0E9C79 +:109A7000F01F001B2F9D2F8DE3CD80E01A95320A39 +:109A80001A9BF01F0018C1211A9B320AEEF801340C +:109A90008F8A1AD8EEC9FEE4EEC8FEC8EEFC0108B3 +:109AA000F01F001149182FFDCC6B0C9C310A1A9B3A +:109AB000F01F000CC090EEF8012848DA700C302B33 +:109AC000F01F0005CB7B1A9B310ACE1B8003AD2C07 +:109AD0008003DE1880023A1A800294388002963C95 +:109AE000800257CC8002914C8003DDB48003DDCC32 +:109AF000EBCD40F81897169514931294F8F80124BA +:109B00005808C090F8C6FEE4306A48BB0C9CF01FB1 +:109B1000000BC031E3CD80F80C9C306A0A9BF01F2B +:109B20000007CF910899069A0A9BEEFC0124F01FCA +:109B30000004CF1B800294008000917C800261FCB5 +:109B4000EBCD40F8FACD01001293109418961697B9 +:109B5000149530081A99F2080B082FF8E048010014 +:109B6000CFB1300E1A9C1C9BEC0B0709198AFC0A1A +:109B700000081208FAC9FF00FDD8C0081C09F33814 +:109B8000FF0018C8F36AFF002FFBFAC8FF000E3B66 +:109B9000F9BB0200103CCE915805C4C0300E1C9792 +:109BA0001C9CF8C8FFFFFACAFF00F9D8C008180AC1 +:109BB000F53BFF00F60E0008FAC9FF00FDD8C0080B +:109BC0001C09F338FF00F568FF00F36BFF002FF767 +:109BD0000E35FE9BFFE85804C2A006963007F8C871 +:109BE000FFFFFACAFF00F9D8C008180AF539FF00CC +:109BF000F20E0008FACBFF00FDD8C0081C0BF738A6 +:109C0000FF00F568FF00F769FF00F538FF00100955 +:109C1000F3D9C008FACAFF00120A0D89F538FF000F +:109C200012580CC82FF70E34FE9BFFDB2C0DE3CD32 +:109C300080F80A9E0A9CCD0BD401129E16981899A2 +:109C40001C9B149C300AF01F0002D80280029B402B +:109C500000000000D431FACD0180340AFAC4FEC0FD +:109C6000510C089CF01F04BF688A516A689950A97A +:109C700068A8509868B65086684568216830416683 +:109C800050E5685250D2686A50CA687950B968087D +:109C90005158E3E8200868D50C580A586812F00AB1 +:109CA000150150F2F5E813FA517A68E868F640E5D4 +:109CB00040A9105940980C580A5802580059F00A07 +:109CC00015010459F5E813FAF20215014178E5E9A6 +:109CD00013F2519A518240C54089105968C80458FE +:109CE00040E20A58045840D6F00A15010C59F5E82C +:109CF00013FA005951AA419840B640D5416240CA72 +:109D0000F2071501EFE913F768D9105968E80E5802 +:109D1000045814580C590A59F0051501F20615019A +:109D2000EBE813F5EDE913F640B851C551B641A281 +:109D300068F940AA416504591459105941780C58E2 +:109D400040960C580A58F2021501F00A1501E5E98F +:109D500013F2F5E813FA41C851EA51D2408640A502 +:109D6000409A418910594198045868C204581458BF +:109D70000C590A59F0051501F2061501EBE813F527 +:109D8000EDE913F6408851F6520541E268DA68C5FC +:109D9000EFE220091459105941A80C5868E60C58F4 +:109DA0000A58F2021501F00A1501E5E913F2F5E887 +:109DB00013FA52124208522A41B968F668D568EA85 +:109DC000105941C804584172045814580C590A5982 +:109DD000F0051501F2061501EBE813F5EDE913F6B0 +:109DE0005245523668F84222418A417541D9045998 +:109DF0001459105941E80C5841960C580A58F2026F +:109E00001501F00A1501E5E913F2F5E813FA4248E5 +:109E1000418641A5525241F9105942080E59045841 +:109E20000C5941920A580458526AF20A1501F5E990 +:109E300013FAF0091501F3E813F9426841B641C578 +:109E400041A2527A52894219105942280C59145889 +:109E50000E590A580458F20A1501F5E913FAF009E7 +:109E60001501529AF3E813F9428852A941D641B537 +:109E700041E2423910594248145841CA0458145812 +:109E80000C5941FA0A59F0051501F2061501EBE8E3 +:109E900013F5EDE913F641D852C542A241E552B699 +:109EA00042590459145942CA105942680C58420682 +:109EB0000C580A5841F6F20E1501F0021501FDE9A1 +:109EC00013FEE5E813F2421942781458420A42257B +:109ED000125842890C581C59F00615010A59EDE830 +:109EE00013F61459F20A1501F5E913FA0C951493B7 +:109EF000423952E652FA4216424A52D24298045825 +:109F0000125842A90C580A5942261459F00A150150 +:109F1000F5E813FA0C59530A1496F2081501425A3F +:109F2000F1E913F84239109C531842B806581458F6 +:109F3000426A125842C90C591459424A1459F00A3B +:109F40001501F5E813FAF2081501F1E913F8109B71 +:109F500053384278FDEC20091059425810595019D5 +:109F60004289E5EA200812584269125840195008FF +:109F70004018A178F1E913F8400953484008A17846 +:109F8000F1E913F853584298EBEB20091059427845 +:109F9000105942A850194349E7E92009105942884D +:109FA000105940185009532A4019A179F3E813F9C0 +:109FB000400853694009A179F3E813F953794358EC +:109FC000EDE8200942B810594298105942C850197A +:109FD0004369F9E92009105942A81059401850095D +:109FE0004019A179F3E813F9400853894009A17990 +:109FF000F3E813F943785399F5E8200942B81C595E +:10A00000105950194389F7E92009129842C9045898 +:10A010001258401950084018A178F1E913F8400986 +:10A0200053A84008A178F1E913F8434953B843987D +:10A0300010590A591C59501943A94358125840192C +:10A04000065804584012A172E5E913F253C2F00217 +:10A050001501E5E813F243B84369105943780C59E8 +:10A060000A5943C50A581858065853D2F202150126 +:10A07000E5E913F2F0091501F3E813F943D853F9B0 +:10A08000438910594398145904580C5916581858B4 +:10A0900053E243F54342F20C1501F0061501F9E9CC +:10A0A00013FCEDE813F643A943B80A5918580459AC +:10A0B0001459435A145816585406436A4402F20677 +:10A0C0001501F0051501EDE913F6EBE813F543482A +:10A0D00054255416435543C904591459105943D8AB +:10A0E000F20215010C58E5E913F2437654320C588C +:10A0F0000A58F00A1501F5E813FA544A890A442966 +:10A1000043864365437A43E8125843F90C5804598F +:10A110000A584392F0061501EDE813F654568916D5 +:10A1200004591459F2051501EBE913F55465892515 +:10A13000444243AA4389F9E2200814581258F00215 +:10A140001501E5E813F25472439544090C5943B6DE +:10A1500089320C590A59F20A1501F5E913FA548AA1 +:10A16000894A43C6446943A5441812580C580A58F2 +:10A17000F0061501EDE813F6549643BA4429045944 +:10A1800043D2895604591459F2051501EBE913F528 +:10A1900054A58965448243EA43C944380458145895 +:10A1A0001258F0021501E5E813F254B243D54449C0 +:10A1B0000C5943F689720C5944080A59446A045AE6 +:10A1C000105A0C5AF2061501EDE913F654C6447BF9 +:10A1D00089860C5BF4061501EDEA13F654E6441586 +:10A1E00044A243E9445889A60A5B045818581258F7 +:10A1F000F0051501EBE813F554D58995185BF602C7 +:10A200001501E5EB13F254F289B2444A4489449BA8 +:10A210000A590C5B4405442644A804581458F3E634 +:10A22000200A0C580A5A5028E0657999EA155A8292 +:10A23000504A410644325116441AEE050009F7E22D +:10A2400020081458E062EBA1EA126ED95038507918 +:10A25000040E0C99506EE068BCDCEA188F1B0C9A57 +:10A26000100C2F8A505C512A1306511941087403AF +:10A27000720C2F485138410A2F0A514A700A41483E +:10A28000700941580A08F0090009EC081505F1E6C3 +:10A2900013B8F2080008F5E3200918691459F00909 +:10A2A000000740F80A08F00A0009F80B151EF7EC41 +:10A2B000122BF7E320080C680658F2080008EE0994 +:10A2C0001505F3E713B9EC0A151EF009000EF5E6C3 +:10A2D000122AFC091505F7EA2008F3EE13B9EFE896 +:10A2E000000816580A01EE0C151E0601F9E7122C9B +:10A2F0001001F9EA200812011C68E209150514583A +:10A30000F3E113B90A001600100040E812000A0831 +:10A31000F00A0009FC0B151EF7EE122BF7EC2008D3 +:10A3200002681858F2080008E0091505F3E013B9AF +:10A33000F009000640D80A08F00C0009E20A151ED0 +:10A34000F5E1122AF5EB200800681658F20800081B +:10A35000EC091505F3E613B9F009000E40C80A0828 +:10A36000F00B0009E00C151EF9E0122CF9EA2008A8 +:10A370000C681458F2080008FC091505F3EE13B92F +:10A38000F009000340B80A08F00A0009EC0B151E9A +:10A39000F7E6122BF7EC20081C681858F2080008A2 +:10A3A000E6091505F3E313B9F009000641680A0848 +:10A3B000F00C0009FC0A151EF5EE122AF5EB200838 +:10A3C00006681658F2080008EC091505F3E613B9FB +:10A3D000F009000E40A90A091609E60C151EF9E35A +:10A3E000122CF9EA20080C681458F2080008FC093D +:10A3F0001505F3EE13B9F009000340980A08F00AB6 +:10A400000009EC0B151EF7E6122BF7EC20081C6870 +:10A410001858F2080008E6091505F3E313B9F00926 +:10A42000000640890A091809FC0A151EF5EE122AD1 +:10A43000F5EB200806681658F2080008EC09150527 +:10A44000F3E613B9F009000E68C80A08F00B00091A +:10A45000E60C151EF9E3122CF9EA20080C681458D2 +:10A46000F2080008FC091505F3EE13B9F009000124 +:10A4700068D90A091409EC0B151EF7E6122BF7EC44 +:10A4800020081C681858F2080006E2091505F3E1D7 +:10A4900013B968E8EC0900030A08F00C0009FC0A8B +:10A4A000151EF5EE122AF5EB200802681658F20880 +:10A4B0000008E6091505F3E313B9F009000E68F981 +:10A4C0000A091609E20C151EF9E1122CF9EA200816 +:10A4D00006681458F208000BFC091505F3EE13B9D1 +:10A4E0004178F60900000A08F00A0009E606151E80 +:10A4F000EDE31226EDEC20081C681858F208000A5B +:10A50000E0091505F3E013B9F409000341890A09CC +:10A510001809FC0A151EF5EE122AF5E62008006857 +:10A520000C58F208000CE6091505F3E313B941983D +:10A53000F80900010A08F0060009E00B151EF7E013 +:10A54000122BF7EA200806681458F2080008E209FE +:10A550001505F3E113B94077F009000E1407FC0963 +:10A560001505E60A151EF3EE13B9F5E3122AF5EB0D +:10A57000200802681658EE080008F009000341A8F8 +:10A580000408F00B0009E20C151EF9E1122CF9EA9F +:10A5900020081C58F2080008E6091505F3E313B972 +:10A5A000F009000541B904091409FC0B151EF7EE6A +:10A5B000122BF7EC20080658F2080008EA091505E6 +:10A5C000F3E513B9F009000641C80408F00C0009CE +:10A5D000E60A151EF5E3122AF5EB20080A58F208E0 +:10A5E0000008EC091505F3E613B9F009000E41D98E +:10A5F00004091609EA0C151EF9E5122CF9EA2008DF +:10A600000C58F2080008FC091505F3EE13B9F0091F +:10A61000000541E80408F00A0009EC0B151EF7E6F6 +:10A62000122BF7EC20081C58F2080008EA0915055F +:10A63000F3E513B9F009000641F904091809FC0A09 +:10A64000151EF5EE122AF5EB20080A58F20800084C +:10A65000EC091505F3E613B9F009000E42080408E9 +:10A66000F00B0009EA0C151EF9E5122CF9EA200896 +:10A670000C58F2080008FC091505F3EE13B9F009AF +:10A680000005421904091409EC0B151EF7E6122BFC +:10A69000F7EC20081C58F2080008EA091505F3E554 +:10A6A00013B9F009000642280408F00C0009FC0A5E +:10A6B000151EF5EE122AF5EB20080A58F2080008DC +:10A6C000EC091505F3E613B9F009000E4239040947 +:10A6D0001609EA0C151EF9E5122CF9EA20080C58A7 +:10A6E000F2080008FC091505F3EE13B9F00900059E +:10A6F00042480408F00A0009EC0B151EF7E6122B7D +:10A70000F7EC20081C58F2080008EA091505F3E5E3 +:10A7100013B9F0090006425904091809FC0A151E6C +:10A72000F5EE122AF5EB20080A58F2080008EC09A9 +:10A730001505F3E613B9F009000E42680408F00BA2 +:10A740000009EA0C151EF9E5122CF9EA20080C584C +:10A75000F2080008FC091505F3EE13B9F00900032F +:10A76000427904091409EC0B151EF7E6122BF7ECDD +:10A7700020081C58F2080008E6091505F3E313B990 +:10A78000F0090005428904091809FC0A151EF5EEB6 +:10A79000122AF5EB20080658F2080008EA09150508 +:10A7A000F3E513B9F009000E429904091609E60C05 +:10A7B000151EF9E3122CF9EA20080A58F208000BDA +:10A7C000FC091505F3EE13B9F609000042A90409C6 +:10A7D0001409EA06151EEDE51226EDEC20081C58BA +:10A7E000F208000AE0091505F3E013B9F4090003C3 +:10A7F00042B9FC0A151E0409F5EE122A1809F5E6FD +:10A80000200800584065F208000C1405E6091505FB +:10A81000E00B151EF3E313B9F7E0122BF809000162 +:10A82000F7EA200AE2081505065AF1E113B842C911 +:10A8300004090C091409E60A151EF208000EF5E3D6 +:10A84000122AF5EB20080258EA080008E066BCDC92 +:10A85000EA168F1BFC091505F3EE13B9F009000089 +:10A8600042D80C08E20C151EF00B0002F9E1122C84 +:10A87000FDEC0008FDEC100914691049E00815050D +:10A88000F1E013B8E4090009F208000242E80C08FC +:10A89000FC0B151EF00A0005F7EE122BE1EB000889 +:10A8A000E1EB100918691049E4081505EA090009E7 +:10A8B000F1E213B8E00A151EF2080005F5E0122ACD +:10A8C00042F9E5EA00080C09F20C0003E5EA100978 +:10A8D00016691049EA081505F1E513B8E6090009FB +:10A8E000F208000343080C08E40C151EF00B0006E8 +:10A8F000F9E2122CEBEC0008EBEC1009146910499A +:10A90000E6081505EC090009F1E313B8EA0B151E7A +:10A91000F2080006F7E5122B4319E065BCDCEA15E6 +:10A920008F1BE7EB00080A09F20A000AE7EB10099F +:10A9300018691049EC081505F1E613B8F409000987 +:10A94000F208000243280A08E60A151EF00C000C63 +:10A95000F5E3122AEDEA0008EDEA1009166910493C +:10A96000E4081505F8090009F1E213B8EC0C151E0E +:10A97000F208000EF9E6122C4339E5EC00080A094A +:10A98000F20B000BE5EC100914691049FC081505E1 +:10A99000120BF1EE13B84349F6080005E40B151E3F +:10A9A000F7E2122BE062BCDCEA128F1BFDEB000821 +:10A9B0000409F20A000AFDEB100918691049EA08B7 +:10A9C0001505F1E513B8F4090009F208000643582B +:10A9D0000408FC0A151EF00C000CF5EE122AEBEA36 +:10A9E0000008EBEA100916691049EC081505F8098A +:10A9F0000009F1E613B8EA0C151EF208000EF9E59D +:10AA0000122C4369EDEC00080409F20B000BEDEC8D +:10AA1000100914691049FC081505F1EE13B8F60980 +:10AA20000009F208000543780408EC0B151EF00A33 +:10AA3000000AF7E6122BFDEB0008FDEB1009186980 +:10AA40001049EA081505F4090009F1E513B8FC0AF4 +:10AA5000151EF2080006F5EE122A4389EBEA0008FB +:10AA60000409F20C000CEBEA100916691049EC0815 +:10AA70001505F1E613B8F8090009F208000E43982D +:10AA80000408EA0C151EF00B000BF9E5122CEDEC96 +:10AA90000008EDEC100914691049FC081505F609C9 +:10AAA0000009F1EE13B8EC0B151EF2080005F7E6ED +:10AAB000122B43A9FDEB00080409F20A000AFDEB82 +:10AAC000100918691049EA081505F1E513B8F409E9 +:10AAD0000009F208000643B80408FC0A151EF00C31 +:10AAE000000CF5EE122AEBEA0008EBEA10091669F1 +:10AAF0001049EC081505F8090009F1E613B8EA0C4D +:10AB0000151EF208000EF9E5122C43C9EDEC000801 +:10AB10000409F20B000BEDEC100914691049FC0854 +:10AB20001505F1EE13B8F6090009F208000343D841 +:10AB30000408EC0B151EF00A000AF7E6122BFDEBD9 +:10AB40000008FDEB100918691049F4090009E6082E +:10AB50001505F1E313B8F208000543E90409FC0AFE +:10AB6000151EF20C000CF5EE122AE7EA0008E7EADF +:10AB7000100916691049F8090009EA081505F1E5F8 +:10AB800013B8F208000E43F90409E60C151EF20B87 +:10AB9000000BF9E3122CEBEC0008EBEC1009146944 +:10ABA00010494057FC0815051407F1EE13B8F609D3 +:10ABB000000AEA0B151EF7E5122BFDEB0009F4085D +:10ABC0000003FDEB1008E60A15051868F5E313BA53 +:10ABD0001248EE080009F20A00054409E06AC1D6ED +:10ABE000EA1ACA6214091809FC06151EEDEE1226AF +:10ABF000EDEB20080658F2080008EA091505F3E510 +:10AC000013B9F009000A4419E068C1D6EA18CA620B +:10AC100010091609E60C151EF9E3122CF9E62008B6 +:10AC20000A58F2080008F4091505F3EA13B9EA0B0B +:10AC3000151EF0090003F7E5122B4429E065C1D683 +:10AC4000EA15CA620A090C09F7EC20081458F20840 +:10AC50000008E6091505F3E313B9F009000EFC0935 +:10AC60001505F3EE13B9F406151EEDEA1226443A63 +:10AC7000EDEB20080A0A0658180A100A120A44497D +:10AC80000A091609E60C151EF9E3122CF9E620084C +:10AC90001C58F2080008F4091505F3EA13B9FC057D +:10ACA000151EF0090003EBEE1225E6091505EBEC85 +:10ACB0002008F3E313B91458E062C1D6EA12CA625D +:10ACC000445B040B0C0BF406151E100BEDEA122668 +:10ACD000120BEDE52008F60915050658F3EB13B93C +:10ACE000446A040A180A100A4478F409000E040899 +:10ACF000F0050009E60A151EF5E3122AF5E620081C +:10AD00001658F2080008FC091505F3EE13B9F0090E +:10AD10000005448904090C09F60C151EF9EB122CE8 +:10AD2000F9EA20081C58F2080008EA091505F3E5BD +:10AD300013B9F009000344980408F00A0009FC0B59 +:10AD4000151EF7EE122BF7EC20080A58F20800083F +:10AD5000E6091505F3E313B9F009000E44A9040947 +:10AD60001809EA06151EEDE51226EDEB2008065837 +:10AD7000F2080008FC091505F3EE13B9F009000507 +:10AD8000EA091505F3E513B944BAE60C151E040AE1 +:10AD9000F9E3122C160AF9E620081C58100A120AC8 +:10ADA00044C904090C09FC0B151EF7EE122BF7EC35 +:10ADB00020080A58F2080002F4091505F3EA13B94D +:10ADC00044D8E409000EE069C1D6EA19CA62120843 +:10ADD000EA06151EF00C0009EDE51226EDEB200841 +:10ADE0001458F2080008FC091505F3EE13B9F00930 +:10ADF000000CE068C1D6EA18CA62F405151EF8090D +:10AE00001505EBEA1225F3EC13B944EA100AEBE658 +:10AE10002008160A1C58100AFC02151EF40900012D +:10AE2000E5EE1222E06AC1D6EA1ACA62E5E5200818 +:10AE3000E20915051858F3E113B944FB140B404A15 +:10AE40000C0BA17A100B44B8F609000E4049F5E945 +:10AE500013FA14584459F1E9200B4438E069C1D67B +:10AE6000EA19CA6289CAF7E820074108F806151EE0 +:10AE7000120AEDEC1226700CEDE22008120C0258BA +:10AE8000FC091505F3EE13B90A0AE203151E100AB0 +:10AE9000E7E11223120AE7E62008E069C1D6EA19C1 +:10AEA000CA621C5840354030A170E1E513F0E0095A +:10AEB000000BF4091505040BF3EA13B9100B402835 +:10AEC0004021120BE065C1D6EA15CA62A171E3E820 +:10AED00013F1E2050008F0060009FC02151EE5EE7C +:10AEE0001222E5E320081458F2080008F6091505B7 +:10AEF000F3EB13B9F406151EF009000EEDEA122665 +:10AF0000EE051501410AEBE713F5EDE220080A0C06 +:10AF10001658060CFC091505100CF3EE13B9120CAB +:10AF2000950C411972081C089308F609151E412A50 +:10AF3000F3EB1229740812089508413870090C09BE +:10AF4000910989D089E189F541466C080408089C7B +:10AF50008D08340A300BF01F00042A0DD83200008F +:10AF6000800091DC800091D0EBCD40F878581494AB +:10AF7000A37AF40800099959123AF9F98006F9F907 +:10AF8000B006F7B90BFFF9F9BA06FDD8C066E808B4 +:10AF9000161DF2080008996818951693E80E000926 +:10AFA000E049003FE08B000F3006FCCCFFE4E606F2 +:10AFB000000BEA0C000CE806010AF01F0014E3CDB8 +:10AFC00080F8FC061140FCCCFFE40C9AEA0C000C63 +:10AFD000F01F000EEACBFFE40A9CF01F000DECC846 +:10AFE000FFC11034E088000FE60600070E9B0A9CA4 +:10AFF0002C07F01F00072C06ECC8FFC11034FE9B85 +:10B00000FFF7300ECD3B0000800091DC80029C54A5 +:10B01000D421202D16961895300B1A94583BF9B868 +:10B020000B14F9B80818F60911FFEC08030AF3D954 +:10B03000C002A379F4090A4AE80B0B0A2FFB588BCC +:10B04000CEE1301A49EBC038301A49EB0C9CF01FA6 +:10B05000001E6C58E21801F8E04801C0CF61308A48 +:10B060001A9B0C9CF01F00183007EE081602EE0920 +:10B0700011FFEC08032AF3D9C002A379F4090A4AA4 +:10B08000EA070B0A2FF75947CF11300B340AECCCE3 +:10B09000FFE4F01F000E0E9A300B0C9CF01F000B0B +:10B0A000ECCCFFEC308A300BF01F00081A9C308A81 +:10B0B000300BF01F00062FEDD82200008003DE5871 +:10B0C00080029C508002AF68800091D0EBCD40FCA4 +:10B0D000217DE0682301EA186745E06EAB89EA1E2E +:10B0E000EFCD5008E068DCFEEA1898BA3007501E31 +:10B0F0005028E06E5476EA1E1032E068E1F0EA185B +:10B10000C3D250675057503E504818931292580C73 +:10B11000C140149416951A962FF7090A0B0B1A9C26 +:10B12000F01F00070E33FE9BFFF91A9B049CF01FD3 +:10B1300000052E9DE3CD80FC1A96CF8B8002AF6870 +:10B140008002B010D431FACD008C501C500B1493F7 +:10B150001292109142C0585AE08B0056E04B0040CA +:10B16000E08B0054FAC4FFF8340A300B089CF01F3F +:10B17000002E400A401B089C0896F01F002CFAC5C0 +:10B18000FFB808970D88EC1800360CC80A36CFB106 +:10B190003408518451285803C110FACCFF9CFACBD3 +:10B1A000FFB4300AE60E1502E40A030818A8E20A02 +:10B1B000030916A92FCA1C3ACF81E6CCFFFF0099DC +:10B1C0000A9AFAC3FFA0069BF01F0019340A300B3D +:10B1D000089CF01F0015400A401B089CF01F00133C +:10B1E0000F88EC18005C0EC80C37CFB1314C340816 +:10B1F000513C5184519000990A9A069B5128302C59 +:10B20000F01F000B2DDDD832FAC6FF881A9A0C9970 +:10B21000FACBFFFC301CF01F0006314850165008D6 +:10B22000CA2B0000800091D0800091DC8002B0CC5D +:10B23000D401202D501A5009301A1AD8FAC9FFF833 +:10B24000FAC8FFFCF01F00032FFD2FEDD80200000D +:10B250008002B144D43121AD5009502B501A1892BC +:10B2600042395809C6D0504850593008FAC7FFAC87 +:10B270005038FAC3FFD4FAC0FFC0FAC4FFE8049CF8 +:10B28000F01F003140382FF850381AD34038518819 +:10B2900040285168FAC8FF98519830484046517884 +:10B2A000B986FB380013FAC9FFA0FB68006B189B36 +:10B2B0000E98FB66006840454046302A1891B185DB +:10B2C000049CFB650069A986FB66006AF01F001FED +:10B2D000314A069B009CF01F001E2FFD40085818A5 +:10B2E000E08A001C301608983149069A029B049C9B +:10B2F000F01F0018314A089B069CF01F0015009AA9 +:10B30000089B17381589125814C80E3ACFB12FF67A +:10B3100040080C38FE99FFE940560C985946F9B69A +:10B320000B140C180C9A5058009B404CF01F00084E +:10B3300040585808C05040480C085048CA1B2E6D51 +:10B34000D8320000800091B88002B144800091DCC6 +:10B350008002B230D43120EDFACEFFA4109530082F +:10B3600018927C14149716911296FB680036FB68AD +:10B3700000377C00149CF01F00275804C3003018CD +:10B38000FAC9FFC9508850685097FAC8FFCA505C84 +:10B3900050B6507550A950C85934E0880023300782 +:10B3A000FAC3FFECFAC6FFDCC088FB680036E8078A +:10B3B00001055935E088001CE00700080C991AD8EF +:10B3C0002EC70698304A029B049CF01F00132FFDE5 +:10B3D000FB3800362FF80E34FE9BFFE92F2DD832B4 +:10B3E00008953007FAC3FFECFAC6FFDC0C99069803 +:10B3F0001A96049C1AD6029B304AF01F00070A9A3C +:10B400000C9BE007000CF01F00052FFD2F2DD832FC +:10B41000800091B88002B144800091DC00000000FF +:10B4200000000000EBCD4080129E1097584CC26087 +:10B43000E08A0013588CC140590CC101590B5F18A8 +:10B4400058FA5FA91248C0A130689D083039300C05 +:10B450008F09E3CD8080582CC1E0E3CFC080E04B62 +:10B4600000205F1859FA5FA91248CF8130689D0803 +:10B470003029300C8F09E3CD808058DB5F1858CA23 +:10B480005FA91248CEB130099D093018129C8F086F +:10B49000E3CD8080585B5F18584A5FA91248CF40BF +:10B4A000E3CFC080580C5E0CF8F8010C5808F9B8CE +:10B4B0000100F9F81A435EFC580CF9FB1A4C5EFCCB +:10B4C000580CF9FA1A51F9FB1A505EFC580CF9FBAA +:10B4D0001A415EFC580CC080586BE08800035EFD8A +:10B4E0004928F00B032F5EFEF94A016C5EFDF94A14 +:10B4F00001685EFDF94A01645EFDF94A01605EFD86 +:10B50000580ACF20F94A01585EFDF4C80001E0480E +:10B510000063FE9BFFEAF94A01545EFD580ACE40E3 +:10B52000F94A01505EFD00008003DE5CEBCD40E097 +:10B53000189716951496580CC130F8FC0180F01F2E +:10B54000001158055F0858065F091248C0B030085E +:10B55000EF480188EF480180109CE3CD80E0E3CF05 +:10B56000C0E00C9CF01F0008EF4C0180CF900A9BBC +:10B570000C9AF01F0006300CEF460188E3CD80E006 +:10B58000800091E880009200800091DCEBCD40E0EB +:10B59000189716951496580CC130F8FC017CF01FD2 +:10B5A000001158055F0858065F091248C0B03008FE +:10B5B000EF480184EF48017C109CE3CD80E0E3CFAD +:10B5C000C0E00C9CF01F0008EF4C017CCF900A9B60 +:10B5D0000C9AF01F0006300CEF460184E3CD80E0AA +:10B5E000800091E880009200800091DCEBCD40E08B +:10B5F000189716951496580CC130F8FC0174F01F7A +:10B60000001158055F0858065F091248C0B030089D +:10B61000EF480178EF480174109CE3CD80E0E3CF60 +:10B62000C0E00C9CF01F0008EF4C0174CF900A9B07 +:10B630000C9AF01F0006300CEF460178E3CD80E055 +:10B64000800091E880009200800091DCEBCD40FE0C +:10B65000189716961493580CC031E3CFC0FE7409A6 +:10B66000F8F801605828C5E0F8F1016CF8F50168B8 +:10B67000F8F201645979FE98FFF23DD8304AB68855 +:10B68000ECCCFFFEFEFB0238F01F008E30083019B4 +:10B69000ACF8ACE9ECC4FFF85905E08000A158858E +:10B6A000E08000AA5845E08100BC0A9AFEFB02181F +:10B6B000089CF01F00843018A8C8E8C9FFFB3008B8 +:10B6C000B288E8C5FFFA5902E08000905882E08114 +:10B6D000009F304A4FDB0A9CF01F007A3018AAC83E +:10B6E000EAC9FFFB3008B2882FA55811E080008A14 +:10B6F0005821E08100A5304A4F5B0A9CF01F007181 +:10B70000EAC9FFFCEC0811FE1208AC98F206010C25 +:10B71000CA56870CEEF501745805E08000C1E3CFEE +:10B7200080FEF8F8010CF8F2016C5808F9B801280D +:10B73000F9B80016F8FA0168F8F401641039C8E3A2 +:10B7400033083009B688B6B93018B6A8F6C5FFFC7C +:10B75000590AC6F0588AE0800082584AE081009772 +:10B760004DCB0A9CF01F00573018AAC8EAC9FFFB4E +:10B770003008B2882FA55904C6B05884E081007EF5 +:10B78000304A4D5B0A9CF01F004F3018AAC8EAC926 +:10B79000FFFB3008B2882FA55812C661304A4CFB17 +:10B7A0000A9CF01F0048EAC8FFFC300AB08AB09A31 +:10B7B000EAC9FFFAEEF8010C5808CA503018B288EE +:10B7C000EAC9FFF9EACCFFF8B28A310AEEFB010CB4 +:10B7D0002FCBF01F003CEAC9FFE8C95B304A4C0B95 +:10B7E000089CF01F0038C68B304A4BDB0A9CF01FC8 +:10B7F0000035C75B304A4B5B089CF01F0032C5CB5D +:10B80000304A4B8B0A9CF01F002FC7BB5812FE9189 +:10B81000FF26304A4B4B0A9CF01F002AC60B5825C6 +:10B82000FE91FF1D304A4B1B089CF01F0026C44BA5 +:10B83000304A4AFB0A9CF01F0023C97B5901FE9144 +:10B84000FF0E304A4ABB0A9CF01F001EC5AB304AAF +:10B850004A7B0A9CF01F001BC99B304A49EB0A9C9B +:10B86000F01F0018C82B5822FE91FEF9304A4A2BCF +:10B870000A9CF01F0014C98B5814FE91FEF0304A48 +:10B8800049EB0A9CF01F000FC81B582AFE91FEE7E7 +:10B89000304A49BB0A9CF01F000BC67BF01F001901 +:10B8A000EF4C0174FE90FEDB0C9B660AF01F000556 +:10B8B00066080A9CEF480178E3CD80FE8003DE989D +:10B8C000800091DC8003DEA08003DE8C8003DE7CC0 +:10B8D0008003DE888003DE808003E1EC8003E1E406 +:10B8E0008003DE9C8003DEA48003DE948003DEB44C +:10B8F0008003DEB08003E1E88003DEA88003DE84FD +:10B9000080009200D401580CC060F8CCFEC8306AA8 +:10B91000F01F0002D8020000800091DCD4011898CA +:10B92000580CC040918AF01F0002D802800091DCC0 +:10B93000EBCD40F8208D189416971493F6C6FFF0BF +:10B94000F8F501685885C2E0E8F801645818C1604C +:10B950006EC8E8F901286E0B1AD81AD66E2849CAA3 +:10B960001AD81AD3720C72666E186E395D162FCD06 +:10B97000580CC1552F8DE3CF80F86EC9E8FA012825 +:10B980006E0B1AD91AD66E291AD91AD3740C74668A +:10B990006E3948FA5D162FCD580CCED42F8DE3CFDB +:10B9A000C0F80C9B310A1A9CF01F000A0A9AEECBD1 +:10B9B000FFD8FACCFFF0F01F00070A9AEECBFFE0A9 +:10B9C000FACCFFE81A96F01F0003CBFB80039C38EB +:10B9D000800091DCD401580CC070F94B0134F8FCA4 +:10B9E0000108F01F0002D80280028F64D401580CB5 +:10B9F000C110F8F8010C5808C08070DAF0CBFFECE9 +:10BA0000998AF01F0005D802320A109B998AF01F0C +:10BA10000003D802800091DC800091D0EBCD408003 +:10BA20001897F01F000AEEF801287029700C5D19B4 +:10BA3000585CEFF80057F9B90001F1D9E008EFF8C8 +:10BA40000A57E3CD8080000080029438EBCD40C0DF +:10BA500018971696580CC190306AF8CCFEB8F01FB3 +:10BA6000000F308A300BEECCFF10F01F000D3008B5 +:10BA700030190C9BEF4800F8EF4900EC306AEECC2F +:10BA8000FEE4F01F0008C030E3CD80C00E9CF01F24 +:10BA90000006E3CD80C00000800091DC800091D0E2 +:10BAA0008000917C80029438EBCD40C016971496AC +:10BAB000F6F8010C1838C0D0768A78D8103AC03021 +:10BAC000E3CD80C0F8CBFFEC0E9CF01F000ECF91B1 +:10BAD0003008EF48010C5806CF41320A0C9B0E9CEF +:10BAE000F01F0009EEF90128301B720C72485D1836 +:10BAF000EEF801280C9A700C70390C9B5D19CE1B66 +:10BB00008000917C800091D0D431189716941493C2 +:10BB1000300B324A069CEE040005F01F0052EEC6C0 +:10BB2000FFFF0C35E0880034E8C800013DD2EE0884 +:10BB30000004C0D8E4091800C2B01499F2C8FFFE8E +:10BB40001007EEC6FFFF0C35E08800220F89E409DC +:10BB50001800C4B10837C1B00D8A580AC180F4C8B2 +:10BB6000FFFEEE0800081035C4733308F009180012 +:10BB7000CE2187270D882FE887380D89F2C8FFFE70 +:10BB80001007EEC6FFFF0C35FE9BFFE2D83A580ABD +:10BB9000CFE03058F00A1800E08B003FEEC8FFFB02 +:10BBA0001035E08B002B14993061E2091800FE98E3 +:10BBB000FFC7EEC0FFFE304A4ABB009CF01F002BBF +:10BBC000C3900D89E2091800FE98FFBA009C304A24 +:10BBD0004A7BF01F0026C071EEC9FFFA87790D88F5 +:10BBE000204887880D89CABB0D8AF4C8FFFEEE087D +:10BBF00000081035CBB2DC3A14993138F00A18003D +:10BC0000FE98FFD4304A49BBEECCFFFEF01F001770 +:10BC1000C1900D89CCAB304A497BEECCFFFEF01FC2 +:10BC20000013C0610FE93018F0091800C1000D8A37 +:10BC3000CB6BEEC9FFFA87590D88204887680D89BC +:10BC4000C7EBEEC8FFFA87480D89C79B0FF8F808C5 +:10BC50001800CEE187070D882FE887180D89C6FBED +:10BC6000800091D08003DE788000917C8003DEAC80 +:10BC70008003DE908003DE98EBCD4080304A189739 +:10BC8000496BF01F0017C031E3CF9080304A495B09 +:10BC90000E9CF01F0013C041302CE3CD8080304A51 +:10BCA000491B0E9CF01F000EC041308CE3CD8080FC +:10BCB000304A48EB0E9CF01F000AC041310CE3CD26 +:10BCC00080800E9C304A48ABF01F0005F9BC000490 +:10BCD000F9BC0100E3CD80808003DEA88000917C68 +:10BCE0008003DE848003DE808003DEB48003DE8890 +:10BCF000EBCD4080304A1897496BF01F0017C031D8 +:10BD0000E3CF9080304A495B0E9CF01F0013C04186 +:10BD1000302CE3CD8080304A491B0E9CF01F000E72 +:10BD2000C041308CE3CD8080304A48EB0E9CF01F40 +:10BD3000000AC041310CE3CD80800E9C304A48ABF4 +:10BD4000F01F0005F9BC0004F9BC0100E3CD8080C0 +:10BD50008003DEA48000917C8003DE948003DE8C6F +:10BD60008003E1E48003DEA0EBCD40FC189416963E +:10BD70001497580BC160198B3308F00B1800C1D011 +:10BD80003008301595789548956895589505308810 +:10BD90009535952895185876E08B009BE3CFC0FC2D +:10BDA000301830898F7B8F4B8F6B8F5B9538950860 +:10BDB00095299519E3CFC0FC300531099545956566 +:10BDC000955595759529951930289508301A8F3A0B +:10BDD0005836FE98FFE51988F6081800CE01199923 +:10BDE000ECC800021039CDB119B919A8F1E91088D1 +:10BDF000F4081900CD4120465836E08A01112FC4BD +:10BE0000089CF01F008A8F2C20465816E08A010BF0 +:10BE10008F15E8CCFFFC19991988F1E91082CBF055 +:10BE2000ECC30002E40815021033CB95F8C4FFFE02 +:10BE300030056E16089CF01F007D0C4C8F1C2FC423 +:10BE400020432FF50A32FE99FFF65813E08A00E5E9 +:10BE5000300A8F3A09990988F1E91082CA00202333 +:10BE6000E40815021033C9B5E8C6FFFE14956E3418 +:10BE7000304A4EFB0C9CF01F006FE08100C430186C +:10BE800008488F382FC620432FF50A32FE99FFF15C +:10BE90005813E08A00940D990D88F1E910888F48B5 +:10BEA000E6CB0002581BE08A008AECCCFFFE199812 +:10BEB0001989F3E810898F59F6C80002A56912386C +:10BEC000C7F5F8C8FFFE300C8F68E3CD80FC1989F8 +:10BED0003DD8F0091800FE91FF631999ECC80002E3 +:10BEE0001039FE91FF5D304A4D3B2FECF01F0051A1 +:10BEF0001893FE91FF5509F909E8F1E91088EA085D +:10BF00001900FE91FF4DECCA0008583AE08A005E25 +:10BF1000E8CCFFF8F01F00498F2CECCA000C0A3A5D +:10BF2000E08A00578F13E8CCFFF419991988F1E9DA +:10BF30001082FE90FF35F4C30002E40815021033AE +:10BF4000FE95FF2EF8C4FFFE30056E16089CF01F0C +:10BF5000003B0C4C8F1C2FC420432FF50A32FE9956 +:10BF6000FFF65813E08A0042300A8F3A099909888F +:10BF7000F1E91082FE90FF142023E408150210332B +:10BF8000FE95FF0EE8C6FFFE14956E340C9C304AF9 +:10BF90004ABBF01F0028C211301808488F382FC63E +:10BFA00020432FF50A32FE99FFF25813E08A00145D +:10BFB0000D880D99F1E910888F48E3CF80FC300897 +:10BFC0008F58109CE3CD80FC580AFE99FEE9581A60 +:10BFD000FE90FEE6E3CF80FC304A49AB0C9CF01F9C +:10BFE0000015C0613028CDAB5813CF51CD8A0C9CC1 +:10BFF000304A495BF01F000FF9B80010F9B8010092 +:10C00000CCDB0C9C304A491BF01F000AF9B8000237 +:10C01000F9B80100C36B5813CD11CC1A5806FE991C +:10C02000FEBF5816CCB1CBBA8002BC788003E1ECDD +:10C030008000917C8003DE988002BCF08003DE9C4F +:10C040008003DE7C8003DEB08003E1E8D401580C7D +:10C05000C021DC0AF8F801745808CFC0169AF8FB22 +:10C060000178109CF01F0004F9BC01FEF9BC00002F +:10C07000D80200008002BD68EBCD40801897580CB4 +:10C08000C1D0F8FC0108F01F000F300A0E9B48ECED +:10C09000F01F000EEEFC0174F01F000DEEFC017CA1 +:10C0A000F01F000BEEFC0180F01F0009EEFC0128E0 +:10C0B000F01F00070E9CF01F0006E3CD80800000FB +:10C0C000800290A88002C0D080027400800091E8B5 +:10C0D000D401F01F0002D8028002963CEBCD40C094 +:10C0E0001896E06C018CF01F00131897C19030185F +:10C0F000E069A8C0F94800ECF9490150346833C937 +:10C10000F9480154F9460128F9490158189A189B31 +:10C11000489CF01F000AEF4C01081898C0400E9C84 +:10C12000E3CD80C00E9C1097F01F0005CF9B000050 +:10C1300080028F248002BAA880028F8C800091E850 +:10C14000EBCD4060149E1DD81896158CECF5012897 +:10C150001AD81DC91AD91DB81AD81DA91AD91D98DF +:10C1600048CA1AD81ADC1ADB303B6A0CF01F000AE6 +:10C17000ECF90128311B720C72585D18ECF901289A +:10C18000300A720C7238149B5D182F9DE3CD8060CD +:10C190008003DF4880023A1AEBCD40C0205D109743 +:10C1A000581BC130582BC0402FBDE3CD80C0310B90 +:10C1B0001A98F01F00091A961A9B0E9C310AF01F5C +:10C1C00000072FBDE3CD80C0310BF01F00052FBD50 +:10C1D000E3CD80C08002B230800091DC80028EF816 +:10C1E000D431201DFACEFFD81894500B149012961B +:10C1F00010917C237C077C12306A49AB129CF01FA3 +:10C20000001AC1D05803C0800698009B400C0499C6 +:10C210000E9AF01F00160C9BE8F501280498F5D142 +:10C22000C0100E996A0C6AA65D16E8FC0104F01FA6 +:10C2300000100E9CF01F000F2FFDD832E8C5FEB88D +:10C24000306A488B0A9CF01F0008CDD1E8F801281D +:10C250000A9B700C70995D19EA061740CD4B0000DF +:10C260008002B41C8000917C8002C19880025582BB +:10C27000800091E8EBCD40E0189716961495F8F8F9 +:10C2800001685848E0800081E08A00495888C780EA +:10C290005908C4F04C19EEF801645848C480584855 +:10C2A000E089004A5818C6605828C6604BB81AD9A9 +:10C2B0001AD8EEFA01280DD81AD80DC91AD90DB816 +:10C2C0001AD80DA91AD90D981AD80D89302B1AD958 +:10C2D000740C4B3AF01F0033EEF801282F8D700BD1 +:10C2E000707C300AF01F0030EEF90128720C72C821 +:10C2F0005D18EEF90128307B720C72185D18580534 +:10C30000C201EEFC010C580CC07079485808F9B80D +:10C310000100F9F81A14E3CD80E05818C33058280A +:10C32000CBA14A29EEF801645848CBA14A08CC0BAE +:10C330004A09CB2B5888C2205908CB9149D8CB8BBE +:10C34000EEF801280C9B700C71263019303A5D16FE +:10C35000301BEEFC0104F01F0018EEF8016C5828A9 +:10C36000C15030080E99495A109B301CF01F001420 +:10C37000CC9B4948C9DB48D8C9BB4938C99B492926 +:10C38000C8BB4909C89B48A9C87B301BEEFC010407 +:10C39000F01F000ECE7B00008003C6288003DF74F0 +:10C3A00080023A1A800274008003DF088003DF10E5 +:10C3B00080039A74800261D48002C0D080027474B9 +:10C3C0008003C8E480039A6C800261A4D431FACD62 +:10C3D00000DC1897169314951296E0490062E08BE2 +:10C3E000000630060C9C2C9DD832129CF01F034492 +:10C3F0001892E08000D60C9A0A9BF01F034205A910 +:10C4000005B8F1E910880599F5D8B0103038F00971 +:10C410001800C0603006049CF01F033BCE4BECC8F4 +:10C420000004EBDAC01030090A385F3AE045005EDC +:10C430005F88F5E8100CF20C1800CED13FE8E4C19B +:10C44000FFFC038AF00A18005F1B3028F00A18006E +:10C450005F19F7E90004F8041800CDD1EEFC0104DF +:10C46000F01F032A039903A8F1E91088EDD8B01052 +:10C47000FDD6C003506E1C9930182019F009190020 +:10C48000E08800043FF6CC8BEEF8016459085F0A9F +:10C490003028F00E19005F19126AE80A1800C080EF +:10C4A000EEF801685908CEF0EDB60003CEC0EEF804 +:10C4B00000F85808E08100ABE1D6C0100098E218FF +:10C4C0002080CE10009AE21A0800502ACDC12FC554 +:10C4D00000995055E21901005039C641405AE339DC +:10C4E000005DE338005E263AF1E91088F7D8B01015 +:10C4F000E9DBC010083AE0830598EEF9016058299D +:10C50000E0800550EDB00003E0810333E21000301D +:10C51000CBA140395809E08001CAEEF90128305B0F +:10C52000720C72185D18039903A8F1E91088E339B9 +:10C53000005DEBD8B010E33B005EFACAFF50F7E9AC +:10C54000108BE2CCFFA1F01F02F243185808C04044 +:10C55000EDB5000CC231EEC3FEB8EEF60134EEF8D4 +:10C56000017C5808E08004E742C95809E08004C80B +:10C57000EEFB017C580BC79042DAEEF80184103ACA +:10C58000C70042FE42EC1ADE14981ADC069A0E9C92 +:10C59000FEFB0B80F01F02E02FED3016C3DB3FF6F1 +:10C5A000C22BE2C6FFB3FAC4FF84310A0C9B089C7D +:10C5B000F01F02D440685C785048EEF800A8580894 +:10C5C000C301EEF800A45808FE90FF5E310A300B5C +:10C5D0000C9CF01F02D2049A404BEECCFFDC0C986E +:10C5E0004059F01F02CF0C9B089C310AF01F02CD6E +:10C5F000FE91FF4A308AE2CBFFFBEECCFF10F01F2A +:10C6000002C13018EF4800F8C6AB308AEECBFF10FD +:10C61000E2CCFFFBF01F02C3FE99FF503FF6CFCAEA +:10C62000402B310A0C9CF01F02BD049A404B0C9821 +:10C630004059EEC5FF9C0A9CF01F02B9310A0C9BC1 +:10C64000089CF01F02B8CBE13018EF4C00A80A9B01 +:10C65000EF4800A4340AEECCFFDCF01F02AACCBBEA +:10C66000129CF01F02B0C10142EC580CC160EEFBFD +:10C670000180580BC12042FEEEF80188103EC090A8 +:10C6800042C942DAC81B42FE42C942EC42DAC7CB79 +:10C690001C9AF01F02A4CF81EEF801605818E080C8 +:10C6A00000E6320AE2CBFFF3EECCFF34F01F029D2E +:10C6B000FE91FF7503B903C8F1E91088F3D8B010F3 +:10C6C000EEF801645888E08000CC5908E08000CA88 +:10C6D000EEF80128FAC9FF2C1AD970D6700C35F97A +:10C6E000FAC8FF24300A303B5D162FFD1896580C0F +:10C6F000FE90FF55EEF80160E06900FE5828F20850 +:10C700001710435AB48840680A99E2190200F1E907 +:10C7100010094358E8190108F20B1608B09B435A58 +:10C72000B4A9EEF801605828E0810093300843591D +:10C73000B2B8435AB4C8435C308AE2CBFFFB2FBC8B +:10C74000F01F02704358300AF16A005D4359F36AE2 +:10C75000005E4358406A2B381AD84379E068888EC7 +:10C760001AD9EECBFFDC1AD606990E9CF01F026E8A +:10C770003018EF4800EC5C752FDDEDB50006C0F118 +:10C78000FEFA09A8F4E80000FAE9007CEEF801647A +:10C790005888E08003F65908E08003D90A90E21037 +:10C7A0000200C0E0EEFA01283019740C069B7528CF +:10C7B000129A5D18301BEEFC0104F01F025DEEF8CA +:10C7C0000128306B700C70195D1943165806FE90E5 +:10C7D000FEE64328FAC4FF84F0C50002334A300B5A +:10C7E000089CF01F024EE0450020FE9BFED80D88FD +:10C7F000F1D8C00252280D89F3D9C041C050EEF8DB +:10C80000016458185F095209ECCBFFFE0A9AFACC72 +:10C81000FF74F01F023C0A9A52B50898FAC9FF7CCF +:10C820000A9BEEFC0168F01F0243FE91FEB8E2CACB +:10C83000FFC3089B0E9CF01F0240FE91FEB0009AC1 +:10C84000069B0E9C3016F01F023DFE9FFDE6435CEA +:10C85000302AE2CBFFFD2FDCF01F022AC6DB3208B4 +:10C86000F0091900FE91FE9BC34B42EB580BFE9062 +:10C87000FF1A58065F1AEEF9018058095F0814681C +:10C88000FE90FF116D68EDB80001FE91FF0C42F8BB +:10C89000069A1AD80E9C1ADBFEFB08A442F842E95D +:10C8A000F01F021D2FEDFE9FFE7AEEF90128720C9B +:10C8B00072885D18FE90FE73EEF80128305B700CF4 +:10C8C00070195D19403BFAC6FF50324A0C9CF01FAC +:10C8D0000213EEF801605828C0C1E338005DE33B65 +:10C8E000005E0C9AF7E8108BE2CCFFA1F01F020863 +:10C8F00043065806C0E0EEFC010C580CE08003D162 +:10C90000F8CBFFFC310A0C9CF01F0206E08003C04C +:10C910003005EEF8016C5818E08000D45805C0606E +:10C92000EEFB016C581BE080029BEEF800EC58080F +:10C93000E08102B5EEC8FF545008EECAFEB8EEC959 +:10C94000FF9CE2C8FFF3508AEEC6FEC850A950987B +:10C95000306A6E85408B0C9CF01F01F2E08500FB75 +:10C96000306A408BFAC0FFD0009CF01F01E60C9BA0 +:10C97000306AFACCFFCAF01F01E3320A409B400C38 +:10C98000F01F01E8E08500D0320A409BFACCFFC4DA +:10C99000F01F01DC320A400BFACCFFA4F01F01D9D2 +:10C9A000340E1ADE40BE00991ADE34C80A9BFEFA25 +:10C9B00007920E9CF01F01E4EEC5FF6CFAC3FF7CEA +:10C9C0000A9B308A069CF01F01CF0A9CEEC6FF64CA +:10C9D000308A0C9BF01F01CB069B0C9C308AF01F09 +:10C9E00001C93018EF4800A82FEDEEF50178EEF000 +:10C9F00001745800FE90FDD3EEFA0128FAC8FF2812 +:10CA0000E9D5B0101AD8E8C9FFA1740C74D6FAC8D9 +:10CA1000FF285C79300A303B5D162FFD1893580CC7 +:10CA2000FE90FDBDEEF80160E06900FE5828F208B6 +:10CA30001710436AB48843683019B0994066436858 +:10CA40005C760C9AA3BAB0AAEEF901605829C631F7 +:10CA500030084369B2B8436AB4C8436CE2CBFFFB09 +:10CA6000308A2FBCF01F01A74368F3D4C108F169D5 +:10CA7000005D43680A9AF165005E009B436C2A1CC6 +:10CA8000F01F01A0400B436C320A2F3CF01F019DA8 +:10CA9000408940AB43682B381AD8436C0C9A1ADC97 +:10CAA000E068888E1AD30E9CF01F019F40CBEECC1D +:10CAB000FF34320A3016F01F01932FDDFE9FFCADCC +:10CAC000EEFC0104580CFE90FF2B320A0E9BF01F67 +:10CAD000019FC361320A8F8AEEF8013406991AD891 +:10CAE0000E9BEEC8FEC8EEFC0108F01F0199580627 +:10CAF0005F1AEEF9010C2FFD58095F081468FE90CB +:10CB0000FF0F0C9A069BEEFC0108F01F0192FE91AC +:10CB1000FF0EC05B436C302AE2CBFFFD2FDCF01F21 +:10CB20000179C9CB400B320AFACCFFC4F01F017562 +:10CB3000320A409BFACCFFA4F01F0172C32B310ACA +:10CB40000E9BEEFC0104F01F0181E08101B4310A6B +:10CB5000CC3B0C9BFAC0FFD0306A009CF01F0169EF +:10CB6000306A408BFACCFFCAF01F0166C07B009B85 +:10CB7000E21B2000FE91FD13403A580AFE90FD0F83 +:10CB8000334AFAC0FFD0009CF01F0164EEF901287F +:10CB90007228720C5D1850BC039903A8F1E9108843 +:10CBA000E339005DE7D8B010E338005EF1E91088A2 +:10CBB000EEF90160F7D8B0105829E080011303B9ED +:10CBC00003C8F1E910895189EBDBC0100A34E08316 +:10CBD00000CB3028406EF00E1900E08001D80A9694 +:10CBE000129B0098FAC9FFC80C9AEEFC0168F01F6E +:10CBF0000151E08100B9F5D3C010F1DAC082501ABA +:10CC000050F830194068F2081900E08000C7302859 +:10CC1000406EF00E1900E08000A4401AF1DAC0C1A5 +:10CC2000C050EEF8016458185F0850D8EEF801289B +:10CC3000306B700C70195D19009BE2CAFFC30E9C2B +:10CC4000F01F013D1895FE91FCAAEEF80128FAC9E3 +:10CC5000FF2C0A9A1AD9303B700C70D635F9FAC8F5 +:10CC6000FF245D162FFD1894580CFE90FC98EEF8EA +:10CC70000160E06900FE5828F20817104066435A28 +:10CC80005C76B488E21300304358E8130300E7E60B +:10CC9000100CF80B1608B09B4359B2ACEEF80160CB +:10CCA0005828E08102234358B0B54359B2C5435CCC +:10CCB000E2CBFFFB308A2FBCF01F01124358300A31 +:10CCC000F16A005D4359F36A005E43582B381AD865 +:10CCD00043790C9A1AD9EEC6FEB81AD40C99E068BA +:10CCE000888EEECBFFDC0E9CF01F010F2FDD40B9CC +:10CCF0005879E08101F1EEF801685848E08001E6DA +:10CD0000E08901DC5818E080014B5828E08001469A +:10CD1000FEF804441AD8EEFA0128EF38014D1AD86B +:10CD2000EF39014C1AD9EF38014B1AD8EF39014AC3 +:10CD30001AD9EF3801491AD8EF390148302B1AD9DE +:10CD4000740CFEFA0416F01F0106EEF80128307B81 +:10CD5000700C701930165D192F9DFE9FFB5EF1D58A +:10CD6000C003C0A0EEF80128306B700C70193016AB +:10CD70005D19FE9FFB52E0460020FE9BFFF5EC0B89 +:10CD80001603FAC9FFC0E2CAFFA1EECCFFCCF01F28 +:10CD900000F5FE90FF44CE7B310AE2CBFFD3FAC40C +:10CDA000FF84089CF01F00D7310AEECBFFCCFACCF1 +:10CDB000FF74F01F00D4E0450020FE9BFFD5FAC6AB +:10CDC000FFC00A9AE2CBFFA10C9CF01F00CE0A988C +:10CDD0000C99089CE06A0100320BF01F00E3C1EBE4 +:10CDE0005C7BFACAFF50E2CCFFA1F01F00C94318D8 +:10CDF0005808CB90F3D3C0105019EDB9000CCB31CB +:10CE000043282028FAC9FFC8109A5188149B00981B +:10CE1000EEFC0168F01F00C7CA61431B1788F1D8F8 +:10CE2000C00250F81789F3D9C041C050EEF8016430 +:10CE300058185F0950D94328F0CA0002E04A002080 +:10CE4000FE9BFF922FEBFACCFFC0F01F00AEEEF975 +:10CE50000128306B720C72185D18CEFAEEF80128BA +:10CE600030091AD9129A700C70D6FAC8FF285D16CC +:10CE70002FFD1893580CFE90FB92EEF5012818999F +:10CE8000EECBFEB84358E06A888E6A0C6AA65D163F +:10CE9000069CF01F009DFE9FFB82EECEFF54320BDE +:10CEA000500E1C9CF01F00B1C1F1EF4C00ECFE9F36 +:10CEB000FD46EEF80128FEFA02B6700C303BF01F7A +:10CEC00000A8EEF80128FEFA02AA700C303BF01F11 +:10CED00000A4EEF8010C5808FE90FB613008EF4802 +:10CEE000010CFE9FFD1FEEF80128FEFA028A700C6D +:10CEF000303B3016F01F009AFE9FFA8F42EC580C20 +:10CF0000FE91FBB7EEF8017C5808C061EEF8018095 +:10CF10005808FE90FBC342F830091AD8069A1AD96D +:10CF20000E9C42F8FEFB0254F01F007B2FEDFE9F8B +:10CF3000FB36EEF801805808FE91FB18EEF9012847 +:10CF4000720C72B85D18FE9FFB111099303BEEF821 +:10CF500001605828C180E2CCFFC31AD9EEC8FFBCDB +:10CF6000EEFA012830691AD830181AD930091ADCBB +:10CF7000740C7466069A5D162FCDFE9FFC11302B43 +:10CF80003209CE6BFACCFF84CE9B5875FE98FEEC2E +:10CF9000EAC60008FE9FFE264F98CBDA4F98CBBA20 +:10CFA000EDB0000CFE91FAB0EEF800A45808FE9027 +:10CFB000FA6B3018406EF00E1900C490406AF20A05 +:10CFC0001900FE91FAA1F1D4C003FE91FA5DF6C8F2 +:10CFD00000085C88109550785C750A9CF01F00482A +:10CFE0001896FE90FA51E2C4FFA11899089AEA0B2C +:10CFF0001603EECCFFCCF01F005BC2310A9A0C9BEB +:10D00000089CF01F00400C9CF01F003F4078EA098C +:10D0100016085C58E369005DE368005E5C59F1E95D +:10D020001084FE9FFA711ADA1AD4EEF801284D6ABC +:10D03000700C302B3FF6F01F004A2FEDFE9FF9EDEC +:10D040000C9C3FF6F01F0030FE9FF9E7FAC6FF8404 +:10D05000310AE2CBFFD30C9CF01F002A310AEECB41 +:10D06000FFCCFACCFF74F01F00270898E2C9FFA19B +:10D070000C9CE06A0100320BF01F003BE339005DBD +:10D08000E338005EF1E91084FE9FFA3E0E9CF01F2B +:10D09000003FEEFC0104F01F003EFE9FFC480C9A8E +:10D0A000069BEEFC0108F01F002BEF4C010CFE91DB +:10D0B000FC293015FE9FFC2F5888C0A05908FE910E +:10D0C000FE294B48FE9FFE284B38FE9FFE254B381D +:10D0D000FE9FFE22401A0C9BE21A02000E9C3016A4 +:10D0E000F01F0016FE9FF999435C302AE2CBFFFD4A +:10D0F0002FDCF01F0004FE9FFDDC0000800092008A +:10D10000800091DC800091E88002575C8002BB08BF +:10D110008003E0488002C140800091D08002C19825 +:10D120008000917C8002C1E08003E1DC800261D458 +:10D130008002B4248002B9308002C2748003E0848B +:10D140008003E1788002B354800257CC8002914C76 +:10D1500080028FB08003C6288003E19080023A1AD3 +:10D160008002D8A080029B4080028F488003E0F0BC +:10D170008003E1308003E14C8003E0048003DF089A +:10D180008003C8E48003DFC88002B9EC80025770D6 +:10D1900080039A748003DF1080039A6CD431204D91 +:10D1A0001894F8F80128E8F9016416955909F9B3BB +:10D1B0000002F9B301011492700C1A9070991A9B35 +:10D1C0005D19C635E8F80128FAC9FFF8300A1AD9FE +:10D1D000303B700C70D635F9FAC8FFF05D162FFDA4 +:10D1E0001891580CC520E8F80160E06900FE402A5B +:10D1F0005828F2081710B4880697E8F800A4ABB7CF +:10D200005808C050E0680900E7E810075805E068D2 +:10D210000400EFD8E1375802F9B80108EFD8E13738 +:10D220004028F3D7C108B09940283006B0A740295C +:10D23000B2B64028308AB0C6E8C5FF04402C0A9B2D +:10D240002FBCF01F00130A9C308BF01F00124028E7 +:10D25000F166005D4029F366005E0E99E219010057 +:10D26000FBF81002F9BA014DF1DAE1091AD9404888 +:10D2700000991AD8069A1AD1089CE068888EE8CBE3 +:10D28000FFDCF01F00052FDD2FCDD832800091DCB0 +:10D29000800239EA8002C1E0EBCD40804879720813 +:10D2A000201893081897C031F01F00050E9CF01F3E +:10D2B0000005E3CD8080000000007AB48002D2F83F +:10D2C000800091E8EBCD40C048976E065806C041FB +:10D2D000F01F0008C0916E082FF8304C8F08F01F27 +:10D2E0000006E3CD80C00C9CE3CD80C000007AB482 +:10D2F0008002D30480028F24D401F01F0002D802E0 +:10D300008002D996D401F01F0002D8028002D9947D +:10D31000D4211789179A17B8F1E9118817A9F1EAEA +:10D320001108F1E91088990817CA17D8B168F1EA0D +:10D33000118817EA17F91258F1EA10889918F73A84 +:10D340000008F739000BF7380009B168F1EA1188D5 +:10D35000F73A000A1258F1EA10889928189EF73A0D +:10D36000000CF738000DF739000FF8C5FFE4B1687D +:10D37000F73C000EF1EA11883007125849B4F1EC7D +:10D38000108C49B69D3CC038149C2F05E80707084F +:10D390002F0EFCF9FFF0F3E82189EC0C0F88E2185E +:10D3A000FF001059EC0C0F98E61800FF1059EC0C18 +:10D3B0000FB8F1D8C1081059FCF8FFF4EC0C0FAB12 +:10D3C000A96BE61BFF0016599D091059FCF8FFF8E0 +:10D3D0009D1910599D29FCF8FFFCF3E8200A8B0ADF +:10D3E0002FF758A7CD21D8228003E2F08003E6FC76 +:10D3F000EBCD40FE1892F01F002F0493E4CBFF60AA +:10D40000E4C4FFFCE4C5FF5CE4C6FFF8E4C7FF58D2 +:10D41000E4CEFFF4E4CCFF54E4C1FFB06609760823 +:10D4200087089709680A6A0889088B0A6E086C09D8 +:10D430008D088F097C0A78089D08990A2F03210B13 +:10D440002F0421052F0621072F0E210C023BCE7140 +:10D45000E4C4FFF030134985498608972F046E0A0B +:10D46000EC0A0F98EA080F9EEC0A0F88EA080F9C56 +:10D47000EC0A0FB8EA080F9BEC0A0FA8F809150888 +:10D48000FC0A1510F3EC1389F5EE130A1659EA0895 +:10D490000F9BF6081518F1EB1288105914590EA9B4 +:10D4A0000E34CDE12FF358A3CD91E3CD80FE0000E3 +:10D4B0008002D3108003E2FC8003E6FCD431209D7F +:10D4C000F736000E505A178A780917B8F1EA118812 +:10D4D000179A1258F1EA210817AEF1EE208E506E1D +:10D4E000781817CA17F9105917D8F3EA2189F3E801 +:10D4F000210917EEF3EE208E507E7828F7390008C8 +:10D50000F73A000B105AF7380009F5E9218AF73984 +:10D51000000AF5E8210AF5E920827839F73A000C8B +:10D52000F738000FFEF7034412581894F1EA2188E7 +:10D53000F739000DF8CAFF60F1E92108500AF1E659 +:10D5400020800E91E0081618406AEE080326F3DAF0 +:10D55000C008F1D2C208EE090329EE080328504999 +:10D560005038407AEE0A0F9950296878684B105667 +:10D570004068EE000FACEE080FBA4079165AEE097B +:10D580000F8BF6081508F1EB1388F8091518105AD7 +:10D59000F3EC1289EE020F9C125AF8081510F1EC08 +:10D5A0001308F5E82008685E68654079EE090FBB4E +:10D5B00050884068EE020F8C1C5BEE080FAEF80836 +:10D5C0001508F1EC1388EE000F9A105BFC09151892 +:10D5D000F4081510F3EE1289F1EA1308125B407992 +:10D5E000F7E82003EE000F8BF6081508F1EB13881F +:10D5F000EE020FBCEE090FAE0A5CFC091518105CB8 +:10D60000F3EE12894068125CEE080F9B404A4048D6 +:10D61000F6091510A968F3EB1309F1EA1388F9E983 +:10D620002000105640394038B968F1E912882E04BC +:10D63000105640294028B169400AF3E81309EDE982 +:10D6400020021434C770E4081618408AF3DAC008C0 +:10D65000E208032EE2090326F1D0C208E2030F9983 +:10D66000E20803255019E2020FACE2030F8B6809B0 +:10D67000F6081508F1EB1388E20A0FBA125AF809F6 +:10D680001518105AF3EC1289E2000F9C125AF80890 +:10D690001510F1EC1308F5E82008E2030FBB506801 +:10D6A00040886819E2000F8AE2080FAC125BF408A8 +:10D6B0001508F8091518F1EA1388F3EC1289E2004D +:10D6C0000FBAE2020F9C105BF8081510125BF1EC28 +:10D6D0001308F7E8200850786829E2030FAC125AC3 +:10D6E000F8091518F3EC1289E2020F8BF6081508F9 +:10D6F000F1EB1388105A125A4089E2090F9B6839DE +:10D70000F6081510F1EB1308125EF5E82002EC099B +:10D710001508EA081518F3E61389F1E51288125E78 +:10D720004019105EB1694018F3E81309FDE92000C3 +:10D73000C0AB4089F1D3C1084CDBFDD9C008F60865 +:10D740000706E40A1618EBD0C208F60A0709F60520 +:10D750000708F60E070CF9E9118CF3D3C008F9E8B5 +:10D76000110C4088B988F608070AF6090708F3D2B1 +:10D77000C208F1EA1188F609070AF3D0C108680E59 +:10D78000F1EA1108F609070AF1EA10881C58F009B5 +:10D790001618405AB4B8B4894059F00A1610A9882E +:10D7A000B29AB2A8E6091618F609070AF3D0C0081B +:10D7B000F6090708F1EA1188408AF3DAC208F60987 +:10D7C000070AF3D2C108F1EA1108F609070A40591D +:10D7D000681EF1EA10881C58B2F8F0091618405A71 +:10D7E000B4C94059F00A1610A988B2DAB2E8E009C3 +:10D7F0001618F609070AF3D2C008F6090708F3D38A +:10D80000C208F1EA1188F609070AF1EA1108408A0C +:10D81000F3DAC108F609070A4059682EF1EA1088C0 +:10D820001C58F368000BF0091618405AF5690008F7 +:10D830004059F00A1610A988F36A0009F368000A33 +:10D840006839405AF9E6108C125CF8081618F80985 +:10D850001610F56C000FF568000CA98CF569000D29 +:10D86000F56C000E2F7DD8328003E2FC8003E1F0DE +:10D87000EBCD40C01897590BC030E3CF80C0E06CAF +:10D8800000B0F01F00061896CF900E9BF01F00040A +:10D890000C9CE3CD80C00000800092008002D3F099 +:10D8A000D431209D129714961895500B308A0C9BFA +:10D8B000FAC2FFE4049CF01F0034ECCBFFF8400AEE +:10D8C0000E9CA37AF01F00300A9C310BF01F002F32 +:10D8D0001893C57040082018EE08003840095028F9 +:10D8E0005C39400A5C59F40A00285019E9D8C0088C +:10D8F0003050FAC7FFF4FAC1FFEC40095809E08A3A +:10D90000002940251296308A049B0E9CF01F001EB1 +:10D91000FB390013E806000812580A9BFB68001345 +:10D92000308A029CF01F00180E9A0E9B069CF01F76 +:10D930000018308A0E9B049CF01F001320160A9CCE +:10D94000308A2085029BF01F00105806FE99FFDDEB +:10D95000401A2010E80A0008E9D8C0085BF0CCE1C2 +:10D96000069CF01F000C049C3A691988F208180004 +:10D97000C0812FFCFAC8FFDC103CCF812F7DD83A44 +:10D980002F7DDC3A800091DC8002D8708002D4BC0C +:10D99000800091E85EFD5EFCD4311A97202D109E28 +:10D9A000129514965809C4911638E0880057F0086B +:10D9B0001200C0D0F608094BF0091120FC08094EEE +:10D9C000F4090A49F4080946F3EB100BFC0516109C +:10D9D000F9DEC010F6050D0AEC0816101499F1EBEB +:10D9E0001108B93A103AE088000C20191C08103EC2 +:10D9F000E08B0007103AF7B90B01F1DEEB08F00AF3 +:10DA0000010BEDD6C010F6050D0AEDEB11061498CA +:10DA1000F40C024C0C3CE088000A20181C060C3E5A +:10DA2000E08B00050C3CF7B80B01F1E9110B300C51 +:10DA3000169A189B2FEDD8321639E08B0051F20C54 +:10DA40001200C53114385F8916355F381049F8095E +:10DA50001800C450301BC4585808C0513019F2087F +:10DA60000D08109EFC081200E08100911C1BFC05B3 +:10DA70001610F3DEC010301CF6050D0AEC08161067 +:10DA8000F4090243F1EB1108149B1033E088000CF9 +:10DA9000201B1C08103EE08B00071033F7BB0B0166 +:10DAA000F1DEEB08F0030103EDD6C010E6050D0230 +:10DAB000EDE311060498E40902490C39E088000AF4 +:10DAC00020181C060C3EE08B00050C39F7B80B0142 +:10DAD000F1EB110B169A189B2FEDD832300B169CD8 +:10DAE000169A189B2FEDD832F20C0945F80E11202A +:10DAF000F00C0943F40E0A46F00E0A48F60E0A4EE0 +:10DB00000A48F0011610FC010D04EEE5FFF8F60CD2 +:10DB10000949EBD8C010EDE910090896F20E16106D +:10DB2000EEF4FFF8EC05024BFDE4110E1C3BE0881F +:10DB300000072016100E1C38E088006D161EF3D961 +:10DB4000C010FC010D00F3E11109009BE005024E3D +:10DB5000123EE0880007201B10091238E0880055AB +:10DB6000F7E6110B1C19F60306420639C0935F094C +:10DB7000F40C094C043C5F38F3E80008C020201B7B +:10DB8000300C169A189B2FEDD832F6080949FC087C +:10DB9000094EF0011120FC051610F4010A42F601AD +:10DBA0000A411242E2050D00F3DEC010E406161031 +:10DBB0000093EDE11106E009024C0C3CE0880007FF +:10DBC00020131C060C3EE088002CEC0C0101F7D25F +:10DBD000C010E2050D00F7E1110B009CE0090241C5 +:10DBE0001631E088000C201C1C0B163EE08B000751 +:10DBF0001631F7BC0B01F7DEEB0BF4080946021BEC +:10DC0000F9E3110CC3AB123EF3D8EB09F7BB0B01E0 +:10DC1000CA8B1C3BF7B60B01FDD8EB0EC90B0C3CB5 +:10DC2000F7B30B01EDDEEB06CD1BD703D40130AA11 +:10DC3000300BF01F0002D8028002F0ECD4014848FB +:10DC4000169A189B700CF01F0003D802000005986C +:10DC50008002DC54D421F40B024BF01F00151897FE +:10DC6000C230F8FAFFFCE01AFFFC204AE04A002428 +:10DC7000E08B00181898593AE088000F300910A975 +:10DC800010A959BAE088000910A910A9E04A002497 +:10DC9000C03110A910A9300910A991199109C048E3 +:10DCA000300BF01F00040E9CD82200008002E2BC62 +:10DCB0008002E8BCD421300EF6C80001F60614013B +:10DCC000F808002818991897C07870046E050EA4FB +:10DCD00091052FFE20480C3ECF95F40B000B1897B2 +:10DCE000F6C80001300EF8080028A15BC078700566 +:10DCF0006E060EA591062FFE2048163ECF95F4C85D +:10DD00000001A15AF808002C3008C078780E720B78 +:10DD100012AE990B2FF8204C1438CF95D822D70388 +:10DD2000D431205D502C503816971496580C5F0B48 +:10DD300058075F0C1295F9EB100B40E33008F00B1D +:10DD40001800E081028058095F09580A5F08F3E86B +:10DD50000008F6081800E08102764BE4402B6808C2 +:10DD60001638E0840270EE08032C580CE080026B39 +:10DD70004B9BF01F003AC06168082FF88908E08FBC +:10DD8000026268085808C05130184B598908930836 +:10DD90005806C14032D90D88F20818005F0232B926 +:10DDA000F20818005F08E5E81008C0805802F9B2D0 +:10DDB0000101F9B200022FF6C0884AACF01F002A18 +:10DDC000F9B20102F9B200004A5870085818C61199 +:10DDD0005812C2B049F95822C4A0129872043001F6 +:10DDE00032DB32BA7009F2C0FFFFEE09032C580C87 +:10DDF000E080023B1989F6091800C0805803E080D2 +:10DE00000225F4091800E081022150015014492B29 +:10DE1000F01F0012C411EE04002C029B301A2FF4E4 +:10DE2000F01F0012E08F022148A87009EE090328B4 +:10DE30005808C2F0118A32DBF60A1800C2A0580353 +:10DE4000E080020832BBF60A1800E0810203C21823 +:10DE500000007AB88003EC008002ECC800007ABCB5 +:10DE60008003EC04800326948002DCB47208EE0880 +:10DE700003285808C0E0118832D9F2081800C09071 +:10DE80005803E08001E032B9F2081800E08101DBBC +:10DE90003009500950195805E08000A44BE4680887 +:10DEA000302AEE08032C4BDBF01F003DC0D0580396 +:10DEB000E08000986808EE080328118932B8F0095C +:10DEC0001800E081008F4B7468085818E081008AC0 +:10DED0004B187008302AEE08032C4B0BF01F003053 +:10DEE000F9B80002E9F80A004AB468084AD1EE0815 +:10DEF000032C620833DB100CF01F002B1893C0E1D9 +:10DF00006808EE08032CF01F002968096208EE0972 +:10DF10000323F80801081803C08868086209EE089E +:10DF20000328F8080108121850430A910C933FF493 +:10DF300030001096C4784989720849A9EE08032C6C +:10DF400072080C9A100CF01F0016C3A1620CF01F8F +:10DF500000171836C051069600944043C3C85BF4BE +:10DF6000C2E0493870085808C7C062081AD848A8E3 +:10DF700070096E08EE090329A564EA04030A1ADA97 +:10DF80001AD91AD848B8700848BB702CF01F000B7B +:10DF90002FCDC67800007AB88003EC008002E7102D +:10DFA00000007ABC8002ECAC8002EDD0000004A43A +:10DFB000000005988003EC1480031FE800942FF004 +:10DFC0002F01620B580BCB81069640435BF4C031A6 +:10DFD0000898C0A8E8081504EA0800087018C048A6 +:10DFE0003FF83003109458065F19F3E403F9C03189 +:10DFF0003006C5484BE162084BE3EE08032966088A +:10E000000C9CF208070BF01F003C1896C2D14BB8CD +:10E0100070085808C11062096608EE090329F20861 +:10E0200007081AD86E081AD84B5870084B5B702C2A +:10E03000F01F00352FED4AF8700B2FFB910B4AC9EA +:10E04000720AEE0A032CF80B070C300BF60C1800C2 +:10E05000F7BA00FFF3FA0A00F9B90001F1F90A0072 +:10E0600033F8109CC818199833A9F2081800C0306A +:10E070003008C08819A9F0091800F9B80002F9B8E9 +:10E08000010149CA49A97209EE09032974030D8ADD +:10E090002FF3F203000349D9930A5818C1505828A6 +:10E0A000C0405808C6C0C208078933D8F009180014 +:10E0B000F7B300FF4968078A3009F20A1800C10166 +:10E0C00030069106C718078933D8F0091800F7B34E +:10E0D00000FF30080789F0091800C1B048C8910353 +:10E0E0003019484891093006C5F8000000007AB898 +:10E0F00000007ABC8002ECAC000004A4000005988B +:10E100008003EC5080031FE8000004A000007AC0E8 +:10E110004C08402B70082FF81638C2954BE8700851 +:10E120005808C1C06E084BD71AD86E084BCB702C5C +:10E13000F01F003C2FFD5BF4C0906E08A5644BAB54 +:10E14000EA0403091AD9702CC0686E080D894B7B4C +:10E150001AD9702CF01F00332FFD4AE933A8720A38 +:10E16000109C2FFA930A4B299308C6D84B19EE0836 +:10E17000032A3018930A10964AF9C1584AE95BF409 +:10E18000C0D1720A2FFA930A4A2B760BEE0B032B9F +:10E19000F60A070AF00A1800C03130189308300850 +:10E1A0004A49109693085802C1B140094A285809B3 +:10E1B0005F19700858185F08F3E80008E4081800B1 +:10E1C000C0F04018ECCAFFFFEE08002C400BF01F17 +:10E1D000001B40182FF8F006000648E8C0A8496860 +:10E1E00070085818C07148B870092FF9F206000677 +:10E1F00091065BF4C240403B580BF7F41A00A5644B +:10E2000008056A3C6A285808C1E0910C300CC1B876 +:10E2100000007AB8000004A4000005988003EC70A8 +:10E2200080031FE88003EC948003EC9C000004A0B2 +:10E2300000007AC000007ABC8002DCB448C8700CD0 +:10E24000C0283FFC2FBDD83291002FF1FE9FFDCC9E +:10E25000488B97084888F2CAFFFF3019910A129C30 +:10E2600048389109CF0B48489104CECB000004A058 +:10E2700000007AC000007AB8D40130091AD9129887 +:10E28000F01F00022FFDD8028002DD20D401484893 +:10E29000189B700CF01F0003D802000000000598C6 +:10E2A0008003217CD4014848189B700CF01F0003A8 +:10E2B000D8020000000005988002E2BCD431F6C705 +:10E2C000FFF518955967F9B70810F9B80BF8EFD8AA +:10E2D000EB2716375F38F1E713F8C05030C899388C +:10E2E000E08F01F4F01F0050E04701F7E08B001CC5 +:10E2F000EE0316034CD8F003003870361036C061B8 +:10E30000ECC8FFF870361036C0C06C18E018FFFC7F +:10E310006C3AEC0800090A9C6C289528913AC4785C +:10E320002FE3C4D8EE081609C041EE031603C278E5 +:10E330005848E08B0006EE0316062C83C2085948A5 +:10E34000E08B0005F0C3FFA5C1A8E0480054E08BB6 +:10E350000006EE03160C2923C128E0480154E08B87 +:10E360000006EE03160F2893C0A8EE031612E0482D +:10E370000554E088000437E3C02828434ABAF40370 +:10E38000003A7436C1986C19E019FFFCF207010BD2 +:10E3900058FBE08A00042013C1186C38580BC0B534 +:10E3A0006C2AEC0900090A9C912A95387218A1A8D8 +:10E3B0009318CBD810961436CE712FF349BAF4CCFB +:10E3C000FFF878261836C6F06C19E019FFFCF20742 +:10E3D000010858F8E0890091993C992C5808C055DB +:10E3E000EC0900090A9CCE3BE04901FFE08B0013D9 +:10E3F000A399F4090038702B8D388D2B9736912610 +:10E40000A3497418301BF6090949F1E91009951957 +:10E41000C4A8F20816095848E08B000AF20A16064A +:10E420002C8AC2488002E8CA0000059C5948E08B4B +:10E430000005F0CAFFA5C1A8E0480054E08B000623 +:10E44000F20A160C292AC128E0480154E08B000684 +:10E45000F20A160F289AC0A8F20A1612E0480554CC +:10E46000E088000437EAC028284A4C8BF60A0034BA +:10E4700068280838C0E17619A34A301EFC0A094A08 +:10E48000F3EA100A1099971AC0A870280838C060DB +:10E49000701AE01AFFFC1439CF9370398D398D282A +:10E4A00091369326E6081402301B4B84F608094B7C +:10E4B0006818103BE08B006EF7E80009C0B1E0136C +:10E4C000FFFCA17B2FC3C0382FC3A17BF7E8000955 +:10E4D000CFC0E803003E06921C916236C2E86C1A77 +:10E4E000E01AFFFCF407010858F8E08A00156C3ABE +:10E4F0006C299529933A0E99EC070007A1A9993741 +:10E5000099278D19EE0809088F2C8F3CA1A80A9C29 +:10E510008F18C0D86C395808C0F5EC0A000A741876 +:10E52000A1A80A9C95186C2893289139F01F00180F +:10E53000ECCCFFF8D83212960236CD212FF2F1D270 +:10E54000C002C0302F81CCAB1C98F3D3C002C08175 +:10E550006819F60811FFF3E800088918C078F0C9B7 +:10E560000008201370081238CF10A17B6818103BE8 +:10E57000E08B0010580BC0D00493C0382FC3A17B90 +:10E58000F7E80009CA71CFBB0000059C8002E8CC07 +:10E5900068236612E012FFFC0E325F39E4070108BF +:10E5A00058F85FAAF5E91009E08000A24C887001D4 +:10E5B0004C882F0170080E015BF8C0402811E01153 +:10E5C000FF80029B0A9CF01F004418965BFCC6E08B +:10E5D000E6020008103CC0320833C6814BFA7409C9 +:10E5E000E209000995091036C0A1F5D6C007C0712F +:10E5F000E20200026828A1A29112C4C84B5A740B0F +:10E600005BFBC0319506C068EC0900094B3A101954 +:10E610009509F1D6C003F00911085808F20817103F +:10E62000EDD8E1062808EC0100010A9CE3D1C007FF +:10E63000F0010101029BF01F00284A885BFCEC0CF2 +:10E640001700F9B1000070090C1C8926020C120198 +:10E65000A1AC91018D1C0833C1D058F2E08B0005AC +:10E6600030188D18C238305920C2E012FFF8E60287 +:10E670000008912991196618F1D8C001E5E8100841 +:10E68000871858F2E0880007E6CBFFF80A9CF01FD5 +:10E6900000144949720A491870081438F3F8BA008E +:10E6A0004919720A1438F3F8BA0068287018E0188B +:10E6B000FFFC0E385F390E1858F85FAAF5E910090B +:10E6C000C1600A9CF01F0009D83A000000007ACC13 +:10E6D000000009A88002EBC800007AD08003217CEA +:10E6E00000007AC800007AC48002E8CC6826A1A89D +:10E6F0000E99A1A98D19EC0700070A9C89278F188C +:10E70000F01F0003ECCCFFF8D83200008002E8CC08 +:10E71000D4013008C0D8F808070EF6080709201AF7 +:10E720002FF8F20E1800C040FC09010CD802580A5C +:10E73000CF31149CD802588AC2F5F9EB1009E219BE +:10E740000003E0810097E04A0020C3B4F4081402FB +:10E75000F0091108FE09002F7669996976599959CF +:10E7600076499949763999397629992976199919E5 +:10E7700076099909F608002BF8080028E01A00032A +:10E78000F40A1104FE0A002F17A9B0A91799B0992D +:10E790001789B0895EFCF40A1109FE0A002F17F9E7 +:10E7A000B8F917E9B8E917D9B8D917C9B8C917B965 +:10E7B000B8B917A9B8A91799B8991789B8895EFC8B +:10E7C000EBCD40C01899220AB707B326B707B32686 +:10E7D000B707B326B707B326220ACF742F0AC0653E +:10E7E000B707B326B707B326210A5C3AFE0A003FF3 +:10E7F000D703D703F736000EF366000EF736000D89 +:10E80000F366000DF736000CF366000CF736000BCC +:10E81000F366000BF736000AF366000AF7360009C4 +:10E82000F3660009F7360008F3660008F7360007BC +:10E83000F3660007F7360006F3660006F7360005B4 +:10E84000F3660005F7360004F3660004F7360003AC +:10E85000F3660003F7360002F3660002F7360001A4 +:10E86000F3660001F7360000F3660000E3CD80C0D8 +:10E87000201AF60A0709F80A0B09CFB15EFCD40189 +:10E88000183BC192F60A0009123CC152F80A000B6B +:10E890003008C068F208070E201AF6080B0E201880 +:10E8A000580ACF91D802F6080709201AF8080B0970 +:10E8B0002FF8C0283008580ACF71D8021898C038ED +:10E8C00010CB201A580ACFD15EFC5EFC5EFCD70349 +:10E8D000D4014848169A189B700CF01F0003D80208 +:10E8E000000005988002E8E8D431201D16941892A3 +:10E8F000149B5804C051F01F005B1895C5B9500A0D +:10E90000F01F0059400BE8C10008F6C6FFF5621C75 +:10E910005966F9B60810F9B80BF8EDD8EB2616369B +:10E920005F38F1E613F8C05030C830058538C42987 +:10E930001890E010FFFC0C30E08401124CB8E200AB +:10E94000000970250A39C090721AA1CAF20A000A99 +:10E95000741AEDBA0000C220721AE01AFFFCF4002B +:10E9600000030A39C131ECC7FFF00E33C195E2064E +:10E9700000090C13A1A393139129049C6218089514 +:10E98000F1D8C00110468316C1390C33C0957228E6 +:10E990000297723993289139CE48300A1499EDBC08 +:10E9A0000000E080009D6207E20701076E1CE01C8A +:10E9B000FFFC5809C5E0F80000030A39C4811403BC +:10E9C000ECC9FFF01233C5556E3A6E299529933A7A +:10E9D000EEC5FFF8E0CA0004E04A0024E08B002501 +:10E9E0000A99593AE088001A09098B0909098F39EF +:10E9F000EEC9FFF059BAE0880011090B930B090921 +:10EA00008F59EEC9FFE8E04A0024C071090A930A51 +:10EA1000EEC9FFE0090A8F7A090A12AA680A930A66 +:10EA2000681A931AC0785008089B0A9CF01F0010BF +:10EA30004008EE0600090C13A1A393139129049C2E +:10EA40006E18F1D8C00110468F16CB2814030C3372 +:10EA5000C10572287239932891396E286E39C0F831 +:10EA60008002E2BC8002E8CA0000059C8002E87EC9 +:10EA7000F80000030C33C3356E396E2893289139A2 +:10EA8000E0CA0004EECCFFF8E04A0024E08B00244A +:10EA9000593AE088001A0908990809088F38EECC1D +:10EAA000FFF059BAE08800110908990809088F5841 +:10EAB000EECCFFE8E04A0024C07109089908EECCCA +:10EAC000FFE009088F78090818A8680899086818ED +:10EAD0009918C478089BF01F0039C438049CF01FB3 +:10EAE00000381895C3A06218F8C90008A1C8E20848 +:10EAF00000081039C07172130297E013FFFC000385 +:10EB0000C308E0CA0004E04A0024E08B0020089912 +:10EB10001898593AE0880014130B10AB130B10AB84 +:10EB200059BAE088000D130B10AB130B10ABE04A81 +:10EB30000024C051130A10AA130A10AA130A10AA1B +:10EB4000720A910A72199119C048089BF01F001BA4 +:10EB5000089B049CF01F001B049CC2A80093029712 +:10EB6000E60601096E1858F9E0880016F1D8C001D0 +:10EB7000EDE810088F181298A1A8EE06000BF60910 +:10EB8000000997187218A1A82F8B9318049CF01FE6 +:10EB9000000DC0B8F1D8C001E7E810088F18EE03E7 +:10EBA00000036618A1A88718049CEEC5FFF8F01FA3 +:10EBB00000060A9C2FFDD8328002E87E8002E2BC6B +:10EBC0008003217C8002E8CCD42130081897487655 +:10EBD000169C8D08F01F00065BFCC0516C0858089D +:10EBE000EFF81A03D822000000008CC48002F1E87C +:10EBF0005EFDD703D421217DE06802041697BA6830 +:10EC0000504C500CF01F000B3008512850D848A829 +:10EC100050983FF8BA784898505C501CFAC9FF9059 +:10EC20000E9A700C1A9BF01F00062E9DD822000031 +:10EC30008002EDD08002EBF00000059880030C4CC0 +:10EC4000D421217D4988FAC9FF9016977006580B88 +:10EC5000C064E068008B3FFC8D38C228580BF60872 +:10EC600017005807F9BB01FFEFDBE10850585028A7 +:10EC7000E0680208BA683FF8504C500CBA781A9B0A +:10EC80000C9CF01F000A5BFCC044E068008B8D38D0 +:10EC90005807F9B90100FBF81000F1F91E002E9D8C +:10ECA000D8220000000005988002F5685C5BC0284F +:10ECB0002FFC19885808C050F6081800CFA15EFC38 +:10ECC000580B5E0C5E1DD703F9EB100AE21A000325 +:10ECD000C341780A76095CEAC170123AC151781AC8 +:10ECE00076195CEAC110123AC0F1782A76295CEAFA +:10ECF000C0B0123AC091783A76395CEAC0502F0C15 +:10ED00002F0B123ACE70F9DAC308F7D9C3085E0C9C +:10ED1000161C5E1CF9DAC208F7D9C2085E0C161C74 +:10ED20005E1CF9DAC108F7D9C1085E0C161C5E1C1E +:10ED30005C5A5C59121A5EFA178A1989580A5E09D8 +:10ED400014195E19179A1999580A5E0914195E194F +:10ED500017AA19A9580A5E0914195E1917BA19B920 +:10ED6000580A5E0914195E192FCB2FCCCE6B000008 +:10ED70003008F6080709F8080B092FF85809CFA141 +:10ED80005EFCD703D4014848189B700CF01F0003A9 +:10ED9000D8020000000005988002ED9CD42118974D +:10EDA0001696169CF01F0008F8C5FFFF0E9C0A9BE4 +:10EDB000F01F00061897C0500A9A0C9BF01F000421 +:10EDC0000E9CD8228002EDD08002E2BC8002E736A1 +:10EDD00030091898C0282FF8118AF20A1800CFC1FC +:10EDE000F00C010C5EFC580AC0815EFA580AC0B0F3 +:10EDF0005808C0902FFC2FFB201A19881789F0099A +:10EE00001800CF50198C1788101C5EFC3008103A7F +:10EE10005E0CF6080709F8080B092FF85809CF818E +:10EE2000103A5E0CF8080B092FF8CFBBD401484804 +:10EE3000169A189B700CF01F0003D802000005986A +:10EE40008002EE44D421300816951696C0282FF67D +:10EE5000580AC060201A0D89F0091800CF910A16CF +:10EE6000ECCBFFFFF01F00071897C0800A9B0C9A9D +:10EE7000F01F00053008EE060B080E9CD82200009B +:10EE80008002E2BC8002E736D42118981696580B0F +:10EE9000C0C03007C0481897F8C8FFFF109C0C9BF3 +:10EEA000F01F0005CF91C048F01F000318970E9C7B +:10EEB000D82200008002ECACD421201D4A351897DE +:10EEC0006A04E8F600E85806C351500B350CF01FF1 +:10EED00000206A08E94C00E8F0F900E89326930660 +:10EEE0009316F0F900E893469336F0F900E893663C +:10EEF0009356F0F900E893B693A6F0F900E893D69C +:10EF000093C6F0F900E893F693E6F0F900E8F346CB +:10EF10000044F3460040F0F900E8F346004CF346A5 +:10EF20000048F0F900E8F366001CF0F800E8400B38 +:10EF30009196486870080E9CF0FA00E83019F01FAE +:10EF400000052FFDD8220000000005988002E2A4F1 +:10EF50008002EF54D421580CC041740C580CC2905C +:10EF600018981697113EC0A80C3EC0815809C030B1 +:10EF7000109CCF7B9508B889D8220F365806CF5100 +:10EF8000580EC051950E1C9CD822129810991697B5 +:10EF9000133E0F361C36C0A1580EFC091700F9BBF2 +:10EFA0000100F1FB1E009509D8225806CF31CEEBA7 +:10EFB000D822D703D431203D4CC8502C700116986C +:10EFC000113EE20E0706E2160008CFB1E04E002D1A +:10EFD000C041113E3016C058E04E002BC021113EFA +:10EFE00058095F0C59095F053007F9E51005EE0572 +:10EFF0001800C1E0E04E0030C131118535843783FF +:10F00000E80518005F04E60518005F05E9E510054E +:10F01000EE051800C050119E31092FE8C098580C19 +:10F02000C070E04E0030F9B90008F9B9010AE06C8F +:10F03000FFFFEA1C7FFF3007FC1580000E930E36A1 +:10F04000F80517000E9CEA090D0408925005E20E1F +:10F050000704E1D4C001F9B00137F9B000575010EE +:10F06000FCC500300890E2100004C0814010E9D4D3 +:10F07000C002FC0001055804C1C01235C1A4043C03 +:10F080005FBEFDE713FEE60E1800C101043C5F0EF3 +:10F0900040070E355F97EFEE000EE60E1800C061D8 +:10F0A000B33C3017EA0C000CC0283FF7113ECD0BE3 +:10F0B0005BF7C0E1E069FFFFEA197FFFFC1C8000FD +:10F0C00040205806F20C170032298139C0485806F2 +:10F0D000FBBC0100580AC0705807F9B901FFF1D90B +:10F0E000E10B950B2FDDD8320000049CD401485869 +:10F0F0001499169A189B700CF01F0003D802000098 +:10F10000000005988002EFB43028D6733FFC358BA1 +:10F11000580C5E4C482A950B5EFC000000008CC425 +:10F120003058D6733FFC358B580C5E4C482A950BF3 +:10F130005EFC000000008CC43038D6733FFC358B79 +:10F14000580C5E4C482A950B5EFC000000008CC4F5 +:10F150003048D6733FFC358B580C5E4C482A950BD3 +:10F160005EFC000000008CC430B8D6733FFC358BC9 +:10F17000580C5E4C482A950B5EFC000000008CC4C5 +:10F180003098D6733FFC358B580C5E4C482A950B53 +:10F190005EFC000000008CC4D421210D16971A9B40 +:10F1A000F01F0011C0343FFCC1C84008AE08401831 +:10F1B000AE1840288F184038AE484048AE584058E6 +:10F1C000AE684068AE7840888F4840A88FB840C885 +:10F1D0008FC840D88F5840E8300C8F7840F88F980F +:10F1E0002F0DD8228002F180D40148C87009580937 +:10F1F000C03148B99109489948AA7208F00C000C2E +:10F20000143CE08B0004930CC068F01F000730C86A +:10F2100099083FF8109CD80200007AF800008CC8CA +:10F220000000F00080031D20D431208DFAC4FFBC03 +:10F23000504B682E505812967C0B7005506E580B30 +:10F24000F40B17006803681140493008C2C92FFB4E +:10F25000325C178AF80A18005F1EF00A18005F1C5B +:10F26000FDEC000CF00C1800CF31580AE0800129A9 +:10F27000300C3FFA1890503A18941892F80C003C51 +:10F280001697507C4CDC0F3AF80A070E407C1C0C99 +:10F290004CBEFC0C070E201E500E4CAEFC0C070C96 +:10F2A000507C400C587CE08B00F84C7EFC0C032F0B +:10F2B000368BF60A1800E08000F0371BF60A1800BB +:10F2C000C07034CBF60A1800C051A3B4CE58A5B410 +:10F2D000CE380F8B36CAF40B1800C051A5B4EECB54 +:10F2E000FFFFCDB8A5A4CD88EBD5C005367CF80AC4 +:10F2F0001800E08B0027365BF60A1800C48234FB46 +:10F30000F60A1800C480E08B000C345BF60A180083 +:10F31000C3E0347BF60A1800C3A0344BC088358B99 +:10F32000F60A1800C2C0E08B0007355BF60A180029 +:10F33000C351C318363BF60A1800C2F0364BC0E87A +:10F34000370BF60A1800C250E08B000D36EBF60AB8 +:10F350001800C1F0E08B0014369BF60A1800C1E1DA +:10F36000C0E8375BF60A1800C0A0378BF60A180011 +:10F37000C060373BF60A1800C111C0B8EDB40004F4 +:10F38000C0A0EDB40005C0913020C0883040C068F6 +:10F390003030C0483010C0283000403B5BFBC040DC +:10F3A000E20B0920C7985860E08B00776C0AEACC22 +:10F3B000FFFF486EFC00032F8003EE088003ED641E +:10F3C0008003ECF88003ECAC8003ECCCF4CBFFF8CA +:10F3D0008D0BF4EA0000E605083AC0F8F4CBFFFC18 +:10F3E0008D0B740AE605093AC088F4CBFFF88D0B43 +:10F3F000F4EA0000E605083A0E9B1895C4E8620A94 +:10F400005BFAC0B150195028E06A0080300B029CB2 +:10F41000F01F004D40284019E4CC00010E9B503CE9 +:10F42000F20C0C49C3A8620A5BFAC0B1501950280B +:10F43000E06A0080300B029CF01F00434028401916 +:10F440002012300A0E9BE202092AF2020C49C2582D +:10F4500016976C0AF4CBFFFC8D0B740A0E9BE60525 +:10F46000093A2FF5C1A8F4C20030C068E4020022B6 +:10F470002FF7F40200120F8A580AC0E0230A589AA4 +:10F48000FE98FFF6C0982FF70F8A580AC050230A3B +:10F49000589AFE98FFFA0E9B407C30BAF40C180084 +:10F4A000FE91FEEE4042178C0A325F4AF00C1800C3 +:10F4B0005F1CF9EA000AF00A1800FE91FECB300842 +:10F4C000404E178AE2050021F00A1800FC091710C7 +:10F4D000E6050038069EC2A8620A583AC1E0E089F3 +:10F4E0000007581AC1A0582AC181C058585AC0C034 +:10F4F000C0B5C1386C0AF4CCFFF88D0CF4E2000002 +:10F50000F0E30000C1086C0AF4CCFFF88D0CF4E2C3 +:10F510000000F0E30000C0786C0AF4CCFFFC8D0C16 +:10F52000740A910A2FF52F882FC11235FE9AFFD643 +:10F530001C934052406E85059D0B404BE60B003CF2 +:10F540002F8DD8328002E8BCD42114977428580833 +:10F55000C0419518109CD822F01F000330088F1866 +:10F560008F28D82280032320D431FACD068850A9D1 +:10F57000169014971893580CC06078685808C031DA +:10F58000F01F004E4CE81030C0316600C0A84CD8C7 +:10F590001030C0316610C0584CB81030E7F000028F +:10F5A0008068EDB80003C04160485808C071009BF6 +:10F5B000069CF01F0046E0810B4080681099E2191C +:10F5C000001A58A9C3D18079300AF4091900C385FB +:10F5D000A1D8FB5805B86088FB4805CC60A8FB485B +:10F5E00005D4FAC8FFD4FB4805BCFB4805ACE0686D +:10F5F0000400FB4805C0FB4805B43008FB5905BAB8 +:10F600000E9A40A9FAC7FA54FB4805C4069C0E9B03 +:10F61000F01F002F506CC0950E9B069CF01F002D14 +:10F62000406EF9BE01FF506EFB0805B8EDB800064C +:10F63000E0810B058068A7A8A068E08F0B00300868 +:10F64000FAC4F9F85098FB480678409CFB480674C9 +:10F65000FB48067CFB48068050573FF8FB44067089 +:10F66000FB48052C506C1896069150204055C02838 +:10F670002FF50B88300B325AF60818005F19F40882 +:10F6800018005F181268F6081800CF314059EA09CF +:10F690000107C2E0FAF806780E088909FB480678E7 +:10F6A0008917FAF806742FF8FB4806745878E08931 +:10F6B00000132F84C1A8000080031F388003EF2CA3 +:10F6C0008003EF4C8003EF6C80031C388002F568E8 +:10F6D00080031D2CFACAF990402B029CF01F00A158 +:10F6E000E0810AA6FAC4F9F840680E0850680B8851 +:10F6F0003007EE081800E0800A8AEAC2FFFF3003F4 +:10F700005052FB6706873FFE50745043503E0690B0 +:10F71000508506920C944057C0683FFC0A97503CB5 +:10F72000C02830000F38C0281292E0480063E08003 +:10F7300001CCE0890045E0480039E0890026E04836 +:10F740000031E0840198E048002BE0800101E0896D +:10F75000000FE0480023E080008EE048002AE080AF +:10F76000008CE0480020E0810897C7B8E048002EF0 +:10F77000E08000F1E0480030E080017BE048002DAF +:10F78000E081088ACE28505750420897408540743F +:10F790001092E048004FE0800439E0890008E0481A +:10F7A0000044E081087DE08F01DEE0480055E08004 +:10F7B00005DFE0480058E0810873C428E048006F86 +:10F7C000C430E089001FE0480069C450E089000AA5 +:10F7D000E0480064C400E0480068E081085DC63984 +:10F7E000E048006CE0800163505750420897408524 +:10F7F00040741092E048006EE0810852E08F02ED04 +:10F80000E0480073E0800553E089000BE048007099 +:10F81000E08004F9E0480071E081083EC5295057B6 +:10F8200050420897408540741092E0480075E0808F +:10F8300005A0E0480078E0810833E08F06964CABE5 +:10F84000509BE08F06945057408508975042407473 +:10F85000E08F03DD50574085089750424074C83907 +:10F86000FB380687300AF4081800FE91FF5D320865 +:10F87000C6E8A1A3C58B0F89F2C800305898E08B69 +:10F88000001EEEC8FFFF300B2309F60B002BF20B16 +:10F89000001B1139F2CA0030589AFE98FFF7E04970 +:10F8A0000024FE91FF40E04B0020E08909C1201BAD +:10F8B000FAF90680123BC095C108FAF90680ECCA35 +:10F8C000FFFF1236C1F5C268FAC9F9781097F20B3A +:10F8D000003BF6F2FDA4C358FAC7F9841AD7109773 +:10F8E000FAC2FAD01AD2FAC8FBCC029C1AD8FAC8CB +:10F8F000F974FAC9FFCC40BAF01F001C2FDD780262 +:10F90000C208FACEF9781496FC040038F0F2FDA48F +:10F91000C18840A859F9E0890011F0CBFFFC50AB39 +:10F920007002FACCF978F8090038F142FDA42FF9F9 +:10F930001496FB490680C058700214962FC850A830 +:10F940005802FE94FEF15C32A3A3CEDAFB68068770 +:10F95000CEAA0F38E048002AC0A03009C7D800005E +:10F960008002F5488003EDD08002F2280F88F0C9AC +:10F9700000305899E08B001EEEC5FFFF300B2308C6 +:10F98000F60B002BF00B001B0B38F0C90030589918 +:10F99000FE98FFF7E0480024FE91FEC5E04B0020F2 +:10F9A000E0890946201BFAF80680103BC095C10883 +:10F9B000FAF90680ECCAFFFF1236C1F5C288FACA0E +:10F9C000F978F40B003BF6FBFDA4503BC3C8FAC921 +:10F9D000F9841AD9FAC8FAD01AD8FAC8FBCC029C12 +:10F9E0001AD8FAC8F974FAC9FFCC40BAF01F027AE3 +:10F9F0002FDD780C503CC278FACEF9780E95FC04D5 +:10FA000000381496F0F8FDA45038C1D840A859F930 +:10FA1000E0890014F0CBFFFC700850AB5038FACCF2 +:10FA2000F978403BF8090038F14BFDA42FF90E9509 +:10FA3000FB4906801496C07870090E952FC850397E +:10FA4000149650A840385808FE95FE690A97C6BA21 +:10FA5000F40B00190F38F209002BF0CA0030589A45 +:10FA6000FE98FFF83FFEF20E0C495039C5FAA7B3D5 +:10FA7000C5AA30092308F2090029F00900190F3836 +:10FA8000F0CA0030589AFE98FFF7E0480024FE9133 +:10FA9000FE4DE0490020E08908CBF2C4000130109F +:10FAA000FE9FFE42A7A3FE9FFE3F0F89F0091800AC +:10FAB000C0512FF7A5B3FE9FFE37A5A3FE9FFE34CE +:10FAC000A5B3FE9FFE3150575042089740854074C1 +:10FAD0000C99FAF806805800C1D01037C064FACCEF +:10FAE000F978F8070037C1D8FAC8F9841AD8FAC8E3 +:10FAF000FAD01AD8FAC8FBCC1AD8FAC8F974FAC9DD +:10FB0000FFCC0A9A0E9B029CF01F02332FDD19B81E +:10FB1000C2282FF61039C084FACBF978F6070037DF +:10FB2000EF38FDA7C18840A959F8E0890012F2CA50 +:10FB3000FFFC50AA7209FAC2F978E408003A2FF8DB +:10FB4000F549FDA4FB480680F1D9C008C04813B8A8 +:10FB50002FC950A9300EFB680648FB6E0687E08F60 +:10FB600006A7A5A30C92EDB30005C4D1FAF8068050 +:10FB70005800C1E01037C064FACCF978F8070037B4 +:10FB8000C1F8FAC8F9841AD8FAC8FAD00A9A1AD869 +:10FB9000FAC8FBCC1AD8FAC9FFCCFAC8F9740E9B84 +:10FBA000029CF01F020D2FDD781A7809C288ECC282 +:10FBB000FFFF1036C0A4FACBF978F6070037EEFA4B +:10FBC000FDA8EEF9FDA4C1B840A959F8E0890013D9 +:10FBD000F2CAFFF850AAFAC6F978721AEC08003B8C +:10FBE0007209F74AFDA8F749FDA42FF8FB480680E3 +:10FBF000C068F2C8FFF8721A50A87209049650093A +:10FC0000501ACD58EDB30004C441FAF806805800EC +:10FC1000C1D01037C064FACEF978FC070037C1E8CC +:10FC2000FAC8F9841AD8FAC8FAD00A9A1AD8FAC8BF +:10FC3000FBCC0E9B1AD8029CFAC8F974FAC9FFCC07 +:10FC4000F01F01E52FDD780AC218ECC2FFFF103665 +:10FC5000C084FACCF978F8070037EEFAFDA4C16841 +:10FC600040A959F8E0890010F2CAFFFC50AAFACB6B +:10FC7000F978720AF6080039F34AFDA42FF8FB4818 +:10FC80000680C048720A2FC950A90496501AC8D8D5 +:10FC9000EDB30006C481FAF806805800C1D01037D1 +:10FCA000C064FAC8F978F0070037C1E8FAC8F984E7 +:10FCB0001AD8FAC8FAD01AD8FAC8FBCC1AD8FAC897 +:10FCC000F974FAC9FFCC0A9A0E9B029CF01F01C27C +:10FCD0002FDD9818C238ECC2FFFF1036C084FAC678 +:10FCE000F978EC070037EF08FDA6C18840A959F85C +:10FCF000E0890012F2CAFFFC50AA7209FACEF97824 +:10FD0000FC08003A2FF8F549FDA4FB480680F1D91C +:10FD1000B010C04892182FC950A950180496BF5867 +:10FD20005008C458FAF806805800C1D01037C06493 +:10FD3000FACBF978F6070037C1E8FAC8F9841AD87F +:10FD4000FAC8FAD00A9A1AD8FAC8FBCC0E9B1AD86D +:10FD5000029CFAC8F974FAC9FFCCF01F019F2FDD8D +:10FD6000780AC218ECC2FFFF1036C084FACAF978CC +:10FD7000F4070037EEFAFDA4C16840A959F8E089FC +:10FD80000010F2CAFFFC50AAFAC6F978720AEC0811 +:10FD90000039F34AFDA42FF8FB480680C048720AD8 +:10FDA0002FC950A90496501ABF5A500AFAEA000007 +:10FDB000580A5C2BC0E43008FAEA00003009F00A67 +:10FDC000010AF20B014B32D8FAEB0000FB68068700 +:10FDD0003010E08F04E30C99EDB30005C471FAF81C +:10FDE00006805800C1D01037C064FACAF978F40709 +:10FDF0000037C1D8FAC8F9841AD8FAC8FAD00A9AD2 +:10FE00001AD8FAC8FBCC0E9B1AD8029CFAC8F9740F +:10FE1000FAC9FFCCF01F01702FDD780AC2082FF657 +:10FE20001039C084FAC9F978F2070037EEFAFDA458 +:10FE3000C16840A959F8E0890010F2CAFFFC50AA35 +:10FE4000FAC3F978720AE6080039F34AFDA42FF8DC +:10FE5000FB480680C048720A2FC950A94062049826 +:10FE60009512BF589508FE9FFC03EDB30004C441F2 +:10FE7000FAF806805800C1D01037C064FACEF9787D +:10FE8000FC070037C1D8FAC8F9841AD8FAC8FAD0E2 +:10FE90000A9A1AD8FAC8FBCC0E9B1AD8029CFAC848 +:10FEA000F974FAC9FFCCF01F014C2FDD780AC208A3 +:10FEB0002FF61039C084FACCF978F8070037EEFA3B +:10FEC000FDA4C16840A959F8E0890010F2CAFFFCFE +:10FED00050AAFACBF978720AF6080039F34AFDA461 +:10FEE0002FF8FB480680C048720A2FC950A9406904 +:10FEF0009509FE9FFBBDE2130040C440FAF806805E +:10FF00005800C1D01037C064FAC8F978F00700373C +:10FF1000C1D8FAC8F9841AD8FAC8FAD00A9A1AD8F5 +:10FF2000FAC8FBCC0E9B1AD8029CFAC8F974FAC91D +:10FF3000FFCCF01F01292FDD780AC2082FF61039F7 +:10FF4000C084FAC3F978E6070037EEFAFDA4C16869 +:10FF500040A959F8E0890010F2CAFFFC50AAFAC281 +:10FF6000F978720AE4080039F34AFDA42FF8FB4837 +:10FF70000680C048720A2FC950A9406EB40EFE9F79 +:10FF8000FB77FAF806805800C1D01037C064FACC6D +:10FF9000F978F8070037C1D8FAC8F9841AD8FAC82E +:10FFA000FAD00A9A1AD8FAC8FBCC0E9B1AD8029C2F +:10FFB000FAC8F974FAC9FFCCF01F01072FDD780ADF +:10FFC000C2082FF61039C084FACBF978F60700374B +:10FFD000EEFAFDA4C16840A959F8E0890010F2CA00 +:10FFE000FFFC50AAFAC3F978720AE6080039F34A0E +:10FFF000FDA42FF8FB480680C048720A2FC950A9FB +:02000004800377 +:1000000040629502FE9FFB34A5A30C99EDB3000559 +:10001000C571FAF806805800C2601037C0A4FACE45 +:10002000F978FC070037EEEAFDA4FAEB0000C1887E +:10003000FAC8F9841AD8FAC8FAD01AD8FAC8FBCC88 +:100040001AD8FAC8F974FAC9FFCC0A9A0E9B029C16 +:10005000F01F00E12FDDF8E80000FAE900003000B1 +:10006000E08F03992FF61039C0B4FAC8F978F00779 +:100070000037EEEAFDA4FAEB0000E08F038C40A904 +:1000800059F8E0890016F2CAFFF850AAF2EA000017 +:10009000FAEB0000FACAF978F4080039FAEA00002D +:1000A000F2EBFDA42FF8FB480680E08F0374F2EA20 +:1000B00000002F89FAEB000050A9E08F036CEDB32C +:1000C0000004C141FAF806805800C0801037C60409 +:1000D000FACAF978F4070037C7782FF61039C774D1 +:1000E000FAC9F978F2070037C6F8EDB30006C45133 +:1000F000FAF806805800C1D01037C064FACCF978FD +:10010000F8070037C1D8FAC8F9841AD8FAC8FAD063 +:100110001AD8FAC8FBCC1AD8FAC8F974FAC9FFCCB5 +:100120000A9A0E9B029CF01F00AC2FDD9818C22883 +:100130002FF61039C084FACBF978F6070037EF08AC +:10014000FDA6C18840A959F8E0890012F2CAFFFC57 +:1001500050AA7209FAC2F978E408003A2FF8F54972 +:10016000FDA4FB480680F1D9B010C04892182FC9F1 +:1001700050A95C785018C418FAF806805800C1D00D +:100180001037C064FACCF978F8070037C1D8FAC83C +:10019000F9841AD8FAC8FAD00A9A1AD8FAC8FBCC45 +:1001A0000E9B1AD8029CFAC8F974FAC9FFCCF01F4A +:1001B000008A2FDD780AC2082FF61039C084FACBE6 +:1001C000F978F6070037EEFAFDA4C16840A959F89E +:1001D000E0890010F2CAFFFC50AAFAC2F978720A4C +:1001E000E4080039F34AFDA42FF8FB480680C04814 +:1001F000720A2FC950A9501A300E500E1C90E08F71 +:1002000002CA505750420897408540740C99FAF83A +:1002100006805800C1D01037C064FACCF978F807CE +:100220000037C1D8FAC8F9841AD8FAC8FAD01AD84F +:10023000FAC8FBCC1AD8FAC9FFCCFAC8F9740A9AE2 +:100240000E9B029CF01F00642FDD7809C2182FF668 +:100250001039C084FACBF978F6070037EEF9FDA41F +:10026000C17840A959F8E0890010F2CAFFFC50AAF1 +:10027000FAC2F9787209E408003AF549FDA42FF8AA +:10028000FB480680C058F2C8FFFC50A8720933082A +:10029000300EFB6806844D1C37885019A1B3FB68EB +:1002A0000685500E509CE08F02755057300B50421F +:1002B000FB6B06870897408540740C99FAF8068016 +:1002C0005800C1D01037C064FACAF978F407003773 +:1002D000C1D8FAC8F9841AD8FAC8FAD01AD8FAC814 +:1002E000FBCC0E9B1AD80A9AFAC8F974FAC9FFCC4B +:1002F000029CF01F00392FDD7807C2082FF6103955 +:10030000C084FAC9F978F2070037EEF7FDA4C16896 +:1003100040A959F8E0890010F2CAFFFC50AA720700 +:10032000FAC2F978E4080039F347FDA42FF8FB4836 +:100330000680C04872072FC950A9403E580EC1051B +:100340001C9A300B0E9CF01F0026E08002B6F807C6 +:100350000105403C1835E08902B0E08F02AF0E9CE9 +:100360003000F01F00201895E08F02A9A5A30C997A +:10037000EDB30005C581FAF806805800C2001037B9 +:10038000C064FACBF978F6070037C208FAC8F984D6 +:100390001AD8FAC8FAD00A9A1AD80E9BFAC8FBCC17 +:1003A000029C1AD8FAC8F974FAC9FFCCF01F000AE7 +:1003B0002FDDF8EA0000FAEB0000C3282FF6103911 +:1003C000C124FACAF978F4070037EEE8FDA4FAE987 +:1003D0000000C2688002F2288003EDE4800328A4B4 +:1003E0008002EDD040A959F8E0890015F2CAFFF863 +:1003F00050AAF2EA0000FAEB0000FACAF978F40811 +:100400000039FAEA0000F2EBFDA42FF8FB48068061 +:10041000C078F2EA00002F89FAEB000050A93010F2 +:10042000E08F01B9EDB30004C141FAF8068058002D +:10043000C0801037C604FACAF978F4070037C778C5 +:100440002FF61039C774FAC9F978F2070037C6F8E1 +:10045000EDB30006C451FAF806805800C1D0103739 +:10046000C064FACCF978F8070037C1D8FAC8F98423 +:100470001AD8FAC8FAD01AD8FAC8FBCC1AD8FAC8CF +:10048000F974FAC9FFCC0A9A0E9B029CF01F0086F1 +:100490002FDD9818C2282FF61039C084FACBF978CE +:1004A000F6070037EF08FDA6C18840A959F8E08992 +:1004B0000012F2CAFFFC50AA7209FAC2F978E408E5 +:1004C000003A2FF8F549FDA4FB480680F1D9B01099 +:1004D000C04892182FC950A95C785018C418FAF86F +:1004E00006805800C1D01037C064FACCF978F807FC +:1004F0000037C1D8FAC8F9841AD8FAC8FAD00A9ACB +:100500001AD8FAC8FBCC0E9B1AD8029CFAC8F97408 +:10051000FAC9FFCCF01F00642FDD780AC2082FF65D +:100520001039C084FACBF978F6070037EEFAFDA44B +:10053000C16840A959F8E0890010F2CAFFFC50AA2E +:10054000FAC2F978720AE4080039F34AFDA42FF8D8 +:10055000FB480680C048720A2FC950A9501A300EB5 +:100560003010500EC1794D1C509CEDB30005C541B3 +:10057000FAF806805800C2201037C0A4FACBF978E8 +:10058000F6070037EEE8FDA4FAE90000CF28FAC824 +:10059000F9841AD8FAC8FAD00A9A1AD80E9BFAC85F +:1005A000FBCC029C1AD8FAC8F974FAC9FFCCF01F28 +:1005B000003E2FDDF8EA0000C0C8ECCAFFFF10368D +:1005C000C0B4FAC9F9781496F2070037EEEAFDA430 +:1005D000FAEB0000CCE840A959F8E0890016F2E6F1 +:1005E0000000F2CBFFF8FAE7000050ABFAC6F9784A +:1005F000EC080039FAE60000F2E7FDA42FF81496A3 +:10060000FB480680CB68F2E600002F89FAE700007D +:1006100050A91496CAE8EDB30004C161FAF8068047 +:100620005800C0801037C6A4FACEF978FC0700370E +:10063000C838ECCAFFFF1036E0840082FACCF978A3 +:10064000F8070037C788EDB30006C4D1FAF8068072 +:100650005800C1D01037C064FACCF978F8070037D9 +:10066000C1F8FAC8F9841AD8FAC8FAD01AD8FAC860 +:10067000FBCC1AD8FAC8F974FAC9FFCC0A9A0E9BB7 +:10068000029CF01F00092FDD9818C2A8ECCAFFFFDA +:100690001036C0D4FACBF9781496F6070037EF0875 +:1006A000FDA6C1E88002F2288003EDE440A959F8D4 +:1006B000E0890013F2CBFFFC50AB7209FAC6F9785F +:1006C000EC08003B2FF8F749FDA4FB480680149680 +:1006D000F1D9B010C058921814962FC950A95C785F +:1006E0005018C458FAF806805800C1D01037C064BA +:1006F000FACCF978F8070037C1F8FAC8F9841AD8A3 +:10070000FAC8FAD00E9B1AD8FAC8FBCC0A9A1AD8A3 +:10071000029CFAC8F974FAC9FFCCF01F00C42FDD9F +:10072000780BC248ECCAFFFF1036C094FACBF978B8 +:10073000F60700371496EEFBFDA4C18840A959F8CE +:10074000E0890011F2CBFFFC50ABFAC6F978720BCE +:10075000EC080039F34BFDA42FF81496FB480680F3 +:10076000C058720B14962FC950A9501B300E500E52 +:100770004008401C300B18485F18E7E80008F608EE +:100780001800C0703308FB620685A1B3FB680684BD +:100790003020300AFB6A068740395809C025A7D3A4 +:1007A0004038401758085F194008FAC5F9900E48BC +:1007B00030025F18F3E81008E4081800C5E03018AC +:1007C000F0001800C0603028F0001800C051C3E8E5 +:1007D0000A970690C2C80A97FAE80000F5D8C00345 +:1007E0002D0A0EFAF00B1603F20C1603F7E911DBD3 +:1007F0001899169858085C29CF21FAE90000EDB342 +:100800000000C4613309F20A1800C4200EF9C408BC +:10081000F01F008730A82D0A3009AE8AFAEA0000DE +:10082000F01F008416991498FAE90000EECC00013C +:1008300030A83009FAEA00001897589A5C2BFE9B02 +:10084000FFE91BF800932D08C2080A97FAE8000098 +:10085000F5D8C004409EFC0A070A0EFAF20B1604F3 +:10086000F00A1604F5E911CA1699149858085C297B +:10087000CF01FAE90000C0C85800C091EDB30000F4 +:10088000C061FAC7F9913308AE88C0280A970E15DF +:100890004030C14850425057407410925802E08096 +:1008A00001B6300CFB620648FB6C06873015300041 +:1008B000FAC7F9B8C03840353000069A0699E21AEE +:1008C0000002E2190084508A5079EA000C42FB3899 +:1008D0000687300BF6081800F7B201FF580AF7B286 +:1008E00001FE5809C4514048041850385808E0899E +:1008F000001DC3E8FB4C06784CFE310C890E891CA8 +:10090000FB4B0674587BE08900042F84C0B8FACAF8 +:10091000F990402B029CF01F0049E0810189FAC444 +:10092000F9F8403B210B503BFAF90678FAF80674C7 +:10093000F2CCFFF0F0CBFFFF4BFA403E590EFE9990 +:10094000FFDB1C09890AFB490678891EFB4B0674EC +:10095000587BE08900042F84C0B8FACAF990402B74 +:10096000029CF01F0036E0810163FAC4F9F8FB38FD +:100970000687300CF8081800C1F0FAF80678FAC9B2 +:10098000F9792FF88909FB4806783019FAF80674C6 +:1009900089192FF8FB4806745878E08900042F84E1 +:1009A000C0B8FACAF990402B029CF01F0024E081E5 +:1009B000013FFAC4F9F8408B580BC1F0FAF80678F9 +:1009C000FAC9F97C2FE88909FB4806783029FAF83A +:1009D000067489192FF8FB4806745878E0890004DA +:1009E0002F84C0B8FACAF990402B029CF01F001364 +:1009F000E081011EFAC4F9F8407AE04A0080C5118E +:100A00004049041950395809E0890029C4A848C848 +:100A1000310EFB4C06788908891EFB4B0674587B07 +:100A2000E08900102F84C1788002F228800373408F +:100A30008002D9988003EDF88002F5488003ECE845 +:100A4000FACAF990402B029CF01F0052E08100F09E +:100A5000FAC4F9F8403C210C503CFAF90678FAF84F +:100A60000674F2CCFFF0F0CBFFFF4CBA403E590EBB +:100A7000FE99FFCF1C09890AFB490678891EFB4BAA +:100A80000674587BE08900042F84C0B8FACAF99034 +:100A9000402B029CF01F003FE08100CAFAC4F9F825 +:100AA0000A105800E089001BC3B8FB4C0678310AD5 +:100AB0004B9C891A890CFB4B0674587BE089000417 +:100AC0002F84C0B8FACAF990402B029CF01F003165 +:100AD000E08100AEFAC4F9F82100FAF90678FAF8D4 +:100AE0000674F2CCFFF0F0CBFFFF4ABA5900FE9932 +:100AF000FFDE0009890AFB4906788910FB4B067462 +:100B0000587BE08900042F84C0B8FACAF990402BC2 +:100B1000029CF01F0020E081008BFAC4F9F8FAF87B +:100B2000067889158907F0050005FAF80674FB4573 +:100B300006782FF8FB4806745878E08900042F8463 +:100B4000C0A8FACAF990402B029CF01F0012C6F10F +:100B5000FAC4F9F8E2130004C41040470417580718 +:100B6000E089001CC3B8FB4C067889058913FB4B50 +:100B70000674587BE08900042F84C098009A402BAB +:100B8000029CF01F0004C531FAC4F9F82107C0988F +:100B90008002F5488003ECE84AB53103FAC0F990C9 +:100BA000FAF90678FAF80674F2CCFFF0F0CBFFFF02 +:100BB0004A5A5907FE99FFD90E09890A8917FB4934 +:100BC0000678FB4B0674587BE08A0009FACAF99054 +:100BD000402B029CF01F001DC2A140684049E4095F +:100BE0000C4204085068FAF806785808C080FACA1F +:100BF000F990402B029CF01F0015C1913003FAC4FC +:100C0000F9F8FB430674FE9FF53302934020FAF88F +:100C100006785808C080029CFACAF990009BF01F21 +:100C2000000BC0613008FB480674C0284020806873 +:100C3000EDB80006C0313FF25062406CFE3DF978DD +:100C4000D83200008003EDF88002F548D431FACDA7 +:100C500001E03007503C16961295507A5087505755 +:100C60000E930E905047407E1D8957795809E080B9 +:100C700007A22FFE4D5C507E780C502CF809070817 +:100C8000E2180008C1B06C185808E08900070C9BF6 +:100C9000403CF01F004FCE816C084CCBF0C9FFFFE9 +:100CA000760A1188F4080708EDB80003CDD16C1856 +:100CB0008D0920182FF08D18CE7BE0490025E081AA +:100CC000008906941091109236CA344C358E407BC0 +:100CD0001739507B364BF6091800E08000BBE08BDB +:100CE0000042F8091800E08000B4E08B0021339B3B +:100CF000F6091800E08B01D2330BF6091800E082E8 +:100D00000094325BF6091800C640E08B000B5809CE +:100D1000E080074F324BF6091800E08101BFC8A8F8 +:100D200032ABF6091800E08101B9C6D8FC091800F9 +:100D3000E08000A4E08B000C34CBF6091800C7005B +:100D400034FAF4091800E08101A9C8C835BAF409D9 +:100D50001800E0800098363AF4091800E081019EFE +:100D6000C9E836FBF6091800C7E0E08B0017369B90 +:100D7000F6091800C720E08B0008368BF60918002A +:100D8000E081018CC4F8F4091800C3F036EAF409D4 +:100D90001800E0810183C8D8373AF4091800C1303F +:100DA000E08B0008370AF4091800E0810177C7A832 +:100DB000375AF4091800C5C0378AF4091800E081D1 +:100DC000016DC5B83029C7590000049C800328BCB8 +:100DD0006C185808E08900080C9B403CF01F006428 +:100DE000E08106E0407A6C08F539FFFF118AF20ACB +:100DF0001800E08106E02FF82FF08D086C182018FD +:100E00008D18C32BA5A1C64B407B1789F409180088 +:100E1000C0512FFBA1B1507BC5BBA1A1C59BA1B106 +:100E2000C57BA3A1C55BE4020022A17223021202CA +:100E3000C4FBE0420020E08B0007E4C4000130184E +:100E40003002C46B3168403A9538E08F06ABA1A1FF +:100E50004C8930AE5089C2B84C6C300B508C505B12 +:100E6000C279A1A14C4A3089508A5059C2194C2EDE +:100E700030AC508E505CC1C94BFBA9B1508B310ACC +:100E8000C169301950085019407BFACCFFD4F01FCB +:100E9000003BA7A1507C40194008C0B9A7A1300968 +:100EA000C0894B59E81102205089310E505EC009AB +:100EB000EDB10004FE90FED9EDB10002C441580826 +:100EC000C2500E34C064FACCFE20F8040024C2786C +:100ED000FACAFED40A99F407002A0E98130B14AB31 +:100EE0002FF81034CFC4EEC9FFFFEE0811FFF0C792 +:100EF000FFFF2FE808080807EA080025F2070007A7 +:100F0000FAC8FED4F0040324C1C8E6C8FFFF0E33BC +:100F1000C094FACBFE201093F6040024E8F4FF4CB2 +:100F2000C1086A042FC559F7E089000B1093FACA6B +:100F3000FE20F40700282FF7F144FF4CC02810933F +:100F4000A800C92AEDB10000C1A15808E0800088BE +:100F50000E34C635FACAFED40A99F407002A0E9850 +:100F6000130B14AB2FF81034CFC4C678800328BC01 +:100F70008002EFB480032E6C800329ECE2110002A2 +:100F8000C4805808C2500E34C064FACCFE20F80465 +:100F90000024C278FACAFED40A99F407002A0E98EF +:100FA000130B14AB2FF81034CFC4EEC9FFFFEE08BB +:100FB00011FFF0C7FFFF2FE808080807EA0800251F +:100FC000F2070007FAC8FED4F0040324C1C8E6C83B +:100FD000FFFF0E33C094FACBFE201093F6040024DA +:100FE000E8F4FF4CC1086A042FC559F7E089000BEB +:100FF0001093FACAFE20F40700282FF7F144FF4CA3 +:10100000C0281093E008141F89108908FE9FFE2D48 +:101010005808C2500E34C064FAC9FE20F2040024FD +:10102000C278FACAFED40A99F407002A0E98130B64 +:1010300014AB2FF81034CFC4EEC9FFFFEE0811FF38 +:10104000F0C7FFFF2FE808080807EA080025F207A5 +:101050000007FAC8FED4F0040324C1C8E6C8FFFFA5 +:101060000E33C094FAC2FE201093E4040024E8F486 +:10107000FF4CC1086A042FC559F7E089000B109393 +:10108000FACEFE20FC0700282FF7F144FF4CC028C1 +:1010900010938900FE9FFDE9402CF8090709EDB97E +:1010A0000000C021A1A14C7B30AA508B505A30398E +:1010B0006C1A580AE089000C501950080C9B403CEF +:1010C000F01F004140194008E081056CEDB10006B9 +:1010D000C151C1F86C1A201A8D1A580AE08A00040E +:1010E0008D0CC0B8501950080C9B403CF01F0036C6 +:1010F00040194008E08105562FF06C0A4B3EF4CCB5 +:10110000FFFF7C0B158AF60A070AEDBA0003CE3002 +:101110005829E08001C05839E080031D5819E0804B +:10112000011B029CE21C0010502C5802F9B2000175 +:10113000E3D1C001E080009B580CC0303001C4985E +:101140005808C2500E34C064FACBFE20F6040024C6 +:10115000C278FACAFED40A99F407002A0E98130B33 +:1011600014AB2FF81034CFC4EEC9FFFFEE0811FF07 +:10117000F0C7FFFF2FE808080807EA080025F20774 +:101180000007FAC8FED4F0040324C228E6C8FFFF13 +:101190000E33C094FACAFE201093F4040024E8F43D +:1011A000FF4CC1686A042FC559F7E08900111093FC +:1011B000FAC9FE20F20700282FF7F144FF4CC0883F +:1011C0008002EFB4800328BC0000049C10930891B7 +:1011D00030044D5E7C081034E08004E46C08118912 +:1011E000FAC8FE200808F169FFCC6C1820188D1889 +:1011F0006C082FF8308A8D08300BFACCFE2CF01FCB +:10120000004B2FF4FAC8FE2C0899FACAFE54029B30 +:10121000403CF01F00475BFCE08004C4580CC061F8 +:10122000402C580CC051830CC0385BECC0B0080097 +:10123000402B2012580BF9B40100F7B100FCFBF46D +:1012400000026C185808E089000B0C9B403CF01F12 +:101250000039C0505804C050E08F04A45802CBA1FC +:10126000402A580AFE91FD01C718402E580EC1A011 +:101270006C186C090438C0F4100910128D091001A3 +:101280000C9B403CF01F002BCF405801E08101E651 +:10129000E08F0488040904188D098D180401E08F7B +:1012A00001DD5808C2500E34C064FACCFE20F804A8 +:1012B0000024C278FACAFED40A99F407002A0E98CC +:1012C000130B14AB2FF81034CFC4EEC9FFFFEE0898 +:1012D00011FFF0C7FFFF2FE808080807EA080025FC +:1012E000F2070007FAC8FED4F0040324C258E6C887 +:1012F000FFFF0E33C094FACBFE201093F6040024B7 +:10130000E8F4FF4CC1986A042FC559F7E08900142E +:101310001093FACAFE20F40700282FF7F144FF4C7F +:10132000C0B80000000009AC8002E8BC800328407F +:10133000800328BC1093049A089C0C99301BF01F62 +:1013400000C9E080042FF800000040492FF95049FF +:10135000FE9FFC8B5802F9B200FFEDB10004C261A0 +:1013600030040891C1286C188D0920188D182FF4AD +:101370000832E080008D5808E08900080C9B403C52 +:10138000F01F00B9E08100846C08FACEFE20F0C99D +:10139000FFFF1188FC080008F138FE4CE208180035 +:1013A000CE315804C741E08F04065808C2500E34AD +:1013B000C064FACCFE20F8040024C278FACAFED435 +:1013C0000A99F407002A0E98130B14AB2FF8103467 +:1013D000CFC4EEC9FFFFEE0811FFF0C7FFFF2FE8F3 +:1013E00008080807EA080025F2070007FAC8FED433 +:1013F000F0040324C1C8E6C8FFFF0E33C094FACB43 +:10140000FE201093F6040024E8F4FF4CC1086A049F +:101410002FC559F7E089000B1093FACAFE20F40794 +:1014200000282FF7F144FF4CC02810930891300892 +:10143000C1886C1A201A8D1A133A02CA8D095802F3 +:10144000C1D06C195809E089000D50080C9B403C34 +:10145000F01F00854008C0500831C101E08F03A291 +:101460006C0AFACEFE2014992012158AFC0A000A92 +:10147000F53AFE4CF00A1800CDD1E2040104E080F8 +:10148000039A404C2FFC504C3008A2880800FE9F65 +:10149000FBEC029BE21B0010502B5802F9B200FF3C +:1014A000E3D1C001E08000BC580BC050FACAFE2452 +:1014B000506AC4385808C2500E34C064FAC9FE20BD +:1014C000F2040024C278FACAFED40A99F407002A6A +:1014D0000E98130B14AB2FF81034CFC4EEC9FFFFD6 +:1014E000EE0811FFF0C7FFFF2FE808080807EA0819 +:1014F0000025F2070007FAC8FED4F0040324C1C88F +:10150000E6C8FFFF0E33C094FACEFE201093FC0411 +:101510000024E8F4FF4CC1086A042FC559F7E0899C +:10152000000B1093FACCFE20F80700282FF7F144A7 +:10153000FF4CC0281093506430014CC4C598680813 +:101540001031E080032FFAC8FE200208F169FFCCB9 +:101550006C1820188D186C082FF8308A8D08300B05 +:10156000FACCFE2CF01F00422FF1FAC8FE2C029993 +:10157000FACAFE54406B403CF01F003E5BFCE0802A +:101580000311580CC041406B970CC0385BECC23063 +:10159000406A740CF01F0038C100FAC4FE20020437 +:1015A0002354C088098B201120140C9A403CF01F52 +:1015B00000335801CF81C2C80200402920125809C7 +:1015C000F8011710FBF80006F7B800FCFBF80A0654 +:1015D000FBF100026C185808E089000B0C9B403CA2 +:1015E000F01F0021C0505801E08102DCC1186C08D6 +:1015F00058025F1A11894A2E300C7C08F00907083E +:10160000EC180008F5E80238F8081800C991402BDA +:10161000580BFE91FB2A406A950BC98A402E580E42 +:10162000C300C1086C188D0A20188D182FF10232E2 +:10163000C1405808E08900070C9B403CF01F000A9D +:10164000C0C16C0848ECF0CAFFFF78091188F208A5 +:101650000708EDB80003CE710200FE9FFB060000F4 +:10166000800320B8800328BC000009AC8002E8BCDD +:10167000800328408003274880032FF40000049C47 +:101680005808C2500E34C064FACBFE20F604002481 +:10169000C278FACAFED40A99F407002A0E98130BEE +:1016A00014AB2FF81034CFC4EEC9FFFFEE0811FFC2 +:1016B000F0C7FFFF2FE808080807EA080025F2072F +:1016C0000007FAC8FED4F0040324C1C8E6C8FFFF2F +:1016D0000E33C094FACAFE201093F4040024E8F4F8 +:1016E000FF4CC1086A042FC559F7E089000B10931D +:1016F000FAC9FE20F20700282FF7F144FF4CC0285A +:1017000010930891C1286C1920198D19113902C93B +:101710008D085802C1506C185808E08900070C9BCE +:10172000403CF01F0059C0C16C094D8E12987C0AD4 +:1017300013892012F4090709EDB90003CE51404C7A +:101740002FFC504C08103008E2000000A288FE9FD9 +:10175000FA8CE4C90001E0490026E08B0005300B5B +:10176000506BC058E4CA00273272506A3009FACE72 +:10177000FE54509950A7E8110D80502E35894057DE +:101780006C0A339C158AF80A1800E08B0015338B1D +:10179000F60A1800C4E2330BF60A1800C270E08B98 +:1017A000004532BBF60A1800C51032DBF60A1800F5 +:1017B000C7C1C4C8F20A1800C4E0E08B000AF4CB29 +:1017C0000041305EFC0B1800E08B0070C398361CA3 +:1017D000F80A1800C6A3366BF60A1800E088003134 +:1017E000378EFC0A1800C611C368029BEDB1000BCE +:1017F000C3C15807E06B0200E3DBE031F9B7000832 +:10180000EDB1000AC041E011FA7FC2F8409B406C84 +:101810002FFB580CF7BC0101FBFC1A06F7B201FFC5 +:10182000E011FC7F509BC248499EFC070417C0B8DA +:10183000497CF80704175887E0890006C36858A751 +:10184000E08A0034E011F47FC108EDB10007C2D195 +:10185000A7D1C0B8029BE21B0600E04B0200C251B8 +:10186000A9D13107E8110500402B16CA502B6C1A7C +:10187000201A8D1A580AE08A000D6C0A2FFA8D0A78 +:10188000C1180000800328BC0000049C8003EF08FE +:10189000501950080C9B403CF01F00BD40194008F7 +:1018A000C0412012FE91FF6E505740A7EDB10008D5 +:1018B000C161FAC9FE54402A123AE088000B40295F +:1018C0000C9A137B403C50085029F01F00B240088E +:1018D000FAC9FE5440221232E080016D029AE21AE7 +:1018E0000010E081014B402EBC8A50084059FACBD1 +:1018F000FE54403C40825D1202994008E2190020EB +:10190000C2A05808C1400E34C064FACEFE20FC04C8 +:101910000024C1D9FACAFED40A99F407002A0E9805 +:10192000130B14AB2FF81034CFC4CF68E6C8FFFFF9 +:101930000E33C064FACBFE20F6040024C0796A049A +:101940002FC559F7E08901151093FACAFE20F40754 +:101950000028C0A9EDB10002C4415808C2500E349D +:10196000C064FAC9FE20F2040024C278FACAFED488 +:101970000A99F407002A0E98130B14AB2FF81034B1 +:10198000CFC4EEC9FFFFEE0811FFF0C7FFFF2FE83D +:1019900008080807EA080025F2070007FAC8FED47D +:1019A000F0040324C1C8E6C8FFFF0E33C094FAC296 +:1019B000FE201093E4040024E8F4FF4CC1086A04FC +:1019C0002FC559F7E089000B1093FACEFE20FC07D3 +:1019D00000282FF7F144FF4CC0281093A80CCCA886 +:1019E000F5D1C001C2A05808C1400E34C064FACB82 +:1019F000FE20F6040024CAB8FACAFED40A99F407F5 +:101A0000002A0E98130B14AB2FF81034CFC4C8481B +:101A1000E6C8FFFF0E33C064FACAFE20F4040024B7 +:101A2000C9586A042FC559F7E08900A31093FAC971 +:101A3000FE20F2070028C988E2110002C5904D6916 +:101A400040821232C091FACBFE544059403C5008BB +:101A5000F01F0052C088FACBFE544059403C500859 +:101A6000F01F004F40085808C2500E34C064FACE30 +:101A7000FE20FC040024C278FACCFED40A99F807B0 +:101A8000002C0E98130E18AE2FF81034CFC4EEC9E8 +:101A9000FFFFEE0811FFF0C7FFFF2FE80808080757 +:101AA000EA080025F2070007FAC8FED4F004032470 +:101AB000C1C8E6C8FFFF0E33C094FACCFE201093D5 +:101AC000F8040024E8F4FF4CC1086A042FC559F754 +:101AD000E089000B1093FAC9FE20F20700282FF7C7 +:101AE000F144FF4CC0281093891A890BC438580858 +:101AF000C2500E34C064FAC8FE20F0040024C2783C +:101B0000FACAFED40A99F407002A0E98130B14ABF4 +:101B10002FF81034CFC4EEC9FFFFEE0811FFF0C755 +:101B2000FFFF2FE808080807EA080025F20700076A +:101B3000FAC8FED4F0040324C1C8E6C8FFFF0E3380 +:101B4000C094FAC2FE20E40400241093E8F4FF4C91 +:101B5000C1086A042FC559F7E089000B1093FACE2B +:101B6000FE20FC070028F144FF4C2FF7C0281093FB +:101B7000890C404C2FFC504CFAC8FE54409B10106E +:101B8000402A1600F4000000FE9FF86F800328BC76 +:101B900080032FF480032E6C80032CE480032B340D +:101BA00040495809C0508C68EDB80006C0313FF874 +:101BB0005048404C288DD832D421217D1497189656 +:101BC000129A5807C064E068008B99383FFCC2281D +:101BD0005807EE0C1700F9B901FFEFD9E10C109985 +:101BE000E0680208BA683FF8504B505C500B502C2C +:101BF000BA781A9B0C9CF01F00095BFCC044E0689B +:101C0000008B8D385807F9B90100FBF81000F1F985 +:101C10001E002E9DD82200008002F568D401129883 +:101C20001499169A189B483C780CF01F0003D802B0 +:101C30000000059880031BB8D4214B3818961697DE +:101C4000700C580CC06078685808C031F01F002F25 +:101C50004AF81037C0514AC870087007C0E84AD81F +:101C60001037C0514A8870087017C0784AA81037DA +:101C7000C0414A58700870278E68EDB80003C1E073 +:101C8000EDB80004C3E1EDB80002C1516EDB580BA2 +:101C9000C0A0EEC8FFBC103BC0400C9CF01F001F52 +:101CA00030088FD88E68E018FFDBAE6830088F18D8 +:101CB0006E488F088E68A3B8AE686E485808C0B1E9 +:101CC0008E68E2180280E0480200C0500C9C0E9B17 +:101CD000F01F00138E69F1D9C001C07030088F2841 +:101CE0006E585C388F68C068EDB90001EFF81005D8 +:101CF0008F286E485808C0618E68EDB80007C02173 +:101D0000DC2AD82A0000059880031F388003EF2CB6 +:101D10008003EF4C8003EF6C8003217C8003276CF1 +:101D20004828700C2F4C5EFC00000598D4211697B3 +:101D3000189676485808C7D0580CC060786858087C +:101D4000C031F01F003D4BD81037C0316C07C0A820 +:101D50004BB81037C0316C17C0584BA81037EDF78F +:101D600000028E6A1498EDBA0003C420ABBAAE6AC2 +:101D70006E185808E08900066F085808E08A005A73 +:101D80006EB85808C560E21A1000C0306F55C0F830 +:101D900030196E8B0C9C5D1818955BFCC0816C38FB +:101DA00059D8C4708E68A7A8AE68D8228E68EDB8DE +:101DB0000002C0916E1810156ED85808EFF8101078 +:101DC000EBD8E1156EB80C9C30090A9A6E8B5D1841 +:101DD0008E680A3CC261ABD8300C6E49AE688F1C6D +:101DE0008F09EDB8000CC251EF450054D8226E4562 +:101DF0005805C1F06E04F5DAC0028F05F9B801008C +:101E0000EFF800050A148F28C11808990A9A6EA8DD +:101E10006E8B0C9C5D181814580CE08900078E68B6 +:101E2000A7A83FFCAE68D82218055804FE99FFEF1A +:101E3000D82A000080031F388003EF2C8003EF4C6A +:101E40008003EF6CD401189B580CC0714868487B24 +:101E5000700CF01F0007D8024868700CF01F0003D8 +:101E6000D80200008003ECA880031D2C800325E825 +:101E7000000005985EFC5EFCD401483BF01F0003A7 +:101E8000D80200008003629080032640D42116957A +:101E9000F606105CECCBFFF4F01F00071897C0901B +:101EA0009915300B2F4C0C9A8F2C8F0BF01F0003C1 +:101EB0000E9CD8228002E2BC8002E8BCD42149C832 +:101EC000189670076E685808C0410E9CF01F0019E4 +:101ED000EEC7FF2830056E2C6E18C0689869EA09B5 +:101EE0001900C1202A4C2018CFA76E085808C071CD +:101EF000304B0C9CF01F00108F0CC0306E07CECB07 +:101F000030C88D38D8223008F948004C99089928F3 +:101F1000991899489958996899D899E8F9480048C2 +:101F20003FF8B8783018B868D82200008003ECA8D1 +:101F300080031F3880031E8CD421189678675807B9 +:101F4000C4714A48301599A8F94700D8F94700DC10 +:101F5000F94700E09965F01F00208D0C0C9CF01FE4 +:101F6000001E8D1C0C9CF01F001C6C093048930750 +:101F7000B268931793276C18B27793479357936778 +:101F80009389910791179127494E495B939E93AB93 +:101F9000494A495493BA93C43099B069B07591C411 +:101FA0009147915791679188919E91AB91BA8D2CF1 +:101FB00031289907B868991799273028B87899C4B3 +:101FC0009967999E99AB99BA99479957998CD82254 +:101FD00080031E7880031EBC80032B1080032AD848 +:101FE00080032AAC80032A9CD4014858169AFAC967 +:101FF000FFFC189B700CF01F0003D802000005982E +:1020000080033424D43114901291169310971895AC +:10201000F20A02425802C0310491C418580CC06040 +:1020200078685808C031F01F001F49F81037C031D8 +:102030006A07C0A849D81037C0316A17C05849C8C4 +:102040001037EBF700026E185808C03430088F18AC +:102050000496C148F01F00176E08080308160E9B6F +:10206000F00400040A9C8F04F01F0013C070E40603 +:102070000109F2000D081091C1286E146E08069C2B +:10208000089A109B0836FE9BFFE70C9AF01F000988 +:102090006E080C088F086E180C188F18029CD83226 +:1020A00080031F388003EF2C8003EF4C8003EF6C1C +:1020B0008002E736800328BCD40112981499169A3E +:1020C000189B483C780CF01F0003D80200000598CC +:1020D00080032004D42116951897F01F00234A345A +:1020E00068287016E016FFFCECC8FF91F0050105AA +:1020F000E015FF80EAC50080E045007FE08A00230C +:10210000300B0E9CF01F001A68280C08103CC1A16F +:10211000EA0B11000E9CF01F00165BFCC171300B26 +:102120000E9CF01F00136828F808010958F9E08A8E +:10213000000AA1A9911948F8700948F8F80901099D +:1021400091090E9CF01F000DD82A68280A16A1A636 +:102150009116489870090A190E9C9109F01F000702 +:10216000DA2A00008002E8CA0000059C8002EBC861 +:10217000000009A800007AD08002E8CCD42116968D +:102180001897580BE08000CAF01F004E20864CEADA +:102190006C18742EF9D8C001A1C8EC080009721B94 +:1021A000E01BFFFC1C39C1D1F6080008580CC081A7 +:1021B0006C09121612086C3B6C299729933B1099F5 +:1021C0009526A1A98D194C1972091238C0634C08C3 +:1021D0000E9C700BF01F003F0E9CF01F003FD8229A +:1021E000931B580CC030300CC1086C0EF4C5FFF8BE +:1021F0001C161C086C2E0A3EF9BC0001EDF51003FC +:10220000EBFE1A02FDF51A03F20B000E7C1EEDBE6A +:102210000000C1301608580CC0C14ABE722B2F8E68 +:102220001C3BC071973697268D2B8D3B301CC058B8 +:10223000722B7239932B97391099EC080908A1A9D0 +:102240008D19580CC671E04801FFE08B0013A3986C +:10225000F4080039722B8D398D2B97369326A348BD +:102260007419301BF6080948F3E810089518C528BA +:10227000F00916095849E08B0006F00B16062C8B66 +:10228000C2D85949E08B0005F2CBFFA5C278E049DE +:102290000054E08B0006F00B160C292BC1F8E04926 +:1022A0000154E08B0006F00B160F289BC178F00B51 +:1022B0001612E0490554E088001137EBC0F8000021 +:1022C0008002E8CA0000059C000009A400007ACC46 +:1022D000800320D48002E8CC284BF40B003C782902 +:1022E0001839C0E17418A34B301CF80B094BF1EB03 +:1022F000100B1298951BC0A872291839C060721A69 +:10230000E01AFFFC1438CF9372388D388D2993363C +:1023100091260E9CF01F0002D82200008002E8CC1B +:10232000D431203D14941895169774285808E080ED +:10233000014A9668EDB80003C04176485808C0C10C +:102340000E9B0A9CF01F00A1C0708E68A7A8AE6803 +:1023500030988B38C3598E6368000696E2160002E7 +:10236000C2103003E06204000696C04860036016A5 +:102370002F805806CFC0E0460400EC091780E4091E +:1023800017B0069A6EA86E8B0A9C5D181816580C2A +:10239000E08A0114682818188928E08001141803BD +:1023A000CE9BE7D3C001C07050060C930C91501522 +:1023B0000892CA0806960891C048600360162F80EC +:1023C0005806CFC08E686E241099E2190200C570BD +:1023D0000836C4531099E2190480C4106E4B6E097C +:1023E000161950096E59109CF209001A3028F40889 +:1023F0000C08FAE9000410944009E21C04002FF9CB +:102400000C091238F2041730580CC110089B0A9CB2 +:10241000F01F006F1892C150400A6E4BF01F006D04 +:102420008E68E018FB7FA7B8AE68C0E8089A0A9CDF +:10243000F01F00691892C0816E4B0A9CF01F006764 +:1024400030C88B38CBA8400A4009E80A010AE409E1 +:1024500000088F548F2A8F088F420C940836EC04A2 +:102460001730069B089A6E0CF01F005D6E08080876 +:102470008F086E2808180C948F28C30808365FBA96 +:102480006E0C6E48103C5FB8F5E80008F2081800C2 +:10249000C0E0069B089AF01F00526E0808080E9BC9 +:1024A0008F080A9CF01F004FC190C8786E591236F1 +:1024B000C0A36EA8069A6E8B0A9C5D181894E089DA +:1024C000000EC7B80C9A069BF01F00456E080C085A +:1024D0000C948F086E280C188F28622808188328FF +:1024E000C71008160803C6DB6003601130082F8090 +:1024F00050085801CFA0400A580AC181029A30AB57 +:10250000069CF01F0039F9B80101F9D8E106EDD3B6 +:10251000E116F9B90101FBF91A00F9B80001E3D895 +:10252000E006F9B80001FBF80A000236EC04178057 +:10253000E20417B06E596E25F20500050A345F9A61 +:102540006E0C6E48103C5FB8F5E80008300AF408DD +:102550001800C0E0069B0A9AF01F00216E080A08C6 +:102560000E9B8F08401CF01F001FC180C2681234F0 +:10257000C0A56EA8069A6E8B401C5D181895E08960 +:10258000000EC1B8089A069BF01F00156E080808D7 +:1025900008958F086E2808188F280A16C0710E9BA0 +:1025A000401CF01F0010C091500664280A188528AE +:1025B000C0900A110A03C9EB8E68A7A8AE683FFC59 +:1025C000C028300C2FDDD83280031C388002E2BCDA +:1025D0008002E7368002E8E88003217C8002E87E02 +:1025E00080031D2C800328A4D43130051893169045 +:1025F0000A91F01F00123FF2E6C7FF28C1786E264D +:102600006E142F46C0D88C08E2081900C0808C18C0 +:10261000E4081900C040069C5D1018452A462014A5 +:10262000ECCB000C5804CF046E075807CE91F01F76 +:1026300000040A9CD832000080031E7480031E76BA +:10264000D43130051691F8C7FF280A92F01F001008 +:102650003FF3C1686E266E142F46C0C88C08E4088C +:102660001900C0708C18E6081900C0305D111845BB +:102670002A462014ECCC000C5804CF146E075807DF +:10268000CEA1F01F00040A9CD832000080031E7403 +:1026900080031E76D401201D4848189B1A9A700C9E +:1026A000F01F00032FFDD80200000598800326B01C +:1026B000D431169414921895F01F00204A08700720 +:1026C0005807C050300633DA0C98C0780A9CF01FC7 +:1026D000001D0E9CD8322FF6E8060709F0091800F5 +:1026E0005F1BF40918005F191669F0091800CF4143 +:1026F000C1A8029C0C9A089BF01F0013C1216E0117 +:102700000C010388E6081800C0C148D870080A9C6C +:102710001017A3478507F01F000BE2CCFFFFD8324C +:102720002FC7C02833D36E015801CE410A9CF01F39 +:102730000005029CD8320000800361BC000009B093 +:10274000800361BE8002EDE6E04C00FFE0880003FC +:102750005EFD48487008F00C070CE21C00085EFCA7 +:102760000000049C481C5EFC8003EF8CD42120FDFB +:10277000966816971896E2180002C3C1967BF00B74 +:102780001900C0551A9AF01F002AC0F48E650A98E5 +:10279000ABB8E2150080AE683004E0680400F9B51B +:1027A0000140F0051700C1B84018E218F000E048F9 +:1027B00020005F04E0488000C0D16EB949D81039CC +:1027C000C0918E68E0650400ABA8EF450050AE688C +:1027D000C0688E68E0650400ABB8AE680A9B0C9CCC +:1027E000F01F00158E68C0D1EDB80009C1E0A1B896 +:1027F000AE68EEC8FFB98F488F0830188F58C1589F +:10280000A7B88F4CAE688F5548C88F0C8DA8580458 +:10281000C0C08E7CF01F000AEFF81206F9B9010162 +:10282000F1D9E138EFF81C062F1DD822800362A8E9 +:1028300080032AAC8002E2BC80031E788002F1682B +:10284000D42118971096580AC041149B3019486A31 +:10285000F01F00065BFCC06130088D08E068008A4C +:102860008F38D82280037E208003286C201D5809D1 +:102870005F09580BFA0B1700580A5F18F3E80008B5 +:102880003009F2081800C0303FECC0B8580AC03117 +:10289000149CC078158997091589F00918005F1CE8 +:1028A0002FFD5EFCF7DBC008C068201A19881638B7 +:1028B0005E0C2FFC580ACFA15EFAD703D4211697DD +:1028C0001896580CC06078685808C031F01F00385E +:1028D0004B881037C0316C07C0A84B781037C03117 +:1028E0006C17C0584B581037EDF7000230088F189E +:1028F0008E68EDB80005C590EDB80002C1A0EDB836 +:102900000004C060A7A8AE6830988D38C4D8EDB870 +:102910000003C0B10E9B0C9CF01F0029C4618E689F +:102920008F6CA3D88F2CAE688E68A3A8AE68C14800 +:102930006EDB580BC110EEC8FFBC103BC0400C9CB6 +:10294000F01F0020300C6F088FDC8F185808C04033 +:102950006EF88F08D8226E485808C0510E9B0C9C08 +:10296000F01F00198E68F1D8C002C0604978498B09 +:10297000700CF01F00186E4A6E980C9C8F0A6E59EE +:102980006E8B5D188E688F1CADD8AE68580CE08ACF +:102990000003D82A580CC041A5B8AE68C058A7A8F3 +:1029A000AE6830088F18DC2ADC2A000080031F384C +:1029B0008003EF2C8003EF4C8003EF6C80031D2C11 +:1029C0008003217C8003276C8003ECA8800329D43A +:1029D00080032640D4019868E21800095898C02066 +:1029E000D80AF01F0002D80280031E44D431189E7A +:1029F0001738E048005EC030300AC0381738301A47 +:102A00003009FC090B0A2FF9E0490100CFB1580841 +:102A1000C041F6CC0001D832149632D4EC16000135 +:102A2000300735D5C0381498129BFC080B06F6C940 +:102A3000FFFF178A129CE80A1800C090EA0A1800E3 +:102A4000C1E0EE0A1800CF01169CD832138C103C5E +:102A50005F53E04C005D5F0AE7EA100AEE0A1800D7 +:102A6000C03032D8CE2BF0CAFFFFFC0A000A14C6D1 +:102A70002FF81838CFD52FEB2FE9CDCBD8321498BB +:102A8000F5DBC01FF00C1100104CFC187FF0F5ECCA +:102A900013FCF00C010CBF9C5EFCD703D401967BA9 +:102AA000F01F0002D8020000800353E0D4211697E3 +:102AB000967BF01F00098E681099ADC95BFCEFF999 +:102AC0000C06EFFC1A15E0691000F1D9E138EFF8B7 +:102AD0001C06D822800362D4D421966816971495D8 +:102AE0001294E21801001896C0603029300A967BD3 +:102AF000F01F00068E68ADC808990A9A8E7B0C9C60 +:102B0000AE68F01F0003D822800362D4800353B460 +:102B1000D4211697967BF01F0007C0656F581808E0 +:102B2000EF480054D8228E68ADC8AE68D8220000A5 +:102B30008003694CD431208D4DB8500B7008507C07 +:102B4000502A1295501816970F36401AF4060704AB +:102B5000E2140008CFA1E046002DC0410F3630142A +:102B6000C058E046002BC0210F3658055F085905B4 +:102B70005F0A3009F1EA100AF20A1800C1D0E046F3 +:102B80000030C1210F8A358B378CF60A18005F0B95 +:102B9000F80A18005F0A144BF20B1800C0500F9689 +:102BA00031052FE7C0985808C070E0460030F9B5ED +:102BB0000008F9B5010A5804C0713FF0E061FFFF59 +:102BC000EA117FFFC0483000FC118000EA03141FA7 +:102BD0000A980699009A029BF01F00340699505AF1 +:102BE0000A98009A029BF01F0032069C14981699CE +:102BF000300A30003001149E109212934019F206F0 +:102C0000070BF3DBC001F9B90137F9B90057506977 +:102C1000ECC80030EDBB0002C0804069F7DBC002A9 +:102C2000EC090108580BC2D00A38C2B40430E601DE +:102C300013005FB9F3EA13FAFC0A1800C1F104307B +:102C4000E60113005F09405A14385F9AF5E900095C +:102C5000FC091800C131E005064AEA010249504862 +:102C6000F8000349BF58F20B000B5038FAE0000C93 +:102C70001400E20B0041301AC0283FFA0F36CBFB9C +:102C80005BFAC1715804C0713FF0E061FFFFEA11C7 +:102C90007FFFC0483000FC11800032284079933813 +:102CA000C10800000000049C800373408002D99892 +:102CB0005804C07030083009F0000100F2010141F1 +:102CC00040285808C0B0580AF9B801FFEFD8E10A07 +:102CD000FBFA1A00402940089308009A029B2F8DA6 +:102CE000D8320000D431209D4DE816927008508CE7 +:102CF000505A1295504816970F36404EFC0607035F +:102D0000E2130008CFA1E046002DC0410F3630137A +:102D1000C058E046002BC0210F3658055F08590502 +:102D20005F0A3009F1EA100AF20A1800C1D0E04641 +:102D30000030C1210F8A358B378CF60A18005F0BE3 +:102D4000F80A18005F0A144BF20B1800C0500F96D7 +:102D500031052FE7C0985808C070E0460030F9B53B +:102D60000008F9B5010AEA04141F0A9808993FFA05 +:102D70003FFBF01F003D0899502B503A0A983FFA4C +:102D80003FFBF01F003A300B300830094041E206AB +:102D9000070EE1DEC001ECCC00305800F9B101377C +:102DA000F9B100571C90E2100004C061EC01010C65 +:102DB000FDDEC002C3700A3CC354FAE000080038CC +:102DC000E20913005FBE3000FDEB13FBE00B1800BF +:102DD000C261FAE00008143C5F9E0038E20913006B +:102DE0005F0B3000FDEB000BE00B1800C181F0051C +:102DF0000640EA09024BFAE10000E808034BF6013D +:102E00000001507C5001BF5CFAE00000506C301BA8 +:102E1000FAE800180008F2010049C0283FFB0F360D +:102E2000CB6B5BFBC071322840803FF981383FF8A3 +:102E3000C0985803C07030043005E8080108EA095A +:102E40000149405E580EC080580BF9BA01FFEFDA15 +:102E5000E102405A9502109A129B2F7DD832000051 +:102E60000000049C8002D99880037340D431203D37 +:102E70004C48502C70011698113EE20E0705E215E1 +:102E80000008CFB1E04E002DC041113E3015C058B2 +:102E9000E04E002BC021113E58095F0C59095F0616 +:102EA0003007F9E61006EE061800C1E0E04E0030EB +:102EB000C131118635843783E80618005F04E606C1 +:102EC00018005F06E9E61006EE061800C050119ED5 +:102ED00031092FE8C098580CC070E04E0030F9B9A5 +:102EE0000008F9B9010A3FF3E6090D023007500363 +:102EF0000E9C0E93E20E0704E1D4C001F9B0013735 +:102F0000F9B000575010FCC600300890E2100004E1 +:102F1000C0814010E9D4C002FC0001065804C1C0C1 +:102F20001236C1A4043C5FBEFDE713FEE60E180096 +:102F3000C101043C5F0E40070E365F97EFEE000EB6 +:102F4000E60E1800C061B33C3017EC0C000CC02832 +:102F50003FF7113ECD0B5BF7C061322940200E9C3C +:102F60008139C0485805FBBC0100580AC070580799 +:102F7000F9B901FFF1D9E10B950B2FDDD832000033 +:102F80000000049CD421169776DBEEC8FFBC103BF2 +:102F9000C171E06B0400F01F0015C250E06804002E +:102FA0008FDC8FE8EF380046F8CCFC03B8A8EF3888 +:102FB0000045B898EF380044B8888F0CC1386EE5EA +:102FC000EA041501089AF01F000A1896C0C00A9A70 +:102FD000189BF80500050A9CF01F00068FE48F057A +:102FE0008FD6D82ADC2A00008002E2BC8002E8E802 +:102FF0008002E736D4211697149618955BFBC650CD +:10300000580CC06078685808C031F01F00314B1868 +:103010001036C0316A06C0A84AF81036C0316A16A8 +:10302000C0584AE81036EBF600028C68A5D8AC68A8 +:10303000EDB80002C140EDB80004C461EDB8000372 +:10304000C0B10C9B0A9CF01F0026C3E18C688D6CFC +:10305000A3D88D2CAC688C68A3A8AC680E946CD8EF +:103060005C545808C1006C196CE81039C0650A9CA2 +:103070000C9BF01F001CC2816C0820188D08B084C6 +:103080000897C0C86C495809C0C06C081238E0885D +:10309000000911770837C0518D086C182FF8C12826 +:1030A0006C18ED4800406C088DF8ECC8FFBC8DD85A +:1030B00030388DE8ECC8FFBAED6400468D080897FB +:1030C00030188D18C0283FF70E9CD82280031F3877 +:1030D0008003EF2C8003EF4C8003EF6C80031D2CEA +:1030E00080032F84D431208DFAC4FFBC504B682E4E +:1030F000505812967C0B7005506E580BF40B17004D +:103100006803681140493008C2C92FFB325C178A36 +:10311000F80A18005F1EF00A18005F1CFDEC000C96 +:10312000F00C1800CF31580AE0800129300C3FFA2A +:103130001890503A18941892F80C003C1697507C4E +:103140004CDC0F3AF80A070E407C1C0C4CBEFC0C01 +:10315000070E201E500E4CAEFC0C070C507C400C91 +:10316000587CE08B00F84C7EFC0C032F368BF60A63 +:103170001800E08000F0371BF60A1800C07034CB4E +:10318000F60A1800C051A3B4CE58A5B4CE380F8BA0 +:1031900036CAF40B1800C051A5B4EECBFFFFCDB872 +:1031A000A5A4CD88EBD5C005367CF80A1800E08BC5 +:1031B0000027365BF60A1800C48234FBF60A1800B2 +:1031C000C480E08B000C345BF60A1800C3E0347B4B +:1031D000F60A1800C3A0344BC088358BF60A1800D5 +:1031E000C2C0E08B0007355BF60A1800C351C31854 +:1031F000363BF60A1800C2F0364BC0E8370BF60A29 +:103200001800C250E08B000D36EBF60A1800C1F032 +:10321000E08B0014369BF60A1800C1E1C0E8375B6A +:10322000F60A1800C0A0378BF60A1800C060373BBA +:10323000F60A1800C111C0B8EDB40004C0A0EDB486 +:103240000005C0913020C0883040C0683030C04890 +:103250003010C0283000403B5BFBC040E20B09202F +:10326000C7985860E08B00776C0AEACCFFFF486E85 +:10327000FC00032F8003F2708003F1D48003F16817 +:103280008003EFC88003EFE8F4CBFFF88D0BF4EA7E +:103290000000E605083AC0F8F4CBFFFC8D0B740A79 +:1032A000E605093AC088F4CBFFF88D0BF4EA00007C +:1032B000E605083A0E9B1895C4E8620A5BFAC0B1AD +:1032C00050195028E06A0080300B029CF01F004D1E +:1032D00040284019E4CC00010E9B503CF20C0C49F4 +:1032E000C3A8620A5BFAC0B150195028E06A008096 +:1032F000300B029CF01F0043402840192012300A76 +:103300000E9BE202092AF2020C49C25816976C0A77 +:10331000F4CBFFFC8D0B740A0E9BE605093A2FF5E2 +:10332000C1A8F4C20030C068E40200222FF7F40202 +:1033300000120F8A580AC0E0230A589AFE98FFF636 +:10334000C0982FF70F8A580AC050230A589AFE983F +:10335000FFFA0E9B407C30BAF40C1800FE91FEEE92 +:103360004042178C0A325F4AF00C18005F1CF9EAE1 +:10337000000AF00A1800FE91FECB3008404E178A72 +:10338000E2050021F00A1800FC091710E6050038D4 +:10339000069EC2A8620A583AC1E0E0890007581A9E +:1033A000C1A0582AC181C058585AC0C0C0B5C13840 +:1033B0006C0AF4CCFFF88D0CF4E20000F0E300009E +:1033C000C1086C0AF4CCFFF88D0CF4E20000F0E3C5 +:1033D0000000C0786C0AF4CCFFFC8D0C740A910AD2 +:1033E0002FF52F882FC11235FE9AFFD61C9340521D +:1033F000406E85059D0B404BE60B003C2F8DD8326F +:103400008002E8BCD421149774285808C04195184C +:10341000109CD822F01F000330088F188F28D82264 +:1034200080032320D431FACD06BC5109169114979C +:103430001895F01F0056780C50CC5805C0706A687B +:103440005808C0410A9CF01F00524D281031C0316D +:103450006A01C0A84D081031C0316A11C0584CF83B +:103460001031EBF100028268EDB80003C041624800 +:103470005808C071029B0A9CF01F0049E0810F941C +:1034800082681099E219001A58A9C3D18279300ACA +:10349000F4091900C385A1D8FB5805D06288FB4800 +:1034A00005E462A8FB4805ECFAC8FFBCFB4805D45C +:1034B000FB4805C4E0680400FB4805D8FB4805CC80 +:1034C0003008FB5905D20E9A4109FAC7FA3CFB486D +:1034D00005DC0A9C0E9BF01F003350BCC0950E9B70 +:1034E0000A9CF01F003140BEF9BE01FF50BEFB0830 +:1034F00005D0EDB80006E0810F598268A7A8A26840 +:10350000E08F0F543008FB4806B4FB480690FB4898 +:10351000068CFB4806B03008300950A75078FAC432 +:10352000F9E03FF85059FB440688FB480544129CDB +:10353000506950D950E950B9129740A2325A300818 +:10354000C0282FF20589F00918005F1BF409180044 +:103550005F19F3EB000BF00B1800CF4140ABE40B0D +:103560000106C300FAF806900C08890BFB48069088 +:103570008916FAF8068C2FF8FB48068C5878E089F3 +:1035800000152F84C1C800008003276480031F3802 +:103590008003EF2C8003EF4C8003EF6C80031C381A +:1035A0008003342480031D2CFACAF978029B0A9CFC +:1035B000F01F0071E0810EF4FAC4F9E040BA0C0A81 +:1035C00050BA05893008F0091800E0800ED930099A +:1035D000FB6806BB0E96E4C8FFFF3FFE50945041C7 +:1035E0000E940491508950A8502E50391293129085 +:1035F00010970A92C0783FFC0A97502CC038300BC5 +:10360000503B0F38C0281290F0C90020E049005804 +:10361000E08B0A4A4D9AF409032F50A750800C976B +:103620000495089602924D6940941090404150D9FB +:10363000E08F08AA3008FB3906BBF0091800CE213C +:103640003208C6E8A1A3CDEB0F89F2C80030589824 +:10365000E08B001DEEC8FFFF300B2309F60B002B9B +:10366000F20B001B1139F2CA0030589AFE98FFF78E +:10367000E0490024CC51E04B0020E0890E90201B53 +:10368000FAF906B4123BC095C108FAF906B4ECCABF +:10369000FFFF1236C1F5C268FACEF9441097FC0B51 +:1036A000003BF6F0FD88C3581097FAC8F9501AD8B5 +:1036B000FAC8FAB81AD8FAC8FBB4029A1AD8049C05 +:1036C000FAC8F940FAC9FFB4F01F002E2FDD7800C8 +:1036D000C208FACCF9441496F8040038F0F0FD88DA +:1036E000C188410859F9E0890011F0CBFFFC510B6A +:1036F0007000FACBF944F6090038F140FD882FF943 +:103700001496FB4906B4C058700014962FC851088F +:103710005800FE94FF785C30A3A3C74B32B8FB6817 +:1037200006BBC70B0F38E048002AC0303009C80874 +:103730000F88F0C900305899E08B0026EEC5FFFFD6 +:10374000300B2308F60B002BF00B001B0B38F0C9D5 +:1037500000305899FE98FFF7E0480024FE91FF5191 +:10376000E04B0020E0890E1B201BFAF806B4103B4A +:10377000C115C188800334048003F0048003EDD0B8 +:10378000800330E4FAFA06B4ECC9FFFF1436C1F541 +:10379000C288FACAF944F40B003BF6FBFD88502BB3 +:1037A000C3C8FAC8F9501AD8FAC8FAB81AD8FAC869 +:1037B000FBB4029A1AD8049CFAC8F940FAC9FFB4BB +:1037C000F01F017B2FDD780C502CC27812960E95DD +:1037D000FAC9F944F2040038F0F8FD885028C1D83D +:1037E000410859FAE0890014F0CBFFFC7008510B36 +:1037F0005028FAC6F944402EEC0A0038F14EFD88F4 +:103800002FFA0E95FB4A06B41296C078700C0E95EE +:103810002FC8502C12965108402B580BFE95FEEDE8 +:103820000A97CF0AF20900290F38F4090019F0CAE3 +:103830000030589AFE98FFF83FFAF20A0C495029D6 +:10384000CE4AA7B3CDFA30092308F2090029F009BE +:1038500000190F38F0CA0030589AFE98FFF7E04878 +:103860000024FE91FED2E0490020E0890D98F2C4C8 +:10387000000130195039CC6AA3B3CC4AA7A3CC2A93 +:103880000F8836CEFC081800C0412FF7A5B3CBAA8D +:10389000A5A3CB8AA5B3CB6A50A750800C971090F4 +:1038A00008960495409402920E994041FAF806B4A5 +:1038B000403C580CC1D01036C064FACBF944F6062F +:1038C0000036C1D8FAC8F9501AD8FAC8FAB81AD8C6 +:1038D000FAC8FBB41AD8FAC8F940FAC9FFB4049A76 +:1038E0000C9B0A9CF01F01322FDD19B8C2282FF75C +:1038F0001039C084FACAF944F4060036ED38FD8B5D +:10390000C188410959F8E0890012F2CAFFFC510A46 +:103910007209FAC6F944EC08003A2FF8F549FD8817 +:10392000FB4806B4F1D9C008C04813B82FC95109E3 +:10393000FB680660300E30083012FB6806BB502E64 +:10394000E08F08C450A750800C9704950896029207 +:10395000409410904041A5A3C0A850A750800C9758 +:10396000049508960292409410904041EDB30005F2 +:10397000C511FAF806B4403C580CC1E01036C064DA +:10398000FACBF944F6060036C208FAC8F9501AD83C +:10399000FAC8FAB80C9B1AD8FAC8FBB41AD8FAC9F4 +:1039A000FFB4FAC8F940049A0A9CF01F01012FDD08 +:1039B000781B7809C2B8EECAFFFF1037C0B4FAC945 +:1039C000F9441497F2060036ECFBFD8CECF9FD8807 +:1039D000C1D8410959F8E0890014F2CBFFF8510B26 +:1039E000FAC6F944721BEC08003C7209F94BFD8CD5 +:1039F000F949FD882FF81497FB4806B4C078F2C83F +:103A0000FFF8721B1497510872091698FAE9000022 +:103A1000CAE8EDB30004C171FAF806B4403E580E8E +:103A2000C0801036C694FACCF944F8060036C8288F +:103A3000EECAFFFF1037E0840081FACBF944F606A6 +:103A40000036C778EDB30006C4B1FAF806B4403CBE +:103A5000580CC1D01036C064FACBF944F6060036D3 +:103A6000C1F8FAC8F9501AD8FAC8FAB81AD8FAC878 +:103A7000FBB41AD8FAC8F940FAC9FFB4049A0C9BEF +:103A80000A9CF01F00CB2FDD9818C268EECAFFFF1A +:103A90001037C094FAC9F9441497F2060036ED08BD +:103AA000FD8AC1A8410959F8E0890013F2CBFFFC57 +:103AB000510B7209FAC6F944EC08003B2FF8F7499C +:103AC000FD88FB4806B41497F1D9B010C05892187D +:103AD00014972FC951095018BF585008C488FAF8D4 +:103AE00006B4403C580CC1D01036C064FACBF9443F +:103AF000F6060036C1F8FAC8F9501AD8FAC8FAB86A +:103B00000C9B1AD8FAC8FBB4049A1AD80A9CFAC8B3 +:103B1000F940FAC9FFB4F01F00A62FDD780BC248A8 +:103B2000EECAFFFF1037C094FAC9F944F206003616 +:103B30001497ECFBFD88C188410959F8E089001110 +:103B4000F2CBFFFC510BFAC6F944720BEC080039BA +:103B5000F34BFD882FF81497FB4806B4C058720B3E +:103B600014972FC95109501BBF5B500BFAEA000094 +:103B7000580A5C2BC0E43008FAEA00003009F00A69 +:103B8000010AF20B014B32D8FAEB0000FB6806BBCE +:103B90003018E08F071150A750800C9704950896B5 +:103BA00002924094109040410E99EDB30003C4116D +:103BB000FAF806B4403A580AC1901036C645FAC819 +:103BC000F9501AD8FAC8FAB81AD8FAC8FBB40C9B3C +:103BD0001AD8049AFAC8F940FAC9FFB40A9CF01F2F +:103BE00000742FDD78165076C4882FF71039C0C4C2 +:103BF000FACEF944FC060036ECFCFD8C507CECF669 +:103C0000FD885056C668410959F8E0890010F2CA8B +:103C1000FFF8721B510A7209FACAF944507B5059D5 +:103C2000F4080039405B407AC47872185078C4C8F0 +:103C3000FAF806B4403E580EC2301036C094FACCA2 +:103C4000F944F8060036ECFBFD8C507BCD9BFAC89E +:103C5000F9501AD8FAC8FAB8049A1AD8FAC8FBB4B4 +:103C60000C9B1AD80A9CFAC8F940FAC9FFB4F01F95 +:103C700000502FDD781A507A780C505CC2A82FF7CC +:103C80001039C094FAC9F944F2060036ECF8FD8CFC +:103C90005078CB6B410959F8E0890015F2CAFFF85A +:103CA00072167209510A5059FACEF9445076FC083E +:103CB0000039405B0C9AF2EBFD882FF8FB4806B404 +:103CC000C088721C507CF2C8FFF851087209505924 +:103CD000405B407AF01F00371896C1503008300919 +:103CE000405B407AF01F0034C04032D8FB6806BB0E +:103CF0004B284B36A7D3E0400047F00617A03032E0 +:103D0000E08F06E7405B407AF01F002EC0C05026CF +:103D10004AD84AE6A7D3E0400047F00617A0303261 +:103D2000E08F06DD402A5BFAC04130695029C11896 +:103D3000E04000475F09E04000675F08F3E81008D3 +:103D4000F8081800C06040285808F9B80001502849 +:103D500040784059FAE90694A9A3FAF8069458085D +:103D6000C065405E300C506E509CC078405B32DACB +:103D7000EE1B8000509A506BE04000465F09E04027 +:103D800000665F08F3E810085048C0404022303910 +:103D9000C228E04000455F09E04000655F084046FA +:103DA0001049EC091800C1314022C148800330E4B9 +:103DB0008003697880036FC08003F2408003F2447F +:103DC00080032A7E8003F2488003F24C402EFCC21E +:103DD000FFFF3029FAC8F95C1AD8FAC8F9541AD882 +:103DE000FAC8F94C0A9C1AD80498409B40AAF01FC4 +:103DF00001E0E04000475F19E04000675F18189657 +:103E00002FDDF3E80008C041EDB30000C301EC0270 +:103E1000000C503C404B580BC1500D893308F00941 +:103E20001800C0B130083009406B407AF01F01D152 +:103E3000FBB20001FBF20BAB403AFAF806AC100AF9 +:103E4000503A406B30083009407AF01F01CAC090E8 +:103E50004039FB4906A4C05810C9FB4806A4C02835 +:103E60003309FAF806A4403E1C38CF73E0400047FF +:103E70005F09E04000675F08F3E81008FAF906A45C +:103E80000C1950695808C0B0FAF806AC5BD8C05598 +:103E9000402C1838E08A006A2020C058E0400065B5 +:103EA000E0890046FAFB06ACFB60069C201BFB4B3E +:103EB00006ACC0475C3B32D8C02832B8FB68069DD0 +:103EC000589BE08A001DFAC9FA3530AA12980E9C58 +:103ED0000C92F60A0C060E9B2D0B10FB0C9B5896B1 +:103EE000FE99FFF92D0B1897049610FBFACAF96298 +:103EF000C038113B14CB1238CFD3C0982D0B3308E8 +:103F0000FB6B069FFB68069EFACAF960FAC8F96463 +:103F1000F408010850E81092406B1602581BE08923 +:103F20000005EDB30000C3512FF2C338E040006636 +:103F3000C1C1FAF206AC5802E08A000C402A580AC5 +:103F4000C041EDB30000C2512FF240291202C0B8A7 +:103F500040285808C061EDB30000C0303012C1984D +:103F600040222FE23660C158FAF206AC406E1C3295 +:103F7000C065EDB30000F7B200FFC0A8E40811026D +:103F8000406C5802F00217A0F9B20901180236700D +:103F9000409B580BE080059D32D8FB6806BBE08F44 +:103FA000059C50A704950C970292089640414094B6 +:103FB0000E99EDB30005C481FAF806B4403E580EE0 +:103FC000C1D01036C064FACCF944F8060036C1D826 +:103FD000FAC8F9501AD8FAC8FAB8049A1AD8FAC81E +:103FE000FBB40C9B1AD80A9CFAC8F940FAC9FFB472 +:103FF000F01F01612FDD780AC2082FF71039C08445 +:10400000FACBF944F6060036ECFAFD88C16841099E +:1040100059F8E0890010F2CAFFFC510AFAC6F944C7 +:10402000720AEC080039F34AFD882FF8FB4806B401 +:10403000C048720A2FC9510940BE1C98951EBF582E +:104040009508FE9FFA7CEDB30004C480E2130040A3 +:10405000C450FAF806B4403C580CC1D01036C064C5 +:10406000FACBF944F6060036C1D8FAC8F9501AD886 +:10407000FAC8FAB8049A1AD8FAC8FBB40C9B1AD832 +:104080000A9CFAC8F940FAC9FFB4F01F013B2FDDC2 +:10409000780AC2082FF71039C084FACAF944F40626 +:1040A0000036ECFAFD88C168410959F8E089001032 +:1040B000F2CAFFFC510AFAC6F944720AEC08003948 +:1040C000F34AFD882FF8FB4806B4C048720A2FC98E +:1040D000510940BEB40EFE9FFA32FAF806B4403CD5 +:1040E000580CC1D01036C064FACBF944F60600363D +:1040F000C1D8FAC8F9501AD8FAC8FAB8049A1AD826 +:10410000FAC8FBB40C9B1AD80A9CFAC8F940FAC941 +:10411000FFB4F01F01192FDD780AC2082FF71039FC +:10412000C084FACAF944F4060036ECFAFD88C16886 +:10413000410959F8E0890010F2CAFFFC510AFAC699 +:10414000F944720AEC080039F34AFD882FF8FB485D +:1041500006B4C048720A2FC9510940BE950EFE9F91 +:10416000F9EE50A750800C9704950896029240945F +:1041700010904041A5A3C0A850A750800C9704956B +:1041800008960292409410904041EDB30005C5D1CD +:10419000FAF806B4403C580CC2601036C0A4FACB02 +:1041A000F944F6060036ECE8FD88FAE90000C1881B +:1041B000FAC8F9501AD8FAC8FAB8049A1AD80C9B57 +:1041C000FAC8FBB40A9C1AD8FAC8F940FAC9FFB475 +:1041D000F01F00E92FDDF8EA0000FAEB00003008DC +:1041E000E08F03E7EECAFFFF1037C0B4FAC9F94405 +:1041F0001497F2060036ECEAFD88FAEB0000C1885D +:10420000410959F8E0890018F2E60000F2CBFFF806 +:10421000FAE70000510BFAC6F944EC080039FAE657 +:104220000000F2E7FD882FF81497FB4806B44038E9 +:10423000E08F03BFF2E600004038FAE700002F8964 +:1042400014975109E08F03B5EDB30004C161FAF88A +:1042500006B4403E580EC0801036C674FACCF944FD +:10426000F8060036C808EECAFFFF1037C7F4FACBCD +:10427000F944F6060036C768EDB30006C4A1FAF8A3 +:1042800006B4403C580CC1D01036C064FACBF94497 +:10429000F6060036C1F8FAC8F9501AD8FAC8FAB8C2 +:1042A0001AD8FAC8FBB41AD8FAC8F940FAC9FFB448 +:1042B000049A0C9B0A9CF01F00B02FDD9818C2686E +:1042C000EECAFFFF1037C094FAC9F9441497F206FA +:1042D0000036ED08FD8AC1A8410959F8E0890013AC +:1042E000F2CBFFFC510B7209FAC6F944EC08003B13 +:1042F0002FF8F749FD88FB4806B41497F1D9B010A0 +:10430000C058921814972FC951095C785018C46886 +:10431000FAF806B4403C580CC1D01036C064FACB51 +:10432000F944F6060036C1F8FAC8F9501AD8FAC8A6 +:10433000FAB80C9B1AD8FAC8FBB4049A1AD80A9C8B +:10434000FAC8F940FAC9FFB4F01F008B2FDD780BD3 +:10435000C248EECAFFFF1037C094FAC9F944F2060A +:1043600000361497ECFBFD88C188410959F8E089B3 +:104370000011F2CBFFFC510BFAC6F944720BEC08AA +:104380000039F34BFD882FF81497FB4806B4C0584A +:10439000720B14972FC95109501B300E500E1C98E8 +:1043A000E08F030750A750800C970495089602925F +:1043B000409440410E99FAF806B4403C580CC1D0E4 +:1043C0001036C064FACBF944F6060036C1D8FAC8F4 +:1043D000F9501AD8FAC8FAB81AD8FAC8FBB41AD8D9 +:1043E000FAC9FFB4FAC8F940049A0C9B0A9CF01F62 +:1043F00000622FDD7809C2182FF71039C084FACA7D +:10440000F944F4060036ECF9FD88C178410959F801 +:10441000E0890010F2CAFFFC510AFAC6F944720999 +:10442000EC08003AF549FD882FF8FB4806B4C0585F +:10443000F2C8FFFC510872093308FB6806B83788D8 +:10444000300EFB6806B94CDC5019A1B3500E50DC9D +:1044500030283780E08F02AD50A750801090300890 +:10446000FB6806BB0C970495089602924094404165 +:104470000E99FAF806B4403B580BC1D01036C06410 +:10448000FACAF944F4060036C1D8FAC8F9501AD865 +:10449000FAC8FAB81AD8FAC8FBB40C9B1AD8049A0E +:1044A000FAC8F940FAC9FFB40A9CF01F00332FDDA7 +:1044B0007806C2082FF71039C084FAC9F944F20609 +:1044C0000036ECF6FD88C168410959F8E089001012 +:1044D000F2CAFFFC510A7206FACEF944FC08003910 +:1044E000F346FD882FF8FB4806B4C04872062FC972 +:1044F0005109402C580CC105189A300B0C9CF01F28 +:104500000020E08002E9F8060102402B1632E08923 +:1045100002E3E08F02DE300A0C9C502AF01F0019E3 +:104520001892E08F02DC50A750800C9704950896F3 +:104530000292409410904041A5A3C0A850A750807B +:104540000C97049508960292409410904041EDB368 +:104550000005C611FAF806B440395809C2C0103631 +:10456000C124FAC8F944F0060036C2E88003552C8D +:1045700080036F32800330E48003EDE4800328A4DD +:104580008002EDD0FAC8F9501AD8FAC8FAB81AD889 +:10459000FAC8FBB41AD8FAC8F940FAC9FFB4049AA9 +:1045A0000C9B0A9CF01F00C82FDDF8E80000FAE918 +:1045B0000000C2E8EECAFFFF1037C0B4FAC8F944E1 +:1045C0001497F0060036ECEAFD88FAEB0000C2080A +:1045D000410959F8E0890016F2E60000F2CBFFF835 +:1045E000FAE70000510BFAC6F944EC080039FAE684 +:1045F0000000F2E7FD882FF81497FB4806B4C08846 +:10460000F2E600002F89FAE70000510914973018EC +:10461000E08F01CFEDB30004C161FAF806B4403E6B +:10462000580EC0801036C674FACCF944F80600362D +:10463000C808EECAFFFF1037C7F4FACBF944F606F4 +:104640000036C768EDB30006C4A1FAF806B4403CD2 +:10465000580CC1D01036C064FACBF944F6060036C7 +:10466000C1F8FAC8F9501AD8FAC8FAB81AD8FAC86C +:10467000FBB41AD8FAC8F940FAC9FFB4049A0C9BE3 +:104680000A9CF01F00912FDD9818C268EECAFFFF48 +:104690001037C094FAC9F9441497F2060036ED08B1 +:1046A000FD8AC1A8410959F8E0890013F2CBFFFC4B +:1046B000510B7209FAC6F944EC08003B2FF8F74990 +:1046C000FD88FB4806B41497F1D9B010C058921871 +:1046D00014972FC951095C785018C468FAF806B4C9 +:1046E000403C580CC1D01036C064FACBF944F606F1 +:1046F0000036C1F8FAC8F9501AD8FAC8FAB80C9BB3 +:104700001AD8FAC8FBB4049A1AD80A9CFAC8F94015 +:10471000FAC9FFB4F01F006C2FDD780BC248EECA57 +:10472000FFFF1037C094FAC9F944F2060036149717 +:10473000ECFBFD88C188410959F8E0890011F2CBF2 +:10474000FFFC510BFAC6F944720BEC080039F34B2D +:10475000FD882FF81497FB4806B4C058720B1497C5 +:104760002FC95109501B300E3018500EC21950A7D6 +:1047700050800C970495089602924D4C40941090EE +:10478000404150DCEDB30005C551FAF806B4403B9A +:10479000580BC2201036C0A4FACAF944F4060036F9 +:1047A000ECE8FD88FAE90000CF58FAC8F9501AD8A9 +:1047B000FAC8FAB8049A1AD80C9BFAC8FBB40A9C37 +:1047C0001AD8FAC8F940FAC9FFB4F01F003F2FDD2C +:1047D000F8EA0000C0C8EECAFFFF1037C0B4FAC93B +:1047E000F9441497F2060036ECEAFD88FAEB000073 +:1047F000CD18410959F8E0890016F2E60000F2CB25 +:10480000FFF8FAE70000510BFAC6F944EC0800394A +:10481000FAE60000F2E7FD882FF81497FB4806B48B +:10482000CB98F2E600002F89FAE7000051091497AF +:10483000CB18EDB30004C171FAF806B4403E580E2F +:10484000C0801036C6C4FACCF944F8060036C85801 +:10485000EECAFFFF1037E0840084FACBF944F60675 +:104860000036C7A8EDB30006C4E1FAF806B4403C30 +:10487000580CC1D01036C064FACBF944F6060036A5 +:10488000C1F8FAC8F9501AD8FAC8FAB81AD8FAC84A +:10489000FBB41AD8FAC8F940FAC9FFB4049A0C9BC1 +:1048A0000A9CF01F00092FDD9818C2A8EECAFFFF6E +:1048B0001037C0D4FAC9F9441497F2060036ED084F +:1048C000FD8AC1E8800330E48003EDE4410959F832 +:1048D000E0890013F2CBFFFC510B7209FAC6F944D0 +:1048E000EC08003B2FF8F749FD88FB4806B4149705 +:1048F000F1D9B010C058921814972FC951095C789B +:104900005018C468FAF806B4403C580CC1D01036B0 +:10491000C064FACBF944F6060036C1F8FAC8F9507B +:104920001AD8FAC8FAB80C9B1AD8FAC8FBB4049A79 +:104930001AD80A9CFAC8F940FAC9FFB4F01F00C996 +:104940002FDD780BC248EECAFFFF1037C094FAC9BA +:10495000F944F20600361497ECFBFD88C188410942 +:1049600059F8E0890011F2CBFFFC510BFAC6F9446B +:10497000720BEC080039F34BFD882FF81497FB48B5 +:1049800006B4C058720B14972FC95109501B300E32 +:10499000500E4008401C18485F18E7E80008C07037 +:1049A0003308FB6006B9A1B3FB6806B830283009AC +:1049B000FB6906BB402B580BC025A7D3402A4009F2 +:1049C000580A5F1A4016FAC2F9780C495F19F5E9DE +:1049D0001009C5C03019F2081800C0603029F2086B +:1049E0001800C041C3C80496C3080496FAE8000042 +:1049F000F5D8C0032D0A0CFAF00B1603F20C1603BF +:104A0000F7E911DB1899169858085C29CF21FAE9C3 +:104A10000000EDB30000C4513309F20A1800C410BD +:104A20000CF9C3F8FAEA000030A83009F01F008E34 +:104A300030A82D0A3009AC8AFAEA0000F01F008B7A +:104A400016991498FAE900002016FAEA0000589A1C +:104A50005C2BFE9BFFE91BF82D08C2080496FAE8C0 +:104A60000000F5D8C00440DEFC0A070A0CFAF20B7D +:104A70001604F00A1604F5E911CA16991498580894 +:104A80005C29CF01FAE90000C0C85808C091EDB315 +:104A90000000C061FAC6F9793308AC88C0280496D2 +:104AA0000C12C1C850A7508040940C9710900495E8 +:104AB00040415808E0800464FB680660300C300810 +:104AC0003012FB6806BB502CFAC6F9A0C078300B38 +:104AD000502BC0484022300A502A4029E4090C4992 +:104AE000FB3806BB5039069E3009E21E0002F20870 +:104AF0001800FBF81003F7B801FFFBF81A03069B38 +:104B0000580EFBFC1003F7BC01FEFBFC1A03E21B72 +:104B1000008450FE509BC451408A4039121A504ABA +:104B2000580AE089001FC3D82F092FF84D0E310C09 +:104B3000FB490690890E891CFB48068C5878E08951 +:104B400000042F84C0B8FACAF978029B0A9CF01FAF +:104B50000049E0810425FAC4F9E0404B210B504B99 +:104B6000FAF90690FAF8068C4C1A404E590EFE9946 +:104B7000FFDD1C092FF8890AFB490690891EFB48B6 +:104B8000068C5878E08900042F84C0B8FACAF978F6 +:104B9000029B0A9CF01F0037E0810402FAC4F9E08E +:104BA0003009FB3806BBF2081800C1F0FAF806908D +:104BB000FAC9F9452FF88909FB4806903019FAF827 +:104BC000068C89192FF8FB48068C5878E089000478 +:104BD0002F84C0B8FACAF978029B0A9CF01F0025FE +:104BE000E08103DEFAC4F9E040FC580CC1F0FAF8A9 +:104BF0000690FAC9F9482FE88909FB480690302940 +:104C0000FAF8068C89192FF8FB48068C5878E08949 +:104C100000042F84C0B8FACAF978029B0A9CF01FDE +:104C20000015E08103BDFAC4F9E0409BE04B008031 +:104C3000C511408A4039121A504A580AE089002B9F +:104C4000C4982F092FF848CE310CFB490690890EE5 +:104C5000891CFB48068C5878E08900102F84C178A5 +:104C6000800330E4800373408002D9988003F250BF +:104C7000800334048003F260FACAF978029B0A9C2C +:104C8000F01F004CE081038CFAC4F9E0404B210B8B +:104C9000504BFAF90690FAF8068C4C7A404E590EB1 +:104CA000FE99FFD11C092FF8890AFB490690891E3D +:104CB000FB48068C5878E08900042F84C0B8FACAF3 +:104CC000F978029B0A9CF01F003BE0810369FAC45B +:104CD000F9E0402C041C502C580CE089001FC3D86C +:104CE0002F092FF84B4B310AFB490690890B891A83 +:104CF000FB48068C5878E08900042F84C0B8FACAB3 +:104D0000F978029B0A9CF01F002BE0810349FAC44A +:104D1000F9E0402921095029FAF90690FAF8068CA1 +:104D20004A5A402E590EFE99FFDD1C092FF8890AB8 +:104D3000FB490690891EFB48068C5878E0890004E0 +:104D40002F84C0B8FACAF978029B0A9CF01F001998 +:104D5000E0810326FAC4F9E0EDB30008C0B0FAF828 +:104D6000069089128906F0020002FB420690E08F4D +:104D700001DBE0400065E08A01DD30083009405B7E +:104D8000407AF01F000EC7E0FAF8069048C92FF8E5 +:104D90008909FB4806903019FAF8068C89192FF812 +:104DA000FB48068C5878E089000D2F84C14800002C +:104DB000800334048003F26080036F328003A6C056 +:104DC000FACAF978029B0A9CF01F0078E08102E899 +:104DD000FAC4F9E0FAF806AC406C1838C055EDB3E7 +:104DE0000000E081026DFAF806902FF840CBFB48F6 +:104DF00006903019FAF8068C890B2FF88919FB48B0 +:104E0000068C5878E08900042F84C0B8FACAF97873 +:104E1000029B0A9CF01F0065E08102C2FAC4F9E01F +:104E2000406620165806E089001DE08F02492F09D0 +:104E30002FF8FB49069089028910FB48068C5878A8 +:104E4000E08900042F84C0B8FACAF978029B0A9C52 +:104E5000F01F0056E08102A4FAC4F9E02106C03830 +:104E60004D323100FAF90690FAF8068C4D0A5906CF +:104E7000FE99FFDF0C09890AFB4906902FF8891675 +:104E8000C559FAFA06AC580AE0890096FAF8069075 +:104E90004C892FF88909FB4806903019FAF8068CDE +:104EA00089192FF8FB48068C5878E08900042F8474 +:104EB000C0B8FACAF978029B0A9CF01F003CE08156 +:104EC000026FFAC4F9E0FAF806AC5808C081406AEB +:104ED000580AC051EDB30000E08101F240C9FAF870 +:104EE00006902FF88909FB4806903019FAF8068CCD +:104EF00089192FF8FB48068C5878E08900042F8424 +:104F0000C0B8FACAF978029B0A9CF01F0028E08119 +:104F10000247FAC4F9E0FAF206AC5C325802E089C2 +:104F2000001DC3B82F092FF8310EFB4906908900E8 +:104F3000891EFB48068C5878E08900042F84C0B88D +:104F4000FACAF978029B0A9CF01F0018E081022837 +:104F5000FAC4F9E02102C0284950FAF90690FAF89B +:104F6000068C493A5902FE99FFDF04092FF8890A95 +:104F7000FB4906908912FB48068C5878E0890004AA +:104F80002F84C0B8FACAF978029B0A9CF01F000768 +:104F9000E0810206FAC4F9E0406CFAF8069089064E +:104FA000891C1808CBE80000800334048003F260F9 +:104FB0008003A6C0FAF90690FAF8068C406B163A00 +:104FC000C6D516092FF88906FB490690891BFB48B0 +:104FD000068C5878E08900042F84C0B8FACAF978A2 +:104FE000029B0A9CF01F006FE08101DAFAC4F9E02D +:104FF000FAF606AC406A14165806E089001CC3B8DD +:105000002F092FF8FB49069089028910FB48068C6E +:105010005878E08900042F84C0B8FACAF978029B56 +:105020000A9CF01F0060E08101BBFAC4F9E0210690 +:10503000C0384DD23100FAF90690FAF8068C4DAA24 +:105040005906FE99FFDF0C092FF8890AFB490690E3 +:105050008916FB48068C5878E08900042F84C0B874 +:10506000FACAF978029B0A9CF01F004EE081019871 +:10507000FAC4F9E0EDB30000E081012240C9FAF87A +:1050800006902FF88909FB4806903019FAF8068C2B +:1050900089192FF8FB48068CC04914092FF8FB49E1 +:1050A00006908906891AFB48068C5878E089000426 +:1050B0002F84C0B8FACAF978029B0A9CF01F003905 +:1050C000E081016EFAC4F9E040C88908FAF8069058 +:1050D0002FF83019FB4806908919FAF8068C2FF83A +:1050E000FB48068CFAF206AC5878E08900042F845D +:1050F000C0B8FACAF978029B0A9CF01F002AE08126 +:10510000014FFAC4F9E00406FAF806AC8906FAF988 +:1051100006904066406E1016F208010889161C08B9 +:10512000FB480690FAF8068C2FF8FB48068CCB98C3 +:10513000406C581CE0890006EDB30000E081008758 +:10514000FAF806902FF83019FB4806908906FAF80D +:10515000068C89192FF8FB48068C5878E0890004E2 +:105160002F84C0B8FACAF978029B0A9CF01F000D80 +:10517000E0810116FAC4F9E0FAF806902FF840CB66 +:10518000FB4806903019FAF8068C890B2FF889191C +:10519000FB48068C5878E08900092F84C10800007C +:1051A000800334048003F260FACAF978029B0A9CF7 +:1051B000F01F006FE08100F4FAC4F9E03008300914 +:1051C000405B407AF01F006B40682018580CC0D13B +:1051D0002FF689188906FAF606901006FAF8068C5A +:1051E000FB4606902FF8C2F810965808E089001C7C +:1051F000C4982F092FF8FB49069089028910FB48B3 +:10520000068C5878E08900042F84C0B8FACAF9786F +:10521000029B0A9CF01F0056E08100C2FAC4F9E02C +:105220002106C0384D423100FAF90690FAF8068C92 +:105230004D1A5906FE99FFDF0C09890AFB490690B1 +:105240002FF88916FB48068CC0E8FAF806902FF86C +:105250003019FB4806908906FAF8068C89192FF850 +:10526000FB48068C5878E08900042F84C0B8FACA3D +:10527000F978029B0A9CF01F003EE0810091FAC47D +:10528000F9E040EAFAF806901408FAC9F964FB4814 +:105290000690891AFAF8068C89092FF8FB48068CC3 +:1052A0005878E08900042F84C0A8FACAF978029BD4 +:1052B0000A9CF01F002FC731FAC4F9E0E213000482 +:1052C000C3D04086403912165806E089001AC368D8 +:1052D0002F092FF8FB49069089038912FB48068C99 +:1052E0005878E08900042F84C098009A029B0A9C99 +:1052F000F01F001FC541FAC4F9E02106C05849F368 +:105300003102FAC0F978FAF90690FAF8068C49BA2F +:105310005906FE99FFDF0C092FF8890A8916FB4907 +:105320000690FB48068C5878E08A0009FACAF9789A +:10533000029B0A9CF01F000EC32140BC4036408EE9 +:10534000EC0E0C48100C50BCFAF806905808C080BF +:10535000FACAF978029B0A9CF01F0005C201300BC3 +:10536000FAC4F9E0FB4B068CFE9FF0E9800334049D +:1053700080036F328003F2608003F250FAF80690E7 +:105380005808C0800A9CFACAF978029BF01F0009ED +:10539000C0613008FB48068CC02840418268EDB8E7 +:1053A0000006C0313FFA50BA40BCFE3DF944D83245 +:1053B00080033404D42116981897109C3008149B4D +:1053C0004866129A8D08F01F00065BFCC0516C08FD +:1053D0005808EFF81A03D82200008CC48002F1505C +:1053E000D421300818974876169C8D08F01F0006C7 +:1053F0005BFCC0516C085808EFF81A03D822000073 +:1054000000008CC48002F108D431202D1897784810 +:1054100076460C38C034300CC858ECC2FFFCF6C3DA +:10542000FFECF6020329F802032C2FF92016F809E5 +:105430000D08F6020022EEC4FFEC10955808C410C7 +:105440003009069A08981291500B700EB18E501EBA +:10545000150EFC001610FDDEC010EA0E0341FDD152 +:10546000C010B181401BEA000240E2000000E3D01E +:10547000C010021B501B700BE3DBC0100209F20EC0 +:10548000010EB01EFC091410401EFC090009B009F1 +:10549000E00116102FC8B149043AFE98FFD8400B1E +:1054A000580CC0F1ECC8FFFBEE080028C0282016FD +:1054B00020480838E088000570095809CF908F46C9 +:1054C0000E9CF01F001AC2D52FF508983009070B63 +:1054D000F60A1610700CF7DBC010F80E1610141E2A +:1054E000F5DCC010161A120AB01AB14AFC0A0009FB +:1054F000B0092FC8B1490433FE98FFEBECC8FFFB9D +:10550000EE0803295809C0D1EE080028C02820164B +:1055100020480838E088000570095809CF908F4668 +:105520000A9C2FEDD8320000800363EED43121AD08 +:10553000FAC4FF7418971695682C50C96816680944 +:1055400050E81494512CFAE5000851596E9558050D +:10555000C091310CF01F004799358F9C9915992502 +:1055600099056E9972085808C0F0721A911A301A8B +:105570007219F4090949109B91290E9CF01F003EF5 +:105580006E9830099109402810945808C064F1D8E9 +:10559000C01F50283018C02830088D08FC1C7FF030 +:1055A00040260C98E6187FF01838C1C1E068270F34 +:1055B000415B9708403A580AC061EDD6C014C0312B +:1055C0004AECC0284AEC41295809E08005DEF8C8B9 +:1055D000FFFD3009118AF20A1800C190F8C8FFF8DF +:1055E000C168FAEA00083008FAEB003C3009F01F05 +:1055F0000025C1103018415A950841294A285809F8 +:10560000C041109CE08F05C1109C2FF841258B08EC +:10561000E08F05BBFAC8FF9CFAC9FFA0FAEA003C7C +:105620000E9CEBD6C28BF01F001918935805C0D002 +:10563000FAEA003C3004F1DBC014EAC503FF109B1A +:105640005174EA1B3FF0C3284188419C100CF8C5F7 +:10565000FBCEE0450020E08A001BF8CCFBEE403B8F +:10566000EA081140F60C0A4CEC0809460C4CC148FB +:105670008002E2A4800364208003F3708003F37C43 +:1056800080036F328003A6C0800364D0EA0C11202F +:10569000403AF40C094CF01F006BFC18FE10301956 +:1056A000EAC50433F00B000B51793008FC193FF8C0 +:1056B000F01F0065E0684361EA18636FE06987A73F +:1056C000EA193FD2F01F0061E068C8B3EA188B60A6 +:1056D000E0698A28EA193FC6F01F005D0A9C149011 +:1056E0001691F01F005CE06879FBEA18509FE069B2 +:1056F0004413EA193FD3F01F005514981699009AE5 +:10570000029BF01F005314901691F01F00533008B5 +:1057100018963009009A029BF01F0050C0C00C9CE4 +:10572000F01F004C14981699009A029BF01F004C31 +:10573000F7B600015966E088000530185148C128C5 +:105740004C88FAEA003CF0060238F01F0044F9B435 +:105750000000FBF40A14F7B60101F9BC0100FBFCE0 +:105760001A14419020100A10C04650403000C04822 +:10577000300B5C30504BEC0211005806FBFA400431 +:10578000F5D6E40AFBFA4A04FBF64A11F9B2040022 +:10579000E1D6E510F9B90500FBF95A1140C858984F +:1057A000E08B00205858F9B40A01FBF5900CF7B5CE +:1057B0000904FBF59A0CF9B4090040CC583CC2D05E +:1057C000E0890005582CC101C18840CB584BC0600E +:1057D000585BC0A1301A50DAC228301950D9C0F82D +:1057E0003008301450C83FF5301C300B509550DC59 +:1057F0000A91312850EBC208300A50DA40E95809C2 +:10580000E089000730185098109150E8C15840E5E1 +:1058100050950A910A98C108300C50DC40EBEC0B13 +:10582000000B509B16982FF85808E089000510913E +:105830003018C028109130096E9A95193049C178F6 +:1058400080036E4A80036B7C800369A480036D181B +:1058500080036E5280036E2480036FC080036F321A +:105860008003F38C6A1AA1792FFA8B1A6E95F2CA0B +:10587000FFEC103AFE98FFF86A1B0E9CF01F0053D5 +:1058800058E15F888B0CF1E400046E987008508832 +:10589000E08001985806E08A0040F3D6C0044CC866 +:1058A000F0090234FAE50018EC041404EDB4000425 +:1058B000C0303025C0F84C78F0E80020FAEA003C0F +:1058C000E9D4C004F01F0044303514981699FAE961 +:1058D00000084C0C50A30C931896C0F8FAEA001874 +:1058E000EDB40000C081ECE800002FF5F01F003B94 +:1058F000FAEB0018A1542F865804CF11FAE80018CB +:10590000FAEA00080696F01F003440A3149816998E +:10591000FAE90008C2D8EC081100C0313025C2886D +:105920004ACCF0041404501CF1D8C0044A89FAEAA5 +:10593000003CF2080238F01F0029401C506330255B +:105940000C93FAEB00081896C0F8FAEA0008EDB4D8 +:105950000000C081ECE800002FF5F01F0020FAEBFA +:105960000008A1542F865804CF1106964063414A7F +:10597000580AC370FAE8000858015F94FAE9001861 +:105980003008FC193FF0FAEA0018F01F0015F9BCC6 +:105990000000F9BC0101E9EC000CC2304098580845 +:1059A000E08A010C3008FC194024ECC40001FAEA3A +:1059B00000182FF55064F01F0009409414981699B0 +:1059C000FAE90008C1080000800364588003F38CE2 +:1059D0008003F45480037028800369A480036FC09F +:1059E000506602940A9CF01F0069FAE80008F01F54 +:1059F00000683008FC19401CF01F006614981699C6 +:105A0000FAE90028FC18FCC040A5100550A5580470 +:105A1000C211FAEA00083008FC194014F01F005EB9 +:105A200040BCFAEB000814981699189A0A9BF01FCC +:105A3000005BE08102740A9840B9EE188000FAEA2F +:105A40000008109512980A99F01F0054E081025E38 +:105A5000CB484D39E8C8000140D55805C4F0300C9A +:105A6000F2080238513C300AFC1B3FE0F01F004DA9 +:105A7000FAE800284085F01F0048FAEB0028FAEA0F +:105A80000008F01F0049516CF01F0040149816994F +:105A9000FAEA0008F01F0040FAEB000841682D0800 +:105AA0000AC841392FF95139FAE80028F01F003BA4 +:105AB000E081035AFAE80008300AFC1B3FF0F01FAF +:105AC0000036FAE80028F01F0035FAEA002830080E +:105AD000FC194024E08100E8413C083CC6E4F01F8A +:105AE000002C3008FAEB0028FC194024FAEA0008E0 +:105AF000F01F0027FAEB0008CC3B40850805F208B0 +:105B0000023A5135FAE800284085F01F0021FAEBEF +:105B10000028FAEA0008F01F0024516CF01F001B57 +:105B200014981699FAEA0008F01F001BFAEB000817 +:105B300041682D080AC8413C1835C3713008FC196A +:105B40003FE0FAEA0028F01F00134085FAE8000859 +:105B50000805F01F0012E08100A7FAE80028300ACB +:105B6000FC1B3FE0F01F000C14981699FAEA00089D +:105B7000F01F000AC22033090A98117AF20A1800AD +:105B8000E08102F21095CF9B80036E52800369A4DE +:105B900080036D1880036B7C80036FC08003F38CDF +:105BA0008003702880036E243008FC194024F01F05 +:105BB0000056FAEB0008CAEBFAEA003CFAEB0008E0 +:105BC00058E65FAB418A3008F40911FFF7E903F9A1 +:105BD000F0091800E080008140EA58015FA9F3EA6B +:105BE00003F94CAAF4060234FAE50010F009180093 +:105BF000C1405801E081018A3008FC194014089A1C +:105C00000A9BF01F0041FAE80008F01F0041E08104 +:105C1000017D0292E08F018540853014FAE8001082 +:105C2000FAEA0008F01F003BF01F003B1892F01F3B +:105C3000003BFAE80010F01F003414981699FAEAB5 +:105C40000008F01F0037FAEB0008E4C8FFD00AC8CC +:105C5000FC19402430080234C331FAE80008F01F70 +:105C600000311691149014980299FAEA0010F01F6E +:105C7000002EC1A1FAE80010009A029BF01F002B31 +:105C8000E0800271E5D2C001C0F1E08F026C408A71 +:105C90001438C0301095C098330840892FF6B28868 +:105CA0004088C088406633990A98117AF20A180031 +:105CB000CEF0506611892FF9B089E08F0255F01FA0 +:105CC00000122FF4FAEB000830083009F01F00171B +:105CD000CA60E08F024840D85808C0510498009527 +:105CE00040D4C4A840C55815E08900224174580426 +:105CF000C040F4C9FBCDC0484199F209113604985F +:105D00000095C2F8800369A48003F38C80036F5868 +:105D10008003702880036E2480036E5280036B7CA6 +:105D200080036D1880036FC080036F32E2C80001EA +:105D30005801E0051740E2091740E1D1E515F9B92E +:105D400005001032E5D8E418F1D2E518E5D8E502EF +:105D5000FBFC5011F9D8E50CFBFC5A11F9B8050011 +:105D6000404B120B5008504B1200301B0E9CF01F82 +:105D7000010840081894404A58055F99580A5F9AEC +:105D8000F5E90009C080404CF8050D49121C1210BD +:105D9000504C12155802E08A002740DB580BC1D046 +:105DA0005808E08A0017109A5008089B0E9CF01FB4 +:105DB00000F9069A189B18940E9CF01F00F718998A +:105DC000069B50190E9CF01F00F5401940081293D5 +:105DD000E408010AC080C028049A069B0E9CF01FAC +:105DE00000ED1893301B0E9CF01F00E9411A189229 +:105DF000580AE08A0007189B0E9CF01F00E61892D4 +:105E000040C95819E089001440385808C101402998 +:105E1000F1D9C014C0C11298E6187FF0C080404C80 +:105E2000301B2FFC2FF0504C506BC038300A506A9A +:105E300041195809C031301CC09864482FC8E40883 +:105E4000032CF01F00D7F80C1120404BF80B000872 +:105E5000F1D8C005C0C0F00811205848E08A0006FB +:105E60002048100B504BC0785848C070404A2E480C +:105E7000100A504A100010055800E08A0008069BDE +:105E8000009A0E9CF01F00C7189340495809E08AF9 +:105E90000008049B129A0E9CF01F00C21892414801 +:105EA0005808C1B0049B069CF01F00BFC164069B4C +:105EB000300930AA0E9CF01F00BD2016189340DC5C +:105EC000580CC0314091C098089B4091300930AACD +:105ED0000E9CF01F00B6189458015FA940CB582BB8 +:105EE0005F98F3E80008C2505801C111049B029961 +:105EF000305A0E9CF01F00AD1892189B069CF01FA4 +:105F000000AAE089000FC0383002049440EA30094A +:105F10005CDA4085506A5049C0F9089240660494A2 +:105F20002FF65066331840850AC830085048C049DB +:105F300040DC580CE08000B55805E08A0008089B5A +:105F40000A9A0E9CF01F00971894406B580BC031B2 +:105F5000089CC138681B0E9CF01F0095684A189574 +:105F6000E8CBFFF42FEA2F4CA36AF01F00920A9BA4 +:105F7000301A0E9CF01F008B5044403A3019F5DA6D +:105F8000C001189450DA40855099502650E1049B86 +:105F9000069CF01F0089404BF8C0FFD0069CF01F04 +:105FA0000082089A506C049B0E9CF01F008418918C +:105FB00078385808C0303016C068189B069CF01F0F +:105FC000007A18960E9C029BF01F007440CCEDECFA +:105FD0001008C0D140DB580BC0A14026E04000397A +:105FE000C300406A580AE0890024C2F84069580991 +:105FF000C085129840CC1848C1D140DB580BC1A1D4 +:106000000C9940265809E08A0021069B301A0E9C04 +:10601000F01F0064049B1893F01F0063E0890006E2 +:10602000C141EDB00000C111E0400039C0A02FF027 +:10603000C0C85806E08A000C4026E0400039C04144 +:1060400033980AC8C6782FF00AC0C7580AC0409AC9 +:1060500040E9123AC430069B300930AA0E9CF01F6A +:106060000053404818930838C091109B300930AA5B +:106070000E9CF01F004E504CC0E8404B300930AA37 +:106080000E9CF01F004A089B504C300930AA0E9C11 +:10609000F01F00461894409C2FFC509CC79B301862 +:1060A0000690408508930C941096049B009CF01F6A +:1060B00000422D0C0ACC0236C0A4009B300930AA45 +:1060C0000E9C2FF6F01F00391890CF0B0896300B5E +:1060D0000694504B00931890C0284026069B301A17 +:1060E0000E9CF01F0030049B1893F01F002FE089D6 +:1060F0000012C1B1E1D0C001C0D1C17840891238CD +:10610000C0301095C0882FF650663318408CB88880 +:10611000C138339A0A981179F4091800CF002FF981 +:10612000B089C0981095C02833090A98117AF20AEC +:106130001800CF905066049B0E9CF01F0018580466 +:10614000C120404B083B5F19580B5F18F3E800086B +:10615000C0400E9CF01F0011089B0E9CF01F000F0A +:10616000C02850660E9C069BF01F000C3008AA88C1 +:106170004068415A2FF841299508408C5809FBF88E +:106180001012F1F51A002E6DD8320000800368005D +:10619000800368A0800366F88003642080036300A6 +:1061A00080036664800363EE80036818800364588C +:1061B0008002E736800354088003658C5EFC5EFC39 +:1061C000D42118961697580BC0311695C508F01FA4 +:1061D00000295806C0706C685808C0410C9CF01F1C +:1061E00000264A681037C0316C07C0A84A481037EB +:1061F000C0316C17C0584A381037EDF700028E696D +:106200003008F0091900C051F01F001F3005C2F816 +:106210000E9B0C9CF01F001D6EC818955808C0609E +:106220006E8B0C9C5D18F9B505FF8E68EDB8000704 +:10623000C0516E4B0C9CF01F00166EDB580BC0A0BB +:10624000EEC8FFBC103BC0400C9CF01F0011300892 +:106250008FD86F2B580BC0700C9CF01F000D3008AE +:10626000EF4800483008AE68F01F00070A9CD822AB +:1062700080031E7480031F388003EF2C8003EF4CD3 +:106280008003EF6C80031E7680031D2C8003217C2D +:10629000D4014848189B700CF01F0003D80200007E +:1062A00000000598800361C0D42116981897109CAF +:1062B00030084876149B8D08F01F00065BFCC05127 +:1062C0006C085808EFF81A03D822000000008CC4AC +:1062D0008002F198D42116981897109C3008149BCE +:1062E0004866129A8D08F01F00065BFCC0516C08CE +:1062F0005808EFF81A03D82200008CC48002F1205D +:106300001898E01C0000F0091510580CF20817004E +:10631000F9BC0010F9BC0100109AF0091508E61A42 +:10632000FF00F7BC00F8F2081700109AF0091504F6 +:10633000E61AF000F7BC00FCF2081700109AF0090A +:106340001502E61AC000F7BC00FEF2081700580854 +:106350005E5CEDB8001EF9BC0120F7BC00FF5EFCDE +:1063600018997808F9D8C003C150EDB80000C021D1 +:106370005EFD109BF00A1601E21B0002A388580B79 +:10638000F3FA1A00F9BC0101F3F80A00F9BC0002A3 +:106390005EFCF5D8C010F00B1610580AF60817006E +:1063A000F9BC0010F7D8C008F00A1608580BF7BC63 +:1063B00000F8F4081700F7D8C004F00A1604580BC8 +:1063C000F7BC00FCF4081700F7D8C002F00A160268 +:1063D000580BF7BC00FEF4081700EDB80000C060D1 +:1063E000A198C031320C5EFC2FFC93085EFCD401F6 +:1063F00018987649784C121CC1312FB9A369120B39 +:10640000F00900092EC8134E174A143EC060F9BCAB +:1064100003FFF9BC0201D8021039FE9BFFF6D80237 +:10642000D4211897169578965806C091310CF01F14 +:10643000000A99368F9C9916992699065805C0909E +:106440006A196E987038F009032A8B0AF009092539 +:10645000D82200008002E2A4D421189716967895DD +:106460005805C091310CF01F001999358F9C991572 +:10647000992599056E956A385808C0B1310A304B94 +:106480000E9CF01F00138B3C6E98703C580CC1B0F2 +:106490006E987038F0060028700C580CC0407809CF +:1064A0009109C0E80E9C30170E9BEE060947EECA14 +:1064B000FFFBA36AF01F0006C060991699273008F9 +:1064C00099389948D82200008002E2A48002DC5466 +:1064D000D431202D1693129610951492301BF01F74 +:1064E0000029F3D3C0145009F1D3C01FF0011614D2 +:1064F000FC1A0010F3DAE139FBF91A00189458027B +:10650000C1E0FACCFFF818D2F01F001F4018C0D02D +:106510004009F80A1120F20A094AF5E810088958DA +:10652000F20C0A495009C028895840085808F9B3A4 +:106530000102F9B3000189688943C0981A9CF01FD1 +:106540000012301340082E0C894389585801C0901E +:10655000E2C1043318018D01F80C11358B0CC0D841 +:10656000E6C8FFFCF8CC0432A5738D0CE808032CB8 +:10657000F01F000618138B03089C2FEDD832000083 +:10658000800364588003636080036300D4317448DF +:106590007645169714961015C1312FB8EECEFFEC44 +:1065A000A368F408000BEE080008114A1749123AD4 +:1065B000C030C0E2C0781C38FE9BFFF9C4A8580563 +:1065C000C0640E9830150C971096C02830056E1BCD +:1065D000F01F00246E496C4499352FB4F2C5FFFBBF +:1065E000EC040024EE0500252EC62EC7F8C8FFECEB +:1065F000300A0F0E0D0BFC021610F6031610FDDE0E +:10660000C010E4030103F7DBC010FC0B010BF60A1A +:10661000000AB01AB14AE60A000AB00A2FC8B14A05 +:106620000836CE83C0D80F0BF60E1610F7DBC0105D +:10663000160AB01AB14A1C0AB00A2FC8B14A0A3762 +:10664000CF33C0282019114A580ACFD09949D832DF +:10665000300BF01F00043018994830089958D83290 +:1066600080036458D43116977646F40214052FF649 +:10667000149318940406761B6E28C0382FFBA1785B +:106680001036FE99FFFD089CF01F001A300918957E +:10669000F8C8FFEC129AC03810AA2FF90439CFD5E8 +:1066A0006E4BE7D3C0052FBBEEC9FFECEE0B002B02 +:1066B0005803C130E60C1120300A7202E40309428B +:1066C000044A10AA130AF40C0A4A1639CF73910A25 +:1066D000580AC0702FF6C058130A10AA1639CFD323 +:1066E000089C20160E9B8B46F01F00030A9CD83294 +:1066F0008003645880036420D431202D7649744887 +:10670000169614951039EC081750EA061750F00544 +:1067100017506C2876437442761BE4030007103749 +:10672000F7BB09FFF01F0036EEC4FFFBF8C9FFEC12 +:10673000F8040024300A1298C02810AA0838CFE3C1 +:106740002FB32FB2EC030023EA020022ECCBFFECC4 +:106750005012EACAFFECC44894955805C20012983A +:106760001696300E50090D02E400161070017009E3 +:10677000B181E5D2C010E0050341AB32E1D9C010D0 +:106780000002E40E000EB01EB18E1C01B001E20E3C +:1067900016102FC80636CE834009910E94865806EF +:1067A000C1D072021298169E3005B0121D0190825F +:1067B000E1D1C010AD30E0020002E4050005B005F3 +:1067C000B185B1812FC8AD319092E20200020A0278 +:1067D000E4051610063ECEA391022FCA2FC9401819 +:1067E000103ACBB3C02820175807E08A00050948A3 +:1067F0005808CFA099472FEDD83200008003645885 +:10680000D4211697301BF01F00043019995799496D +:10681000D822000080036458D431300812951697AE +:1068200018967644F6C9FFEC720BF60C1610F7DBDF +:10683000C010F40C024CF40B0345F7D5C010B18521 +:106840001805EA0C1510F80B000B12AB2FF8B185E8 +:106850000838CEB55805C1D06E281034C1456E1B1E +:106860000C9C2FFBF01F000C6E4AEECBFFF418932C +:106870002FEA2F4CA36AF01F00090E9B0C9CF01FFF +:1068800000080697E8C8FFFF2FB48F48EE040925DB +:106890000E9CD832800364588002E736800364205F +:1068A000D431149618971694F1DAC002C0902018CB +:1068B0004A19F208032A3009F01F00201894A34651 +:1068C000C3706E955805C091310CF01F001D9935AD +:1068D0008F9C9915992599056E9366255805C0D109 +:1068E000E06B02710E9CF01F0017872C3008189582 +:1068F0009908C038069C1895EDB60000C0C1089BE9 +:106900000A9A0E9CF01F0010089B18930E9C069488 +:10691000F01F000EA156C0C06A035803CEC10A9AE8 +:106920000A9B0E9CF01F00088B0C9903CE5B089C01 +:10693000D83200008003F380800368188002E2A44C +:1069400080036800800366F880036420D4211698D1 +:106950001897109C3008149B4866129A8D08F01FF7 +:1069600000065BFCC0516C085808EFF81A03D822E7 +:1069700000008CC48002F1381498FC197FF0F5DB1C +:10698000C01FF00B1100F7E81008F5E813F8F20843 +:106990000108F00C1100F9E81008F00C141F2FFC8E +:1069A0005EFCD703F5EB101CE08000DCD421F7E996 +:1069B000200EEFDBC28B3015C430AB6BF7EA136BE4 +:1069C000AB6AF7D5D3C2EDD9C28BC5C0A1785CF94B +:1069D000F3D5D2ABE04707FFC770E04607FFC740DB +:1069E000EE06000CE02C03FEF6080644F40907440A +:1069F000F4080646F609064A0807F405004A5C0B47 +:106A0000EDBB0014C050A1775CFA5CFB201C580C55 +:106A1000E08A006FE04C07FFE084009CF7DCD28B3B +:106A2000EDEA11F6EFE61217EE178000F1B7042039 +:106A30000E0A5C0BEDBE001FEFBB001FD822E41B4B +:106A4000000FF40C1200F6061200F7BC03E1F80682 +:106A50001730F7B60201E0460020C0D4EC0C11203C +:106A6000F606094BF40C0A4C184BF406094A20B6FA +:106A70000C17CAABF406094BC640300A20B60C17F7 +:106A8000CA3BE419000FF00C1200F2051200F7BC2B +:106A900003EAF8051730F7B5020AE0450020C0D434 +:106AA000EA0C1120F2050949F00C0A4C1849F005CE +:106AB000094820250A16C8FBF0050949C4203008FA +:106AC00020250A16C88BE419000FE41B000F144B95 +:106AD0001049E04707FFC091580BC381E04607FF0C +:106AE000C3815809C360C3285809C330C2F85C3C4D +:106AF0002FFCF1BC04C0E04C0020C114F8081120A8 +:106B00000E46EE0C0A47F40809491247F40C0A4AEB +:106B1000F6080949124AF60C0A4BC83BF80811203E +:106B2000F9B90000C030F60809490E46EDEA101622 +:106B3000F40C0A4AF3EA1007F60C0A4A300BC71B9A +:106B40001C9BE61B8000300AD8223FFB3FFAD8226C +:106B5000F06B0000EDBE001FEFBB001F300AD82213 +:106B6000F7E9200BE61B8000F9D9C28BE04C07FF48 +:106B70005E1C3FFA3FFB5EFCEE198000F7E9200C3B +:106B8000E08600CAEBCD40E0169CE61C8000BFDB2F +:106B9000BFD9103AF20B1300C0921697129B0E99B0 +:106BA0001497109A0E98EE1C8000F6071614AB7B13 +:106BB000F7EA135BAB7ABFBBF2061614C440AB799D +:106BC000F3E81359AB78BFB9E04707FFC4F00E26CE +:106BD000C120EC051120E0460020C7C2F005094E97 +:106BE000F2050945F0060A48F2060A490A48580E15 +:106BF0005F1E1C48101AF609014BF6061200C0E091 +:106C0000C783EC0E1120F606094BF40E0A4E1C4BFE +:106C1000F406094A0C17E08A0039F4091515AB9AF5 +:106C2000F5EB115AAB9BF7D7D28B184BFC178000B2 +:106C3000EDBA0000F7B701FF0E395F29120A5C0BAD +:106C4000E3CD80E0AB79F3E81359AB78F3E8100EAD +:106C5000F9B60101EE0E1100F9B70001EFBB001FFC +:106C6000F7EA100EF9B70000CB0BBFDBF7EA100E06 +:106C7000C081E04607FFC050F9E7114BE3CD80E04B +:106C80003FFA3FFBE3CD80E05C372FF7F1B704C05C +:106C9000E0470020C114EE081120F40809495F16EE +:106CA000F4070A4A0C4AF6080949F5E9100AF407FC +:106CB0000A4B3007CB3BEE081140F608094914494E +:106CC0005F16F6070A4A0C4A300B3007CA7BE3CD41 +:106CD00080E0F1B604C0F00E1700C040F205094E86 +:106CE000104EF2060A483009580E5F1E1C48C83B79 +:106CF000F4061200F9B70300F9B60300F9BC03006B +:106D0000F7B602E0F406094B300A0C17FE9AFFBEF4 +:106D1000C85B0000EE198000F7E9200CFE96FF2EFC +:106D2000EBCD40E0169CE61C8000BFDBBFD9123BD8 +:106D3000C0721697129B0E991497109A0E98300EE7 +:106D4000EFDBC28BF7DBC014B5ABEDD9C28BC5F05E +:106D5000F3D9C014B5A9E04707FFC2500E26C0F012 +:106D6000EC051120E0460020C352F005094EF20563 +:106D70000945F0060A48F2060A490A48100AF609C7 +:106D8000004BEDBB0015C340F7D7D28B184BF9DA97 +:106D9000C001184EEE1E8000F1BE04201C0A5C0BE0 +:106DA000E3CD80E0B5CBF7EA100EC101E04607FF66 +:106DB000C030E3CD80E0B5C9F3E8100EC071300AF1 +:106DC000FC1B7FF0184BE3CD80E03FFA3FFBE3CDA7 +:106DD00080E0F1B604C0F00E1700C060F205094E65 +:106DE00058085F18104EF2060A483009CC8BFDEEA9 +:106DF000101EA19B5D0A5D0E2FF7E04707FFF9BA51 +:106E00000000F9BB0000F9BE0000CBFB30165807AC +:106E1000CA31B5CB100AF609004B184BE3CD80E020 +:106E2000580B5E6DF60C1501B59CE02C03FF5E3D22 +:106E3000F80C111F1699AB7BBFBBF7EA135BF60C7E +:106E40000A4BA1795E2B5C3B5EFBF8CB0000300C5B +:106E5000C038189B5C4B300A5E0BD401E069041EFD +:106E6000F6081200C170C0C3F00E1120F608094BDD +:106E7000F40E0A4E1C4BF408094A1019C0B8F40865 +:106E80001200F9B80300F7B802E0F408094B300A21 +:106E900010195809E08900305C392FF9E0490036B3 +:106EA000C043300B300AC2682F69F2081120E04954 +:106EB0000020C0B2F408094EF6080948F4090A4A4D +:106EC000F6090A4B104BC088F608094E144E169A64 +:106ED000300BF4090A4AEDBA0000C0921C7EC04192 +:106EE000EDBA0001C0422FFAF7BB02FF5CFC5D0B5C +:106EF0005D0AD802E06803FFEDBA000BF7B800FFA7 +:106F0000100A5C0BF7B903FEE04907FFC055300AD1 +:106F1000FC1BFFE0C0C8EDBB001FF7B90101AB9A35 +:106F2000F5EB115AA17BAB9BF7E9115BA17C5D0BE3 +:106F3000D802103AF20B1300C080A17BA179144B48 +:106F4000124B104B5E0F5EFDA17BFC1CFFE0580A4C +:106F5000F80B13005E8F5EFD1ADE1AD7A17B5F3C33 +:106F6000A1795F375CFCFC1EFFE0580AFC0B1300A4 +:106F7000E08B001D5808FC091300E08B0018580B2B +:106F8000F5BA0000C1501B071B0E583CC0A0581C8E +:106F9000C0335E0F5E1D103AF20B13005E2F5E3D94 +:106FA0001438F60913005E2F5E3D1B07D80A5817E8 +:106FB0005F0C5809F5B800001B071B0E5E0F5EFC46 +:106FC0001ADE1AD7A17B5F3CA1795F375CFCFC1EFF +:106FD000FFE0580AFC0B1300E08B001D5808FC0969 +:106FE0001300E08B0018580BF5BA0000C1501B07C6 +:106FF0001B0E583CC0A0581CC0335E0D5E1F103ADB +:10700000F20B13005E2D5E3F1438F60913005E2D5F +:107010005E3F1B07D80A58175F1C5809F5B80000D7 +:107020001B071B0E5E0D5EFCEBCD40FFF7E9200E4B +:10703000F6071614A97BF7EA137BA97ABDBBE41BFC +:107040003FFFABD7E08000CCE04707FFE08400B50E +:10705000F2061614A979F3E81379A978BDB9E419F1 +:107060003FFFABD6E08000E2E04607FFE08400B2DD +:107070000C17FE37FC01FC1C8000F8031601E9D94F +:10708000C3625CD4E7D4D382E6090644F80501253F +:10709000E6050644EA031502E6090644F80501255B +:1070A000E6050644EA031502E6090644F80501254B +:1070B000E6050644EA031502E6080640E40907402F +:1070C000E609064402045C05A365EBE413E5A3644A +:1070D0005C34F8050145E6040640E4050740E60592 +:1070E000064402045C05EA031502E7E413E3E80240 +:1070F0001502E6080640E4090740E60906440204D2 +:107100005C05A365EBE413E5A3645C34F805014575 +:10711000E6040640E4050740E605064402045C0573 +:10712000EA031502E7E413E3E8021502E60A064063 +:10713000E40B0740E60B064202025C03EDB3001CC1 +:10714000C090A1725CF32017A39AF5EB11DAA39B10 +:10715000C058A58AF5EB11CAA58B5807E08A008BA9 +:10716000E012FF00E8120080E6080640E40907404C +:10717000E4080644E60906480005F00100485C09F9 +:10718000F9D2C10158045C25F4081300F609130074 +:107190005F36F8061700E40A1608F5E3118AE60BD5 +:1071A0001608F7D7D28BEDBE001FEFBB001F0C0AED +:1071B0005C0BE3CD80FFE41B000F144BE08100A7C4 +:1071C000F2061614ABD6E04607FFE08100A4C9E83A +:1071D000E419000F1049E081009AC928A37BF7EA5F +:1071E00013DBA37AF5EB1004E08000A0F604120094 +:1071F000C170C0C3E8051120F604094BF4050A4527 +:107200000A4BF404094A0817C0B8F4041200F9B490 +:107210000300F7B402E0F404094B300A0817A38A0C +:10722000F5EB11EAA38BC11BA379F3E813D9A3787B +:10723000F3E81004C6F0F2041200C170C0C3E80500 +:107240001120F2040949F0050A450A49F0040948E9 +:107250000816C0B8F0041200F9B40300F7B402E055 +:10726000F004094930080816A388F1E911E8A38958 +:10727000CFCA5C372FF7F1B704C0E0470020C154F4 +:10728000EE061120E4070A42E606094C1842E6071A +:107290000A43F4060941F4070A4AF606094C184A5B +:1072A000F6070A4B3000C158EE061120F9B0000075 +:1072B000F9BC0000C050F4060940F606094CE60788 +:1072C0000A423003F4070A411841F6070A4A300B14 +:1072D000E012FF00E8120080E6080646E4090746CF +:1072E000E4080644E60906480C05F00700485C0976 +:1072F0003007F9D2C1010034E2051300C46B1C9BB6 +:10730000E61B8000300AE3CD80FF3FFB300AE3CD6F +:1073100080FFF5EB1004C0901C9BE61B8000EA1B6D +:107320007FF0300AE3CD80FFF1E91015CEF0E9D906 +:10733000C28BE04407FFCE41F1E910C5CE10CE6B01 +:10734000D4311A97202D109C1295149E16931696E0 +:107350005809C4411638E088005AF0081200C0D01D +:10736000F6080946F808094CF00B1120F408094EFC +:10737000F40B0A4BF7E61006F80A1610EBDCC01007 +:10738000EC0A0D02FC091610EA02024BF3E31109A4 +:10739000123BE08800091809123CE08B0005123B03 +:1073A000F3DCEB09F20B010BFDDEC010F60A0D0A4F +:1073B000FDEB110EEA0A024A1C3AE0880009180E99 +:1073C0001C3CE08B00051C3AFDDCEB0EFC0A010ABC +:1073D000300BF4080A4A2FEDD8321639FE9BFFFD18 +:1073E000F2091200C46114385F8B06355F3AF7EA80 +:1073F000100AF20A1800C060FC08010AE6050146FE +:10740000149E0C9B1C9A2FEDD8325808C05130198D +:10741000F2080D08109CF8081200E0810084EC0CC2 +:10742000010BF8031610EBDCC010F6030D0AFC0983 +:107430001610EA0A024AF3EB1109123AE088000931 +:107440001809123CE08B0005123AF3DCEB09141921 +:10745000FDDEC010F2030D02FDE3110EEA02024A46 +:107460001C3AFE98FFB5180E1C3CFE9BFFB1CACB20 +:10747000F20E1120EA090945F609094BE60E0A4306 +:10748000F0090941F4090942F00E0A48F40E0A4ACB +:107490000A48164AF0061610F9D8C010E6060D0480 +:1074A000F4031610089BE7E51103E80C02450635C6 +:1074B000E0880007201B10030638E0880072F5DA28 +:1074C000C0100A13E6060D04F5E51106E80C024C9F +:1074D000089A0C3CE0880007201A10060C38E08857 +:1074E000005AF5EB110B1816F601064A149C1636D5 +:1074F000C0735F0514325F3AEBEA000AC060F8011E +:107500000104F608014B089CE40C010AEC0B01464F +:10751000EC090A4BF4090A4AEC0E09460C4A2FED15 +:10752000D832F0011120F4010A4BF808094CEC089C +:107530000949EC010A41F7E91009F8031610EBDCE0 +:10754000C010E2030D00F20B1610EA00024EF7E144 +:10755000110B163EE0880006180B163CE088002749 +:10756000F60E0101F3D9C010E2030D00F3E1110999 +:10757000EA00024B123BE08800091809123CE08B3C +:107580000005123BF3DCEB09F20B010BF408094E8A +:10759000C4DB0C3CF7BA0B01EDD8EB06CA3B063551 +:1075A000F7BB0B01E7D8EB03C8BB163EF7DCEB0BD0 +:0275B000CD8B81 +:10760000C0080000C0080000C0080000C00800005A +:10761000C0080000C0080000C0080000C00800004A +:10762000C0080000C0080000C0080000C00800003A +:10763000C0080000C0080000C0080000C00800002A +:10764000C0080000C00800000000000000000000AA +:10765000C008000000000000000000000000000062 +:10766000C008000000000000000000000000000052 +:10767000C008000000000000000000000000000042 +:1076800000000000000000000000000000000000FA +:1076900000000000000000000000000000000000EA +:1076A00000000000000000000000000000000000DA +:1076B00000000000000000000000000000000000CA +:1076C00000000000000000000000000000000000BA +:1076D00000000000000000000000000000000000AA +:1076E000000000000000000000000000000000009A +:1076F000000000000000000000000000000000008A +:10770000C0080000300CF01F0012580CF80F1710C2 +:10771000D603301CF01F000E580CF80F1710D603BC +:10772000302CF01F000B580CF80F1710D603303C0C +:10773000F01F0007580CF80F1710D60300000104C3 +:107740004000011280000120C000012E8000A41C16 +:107750000000000000000000000000000000000029 +:107760000000000000000000000000000000000019 +:107770000000000000000000000000000000000009 +:1077800000000000000000000000000000000000F9 +:1077900000000000000000000000000000000000E9 +:1077A00000000000000000000000000000000000D9 +:1077B00000000000000000000000000000000000C9 +:1077C00000000000000000000000000000000000B9 +:1077D00000000000000000000000000000000000A9 +:1077E0000000000000000000000000000000000099 +:1077F0000000000000000000000000000000000089 +:1078000073656E645265706C790000006765745F23 +:10781000646174615F7463705F636D645F63620071 +:107820006765745F7265706C795F686F73745F62AF +:10783000795F6E616D655F63620000006765745F0C +:107840007265706C795F7363616E5F6E6574776F7C +:10785000726B735F636200006765745F7265706C62 +:10786000795F6964785F6E65745F63620000000031 +:107870007365745F706173737068726173655F6361 +:107880006D645F63620000007365745F6B65795FB0 +:10789000636D645F6362000063616C6C5F7265704E +:1078A0006C795F6362000000617661696C5F64619E +:1078B00074615F7463705F636D645F636200000096 +:1078C0007365744D6170536F636B4D6F6465000039 +:1078D0006765745374617274436D6453657100001D +:1078E0007365745F6E65745F636D645F63620000EF +:1078F0007365745F69705F636F6E6669675F636D00 +:10790000645F63620000000073656E644572726FAD +:107910007200000073746172745F736572766572D1 +:107920005F7463705F636D645F6362007370695F4F +:10793000736C61766552656365697665496E74003E +:107940006765745F636C69656E745F737461746599 +:107950005F7463705F636D645F63620073656E6420 +:107960005F646174615F7564705F636D645F6362BF +:1079700000000000636865636B4D7367466F726D4E +:107980006174000073746172745F7363616E5F6E23 +:1079900065745F636D645F6362000000666F756E9F +:1079A00064486F737442794E616D65007365745FEE +:1079B0006B65795F636D645F63620000696E697413 +:1079C0005370690073746172745F636C69656E747F +:1079D0005F746370000000007370695F706F6C6C9F +:1079E000000000006765745F726573756C745F6397 +:1079F0006D645F636200000073746F705F636C6935 +:107A0000656E745F7463705F636D645F63620000D2 +:107A100073746172745F7365727665725F7463709C +:107A2000000000007365745F706173737068726149 +:107A300073655F636D645F63620000007365745F0C +:107A4000726573756C745F636D6400007365745F59 +:107A5000646E735F636F6E6669675F636D645F63B7 +:107A6000620000006765745F73746174655F7463BE +:107A7000705F636D645F6362000000007265715F38 +:107A80007265706C795F686F73745F62795F6E6145 +:107A90006D655F636200000073746172745F636C94 +:107AA00069656E745F7463705F636D645F636200C9 +:107AB000572D5B25735D2057726F6E67207465725A +:107AC0006D696E6174696F6E20696E6465783A25C0 +:107AD00064206E506172616D3A2564206964783A61 +:107AE00025642031366269743A25640A000000007A +:107AF0003078257820000000572D5B25735D2049E4 +:107B00006E646578206F7574206F662072616E6791 +:107B1000653A2025640A00005B25735D20535349B4 +:107B2000443A25730A0000005B25735D20525353CD +:107B3000493A25640A0000005B25735D20454E43E9 +:107B4000543A25640A0000005B25735D205365618B +:107B5000726368696E6720666F7220486F73743A4B +:107B60002069703D3078257820666F756E643D25FC +:107B7000640A00005B25735D20666F756E64486F54 +:107B8000737442794E616D653A20466F756E64205C +:107B9000486F73743A206E616D653D25732069707E +:107BA0003D307825780A00005B25735D20696653B7 +:107BB00074617475733A256420726573756C743AD8 +:107BC00025640A004C69737420436F6D6D616E64A7 +:107BD000732066756C6C210A000000005245434515 +:107BE000495645005452414E534D4954000000003F +:107BF0005B25735D204D6170205B25642C20257012 +:107C00002C2025735D0A00005B25735D20535049CD +:107C100020696E697469616C697A6174696F6E203C +:107C20006661696C65642100572D5B25735D204595 +:107C300072726F7220636F6E6669677572696E67C4 +:107C4000205350490A000000572D5B25735D202505 +:107C5000645D20446973616C6C2E2025642F25645B +:107C600020636D643A25640A00000000572D5B25EF +:107C7000735D2025645D20446973616C6C2E202542 +:107C8000640A00005B25735D3A200000572D5B25D8 +:107C9000735D2025645D204E6F7420666F756E6481 +:107CA00020656E6420636D643A20307825780A0080 +:107CB0005B25735D2025732025640A00572D5B2505 +:107CC000735D20456E64206F6620636D6420706173 +:107CD00072616D73000000005B25735D2064617448 +:107CE00061417661696C3A25640A0000572D5B2575 +:107CF000735D2054544350206E6F7420666F756E10 +:107D00006420666F7220736F636B3A25640A00000B +:107D10005B25735D20736F636B3A25642073746118 +:107D200074653A25640A00005B25735D20737461F5 +:107D300074653A25640A00005B25735D2053746105 +:107D40007274204E6574776F726B205363616E207E +:107D500025640A00572D5B25735D206572723D25F1 +:107D6000640A00005B25735D204C6F6F6B696E6762 +:107D700020666F7220486F73743A206E616D653DA6 +:107D800025730A005B25735D20466F756E6420487D +:107D90006F73743A206E616D653D25732069703D87 +:107DA000307825780A0000005B25735D2053746FDE +:107DB0007020636C69656E7420736F636B3A256421 +:107DC0000A00000055445000544350005B25735D89 +:107DD00020416464723A307825782C20706F727478 +:107DE0003A25642C20736F636B3A25642C207072E3 +:107DF0006F743A25730A0000572D5B25735D205080 +:107E0000726576696F757320636C69656E74202581 +:107E100070206E6F742073746F7070656420210A17 +:107E2000000000005B25735D205374617274204371 +:107E30006C69656E74202573202570205B30782571 +:107E4000782C2025642C2025645D204F4B210A00CE +:107E50005B25735D20537461727420436C69656E99 +:107E600074202573202570205B307825782C202500 +:107E7000642C2025645D204641494C4544210A007C +:107E8000572D5B25735D205374696C6C20636F6E96 +:107E90006E65637465642E2E2E776169740A000026 +:107EA000572D5B25735D20494620646F776E2E2E1B +:107EB0002E776169740A00005B25735D205374613D +:107EC000727420536572766572202573205B256479 +:107ED0002C2025645D204F4B210A0000572D5B2587 +:107EE000735D2053746172742053657276657220DD +:107EF0002573205B25642C2025645D204641494C78 +:107F00004544210A000000005B25735D2025702098 +:107F10006E756D506172616D3D2564207061726D8A +:107F200073546F4368616E67653D25640A00000005 +:107F30005B25735D2025645D206E69663A2570209F +:107F40006C7769705F616464723D307825780A00EF +:107F50005B25735D20257320706172616D733D2513 +:107F6000640A00005B25735D20506173733A20251D +:107F7000732025640A000000572D5B25735D2025C2 +:107F800073203A204661696C656420746F206164D7 +:107F90006420706173737068726173650A00000019 +:107FA000436F6E6E65637420746F206E6574776FB7 +:107FB000726B2E2E2E0000006572723D25640A0041 +:107FC0004F4B0A00572D5B25735D205353494420C6 +:107FD0006C656E206F7574206F662072616E6765C8 +:107FE000000000005B25735D2025730A000000007F +:107FF000572D5B25735D2053656E642053504920D7 +:108000006572726F72210A003D3D3E003C3D3D00AD +:10801000572D5B25735D20556E6B6E6F776E2063F9 +:108020006D6420307825780A00000000572D5B250C +:10803000735D2025645D20436865636B20666F7205 +:108040006D6174206D7367206661696C6564210AD7 +:1080500000000000444F574E000000005550000043 +:1080600049462020207374617475733A2025730A81 +:1080700000000000434F4E4E207374617475733AD4 +:108080002025730A00000000536F636B6574206E37 +:108090002E3A256428256429205B307825785D20D8 +:1080A000257320257320616464723A257320706FF4 +:1080B00072743A25640A00005B2564207470637052 +:1080C0002D25705D2D5374617475733A25640A0013 +:1080D0005B746C63702D25705D2D537461747573C2 +:1080E0003A25640A000000005B757063702D2570EE +:1080F0005D20666C6167733A3078257820206C6F5C +:1081000063616C3A25735B307825785D2D25640AB0 +:108110000000000072656D6F74653A257328307831 +:108120002578292D25640A004E4F0000594553003B +:108130004461746120617661696C3A25730A0000BC +:108140002D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D5F +:108150002D2D2D2D2D2D2D2D2D2D2D2D2D2D0A009F +:108160005B25735D205363616E206E6F7420636FB7 +:108170006D706C65746564210A0000005B25735D99 +:10818000204E6574776F726B73206E6F7420666F0C +:10819000756E64210A000000636F756C64206E6F59 +:1081A0007420616C6C6F6361746520616C6C206716 +:1081B0007569206E65742061727261790A00000031 +:1081C000636F756C64206E6F7420616C6C6F63619B +:1081D000746520616C6C20677569206E6574730A24 +:1081E000000000005B25735D202564202D20257391 +:1081F000205B25645D2D202564202D202564202D05 +:1082000020307825780A000D000B000C000A0000D1 +:108210007365745F726573756C745F636D64000081 +:108220008000636C800063988000637E80006398A8 +:108230008000638E80006398800063648000639890 +:10824000800063688000638A800063786174637073 +:108250005F706F6C6C5F636F6E6E00007564705F53 +:10826000737461727400000072656D6F76654E659F +:1082700077436C69656E74436F6E6E0061756470F0 +:108280005F726563765F6362000000006765745328 +:1082900074617465546370006172645F7463705FCD +:1082A00073746F7000000000617463705F636F6EC1 +:1082B0006E5F6572725F6362000000006765744EF6 +:1082C0006577436C69656E74436F6E6E4964000038 +:1082D000617463705F636F6E6E5F636C695F65721C +:1082E000725F636200000000617463705F616363CA +:1082F0006570745F636200007564705F73746172AF +:10830000740000005B25735D20747463703A2570FF +:108310002069643D25642C20747063623D25700AD9 +:1083200000000000572D5B25735D204E6F205661C5 +:108330006C696420636C69656E7420666F7220746A +:108340007463703A25700A005B25735D2025645DB7 +:1083500020747463703A257020747063623A2570DB +:108360002073746174653A2564206C7063623A25E9 +:10837000702073746174653A2564206C6566743A84 +:1083800025642073656E743A25640A00572D5B25B9 +:10839000735D20544350206E6F7420696E69746958 +:1083A000616C697A656420747463703A2570207416 +:1083B0007063623A2570206C7063623A25700A001F +:1083C000572D5B25735D204E6F2056616C696420CC +:1083D000496420666F7220747463703A257020704F +:1083E00063623A25700A00005B25735D2062756642 +:1083F0003A2570206C656E3A25640A00572D5B257E +:10840000735D2054544350205B25705D3A20636FA8 +:10841000756C64206E6F7420616C6C6F6361746541 +:1084200020706275660A0000572D5B25735D20542D +:10843000544350205B25705D3A207564705F73650E +:108440006E642829206661696C65640A000000007A +:108450005B25735D2054544350205B25702D25709F +:108460005D3A20636F6E6E65637420256420256419 +:108470000A0000005B25735D206C6566743D256411 +:10848000206C656E3A25640A000000005B25735D70 +:10849000207463705F7772697465206661696C65CA +:1084A000642025702073746174653A2564206C65BE +:1084B0006E3A2564206572723A25640A0000000055 +:1084C000572D5B25735D2074746370203D3D204EF5 +:1084D000554C4C210A0000005B25735D20747463C9 +:1084E000703A2570207063623A2570206275663A92 +:1084F0002570206C656E3A25640A00005B25735D6B +:1085000020272573270A00005B25735D20506163D7 +:108510006B65742073656E74207063623A257020F9 +:108520006C656E3A2564206475723A2564206C652A +:1085300066743A25640A00005B25735D2054544339 +:1085400050205B25705D3A20636C65616E536F63EC +:108550006B53746174655F63622025640A000000D8 +:108560005B25735D20436C6F73696E672074706365 +:10857000623A2073746174653A30782578206572A8 +:10858000723A25640A0000005B25735D20436C6F1E +:1085900073696E67206C7063623A207374617465EE +:1085A0003A30782578206572723A25640A00000016 +:1085B0005B25735D2046726565696E672070617921 +:1085C0006C6F61642025642D25700A005B25735D46 +:1085D00020436C6F73696E6720747063625B2570F3 +:1085E0005D3A2073746174653A307825782065723D +:1085F000723A25640A000000572D5B25735D204305 +:10860000616E6E6F7420636C6F73652069643A25C8 +:10861000642D2570207075742070656E64696E67B6 +:108620000A0000005B25735D202D2D2D2D2D2D2D95 +:108630002D2D2D2D2D2D2D2D2D2D2D2D2D2D2D0A8D +:1086400000000000572D5B25735D2074746370205B +:108650003D204E554C4C210A000000005B25735D07 +:1086600020666C75736820646174613A207470636D +:10867000623A2570206572723A25640A0000000093 +:10868000572D5B25735D2054544350205B25705D4E +:108690003A20636F6E6E656374696F6E20657272E7 +:1086A0006F723A202564206375727249643A2564BA +:1086B0000A00000041626F727420636F6E6E656322 +:1086C00074696F6E0A000000572D5B25735D20549E +:1086D000544350205B25705D3A20636F6E6E656376 +:1086E00074696F6E206572726F723A202564206122 +:1086F00072673A25700A0000572D5B25735D205480 +:10870000544350205B25705D3A2066726565206D8C +:10871000656D6F72790A00005B25735D20554450CA +:1087200020496E7365727420257020736F636B3AF5 +:10873000256420616464723A257320706F72743A04 +:1087400025640A00572D5B25735D20545443502047 +:108750005B2D5D3A20696E76616C6964206D6F6493 +:10876000650A0000572D5B25735D2054544350204B +:108770005B2D5D3A20696E76616C6964206E62756E +:10878000660A0000572D5B25735D2054544350202A +:108790005B2D5D3A20696E76616C69642062756656 +:1087A0006C656E0A00000000572D5B25735D205438 +:1087B000544350205B2D5D3A20636F756C64206ECE +:1087C0006F7420616C6C6F63617465206D656D6F93 +:1087D000727920666F7220747463700A0000000062 +:1087E000572D5B25735D2054544350205B25705DED +:1087F0003A20636F756C64206E6F7420616C6C6FCF +:1088000063617465207063620A0000005B25735D1C +:108810002025732C20757063623A25702025733AE9 +:1088200025640A00572D5B25735D20545443502066 +:108830005B25705D3A2075647020636F6E6E6563B2 +:1088400074206661696C65640A000000572D5B2521 +:10885000735D2054544350205B25705D3A2062695B +:108860006E64206661696C6564206572723D256482 +:1088700020506F727420616C726561647920757329 +:1088800065640A005B25735D2025732C206C6F6383 +:108890003A307825782D25642072656D3A30782538 +:1088A000782D25640A0000005B25735D20416C6C07 +:1088B0006F63207061796C6F61642025642D257071 +:1088C0000A000000572D5B25735D2054544350204F +:1088D0005B25705D3A20636F756C64206E6F742049 +:1088E000616C6C6F63617465207061796C6F616439 +:1088F0000A0000005B25735D205B747063625D2D70 +:108900002570207061796C6F61643A25700A0000EF +:10891000572D5B25735D2054544350205B25705DBB +:108920003A2074637020636F6E6E656374206661B5 +:10893000696C65640A0000005B25735D2042454652 +:108940004F52452042494E4420747463703A25705A +:10895000206C7063623A2570207063623A25700A59 +:1089600000000000572D5B25735D205454435020B8 +:108970005B25705D3A206C697374656E2066616971 +:108980006C65640A00000000572D5B25735D205361 +:108990007461727420736572766572204641494C29 +:1089A0004544210A000000005B25735D20545443B8 +:1089B00050205B25702D25705D3A206E6275663DF6 +:1089C00025642C206275666C656E3D25642C2070D4 +:1089D0006F72743D2564202825732F2573290A00A2 +:1089E0007574726C3A6E3A703A7600002573000026 +:1089F0005B25735D2041524420544350205B257019 +:108A00005D3A20616363657074206E6577205B2535 +:108A1000705D0A005B25735D206C6F63616C3A25A5 +:108A2000642072656D6F74653A2564207374617497 +:108A3000653A25640A0000007061796C6F616420FA +:108A40006E6F74206672656564210000572D5B258A +:108A5000735D2041524420544350205B25705D20BB +:108A60006172673D257020726574726965733D257A +:108A7000642061626F72740A000000005B25735D00 +:108A8000206B656570416C697665436E743A256448 +:108A9000206B6565705F69646C653A25642070655C +:108AA00072736973745F636E743A25640A00000020 +:108AB0005B25735D2041524420544350205B257058 +:108AC0002D25705D206172673D257020726574727E +:108AD0006965733D25642070656E642E636C6F73E9 +:108AE000653A2564206C656E3A25640A0000000032 +:108AF0005B25735D2041524420544350205B257018 +:108B00002D25705D2074727920746F20636C6F73F3 +:108B1000652070656E64696E673A256420657272BF +:108B20003A25642069643A25640A00005B25735D78 +:108B30002041524420544350205B25702D25705D08 +:108B4000206172673D257020726574726965733D9E +:108B500025642070656E642E636C6F73653A2564BE +:108B600020636F6E6E3A25640A000000572D5B2566 +:108B7000735D2041524420544350205B25702D25C5 +:108B8000705D206172673D25702072657472696541 +:108B9000733D25640A0000005B25735D204152444B +:108BA00020544350205B25702D25705D2074727910 +:108BB00020746F20636C6F73652070656E64696EDE +:108BC000673A25640A0000005B25735D206C656EC2 +:108BD0003A25640A000000005B25735D20736F6313 +:108BE0006B3A2564207063623A2570207062756666 +:108BF0003A2570206572723A256420627566537456 +:108C00006F72653A2570206C656E3A25640A000023 +:108C10005B25735D20617463705F726563765F636B +:108C20006220703D4E554C4C206F6E20736F636B0D +:108C30003A2564207063623A25700A00572D5B253F +:108C4000735D206572723D256420703D25700A00B9 +:108C50005B25735D205265636569766564202570C8 +:108C6000206C656E3A25640A000000006174637030 +:108C70005F737461727400007463705F73656E6417 +:108C80005F646174615F70636200000061746370AF +:108C90005F706F6C6C000000617463705F7265637D +:108CA000765F6362000000006172645F7463705FEE +:108CB000737461727400000067657446697273743E +:108CC000436C69656E7400006172645F7463705F09 +:108CD00064657374726F7900636C6F73655F636F43 +:108CE0006E6E000073656E6455647044617461005B +:108CF000696E736572744E6577436C69656E744313 +:108D00006F6E6E0061636B5F726563766564000011 +:108D10007463705F636F6E6E6563745F636200009F +:108D200073656E645463704461746100636C6F7347 +:108D3000655F636F6E6E5F7063620000636C656198 +:108D40006E536F636B53746174655F636200000000 +:108D50007463705F646174615F73656E74000000BA +:108D600061636B416E6446726565446174610000C5 +:108D7000676574417661696C5463704461746142E3 +:108D80007974650066726565744461746100000001 +:108D9000676574546370446174614279746500005E +:108DA00063616C634D657267654C656E0000000021 +:108DB000696E73657274427566000000697341766E +:108DC00061696C5463704461746142797465000038 +:108DD00066726565744461746149647800000000DE +:108DE0005B25735D202570205B25642C25645D0A5E +:108DF00000000000686561644275663D256420746A +:108E000061696C4275663D25640A000025645D2039 +:108E10007063623A2570204275663A202570204CB6 +:108E2000656E3A25640A00005B25735D20205B2592 +:108E3000645D3A206C656E3A2564206964783A2551 +:108E40006420746F743A25640A0000005B25735D2A +:108E500020417661696C61626C6564206461746153 +:108E60003A2025640A000000572D5B25735D2069B8 +:108E70006478427566206F7574206F662072616E2B +:108E800067653A2025640A005B25735D2025702004 +:108E90006964783A25640A00572D5B25735D20428A +:108EA0007566203D3D204E554C4C21005B25735D81 +:108EB0002041636B207063623A2570206C656E3AC6 +:108EC000256420736F636B3A256420646174613A92 +:108ED00025700A005B25735D206765743A25642060 +:108EE00025702025640A00005B25735D206368659A +:108EF000636B3A25642025642025700A0000000079 +:108F00005B25735D2046726565202570206F74684F +:108F1000657220627566202564207461696C3A254B +:108F20006420686561643A25640A0000572D5B255A +:108F3000735D204F76657277726974696E6720621F +:108F40007566666572202570206964783A2564210B +:108F50000A000000572D5B25735D20706275665F07 +:108F6000636F70795F7061727469616C20666169AA +:108F70006C65643A207372633A25702C20647374B4 +:108F80003A25702C206C656E3A25640A00000000BA +:108F9000572D5B25735D2041766F696420746F20C7 +:108FA0004F76657277726974652064617461205BC5 +:108FB00025642D25645D210A000000005B25735D9A +:108FC00020496E736572745B25645D3A2025703AA2 +:108FD00025642D2564205B25642C25645D0A000032 +:108FE000572D5B25735D20536F636B206F75742065 +:108FF0006F662072616E67653A20736F636B3D2503 +:1090000064000000696E736572745F70427566007B +:109010006765745F70427566000000000000E10043 +:1090200008040000000000000F01110110011301ED +:109030000E01110110010F0106000500636D645F50 +:109040007365745F69700000636D645F736574704D +:1090500061737300636D645F7374617274436C69F0 +:1090600000000000466F756E6420486F73743A20EC +:109070006E616D653D25732069703D307825780AF5 +:109080000000000075736167653A206474203C310C +:109090007C303E0A0000000075736167653A2073FA +:1090A000656E64556470205B736F636B5D0A097352 +:1090B0006F636B3A20736F636B6574204E756D62DE +:1090C00065720A00536F636B65743A2025640A0069 +:1090D0005061747465726E547970653A2025640A23 +:1090E0000000000050726F766100000031323334AE +:1090F000353637383930000046696E65546573740B +:10910000000000006F6666004465627567204F4688 +:10911000460A00007072696E740000004465627552 +:10912000672009656E61626C65643A203078257845 +:109130000A000000566572626F736520656E616299 +:109140006C65643A20307825780A000044756D70AB +:109150002009656E61626C65643A20307825780A72 +:1091600000000000504F6F6C6C2009656E61626CEE +:1091700065643A20307825780A00000044656275FD +:1091800067204F4E0A00000075736167653A2064DE +:1091900065627567203C73656374696F6E3E203C41 +:1091A0006C6576656C3E0A0973656374696F6E3A27 +:1091B00020696E69742C20636D2C207370692C20DB +:1091C000746370202C207574696C2C207761726E2A +:1091D0000A096C6576656C20203A203020286F667D +:1091E00066292C203120286F6E292C2032202876E9 +:1091F0006572626F7365290A096F723A206465624D +:109200007567207072696E742F6F6E2F6F66660AB5 +:1092100000000000696E697400000000737069004E +:1092200074637000636D00007574696C0000000069 +:109230007761726E00000000616C6C0044756D70A7 +:1092400020416C6C20427566666572730A000000EE +:1092500075736167653A2064756D7050627566203C +:109260005B736F636B5D0A09736F636B3A20736F97 +:10927000636B6574204E756D6265720A00000000B4 +:109280006E6F6E650000000044656C6574696E6702 +:1092900020574550206B6579730A0000757361672C +:1092A000653A207365746B6579203C6B65795F69FD +:1092B00064782028302D33293E203C6B6579206965 +:1092C0006E206865783E0A09206F723A20736574D3 +:1092D0006B6579206E6F6E650A000000205745505F +:1092E000206B6579206D75737420626520313020A4 +:1092F000285745502D343029206F722032362028CF +:109300005745502D31303429206469676974730AD8 +:1093100000000000776C5F61706920766572736988 +:109320006F6E2076322E372E300A00006661696C2F +:10933000656420746F20676574206D6163206164CB +:1093400064726573730A0000687720616464723A1E +:109350002025730A000000006C696E6B2073746135 +:109360007475733A20000000697020616464723A79 +:10937000202573202D2000006E65746D61736B3A9B +:10938000202573202D200000676174657761793A8C +:109390002025730A00000000697020696E746572F0 +:1093A0006661636520697320646F776E0A00000050 +:1093B00064686370203A2000656E61626C65640ABF +:1093C0000000000064697361626C65640A0000005B +:1093D000444E533A202573202D2000007573616799 +:1093E000653A207374617274436C69203C697061E2 +:1093F0006464723E203C706F72743E203C736F63F5 +:109400006B3E203C7463702830292F7564702831BE +:10941000293E0A00537461727420636C69656E742E +:10942000206F6E206164647220307825782C207063 +:109430006F727420256420736F636B202564206D28 +:109440006F64652025640A00572D5B25735D2053EA +:109450007461727420636C69656E74206F6E207025 +:109460006F727420256420736F636B2025642070F5 +:10947000726F74202564206D6F646520256420461A +:1094800041494C45440A000075736167653A207391 +:1094900074617274537276203C706F72743E203C1B +:1094A000736F636B3E203C7463702830292F7564A2 +:1094B000702831293E0A00005374617274202573AC +:1094C00020736572766572206F6E20706F727420E3 +:1094D000256420736F636B2025640A00572D5B257C +:1094E000735D2053746172742025732073657276E6 +:1094F0006572206F6E20706F727420256420736F08 +:10950000636B202564204641494C45440A00000015 +:1095100075736167653A20736574646E73205B319F +:109520002D325D206161612E6262622E6363632E63 +:109530006464640A0000000053657420444E5320A4 +:1095400073657276657220256420746F2025730A16 +:10955000000000003D3D3E20444E53313A2025732B +:109560000A0000003D3D3E20444E53323A20257310 +:109570000A00000075736167653A20676574486F7B +:109580007374203C686F73746E616D653E0A0000F1 +:1095900075736167653A207770617373203C7373EC +:1095A00069643E203C706173737068726173653EDC +:1095B0000A0000002573203A204661696C6564202A +:1095C000746F20616464207061737370687261737A +:1095D000650A000075736167653A20647061737392 +:1095E000203C737369643E0A000000002573203A32 +:1095F000204661696C656420746F2064656C6574D5 +:109600006520706173737068726173650A00000091 +:1096100075736167653A206970636F6E666967206C +:109620003C69703E203C6E65746D61736B3E203CFE +:10963000676174657761792D69703E0A00000000EA +:1096400020206F72203A206970636F6E6669672010 +:109650006E6F6E652028746F20656E61626C652088 +:1096600044484350290A00005B25735D206E6966FB +:109670003A2570206C7769705F616464723D307860 +:1096800025780A0075736167653A20636F6E6E65B1 +:109690006374203C737369643E0A0000636D645F09 +:1096A000737461727453727600000000636D645FBE +:1096B00064656C70617373004D494D4C4644000005 +:1096C0000A24200024200000617661696C61626CCC +:1096D0006520636F6D6D616E64733A0A000000006F +:1096E000202025730A000000636F756C64206E6F84 +:1096F0007420616C6C6F63617465206669726D774C +:10970000617265206275666665720A00547565202F +:109710004D61722032362032323A30393A353420B7 +:109720003230313300000000776C5F696E69745F1E +:10973000636F6D706C6574655F6362006661696C10 +:10974000656420746F20696E697420776C20636F84 +:109750006E6E206D67720000572D5B25735D205380 +:109760007069206E6F7420696E697469616C697AC2 +:1097700065640A006C696E6B20646F776E2C2072D2 +:10978000656C6561736520646863700A00000000A1 +:109790006C696E6B20646F776E0A00006C696E6B8B +:1097A0002075702C20636F6E6E6563746564207421 +:1097B0006F20222573220A007265717565737469C2 +:1097C0006E672064686370202E2E2E20000000003B +:1097D0004641494C45440A00626F756E6420746FBF +:1097E0002025730A00000000572D5B25735D20497A +:1097F0006E74657266616365206E6F74207570218A +:109800000A0000007363616E00000000636F6E6EFB +:10981000656374007365746B6579000073746174BB +:1098200075730000646562756700000064756D7093 +:10983000427566006970636F6E66696700000000BC +:10984000747463700000000077706173730000002F +:109850006470617373000000676574486F7374000F +:10986000736574444E53000073746172745372765E +:10987000000000007374617274436C6900000000A2 +:1098800073656E645564700041726475696E6F2013 +:109890005769666920537461727475702E2E2E207C +:1098A0005B25735D0A0000006F7574206F66206D84 +:1098B000656D6F72790000006661696C6564207483 +:1098C0006F207072657061726520666F72206669C4 +:1098D000726D7761726520646F776E6C6F61640A78 +:1098E00000000000436F756C64206E6F7420646527 +:1098F0007465637420776C206465766963652C20D9 +:1099000061626F7274696E670A000000496E766169 +:109910006C6964206669726D776172652064617438 +:10992000612C2061626F7274696E670A000000002A +:109930004661696C656420746F2073746172742071 +:10994000776C20696E697469616C697A6174696F9A +:109950006E0A0000312E312E3000000069705F73F6 +:1099600074617475735F63620000000002000000A0 +:1099700000B71B000800000100010000286E756C94 +:109980006C290000253032782D253032782D253095 +:1099900032782D253032782D253032782D25303211 +:1099A00078000000256C752E256C752E256C752EA3 +:1099B000256C75007373696420746F6F206C6F6E13 +:1099C0006720286D6178202564290A00257320000E +:1099D00022257322000000002052535349202564A1 +:1099E0002064426D200000002041642D486F6320F8 +:1099F00000000000202857455020656E6372797082 +:109A000074696F6E290000002028544B495020656E +:109A10006E6372797074696F6E2900002028434369 +:109A20004D5020656E6372797074696F6E29000005 +:109A3000202020002530325820000000256300003F +:109A40006E6F206E65747320666F756E640A000019 +:109A5000496E76616C6964206C656E6774680A0093 +:109A600025642E25642E25642E256400544B495010 +:109A70000000000043434D500000000057455000D7 +:109A8000776C5F636D5F696E6974000073656C6508 +:109A900063745F6E65740000776C5F636F6E6E5FFA +:109AA0006C6F73745F636200776C5F7363616E5F8A +:109AB000636F6D706C6574655F636200776C5F6582 +:109AC00076656E745F636200776C5F6D6564696173 +:109AD0005F636F6E6E65637465645F636200000050 +:109AE0005B25735D20434D3A206F7574206F6620AF +:109AF0006D656D6F72790A005B25735D20434D3A89 +:109B000020636F756C64206E6F7420726567697373 +:109B1000746572206576656E742063620A000000C9 +:109B20005B25735D20434D3A20696E697469616CF1 +:109B3000697A65640A0000005B25735D20434D3A35 +:109B400020636F6E6E656374656420746F20257387 +:109B50000A0000005B25735D20434D3A20636F6E61 +:109B60006E656374206661696C65642C2073636143 +:109B70006E6E696E670A00005B25735D20434D3A87 +:109B800020636F756C64206E6F74207374617274DF +:109B9000207363616E20616674657220636F6E6E00 +:109BA000656374206661696C210A00005B25735D42 +:109BB00020434D3A20646973636F6E6E656374650C +:109BC000640A00005B25735D20434D3A20636F6E8D +:109BD0006E656374696F6E206C6F73742C20736391 +:109BE000616E6E696E670A005B25735D20434D3AB6 +:109BF00020636F756C64206E6F742073746172746F +:109C0000207363616E20616674657220636F6E6E8F +:109C1000656374206C6F7374210A00005B25735DAB +:109C200020434D3A207363616E20636F6D706C65E5 +:109C30007465640A00000000FFFFFFFFFFFF0000E3 +:109C40005B25735D20434D3A20526F616D696E67ED +:109C50002066726F6D207273736920256420746FA3 +:109C60002025640A000000005B25735D20434D3A07 +:109C7000204E6F2063616E64696461746520666F55 +:109C8000756E6420666F7220737369642022257379 +:109C9000220A00005B25735D20434D3A206661690E +:109CA0006C656420746F20636F6E6E6563740A0068 +:109CB0005B25735D20434D3A206661696C656420C5 +:109CC000746F207363616E0A000000005B25735D92 +:109CD00020434D3A20756E68616E646C6564206542 +:109CE00076656E740A000000776C5F636F6E6E5F5E +:109CF0006661696C7572655F636200000000000157 +:109D0000000018500000000B00001854000000096B +:109D1000000018800000000F000018A400000001DF +:109D2000000018E000000001000018E4000000013D +:109D300000001810000000010000181400000001CD +:109D400000001818000000010000181C00000001AD +:109D5000000018200000000100001824000000018D +:109D600000001828000000010000182C000000036B +:109D700000001830000000010000183C0000000145 +:109D8000000018400000000100001844000000011D +:109D900000001848000000010000184C4173736572 +:109DA0007274696F6E2022257322206661696C656A +:109DB00064206174206C696E6520256420696E20C2 +:109DC00025730A002E2E2F7372632F534F4654575C +:109DD0004152455F4652414D45574F524B2F5345D7 +:109DE0005256494345532F4C5749502F6C77697051 +:109DF0002D312E332E322F7372632F636F72652FC6 +:109E0000646863702E630000646863705F6F7074D1 +:109E1000696F6E3A20646863702D3E6F7074696F6D +:109E20006E735F6F75745F6C656E202B2032202B14 +:109E3000206F7074696F6E5F6C656E203C3D2044CE +:109E40004843505F4F5054494F4E535F4C454E006E +:109E5000646863705F6F7074696F6E5F6279746558 +:109E60003A20646863702D3E6F7074696F6E735F23 +:109E70006F75745F6C656E203C20444843505F4FA3 +:109E80005054494F4E535F4C454E00006468637018 +:109E90005F6F7074696F6E5F747261696C65723A3E +:109EA000206468637020213D204E554C4C0000001A +:109EB000646863705F6F7074696F6E5F74726169FC +:109EC0006C65723A20646863702D3E6D73675F6FD6 +:109ED000757420213D204E554C4C0A006468637017 +:109EE0005F6F7074696F6E5F747261696C65723AEE +:109EF00020646863702D3E6F7074696F6E735F6F5E +:109F000075745F6C656E203C20444843505F4F5031 +:109F100054494F4E535F4C454E0A000064686370CD +:109F20005F6F7074696F6E5F73686F72743A2064EC +:109F30006863702D3E6F7074696F6E735F6F7574B8 +:109F40005F6C656E202B2032203C3D2044484350FE +:109F50005F4F5054494F4E535F4C454E0000000038 +:109F6000646863705F6F7074696F6E5F6C6F6E674B +:109F70003A20646863702D3E6F7074696F6E735F12 +:109F80006F75745F6C656E202B2034203C3D20443F +:109F90004843505F4F5054494F4E535F4C454E001D +:109FA0007265706C79207761736E277420667265B4 +:109FB00065640000646863705F6372656174655F07 +:109FC000726571756573743A206E657469662021D7 +:109FD0003D204E554C4C0000646863705F637265B1 +:109FE0006174655F726571756573743A2064686346 +:109FF0007020213D204E554C4C0000006468637079 +:10A000005F6372656174655F726571756573743ADB +:10A0100020646863702D3E705F6F7574203D3D2035 +:10A020004E554C4C00000000646863705F637265BD +:10A030006174655F726571756573743A20646863F5 +:10A04000702D3E6D73675F6F7574203D3D204E55DA +:10A050004C4C0000646863705F6372656174655F97 +:10A06000726571756573743A20636865636B2074FB +:10A07000686174206669727374207062756620630B +:10A08000616E20686F6C64207374727563742064F1 +:10A090006863705F6D736700646863705F64656CAC +:10A0A0006574655F726571756573743A206E657469 +:10A0B000696620213D204E554C4C00006468637059 +:10A0C0005F64656C6574655F726571756573743A1C +:10A0D000206468637020213D204E554C4C000000E8 +:10A0E000646863705F64656C6574655F72657175E3 +:10A0F0006573743A20646863702D3E705F6F757489 +:10A1000020213D204E554C4C0000000064686370D7 +:10A110005F64656C6574655F726571756573743ACB +:10A1200020646863702D3E6D73675F6F75742021C6 +:10A130003D204E554C4C00006E6574696620213DF3 +:10A14000204E554C4C0000007062756620705F6FA9 +:10A150007574207761736E2774206672656564007C +:10A16000646863705F62696E643A206E65746966E4 +:10A1700020213D204E554C4C000000006468637067 +:10A180005F62696E643A206468637020213D204EEE +:10A19000554C4C00726574203D3D2073697A656FA3 +:10A1A000662873747275637420646863705F6D737E +:10A1B0006729202D20444843505F4F5054494F4E4B +:10A1C000535F4C454E000000726574203D3D206495 +:10A1D0006863702D3E6F7074696F6E735F696E5F38 +:10A1E0006C656E002E2E2F7372632F534F4654579B +:10A1F0004152455F4652414D45574F524B2F5345B3 +:10A200005256494345532F4C5749502F6C7769702C +:10A210002D312E332E322F7372632F636F72652FA1 +:10A22000646E732E63000000646E73207365727633 +:10A230006572206F7574206F66206172726179009B +:10A24000646E732073657276657220686173206E28 +:10A250006F20495020616464726573732073657464 +:10A260000000000070627566206D75737420626571 +:10A2700020696E206F6E652070696563650000005F +:10A28000617272617920696E646578206F757420DF +:10A290006F6620626F756E6473000000756E6B6E82 +:10A2A0006F776E20646E735F7461626C6520656E9B +:10A2B0007472792073746174653A00006C6F636125 +:10A2C0006C686F73740000003230382E36372E32CF +:10A2D00032322E3232320000000400040004000248 +:10A2E000002000050002001E002000002E2E2F730B +:10A2F00072632F534F4654574152455F4652414D6A +:10A3000045574F524B2F53455256494345532F4CB7 +:10A310005749502F6C7769702D312E332E322F73A1 +:10A3200072632F636F72652F6D656D702E63000011 +:10A330006D656D705F667265653A206D656D207044 +:10A34000726F7065726C7920616C69676E6564000C +:10A350006D656D705F6D616C6C6F633A20747970C0 +:10A3600065203C204D454D505F4D41580000000098 +:10A370006D656D705F6D616C6C6F633A206D656DBE +:10A38000702070726F7065726C7920616C69676E95 +:10A3900065640000001C002000B0002400140020B0 +:10A3A00000080010025400002E2E2F7372632F53EA +:10A3B0004F4654574152455F4652414D45574F52C3 +:10A3C0004B2F53455256494345532F4C5749502F15 +:10A3D0006C7769702D312E332E322F7372632F6399 +:10A3E0006F72652F6E657469662E6300626F6775A4 +:10A3F0007320706275663A206C656E20213D207472 +:10A400006F745F6C656E20627574206E6578742061 +:10A410003D3D204E554C4C210000000073686F7587 +:10A420006C64206E6F74206265206E756C6C207396 +:10A43000696E636520666972737420213D206C61CA +:10A4400073742100696620666972737420213D204F +:10A450004E554C4C2C206C617374206D75737420B8 +:10A46000616C736F20626520213D204E554C4C007D +:10A470002E2E2F7372632F534F4654574152455F10 +:10A480004652414D45574F524B2F53455256494323 +:10A4900045532F4C5749502F6C7769702D312E330F +:10A4A0002E322F7372632F636F72652F7062756621 +:10A4B0002E630000286820213D204E554C4C292059 +:10A4C000262620287420213D204E554C4C2920283A +:10A4D00070726F6772616D6D65722076696F6C6105 +:10A4E000746573204150492900000000702D3E74AE +:10A4F0006F745F6C656E203D3D20702D3E6C656E07 +:10A5000020286F66206C6173742070627566206904 +:10A510006E20636861696E2900000000696E6372D5 +:10A52000656D656E745F6D61676E697475646520D5 +:10A530003C3D20702D3E6C656E0000006261642021 +:10A5400070627566207479706500000070627566CF +:10A550005F74616B653A20696E76616C6964206234 +:10A5600075660000706275665F74616B653A20699C +:10A570006E76616C6964206461746170747200004D +:10A58000706275665F74616B653A20696E76616CA6 +:10A590006964207062756600646964206E6F74205F +:10A5A000636F707920616C6C2064617461000000DD +:10A5B000706275665F636F70795F706172746961F4 +:10A5C0006C3A20696E76616C696420627566000081 +:10A5D000706275665F636F70795F706172746961D4 +:10A5E0006C3A20696E76616C696420646174617094 +:10A5F00074720000706275665F636F70793A2074E0 +:10A600006172676574206E6F742062696720656E81 +:10A610006F75676820746F20686F6C6420736F7546 +:10A6200072636500705F746F20213D204E554C4C65 +:10A63000000000006F66667365745F746F203C3DB8 +:10A6400020705F746F2D3E6C656E00006F666673E0 +:10A6500065745F66726F6D203C3D20705F66726F3F +:10A660006D2D3E6C656E0000706275665F636F7085 +:10A6700079282920646F6573206E6F7420616C6C7B +:10A680006F77207061636B65742071756575657394 +:10A69000210A0000706275665F667265653A207314 +:10A6A000616E6520747970650000000070627566E7 +:10A6B0005F667265653A20702D3E726566203E20A9 +:10A6C00030000000702D3E746F745F6C656E203D2D +:10A6D0003D20702D3E6C656E202B20712D3E746FD9 +:10A6E000745F6C656E000000702D3E746F745F6C5B +:10A6F000656E203D3D20702D3E6C656E00000000B3 +:10A70000706275665F7265616C6C6F633A20702071 +:10A71000213D204E554C4C00706275665F7265613C +:10A720006C6C6F633A2073616E6520702D3E747996 +:10A730007065000067726F77203C206D61785F75EF +:10A7400031365F7400000000706275665F7265618B +:10A750006C6C6F633A207120213D204E554C4C00AB +:10A76000706275665F616C6C6F633A206261642031 +:10A7700070627566206C617965720000636865635C +:10A780006B20702D3E7061796C6F6164202B20709E +:10A790002D3E6C656E20646F6573206E6F74206F44 +:10A7A000766572666C6F77207062756600000000D7 +:10A7B000504255465F504F4F4C5F42554653495AA1 +:10A7C00045206D75737420626520626967676572E4 +:10A7D000207468616E204D454D5F414C49474E4D98 +:10A7E000454E540072656D5F6C656E203C206D6156 +:10A7F000785F7531365F7400706275665F616C6C8E +:10A800006F633A207062756620712D3E7061796CBD +:10A810006F61642070726F7065726C7920616C6911 +:10A82000676E656400000000706275665F616C6C45 +:10A830006F633A206572726F6E656F7573207479FD +:10A8400070650000706275665F636F707920666185 +:10A85000696C656400000000010203040506070737 +:10A8600007070707070000002E2E2F7372632F5370 +:10A870004F4654574152455F4652414D45574F52FE +:10A880004B2F53455256494345532F4C5749502F50 +:10A890006C7769702D312E332E322F7372632F63D4 +:10A8A0006F72652F7463702E630000007463705FB5 +:10A8B000706362735F73616E653A20616374697679 +:10A8C00065207063622D3E737461746520213D20A4 +:10A8D000434C4F53454400007463705F7063627370 +:10A8E0005F73616E653A2061637469766520706399 +:10A8F000622D3E737461746520213D204C49535490 +:10A90000454E00007463705F706362735F73616EC5 +:10A91000653A20616374697665207063622D3E73C9 +:10A920007461746520213D2054494D452D5741499E +:10A93000540000007463705F706362735F73616ED4 +:10A94000653A207477207063622D3E73746174657C +:10A95000203D3D2054494D452D57414954000000AC +:10A960007463705F62696E643A2063616E206F6E1B +:10A970006C792062696E6420696E207374617465FD +:10A9800020434C4F534544007463705F7265637697 +:10A9900065643A206C656E20776F756C6420777201 +:10A9A0006170207263765F776E640A00756E7365FE +:10A9B0006E74207365676D656E7473206C65616B72 +:10A9C000696E6700756E61636B6564207365676DA2 +:10A9D000656E7473206C65616B696E6700000000C2 +:10A9E0006F6F736571207365676D656E7473206C2E +:10A9F00065616B696E6700007463705F7063625FAE +:10AA000072656D6F76653A207463705F7063627310 +:10AA10005F73616E652829007463705F6C6973747D +:10AA2000656E3A2070636220616C726561647920A2 +:10AA3000636F6E6E65637465640000007463705FBD +:10AA4000736C6F77746D723A2061637469766520F8 +:10AA50007063622D3E737461746520213D20434C08 +:10AA60004F5345440A0000007463705F736C6F7746 +:10AA7000746D723A20616374697665207063622D2B +:10AA80003E737461746520213D204C495354454EFA +:10AA90000A0000007463705F736C6F77746D723AB4 +:10AAA00020616374697665207063622D3E73746102 +:10AAB000746520213D2054494D452D574149540A84 +:10AAC000000000007463705F736C6F77746D723A8E +:10AAD000206D6964646C652074637020213D20746E +:10AAE00063705F6163746976655F706362730000B1 +:10AAF0007463705F736C6F77746D723A20666972FD +:10AB0000737420706362203D3D207463705F6163E5 +:10AB1000746976655F706362730000007463705FD0 +:10AB2000736C6F77746D723A2054494D452D5741BF +:10AB30004954207063622D3E7374617465203D3DFD +:10AB40002054494D452D5741495400007463705FAE +:10AB5000736C6F77746D723A206D6964646C6520F4 +:10AB600074637020213D207463705F74775F70633D +:10AB7000627300007463705F736C6F77746D723A08 +:10AB800020666972737420706362203D3D20746397 +:10AB9000705F74775F706362730000007463705F4E +:10ABA000636F6E6E6563743A2063616E206F6E6CC6 +:10ABB0007920636F6E6E65637465642066726F6D75 +:10ABC00020737461746520434C4F5345440000006A +:10ABD00053594E5F53454E540000000053594E5F89 +:10ABE000524356440000000045535441424C4953DF +:10ABF0004845440046494E5F574149545F31000083 +:10AC000046494E5F574149545F320000434C4F5311 +:10AC1000455F574149540000434C4F53494E47004C +:10AC20004C4153545F41434B0000000054494D4593 +:10AC30005F5741495400000003060C18306078004B +:10AC40008000FAFC8000FC6C8000FD4E8000FDB4AA +:10AC50008000FE368000FD4E8000FE788000FEF809 +:10AC60002E2E2F7372632F534F4654574152455F18 +:10AC70004652414D45574F524B2F5345525649432B +:10AC800045532F4C5749502F6C7769702D312E3317 +:10AC90002E322F7372632F636F72652F7463705F30 +:10ACA000696E2E63000000007063622D3E736E6457 +:10ACB0005F71756575656C656E203E3D20706275CF +:10ACC000665F636C656E286E6578742D3E70290032 +:10ACD0007463705F726563656976653A2076616C4E +:10ACE0006964207175657565206C656E67746800B0 +:10ACF000696E7365672E7020213D204E554C4C00C7 +:10AD0000696E73616E65206F6666736574210000FD +:10AD10007062756620746F6F2073686F72742100A3 +:10AD2000706275665F686561646572206661696CF2 +:10AD3000656400007463705F726563656976653A87 +:10AD4000207365676D656E74206E6F742074726910 +:10AD50006D6D656420636F72726563746C792074C5 +:10AD60006F207263765F776E640A00007463705FB1 +:10AD7000726563656976653A207365676D656E74A3 +:10AD8000206E6F74207472696D6D656420636F72DC +:10AD9000726563746C7920746F206F6F73657120B6 +:10ADA00071756575650A00007463705F726563652F +:10ADB0006976653A207463706C656E203E2072631C +:10ADC000765F776E640A00007463705F7265636516 +:10ADD0006976653A206F6F736571207463706C6576 +:10ADE0006E203E207263765F776E640A000000007A +:10ADF0007463705F696E7075743A2061637469760C +:10AE000065207063622D3E737461746520213D205E +:10AE1000434C4F53454400007463705F696E707516 +:10AE2000743A20616374697665207063622D3E73A5 +:10AE30007461746520213D2054494D452D57414989 +:10AE4000540000007463705F696E7075743A20611D +:10AE50006374697665207063622D3E7374617465F6 +:10AE600020213D204C495354454E00007463705FCF +:10AE7000696E7075743A207063622D3E6E657874E9 +:10AE800020213D2070636220286265666F72652014 +:10AE900063616368652900007463705F696E707533 +:10AEA000743A207063622D3E6E65787420213D20D7 +:10AEB00070636220286166746572206361636865EF +:10AEC000290000007463705F696E7075743A2054D5 +:10AED000494D452D57414954207063622D3E73748E +:10AEE000617465203D3D2054494D452D57414954DD +:10AEF000000000007463705F696E7075743A2070B2 +:10AF000063622D3E737461746520213D20434C4F74 +:10AF1000534544007063622D3E736E645F717565C6 +:10AF200075656C656E203E20300000007063622DF8 +:10AF30003E61636365707420213D204E554C4C008A +:10AF40007463705F696E7075743A207463705F70BB +:10AF50006362735F73616E65282900002E2E2F7364 +:10AF600072632F534F4654574152455F4652414DED +:10AF700045574F524B2F53455256494345532F4C3B +:10AF80005749502F6C7769702D312E332E322F7325 +:10AF900072632F636F72652F7463705F6F75742EA9 +:10AFA00063000000636865636B20746861742066E9 +:10AFB0006972737420706275662063616E20686FB9 +:10AFC0006C6420737472756374207463705F68645A +:10AFD000720000007463705F656E71756575653A27 +:10AFE000207061636B6574206E65656473207061A9 +:10AFF000796C6F61642C206F7074696F6E732C2094 +:10B000006F722053594E2F46494E202870726F6739 +:10B0100072616D6D65722076696F6C617465732005 +:10B0200041504929000000007463705F656E7175BE +:10B030006575653A206C656E20213D2030207C7C52 +:10B0400020617267203D3D204E554C4C2028707287 +:10B050006F6772616D6D65722076696F6C61746582 +:10B0600073204150492900007463705F656E7175EB +:10B070006575653A207062756673206F6E20717514 +:10B08000657565203D3E206174206C656173742098 +:10B090006F6E65207175657565206E6F6E2D656DBF +:10B0A000707479007463705F656E71756575653A6B +:10B0B000206E6F207062756673206F6E20717565EB +:10B0C0007565203D3E20626F7468207175657565F9 +:10B0D0007320656D707479007573656720213D205C +:10B0E0004E554C4C00000000636865636B2074682B +:10B0F0006174206669727374207062756620636182 +:10B100006E20686F6C642074686520636F6D706C6E +:10B11000657465207365676C656E000070627566A6 +:10B120005F686561646572206661696C65640A00C8 +:10B1300046494E20656E71756575656420746F674C +:10B140006574686572207769746820646174610051 +:10B150007A65726F2D6C656E6774682070627566B3 +:10B16000000000007463705F656E71756575653A07 +:10B170002076616C6964207175657565206C656EFB +:10B1800067746800525354206E6F74206578706540 +:10B190006374656420686572652100002E2E2F732C +:10B1A00072632F534F4654574152455F4652414DAB +:10B1B00045574F524B2F53455256494345532F4CF9 +:10B1C0005749502F6C7769702D312E332E322F73E3 +:10B1D00072632F636F72652F7564702E63000000B9 +:10B1E000726562696E64203D3D203000636865636E +:10B1F0006B20746861742066697273742070627564 +:10B20000662063616E20686F6C642073747275636E +:10B2100074207564705F686472000000702D3E7069 +:10B2200061796C6F6164203D3D20697068647200D3 +:10B230002E2E2F7372632F534F4654574152455F42 +:10B240004652414D45574F524B2F53455256494355 +:10B2500045532F4C5749502F6C7769702D312E3341 +:10B260002E322F7372632F636F72652F697076347D +:10B270002F69636D702E6300636865636B2074686B +:10B2800061742066697273742070627566206361F0 +:10B290006E20686F6C642069636D70206D657373D8 +:10B2A0006167650069636D705F696E7075743A20DF +:10B2B0006D6F76696E6720702D3E7061796C6F617D +:10B2C0006420746F2069702068656164657220660F +:10B2D00061696C65640A0000636865636B2074686B +:10B2E0006174206669727374207062756620636190 +:10B2F0006E20686F6C642073747275637420746858 +:10B30000652049434D502068656164657200000006 +:10B3100069636D705F696E7075743A20636F7079E0 +:10B32000696E6720746F206E657720706275662085 +:10B330006661696C65640A0069636D705F696E704F +:10B3400075743A20726573746F72696E67206F72DC +:10B350006967696E616C20702D3E7061796C6F61F8 +:10B3600064206661696C65640A00000043616E27B1 +:10B3700074206D6F7665206F7665722068656164F4 +:10B38000657220696E207061636B65740000000057 +:10B390002E2E2F7372632F534F4654574152455FE1 +:10B3A0004652414D45574F524B2F534552564943F4 +:10B3B00045532F4C5749502F6C7769702D312E33E0 +:10B3C0002E322F7372632F636F72652F697076341C +:10B3D0002F69702E63000000636865636B207468DA +:10B3E000617420666972737420706275662063618F +:10B3F0006E20686F6C64207374727563742069705A +:10B400005F68647200FFFFFFFF00000000000000A3 +:10B410002E2E2F7372632F534F4654574152455F60 +:10B420004652414D45574F524B2F53455256494373 +:10B4300045532F4C5749502F6C7769702D312E335F +:10B440002E322F7372632F636F72652F697076349B +:10B450002F69705F667261672E630000746869739C +:10B46000206E656564732061207062756620696E68 +:10B47000206F6E65207069656365210073616E6978 +:10B48000747920636865636B206C696E6B656420FA +:10B490006C697374000000007072657620213D2095 +:10B4A00069707200707265762D3E6E657874203D0D +:10B4B0003D2069707200000069705F72656173738E +:10B4C0005F70627566636F756E74203E3D20636CBD +:10B4D000656E0000636865636B20667261676D6509 +:10B4E0006E747320646F6E2774206F7665726C6162 +:10B4F000700000006E6F2070726576696F75732042 +:10B50000667261676D656E742C2074686973206D56 +:10B51000757374206265207468652066697273743F +:10B5200020667261676D656E7421000073616E69DB +:10B53000747920636865636B0000000076616C6954 +:10B54000646174655F646174616772616D3A6E65B0 +:10B5500078745F70627566213D4E554C4C0000005A +:10B5600076616C69646174655F646174616772615E +:10B570006D3A646174616772616D20656E64213D2E +:10B58000646174616772616D206C656E00FFFFFF1E +:10B59000FFFFFF002E2E2F7372632F534F46545719 +:10B5A0004152455F4652414D45574F524B2F5345EF +:10B5B0005256494345532F4C5749502F6C77697069 +:10B5C0002D312E332E322F7372632F6E65746966A0 +:10B5D0002F6574686172702E630000006E65746977 +:10B5E000662D3E6877616464725F6C656E206D7570 +:10B5F0007374206265207468652073616D652061D5 +:10B6000073204554484152505F4857414444525F6B +:10B610004C454E20666F722065746861727021001F +:10B620007120213D204E554C4C000000712D3E7084 +:10B6300020213D204E554C4C00000000722D3E70E4 +:10B6400020213D204E554C4C000000006172705F7F +:10B650007461626C655B695D2E71203D3D204E55C5 +:10B660004C4C000069203C204152505F5441424CF8 +:10B67000455F53495A4500006E657469662D3E6802 +:10B6800077616464725F6C656E203D3D204554486F +:10B690004152505F4857414444525F4C454E000070 +:10B6A000636865636B207468617420666972737483 +:10B6B00020706275662063616E20686F6C64207311 +:10B6C0007472756374206574686172705F68647207 +:10B6D000000000006172705F7461626C655B695D9F +:10B6E0002E7374617465203D3D2050454E44494E93 +:10B6F00047206F7220535441424C45006E6F2070BA +:10B7000061636B65742071756575657320616C6C20 +:10B710006F77656421000000000000002E2E2F735B +:10B7200072632F534F4654574152455F4652414D25 +:10B7300045574F524B2F53455256494345532F4C73 +:10B740005749502F6C7769702D706F72742D312EA0 +:10B75000332E322F48442F69662F6E657469662F29 +:10B76000776C69662E6300000A09000052580000D9 +:10B7700054580000FFFFFF740000000001FFFFFFAE +:10B780000000FFFFFFFFFF400000000001FFFFFF80 +:10B7900041505000484D4700312E352E312E370094 +:10B7A000312E352E312E3100312E352E312E3400F2 +:10B7B00080017C7C80017C7480017C7C80017C6ABF +:10B7C00080017DCA80017D7880017D2A80017CD83E +:10B7D00080017C86800185D2800185CA800185CA6E +:10B7E000800185D2800185C2800185C2800185BA31 +:10B7F000800185BA02040B0C121618242C30424822 +:10B80000606C0000322E312E312E310078C40E00D3 +:10B81000352E332E31000000352E332E350000003A +:10B82000352E332E340000008001BF808001BF928E +:10B830008001BFA88001BF5A8001BF668001BFD4CC +:10B840008001BF5A8001BFE08001BF5A8001BF5A0A +:10B850008001BF5A8001BF5A8001BF5A8001BF5A80 +:10B860008001BF5A8001BF5A8001BF5A8001BF5A70 +:10B870008001BF5A8001BF5A8001BF5A8001BF5A60 +:10B880008001BF5A8001BF5A8001BF5A8001BF5A50 +:10B890008001BF5A8001BF5A8001BF5A8001BF5A40 +:10B8A0008001BF5A8001BF5A8001BF5A8001BF5A30 +:10B8B0008001BF5A8001BF5A8001BF5A8001BF5A20 +:10B8C0008001BF5A8001BF5A8001BF5A8001BF5A10 +:10B8D0008001BF5A8001BF5A8001BF5A8001BF5A00 +:10B8E0008001BF5A8001BF5A8001BF5A8001BF5AF0 +:10B8F0008001BF5A8001BF5A8001BF5A8001BF5AE0 +:10B900008001BF5A8001BF5A8001BF5A8001BF5ACF +:10B910008001BF5A8001BF5A8001BF5A8001BF5ABF +:10B920008001BF5A8001BF7C8001C0448001BF5AA2 +:10B930008001C0448001BF5A8001C17C8001BF5A90 +:10B940008001C1708001BF5A8001C1648001BF5A6B +:10B950008001BF5A8001BF5A8001BF5A8001C1AC2B +:10B960008001BF5A8001BF5A8001C1A08001BF5A27 +:10B970008001C1948001BF5A8001BF5A8001BF5A23 +:10B980008001BF5A8001BF5A8001BF5A8001BF5A4F +:10B990008001BF5A8001BF5A8001BF5A8001BF5A3F +:10B9A0008001BF5A8001BF5A8001BF5A8001BF5A2F +:10B9B0008001BF5A8001BF5A8001BF5A8001BF5A1F +:10B9C0008001BF5A8001BF5A8001BF5A8001BF5A0F +:10B9D0008001BF5A8001BF5A8001BF5A8001BF5AFF +:10B9E0008001BF5A8001BF5A8001BF5A8001BF5AEF +:10B9F0008001BF5A8001BF5A8001BF5A8001BF5ADF +:10BA00008001BF5A8001BF5A8001BF5A8001BF5ACE +:10BA10008001BF5A8001BF5A8001BF5A8001BF5ABE +:10BA20008001BF5A8001BF5A8001BF5A8001BF5AAE +:10BA30008001BF5A8001BF5A8001BF5A8001BF5A9E +:10BA40008001BF5A8001BF5A8001BF5A8001BF5A8E +:10BA50008001BF5A8001BF5A8001BF5A8001BF5A7E +:10BA60008001BF5A8001BF5A8001BF5A8001BF5A6E +:10BA70008001BF5A8001BF5A8001BF5A8001BF5A5E +:10BA80008001BF5A8001BF5A8001BF5A8001BF5A4E +:10BA90008001BF5A8001BF5A8001BF5A8001BF5A3E +:10BAA0008001BF5A8001BF5A8001BF5A8001BF5A2E +:10BAB0008001BF5A8001BF5A8001BF5A8001BF5A1E +:10BAC0008001BF5A8001BF5A8001BF5A8001BF5A0E +:10BAD0008001BF5A8001BF5A8001BF5A8001BF5AFE +:10BAE0008001BF5A8001BF5A8001BF5A8001BF5AEE +:10BAF0008001BF5A8001BF5A8001BF5A8001BF5ADE +:10BB00008001BF5A8001BF5A8001BF5A8001BF5ACD +:10BB10008001BF5A8001C02C8001C1588001C02C17 +:10BB20008001C02C8001C1888001BF5A8001C044BF +:10BB30008001BF5A8001C0508001BF5A8001C050AF +:10BB40008001BF5A8001C02C8001BF5A8001C02CE7 +:10BB50008001C0388001C0388001C0388001BF5AE0 +:10BB60008001C02C8001C02C8001C14C8001BF5AD3 +:10BB70008001BF5A8001C1408001BF5A8001BF5A75 +:10BB80008001BF5A8001BF5A8001BF5A8001BF5A4D +:10BB90008001BF5A8001BF5A8001BF5A8001BF5A3D +:10BBA0008001C1348001BF5A8001BF5A8001BF5A51 +:10BBB0008001BF5A8001BF5A8001BF5A8001BF5A1D +:10BBC0008001C1288001BF5A8001BF5A8001BF5A3D +:10BBD0008001BF5A8001BF5A8001BF5A8001BF5AFD +:10BBE0008001BF5A8001BF5A8001BF5A8001BF5AED +:10BBF0008001BF5A8001BF5A8001BF5A8001BF5ADD +:10BC00008001BF5A8001BF5A8001BF5A8001BF5ACC +:10BC10008001BF5A8001BF5A8001BF5A8001BF5ABC +:10BC20008001BF5A8001BF5A8001BF5A8001BF5AAC +:10BC30008001BF5A8001BF5A8001BF5A8001BF5A9C +:10BC40008001BF5A8001BF5A8001BF5A8001BF5A8C +:10BC50008001BF5A8001BF5A8001BF5A8001BF5A7C +:10BC60008001BF5A8001BF5A8001BF5A8001BF5A6C +:10BC70008001BF5A8001BF5A8001BF5A8001BF5A5C +:10BC80008001BF5A8001BF5A8001BF5A8001BF5A4C +:10BC90008001BF5A8001BF5A8001BF5A8001BF5A3C +:10BCA0008001BF5A8001BF5A8001BF5A8001BF5A2C +:10BCB0008001BF5A8001BF5A8001BF5A8001BF5A1C +:10BCC0008001BF5A8001BF5A8001BF5A8001BF5A0C +:10BCD0008001BF5A8001BF5A8001BF5A8001BF5AFC +:10BCE0008001BF5A8001BF5A8001BF5A8001BF5AEC +:10BCF0008001BF5A8001BF5A8001BF5A8001BF5ADC +:10BD00008001BF5A8001BF5A8001BF5A8001BF5ACB +:10BD10008001BF5A8001BF5A8001BF5A8001BF5ABB +:10BD20008001BF5A8001BF5A8001BF5A8001BF5AAB +:10BD30008001BF5A8001BF5A8001BF5A8001BF5A9B +:10BD40008001BF5A8001BF5A8001BF5A8001BF5A8B +:10BD50008001BF5A8001BF5A8001BF5A8001BF5A7B +:10BD60008001BF5A8001BF5A8001BF5A8001C11CA7 +:10BD70008001C1108001BF5A8001C1048001BF5AF7 +:10BD80008001BF5A8001BF5A8001C0F88001C0EC19 +:10BD90008001BF5A8001BF5A8001C0E08001BF5AB4 +:10BDA0008001BF5A8001C0D48001C0C88001C0BCDE +:10BDB0008001C0B08001C0A48001C0988001C08C07 +:10BDC0008001BF5A8001C0808001C0748001BF5AC9 +:10BDD0008001C0688001C05C8001C48E8001C47C89 +:10BDE0008001C46A8001C4588001C4468001C43403 +:10BDF0008001C3928001C3928001C4228001C410DB +:10BE00008001C3FE8001C3EC8001C3DA8001C3C896 +:10BE10008001C3B68001C3A48001C3A48001C4A073 +:10BE20008001C2D48001C2D48001C2D48001C5C0C7 +:10BE30008001C5AE8001C59C8001C2D48001C2D4FE +:10BE40008001C58A8001C2D48001C2D48001C57836 +:10BE50008001C5668001C5548001C5428001C5309E +:10BE60008001C51E8001C50C8001C4FA8001C4E8B0 +:10BE70008001C2D48001C4D68001C4C48001C2D470 +:10BE80008001C2D48001C2D48001C2D48001C2D456 +:10BE90008001C2D48001C2D48001C2D48001C2D446 +:10BEA0008001C2D48001C2D48001C2D48001C2D436 +:10BEB0008001C2D48001C2D48001C2D48001C2D426 +:10BEC0008001C2D48001C2D48001C2D48001C2D416 +:10BED0008001C2D48001C2D48001C2D48001C2D406 +:10BEE0008001C2D48001C2D48001C2D48001C2D4F6 +:10BEF0008001C2D48001C2D48001C2D48001C2D4E6 +:10BF00008001C2D48001C2D48001C2D48001C2D4D5 +:10BF10008001C2D48001C2D48001C2D48001C2D4C5 +:10BF20008001C2D48001C2D48001C2D48001C2D4B5 +:10BF30008001C2D48001C2D48001C2D48001C2D4A5 +:10BF40008001C2D48001C2D48001C2D48001C2D495 +:10BF50008001C2D48001C2D48001C2D48001C2D485 +:10BF60008001C2D48001C2D48001C2D48001C2D475 +:10BF70008001C2D48001C2D48001C2D48001C2D465 +:10BF80008001C2D48001C2D48001C2D48001C2D455 +:10BF90008001C2D48001C2D48001C2D48001C2D445 +:10BFA0008001C2D48001C2D48001C2D48001C2D435 +:10BFB0008001C2D48001C2D48001C2D48001C2D425 +:10BFC0008001C2D48001C2D48001C2D48001C2D415 +:10BFD0008001C2D48001C2D48001C2D48001C2D405 +:10BFE0008001C2D48001C2D48001C2D48001C2D4F5 +:10BFF0008001C2D48001C2D48001C2D48001C2D4E5 +:10C000008001C2D48001C2D48001C2D48001C2D4D4 +:10C010008001C4B28001EFCA8001EFCE8001EF7AC7 +:10C020008001EF7A8001EF828001EF8A8001EF9238 +:10C030008001EF9A8001EFA28001EFAA8001EFB2A8 +:10C040008001EFBA8001EFC28001EFD68001F96074 +:10C050008001F93E8001F9CC8001F8A68001F9BE8B +:10C060008001F91C8001F8A68001F8E28001F8A6A1 +:10C070008001F8A68001F8A68001F8A68001F8A644 +:10C080008001F8A68001F8A68001F8A68001F8A634 +:10C090008001F8A68001F8A68001F8A68001F8A624 +:10C0A0008001F8A68001F8A68001F8A68001F8A614 +:10C0B0008001F8A68001F8A68001F8A68001F8A604 +:10C0C0008001F8A68001F8A68001F8A68001F8A6F4 +:10C0D0008001F8A68001F8A68001F8A68001F8A6E4 +:10C0E0008001F8A68001F8A68001F8A68001F8A6D4 +:10C0F0008001F8A68001F8A68001F8A68001F8A6C4 +:10C100008001F8A68001F8A68001F8A68001F8A6B3 +:10C110008001F8A68001F8A68001F8A68001F8A6A3 +:10C120008001F8A68001F8A68001F8A68001F8A693 +:10C130008001F8A68001F8A68001F8A68001F8A683 +:10C140008001F8A68001F8A68001F8C08001FA58A5 +:10C150008001F8F08001F8F08001F90E8001F8F01C +:10C160008001F8F08001F8F08001F8F08001F8F02B +:10C170008001F8F08001F8F08001F8F08001F8F01B +:10C180008001F8F08001F90E8001F8F08001F8F0EC +:10C190008001F8F08001F8F08001F8F08001F8F0FB +:10C1A0008001F8F08001FA488001F8F08001F8F091 +:10C1B0008001F8F08001F8F08001F8F08001F8F0DB +:10C1C0008001F8F08001F8F08001F8F08001F8F0CB +:10C1D0008001F8F08001F8F08001F8F08001F8F0BB +:10C1E0008001F8F08001F8F08001F8F08001F8F0AB +:10C1F0008001F8F08001F8F08001F8F08001F8F09B +:10C200008001F8F08001F8F08001F8F08001F8F08A +:10C210008001F8F08001F8F08001F8F08001F8F07A +:10C220008001F8F08001F8F08001F8F08001F8F06A +:10C230008001F8F08001F8F08001F8F08001F8F05A +:10C240008001F8F08001F8F08001F8F08001F8F04A +:10C250008001F8F08001F8F08001F8F08001F8F03A +:10C260008001F8F08001F8F08001F8F08001F8F02A +:10C270008001F8F08001F8F08001F8F08001F8F01A +:10C280008001F8F08001F8F08001F8F08001F8F00A +:10C290008001F8F08001F8F08001F8F08001F8F0FA +:10C2A0008001F8F08001F8F08001F8F08001F8F0EA +:10C2B0008001F8F08001F8F08001F8F08001F8F0DA +:10C2C0008001F8F08001F8F08001F8F08001F8F0CA +:10C2D0008001F8F08001F8F08001F8F08001F8F0BA +:10C2E0008001F8F08001F8F08001F8F08001F8F0AA +:10C2F0008001F8F08001F8F08001F8F08001F8F09A +:10C300008001F8F08001F8F08001F8F08001F8F089 +:10C310008001F8F08001F8F08001F8F08001F8F079 +:10C320008001F8F08001F8F08001F8F08001F8F069 +:10C330008001F8F08001F8F08001F8F08001F8F059 +:10C340008001F8F08001F8F08001F8F08001F8F049 +:10C350008001F90E8001FA348001F8F08001F90EB5 +:10C360008001F8F08001F8F08001F8F08001F8F029 +:10C370008001F8F08001F8F08001F8F08001F90EFA +:10C380008001F8F08001F8F08001FA2C8001FA2495 +:10C390008001FA1C8001FA148001FA0C8001FA0471 +:10C3A0008001FA408001F8F08001FA5057455F495A +:10C3B0004E445F38303231315F434F4E4E45435427 +:10C3C0004544000057455F494E445F3830323131B3 +:10C3D0005F444953434F4E4E454354494E47000036 +:10C3E00057455F494E445F38303231315F494253DF +:10C3F000535F444953434F4E4E4543544544000018 +:10C40000332E312E322E312E34000000352E3233B1 +:10C4100000000000352E32322E320000352E32322E +:10C420002E310000352E322E39000000352E3138E5 +:10C430002E310000352E31382E320000352E3232AA +:10C440002E340000352E32342E320000352E323498 +:10C450002E310000352E31312E310000352E322E96 +:10C4600032000000352E31362E320000352E3136A6 +:10C470002E310000312E312E312E323200000000DC +:10C48000352E322E31392E3500000000352E322E59 +:10C4900031392E3400000000352E322E31392E3342 +:10C4A00000000000352E322E31392E3200000000FF +:10C4B000352E322E31392E3100000000352E322E2D +:10C4C00031000000352E31312E320000352E313151 +:10C4D0002E330000352E31312E340000352E31310F +:10C4E0002E350000352E31312E360000352E3131FB +:10C4F0002E380000352E31312E37000073736964F9 +:10C500000000000070736B004A756E6B41500000B4 +:10C5100057534300656170005746412D53696D7054 +:10C520006C65436F6E6669672D456E726F6C6C65E6 +:10C53000652D312D300000006964656E7469747971 +:10C54000000000006E7277696669000064656661CC +:10C55000756C740057455F494E445F383032313155 +:10C560005F444953434F4E4E4543544544000000F9 +:10C5700057455F494E445F50414952574953455FC3 +:10C580004D49435F4552524F5200000057455F49A5 +:10C590004E445F47524F55505F4D49435F4552529D +:10C5A0004F52000057455F494E445F43414E444956 +:10C5B000444154455F4C495354000000494E4143A7 +:10C5C0005449564500000000444953434F4E4E45E0 +:10C5D00043544544000000005343414E4E494E47EA +:10C5E000000000004153534F43494154494E470016 +:10C5F0004153534F43494154454400003457415936 +:10C600005F48414E445348414B45000047524F5507 +:10C61000505F48414E445348414B4500434F4D50B5 +:10C620004C45544544000000554E4B4E4F574E006C +:10C630004354524C2D4556454E542D5445524D4968 +:10C640004E4154494E47202D207369676E616C201E +:10C650002564207265636569766564007769726533 +:10C660006400000043616E63656C6C696E672061F5 +:10C67000757468656E7469636174696F6E2074693E +:10C680006D656F75740000005750413A2045415068 +:10C690004F4C2070726F63657373696E6720636FB0 +:10C6A0006D706C657465000043616E63656C6C69E8 +:10C6B0006E67207363616E207265717565737400B7 +:10C6C00052534E3A207573696E672049454545209F +:10C6D0003830322E3131692F44392E3000000000BD +:10C6E0005750413A207573696E672049454545208A +:10C6F0003830322E3131692F44332E3000000000A3 +:10C700005750413A204661696C656420746F20700F +:10C7100061727365205750412049452066726F6DE4 +:10C72000206173736F63696174696F6E20696E66EF +:10C730006F0000005750413A2044726976657220BC +:10C74000757365642064697361626C6564206772E7 +:10C750006F75702063697068657220307825782065 +:10C76000286D61736B203078257829202D20726523 +:10C770006A656374000000005750413A20447269B2 +:10C7800076657220757365642064697361626C6597 +:10C790006420706169727769736520636970686588 +:10C7A00072203078257820286D61736B20307825D1 +:10C7B0007829202D2072656A656374005750413ACC +:10C7C00020447269766572207573656420646973AC +:10C7D00061626C6564206B6579206D616E6167656F +:10C7E0006D656E74203078257820286D61736B201C +:10C7F0003078257829202D2072656A6563740000E1 +:10C800005750413A207573696E672047544B204357 +:10C81000434D50005750413A207573696E67204769 +:10C82000544B20544B4950005750413A207573697E +:10C830006E672047544B205745503130340000007C +:10C840005750413A207573696E672047544B205703 +:10C8500045503430000000005750413A207573694C +:10C860006E672050544B2043434D50005750413A7F +:10C87000207573696E672050544B20544B4950000B +:10C880005750413A207573696E672050544B204EC3 +:10C890004F4E45005750413A207573696E67204BE3 +:10C8A00045595F4D474D54203830322E31580000E5 +:10C8B0005750413A207573696E67204B45595F4D5B +:10C8C000474D54205750412D50534B005750413A3B +:10C8D000207573696E67204B45595F4D474D542055 +:10C8E0005750412D4E4F4E45000000005750413AE1 +:10C8F000204661696C656420746F2073656C6563A4 +:10C9000074205750412F52534E0000004661696C0D +:10C91000656420746F20706172736520746865208F +:10C92000636F6E66696775726174696F6E206669A0 +:10C930006C652027257327202D2065786974696E22 +:10C94000670000005265636F6E6669677572617497 +:10C95000696F6E20636F6D706C65746564000000B4 +:10C9600053657474696E672061757468656E746967 +:10C97000636174696F6E2074696D656F75743A20B8 +:10C98000256420736563202564207573656300004A +:10C9900053657474696E67207363616E207265718C +:10C9A000756573743A2025642073656320256420BF +:10C9B000757365630000000041757468656E746985 +:10C9C000636174696F6E20776974682025303278EE +:10C9D0003A253032783A253032783A253032783A72 +:10C9E000253032783A253032782074696D656420BC +:10C9F0006F75742E00000000547279696E672074A0 +:10CA00006F206173736F63696174652077697468FF +:10CA100020253032783A253032783A253032783A4B +:10CA2000253032783A253032783A2530327820284D +:10CA3000535349443D2725732720667265713D2570 +:10CA400064204D487A290000547279696E67207419 +:10CA50006F206173736F63696174652077697468AF +:10CA60002053534944202725732700004173736FD7 +:10CA700063696174696F6E20726571756573742086 +:10CA8000746F2074686520647269766572206661CF +:10CA9000696C6564000000007770615F7375707089 +:10CAA0006C6963616E742076302E352E31300A4306 +:10CAB0006F7079726967687420286329203230307A +:10CAC000332D323030382C204A6F756E69204D611D +:10CAD0006C696E656E203C6A4077312E66693E2037 +:10CAE000616E6420636F6E7472696275746F7273C5 +:10CAF00000000000546869732070726F6772616D86 +:10CB0000206973206672656520736F667477617241 +:10CB1000652E20596F752063616E2064697374728D +:10CB2000696275746520697420616E642F6F72206C +:10CB30006D6F646966792069740A756E6465722028 +:10CB4000746865207465726D73206F662074686503 +:10CB500020474E552047656E6572616C20507562A6 +:10CB60006C6963204C6963656E73652076657273CA +:10CB7000696F6E20322E0A0A416C7465726E6174A0 +:10CB80006976656C792C207468697320736F66749C +:10CB900077617265206D61792062652064697374C4 +:10CBA0007269627574656420756E6465722074685C +:10CBB00065207465726D73206F66207468650A4223 +:10CBC0005344206C6963656E73652E205365652040 +:10CBD000524541444D4520616E6420434F505949B0 +:10CBE0004E4720666F72206D6F72652064657461B8 +:10CBF000696C732E0A0000002530325800000000D6 +:10CC00008003C4FC80024A908002490000000010AA +:10CC100000000014000000000000002000000000E0 +:10CC20008003D3EC80024DF0800248880000006051 +:10CC300000000000000000000000000100000000F3 +:10CC40008003D3F880024DCC800248280000000009 +:10CC500000000000000000000000000000000000D4 +:10CC60008003C50480024D00800248C4000000001B +:10CC700000000000000000000000000000000001B3 +:10CC80008003D4008002408C800247A8000000008E +:10CC90000000000000000000000000000000000094 +:10CCA0008003D40880023F448002467C00000000DC +:10CCB0000000000000000000000000000000000074 +:10CCC0008003D41480023F188002466C00000000EC +:10CCD0000000000000000000000000000000000054 +:10CCE0008003D42080023EEC8002465C00000000FD +:10CCF0000000000000000000000000000000000034 +:10CD00008003D42880023CA4800244740000000008 +:10CD10000000000000000000000000000000000013 +:10CD20008003C51480024B9080024B00000000007D +:10CD300000000000000000000000000000000000F3 +:10CD40008003C53880024A908002490000000068D4 +:10CD50000000006C00000000000000000000000067 +:10CD60008003D43480024A908002490000000070A1 +:10CD7000000000740000000000000000000000003F +:10CD80008003D44880024A90800249000000007865 +:10CD90000000007C000000100000002000000001E6 +:10CDA0008003D45080024A90800249000000008035 +:10CDB00000000084000000000000000000000000EF +:10CDC0008003D45480024A90800249000000008809 +:10CDD0000000008C000000000000000000000001C6 +:10CDE0008003D46080024A908002490000000090D5 +:10CDF0000000000000000000000000000000000033 +:10CE00008003D46880024A908002490000000094A8 +:10CE10000000000000000000000000000000000012 +:10CE20008003D47080024A9080024900000000987C +:10CE300000000000000000000000000000000000F2 +:10CE40008003D47C80024A90800249000000009C4C +:10CE500000000000000000000000000000000000D2 +:10CE60008003D48880024A9080024900000000A01C +:10CE700000000000000000000000000000000001B1 +:10CE80008003D49C80024A9080024900000000A4E4 +:10CE90000000000000000000000000000000000092 +:10CEA0008003D4A480024A9080024900000000A8B8 +:10CEB0000000000000000000000000000000000072 +:10CEC0008003D4B480024A9080024900000000AC84 +:10CED0000000000000000000000000000000000052 +:10CEE0008003D4C880024A9080024900000000B04C +:10CEF0000000000000000000000000000000000032 +:10CF00008003D4D480024A9080024900000000B41B +:10CF10000000000000000000000000000000000011 +:10CF20008003D4E080024A9080024900000000B8EB +:10CF300000000000000000000000000000000000F1 +:10CF40008003D4F080024A9080024900000000BCB7 +:10CF500000000000000000000000000000000000D1 +:10CF60008003D50080024A9080024900000000C082 +:10CF700000000000000000000000000000000001B0 +:10CF80008003D51480024A9080024900000000C44A +:10CF90000000000000000000000000000000000091 +:10CFA0008003D52080024A9080024900000000C81A +:10CFB0000000000000000000000000000000000071 +:10CFC0008003D53080024A9080024900000000CCE6 +:10CFD0000000000000000000000000000000000051 +:10CFE0008003D54480024A9080024900000000D4AA +:10CFF0000000000000000000000000000000000031 +:10D000008003D54C80024A9080024900000000D87D +:10D010000000000000000000000000000000000010 +:10D020008003D55480024A9080024900000000DC51 +:10D0300000000000000000000000000000000000F0 +:10D040008003D55C80024A9080024900000000E025 +:10D0500000000000000000000000000000000001CF +:10D060008003D56080024A9080024900000000E8F9 +:10D0700000000000000000000000000000000000B0 +:10D080008003D56C80024A9080024900000000ECC9 +:10D090000000000000000000000000000000000090 +:10D0A0008003D65C80024DF080024888000000E4D6 +:10D0B0000000000000000000000000000000000070 +:10D0C0008003D57480024DF080024888000000F093 +:10D0D0000000000000000000000000000000000050 +:10D0E0008003D58080024A78800244580000000006 +:10D0F000000000000000000000000000000000012F +:10D100008003D58C80024A608002443C000000000D +:10D11000000000000000000000000000000000010E +:10D120008003D59880024A48800244200000000015 +:10D1300000000000000000000000000000000001EE +:10D140008003D5A480024A3080024404000000001D +:10D1500000000000000000000000000000000001CE +:10D160008003D5B080024DF0800248880000014461 +:10D1700000000000000000000000000000000000AF +:10D180008003D5C080024DF0800248880000000C6A +:10D19000000000000000000000000000000000008F +:10D1A0008003D5CC80024DF0800248880000017CCD +:10D1B000000000000000000000000000000000006F +:10D1C0008003D5DC80024A90800249000000018083 +:10D1D000000000000000000000000000000000004F +:10D1E0008003D5E880024DF0800248880000019C51 +:10D1F000000000000000000000000000000000002F +:10D200008003D5F880024DF0800248880000018438 +:10D21000000000000000000000000001000000000D +:10D220008003D60080024DF0800248880000006430 +:10D2300000000000000000000000000200000000EC +:10D240008003D60880024DF0800248880000014823 +:10D2500000000000000000000000000100000000CD +:10D260008003D62080024DF080024888000001949F +:10D2700000000000000000000000000100000000AD +:10D280008003D62C80024A9080024900000001A051 +:10D29000000000000000000000000000000000008E +:10D2A0008003D63480024DF0800248880000019847 +:10D2B000000000000000000000000001000000006D +:10D2C0008003D63C80024DF0800248880000014C6B +:10D2D000000000000000000000000001000000004D +:10D2E0008003D64880024DF080024888000001A4E7 +:10D2F00000000000000000000000271000000000F7 +:10D300002A0000004F50454E000000005348415293 +:10D31000454400004C454150000000005745503145 +:10D320003034000057455034300000005750412D34 +:10D3300045415000494545453830323158000000DC +:10D340005750410052534E005750413200000000E8 +:10D3500025734F50454E00002573534841524544B4 +:10D360000000000025734C454150000025734343E5 +:10D370004D5000002573544B49500000257357450C +:10D3800050313034000000002573574550343000D0 +:10D3900025734E4F4E45000025735750412D505375 +:10D3A0004B00000025735750412D454150000000AF +:10D3B000257349454545383032315800257357505B +:10D3C000412D4E4F4E45000025735750410000003F +:10D3D000257352534E0000007765705F6B657925A9 +:10D3E0006400000025732573000000007363616E04 +:10D3F0005F73736964000000627373696400000006 +:10D4000070726F746F0000006B65795F6D676D748B +:10D4100000000000706169727769736500000000A8 +:10D4200067726F7570000000617574685F616C678A +:10D4300000000000616E6F6E796D6F75735F6964D7 +:10D44000656E74697479000065617070736B0000BB +:10D450006E61690070617373776F72640000000021 +:10D4600063615F636572740063615F70617468001B +:10D47000636C69656E745F6365727400707269765F +:10D480006174655F6B657900707269766174655F60 +:10D490006B65795F706173737764000064685F66C1 +:10D4A000696C65007375626A6563745F6D6174634E +:10D4B00068000000616C747375626A6563745F6D07 +:10D4C000617463680000000063615F6365727432B9 +:10D4D0000000000063615F7061746832000000004A +:10D4E000636C69656E745F6365727432000000007E +:10D4F000707269766174655F6B6579320000000057 +:10D50000707269766174655F6B6579325F706173A3 +:10D510007377640064685F66696C653200000000C0 +:10D520007375626A6563745F6D617463683200006D +:10D53000616C747375626A6563745F6D617463684E +:10D5400032000000706861736531000070686173BB +:10D5500065320000706373630000000070696E0044 +:10D56000656E67696E655F69640000006B65795F71 +:10D57000696400006561706F6C5F666C6167730061 +:10D580007765705F6B657930000000007765705FCC +:10D590006B657931000000007765705F6B657932EB +:10D5A000000000007765705F6B6579330000000054 +:10D5B0007765705F74785F6B6579696478000000E7 +:10D5C0007072696F72697479000000006561705F44 +:10D5D000776F726B61726F756E6400007061635F6C +:10D5E00066696C6500000000667261676D656E7447 +:10D5F0005F73697A650000006D6F6465000000006C +:10D600007573655F7770730070726F6163746976AC +:10D61000655F6B65795F63616368696E67000000D1 +:10D6200064697361626C65640000000069645F7323 +:10D6300074720000706565726B6579006D6978655C +:10D64000645F63656C6C00006672657175656E631E +:10D6500079000000888E000077696669656E6769E9 +:10D660006E65000057694669456E67696E65000022 +:10D670008003D6588003D664800254C880025420A8 +:10D6800080024F98800252E0800253E8800254A446 +:10D690000000000080024F9A800252C880024F941E +:10D6A00080024F96800252B08002529880024F9CB6 +:10D6B00080024F9E8002523C800251E0800251D491 +:10D6C000800251AC00000000000000008002518088 +:10D6D00080024FF480024FD00000000000000000E4 +:10D6E000000000000000000000000000000000003A +:10D6F000000000000000000080024FA08002564E93 +:10D700008002564A80025646800256408002563CAD +:10D7100080025636800256328002562C80025626EF +:10D72000800256928002568C800256888002568271 +:10D730008002567C80025676800256728002566CB9 +:10D740008002566680025B3480025C0880025BE0E7 +:10D7500080025BBA80025BA080025B3480025B3493 +:10D7600080025B3480025DC280025E3A80025E12FB +:10D7700080025D8E80025CC280025AF680025DF4F7 +:10D7800080025DCE800268DC80026AA280026A00AC +:10D7900080026904800268F2800269EE800268DC1F +:10D7A000800268DC800268E8800268E8800268E83D +:10D7B000696E76616C696461746500004354524C13 +:10D7C0002D4556454E542D4541502D535543434507 +:10D7D0005353204541502061757468656E746963C8 +:10D7E0006174696F6E20636F6D706C657465642021 +:10D7F0007375636365737366756C6C7920286261F9 +:10D80000736564206F6E206C6F776572206C617930 +:10D810006572207375636365737329004354524CBA +:10D820002D4556454E542D4541502D5355434345A6 +:10D830005353204541502061757468656E74696367 +:10D840006174696F6E20636F6D706C6574656420C0 +:10D850007375636365737366756C6C7900000000A3 +:10D860004354524C2D4556454E542D4541502D465E +:10D8700041494C55524520454150206175746865B9 +:10D880006E7469636174696F6E206661696C65644A +:10D8900000000000494E495449414C495A45000096 +:10D8A0004541503A206D6F7265207468616E202585 +:10D8B000642061757468656E7469636174696F6E04 +:10D8C00020726F756E6473202D2061626F72740018 +:10D8D0004354524C2D4556454E542D4541502D4EE6 +:10D8E0004F54494649434154494F4E2000000000DF +:10D8F0004354524C2D4556454E542D4541502D53C1 +:10D900005441525445442045415020617574686526 +:10D910006E7469636174696F6E207374617274658B +:10D92000640000004745545F4D4554484F44000093 +:10D930004541503A204661696C656420746F2069E6 +:10D940006E697469616C697A6520454150206D6526 +:10D9500074686F643A2076656E646F722025752056 +:10D960006D6574686F642025752028257329000073 +:10D970004354524C2D4556454E542D4541502D4D46 +:10D980004554484F44204541502076656E646F727F +:10D99000202575206D6574686F6420257520282505 +:10D9A00073292073656C656374656400454150207C +:10D9B0006465696E697400008002794480027ADAD5 +:10D9C00080027B5880027BA280027CC880027CD2CD +:10D9D00080027AC45750413A20544B495020636F1B +:10D9E000756E7465726D656173757265732073749D +:10D9F0006F707065640000004173736F63696174D8 +:10DA0000656420746F2061206E6577204253533A1D +:10DA10002042535349443D253032783A25303278FC +:10DA20003A253032783A253032783A253032783A11 +:10DA300025303278000000004173736F63696174B0 +:10DA40006564207769746820253032783A25303251 +:10DA5000783A253032783A253032783A25303278A3 +:10DA60003A253032780000005750413A20342D5783 +:10DA700061792048616E647368616B6520666169D5 +:10DA80006C6564202D207072652D73686172656409 +:10DA9000206B6579206D617920626520696E636F06 +:10DAA00072726563740000004354524C2D45564514 +:10DAB0004E542D444953434F4E4E45435445442004 +:10DAC0002D20446973636F6E6E656374206576659F +:10DAD0006E74202D2072656D6F7665206B6579738D +:10DAE000000000004D69636861656C204D4943206A +:10DAF0006661696C757265206465746563746564DC +:10DB000000000000544B495020636F756E746572BD +:10DB10006D65617375726573207374617274656489 +:10DB200000000000000000080000000600000006E1 +:10DB3000496E646578202F204141202F20504D4BA5 +:10DB40004944202F2065787069726174696F6E2076 +:10DB500028696E207365636F6E647329202F206FB0 +:10DB600070706F7274756E69737469630A00000077 +:10DB7000256420253032783A253032783A25303203 +:10DB8000783A253032783A253032783A2530327872 +:10DB9000200000002025642025640A00504D4B2001 +:10DBA0004E616D650000000052534E3A207374615F +:10DBB0007274696E67207072652D61757468656E28 +:10DBC0007469636174696F6E2077697468202530A9 +:10DBD00032783A253032783A253032783A25303268 +:10DBE000783A253032783A253032780052534E3A1E +:10DBF0002070726F63657373696E6720504D4B536D +:10DC0000412063616E646964617465206C6973743A +:10DC10000000000052534E3A206E6F7420696E204F +:10DC20007375697461626C652073746174652066D4 +:10DC30006F72206E6577207072652D6175746865EE +:10DC40006E7469636174696F6E00000052534E3ADE +:10DC500020504D4B53412063616E6469646174656B +:10DC600020253032783A253032783A253032783AE9 +:10DC7000253032783A253032783A253032782073A0 +:10DC8000656C656374656420666F72207072652DC3 +:10DC900061757468656E7469636174696F6E0000A4 +:10DCA00052534E3A20504D4B53412063616E64698C +:10DCB0006461746520253032783A253032783A250F +:10DCC0003032783A253032783A253032783A253079 +:10DCD000327820646F6573206E6F74206E656564A2 +:10DCE000207072652D61757468656E746963617406 +:10DCF000696F6E20616E796D6F72650052534E3A96 +:10DD0000206E6F206D6F72652070656E64696E673E +:10DD100020504D4B53412063616E646964617465AA +:10DD20007300000052534E3A2061646465642050D1 +:10DD30004D4B53412063616368652063616E646984 +:10DD40006461746520253032783A253032783A257E +:10DD50003032783A253032783A253032783A2530E8 +:10DD60003278207072696F202564000052534E3A59 +:10DD7000207072652D61757468656E746963617475 +:10DD8000696F6E207769746820253032783A2530C3 +:10DD900032783A253032783A253032783A253032A6 +:10DDA000783A253032782074696D6564206F757417 +:10DDB00000000000636F6D706C657465642073759E +:10DDC000636365737366756C6C79000052534E3AE9 +:10DDD000206661696C656420746F20676574206DCE +:10DDE00061737465722073657373696F6E206B6500 +:10DDF000792066726F6D207072652D617574682070 +:10DE00004541504F4C207374617465206D616368A7 +:10DE1000696E65730000000052534E3A20707265BF +:10DE20002D61757468656E7469636174696F6E20C5 +:10DE30007769746820253032783A253032783A256F +:10DE40003032783A253032783A253032783A2530F7 +:10DE50003278202573000000800000008002B51C8D +:10DE60008002B50A8002B5008002B4FA8002B4F4E0 +:10DE70008002B4EE8002B4E8000FAC010050F20260 +:10DE8000000FAC02000FAC01000FAC050050F20215 +:10DE9000000FAC040050F2010050F2010050F201FA +:10DEA0000050F2050050F200000FAC00000FAC0370 +:10DEB0000050F200000FAC0449454545203830328F +:10DEC0002E315820286E6F20575041290000000045 +:10DED0005750412F49454545203830322E31582F73 +:10DEE00045415000575041322F4945454520383073 +:10DEF000322E31582F45415000000000575041321A +:10DF00002D50534B000000005745502D3430000079 +:10DF10005745502D313034007061697277697365EF +:10DF20005F6369706865723D25730A67726F75700B +:10DF30005F6369706865723D25730A6B65795F6D13 +:10DF4000676D743D25730A005750413A20257320B0 +:10DF5000287372633D253032783A253032783A257D +:10DF60003032783A253032783A253032783A2530D6 +:10DF7000327829005750413A204B6579206E656709 +:10DF80006F74696174696F6E20636F6D706C657416 +:10DF90006564207769746820253032783A253032FC +:10DFA000783A253032783A253032783A253032784E +:10DFB0003A25303278205B50544B3D25732047542E +:10DFC0004B3D25735D0000005750413A20496E7665 +:10DFD000616C6964204541504F4C2D4B657920663A +:10DFE00072616D65202D206B65795F6461746120BD +:10DFF0006F766572666C6F7720282564203E202539 +:10E000006C752900494520696E20332F34206D73CB +:10E010006720646F6573206E6F74206D6174636830 +:10E02000207769746820494520696E2042656163E4 +:10E030006F6E2F50726F62655265737020286E6F1D +:10E040002049453F29000000494520696E20332FB3 +:10E0500034206D736720646F6573206E6F74206D5C +:10E0600061746368207769746820494520696E206F +:10E07000426561636F6E2F50726F62655265737097 +:10E0800000000000506F737369626C6520646F77E5 +:10E090006E67726164652061747461636B2064658E +:10E0A000746563746564202D2052534E207761732C +:10E0B00020656E61626C656420616E642052534E0F +:10E0C0002049452077617320696E206D7367203386 +:10E0D0002F342C20627574206E6F7420696E20427C +:10E0E0006561636F6E2F50726F6265526573700069 +:10E0F0005750413A204661696C656420746F20670F +:10E100006574206D61737465722073657373696FD4 +:10E110006E206B65792066726F6D204541504F4CC3 +:10E12000207374617465206D616368696E65730046 +:10E130005750413A204B65792068616E647368617D +:10E140006B652061626F7274656400005750413ADC +:10E15000204661696C656420746F20676574207265 +:10E16000616E646F6D206461746120666F7220530C +:10E170004E6F6E6365000000506169727769736568 +:10E18000206B657920657870616E73696F6E000031 +:10E190005750413A2047726F75702072656B6579F0 +:10E1A000696E6720636F6D706C6574656420776954 +:10E1B000746820253032783A253032783A2530326A +:10E1C000783A253032783A253032783A253032782C +:10E1D000205B47544B3D25735D00000000000000AC +:10E1E000000000000050F204000FAC02000FAC0170 +:10E1F00052096AD53036A538BF40A39E81F3D7FBBC +:10E200007CE339829B2FFF87348E4344C4DEE9CB05 +:10E21000547B9432A6C2233DEE4C950B42FAC34E7A +:10E22000082EA16628D924B2765BA2496D8BD12530 +:10E2300072F8F66486689816D4A45CCC5D65B692D4 +:10E240006C704850FDEDB9DA5E154657A78D9D8478 +:10E2500090D8AB008CBCD30AF7E45805B8B3450698 +:10E26000D02C1E8FCA3F0F02C1AFBD0301138A6BB2 +:10E270003A9111414F67DCEA97F2CFCEF0B4E673E2 +:10E2800096AC7422E7AD3585E2F937E81C75DF6E90 +:10E2900047F11A711D29C5896FB7620EAA18BE1BF6 +:10E2A000FC563E4BC6D279209ADBC0FE78CD5AF49C +:10E2B0001FDDA8338807C731B11210592780EC5FE2 +:10E2C00060517FA919B54A0D2DE57A9F93C99CEF3E +:10E2D000A0E03B4DAE2AF5B0C8EBBB3C835399613F +:10E2E000172B047EBA77D626E169146355210C7D7D +:10E2F00001020408102040801B36000051F4A75092 +:10E300007E4165531A17A4C33A275E963BAB6BCB8D +:10E310001F9D45F1ACFA58AB4BE303932030FA55FF +:10E32000AD766DF688CC7691F5024C254FE5D7FC9D +:10E33000C52ACBD726354480B562A38FDEB15A49B2 +:10E3400025BA1B6745EA0E985DFEC0E1C32F750232 +:10E35000814CF0128D4697A36BD3F9C6038F5FE70C +:10E3600015929C95BF6D7AEB955259DAD4BE832DE8 +:10E37000587421D349E069298EC9C84475C2896A95 +:10E38000F48E797899583E6B27B971DDBEE14FB6AE +:10E39000F088AD17C920AC667DCE3AB463DF4A1869 +:10E3A000E51A31829751336062537F45B16477E05B +:10E3B000BB6BAE84FE81A01CF9082B947048685892 +:10E3C0008F45FD1994DE6C87527BF8B7AB73D3236E +:10E3D000724B02E2E31F8F576655AB2AB2EB280758 +:10E3E0002FB5C20386C57B9AD33708A5302887F29C +:10E3F00023BFA5B202036ABAED16825C8ACF1C2B3A +:10E40000A779B492F307F2F04E69E2A165DAF4CD90 +:10E410000605BED5D134621FC4A6FE8A342E539D94 +:10E42000A2F355A0058AE132A4F6EB750B83EC3913 +:10E430004060EFAA5E719F06BD6E10513E218AF9C1 +:10E4400096DD063DDD3E05AE4DE6BD4691548DB5EB +:10E4500071C45D050406D46F605015FF1998FB2444 +:10E46000D6BDE997894043CC67D99E77B0E842BDD5 +:10E4700007898B88E7195B3879C8EEDBA17C0A47EE +:10E480007C420FE9F8841EC90000000009808683E1 +:10E49000322BED481E1170AC6C5A724EFD0EFFFB14 +:10E4A0000F8538563DAED51E362D39270A0FD96453 +:10E4B000685CA6219B5B54D124362E3A0C0A67B1C6 +:10E4C0009357E70FB4EE96D21B9B919E80C0C54F29 +:10E4D00061DC20A25A774B691C121A16E293BA0A21 +:10E4E000C0A02AE53C22E043121B171D0E090D0BAC +:10E4F000F28BC7AD2DB6A8B9141EA9C857F119855E +:10E50000AF75074CEE99DDBBA37F60FDF701269F39 +:10E510005C72F5BC44663BC55BFB7E348B4329765D +:10E52000CB23C6DCB6EDFC68B8E4F163D731DCCAB6 +:10E53000426385101397224084C61120854A247DAA +:10E54000D2BB3DF8AEF93211C729A16D1D9E2F4BEC +:10E55000DCB230F30D8652EC77C1E3D02BB3166CEE +:10E56000A970B999119448FA47E96422A8FC8CC4AF +:10E57000A0F03F1A567D2CD8223390EF87494EC722 +:10E58000D938D1C18CCAA2FE98D40B36A6F581CF5A +:10E59000A57ADE28DAB78E263FADBFA42C3A9DE4DB +:10E5A0005078920D6A5FCC9B547E4662F68D13C202 +:10E5B00090D8B8E82E39F75E82C3AFF59F5D80BE74 +:10E5C00069D0937C6FD52DA9CF2512B3C8AC993BE8 +:10E5D00010187DA7E89C636EDB3BBB7BCD267809DA +:10E5E0006E5918F4EC9AB701834F9AA8E6956E65B8 +:10E5F000AAFFE67E21BCCF08EF15E8E6BAE79BD973 +:10E600004A6F36CEEA9F09D429B07CD631A4B2AF86 +:10E610002A3F2331C6A5943035A266C0744EBC375C +:10E62000FC82CAA6E090D0B033A7D815F104984A6E +:10E6300041ECDAF77FCD500E1791F62F764DD68D3F +:10E6400043EFB04DCCAA4D54E49604DF9ED1B5E320 +:10E650004C6A881BC12C1FB84665517F9D5EEA0439 +:10E66000018C355DFA877473FB0B412EB3671D5A1D +:10E6700092DBD252E91056336DD647139AD7618C8C +:10E6800037A10C7A59F8148EEB133C89CEA927EEEA +:10E69000B761C935E11CE5ED7A47B13C9CD2DF5941 +:10E6A00055F2733F1814CE7973C737BF53F7CDEACD +:10E6B0005FFDAA5BDF3D6F147844DB86CAAFF38150 +:10E6C000B968C43E3824342CC2A3405F161DC372FF +:10E6D000BCE2250C283C498BFF0D954139A80171FE +:10E6E000080CB3DED8B4E49C6456C1907BCB846143 +:10E6F000D532B670486C5C74D0B85742C66363A517 +:10E70000F87C7C84EE777799F67B7B8DFFF2F20DB7 +:10E71000D66B6BBDDE6F6FB191C5C55460303050A4 +:10E7200002010103CE6767A9562B2B7DE7FEFE1978 +:10E73000B5D7D7624DABABE6EC76769A8FCACA45B1 +:10E740001F82829D89C9C940FA7D7D87EFFAFA153B +:10E75000B25959EB8E4747C9FBF0F00B41ADADEC18 +:10E76000B3D4D4675FA2A2FD45AFAFEA239C9CBFA0 +:10E7700053A4A4F7E47272969BC0C05B75B7B7C28E +:10E78000E1FDFD1C3D9393AE4C26266A6C36365A4D +:10E790007E3F3F41F5F7F70283CCCC4F6834345CC1 +:10E7A00051A5A5F4D1E5E534F9F1F108E2717193D1 +:10E7B000ABD8D873623131532A15153F0804040CC5 +:10E7C00095C7C752462323659DC3C35E30181828DA +:10E7D000379696A10A05050F2F9A9AB50E070709D5 +:10E7E000241212361B80809BDFE2E23DCDEBEB264C +:10E7F0004E2727697FB2B2CDEA75759F1209091BB2 +:10E800001D83839E582C2C74341A1A2E361B1B2DF4 +:10E81000DC6E6EB2B45A5AEE5BA0A0FBA45252F664 +:10E82000763B3B4DB7D6D6617DB3B3CE5229297B1B +:10E83000DDE3E33E5E2F2F7113848497A65353F5D7 +:10E84000B9D1D16800000000C1EDED2C402020605E +:10E85000E3FCFC1F79B1B1C8B65B5BEDD46A6ABE5C +:10E860008DCBCB4667BEBED97239394B944A4ADE4E +:10E87000984C4CD4B05858E885CFCF4ABBD0D06B19 +:10E88000C5EFEF2A4FAAAAE5EDFBFB16864343C569 +:10E890009A4D4DD766333355118585948A4545CFBA +:10E8A000E9F9F91004020206FE7F7F81A05050F0C2 +:10E8B000783C3C44259F9FBA4BA8A8E3A25151F352 +:10E8C0005DA3A3FE804040C0058F8F8A3F9292AD2A +:10E8D000219D9DBC70383848F1F5F50463BCBCDF60 +:10E8E00077B6B6C1AFDADA75422121632010103055 +:10E8F000E5FFFF1AFDF3F30EBFD2D26D81CDCD4CF3 +:10E90000180C0C1426131335C3ECEC2FBE5F5FE11B +:10E91000359797A2884444CC2E17173993C4C4570F +:10E9200055A7A7F2FC7E7E827A3D3D47C86464AC61 +:10E93000BA5D5DE73219192BE6737395C06060A06C +:10E94000198181989E4F4FD1A3DCDC7F442222663F +:10E95000542A2A7E3B9090AB0B8888838C4646CA0B +:10E96000C7EEEE296BB8B8D32814143CA7DEDE79C5 +:10E97000BC5E5EE2160B0B1DADDBDB76DBE0E03B45 +:10E9800064323256743A3A4E140A0A1E924949DBEE +:10E990000C06060A4824246CB85C5CE49FC2C25D85 +:10E9A000BDD3D36E43ACACEFC46262A6399191A8DB +:10E9B000319595A4D3E4E437F279798BD5E7E73242 +:10E9C0008BC8C8436E373759DA6D6DB7018D8D8CA2 +:10E9D000B1D5D5649C4E4ED249A9A9E0D86C6CB48F +:10E9E000AC5656FAF3F4F407CFEAEA25CA6565AFE8 +:10E9F000F47A7A8E47AEAEE9100808186FBABAD525 +:10EA0000F07878884A25256F5C2E2E72381C1C24DD +:10EA100057A6A6F173B4B4C797C6C651CBE8E8238E +:10EA2000A1DDDD7CE874749C3E1F1F21964B4BDDFD +:10EA300061BDBDDC0D8B8B860F8A8A85E07070907E +:10EA40007C3E3E4271B5B5C4CC6666AA904848D8B3 +:10EA500006030305F7F6F6011C0E0E12C26161A350 +:10EA60006A35355FAE5757F969B9B9D017868691BF +:10EA700099C1C1583A1D1D27279E9EB9D9E1E13899 +:10EA8000EBF8F8132B9898B322111133D26969BBB4 +:10EA9000A9D9D970078E8E89339494A72D9B9BB6E4 +:10EAA0003C1E1E2215878792C9E9E92087CECE49F0 +:10EAB000AA5555FF50282878A5DFDF7A038C8C8F64 +:10EAC00059A1A1F8098989801A0D0D1765BFBFDA10 +:10EAD000D7E6E631844242C6D06868B8824141C375 +:10EAE000299999B05A2D2D771E0F0F117BB0B0CBFD +:10EAF000A85454FC6DBBBBD62C16163A002020201F +:10EB000020202020202028282828282020202020DD +:10EB100020202020202020202020202020881010AD +:10EB20001010101010101010101010101004040409 +:10EB300004040404040404101010101010104141C7 +:10EB400041414141010101010101010101010101B5 +:10EB500001010101010101011010101010104242C9 +:10EB60004242424202020202020202020202020285 +:10EB70000202020202020202101010102000000025 +:10EB80000000000000000000000000000000000085 +:10EB90000000000000000000000000000000000075 +:10EBA0000000000000000000000000000000000065 +:10EBB0000000000000000000000000000000000055 +:10EBC0000000000000000000000000000000000045 +:10EBD0000000000000000000000000000000000035 +:10EBE0000000000000000000000000000000000025 +:10EBF0000000000000000000000000000000000015 +:10EC00002D2D0000504F5349584C595F434F5252DD +:10EC10004543540025733A206F7074696F6E20600D +:10EC200025732720697320616D626967756F75733D +:10EC30002028636F756C6420626520602D2D25731C +:10EC400027206F7220602D2D257327290A000000D0 +:10EC500025733A20696E76616C6964206F707469FF +:10EC60006F6E202D2D20602D2563270A00000000E7 +:10EC700025733A20617267756D656E7420726571D7 +:10EC8000756972656420666F72206F7074696F6E4B +:10EC9000206000002D2D2573270A00002D256327F5 +:10ECA0000A00000043000000000004A88002F4668F +:10ECB0008002F4888002F2B08002F2E88002F4520E +:10ECC0008002F4508002F3FE8002F4268002F3DC1E +:10ECD0008002F3DC8002F3CC8002F3DC8002F3EAF2 +:10ECE0008002F3EA8002F3DC3030303030303030F4 +:10ECF000303030303030303001020B040B0506016B +:10ED00000B01020B040B0506010B0B0B03040B0597 +:10ED10000B0B0B0B0B0B040B050B0B0B0B0B0B0B50 +:10ED20000B0B0B0B0B05080B040B0B070B0B0B0949 +:10ED30000B040B050B0B0B0B0A0B040B0B0B0B0B38 +:10ED40000B0B0B040B0B0B0B0B0B0B030B0B0B0B22 +:10ED50000B0B0B0B080B0B0B0B0B0B00000000003D +:10ED6000000000000001000304000000000001009A +:10ED7000030400000000000007030400000000007E +:10ED80000000030400000000000000000400000078 +:10ED90000000020003040000000000010005060559 +:10EDA0000000000001000506000000000000000354 +:10EDB0000400000000000008000000000000000047 +:10EDC000080000000000000000000000000000003B +:10EDD0003031323334353637383941424344454691 +:10EDE0000000000030313233343536373839616253 +:10EDF0006364656600000000202020202020202081 +:10EE000020202020202020200808080808080808C2 +:10EE10000808080808080808080808080808080872 +:10EE2000080808080808080807080807020808076B +:10EE30000808060708070508000101010101010192 +:10EE40000101080808080808080408040404040468 +:10EE50000808080803080804080808040804080843 +:10EE6000040808080808080808040804040404043E +:10EE70000304030803080404040308040304080843 +:10EE8000040803080808080808080808080808080B +:10EE900008080808080808080808080808080808F2 +:10EEA00008080808080808080808080808080808E2 +:10EEB00008080808080808080808080808080808D2 +:10EEC00008080808080808080808080808080808C2 +:10EED00008080808080808080808080808080808B2 +:10EEE00008080808080808080808080808080808A2 +:10EEF0000808080808080808080808080808080892 +:10EF00000808080808080808000A000100020003B1 +:10EF1000000400050006000700080009000A000BB5 +:10EF2000000C000D000E000F00100000000000009B +:10EF300000000000000000000000000000000000D1 +:10EF400000000000000000000000000000000000C1 +:10EF500000000000000000000000000000000000B1 +:10EF600000000000000000000000000000000000A1 +:10EF70000000000000000000000000000000000091 +:10EF800000000000000000000000000080037FB4CB +:10EF900080037E2080037E2080037E2080037E20ED +:10EFA00080037E2080037E2080037E2080037E20DD +:10EFB00080037E20FFFFFFFFFFFFFFFF49534F2D20 +:10EFC000383835392D310000800333228003334433 +:10EFD0008003316C800331A48003330E8003330C33 +:10EFE000800332BA800332E2800332988003329881 +:10EFF0008003328880033298800332A6800332A6D1 +:10F00000800332988003363480034AA480034AA4E4 +:10F010008003364480034AA480034AA480034AA4A0 +:10F0200080034AA480034AA480034AA4800336488C +:10F030008003371C80034AA48003371880033724D9 +:10F0400080034AA480033842800338468003384650 +:10F0500080033846800338468003384680033846AC +:10F0600080033846800338468003384680034AA42C +:10F0700080034AA480034AA480034AA480034AA4CC +:10F0800080034AA480034AA480034AA480034AA4BC +:10F0900080034AA48003394480033B9680034AA43A +:10F0A00080033B9680034AA480034AA480034AA4B9 +:10F0B00080034AA48003387880034AA480034AA4CA +:10F0C0008003416280034AA480034AA480034AA4C7 +:10F0D00080034AA480034AA48003452680034AA4EF +:10F0E00080034AA48003361A80034AA480034AA4FA +:10F0F00080034AA480034AA480034AA480034AA44C +:10F1000080034AA480034AA480034AA480034AA43B +:10F11000800338988003395A80033B9680033B96DE +:10F1200080033B968003387C8003395A80034AA4CD +:10F1300080034AA48003388080034AA480033FA24E +:10F1400080034178800343A48003389480034AA459 +:10F150008003445880034AA48003453C80034AA4AA +:10F1600080034AA48003476E01020B040B050601CD +:10F170000B01020B040B0506010B0B0B03040B0523 +:10F180000B0B0B0B0B0B040B050B0B0B0B0B0B0BDC +:10F190000B0B0B0B0B05080B040B0B070B0B0B09D5 +:10F1A0000B040B050B0B0B0B0A0B040B0B0B0B0BC4 +:10F1B0000B0B0B040B0B0B0B0B0B0B030B0B0B0BAE +:10F1C0000B0B0B0B080B0B0B0B0B0B0000000000C9 +:10F1D0000000000000010003040000000000010026 +:10F1E000030400000000000007030400000000000A +:10F1F0000000030400000000000000000400000004 +:10F2000000000200030400000000000100050605E4 +:10F2100000000000010005060000000000000003DF +:10F2200004000000000000080000000000000000D2 +:10F2300008000000000000000000000000000000C6 +:10F24000494E4600696E66004E414E006E616E008A +:10F2500020202020202020202020202020202020AE +:10F26000303030303030303030303030303030309E +:10F27000080808080808080808080808080808080E +:10F2800008080808080808080808080808080808FE +:10F2900007080807020808070808060708070508FE +:10F2A0000001010101010101010108080808080825 +:10F2B00008040804040404040808080803080804EF +:10F2C00008080804080408080408080808080808CA +:10F2D00008040804040404040304030803080404E1 +:10F2E00004030804030408080408030808080808BD +:10F2F000080808080808080808080808080808088E +:10F30000080808080808080808080808080808087D +:10F31000080808080808080808080808080808086D +:10F32000080808080808080808080808080808085D +:10F33000080808080808080808080808080808084D +:10F34000080808080808080808080808080808083D +:10F35000080808080808080808080808080808082D +:10F36000080808080808080808080808080808081D +:10F37000496E66696E697479000000004E614E0046 +:10F3800000000005000000190000007D3FF00000B3 +:10F390000000000040240000000000004059000070 +:10F3A00000000000408F40000000000040C38800C3 +:10F3B0000000000040F86A0000000000412E848038 +:10F3C00000000000416312D0000000004197D78484 +:10F3D0000000000041CDCD65000000004202A05FAA +:10F3E0002000000042374876E8000000426D1A9481 +:10F3F000A200000042A2309CE540000042D6BCC4FE +:10F400001E900000430C6BF5263400004341C37985 +:10F4100037E080004376345785D8A00043ABC16DF8 +:10F42000674EC80043E158E460913D004415AF1DAC +:10F4300078B58C40444B1AE4D6E2EF504480F0CFCC +:10F44000064DD59244B52D02C7E14AF644EA784309 +:10F4500079D99DB44341C37937E080004693B8B56C +:10F46000B5056E174D384F03E93FF9F55A827748D5 +:0CF47000F9301D3275154FDD7F73BF3C75 +:10F480000000000455736167653A2074746370204E +:10F490002D742F2D72205B2D6F7074696F6E735DEC +:10F4A00020686F73740A20202020202020202D6CDB +:10F4B0002020202020206C656E677468206F6620F5 +:10F4C00062756673207772697474656E20746F203C +:10F4D0006E6574776F726B202864656661756C74F5 +:10F4E0002031303234290A20202020202020202DD5 +:10F4F0006E2020202020206E756D626572206F6660 +:10F500002062756673207772697474656E20746FFB +:10F51000206E6574776F726B202864656661756C08 +:10F52000742031303234290A20202020202020204D +:10F530002D70202020202020706F7274206E756D39 +:10F5400062657220746F2073656E6420746F20286A +:10F5500064656661756C742032303030290A202071 +:10F560002020202020202D752020202020207564A0 +:10F57000700A20202020202020202D7620202020EE +:10F580002020766572626F73650A000080039954CB +:10F59000000000000000000000000000000000006B +:10F5A000000000000000000000000000000000005B +:10F5B000000000000000000000000000000000004B +:10F5C000000000000000000000000000000000003B +:10F5D000000000000000000000000000000000002B +:10F5E000000000000000000000000000000000001B +:10F5F000000000000000000000000000000000000B +:10F6000000000000000000000000000000000000FA +:10F6100000000000000000000000000000000000EA +:10F6200000000000000000000000000000000000DA +:10F6300000000000000000000000000000000000CA +:10F6400000000000000000000000000000000000BA +:10F6500000000000000000000000000000000000AA +:10F660000000000400000000ABCD00000000196E97 +:10F6700010000000FFFFFFFFFFFFFFFFFF7590007E +:10F68000000001FFFFFFFFFEFFFFFFFFFF751000FF +:10F69000000001FFFFFFFFFE00050000800149ECB4 +:10F6A000800149EC800149EC800149EC0000000038 +:10F6B000000002340000000C02040B0C1216182487 +:10F6C0003048606C000000000000000000000000F6 +:10F6D00000000010010000146D3E86B0FFFFFFFF28 +:10F6E000FFFF0000000003E800000001000000012F +:10F6F00000000320000000010000000000000008DE +:10F70000000000020000006400000000000000058E +:10F710000000000F000000050000000F000013882B +:10F7200000001388000007D00000138800003E800E +:10F73000000000020000000C02040B0C121618243A +:10F740003048606C00000000000000000000000075 +:10F7500000000000000000000D0102030405060780 +:10F7600008090A0B0C0D000000000011FF0000004A +:10F770000000000000000000000000000000000089 +:10F780000000000000000000000000000000FFFF7B +:10F79000FFFFFFFF00000001000000030000000168 +:10F7A0000000000100000000000000010000000156 +:10F7B0000000000100000001000000000000000146 +:10F7C0000000000A00000005000000000000000525 +:10F7D00000000000FFFFFFFF00000001000000002C +:10F7E00000000002FF000000000000000000000018 +:10F7F0000000000000000000000000000000000009 +:10F80000000000000000FFFFFFFFFFFF00000001FD +:10F810000000000300000000000007D000000064AA +:10F8200003010100060200000000000C82848B8CA2 +:10F83000129618243048606C0000000000000000A0 +:10F8400000000000000000000000000100000001B6 +:10F85000000000010014000000000014000007D0A8 +:10F860000000000000000001000000000000000691 +:10F8700000000001FFFFFFFF0A00000064756D6DCE +:10F88000795F7373696400000000000000000000ED +:10F890000000000000000000000000000000000068 +:10F8A000303030313032303330343035303630373C +:10F8B0003038303930613062306330643065306602 +:10F8C0003130313131323133313431353136313714 +:10F8D00031383139316131623163316431653166DA +:10F8E00000000000000000028003D670000000004D +:10F8F000800255EC80025614800256588002569CB5 +:10F90000800256AA800255F4800256B6800256D074 +:10F910008002614C8003EAFD0000003F000000010E +:10F920008003EF2C8003EF4C8003EF6C000000009D +:10F9300000000000000000000000000000000000C7 +:10F940008003ECA4000000000000000000000000A4 +:10F9500000000000000000000000000000000000A7 +:10F960000000000000000000000000000000000097 +:10F970000000000000000000000000000000000087 +:10F980000000000000000000000000000000000077 +:10F990000000000000000000000000000000000067 +:10F9A0000000000000000000000000000000000057 +:10F9B0000000000000000000000000000000000047 +:10F9C0000000000000000000000000000000000037 +:10F9D0000000000000000000000000000000000027 +:10F9E0000000000000000000000000000000000017 +:10F9F0000000000000000000000000000000000007 +:10FA000000000000000000000000000000000000F6 +:10FA1000000004A800000000000000000000059C99 +:10FA20000000059C000005A4000005A4000005AC32 +:10FA3000000005AC000005B4000005B4000005BCE2 +:10FA4000000005BC000005C4000005C4000005CC92 +:10FA5000000005CC000005D4000005D4000005DC42 +:10FA6000000005DC000005E4000005E4000005ECF2 +:10FA7000000005EC000005F4000005F4000005FCA2 +:10FA8000000005FC00000604000006040000060C4F +:10FA90000000060C00000614000006140000061CFE +:10FAA0000000061C00000624000006240000062CAE +:10FAB0000000062C00000634000006340000063C5E +:10FAC0000000063C00000644000006440000064C0E +:10FAD0000000064C00000654000006540000065CBE +:10FAE0000000065C00000664000006640000066C6E +:10FAF0000000066C00000674000006740000067C1E +:10FB00000000067C00000684000006840000068CCD +:10FB10000000068C00000694000006940000069C7D +:10FB20000000069C000006A4000006A4000006AC2D +:10FB3000000006AC000006B4000006B4000006BCDD +:10FB4000000006BC000006C4000006C4000006CC8D +:10FB5000000006CC000006D4000006D4000006DC3D +:10FB6000000006DC000006E4000006E4000006ECED +:10FB7000000006EC000006F4000006F4000006FC9D +:10FB8000000006FC00000704000007040000070C4A +:10FB90000000070C00000714000007140000071CF9 +:10FBA0000000071C00000724000007240000072CA9 +:10FBB0000000072C00000734000007340000073C59 +:10FBC0000000073C00000744000007440000074C09 +:10FBD0000000074C00000754000007540000075CB9 +:10FBE0000000075C00000764000007640000076C69 +:10FBF0000000076C00000774000007740000077C19 +:10FC00000000077C00000784000007840000078CC8 +:10FC10000000078C00000794000007940000079C78 +:10FC20000000079C000007A4000007A4000007AC28 +:10FC3000000007AC000007B4000007B4000007BCD8 +:10FC4000000007BC000007C4000007C4000007CC88 +:10FC5000000007CC000007D4000007D4000007DC38 +:10FC6000000007DC000007E4000007E4000007ECE8 +:10FC7000000007EC000007F4000007F4000007FC98 +:10FC8000000007FC00000804000008040000080C45 +:10FC90000000080C00000814000008140000081CF4 +:10FCA0000000081C00000824000008240000082CA4 +:10FCB0000000082C00000834000008340000083C54 +:10FCC0000000083C00000844000008440000084C04 +:10FCD0000000084C00000854000008540000085CB4 +:10FCE0000000085C00000864000008640000086C64 +:10FCF0000000086C00000874000008740000087C14 +:10FD00000000087C00000884000008840000088CC3 +:10FD10000000088C00000894000008940000089C73 +:10FD20000000089C000008A4000008A4000008AC23 +:10FD3000000008AC000008B4000008B4000008BCD3 +:10FD4000000008BC000008C4000008C4000008CC83 +:10FD5000000008CC000008D4000008D4000008DC33 +:10FD6000000008DC000008E4000008E4000008ECE3 +:10FD7000000008EC000008F4000008F4000008FC93 +:10FD8000000008FC00000904000009040000090C40 +:10FD90000000090C00000914000009140000091CEF +:10FDA0000000091C00000924000009240000092C9F +:10FDB0000000092C00000934000009340000093C4F +:10FDC0000000093C00000944000009440000094CFF +:10FDD0000000094C00000954000009540000095CAF +:10FDE0000000095C00000964000009640000096C5F +:10FDF0000000096C00000974000009740000097C0F +:10FE00000000097C00000984000009840000098CBE +:10FE10000000098C00000994000009940002000011 +:0CFE2000FFFFFFFF0000000100007AFC63 +:040000058000000077 +:00000001FF diff --git a/firmware/libraries/WiFi/extras/binary/wifiHD_2_1.elf b/firmware/libraries/WiFi/extras/binary/wifiHD_2_1.elf new file mode 100644 index 0000000..9217d48 Binary files /dev/null and b/firmware/libraries/WiFi/extras/binary/wifiHD_2_1.elf differ diff --git a/firmware/libraries/WiFi/extras/binary/wifi_dnld.elf b/firmware/libraries/WiFi/extras/binary/wifi_dnld.elf new file mode 100644 index 0000000..11ec3dd Binary files /dev/null and b/firmware/libraries/WiFi/extras/binary/wifi_dnld.elf differ diff --git a/firmware/libraries/WiFi/extras/binary/wifi_dnld.hex b/firmware/libraries/WiFi/extras/binary/wifi_dnld.hex new file mode 100644 index 0000000..bf2c05c --- /dev/null +++ b/firmware/libraries/WiFi/extras/binary/wifi_dnld.hex @@ -0,0 +1,10470 @@ +:0200000480007A +:10000000E08F100000000000000000000000000071 +:1000100000000000000000000000000000000000E0 +:1000200000000000000000000000000000000000D0 +:1000300000000000000000000000000000000000C0 +:1000400000000000000000000000000000000000B0 +:1000500000000000000000000000000000000000A0 +:100060000000000000000000000000000000000090 +:100070000000000000000000000000000000000080 +:100080000000000000000000000000000000000070 +:100090000000000000000000000000000000000060 +:1000A0000000000000000000000000000000000050 +:1000B0000000000000000000000000000000000040 +:1000C0000000000000000000000000000000000030 +:1000D0000000000000000000000000000000000020 +:1000E0000000000000000000000000000000000010 +:1000F0000000000000000000000000000000000000 +:1001000000000000000000000000000000000000EF +:1001100000000000000000000000000000000000DF +:1001200000000000000000000000000000000000CF +:1001300000000000000000000000000000000000BF +:1001400000000000000000000000000000000000AF +:10015000000000000000000000000000000000009F +:10016000000000000000000000000000000000008F +:10017000000000000000000000000000000000007F +:10018000000000000000000000000000000000006F +:10019000000000000000000000000000000000005F +:1001A000000000000000000000000000000000004F +:1001B000000000000000000000000000000000003F +:1001C000000000000000000000000000000000002F +:1001D000000000000000000000000000000000001F +:1001E000000000000000000000000000000000000F +:1001F00000000000000000000000000000000000FF +:1002000000000000000000000000000000000000EE +:1002100000000000000000000000000000000000DE +:1002200000000000000000000000000000000000CE +:1002300000000000000000000000000000000000BE +:1002400000000000000000000000000000000000AE +:10025000000000000000000000000000000000009E +:10026000000000000000000000000000000000008E +:10027000000000000000000000000000000000007E +:10028000000000000000000000000000000000006E +:10029000000000000000000000000000000000005E +:1002A000000000000000000000000000000000004E +:1002B000000000000000000000000000000000003E +:1002C000000000000000000000000000000000002E +:1002D000000000000000000000000000000000001E +:1002E000000000000000000000000000000000000E +:1002F00000000000000000000000000000000000FE +:1003000000000000000000000000000000000000ED +:1003100000000000000000000000000000000000DD +:1003200000000000000000000000000000000000CD +:1003300000000000000000000000000000000000BD +:1003400000000000000000000000000000000000AD +:10035000000000000000000000000000000000009D +:10036000000000000000000000000000000000008D +:10037000000000000000000000000000000000007D +:10038000000000000000000000000000000000006D +:10039000000000000000000000000000000000005D +:1003A000000000000000000000000000000000004D +:1003B000000000000000000000000000000000003D +:1003C000000000000000000000000000000000002D +:1003D000000000000000000000000000000000001D +:1003E000000000000000000000000000000000000D +:1003F00000000000000000000000000000000000FD +:1004000000000000000000000000000000000000EC +:1004100000000000000000000000000000000000DC +:1004200000000000000000000000000000000000CC +:1004300000000000000000000000000000000000BC +:1004400000000000000000000000000000000000AC +:10045000000000000000000000000000000000009C +:10046000000000000000000000000000000000008C +:10047000000000000000000000000000000000007C +:10048000000000000000000000000000000000006C +:10049000000000000000000000000000000000005C +:1004A000000000000000000000000000000000004C +:1004B000000000000000000000000000000000003C +:1004C000000000000000000000000000000000002C +:1004D000000000000000000000000000000000001C +:1004E000000000000000000000000000000000000C +:1004F00000000000000000000000000000000000FC +:1005000000000000000000000000000000000000EB +:1005100000000000000000000000000000000000DB +:1005200000000000000000000000000000000000CB +:1005300000000000000000000000000000000000BB +:1005400000000000000000000000000000000000AB +:10055000000000000000000000000000000000009B +:10056000000000000000000000000000000000008B +:10057000000000000000000000000000000000007B +:10058000000000000000000000000000000000006B +:10059000000000000000000000000000000000005B +:1005A000000000000000000000000000000000004B +:1005B000000000000000000000000000000000003B +:1005C000000000000000000000000000000000002B +:1005D000000000000000000000000000000000001B +:1005E000000000000000000000000000000000000B +:1005F00000000000000000000000000000000000FB +:1006000000000000000000000000000000000000EA +:1006100000000000000000000000000000000000DA +:1006200000000000000000000000000000000000CA +:1006300000000000000000000000000000000000BA +:1006400000000000000000000000000000000000AA +:10065000000000000000000000000000000000009A +:10066000000000000000000000000000000000008A +:10067000000000000000000000000000000000007A +:10068000000000000000000000000000000000006A +:10069000000000000000000000000000000000005A +:1006A000000000000000000000000000000000004A +:1006B000000000000000000000000000000000003A +:1006C000000000000000000000000000000000002A +:1006D000000000000000000000000000000000001A +:1006E000000000000000000000000000000000000A +:1006F00000000000000000000000000000000000FA +:1007000000000000000000000000000000000000E9 +:1007100000000000000000000000000000000000D9 +:1007200000000000000000000000000000000000C9 +:1007300000000000000000000000000000000000B9 +:1007400000000000000000000000000000000000A9 +:100750000000000000000000000000000000000099 +:100760000000000000000000000000000000000089 +:100770000000000000000000000000000000000079 +:100780000000000000000000000000000000000069 +:100790000000000000000000000000000000000059 +:1007A0000000000000000000000000000000000049 +:1007B0000000000000000000000000000000000039 +:1007C0000000000000000000000000000000000029 +:1007D0000000000000000000000000000000000019 +:1007E0000000000000000000000000000000000009 +:1007F00000000000000000000000000000000000F9 +:1008000000000000000000000000000000000000E8 +:1008100000000000000000000000000000000000D8 +:1008200000000000000000000000000000000000C8 +:1008300000000000000000000000000000000000B8 +:1008400000000000000000000000000000000000A8 +:100850000000000000000000000000000000000098 +:100860000000000000000000000000000000000088 +:100870000000000000000000000000000000000078 +:100880000000000000000000000000000000000068 +:100890000000000000000000000000000000000058 +:1008A0000000000000000000000000000000000048 +:1008B0000000000000000000000000000000000038 +:1008C0000000000000000000000000000000000028 +:1008D0000000000000000000000000000000000018 +:1008E0000000000000000000000000000000000008 +:1008F00000000000000000000000000000000000F8 +:1009000000000000000000000000000000000000E7 +:1009100000000000000000000000000000000000D7 +:1009200000000000000000000000000000000000C7 +:1009300000000000000000000000000000000000B7 +:1009400000000000000000000000000000000000A7 +:100950000000000000000000000000000000000097 +:100960000000000000000000000000000000000087 +:100970000000000000000000000000000000000077 +:100980000000000000000000000000000000000067 +:100990000000000000000000000000000000000057 +:1009A0000000000000000000000000000000000047 +:1009B0000000000000000000000000000000000037 +:1009C0000000000000000000000000000000000027 +:1009D0000000000000000000000000000000000017 +:1009E0000000000000000000000000000000000007 +:1009F00000000000000000000000000000000000F7 +:100A000000000000000000000000000000000000E6 +:100A100000000000000000000000000000000000D6 +:100A200000000000000000000000000000000000C6 +:100A300000000000000000000000000000000000B6 +:100A400000000000000000000000000000000000A6 +:100A50000000000000000000000000000000000096 +:100A60000000000000000000000000000000000086 +:100A70000000000000000000000000000000000076 +:100A80000000000000000000000000000000000066 +:100A90000000000000000000000000000000000056 +:100AA0000000000000000000000000000000000046 +:100AB0000000000000000000000000000000000036 +:100AC0000000000000000000000000000000000026 +:100AD0000000000000000000000000000000000016 +:100AE0000000000000000000000000000000000006 +:100AF00000000000000000000000000000000000F6 +:100B000000000000000000000000000000000000E5 +:100B100000000000000000000000000000000000D5 +:100B200000000000000000000000000000000000C5 +:100B300000000000000000000000000000000000B5 +:100B400000000000000000000000000000000000A5 +:100B50000000000000000000000000000000000095 +:100B60000000000000000000000000000000000085 +:100B70000000000000000000000000000000000075 +:100B80000000000000000000000000000000000065 +:100B90000000000000000000000000000000000055 +:100BA0000000000000000000000000000000000045 +:100BB0000000000000000000000000000000000035 +:100BC0000000000000000000000000000000000025 +:100BD0000000000000000000000000000000000015 +:100BE0000000000000000000000000000000000005 +:100BF00000000000000000000000000000000000F5 +:100C000000000000000000000000000000000000E4 +:100C100000000000000000000000000000000000D4 +:100C200000000000000000000000000000000000C4 +:100C300000000000000000000000000000000000B4 +:100C400000000000000000000000000000000000A4 +:100C50000000000000000000000000000000000094 +:100C60000000000000000000000000000000000084 +:100C70000000000000000000000000000000000074 +:100C80000000000000000000000000000000000064 +:100C90000000000000000000000000000000000054 +:100CA0000000000000000000000000000000000044 +:100CB0000000000000000000000000000000000034 +:100CC0000000000000000000000000000000000024 +:100CD0000000000000000000000000000000000014 +:100CE0000000000000000000000000000000000004 +:100CF00000000000000000000000000000000000F4 +:100D000000000000000000000000000000000000E3 +:100D100000000000000000000000000000000000D3 +:100D200000000000000000000000000000000000C3 +:100D300000000000000000000000000000000000B3 +:100D400000000000000000000000000000000000A3 +:100D50000000000000000000000000000000000093 +:100D60000000000000000000000000000000000083 +:100D70000000000000000000000000000000000073 +:100D80000000000000000000000000000000000063 +:100D90000000000000000000000000000000000053 +:100DA0000000000000000000000000000000000043 +:100DB0000000000000000000000000000000000033 +:100DC0000000000000000000000000000000000023 +:100DD0000000000000000000000000000000000013 +:100DE0000000000000000000000000000000000003 +:100DF00000000000000000000000000000000000F3 +:100E000000000000000000000000000000000000E2 +:100E100000000000000000000000000000000000D2 +:100E200000000000000000000000000000000000C2 +:100E300000000000000000000000000000000000B2 +:100E400000000000000000000000000000000000A2 +:100E50000000000000000000000000000000000092 +:100E60000000000000000000000000000000000082 +:100E70000000000000000000000000000000000072 +:100E80000000000000000000000000000000000062 +:100E90000000000000000000000000000000000052 +:100EA0000000000000000000000000000000000042 +:100EB0000000000000000000000000000000000032 +:100EC0000000000000000000000000000000000022 +:100ED0000000000000000000000000000000000012 +:100EE0000000000000000000000000000000000002 +:100EF00000000000000000000000000000000000F2 +:100F000000000000000000000000000000000000E1 +:100F100000000000000000000000000000000000D1 +:100F200000000000000000000000000000000000C1 +:100F300000000000000000000000000000000000B1 +:100F400000000000000000000000000000000000A1 +:100F50000000000000000000000000000000000091 +:100F60000000000000000000000000000000000081 +:100F70000000000000000000000000000000000071 +:100F80000000000000000000000000000000000061 +:100F90000000000000000000000000000000000051 +:100FA0000000000000000000000000000000000041 +:100FB0000000000000000000000000000000000031 +:100FC0000000000000000000000000000000000021 +:100FD0000000000000000000000000000000000011 +:100FE0000000000000000000000000000000000001 +:100FF00000000000000000000000000000000000F1 +:1010000000000000000000000000000000000000E0 +:1010100000000000000000000000000000000000D0 +:1010200000000000000000000000000000000000C0 +:1010300000000000000000000000000000000000B0 +:1010400000000000000000000000000000000000A0 +:101050000000000000000000000000000000000090 +:101060000000000000000000000000000000000080 +:101070000000000000000000000000000000000070 +:101080000000000000000000000000000000000060 +:101090000000000000000000000000000000000050 +:1010A0000000000000000000000000000000000040 +:1010B0000000000000000000000000000000000030 +:1010C0000000000000000000000000000000000020 +:1010D0000000000000000000000000000000000010 +:1010E0000000000000000000000000000000000000 +:1010F00000000000000000000000000000000000F0 +:1011000000000000000000000000000000000000DF +:1011100000000000000000000000000000000000CF +:1011200000000000000000000000000000000000BF +:1011300000000000000000000000000000000000AF +:10114000000000000000000000000000000000009F +:10115000000000000000000000000000000000008F +:10116000000000000000000000000000000000007F +:10117000000000000000000000000000000000006F +:10118000000000000000000000000000000000005F +:10119000000000000000000000000000000000004F +:1011A000000000000000000000000000000000003F +:1011B000000000000000000000000000000000002F +:1011C000000000000000000000000000000000001F +:1011D000000000000000000000000000000000000F +:1011E00000000000000000000000000000000000FF +:1011F00000000000000000000000000000000000EF +:1012000000000000000000000000000000000000DE +:1012100000000000000000000000000000000000CE +:1012200000000000000000000000000000000000BE +:1012300000000000000000000000000000000000AE +:10124000000000000000000000000000000000009E +:10125000000000000000000000000000000000008E +:10126000000000000000000000000000000000007E +:10127000000000000000000000000000000000006E +:10128000000000000000000000000000000000005E +:10129000000000000000000000000000000000004E +:1012A000000000000000000000000000000000003E +:1012B000000000000000000000000000000000002E +:1012C000000000000000000000000000000000001E +:1012D000000000000000000000000000000000000E +:1012E00000000000000000000000000000000000FE +:1012F00000000000000000000000000000000000EE +:1013000000000000000000000000000000000000DD +:1013100000000000000000000000000000000000CD +:1013200000000000000000000000000000000000BD +:1013300000000000000000000000000000000000AD +:10134000000000000000000000000000000000009D +:10135000000000000000000000000000000000008D +:10136000000000000000000000000000000000007D +:10137000000000000000000000000000000000006D +:10138000000000000000000000000000000000005D +:10139000000000000000000000000000000000004D +:1013A000000000000000000000000000000000003D +:1013B000000000000000000000000000000000002D +:1013C000000000000000000000000000000000001D +:1013D000000000000000000000000000000000000D +:1013E00000000000000000000000000000000000FD +:1013F00000000000000000000000000000000000ED +:1014000000000000000000000000000000000000DC +:1014100000000000000000000000000000000000CC +:1014200000000000000000000000000000000000BC +:1014300000000000000000000000000000000000AC +:10144000000000000000000000000000000000009C +:10145000000000000000000000000000000000008C +:10146000000000000000000000000000000000007C +:10147000000000000000000000000000000000006C +:10148000000000000000000000000000000000005C +:10149000000000000000000000000000000000004C +:1014A000000000000000000000000000000000003C +:1014B000000000000000000000000000000000002C +:1014C000000000000000000000000000000000001C +:1014D000000000000000000000000000000000000C +:1014E00000000000000000000000000000000000FC +:1014F00000000000000000000000000000000000EC +:1015000000000000000000000000000000000000DB +:1015100000000000000000000000000000000000CB +:1015200000000000000000000000000000000000BB +:1015300000000000000000000000000000000000AB +:10154000000000000000000000000000000000009B +:10155000000000000000000000000000000000008B +:10156000000000000000000000000000000000007B +:10157000000000000000000000000000000000006B +:10158000000000000000000000000000000000005B +:10159000000000000000000000000000000000004B +:1015A000000000000000000000000000000000003B +:1015B000000000000000000000000000000000002B +:1015C000000000000000000000000000000000001B +:1015D000000000000000000000000000000000000B +:1015E00000000000000000000000000000000000FB +:1015F00000000000000000000000000000000000EB +:1016000000000000000000000000000000000000DA +:1016100000000000000000000000000000000000CA +:1016200000000000000000000000000000000000BA +:1016300000000000000000000000000000000000AA +:10164000000000000000000000000000000000009A +:10165000000000000000000000000000000000008A +:10166000000000000000000000000000000000007A +:10167000000000000000000000000000000000006A +:10168000000000000000000000000000000000005A +:10169000000000000000000000000000000000004A +:1016A000000000000000000000000000000000003A +:1016B000000000000000000000000000000000002A +:1016C000000000000000000000000000000000001A +:1016D000000000000000000000000000000000000A +:1016E00000000000000000000000000000000000FA +:1016F00000000000000000000000000000000000EA +:1017000000000000000000000000000000000000D9 +:1017100000000000000000000000000000000000C9 +:1017200000000000000000000000000000000000B9 +:1017300000000000000000000000000000000000A9 +:101740000000000000000000000000000000000099 +:101750000000000000000000000000000000000089 +:101760000000000000000000000000000000000079 +:101770000000000000000000000000000000000069 +:101780000000000000000000000000000000000059 +:101790000000000000000000000000000000000049 +:1017A0000000000000000000000000000000000039 +:1017B0000000000000000000000000000000000029 +:1017C0000000000000000000000000000000000019 +:1017D0000000000000000000000000000000000009 +:1017E00000000000000000000000000000000000F9 +:1017F00000000000000000000000000000000000E9 +:1018000000000000000000000000000000000000D8 +:1018100000000000000000000000000000000000C8 +:1018200000000000000000000000000000000000B8 +:1018300000000000000000000000000000000000A8 +:101840000000000000000000000000000000000098 +:101850000000000000000000000000000000000088 +:101860000000000000000000000000000000000078 +:101870000000000000000000000000000000000068 +:101880000000000000000000000000000000000058 +:101890000000000000000000000000000000000048 +:1018A0000000000000000000000000000000000038 +:1018B0000000000000000000000000000000000028 +:1018C0000000000000000000000000000000000018 +:1018D0000000000000000000000000000000000008 +:1018E00000000000000000000000000000000000F8 +:1018F00000000000000000000000000000000000E8 +:1019000000000000000000000000000000000000D7 +:1019100000000000000000000000000000000000C7 +:1019200000000000000000000000000000000000B7 +:1019300000000000000000000000000000000000A7 +:101940000000000000000000000000000000000097 +:101950000000000000000000000000000000000087 +:101960000000000000000000000000000000000077 +:101970000000000000000000000000000000000067 +:101980000000000000000000000000000000000057 +:101990000000000000000000000000000000000047 +:1019A0000000000000000000000000000000000037 +:1019B0000000000000000000000000000000000027 +:1019C0000000000000000000000000000000000017 +:1019D0000000000000000000000000000000000007 +:1019E00000000000000000000000000000000000F7 +:1019F00000000000000000000000000000000000E7 +:101A000000000000000000000000000000000000D6 +:101A100000000000000000000000000000000000C6 +:101A200000000000000000000000000000000000B6 +:101A300000000000000000000000000000000000A6 +:101A40000000000000000000000000000000000096 +:101A50000000000000000000000000000000000086 +:101A60000000000000000000000000000000000076 +:101A70000000000000000000000000000000000066 +:101A80000000000000000000000000000000000056 +:101A90000000000000000000000000000000000046 +:101AA0000000000000000000000000000000000036 +:101AB0000000000000000000000000000000000026 +:101AC0000000000000000000000000000000000016 +:101AD0000000000000000000000000000000000006 +:101AE00000000000000000000000000000000000F6 +:101AF00000000000000000000000000000000000E6 +:101B000000000000000000000000000000000000D5 +:101B100000000000000000000000000000000000C5 +:101B200000000000000000000000000000000000B5 +:101B300000000000000000000000000000000000A5 +:101B40000000000000000000000000000000000095 +:101B50000000000000000000000000000000000085 +:101B60000000000000000000000000000000000075 +:101B70000000000000000000000000000000000065 +:101B80000000000000000000000000000000000055 +:101B90000000000000000000000000000000000045 +:101BA0000000000000000000000000000000000035 +:101BB0000000000000000000000000000000000025 +:101BC0000000000000000000000000000000000015 +:101BD0000000000000000000000000000000000005 +:101BE00000000000000000000000000000000000F5 +:101BF00000000000000000000000000000000000E5 +:101C000000000000000000000000000000000000D4 +:101C100000000000000000000000000000000000C4 +:101C200000000000000000000000000000000000B4 +:101C300000000000000000000000000000000000A4 +:101C40000000000000000000000000000000000094 +:101C50000000000000000000000000000000000084 +:101C60000000000000000000000000000000000074 +:101C70000000000000000000000000000000000064 +:101C80000000000000000000000000000000000054 +:101C90000000000000000000000000000000000044 +:101CA0000000000000000000000000000000000034 +:101CB0000000000000000000000000000000000024 +:101CC0000000000000000000000000000000000014 +:101CD0000000000000000000000000000000000004 +:101CE00000000000000000000000000000000000F4 +:101CF00000000000000000000000000000000000E4 +:101D000000000000000000000000000000000000D3 +:101D100000000000000000000000000000000000C3 +:101D200000000000000000000000000000000000B3 +:101D300000000000000000000000000000000000A3 +:101D40000000000000000000000000000000000093 +:101D50000000000000000000000000000000000083 +:101D60000000000000000000000000000000000073 +:101D70000000000000000000000000000000000063 +:101D80000000000000000000000000000000000053 +:101D90000000000000000000000000000000000043 +:101DA0000000000000000000000000000000000033 +:101DB0000000000000000000000000000000000023 +:101DC0000000000000000000000000000000000013 +:101DD0000000000000000000000000000000000003 +:101DE00000000000000000000000000000000000F3 +:101DF00000000000000000000000000000000000E3 +:101E000000000000000000000000000000000000D2 +:101E100000000000000000000000000000000000C2 +:101E200000000000000000000000000000000000B2 +:101E300000000000000000000000000000000000A2 +:101E40000000000000000000000000000000000092 +:101E50000000000000000000000000000000000082 +:101E60000000000000000000000000000000000072 +:101E70000000000000000000000000000000000062 +:101E80000000000000000000000000000000000052 +:101E90000000000000000000000000000000000042 +:101EA0000000000000000000000000000000000032 +:101EB0000000000000000000000000000000000022 +:101EC0000000000000000000000000000000000012 +:101ED0000000000000000000000000000000000002 +:101EE00000000000000000000000000000000000F2 +:101EF00000000000000000000000000000000000E2 +:101F000000000000000000000000000000000000D1 +:101F100000000000000000000000000000000000C1 +:101F200000000000000000000000000000000000B1 +:101F300000000000000000000000000000000000A1 +:101F40000000000000000000000000000000000091 +:101F50000000000000000000000000000000000081 +:101F60000000000000000000000000000000000071 +:101F70000000000000000000000000000000000061 +:101F80000000000000000000000000000000000051 +:101F90000000000000000000000000000000000041 +:101FA0000000000000000000000000000000000031 +:101FB0000000000000000000000000000000000021 +:101FC0000000000000000000000000000000000011 +:101FD0000000000000000000000000000000000001 +:101FE00000000000000000000000000000000000F1 +:101FF00000000000000000000000000000000000E1 +:08200000481F0000800026309B +:10200800D40148D8E3B80001D553FE6A100030194E +:102018007508F1D9D202F5480040F01F0008F01FFA +:102028000008D503E06CF980EA1C0337F01F0005AF +:10203800D8020000800032008000259880002B68BC +:10204800800026D4EBCD40FC169518961492129B6E +:10205800580AE08A003B0B893008F0091800C520AF +:102068003009129A2FF9EA090708F4081800CFB1C5 +:102078001232E08900493002EDBB0001C26133032E +:10208800EDBB0000C2613004C0A85806C3806C09CB +:10209800B28C6C082FF88D082FF52FF40B8C580C88 +:1020A800CF515802E08A000F04975806C2406C09C5 +:1020B800B2836C082FF88D0820175807FE99FFF790 +:1020C8000404089CE3CD80FC3203EDBB0000CDC0C6 +:1020D8005802FE9AFFDA04975806C1706C09B28359 +:1020E8006C082FF88D0820175807FE99FFF70494FD +:1020F8003002CD5B069CF01F0007CDFBF01F0005EA +:10210800CCCB30091212CB9B069CF01F0002CECB21 +:1021180080002680EBCD40FC203DFACEFFD81497F6 +:102128007C037C1A10941892169E580BC4405809C8 +:102138005F1858A75F091268C34130063008FB686A +:10214800000B580EC430F4CC003AFAC9FFF5FC076E +:102158000D0A16985898F1DCE9082D0812F8149E13 +:10216800580ACF6112955806C0C10C970699089A6B +:102178000A9B049CF01F001A0E0C2FDDE3CD80FC97 +:102188005804C140EDB30001C1115802C230640ABD +:1021980032D9B48964082FF8850820143017CE7B0B +:1021A800580BCCC45C3E3016CCAB129532D83007F5 +:1021B8000AF8CDDB109A3308BA9B0699BA881A9B9D +:1021C800F01F00072FDDE3CD80FCFAC9FFF512955B +:1021D800CCBB32DCF01F0003CE1B00008000204C7B +:1021E80080002680D431201D189516971496178CD8 +:1021F800580CE08000B43004325132D033033092AE +:10220800E20C1800C1705805C6E06A09B28C6A0869 +:102218002FF88B082FF42FF70F8C580CCF21580567 +:10222800EBF91000F9B80100F3F81E00089C2FFD27 +:10223800D8322FF70F8A580ACF30E20A1800C500A3 +:10224800E00A1800F9BC0100F7B700FFF9BC00016B +:10225800EFFA0800C0482FF7A1BC0F8AE60A180059 +:10226800CFB0F4C80030E4081800E08B0063300BEE +:10227800F60B0028F40800182FF7F0CB00300F8A6F +:10228800F4C80030E4081800FE98FFF43738F00A64 +:102298001800C2C03648F00A1800C3403708F00AD0 +:1022A8001800C3E03788F00A1800C4503588F00ACF +:1022B8001800C4903758F00A1800C4803638F00A5D +:1022C8001800CAA16C08BA8830081899169ABA98E2 +:1022D8001A9B0A9C2FC6F01F00231804C9DB325C26 +:1022E8005805C941F01F0020C96B0D081899169AA6 +:1022F8000A9C49EB5808F00B1710F01F001A180435 +:10230800C8BB361916981AD930AA1ADC30196C0BC2 +:102318000A9C2FC6F01F00162FED1804C7DB3619CC +:10232800308A1AD916981ADA30096C0B310ACF1B81 +:10233800300BCADB169836191AD9310A1ADC30095B +:102348006C0BCE7B16983419CF8B361916981AD980 +:1023580030AA1ADC30096C0BCDCB1894C61B0000D0 +:102368008000204C80002680800034008000211CE2 +:10237800D401189BFACAFFFC300CF01F0002D802E7 +:10238800800021ECEBCD40E014951696A98CF01F47 +:1023980000095805C0A03007F01F0007EC070B0C18 +:1023A8002FF70E35FE9BFFFAF01F0004E3CD80E007 +:1023B80080002E7C80002F3080002D14EBCD40E073 +:1023C80014951696A98CF01F00095805C0A030076F +:1023D800EC07070C2FF7F01F00060E35FE9BFFFADF +:1023E800F01F0004E3CD80E080002D9C80002E20AB +:1023F80080002CC8EBCD4040204D49BCF8E80008CF +:10240800FAE90008F8EA0000498CFAEB0000304BC2 +:10241800F01F00171A9BFE7C2800F01F00163009D9 +:10242800FE7C2800129A129BF01F0013FE7C2800E5 +:10243800F01F0012302CF01F00121A96204DECE805 +:102448000008FAE90008ECEA0000E06CF980EA1CF0 +:102458000337FAEB0000F01F000B2FCD2FCDE3CD93 +:1024680080400000800034088000341880002C4030 +:1024780080002874800028B480002A2480002C70F2 +:1024880080002FF8EBCD40F8F01F0033F01F003329 +:102498004B3CF01F0034F01F00343018F00C1800CB +:1024A800C5204B2CF01F002FE06701004B0C3006B5 +:1024B800F01F002C4AF40E95C088E2675A4C0C179E +:1024C800E0470100EA0717B0E806000B0C9C0E9ADB +:1024D8000E06F01F0029E2465A4BFE98FFF0E0670F +:1024E80001004A6C3006F01F001F4A550E930E9AE1 +:1024F8004A3B0C9CF01F0023E80600093008EA0854 +:10250800070B138AF40B1800C1312FF82FF9103775 +:10251800FE9BFFF70E06E2465A4BE08B0019E26776 +:102528005A4C0C17E0470100E60717B0CE1BEC0821 +:1025380000081ADA494C1ADB1AD8F01F000A2FDDF6 +:10254800E3CF80F8491CF01F0007CAFB490CF01FB5 +:102558000005CF7B80002008800023FC80028E6C61 +:102568008000237880002FA480028E8480028E8CC5 +:1025780080003420800023C480028EAC0000000854 +:102588008000238C80028EC880028E7C80028EF4AC +:10259800EBCD4040303AE06B1B00EA1B00B7FE7CF5 +:1025A8000C00F01F001A30083019109B308AFE7C8E +:1025B8000C0031061AD6F01F001630083019109B8F +:1025C800129AFE7C0C00F01F0013300BFE7C0C00EE +:1025D800F01F0011FE7C0C00F01F00103009FE7C7B +:1025E8000C001AD9129B1AD91298129AF01F000CD3 +:1025F800301CF01F000C302BFE7C0C00F01F000A72 +:102608002FDDE3CD8040000080002B0C80002AB035 +:1026180080002AD280002AEA80002AF880002A6AEC +:1026280080002C8A80002B0248CD48D0E3B00001FE +:10263800D55348C048C10230C06248C2A505A1248C +:102648000230CFD348A048B10230C0623002300314 +:10265800A1220230CFE3488F000100008000320041 +:10266800000000080000000880028FC00000000879 +:10267800000001E88000248CD401189BFE7C18001F +:10268800F01F0002D802000080002742EBCD404036 +:10269800203D30083049FB680008BA383088500CB3 +:1026A8001696BAC8302BBAD9486CF01F00070C9A96 +:1026B8001A9BFE7C1800F01F00052FDDE3CD80403B +:1026C80080028F1C80002C40800027ACD401189B0E +:1026D800E06CE100F01F0002D802000080002694A0 +:1026E800D401F6081503A56B143BF9BE0810F00BCE +:1026F80017B0F9BE0B08F6091601F20A0039F20BF9 +:102708000D08109AF00B1603F6C80001E048FFFE0A +:10271800E08B00147818E8690000E418FFF7E01867 +:10272800FECF590EF9B9000010499919F1DAC00322 +:10273800F7E811089988D80ADA0A58ABC0F0E069B6 +:10274800270F7858EDB80001C051F1DBC00999781E +:102758005EFD5809C1002019CF5BE069270F785842 +:10276800EDB80001C04130D89978CEAB5809C030D7 +:102778002019CF6B5EFEE1B80000EDB80010C0E094 +:10278800D3033FF899387858D503300899189998A1 +:1027980099A8EA69610C99095EFC3FF8993878585C +:1027A800CF5BD703D421169714951896F01F002EE7 +:1027B8005807C2000FC93048F0091800E088001B0C +:1027C8003094E8091800E08B00160FD93078F0092A +:1027D8001800E08B00108E39E0680101F00919003B +:1027E800E08B0009EF3900083038F0091800E0885C +:1027F8000003DA2A0A9A6E0B0C9CF01F001C581C66 +:10280800CF900FC9E8091800C2906C182059F1E957 +:1028180010688D18EF3900086C1A0FD8A978F1E9FB +:1028280010E814488D1830288E39F0091900E0880E +:1028380000106C18ADB88D188EB920298DA96C18A8 +:10284800E018FFF08D183509300C8D09D8226C1866 +:102858005C79F1E910C88D18CF3B6C18B1B88D18A8 +:10286800CDAB00008000277E800026E8D401301818 +:10287800F739000DF0091800E0880005302E1C9C7F +:10288800D802E068008030199908300A7818F73BB8 +:10289800000D149EF1D9D00130F9F1DBD081F1DAC5 +:1028A800D0E1F1D9D20499181C9CD802EBCD408014 +:1028B8003018149E1297F00A18005FBAF00B18002F +:1028C8005FB91449C0B17818F1DBD021F1DED041ED +:1028D800F1D7D3089918E3CF8080302CE3CD8080DE +:1028E800D4017818189EEA18000F9918781CE21C71 +:1028F8000004C08030E8F00B1800E0880013302C8A +:10290800D8023038F00B1800FE9BFFFB7C1AF6C883 +:10291800FFF03019F20809495CD914699D19D802E9 +:102928007C19F6081510300CEA18FFF0E818FFFFBC +:1029380012689D18D802E0692710C0485809C0E0FD +:1029480020197848EDB80009CFA17818EA18000FC7 +:102958009918FC19010099095EFD5EFFEBCD40FC5A +:1029680030321893F73C000CE40C1800E08B000997 +:10297800F735000B3014E8051800E0880005302C06 +:10298800E3CD80FCF73E00083078F00E1800FE9882 +:10299800FFF83108F00E1800FE9BFFF37618F009D7 +:1029A8001601F4090009F2080D06ECCA0001E04A14 +:1029B80000FEFE9BFFE65806CE35FCC90008F80865 +:1029C8001601300AEC1C0001F5D8D001178EF5DC91 +:1029D800D021F7380009F5D5D061F5D9D084F73979 +:1029E800000AF5D6D108F5D8D208F5D9D308E80EEB +:1029F8001800C0F0C0B33028F00E1800C0D0E40EA4 +:102A08001800CBE187FAE3CF80FC87CAE3CF80FCCC +:102A180087DAE3CF80FC87EAE3CF80FC3018990897 +:102A28005EFCE0692710C0485809C0A02019784802 +:102A3800EDB80001CFA1F1DBC01099385EFD5EFF53 +:102A4800E0692710C0485809C0C020197848E21822 +:102A58000201E0480201CF817828300CB6085EFCFC +:102A68005EFFEBCD40E0FAC5FFF018976A166A0ED4 +:102A7800EDD6C003FDDEC001300CF9D6D003F9DE77 +:102A8800D0E1F9D6D103F9DED1E1F9DAD203F9DBE5 +:102A9800D2E1F9D8D303F9D9D3E18F1C6F58EDB837 +:102AA8000005CFD1E3CD80E0EBCD4040300E40268D +:102AB8002F8BFDD8D021FDD9D104FDDAD204FDD663 +:102AC800D306F80B092EE3CD80402F8BF5E91019BA +:102AD800F3E81029F80B0328F1D9D043F80B09289B +:102AE8005EFC2F8BF80B0328A1A8F80B09285EFCC5 +:102AF8007958EDB80000CFD15EFC7808F1DBD00240 +:102B080099085EFCEC5BBB9FE08B0018304B78A803 +:102B1800F1DBD00399A878A9F3DAD10399A9780849 +:102B2800A3A899087958EDB80007CFD178083019CB +:102B3800F1D9D00299085EFCE068C6BFEA18002DFA +:102B4800103BE088000CE0681200EA18007A103B9D +:102B5800F9BB0306F9BB0207CDBB305BCD9BC008B0 +:102B6800EBCD40C048E8E3B8000148E9300C7206F4 +:102B780048DE48E9FE770800720B580BC070721ADD +:102B8800300814AE2FF81638CFD3EE0C09262F894B +:102B98002FFC594CCF21E3CD80C0000080003200CB +:102BA8008000333C80002B6680028F20E068008321 +:102BB800FE790800F00C010CF20C032AF4C8FFC0DF +:102BC800F208032C580C5E0CF80812004859F0085B +:102BD800111FF20A0039721AF408032C5EFC000077 +:102BE80080028F20F8081605F0091508E029F00082 +:102BF800581BC150C0823018F00C094C936C93AC30 +:102C0800932C5EFD582BC110583BC0205EFF301836 +:102C1800F00C094C935C939C932C5EFDF60C094CCC +:102C2800935C93AC932C5EFD3018F00C094C936CBC +:102C3800939C932C5EFDD703D42118961694580BB9 +:102C4800C0F030050A970D9B0D8C2FF72FE6F01F6B +:102C5800000618450E34FE9BFFF80A9CD8221695EC +:102C6800CFDB000080002BEC3018F00C0948A59C45 +:102C7800A96CE02CF000F9480054F9480044991870 +:102C88005EFCFE6914007208F1DCD0C193085EFC9A +:102C9800D401580BC091F8CBFFFEFE7C28005C5B8A +:102CA800F01F0006D802F8CBFFFEFE7C28005C5B14 +:102CB800F01F0003D80200008000293E800028E8A9 +:102CC800EBCD408048E76E0CF1DCC008C0D0300B7B +:102CD800FE7C2800F01F000B6E08F0CCFFFF8F0C65 +:102CE800F1DCC008CF51F9DCC288300BF01F0006B8 +:102CF80030194868B089E3CD80800000000001E009 +:102D080080002A2A80002C98000001E4D401486839 +:102D1800300B700CF9DCC288F01F000430094848F9 +:102D2800B089D802000001E080002C98000001E47E +:102D3800EBCD40C0201D301B49366C0CF9DCC28835 +:102D4800F01F0012E06B00D7FE7C2800F01F001077 +:102D5800FAC7FFFEE06B00FFFE7C2800F01F000CA6 +:102D68000E9BFE7C2800F01F000B9A98EDB8000718 +:102D7800CF216C0C300BF9DCC288F01F00042FFD4A +:102D8800E3CD80C0000001E080002C9880002A2A52 +:102D980080002A48EBCD40C0201D49B6A96C8D0C97 +:102DA80049A730080F89F0091800C030F01F001833 +:102DB80030086C0CAE88F9DCC288301BF01F001597 +:102DC800E06B0082FE7C2800F01F00136C08F7D827 +:102DD800C008F1D8C10CFAC6FFFCF7E8109BFE7CCE +:102DE80028000CDBB18BF01F000C0DABFE7C28001B +:102DF800F01F00090DBBFE7C2800F01F00072FFD07 +:102E0800E3CF90C0000001E0000001E480002D380D +:102E180080002C9880002A2AEBCD40E049151896AE +:102E28000B893008F0091800C16148F70C9BFE7C3B +:102E38002800F01F000E6E08F0CCFFFF8F0CF7DCA7 +:102E4800C008C071F9DCC288F01F00093018AA88D0 +:102E5800E3CF90E048476E0CA98CF01F0006CE7BAC +:102E6800000001E4000001E080002A2A80002C987C +:102E780080002D9CEBCD40C0201D4A76A96C8D0C9E +:102E88004A6730080F89F0091800C030F01F002485 +:102E980030086C0CAE88F9DCC288301BF01F0021AA +:102EA800E06B00D2FE7C2800F01F001F6C08F7D8EA +:102EB800C008F1D8C10CFAC6FFFCF7E8109BFE7CED +:102EC80028000CDBB18BF01F00180DABFE7C28002E +:102ED800F01F00150DBBFE7C2800F01F0013E06BEF +:102EE80000FFFE7C2800F01F0010E06B00FFFE7C56 +:102EF8002800F01F000DE06B00FFFE7C2800F01F8B +:102F0800000AE06B00FFFE7C2800F01F00072FFD81 +:102F1800E3CF90C0000001E0000001E480002D38FC +:102F280080002C9880002A2AEBCD40C0201D4966DD +:102F380030090D88F2081800C1F14947E06B00FF1D +:102F4800FE7C2800F01F0012FACBFFFEFE7C280052 +:102F5800F01F00106E08F0CCFFFF8F0CF7DCC008E4 +:102F6800C071F9DCC288F01F000C3018AC881BBC9B +:102F78002FFDE3CD80C04857AC896E0CA98CF01F9B +:102F88000007CDDB000001E4000001E080002A2AF0 +:102F980080002A4880002C9880002E7CEBCD404091 +:102FA800201D3008FAC6FFFC301B0CE8300CF01F5F +:102FB800000EE06B00D7FE7C2800F01F000CE06BD1 +:102FC80000FFFE7C2800F01F00090C9BFE7C2800F7 +:102FD800F01F0007300B169CF01F00032FFDE3CFF6 +:102FE8009040000080002C9880002A2A80002A48FF +:102FF800EBCD40E03028FAC7FFF01896AE88109560 +:10300800C028AE880C9A0E9BFE7C2800F01F000892 +:10301800C0C10F882FF85C58EA081800FE98FFF323 +:103028004848B08CE3CF90E0E3CF80E0800029648B +:04303800000001E4AF +:10320000C0080000C0080000C0080000C00800009E +:10321000C0080000C0080000C0080000C00800008E +:10322000C0080000C0080000C0080000C00800007E +:10323000C0080000C0080000C0080000C00800006E +:10324000C0080000C00800000000000000000000EE +:10325000C0080000000000000000000000000000A6 +:10326000C008000000000000000000000000000096 +:10327000C008000000000000000000000000000086 +:10328000000000000000000000000000000000003E +:10329000000000000000000000000000000000002E +:1032A000000000000000000000000000000000001E +:1032B000000000000000000000000000000000000E +:1032C00000000000000000000000000000000000FE +:1032D00000000000000000000000000000000000EE +:1032E00000000000000000000000000000000000DE +:1032F00000000000000000000000000000000000CE +:10330000C0080000300CF01F0012580CF80F171006 +:10331000D603301CF01F000E580CF80F1710D60300 +:10332000302CF01F000B580CF80F1710D603303C50 +:10333000F01F0007580CF80F1710D6030000010407 +:103340004000011280000120C000012E80002BB43B +:10335000000000000000000000000000000000006D +:10336000000000000000000000000000000000005D +:10337000000000000000000000000000000000004D +:10338000000000000000000000000000000000003D +:10339000000000000000000000000000000000002D +:1033A000000000000000000000000000000000001D +:1033B000000000000000000000000000000000000D +:1033C00000000000000000000000000000000000FD +:1033D00000000000000000000000000000000000ED +:1033E00000000000000000000000000000000000DD +:1033F00000000000000000000000000000000000CD +:10340000286E756C6C2900000200000000B71B00DC +:1034100008000001000100000F011101100113015B +:103420001061040000000000300000001061040082 +:103430003861040000000000020000002061040068 +:10344000306104000000000004000000306104004E +:1034500000000000000000000000000010610400F7 +:103460003C0000000000EEEEEEEE18F09FE518F0D4 +:103470009FE518F09FE518F09FE50000A0E118F027 +:103480009FE518F09FE544000000B4080000B40870 +:103490000000B4080000B408000000000000E408C8 +:1034A00000003C003C00000000090000000000009B +:1034B00000000FE11F00C0E3130080E3C00080E3C1 +:1034C00000F02FE11CF09FE53D0200EB5A0200EBFB +:1034D0008D0200EB01008FE210FF2FE141F0DEFBD7 +:1034E00001F0DCFD3C0078000000FEE700005C001D +:1034F00000007847C046010000EA7847C046170040 +:1035000000EA8C119FE5002091E500300FE1841165 +:103510009FE5FD20A1E880019FE580219FE5012036 +:1035200042E00D0040E03C00B4000000020050E129 +:10353000280000AA68019FE50D0050E1020000BAD2 +:10354000042010E4042081E4FAFFFFEA58119FE50B +:1035500058019FE5000081E53C119FE550019FE582 +:10356000000081E51EFF2FE13C00F0000000481143 +:103570009FE5000091E524119FE5000081E52C11F5 +:103580009FE538019FE5000081E51EFF2FE17402F1 +:1035900000EB10019FE528119FE5042091E4042031 +:1035A00000E404219FE5020051E13C002C010000F1 +:1035B000FAFFFF1AF0109FE5FD20B1E803F02FE1BC +:1035C000E0109FE5002081E5E8109FE5F4209FE5ED +:1035D000002081E5021080E2000020E0010040E2CE +:1035E00011FF2FE101008FE210FF2FE13C00680185 +:1035F000000001F09CF87847000001008FE210FF06 +:103600002FE101F094F87847000003002DE9001045 +:103610000FE1001080E5B8109FE5041080E5001070 +:10362000A0E1100080E2FC1FA0E80020A0E13C0027 +:10363000A40100000130A0E10300BDE8080083E51B +:103640000C1083E5D300A0E300F021E10060A2E8C4 +:1036500000104FE1041082E4D200A0E300F021E169 +:103660000060A2E800104FE1041082E4D100A0E362 +:103670003C00E001000000F021E1007FA2E8001022 +:103680004FE1041082E4D700A0E300F021E10060E4 +:10369000A2E800104FE1041082E4DB00A0E300F098 +:1036A00021E10060A2E800104FE1001082E5000077 +:1036B00093E53C001C02000000F02FE11EFF2FE10B +:1036C000200000000403000020EE0100D8030000E9 +:1036D0000000000018F09FE5100100000803000042 +:1036E000EEEEEEEE2403000020020000B0B5041C54 +:1036F000631C0B4D3C005802000001D16C6910E0C6 +:1037000000F06CFB0948FFF70CFFEC60084A5168B9 +:1037100050688842FCD00220287001218A2001F0E4 +:1037200012F8201CB0BD3000070051020000000359 +:103730000700B0B5051C3C0094020000002400F016 +:1037400050FB1448FFF7F0FE13491448C1600121F3 +:10375000134A490391601349CA7808239A43CA70EF +:10376000CA7804231A43CA706B1C0DD00E4B5A68DA +:1037700059689142FCD0BE213C00D0020000197370 +:10378000197A112291431972197AC907FCD40221BE +:103790000170FFF7D0FE201CB0BD91020000FFFFBA +:1037A000FF003000070000100700000007000003C2 +:1037B000070000000000000000003C000C030000B7 +:1037C00000000000000000000000000000000000F9 +:1037D00000000000000000000000000000000000E9 +:1037E00000000000000000000000000000000000D9 +:1037F0000000000000000000000000003C00480342 +:1038000000000000000000000000000000000000B8 +:1038100000000000000000000000000000000000A8 +:103820000000000000000000000000000000000098 +:1038300000000000000000000000000000003C004C +:1038400084030000000000000000000000000000F1 +:103850000000000000000000000000000000000068 +:103860000000000000000000000000000000000058 +:103870000000000000000000000000000000000048 +:103880003C00C00300000000000000000000000039 +:1038900000000000000000000000000000000047E1 +:1038A000084710471847204728473047384710B582 +:1038B000041C101C00F023F903C410BC08BC1847FA +:1038C00000003C00FC03000010B4042A0ED3031CCB +:1038D0000B439B070AD108C810C9A34202D1043A7E +:1038E000042AF8D2A34201D004380439002A02D1B4 +:1038F000002010BC7047D30701D5013205E00378E2 +:103900000C7801313C00380400000130A34207D19B +:1039100003780C7801310130A34201D1023AF1D190 +:10392000181BE9E70000784700000020A0E304002E +:1039300051E30800003A03C010E20D00000A04C081 +:103940006CE202005CE33C00740400000120C0E46F +:103950000120C0A40120C0C40C1041E0060000EA10 +:1039600081CFB0E10120C0240120C0240120C04447 +:103970001EFF2FE1784700000020A0E300402DE962 +:103980000230A0E102C0A0E13C00B004000002E06F +:10399000A0E1201051E20C50A0280C50A0282010CB +:1039A0005122FBFFFF2A011EB0E10C50A0280C00A1 +:1039B000A0480040BDE80111B0E1042080241EFFB2 +:1039C0002F010120C0440120C0443C00EC04000051 +:1039D000400411E30120C0141EFF2FE178470000CE +:1039E000030052E33E00009A03C010E20800000A00 +:1039F0000130D1E402005CE30C2082E001C0D194EC +:103A00000130C0E40130D134042042E23C002805FA +:103A1000000001C0C0940130C034033011E21E0028 +:103A2000000A042052E22F00003A03C031E70200EE +:103A300053E30800000A0F00008A2C34A0E104C000 +:103A4000B1E5042052E20C3C83E1043080E43C0008 +:103A500064050000F9FFFF2A011081E2230000EA5B +:103A60002C38A0E104C0B1E5042052E20C3883E117 +:103A7000043080E4F9FFFF2A021081E21B0000EA13 +:103A80002C3CA0E104C0B1E5042052E20C3483E1F7 +:103A90003C00A0050000043080E4F9FFFF2A031079 +:103AA00081E2130000EA7847000010402DE9202051 +:103AB00052E20500003A1850B1281850A0281850BA +:103AC000B1281850A02820205222F9FFFF2A02CE48 +:103AD000B0E13C00DC0500001850B1281850A028C7 +:103AE0001800B1481800A0481040BDE802CFB0E16E +:103AF00004309124043080241EFF2F01822FB0E176 +:103B00000120D1440130D12401C0D1240120C0447E +:103B10000130C0243C001806000001C0C0241EFF74 +:103B20002FE178470000FF3001E20210A0E10324FA +:103B300083E1022882E188FFFFEA784700008024C1 +:103B400010E200006042413032E000106122A1C169 +:103B500070E02000003A3C005406000021C470E0F0 +:103B60000F00003A0004A0E1FF2482E321C270E0CC +:103B70001700003A21C470E00900003A0004A0E1F7 +:103B8000FF2882E321C470E00004A021FF2C8223DF +:103B900021C270E00E00003A3C009006000000C018 +:103BA00070E28300002A2004A021A1C370E08013EA +:103BB00041200220A2E021C370E000134120022036 +:103BC000A2E0A1C270E0801241200220A2E021C246 +:103BD00070E0001241200220A2E03C00CC06000070 +:103BE000A1C170E0801141200220A2E021C170E05B +:103BF000001141200220A2E0A1C070E0801041200D +:103C00000220A2E001C070E0001041200220B2E0DA +:103C1000E5FFFF2AC30F32E0A30F80E03C00080756 +:103C20000000001061221EFF2FE1784700000020F5 +:103C3000A0E3A1C170E02000003A21C470E00F00B1 +:103C4000003A0004A0E1FF2482E321C270E01700E3 +:103C5000003A21C470E00900003A0004A0E13C00F1 +:103C600044070000FF2882E321C470E00004A02183 +:103C7000FF2C822321C270E00E00003A00C070E2E7 +:103C80005000002A2004A021A1C370E0801341202D +:103C90000220A2E021C370E0001341200220A2E034 +:103CA0003C0080070000A1C270E080124120022089 +:103CB000A2E021C270E0001241200220A2E0A1C1D6 +:103CC00070E0801141200220A2E021C170E00011CB +:103CD00041200220A2E0A1C070E08010412002201B +:103CE000A2E03C00BC07000001C070E000104120D1 +:103CF0000220B2E0E5FFFF2A0200A0E11EFF2FE153 +:103D0000784700000A1040E2200140E0200280E0F5 +:103D1000200480E0200880E0A001A0E1002180E0F4 +:103D2000821051E03C00F8070000010080520A10A8 +:103D300081421EFF2FE130B4441C810708D0017876 +:103D40000130002902D1001B30BC70478107F6D139 +:103D50000B4AD50102C88B1A8B432B40FAD0001BAB +:103D60000A0601D103383C0034080000EFE70A04DA +:103D7000120E01D10238EAE70902090EE7D1013833 +:103D8000E5E7000001010101F0B4031C041C0C4331 +:103D9000A4070CD1104DEF0102E00431043A10C326 +:103DA000042A04D30C68661B3C0070080000A6437C +:103DB0003E40F5D0002A07D00C7801311C70013349 +:103DC000002C03D0013AF7D1F0BC7047012AFBD98F +:103DD000511E00221A7001330139FBD1F4E70101B1 +:103DE0000101784700000200A0E33C00AC0800009D +:103DF0000210A0E32EFEFFEA1F402DE900000FE1B4 +:103E0000C00080E300F02FE18100A0E30210A0E3F6 +:103E100001208FE212FF2FE100F0E6FC784700005E +:103E20001F40BDE8FEFFFFEA1F502DE93C00E808F7 +:103E3000000001008FE210FF2FE100F040FB784707 +:103E400000001F50BDE804F05EE21F502DE90100A4 +:103E50008FE210FF2FE100F018FB784700001F50A1 +:103E6000BDE804F05EE200BD01B500A000473C00E3 +:103E70002409000000300FE1C030C3E303F021E16A +:103E800001008FE210FF2FE101BD01B500A0004746 +:103E900000300FE1C03083E303F021E101008FE245 +:103EA00010FF2FE101BD000018009FE5041090E411 +:103EB0003C0060090000000051E30200000A0420F9 +:103EC00090E4002081E5F9FFFFEA0EF0A0E17C0913 +:103ED0000000000000004400000044000000D8037F +:103EE0000000D8030000D80300000000000000001C +:103EF00000003C009C090000440000004400000059 +:103F0000440000000080010000800100108E0100CC +:103F1000108E010088F8010001000000001004006C +:103F2000C433040000000400000000000E50A0E1B3 +:103F300058409FE53C00D8090000040094E40100CB +:103F400050E305F0A001041094E4042094E403007D +:103F500000EB040094E4041094E4070000EBF5FF88 +:103F6000FFEA010050E10EF0A001020051E104302F +:103F70009014043081143C00140A0000FBFFFF1A67 +:103F80000EF0A0E114209FE5002092E5010050E131 +:103F900004208014FCFFFF1A0EF0A0E1800900004D +:103FA000CC0900000008000020E60100130000001A +:103FB0005356435F000400003C00500A000020EE0E +:103FC0000100120000004952515F0002000020F27F +:103FD0000100110000004649515F8000000020F4FC +:103FE0000100170000004142545F00000000A0F4EF +:103FF00001001B000000554E445F3C008C0A00008D +:1040000000000000A0F401001F0000005553525FA3 +:10401000010000000E50A0E100600FE18C409FE520 +:10402000041094E4010051E30900000A040094E440 +:10403000011080E00310C1E3042094E43C00C80AAE +:104040000000C02082E302F02FE104D041E204200E +:1040500094E4130000EBF2FFFFEA06F02FE105F015 +:10406000A0E10E50A0E100600FE144409FE5041084 +:1040700094E4010051E30800000A040094E43C00C9 +:10408000040B0000011080E00310C1E3042094E45D +:10409000C02082E302F02FE104D041E2042094E446 +:1040A000F3FFFFEA06F02FE105F0A0E1010050E187 +:1040B00004208014FCFFFF1A0EF0A0E13C0A00006F +:1040C0003C00400B00000160C046C046C04670473F +:1040D0000000101E10EE020011E3FCFFFF1A100E8C +:1040E00001EE101E10EE020011E3FCFFFF1A1EFF8E +:1040F0002FE1101E10EE010011E30300000A101E54 +:1041000011EE3C007C0B0000001080E50100A0E3F4 +:104110001EFF2FE1000020E01EFF2FE18D46974695 +:104120007847C04678FDFFEA10B5041C032801D982 +:1041300000F0ACFB0C484068002800D003240B487A +:10414000016809483C00B80B00001230002905D076 +:1041500006216143405CC300181804E00621614356 +:10416000405C142358430A300006000E10BDD47A78 +:104170000100A869010080B5094A0949032000F03F +:10418000F2F9084908203C00F40B00000860486080 +:1041900007491D2001F0B2FC06491E2001F0AEFCCB +:1041A00080BD0000006C01003127000000100700F6 +:1041B0002925000031250000054980B508208860C8 +:1041C0001D2001F0BFFC1E203C00300C000001F05F +:1041D000BCFC80BD000000100700021C081CD12A96 +:1041E00080B501D105F019FC80BD034980B50020E0 +:1041F0000880052005F0D5FB80BDB074010080B5B6 +:10420000542801D106F0CDF880BD3C006C0C0000B4 +:10421000B0B5104D021C0124012A0D48296806D0B2 +:10422000C42A03D16A68002A05D0AC60B0BD0EF084 +:1042300089FB6C6008E00022AA606C600EF082FBD3 +:104240000021042012F0C8FC06F0D8F83C00A80CAD +:104250000000B0BD0000C4600100BC740100054A4C +:104260005169081A116909681031814201D85061F9 +:104270007047002070478C6E010001494968401A60 +:1042800070478C6E010001484069704700003C0097 +:10429000E40C00008C6E0100024A5169081850615C +:1042A000704700008C6E01000E490F4810B51922AE +:1042B000920141608918C1600B4900220C310160F4 +:1042C0000A49826009680123DB03C918084C41616F +:1042D0003C00200D00002168002902D0074901613F +:1042E00001E000F00CF8226010BD44DC01008C6E8F +:1042F0000100C809000034580100C4090000014849 +:10430000024908617047C80900008C6E0100082846 +:1043100005D23C005C0D0000034B8000195002499F +:1043200020310A5070470000646D010070B5061C12 +:104330000D480D1C0068141C002803D1201C00F03F +:1043400009FC70BD280601D500F022FE221C291CA4 +:10435000301C08F03C00980D0000DDFD011C0348F6 +:1043600054304369321CFFF71BFB70BD0000506DD9 +:104370000100F8B5061C0D481F1C0068151C0C1C1C +:10438000002802D1281C00F0E8FB200601D500F02F +:1043900002FE2A1C211C3C00D40D0000301C08F039 +:1043A000BDFD011C0348543043693A1CFFF7FBFA7A +:1043B000F8BD0000506D0100F8B5F1284ED12A4833 +:1043C00069468269FFF7EEFA274900265439C86822 +:1043D0008B68C2000130D5183C00100E0000072881 +:1043E000C86000D1CE6022486C680068002803D005 +:1043F0000021201C08F03BFB6E6025682089A9780D +:104400000239401AE978401A2081A8782818023821 +:1044100020606E782878082817D23C004C0E0000E7 +:10442000300607D5271C201C00F07AFC041C381C21 +:1044300000F09CFB28780F49403980000A58002A78 +:1044400004D0311C201CFFF7B3FA08E0052100E07E +:104450000421062000F010FA201C00F03C00880E19 +:10446000000087FB300601D500F0A1FDF8BD012159 +:10447000062000F004FAF9E70000A46D0100CC5C0E +:104480000100F8B51A4D194F01245435291C032099 +:104490007C60174B184A05F0F4FB002802D03C0062 +:1044A000C40E0000002038601FE03C600721281C7B +:1044B000EA69FFF783FA382000F080FC0024B86036 +:1044C000B868E60035186846022100F075FB2860E0 +:1044D000281C00F0A5FDB868815906485430026ACE +:1044E0003C00000F0000FFF76CFA0134072CEADBF8 +:1044F0000020F8603861F8BD0000506D0100819A1D +:104500000000619A0000054880B50068002805D0C9 +:1045100003485430426A0021FFF753FA80BD506DC2 +:1045200001003C003C0F00007047000070B50A4ECF +:10453000094D084C083EA169002907D03068416048 +:10454000007B81006958FFF73EFAF4E70349022037 +:10455000087070BD00100700E07E01000002070037 +:1045600070B50A4E3C00780F0000094D084C083E1B +:10457000E169002907D070684160007B81006958BB +:10458000FFF724FAF4E703490220087070BD001019 +:104590000700E07E010000020700B0B5094D041CD1 +:1045A000281C202240303C00B40F00000549FFF7D2 +:1045B0009FFAE068E86020692861A06AA8626068E4 +:1045C0006860B0BD7052010000100700F8B500240B +:1045D0000023202801DB012407E0084E8000355825 +:1045E000074FBD4200D02B1C3C00F00F00003150A3 +:1045F0001360002C03D0211C822000F052F9201CF3 +:10460000F8BDE07E010075750000B0B50B4D041CCF +:10461000286800280FD0201C12F0B7FD00280AD00F +:10462000217A287A0A070007000F3C002C100000AE +:10463000120F9042297201D00120B0BD0020B0BD00 +:1046400070780100F0B5424E051C306885B0002836 +:1046500063D000240020002D06D06978182903D1EA +:10466000E979012900D10120002845D03C006810DB +:1046700000000020B07281004A19937A5906890F10 +:10468000DB0604D5B37A01278F403B43B372D27A5D +:1046900013091207120F934205D301228A401443D3 +:1046A00001AA8900505001300428E4DBB07A3C00B4 +:1046B000A4100000204001070DD5410709D5C1070E +:1046C00005D5810701D5002405E0029902E0019992 +:1046D00000E003990491410709D5C10705D5810779 +:1046E00001D5002403E0029900E001990391C1077C +:1046F0003C00E010000005D5810701D5002401E051 +:1047000002990191800701D5002422E00F2C20D1CD +:10471000706800280BD0049A02AB00920ACB019A71 +:10472000281C0BF08AFB0020706010E017E0307A44 +:10473000297A3C001C11000000070907090F000F2F +:10474000884207D0049A02AB00920ACB019A281C37 +:104750000BF076FB287A307201200F2C00D000205D +:1047600005B0F0BD0120FBE7707801000D4A70B57F +:10477000116800203C005811000000290ED0117A69 +:1047800009060BD5537A947A032101252A1C8A4005 +:104790001E1C164003D0224001D1012070BDFF3104 +:1047A00009060916F2D570BD00007078010010B539 +:1047B000084C206800283C009411000004D0606878 +:1047C000002801D10BF0C0FB00200021002207C40B +:1047D0000C3C0120606010BD70780100014901208F +:1047E0000860704770780100F8B50E4D041C002079 +:1047F0006872201C12F0DEFC3C00D0110000002882 +:1048000012D00020032101220F1A161C237ABE4069 +:10481000334004D06B7A161C864033436B720130F0 +:104820000006000E0328EFD9F8BD70780100920051 +:1048300051188A7A1207120F02703C000C12000005 +:10484000CA7A1207120F4270CA7A12098270097B63 +:1048500081807047034A0F21527A0120914300D092 +:10486000002070477078010040070549400F054A55 +:104870000956527A01200A4000D100203C0048121B +:104880000000704700005E46010070780100124A87 +:1048900070B5537A947AFF20032101252A1C8A409F +:1048A0001E1C164014D0224012D10806000E07D05C +:1048B000012807D0022807D0032807D107203C0091 +:1048C0008412000070BD032070BD012070BD052062 +:1048D00070BDFF2070BDFF3109060916E1D570BD1E +:1048E00070780100F8B5041C13480D1C816800297C +:1048F00005D0017B002901D104734573F8BD0F4E2B +:104900003C00C0120000311C20318A7900AB1A70C3 +:10491000C97959704268002A07D020022843011C37 +:104920000020FFF77EF8002804D12A1C211C00205B +:1049300011F00FF800AB1888F084E2E70000885A05 +:1049400001003C00FC1200000010070080B50121AE +:104950008120FFF7CDFF80BD0149012088607047AD +:10496000885A0100054980B500208860087B00282E +:1049700002D0497BFFF7BCFF80BD0000885A0100D0 +:10498000024A011C3C003813000050685160704717 +:104990000000885A010010B50C1C07F064FA04618D +:1049A000002010BD0000FFB50E1C1F1C382081B078 +:1049B00000F03DFA1D49041C4869002801D14C61F2 +:1049C00000E0046030013C0074130000009000041B +:1049D000000C00F015FA051C0099FFF78BF8002079 +:1049E000731E04E001014A1910326A5001309842E6 +:1049F000F8D300012D503821201CFFF77BF8A5606B +:104A00006560E6850C2060863C00B0130000AF2096 +:104A10008001E0610E20E086002020600198E060C7 +:104A2000386860610399044808600448386005B03C +:104A30000020F0BD0000FC5A0100DD150100FD164C +:104A40000100021C081CF02A80B53C00EC13000099 +:104A500004D0F12A07D106F009FB80BD07F00CFA5B +:104A60000DF0A8FA80BD01210220FFF74DFF80BDA7 +:104A70000149002048617047FC5A0100002802D01B +:104A8000002900D0C1607047F8B5171C3C002814FD +:104A900000000E1C051C1C1C1C3007F0C8F8016926 +:104AA000426980688919891A814206D2231C3A1CFE +:104AB000311C281C00F005F8F8BD0020386020608B +:104AC000FAE7FFB585B0059801270E1C1C303C00A5 +:104AD0006414000007F0AEF8041C808804300390D2 +:104AE0002C48049080790290A069B04217D2351A00 +:104AF00011E00398FFF716FC002806D101218E2053 +:104B0000FFF708FF0025002705E02168016020600D +:104B10003C00A0140000A0690130A061013DEBD26F +:104B2000002F35D0A069801BA06120698019206109 +:104B30006169401AE168884203D907218E20FFF796 +:104B4000ECFE25682F1C701E019500E03F680138BF +:104B5000FCD23C00DC140000386820600298049904 +:104B600088712E682C60321D0092291C2031012290 +:104B7000281D059B08F07AFCBD4201D0351CF0E7EA +:104B800000203861019807990430086008980437BC +:104B9000076009B03C0018150000F0BD02980499A8 +:104BA0008871F9E700002010070038B5041C151CB7 +:104BB00000200C6009E0E268201C0092A38A2168B2 +:104BC000A26908F056FC201CE468002CF3D1286090 +:104BD00038BD80B50CE03C0054150000C2688A4224 +:104BE00008D10021C160002803D106218E20FFF7E3 +:104BF0009DFE80BD101C0028F7D0EFE710B5041C07 +:104C00000CD0A069002806D12069002803D006F046 +:104C1000F7FD00202061201C3C009015000006F0EC +:104C2000F2FD10BD000010B5002809D0C46803E0F3 +:104C3000FFF7E7FF201CF9E7002CF9D1FFF7E1FFB0 +:104C400010BD011C002004E00A89C9681018000486 +:104C5000000C0029F8D1704700003C00CC15000082 +:104C600000E0081CC1680029FBD17047F8B5061C9C +:104C70000C1C1C2000F068FA051C002E01D1002C31 +:104C800002D1301C012103E0201C00F05DFA00215C +:104C9000002200920A1C011C231C281C3C00081640 +:104CA000000008F0F2FB281CF8BDB0B503329208F2 +:104CB00092001404240C09191D1CC9180904090CBC +:104CC000FFF7D7FF018902681219091B491B02600F +:104CD0000181B0BD0000F8B50A4CA021201C3C00A9 +:104CE00044160000FEF72AFF0020261CA036074DC0 +:104CF00007E00C21414349190EC9271D0EC7203476 +:104D00000130A642F5D1F8BDD05C0100C83F0100DA +:104D1000F7B5C468061C0025002C82B023D020897A +:104D20003C0080160000904220D3E168871A019170 +:104D30000021E16003990020FFF7A1FF051C2089F5 +:104D4000C01B20812A680399301C00F016F82089C6 +:104D5000C01920810199201CFFF7B1FE211C281CDD +:104D6000FFF73C00BC160000ADFE291C301CFFF70D +:104D7000A9FE0120002D00D1002005B0F0BD0000EB +:104D8000F7B5041C0E1C002001E0201C0C1CE1687F +:104D90000029FAD12789B7420AD3B81B0004000CB6 +:104DA000208121683C00F816000009180298321C86 +:104DB000FEF7FBFEFEBDF11B0D042D0C002819D0E3 +:104DC0000189A94216D3491B0904090C0181006815 +:104DD000411802982A1CFEF7E8FE21680298721B0F +:104DE0004019FEF7E2FE3C00341700002089C01B8A +:104DF00020812068C0192060DFE703218E20FFF7A3 +:104E0000ADFDDAE7F8B5041C002613E02189002087 +:104E1000FFF73EFF051C228921680068FEF7C8FEE7 +:104E2000002E01D12E1C03E03C0070170000291C4D +:104E3000381CFFF750FEE4682F1C002CE9D1301C11 +:104E4000F8BDB0B5041C0089401A050420682D0C7B +:104E50004018291CFFF71FFF2189491B2181E168A8 +:104E6000C160E060B0BD10B503303C00AC1700007D +:104E7000094A810810683D24084B6401890009181B +:104E80001B19994201D8116010BD0F218020FFF736 +:104E90006BFD002010BD0000B4CF010014C801005C +:104EA00010B511F061FF041C03D10D213C00E8177F +:104EB00000008020FFF75BFD201C10BD0000B0B596 +:104EC000011F0B680D480022834204D001321030CC +:104ED000032AF9D301E0032A06D30924211C8020E8 +:104EE000FFF745FD201CB0BD054B00249A793C001E +:104EF0002418000085680D6081609A71F5E7000054 +:104F00002057010020100700B0B50021104A0023EF +:104F1000D468844204D201331032032BF8D301E069 +:104F2000032B01D304210EE00A4CA37990680028DA +:104F30003C006018000002D1A371032106E005685F +:104F40009560A371002901D104C0B0BD8020FFF796 +:104F500014FD0020B0BD2057010020100700A03034 +:104F6000008A4007400F08280FD201A31B5C5B009A +:104F70009F443C009C18000005030305070709092E +:104F800001207047002070470220704703207047BF +:104F900004207047B0B5104D6869002807D00E494D +:104FA00000222C3103C90143032006F0CFFF0B4C34 +:104FB000002203CC3C00D8180000083C0143032029 +:104FC00006F0AFFF03CC084307494A6802434A6032 +:104FD0008A681043886001206861B0BD0000647376 +:104FE0000100B058010010000700B0B50C1C0FF014 +:104FF000A8FA054DE86A3C0014190000002806D103 +:10500000002C04D0201C0FF0B7FD01202870B0BD8B +:10501000F46E0100054980B5886A002804DA002092 +:10502000886201210DF042FD80BD0000AC7E0100D0 +:10503000F8B51E4D041C00203C00501900006862A9 +:10504000A8701C480078C00722D5B82003591A4818 +:1050500000780E2809D10A1C803206D0184E0D2087 +:10506000325C8A4201DD0138FAD1591E0B061B0E53 +:10507000AB70AB620E280BD208E03C008C1900002C +:105080006218B032127B824202D8581AA86202E03B +:1050900001390029F4DA0EF035F9009000AB1878E8 +:1050A0005978814200D95878ED30E8700121201CF0 +:1050B0000DF002FDF8BD0000AC7E01003C00C819F7 +:1050C00000001D75010011670100C75201000E4963 +:1050D00010B508698B68C200D4186268002A0FD125 +:1050E00001300861072801D100200861201C00F070 +:1050F00024F8054821685430026AFEF7ECFC3C00B5 +:10510000041A000010BD06210620FFF74BFC10BD5D +:10511000506D010008490979C907084A08D400E020 +:10512000081CC1680029FBD101890431018100E01C +:105130000020D0627047000060800700046C01000E +:105140003C00401A000010B5041C19218901002000 +:10515000FFF7C5FD011C60602068FFF7E0FC606898 +:1051600021680830086010BD00000A2801DA042018 +:1051700004E0502801DA052000E00720044A1178F5 +:1051800038233C007C1A0000C000184099430843B3 +:105190001070704788000700B0B5051C07484068CC +:1051A00008E00169A94204D1446805F0C7FD201C4C +:1051B00000E040680028F4D1B0BD0000587501003F +:1051C000F8B500253C00B81A000006F084FD114F28 +:1051D000041CBE792068002807D1A0880430FFF79E +:1051E000F2F8002806D101210FE001682160A169D1 +:1051F0000139A16110C0051C20690130206161697D +:10520000401AE16888423C00F41A000003D90721E3 +:105210008E20FFF7D3FBBE71281CF8BD20100700BD +:10522000B0B509F0BBFF2F4C0028207403D001213A +:1052300001200AF071FC2B4D1435286800284DD050 +:1052400001210F2011F082FD3C00301B0000288955 +:1052500008F0FBFF011C01220F2011F040FDE07857 +:105260000125022836D10AF0C6F800280AD00BF032 +:1052700092FB1E490968401811F05FF8002801D11F +:1052800002202FE0E078022824D13C006C1B0000B3 +:1052900060702570606801281CD015481038817B2B +:1052A000002904D185730F20134910F001FC08F088 +:1052B0004FFE002807D00E4801219838006901F000 +:1052C000B7FD002805D001200EF00CFD3C00A81B06 +:1052D000000001200EF01DFCB0BD05F0DCFEB0BDED +:1052E000E078002801D12570F7E7032000E00420D2 +:1052F0000DF08DFAB0BD846601006C570100E90322 +:10530000010070B5041C002100200A4D00E03C00A3 +:10531000E41B00000131CB005A191679012E02D08E +:105320005279A24202D00B29F4D370BD0B29FCD2D2 +:10533000C80001215A192858117170BD3858010050 +:10534000054880B5007F2423044958434018006A6B +:105350003C00201C0000FEF7DAFB80BD0000D47981 +:1053600001009446010080B504F037FF002011F0E1 +:1053700084FC002080BDB0B5054C051C206BE16AA3 +:1053800002F0E3FD291CA06A02F011FBB0BDA46C81 +:1053900001003C005C1C0000B0B5031C081C141C80 +:1053A000002B0C4D09D06969890001310A04120CE7 +:1053B0002280291CFEF73EFC0AE0011C281C2288E2 +:1053C000FEF738FC2088012802D98008013868617E +:1053D0000120B0BD3C00981C0000206E0100F1B51A +:1053E00000980026C168086809891C2934D3C1883F +:1053F000FF23013399422FD10188C91A2CD141884A +:10540000082929D10179062926D14179042923D1F6 +:1054100000250024071C3C00D41C000018370BE0BA +:10542000A000411804310422381CFEF78BFB002831 +:1054300001D1012504E001340A494869A042EFD8AE +:105440000849087800280AD0012801D0022806D18E +:10545000002D04D10098C0683C00101D0000FFF72B +:1054600042FC0126301CF8BD0000206E01000148FE +:10547000406870470000206E01000249486001202A +:10548000486170470000206E010070B5041C0126C1 +:1054900003F0EFFA251C103500283C004C1D0000DD +:1054A00004D00020207703F0F1FB07E003F038FD83 +:1054B000002809D00120207703F0CEFC011C062231 +:1054C000281CFEF7C3FB02E0022020770026301CD8 +:1054D00070BD00000348807AC00703493C00881D66 +:1054E0000000C00F88627047000040900700A46C65 +:1054F00001000149012088627047A46C0100064840 +:10550000807AC107064AC90F91622021800700D422 +:105510000021A032117070470000409007003C004D +:10552000C41D0000A46C0100074A1268074B9B6968 +:105530001A4001D0012200E000220A600121002A65 +:1055400000D000210160704710000700A46C01002A +:10555000012202600A607047B0B50D1C011C583171 +:105560003C00001E0000041C0622281DFEF777FBED +:10557000211C5E310622281C0A30FEF770FB211C1C +:1055800064310622281C1030FEF769FBB0BDFEB561 +:1055900000251D72171C0E1CB26D0021921950328D +:1055A000D27A3C003C1E00001C1C5A720078321C4F +:1055B0008032C007C017013001900898029200287D +:1055C00001D1307F2BE037480068002800DD011C46 +:1055D0000198002802D00898012810D1029A906BF7 +:1055E000002806D03C00781E0000884201D9451AE8 +:1055F000013D7019B03003E0B56D013D70195030B8 +:10560000007B0FE0029A106A002807D0884201D977 +:10561000451A013D7019A030007903E0BD69013DD4 +:105620007819007FA0723C00B41E00000EF00CF848 +:105630000E2811D1A07A08F067FF00280CD07868F6 +:10564000002805D11B480025007808F04BFF02E038 +:10565000451E7819007AA072029A5069002817D066 +:105660000898012814D0A07A3C00F01E000008F031 +:105670004EFF00280FD00198002807D0022020728A +:10568000706C80194030C079607204E07D68013D23 +:105690007819007AA072029AA07A916908F051FFF5 +:1056A0002060029A607A916908F03C002C1F00008B +:1056B0004BFF6060A07AE0722573FEBDD47E0100CE +:1056C000905701000006000E002A8CB501D08A22F6 +:1056D00000E0882200AB1A800CF0C2F80190684606 +:1056E0000BF0BCFA8CBD0000011C08483C00681F90 +:1056F000000080B50068002809D049680220002910 +:1057000000D101200106090E002006F0D8FF80BD5F +:105710000000206701001CB50190041C443001AA60 +:10572000694611F0B8FD00280BD0A06900213C00AB +:10573000A41F0000C207D20F0220FFF7C9FF0021FB +:10574000201C0FF0D9FE1CBD04219820FFF772F930 +:10575000F9E700008CB500AB84211980054B021CD1 +:10576000181C998A0CF08EF8019068460BF07CFAB0 +:105770003C00E01F00008CBD0000707C0100704701 +:105780000000064980B5C96814234031897A044A6B +:105790005943891880000858FEF7E9F980BD707CEC +:1057A00001005447010080B50020FFF7D6FF80BDFF +:1057B00000003C001C20000080B512481149808A7E +:1057C0000A8B00210028C2B00CD1012A05D0022A80 +:1057D00015D000AB5A800E2207E0022200AB5A809F +:1057E000998004E000AB5A800D2200AB9A8000AB98 +:1057F0001880FF203C00582000009871D97168463D +:1058000000F0D1F942B080BD0000707C010010B5FD +:1058100009F05FFC002005F02AF9034CE08A05F04E +:1058200036F9201C0FF0B3FE10BD707C01001CB5D2 +:1058300009F04FFC07203C009420000000AB074C0F +:105840001880E18A201C0CF00BF8019068460BF0E0 +:1058500017FA201C0FF09EFE1CBD0000707C01009A +:1058600080B502219820FFF7F1F880BD10B5154CE6 +:10587000C2B0A08A002803D03C00D020000001283C +:105880001ED1022000E00120E168403188722069C9 +:1058900008F023FD021C0C4818388088E1680FF0DE +:1058A000A4FEA08A00AB18800120588000209880B8 +:1058B000FF219971D871684600F03C000C2100006E +:1058C0007BF942B010BD03219820FFF7C5F8F8E737 +:1058D000707C01007047000080B503480FF060FE47 +:1058E000002005F0CDF880BD707C010080B5024835 +:1058F0000FF056FE80BD0000707C01003C00482186 +:10590000000080B502219820FFF7A9F880BD80B57E +:105910000320FFF734FF80BD0000F0B5214E0027C3 +:10592000B18A301C002504240029008BC3B01ED18D +:10593000012807D0311C498B022812D100293C00D4 +:105940008421000007D1002405E000240125022065 +:1059500000ABD8801F810FF07FFF002C10D1F168C1 +:105960000520403188720EE000291AD100ABD880A2 +:105970000E2002E000ABD8800D2000AB188107E0BC +:105980003C00C0210000301C0FF013FE201CFFF76C +:10599000FCFE002D08D0B08A00AB9880FF209872E2 +:1059A000DF7201A800F011F943B0F0BD0000707C77 +:1059B000010010B5002005F06CF8044CE08A05F0F9 +:1059C00078F83C00FC2100000FF04CFF201C0FF089 +:1059D000F3FD10BD707C010080B50420FFF7D8FEF8 +:1059E00001480FF0E9FD80BD707C010080B5022008 +:1059F000FFF7CEFE012005F05FF802480FF0DCFD56 +:105A000080BD00003C0038220000707C010080B5A1 +:105A10000320FFF7C0FE80BD0000B0B51D4DC2B031 +:105A2000288B00ABFF21588099710021D971AA8A77 +:105A30000024012A18D12A1C528B02280FD1002AD7 +:105A400016D1032058803C007422000099802C1C41 +:105A5000FF22981DE969FEF73BF9E1680420403117 +:105A6000887210E0002A06D101240E2001E00124F2 +:105A70000D2000AB9880281C0FF0A4FD0420FFF738 +:105A80008DFE002C05D0A88A3C00B022000000AB9F +:105A90001880684600F0A5F842B0B0BD0000707CE8 +:105AA000010010B5002005F000F8034CE08A05F075 +:105AB0000CF8201C0FF089FD10BD707C010080B532 +:105AC0000420FFF76EFE01480FF03C00EC220000BE +:105AD0007FFD80BD707C010080B50220FFF764FE71 +:105AE000012004F0F5FF02480FF072FD80BD0000B8 +:105AF000707C010080B50320FFF756FE80BD0000DA +:105B0000B0B5194D0424A98A281C028B3C00282317 +:105B10000000C2B0012914D1408B042A0BD1002807 +:105B200000D100240FF0ADFE002C19D1E96805204A +:105B30004031887217E0002810D100AB5A800E2047 +:105B400002E000AB5A800D2000AB988019803C0029 +:105B500064230000FF2098710020D871684600F08F +:105B600049F842B0B0BD281C0FF038FD201CFFF7EB +:105B700021FEF6E7707C010010B5002004F09EFFC6 +:105B8000034CE08A04F0AAFF201C0FF027FD10BD93 +:105B90003C00A0230000707C010080B50420FFF7CA +:105BA0000CFE01480FF01DFD80BD707C010080B52A +:105BB0000220FFF702FE012004F093FF02480FF0DD +:105BC00010FD80BD0000707C0100B0B50A4D011CC5 +:105BD00044313C00DC230000041C0622281CFEF794 +:105BE00089F8EC60206903F097F8011C0622A818D8 +:105BF000FEF780F80420FFF7F7FDB0BD707C0100D0 +:105C000090B5041C808893B0002806D01549062260 +:105C1000488018313C0018240000881FFEF76DF8FA +:105C200068460CF014F82088012808D16088032801 +:105C300005D1A088002802D106200CA90870A079FF +:105C40000621FF2804D0E079002801D0011C08318A +:105C50000B2008AA50723C0054240000201C08F0BD +:105C60003BFF039068460BF031F813B090BD000085 +:105C7000587C0100074B1A78824201D0002907D0D6 +:105C8000FF201870044801880122520391430180CB +:105C9000704700004C7B01003C00902400003280E3 +:105CA000070010B5041C0C2307495843401800791D +:105CB0000AF04FF901200349A04008390A7810433F +:105CC000087010BD0000747A0100034A00211154CD +:105CD000800030321058017070473C00CC24000026 +:105CE000E07A010010B5041C052801D3FEF712FF6D +:105CF000201CFFF7EDFF0021201C0EF089FB10BDDA +:105D0000054980B58860087F242304495843085812 +:105D1000FDF76CFF80BD0000D47901003C00082530 +:105D200000009446010080B501219120FEF7C7FED6 +:105D300080BD024A11688143116070470000786E8F +:105D4000010080B5FEF7E9FE80BD80B5FEF7E5FEF7 +:105D500080BD80B500F031FA80BD034980B53C00BC +:105D6000442500000420886000F0D0F980BD0000C8 +:105D70000030070080B500F099FA80BD80B500F0D2 +:105D800099FB80BD38B5202815D20D4C221C20323D +:105D9000957900AB1D70D2795A700A4B82009950E8 +:105DA0003C008025000001218140084801604268D4 +:105DB0001143416000AB1888E08438BD0121FF2009 +:105DC000FEF783FEF9E70010070030740100004081 +:105DD0000700202809D20549064B82009950054A40 +:105DE00051683C00BC250000012383409943516069 +:105DF00070470000A97500003074010000400700E2 +:105E0000024A11680843106070470000786E010074 +:105E10000B48016803221204114301600168072244 +:105E2000120691433C00F825000001225206891811 +:105E300001600168120C11430160016852081143AE +:105E400001607047000080000700FEB51C4E051C75 +:105E5000B08AF26812D00124002909D1116D02AA7A +:105E600001ABFEF7F8FE3C00342600000298002843 +:105E700001D000240BE001AA02A9281CFEF770FF44 +:105E800005E0116D02AA002401ABFEF701FF0E49E7 +:105E9000081C2030827900AB1A70C07958703068C5 +:105EA000002802D1029830603C007026000002E019 +:105EB00002987268D060019800AB70601888C8843E +:105EC000F068C06CF060201CFEBD247E0100001054 +:105ED0000700F8B5041C54271D4E00203060706088 +:105EE00067433804151C000CB1823C00AC2600004E +:105EF000FFF796F8082130610026174A14E0031CCA +:105F0000243342610361C661018308330360B12316 +:105F10004360031C6433C3600C230381031C5433AC +:105F20004C3028C0013C181C002CE8D13C00E8266D +:105F30000000094E07223069D243C1195050021C9B +:105F4000103280398A63F060B06000210020FFF7D2 +:105F500088FF3069F060B060F8BD247E01009100D8 +:105F600005000148406A70470000E87D01003C00E0 +:105F7000242700000148008870470000FC6B0100E6 +:105F8000064980B508880130088005490820086066 +:105F900004498869886100F021F880BDFC6B01002C +:105FA0000010070000300700034A0120121D06CA36 +:105FB0003C0060270000914200D100207047E87D3E +:105FC0000100064800B5C07C002803D1FFF7EFFFB1 +:105FD000002801D0012000BD002000BD0000A080ED +:105FE000070010B5041C800702D506F03EFD03E053 +:105FF000E0073C009C27000001D506F0E3FD6007A8 +:1060000001D5FEF7ABFD10BD024A011C10681160FE +:1060100070470000E87D010038B5204D2C1C20346D +:10602000A07900AB1870E0795870FEF727FA00AB42 +:106030001888E8843C00D82700001A488178082294 +:1060400091438170817811438170174841688022A3 +:1060500091434160016811430160002001306428D0 +:10606000FCD3A0790F4D00AB1870E079104C58703C +:10607000201C103000F03C0014280000DFFB002042 +:10608000C043A061FFF79CFF002809D00A490869B6 +:106090000130086100203C318968486306F0EEFC5D +:1060A00000AB1888E88438BD001007000000070026 +:1060B000F4000700003007003C0050280000E87D95 +:1060C00001000A4880B5006A002801D0FEF7C1F936 +:1060D000074807493C30806810304861012008615A +:1060E0000549086880229043086080BD0000E87D73 +:1060F000010000300700F40007003C008C2800007D +:1061000080B50CF0CBFE06F0BFFC80BD0149C86233 +:1061100070470000E87D0100024A916A08439062DE +:1061200070470000E87D01001823064958434018D5 +:106130000021027903681A70013108303C00C82838 +:1061400000000329F8D370470000285201000349DA +:10615000002800D0011C024881627047000085754C +:106160000000046C0100F8B5FFF733FF284F00284A +:1061700004D0FFF7C8FF386A01303862F86A3C0083 +:1061800004290000002802D0018904390181386BFC +:106190000025002808D00B203D6310F0E5FA1E49C9 +:1061A000086821229043086038783C211B4A41430B +:1061B0008C18FF22796A3A7000290CD0B969013134 +:1061C0003C0040290000B9617D62BD68002D04D00B +:1061D000636B7A6B0021FDF747FDF8BD042803D3FC +:1061E00001218420FEF7A1FC3869261C01303861AA +:1061F00020363078022803D00C218420FEF795FC4D +:1062000035703C007C290000A1690029E8D0636B4F +:10621000303420780C1C00217A6BFDF727FDDFE776 +:10622000046C0100F400070018DB010010B50B4CF2 +:10623000606A00280ED00A4800F012FB002060625D +:10624000A468002C3C00B829000005D07E23DB4365 +:1062500000220121FDF70DFD10BDE0690130E06174 +:1062600010BD046C010000300700094841683F225E +:10627000120491430D2212048918416041680122E1 +:106280005202914341603C00F429000003488178A8 +:1062900081708178817070478000070000000700DE +:1062A000F0B50125082400200E4A0F4900263C23A2 +:1062B0004343D1529B185D719B605E611C82C02775 +:1062C000DF602027FE549E613C00302A000030270A +:1062D000FE54074F3F182037013005289F63E9D34C +:1062E0000548FF3201329062F0BD18DB0100BEBAF2 +:1062F000000030800700066C0100014948607047CB +:106300000000046C01000549085C3C006C2A000098 +:10631000054949684018C006C00E0449203048723B +:1063200070470000A0570100046C010000800700C6 +:1063300080B515218420FEF707FC80BDF8B54348E1 +:1063400084680334424D04E0201C10F03C00A82A6D +:106350000000B9F8002871D12869C007F7D53E4878 +:1063600028603E4A141C2034207900903C233C498C +:10637000584345182879FFF7CCFF281C3A490830C4 +:1063800048600126081C0660686A00280DD03C00A1 +:10639000E42A0000A96A926A354B9F68D71B1A68E5 +:1063A000511879188A425A6800D800E0013206C0B4 +:1063B000E86AFEF787FF2D49E86A4860301C0E60E6 +:1063C00066791FE02B484661047F2949201C50391B +:1063D0003C00202B0000896AFDF75AFC009884429B +:1063E00010D03C202249604340188769002F09D013 +:1063F0000021203001707E23DB4302210022201C7B +:10640000FDF74CFC0120A0408643002EDDD1E96958 +:1064100000293C005C2B000003D03020405DFDF7DC +:106420003AFC164C503C606A002803D00A218420B4 +:10643000FEF796FB20352878012803D00B21842015 +:10644000FEF78EFB02202870E068013000E007E0D4 +:10645000E06000983C00982B00002070009860706D +:106460000A4800686063F8BD0000000107000040B2 +:106470000700010000013080070018DB0100003038 +:106480000700546C010000A00700786E01003C2258 +:106490003C234A4309493C00D42B0000B0B55418B2 +:1064A00058434518211C3822281CFDF7E5FCA06B39 +:1064B0000078A96B0870002020342070B0BD000067 +:1064C00018DB01003C230749584310B54418203419 +:1064D0002078022803D10D213C00102C00008420DC +:1064E000FEF747FB0020207010BD18DB0100FFB550 +:1064F0003C2048431A4981B04418261C2036307885 +:10650000151C0F9F022803D104218420FEF731FBC4 +:106510000120307025710B9930223C004C2C00007A +:1065200061800A99E1620D99A1610C99E1610E996E +:106530006162A762019911557E21C9436163049983 +:10654000002900D10020061C281C08F08BF8002828 +:1065500001D0022000E00020A16B30433C00882CD9 +:106560000000087005B0F0BD000018DB010080B528 +:1065700014218420FEF703FB80BD0148407870475A +:106580000000046C010002480069C007C00F70479A +:10659000000000400700011C3C23044A59433C0012 +:1065A000C42C00008918203109780120002900D06E +:1065B0000020704718DB01000848406A00280AD113 +:1065C000074A002120239B5C022B04D001313C327E +:1065D0000529F7D37047012070470000046C0100C3 +:1065E0003C00002D000018DB0100F8B50E1C041C57 +:1065F000171CFEF782FE201C114C606001202060F9 +:10660000104D686901306861686A002803D007216D +:106610008420FEF7BAFAA068400703D5062184203B +:10662000FEF73C003C2D0000B3FA08480069002842 +:1066300003DAAA218420FEF7ABFA02206862AE607A +:106640002F70F8BD00300700046C01000040070007 +:10665000044A518010710348034908304860012002 +:10666000086070473C00782D00003C6C0100003051 +:1066700007000021002305E002894360C06851182B +:106680000904090C0028F7D104310804000C7047F4 +:106690000000024A516B0843506370470000046CCD +:1066A000010038B50A4C3C00B42D0000221C2032F9 +:1066B000957900AB1D70D2795A7003684068064A1C +:1066C0005065054813655030816000AB1888E08440 +:1066D00038BD000000100700046C010098B50D4C97 +:1066E000201C2030817900AB3C00F02D0000197097 +:1066F000C07958700A4800F0ECF809490020486257 +:10670000FFF769FF002803D012218420FEF749FA21 +:1067100000AB1888E08498BD00000010070000302E +:106720000700046C01000348017A3C002C2E000095 +:10673000FE2291430A310172704700000080070079 +:1067400090B50E4C85B0A078022814D10320A0701B +:106750000B4900200022049202900391E18801225B +:1067600001920091617820782269E3683C00682EEC +:10677000000008F094FD044809F07FF905B090BDD1 +:106780000000B4790100ADB6000071B60000B0B5EC +:106790000C4DAC790C490978002903D001290ED0A1 +:1067A000022908D1C288002A09D0012381683C004F +:1067B000A42E000002200FF0C1F803E00221862081 +:1067C000FEF7F8F9AC71B0BD20100700A079010008 +:1067D00080B5026807494A600379CA78CB700079AE +:1067E000904206D003481430008907F027FE06F0D7 +:1067F0003C00E02E0000ABFA80BD8466010070B55D +:10680000164C154DA0780026983D012803D1286923 +:1068100008F0FBFCA6706068012803D000212869FD +:1068200000F0FFFB0E4829690CF031FA01200CF052 +:10683000E4F83C001C2F0000E078012802D0012081 +:10684000607000E06670064814304168012906D186 +:106850000660416F002902D00020FDF74CFA70BDA0 +:10686000846601003463010030B500220023012555 +:106870002C1C94403C00582F0000044001D0CA5406 +:10688000013301320E2AF6DB181C30BD0000FFB5C3 +:1068900001270026051C022081B00090002D18D091 +:1068A0002878FF2815D0002410E0281980780A994C +:1068B000002901D001063C00942F000008D507F004 +:1068C000E9FE0E2803D0012181400E4300E000279D +:1068D00001346878A042EBDC0098029D01380090FA +:1068E000DFD10398311C814302D003980640002772 +:1068F0000498066005B0381C3C00D02F0000F0BDA5 +:10690000000002210160642101E0013902D0026827 +:106910009207FAD40120002900D10020704710B559 +:106920000020C443054B022201015A50C9188C6053 +:1069300001300828F8DB10BD00003C000C300000DE +:1069400000300700F0B5051C6035C76A041C287BC1 +:10695000002F8BB015D0082815D202A31B5C5B005A +:106960009F4400000704040709090C0C01260021BC +:1069700009E0002606E00226022104E03C0048303F +:1069800000000326032101E0042601218C22125974 +:1069900007912649069004910020039005970892DC +:1069A000E0692269211C7031019121490090700039 +:1069B0004018603002920388591C01801E483C0038 +:1069C000843000000288A1680AA809F0E1FF606035 +:1069D000E87AA16AC9070007000EC90D0843616A79 +:1069E0002269C907890D01430120002A00D1002036 +:1069F00080030843216AC9030843082108430A9910 +:106A00003C00C03000000880201CFEF798FE206982 +:106A1000002804D1201C0AF082F90BB0F0BD807967 +:106A2000062801D9FEF70FF9206906498079800010 +:106A30000958201CFDF774F9EFE7792F0100C469AC +:106A400001003C00FC3000000861010074570100A7 +:106A500010B5041C58308AB00EF07CFE221C803227 +:106A60005168002901D0117A07E0002804D080691C +:106A7000800701D5032100E00121D2680791224956 +:106A8000002008923C003831000004910022059259 +:106A900006900390E06922690090211C70311C4827 +:106AA000019102920389591C01811A480288A16848 +:106AB00009A809F076FF60606B20005DA16A226979 +:106AC000C9070007000E3C0074310000C90D0143E6 +:106AD0000120002A00D10020800308430999088082 +:106AE000201CFEF735FE2069002804D1201C0AF086 +:106AF0001FF90AB010BD8079062801D9FEF7ACF85D +:106B000020690749807980003C00B03100000958B5 +:106B1000201CFDF711F9EFE70000BD2F0100246AEA +:106B2000010008610100745701003EB5051C0069B1 +:106B3000042107F0D2FA002809D042780232011C61 +:106B40006846FDF788F9E86A6C463C00EC310000C5 +:106B5000029000E00024281C143002F003FB0028FF +:106B600004D0211C281C05F0A5FE3EBD002CFCD045 +:106B70000249201C4969FDF7E2F8F6E7447D01006F +:106B800070B51E1C18235843064B049D3C00283248 +:106B900000001950C418002060616260A660E560C2 +:106BA0000FF0B9FD206170BD0000B87D0100024A00 +:106BB000011C9069916170470000447D010001480B +:106BC000406B70470000447D01000449044B3C00C9 +:106BD00064320000CA6809695C3B5B68C91A4143BA +:106BE00050187047A07D01000148007870470000F0 +:106BF0007869010080B506220149FDF735F980BDAD +:106C0000FE670100F0B589B00093164F131C0E1CEF +:106C10003C00A0320000041C3A1C01F062FF01A9F4 +:106C200006A8A26802F00BF901AA06A9381C636A3B +:106C300002F081FC051C012814D10C48FC21C8512C +:106C4000381C02F00CF80321301C07F052FA00281F +:106C500007D03C00DC320000807800F033FC201CC0 +:106C600010300EF047FD00E00025281C09B0F0BDF3 +:106C7000F4670100C138000010B5074C0648062231 +:106C8000211D0838FDF7F6F801F0FCFF00F042FC8A +:106C9000201C02F03C001833000027FC10BDF467F4 +:106CA00001000849C96800290AD0064A0132517812 +:106CB00012784843002A01D108187047101870470D +:106CC000013070470000447D0100044B0549002855 +:106CD0005A6900D0011C3C0054330000101C59615B +:106CE00070470000447D0100B9750000074900208D +:106CF0000A78022A09D10A7C002A05D1CA68002A2A +:106D000003D04969002900D001207047786901004B +:106D10000C4A80B5012151603C009033000009F01D +:106D20006AF809481C308169002907D00023836173 +:106D300000220021002000F0D2F880BD00220021B6 +:106D4000034800F05CF980BD00005C69010051352A +:106D50000000B0B50C1C012816D13C00CC3300005B +:106D60000E4D022C09D100F02BFA00280ED06869D4 +:106D700000280BD1211C13200CE0032CFAD100F0C9 +:106D8000F9F9002802D0287C0028F3D0B0BD211CDE +:106D90000006000E04F062FCB0BD00003C000834A8 +:106DA000000078690100B0B50C4C002525746561C0 +:106DB000E56000F03CFA00F034FA07481C38056141 +:106DC00009F033FF2078002802D104F06EFAB0BD3C +:106DD0000228FCD104F0A5FBB0BD786901003C009D +:106DE000443400000C4880B50178002912D0C068F6 +:106DF00000280FD108481C38406900280AD10748EC +:106E00000068002806D000220721102010F0A0F909 +:106E100002F02CFC80BD000078690100D4670100FD +:106E20003C0080340000F8B51D4E1C4D041CF06879 +:106E300002271C3D002807D0E868002804D0FDF791 +:106E4000C2FE002800D0BC43002C14D03770F0687C +:106E5000144F002810D0E00717D4FDF7B4FE002827 +:106E600013D03C00BC3400007069002806D1E868EB +:106E7000002801D0FDF71AFF0DF00AFAF8BD686985 +:106E8000002805D109480068002801D0012C04D150 +:106E9000391C201C0EF052FDF0E704F01DFB02F03F +:106EA000EBFBEBE73C00F83400007869010050C3CD +:106EB0000000D467010005484169002904D0406AF8 +:106EC000002801D001207047002070470000786939 +:106ED000010010B5041C0649002048600860886065 +:106EE00008F09BFF07213C00343500001220227976 +:106EF00010F03AF910BD00005C6901000149012061 +:106F000008607047E8670100F8B5071C0E1C08F020 +:106F1000A3FA134D041C6868002817D0002F02D074 +:106F2000A868032813D300203C0070350000A86037 +:106F30006860211C0F200EF0F0FE2868002803D0A6 +:106F4000002C06D1012002E0012C02D10020FFF725 +:106F5000FAFEF8BD721C0021044800F068F8A86829 +:106F60000130A860F5E75C6901003C00AC35000029 +:106F7000513500000A4980B5CA68002A0BD0426822 +:106F8000002A09D000224A6202680A6202680721C8 +:106F9000172010F0EFF880BD0120486280BD00008E +:106FA0007869010070B5144D846CE9683C00E835DF +:106FB0000000002917D04030EC614078002801D152 +:106FC00001206862286A0E4E001BB0420CD208F005 +:106FD0003AFE296A401AB04203D202220721132046 +:106FE00009E004F0B6FA70BD0748A9680BF03C0050 +:106FF00024360000BDFE221C0721162010F0C0F828 +:1070000070BD000078690100A086010034630100B2 +:107010000A4980B500208861086900280CD007481B +:107020001C300078002807D001F0D2FF022803D1DD +:107030003C006036000000F012F900F0BCF880BDA2 +:1070400000005C690100F0B5061C0C1C151C91B019 +:1070500001A84021FCF70DFF00216846FDF7A7FFBE +:10706000049001A806220849FCF731FF062202A875 +:1070700002303C009C3600000649FCF72BFF00ABB9 +:10708000DC760C95311C01A807F04EF811B0F0BD6C +:1070900012610100F8670100031C081C191C114B48 +:1070A00080B506D0042111800422191CFCF712FFC0 +:1070B00016E004223C00D8360000011C181CFCF726 +:1070C0000CFF09481038006900280CD007480C3024 +:1070D0000078002807D001F084FF022803D100F0D7 +:1070E000C4F800F06EF8012080BD6C690100F8B5AD +:1070F000041C0F1C00253C0014370000002601F082 +:1071000073FF02282FD11949012F086807D1021CEB +:1071100022400AD120430860A04206D104E00028A2 +:1071200003D0A043086000D10125486800281AD187 +:10713000002D17D0012048603C0050370000381C5B +:1071400008F089FE0B481C308169002907D0002314 +:107150008361002200210020FFF7F1FE06E00022FB +:1071600000210448FFF77BFF00E00126301CF8BD3A +:1071700000005C690100513500003C008C370000C4 +:10718000031C081C191C124B80B506D00421118069 +:107190000422191CFCF7AAFE18E00422011C181C8A +:1071A000FCF7A4FE0A481030C16800290ED0007810 +:1071B00000280BD001F01EFF022807D13C00C83781 +:1071C000000000F064F800F02EF8002801D109F06A +:1071D0007AFD012080BD6869010010B50A4C206964 +:1071E000002809D0A169002906D17D21C9004143A9 +:1071F000032207200FF0E1FE2169012000293C0055 +:107200000438000000D1002010BD00005C690100BE +:1072100010B5054C002803D0FDF79AFCE06010BDC6 +:1072200001200021E16010BD786901000A480A4987 +:1072300010B5C0681C39C968002803D0002901D0E6 +:107240003C0040380000012400E00024002C03D062 +:10725000022207200FF0B7FE201C10BD0000786945 +:10726000010010B5094C0020216900290CD0064905 +:107270001C310978002907D000F009F80120A0612D +:1072800020693C007C3800007D23DB00584310BDA2 +:107290005C69010080B5032107200FF0D1FE80BD9D +:1072A00080B5022107200FF0CBFE80BD064880B5D7 +:1072B0000078002801D0FDF729FD002207211120C8 +:1072C0000FF07CFF3C00B838000080BD00007869FA +:1072D000010010B5041C101C064A516100F0A3F80F +:1072E0001020002C00D11120002207210FF069FF8F +:1072F00010BD5C6901000149486270470000447D8F +:10730000010010B5094C3C00F4380000E069002889 +:107310000CD1E0620120E0610BF008FD0BF074FE7F +:10732000012000F0B5F80FF04DFA606310BD0000C9 +:10733000447D0100054980B50020C861886300F0E4 +:1073400089F800F001F902F03C003039000091FBAF +:1073500080BD447D010010B5012838D10806000E1B +:10736000052832D11D4C2078012809D002281BD0D5 +:1073700003282AD102F07DFB00F06FF8012010E015 +:107380001748216B0BF01BFD0BF03C006C39000023 +:1073900041FE15480069032801D3C00703D5012128 +:1073A000206B07F019FF022000F078F810BD0F489D +:1073B000006820640A485C30C16802698918C160AD +:1073C00003F0CCFC032000F069F801203C00A83950 +:1073D0000000E06210BD092100E008210920FDF74E +:1073E00076FC10BD0000447D010034630100F468A8 +:1073F0000100786E0100B0B50F4C2078651E0128A1 +:107400000FD10020FFF7A1FC0C49098849083C0076 +:10741000E4390000401A0FF019F9002804D0287848 +:10742000012807D0022805D02078002804D1287828 +:10743000032801D10120B0BD0020B0BD457D010071 +:10744000F46701000149C86470470000447D0100F1 +:107450003C00203A00000449054A8968126D012069 +:10746000914200D3002070470000F4680100447D81 +:10747000010010B5064C206B07F0F9FEA06B002848 +:1074800003D10348216B0BF092FC10BD0000447D3A +:1074900001003C005C3A00003463010004480078BD +:1074A000022801D0032801D1012070470020704735 +:1074B000447D0100F8B5071CFFF7D0FF061C012F23 +:1074C000264D1FD0022F45D0032F12D12448254B23 +:1074D00000696A693C00983A000041085A43234B0E +:1074E000D4188C4200D90C1C002E05D01E495B39E3 +:1074F0000978002900D1041C0522211C09200FF065 +:1075000080FD184A5C3A1770F8BDFFF7D6FB0028DB +:1075100002D0286900283C00D43A00000ED004F0C4 +:10752000CFFB134B6969114A59435C3AD26B8918F6 +:10753000884201D9441A04E0002402E004F0AEFDC0 +:10754000041C002EDBD009485B3800780128D6D116 +:10755000084B9C4202D958423C00103B00002418C2 +:10756000D0E70024CEE704F0AEFBCAE70000F468E1 +:107570000100A07D0100983A00008813000080B54A +:10758000052109200FF07DFD02490020087080BD13 +:107590000000447D010070B5061C3C004C3B00001F +:1075A0000DF0BCFAFFF7CEFE094C0A48216B0BF038 +:1075B00021FC012501213006000EA56307F03AFEEB +:1075C000054829020958002900D1056170BD000055 +:1075D000447D010034630100F46701003C00883BF6 +:1075E0000000024A116C0843106470470000447D9B +:1075F000010080B5FFF7BFFE0BF0A1FB80BD024A82 +:10760000011C1069116170470000447D0100F3B551 +:10761000061C002089B0F84C0890E26908253C005F +:10762000C43B0000002A03D006A907A8FCF706FC0B +:10763000301CF34E0027203682286FD015DC01283D +:1076400018D080286BD1EE4D803DA868012867D105 +:1076500068680FF01BF8002863D1012101200DF0AC +:107660003C00003C00009DF808F0DBFD0BB0F0BDD5 +:1076700083286DD0842855D1E7E00A980A2804D2DF +:1076800003A31B181B5A5B009F44F6E00000EE00AA +:107690000B00F700F700F700F7002F0088008B00C1 +:1076A000AD003C003C3C000000F056FE002817D026 +:1076B000D64A803AD16A0698814216D0062100281F +:1076C00000D107210D062D0E00280ED0CF4A012033 +:1076D000803A50650FF0A0F8CC4A803A506604E03A +:1076E000002116203C00783C00000FF0DCFC012556 +:1076F000022005902EE2C6488038406D00282ED02A +:10770000C6492069C44D40180EF0C1FF002812D0B0 +:107710000FF085F8C14949424018BD4920618039C0 +:10772000486E40190EF03C00B43C0000BBFF00283E +:1077300011D00AE0F7E017E2B2E0B0E0B649206904 +:107740008039496E401AA84205DBB349B54D8039EE +:107750004F6503F027FB0622291C16200FF072FC50 +:1077600047E095E000F0FEFD3C00F03C0000002802 +:1077700042D1AA4DC43DEF6008F019FD03F015FB9E +:10778000A86A002802D0FFF74CFFAF62A4488038F7 +:1077900000680021FFF7F9FC08F03FF909211620E5 +:1077A0000FF087FC0022162183203C002C3D0000B6 +:1077B0000FF040FDFFF786FC21E000F01BFE1EE00D +:1077C00006F054FA974D803DA96F401A0490069830 +:1077D000002801D0AF6502E0A86D002808D19148CB +:1077E000C4380078800703D5924847603C00683D64 +:1077F000000000F002FE0498FF382338142802D25B +:107800000120E86353E0EF6351E0874AB57A803A9C +:10781000002D4CD00DF071FF00F0ADFD071C82482B +:107820008038406FFF305F300EF03DFF021C3C009F +:10783000A43D00007E488038406D00281AD100F039 +:10784000F1FD002816D1042D02D1002F12D11BE02A +:10785000002F06D0022D14D079484068002809D0A6 +:1078600012E0002A10D14B21C90001230922162061 +:107870003C00E03D00000FF0D6FC6E4A7348803AB1 +:1078800011680BF0D8FA18E00121002001E0012175 +:10789000012000F02AFE10E0674A6C49803A906EA1 +:1078A00040189066012508958BE104216CE1614A3E +:1078B00066483C001C3E0000803A11680BF0AAFAB2 +:1078C00088E1AF60A86FE8676348016DA967079A10 +:1078D0001420002A00D1002008181230A866707801 +:1078E000B0703078707002203070A069FCF7C2FA76 +:1078F000EF64A86F3C00583E0000E96F594B401AF6 +:10790000984212D2686D069988420ED030780228CB +:107910000BD80EF09CFFA96F0822401A5249091A91 +:107920003B1C16200FF085FC00E0AF6501200590A0 +:107930000890434802253C00943E0000C438C168CA +:10794000002972D10121C1604948006B00286CD028 +:1079500008F066FC69E03C480022019280388068AB +:10796000012804D1384880388760012048E13A482E +:10797000012343603448C4383C00D03E0000007806 +:1079800000280AD100F025FE002806D0FF21913101 +:107990000123092216200FF052FC2C498039486F30 +:1079A000896F421A039206F076F928498039896F67 +:1079B000039A401A0290372000013C000C3F00005F +:1079C000101A50280DD223488038406D002804D169 +:1079D0000298FF385538142801D2012200E0002215 +:1079E0000192039A0120FF3A0B3A502A00D300205B +:1079F000049000280AD017488038C06F3C00483FE8 +:107A00000000081A9B21C900401A142801D2012243 +:107A100000E000220092002A11D00F4D0120803D8D +:107A200068650EF020FF68660125012116200FF021 +:107A30005EFB002116200FF05AFB00E0BAE03C008C +:107A4000843F0000F07902283CD8054A803A516C06 +:107A5000002937D1136C111C002B33D116E0000024 +:107A6000246D010050C30000C05C15007099140023 +:107A7000B057010034630100E204000000900700E9 +:107A80003C00C03F0000530700001E020000C85722 +:107A900001004A6D002A02D0B27A022A15D1009A5A +:107AA000002A03D0CA6D0132CA6500E0CF65019A91 +:107AB000002A0BD08A6FCB6FD21A5A4B9A4202D24D +:107AC0008A6D3C00FC3F0000013200E001228A6523 +:107AD00000E08F650499002901D102280BD9544A8E +:107AE00002281ED9D06F616888421AD1916F081A96 +:107AF0005049884215DD4E4B986FE168401A7D2150 +:107B0000C90088423C00384000000BDD6169401A22 +:107B1000002804DD021140111018401801E0801007 +:107B200008186061586FE0600398FF382338142804 +:107B300009D20298FF382338142804D23E4A906FA5 +:107B40005064906A90643C00744000000EF09AFE0D +:107B50003A49496C401A3B49884201D937494F6438 +:107B6000394903984018142807D23449C86B0028B3 +:107B700003D0886F0864886A88640EF083FE2F49FA +:107B8000096C401A314988423C00B040000001D9DC +:107B90002C48076404200590082116200FF0B9FA3C +:107BA0002848406D002802D00499002908D02949AE +:107BB000002800D129493B1C062216200FF057FB54 +:107BC000022D09D0062D0AD0072D3C00EC40000004 +:107BD00013D107E001211620FDF7D6F81EE01A4A5E +:107BE00057639763184A0698D06207991163536BDD +:107BF00018435063906B084390630598002805D0A4 +:107C000005980CF05FFA05980CF0D2F93C00284179 +:107C10000000082D05D00D4844388570281C03F05D +:107C2000DCFD1149E069884200D161E5089800282F +:107C3000FBD0B07A0228F8D1012116200FF06FFA9C +:107C400002200DF0E8FE53E50000530700003C0061 +:107C500064410000A46C010020A10700204E000038 +:107C60003FFBFFFFA086010050C30000C05C150071 +:107C7000F11D00007047000070470000F8B5214872 +:107C80000068214D6969084001D1012700E0002703 +:107C90003C00A04100001D4D0126696A002900D06A +:107CA00000261B4D1A482C1CA030027A281C40309C +:107CB00080341023B74210D10125C580002900D09F +:107CC00000231A43111C017301200EF088FE0820C6 +:107CD00020703C00DC41000000221621802013E0CF +:107CE0001127C7802E1C0B4D002900D100231A43F9 +:107CF000111C017301200EF075FE08202070306DFC +:107D000000221621686782200FF0D0FAF8BD00002B +:107D1000100007003C0018420000A46C0100009015 +:107D20000700B0B50F4D041CAA7A0121081C002AD7 +:107D300000D00020002C00D0002188420AD0002C66 +:107D400004D100F042FB00F0D6FA03E000F0D9FACB +:107D500000F009F8A87A3C00544200000249E439D6 +:107D60004871AC72B0BD0000446D010080B53EF0BA +:107D700055F802490120087080BD0000687E0100AE +:107D8000F3B501208DB00F1C012408900EF092FD78 +:107D9000061C00F0B5FA09903C009042000000F08B +:107DA00080FB0790FEF73FFA051C00210C9108F0BC +:107DB000F0FB002801D1012000E000200A90FEF72E +:107DC00012FD05F0E0FE0B90002D23D0288841071E +:107DD00020D4291D04910A3500063C00CC42000045 +:107DE000800E01212028039500D000210D1C04984D +:107DF00006F038FD0C90049806F010FD002808D01D +:107E0000039801F087FA002803D0002D01D101204A +:107E100000E000200C9901430C91FCF73C00084362 +:107E2000000023FF00282FD007F099FF051C07F062 +:107E3000B2FF0490FFF7F3F80C990143002D06D030 +:107E40000498F04A301A904201D2012000E000204C +:107E500008430C900B980A9B1843011C0B913C00A3 +:107E60004443000005F0CEFE00281AD1002D06D0B4 +:107E70000498E749301A884201D2012000E000202E +:107E80000C990843051C00F01FFB284303E000F099 +:107E90001BFB0C9908430C9000F0D4FB0B99014399 +:107EA0003C00804300000B91DC49C868002801D0E9 +:107EB0000138C86008F0E7FB069008F090FD311A21 +:107EC00005910699D648814208D8002F08D1059916 +:107ED0004008814204D90699814201D900248BE0EF +:107EE000D0483C00BC4300000599D04D814226D2C9 +:107EF000E879102806D2002F21D1CC48A038806A1A +:107F000000281CD109F062FF0490002802D1002053 +:107F1000C34913E009F010FE002803D0C448C0692B +:107F20000028F4D03C00F84300000498052803D052 +:107F3000C148006A002865D1BB49486A002823D09F +:107F40000138486200F087FF002811D0BB4805992E +:107F500081420DD201F09BF804300DF0EEFC403070 +:107F6000C17A01294ED03C0034440000807A0028B8 +:107F700001D0052849D301F0DFF8022810D0002FE6 +:107F800002D10698002840D10020089082E1AA483A +:107F9000A038C068002838D0A8488069486234E01A +:107FA0000AA903C9084345D03C0070440000A34817 +:107FB0002978A038022940D8406D00280AD09F486F +:107FC000A2492038C06840180EF0C7FB002801D035 +:107FD000012100E00021964A906A002802DA640834 +:107FE00064002AE0002909D1954B3C00AC44000014 +:107FF000A03B5B6D002B02D005280DDB01E00728BC +:108000000ADB0120C043906264088E4964000020AE +:10801000A039886514E0D1E0394311D18949A039EC +:10802000CB6D002B02D1896D012909D93C00E844B0 +:108030000000079B002B01D1072801DB64086400C6 +:1080400001309062BDE07D4988690490002088611C +:108050000C9800282CD007F066FC002802D00220E3 +:10806000044325E07A48C06A002804D177483C00E0 +:1080700024450000A038C06800281CD104980028BE +:108080000DD12878102802D3E878022802D928795F +:10809000102804D304246B4901228A6194E06C48BF +:1080A000A038406D002871D005F0A2FD00286DD0E9 +:1080B0003C00604500006408640088E0FFF75BFA5C +:1080C00000281AD068480078022801D1002F14D166 +:1080D0000020FEF770FE301A0490FFF76CFA0028BB +:1080E00007D0FFF71EFA002803D05D4904988842A4 +:1080F0004FD33C009C45000005F06CFD00284BD19F +:1081000053490878032808D188680122D207301A19 +:10811000904241D201220A7057E054480078022868 +:1081200001D1002F51D14A4988685149801B8842AA +:1081300007D901203C00D8450000FEF742FE7D2112 +:1081400009014018444988604A480078022804D14F +:10815000079B002B01D1012000E00020474B47493D +:10816000584340183C498968891B884230D9079B8D +:108170000020039300F03C001446000079FF0290B9 +:10818000FFF7D8F9049001F057F80499029A514387 +:108190004843019000F0DCFF411C01980122484354 +:1081A000111C00E01BE0314B5B6A834200D30021CD +:1081B000039B0122002B00D03C005046000000220F +:1081C0002C4B51439B6A0122834200D30022500072 +:1081D000081803D023490320087003E00998C068F9 +:1081E000062808D90224089800286ED01D490020CE +:1081F000C8614861A5E01A4948693C008C46000006 +:1082000000280AD1002F05D001224A61C8698018D0 +:10821000C8610AE00020C86103E0002F05D10020FA +:1082200048610D98002800D1C8680020089008789F +:1082300001282FD002284BD1002F08D13C00C8467E +:108240000000E878002802D12878102843D2287945 +:10825000102840D248680A69301A904267D3012238 +:108260000A7038E00000E204000010270000687E79 +:108270000100A086010088130000446D01003C004D +:1082800004470000C857010050C30000983A00009E +:10829000C0570100400D0300C4090000B20C0000EB +:1082A00000200B9A0A9BC0431A4337D0002F35D1C8 +:1082B000079B002B08D06A78022A2FD92A78102A27 +:1082C0003C00404700002CD22A79102A29D2254BA5 +:1082D0001A6C002A06D09A6A9F6CBA4202D11F20FB +:1082E0001FE02EE0204B5A6C002A03D01F4FB31A18 +:1082F000BB4216D31C4B002A05D09A6A9F6CBA4227 +:1083000001D13C007C4700000F200DE0079A002AB5 +:1083100004D0EA79202A01D1002005E0EA79102A68 +:1083200001D3032000E09A6A124A126802400BD17E +:1083300001200890022008700F4808614E6064E731 +:10834000FFE701203C00B8470000089060E70C49B7 +:10835000886A002801DA013002E0002801DD0020EF +:108360008862002008620899200408430FB0F0BD1D +:108370000000A46C010071020000082007005307F0 +:108380000000687E01003C00F447000070470000D8 +:1083900000487047507E010080B53DF07FFD0249E6 +:1083A0000120087080BD00003C7E0100F8B50D1C66 +:1083B0000EF0C8FA2649041C886A264E002801D00F +:1083C000042003E0706A00283C003048000001D01F +:1083D000013870620027002D02D0B761F7610AE012 +:1083E000B0691C490130B061496D002903D00328F0 +:1083F00001D90120F061B460F168009108F0F7FC48 +:10840000F0600099884202D030623C006C48000065 +:1084100034610BE000F090F8002801D0114800E032 +:1084200011483169611A814200D937620B4A0C4800 +:10843000D16C2030002901D00A2103E0017A002903 +:1084400001D0FF310172002D03D1017A3C00A84810 +:108450000000002900D0916A007A002800D1176539 +:10846000F8BDA46C01003C7E0100A60E0000A861CE +:10847000000070470000064980B58968002907D0D0 +:108480000521002800D104210806000E03F03C005D +:10849000E448000005FA80BD606C010007480068F0 +:1084A00007494A69104001D0012000E00020496AD4 +:1084B000884201D10120704700207047100007005A +:1084C000A46C010070B50EF049FA021C00F03AF8F5 +:1084D0003C0020490000104900280ED0081CA031A3 +:1084E0000E780E4B102E01D3806F03E049781029CF +:1084F0000ED3C06FC018841A0AE0081C803045698A +:1085000008498D4201D90C1C05E0C068101A2C1ACC +:10851000002C3C005C49000000DA6419201C70BD8E +:10852000A46C0100A60E000050C3000080B505F049 +:10853000B7FB002802D007F01FFF80BD034800787A +:108540000028FAD007F070FB80BD0000606C0100CD +:10855000034901203C00984900004969032900D8DB +:10856000002070470000606C0100B0B50A4D002487 +:108570002878012803D005F06AFB0406240EFEF7D4 +:10858000D2FC0002204302D1686A002801D10120F8 +:10859000B0BD0020B0BD3C00D4490000606C0100BB +:1085A0000121012800D000210148416270470000EC +:1085B000606C0100154810B504681548006A002871 +:1085C00014D0FFF7CBFF00280ED111481149C43059 +:1085D0004069884208D2CC083C00104A0000A04202 +:1085E00005D3FFF77EFFA04201DA0C4C01E0FF2427 +:1085F00091347D200001844204D900221621832079 +:108600000EF0BDFE01230922211C16200EF0A7FE4C +:1086100010BDB0570100606C01003C004C4A0000E6 +:10862000C05D00001027000070B5051C0E1C00F096 +:1086300043F800280FD0084C2078C00703D405F079 +:10864000ABF909F031FE002D05D02078800702D467 +:10865000301C02F0FDFE70BD606C01003C00884AD9 +:108660000000B0B5002818D01148814215D210483A +:108670000C1C0D1807F0DFFA81000918A14201D285 +:10868000400003E041000918A14201D2241A06E08B +:108690004100A14203D24008F8E7064D074C3C00D8 +:1086A000C44A00000EF072F90019291C07F0DCFA28 +:1086B000B0BD000080B92A00530700004C1D000027 +:1086C00088130000B0B505F0FDFA002813D1FEF7BD +:1086D000B5FE0A4C0A4D0028606300D028600EF0F9 +:1086E0003C00004B000055F9216A002904D1E169E2 +:1086F000401A2968884201D90120B0BD0020B0BDD0 +:108700000000606C0100B057010080B5FFF7DDFF8D +:10871000002805D005F0B7FA002801D1012080BD5E +:1087200000203C003C4B000080BD000010B50A4C0E +:108730000021A268002A03D0A16002F083F910BDD5 +:108740006160011C002204200EF036FD0348216800 +:108750000AF008FC10BD0000BC740100C4600100F8 +:1087600070B5051C3C00784B000001D1FCF7C1FB43 +:10877000204CE06A002815D01F4BA0695843C60B57 +:1087800020884643F0008019E660FBF71CFEA842F3 +:1087900005D8301CFBF717FE8019A84202D2002032 +:1087A000E06020E0E5603C00B44B0000002D1DD0EF +:1087B0002688A0697043C103281CFBF7A5FD6061F2 +:1087C0000D48321C291C3030FBF70AFC0C4B606949 +:1087D0005843C00B606201F0B7FDA062E06800285A +:1087E00004D02069A168FBF73C00F04B0000F4FBCB +:1087F00070BD0548A168FBF7EFFB70BD0000C874B1 +:10880000010040420F00C0C62D0088130000F1B5E2 +:108810003E4800AB8178C0783E4F0A07040758787D +:108820003B49120F085C1439240F3C002C4C00000B +:10883000801878600130B8601878354D085C0019F0 +:10884000B8610130F861EB7833481E09334B1838B2 +:1088500081785E43AB781D09C8236B43002908D19A +:108860002B4D2D783D60C5607D25ED003C00684CAA +:1088700000005D1B2C4B07E0274D6D783D60C56007 +:108880004B252D015D1B284BF618022000F057F8F0 +:10889000281AF8602248221C18388178032000F03A +:1088A0004EF8301A3862396800AB79615A783C006A +:1088B000A44C00005623F9685A43891AF960C8315C +:1088C00039611849183989780029B96911D100AB83 +:1088D0001A78134B143B9A5C531C59430A2359438F +:1088E000144B591A51430A235943401A386212490A +:1088F0003C00E04C000010E000AB1A780A4B143B3F +:108900009A5C531C59430A2359430D4B591A51433E +:108910000A235943401A0B49386240187862F8BD5F +:1089200000000C5A0100665A010094780100A086EC +:1089300001003C001C4D000000487100B0D68C00C6 +:1089400088100000803801005812000070110100EA +:1089500030B5194B0228DD6806D1002904D12B1C43 +:108960000C339C1A64235C43022809D1012907D1E6 +:1089700064237D243C00584D0000E4006B431C1927 +:10898000A0235343E41A0A235A43032809D1002998 +:1089900007D11323FF24E4006B431B199B1A1C1CF3 +:1089A0005C43032808D1012906D10E2005496843FC +:1089B0004018801A041C3C00944D00004443201CC5 +:1089C00030BD00007C7801008408000010B5074C21 +:1089D0000C2360780549143158434018406801F071 +:1089E0004FFC0021607802F04BFF10BD4C7B010072 +:1089F0000C48F8B540780C233C00D04D00000A49E3 +:108A0000584314314418261D60CE301C0BF00BFD6A +:108A10000027412047550548291C02F0F0FE281C7C +:108A200001F031FC0434C0C4F8BD4C7B010055801A +:108A30000000B0B50A4D4C2128783C000C4E0000D7 +:108A4000094A41438C1822680121FBF7E1FA287892 +:108A500001F0FAFB3C23E056411E012007F034FBF5 +:108A6000B0BD00003C7C010058E301000C23074925 +:108A70005843401880B54068416B00293C00484E7F +:108A8000000002D00BF0FBFD80BD0BF02CFD80BD83 +:108A90000000607B010038220A4B4243D2180029B3 +:108AA00080B504D0022907D10BF0FBFC80BDD26A4F +:108AB0000121FBF7B0FA80BD03218620FCF73C00C2 +:108AC000844E00000FFA80BDD4E40100B0B5040666 +:108AD000240E0C200E49604340184568A86B0028FE +:108AE00003D10021201CFDF7E1FA201C07F0F2FF62 +:108AF000002808D0281C6030C179012903D9FF3132 +:108B00003C00C04E0000C171FF3181710121201C69 +:108B100002F0C5FEB0BD607B010070B50006000E1E +:108B2000051C4C230A49584344183C20005DFF3083 +:108B300006063616281C01F090FB0021281C22682E +:108B4000FBF73C00FC4E00006FFA311C002007F0E0 +:108B5000C7FA70BD58E301000C220F4B4243D218F4 +:108B600010B5546800290DD002290FD12C20005DCA +:108B7000002803D007210C20FCF7BAF9201C0BF0C9 +:108B8000BBFC10BD3C00384F0000002102F08DFE00 +:108B900010BD04210C20FCF7AEF910BD0000607B75 +:108BA000010080B5002907D00C230549584340181F +:108BB00040680BF04AFC80BD012102F076FE80BDCA +:108BC0000000607B01003C00744F000010B5041CE5 +:108BD000002905D002291AD1201C0BF0EBFC10BD96 +:108BE0000D4804700D4807F007F90D48018801226F +:108BF0001203114301804C200A4960434018403061 +:108C00000078FDF75DFD201C3C00B04F00000AF02D +:108C1000D4F810BD03218620FCF773F910BD3C7C0D +:108C20000100054E00003280070058E30100FFB547 +:108C3000051C012083B001900C205D4A6843861812 +:108C40000127002974680ED002293C00EC4F000077 +:108C50006AD12C20005D002803D006210C20FCF7EF +:108C600053F9201C0BF020FD07B0F0BD524814381A +:108C70004570A06B002807D0504807F07FF801210D +:108C8000281CFDF725FA1CE04D4807F03C00285051 +:108C9000000077F84A48143805704B4801880122D3 +:108CA0005203114301804020005DFDF712FDB068C2 +:108CB000002809D1281C07F064FFB060002803D108 +:108CC00009210C20FCF723F90598002803D03C006B +:108CD00064500000E06C0130E0640EE06720005D4D +:108CE000002807D1E06C002804D139480238C06A56 +:108CF000A06409E0206D002801D0002704E0281CB2 +:108D000007F000FF0028E5D105982065201C2030E1 +:108D10003C00A0500000626A0290817B281C07F092 +:108D200078FF002F19D0201C6030C1794A1CC27115 +:108D30008079814202D2012001E040E000200190D0 +:108D400000280AD025480078800706D500F00DFBE2 +:108D5000011C3C00DC500000201C0BF015FD0190B4 +:108D6000019800280FD00298007B022803D1201C14 +:108D700004F0D0FE84E7012800D07EE7211C301CDF +:108D800004F0E2FE7CE7251C6035E879FF30A8712D +:108D9000687A06F03C00185100009DFC0DF047FE7B +:108DA000071C05F012FF3F180298817B20690430F0 +:108DB00000F035FA616A05F0EAFE39186B7A3088FE +:108DC0008031094A0DF091FE5DE703210C20FCF78C +:108DD000AAF858E700003C0054510000607B0100F5 +:108DE000A54D0000C94D0000328007001D7501002F +:108DF0008D4E0000FFB581B01F1C051C141C101CFB +:108E00000A9E00F0F5FC291C1031201D0622FBF7FC +:108E1000B7F9A88E2080E88E3C0090510000608059 +:108E20000299201C00F007F9FF34013466602760C6 +:108E300005B0F0BD0000F8B50F1C1E1C051C141C6D +:108E4000101C00F0D8FCA888391C2080288960807C +:108E5000201C00F0F0F8FF3401343C00CC5100003D +:108E60006660F8BD70B5041CC0680568201C14302D +:108E7000061C00F00FFB002816D0012202212069F9 +:108E800005F0F8FA002801D0FBF724FF00220221A8 +:108E9000206905F0EFFA002806D0FBF73C000852E5 +:108EA000000001FF002802D0301C0BF07CFB688919 +:108EB0008007C00F03F0A7F818230449584340184F +:108EC000C168002902D0201CFBF7D4F870BD94675C +:108ED0000100F8B5041C101C0D1C191CFF223C00DD +:108EE000445200000027FF2D25D0002905D04B88D3 +:108EF000002B02D000F050FC15E00021104E4B007A +:108F00009E190223F65E864201DD0A1C04E001314F +:108F10000906090E2629F1D3094E500080194E2367 +:108F20003C0080520000C05E272A07D20649203943 +:108F300049574731401A2060012702E07E20C04394 +:108F40002060381CF8BDFA470100B0B50C1C7E212A +:108F5000051C0020C943002C0FD0101C05F06BFD30 +:108F600000283C00BC52000002D0211CC93901E09D +:108F7000211C86390220C043FBF7B4F9011C0120F3 +:108F80002960B0BD98B5141C00220092221CFDF788 +:108F900043FE98BD054980B5086005490120C861B8 +:108FA000012100203C00F852000003F01CFE80BDAF +:108FB000000020670100AC7C010080B5002100208A +:108FC00003F011FE06F00DFB02490020086080BD91 +:108FD000000020670100034901200969002900D130 +:108FE0000020704700003C0034530000106701006F +:108FF00003480069002801D040697047002070478D +:109000001067010070B5161C0D1C041C002801D04F +:10901000012C07D100F036FA002805D013F0CAF968 +:10902000002801D1012070BD3C00705300000120D8 +:10903000002C00D000200A4C043461C4103C00F025 +:1090400024FA002802D000F0C6F901E000F0E5F8AB +:10905000C030C36B221D07CAFBF720F8002070BD8B +:109060000000D4670100F8B50D1C3C00AC530000B3 +:109070000021041C281C05F0E3F9231CFF332133D5 +:10908000FF27002805D02222011C181CFBF796F8A8 +:1090900000E01F700321281C05F0D2F9261CFF36C2 +:1090A0004136002805D00322011CB01C3C00E853C7 +:1090B0000000FBF786F800E0B7700121281C05F0DE +:1090C000C2F9002807D0011C201CFF300A224630BC +:1090D000FBF777F800E077713221281C05F0B3F92F +:1090E000002807D0011C201CFF30122250303C0009 +:1090F00024540000FBF768F800E0F7730621281CF1 +:1091000005F0A4F9002807D0011C201CFF30042220 +:109110006330FBF759F8F8BDFF346134A770FAE704 +:10912000084980B50968002801D107480168081C72 +:109130003C006054000005D103219020FBF71DFF87 +:10914000002080BD01F0D7FB80BD1C6701002067B7 +:10915000010080B5FFF7E7FF80BDF0B5002484462D +:1091600000200BE08740174007D014230B4D4343EA +:109170005B193C009C5400001B7C65462B55013458 +:10918000013001273B1C0E2800D300230E883D1C14 +:10919000A64200DC00252B40E7D10C80F0BD00008A +:1091A0007440010078B5041C01202070082000AB39 +:1091B0000D1C18803C00D8540000161CA01C6946E9 +:1091C000FFF7D1FF00AB0022D243198882406170C3 +:1091D00032202870102018803240A81C6946FFF702 +:1091E000C2FF00AB1888687078BD80B502F035FF0B +:1091F0000021002800D03C00145500000169081C23 +:1092000080BD00000549002801D0C86800E0086959 +:10921000002801D00430704700207047106701001B +:1092200003480069002801D00430704700207047CF +:1092300010670100024800693C00505500000028FA +:10924000FFD1704700001067010010B5054C206980 +:10925000002803D104219020FBF79BFE206910BD5C +:1092600000001067010010B5041C00F040F9002850 +:1092700001D0002010BD201C00F03C008C550000E7 +:1092800057F9002801D0012010BD022010BD0000B8 +:1092900070B50F4E041C30680D1C002807D0211C2F +:1092A000043005F0C1FB002801D030680BE0094A0A +:1092B0001068002809D0211C141C04303C00C8553B +:1092C000000005F0B4FB002802D020689C3000E0CC +:1092D0000348405D70BD206701001C670100CC475A +:1092E0000100044900200969002902D0FF31013141 +:1092F000886970470000106701000148007A3C004F +:109300000456000070470000AC7C0100FEB5061C4E +:1093100000201F1C141C0029029019D0012926D0FE +:10932000022947D12648007805F0A0FBA0720AF078 +:109330004FFC0E2809D1A07A05F0AAFB002804D022 +:109340003C00405600002048007805F092FBA072D7 +:10935000002020722FE01D4D2868002801D1FBF766 +:1093600052FE00972A68231C1832111C301CFCF78F +:10937000DEFB26E0301C0CF0CAFB051C02D0A868FE +:1093800000283C007C56000008D1134800680028E3 +:1093900001D1FBF73BFE104800681830021C0E4854 +:1093A00000970168231C1831301CFCF7C3FB002D0B +:1093B0000AD040352888800606D40020206003E0CB +:1093C000012190203C00B8560000FBF7F4FD029804 +:1093D000FEBDB069010090570100206701001C67C5 +:1093E000010080B5002002F04AFE1823054A5843C8 +:1093F000801840690121002800D04178081C80BDF8 +:109400000000946701003C00F4560000024908691E +:10941000002800D1C8687047106701000348C06881 +:10942000002801D004307047002070471067010009 +:1094300010B5054CE068002803D105219020FBF70A +:10944000BDFDE06810BD00003C0030570000106713 +:109450000100F8B50D1C002A03D01149124F0E78F7 +:1094600001E0114F0C26082E01D2341C00E0082424 +:10947000012101704470391C221C0230FAF7CBFE26 +:10948000321B002A07DD322028703C006C57000098 +:109490003919A81C6A70FAF7C1FEF8BDFF202870C0 +:1094A00000206870F9E70000A4690100B0690100BC +:1094B000905701000149486270470000946701001D +:1094C000034980B508600121012003F03C00A85742 +:1094D0000000C5FB80BD1C67010080B50021012094 +:1094E00003F0BDFB06F0B9F802490020086080BD1A +:1094F00000001C67010003490120C968002900D150 +:10950000002070470000106701000348C0683C005D +:10951000E4570000002801D04069704700207047E0 +:109520001067010080B50221012003F09BFB80BD84 +:10953000054A80B512690021002A03D0111D05F0EB +:1095400091FA011C081C80BD10670100064A80B515 +:109550003C002058000012690021002A05D0111C8F +:10956000FF31213105F08BFA011C081C80BD10670A +:109570000100054A80B5D2680021002A03D0111DE0 +:1095800005F073FA011C081C80BD10670100064A33 +:1095900080B53C005C580000D2680021002A05D04C +:1095A000111CFF31213105F06DFA011C081C80BD32 +:1095B00010670100FFB50D1C1F1C87B0109E002412 +:1095C00002F072FD1823134958430858002819D097 +:1095D000041C331C3C00985800003A1C281C0999B4 +:1095E000FAF79FFD041C14D0182000AB1880AA685D +:1095F00001A86946FFF7E7FD6A4601A9002007F0C8 +:1096000044FE002805D10A2100E00F219020FBF73D +:10961000EAFC201C0BB03C00D4580000F0BD000058 +:109620009467010010B5002402F044FD1823054999 +:10963000584340188068002802D0FAF771FD0124D1 +:10964000201C10BD9467010080B5024B00F04EF85D +:1096500080BD0000106701003C001059000080B57B +:10966000024B00F046F880BD000011670100F8B51C +:109670000E1C151C00281C4910D048681C4A288064 +:10968000002007E00B181C7A142363439B181B7CF3 +:10969000335401302B888342F4DC3C004C590000E9 +:1096A00024E000200F1C002408600FE0305D05F06E +:1096B00007FA0E2801D10020F8BD391908720122DD +:1096C000396882401143081C386001342888A04260 +:1096D000ECDC28887860FFF7B7FE00283C0088594A +:1096E000000006D00169002903D07F21C9430BF097 +:1096F00052FB0120E3E72C7D01007440010010B50E +:109700001C1C00280BD020780E2805D214230C4AEC +:1097100058438018007C00E0002008700EE03C00F8 +:10972000C4590000087805F0D1F92070FFF792FEC7 +:10973000002806D00169002903D07F21C9430BF01E +:109740002DFB012010BD00007440010080B52720D2 +:10975000C04309F031FC80BD80B52720C04309F02B +:109760003C00005A000039FC80BD80B5282009F07B +:1097700042FC80BD000080B5282009F04AFC80BD75 +:109780000000B0B5012828D1012901D0FBF76BFCFE +:10979000FFF7E9FD02281AD107F013FC124C2169EA +:1097A00088423C003C5A000015D007F00DFC2061B7 +:1097B00020687D24E40044430DF0AEF9051C07F059 +:1097C0000BFC281A844200D9241A0122211C0A20E9 +:1097D0000DF0B2FDB0BD002109200CF075FCB0BD4C +:1097E00007210A203C00785A0000FBF714FCB0BDAA +:1097F0000000D46701007D20024900010860704725 +:109800000000D467010010B5816D041CFF304630A4 +:109810000CF0D1FC201CFF305030A16D0CF0CBFCC3 +:1098200010BDB0B5041C3C00B45A00000D1C02F081 +:1098300059FC201C02F056FC1823044958434018D8 +:109840001822291CFAF770FDB0BD000094670100D2 +:1098500010B5041C09F0BCFB201C09F0C7FB10BDAF +:1098600010B5041C09F0D0FB3C00F05A0000201C8D +:1098700009F0DBFB10BD70B50C78061C48884D78EC +:10988000E200801AE900401A011C414312312420F1 +:10989000FAF791FD211C6143C9004018291C694356 +:1098A000C90042180C4988790C4B3C002C5B000025 +:1098B00053430C4A1360537B34021460527B88710B +:1098C00001335810084B801A0121490258430028DF +:1098D00000DA494208188012213870BD20100700B4 +:1098E000EC04000000A00700030300003C00685BDC +:1098F000000010B5041C06210430FAF770FCFF20AC +:109900002130FF210155201CFF3041308170417111 +:10991000C173FF2063300155002020616061FF3476 +:109920000134A060E06010BD000070B5061C3C0072 +:10993000A45B0000081C58609A601C1C1E60151C6B +:109940009B8AE28A311C02F0A1FC281AE06070BDFB +:1099500070B5041C081C111C1E1C0025EB43221CA6 +:1099600018320BF0F7FB221CFF325032111C0A395F +:109970003C00E05B00000123201C00F0C6F80C282E +:1099800010D00125201C0BF0ACFA201C00F019F8B7 +:10999000201C00F00AF8201C00F029F8311C201CC3 +:1099A0000BF017FA281C70BD0000FF211D3109586B +:1099B00080303C001C5C00008907002901DA01218D +:1099C00000E00021C1627047011C803100220A635F +:1099D000074A1268002A09D04288920606D5FF304D +:1099E0000130C069400701D40120086370470000BE +:1099F000AC6901003C00585C000080B5011C4A883D +:109A00000020520505D5FF310131C969490700D44D +:109A1000012006F0ECFB80BD0000F8B5051C98683D +:109A2000171C0E1C1C1C002802D1201C0CF031F845 +:109A3000AB69391C301C3C00945C0000A2680BF040 +:109A400095FBF8BDF8B5161C0D1C1F1C002402F078 +:109A500061FB18230649584340184368002B05D082 +:109A60003A1C311C281CFAF78EFB0124201CF8BD7F +:109A70009467010080B507F03C00D05C0000C5FA97 +:109A8000094908610868002802D17D2000010860AA +:109A900008687D21C9004143002301220A200DF0FE +:109AA0004EFD80BD0000D467010080B501210A2071 +:109AB0000DF097FC80BDF8B50E1C3C000C5D00005D +:109AC0005168141C1268A5680B1C751B5719974226 +:109AD00000D20131426800258A4202DD0125626020 +:109AE00005E09A4203D10168B94200D90125002D51 +:109AF00009D001682160A660A38AE28A3C00485D23 +:109B00000000606802F0D7FB301AE060281CF8BD46 +:109B1000000080B502F007FB1823034958434018A2 +:109B20001821FAF798FB80BD000094670100FEB58C +:109B3000041C081C111C1E1C0C25012200923C0058 +:109B4000845D0000A26902ABFDF7F0F8002845D063 +:109B500002982721021C0A4001D1084302902149A2 +:109B6000A069084006D00298014003D14921C900EC +:109B700008430290A06D0299884230D0002E2DD06B +:109B80003C00C05D00004021201C5830FAF769FB02 +:109B9000029800250026371CA06519E0C00711D5E2 +:109BA000F019001970300571281C04F0D4FF00284A +:109BB00004D0A01980300572013603E0E01960304E +:109BC00005703C00FC5D0000013701352D06029850 +:109BD0002D0E4008029002980028E2D18420065100 +:109BE000F0192067E765002500E00B25281CFEBD65 +:109BF000D83A000038B5051C081C111C0024E243AB +:109C00006B46FFF73C00385E00004FFA002805D095 +:109C1000A86900990140814200D10124201C38BD6F +:109C200000007CB5056A8669041CC068FBF7B7FBB9 +:109C3000E169FBF7DAFA201CE2694030C18B128936 +:109C40008918C18306493C00745E000001940091AC +:109C50002869331C82880168E068C06800F0F2F966 +:109C60007CBD0000915E0000B0B5D1685569C86840 +:109C7000141C144B0CE002689A4207D1C268CA60F7 +:109C80000021C1600160FBF73C00B05E000073FB87 +:109C900003E0011CC0680028F0D1E068C068E860FB +:109CA000E068C560201C4030C18B2A898918C183B7 +:109CB0002068002802D0FFF7BAFFB0BD044804F0C6 +:109CC0004EF9006A07F077FAB0BD3C00EC5E000088 +:109CD000A07E0100A06A0100F1B582B00298066979 +:109CE000011C083660314568019182E01021002096 +:109CF0002F69FBF763FB6861018908390904090CC6 +:109D000001816869006840180821FBF73C00285F62 +:109D1000000057FBE86168697188006820220180B3 +:109D2000716841600199497B89011143C17000212B +:109D300081702820FBF775FC3988041CC181A86B51 +:109D4000002803D1012080020843E08106223C0064 +:109D5000645F0000391D201C1030FAF7C5FA391C69 +:109D60000A310622201C16300090FAF7BDFA391C81 +:109D700010310622201C1C30FAF7B6FAE189254A78 +:109D80005C201140012292031143405BE1810F21CD +:109D90003C00A05F000008406084201C2030162199 +:109DA000817100212170E96B002907D02969098B95 +:109DB0000907090F2170A184182181710622601CF6 +:109DC0000099FAF794FA7068000EE071706800026A +:109DD000000E3C00DC5F0000207270680004000E82 +:109DE00060727068A0727088000AE07270882073D8 +:109DF000708801300004000C708002D1706801305E +:109E00007060AC61029828622D68002D00D079E75F +:109E1000029804493C00186000004268044804F0BD +:109E200074F8FEBD00008FC7FFFF3DDA0000A06A96 +:109E30000100B0B5074D2878032808D000242C7005 +:109E40006968002903D00120FAF7C8F96C60B0BD39 +:109E500000009C7301003C0054600000F8B52B4BDF +:109E6000D86A002850D02A48011CFF310131CA6845 +:109E70000132CA601A6C002A02D14A6901324A6171 +:109E80000A6901320A61DA68002A04D01F4A0132E5 +:109E90001278002A02D18A693C00906000000132E9 +:109EA0008A610025071D18261A4A6E43743290599C +:109EB000002829D0B4186069002825D160680028DE +:109EC00002D00168002905D1A16800291CD00968C9 +:109ED000002919D0002805D0E1683C00CC600000C2 +:109EE0000131E1600068814211D3A068002806D0EA +:109EF0002169006808180CF0A3FD002807D0064A65 +:109F00000120606174329159381CFAF770F90135FB +:109F1000022DCBDBF8BD0000447D01003C00086150 +:109F20000000F4670100F8B50F1C0025041C002890 +:109F300025D0201C04F003FE002806D0FFF7FFF810 +:109F4000041CFFF750FB061C07E0201CFFF791FBE9 +:109F5000061C201CFFF76FFB041C002E06D03C00E3 +:109F600044610000FFF74CFB002802D001250120CE +:109F700007E0002C06D0FFF7EFF8002802D00125FB +:109F800000203860281CF8BDB0B5C568041C0DF071 +:109F90008FFC207EC10708D5E168A94205D9226956 +:109FA0003C0080610000914202D3E18A0131E182EC +:109FB000810708D5E168A94205D22269914202D8F9 +:109FC000E18A0131E182400706D5E06821698842D3 +:109FD00002D1E08A0130E082E08AA18A88420DD372 +:109FE000607E3C00BC61000002280BD02068E16864 +:109FF000042207F065FB607E002803D1206808F08A +:10A00000ABFFB0BD0020E082B0BD000070B5061C03 +:10A010000C232049584345180020A860301C06F046 +:10A0200091FE041C3C00F8610000686033D0012000 +:10A03000A8702C20005D022803D1201C03F045FEEF +:10A0400010E0616B00290AD0012804D1211C281CD2 +:10A0500003F055FE06E0201C0AF00DFC02E0201C77 +:10A060000AF03DFB0D483C003462000014384168A2 +:10A07000002910D0201C4030028B1207920F012AB9 +:10A0800009D0808B32020009000410438122024370 +:10A090000C200DF0B7F90CF0A5FD606470BD000058 +:10A0A000607B0100FFB5081C3C0070620000111CC1 +:10A0B0000C32202414430C4A83B00CAE526860CE9C +:10A0C00094700024D47093630D234027BB52946195 +:10A0D000148401220292321C00900191231C291C3D +:10A0E000039800F066F907B0F0BD3C00AC620000D8 +:10A0F000A07E0100F8B5041C0027114E1DE0E068A9 +:10A10000002870680CD1808800070DD101210C480F +:10A11000FBF784F9C460E86070688188013102E06F +:10A120008188228989188180E068391C3C00E862B6 +:10A130000000002801D17168C96D251C6160041CF4 +:10A14000002CDFD1F8BDA07E0100064910B549689A +:10A15000002305E08A88048912198A804360C06858 +:10A160000028F7D110BDA07E010010B509493C00C0 +:10A1700024630000002449680AE08A880389D21811 +:10A180008A80C368221C002B00D1CA6D4260181C53 +:10A190000028F2D110BD0000A07E0100011C134870 +:10A1A00010B54068002309E082880C89121982806A +:10A1B0003C00606300004B60CA68002A00D1416621 +:10A1C000C9680029F3D1011C68318164C364436507 +:10A1D00082880823111C08318907890F591A5023D6 +:10A1E000195251188180011C406E4831C16010BD68 +:10A1F00000003C009C630000A07E010010B50749F0 +:10A2000000244B6806E0C268211C002A00D1D96DE9 +:10A210004160101C0028F6D110BD0000A07E010096 +:10A2200070470000FEB5061C0C480C1C40688021DD +:10A23000817000213C00D8630000C170151C4022D1 +:10A2400081631152816101840020042202920090F6 +:10A250000191291C201C1A1C331C00F0BCF8FEBD07 +:10A260000000A07E010070B5061C1748807802210E +:10A27000164A884390703C0014640000101C8078DB +:10A280000843111C887013480024C4707020FBF729 +:10A29000D9F9114D70216860FAF734F83007000FD2 +:10A2A00069689030C8650D4868220880081C28300D +:10A2B00089604861082008823C0050640000081C46 +:10A2C00038304863203848645A20505406480831D2 +:10A2D0004164446570BD0000070058000700A07E7F +:10A2E0000100DEC00000003007000A4B10B5586DB9 +:10A2F0000A490022496800244A623C008C6400003C +:10A300005C654B6E002B01D0DA604A668B6D002BCA +:10A3100003D00A6E0021F9F79CFF10BD0030070042 +:10A32000A07E0100094910B508880130088001208D +:10A33000074980020860074CA26D002A3C00C864EF +:10A34000000005D00521D1200DF06FF90120A06596 +:10A3500010BDB07401000010070000300700FFB509 +:10A3600083B00CAE86468C460E4A43CE0FAD0F1C12 +:10A3700052680C3730CD9770D37096630D263C0031 +:10A38000046500004027BE52059E9661138400229A +:10A3900002922A1C00900191211C6046734600F035 +:10A3A00029F807B0F0BD0000A07E0100FFB5101C29 +:10A3B0001A1C0C1C191C6023FF3213430C4A83B077 +:10A3C0003C00406500000CAE526860CE93700023E4 +:10A3D000D37093634027BB5293611384032202928C +:10A3E0000191291C321C0090201C039B00F005F8F1 +:10A3F00007B0F0BD0000A07E0100F8B5051C1148B3 +:10A400001C1C3C007C650000089B079F4068DE0028 +:10A4100081650266002181800D488159201CF9F771 +:10A4200022FF0B4830184168281CF9F71CFF074928 +:10A4300006984968002C88620F8600D12C1C0548BC +:10A440004C6245653C00B86500000121016501646E +:10A45000F8BDA07E01009052010000300700FFB55A +:10A4600083B00DAE60CE0C9F081C111CD219FF32B8 +:10A47000402414430B4A526894700024D4709363B0 +:10A4800040239F5294613C00F46500001484022232 +:10A490000292321C00900191231C291C0398FFF7A3 +:10A4A000B5FF07B0F0BD0000A07E01004C210D4AB1 +:10A4B000414310B58C180C490978884207D105F042 +:10A4C000C7FD0A48018801223C00306600001203E3 +:10A4D00091430180201C30300C23C156407B8142C7 +:10A4E00002DD208D0CF0E5FB10BD58E301003C7C43 +:10A4F000010032800700011C603180B5CA798B7978 +:10A500009A4207D9487A0C2307493C006C66000040 +:10A510005843085A0CF0D0FB80BD2030007B012846 +:10A52000FAD1487A05F040FD80BD0000607B010053 +:10A5300010B5041C1C21F9F703FF0348A080E0803C +:10A5400020816081A08110BDFFFF00003C00A86653 +:10A550000000FFB5041C002083B00D1C062C0290E7 +:10A5600038D21F4AFF26C10089188978A14203D139 +:10A57000C0008018467804E0013000060016062866 +:10A58000F1DBFF2E24D00193201C0DF0E8F93C00F4 +:10A59000E4660000002805D02421281C01AB02AA93 +:10A5A000FAF730FE1049F00030390F58310609161D +:10A5B000281C059A019BF9F76EFE061C10D1201C81 +:10A5C0000DF0D0F900280BD0281C6969FAF712FEAB +:10A5D0003C00206700000298686104E0062C01D36B +:10A5E000072600E00826301C07B0F0BD0000CC5A5A +:10A5F000010010B50C1C09F086F8002802D0201CC0 +:10A6000009F0B5F810BDFEB5134D041CAE69002E5F +:10A610001CD03C005C670000104F30377868604306 +:10A62000011C2888F9F7D2FF39686143411801A855 +:10A63000321CF9F737FE0298296A401828620BD4B9 +:10A64000E969884208D9A969401A2862019801304D +:10A6500001E000203C009867000002900190019802 +:10A66000FEBDC8740100F8B5002828D00024144DA0 +:10A6700000E0013461000919491949780029F8D12D +:10A6800063001B1903330722694603F0D4FB002C37 +:10A690000FD0002000993C00D46700000AE042007F +:10A6A0001218AE5C531852195E71567801309E71C3 +:10A6B0009278DA71A042F2DB00980322023003495B +:10A6C000F9F77EFEF8BD0000EB620100E8620100D0 +:10A6D000B0B5051C081CFAF73C00106800009DFF8F +:10A6E000041C281CFAF7D9FE211CFAF7FCFD201CDB +:10A6F000B0BDF3B544480C1C007881B0012872D17C +:10A70000FAF782F8414DE86A41490860E86B486011 +:10A710004048FAF7A6F9E86A00283C004C680000B7 +:10A72000FCDA221C0F2001990AF0A4F8384D022708 +:10A730002F63384A64260020AA21083213180130FA +:10A740000004000C64281974F8D3168100205060AE +:10A75000101C103010600025171CD2603C00886867 +:10A76000000008E0281CF9F7A2FF413178190135F3 +:10A770002D042D0C0174B542F4D3264D6F630120D6 +:10A780002863244DE86A0028FBDA0B223B1C244E88 +:10A7900003E00132642A00D10022101C0C213C008D +:10A7A000C46800000139755C1F183F7CBD42F3D1BD +:10A7B000013800D563200029F4D1184E501CF16BEC +:10A7C0001A4A101C0138FDD1F06B884201D0011CDF +:10A7D000F7E702273763164D9021281CF9F7CEFDC5 +:10A7E0003C0000690000281C28302860281C10301C +:10A7F0002F81E860281C20302861042100E00CE053 +:10A800002983E861ED62756301203063221C892091 +:10A8100001990AF038F800202863FEBD00000857AF +:10A8200001003C003C69000000300700108E010070 +:10A8300074FF010009570100204E0000E4FE0100F2 +:10A8400080B513281ED0F02816D109F0B5F90028DC +:10A8500013D10DF0BFFA11F00DFC00220421C42029 +:10A860000CF01CFF3C0078690000094800210078CA +:10A8700005F03FFD05F093F807490120086080BD11 +:10A88000011C0120FAF787FC80BD00F032F880BD82 +:10A8900000006A5701003CD90100B0B50CF0FFF987 +:10A8A0000B49022448603C00B46900000A48046176 +:10A8B0000120772109030861084D6868800702D4E8 +:10A8C00068682043686009F0C7F96868A043686059 +:10A8D0000020B0BDE060010000300700000107006B +:10A8E00080B50123032200213C00F0690000022012 +:10A8F0003CF0F1FA002801D0FAF781FC80BD1CB5CC +:10A90000FCF7F5FAFAF719FE01F003F90024211C0F +:10A91000684601F0E2FB00AB1878012803D002285A +:10A9200001D0032801D10CF0B2FC3C002C6A0000DD +:10A93000013424062416062CECDBFAF709F9FAF7A1 +:10A94000E7FCFAF733FAFAF76DFAFBF7DFFF05F0E9 +:10A950004DFB06F081FC0BF07DF907F029FC114856 +:10A960001021016009010160C90201603C00686AB0 +:10A97000000089000160202101600421016008219C +:10A98000016040210160802101608900016049006F +:10A9900001604900016049000160C9030160890B41 +:10A9A0000160F9F741FF1CBD0000001007003C00EA +:10A9B000A46A000080B53BF04FF83BF07DF9FAF750 +:10A9C0004BF980BDF8B5002500240022002871D085 +:10A9D000434FB9680B1ABB60F868391C0130F86046 +:10A9E000896A002B1EDC0224002906DAFB699842E2 +:10A9F0003C00E06A000006DD3B69984209DD07E0A3 +:10AA0000BB69984201DC012403E07B69984200DDC8 +:10AA10000324786A002808D000207862032C01D132 +:10AA2000022402E0022C00D101242E48012C0079DE +:10AA300018D13C001C6B0000BB78994215DA3B78BA +:10AA40007B7039700131B96201D50131B962B96ADF +:10AA50000125994203D1042804D2013000E00020EE +:10AA600038710122002933DA27E0032C35D1002682 +:10AA7000002807D03C00586B00001E498140386A0E +:10AA800008180CF05CF800282CD01B480078400710 +:10AA900005D5F8683969884201DB0323FE56B86A98 +:10AAA000B04212DD01217962397801257970387060 +:10AAB0000138B86288423C00946B000001D000214C +:10AAC000397100280CDA0720387100E012E007E045 +:10AAD0003879002809D0FF30387106E0002A02D00A +:10AAE0000CF0F8F83862002C04D0FEF797FD291C12 +:10AAF00008F0FCFBF8BD00003C00D06B0000AC7E11 +:10AB0000010050C300001D75010080B510680028C9 +:10AB100002D000F00AF880BD0348C069806808F0E0 +:10AB2000B2F980BD0000846A010010B5041CC06841 +:10AB3000C068002801D1FAF77AFB3C000C6C0000D9 +:10AB4000E068E169C068231C014AFFF7D7FB10BD2C +:10AB5000DD6B0000B0B5051C0C210020FAF7D6FC17 +:10AB6000041C006800214160016029880181698816 +:10AB70004181291CFF312131201C03F03C00486C2D +:10AB8000000077F9291CFF314631201C03F071F9D0 +:10AB9000291CFF315031201C03F06BF9291CFF31B7 +:10ABA0004331201C03F065F9291CFF316331201C5F +:10ABB00003F05FF904480068002802D0201C3C0024 +:10ABC000846C0000FFF78EFD201CB0BDE462010024 +:10ABD000F8B5051C0C1C04D105211820FAF702FB5E +:10ABE0004DE0291C12310622601CF9F725FC221CBD +:10ABF00030320026002100201670344B1B5C2F8A57 +:10AC00003C00C06C0000DF40FF0707D51778013318 +:10AC100001371770671830377B70013101300E280B +:10AC2000EEDBA87B6072107800282BD02A481E210A +:10AC3000095C271C1037217201686181C189217765 +:10AC400081893C00FC6C00007973C18AA181018B71 +:10AC5000E181428A211C60314A80828A8A801F49B0 +:10AC60002C31097A002909D002290AD10122626215 +:10AC70006272428BA281808BE08103E001216662D7 +:10AC800000E000213C00386D0000E87B084001D165 +:10AC90000020F8BDA868431C09D0221C1232009283 +:10ACA000931D0232211C01F09CFAA06200E0A66212 +:10ACB000687B291C1D3120740B4820222062201C37 +:10ACC0004230BE73F9F73C00746D0000C1FB4034A4 +:10ACD0002670687E0449607068682C3148600120E5 +:10ACE000DAE7000090580100C86E010091020100EF +:10ACF00070B5161C0D1C041C002806D00C20FAF799 +:10AD000047FD30C0083806723C00B06D000070BDD1 +:10AD1000002070BD0000011C054880B5006801D00E +:10AD2000012100E00021FCF7A0FC80BD00000C79AF +:10AD3000010070B50E1C041C002801D1FAF78FFA2F +:10AD4000064D2868002801D0FAF73C00EC6D0000A1 +:10AD500089FA04482E60C4600121017070BD0000B2 +:10AD6000A87E01003000070010B5074C20680028BD +:10AD700001D1FAF777FA054800692168F9F7DFFA97 +:10AD80000020206010BD0000A87E01003C00286E5D +:10AD900000003000070001200549C00680B50860AA +:10ADA0000022032154200CF0B8FC80BD00000010EC +:10ADB000070080B500220421C4200CF0AEFC80BD49 +:10ADC0000000044880B500880249FFF7B8FF3C0046 +:10ADD000646E000080BD0000754B0000C874010067 +:10ADE000F8B5061C31480025C0680C1C002830D07E +:10ADF0002E482F4F0430007838762C4804304078A5 +:10AE00003881002A0BD0F9F7A5FA1F20B876201C4C +:10AE10003C00A06E0000F9F7F6F925480430807870 +:10AE2000B87643E02548224984424D6902D26C43FA +:10AE3000E40B0FE01F48211C806A0090F9F723FC07 +:10AE40000099021C4A43A11A1A4A6943526AC90B63 +:10AE500050433C00DC6E00004418022C01D8002056 +:10AE6000F8BDF9F77DFA1F20B876201CF9F7AEF986 +:10AE7000041C114804308078B8760F4F7D6AAC42CC +:10AE800004D2201CFFF722FC051C12E0211C281C08 +:10AE9000F9F7FCFB3C00186F0000061C6843201A01 +:10AEA000FFF717FC051C002404E0786AFFF711FC8B +:10AEB00045190134B442F8D3281CD4E70000C87403 +:10AEC000010030000700C0C62D00011C7D2080B5A8 +:10AED000C000F9F772FB3C00546F00000249886122 +:10AEE0004008C86180BD0000C874010010B5064C60 +:10AEF000211C00200BF042FA211C00200BF00AFA62 +:10AF000000F068FE10BD0000856F000030B50F4DE9 +:10AF10002A78042A19D8002A3C00906F000017D024 +:10AF2000002107E04B005B185C190123E4568442C2 +:10AF300002DA01318A42F5DC8A4200D10139480047 +:10AF4000401840198178024A343A1170C078507024 +:10AF500030BD0075010030B5111C3C00CC6F000005 +:10AF6000383185B09162082111860023141C011C20 +:10AF70005363C068154D0BE00268AA4206D1C2684F +:10AF8000CA60C3600360FAF7D1FA03E0011CC0682D +:10AF90000028F1D1221C4032082120683C000870B2 +:10AFA0000000FAF764FB0B49201C4830029004941F +:10AFB0000391E069828801686E2001920091221C51 +:10AFC0005632035D211C28312068FFF758FA05B07E +:10AFD00030BDA07E0100D57000001CB507493C00C3 +:10AFE00044700000021C01900091C069131C848809 +:10AFF000016810684833221CFFF708F91CBD0000E7 +:10B00000C96F000010B5141C184803F089F8A0425D +:10B0100001D0FAF745F90422201C4030A16AF9F763 +:10B020003C0080700000BDF9002802D101202062A0 +:10B0300005E0002020628420005D002803D1201C50 +:10B0400009F023FB05E02068FAF779FA201CFAF7EB +:10B05000A4FBE0698079062806D1206A0649002809 +:10B0600003D03C00BC70000008690130086110BDCD +:10B0700048690130486110BDA06A010028610100E3 +:10B080001CB5141C154803F051F8A04201D0FAF782 +:10B090000DF9201C4F300279417900AB12021143A7 +:10B0A000C27812043C00F870000011438278120646 +:10B0B0001143009101784078090208439880201CD0 +:10B0C000694606F03CF9002803D1201C09F0E3FA98 +:10B0D0001CBD2068FAF739FA201CFAF764FBF7E781 +:10B0E0000000A06A01003C0034710000BCB51F4D97 +:10B0F000141C281CDC3003F01FF8A04201D0FAF722 +:10B10000DBF8A06C00AB027881781202114302795F +:10B110001204114342791206114300918179C079DA +:10B12000000208439880201C3C00707100006946B2 +:10B1300006F00BF9002817D001280ED1ED6C002D78 +:10B140000BD08020025DE06C0121002800D100219D +:10B1500060686B460A30F9F723F92068FAF7FBF9C3 +:10B16000201CFAF726FBBCBD201C3C00AC71000083 +:10B1700000F08EFEFAE70000C4690100BCB5041CB3 +:10B18000406A0025002803D06068008B05072D0F5A +:10B19000221C403208212068FAF77EFAA168019546 +:10B1A0000091211C221C6032206850313C00E87163 +:10B1B00000000D1CE36809F0E2FFE069806B0028E5 +:10B1C00003D1FEF7E8FA002801D0182000E0102093 +:10B1D000064901940091E169082309680A18211CB5 +:10B1E0002831281CFFF787F9BCBD357100003C00F1 +:10B1F0002472000010B5101C3830906204201086B4 +:10B20000002050631068141C40320421FAF74AFAF7 +:10B21000231C211C2831024A2068FFF7BDF810BD0D +:10B22000657000000EB5C369021C9888054902923A +:10B230003C0060720000019100901B6810689169E9 +:10B240000322FFF7AEF90EBD0000257200000EB517 +:10B25000021C0649102000900292131C01911068F4 +:10B26000002270330021FFF79CF90EBD000025720B +:10B2700000003C009C72000010B5031C002100205F +:10B28000084C00E00131CA00A2589A4202D00B29B2 +:10B29000F8D310BD0B29FCD2C90009190020087190 +:10B2A000012010BD385801008CB500AB86211980F3 +:10B2B000011C04483C00D872000006F0EEFE01902C +:10B2C000684606F0FAF88CBD0000707C010010B5ED +:10B2D000041C0D480D4994B00480062218310C302E +:10B2E000F9F7FBF801A807F0A2F80C2009A94872A9 +:10B2F00000AB1C8002213C0014730000684603F080 +:10B30000DBFF049001A806F0D1F814B010BD0000D6 +:10B31000587C010080B504F045FE05F053FA80BD6D +:10B3200010B5194CE068002806D0611C0878002888 +:10B3300003D14878FF3008703C005073000010BD06 +:10B34000FF300006000E0870A1680029F7D0002821 +:10B35000F5D10E4854308178002903D1C178FF31EE +:10B36000817010BDFF310906090E8170F9D1A16904 +:10B370000029F6D0808803F0D0FB3C008C730000DD +:10B38000044A011C5C320C3205CA801AA269F9F722 +:10B390001FF810BD447D0100F0B5041C4068002575 +:10B3A0000179002285B0C907CB1769490133896A41 +:10B3B000102905D36649C039086B01303C00C873B9 +:10B3C000000008638EE021680E68F678B706FF0F6C +:10B3D000B609002B049706D063691F1C1B6A5037FF +:10B3E0009F4200D10125002D02D063691B6A04E051 +:10B3F0003C23594F7343DB190433E3619F883C00BE +:10B4000004740000002F70D09B79022B6ED0042BA7 +:10B4100017D0062B69D10868A06108890438088113 +:10B4200020680168043101604E4900295DD0049F05 +:10B43000BA425AD14948221C1C3002F065FE05B0C0 +:10B440003C0040740000F0BD0968251CCA794035F5 +:10B45000261CEA738B79221C503213704B796036AC +:10B4600053700B7993704B78D37009781171002168 +:10B4700029721621B173616A002906D0018B090770 +:10B48000090F3C007C7400002972B1811821B1734E +:10B49000011C0A31201C06224930F9F733F8606894 +:10B4A00014220188E982011D201C5830F9F72AF87E +:10B4B000E88A30490840012189030843E8827089FD +:10B4C0000F2108403C00B874000070812068018999 +:10B4D00008390181206801680831016008210020D5 +:10B4E000FAF783F8051C026820680821FAF7FBF8D0 +:10B4F0002068FAF774F82149C5602FE030E0FFE7D3 +:10B50000216860680A683C00F47400008023A2642B +:10B510001E55E564557913792D025B1995792D0433 +:10B520005B19D5792D065B19957812781202AA1845 +:10B5300015040A892D0C083A0A8121680A68083224 +:10B540000A60E169021C0A323C003075000001A863 +:10B5500009680BF03EF9E0692B1C0168201C703073 +:10B5600001AA0BF086F9094901226DE72068FAF774 +:10B5700022F8201CFAF74DF970E7846A010068612F +:10B580000100557200008FC7FFFF3C006C75000082 +:10B59000417000007972000080B502218220F9F725 +:10B5A00093FE80BD704700007047000070470000A8 +:10B5B00070470000704700007047000070470000AF +:10B5C00080B5C068F9F7FAFF012080BD3C00A8757E +:10B5D000000080B50021FF20F9F779FE80BD70479B +:10B5E000000070470000012070477047000070475E +:10B5F0000000704700007047000080B506219920C8 +:10B60000F9F765FE80BDB0B500250129124C3C005C +:10B61000E47500000FD10AF00FFC00281DD06178FE +:10B620003C235943091904310162611C416284625F +:10B63000041C503406E000290FD13C2050432570F3 +:10B6400004190434002C08D02068002802D02021DE +:10B650003C0020760000F8F718FFA5800720A071B5 +:10B66000B0BD6861010070B5041C002101F041FC0F +:10B670006068002801D0216801602068002801D09E +:10B6800061684160124E7068A04201D160687060CC +:10B69000E0683C005C76000000280BD0002506E046 +:10B6A000E068E900411814200BF0E2FF0135308812 +:10B6B0008542F5DB0621201C4430F8F7E9FE206BBB +:10B6C000002801D0F9F786FFE069002801D0FAF7D9 +:10B6D000AFF870BD3C009876000058750100F0B5D9 +:10B6E0001D4F059D3F6801261C1C331C002F00D0F8 +:10B6F0002B1C1D062D0E002906D011780E23164F87 +:10B700000918097A6B4310E02178002913D0FF3122 +:10B710000DE0012901D93C00D476000001311170FF +:10B7200011780E230F4F490811700918097A6B43DD +:10B73000DB19595C21702178002902D11178002988 +:10B74000EAD10948C068002805D02178301C0029BA +:10B7500000D10020F0BD01203C0010770000F0BDBA +:10B76000000018670100246701005C670100AC7CE1 +:10B77000010084460020F0B5002909D011781A4E46 +:10B78000B170194EB178717031700121316127E0CB +:10B79000164E0123F15663465F683C004C7700006B +:10B7A0000023F6560125CC0FB74200D90025002C06 +:10B7B00001D0002DE8D10E4F3B69002B03D0002DA6 +:10B7C00001D1167002E01C4301D111700120012447 +:10B7D000002B00D000243C61002C02D03C00887774 +:10B7E0000000711C397001E0FF3179700028D5D05C +:10B7F0000120F0BD0000AC7C010090B50A4C002097 +:10B8000093B0206103906846002108F084FD207AFF +:10B81000022801D1E06B00E0206CE06101203C00D7 +:10B82000C477000008F08AFD13B090BDF46E0100EB +:10B83000F7B5051C88880C1C82B01F4F002800D16A +:10B8400000270498002801D1F9F78AFD1B483B1C0A +:10B850000068211C0268281C0092049AFEF73CF83C +:10B860003C0000780000061C22D00321049802F05E +:10B87000B8FF00281BD08078012103F0E4FFA088E6 +:10B88000A18E484300040F49000C088003F081F9A1 +:10B890000122002D00D10022011C0E200BF0C9FE58 +:10B8A000002F3C003C78000008D10021281C02F049 +:10B8B000BDFC03E00026281C00F00AF8301C05B08F +:10B8C000F0BD0000C1A10000E4650100A87C0100FA +:10B8D00010B5041CFEF738F80121002C00D100211E +:10B8E0000E200BF03C0078780000DDFE10BDF8B5AE +:10B8F000071C0BF094FAFDF7BCFE002602281E4D33 +:10B9000001D02E70F8BDFDF73EF8041CF9F759FC84 +:10B91000002814D0FDF777F8002810D002F0F9FBCA +:10B92000002801D000243C00B478000000E0154C51 +:10B93000331C211C072216200BF066FF687880213B +:10B940000843687002F00AFC0028DED128788007DE +:10B95000DBD4FDF723F9002805D12878C00702D5EC +:10B96000FDF742F8D1E702F03C00F0780000CDFB93 +:10B970000028CDD02878022108432870211C381CCB +:10B98000FDF7C1F8C4E7606C01007102000010B55A +:10B99000124C01202070FEF7F0F90121A068FBF79E +:10B9A000F4FEA06803F087FF0D483C002C790000EE +:10B9B000A16807F023FDFBF755FFE06800280DD0D4 +:10B9C000094906200AF024FD084905200AF020FD57 +:10B9D000FBF76EFF002801D005F0F8FC10BD000059 +:10B9E0007869010034630100E13500003C006879AA +:10B9F0000000B1350000F0B5244D234C687C203C9C +:10BA00009BB0002808D0022803D820890138208163 +:10BA100037E000276F7434E01C4E68221436311C66 +:10BA20000C3101A8F8F709FE1848338901213C00C0 +:10BA3000A479000044300A1C002B007B00D1021CBA +:10BA40001206120E0DAF3A709446AA7B931930334A +:10BA50005B7B7B70EA7301321206120E0027824272 +:10BA6000AA7301D3AF7304E06246012A01D1776063 +:10BA70003C00E079000000E071600648074A803829 +:10BA800081674267682201A9F8F7DDFD278108F088 +:10BA900012FD1BB0F0BD84660100E92E0000F1B577 +:10BAA00086B006990020886106988468808D656854 +:10BAB00001283C001C7A00004CD9354949680591A1 +:10BAC000002947D00022002100230390281C96461D +:10BAD000944606680496F2788026B2433F2A2ED810 +:10BAE000D706FF0E0126BE40371C049E5209B678C9 +:10BAF0007600B2183C00587A0000264E92001C36A0 +:10BB0000B2583A401ED003E002900289C068511832 +:10BB10000028F9D10598814214D870460130864634 +:10BB2000002B04D06046D86001986246D06003982C +:10BB30000138039006D03C00947A0000231C24684E +:10BB40006068029A01909446C9E77046012807D9B7 +:10BB50002A1C00213F2001F051FF051C0698856139 +:10BB6000281C01F0B3FF0E480068002807D02868A1 +:10BB7000018840790231091A3C00D07A0000281C63 +:10BB800001F0E5FCA2680698C06806990B69291CBB +:10BB9000F8F77CFC034908690130086107B0F0BD83 +:10BBA0000000FC5A0100CC5C010010B5094A80007D +:10BBB0001258D006C00E0130074B3C000C7B000031 +:10BBC0001C68002CFCDB5A602022121A914019607C +:10BBD00019680029FCDB10BDE86001003020070077 +:10BBE000B0B5124C00252570A168114807F032FC51 +:10BBF0006561FBF7A3FEE06800280DD03C00487BA0 +:10BC00000000FBF7A4FE012107200BF070FD0A499C +:10BC100006200AF04CFC094905200AF048FCA068FF +:10BC200003F067FE0021A068FBF7CDFD05F0ABFB3C +:10BC3000B0BD7869010034630100E13500003C00CB +:10BC4000847B0000B135000010B50F4C207C00282B +:10BC500019D16069002816D1E068002806D00A488A +:10BC60001C38C068002801D005F0CEFB0121072058 +:10BC70000BF040FDA06803F03FFE0448A16807F008 +:10BC80003C00C07B0000DBFB0120207010BD786908 +:10BC900001003463010070B50E4C0122A368E56811 +:10BCA000268A5D1BB54201D1002206E025680133DA +:10BCB0002E68A3602660043503C5002A04D1012143 +:10BCC0009D203C00FC7B0000F9F752FB70BD03494E +:10BCD0000220086070BD000044E30100402007001E +:10BCE00080B502F0B9F880BD80B502212D20F9F7AA +:10BCF0003FFB002080BD000080B502212A20F9F71B +:10BD000037FB00203C00387C000080BD000080B57F +:10BD100001212B20F9F72FFB022080BD00000149F3 +:10BD20000120086170477C780100F8B5061C0C23DF +:10BD30000F1C1749584345186C68301C0BF03FFE28 +:10BD4000002F09D1301C3C00747C000003F0EEFE93 +:10BD5000412007551148211CFFF7A6FFF8BD4120DF +:10BD60000755A06B002803D0201C00F0DFF9F5E791 +:10BD7000201C00F0DBF9AC68002C02D00020A86089 +:10BD8000EDE7301C05F034F93C00B07C0000041CE9 +:10BD9000E8D108210C20F9F7F4FAE3E70000607B12 +:10BDA000010055800000074A80B55070516012783C +:10BDB000064B80005201D218101840380268081C47 +:10BDC000F8F77BFB80BD786901003C00EC7C00004B +:10BDD000FC420100B0B50A49041CC870084DE435A6 +:10BDE000A87A0871082C01D3F9F7FCFAA87A05495A +:10BDF00040014018A1004058F8F760FBB0BD0000BA +:10BE0000606C01008043010080B500283C00287D63 +:10BE1000000001D009F01DF980BDB0B5051C0C1C57 +:10BE200000200860686809F036FB6C60B0BD10B592 +:10BE3000041C09F034FB2168002900D1646010BDA6 +:10BE400000000021016040607047F8B546683C0082 +:10BE5000647D0000041C406A351C0A35002804D0AB +:10BE6000201CF9F789FD071C00E00427291C6069E4 +:10BE700000F0F6FC79000F18BA88F18A051C8A4296 +:10BE800005D13088000502D504F0BEFB3CE02868EF +:10BE90003C00A07D000000280FD001328A4204D16E +:10BEA000F9F70FFC2168C1600BE0F9F7F0FBF08AAD +:10BEB000000704D00021296029E0080727D1206865 +:10BEC0002860F08AB8801348016801310160318828 +:10BED00049053C00DC7D000018D429682160002160 +:10BEE0002960E16900290DD0897902290AD1082148 +:10BEF0002186211C3831A162221CDC30084902F065 +:10BF000081F9F8BD201C00F05FF8FAE7201CF9F772 +:10BF1000EFFCF6E73C00187E00002068F9F7BDFB57 +:10BF2000F7E7C4690100B9710000F8B50F1C097882 +:10BF30000124C90721D502F08CFF002801D000247C +:10BF40001BE00E4E756E002D17D0346E0622311C8C +:10BF5000381CF8F7D4FA3C00547E0000002805D1C4 +:10BF60000120002C00D00020041C03E0013D063617 +:10BF7000002DEED1002C03D1024EB06E0130B06620 +:10BF8000201CF8BD1079010030B5051C00200649C1 +:10BF900000221C23CC56AC423C00907E000001D114 +:10BFA000081C30BD01324831012AF5D330BDCC6DBB +:10BFB000010010B5084C00221C235343E358834270 +:10BFC00004D11C20504300190A6010BD01320E2A12 +:10BFD000F2D3002010BDDC7101003C00CC7E0000DB +:10BFE000F0B5416895B0071C90371391041CF878A0 +:10BFF000251C8035C6072879F60F4A4902284DD1FD +:10C000000A6D002A4AD04868013048600AF058FF9B +:10C0100044490861486113990979C9073C00087FC0 +:10C02000000001D441498861206806220690A16879 +:10C0300003A8F8F7EEFA062204A80230E168F8F740 +:10C04000E8FA07A806222169F8F7E3FAB87808ABFE +:10C05000002198700C96636A201CA0300A1C3C00DA +:10C06000447F0000002B02D0028A5207520F08AB17 +:10C07000DA7000AB998413990988C90BD984696B6C +:10C0800010AB1091A96B1191808B29491881096D12 +:10C0900003A8F8F732FA2979686B0BF04DFD29797E +:10C0A0003C00807F0000A86B0BF067FD3DE000289E +:10C0B00038D1486D1490002834D0206806220390AF +:10C0C000A1686846F8F7ABFA062268468018E1686E +:10C0D000F8F7A5FA05A806222169F8F7A0FA0021C9 +:10C0E00004913C00BC7F0000B97808A810AB017235 +:10C0F0000896E9680B9169794172686B0E90A86B9C +:10C100001090288DD880688D1881E1690CA80029CD +:10C1100004D089790170206A0D9001E00721017037 +:10C12000684614993C00F87F0000F8F7EFF902E048 +:10C130002068F9F7CAFA201CF9F7F5FB15B0F0BD35 +:10C140000000C4690100B0B5041CC0680622018962 +:10C150000C3101810568211C0C3D0560A818F8F719 +:10C1600064FA0622A1183C0034800000281CF8F76D +:10C170005FFAA08F0009E062206303480169201C78 +:10C18000F8F7C7F9B0BD00007C790100F8B5061CCE +:10C190006036051C707A0C23254958434418A86B57 +:10C1A0000027002806D0A0783C00708000000128FD +:10C1B00003D1A770707A0AF0B6FD2A1C0C218020EA +:10C1C0000BF095FBA86B002833D0A07802280BD089 +:10C1D000042822D1A7702F1C4037787802280CD170 +:10C1E000707A0AF0A0FD18E003203C00AC8000004B +:10C1F000A0701249002014390969F8F790F90FE08E +:10C200002C1C07E078784121221C08550C21802045 +:10C210000BF070FB6034607A04F020FF041CF1D155 +:10C22000707A4035A98B0002090909043C00E880B6 +:10C2300000000843812101430C200BF0A0FAF8BD57 +:10C240000000607B0100F8B51C49051C886A0130BC +:10C250008862281C0BF07DFD041C11D02B1C2033A0 +:10C260001E1C5A79201CB4301979144FFDF73C007C +:10C270002481000089F8AA7A201CB830B179FDF732 +:10C28000B9F8002F04D101212868FAF76DFAF8BD3A +:10C290006068BC21C08A085328680021FAF764FA54 +:10C2A000002809D00649C86A0130C862002CEED0C7 +:10C2B0003C0060810000201CF9F747FBEAE7201CE6 +:10C2C000F8F73CF9E6E7C4690100A1FF0000F8B502 +:10C2D000164C051F0022211CA03103E02868A04253 +:10C2E00009D02034A142F9D1002A04D102218E20A4 +:10C2F000F9F73C009C81000083F8F8BD0D4FBE7932 +:10C30000606901306061F8F797FDA84207D1A08805 +:10C310000430F8F797FDE0690130E06105E020683E +:10C3200028602560A0690130A061BE71E5E70000CA +:10C33000D05C01003C00D8810000201007000029DB +:10C3400001DB062901DB02207047064BC9005A5C5D +:10C35000C91802704A7842708A78827049684160D0 +:10C36000002070470000CC5A0100B0B50D1C041C21 +:10C37000052801D3F9F73C001482000075F8104835 +:10C380004068002800D00324102D00D30F2506207C +:10C390000B496043123140184178807849190906E9 +:10C3A000090E884200D2011C01208840054901384D +:10C3B000096808400004000C3C005082000002F0B4 +:10C3C00044FEB0BD0000D47A010008200700B0B5DB +:10C3D000041C0D1C09F0CFFD002803D1201C09F01E +:10C3E00082FD0561B0BD80B50AF097FD034A0C32AD +:10C3F00006CA8918081A80BD00003C008C82000023 +:10C40000A07D010070B50B4C049E64680DE065686A +:10C41000854209D1207A0870E068106020691860B0 +:10C42000207D3080012070BD2468002CEFD10020D9 +:10C4300070BD0000A46E010010B5041C3C00C88251 +:10C4400000002030817B20690430FDF764F9011C75 +:10C450006220025B636A4034207802F0CEFD10BD9A +:10C4600000000B4910B508888A690A2350435843D5 +:10C470000ED0084A53899488D2881B1952043C0074 +:10C4800004830000520C9A18C96806324A430A21F4 +:10C490005143F8F7FDF910BDC874010030000700E2 +:10C4A00010B5431C01D1104810BD0F4A0E4B943AF1 +:10C4B0001268443B1B7A10E0546884420CD1002976 +:10C4C0003C00408300000FD1022B03D1D47B022C0F +:10C4D0000AD204E0002B05D1D47BE40704D412680F +:10C4E000002AECD1002010BD101C10BD0000386FD8 +:10C4F0000100011C0120012900D00020704700B577 +:10C50000021C3C007C830000FDF7CEF8002808D018 +:10C51000101CFFF7F1FF1823034958434018006926 +:10C5200000BD002000BD00009467010080B5002818 +:10C5300000D10848074900685031097A002902D023 +:10C54000022904D13C00B883000000E0012100F082 +:10C5500006F880BD002080BD0000A46E0100124AD4 +:10C56000124B127A2C3B002A03D15A68002A18D1A8 +:10C5700004E0022A02D19A68002A12D100207047F2 +:10C58000C27B8A4201D03C00F4830000032A0AD116 +:10C59000827E012A07D1027F01321206120E027733 +:10C5A000C37E9A42EED200680028ECD170470000AA +:10C5B000F46E0100F7B58446002001270024002511 +:10C5C00088B007E06246525D3C0030840000002ADB +:10C5D00005D0AB006E46F25001358D42F5D3002DEB +:10C5E00000D00120002828D00027164C6E4622E0FB +:10C5F000201C00F030F8012801D0072806D10021C6 +:10C60000201C00F034F8316888423C006C84000043 +:10C6100001D2022714E02068C9000C18083C201C35 +:10C6200000F01CF8072807D10120012D00D00020C0 +:10C630002468002800D10834013D0436002DDAD1E9 +:10C640000A9804600BB0381CF0BD00003C00A884C0 +:10C650000000205201000068002901D08002800AF9 +:10C66000704710B540688000440F082C03D30221A6 +:10C670008720F8F7ECFE201C10BD002902D00068CE +:10C68000800D704740688005800D704700003C00B9 +:10C69000E484000010B540684001440F052C03D32A +:10C6A00005218720F8F7D6FE201C10BDF8B5051C23 +:10C6B000880A00901C488E05C069B60D171C1C1C0A +:10C6C000002805D1184881698D421DD0856111E08F +:10C6D0003C0020850000FDF7E8F8154909780E298F +:10C6E00007D1002805D0114950310623C956F9F762 +:10C6F00006FA0E490020C8618D61291C201CF8F73C +:10C70000E2F87943201CF8F7DEF808484161201C64 +:10C7100000993C005C850000F8F7D8F805484069AE +:10C720000A18A24201D2401801E04018001B800202 +:10C730008019F8BDAC7C010011670100F8B50F1C31 +:10C74000061C141C1D1C07F0A1FC0E2809D1201C7E +:10C7500002F0FCFB3C0098850000002804D008484B +:10C76000007802F0E4FB041C0121002EAC7200D022 +:10C77000391C201C02F007FC2860002028726C7213 +:10C78000F8BD90570100031C0A4810B50024021C94 +:10C79000A03203E081883C00D4850000994209D290 +:10C7A00020308242F9D1002C04D102218E20F8F7EA +:10C7B0005DFE002010BD0000D05C0100FFB5061C2E +:10C7C000002081B010601F1C0125141C301CFFF7D5 +:10C7D0006DFF052812D202A33C00108600001B5CEE +:10C7E0005B009F440000030303030800391C301C56 +:10C7F000FFF755FF03E00298F8F7EBF801302060EF +:10C8000004E005218720F8F734FE00252068802801 +:10C8100004D906218720F8F72CFE3C004C86000046 +:10C820000025281C05B0F0BD70B5174C606C0028C1 +:10C8300001D001201DE0164E144D3188A06C002857 +:10C8400008D02878814205D9F8F74CF80138FAF772 +:10C8500051FE0EE0E06C00280AD000203C008886E3 +:10C860000000FAF74AFE29783288914204D99042B2 +:10C8700002D9101C00E0081CFAF7DFFDE16B441A36 +:10C880000AF081FB201A00D5002070BD0000447D15 +:10C890000100F8600100FC600100FFB5274E3C007C +:10C8A000C4860000041CB0790F1C151C81B00090D8 +:10C8B0000AF06CFBC11923480768002F05D10A2133 +:10C8C0008020F8F7DFFD05B0F0BD1E4840688446C3 +:10C8D000002801D100220EE082680368AB4207D134 +:10C8E0003C00008700000379A34204D10B21802083 +:10C8F000F8F7CBFD23E0C0680028F1D1134BF868AE +:10C9000018603D603C71B96004988D1A38616046CA +:10C91000002305E08468A41AAC4203DA031CC06853 +:10C9200000283C003C870000F7D1F860002B08D1BC +:10C9300007483B1C47600848064A00880AF08AFB03 +:10C9400000E0DF600098B071C3E70000201007002E +:10C950007C5D0100213801002C740100F3B583B027 +:10C96000041C09D03C0078870000201C049909F0C1 +:10C970008EFB002803D0201C303005B0F0BD0AF03B +:10C980000EFB1E4A0026049F019600900292029C14 +:10C990000025391C201C143002F0C5FA002801D0F3 +:10C9A000261C03E001353C00B48700001C34042D34 +:10C9B000F2D3002E22D10198134F013001900228AA +:10C9C000E8D30121C906029A00201369009CE31AEA +:10C9D0008B4201DD191C161C01301C320428F4D3D3 +:10C9E0003068002801D0F8F73C00F0870000D3FE43 +:10C9F000301CFDF74AFF301C143006220499F7F76B +:10CA00007AFE009C301C3461BDE7306A010034427C +:10CA10000100094910B54C6903E0E168814203D087 +:10CA20002468002CF9D101E0002C3C002C88000087 +:10CA300003D102210220F8F737FD201C10BD0000B1 +:10CA4000FC5A010010B5C30706D5084B5C690C43BE +:10CA50005C611C7E14431C76800706D5044843693C +:10CA600019434161017E1143017610BD3C00688885 +:10CA70000000FC5701001858010070B50D1C041C83 +:10CA8000161C00F008F8A007C0170130321C291C42 +:10CA900000F021F870BD10B5C30706D5084B5C69DE +:10CAA0008C435C611C7E94431C76800706D53C0059 +:10CAB000A4880000044843698B434361017E91438D +:10CAC000017610BDFC570100185801000322111F08 +:10CAD00080B5012000F002F880BD000030B5151CC3 +:10CAE0000C1C002887B002D01C22224901E02249F8 +:10CAF0003C00E08800001C226846F7F764FE0599B8 +:10CB000000AB1A7E8C43201C9543029A291C0240DC +:10CB10000292019A02400192009A02400092039A06 +:10CB200002400392987C08409874587C08405874DE +:10CB3000187C3C001C89000008401874D87C084010 +:10CB4000D87402991048416101AA06CA91438161D3 +:10CB50008168019A114381608168009A91438160E4 +:10CB600000AA06CA11434268114341604168039A12 +:10CB7000914341603C005889000004A80BF001F883 +:10CB800007B030BD0000FC5701001858010010002C +:10CB9000070010B5041C011C012008F0E0F9002C6E +:10CBA00002D003F01CFF10BDFEF7D1FC10BDF0B5A4 +:10CBB0000C1C010E01233C00948900001B06090691 +:10CBC00099429FB028D11749084000211A2800D364 +:10CBD0000221002919D1C500134F10A8EE19B288FF +:10CBE0002168F7F79DFD201CF8F7EAFD7A5901A9A5 +:10CBF00010A8F7F707FD00283C00D089000005D0F9 +:10CC0000109801A90190B07900F09DF81FB0F0BD17 +:10CC10002A20F8F75EFC201CF8F7D5FDF6E7032183 +:10CC20002A20F8F756FCF1E700007FFFFF002445BB +:10CC3000010010B50C1C802802D03C000C8A0000BA +:10CC4000812808D103E0201C00F006F910BD201C4B +:10CC5000F8F7BCFD10BD03212C20F8F73DFCF6E7EA +:10CC6000F0B50C1C00218BB00A91010E01231B06AC +:10CC7000090699422AD118490840061C3C00488AF6 +:10CC80000000062E01D3072124E02089F8F7F1FEE9 +:10CC900022892168051CF7F74CFD201CF8F799FD47 +:10CCA000F4000F4E281C0AAA69463359F7F7B4FC62 +:10CCB000002801D0012807D12868694600903C006F +:10CCC000848A0000A01900790A9A00F009F9281C4A +:10CCD000F8F7B0FE0BB0F0BD01212B20F8F702FCF5 +:10CCE000F8E700007FFFFF00284601000A1C010E44 +:10CCF00001231B060906994280B508D05B009942C2 +:10CD00003C00C08A00000BD10006000E111C00F090 +:10CD10000EF980BD05490140101C05F0A2F980BD47 +:10CD200001212D20F8F7E1FB80BD7FFFFF0080B5DA +:10CD3000011C0F2000F013F880BD80B5011C0420F9 +:10CD400000F03C00FC8A00000DF880BD80B5011C9D +:10CD5000172000F007F880BD80B5011C012000F00D +:10CD600001F880BDF8B5041C061C802084430F1C0C +:10CD7000192C01D3F8F7EAFB0848045D211C0020B8 +:10CD8000F8F750FD3C00388B0000051C221C391CB4 +:10CD90000068F7F7DAFC2A1C311C0720F8F711F9B4 +:10CDA000F8BDF4450100F8B50D1C161C041C1F1C31 +:10CDB00008210020F8F739FD142201680E4B724358 +:10CDC000D2180C71127C3C00748B00004A710D600B +:10CDD0000B4A8F7112687F2A03D95205520E8023A5 +:10CDE0001A43CA71074A0023516801315160021C7D +:10CDF00081210020F8F708F9F8BD00007440010017 +:10CE0000FC5A0100806E01003C00B08B0000B0B500 +:10CE1000041C08210020F8F70EFD218BE27D051C83 +:10CE200009055207520F490C006811438180A17D0A +:10CE300014230E4A59438918097CC171E16A0160C3 +:10CE4000E168281CF8F717FC0A483C00EC8B00004E +:10CE50000068002801D0F7F7F1FB07490431886822 +:10CE60000130886000212A1C0020236BF8F7D2F8DB +:10CE70000120B0BD744001007C6E01000148806853 +:10CE800070470000806E010010B5041C3C00288C27 +:10CE9000000092B0016868460822F7F762FC00AB18 +:10CEA00098884007400FD87798884004000D188470 +:10CEB000D888588400980D900594208908382081DE +:10CEC000059801680831016000200A900C903C0030 +:10CED000648C00000021112009F078FB0549064A06 +:10CEE000086801300860022102A801F0CDFC12B0F0 +:10CEF00010BD0000806E0100558B0000021C012057 +:10CF00000006084380B52B210AF08AFD80BD000091 +:10CF10003C00A08C0000F7B5041C061C8020844354 +:10CF2000171C062C01D3F8F726FB0B48055D291CBE +:10CF30000020F8F78CFC041C006801992A1CF7F704 +:10CF400016FC391C201CF8F7A2FB221C311C002304 +:10CF500002203C00DC8C0000F8F768F8FEBD000001 +:10CF6000204601000A1C011C80B500230120F8F7AF +:10CF70005DF880BDFFB59FB01F1C051C0A301E90D8 +:10CF80001CAA1DA90AF000FF002871D0002F09D0AB +:10CF90000A2100203C00188D0000F8F75EFC0668AE +:10CFA000041C301DFAF7AFFA05E004210020F8F761 +:10CFB00054FC0668041C28893649012208807080C8 +:10CFC000E88814A9308019A8FCF7F5FCFCF7FFFBF2 +:10CFD000011CFF3121313C00548D0000201C01F068 +:10CFE000EFF819A9201C01F0EBF814A9201C01F09E +:10CFF000E7F8201C2099FDF74BFD0022022101F0EB +:10D0000033FD061C1C9900208861301CF8F71CFABF +:10D01000002E0BD0307A00283C00908D000002D00A +:10D020004021084330721C980222816911438161BA +:10D0300004E01C9902228869904388611DAA06CAEF +:10D0400001A805F058FB09A8002F02D00222427265 +:10D0500001E000214172049401A83C00CC8D000045 +:10D0600004F07AFB01211C9808F0C8FF002F04D0BF +:10D070001C980122816911438161A8881C9C01F0E0 +:10D080009FFE021C211C00E004E00748408809F0D4 +:10D090001FF804E03A1C00210520F9F73C00088E37 +:10D0A00000009BF8002023B0F0BDFC600100987CDC +:10D0B0000100F8B5041CC0680568A01D01F095FFCB +:10D0C000002845D0211C1431201C6A460AF055FE68 +:10D0D00000283DD0FCF77DFA002839D100983C00AB +:10D0E000448E00004B21095C012934D1042609F04B +:10D0F00019F9688800281BD1A8880321890388436F +:10D1000015490026088001220221206901F0B8FC9F +:10D11000041C14D000988069800710D5F8F79AF99C +:10D120003C00808E0000201CF8F7DDF8002809D1B3 +:10D13000F8F77FF901260098022281699143816105 +:10D14000002101E00098022108F061FF0098806949 +:10D15000A988C207D20F301CF9F745F8F8BDFA606C +:10D1600001003C00BC8E00001CB5046900230022B5 +:10D17000002C13D14B24245C022C03D1022905D0AE +:10D18000012203E0022901D101220123002A05D056 +:10D19000009004200193694609F036FA1CBD000096 +:10D1A000B0B5041C3C00F88E0000F2210F200C4D9D +:10D1B0000AF099FB287808280BD201A31B5C5B00BE +:10D1C0009F440703030808080808002C01D105F054 +:10D1D000BCFBB0BD012CFCD1FF2007F038FAB0BD7C +:10D1E0000000746601003C00348F00008CB5054AD5 +:10D1F00000AB1172009019716946082009F00AFA13 +:10D200008CBD0000AC7C0100F3B5041CC06806278F +:10D2100085B0066809F026FF984948632069032114 +:10D2200001F008FC964D00283C00708F00004DD0A6 +:10D230009549403109798078814247D1012120699F +:10D2400001F0FBFB02902069322101F0F6FB019016 +:10D25000021C8D480299FCF746FF002836D00023B7 +:10D260008A480299019AFCF7E4FE3C00AC8F00006A +:10D270000B282ED1864A51887089414003910B1C9E +:10D2800084490B4025D150800399171C00290BD0ED +:10D290000399480502D5381CFCF740FE039988061F +:10D2A00002D5381CFCF724FE2A2120693C00E88FB7 +:10D2B000000001F0C8FB00280DD08078E9698142A8 +:10D2C00009D0E861381CFCF716FE381CFCF707FE95 +:10D2D000381CFCF726FE0027201C20300490407AE2 +:10D2E000082871D10AF0D1FC0020686100233C00BD +:10D2F000249000002B61A86866490130A86030893D +:10D300005C31888201F07AFD62495C310861226AF1 +:10D3100004981821007A01F033FEE16A4018039066 +:10D320005C48006A00280DD0002F0BD1594801231A +:10D330003C00609000005C3001681B0700223068F0 +:10D3400009F049FF002800D105270021A06B0AF051 +:10D35000CEFC0021206C0AF0E8FC4F4B03CE039A70 +:10D360005C33FCF788FD00204C4E0521B06320693A +:10D3700001F03C009C9000006FFB011C01D1F060AB +:10D380001CE00120F0608878454A01321070C878AE +:10D390005070474A1070306900280AD04A780879DE +:10D3A000053109F0DDFA3169F7F785F9F0680028F1 +:10D3B00004D03B4A3C00D89000000132107800288D +:10D3C00008D10020A861716A002903D0201C143004 +:10D3D000F7F774F9344A5C321069316A411800E099 +:10D3E00020E00A23D0680A2209F0FBFE002807D0BB +:10D3F0002D4A316A5C323C0014910000D068401A1A +:10D400001169401A7060294A5C32D0683062F06954 +:10D41000002804D0FAF700FD0120FAF7A1FCFAF782 +:10D4200081FC2748006803F007F90698002803D11B +:10D430001E4E0023B36016E03C00509100001C4ECD +:10D440000120B060069801684068B06519487165B0 +:10D450005430C088002809D0B169002906D001F0F5 +:10D46000DCFC011CE06AB269F7F72FF9002F15D137 +:10D4700012480169002908D101213C008C9100006B +:10D4800001612A68002A03D000210020F7F720F963 +:10D4900009490023CB622B616B6106F0B5F807B038 +:10D4A000F0BD6B680648002BF9D0021D111C381C1A +:10D4B000F7F70FF9F3E70000447D01003C00C89145 +:10D4C0000000F4680100F467010003080000F86040 +:10D4D0000100C467010008B5F8F72FFD009000AB0C +:10D4E000188800280CD005F050FF00AB5988188828 +:10D4F00005F06DF9FEF797F80320FBF70EF83C00F6 +:10D500000492000008BD0120FFF7B2FB002008F0E4 +:10D510008DFEF7E7F8B54F498C68206A00680578FA +:10D52000FCF768FA002812D02A07920F0121012A7D +:10D5300000D00021002903D02906090F0B2906D1AC +:10D540003C00409200002A21095D08189030007BC1 +:10D55000F9F70DFC414F3C3FB86B796BF7F7C0F81A +:10D56000A06C0026C660606B800804D0B8690130EA +:10D57000B86106F0DCF9394D28698005800F08D1C3 +:10D5800078693C007C920000042101307861606B76 +:10D590004008400008436063B86A002803D0606B0D +:10D5A000082108436063201C203000903968F7F799 +:10D5B0009AF80320000228602B498868A063C86895 +:10D5C000E06308793C00B8920000C006C00E251C3C +:10D5D000403528714879687123483C384662009884 +:10D5E000807A01F05EFD00210028214A01D01178E7 +:10D5F00003E09378DB0700D55178A971002804D0A7 +:10D600001B49143108683C00F4920000206400E0DB +:10D610006E80B86AC00702D5FF202871AE71E6613E +:10D62000B8680130B8607968884203D00B21852042 +:10D63000F7F7C4FF0D498868C06C8860FB6A002B4F +:10D640000CD00E4AD47B002B3C003093000002DD4E +:10D650007F2C05D201E0002C02D0D47BE318D373D9 +:10D66000FE62C968884203D105218520F7F7A9FF2A +:10D67000F8BD247E010000400700A0800700E8807C +:10D68000070040000700FEB5304C3C006C930000E2 +:10D69000A06B216BF7F733F82D493C318E68708B06 +:10D6A000062804D2E0690130E0610E203085284967 +:10D6B0003C310D68002D03D103218520F7F784FF4D +:10D6C000244845613562318DEF6804393C00A893E8 +:10D6D00000000C0401210291240C002101911D483D +:10D6E0003C30808AA04203D32C81EE6000240BE002 +:10D6F000002F04D103218520F7F769FF04E03D1CCA +:10D70000201A0404FF68240C0298002804D03C006E +:10D71000E493000012490120086100200290019862 +:10D7200001300190002CDDD10C480C4C3C300760DE +:10D7300001983065B564306A0068606260680130E5 +:10D740006060A1680131884203D00A218520F7F783 +:10D750003C002094000041FF04480068A062FEBD28 +:10D760000000E87D010000300700786E0100B0B5D0 +:10D77000051C01210F200AF0F8F8F2210F200AF011 +:10D78000F4F80C480C4C0068143C00280CD0E078ED +:10D7900001283C005C94000009D00122291C0F20C4 +:10D7A0000AF0ACF86078022806D0012003E0607827 +:10D7B000022801D000206070B0BD00009866010012 +:10D7C0000222002880B500D1032203490E200AF06E +:10D7D0009BF800203C009894000080BD000050C3DE +:10D7E0000000F8B50023002200282ED00689046826 +:10D7F000751E2D04B61AF6072D0CF60FB4460EE072 +:10D80000A75CA618023300977778A7540232120457 +:10D81000009F120C00293C00D4940000777001DDB9 +:10D820008B4215DAAA42EED3C068002810D00289D4 +:10D83000002AF9D06246002A0BD00268665D17788C +:10D8400002336755167001220029D2DD8B42D0DBEE +:10D85000F8BD0022CDE700003C0010950000B0B5F7 +:10D86000041C0D1C0120F8F75EFB0D490028C8615F +:10D8700014D062684260A27C0272A268C260E26850 +:10D880000261228A02750A1D0A621268002AFFD10B +:10D89000026048600020A86001203C004C95000018 +:10D8A000B0BD0120FAE70000A46E0100B0B5041C71 +:10D8B00040680D1C431C02D1211C094808E00020CF +:10D8C000F8F734FB064994390861002803D0211C7D +:10D8D00000F048FE00E00120A86001203C0088958F +:10D8E0000000B0BD0000386F010080B50121972015 +:10D8F000F7F785FE002080BD000038B50A1C143201 +:10D900000092131F051C083A0C1C16314068FEF7E4 +:10D910006CFE002801D0002000E0012069683C0076 +:10D92000C4950000A0606160012038BD10B50C1CDA +:10D93000017A00290FD0012909D0022903D1002141 +:10D9400000200AF073FC00202071012010BD416806 +:10D9500001200AF06BFC00F00DF9F4E780B50449F2 +:10D960003C000096000048680138486001D107F08B +:10D970006EFB002080BDAC790100B0B5051C0C1C0D +:10D9800000F04FFEA060686860600120B0BDB0B5D7 +:10D99000051C0C1C00F06FFEA06068686060012030 +:10D9A000B0BD3C003C960000081C00210022002372 +:10D9B0000EC008C001207047F8B50F1C041C207968 +:10D9C000202801D2202020716679002E02D12579ED +:10D9D00000220DE02579291C301CF7F74FF80029AB +:10D9E00001D1321C3C007896000004E0704380199D +:10D9F00005062D0E321CE079291C00F0F2F9207A80 +:10DA00002F49C007C00F08602E480078C00743D5D3 +:10DA1000A1792C4AC80748D42C4E16608B072B4896 +:10DA200008D5CC0801233C00B4960000A340036055 +:10DA3000490704D52849116001E0402101601368BD +:10DA4000264AB34210D1546801680C4354601468EC +:10DA50000C4001D0516100E0916154680C43546066 +:10DA600094682143916013E03C00F0960000547CE0 +:10DA700001680C435474147C0C4003D0147C0C4398 +:10DA8000147402E0147C8C431474547C0C4354745E +:10DA9000947C21439174B34205D100220168032094 +:10DAA000FFF78DF809E0006800213C002C9700008A +:10DAB0000206120E0320FFF785F801E00B48106004 +:10DAC000002038717D71F7F7E9FD0120F8BD0000F5 +:10DAD000CC5C0100040007005C5B0100B99B000006 +:10DAE000585B0100959B0000100007003C00689700 +:10DAF0000000559B0000B0B50D1C04300024FEF75B +:10DB0000D6FA01206C60B0BD0000F0B5077A43681A +:10DB1000041C0E480E1C00680125011C9BB006E089 +:10DB20004A689A4202D18F76002502E009683C00DB +:10DB3000A49700000029F6D1002D05D1217A0129F2 +:10DB400002D101A9F8F7A8F86068043621C61BB015 +:10DB50000120F0BDA46E010010B50C1C08F0AEFC55 +:10DB60006060012010BD000010B50C1C07F084FAA5 +:10DB70003C00E097000004F054FF002060600120AA +:10DB800010BD0020C043486001207047000010B560 +:10DB90000C1C0079FAF707F8002801D0002000E0FB +:10DBA00002206060012010BD00001CB5064C2068FA +:10DBB00000283C001C98000007D009F0C5FA01902D +:10DBC000206841686846F6F7D6FD1CBDAC790100B7 +:10DBD0000149086070470000AC7901000EB5064BA2 +:10DBE0001B68002B06D00290009101926846D9680C +:10DBF000F6F7C1FD3C00589800000EBD0000AC795E +:10DC000001001CB5041C07F04CFA064841680131BC +:10DC10004160009400210191006801686846F6F7B0 +:10DC2000ADFD1CBD0000AC79010080B5F8F7A3F88C +:10DC300080BD80B5021C3C00949800008021032028 +:10DC400000F05CF8011C034800224369F6F79BFDD5 +:10DC500080BD0000A46D0100F8B50C1C1349051C23 +:10DC60000868161C0130086000202061221C103258 +:10DC7000281D0021071C00923C00D098000003F0F2 +:10DC8000DEFE20712069002810D00104090C00205C +:10DC9000F7F779FE3060291D03C9A060E1603068A4 +:10DCA0000168009A381C03F0CAFE20710120F8BDFB +:10DCB00000001075010080B5021C3C000C990000AA +:10DCC0000821042009F04EFF032080BD10B5074A4B +:10DCD0000C1C516801315160011C1031C2680430C4 +:10DCE00003F0F0FE2071002010BD0000107501004F +:10DCF000044980B581610821021C03203C00489939 +:10DD0000000009F032FF032080BD95D80000F7B570 +:10DD1000071C161C0621002082B0F7F73AFE051CEE +:10DD200020480078062800D928812C680020A77098 +:10DD30000399E170311C03E00A8910180F1C3C00A4 +:10DD400084990000C9680029F9D16B4601AA211DF8 +:10DD500000F034F800AB187860711878002817D0FC +:10DD600011484068002808D019780020F7F714FE01 +:10DD7000011C381CF7F730FD0AE03868002802D192 +:10DD80003C00C09900003F600120B86100AB1978E9 +:10DD900038894018388100AB9888311C02382080BF +:10DDA000281CF7F71CFD281C05B0F0BD0000C85C5E +:10DDB000010001794279008889180239401A7047B8 +:10DDC00000003C00FC99000070B5084D2C78AD783F +:10DDD0002018061C002D03D070190138013DA843FE +:10DDE0001080801B18700C7070BD0000C85C0100B2 +:10DDF000B0B504680C4A218852780231914211D2A0 +:10DE0000551AF7F73C00389A0000C9FD016800294F +:10DE100002D10060012181610189491901812088B5 +:10DE200040192080607940196071B0BD0000C85C65 +:10DE3000010080B500220621F12009F0A2FE80BD7C +:10DE40000000031C02483C00749A000003704170FB +:10DE500082707047C85C0100B0B5081C0968151CC9 +:10DE60008C78F7F785FD0449A0000958002902D0F5 +:10DE7000281CF6F79EFCB0BD846D0100FEB5041CA5 +:10DE8000C07AA17AC607F60F3C00B09A0000321C97 +:10DE9000201D01F03CF86069254FC10737D5B869EE +:10DEA000002801D0F6F787FC2068056828888007DD +:10DEB00034D101AA02A9281C01F00BFC281C01F096 +:10DEC00012FC0078C0070AD460693C00EC9A00009C +:10DED000800726D4331C291CA27A20697D69F6F7B5 +:10DEE00072FC1EE000AB187A002803D0012806D08F +:10DEF000022816D1281C796AF6F761FC11E000AB04 +:10DF000018790E2801D00F280BD1281C3C00289B23 +:10DF10000000396AF6F756FC06E00007800F03D1CF +:10DF20002069F969F6F74EFC786B2121013078639E +:10DF3000221C802009F031FEFEBD287A01000B4929 +:10DF400018B50878C00711D50A4A101C20303C00CB +:10DF5000649B0000847900AB1C70C079587008780D +:10DF600040231843087005480078087000AB1888F3 +:10DF7000D08418BD0400070000100700E060010015 +:10DF800070470000054910B58879054B1A7C054C8F +:10DF90003C00A09B0000246862401A74887110BD88 +:10DFA00000002010070010000700585B0100044922 +:10DFB0000A6804480068024001D0886170474861DF +:10DFC000704710000700585B0100021C012000068A +:10DFD00008433C00DC9B000080B52A2109F0E6FDE7 +:10DFE00080BD000010B5041C002903D0812907D191 +:10DFF000812000E08020221C2C2109F0D7FD10BDDB +:10E0000002212C20F7F74CFB201CF7F7C3FC10BDB6 +:10E0100080B5B4B03C00189C0000012806D08228CE +:10E020001CD11AA807F035FC34B080BD812913D16A +:10E030000D480C4A816900685032814202D0D16A91 +:10E04000012902D01178022902D107F00AF9EBE781 +:10E050006946F7F75AFE3C00549C0000E7E70121AF +:10E0600000E002211820F7F721FBE0E7A46E010091 +:10E07000B0B5041C0068174D9AB0686308F03EFA0A +:10E0800020791449134A50392C3A02280AD1906851 +:10E090008002A861C868E8613C00909C00000220F2 +:10E0A000287207F0E4F81AB0B0BD031C0020002B62 +:10E0B0000BD152689202AA610A1C8968E961287230 +:10E0C00010686946F7F727FEEDE7A861012028727E +:10E0D0002870002006F07DFAE5E73C00CC9C0000AB +:10E0E000F46E0100704700007047000080B5012108 +:10E0F0000720F7F7E1FA80BD70470000F8B500246B +:10E10000194A0026D56811680435081C916002E0A0 +:10E11000011C4019086053688342F9D83C00089DEF +:10E12000000001341032032C0E60EED3F6F7F1FF3D +:10E1300010481049124C0860104900200122192390 +:10E140005B010C2543431B1945434A511F1C6D18A5 +:10E15000AB606B6000251E1C14369E60331C3C00B7 +:10E16000449D00000135272DF8DB013003289F6016 +:10E17000E8DBF8BD2057010014C80100B4CF01004E +:10E1800018D90100B8CF0100B0B5074C251CC03527 +:10E19000286B1E2100F0F2F9A26B201CDC30296BE9 +:10E1A0003C00809D000000F0B6F9B0BD0000C469DD +:10E1B00001000020102210B50A4905E00C2343435A +:10E1C0005C180C34CC5001300F28F7D30C23584383 +:10E1D0000950044841600160028200218160C160F1 +:10E1E00010BD3C00BC9D000084E2010044E301003E +:10E1F00010B5084CA06A002803D10748F9F7E8FEDB +:10E20000A0620448443000680121F9F795FC60627F +:10E2100010BD0000606C0100CD260100FFB50D1C93 +:10E22000041C1E1C3C00F89D000081B00A9F1C21AC +:10E23000F6F74DFB0398A061256025612681A68233 +:10E24000E76005B0F0BD70B50D1CA421041C0830BA +:10E25000F6F73DFB201C44300622291CF6F765FB2F +:10E2600018483C23411C3C00349E00006162417808 +:10E2700059430918897A062901D1A06202E0211CBC +:10E280004D31A16241783C235943081804300F49AD +:10E2900020620B88002B15D0AC20005D0B4A183291 +:10E2A00000028018B030E0603C00709E00008D6875 +:10E2B000002008E0E268C1005450E668820052196C +:10E2C00071184A6001309842F4DB70BD000068614B +:10E2D0000100587501001FB5041C6034617A031CED +:10E2E000806A084A0291019003923C00AC9E0000B3 +:10E2F000E279181C20300092447B827B5E20C15A58 +:10E3000018690430231C02F07FFE1FBD394E000047 +:10E31000B0B50B1C01886920C05C86B00E4A049120 +:10E32000039005920D4D596A9A6A2D683C00E89E4B +:10E3300000000124002D00D0041C0A48005D01915A +:10E3400002920090181C2030447B827B5E20C15AD0 +:10E3500018690430231C02F0A4FE06B0B0BD514F72 +:10E360000000186701000A61010001898A1C3C0055 +:10E37000249F000002810268023A0260080A090232 +:10E38000084310807047000070B5051C08780E1C0B +:10E39000FF2814D0717802310020F7F745FB041CE8 +:10E3A00002890068311CF6F7CFFA002D06D0281C30 +:10E3B0003C00609F0000F7F734FB211CF7F757FA89 +:10E3C00000E0251C281C70BD0000FFB50F1C1E1CA2 +:10E3D000041C981C0104090C002081B0F7F727FBEE +:10E3E000051C0068002C386003990170386846707D +:10E3F00006D03C009C9F0000201CF7F715FB291C51 +:10E40000F7F738FA00E02C1C201C05B0F0BD000026 +:10E4100070B51048046804600F4920200860A0050A +:10E420000E4E02D5706AF6F705FAE00102D5306E9D +:10E43000F6F700FA3C00D89F00000A480440002587 +:10E4400007E0E00703D5A8003058F6F7F6F90135E4 +:10E450006408002CF5D170BD0000004007000010DA +:10E46000070030740100FFFDFFFE80B5072180200A +:10E47000F7F749F980BD3C0014A00000F8B5144B33 +:10E4800082009C58CA060127391CD20E9140114ABD +:10E490001160114E4000851915E06060207BC100BD +:10E4A000891910310A780D239A430A70391C81406A +:10E4B00031730749000108313C0050A000004018AA +:10E4C000084A416842608068F6F7BEF9287B002858 +:10E4D000E6D1F8BD0000A473010000100700006041 +:10E4E0000700D175000003490120097A002900D1F5 +:10E4F000002070470000047A01003C008CA000005E +:10E5000003490120897A002900D1002070470000CA +:10E51000147A0100B0B50024FAF776FC002814D074 +:10E52000012408F07DFE0A4D0A4B00215A18A03242 +:10E530001278102A06D38A00D218926F3C00C8A025 +:10E540000000821AAA4200D2002401310329F0D32C +:10E55000201CB0BD00008B080000A46C0100014825 +:10E56000C068704700007869010070B50D1C041C7C +:10E57000161CFDF72EFE0020E0602661A5603C0021 +:10E5800004A1000070BD0000F8B5171C0E1C041C8F +:10E59000002801D0002E01D1F7F7F2F8A06807F0AB +:10E5A00049F9051C01D1F7F7EBF8291C6E60AF6043 +:10E5B000201CFDF7FDFDE068411CE160002803D14F +:10E5C0003C0040A100000548216905F02CF92068B5 +:10E5D000A84202D1381CF6F748F9F8BD0000C46023 +:10E5E00001000022013910B505E00C2353431C182B +:10E5F0000C34C45001328A42F7D300210C235A4311 +:10E6000081503C007CA1000010BD0000B0B5041C8E +:10E6100001D1F7F7BBF8201CFDF7DAFD011C856876 +:10E62000A06807F009F9E0680138E06003D1064806 +:10E63000216905F0E7F82168002903D08868496856 +:10E64000F6F711F93C00B8A10000281CB0BDC46069 +:10E650000100012100288CB500D100210E2009F015 +:10E6600032FA832000AB1880002004F00CF80190EF +:10E67000684603F07AF98CBD000080B508F0DFFD34 +:10E6800006490A8906493C00F4A10000096E411AB6 +:10E690000B0C5918891A0904090C401A80BD000096 +:10E6A00000900700A46C010070B5041C887E0D1C4E +:10E6B000202803D903211820F7F740F800262676F2 +:10E6C000A87E291C1B3160763C0030A20000201C73 +:10E6D0001D30AA7EF6F75FF96868291C6060A8689B +:10E6E0001331A060A87B06222073E87B6073287C2E +:10E6F000A073687CE073A8892082A87CE0762677E6 +:10E70000201C1230A676F6F746F93C006CA20000F9 +:10E710006068431C1DD0114D6D61286800281AD017 +:10E72000227B011C0B7B9A4201D3206014E00B1C5E +:10E73000096800290BD00E7BB24208D20B68002B6F +:10E74000F0D01E7BB242EDD323600C603C00A8A247 +:10E75000000001E021601C60002070BD26602C607C +:10E76000FAE7A46E0100134AB0B5516801240029EC +:10E770001ED0131DD1611362436804E0106200686B +:10E78000D061002814D0D06945689D42F6D13C0084 +:10E79000E4A20000106A814204D15160D06900688F +:10E7A000086002E0D16909680160D069FCF7CEFF1A +:10E7B000002800D00024201CB0BD0000A46E010081 +:10E7C000B0B5174D01242968002927D06D61296152 +:10E7D0003C0020A30000436804E0686100682861F1 +:10E7E00000281DD0286942689A42F6D1AA692B698F +:10E7F0009A4200D1A9616A69914203D129600068F7 +:10E80000086006E0006810602868002801D107F061 +:10E81000CCFE3C005CA300002869FCF79DFF0028AB +:10E8200002D0002400E00124201CB0BDA46E010031 +:10E83000B0B5051C0748446807E0211C4431281C7A +:10E8400000F0D6FC002802D16468002CF5D1201C11 +:10E85000B0BD00003C0098A300005875010070B5E1 +:10E860000D1C141C00280B4E08D0706E0623584354 +:10E870000204120C311C281C228007E0218806208B +:10E88000F6F7A7F970662288291C301CF6F795F870 +:10E89000012070BD00003C00D4A3000010790100ED +:10E8A00080B5032803D8044AC000115080BD01215F +:10E8B0002620F6F75BFF80BD7C790100B0B5051C12 +:10E8C000C0680189392939D30468A079882835D1ED +:10E8D000E0798E2832D1207A3C0010A40000012873 +:10E8E0002FD1607A03282CD1207B022801D0FE286A +:10E8F00027D1607B1D210840012822D1A07BC8219F +:10E90000084008281DD1A81DFBF7E1F9002818D000 +:10E910001920215C002914D101303C004CA40000D6 +:10E920003928F9DB688B04210843688303F0D6FE9D +:10E93000002809D1002300222620044909F092F979 +:10E940000348006801F084F9B0BD000050C3000026 +:10E950000C790100B0B5084CA36801333C0088A4D1 +:10E960000000A3600C1C09D02568002D03D0237A79 +:10E970006168F5F7A3FF201CF7F7A9F9B0BD9479FA +:10E98000010070B5041CC06801890568082953D3CB +:10E990000622281C5549F5F79EFF002837D13C0078 +:10E9A000C4A40000E988524E043E812924D1E568C0 +:10E9B0002968087A4A7A000280180004000C420B89 +:10E9C0000005000DE27520834B8900204200B25AF9 +:10E9D0009A4206D128890C38020A00021043488165 +:10E9E0003C0000A5000002E001300228F1D3E068FD +:10E9F00001890A390181E06801680A311CE00022BE +:10EA000000204300F35A8B4201D1012202E0013081 +:10EA10000228F6D3002A11D107E036490622063132 +:10EA2000281C3C003CA50000F5F75EFF002808D13B +:10EA3000E068018906390181E068016806310160FA +:10EA400010E0E068FFF7E2FC0CE002310181E068D1 +:10EA5000016802390160E06800890238020A000298 +:10EA6000104308803C0078A50000E0680325028977 +:10EA70000168244E022A10D90988082905D0C1232B +:10EA8000DB00994203D1012502E0002500E00225C8 +:10EA9000E9007158002900D10225F7F704F8E900D0 +:10EAA0008919898888423C00B4A5000000D9032553 +:10EAB000A11D201CFDF734FC002800D10325022DE8 +:10EAC00005D0032D07D1E068F6F7E2FF70BD201CEA +:10EAD000FDF71CFD70BDE068018902390181E06825 +:10EAE000016802310160E8003C00F0A500003158E7 +:10EAF000201CF5F7F1FE0028EFD1E0680189023112 +:10EB00000181E068016802390160E3E700006A46BC +:10EB100001007C79010070B50E1C041C151CF7F770 +:10EB20008CFB00282AD01B4908683C002CA600005A +:10EB300001300860002E0AD0012E0BD0022E0FD11A +:10EB4000201C04F0CDF8201CFFF7D6FE0CE00821B5 +:10EB5000E06802E0C121E068C90004F035F903E093 +:10EB600002212620F6F720FEE27DE16A3C0068A63D +:10EB70000000281CFCF795FB206300202062A062A7 +:10EB8000201C00F06CFE70BDE068F6F78AFF002DD7 +:10EB9000F9D0E37D00220120E16AF5F7A7FE70BD00 +:10EBA00000009479010080B5012804D105483C009B +:10EBB000A4A60000006801F009F980BD0321262009 +:10EBC000F6F7F8FD80BD00000C790100F8B5061CD1 +:10EBD00080790024C0072DD5F0680068417A11299A +:10EBE00028D1C1880A0A09021143C90422D1017837 +:10EBF0003C00E0A60000114F0907890E0818418863 +:10EC00000A0A090211430D042D0C432D396801D164 +:10EC1000CA070ED4442D06D1C90704D5243000F00C +:10EC200022FB002805D00648854206D138688007B7 +:10EC300003D53C001CA700000124F068F6F73AFF5A +:10EC4000201CF8BD7C5A01006C07000080B500282C +:10EC500007D00021262008F07BFF0248006801F061 +:10EC6000BBF880BD0C79010010B5041C094A081CD2 +:10EC7000516801313C0058A7000051600021216219 +:10EC8000A162E27DE16AFCF718FB2063201CF7F724 +:10EC9000E6FA201C00F0EFFD10BD947901000CB5E0 +:10ECA000021C081C0021019100926A4601A900F093 +:10ECB00002F80CBD00003C0094A7000070B513687A +:10ECC000002B1ED000260B68002B02D113681B6896 +:10ECD0000B6013681C681B89E51808E05C781C1938 +:10ECE00002340C601C78844201D1181C70BD0B6882 +:10ECF000AB42F3D31368DB683C00D0A7000013607D +:10ED00000E601368002BE1D1002070BD000070B5CB +:10ED1000031C20D018681E89051C16E00478DD2C21 +:10ED200010D18478002C0DD1C478502C0AD10479EC +:10ED3000F22C07D144798C4204D13C000CA800008D +:10ED400002290CD18479944209D0447820180230E9 +:10ED5000441BB442E5DBDB68002BDED1002070BD34 +:10ED6000044980B50A780A20002A00D0486A00F0D9 +:10ED7000D1F880BD1C750100B0B5174C3C0048A807 +:10ED800000002068002829D0164DE869002825D108 +:10ED900001F03FFA002821D1FFF741FC00281DD1E6 +:10EDA0002068A969401808F0D6F9002816D002F0AA +:10EDB00006FD2168401808F0CEF900280ED03C006E +:10EDC00084A800000120E86100222521802008F0AD +:10EDD0008FFF0648296A04F083FD0121286A00F0AC +:10EDE00089FFB0BDE85901001C75010034630100C2 +:10EDF00070B5051C0024FAF70BFF184E716A401815 +:10EE00003C00C0A8000000F08EF800280BD104F0F0 +:10EE1000FEFB0021252008F0B0FE0322291C281C3F +:10EE200000F0AFF818E0706A441E00F07CF800288B +:10EE300012D10C48316A04F056FD0121306A00F00D +:10EE40005CFF3C00FCA800000020FAF70DFE06F075 +:10EE500003F8002300222520054908F03FFF201C6D +:10EE600007F0FCFA70BD00001C750100346301005E +:10EE70001027000080B5012807D080280DD100227E +:10EE8000002108483C0038A90000F8F79AFE80BD30 +:10EE9000012902D106490020C86104F0BEFB80BDF3 +:10EEA00005212520F6F7A7FC80BD61A900001C758F +:10EEB00001000021002880B501D1034841680122EA +:10EEC000252008F02CFE3C0074A9000080BD000045 +:10EED000E85901000249C8680138486270470000DB +:10EEE0001C75010038B5031C081C191C114B06D0F9 +:10EEF000012111800A1C191CF5F7AAFD17E00D4D20 +:10EF0000011C2C781288181C3C00B0A90000F5F7F1 +:10EF1000A2FD287884420DD000236B61002803D025 +:10EF2000002007F0A4FA05E0002200210020009252 +:10EF3000F8F723FC012038BD00001C75010070B5F6 +:10EF4000041C012608F0E1F9051C3C00ECA90000B6 +:10EF50000020FAF78BFD444302F040FC02F03EFC37 +:10EF6000011C231C0022281C08F07CFA002813D165 +:10EF70000A48231C00228169281C08F073FA002823 +:10EF80000AD1F8F719FC011C231C00223C0028AA16 +:10EF90000000281C08F069FA002800D10026301C67 +:10EFA00070BD1C75010070B50D1C041C161C07F00B +:10EFB00076F900280DD0FAF752FE002809D0FF306C +:10EFC00001304368002B04D0221C291C301C3C005B +:10EFD00064AA0000F5F7BBFC70BD000080B50121FC +:10EFE0001D2008F0DFFD074A0748116901605169DB +:10EFF00041600649496881600021C16003F074FCEA +:10F0000080BD00002861010048750100905C01008E +:10F010003C00A0AA000070B5041C406B002835D04D +:10F020001D4D00262878002824D04120005D0028AE +:10F0300003D108F076F9A8611BE0696901316961C3 +:10F04000A868002808D0814206D12069011C10312F +:10F0500004303C00DCAA00008222FFF7ADFF6868A4 +:10F0600000280AD06969814207D12069011C10314A +:10F0700004300222FFF7A0FF6E6168780521084086 +:10F0800008D0074800780E2803D36034E079FBF7F6 +:10F09000CFFF70BD3C0018AB00000348066070BD98 +:10F0A00000001C75010010670100D47E0100800281 +:10F0B0007047142330B5094D4B435B195B68082436 +:10F0C000002B00D1022438235A43054B8900D21863 +:10F0D000515A026809193C0054AB0000511A0160F2 +:10F0E00030BD0000744001008C410100F8B5071CE0 +:10F0F0002C48141C2C4A484386468018800D8446B0 +:10F100002B482A4A06261D1C48434A430E2F40D24C +:10F1100001A3DB5D5B009F443C0090AB0000060850 +:10F120000A0F14181D202724272B2F31C8001FE099 +:10F1300088001DE0214970464018000D18E01F4A64 +:10F140008018800D401821E01E481018000D1DE0A9 +:10F150001D4970464018400D0AE03C00CCAB000051 +:10F160001B49401801E01B481018400D11E01A49D6 +:10F17000401805E060462080002016E0174810186F +:10F18000800D06E0164902E016484843164940182B +:10F19000C00D03308008800020802E803C0008AC29 +:10F1A0000000F8BDFF21FF20F6F749FB002020807A +:10F1B0002880F6E70000D1451700FFFF3F00E33845 +:10F1C0000E0055551500FFFF0F00A9AA2A01701C5B +:10F1D0003700FFFF1F00CBCC4C00701C47003C00E9 +:10F1E00044AC0000A9AA7A00701C6700A9AABA0062 +:10F1F00084F61200EC25B4000449002801D009224D +:10F2000000E014224A80486070470000A4690100B1 +:10F2100080B50622F5F740FC80BD0000BCB5151C8A +:10F220003C0080AC0000041C04310904090C01AA54 +:10F230006B46FFF76AFF3820064968434018A10073 +:10F24000405A00AB99884018198840180004000CF7 +:10F25000BCBD8C410100BCB5041C151C01AA6B4649 +:10F26000FFF73C00BCAC000053FF38200549684361 +:10F270004018A100405A00AB998840180004000CC7 +:10F28000BCBD00008C41010080B500280FD00029D2 +:10F290000DD002780B789A4209D1FF2A05D0427826 +:10F2A0000232F5F73C00F8AC000081FB002801D1E8 +:10F2B000012080BD002080BD000080B506220449E9 +:10F2C000F5F775FB002801D1012080BD002080BD2D +:10F2D00000005E400100011C49780120002900D097 +:10F2E0000020704700003C0034AD000080B50622CD +:10F2F000F5F760FB002801D1012080BD002080BD12 +:10F3000080B5FFF7C7FF80BD80B506220449F5F739 +:10F3100051FB002801D1012080BD002080BD0000EC +:10F3200012610100011C80203C0070AD000081438F +:10F330008A080E201C2A10B506D2034C5200A35C8A +:10F340008B4201D11019407810BDFC4101001423FB +:10F350000249584340184068704774400100202219 +:10F36000011C80B50248F5F752FD3C00ACAD000031 +:10F3700080BD0000486101000806000E022801D18E +:10F38000002070470120704700290CD00749096808 +:10F39000002908D01423064958434018C0680028A3 +:10F3A00001D0012070470020704700003C00E8AD0C +:10F3B0000000AC6901007440010010B5041C062275 +:10F3C000011C0448F5F77DFB0622211C0348F5F7D4 +:10F3D00078FB10BD00001261010040800700002989 +:10F3E00001D10020704738235A43074BD2183C0004 +:10F3F00024AE00008300D25A14235843054BC01892 +:10F4000040881018081A0A380004000C70470000E1 +:10F410008C41010074400100F8B5071C081C161C43 +:10F420001C1C191C00F05AF8051C1435221C311C38 +:10F430003C0060AE0000381CFFF70BFF28180004EA +:10F44000000CF8BD000000B500F04BF80A300004D5 +:10F45000000C00BD0000F8B5071C081C161C1C1C85 +:10F46000191C00F03EF845001E35221C311C381CCA +:10F47000FFF73C009CAE0000EFFE28180004000CD3 +:10F48000F8BD0000FFB50F1C81B00AA9141C1E1C9A +:10F4900003C900F029F8051C1E35211C301C00F0A2 +:10F4A00023F82D18221C391C0198FFF7D5FE2818C7 +:10F4B0000004000C3C00D8AE000005B0F0BD0A49C5 +:10F4C00080B50988092904D0142907D101018000D9 +:10F4D00000E0C10008180004000C80BDFF21FF20DF +:10F4E000F6F7D1F9002080BD0000A669010038239D +:10F4F0005943064A14233C0014AF000089188200C7 +:10F50000895A054A58438018408808180004000C9E +:10F51000704700008C41010074400100024803491B +:10F5200000684000085A7047A86901005440010073 +:10F530000A20704710B5041C3C0050AF0000FDF7D6 +:10F5400062FF201C10BDB0B5041CC0680568A01D7A +:10F55000FFF7F5FE002818D0211C1431201C08F0FC +:10F56000E2FD002811D0298809482022818269887B +:10F570000183A98806354183C5613C008CAF00003A +:10F580003021095D1154616B41620120F7F728F8C1 +:10F59000201CB0BD707C010070B5041CC068211C2B +:10F5A00014310568201C08F0C1FD002808D0054E64 +:10F5B000F06802F0CFFD2888F08203203C00C8AF3D +:10F5C0000000F7F710F8201C70BD707C01003EB5FC +:10F5D000041CC0680568A01DFFF7B7FE002821D0F5 +:10F5E000211C1431201C02AA08F077FD002819D034 +:10F5F00002984B21095C002910D0012914D03C004D +:10F6000004B0000002290CD129880D2000AB18801D +:10F61000201C03F051F80190684602F05DFAF6F7FD +:10F62000B5F80021029806F09FFE201C3EBD07F0B1 +:10F6300029F8029800218069C207D20F0420F6F74A +:10F640003C0040B000007FFFEEE710B5041CFDF762 +:10F65000E6FE201C10BD3EB5051C00F040FE002853 +:10F6600015D1281C1430FAF7CEFB00280FD0052145 +:10F670002869FFF786FB041C09D00522211C684677 +:10F68000F5F73C007CB000003DFA05340294684672 +:10F6900003F01AFB2A1C0D218F2008F08FFB00209D +:10F6A0003EBD000010B5041CFAF798F8201C05F0C8 +:10F6B000E5F8201C10BD0000B0B5041C0069002155 +:10F6C00094B0FFF73C00B8B0000061FB6946FBF75F +:10F6D00026F800281ED00098FAF729FA011C01A884 +:10F6E00002F0D7F90098FAF7D2F90490052009AD95 +:10F6F000687202A8211C06220230F5F706FA0120E2 +:10F700000890216A0A903C00F4B00000282009917A +:10F71000005D287201A800F069F8201C14B0B0BD8B +:10F72000FFB5161C1F1C81B00A9D4C20F6F790FBFC +:10F73000041C143006220299F5F7EAF9201C06226F +:10F740000199F5F7E5F928203C0030B100000021CF +:10F750000655E1602762002D01D08E2000E08D204B +:10F76000221C0D2108F033FB05B0F0BD0000B0B540 +:10F77000051C4C20F6F76FFB041C4C22291CF5F7E6 +:10F7800026FA2920405D0D282CD23C006CB10000E7 +:10F7900001A31B5C5B009F44281A281E060A282828 +:10F7A0000E2822121600221C0D218C201AE0221C89 +:10F7B0000D21832016E0221C0D21842012E0221C42 +:10F7C0000D2185200EE0221C0D2186203C00A8B1D1 +:10F7D00000000AE0221C0D21872006E0221C0D21DA +:10F7E000892002E0221C0D218B2008F0F6FAB0BD22 +:10F7F000E868F6F7E6F9201CF6F711FBB0BDFEB598 +:10F80000051C9020F6F72DFB041C9021F5F73C0019 +:10F81000E4B100005BF9374E0127F069042803D9F1 +:10F82000706B013070634DE03348B16B04F0D0F879 +:10F8300001202062A87E211C803102910870221CC8 +:10F840006032019200202F1C20379072787A2B1C96 +:10F850003C0020B200001433D072E868AA1DA060FA +:10F86000E86B48604420405D0872291C201C05F0AC +:10F87000AAFC686A00280AD1019A201C937A02998E +:10F88000221C703258300978FAF7DBF906E03A7A30 +:10F89000231C3C005CB20000E869296A7033FDF764 +:10F8A0008DF93020405D184907280BD15820005DA4 +:10F8B000C007C0170130E06100202061201CF7F76D +:10F8C0003FFF18E00122201C05F0ACFF071C12D0FE +:10F8D00003F006FF3C0098B20000F36D002B06D049 +:10F8E00060682030827B616B381CF5F799F8E86816 +:10F8F000F6F773F9201CF6F79EFAFEBDF0690130A9 +:10F90000F061FAE70000C4690100346301000531C9 +:10F91000000070B5061C3C00D4B200000D1C0904A8 +:10F92000090C0020F6F77CF9041C2A1C311C006825 +:10F93000F5F706F9201C70BD4088704703781B0757 +:10F940009B0F0B70007800091070704704307047EF +:10F9500004307047D42101703C0010B30000002136 +:10F96000417070470000C421017000214170704750 +:10F970000000B4210170002141707047000001496E +:10F98000486570470000C469010001490865704777 +:10F990000000C4690100014988653C004CB30000C7 +:10F9A00070470000C4690100F8B55F4F051CB868D6 +:10F9B0000130B86007F024FD38619020F6F766FA50 +:10F9C000041C9021F5F794F8286B271C6063688B62 +:10F9D0008037261CC007C00F2062688B3C0088B3AC +:10F9E0000000603602214007C00F2063688B80074B +:10F9F000C00FF860287F3870B172002808D1F9F77D +:10FA0000C8FF002802D00120606201E00120A0624E +:10FA1000F868002803D00021022006F0CCFF3C004B +:10FA2000C4B300002B1C1033AA1D291C201C05F098 +:10FA3000DFFBA86A00280CD13978022907D0221CE4 +:10FA40007032201C5830B37AFAF710F908E001261A +:10FA50005EE0AA7D231C286A696A7033FDF7C0F84E +:10FA60003C0000B40000E96800200989002900D1A9 +:10FA70000420F0723878012814D10027009000206B +:10FA800006E02969012903D1A969012789071AD547 +:10FA900006F079FC0028F4D1012F14D10098012838 +:10FAA00011D13C003CB4000008E0201C583006F0A6 +:10FAB000E1FC00280AD08069800707D5F07A082188 +:10FAC0000843F0720120E062E87D3073E868A060CE +:10FAD000E06A002812D01A4FF86B00280ED0307B55 +:10FAE000F5F7DEFE3C0078B40000002809D0211CA8 +:10FAF000381C4030FCF755FC1448B96B03F089FF03 +:10FB0000F8BD104F1248B96B03F083FF0022201C90 +:10FB1000104905F0A2FE061C03D1386A0130386294 +:10FB2000EEE7201CF6F73C00B4B400009FF9E8684B +:10FB3000F6F76EF803F0F2FD0448836D002BE2D077 +:10FB40000022301C296BF4F786FFDCE7C469010052 +:10FB5000C4600100346301001130000010B50A20B8 +:10FB600007F0FEFC07F05EFC3C00F0B400000B491F +:10FB700044180CE0201C07F090FB002807D0F7F792 +:10FB800034F9002803D012218620F5F7CAFEF7F7D2 +:10FB90002CF90028EED101F080FD10BD0000409C42 +:10FBA000000010B50C1C011C174A3C002CB50000CD +:10FBB0000129506904D080291DD0812921D11CE060 +:10FBC0009178012915D102219170141C011C104853 +:10FBD00003F028FF0121606900F02EF9606901F04F +:10FBE0005FFC2070A088A16900230A4A3C0068B528 +:10FBF000000007F07EFC10BD222106E001F01DFC94 +:10FC0000201C00F04AF810BD1C212020F5F78FFEC3 +:10FC100010BDB4790100346301003D2E000070B5C1 +:10FC20001C4CA078002832D0052830D060693C00F8 +:10FC3000A4B5000000F0EAF8184EB579A0780128C4 +:10FC40000BD002280ED0032810D0042817D1421F51 +:10FC50008021202008F008F80EE00021202008F084 +:10FC600031F80CE0A08807F01DFC05E0207800F0DA +:10FC70003C00E0B5000039FA002000F0C4FD6069E6 +:10FC800001F0E1FB0520A070B571606900F061F939 +:10FC900000222021812008F0D6F870BD0000B47940 +:10FCA000010020100700B0B50D4D041CA8780028F5 +:10FCB00014D03C001CB60000686900F00BF90A483B +:10FCC000696903F0A7FEA88807F09EFB002C02D00C +:10FCD000687800F079FF0020A870A968201CF4F76C +:10FCE000CAFEB0BDB479010034630100064B80B593 +:10FCF000997803293C0058B6000006D10421997078 +:10FD00002021021C802008F0A4F880BD0000B479F6 +:10FD1000010010B50C4CA17803290FD11030FAF76F +:10FD2000DEF8002809D0207800F0E5F9002000F086 +:10FD300070FD002105483C0094B60000FCF79CFAD9 +:10FD400010BD1B212020F5F701FE10BDB479010084 +:10FD500051B60000094980B58978032909D100F01E +:10FD6000CDF9002000F058FD01210548FCF784FA88 +:10FD700080BD17212020F5F73C00D0B60000E9FD3A +:10FD800080BDB479010051B6000070B5104C1D1C47 +:10FD9000A378061C0498002B18D10123A3702261BC +:10FDA000E6606170A060A561002007F0ACFAA08059 +:10FDB000301CF7F73CFBE08007F03C000CB700007C +:10FDC0004FFBC721C900281A411A0022202007F042 +:10FDD00057FF70BDB4790100B0B5041C0D1C00F0D4 +:10FDE00009F8201C00F024F8002D01D0FFF7D4FE04 +:10FDF000B0BD0000B0B50C4C051CA0683C0048B775 +:10FE0000000000280FD10A48017E022211406160E3 +:10FE1000017E11430176072003F049FC206003F0C6 +:10FE200098FF03F0EEFFA0682843A060B0BD407CBF +:10FE300001000C8007000A4938B50A1C20323C003A +:10FE400084B70000947900AB1C70D279074C5A70CB +:10FE5000E268002A02D1064D01236B701043E06076 +:10FE600000AB1888C88438BD00100700407C010032 +:10FE700000500700B0B5051C002901D000F028F89B +:10FE80003C00C0B70000064C60782169084303D1EC +:10FE900001210E2006F0C5FD206928432061B0BD78 +:10FEA000000018630100B0B50A4C051C226900204F +:10FEB000002A0CD1002900D004E06078002802D18B +:10FEC00004F03C00FCB7000069FB6070281C06F0E1 +:10FED000EFFC0120B0BD00001863010010B5084C14 +:10FEE000607800280AD006F0E3FC002060702069EA +:10FEF000002803D001210E2006F096FD10BD000061 +:10FF0000186301003C0038B80000094980B50B694E +:10FF1000834204D14A78002A01D1012200E0002264 +:10FF200083430B61002A03D000210E2006F07FFDE1 +:10FF300080BD1863010080B50120F6F756FE80BD34 +:10FF4000000010B5041C3C0074B8000000F004F878 +:10FF5000201C00F01FF810BDB0B50C4D041CA868A3 +:10FF6000A0420FD10720296808F08CFB68680222A4 +:10FF700007490028087E01D0104300E0904308762E +:10FF800004F0C4F8A868A0433C00B0B80000A86022 +:10FF9000B0BD407C01000C8007000A4938B50A1C3E +:10FFA0002032947900AB1C70D279074C5A70E26809 +:10FFB000824202D1064D00236B708243E26000ABA7 +:10FFC0001888C88438BD001007003C00ECB8000059 +:10FFD000407C010000500700B0B5051C0A4C002110 +:10FFE0006069FFF711FF042001F046F901F088FB7A +:10FFF00000220421042001F08BF8281C01F04AFAA9 +:02000004800179 +:100000006069FFF7A7FFB0BD407C01003C0028B944 +:10001000000080B501F077FA80BDB0B50D4D01212B +:100020002869FFF7F4FEFFF72AFE00F02CFB00F032 +:1000300084FA002400220421201C01F06CF8013411 +:100040002406240E042CF5D32869FFF786FF3C0014 +:1000500064B90000B0BD0000407C0100F8B5051C8B +:100060000E1C074C171C01212069FFF7D3FE3A1C18 +:10007000311C281C01F052F82069FFF771FFF8BD10 +:10008000407C0100FFB589B0061C16981D1C002895 +:100090003C00A0B9000001D02948149028680088CD +:1000A0000006800E202801D0142817D10AAA18248F +:1000B000182105CAFFF777F9071C281C0189A142FE +:1000C00002DD006801190BE0C068641A0028F5D150 +:1000D0000F213C00DCB900008620F5F761FC00210F +:1000E00001E00021002718480890807907900C2033 +:1000F000164A704380180479049112991598149A3D +:1001000001910390059700950AAB0292211C301CC7 +:100110000CCBF7F73C0018BA000003F90125B540F5 +:100120000C4E083E3078284006D0201C00F0C9FD57 +:100130003078A843307003E0201C139900F043FF8F +:1001400007A903C988710DB0F0BD952400002010E7 +:100150000700747A01003C0054BA0000B0B5041CDA +:100160000C230949584340180079051C00F092FE01 +:10017000281CF7F7C7F80120034AA040083A117875 +:1001800081431170B0BD0000747A010010B5054CB8 +:100190002078002803D11A213C0090BA0000862064 +:1001A000F5F707FC207810BD000018630100014836 +:1001B0004078704700002C63010080B5F6F7D1FE4F +:1001C00000F01BF980BDFEB50168051C0C680E1C13 +:1001D0002178880771D16869C2073C00CCBA000059 +:1001E0006ED580076DD5E87AC20708070909029124 +:1001F0004549800FD20F00284F6805D0012809D04B +:10020000022821D003285BD1FF23201CA97AF4F710 +:1002100074FC55E002980B280AD00C283C0008BB5F +:1002200000000FD00D284ED1394FF868F4F761FC6B +:100230000020C0435AE0354FA97ABB68201CF4F770 +:100240005BFC40E0324F3869F4F753FC3BE000219F +:10025000019102990020FF23090701D401203C00ED +:1002600044BB000013E03189192901D3267E07E041 +:10027000152904D31826711A49190E7B00E00026AF +:10028000B10602D4012073075B0F01210191002800 +:1002900003D0A97A201CF4F736FC0199012915D165 +:1002A0003C0080BB0000F006C60F20881B4FE48A8C +:1002B000F96B0005C00F00291AD04B1C18D0002E76 +:1002C0000AD0002808D03888844213D002980C281D +:1002D00001E01DE012E00DD0081C01F076F90028C5 +:1002E00003D13C00BCBB000000F0A6FAF4F70AFC06 +:1002F0000020C043F863002E0DD03C800020F8633E +:1003000009E020880006800E202804D1044F201C1C +:10031000B96AF4F7F8FB291C0248FBF7EFFFFEBDB2 +:10032000287A01003C00F8BB0000A59A00000348B1 +:1003300080B50078002100F0FCFB80BD0000186350 +:100340000100044B054900281A6800D0011C101C4C +:10035000196070470000D4790100957500000548C8 +:1003600080B5007F24233C0034BC0000044958437E +:100370004018C069F4F7CCFB80BD0000D4790100BF +:1003800094460100021C064880B581628260007FAD +:1003900024230449584340188069F4F7B9FB80BD11 +:1003A000D4790100944601003C0070BC000080B587 +:1003B000002000F03CFB002000F06DFA00F065FA30 +:1003C0000449C86A0130C862081F008807F0C1F8F4 +:1003D00080BDD4790100064880B500210177C16A4B +:1003E0000131C1620438008807F03C00ACBC000059 +:1003F000B3F803F0D1F980BDD479010080B505F0E0 +:10040000E9FA80BD80B5002803D1012004F022FA6A +:1004100080BD012003F0E6FB80BD00000349012000 +:100420004978002900D00020704700003C00E8BC5B +:1004300000002C63010070B5134D2878002820D1EE +:1004400001212E1C7068FFF712FD0021072006F025 +:100450002AFB0D480024047104F0EDF806F0D5F9EC +:10046000012028700A4804604460F6F74CFD3C0007 +:1004700024BD0000F7F75EF8FFF7A2FF00F0A8FD2B +:100480000548716803F020FB012070BD2C6301005A +:100490005000070080000700C4600100B0B51E4C8A +:1004A0002078012835D1251C69681C4803F020FB01 +:1004B0003C0060BD000004F0F0F81A4801684908EB +:1004C00049000160016801221143016000F02BFE28 +:1004D00000F01BFC06F099F8F6F729FEF6F72DFC64 +:1004E00000202070FFF783FF00F08BFD0F4881781C +:1004F00008223C009CBD000091438170817811432B +:1005000081700C49102008716868FFF75FFDF7F7EC +:1005100039F8F6F74DFD0121072006F0CDFA01204C +:10052000B0BD00002C630100C4600100F0000700B2 +:10053000000007003C00D8BD000050000700034940 +:100540000120897A012900D0002070470000147A28 +:100550000100B0B5154D041C287A002820D1F9F708 +:1005600000FC02281CD101202872E868002810D065 +:100570002068296808603C0014BE000069680D48C6 +:1005800003F0C2FA01216868FFF7C8FC00222420AA +:10059000616807F0CFFBB0BD002028722168012000 +:1005A000F4F7CFFAB0BD00202168F4F7CAFAB0BD65 +:1005B000047A0100346301003C0050BE000004488E +:1005C00080B5007A012802D1002002F0F0FE80BD43 +:1005D0000000047A010080B5012807D0802809D1E5 +:1005E0000748007A002804D0012000E0002002F033 +:1005F000DEFE80BD0E212420F5F73C008CBE0000FD +:100600000BFA80BD047A0100F8B53A4E051CB07AA9 +:10061000002869D1F9F7AEFB022865D13648006899 +:10062000002861D03548716803F074FA01217068C0 +:10063000FFF77AFC6C20F5F7B9FC041C3C00C8BE3F +:1006400000006C21F4F7E7FA30682C220460296876 +:1006500081606968C160002111548162A968002924 +:1006600002D0E968016105E006F05DFF69684018A5 +:10067000316808617068FFF714FD692108553C0076 +:1006800004BF00000020F9F709FB01273B1C061CF2 +:10069000221C24320021F9F779FB1C480321008831 +:1006A00089030843211C40310091488318481021D8 +:1006B00060601848A060A76367630020F5F74CFBF3 +:1006C0003C0040BF0000E06002890099CA830768CF +:1006D000311C381D2761FEF78EFE381C0A300F4989 +:1006E000FEF789FEA4203880002004F0DEFB002203 +:1006F0001F20696807F02DFBF8BDFFE7002029687F +:10070000F4F73C007CBF00002EFAF8E7147A0100F1 +:10071000805A010034630100FA60010099EC000086 +:1007200015ED000012610100064880B5817A0029AC +:1007300007D0006804222030017B1143017302F0CE +:100740006BFD80BD3C00B8BF0000147A010010B5FD +:10075000044CA07A012803D106F0F1FE21688861DB +:1007600010BD147A0100031C081C1F4970B50A68EB +:10077000012B1CD0802B05D0832B30D1887A002808 +:1007800014D029E053693C00F4BF0000002B0ED0C8 +:100790009469D5692E1B0C695D1B361BB610A41914 +:1007A0000C61CC682D1BAD106419CC60936102F014 +:1007B00081FD70BD022812D1906A0C1C0028F8D06F +:1007C00007F00EFAA07A01283C0030C00000F3D1F7 +:1007D0002068816A0029EFD12030017B0822114373 +:1007E000017370BD02F021FD70BD0E211F20F5F7D1 +:1007F00028F970BD0000147A010002490C3103C9C8 +:10080000401870470000147A01003C006CC00000E2 +:10081000054880B5006804222030017B1143017334 +:1008200007F0E4F980BD0000147A010070B5164CA1 +:100830000E1CA17A00291CD02168086107F032FA49 +:10084000002817D020680025056200223C00A8C0BF +:10085000000083211F2007F094FA6068FFF703FC73 +:10086000216804222031087B2B1C90430873311C23 +:1008700000221F2007F061FB70BD20680822203095 +:10088000017B1143017302F0D6FC70BD00003C00F7 +:10089000E4C00000147A010080B500F077FC00F09D +:1008A0006FFC00F029FF00F05DFA00F0C5F800F0E1 +:1008B00085FF80BD80B5FAF785FA80BD0148C06824 +:1008C00070470000287A01000349002800D0011C6D +:1008D0003C0020C100000248C160704700008175E3 +:1008E0000000287A010001480249C86070478175FC +:1008F0000000287A01000149886170470000287AC9 +:1009000001000149002088617047287A01000349ED +:1009100000283C005CC1000000D0011C0248C161FD +:100920007047000089750000287A010003490028FB +:1009300000D0011C02488162704700008D750000E4 +:10094000287A01000349002800D0011C02480162F6 +:10095000704700003C0098C1000091750000287AA3 +:1009600001000349002800D0011C024801617047C2 +:10097000000099750000287A0100014802490861C9 +:10098000704781750000287A0100021C081C802A2B +:1009900080B502D100F03C00D4C1000007F880BD52 +:1009A0001E212120F5F762F880BD0000B0B5104D82 +:1009B000041CA86B0130A863696B091A281C006B22 +:1009C0000C2903D90021FFF791FA03E0082901D18E +:1009D000FFF732FB201C00F03C0010C200004DF974 +:1009E0006069400701D503F00CFC201CE96AF4F7AC +:1009F000DBF8B0BD0000287A01000349002800D0D0 +:100A0000011C0248416270470000B5750000287A59 +:100A1000010003490120096C00293C004CC2000080 +:100A200000D1002070470000287A010010B5074C63 +:100A3000E16B002901D1E06304E0814202D0002093 +:100A4000C043F8E706F09CFD206410BD287A010041 +:100A50000148006C70470000287A01003C0088C201 +:100A60000000054980B5002048638863FF210931F3 +:100A700015221020F6F7FBF980BD287A0100034902 +:100A8000002800D0011C0248816070470000C17539 +:100A90000000287A01000349002800D0011C3C0016 +:100AA000C4C200000248C16270470000C575000062 +:100AB000287A0100044B054900285A6800D0011C1F +:100AC000101C596070470000287A0100C9750000A9 +:100AD0000349002800D0011C024841617047000012 +:100AE0003C0000C30000CD750000287A01000F4BC8 +:100AF00010B5D968002919D00E4C0021CA0012196E +:100B0000403AD26B824202DA01310329F6D3481C03 +:100B10001A780006000E904208D018700806000EE1 +:100B2000041C3C003CC30000F6F7BAFA201C03F09A +:100B30001BFD10BD186301003C42010010B5144CB0 +:100B4000E168002922D02178124BCA00D218403A1D +:100B5000D36B834202DA481C20700BE0926B824216 +:100B600014DDFF313C0078C300000806000E207041 +:100B700003D119218620F4F78EFF2078FF3000067C +:100B8000000EF6F790FA2078FF300006000E03F012 +:100B9000EEFC10BD0000186301003C420100094852 +:100BA0000021018141813C00B4C300008181C181E9 +:100BB000074A02800123DB0243808280C2804176A3 +:100BC00031218176012101767047000030800700D5 +:100BD000FFFF000080B50120F6F7F8F80120F6F7D6 +:100BE000DBFC0120F6F75AFA3C00F0C300000120BC +:100BF00000F0F1FD0120F7F7C6FB80BD000010B545 +:100C0000114C002907D1002802D10120E06006E044 +:100C10000021E16003E0012907D1002801D0207004 +:100C200003E018218620F4F73CFF3C002CC40000B0 +:100C30002078FF300006000EF6F73EFA2078FF30ED +:100C40000006000E03F09CFC10BD000018630100BC +:100C5000054980B50968884205D0FEF7FFFB00F022 +:100C600087FAFFF72BFC80BDA86901003C0068C42F +:100C7000000001494870704700002C6301000149E1 +:100C8000C860704700004C7B0100034901200978CF +:100C9000002900D00020704700002C630100044AA6 +:100CA000002802D0906901309061D06940183C0062 +:100CB000A4C40000D0617047905C0100FEB5041C24 +:100CC00000680568281CFEF727FF071C6069154EA1 +:100CD000C007C00F21D001AA02A9281CFEF712FFED +:100CE0003878C0070CD46069800708D500AB187A43 +:100CF0003C00E0C40000002801D0022802D1706A44 +:100D000001307062FEBD00AB187A002801D00228C5 +:100D1000F8D1706A01307062B06A0130B062F1E7F8 +:100D2000F06A0130F062EDE70000905C01000249DA +:100D300048693C001CC50000013048617047000054 +:100D4000905C01007047000070470000011C4031BA +:100D500010B50A8B1207920F012A33D04A781A492C +:100D6000041C6034002A0B6A22D1E279012A02D9DC +:100D7000CC6801343C0058C50000CC60022A02D97E +:100D80000C6901340C610C6801340C60446B002C5C +:100D900003D00469247CE40702D54C6801344C601C +:100DA000806B002802D0086B01300863002A0CD049 +:100DB0009818013808E03C0094C50000012A01D0D1 +:100DC000022A02D1886801308860E0791818086228 +:100DD00010BD0000905C01007047000001490A202E +:100DE00008817047C47A0100F0B5324F041C78784E +:100DF00085B0C007C00F03903C00D0C50000B87894 +:100E000002900120A0400490391C88702C48008872 +:100E100006F00BFC0190FEF7AEFC0430294EA50055 +:100E200071590979884206D0FEF7A5FC7159043042 +:100E3000087101207870002078703C000CC600001A +:100E400021480121204E3038015571590320087086 +:100E500006F0C6FB061CFEF791FC36180E3609E0BC +:100E6000301C06F0F5FA002804D023218620F4F780 +:100E700033FE03E0F6F734FB0028F1D03C0048C60F +:100E80000000124813493C3800780872201CF4F71F +:100E9000A2FA0E4E715908710398002801D0012161 +:100EA000797009480088019906F0BDFB0298B87076 +:100EB000094949790498884203D0242186203C00BE +:100EC00084C60000F4F70EFE05B0F0BD0050070028 +:100ED000D0790100107B010080800700508007005E +:100EE000B0B50D1C041C052801D3F4F729FE052D0F +:100EF00001D3F4F725FE0B4AA8001158A0001058A2 +:100F00003C00C0C600000EC90EC0062106220648DD +:100F100069432A380918624310180622F3F70FFFB5 +:100F200002483038415D0155B0BD107B0100B0B5BD +:100F3000041C0E480D1C80780121A140084003D0FC +:100F400001213C00FCC600008620F4F7D1FD0621FB +:100F50000622094869430918624310180622F3F76C +:100F6000F1FE201CF4F740FA034AA1002A3251583E +:100F70000871B0BD00500700E67A0100034980B552 +:100F8000002048603C0038C7000007F032F980BDFF +:100F90000000D47A010010B5041C052801D3F4F731 +:100FA000D8FD0749087A074A107001200872FEF739 +:100FB000F4FB044A0430A1003C325158087110BDC2 +:100FC0000000808007003C0074C70000D47A010054 +:100FD000034980B50120486007F00EF980BD00008C +:100FE000D47A010010B5041C052801D3F4F7B4FD30 +:100FF000201CF5F78FFE0021201CFBF731FD01219D +:10100000002800D0011C09043C00B0C70000090CF6 +:10101000201C04F022FA10BD000006490120054BF7 +:10102000886000203C33002182009A581170013002 +:101030000528F9DB7047D47A01000F4938B5002044 +:1010400088600E48011C20318A793C00ECC7000002 +:1010500000AB1A70C9790A4C094D59700C343C35F3 +:1010600000210322635C002B02D08B00EB581A7026 +:1010700001310529F6DB00AB1988C18438BD0000B9 +:10108000D47A010000100700FFB5144F3C0028C8B7 +:101090000000041CBE790D1C81B00F2000F0B9F8CF +:1010A0002A1C104D0090211C281CF4F7DEFC211C8A +:1010B000A81D039AF4F7D9FC211C281C0C30049AB3 +:1010C000F4F7D3FC211C281C12300A9AF4F73C00D8 +:1010D00064C80000CDFC07F09BF8009800F076F89B +:1010E000BE7105B0F0BD000020100700E67A0100D7 +:1010F00010B50020F6F726F80749887800090001A6 +:1011000088700024201CF5F711FE01342406240EFB +:101110003C00A0C80000042CF7D310BD0000005014 +:10112000070080B502F0E3FB034881780F221143EA +:10113000817080BD000000500700F8B50D1C041C34 +:10114000052801D3F4F717FDA600002D114F07D194 +:10115000B8593C00DCC80000816800290ED14078F5 +:1011600000280BD002E0FF352D062D0E291C201C77 +:10117000FBF788FC011C201C04F07EF906490120C5 +:101180003039085504483C388068002802D1B959E4 +:10119000032008703C0018C90000F8BD0000107B57 +:1011A000010080B504F0CDF980BD10B5041C052800 +:1011B00001D3F4F7E6FC201CF5F7C1FD0020054A39 +:1011C000A10051588860044988780122A240104348 +:1011D000887010BD00003C0054C90000107B010065 +:1011E00000500700024A9178084390707047000051 +:1011F00000500700F8B50C4FBE790F2000F018F82A +:10120000051C0024201CF4F70DF9084AA1005158D0 +:10121000087101342406240E3C0090C90000042CFF +:10122000F3D3281CFFF7E1FFBE71F8BD00002010CA +:101230000700107B0100B0B508498D788A78054019 +:1012400082438A7006F0F9F9041C0A34201C06F067 +:1012500034F90028FAD0281CB0BD3C00CCC90000ED +:101260000050070001490A2008817047387B0100BF +:10127000F8B510480426041CE034051C383D00274E +:10128000201C1C30E460A06127610B48A682E0614D +:101290002762A7620620A084201CFEF73C0008CA33 +:1012A000000087FC201C0C30F6F7B7F90549383CE4 +:1012B000AC420880E7D1F8BD0000D4E4010012611F +:1012C0000100487B0100F7B5051C0C230F1C1249D7 +:1012D00058434418208806F0EAF9A07801283C0019 +:1012E00044CA00001AD16668022F05D15C20805BD9 +:1012F00002990009884211D1281CFEF7FBFF301C1F +:10130000F9F7FAFD0420A070391C281CFBF7F4F84B +:10131000034AE8003C32115801311150FEBD000073 +:101320003C0080CA0000607B01000120064A0021C9 +:101330000C234B439B189B78002B00D000200131DD +:101340000429F5DB7047607B010070B5041CFFF7D2 +:10135000EAFC002803D120210C20F4F7F6FB261C20 +:1013600060363C00BCCA00000021F171E164606B92 +:10137000251C4035002831D0FFF704F90122120363 +:1013800000282069018801D0914300E011430180C9 +:10139000206901220088D2022883201C583001884D +:1013A000914301803C00F8CA0000A36B5208002B57 +:1013B00010D091430180288B0007800F012815D0A1 +:1013C0002E20015D20690430F8F741FD616AFEF7C7 +:1013D000A8F904E011430180201CFBF7CCFB6883D3 +:1013E00004E0206941803C0034CB0000A88B2169D7 +:1013F000C882E068F6F720F93080606D002804D0DC +:1014000000220321707AFEF70DFF201C00F0B6F9D0 +:10141000707A06F045F870BDB0B5002406F022F9E8 +:10142000094A00210C234B433C0070CB00009D185F +:101430006B685B6CAD78C31A012D02D1A34200DD4D +:101440001C1C01310529F0D3201CB0BD0000607BBD +:101450000100B0B5041C06F0A8FE0C20084960434A +:101460004518288806F035F968683C00ACCB0000C8 +:10147000002806D02030007B012802D1201CFFF775 +:10148000A3FAB0BD607B0100FFB585B00FAE60CEA2 +:1014900038201E497043171C4418FFF77FF80122BB +:1014A0001203002803D02088904320803C00E8CB22 +:1014B000000002E02188114321801198391CE0626C +:1014C0000598F8F7D0FC011C2B1C381C069AFEF777 +:1014D00020F960800622201D0F49F3F772FC231CBF +:1014E0000898303318700E980C49587065633C00AA +:1014F00024CC0000002002900122049209480391AC +:101500005A780188019200911978243B301C626B53 +:10151000FEF7A8FE09B0F0BDD4E40100126101009D +:101520005D4E0000487B0100FFB587B0109812AFF8 +:101530003C0060CC00008C46A2CF4C23304C6B4367 +:101540001C19161C159A2785271C303706970597F6 +:1015500000233B73059F78731198271C60646160BA +:10156000226040373E70614661870798311CF8F76A +:1015700080FC3C009CCC00000599C8730A987870E8 +:10158000301CFEF773F8002801D0012000E0002095 +:10159000410002200140119A0120002A00D10020C0 +:1015A00008433872201C2E300799FDF7CFFF281C06 +:1015B00004F0AEF83C00D8CC0000FEF7FEFF4C2251 +:1015C000124B6A43D218012109032A32002804D0A1 +:1015D000101C12888A43028002E0108808431080A1 +:1015E0000B490020039106990290002204920848BA +:1015F0000A7B4188231C3C0014CD0000019200911D +:1016000079780833281C6268FEF738FE0BB0F0BD0D +:1016100058E30100754F00003C7C0100B0B50C1C84 +:10162000012827D0802830D1E06C002808D069201C +:10163000005D1849C00040183C0050CD0000043047 +:10164000016801310160201CFFF7E9FB134D503D9B +:10165000E868002805D02E20005DFEF710F802F0A3 +:1016600042FE201C6168F3F72FFB403460780028AD +:1016700002D106F012F8A860B0BD3C008CCD00008D +:101680002006000E8128FAD1220C2004000E02212F +:10169000FEF7E6FDB0BD0A210C20F4F77DFAB0BDDF +:1016A0009C7B0100F8B5184E184F051C3479B879A9 +:1016B0000090201CF5F77CFF002806D03C00C8CD28 +:1016C0000000124838384068854201D1002D03D10E +:1016D00010218620F4F763FA0D490020383948605C +:1016E0000421201CFFF759FC0421201CF5F7EBFE18 +:1016F0000C21064A6143303A89180C7104203C00E1 +:1017000004CE000030710098B8710F20FFF7A6FDDD +:10171000F8BD0000A47A010020100700F8B5041CF1 +:101720000F20FFF7C1FDF5F73BFF0125002800D092 +:101730000025164EB079164F00903879042801D153 +:101740003C0040CE0000002C03D111218620F4F78C +:101750002CFA1048290638384460090E0C1C042065 +:10176000FFF721FC0321201CFFF741FC211C042072 +:10177000F5F7AFFE0C21074A69430420303A891877 +:1017800008713C007CCE00003C710098B071201CB8 +:10179000FFF750FD0420F8BD20100700A47A0100D7 +:1017A0000C2302495843401880687047747A01003E +:1017B0006030C1798079814201D9012070470020D1 +:1017C000704700003C00B8CE0000014880687047B8 +:1017D00000004C7B010038B56921095C1823104AD0 +:1017E000594389188A6801328A604B69D21ACB68DA +:1017F000934200D2CA6000220B4C0260221C2032AD +:10180000957900AB1D703C00F4CE0000D2795A707F +:101810000A68002A01D1486000E0106000AB08604F +:101820001888E08438BD0000C47B01000010070068 +:1018300018230A495843411808690130086148686B +:10184000002809D0486901303C0030CF00004861D1 +:10185000486802684A60002A00D10A607047002088 +:101860007047C47B0100F8B5124E104D0F4C0A278B +:10187000211C0020E0602A31221C1832A160626124 +:1018800027820C4AE061A26160623C006CCF0000DC +:1018900006202084081CFEF7D7F9201C0830F5F735 +:1018A00001FF4C3CAC427080E5D1FF203070F8BDA8 +:1018B00088E401000CE301003C7C0100126101009E +:1018C000F8B5041C0B480E1C171C44703C00A8CF34 +:1018D000000005F000FF051C391C301CFDF7ABFFB4 +:1018E0000C21054A28180A30614308325050034839 +:1018F000891800688860F8BD00006C7A0100786E75 +:10190000010070B50B4E051C7078FF280FD03C000D +:10191000E4CF00000C23084C58430834205805F04D +:101920001DFE002806D170780C23584300198168E9 +:101930002943816070BD00006C7A010080B53021C0 +:101940000148F3F743FA80BDECE5010010B505F05E +:101950003C0020D00000C5FE0A4944180CE0201CC1 +:1019600005F0F7FD002807D0F5F751FE002803D059 +:1019700013218620F4F731F9F5F749FE0028EED15E +:1019800010BDB0360000FFB58BB0199B0D1C041CB8 +:101990001A203C005CD00000002B169900D11820C2 +:1019A00001901498002827D0FF20199B0130002BAC +:1019B00001D1182300E01A230433824204D3D01A41 +:1019C000400840000004000C0D906A480088C21ACC +:1019D0001204120C3C0098D000000492002908D098 +:1019E0008979664A4900515A049A511A0A04120C1C +:1019F0000492049A824205D90020049002E06048D3 +:101A000004900D9001980104090C0A910020F4F74C +:101A100084FA009000683C00D4D0000000260690B4 +:101A20002060002005900E9800240005000C09900D +:101A30001A980D9F4007400F089007940395002DBA +:101A40000DD02889B84204D836183F1A07D0ED685F +:101A5000F5E73904090C281C3C0010D10000F4F70C +:101A600038FBEFE7002E02D10799002971D1271C1E +:101A70006C20F4F788FB0799041C002920D10794F7 +:101A80000020A0611898271C606017982437A06078 +:101A90000698206115980FC80FC73C004CD1000074 +:101AA00014985C2160630998085319986921E063D0 +:101AB0001B9808551C9860651998002823D0089831 +:101AC000069908831FE06C22201C0799F3F71AFA85 +:101AD0003C60019862213018C85315983C0088D1A9 +:101AE00000004021807AC8550020B86306980A9902 +:101AF000F4F71FFAF8600299F4F73BF9201C403024 +:101B0000818B059A1207120F1143818303985E217E +:101B100002900198224A30180853126801213C00B3 +:101B2000C4D10000081C002A00D01B980006049AAB +:101B3000000E964203D92C2211551B4904E0159939 +:101B40002C22097A11551949085C662108551C9800 +:101B5000002801D01F200855002D03D0E86803900D +:101B60003C0000D20000002000E009E0E860059899 +:101B7000002601300004000C0D9F0590039D6DE7C9 +:101B80000098E0600299F4F7FAF800202060012143 +:101B9000A1636034608007980FB0F0BD000006615B +:101BA00001003C003CD200005C4301003809000009 +:101BB000186701000E6101000A6101000148006818 +:101BC00070470000C46A01000249091D03C940189A +:101BD00070470000C46901000148006970470000B7 +:101BE000C46901003C0078D2000001484069704798 +:101BF0000000C46901000148806970470000C469A1 +:101C0000010070B50D4E0020351C4035F0630DE02D +:101C1000A068F4F77AF9B36D002B04D000220120FC +:101C2000616BF3F795F83C00B4D20000201CF4F788 +:101C30009DFA281CFAF742FD041CECD170BD00008F +:101C4000C4690100F8B51A4F0026F86B00282CD0A3 +:101C5000381C403000901DE01648B96B02F05CF86B +:101C60000022201C144903F03C00F0D200007BFF4E +:101C7000051C04D1386A0130386201360DE0A068D5 +:101C8000F4F749F9BB6D002B04D00022281C616BCE +:101C9000F3F764F8201CF4F76CFA0098FAF711FDDA +:101CA000041CDCD10748B96B02F03C002CD30000C7 +:101CB00025F80020F863301CF8BD0000C46901005D +:101CC0003463010011300000C460010001490120AB +:101CD000C8637047C469010080B50020054A00212F +:101CE0001C2343439B1801300428D9663C0068D369 +:101CF0000000F8DBFCF7FDFC80BDC4690100014970 +:101D0000C86470470000C4690100014988647047D5 +:101D10000000C4690100B0B5041C0D1C211C028E1A +:101D2000806A4031F3F72FF8002816D102213C00D9 +:101D3000A4D30000201CF4F76FFAE269C000101869 +:101D4000828BAB889A4204D182692B689A4208D26E +:101D500001E09A4205D2002118300CCD0CC000E001 +:101D60000121081CB0BD0000F8B5061C002744681E +:101D70003C00E0D300000FE00949486A01304862A6 +:101D8000A069002802D0F4F700FAA761266225684E +:101D9000201CFFF752FB2C1C002CEDD1F8BDC469B0 +:101DA00001000330074A8108136850681B688900E6 +:101DB00009183C001CD400008B4201D3516000E0A4 +:101DC00000209060704700008C6E010070B5124ECC +:101DD0008038C50070590C1C002804D101210D2049 +:101DE000F3F72EFF0DE02069002805D1A81981889E +:101DF000E06801F03C0058D4000047FA20617159B6 +:101E0000201CF2F7BBFF041C002C07D0E068002860 +:101E100001D0F4F792F8201CF4F7BDF970BD5442DC +:101E2000010070B5041C0D1C0E490622F3F735F8AD +:101E30000026E66166623C0094D400000720302151 +:101E40000855E663281CF8F76BF8A076201C1430C0 +:101E50000622291CF3F724F80622291CA018F3F700 +:101E60001FF8266170BD00001261010080B5FDF70A +:101E700085FE80BD014948603C00D0D40000704719 +:101E80000000E4650100024980B54968F2F77CFF73 +:101E900080BDE465010080B5F4F7E5F9074907481E +:101EA0000EC90EC018380068002802D002F0B7FA38 +:101EB00080BD02F09EFA80BD00003C000CD5000001 +:101EC000B058010090730100054980B58968002071 +:101ED000002900D103200006000EFAF7E3FB80BDC5 +:101EE000606C010080B5034806220349F2F7DEFF6B +:101EF00080BD000040800700126101003C0048D511 +:101F00000000B0B5041C0C4D0B1C211C00200C3D26 +:101F10000029094C05D02878211C1080021C181CAF +:101F200007E011880E2907D80A06120E191C201C7A +:101F30002A70F2F7BEFF0120B0BDB06901003C007D +:101F400084D5000010B500200A4A012111600A4C16 +:101F50000AE0021C016A5032914205D061783C23AC +:101F6000594309190431016204F0BAFB0028F0D189 +:101F700010BD0000DC62010068610100044880B50A +:101F80003C00C0D500000068002803D0011C1020D0 +:101F900004F0C7FE80BD286101000322111F80B537 +:101FA0000020FBF776F980BD000080B50BF0B9FA90 +:101FB00080BDFFB583B0161C002101911F1C0821B4 +:101FC00002AA3C00FCD50000FAF70EFF041C2AD13F +:101FD00002984168490001D4092424E0FAF752FF2D +:101FE0003860029841684902CD0F291CFAF744FF76 +:101FF000011C306038680006000E00F01BF8002855 +:1020000001D10A243C0038D600000FE03168029864 +:102010002B1C01AAFAF7D7FF002806D00198002848 +:1020200004D004990968814200D2032401980499DC +:10203000086007B0201CF0BD000070B5051C0E1C28 +:10204000012400F084FF3C0074D60000002808D072 +:10205000032D01D0042D04D10320C003864200D3F8 +:102060000024201C70BD00007CB5151C061C0C1C37 +:10207000291C6A4601ABFFF7A5FF002802D1002CFE +:1020800001D103207CBD17483C00B0D6000000AB56 +:1020900006601879072821D202A31B5C5B009F44CD +:1020A00000001D040406101713000420EDE72A1C8D +:1020B000211C0120009BF2F781FE002812D106208E +:1020C000E3E72A68009905E000983C00ECD60000A0 +:1020D0004278811C01E02A686946201CF2F7FEFE66 +:1020E00003E004218720F3F7CFFD0020D0E70000B4 +:1020F000F86B0100F7B586B00E1C082105AA0698FA +:10210000FAF77EFE041C45D1059841683C0028D7AB +:10211000000002904902C90F002504950391089F11 +:10212000FAF7D5FE019002A903C9FAF7C6FE019994 +:10213000052914D202A35B5C5B009F4400000E03E0 +:10214000060C030087420ED807E087420BD83C00FC +:1021500064D700000125C01B049007E0874205D129 +:10216000012503E005218720F3F794FD002D01D11F +:10217000032415E005984168002969DA3A4A06996E +:102180001160FAF791FE071C05980399FAF786FE8D +:102190003C00A0D70000051C011C381CFFF75FFFA6 +:1021A000002801D10A245EE0072F57D202A3DB5D8D +:1021B0005B009F440000530404062E504800042492 +:1021C00051E00498002801D1002714E0089908186C +:1021D00000043C00DCD70000000CF4F72BF8071CCF +:1021E000311C089AF2F786FE089804993818F2F71D +:1021F0002FFE089804993E1C40180890311C0020BE +:1022000008AAF2F7ECFD002800D10524002F2DD0FC +:10221000381CF3F73C0018D80000EDFF29E00399C3 +:10222000002904D0059840688702BF0A00E0002713 +:10223000311C281C089AF2F760FE0499002903D08B +:1022400008982818F2F707FE002F12D0F2F7CCFDFD +:102250000FE0311CA81C3C0054D80000089AF2F78B +:102260004FFE0898687007E0FFE7072404E00824A1 +:1022700003218720F3F71AFD201C09B0F0BD0000F0 +:10228000F86B01009EB51C1C00AB19720092002275 +:1022900001946946FBF708FA3C0090D800009EBD07 +:1022A00000008FB5029200220090019003916946D0 +:1022B0000420FBF7FCF98FBD0000B0B50C1C012811 +:1022C0000AD0032819D004282CD1606801F035FC0D +:1022D000011C83200CCC22E01C203C00CCD8000048 +:1022E00014496043401814494518281CF8F746FC67 +:1022F000A968002903D0221C082005F071FEB0BD9A +:10230000208CC82801D3042004E0652801D30220D2 +:1023100000E001202084201C03F0DCFA3C0008D9F6 +:1023200000002268E368011C8220FFF7B4FFB0BD03 +:10233000A0210820F3F7C3FCB0BDDC71010064EEFE +:10234000FFFF0348044A81685161C068906170478B +:102350000000F4680100C07101000349044A3C0018 +:1023600044D90000086B90608868D0607047000016 +:10237000905C0100C071010000B5FFF7F1FFFFF7AD +:10238000E3FF00BDB0B50D1C002814D00B490C4C68 +:1023900088686269C968801AA269891A401804D0DD +:1023A0003C0080D9000064235943F2F7C4FE206149 +:1023B000FFF7CDFF206928600120B0BD0020B0BD2F +:1023C0000000F4680100C0710100B0B50D1C0028C8 +:1023D00017D00C490D4C086BA2688968801AE26816 +:1023E000891A3C00BCD90000401807D022889042CE +:1023F00004D964235943F2F7A1FE6060FFF7B6FFEA +:10240000606828600120B0BD0020B0BD905C010074 +:10241000C07101007CB51068002802D000F024F8DB +:102420007CBD0F483C00F8D90000C0698468E068B2 +:10243000256AA669F3F7E3FDE169F3F706FD201CC1 +:10244000E2694030C18B12898918C1830749019420 +:1024500000912869331C82880168E068C068F8F739 +:102460001EFCE0E700003C0034DA0000846A010052 +:10247000915E0000F0B58569066A041CC06885B0ED +:10248000C068002801D1F3F757FC0A49029504946B +:102490000391306982880168262001920091435D92 +:1024A000E068E1692A1C0E323C0070DA0000C06866 +:1024B000F8F737FD05B0F0BD0000E9D9000010B510 +:1024C000141C0548FCF77BFBA068F3F79EFDE16850 +:1024D000C160201CF5F7BBFA10BDA06A01007CB5F5 +:1024E000041C6030027BA16900913C00ACDA000062 +:1024F0000192221C211C3831A06848320D1C6369EE +:1025000003F07AFB08210020F3F788FDE0602669DC +:10251000B16B002901D0102300E018230549019474 +:1025200000913168CA180823011C281C3C00E8DA15 +:102530000000F8F720FD7CBD000081DA0000F0B556 +:102540004668171C041C0121301C9BB0FAF70DFCD7 +:102550000025002803D013490A7A012A01D1012558 +:102560001CE088624E612089C861608900283C00B7 +:1025700024DB000003D000200884488404E0E068E5 +:102580000884208A4884608A8884086B002803D1E4 +:1025900001A803F077FC04E001200861002002F0AC +:1025A00039FB3D711BB00120F0BD0000F46E01004D +:1025B0003C0060DB000010B5041CF7F7E8FB0028C6 +:1025C00011D14B20005D01280DD1201C04F085FAAB +:1025D0000021201C04F0F3F8A0690021C207D20FEB +:1025E0000420F4F7D8F910BD000038B5041C04F03D +:1025F00036F93C009CDB0000002803D04030807A94 +:10260000002825D10C2029210855211C0622A018BC +:10261000F2F7A0FC201C06220E49F2F79BFC0120D9 +:10262000E06160620720302108550025E56306203F +:1026300000AB18803C00D8DB0000E068002801D027 +:10264000F3F7DBFC02216846FDF773FBE060201C1A +:10265000FFF769FCE560201C38BD12610100FEB582 +:10266000051C0E1C152000AB98801421171C00209F +:10267000F3F7E3FC02903C0014DC0000046806223F +:10268000311C601D2571F2F76BFC0622391C201CE1 +:102690000B30F2F765FC01A8FFF752FCFEBD00000D +:1026A00080B50023FBF75CF880BD000070B5051C09 +:1026B00008350F4E291C041C3C0050DC000006228B +:1026C000301CF2F750FCA088B082281C05F0A1FF56 +:1026D00000280BD0E0883061281C04F0CCF8A188D9 +:1026E000403041800020F4F7B8F902E00420F4F70C +:1026F000A0F9002070BD707C01003C008CDC000063 +:1027000080B50020FBF7F8FB80BD000070B5041C0D +:102710000430051CFDF732F8002809D00020F7F737 +:1027200037FC002804D00622011C281CF2F71EFCEE +:102730000A4E0622291C301CF2F718FC3C00C8DCAB +:1027400000006089F082281C05F069FF002803D092 +:102750000220F4F788F902E00520F9F7F4FA0020E6 +:1027600070BD707C010010B5041C007904281CD2D7 +:102770006079012801D0032804D1002201213C0006 +:1027800004DD0000A01DF9F769FC6079002804D180 +:1027900022790021F9F762FC0AE0032808D100241D +:1027A000221C00210020F9F759FC0134042CF7DB2E +:1027B000012010BDF0B597B0171C051C0430041C97 +:1027C0003C0040DD000015AA16A905F0E2FE002835 +:1027D0002ED015984B21095C002923D0012902D065 +:1027E00002291FD101E004F090F9AD7A1348169E3A +:1027F00005800622211C0830F2F7C1FB221C311C87 +:1028000002A83C007CDD000000F074FB0A200AA94D +:10281000487200AB9D80022101A8FDF79FFA059048 +:1028200002A8FFF795FBF3F7F7F90021159803F0DD +:10283000E1FF002000E00120387117B00120F0BD59 +:10284000987C01003C00B8DD000080B50120FBF75A +:1028500062FB80BD0000B0B5041C807D151C0A1C05 +:10286000C007C0170130211CF9F7FBFC002803D179 +:10287000042028710120B0BD206AF7F776FE606A57 +:10288000F7F77BFE206A3C00F4DD0000FEF788FAD3 +:102890000020B0BD10B5141CC27981798088F7F78B +:1028A000A1FA2071012010BD80B50123FAF770FF55 +:1028B00080BD0000F0B5041C081C00210F2891B059 +:1028C00000D30221002941D13C0030DE0000C000CD +:1028D000244F1090C619B288216802A8F2F75BFB5A +:1028E0002189B088091A002907DD09042268090C2A +:1028F0001018F3F7C0FB051C00E00025B07980211B +:10290000884317497831095C00203C006CDE0000E8 +:10291000F3F7B4FB071C00681349019010980B589B +:10292000019A291C02A8F2F7ACFA0090281CF3F7D0 +:1029300073FB201CF3F782FB0098002808D0029854 +:1029400001990860B079391CFAF720FF3C00A8DE35 +:10295000000011B0F0BD381CF3F761FBF9E72D2042 +:10296000F3F7F5F9201CF3F76CFBF2E700002444C1 +:10297000010070B5051C2035061CA879042848D232 +:10298000E979012913D1301C283003F092FF3C0073 +:10299000E4DE000000283FD0011C8C310165A979DC +:1029A0004C22041C11548118416250340462E11E0F +:1029B00081620BE000292FD13C2218494243541870 +:1029C000174A04341268002A00D14870002C23D022 +:1029D0003C0020DF0000351C3035E879012801D0AB +:1029E000052801D10620E8712022311D2068F2F768 +:1029F000DEFAB08CA080E879A071A8790025A063E8 +:102A0000012060810020E0602E36E80000191830B7 +:102A100008223C005CDF0000311CF2F7CBFA0135E4 +:102A2000042DF5D3012070BD68610100DC62010056 +:102A300010B5041CC07A012801D0032807D1201D3D +:102A400003F040FF002802D0A17A40304173E07AC1 +:102A5000002801D03C0098DF0000032802D1A07AB2 +:102A600002490870012010BD00006861010070B5C6 +:102A70000E1C0321041C301CFCF7E1FB002801D0D4 +:102A8000857800E000250B48321C00680368207C34 +:102A90008007C00F211C3C00D4DF0000F7F762FE66 +:102AA000002805D00121281CFDF7FEFB002000E0D6 +:102AB000082003F0C5FF002070BD0000E4650100A0 +:102AC00080B5426800880121490608432D2105F0A0 +:102AD000D3FB80BD034901203C0010E00000497891 +:102AE000022900D0002070470000846601008CB5E8 +:102AF00001281FD100290DD001290BD0022901D0B6 +:102B0000032916D10020F9F714FC932000AB18809C +:102B1000002008E0012900D000203C004CE000002B +:102B2000F9F70AFC832000AB1880022000F0CCF8F3 +:102B300001906846FFF73AFA8CBD01210E20F3F7A9 +:102B40001BF9F9E7FFB5171C1E1C1421002083B0E8 +:102B5000F3F7ACFA051C0468122000AB3C0088E0D7 +:102B6000000098800622601D0399F2F732FA0020D7 +:102B7000207127730499201CE172311C06220D304C +:102B8000F2F727FA029501A8FFF713FA07B0F0BD94 +:102B90000000F8B5061C0F1C0C210020F3F73C00C8 +:102BA000C4E0000089FA0568041C281D0622311CB7 +:102BB000F2F712FA6F81201CF8BD0000B0B5041CBA +:102BC0000D1C08210020F3F777FA01688C718D80C5 +:102BD000B0BD0000F7B50E1C1021171C0020F3F744 +:102BE0003C0000E100006BFA0468051C201D062271 +:102BF0000099F2F7F4F96681A781281CFEBDF3B5B0 +:102C00000C1C0821002085B0F3F759FA061C076850 +:102C1000E068002802D00599012904D1059838718F +:102C200000203C003CE10000787156E0036801217F +:102C3000039320690290FCF717FB051C02983221D0 +:102C4000FCF712FB0022D243011C281C04ABF7F74F +:102C5000B9F8002804D1301CF3F702FA00263CE052 +:102C6000002D05D03C0078E100006878093807287D +:102C700001D8322028701C210020F3F726FA019099 +:102C80000568011C301CF3F740F9E068F3F70BFA14 +:102C9000A861E1680198F3F738F90020E060059831 +:102CA0008021084338713C00B4E100000120211C60 +:102CB00014317871281C0622F2F79AF9029A292019 +:102CC0000092005D0121E26A082800D00021281C42 +:102CD000039B02F09DFFA06B2861206C68617F3030 +:102CE00001D10F206861301C3C00F0E1000007B00A +:102CF000F0BD10B5041C08210020F3F7ECF90168C1 +:102D00000C7110BD00000148006870470000286188 +:102D100001000149086070470000E4650100021CE1 +:102D200001200006084380B52D213C002CE2000064 +:102D300005F0C0FA80BD000080B5012807D0F12859 +:102D400025D0F32827D1022002F0BCF980BD00294C +:102D50001AD0012903D0F229F8D188211CE01048AB +:102D60000178002905D140780128EFD13C0068E2C4 +:102D7000000000F016FA80BD0B4814300089FCF703 +:102D80005AFC011C01220F2005F09FF980BD04F0C0 +:102D900052FA80BD0020FAF732FE80BD02210F20DA +:102DA000F3F705F880BD84660100014800783C0017 +:102DB000A4E2000070470000746601000149002091 +:102DC00048607047EC650100F8B50E1C134D011CFE +:102DD000141C6822281C1F1C0C30F2F771F90F49D3 +:102DE0000020AC394860012129601921192C6E6737 +:102DF0003C00E0E2000000D3211C2981094914397C +:102E000088738F74C878012808D001210F2005F03D +:102E10009CF91920FCF715FCFBF799F80120F8BD87 +:102E200000009866010080B5012802D100F02FF85B +:102E300080BD3C001CE3000001211D20F2F7C0FF13 +:102E400080BD00007047000001200749000580B5E3 +:102E5000886000228021162005F04CF904F034FD32 +:102E60000249086180BD000000100700246D0100C8 +:102E7000064A80B53C0058E30000D16A814207D180 +:102E8000107F2423044958434018C068F2F735F8EE +:102E900080BDD4790100944601001D481CB500781E +:102EA00000282DD01C480068002829D01A4A1A4B47 +:102EB000043211681C693C0094E30000A14222D155 +:102EC00051685B6999421FD1164949689368C91ACC +:102ED000814219D2D06814490130D0600968884213 +:102EE0000CD90622FF216846F2F72EF9F3F7ACFC65 +:102EF000011C0023002268463C00D0E3000002F0E1 +:102F0000CEF901221D200A4905F0F7F81CBDF7F79C +:102F100088F904228118081CFCF727FBF6E71C75CA +:102F200001004475010028610100905C0100F05926 +:102F30000100A086010080B501683C000CE400009F +:102F4000002915D10079022812D1081CF7F780F862 +:102F500000280DD003F0F2FC0830418F002907D182 +:102F60008069002804D08079062801D1FCF718FB7D +:102F700080BD000001490020886270473C0048E4A1 +:102F8000000078690100B0B5054D041CA91DFFF7CC +:102F900014F80622291CA018F2F74BF8B0BD707C7B +:102FA0000100B0B5041C151CFFF707F80622291C08 +:102FB000A018F2F73EF8B0BD000080B50A303C0022 +:102FC00084E40000F7F7BCF90123002803D005488A +:102FD0000078012804D100220021002003F0C6FD62 +:102FE00080BD0000A079010080B5002300220021EF +:102FF000002003F0BBFD80BDB0B5054DAC790A1CC7 +:103000003C00C0E40000011C0123012003F0B1FDDD +:10301000AC71B0BD000020100700F8B5061C0C1CF8 +:10302000880702D5F6F747FA10E060070ED5174F6C +:10303000A320C05D154D102800D3154D04F059FC98 +:10304000B96F3C00FCE40000401A291A0120F6F791 +:10305000C1FAE0071149C00F48600CD00D4C443C48 +:10306000207803280FD1002E06D0F6F7F9F9011CBD +:103070000120F6F7AFFAF8BD09490120F6F7AAFAE0 +:10308000012020703C0038E50000F7E70121301CEA +:10309000F6F789FAF2E7A60E0000A46C0100C40955 +:1030A0000000B057010040420F0080B5062804DB45 +:1030B0000521FF20F2F79FFE80BD034AC00011509A +:1030C0000121801801713C0074E5000080BD000002 +:1030D0009C5A01000148806870470000D0600100E0 +:1030E000B0B5084C251D281C216800F0F1FE002811 +:1030F00003D101210448F2F7CFFA281C216800F01F +:10310000FBFEB0BDC06001003C00B0E500002C102B +:103110000700B0B5104D0C1CA868002802D104F0BF +:10312000F4FB2860201C04F038FB0121032003F08D +:10313000C4FE04F0F0FBA86800280BD104F0E5FB06 +:103140002968001B401A696840183C00ECE5000043 +:103150004108401828600120A860B0BDD06001007F +:10316000F8B51F4E0024B068002802D104F0D0FB4F +:10317000706005F061F804F08FFB051CF9F766FE3E +:103180003168184A41181268E80B002A3C0028E60A +:10319000000000D1A80A401885421FD9144F2D1AEB +:1031A000381C2030817900AB1970C079587005F057 +:1031B0006EF8002803D102218F20F2F728FE291C87 +:1031C0000C48F268F8F709FC002804D0011C3C0008 +:1031D00064E60000281CFFF7A5FF012400AB188857 +:1031E000F88405F047F8201CF8BD0000D06001000D +:1031F000F474010000100700891301000149012047 +:10320000C8607047D0600100064880B5006801289A +:103210003C00A0E6000007D10448AC38016903482F +:1032200000F079FEF3F72BFA80BD98660100346355 +:10323000010080B542788168007903F0DEFF002844 +:1032400001D1F5F7B6F980BD00001FB504F069FBA8 +:10325000F6F73C00DCE6000091FF164C022803D193 +:10326000FFF7DCFD042802D3002020701FBDFBF710 +:10327000F7FC0028FAD1606A0028F7D02078800790 +:10328000F4D40921162004F093FF012020700B4C88 +:10329000094902903C0018E700000194009104F0F5 +:1032A00046FB001903906846FDF7B5FB0022162186 +:1032B000842005F03EF8DCE70000606C010061ED61 +:1032C000000040420F00234870B580789CB0012870 +:1032D0003ED1204C09A83C0054E70000803C611C12 +:1032E000FEF792FE042011AD6872A06F19A9189024 +:1032F0007C20005D012608711D20005D002806D09D +:1033000010961296FCF7F6FA2872207A1190F3F7CD +:10331000CDFF6A21085340343C0090E700000022B2 +:1033200001A906A8F6F7CDFF211C0020FBF7CBFB77 +:1033300006A9FBF7C8FB01A9FBF7C5FB0A49096809 +:10334000002907D0331C0A226946FBF7DAFB009AF2 +:10335000072191700C9009A8FEF73C00CCE7000013 +:103360007BFE1CB070BD000084660100E4620100B9 +:10337000F8B5041CC068FF22016812020E1C087B0D +:10338000497B090211400843051C311C0622A01884 +:10339000F1F77CFE0622B118201CF1F73C0008E88A +:1033A000000077FE280A290208430004032149028D +:1033B000000C884208D2E06801890E390181E0687A +:1033C00001680E310160F8BD0026201C103003F0AA +:1033D000E8FA218B002905D1E17D00290BD03C00C2 +:1033E00044E800008069800708D4E068012601896C +:1033F00002390181E0680168023106E0E068018974 +:1034000006390181E0680168063101601449002035 +:103410000B1F42009A5AAA4202D11149063102E01A +:103420003C0080E8000001300228F5D3E068062265 +:103430000068F1F734FE012ECBD1812000AB18805B +:10344000E17D208B49030843310308430004000C4D +:10345000010A000208435880E06819880068C180AA +:1034600059883C00BCE800000181B5E76A460100CC +:10347000B0B50D1C01890622083101810468044998 +:10348000083C0460201CF1F70DFEE580B0BD000093 +:103490006A460100F8B5002901D0002801D10020BA +:1034A000F8BD09043C00F8E80000090CF2F743FFFE +:1034B000061C051C002720E02C892968022C01D25B +:1034C000022001E048780230844202DD241A091803 +:1034D000F4E7844210D0011B0A040104090C120C09 +:1034E000281CF2F79EFE3C0034E90000002806D1BB +:1034F000E868F2F72DFEEF602889001B2881ED684F +:10350000002DDCD1301CD1E7F8B58568041C80693A +:103510002E1C00280DD07168F2F7F6FDA069F2F7B5 +:1035200017FE06E00021C1603C0070E90000F16078 +:10353000A08D36680138A085F0680028F5D1306884 +:10354000A060A08D01380004000CA08502D0201CD2 +:10355000F9F739F82A4F2A480068002803D00621D5 +:103560006868FAF77CFD686800683C00ACE9000018 +:10357000817800292BD1C178002930D1218E0139E1 +:103580002186FBF715F8A16A081AA062E169884252 +:1035900003D904210220F2F767FCB86800281ED086 +:1035A0001A49208E49680C22521A90423C00E8E9E0 +:1035B000000008D319239B01AF2292015943A06A4E +:1035C000511A88420ED200210C2003F0ACFC0020DE +:1035D000B86007E0012905D1C078172802D1A08E74 +:1035E0000138A0862A1D06CAE0686369F1F73C002D +:1035F00024EA0000DCFCB54201D02D68B4E7A08DC0 +:10360000002803D10548B96900F09EFCF8BD000010 +:10361000FC5A0100CC5C010018570100C460010095 +:103620008907074BCA0F80B5197C002906D0814352 +:103630003C0060EA0000197403D10721152004F052 +:10364000A2FE80BD00007869010080B5011C012048 +:10365000FFF7E9FF80BD80B5011C0220FFF7E3FF03 +:1036600080BDB0B51B4C6068FCF72FFF20680025BB +:1036700040683C009CEA0000002803D0FDF718FCDD +:10368000206845606068FCF7C5FE1448616800F07A +:1036900061FCA07A012805D0022803D020680068C8 +:1036A00000F0DEF801211F2004F0B2FD00211F20F0 +:1036B00004F0AEFD3C00D8EA000002211F2004F017 +:1036C000AAFDA57221682C20405C8968F1F776FC80 +:1036D0006068FCF7E4FE20680562B0BD0000147A63 +:1036E00001003463010004490A68C868926A002A2C +:1036F00001D0096908183C0014EB00007047000075 +:10370000147A0100B0B5134C051CA07A01380228C8 +:1037100019D801211F2004F081FD2068FC23011C21 +:103720002030027B1A400273002D0FD001231A4370 +:103730000273A07A032807D13C0050EB000001205F +:1037400001F0E7FD002801D1FFF797FFB0BD4B6204 +:10375000B0BD022111430173F6E7147A010010B5E0 +:10376000041C0A30F6F743FE00280CD022880A49D0 +:103770000B7A9004C00F002B06D13C008CEB0000AC +:103780001206920E202A00D10120C86010BD002828 +:10379000FCD100222421802004F004FE10BD000092 +:1037A000047A010080B5021C1F21802004F0FAFD7C +:1037B00080BD0000F8B51D4E041C30683C00C8EB0D +:1037C00000001D1C4768201CF1F70AFCFBF787FA74 +:1037D000002804D0281CF2F72AFB002828D12088D2 +:1037E000400525D430680068FEF759F9002803D158 +:1037F000FDF789FAF1F7EDFB3068002540683C00E1 +:1038000004EC0000002803D0FDF764FB306845603D +:1038100020880009000703D104F0C8F86188451822 +:1038200030684561816A0131816220888004C10F5E +:103830000248F8F7CDFFF8BD147A0100B1EB0000A3 +:103840003C0040EC0000B0B50E4C051C6068FCF775 +:10385000F6FD0C48616800F092FB0021242004F082 +:10386000ECFC0022D2438021242004F0B8FC00208C +:10387000E0602072206801682806000EF1F7B0FBB6 +:10388000B0BD3C007CEC0000047A01003463010010 +:1038900010B5041CC068F2F785FC201CF2F7B0FDDF +:1038A00010BD000070B51C4E051CB07A2C1C4034B5 +:1038B000022826D1A08B3189884222D13068416A02 +:1038C000002908D03C00B8EC00002030007BC00785 +:1038D00004D5012001F02FFD002818D160780028C0 +:1038E00009D1306802232030027B0D495208520072 +:1038F0001A43027301E0FF21F53101221F2004F079 +:103900006EFC0320B0723C00F4EC000002E0281CC6 +:10391000FFF7C4FF6078002803D1291C012003F0C1 +:1039200029FB70BD147A010050C30000B0B5041C1F +:103930006034E0790E4D00280AD10220A872286870 +:103940004068002804D10B483C0030ED0000FDF732 +:10395000D0FA2968486004F038F82968C861FFF790 +:10396000E0FE29680969081A03F06FFF002801D0FA +:10397000E079A071B0BD147A0100C1EB0000F8B588 +:10398000041C002604F021F8051C3C006CED00002E +:10399000224800270770A10704D0E107C90F016280 +:1039A000C5610126416B002934D1002E32D0061C9E +:1039B000F9F744FF316B1A4B411AA20712D5DA68A6 +:1039C000002A08DD91421A6802DA14093C00A8EDC9 +:1039D0000000A21806E01409121B03E00A4302D1FA +:1039E0001A6852001A60B7630AE0B26B0132B26320 +:1039F000022A1A6801DD940800E01409121B1A60FB +:103A0000D9603063F56218680849884201D93C00E2 +:103A1000E4ED0000196003E0642801D2642018601E +:103A2000F5F7FCFDF8BD0000606C0100B057010027 +:103A300020A10700FEB5041C0020504D0021686144 +:103A40002069FBF7B3FC071C20690321FBF7AEFCE0 +:103A50003C0020EE0000002803D0807829788842BE +:103A600063D1474D201C1430391C061C2A7802F003 +:103A70005AFA002859D1E068056841480195583044 +:103A80000290FBF76AFF3E4D193500280BD0281C29 +:103A9000FBF73C005CEE000055FF00281ED1311CF6 +:103AA000281CFBF765FF002842D017E0281CFBF715 +:103AB00049FF002806D0391C0298FBF763FF002855 +:103AC00036D00BE0391C0298FBF75CFF00282FD0A2 +:103AD000311C281C3C0098EE0000FBF74CFF00282E +:103AE00029D0301CF6F7ADFC294A1832117C002988 +:103AF00004D0516A002901D000281CD1906A002806 +:103B00003BD01378019D01216D8901202B409B073B +:103B100011D0A36B1E4E3C00D4EE00001D1C7F355F +:103B20009836002D14D0558A002D08D15569AB4226 +:103B30000FDA0020174D01236B610AE029E0F578C8 +:103B4000022D06D1144F55693F68ED19AB4200DADA +:103B50000020236C1D1C7F353C0010EF000010D0AE +:103B6000558A002D03D19569AB420AD208E0F57859 +:103B7000022D06D10B4E95693668AD19AB4200D2C5 +:103B80000021084308D0106A002801D0F1F74BFA51 +:103B90000021201C01F0B9F9FEBD3C004CEF0000F3 +:103BA000EC650100C4670100CC6701003EB5056A01 +:103BB000041CC068F2F734FBE169F2F757FA201CE5 +:103BC0004030C18B0431C1832B6910499879062894 +:103BD0000AD1988801910294009060693C0088EFB6 +:103BE00000001B680168E0680322C0680AE0022840 +:103BF0000BD11020009001910294E068A369C06885 +:103C000000220021F7F70FFB3EBDF2F7A6F9FBE714 +:103C10000000BDEF000080B5D1685069C9683C0064 +:103C2000C4EF0000C160D168C860111C4031CB8B6B +:103C300000891818C8831068002802D0FFF7BCFF5D +:103C400080BD0348FBF7CCF8006AFEF7F5F980BDAC +:103C5000A06A0100F8B5061C0A2430070109A00774 +:103C60003C0000F0000001430F1C0A4D2F6004F0DF +:103C7000FAFEAD682801000FB04205D0013CF4D235 +:103C800001219B20F2F741F92802000A082E01D1F8 +:103C900031050843F8BD600007000122D20580B558 +:103CA00000213C003CF00000042004F0DDFC0F206B +:103CB000FFF7D6FF0F2109040840000C80BD00006B +:103CC00080B50548FDF74AF90448FDF77BF804483C +:103CD000FDF76CF880BD000089340100ED24000080 +:103CE000111C00003C0078F0000080B50248F3F79A +:103CF0002AFC80BD0000D124000080B5F2F753F902 +:103D000080BD80B50021002001F051FE032002F0AB +:103D100046FF80BD0000064880B5C169002906D174 +:103D2000016A002903D13C00B4F00000816B034814 +:103D300000F05EF980BD0000C46901003463010039 +:103D400010B5044C206AFCF7B3FB0348216A00F06D +:103D50004FF910BD1C75010034630100B0B50D4C66 +:103D6000207C002802D001213C00F0F00000FDF78B +:103D700086F900252570A068012803D10020A560E0 +:103D800001F08FF8A078012805D103489838006920 +:103D9000FCF7EFFBA570B0BD00008466010080B5A4 +:103DA0000021012001F009FE80BD3C002CF1000043 +:103DB00038B569460025F8F7B7FE041C01D101208B +:103DC00038BDA068002804D00099A131082004F073 +:103DD00073FA1C21201CF1F7A3F9281CF0E700005E +:103DE000FEB5071C4C233949584344183C0068F180 +:103DF0000000251C4035287A37494876211C30318F +:103E000002910C23C856421C0A73497B884246DA49 +:103E10003248007880073ED500200190F6F7AFFACF +:103E200000282ED0AC210958002901D0E4303C00F4 +:103E3000A4F1000000E0CC30061C4068002825D02A +:103E40000299087B012811D1201C2E302978F6F721 +:103E5000EDF9716803E07218127A824203D9FF31DA +:103E60000906090EF7D1A97001200190231C3E33E9 +:103E70003C00E0F100001A1D301C00970199F8F792 +:103E800058FA002811D0A8788019007A00E00020A4 +:103E9000687068780121FBF7E0FD6060381C01F074 +:103EA00014FE381C01F0A5FBFEBD0299087BFF3013 +:103EB00048733C001CF20000381CFCF719FC03F0AE +:103EC000C3FD061CFBF78EFE41007618687861681A +:103ED000FBF76AFE3118208D3B1C054A03F012FEE9 +:103EE000E5E7000058E30100308007001D75010080 +:103EF000D54E00003C0058F20000031C044880B579 +:103F000002792030034900F030F880BD0000AC7C1D +:103F10000100C4670100031C044880B5C278383032 +:103F2000034900F022F880BD0000AC7C0100C867A6 +:103F30000100031C04483C0094F2000080B5827923 +:103F40005030034900F014F880BD0000AC7C010043 +:103F5000CC670100031C044880B5427968300349EE +:103F600000F006F880BD0000AC7C0100D0670100C5 +:103F700010B5002484800B603C00D0F20000191CB6 +:103F8000514301601906091610220630F1F79FF916 +:103F900010BDB0B5064D0024AC60EC60EC612C6245 +:103FA00002F0F1FC00F00DF8EC622C70B0BD447D25 +:103FB000010080B580210148F1F73C000CF30000BE +:103FC000C7F880BD04660100F8B5074F002400263D +:103FD00018206043C519EE6003F042FD103501342E +:103FE000022C41C5F4DBF8BDB87D0100002303605D +:103FF000044B002900D1191C4160002A3C0048F301 +:10400000000000D11A1C82607047BD75000010B519 +:10401000074C206801302060202803D958215820FF +:10402000F1F79DFF216801200139884010BD605BD8 +:104030000100B0B50D1C041C2168002000293C00C3 +:1040400084F300000AD0A943216007D1A068F1F7EA +:1040500023F8002802D1216829432160B0BD000067 +:10406000B0B50D1C041C2168002029432160A94221 +:1040700007D16068F1F710F8002802D12168A94340 +:104080003C00C0F300002160B0BD1A4BB0B59A6A85 +:1040900000280BD0002A07DBB8242458013CA41ABE +:1040A0000019B030007B02E00E2000E00D205D6AB8 +:1040B000124C002D01D0207800E0205CFF24A834B1 +:1040C000C4403C00FCF300009C60F524C4409C61AB +:1040D000FD24C440DC61FF242934C4405C61FF241A +:1040E0005334C44000200C3311C3002905D0002AEA +:1040F00003DC0221504200F065FBB0BDAC7E010044 +:10410000B85201003C0038F4000010B5134C1348BD +:10411000211CFF3169310EC90EC0211CFF31242240 +:1041200075310F48F1F751F8211CFF313C229931CC +:104130000D48F1F7A6F8FCF7A2FF211CFF31102271 +:10414000D5310948F1F73C0074F4000041F8211C16 +:10415000FF312822E5310748F1F796F810BD00003D +:1041600040630100008007000C80070030800700DA +:1041700080800700A0800700F8B5002859D004F01F +:104180004BF9F8F7B3FB00223C00B0F4000001212A +:10419000132004F07CF92A492948496C0160002168 +:1041A0002948C9434160264C1434616C8160A16C7C +:1041B000C1600020254D022601016E500A194F19D9 +:1041C000503204370ECA013008283C00ECF40000DD +:1041D0000EC7F4DB1422211CCC311E48F1F75AF82B +:1041E0001D4881780909090181700021C170417061 +:1041F000211CE0310A78027049784170211CE831B5 +:1042000030220830F1F746F8211CFF313C0028F538 +:104210000000502219311248F1F73FF88320800046 +:10422000142221181048F1F738F811204001842297 +:1042300021180D48F1F731F8FFF773FF201CF1F753 +:1042400028FDF8BDFFF76DFFFBE7082007003C00E5 +:1042500064F500002C6301004020070000300700D7 +:104260000040070000500700006007001000070032 +:1042700000900700F8B5051C1848C068002825D034 +:10428000164E013674783078271A7919201CF1F708 +:104290003C00A0F500004BF80090291C201CF1F711 +:1042A000B2F8C119201CF1F742F8601A3070701E84 +:1042B000806800280DD05336F4780099201CF1F75F +:1042C000A2F8B178611A4118201CF1F79CF8601A25 +:1042D000B0703C00DCF5000003485C300169C26846 +:1042E00069435118C160F8BD447D0100B0B50C4D63 +:1042F000E868296940187D2109014418201C03F051 +:104300000BFB00280AD003F0CFFB011B2869F1F753 +:104310007DF801303C0018F600000004000CFFF7A7 +:10432000B2FFB0BD0000A07D010070B5104C606808 +:104330008025A84360602068284320600D4E301C13 +:104340001030F3F7C8FC002803D107218520F1F7CE +:104350002AFE084800213C0054F6000080684163B2 +:10436000C06C10307061012030612068A84320606B +:1043700070BD0000F400070000300700247E01003B +:10438000011C0020052980B509D202A35B5C5B00FB +:104390009F440000030303033C0090F60000030069 +:1043A000FFF7CFFC80BD0122920280B500210720DB +:1043B00004F0ABF980BD80B540220021002004F05C +:1043C000A4F903220021002004F09FF980BD70B5FC +:1043D0000E1C051C141C08280ED13C00CCF6000055 +:1043E00000F000FC0E2801D1142000E01020E103B1 +:1043F00000D50138C0060A49C00E887108E0092DB1 +:1044000006D1A00401D5002000E00120F3F7B0F9A7 +:104410003440211C321C281C04F07AF93C0008F7B7 +:10442000000070BD00000080070070B50024132953 +:1044300011D8002801D1084E0825012801D1074EC6 +:10444000092500F078FA002805D0021C311C281C30 +:10445000FFF7C3FF0124201C70BDF8FF07003C00DC +:1044600044F70000FFFF00000122D20280B50021C6 +:10447000072004F053F980BD0F22120407214904DC +:1044800080B5092004F04AF980BD000080B5002104 +:10449000042004F01BFC4021002004F017FC044918 +:1044A0003C0080F700000020886002480969203045 +:1044B000FFF709FE80BD64730100B0B560210020E4 +:1044C00004F007FC114D002400220420295D04F0B3 +:1044D00028F90C2003F09BFB01342406240E052C44 +:1044E000F2D33C00BCF700000F2200210A2004F0A8 +:1044F0001BF96121002004F0EFFB064901208860D0 +:10450000044809692030FFF7CDFDFF202D30B0BDF4 +:10451000A858010064730100F8B5061C1248C67063 +:104520000120FFF73C00F8F70000FDFB0127BF0268 +:10453000041CB843011C012004F0D1FB0320FFF749 +:10454000F2FB051CB843011C032004F0C8FB301C1F +:1045500000F09FF900F057F8211C012004F0BFFB88 +:10456000291C032004F03C0034F80000BBFB0020B1 +:10457000F8BD00006473010080B5002240210020D6 +:1045800004F0D8F880BD000070B5051C0124092096 +:10459000FFF7CCFB0F210904884303218904E204BF +:1045A000052D124E20D202A33C0070F800005B5D86 +:1045B0005B009F44000006090C100300032109045E +:1045C0000CE00121090409E00121490406E0F36837 +:1045D000042B05D902E0F368042B01D8014301E064 +:1045E0001043011C092004F080FB3C00ACF80000E3 +:1045F000201C70BD0024FBE7647301000121C90584 +:10460000002880B502D00A1C002100E0002204200E +:1046100004F096F880BD0000F0B591B0002640216E +:1046200001A8F0F7DDFD2A4FB87901223C00E8F837 +:104630000000520300900021062004F084F860215D +:10464000002004F058FB6121002004F054FB0820F6 +:1046500003F0EFFA00240F20FFF771FB4005050F70 +:10466000A80001A9095801AA013101340C2C3C0011 +:1046700024F900001150F1D30020810001AA515803 +:10468000B14201D90E1C051C01301028F5D30620BB +:10469000FFF758FB0F2149028843690208430121B3 +:1046A00049030143062004F029FB0D488468643463 +:1046B0003C0060F9000008E0201C03F05AF90028D3 +:1046C00003D001219520F1F798FC0F20FFF73DFB67 +:1046D0000004F1D5872003F0B2FA0098B87111B048 +:1046E000F0BD201007000001070010B5174C6169EC +:1046F00000293C009CF9000004D00A21132003F09B +:1047000047FE10BD011C1248012900780CD0112968 +:10471000F7D1052803D101211320F1F771FC20788E +:104720000728EED102210AE0052807D006280AD082 +:104730000728F7D03C00D8F900000828E4D1002071 +:1047400005E001211320F1F75EFC10BD012002F00D +:104750006CFD10BD00007C7801000D4980B5097822 +:10476000032901D100280BD0072901D1002807D047 +:10477000022901D100283C0014FA000003D10529C8 +:1047800009D1002807D00020FCF728FD00221321C2 +:10479000112003F0C1FE80BD7C78010080B50622A7 +:1047A0000821002003F0DEFF80BD0000074880B52F +:1047B0004069002801D1F1F73C0050FA000033FFB6 +:1047C0000549054A0868506148689061012080BD2C +:1047D000000064730100B058010010000700074892 +:1047E00080B54069002801D1F1F71DFF0549054A50 +:1047F000086890614868506101203C008CFA000014 +:1048000080BD000064730100B05801001000070073 +:1048100011B500AB597814480123C056002209187D +:104820000B061B161321132B02DD00AB597007E09A +:10483000002B02DA00AB5A7002E01C1C3C00C8FAE4 +:10484000000000AB5C7000AB1B7818180006001667 +:10485000132802DD00AB197006E0002802DA00AB75 +:104860001A7001E000AB1870009818BD0000647366 +:10487000010038B50C1C154900AB496813253C00F4 +:1048800004FB00000091597809185970197808182C +:10489000187019881048022CC18001D0002C0BD14F +:1048A00000AB1878132800D91D7000AB19780020D0 +:1048B000FFF7EEFD022C01D0012C09D100AB587896 +:1048C0003C0040FB0000132800D95D7000AB597814 +:1048D0000120FFF7E0FD38BD000064730100A0581F +:1048E000010070470000B0B5041C0E28134D04D021 +:1048F0001249A00000194D3945180620FFF73DFA6E +:104900000F493C007CFB0000E02209191039C97BEB +:104910009043490111400143062004F00DFA291C7F +:104920000520094A03F030FF08481F2200191038FB +:10493000C07BC104D204082003F026FFB0BD0000F4 +:10494000B40900003C00B8FB000014450100FF0F53 +:104950000000C05801007047000080B506490028DB +:1049600001D1086880BD012801D1486880BDF1F7F8 +:1049700090FB002080BD7C730100014840687047B7 +:104980000000A05801003C00F4FB00000448012393 +:104990000449C056C95640180004000C7047000076 +:1049A000A0580100A258010001484068704700006B +:1049B00064730100F8B5051C0E1C00F055F9041CC9 +:1049C00000F058F900282CD03C0030FC0000B30067 +:1049D000601E002D1C4E19491A4A06D10B250E2CBB +:1049E00000D1194AD258085608E0012D1CD19A1856 +:1049F0000436081808250E23126DC056071C4743BD +:104A0000FB00DF19124B3F2158433C006CFC0000B7 +:104A1000114BA9400C1C3818C0181440EC40C011B0 +:104A200060431B0AC018801203D1012004E000205B +:104A3000F8BD3F2800DD3F203060A84008408A4391 +:104A40001043F5E7CC590100DC5801003C00A8FCFC +:104A500000007C7301007C5901000606000026005E +:104A60000200034808B5C08800AB1880009808BD54 +:104A70000000A0580100B0B50B4D094C0E206C6031 +:104A8000FFF78DF90949021CC8600106090E3C00B8 +:104A9000E4FC0000133A022A02D91738042800D88F +:104AA0000021081C6C60B0BD041802006000070003 +:104AB000647301000A4898B502781321142A00D3C0 +:104AC00001704278142A00D34170064C6068FFF7E9 +:104AD0003C0020FD0000BDFE009000AB1888E08087 +:104AE00000F075FF98BDA4580100A05801000348CC +:104AF00080B541780120FFF7E6FC80BD0000A65894 +:104B00000100034880B501780020FFF7DCFC80BD80 +:104B100000003C005CFD0000A6580100B0B5054D4A +:104B20000024201CFFF744F90134102C01C5F8D3F0 +:104B3000B0BD0000D4440100044980B58870044928 +:104B400080000958072004F00FF980BD647301004C +:104B5000D05801003C0098FD0000B0B53F24021C75 +:104B6000002A01D108200B23012A01D109200823A2 +:104B7000251C9D40002900D101213F2900D9211C7D +:104B800099400A1C291CFFF77CFCB0BD000091B5C0 +:104B9000124900AB1A783C00D4FD00000878114C93 +:104BA00080180006000E207049785A788918090686 +:104BB000090E13221328617000D92270132900D91D +:104BC0006270084908480639C98881802178002028 +:104BD000FFF782FC617801203C0010FE0000FFF727 +:104BE0007EFC98BD0000A4580100A6580100647323 +:104BF000010070B51D4D041C28780E1C032803D13C +:104C000002211120F1F735FA201C00F04EF800289F +:104C100025D0287801280AD168683C004CFE0000A5 +:104C2000002807D00121112003F0EEFB0120696864 +:104C3000F0F7BDFA6C706E60201CFFF7C1FC041C1D +:104C400000F0D4FE002C02D06868002802D1F6F7EC +:104C5000D9F870BD012028700122211C3C0088FE7B +:104C60000000112003F09FFB70BD02211120F1F71D +:104C700006FA70BD00009C73010080B5012805D1C3 +:104C8000002904D0012901D1F6F7BFF880BD0549FC +:104C90000878032802D00020087080BD03213C0062 +:104CA000C4FE00001120F1F7EDF980BD9C730100F6 +:104CB00001484078704700009C730100011C0139D5 +:104CC00001200E2900D300207047000010B5134CBE +:104CD000207801280ED1606800280DD00121112014 +:104CE0003C0000FF000003F098FB01206168F0F732 +:104CF00067FA00206060207001E003280ED00021D8 +:104D0000112003F08AFBFFF724FCFFF7C0FB0549E5 +:104D1000087B40084000087303202070012010BD6C +:104D200000003C003CFF00009C730100880007006D +:104D300010B50D4C2078032813D1002020700B48AB +:104D4000017B012211430173FFF770FCFFF718FC90 +:104D5000002806D002212170011C0022112003F03E +:104D60002BFB01203C0078FF000010BD00009C736D +:104D700001008800070080B50549002804D0002004 +:104D8000086003F05AFA80BD0120086080BD805A97 +:104D90000100FEB5051C8035041CA8682979066849 +:104DA000201CA03002293C00B4FF00001CD169790E +:104DB000082901D00C2917D101216162A96809686D +:104DC000098B0182A9690191008AC00605D5606836 +:104DD0000088400501D4012000E000200290052059 +:104DE00001A902F0B7F902E03C00F0FF0000002149 +:104DF00061620182A9681A230A89676A181C002F58 +:104E000000D11820101A0881A8680168626A002A77 +:104E100000D11823C9180160A86841C43088083C33 +:104E2000400403D5201CF7F7BCF93C002C0001001E +:104E3000FEBD0021E1613079C00703D4201CF7F7E3 +:104E400091FEF5E7201CF7F743FFF1E7F7B5051CE6 +:104E50000A30061CF5F7A4FA144F041C3988F2F73F +:104E600083FE328878680280728802303C006800D5 +:104E700001000280B18841806988029A201CFAF7FB +:104E8000CEFE0B4D08356880FBF72BFE0121090390 +:104E90000028288801D0884300E00843288004487F +:104EA000002200211430F2F732FE201CFCF73C00F7 +:104EB000A400010085FAFEBD247B010010B5134C4F +:104EC0001149201CFF3069300EC90EC0201CFF3074 +:104ED000242275300E49F0F717FA201CFF303C22CF +:104EE00099300C49F0F76CFA201CFF301022D530B5 +:104EF0003C00E00001000949F0F709FA201CFF30EE +:104F00002822E5300749F0F75EFA10BD0000008066 +:104F10000700406301000C8007003080070080809C +:104F20000700A0800700B0B500283FD021484168A5 +:104F3000214C3C001C0101006160C168E160016915 +:104F40002161806AA0621E491C48096814384164C6 +:104F50001C48251C3C350FC80FC5201C80224C3036 +:104F60001949F0F733FA1422201CCC301749F0F716 +:104F70002DFA38223C0058010100201CE030154970 +:104F8000F0F727FA201CFF30502219301349F0F7B0 +:104F900020FA83208000142220181049F0F719FA13 +:104FA00011204001842220180E49F0F712FAFFF771 +:104FB0008EFFF8F794FB3C0094010100B0BDFFF7B1 +:104FC00089FFB0BD00100700406301000820070002 +:104FD0004020070000300700004007000050070095 +:104FE0000060070010000700009007000C4980B522 +:104FF000012048600A4814383C00D00101000078C4 +:10500000012804D008489438406F002803D00020BD +:1050100000F01FF880BD08680028FBD00348F2F7B5 +:105020007AFE80BD000098660100FFFF000080B599 +:10503000002809D1F2210F2003F03C000C020100EE +:1050400013FA00220F21F12003F0CCFA80BD0120D9 +:10505000F8F76AFE80BD000010B5041C032000F0C4 +:10506000C9F900210F2003F0FFF9FFF765F80B499C +:1050700000204874FBF7E6FA094800683C00480243 +:105080000100002803DC02214042FFF752FC0448E3 +:1050900014300068002802D0201CF2F742FE10BD38 +:1050A000000084660100D47E0100064980B50978BD +:1050B000042905D0052903D0062901D007293C0081 +:1050C0008402010001D1FEF7BDFD80BD74660100C0 +:1050D00010B5094CE06800280BD107482C38008A2D +:1050E000C00704D5002101206268F9F7C9FA012040 +:1050F000E060012010BD0000F46E01008CB5021CC0 +:105100003C00C0020100081C111CFDF728FF0190A3 +:10511000002805D0172000AB18806846FDF7FFF87F +:105120008CBDF1B52E4CAEB0002525632069012859 +:1051300003D101A801F0A1F84EE00126284F267006 +:10514000503F3C00FC020100B869F8F74FF82549D0 +:105150002C3900281DD0E06A01281AD1088A0F1CBA +:10516000800704D5002102206268F9F78FFA388A97 +:10517000000707D5E068012804D1002108206268F3 +:10518000F9F784FA3C00380301000022182182203C +:10519000266303F036FA25E0088A0E1C800704D542 +:1051A000002102206268F9F774FA308A000707D5F7 +:1051B000E068012804D1002108206268F9F769FA43 +:1051C000308A400704D53C0074030100002200210E +:1051D0000420F9F761FA2E98012804D01E950921C0 +:1051E0001BA8FFF797FFE562BD61E5602FB0F0BD3A +:1051F000F46E010080B50720FEF7A0FE00210F200D +:1052000003F044F90C4801783C00B0030100002988 +:105210000FD00221017088380078002804D0074997 +:105220001031487C01304874F2220F20054903F008 +:10523000FCF800220F21F32003F0E9F980BD746629 +:10524000010080841E0010B5041C3C00EC0301002A +:10525000F2210F2003F020F9012C0AD10848084957 +:1052600000681439002805D0C878022802D1F7F761 +:10527000AFFA10BD002048700520FEF765FE10BD96 +:1052800098660100F8B5284E3021351C3C002804F2 +:10529000010060352889895D884203D10020FFF72D +:1052A000F6FEF8BD341C70340121217041188019BC +:1052B0003030298140781D4F183F3870002808D0C1 +:1052C0000021FBF7C2F9002807D12078FFF73C0046 +:1052D000640401009BFFE7E701210F20F0F71AFFAC +:1052E00014480121803081703869FBF755FA20732A +:1052F00000210F2003F0D6F8707A01280ED10E4855 +:105300000068002804D0387802F0DAFA002805D0C6 +:105310003C00A0040100307F60730320207071897D +:1053200005E005202070A888FAF73BFB011C00224D +:105330000F2003F086F8BAE7000004660100E4627B +:10534000010070B5041C02F06CFC364B191CA03136 +:105350000A783C00DC040100102A02D20A79102AE3 +:1053600001D3012500E00025304ECA798036012C9A +:1053700012D00025022C2ED0042C3CD15C6B002CCA +:1053800039D19C6F001B2A4CA04234D9B268986A6C +:10539000824231D03C00180501004D7234E0B06803 +:1053A0009C6A0222A04221D1586B00281ED1002DF8 +:1053B0001CD1487A192820D03468986F6400001BEB +:1053C00074680019FF301C4C3930A04216D248795D +:1053D0008C79001930283C005405010011D31022AB +:1053E0000FE05C6B012C06D1B0689A6A904200D144 +:1053F0004D72002205E09C6F001B124CA04200D3AE +:10540000202206E04A7A192A01D201324A72202269 +:10541000B06030689B6F98423C009005010004D159 +:10542000002A00D148794A7106E0102A04D370603E +:10543000336048798871F6E7CA7170BD0000A46CCA +:105440000100A304000071020000350C00000548B3 +:1054500080B5817B002905D000213C00CC050100EE +:10546000817303490F2001F00FFF80BD74660100B6 +:10547000E9030100F8B5041C02F0E2FB051C384EFC +:10548000201C3749341CA0341022443901282CD068 +:1054900004284ED1371C743609CE26783C00080605 +:1054A0000100C01A202E04D1304EB04201D900268E +:1054B0004E613E1C3F6C002F48D1776C002F45D1C8 +:1054C000B76A002F3DD0776B002F3AD0274FB842F4 +:1054D00037D26078102806D3F06F181A244B3C009E +:1054E00044060100984201D2E270F5664869062838 +:1054F0002FD201302CE02078202801D106234B61E7 +:1055000002232371B36A002B19D04969032916D9E4 +:10551000716B736D594012D0E178102910D3617806 +:105520003C0080060100331C10290CD3D96F691A86 +:10553000134DA94207D2586C002802D0986C00285D +:1055400000D12271F8BD0228FCD12270FAE7486927 +:10555000002801D0013848610A49F06E401802F075 +:10556000B0FA3C00BC0601000028EED00120E0703B +:1055700006482818F066E8E7A46C0100E204000081 +:105580001A06000053070000002D3101005A620284 +:1055900080B541680979C90713D5C16900290DD0C3 +:1055A000897902293C00F80601000AD10821018608 +:1055B000011C38318162021C06480449F9F7FDFCE0 +:1055C00080BDF7F7DCFB80BDF7F723FB80BDB97129 +:1055D0000000A06A010010B50024002803D002F0EA +:1055E000E8FE002817D03C00340701000C4C0120D5 +:1055F000A0722068002141620A490268C9786032BD +:105600009171218901312181006840308183FBF74C +:1056100031FC20680068FCF7A1F90124201C10BDB2 +:10562000147A01000E6101003C00700701007FB593 +:10563000061C1E481D1C438802881C21002090B0B7 +:10564000F0F745FF03900468FF2101312180082015 +:1056500060800620207104206071C001002D00D1FF +:10566000081CE08001A80230311C3C00AC0701009E +:10567000051CFAF75FFA10496846FAF75BFA201C36 +:1056800008306946FAF756FA291C201C1230FAF73E +:1056900051FA10AB9888002201212083D8886083BA +:1056A0001889E081588920826846F9F73C00E807AC +:1056B000010017FF14B070BD0000146E01001261EC +:1056C0000100B0B5041C1848251C0078603580071F +:1056D000002808DAE879002805D0F4F770FF011CEB +:1056E000201C00F078F929882E20005DF2F73C009C +:1056F000240801009FFAE87900280BD1201C4030D3 +:10570000018B22691180418B22695180808B216934 +:10571000C88207E0012805D1206901220188D20250 +:10572000114301806A7AE0680249F2F753FAB0BD8A +:105730003C00600801001D750100D14F000090B5CC +:10574000041C38230C495843431885B000200A49EB +:105750000290181C012203910949049230304278CA +:1057600009880192009101785A6B0C33201CFBF7D9 +:105770007CF83C009C08010005B090BDD4E4010019 +:105780005D4E0000487B010090B585B0031C0020F1 +:1057900002900A49181C0022049260300391C279D9 +:1057A0000188019200915A6ADC682033997B407A23 +:1057B000231CFBF73C00D80801005DF805B090BD44 +:1057C00000000D4F0000074980B5886A002808D105 +:1057D00001208862F0F7AFFC011C03480022F2F7B9 +:1057E000B8FE80BD00007869010041E40000F0B51A +:1057F0009BB0002820D03C0014090100011C08A81F +:10580000FCF7B2FD01201190032010AD2872042096 +:10581000687205A800226946F4F700FF00240026FC +:1058200005A90020F9F7FCFA6946F9F7F9FA0B9097 +:1058300008A8FCF7BBFD01343C0050090100022C14 +:105840002E72F0DB1BB0F0BD000090B5041C4C23A1 +:105850000C495843431885B000200A4902900022A1 +:1058600004923C200391C25C084841880192412087 +:105870000091C15C5A680833201C3C008C0901006F +:10588000FBF702F805B090BD58E30100754F00002A +:105890003C7C0100F8B50E1C224C3821171C051C5D +:1058A000201CEFF775FD231C2533211C243110200B +:1058B0006A46F9F71DF800AB188807213C00C809B3 +:1058C00001001A4A02382084201C20308170C570E3 +:1058D000111C0673477334312163303262630179DE +:1058E000251C103521812060E5601888401A20832E +:1058F000201C28302061201CF9F711F80D483C00CD +:10590000040A01000068002807D00621201CF8F7CF +:1059100047FD1021281CF8F743FD084802210162C9 +:1059200044620121016206480068EFF7D5FCF8BD2A +:105930008C8E0100E4FE0100CC5C01000030070009 +:105940003C00400A01005C5B0100F0B5061C4036DB +:10595000318B041C251C0807800F6035012885B099 +:105960003BD0E879002805D120690180B08B2169FE +:10597000C88207E0012805D1206901220188D202EE +:1059800011433C007C0A0100018020480078800718 +:1059900026D5E879002823D0A06B00281CD0F4F786 +:1059A0002FFE002809D0B8210958002905D0302140 +:1059B000095DB4300818077A00E000270121381C7F +:1059C000FAF786F93C00B80A010004902069043017 +:1059D000391CF4F76CFD0499FAF7D3F902E0201CA6 +:1059E000F7F7F9FB7083708B216900224880094921 +:1059F0000A48049203910290EA7929880192009161 +:105A0000626AE36820343C00F40A0100A17B687AF2 +:105A1000FAF74CFF05B0F0BD1D750100D14F000035 +:105A2000DD2F0100FEB5041C261C012020360029B4 +:105A300002902ED05820005B0007800F012801D172 +:105A4000CC3100E0B43148683C00300B01000D1C43 +:105A5000002824D0201C6030C2790121012A00D006 +:105A60000021271C626D3037002A04D03A1C281C04 +:105A7000F6F7E7FD07E0427A231C683300923A1CF0 +:105A8000281CF6F79AFD029038783C006C0B010058 +:105A90004019007A0121B073FAF726F901E00020DD +:105AA000B0736062B07B0D2801D9F0F7BBFB0298A0 +:105AB000FEBD0000FFB5041C8030251C5E3500785B +:105AC000AE1DAF1F002883B012D1F4F73C00A80B25 +:105AD0000100C7FB002807D006980599029004989A +:105AE0000190A66167610DE00498069902900598FF +:105AF0000190666105E004A903C90290069801902F +:105B00006761A5610622381CEFF78BFC06223C007A +:105B1000E40B0100281C0299EFF786FC0622301CDA +:105B20000199EFF781FC07B0F0BD0000B0B50D1C86 +:105B3000041C052801D3F0F77BFB0249A00008589C +:105B40008560B0BD107B0100F8B5FFF759F9051C61 +:105B50003C00200C0100FEF7E8FF041C281CFFF7A6 +:105B600058F9002842D0691E214D4A00204B1C3DA7 +:105B7000AE5C985C3040D6180123F6565219D256C6 +:105B8000964201DD151C00E0351C184B2A3B595686 +:105B900051183C005C0C0100B14200DB311C0E1CB2 +:105BA000002826D0FEF7BEFF009000AB18781249FF +:105BB0000023C95600AB1522101A5B78001B401851 +:105BC000D21A121B51180022854202DB00AB1A7058 +:105BD00002E0401B3C00980C010000AB18708E42A4 +:105BE00002DB00AB5A7002E0881B00AB58700098D3 +:105BF000FFF78DF801F0FFF8F8BDE6780100657356 +:105C0000010070B5084E064D00240620604380193F +:105C10000622291CEFF73C00D40C010011FC0134D2 +:105C2000052CF5DB70BD00004E470100E67A01004F +:105C3000034880B501680348FEF742FB80BD0000C1 +:105C4000A8790100C4600100034880B501680348D9 +:105C5000FEF74AFB80BD00003C00100D0100A87952 +:105C60000100C460010010B500280AD0064CA169EB +:105C7000002901D1002000E00968F7F738FBA06196 +:105C800010BD002010BDA46E0100F3B5374883B0ED +:105C9000029080790E1C002701903C004C0D010001 +:105CA0003448354A016A039C031C1B69A14201D098 +:105CB000936100E0536131498A6896423FD02D4894 +:105CC0008E60C1680024251C00292D4809D0002EB3 +:105CD0000BD028480124C06A240300283C00880D0A +:105CE000010006D0012704E0002E01D0051CF9E7D1 +:105CF000041C002F06D0FBF71EFB1F48016822483A +:105D0000FEF7FBFA201C28430ED02A1C211C012080 +:105D100002F021FE2A1C211C022002F01CFE3C0085 +:105D2000C40D01002A1C211C032002F017FE002FC5 +:105D300006D1134801681648FEF7CEFAFAF742FD7D +:105D4000039C002C01D101F0E1FF01A903C9887176 +:105D500001F0DCFF0A4C0A4B443CA1692269083B74 +:105D60003C00000E0100411A002A03D01A685118A5 +:105D7000196002E05A6851185960A061266105B0A7 +:105D8000F0BD20100700A46C010010000700B05700 +:105D9000010000106000847301001CB54C23084909 +:105DA00058433C003C0E01004418201C4030417810 +:105DB0006268009101923F210B5D618F0078626CF7 +:105DC000FAF728F8A0851CBD58E30100B0B5164DC0 +:105DD000A969002925D02C1C3034207A002820D035 +:105DE000002381223C00780E0100182002F089FC7B +:105DF000207AFF300006000E207212D10C482821B4 +:105E00002C38095C2172297A002901D1006A00E04E +:105E1000406AA9698002814203D24900814201D2CD +:105E2000A961B0BDA8613C00B40E0100B0BD01F095 +:105E30001DF9B0BDF46E01007FB5051C04206B4652 +:105E40001B180290002628186A4602A9FCF78AFB54 +:105E5000002806D100AB1879042808D01879032847 +:105E600005D000AB187910213C00F00E010008436A +:105E700004B070BD03A9E868F6F7D3FF002805D089 +:105E80000398202108430006000EF1E703A9002033 +:105E9000F6F7C7FF041C01D10220E9E7E86800AB70 +:105EA0002060009860601879A0763C002C0F0100FB +:105EB000A88C6076E8692061688CA082288C2076A6 +:105EC00069690948814200D9081CA060201C02F0C1 +:105ED000A1FDA168002904D0039AA132082002F094 +:105EE00037FB301CC7E70000A08601003C00680FAC +:105EF0000100FEB5061C40780124062850D3C11EBF +:105F00000320EFF75EFB00900E2849D800200AE03E +:105F10004100091889194A798979511801390E29DE +:105F200000D90024013000998842F1DB002C3C00AC +:105F3000A40F010037D00322B11C1B48EFF7A4FACD +:105F40001A4C1C21201CEFF74DFA002528E06900AF +:105F5000491902918A1953791548435493790F18B6 +:105F60007B70D379BB700723D2560192445C0FE05B +:105F70003C00E00F0100201CFEF77BFF002807D04B +:105F80000C4A600080180121103881730199C17397 +:105F900001342406240E07480299405C79784018A1 +:105FA000A042E8D8013500988542D3DBFEBDE86207 +:105FB00001003C001C100100E6780100EB620100CA +:105FC00001680F2901DD0F2101600168002901DA54 +:105FD0000021016070470000F8B5041C1E48221D16 +:105FE00005680092161C231C0F1CCC332A1C201C95 +:105FF0007030A16D3C005810010000F03EF9009691 +:10600000A16D27200140231CE433201C2A1C5C3096 +:1060100000F033F9134800780E2801D2012585409D +:106020001148A1690078294000070BD4480703D51F +:10603000080701D504203C00941001008143880624 +:1060400003D5480601D520208143231CB4332A1CE4 +:10605000201C3030009600F013F9391C201CF0F79A +:1060600047FCF8BD2C7D0100106701001D75010083 +:10607000B0B5F2F727FCFEF73C00D010010009F99B +:106080000F48002545700E480D4C00885B34A082F7 +:10609000F9F723FD2061A08A002804D00121890599 +:1060A000EFF70DFBE18205480138456001F055FE30 +:1060B000021C231C00210020F4F73C000C110100FD +:1060C00049FDB0BD457D0100F467010070B5161CA7 +:1060D0005A89041C04989207920F00250029A27186 +:1060E00009D00521F9F724FB002801D0C07800E091 +:1060F0000120E07100E0E571E560A6603C00481118 +:10610000010070BD0000FEB5051C0E229C30164932 +:10611000EFF7CFF9291C281C8030883100242F1C70 +:106120006037029101902006000E061CF9F70DFE63 +:10613000002803D001984268029901E0EA6D3C0012 +:1061400084110100391C002A0DD0002003E00B5CF3 +:10615000B34202D801309042F9DB08181038C07BF6 +:1061600029199031087301340E2CDFD3FEBD0000D5 +:10617000CC470100FFB581B0141C101C06220D1C79 +:106180003C00C0110100191C0B9E0A9FEFF797F904 +:106190000622391CA018EFF792F9E6602C60102057 +:1061A00028816E600198E86005B0F0BD000070B510 +:1061B000041C002020615820005D0E1C151CC00727 +:1061C000C0173C00FC1101000130E061216B002987 +:1061D00036D11E490968294332D0A168898A00292D +:1061E0002ED000280BD0201C583000F0F3FD0028E2 +:1061F0001BD0816A026A406A0978007806E0144A76 +:106200003C2311783C0038120100507843439A181F +:106210000432002D03D1022901D0032902D16D21BE +:1062200022610855206900280DD08188002901D1FC +:10623000012070BD8079022805D1221C074907483A +:10624000F8F74BFF02E03C0074120100201CEFF74E +:10625000B5F8002070BD00002861010068610100F0 +:10626000A1DA0000A06A010010B500210020F9F7B2 +:1062700039FEC400F9F754FE2418F9F747FE08491F +:1062800020180988084C40183C00B012010006494B +:10629000098840186061F9F746FE054909884018E9 +:1062A0004000A06110BD0261010004610100D479C9 +:1062B0000100A66901001140081C10B51C1C191C26 +:1062C00008311860F1F731FE60603C00EC1201000B +:1062D00010BD0000F8B5061C22480F1C4168914211 +:1062E00003D000218160C1604260C46815E02820AD +:1062F0001D4960434018051C0622311CEFF770F859 +:10630000002807D1A81D391CF9F710FD3C002813FF +:106310000100002801D00120F8BD01342407240F1A +:10632000124880688442E5D1104C2823A0680F4DA4 +:10633000584340190622311CEFF7D3F8A0682823F0 +:106340005843401906302222391CEFF7CAF83C00A6 +:1063500064130100A06801300007000FA060E1682D +:10636000814203D101310807000FE0600020D6E729 +:10637000EC650100A0F4010010B50021032000F03D +:10638000E5FF054CA068002804D101F007FD616815 +:106390003C00A0130100401A606010BD0000D060F6 +:1063A000010002680A6001607047011C0068002853 +:1063B00001D002680A6070470000FEB5141C1D1C65 +:1063C0000022D24301ABF3F782FF01980026284058 +:1063D00001903C00DC1301000025002720601EE036 +:1063E0000121B9400A1C024018D0884301903906A7 +:1063F000090E7019001902910177081CF9F7C6FC03 +:10640000002806D0301C0019013602993030017086 +:1064100004E0281C3C001814010001350299001901 +:106420000172013701980028DDD17019A061656003 +:10643000E662FEBD0000B0B5144D041C287A0128A8 +:1064400002D10420F6F7ADF9211CA86AF5F721FC6A +:10645000002803D104203C0054140100F6F7A4F9ED +:10646000B0BD02202870288C002800D06081688C84 +:10647000002800D0A081A88C002800D0E081E86925 +:1064800001230204120C201C0249FCF719FFB0BDC5 +:10649000F46E0100A17700003C0090140100F8B5F3 +:1064A000194E051CB069002800D13068FFF73BFC8D +:1064B000154F041C503700280BD06068291C7860E9 +:1064C00001203863201CF5F7EAFB002804D10020E6 +:1064D000F8BD0023FB62FAE700233C00CC14010066 +:1064E0002377F86A002801D10120F862387A012860 +:1064F00007D0F86906490204120C281CFCF7E6FED6 +:1065000001E0FB62B3610120E5E70000A46E010039 +:10651000DD02010070B50D1C041C161C3C000815A2 +:106520000100042C1BD21048834207D258000F49A7 +:10653000EFF7FBF8FF30000A013800E000201F35BC +:10654000EA066107090ED20E11437207520D11437C +:106550000006000A0843064AA100505070BD3C00E6 +:106560004415010001218D20EFF7ACFE70BD000045 +:10657000409C000000803801E8600100094A80006A +:106580001058400940010722024307480368002BC6 +:10659000FCDB42600906016001680029FCDB082081 +:1065A0003C008015010070470000E86001003020C9 +:1065B0000700B0B5041C0D1C0749A00008580028AE +:1065C00003D102218D20EFF780FE291C201CF6F755 +:1065D000A8FAB0BD0000E8600100B0B5041C0D1CB5 +:1065E00007493C00BC150100A0000858002803D151 +:1065F00002218D20EFF76CFE291C201CFFF7C4FF41 +:10660000B0BD0000E8600100F8B50D1C161CF7F7DE +:1066100017F9041C2868404F817800293BD1C178C4 +:10662000002958D13C00F8150100F8F7F8F9228E3E +:10663000618E8A4204D0A16A0918E069814210D9AA +:106640003849321C486B01304863206A01302062AF +:10665000386801303860E0686369291CEEF7D8FEBD +:10666000F8BD013212043C0034160100120C2286DF +:10667000A162B868002834D12C480C2300681B1A8A +:106680009A4207D219239B01AF2292015843101A54 +:10669000814226D30120B86001210C2000F07AFE4F +:1066A0001FE001291DD1C0783C0070160100172899 +:1066B0001AD1A08EE18E884214D3E968096809795D +:1066C00009060FD5606A321C01306062E0686369B8 +:1066D000291CEEF7A3FEE868016808310B2000F0E2 +:1066E0005CFEC3E70130A086A08D3C00AC16010023 +:1066F000E18D884204D103210220EFF7F5FDB8E7D0 +:1067000060684560866000686060F8680130F86025 +:10671000A08D411CA1850028ABD10848B969FDF7BF +:1067200061FE221C0221F12002F064F83C00E81610 +:106730000100A1E70000FC5A0100905C010018571D +:106740000100C460010080B5021C0221F02002F0AB +:1067500054F880BD0000002803D102484178C907E1 +:10676000FCD5704700000400070080B500063C001F +:106770002417010001D1F1F771FE80BD80B5F4F757 +:10678000E5FA80BD80B5F6F7EBF880BD0149002041 +:10679000087470477869010080B5C00703D50249C5 +:1067A000012000F01DFC80BD50C300000006000E5B +:1067B0003C0060170100012880B502D1F6F7E1F92D +:1067C00080BD0028FCD1F1F74CFE80BD000080B5F3 +:1067D000F6F7D7F980BD034980B500200874F6F7B5 +:1067E000FEF980BD00007869010080B50006000E4A +:1067F000F1F73C009C17010071FE80BD10B5012827 +:1068000008D0022803D0032801D0EFF7A7FDF6F740 +:10681000E9F910BD01F0F8FA041CFAF75DFD241A3D +:10682000FAF73EFD084900280BD0486A002808D036 +:10683000064884423C00D817010005D2011B012202 +:10684000072001F0F4FEE5E700204861E2E77869FF +:10685000010050C30000094980B5486900280CD0E8 +:10686000086ACA69801A002807DD002048610121F2 +:10687000072001F010FF3C0014180100F6F7B8F9EA +:1068800080BD00007869010080B500F0E7FB80BDA5 +:1068900080B500F03FFC0020F7F7D4FC80BD00007D +:1068A00080B500F037FCFDF76FFCF5F773FD30F0B5 +:1068B00047FB80BD044880B53C0050180100C16A08 +:1068C000006BF2F7DEFF0120F7F789F880BDA46CBA +:1068D000010010B5F3F741F80D4C002804D0012059 +:1068E000E064F7F7B2FC10BD01210120F3F7E9F8ED +:1068F000FDF74DFC606D002803D03C008C180100B2 +:10690000F3F782F8002801D0F5F74AFD0120F2F7ED +:10691000C1FC10BDA46C0100044880B5C16A006BC5 +:10692000F2F7B2FF0120F7F75DF880BDA46C01001B +:1069300080B500F0F5FBF5F733FDFCF73C00C81817 +:10694000010031FDF9F7CBFF0420F2F7A6FC80BD72 +:106950000000034880B5C16A006BF2F798FF80BD64 +:106960000000A46C010080B500F0DDFB0020F7F70B +:106970003CF830F0EEFA80BD000080B500213C000C +:10698000041901000120FFF719FA0120F2F788FC31 +:1069900080BD000080B500F0C9FBFCF707FD0121B8 +:1069A0000120FFF70BFA0420F2F77AFC80BD00000B +:1069B00080B500220021002000F08AFB80BD00008D +:1069C0003C0040190100034880B5826A012104207F +:1069D00000F081FB80BDD479010080B50022002148 +:1069E000032000F078FB80BD0000034880B5826A78 +:1069F0000121042000F06FFB80BDD479010080B537 +:106A000000223C007C1901000021032000F066FBFD +:106A100080BD0000064880B5816842690069511850 +:106A2000814203D90121012000F058FB80BD000004 +:106A3000D4790100064880B58288816800695118C0 +:106A4000814203D93C00B81901000121022000F065 +:106A500048FB80BD0000D479010010B5084C207BB4 +:106A6000216AF9F79CFAA1694218A0682169801887 +:106A7000884203D90121022000F033FB10BDD479F4 +:106A8000010080B500223C00F41901000021002023 +:106A900000F02AFB80BD00000006000E012880B532 +:106AA00002D1F6F78FF880BD0028FCD1F1F7FAFC8F +:106AB00080BD000080B5F6F785F880BD80B5000682 +:106AC000000EF1F729FD80BD3C00301A0100B0B581 +:106AD00002250228104C0BD1FBF747FC002801D1FE +:106AE000FEF74FFF2570A1680C48FDF7A8FCB0BD6C +:106AF00003280DD108487D231C380069DB0058436A +:106B0000191C40184108022000F03C006C1A0100DA +:106B100091FA2570B0BDF8F731F9B0BD7869010080 +:106B20003463010010B5054CE068002801D1EFF78F +:106B300039FC0220207000F0AFFA10BD7869010026 +:106B4000034880B5826A0121042000F03C00A81AA5 +:106B50000100D3FA80BDD479010080B50022002164 +:106B6000032000F0CAFA80BD000080B50022002199 +:106B7000002000F0C2FA80BD0000034880B54269E1 +:106B80000121012000F0B9FA80BDD47901003C0058 +:106B9000E41A0100064880B58288002A02D001214B +:106BA000022002E000220021002000F0A9FA80BDAE +:106BB000D479010010B5064C207B216AF9F7FEF963 +:106BC000A16942180121022000F09AFA10BD0000CC +:106BD0003C00201B0100D479010080B50022002177 +:106BE000002000F090FA80BD000038B5FAF741FEB1 +:106BF0000020F0F780F8009000AB1C885D88F8F763 +:106C00003CF9002C02D0FDF79EFA02E00120F6F7D5 +:106C10000AFF3C005C1B0100291C201CFCF7B8FC8F +:106C2000002C02D0F5F7E0FB02E0002000F0DCF9D8 +:106C30000320002C00D102200006000EF2F74EFBCC +:106C400038BD0000034880B5826A0121042000F0AD +:106C50005DFA80BD3C00981B0100D479010080B52D +:106C600030F09BF980BD80B500220021032000F0A8 +:106C700050FA80BD0000034880B54269012101201F +:106C800000F047FA80BDD4790100044880B58288BD +:106C9000002A03D001213C00D41B0100022000F097 +:106CA0003BFA80BDD479010010B5064C207B216AE7 +:106CB000F9F790F9A16942180121022000F02CFA9D +:106CC00010BD0000D479010080B5FCF793FB0121D1 +:106CD0000120FFF797F804203C00101C0100F2F798 +:106CE00006FB80BD000080B52FF06BFB00280AD0AA +:106CF0000120F2F7FCFAFAF72AFC002802D104205E +:106D0000F6F75DF880BD03211620EFF732FB80BD5A +:106D10000000024880B50068EEF73C004C1C010002 +:106D2000C5FB80BDD4790100034880B542690121CB +:106D3000012000F0F7F980BDD479010080B530F072 +:106D400035F980BDB0B5184CAA20005D042819D1D2 +:106D50000125E562256301F093F8A0663C00881CDC +:106D6000010001F0FCFDF2F72EFE00280ED00220FB +:106D7000F2F7C3FAA56001F086F864306060FAF7B4 +:106D80008AFD01210120FFF746F8B0BD0120F2F78E +:106D9000B4FA0020A06000210120FFF73CF83C007D +:106DA000C41C0100F2F766FE0028F1D0FAF776FD68 +:106DB000B0BD0000A46C010080B50020EFF7D6FE46 +:106DC00080BD000080B50120EFF7D0FE80BD00003F +:106DD000AC21095C024A09028918C0318160704700 +:106DE0003C00001D01007075010080B5012804D130 +:106DF00003C90968EEF764FB80BD01211420EFF799 +:106E0000C4FA80BD0000002802D1024840687047E3 +:106E10004068704700005875010010B50024F8F76D +:106E20001CFB3C003C1D0100002804D04030807A4F +:106E3000052800D10124201C10BD000004480021B9 +:106E4000406801E0016340680028FBD17047000002 +:106E500058750100B0B5041C0D1CF7F7A5F84034B7 +:106E6000E572B0BD3C00781D0100F8B5071CF8F7CD +:106E7000FAFA041C04D005211420EFF78CFA28E05C +:106E80000025144928024618301C443006221249B5 +:106E9000EEF72DFB002802D1AC208555341C0135BE +:106EA000032DEED3002C3C00B41D010014D0391C7E +:106EB000201CF8F72BF80949002020601839486891 +:106EC0006060002800D004604C60CA68002A03D0CB +:106ED0000121201CEEF7FEFA201CF8BD70750100A0 +:106EE0005846010080B5F8F73C00F01D0100C1FADA +:106EF000002804D106211420EFF753FA80BDF5F7DE +:106F000016FC80BD000080B5F8F7B3FA80BD10B55F +:106F1000094C2188022903D11420EFF742FA04E03A +:106F2000A3688A009850481C20803C002C1E010059 +:106F3000208801380004000C10BD000058750100C5 +:106F40000B1C111C084A80B51288904206D2DA68E0 +:106F5000C0001218142001F0BBFB80BD03211420D7 +:106F6000EFF722FA80BD0000587501003C00681E52 +:106F70000100084A80B51288904206D2C968C00054 +:106F80000918142001F0DBFB80BD04211420EFF769 +:106F90000EFA80BD0000587501000149C8607047B5 +:106FA00000005875010080B506224430EEF73C0021 +:106FB000A41E0100ABFA002801D1012080BD0020F1 +:106FC00080BD00001CB5144C2069002823D0207817 +:106FD0000A2801D000F0FCF8002060610F484079D9 +:106FE000A070002801D0012815D1FDF7EDFE019019 +:106FF0003C00E01E0100FDF782FE009000AB187916 +:107000001978401A187158795978401A58710198AE +:10701000F2F789FE0520207000F0BFF91CBD7C78D6 +:1070200001000C5A010008B5044A009014320020F7 +:10703000024B3C001C1F01000249F1F77DF908BD1D +:107040002C750100B1A80000B0B5002806D00128B9 +:1070500006D0022807D10C4C012507E00B4C04E0B8 +:107060000A4C2A3C01E0084CB634002500F02CFF05 +:107070000749896E3C00581F01000919091AA142ED +:1070800000D900212A1C162001F031FBB0BD71028D +:1070900000000C050000A46C01008CB500AB8E2133 +:1070A0001980FCF738F901906846FBF7A6FA8CBD09 +:1070B0000000BFB5134A3C00941F010001910D1C54 +:1070C000117C8843041C2143081C1074A0070BD5B5 +:1070D0000E4800900120029000F0FCFE0C49401880 +:1070E00003906846F9F76AFFE0070CD5F1F72CFD2D +:1070F000002803D0074885423C00D01F010000D281 +:107100000190064800906846F9F709FFBFBD78690D +:10711000010081EA000010270000A086010075EA46 +:10712000000010B50A4C606900280ED10120606192 +:10713000A1680748FDF7CBF900213C000C200100B5 +:10714000A068F9F7D1FB01220720044901F0D8FA21 +:1071500010BD00007869010034630100983A000016 +:1071600010B50C1C111C064A002B107003D000280F +:1071700002D1F9F7F5FD10BD201CF9F73C004820BD +:10718000010001FE10BDA0790100B0B50A4C051C3C +:10719000E36A201F0133E3620088002906D0A1685A +:1071A00089182161054A00F0FCFE01E000F0CFFEE5 +:1071B0002577B0BD0000D479010055E300003C0004 +:1071C00084200100011C034880B54088FFF7ECFED5 +:1071D00080BD0000987C0100034880B5C168183864 +:1071E0008088FFF7E1FE80BD707C010080B5002142 +:1071F000162001F0BFFA0121162001F0BBFA80BD74 +:107200003C00C020010010B50B4C20780A2810D09B +:10721000012060610A21132001F0AFFA0A2060709A +:107220002070FDF73CFB0120FDF7E9FB0020FAF799 +:10723000C4F910BD00007C78010010B50C4C002092 +:107240000B493C00FC2001002063E062503988615A +:107250002070084838210C38007A08558121182000 +:1072600001F08EFA2069012802D10020F5F73EFBDB +:1072700010BD0000F46E0100B0B51C4C00252C229E +:10728000011D201C3C00382101009AB0EEF739FAAC +:1072900018492C31081C007A8A69002A13D1022867 +:1072A00003D1A068002820D004E000281DD1606828 +:1072B00000281AD0800288610E4869462438006888 +:1072C000EFF7CBFB11E03C00742101000022022803 +:1072D00003D1A068002809D104E0002808D1606823 +:1072E000002803D18A61FFF7B1FF01E080028861C5 +:1072F000281C1AB0B0BD0000C86E0100F8B50C49DA +:10730000022048600B4900053C00B02101000860E4 +:107310000B4FB868F9687C68451A2E1C04E0A06819 +:107320006168EEF709F92468013DF8D27C60F868DD +:107330008019F860F8BD402007000010070044E302 +:107340000100F8B51F4E041C30693C00EC2101001F +:107350000121F9F799FA1D49600040181038817B26 +:107360001B4A5172C07B10741A4F1B4D0E2C0AD150 +:1073700001220221082001F0F3FB0320FF2141310B +:107380003986142108E00222012108203C0028222D +:10739000010001F0E8FB1249022039861021A97191 +:1073A000E8711048114A00191038C07B002803D03A +:1073B00001215173107301E0002050730021201C43 +:1073C000FDF7E5FD3069F9F708FBF8BD00003C006A +:1073D00064220100407C0100764601000C80070019 +:1073E0003080070000800700FF0100005C570100AB +:1073F000D080070010B5154C144A217800201832AF +:1074000005291DD006291BD0072901D0082906D13E +:107410003C00A022010091680520102900DB062015 +:1074200020700120A178002861700BD00020FAF7AD +:10743000DCF800216078F4F73CFA0A221E211320C0 +:1074400001F07FF910BDD16907201029E8DB082081 +:10745000E6E73C00DC2201007C780100B0B50D1CA1 +:10746000011C041C44310020F6F740FA3034002D92 +:1074700007D00EC80EC408C8103808C4F4F7C4F901 +:10748000B0BD1ECC1EC0B0BDF8B5081C111CF4F771 +:1074900087FA084C3C00182301000025084E084FCD +:1074A00006E0306B002803D035632068EEF755F80E +:1074B00038680028F5D0F8BD00005C5B0100E4FEF0 +:1074C0000100845A010080B50006000E00F007F8A4 +:1074D00080BD80B50A1C3C0054230100232101F02B +:1074E0002BFA80BDB0B50D1C041C122803D301215A +:1074F0002320EEF79BFF0649A000085804E012C8BD +:10750000281CEEF72EF8201C0028F8D1B0BD000092 +:10751000685B0100F8B50E1C3C00902301000025BB +:10752000041C122803D301212320EEF782FF134805 +:10753000A700C45908E02068B04203D103212320EA +:10754000EEF777FF251C6468002CF4D10C4A043A4E +:107550001068002801D0416811603C00CC23010074 +:10756000002804D102212320EEF766FFF8BD002198 +:1075700041600660002D01D06860F7E70149C851FD +:10758000F4E70000685B010070B50E1C051C0024C8 +:10759000122803D301212320EEF74EFF3C000824DC +:1075A00001000D4BAA00985804E00168B14204D0D4 +:1075B000041C40680028F8D170BD0028FCD0002CC5 +:1075C000416801D1995000E061600021034A0160E7 +:1075D000043A11684160106070BD685B01003C00B6 +:1075E00044240100F3B581B0002817D00178FF29A9 +:1075F00014D04578441902348027013C2678013D97 +:10760000BE43301CF8F782FC012181400298014002 +:1076100002D03E43301C2070002DEED1FEBD000094 +:107620003C0080240100104B10B55968411A0F2905 +:107630000DDC0E22D243914209DB1A1C926800290C +:1076400001DD002A03DA00290DDA002A0BDC0433FD +:1076500003C3FDF710FD041CFDF713FD002802D045 +:10766000201C3C00BC240100FFF792FE10BD00006E +:1076700018630100F8B5644C071C6078A178884253 +:107680000FD1081CFDF7CEF8E060042060700A22DC +:107690001E21132001F070F800216078F4F724F91E +:1076A000F8BD04283C00F82401006ED1584EFDF7C7 +:1076B000BCF800907178041C0020052921D201A398 +:1076C0005B5C5B009F440B0F141A02005148514948 +:1076D000604341187D20C000EEF787F811E0872055 +:1076E00060434D4902E03C003425010045204D49EE +:1076F0006043401808E04C48CD2109016043401A1E +:1077000002E0462060438238060648480721007997 +:107710003616081A001900906846FEF75FFD381CFF +:10772000FDF72EFB0099424A3C00702501004900FC +:10773000515A48433949041C8878002801D001284F +:107740001ED13549002803D13A480578042002E0CB +:10775000384845780C203049C968491B0818009002 +:107760006846FEF73EFD009833493C00AC25010019 +:1077700040002031085A2A494443C868A84201D928 +:10778000012500E000252E4821184000EEF7A2F860 +:10779000041C002D03D0FDF7C3FA02E03DE0FDF725 +:1077A000F3FA002F02D125480E3801E03C00E8250D +:1077B000010023480A380168611ACB1C01DB032948 +:1077C00000DD04600168A14201D2013104E0A14260 +:1077D00003D9002901D0013901600168381CFDF787 +:1077E000C0FB104C0A2060700A221320A1683C00E4 +:1077F0002426010000F0D2FF606800F0F7FA0028AC +:1078000000D15FE700F0BAFB1149002340180E4990 +:1078100060601E39C856B042F3D00E70311C002093 +:10782000FFF784FE4EE7FFF715FE4BE77C7801007B +:107830003C006026010060D7FFFF608F0100540B01 +:107840000000C90900008EFEFFFF0C5A0100125A09 +:10785000010020A1070040420F0030B50C4BFE2470 +:107860001B880440C0075D076D0FDB08C00F9C42FA +:107870000BD83C009C260100A218043A9A4207D378 +:107880001A1B895C0122AA40114001D00221084341 +:1078900030BD0000FA60010080B5002803D0011C53 +:1078A0001420F5F7FFFA80BDB0B5041CF7F708FD0A +:1078B000134D00283C00D82601001DD1A00716D585 +:1078C00002208443114801222A624068002813D014 +:1078D000F2F751F900280FD10B48E430807A0128E3 +:1078E00000D00022111C0120F2F7A5F904E000F0FD +:1078F0004EFBE861F2F73C00142701006BF9A96A1E +:10790000002902D0201CEDF75CFEB0BD606C0100C8 +:10791000B05701002048B0B58168012904D1007832 +:10792000002801D1FDF772FD1B4D803D2C1C7034E9 +:1079300020780338052818D23C005027010001A305 +:107940001B5C5B009F44041527272700FBF7F1FF12 +:10795000607B011CFF3161730028F7D10420207087 +:10796000A889F8F7DAF9011C00220F2000F025FFA2 +:10797000B0BDEFF7CEFF6A21495B3C008C270100C8 +:1079800088420BD0E889F8F7CBF9011C00230022CC +:107990000F2000F0F7FF07202070B0BDFDF73AFE82 +:1079A000B0BD000084660100F0B585B0041C038002 +:1079B000180C60800D1C5178107809023C00C82713 +:1079C00001004840A080D178907809024840E080CA +:1079D0005179107909024840208168461A491422D9 +:1079E000EDF7E3FE00230020D907C90F8C464200C3 +:1079F0005607760F6146891949006E5C49193C00AB +:107A00000428010049786F4609024E4081007958E8 +:107A10000F4F4900615A01304E403106360A760058 +:107A2000C90D795AF61901277F02F6193688714077 +:107A3000A65A8919A1520528DCDB2089C018013318 +:107A40003C0040280100082B2081D2DB05B0F0BDAE +:107A50000000D8560100D8520100F0B5051C0C1CDE +:107A60001E1C002089B04100535A013006AF7B52E2 +:107A70000528F8DB108900AB3A498019588468461C +:107A800018223C007C280100EDF798FE0020410000 +:107A90000A195278635C6F46120253408200BA584A +:107AA00006AF5200BA5A314F013053401A061B0A32 +:107AB0005B00D20DBA5ADB1901277F02DB191B8844 +:107AC0005A4006AB3C00B82801005B5AD21806ABFE +:107AD0005A520628DEDB617B207B00AB090248405E +:107AE000598C48404108C0034840198B40181883FE +:107AF000E17BA07B09024840198B48404108C00344 +:107B00004840598B40183C00F4280100588302205B +:107B1000410006AA8A18203AD28B01305308D203BA +:107B20005A4006AB5B5AD21806AB5A520628EFDB16 +:107B3000300A28707004400E202108436870AE702F +:107B40006178207800AB09023C00302901004840F0 +:107B5000598C4840C005000EE8700020410006AA7C +:107B6000535A4A190130137106AB595A090A517117 +:107B70000628F3DB09B0F0BD0000EC560100D85236 +:107B80000100F0B54668051C60303C006C2901001E +:107B900085B0049060E068680C2107690020EEF76A +:107BA0002DFE7061018904390904090C0181706995 +:107BB000006840180421EEF721FEF0617069202171 +:107BC000046804980422407B800108433C00A829F3 +:107BD0000100E07028694089A07028694089000A86 +:107BE000207029690C31A018EDF79BFD2078202129 +:107BF0004006400E0843607028690A300188013150 +:107C00000904090C018004D128690C3001683C008A +:107C1000E4290100013101603562617920790902AE +:107C20004018A17909044018E17909064318009326 +:107C3000A0782178090240180404240C1020EEF7E3 +:107C400013FFB06128693A1C0168009B01A80A3241 +:107C50003C00202A0100FFF7C8FE2869231C0168A8 +:107C6000B06901AAFFF711FF3668002E9CD10349C5 +:107C700004486A68F7F763FB05B0F0BD0000FD6BD0 +:107C80000000A06A0100013807494000095C002992 +:107C900006D03C005C2A010004491C39085C00281D +:107CA00001D001207047002070470000E6780100F5 +:107CB000FEB5051C002002901348171C00680C1C20 +:107CC0008678301CFDF728FA002801D10298FEBD05 +:107CD000002D08D13C00982A0100206800AB1871E3 +:107CE00060685871A068987103203880291C301C86 +:107CF00001AA00F00EF8002DECD000AB197921603C +:107D0000597961609979A1600C213980E2E7F86BBB +:107D10000100F8B5151C3C00D42A0100421E0138B0 +:107D200047003F181F483E18002906D001240322AF +:107D3000311C281CEDF704FD32E06878012400288E +:107D400005D02978081801380E2800D90024002C05 +:107D500026D0002A07D12A213C00102B010012480E +:107D6000EDF79FFC1C211148EDF79BFC0F48032207 +:107D7000291C301CEDF7E7FC0C487178C05DB27827 +:107D800000290ED0002A0CD001224318084D06E02D +:107D90004100491910398A73B7783C004C2B010017 +:107DA0000130CF738342F6D8FEF760F8201CF8BD8F +:107DB000EB620100CA78010070B5051C1C48002365 +:107DC000C056431C32D1A87AF8F70CF900260028D7 +:107DD000184C08D0E869E16B00290BD13C00882BD6 +:107DE000010066630121E163A66306E0A869E16B17 +:107DF000002902D06663A663E663A16B0131A1632B +:107E0000820301D50E4A1043E26B002A00D04042A3 +:107E1000626B1018606308290BD1002801DD3C005B +:107E2000C42B0100012003E0002803DA0020C04336 +:107E3000EFF762FE6663A66370BD0000F46B01009D +:107E4000846A01000000FEFF0C21054A41438918A5 +:107E500080B58978002901D1F3F7F2FA80BD0000DE +:107E60003C00002C0100607B010080B5011C00205B +:107E7000F7F703FA80BD80B5011C0120F7F7FDF983 +:107E800080BD02498968401AC00F70470000000198 +:107E9000070002498968081AC017013070470001BD +:107EA00007003C003C2C010005494A6801231A43A5 +:107EB0004A608A681018886048689843486070472C +:107EC0000001070010B5154B00210A019A58002A3D +:107ED00017D101240A019C50D21810730023537348 +:107EE000022301283C00782C01000E4A05D1C8006D +:107EF0008018103002789A4304E0C80080181030CF +:107F000002781A43027002E001310829E0DB0829F7 +:107F100004D101219920EEF7FEFA03490804000C70 +:107F200010BDAC7301003C00B42C010000600700E0 +:107F3000FFFF0000F7B5194F194E0C1CC100C919FD +:107F4000B268103181B0013A4A600B781D1C0D22D5 +:107F500093430B70012282403A73124B0001039A43 +:107F6000C0188260104A101C3C00F02C0100203028 +:107F7000877900AB1F70C0795870B0680330002358 +:107F8000261A01D5041C01234C600D70002B04D06F +:107F9000201CFFF78AFF0028FAD000AB1888D08495 +:107FA000FFBD00600700000107003C002C2D010010 +:107FB000AC7301000010070030B50020C0430B4C2B +:107FC000094B0022D10009190D7CED0707D549693D +:107FD0009D68491B00D50021814200D2081C013256 +:107FE000082AEFDB30BD0000000107003C00682DCF +:107FF000010000600700B0B508280BD2084D04014D +:108000002959002904D000F04AF800202851B0BDB9 +:10801000022100E003219920EEF789FAB0BDAC738C +:108020000100034900014018417B082211433C0034 +:10803000A42D010041737047AC73010001488068B2 +:10804000704700000001070070B50B4E094D00227B +:10805000D0008419207CC00707D56069FFF726FF90 +:10806000002802D0A868323060610132082AEFDBB4 +:108070003C00E02D010070BD000000010700006021 +:108080000700024AC00080180174704700000060B9 +:1080900007000449C0004118087C0823021C9A43C9 +:1080A0000A74704700000060070070B5082817D2F6 +:1080B0000E493C001C2E01008A680E4D013AC10099 +:1080C00049194A610C4B9A7910310C780D26B4434A +:1080D0000C700121814029739A71094A07490001F6 +:1080E0008018416070BD05219920EEF729FA70BD16 +:1080F000000107003C00582E01000060070020101E +:108100000700D1750000AC730100F8B59E461A4B0C +:1081100094469B681A4CC2001219013B5361151C0E +:10812000184CA6792A1C103213780D27BB43137004 +:108130000127124B87403C00942E01001F73A6714B +:10814000124E0001801963464360734683601378C2 +:10815000407BA679012718433843143500AB1E70C5 +:10816000E4795C70064B9B680333CC1A00D5191C6C +:108170002960107000AB18883C00D02E0100034C21 +:10818000203CE084F8BD00010700006007002010DB +:108190000700AC73010000B5011CFFF75EFF421839 +:1081A000101CFFF792FE0028FAD000BD0000891ACB +:1081B000401A9918884201D801203C000C2F010078 +:1081C0007047002070470000F8B50F1C041C002801 +:1081D00001D1EEF7EFF9211C0120FFF719FA412038 +:1081E000005D002801D1002504E0022801D1052509 +:1081F00000E00125E068EEF729FBA66B3C00482F64 +:108200000100002E10D0002F06D02F20025D206A22 +:10821000416B281CEDF744FAA069002801D0EEF765 +:1082200046FC206AEEF743FC201CEEF740FC301CB5 +:10823000F8BDB0B5041CC06B002809D020693C0013 +:10824000842F0100008BEEF755F9002803D0211C84 +:108250000620FFF7E3F9084D201CA96DFFF7BAFFD0 +:10826000002807D0E8680130E860286A01382862F1 +:10827000FCF778F8B0BD0000C469010010B5064CE9 +:108280003C00C02F0100E16DFFF7A7FF002804D0DC +:10829000E0690138E061FCF768F810BD0000C469CE +:1082A00001000C230C495843401810B54468A168DC +:1082B000002902D0201CEDF7F3F9E06B002808D06C +:1082C00020693C00FC2F0100008BEEF719F9002813 +:1082D00002D0201CF9F726F910BD0000607B0100D8 +:1082E000F8B522494868800006D40120400708609C +:1082F0004A69920000D448601D4F787EC306012071 +:10830000021CDB0E3C00383001009A400A6079699B +:108310008C688C602107890F09D0210704D50B21B7 +:108320009E20EEF728F900E078640C208443124880 +:108330003D68065D6C682C3406E0A0680068A060AB +:10834000E968281CEDF73C0074300100B2F9013EE9 +:10835000F6D2A068806800280DD0408900280AD095 +:10836000786C002807D178698068800703D10C21D8 +:108370009E20EEF703F9F8BD00100700CC6D010058 +:10838000B4440100094980B53C00B0300100087ECA +:10839000C206D20E01209040074A106000200A69F0 +:1083A000C04390600868243106C90369EDF786F977 +:1083B00080BDCC6D010000100700F8B54468061CB4 +:1083C0002C3420680D1C806800903C00EC300100CB +:1083D000002800D0C5602068006820604068002840 +:1083E00003D00A219E20EEF7CFF820684560281CB4 +:1083F00002E000224260081CC1680029F9D17168BE +:1084000060270B1C40339C469B78CA7E3C00283179 +:1084100001005B011207120F3B401A438B8FFF27AD +:108420003F041B043B401A4390231A4342606346B7 +:108430009A780132D207D20F9A70896BC160216895 +:1084400088600098002801D00098C5600A4F3C0061 +:1084500064310100BD79A06900280CD00022A2611E +:1084600074686069EFF72EFFE06A616940684860F0 +:10847000616901200860BD71F8BD0000201007008F +:10848000FEB544680F1C01942C34201C123002905D +:108490003C00A03101002CE00C20EEF700FB051C95 +:1084A000606800281DD10298002100900020EEF79E +:1084B0000EFA061C00980421EEF709FA011C019837 +:1084C000C07E0007000FD03070600198C07E0007AA +:1084D000000F3C00DC310100F0304860301CEEF74A +:1084E00019F96560E66001E0206805606068286051 +:1084F000256000206860A860381CFF300006000E70 +:10850000391C071C0029CAD16068A060FEBD0000AC +:10851000FFB5051C3C0018320100081C002681B084 +:10852000F4F72FFE041C02D06068FF2801D1062654 +:1085300028E0211C20310A78012A01D1032621E0FC +:10854000012725600F7011C51D48083D686103981B +:108550006A46E86004983C005432010028611A48D9 +:10856000A8611A48E8611A4828621A486862207EA1 +:10857000A168EDF7B3FE002806D1607EE1686A4687 +:10858000EDF7ACFE002807D00426311C9E20EEF744 +:108590000DF8301C05B0F0BD3C00903201006A4679 +:1085A0000F491D20EDF79DFE01210D48490701608F +:1085B000227E3B1CD206D20E93404360627ED206DE +:1085C000D20E974047604160E6E731330100D9326F +:1085D000010091310100DD3001003C00CC3201008E +:1085E000FD320100713301000010070042682C3297 +:1085F000506843680B6081684B890B818368002158 +:10860000D9604160816000685060002070470000C0 +:1086100070B54268FF269187106B0C043C0008334C +:108620000100051C3604344043685968B1432143B6 +:1086300059600068A842F7D1106B516940684860E2 +:1086400051690120086070BD0000B0B54368081C86 +:1086500059629A6200250AE04581C4682A1C3C00E0 +:1086600044330100002C03D19A7E1207120F1032FE +:108670004260201C0028F2D118694160196901206C +:10868000086002480068EDF737F8B0BD5C5B010098 +:1086900001200549400780B58860044801680D2025 +:1086A0003C0080330100FEF7E6FF80BD00000010B3 +:1086B0000700C4600100F8B50E4F0C4E002448209E +:1086C0006043C5194821281CEDF77BF81C20604346 +:1086D0008119281D1C22EDF7FEF81C23E8560549D8 +:1086E000FBF73C00BC330100CDF80134012CE9D389 +:1086F000F8BD0000B8440100CC6D01001532010046 +:10870000FFB5051C0A30061C81B0F2F7DDF8184FE2 +:10871000041C3988EFF7BCFC3288786802807288C4 +:10872000023002803C00F8330100B188124E4180D3 +:10873000288808364005002805DA6988039A201C35 +:10874000F7F701FD00E000207080F8F75EFC0121E2 +:1087500009030028308801D0884300E008433080B6 +:108760000548002200213C00343401001430EFF7AA +:1087700065FC201CF9F774F805B0F0BDB07A010073 +:1087800010B50E4C6068F8F795F92068006A00286B +:1087900013D1F8F7BFFC002808D021680120086237 +:1087A0001F210022832000F03C00703401009FF95B +:1087B00002E06068F8F721FAFFF797FC216808618A +:1087C00010BD147A0100FEB51B4E0F1C1D1C141C9D +:1087D000B060081CF7F72BFFB08034733562381C8B +:1087E00001AA02A9F7F725FF00AB3C00AC34010059 +:1087F000187A012818D118790B2808D1307F242342 +:108800000F49584340188068ECF788FFFEBD00AB65 +:1088100018790A2808D1F7F739FD071C291C201CF4 +:10882000F7F716FD3818B080307F24233C00E83479 +:1088300001000449584340184068ECF772FFE8E72C +:108840000000D479010094460100B0B5FFF753FC55 +:10885000041CFBF7FCFA0C4D29680969091B0C1A6A +:1088600002211F2000F08BF8142C06DD02223C00B0 +:1088700024350100211C1F2000F050F80120B0BD5C +:1088800029680120896A0029F9D00020B0BD0000C4 +:10889000147A0100F8B51A4D071CAE790121194C64 +:1088A00000202268002A14D1AE71A268D06806CADE +:1088B0003C0060350100ECF73CFFAE790021134A23 +:1088C000506901305061A0688068A0606268904281 +:1088D00006D10120206003E001300C340328E3DBE3 +:1088E000002F08D100290AD00A484068002806D085 +:1088F000FAF73C009C350100F5FF03E0012F03D09F +:10890000002901D1AE71CEE7AE71F8BD201007008D +:1089100018D90100A8600100705D010080B5012335 +:10892000F5F77CF880BD000080B50023F5F776F8F8 +:1089300080BD00003C00D8350100F8B5134B002481 +:108940001B8898421BD2114BC000C01845680668AE +:108950002868002817D10E4FA8684368B34209D190 +:10896000C3688B4206D10368934201D0531C01D1E6 +:108970000124476080683C00143601006B68834224 +:10898000EED103E001218020EDF740FE201CF8BD70 +:1089900056570100845D010029E30000F8B5174F28 +:1089A0000A1CBE79164D00236C6807E021689142CD +:1089B00002D12179814204D03C0050360100231CB1 +:1089C000E468002CF5D117E0002C15D0002B0DD158 +:1089D000E3680D486B600088002B02D1FFF7D1FBE4 +:1089E00006E00A4A9968FFF7F6FB01E0E068D86004 +:1089F0002868E0602C6002E001213C008C36010018 +:108A0000FFF7A4FFBE71F8BD201007007C5D0100D8 +:108A10002C7401002138010070B5094EB579F9F7C1 +:108A2000AFFE041C09D0201CEDF70CFB05498A6839 +:108A300080188860086801300860B5713C00C8364D +:108A40000100201C70BD20100700A860010009482B +:108A500080B54068021C0BE00169002907D0824202 +:108A600004D0816805480088FFF7E5FA80BDC0683A +:108A70000028F1D180BD7C5D01002C7401003C0018 +:108A800004370100054880B54268002A04D0044834 +:108A900000889168FFF7D2FA80BD00007C5D01007C +:108AA0002C74010005480168002904D0C068002822 +:108AB00001D00120704700207047000018D9010044 +:108AC0003C004037010080B5F6F7D1FA80BD131C99 +:108AD0000D4AB0B5128890420FD203290DD20A4A2E +:108AE000C00014580A4DAC4207D113500C2359430F +:108AF000084BC91880184160B0BD02218020EDF7F5 +:108B000094FD3C007C370100B0BD000056570100C9 +:108B1000845D010009A0000018D90100F8B50F1C00 +:108B20001E1C151C041C111CFFF74AFF331C2A1CB9 +:108B3000391C201CF4F78AFFF8BD0000F7B59446F5 +:108B4000FF2921D03C00B837010015480088814238 +:108B500021D2144A154EC8008518B4796868026895 +:108B6000002A03D1031D0CCB9A4211D043689A68A6 +:108B700042600E4A176901371761B4710022026022 +:108B80000098D86060463C00F43701001860197402 +:108B900028685860FEBDB471062100E007218020DE +:108BA000EDF74CFDF6E7000056570100845D01002B +:108BB00020100700A8600100B0B5144D6C68002CAF +:108BC00001D0844204D00C213C00303801008020C8 +:108BD000EDF737FDB0BDFFF7B8FAA168401A0D49AF +:108BE000884203DA10218020EDF72BFD21792268DD +:108BF0000120FFF7ACFFE3686B60002B05D007484E +:108C0000064A00889968FFF7FEFA3C006C380100BC +:108C10002868E0602C60B0BD7C5D010018FCFFFF9F +:108C2000213801002C740100B0B5154C0820211C1E +:108C300080310870134A4104116013480068134DD5 +:108C40006B69184001D1102000E000203C00A838DA +:108C50000100A8235B5D1843231C40331873516047 +:108C600020788008800020700020FFF712FBFFF7BB +:108C700072FA643028660138A06120780321084325 +:108C80002070B0BD000000900700001007003C00FD +:108C9000E438010010000700A46C010038B50A4C4C +:108CA000211C20318A7900AB1A70C979074D59709F +:108CB0006978884203D1F8F713FCFF20687000AB95 +:108CC0001888E08438BD0000001007004C7B0100CC +:108CD0003C0020390100F8B50B1C061C041D7F3335 +:108CE00014D033685D18356023881F180623FF569B +:108CF000EB1B336023881818817120880130000431 +:108D0000000C2080904201D300202080101C31688C +:108D1000ECF73C005C3901006DFEF8BD0E490A7CA1 +:108D200083781A430A74427883789A430B7C93437E +:108D30000B748A7C43781A438A748A7C03789A433A +:108D40008A74027843781A434B7C1A434A744A7CEB +:108D5000C07882433C00983901004A747047100083 +:108D60000700B0B5064D00242006000EEDF7F7F819 +:108D7000A100695808710134042CF5DBB0BD107BEB +:108D800001000B480C497D234269DB00002AC86BB7 +:108D900007D0C0181A013C00D43901009042C863C2 +:108DA00001D90748C8637047FF38F538C86398424F +:108DB000F9D2CB6370470000F4680100447D0100E4 +:108DC0007017000070B50D1C041C161CFBF7F6FA9A +:108DD000B0432843011C201C3C00103A010000F065 +:108DE000CCFA70BD000080B50B4A002909D00229D9 +:108DF0000FD1011C0848D2783830FFF778FF0649B8 +:108E000006E0011C044812792030FFF770FF034987 +:108E1000086080BD0000AC7C01003C004C3A0100C1 +:108E2000C8670100C467010080B50B4A002909D05A +:108E300002290FD1011C084852796830FFF75AFF08 +:108E4000064906E0011C044892795030FFF752FFB2 +:108E50000349086080BD0000AC7C01003C00883AFA +:108E60000100D0670100CC67010008B50421009122 +:108E7000817E4368032906D1011C0C3101206A461A +:108E8000ECF79AFC08BD1968C160FBE7000010B55B +:108E9000031C0020084C0021CA00121992783C00E3 +:108EA000C43A01009A4203D1C8000019406810BDBD +:108EB0000131090609160629F1DB10BDCC5A010063 +:108EC000F8B50F1C161C0025FEF78EF9041C0AD0FD +:108ED0004A20005D052806D1381CF1F781FE0028E4 +:108EE0003C00003B010001D001253460281CF8BD86 +:108EF000000070B50D1C161C0024FEF778F9002840 +:108F00000BD04A21095C052907D10169002904D148 +:108F10003060F1F704FD01242860201C70BDF8B515 +:108F2000061C3C003C3B010000250C1C081CF1F712 +:108F30005DFE002801D0002105E0201CF1F774FE41 +:108F4000002814D00121301CF4F780FB0090002889 +:108F50000DD0084F01250622311C381CECF7C2FC4D +:108F60000622211C3C00783B0100B818ECF7BDFC40 +:108F70000098F860281CF8BD0000707C01000021FA +:108F8000002806D04278072A03D1C079012800D1F1 +:108F90000121081C7047F8B5051C0027164EF1F793 +:108FA00028FE002807D03C00B43B0100F1F7C0FBCD +:108FB000002810D10024F1F7BBFC06E0F1F702FE17 +:108FC000002808D00124F1F799FD011C0622301C6D +:108FD000ECF78EFC0127002F0DD0211C281CF4F784 +:108FE0003BFB011C054806223C00F03B0100063813 +:108FF000C160291CECF77FFC0120F8BD0020FCE7D4 +:109000000000767C0100F0B5071C006802210468AE +:10901000786987B00140002500290591744E12D06F +:1090200022880121130502D4C0073C002C3C01001A +:10903000C11701316F480029006801D0013004E0F8 +:109040001106890E2D2901D1033030602088800758 +:1090500067D17869C00764D503AA04A9201CF7F773 +:109060004BFB00AB187C002807D0187C3C00683C08 +:109070000100022858D1187B4007400F042853D81C +:1090800020790599C007C01701300290002902D14C +:109090000298002848D10599002904D020880005AD +:1090A00001D400203060C020EDF7CBFD051C3C0052 +:1090B000A43C0100201C0A300690FEF7ADF8061C07 +:1090C000281C08302388021D111DDB0506D5069BD0 +:1090D0000360201C10301060201D0EE0231D136063 +:1090E0002288920505D5221C10320260069B0B6077 +:1090F0003C00E03C010004E0069B0360201C1030B3 +:1091000008602869F1F743FC002808D0012812D034 +:10911000022858D100AB187C002854D112E000ABD3 +:10912000187C02280BD1002E4DD04B20805D0228E8 +:1091300049D13C001C3D010007E063E000AB187C16 +:10914000002802D1381CFEF71BFF2088410430485C +:1091500011D5002E52D000AB197C002926D00299DF +:10916000002902D0B06A007800E0007801281DD004 +:10917000032843D13C00583D01001AE000AB197CA4 +:10918000022916D1197B042913D0197B0C2910D080 +:109190002249096800290CD0002E0AD00299002922 +:1091A00002D0B06A007800E00078012829D00328B6 +:1091B00027D02822391C3C00943D0100281C88300F +:1091C000ECF70AFC00AB197C281C80300171197B7C +:1091D00041716C606E611BE00599002914D0114843 +:1091E000846C002C10D00022002E04D04036B07ABF +:1091F000052800D1012200923C00D03D0100F87A00 +:10920000BA7A2969C307DB0F0698ECF700FB281C24 +:10921000EDF707FD0025281C07B0F0BD0000C46A6B +:1092200001006861010028610100C469010080B586 +:109230000220FFF770F880BD00003C000C3E0100EA +:10924000B0B51D4D012817D0A22806D0A32803D100 +:1092500001211520FFF708FCB0BD002901D11748F6 +:1092600002E07D20C000484300230122011C286049 +:109270001520FFF7A7FCB0BD012904D03C00483EF3 +:1092800001000229FAD100F02AF8B0BD6C68F5F7A8 +:10929000DEFCFEF7A8FF6860002C09D029680A23CD +:1092A0005943001B884203D901211520EDF717FA15 +:1092B000012215202968FFF7A6FBB0BD00003C0085 +:1092C000843E0100047901000087930301200449D2 +:1092D000400380B5086003211520EDF703FA80BD37 +:1092E00000100700074880B5BE210173017A1022E3 +:1092F000114301720023022215200349FFF768FC85 +:109300003C00C03E010080BD000000030700809FBC +:10931000D50080B5002803D00A1C1521A22002E048 +:1093200000221521A320FFF766FC80BD000010B5C8 +:1093300000F019F80A48BE210173037A1022934302 +:1093400001243C00FC3E0100234303720173017AB7 +:109350009143202211430172022215200249FFF796 +:109360005BFB10BD00030700809FD50080B5022184 +:109370001520FFF785FB0448BE210173017A1122F5 +:10938000914301723C00383F010080BD00000003A2 +:109390000700F8B5061C051C60360027446822E06B +:1093A00008210020EDF741FB6061018904390904BF +:1093B000090C01816069006840180421EDF735FB54 +:1093C000E0616069717B3C00743F010000688901C5 +:1093D000C17029690C310322ECF7BAFA28690C3004 +:1093E0000168013101602562A7612468002CDAD18F +:1093F000024903486A68F6F7B3F8F8BDFD6B000050 +:10940000A06A010080B500073C00B03F01000009E0 +:109410000902090A084302490860FFF720FF80BDDE +:1094200000006000070008001400C8000000E80306 +:10943000000010001400C8000000E80300001C0039 +:109440001400C8000000E80300003C00EC3F0100ED +:109450002401070032000000E8030000400601007C +:109460000600000007000000416E62697E64616FC3 +:109470006F00000052656C6561736520365F375F71 +:109480003135204275696C6420323A353C00284001 +:1094900001003239382053657020303420323030AA +:1094A000392031373A31333A3230202848573D3469 +:1094B0003A332C4254434F455829000000003200F3 +:1094C0001C00102030405060FFFFFFFFFFFF3C00FA +:1094D00064400100000000000100000001000000E5 +:1094E00000000000E8037000000000000100000020 +:1094F0000000000002000000D0073800000000005B +:109500000100000001000000040000007C151500AF +:109510003C00A0400100000000000100000001002C +:1095200000000B00000070171E0001000000010089 +:109530000000000000000C000000282316000100BD +:109540000000010000000000000012000000F82AE6 +:109550000B003C00DC4001000000000001000000A6 +:109560000100000016000000E02E120001000000C3 +:1095700001000000000000001800000050460E002E +:1095800001000000010000000000000024000000B5 +:10959000F05508003C0018410100010000000000E7 +:1095A0000000010000002C000000C05D0E00010062 +:1095B0000000010000000000000030000000E88012 +:1095C0000400010000000000000001000000420053 +:1095D0000000A08C0A003C00544101000100000082 +:1095E00001000000000000004800000080BB0A00ED +:1095F0000100000001000000000000006000000009 +:10960000F0D20A000100000001000000000000008C +:109610006C000000C00090003C0090410100C000C0 +:109620009000C00090001400100014001000C00052 +:1096300090001400100014001000C00090001400EE +:109640001000C0009000140010001400100014005E +:109650001000C0009000600048003C00CC410100B8 +:109660006000480014001000140010006000480062 +:1096700014001000140010006000480014001000D6 +:1096800060004800140010001400100014001000C6 +:10969000020004010B020C03120416053C000842F0 +:1096A00001001806000E000E2407000E2C083009D9 +:1096B000000E000E000E420A000E480B000E000EB7 +:1096C000000E000E000E600C000E000E6C0D00006F +:1096D00000000000000000000080C0FFFFFF3C0011 +:1096E00044420100B6FFFFFFD3FFFFFFC9FFFFFFAA +:1096F000FFFFFF7F000000000000000000000000EE +:1097000000000000000000000000000051B0000058 +:109710000C00000051B000000C00000059AF000028 +:109720003C008042010000000000A5AF00000000E6 +:1097300000004DAF00000600000000000000000027 +:10974000000045B00000060000000000000000001E +:109750000000D5AF000000000000ADB00000000028 +:1097600000003C00BC42010095DB0000000000004E +:1097700095DB00000000000099B000000C00000024 +:1097800000000000000000000000000000000000D9 +:1097900000000000000000000000000000000000C9 +:1097A000000000003C00F8420100000000002D17FE +:1097B00001003517010021170100D99C000049174D +:1097C00001003D170100D19C0000D19C00001D1A32 +:1097D0000100D19C0000011A0100311A0100251A74 +:1097E00001003D1701003C0034430100811A0100D3 +:1097F000D19C000079170100D99C00005D17010081 +:10980000A11701009517010081170100211801001F +:10981000F5170100000008000C000000100008000F +:1098200008000000010000003C007043010002003D +:109830000000040000000800000010000000191CD7 +:1098400001008941000089410000854100008541F7 +:1098500000008541000085410000894100008541EC +:10986000000085410000351B01003C00AC430100B5 +:109870009D1B0100011C010089410000894100007D +:109880008941000085410000651801002918010088 +:1098900039180100BD180100894100004D18010070 +:1098A000A518010085410000011901003C00E843B2 +:1098B0000100D9180100ED180100151901008941B6 +:1098C0000000894100008941000085410000894174 +:1098D000000089410000691C010089410000711CE1 +:1098E00001008941000089410000FDDB00003C00CF +:1098F000244401001D7C000000008000F5DA000017 +:1099000014008100FDDD000008008200C5DD0000BC +:109910003800830045DC00001000840099DC000062 +:109920000C00860039DC00001000880011DE000009 +:109930003C006044010010008A0035DD00000C008E +:109940008C00ADDF00001C008E00C9DE0000380076 +:109950008F00EDDC00003800900075DF00000C0087 +:1099600091008DDC00000C009300B9DD00000C00BC +:1099700094003C009C44010000080808100C0C0CEA +:10998000080C080C080C0808080814080814003013 +:109990000001010200000000AD300100153001009F +:1099A00020300700303007000607020300000000E7 +:1099B000000000003C00D8440100FFFFFF00FFFF53 +:1099C000FF00FFFFFF000000000080C90200943F7D +:1099D0000300E08B5A00053A8500C8F20600F84CF7 +:1099E000560020A73D00B74A0000B74A000000001B +:1099F0000000000000003C001445010001010102CC +:109A00000202030303040404050600002D7C000089 +:109A10000000FF00FD9500000800FF00ED9700002A +:109A200008008200CD9500000C0083004D960000D8 +:109A30000C0085002D7C00003C005045010000001A +:109A4000FF002D7C00000000FF002D7C00000000C6 +:109A5000FF003D9600000C008900D9970000080027 +:109A60008A00919500000800FF002D7C0000000096 +:109A7000FF002D7C00000000FF003C008C45010031 +:109A8000F997000008008D002D7C00000000FF0009 +:109A90002D7C00000000FF00C997000030009000FE +:109AA0001195000018009100159600000800920022 +:109AB000599500003C009300299600003C00C845E1 +:109AC000010008009400A19500000800950081970E +:109AD00000000C0096006D97000010009800000038 +:109AE00000000000FF00000000000000FF00000870 +:109AF00008080808000000100800000800103C00DA +:109B000004460100080C0C0C0C1C0C0C0800000096 +:109B10000D8B0000F58A0000E98A0000018B00002F +:109B200014080C0C100C0000B1980000800000001C +:109B300019990000810000003D7C000080000000B9 +:109B40003C00404601003D99000082000000099958 +:109B50000000830000003D7C000085000000000044 +:109B6000000000000102020104040808813780F3AC +:109B7000AAAA03000000AAAA030000F86DA96DA913 +:109B80006EA93C007C4601006EA86EA86EA86FA767 +:109B90006FA76FA76FA66FA670A670A570A4000030 +:109BA000B51B0100C91B0100E11B0100E59C000081 +:109BB000A51B0100E59C0000891B0100D59C00004D +:109BC000D59C00003C00B8460100D11A0100E51AFE +:109BD0000100051B0100251B0100B11A0100E59CD5 +:109BE00000009D1A0100D59C0000C11A01008919CE +:109BF0000100A9190100C9190100F1190100791921 +:109C00000100E59C00003C00F446010065190100DC +:109C1000D59C0000D59C0000D59C0000D59C000080 +:109C2000D59C0000D59C0000D59C0000551C01006F +:109C3000451C0100451C0100D59C0000D59C00007E +:109C4000D59C0000D59C00003C0030470100D59C0D +:109C5000000055190100E59C00004119010031196F +:109C60000100D59C000002050A00000002040A0061 +:109C70000000C5200000212100002521000039211D +:109C8000000049210000552100003C006C47010004 +:109C900061210000ED2100000D22000021220000C2 +:109CA0003D22000049220000C5220000E122000000 +:109CB000F5220000E91F0000E91F0000E91F000075 +:109CC000E91F0000E91F0000112300003C00A84725 +:109CD00001001D23000089230000A5230000B923F3 +:109CE0000000112000001D2000006D2000008D20CC +:109CF0000000B92000000001020303050606080960 +:109D000008090909C480CA8080808080D0803C0016 +:109D1000E4470100D6D9DCDFE2808080E5E880807E +:109D20008080EBEEF1F4F7FAFD0001000200030081 +:109D30000400050006000700080009000A000B00E7 +:109D40000C000E00100011001300160018001B007C +:109D50003C00204801001E00220026002B0030009D +:109D600036003C0044004C0055005F006B0078005A +:109D700086009700A900BE00D500EF00FF7F0C0011 +:109D8000060002000000FEFFFCFFFBFFFAFFF9FFE8 +:109D9000F8FF3C005C480100F7FFF6FFF5FFF4FF19 +:109DA000F3FFF2FFF1FFF0FFEFFFEEFFEDFFECFF3F +:109DB000EBFFEAFFE9FFE8FFE7FFE6FFE5FFE4FF6F +:109DC000E3FFE2FFE1FFE0FFDFFFDEFFDDFFDCFF9F +:109DD000DCFF00003C00984801000000000000008B +:109DE0000000B17C4100115A40E2B27C4100055AAA +:109DF00040E2AF7C4100F95940E2B07C4100ED59AE +:109E000040E2246701000E0000E35C6701000E00E1 +:109E100000E30A6101003C00D4480100010000E3B6 +:109E20000E610100010000E3326701000E0000E353 +:109E30006A6701000E0000E30B610100010000E30E +:109E40000F610100010000E3406701000E0000E324 +:109E5000786701000E0000E33C00104901000C612E +:109E60000100010000E310610100010000E34E6702 +:109E700001000E0000E3866701000E0000E30D61A3 +:109E80000100010000E311610100010000E3C0488E +:109E900001000400000AE04801003C004C490100B8 +:109EA0000400000A004901000400000A20490100E2 +:109EB0000400000A18670100040000E2287501018F +:109EC0007DA940E22C750100040000E2207501002C +:109ED000040000E244750100040000E23C008849EF +:109EE0000100F0590100040000E200000000000041 +:109EF00000000000000000000000247501000400C4 +:109F000000E2B87C0100040000E28DA9000001001D +:109F100000DA1D750100010000E2C46701003C0089 +:109F2000C4490100040000E200000000000000003D +:109F3000215900000E0000D9C8670100040000E2AA +:109F4000CC670100040000E2D0670100040000E2D9 +:109F500065D90000040000DAA5D90000040000DA89 +:109F60003C00004A010001590000010000DA32679C +:109F700001000E0000E36A6701000E0000E31159C2 +:109F80000000010000DA0000000000000000B048FE +:109F900001000200000AA04801000200000A404936 +:109FA00001003C003C4A01000500000A684901002C +:109FB0000900000A6C570100040000E2386101004A +:109FC000040000E20000000000000000AC6E010090 +:109FD000040000E2B06E0100040000E270570100CE +:109FE000040000E23C00784A0100E8590100080042 +:109FF00000E3DC5801144DFD40E32C59011439FDF8 +:10A0000040E3C05801000E0000E300000000000023 +:10A0100000000000000000000000647341003D2EBD +:10A0200044E27C5901143C00B44A01009D2F44E3F2 +:10A030005C5701000E0000E2792E0400010000DBF5 +:10A04000A0580100020000E3A2580100020000E352 +:10A05000A05701000E0000E3D1880100010000DAE2 +:10A060001D890100040000DA3C00F04A01009588D7 +:10A070000100040000DB312F04000E0000D9C52EC2 +:10A0800004000E0000D9686C010115D540E2C057EC +:10A090000100080000E3C8570100340000E39C6C95 +:10A0A0000100080000E3B05801033C002C4B010004 +:10A0B000E9D440E2BC580100040000E29DA3000086 +:10A0C000600000D970790100040000E27879010095 +:10A0D000040000E27C5A0100040000E25D1C000064 +:10A0E000110000D9246E0100040000E23C00684B1E +:10A0F000010018580105D5D540E3FC5701001400B4 +:10A1000000E3048E0103E5D540E3005B0100040099 +:10A1100000E2185B0100400000E2D4670100040087 +:10A1200000E28D370000040000DBBD3600003C007B +:10A13000A44B0100040000DBFC600100020000E20F +:10A14000907D0100040000E270690100040000E25B +:10A150000000000000000000B04901001A00000AE1 +:10A16000904B01000600000AA458810005FD40E361 +:10A170003C00E04B0100804A01000C00000A0C5A30 +:10A180008101252D44E3E04A01000300000A186321 +:10A190004100FDBB40E208570100010000E29C487D +:10A1A0000100040000E20000000000000000F84A86 +:10A1B00001003C001C4C01000200000ACC740100AC +:10A1C000030000E365734100A92E44E2F659010142 +:10A1D000D12C44E3084B01000400000A07000000F2 +:10A1E0000100006A284B01000200000A887D01007E +:10A1F000040000E23C00584C010000750104656F4A +:10A2000040E3BC7801000E0000E3384B010004007D +:10A21000000A0457010004000062584B01000200CC +:10A22000000A804B01000200000A684B0100030095 +:10A23000000A8C7D01003C00944C0100040000E207 +:10A24000392D0400040000DB947D0100040000E2CD +:10A2500000000000000000000000000000000000FE +:10A260000000000000000000104001000000006439 +:10A27000A84C01000400000A3C00D04C0100000082 +:10A28000000000000000C84C01000100000AD04C92 +:10A2900001000200000A0000000000000000E77A50 +:10A2A0000100010000E2E87A0100010000E2000084 +:10A2B000000000000000ED7A01003C000C4D0100A0 +:10A2C000010000E2EE7A0100010000E2000000005F +:10A2D00000000000F37A0100010000E2F47A0100BE +:10A2E000010000E20000000000000000F97A010017 +:10A2F000010000E2FA7A0100010000E23C00484D52 +:10A300000100E84C01000300000A004D01000300B9 +:10A31000000A184D01000300000A304D010003003F +:10A32000000A905C0100040000E2945C010004005B +:10A3300000E2985C0100040000E29C5C01003C002B +:10A34000844D0100040000E2A05C0100040000E272 +:10A35000A45C0100040000E2A85C0100040000E22B +:10A36000AC5C0100040000E2B05C0100040000E20B +:10A37000B45C0100040000E2B85C0100040000E2EB +:10A380003C00C04D0100BC5C0100040000E2C05C68 +:10A390000100040000E2C45C0100040000E2905CE3 +:10A3A0000100380000E3684D01000E00000AD84D9E +:10A3B0000100020000FA1261810131D540E306611B +:10A3C00001003C00FC4D0100020000E20B610100B5 +:10A3D000010000E30F610100010000E308610100DA +:10A3E000020000E2507B0100040000E200000000D7 +:10A3F00000000000384E01000E0000649C5701016F +:10A40000918841E33C00384E01006E41676FE26580 +:10A4100060696F20414200000000F04D010009001A +:10A42000000A484E01000100000AE84D0100010049 +:10A43000000A0000000000000000484D0100040078 +:10A44000000A286101013C00744E0100BDD540E2C4 +:10A450006961410085D540E230610100040000E2FD +:10A4600034610100040000E23C610100040000E2EC +:10A4700034610100040000E244610100040000E2D4 +:10A48000000000000400006A3C00B04E0100704E65 +:10A4900001000800000A18610100020000E21C61CE +:10A4A0000100040000E220610100020000E22461DA +:10A4B0000100040000E2B84E01000200000AC84E8C +:10A4C00001000200000AD84E01003C00EC4E0100E1 +:10A4D0000200000A96480100060000E3E062010065 +:10A4E000040000E2000000000400006A9B7D0100FF +:10A4F000010000629C7D010002000062607C01009E +:10A50000040000E2010000000400006A3C00284F43 +:10A5100001002D6301000100006200000000000046 +:10A520000000000000000000000049D500000E00FF +:10A5300000D9F467010002000062467D01000100BD +:10A5400000629C7C0100040000E2987C01003C0059 +:10A55000644F010002000062A07C0100060000625E +:10A56000587C010002000062647C01000600006269 +:10A570005A7C0100020000626A7C01000600006251 +:10A58000010000000400006AE4620100040000E22F +:10A590003C00A04F0100E8620100030000E200005F +:10A5A00000000400006A000000000400006A0100CE +:10A5B00000000400006A000000000400006A0000BF +:10A5C00000000400006A000000000400006A0000AF +:10A5D00000003C00DC4F01000400006A00000000A5 +:10A5E0000400006A000000000400006A000000008F +:10A5F0000400006A000000000400006A000000007F +:10A600000400006A000000000400006A000000006E +:10A610000400006A3C001850010000000000040023 +:10A62000006A000000000400006A0000000004004E +:10A63000006A000000000400006A0000000004003E +:10A64000006AF04E01002A00000A01000000040028 +:10A65000006A752A01003C00545001000C0000DB28 +:10A66000020000000400006A752A01000C0000DBF3 +:10A67000030000000400006A752A01000C0000DBE2 +:10A68000040000000400006A752A01000C0000DBD1 +:10A69000050000000400006A3C0090500100752A8B +:10A6A00001000C0000DB060000000400006A752AAF +:10A6B00001000C0000DB070000000400006A752A9E +:10A6C00001000C0000DB080000000400006A752A8D +:10A6D00001000C0000DB090000003C00CC50010030 +:10A6E0000400006A752A01000C0000DB0A0000006B +:10A6F0000400006A752A01000C0000DB0B0000005A +:10A700000400006A752A01000C0000DB0C00000048 +:10A710000400006A752A01000C0000DB3C000851AF +:10A7200001000D0000000400006A752A01000C0001 +:10A7300000DB0E0000000400006A752A01000C0016 +:10A7400000DB485001000200000A585001000200DE +:10A75000000A685001000200000A785001003C0025 +:10A76000445101000200000A885001000200000A62 +:10A77000985001000200000AA85001000200000ADF +:10A78000B85001000200000AC85001000200000A8F +:10A79000D85001000200000AE85001000200000A3F +:10A7A0003C0080510100F85001000200000A0851ED +:10A7B00001000200000A185101000200000A405086 +:10A7C00001000100000AE84E01000100000A00003B +:10A7D0000000000000000000000000000000B04E7B +:10A7E00001003C00BC5101000100000A0000000013 +:10A7F00000000000285101000E00000A00000000C7 +:10A800000000000000000000000000000000000048 +:10A810000000000000000000000000000000000038 +:10A82000000000003C00F8510100985101000C00AC +:10A83000000A504E01000400000AE04C0100010033 +:10A84000000A0000000000000000C04B01001D00D5 +:10A85000000AF85101000500000A248007000000EA +:10A8600000001D8007003C00345201000800000079 +:10A870002A8007005C00000024800700020000001E +:10A880001D800700200000002A8007006A000000E9 +:10A8900024800700020000001D8007002000000047 +:10A8A0002A8007006A0000003C007052010000018D +:10A8B00002030405060708090A0B0C0D0E0F101100 +:10A8C00012131415161718191A1B1C1D1E1F0163CD +:10A8D0000000A1630000C5630000B1620000C56311 +:10A8E0000000216300004D6300003C00AC520100F9 +:10A8F000A163000001630000A163000006050505D7 +:10A9000005050505050505050505030506070809EF +:10A910000A0A0C0D0E0F0F1011000000A5C684F8D6 +:10A9200099EE8DF60DFFBDD6B1DE54913C00E85294 +:10A93000010050600302A9CE7D5619E762B5E64DCD +:10A940009AEC458F9D1F408987FA15EFEBB2C98EAF +:10A950000BFBEC4167B3FD5FEA45BF23F75396E479 +:10A960005B9BC2751CE1AE3D6A4C5A6C417E3C005B +:10A970002453010002F54F835C68F45134D108F987 +:10A9800093E273AB53623F2A0C08529565465E9D75 +:10A990002830A1370F0AB52F090E36249B1B3DDF47 +:10A9A00026CD694ECD7F9FEA1B129E1D74582E3412 +:10A9B0003C00605301002D36B2DCEEB4FB5BF6A424 +:10A9C0004D7661B7CE7D7B523EDD715E9713F5A665 +:10A9D00068B900002CC160401FE3C879EDB6BED451 +:10A9E000468DD9674B72DE94D498E8B04A856BBB2C +:10A9F0002AC53C009C530100E54F16EDC586D79A49 +:10AA000055669411CF8A10E9060481FEF0A04478BF +:10AA1000BA25E34BF3A2FE5DC0808A05AD3FBC21A1 +:10AA2000487004F1DF63C17775AF634230201AE5E7 +:10AA30000EFD6DBF3C00D85301004C811418352623 +:10AA40002FC3E1BEA235CC88392E5793F25582FC34 +:10AA5000477AACC8E7BA2B3295E6A0C09819D19EC8 +:10AA60007FA366447E54AB3B830BCA8C29C7D36B50 +:10AA70003C2879A7E2BC3C00145401001D1676ADB9 +:10AA80003BDB56644E741E14DB920A0C6C48E4B82F +:10AA90005D9F6EBDEF43A6C4A839A43137D38BF2B6 +:10AAA00032D5438B596EB7DA8C0164B1D29CE04940 +:10AAB000B4D8FAAC07F325CF3C0050540100AFCA1C +:10AAC0008EF4E9471810D56F88F06F4A725C24380D +:10AAD000F157C773519723CB7CA19CE8213EDD96AB +:10AAE000DC61860D850F90E0427CC471AACCD890C1 +:10AAF000050601F7121CA3C25F6A3C008C540100DA +:10AB0000F9AED06991175899273AB92738D913EB7C +:10AB1000B32B3322BBD270A98907A733B62D223CB1 +:10AB2000921520C94987FFAA78507AA58F03F85952 +:10AB30008009171ADA6531D7C684B8D03C00C854EA +:10AB40000100C382B029775A111ECB7BFCA8D66DB9 +:10AB50003A2CC6A5F884EE99F68DFF0DD6BDDEB170 +:10AB6000915460500203CEA9567DE719B5624DE6B7 +:10AB7000EC9A8F451F9D8940FA87EF15B2EB3C0098 +:10AB8000045501008EC9FB0B41ECB3675FFD45EA3C +:10AB900023BF53F7E4969B5B75C2E11C3DAE4C6A44 +:10ABA0006C5A7E41F502834F685C51F4D134F90848 +:10ABB000E293AB7362532A3F080C955246659D5E43 +:10ABC0003C0040550100302837A10A0F2FB50E096F +:10ABD00024361B9BDF3DCD264E697FCDEA9F121B9D +:10ABE0001D9E5874342E362DDCB2B4EE5BFBA4F6F9 +:10ABF000764DB7617DCE527BDD3E5E711397A6F533 +:10AC0000B9683C007C5501000000C12C4060E31F86 +:10AC100079C8B6EDD4BE8D4667D9724B94DE98D410 +:10AC2000B0E8854ABB6BC52A4FE5ED1686C59AD7B5 +:10AC3000665511948ACFE9100406FE81A0F078448D +:10AC400025BA4BE33C00B8550100A2F35DFE80C07D +:10AC5000058A3FAD21BC7048F10463DF77C1AF7551 +:10AC600042632030E51AFD0EBF6D814C1814263565 +:10AC7000C32FBEE135A288CC2E39935755F2FC8202 +:10AC80007A47C8ACBAE73C00F4550100322BE69590 +:10AC9000C0A019989ED1A37F4466547E3BAB0B8322 +:10ACA0008CCAC7296BD3283CA779BCE2161DAD76A8 +:10ACB000DB3B6456744E141E92DB0C0A486CB8E4FD +:10ACC0009F5DBD6E43EFC4A63C003056010039A81D +:10ACD00031A4D337F28BD5328B436E59DAB7018C5E +:10ACE000B1649CD249E0D8B4ACFAF307CF25CAAF1F +:10ACF000F48E47E910186FD5F0884A6F5C723824DB +:10AD000057F173C79751CB23A17C3C006C560100CF +:10AD1000E89C3E2196DD61DC0D860F85E0907C424B +:10AD200071C4CCAA90D80605F7011C12C2A36A5FB1 +:10AD3000AEF969D0179199583A2727B9D938EB134A +:10AD40002BB32233D2BBA970078933A73C00A85686 +:10AD500001002DB63C221592C9208749AAFF5078E0 +:10AD6000A57A038F59F809801A1765DAD73184C696 +:10AD7000D0B882C329B05A771E117BCBA8FC6DD600 +:10AD80002C3A0400000000000000010000003C001C +:10AD9000E45601000200000003000000050000006E +:10ADA000000000000100000002000000030000009D +:10ADB00004000000010000000172657145727252CA +:10ADC0006561736F6E000000010000000500000067 +:10ADD0003C0020570100C48E0100249A01000000AD +:10ADE000000030000000249A0100A4B2010000001D +:10ADF00000006C000000A4B2010014C801000000B3 +:10AE00000000C00000001020304050BB30000100A6 +:10AE100000003C005C5701001416181A1C1E20226A +:10AE20002426282A2B2C01007017000001000000A6 +:10AE30000D250000413F0100652901000D2500009E +:10AE4000F55E0000413F0100413F010002040B0C90 +:10AE5000121618243C00985701003048606C01001D +:10AE60000000101010101010101010101010101002 +:10AE700000006400000001000000FFFFFFFF010070 +:10AE80000000000210121100000118000000020072 +:10AE90000000010000003C00D45701000000000049 +:10AEA000000000000200000004000000000000009C +:10AEB00000000000E093040040420F00000000008A +:10AEC0000100000000800000DF40CFFD0040830053 +:10AED00000000000010200003C00105801000000CA +:10AEE0000000000000000000000040008081000021 +:10AEF0008000BFFF7F7E0102000000000000000014 +:10AF0000000001000000786F010000000000B86F31 +:10AF1000010000000000F86F01003C004C580100E7 +:10AF2000000000003870010000000000787001008F +:10AF300000000000B870010000000000F87001007F +:10AF4000000000003871010000000000787101006D +:10AF50000001000090710100000100003C008858D1 +:10AF60000100A87101000001000000050A01060BA4 +:10AF700002070C03080D040900000303010100048B +:10AF800000040406161E1F0000000000000100005F +:10AF900080000000000000FFFFFF181818183C0098 +:10AFA000C458010018181818181818181818000094 +:10AFB000618B4A00618F4A00618B4A0005E3C00043 +:10AFC00005CBC00005BBC00085BAC00085A2C0008B +:10AFD0008592C000858AC000857AC0004589C0007E +:10AFE0003C00005901004571C0004569C000456141 +:10AFF000C0004559C0004551C0004549C000454109 +:10B00000C0004539C0004531C0004529C000452178 +:10B01000C000602D0600602D0600602D0600602D2A +:10B0200006003C003C590100602D06006028060027 +:10B030005026060050210600501F0600501C060036 +:10B04000501A06005018060050160600501406004C +:10B050005012060050100600500E0600500C06005C +:10B06000500A06003C00785901002B0B06001D75A4 +:10B07000C0001D75C0001D75C0001D75C0001D7588 +:10B08000C0001D75C0001D6DC000DD5BC000DD4B44 +:10B09000C000DD43C000DD3BC000DD33C000DD2B60 +:10B0A000C000DD23C0003C00B4590100DD1BC0001E +:10B0B000DD13C000DD13C000DD13C000DD13C000D0 +:10B0C000DD13C000050505040403030202010100AD +:10B0D000000005050504040303020201010000004D +:10B0E00000000000881300003C00F0590100070038 +:10B0F000000080005B004002E0FDF200B8FCA4010B +:10B1000000000F0000000F000000030B9F5F07010D +:10B110002A04210417040E040404FB03F103E803CA +:10B12000C903AA038A036B034C033C002C5A010099 +:10B130002D030E03EE02EC02010316032B03400362 +:10B1400055036A037F039403A903BE03D303E803F3 +:10B15000BE0394036A030002040607090A0B0C0DE0 +:10B160001010101010101010101000033C00685A3E +:10B17000010005080B0E1010101010101010101008 +:10B18000101010100000010000000100000000007D +:10B1900000000000000000000000000000000000AF +:10B1A00000000000000000000000000000003C0063 +:10B1B000A45A010000000000000000000000000090 +:10B1C000000000000000000000000000000000007F +:10B1D000000000000000000000000000000000006F +:10B1E000000000000000000000000000000000005F +:10B1F0003C00E05A010000000000000000000000D8 +:10B20000000000000000000000000000000000003E +:10B21000000000000000000000000000000000002E +:10B22000000000000000000000000000000000001E +:10B2300000003C001C5B010000000000000000005A +:10B2400000000000000000000000000000000000FE +:10B2500000000000000000000000000000000000EE +:10B2600000000000000000000000000000000000DE +:10B27000000000003C00585B0100000000000000DE +:10B2800000000000000000000000000000000000BE +:10B2900000000000000000000000000000000000AE +:10B2A000000000000000000000000000000000009E +:10B2B0000000000000003C00945B01000000000062 +:10B2C000000000000000000000000000000000007E +:10B2D000000000000000000000000000000000006E +:10B2E000000000000000000000000000000000005E +:10B2F00000000000000000003C00D05B01000000E6 +:10B30000000000000000000000000000000000003D +:10B31000000000000000000000000000000000002D +:10B32000000000000000000000000000000000001D +:10B33000000000000000000000003C000C5C010068 +:10B3400000000000000000000000000000000000FD +:10B3500000000000000000000000000000000000ED +:10B3600000000000000000000000000000000000DD +:10B370000000000000000000000000003C00485CED +:10B3800001000000000000000000000000000000BC +:10B3900000000000000000000000000000000000AD +:10B3A000000000000000000000000000000000009D +:10B3B00000000000000000000000000000003C0051 +:10B3C000845C01000000000000000000000000009C +:10B3D000000000000000000000000000000000006D +:10B3E000000000000000000000000000000000005D +:10B3F000000000000000000000000000000000004D +:10B400003C00C05C010000000000000000000000E3 +:10B41000000000000000000000000000000000002C +:10B42000000000000000000000000000000000001C +:10B43000000000000000000000000000000000000C +:10B4400000003C00FC5C0100000000000000000067 +:10B4500000000000000000000000000000000000EC +:10B4600000000000000000000000000000000000DC +:10B4700000000000000000000000000000000000CC +:10B48000000000003C00385D0100000000000000EA +:10B4900000000000000000000000000000000000AC +:10B4A000000000000000000000000000000000009C +:10B4B000000000000000000000000000000000008C +:10B4C0000000000000003C00745D0100000000006E +:10B4D000000000000000000000000000000000006C +:10B4E000000000000000000000000000000000005C +:10B4F000000000000000000000000000000000004C +:10B5000000000000000000003C00B05D01000000F1 +:10B51000000000000000000000000000000000002B +:10B52000000000000000000000000000000000001B +:10B53000000000000000000000000000000000000B +:10B54000000000000000000000003C00EC5D010075 +:10B5500000000000000000000000000000000000EB +:10B5600000000000000000000000000000000000DB +:10B5700000000000000000000000000000000000CB +:10B580000000000000000000000000003C00285EF9 +:10B5900001000000000000000000000000000000AA +:10B5A000000000000000000000000000000000009B +:10B5B000000000000000000000000000000000008B +:10B5C00000000000000000000000000000003C003F +:10B5D000645E0100000000000000000000000000A8 +:10B5E000000000000000000000000000000000005B +:10B5F000000000000000000000000000000000004B +:10B60000000000000000000000000000000000003A +:10B610003C00A05E010000000000000000000000EF +:10B62000000000000000000000000000000000001A +:10B63000000000000000000000000000000000000A +:10B6400000000000000000000000000000000000FA +:10B6500000003C00DC5E0100000000000000000073 +:10B6600000000000000000000000000000000000DA +:10B6700000000000000000000000000000000000CA +:10B6800000000000000000000000000000000000BA +:10B69000000000003C00185F0100000000000000F6 +:10B6A000000000000000000000000000000000009A +:10B6B000000000000000000000000000000000008A +:10B6C000000000000000000000000000000000007A +:10B6D0000000000000003C00545F0100000000007A +:10B6E000000000000000000000000000000000005A +:10B6F000000000000000000000000000000000004A +:10B700000000000000000000000000000000000039 +:10B7100000000000000000003C00905F01000000FD +:10B720000000000000000000000000000000000019 +:10B730000000000000000000000000000000000009 +:10B7400000000000000000000000000000000000F9 +:10B75000000000000000000000003C00CC5F010081 +:10B7600000000000000000000000000000000000D9 +:10B7700000000000000000000000000000000000C9 +:10B7800000000000000000000000000000000000B9 +:10B790000000000000000000000000003C00086005 +:10B7A0000100000000000000000000000000000098 +:10B7B0000000000000000000000000000000000089 +:10B7C0000000000000000000000000000000000079 +:10B7D00000000000000000000000000000003C002D +:10B7E00044600100000000000000000000000000B4 +:10B7F0000000000000000000000000000000000049 +:10B800000000000000000000000000000000000038 +:10B810000000000000000000000000000000000028 +:10B820003C008060010000000000000000000000FB +:10B830000000000000000000000000000000000008 +:10B8400000000000000000000000000000000000F8 +:10B8500000000000000000000000000000000000E8 +:10B8600000003C00BC60010000000000000000007F +:10B8700000000000000000000000000000000000C8 +:10B8800000000000000000000000000000000000B8 +:10B8900000000000000000000000000000000000A8 +:10B8A000000000003C00F860010000000000000003 +:10B8B0000000000000000000000000000000000088 +:10B8C0000000000000000000000000000000000078 +:10B8D0000000000000000000000000000000000068 +:10B8E0000000000000003C00346101000000000086 +:10B8F0000000000000000000000000000000000048 +:10B900000000000000000000000000000000000037 +:10B910000000000000000000000000000000000027 +:10B9200000000000000000003C0070610100000009 +:10B930000000000000000000000000000000000007 +:10B9400000000000000000000000000000000000F7 +:10B9500000000000000000000000000000000000E7 +:10B96000000000000000000000003C00AC6101008D +:10B9700000000000000000000000000000000000C7 +:10B9800000000000000000000000000000000000B7 +:10B9900000000000000000000000000000000000A7 +:10B9A0000000000000000000000000003C00E86112 +:10B9B0000100000000000000000000000000000086 +:10B9C0000000000000000000000000000000000077 +:10B9D0000000000000000000000000000000000067 +:10B9E00000000000000000000000000000003C001B +:10B9F00024620100000000000000000000000000C0 +:10BA00000000000000000000000000000000000036 +:10BA10000000000000000000000000000000000026 +:10BA20000000000000000000000000000000000016 +:10BA30003C00606201000000000000000000000007 +:10BA400000000000000000000000000000000000F6 +:10BA500000000000000000000000000000000000E6 +:10BA600000000000000000000000000000000000D6 +:10BA700000003C009C62010000000000000000008B +:10BA800000000000000000000000000000000000B6 +:10BA900000000000000000000000000000000000A6 +:10BAA0000000000000000000000000000000000096 +:10BAB000000000003C00D86201000000000000000F +:10BAC0000000000000000000000000000000000076 +:10BAD0000000000000000000000000000000000066 +:10BAE0000000000000000000000000000000000056 +:10BAF0000000000000003C00146301000000000092 +:10BB00000000000000000000000000000000000035 +:10BB10000000000000000000000000000000000025 +:10BB20000000000000000000000000000000000015 +:10BB300000000000000000003C0050630100000015 +:10BB400000000000000000000000000000000000F5 +:10BB500000000000000000000000000000000000E5 +:10BB600000000000000000000000000000000000D5 +:10BB7000000000000000000000003C008C63010099 +:10BB800000000000000000000000000000000000B5 +:10BB900000000000000000000000000000000000A5 +:10BBA0000000000000000000000000000000000095 +:10BBB0000000000000000000000000003C00C8631E +:10BBC0000100000000000000000000000000000074 +:10BBD0000000000000000000000000000000000065 +:10BBE0000000000000000000000000000000000055 +:10BBF00000000000000000000000000000003C0009 +:10BC000004640100000000000000000000000000CB +:10BC10000000000000000000000000000000000024 +:10BC20000000000000000000000000000000000014 +:10BC30000000000000000000000000000000000004 +:10BC40003C00406401000000000000000000000013 +:10BC500000000000000000000000000000000000E4 +:10BC600000000000000000000000000000000000D4 +:10BC700000000000000000000000000000000000C4 +:10BC800000003C007C640100000000000000000097 +:10BC900000000000000000000000000000000000A4 +:10BCA0000000000000000000000000000000000094 +:10BCB0000000000000000000000000000000000084 +:10BCC000000000003C00B86401000000000000001B +:10BCD0000000000000000000000000000000000064 +:10BCE0000000000000000000000000000000000054 +:10BCF0000000000000000000000000000000000044 +:10BD00000000000000003C00F4640100000000009E +:10BD10000000000000000000000000000000000023 +:10BD20000000000000000000000000000000000013 +:10BD30000000000000000000000000000000000003 +:10BD400000000000000000003C0030650100000021 +:10BD500000000000000000000000000000000000E3 +:10BD600000000000000000000000000000000000D3 +:10BD700000000000000000000000000000000000C3 +:10BD8000000000000000000000003C006C650100A5 +:10BD900000000000000000000000000000000000A3 +:10BDA0000000000000000000000000000000000093 +:10BDB0000000000000000000000000000000000083 +:10BDC0000000000000000000000000003C00A8652A +:10BDD0000100000000000000000000000000000062 +:10BDE0000000000000000000000000000000000053 +:10BDF0000000000000000000000000000000000043 +:10BE000000000000000000000000000000003C00F6 +:10BE1000E4650100000000000000000000000000D8 +:10BE20000000000000000000000000000000000012 +:10BE30000000000000000000000000000000000002 +:10BE400000000000000000000000000000000000F2 +:10BE50003C0020660100000000000000000000001F +:10BE600000000000000000000000000000000000D2 +:10BE700000000000000000000000000000000000C2 +:10BE800000000000000000000000000000000000B2 +:10BE900000003C005C6601000000000000000000A3 +:10BEA0000000000000000000000000000000000092 +:10BEB0000000000000000000000000000000000082 +:10BEC0000000000000000000000000000000000072 +:10BED000000000003C009866010000000000000027 +:10BEE0000000000000000000000000000000000052 +:10BEF0000000000000000000000000000000000042 +:10BF00000000000000000000000000000000000031 +:10BF10000000000000003C00D466010000000000AA +:10BF20000000000000000000000000000000000011 +:10BF30000000000000000000000000000000000001 +:10BF400000000000000000000000000000000000F1 +:10BF500000000000000000003C001067010000002D +:10BF600000000000000000000000000000000000D1 +:10BF700000000000000000000000000000000000C1 +:10BF800000000000000000000000000000000000B1 +:10BF9000000000000000000000003C004C670100B1 +:10BFA0000000000000000000000000000000000091 +:10BFB0000000000000000000000000000000000081 +:10BFC0000000000000000000000000000000000071 +:10BFD0000000000000000000000000003C00886736 +:10BFE0000100000000000000000000000000000050 +:10BFF0000000000000000000000000000000000041 +:10C000000000000000000000000000000000000030 +:10C0100000000000000000000000000000003C00E4 +:10C02000C4670100000000000000000000000000E4 +:10C030000000000000000000000000000000000000 +:10C0400000000000000000000000000000000000F0 +:10C0500000000000000000000000000000000000E0 +:10C060003C0000680100000000000000000000002B +:10C0700000000000000000000000000000000000C0 +:10C0800000000000000000000000000000000000B0 +:10C0900000000000000000000000000000000000A0 +:10C0A00000003C003C6801000000000000000000AF +:10C0B0000000000000000000000000000000000080 +:10C0C0000000000000000000000000000000000070 +:10C0D0000000000000000000000000000000000060 +:10C0E000000000003C007868010000000000000033 +:10C0F0000000000000000000000000000000000040 +:10C10000000000000000000000000000000000002F +:10C11000000000000000000000000000000000001F +:10C120000000000000003C00B468010000000000B6 +:10C1300000000000000000000000000000000000FF +:10C1400000000000000000000000000000000000EF +:10C1500000000000000000000000000000000000DF +:10C1600000000000000000003C00F068010000003A +:10C1700000000000000000000000000000000000BF +:10C1800000000000000000000000000000000000AF +:10C19000000000000000000000000000000000009F +:10C1A000000000000000000000003C002C690100BD +:10C1B000000000000000000000000000000000007F +:10C1C000000000000000000000000000000000006F +:10C1D000000000000000000000000000000000005F +:10C1E0000000000000000000000000003C00686942 +:10C1F000010000000000000000000000000000003E +:10C20000000000000000000000000000000000002E +:10C21000000000000000000000000000000000001E +:10C2200000000000000000000000000000003C00D2 +:10C23000A4690100000000000000000000000000F0 +:10C2400000000000000000000000000000000000EE +:10C2500000000000000000000000000000000000DE +:10C2600000000000000000000000000000000000CE +:10C270003C00E06901000000000000000000000038 +:10C2800000000000000000000000000000000000AE +:10C29000000000000000000000000000000000009E +:10C2A000000000000000000000000000000000008E +:10C2B00000003C001C6A01000000000000000000BB +:10C2C000000000000000000000000000000000006E +:10C2D000000000000000000000000000000000005E +:10C2E000000000000000000000000000000000004E +:10C2F000000000003C00586A01000000000000003F +:10C30000000000000000000000000000000000002D +:10C31000000000000000000000000000000000001D +:10C32000000000000000000000000000000000000D +:10C330000000000000003C00946A010000000000C2 +:10C3400000000000000000000000000000000000ED +:10C3500000000000000000000000000000000000DD +:10C3600000000000000000000000000000000000CD +:10C3700000000000000000003C00D06A0100000046 +:10C3800000000000000000000000000000000000AD +:10C39000000000000000000000000000000000009D +:10C3A000000000000000000000000000000000008D +:10C3B000000000000000000000003C000C6B0100C9 +:10C3C000000000000000000000000000000000006D +:10C3D000000000000000000000000000000000005D +:10C3E000000000000000000000000000000000004D +:10C3F0000000000000000000000000003C00486B4E +:10C40000010000000000000000000000000000002B +:10C41000000000000000000000000000000000001C +:10C42000000000000000000000000000000000000C +:10C4300000000000000000000000000000003C00C0 +:10C44000846B0100000000000000000000000000FC +:10C4500000000000000000000000000000000000DC +:10C4600000000000000000000000000000000000CC +:10C4700000000000000000000000000000000000BC +:10C480003C00C06B01000000000000000000000044 +:10C49000000000000000000000000000000000009C +:10C4A000000000000000000000000000000000008C +:10C4B000000000000000000000000000000000007C +:10C4C00000003C00FC6B01000000000000000000C8 +:10C4D000000000000000000000000000000000005C +:10C4E000000000000000000000000000000000004C +:10C4F000000000000000000000000000000000003C +:10C50000000000003C00386C01000000000000004A +:10C51000000000000000000000000000000000001B +:10C52000000000000000000000000000000000000B +:10C5300000000000000000000000000000000000FB +:10C540000000000000003C00746C010000000000CE +:10C5500000000000000000000000000000000000DB +:10C5600000000000000000000000000000000000CB +:10C5700000000000000000000000000000000000BB +:10C5800000000000000000003C00B06C0100000052 +:10C59000000000000000000000000000000000009B +:10C5A000000000000000000000000000000000008B +:10C5B000000000000000000000000000000000007B +:10C5C000000000000000000000003C00EC6C0100D6 +:10C5D000000000000000000000000000000000005B +:10C5E000000000000000000000000000000000004B +:10C5F000000000000000000000000000000000003B +:10C600000000000000000000000000003C00286D59 +:10C610000100000000000000000000000000000019 +:10C62000000000000000000000000000000000000A +:10C6300000000000000000000000000000000000FA +:10C6400000000000000000000000000000003C00AE +:10C65000646D010000000000000000000000000008 +:10C6600000000000000000000000000000000000CA +:10C6700000000000000000000000000000000000BA +:10C6800000000000000000000000000000000000AA +:10C690003C00A06D01000000000000000000000050 +:10C6A000000000000000000000000000000000008A +:10C6B000000000000000000000000000000000007A +:10C6C000000000000000000000000000000000006A +:10C6D00000003C00DC6D01000000000000000000D4 +:10C6E000000000000000000000000000000000004A +:10C6F000000000000000000000000000000000003A +:10C700000000000000000000000000000000000029 +:10C71000000000003C00186E010000000000000056 +:10C720000000000000000000000000000000000009 +:10C7300000000000000000000000000000000000F9 +:10C7400000000000000000000000000000000000E9 +:10C750000000000000003C00546E010000000000DA +:10C7600000000000000000000000000000000000C9 +:10C7700000000000000000000000000000000000B9 +:10C7800000000000000000000000000000000000A9 +:10C7900000000000000000003C00906E010000005E +:10C7A0000000000000000000000000000000000089 +:10C7B0000000000000000000000000000000000079 +:10C7C0000000000000000000000000000000000069 +:10C7D000000000000000000000003C00CC6E0100E2 +:10C7E0000000000000000000000000000000000049 +:10C7F0000000000000000000000000000000000039 +:10C800000000000000000000000000000000000028 +:10C810000000000000000000000000003C00086F65 +:10C820000100000000000000000000000000000007 +:10C8300000000000000000000000000000000000F8 +:10C8400000000000000000000000000000000000E8 +:10C8500000000000000000000000000000003C009C +:10C86000446F010000000000000000000000000014 +:10C8700000000000000000000000000000000000B8 +:10C8800000000000000000000000000000000000A8 +:10C890000000000000000000000000000000000098 +:10C8A0003C00806F0100000000000000000000005C +:10C8B0000000000000000000000000000000000078 +:10C8C0000000000000000000000000000000000068 +:10C8D0000000000000000000000000000000000058 +:10C8E00000003C00BC6F01000000000000000000E0 +:10C8F0000000000000000000000000000000000038 +:10C900000000000000000000000000000000000027 +:10C910000000000000000000000000000000000017 +:10C92000000000003C00F86F010000000000000063 +:10C9300000000000000000000000000000000000F7 +:10C9400000000000000000000000000000000000E7 +:10C9500000000000000000000000000000000000D7 +:10C960000000000000003C003470010000000000E6 +:10C9700000000000000000000000000000000000B7 +:10C9800000000000000000000000000000000000A7 +:10C990000000000000000000000000000000000097 +:10C9A00000000000000000003C007070010000006A +:10C9B0000000000000000000000000000000000077 +:10C9C0000000000000000000000000000000000067 +:10C9D0000000000000000000000000000000000057 +:10C9E000000000000000000000003C00AC700100EE +:10C9F0000000000000000000000000000000000037 +:10CA00000000000000000000000000000000000026 +:10CA10000000000000000000000000000000000016 +:10CA20000000000000000000000000003C00E87072 +:10CA300001000000000000000000000000000000F5 +:10CA400000000000000000000000000000000000E6 +:10CA500000000000000000000000000000000000D6 +:10CA600000000000000000000000000000003C008A +:10CA70002471010000000000000000000000000020 +:10CA800000000000000000000000000000000000A6 +:10CA90000000000000000000000000000000000096 +:10CAA0000000000000000000000000000000000086 +:10CAB0003C00607101000000000000000000000068 +:10CAC0000000000000000000000000000000000066 +:10CAD0000000000000000000000000000000000056 +:10CAE0000000000000000000000000000000000046 +:10CAF00000003C009C7101000000000000000000EC +:10CB00000000000000000000000000000000000025 +:10CB10000000000000000000000000000000000015 +:10CB20000000000000000000000000000000000005 +:10CB3000000000003C00D87101000000000000006F +:10CB400000000000000000000000000000000000E5 +:10CB500000000000000000000000000000000000D5 +:10CB600000000000000000000000000000000000C5 +:10CB70000000000000003C001472010000000000F2 +:10CB800000000000000000000000000000000000A5 +:10CB90000000000000000000000000000000000095 +:10CBA0000000000000000000000000000000000085 +:10CBB00000000000000000003C0050720100000076 +:10CBC0000000000000000000000000000000000065 +:10CBD0000000000000000000000000000000000055 +:10CBE0000000000000000000000000000000000045 +:10CBF000000000000000000000003C008C720100FA +:10CC00000000000000000000000000000000000024 +:10CC10000000000000000000000000000000000014 +:10CC20000000000000000000000000000000000004 +:10CC30000000000000000000000000003C00C8727E +:10CC400001000000000000000000000000000000E3 +:10CC500000000000000000000000000000000000D4 +:10CC600000000000000000000000000000000000C4 +:10CC700000000000000000000000000000003C0078 +:10CC8000047301000000000000000000000000002C +:10CC90000000000000000000000000000000000094 +:10CCA0000000000000000000000000000000000084 +:10CCB0000000000000000000000000000000000074 +:10CCC0003C00407301000000000000000000000074 +:10CCD0000000000000000000000000000000000054 +:10CCE0000000000000000000000000000000000044 +:10CCF0000000000000000000000000000000000034 +:10CD000000003C007C7301000000000000000000F7 +:10CD10000000000000000000000000000000000013 +:10CD20000000000000000000000000000000000003 +:10CD300000000000000000000000000000000000F3 +:10CD4000000000003C00B87301000000000000007B +:10CD500000000000000000000000000000000000D3 +:10CD600000000000000000000000000000000000C3 +:10CD700000000000000000000000000000000000B3 +:10CD80000000000000003C00F473010000000000FF +:10CD90000000000000000000000000000000000093 +:10CDA0000000000000000000000000000000000083 +:10CDB0000000000000000000000000000000000073 +:10CDC00000000000000000003C0030740100000082 +:10CDD0000000000000000000000000000000000053 +:10CDE0000000000000000000000000000000000043 +:10CDF0000000000000000000000000000000000033 +:10CE0000000000000000000000003C006C74010005 +:10CE10000000000000000000000000000000000012 +:10CE20000000000000000000000000000000000002 +:10CE300000000000000000000000000000000000F2 +:10CE40000000000000000000000000003C00A8748A +:10CE500001000000000000000000000000000000D1 +:10CE600000000000000000000000000000000000C2 +:10CE700000000000000000000000000000000000B2 +:10CE800000000000000000000000000000003C0066 +:10CE9000E474010000000000000000000000000039 +:10CEA0000000000000000000000000000000000082 +:10CEB0000000000000000000000000000000000072 +:10CEC0000000000000000000000000000000000062 +:10CED0003C00207501000000000000000000000080 +:10CEE0000000000000000000000000000000000042 +:10CEF0000000000000000000000000000000000032 +:10CF00000000000000000000000000000000000021 +:10CF100000003C005C750100000000000000000003 +:10CF20000000000000000000000000000000000001 +:10CF300000000000000000000000000000000000F1 +:10CF400000000000000000000000000000000000E1 +:10CF5000000000003C009875010000000000000087 +:10CF600000000000000000000000000000000000C1 +:10CF700000000000000000000000000000000000B1 +:10CF800000000000000000000000000000000000A1 +:10CF90000000000000003C00D4750100000000000B +:10CFA0000000000000000000000000000000000081 +:10CFB0000000000000000000000000000000000071 +:10CFC0000000000000000000000000000000000061 +:10CFD00000000000000000003C001076010000008E +:10CFE0000000000000000000000000000000000041 +:10CFF0000000000000000000000000000000000031 +:10D000000000000000000000000000000000000020 +:10D01000000000000000000000003C004C76010011 +:10D020000000000000000000000000000000000000 +:10D0300000000000000000000000000000000000F0 +:10D0400000000000000000000000000000000000E0 +:10D050000000000000000000000000003C00887696 +:10D0600001000000000000000000000000000000BF +:10D0700000000000000000000000000000000000B0 +:10D0800000000000000000000000000000000000A0 +:10D0900000000000000000000000000000003C0054 +:10D0A000C476010000000000000000000000000045 +:10D0B0000000000000000000000000000000000070 +:10D0C0000000000000000000000000000000000060 +:10D0D0000000000000000000000000000000000050 +:10D0E0003C0000770100000000000000000000008C +:10D0F0000000000000000000000000000000000030 +:10D10000000000000000000000000000000000001F +:10D11000000000000000000000000000000000000F +:10D1200000003C003C77010000000000000000000F +:10D1300000000000000000000000000000000000EF +:10D1400000000000000000000000000000000000DF +:10D1500000000000000000000000000000000000CF +:10D16000000000003C007877010000000000000093 +:10D1700000000000000000000000000000000000AF +:10D18000000000000000000000000000000000009F +:10D19000000000000000000000000000000000008F +:10D1A0000000000000003C00B47701000000000017 +:10D1B000000000000000000000000000000000006F +:10D1C000000000000000000000000000000000005F +:10D1D000000000000000000000000000000000004F +:10D1E00000000000000000003C00F077010000009B +:10D1F000000000000000000000000000000000002F +:10D20000000000000000000000000000000000001E +:10D21000000000000000000000000000000000000E +:10D22000000000000000000000003C002C7801001D +:10D2300000000000000000000000000000000000EE +:10D2400000000000000000000000000000000000DE +:10D2500000000000000000000000000000000000CE +:10D260000000000000000000000000003C006878A2 +:10D2700001000000000000000000000000000000AD +:10D28000000000000000000000000000000000009E +:10D29000000000000000000000000000000000008E +:10D2A00000000000000000000000000000003C0042 +:10D2B000A478010000000000000000000000000051 +:10D2C000000000000000000000000000000000005E +:10D2D000000000000000000000000000000000004E +:10D2E000000000000000000000000000000000003E +:10D2F0003C00E07801000000000000000000000099 +:10D30000000000000000000000000000000000001D +:10D31000000000000000000000000000000000000D +:10D3200000000000000000000000000000000000FD +:10D3300000003C001C79010000000000000000001B +:10D3400000000000000000000000000000000000DD +:10D3500000000000000000000000000000000000CD +:10D3600000000000000000000000000000000000BD +:10D37000000000003C00587901000000000000009F +:10D38000000000000000000000000000000000009D +:10D39000000000000000000000000000000000008D +:10D3A000000000000000000000000000000000007D +:10D3B0000000000000003C00947901000000000023 +:10D3C000000000000000000000000000000000005D +:10D3D000000000000000000000000000000000004D +:10D3E000000000000000000000000000000000003D +:10D3F00000000000000000003C00D07901000000A7 +:10D40000000000000000000000000000000000001C +:10D41000000000000000000000000000000000000C +:10D4200000000000000000000000000000000000FC +:10D43000000000000000000000003C000C7A010029 +:10D4400000000000000000000000000000000000DC +:10D4500000000000000000000000000000000000CC +:10D4600000000000000000000000000000000000BC +:10D470000000000000000000000000003C00487AAE +:10D48000010000000000000000000000000000009B +:10D49000000000000000000000000000000000008C +:10D4A000000000000000000000000000000000007C +:10D4B00000000000000000000000000000003C0030 +:10D4C000847A01000000000000000000000000005D +:10D4D000000000000000000000000000000000004C +:10D4E000000000000000000000000000000000003C +:10D4F000000000000000000000000000000000002C +:10D500003C00C07A010000000000000000000000A4 +:10D51000000000000000000000000000000000000B +:10D5200000000000000000000000000000000000FB +:10D5300000000000000000000000000000000000EB +:10D5400000003C00FC7A0100000000000000000028 +:10D5500000000000000000000000000000000000CB +:10D5600000000000000000000000000000000000BB +:10D5700000000000000000000000000000000000AB +:10D58000000000003C00387B0100000000000000AB +:10D59000000000000000000000000000000000008B +:10D5A000000000000000000000000000000000007B +:10D5B000000000000000000000000000000000006B +:10D5C0000000000000003C00747B0100000000002F +:10D5D000000000000000000000000000000000004B +:10D5E000000000000000000000000000000000003B +:10D5F000000000000000000000000000000000002B +:10D6000000000000000000003C00B07B01000000B2 +:10D61000000000000000000000000000000000000A +:10D6200000000000000000000000000000000000FA +:10D6300000000000000000000000000000000000EA +:10D64000000000000000000000003C00EC7B010036 +:10D6500000000000000000000000000000000000CA +:10D6600000000000000000000000000000000000BA +:10D6700000000000000000000000000000000000AA +:10D680000000000000000000000000003C00287CBA +:10D690000100000000000000000000000000000089 +:10D6A000000000000000000000000000000000007A +:10D6B000000000000000000000000000000000006A +:10D6C00000000000000000000000000000003C001E +:10D6D000647C010000000000000000000000000069 +:10D6E000000000000000000000000000000000003A +:10D6F000000000000000000000000000000000002A +:10D700000000000000000000000000000000000019 +:10D710003C00A07C010000000000000000000000B0 +:10D7200000000000000000000000000000000000F9 +:10D7300000000000000000000000000000000000E9 +:10D7400000000000000000000000000000000000D9 +:10D7500000003C00DC7C0100000000000000000034 +:10D7600000000000000000000000000000000000B9 +:10D7700000000000000000000000000000000000A9 +:10D780000000000000000000000000000000000099 +:10D79000000000003C00187D0100000000000000B7 +:10D7A0000000000000000000000000000000000079 +:10D7B0000000000000000000000000000000000069 +:10D7C0000000000000000000000000000000000059 +:10D7D0000000000000003C00547D0100000000003B +:10D7E0000000000000000000000000000000000039 +:10D7F0000000000000000000000000000000000029 +:10D800000000000000000000000000000000000018 +:10D8100000000000000000003C00907D01000000BE +:10D8200000000000000000000000000000000000F8 +:10D8300000000000000000000000000000000000E8 +:10D8400000000000000000000000000000000000D8 +:10D85000000000000000000000003C00CC7D010042 +:10D8600000000000000000000000000000000000B8 +:10D8700000000000000000000000000000000000A8 +:10D880000000000000000000000000000000000098 +:10D890000000000000000000000000003C00087EC6 +:10D8A0000100000000000000000000000000000077 +:10D8B0000000000000000000000000000000000068 +:10D8C0000000000000000000000000000000000058 +:10D8D00000000000000000000000000000003C000C +:10D8E000447E010000000000000000000000000075 +:10D8F0000000000000000000000000000000000028 +:10D900000000000000000000000000000000000017 +:10D910000000000000000000000000000000000007 +:10D920003C00807E010000000000000000000000BC +:10D9300000000000000000000000000000000000E7 +:10D9400000000000000000000000000000000000D7 +:10D9500000000000000000000000000000000000C7 +:10D9600000003C00BC7E0100000000000000000040 +:10D9700000000000000000000000000000000000A7 +:10D980000000000000000000000000000000000097 +:10D990000000000000000000000000000000000087 +:10D9A000000000003C00F87E0100000000000000C4 +:10D9B0000000000000000000000000000000000067 +:10D9C0000000000000000000000000000000000057 +:10D9D0000000000000000000000000000000000047 +:10D9E0000000000000003C00347F01000000000047 +:10D9F0000000000000000000000000000000000027 +:10DA00000000000000000000000000000000000016 +:10DA10000000000000000000000000000000000006 +:10DA200000000000000000003C00707F01000000CA +:10DA300000000000000000000000000000000000E6 +:10DA400000000000000000000000000000000000D6 +:10DA500000000000000000000000000000000000C6 +:10DA6000000000000000000000003C00AC7F01004E +:10DA700000000000000000000000000000000000A6 +:10DA80000000000000000000000000000000000096 +:10DA90000000000000000000000000000000000086 +:10DAA0000000000000000000000000003C00E87FD3 +:10DAB0000100000000000000000000000000000065 +:10DAC0000000000000000000000070B50125074EB6 +:10DAD000AD0375610A20FAF76CFF30688003C40F4C +:10DAE000B5610A20FAF765FF201C70BD00003C00FC +:10DAF000248001001000070070B501256D04002886 +:10DB0000104C01D0656100E0A56160682843606049 +:10DB1000A0682843A0600A20FAF74EFF0126B6034A +:10DB200066610A20FAF748FFA6610120FAF744FF70 +:10DB30003C0060800100A068A843A06060682843A2 +:10DB400060600A20FAF73BFF70BD1000070070B557 +:10DB50000125104C6D046561606828436060A06811 +:10DB60002843A060EE08A6610A20FAF728FF666144 +:10DB70000A203C009C800100FAF724FFA5610A20DE +:10DB8000FAF720FFA6610A20FAF71CFFA068A84355 +:10DB9000A06060682843606070BD0000100007004E +:10DBA00070B501250E4C6D04A56160682843606066 +:10DBB000A06828433C00D8800100A060EE086661A0 +:10DBC0000A20FAF702FF65610A20FAF7FEFEA66155 +:10DBD0000A20FAF7FAFEA068A843A060606828430C +:10DBE000606070BD00001000070070B5051C0024C7 +:10DBF0008026281C30403C0014810100FFF788FF7C +:10DC00006806050E0134082CF6DBFFF76DFF70BDCA +:10DC100080B5021C0B218020FBF73EFB80BD00007D +:10DC2000F8B512480025071CFF37061D0137281CD0 +:10DC3000F9F7EAFD041C17D03C005081010020696F +:10DC4000002804D0E06A002803D00020E062251CF0 +:10DC5000F0E77B68002B05D0321C211C44310120E9 +:10DC6000E8F734F9201C4430F9F737FEE2E7F8BD55 +:10DC7000000020F70100114870B53C008C810100C4 +:10DC80000068FF281DD1FF203230FAF7A7FE0E4DA5 +:10DC90006C680E48FAF7A2FE6868241A012000F0AA +:10DCA00095FD6E680948FAF799FE6868211C0A39E3 +:10DCB000301A884202D30A34A04202D93C00C881FB +:10DCC0000100002000F085FD70BDF4740100000328 +:10DCD00007009303000070B500F04DF80120EDF748 +:10DCE00034F9114D182168600020E9F7F2F9286035 +:10DCF00004688020208000260622FF21201D3C0091 +:10DD0000048201006680E8F70BFA201C0A300949FA +:10DD1000F2F72EFD201C10300749F2F729FDE682AC +:10DD200003CDE9F7F9F8024901201439886070BD84 +:10DD300090D901001261010024F701007047000032 +:10DD40003C004082010010B5064C00220220E16830 +:10DD5000F0F711FB6078022801D100F01AF910BD2C +:10DD6000000040D9010080B5A120FFF750FF80BD21 +:10DD7000000040000E21084080B5A030FFF747FFAB +:10DD800080BD3C007C82010010B5054C2068002855 +:10DD900004D0E9F787F900202060606010BD000022 +:10DDA00090D9010010B5074C0121074A21610220DA +:10DDB0001070616100F0D6FC00F0C8FB201CEDF78C +:10DDC0009FFA10BD3C00B882010020F701007CD909 +:10DDD000010070B5021C081C0225002A134E14D045 +:10DDE00000F011FC3078012108433070307828436E +:10DDF000307000207D214901B279920700D50134AD +:10DE000001308842F8DB3C00F4820100201C70BD28 +:10DE10003078A843307030784008400030700549B1 +:10DE200048680122120490434860012070BD000040 +:10DE3000880007006C000700FFB509AE002060CE27 +:10DE4000286000239C4630603C0030830100694616 +:10DE500001AA17E0DB070ED5124B1C56631C0AD033 +:10DE600001272B68A7403B432B601368DB0702D5D3 +:10DE700033683B4333600B685B080B6013685B08D7 +:10DE8000136001300B68002B01D03C006C83010053 +:10DE90002228E2D3634601332020022B9C4602A9AC +:10DEA00003AAF2DBFFBD0000B48D0100B0B5041C75 +:10DEB0000D1C1E2100220320054BF9F7B3F8211C8D +:10DEC0000320F9F7F5F8291C0320F9F73C00A88393 +:10DED0000100F1F8B0BD80380100B0B51C4C1C4DFC +:10DEE0002178022909D0032919D004291FD0052936 +:10DEF00023D1002000F017FB23E0686114481C3098 +:10DF0000C16802698918C16000F02FFBE0683C001D +:10DF1000E48301000138E06016D13220E060FFF7B1 +:10DF2000A3FE11E0002000F001FB00F02DFC012019 +:10DF3000207009E0002000F0F9FAFFF745FF03E048 +:10DF400005210B20E8F746FF68696168E7F7DDFF08 +:10DF50003C0020840100B0BD00007CD9010020F706 +:10DF60000100F7B5041C171CFFF721FE200AFFF77C +:10DF700018FF2006000EFFF762FEFFF718FEA12033 +:10DF8000FFF75DFE002516E0002000244006060E87 +:10DF9000FFF73C005C840100D1FD0006000E304319 +:10DFA0000134082CF5DB291C019A0135BD4250547F +:10DFB00001DA002000E00120FFF7D4FDBD42E6DBDE +:10DFC000FFF71EFEFEBD000080B5FFF719FE092118 +:10DFD000890300223C00988401000220F0F7E9F94F +:10DFE00080BD0921890380B500220220F0F7C9F91C +:10DFF000012109488903816142680A4342608268BD +:10E000001143816001214904816182688A438260F1 +:10E010004268114341603C00D484010080BD00008F +:10E0200010000700F0B5041CC0687B4E056830780E +:10E0300085B0012801D0022872D100212069F2F7B1 +:10E0400041F97649F2F724FC002869D0201C2030E1 +:10E05000417A082902D1724A3C0010850100002152 +:10E060005161007A226A1821F2F7C9FBE16A371C74 +:10E0700040186C49029030780E1CFF360A1D01369C +:10E080000128049207D0654A02991C32281CEDF73A +:10E09000E2FB00286BD0322120693C004C85010056 +:10E0A000F2F716F9019020690121F2F711F9011C2C +:10E0B0005E480123019AEDF707FC002804D15B4874 +:10E0C000EDF792FA0021B96056481C308168EAF7F2 +:10E0D00019FC201C143003900499F2F73C00888549 +:10E0E0000100D5FB002805D10022BA6004980399ED +:10E0F000F2F76BFB4F4928890988884203D0002238 +:10E100004C49BA60088003212069F2F7E4F800283E +:10E1100010D04649827820310B7994469A423C00CF +:10E12000C485010009D00022BA6062460A71807875 +:10E130000121F3F705F900E077E006212069F2F705 +:10E14000CDF8002808D081783A4840308288914242 +:10E1500002D00022BA6081802A212069F2F7BEF83D +:10E160003C000086010000280DD08078F169334A18 +:10E17000814208D00021B960F061101CEDF709FB65 +:10E180002F48EDF7FAFA38783B1C012817D1022006 +:10E1900018702A4F01233B61274B03CD1C33083DE8 +:10E1A000029A3C003C860100EDF7B0FA381CEDF70E +:10E1B000D7F83268002A03D000210120E7F7C4FE17 +:10E1C00000F0F4F9201CF9F7D5FB071C11D1201C35 +:10E1D000F9F788FB071C2ED001233B616889402199 +:10E1E000C85373683C0078860100002B04D0211CC2 +:10E1F0000020049AE7F7ACFE0123FB62206932217C +:10E20000F2F775F8051C20690121F2F770F80E4E3F +:10E21000011C2A1C301CEDF7C0FB00280ED1322156 +:10E220002069F2F764F83C00B4860100051C2069FF +:10E230000121F2F75FF8011C3B1C2A1C301CEDF792 +:10E24000D7FA05B0F0BD00007CD9010040F801000C +:10E2500020F70100021C081C802A80B506D0812A04 +:10E2600003D004210B20E8F73C00F0860100D9FD23 +:10E2700080BDFFF75CFE80BD000003488178FF2968 +:10E2800001D0007970470020704780F8010030B558 +:10E2900089B000930E4D131C041C2A1CECF725FDBD +:10E2A00001A906A8A268ECF7CEFE3C002C8701006D +:10E2B00001AA06A9281C636AEDF744FA041C012888 +:10E2C00004D1281CEDF72CF800F04AF8201C09B006 +:10E2D00030BD000020F7010080B5EDF72BF800F00D +:10E2E0007DF80248EDF702FA80BD00003C00688727 +:10E2F000010020F7010080B500280BD10648EDF79A +:10E30000F8F900F06EF80120EDF7EBFA034903206D +:10E31000F9F735FE80BD20F701006D870100B0B52B +:10E32000104D041C131C2A1C88B0ECF702FD3C00A5 +:10E33000A4870100211C0A310622281DE7F7A4FE4C +:10E34000694605A86269ECF787FE281CECF7EEFF2A +:10E350007F23DB43281C6A4605A9EDF7F9F900F095 +:10E360001DF808B0B0BD000020F701000A4880B5D4 +:10E370003C00E08701000178002906D0022901D085 +:10E38000052907D10321017080BD0121017000F032 +:10E390002EFA80BD03210B20E8F74FFD80BD7CD90C +:10E3A0000100094980B50878002806D0022801D06C +:10E3B00005283C001C88010005D10420087080BDA0 +:10E3C000FFF738FD80BD02210B20E8F739FD80BD45 +:10E3D0007CD9010080B502210B20044AFAF782FFA4 +:10E3E000F6F786FD0249086180BD0000DD86010068 +:10E3F0007CD901003C00588801000C4880B50178A8 +:10E4000006290ED202A35B5C5B009F44000006035A +:10E4100007070706002000F0C2F880BD0521017043 +:10E4200080BD04210B20E8F70EFD80BD00007CD9E3 +:10E430000100704700003C009488010010B50D4BAE +:10E44000041C181C1030002C08D0DB885B045B0C0B +:10E450000B80807B48800420108008E0DA8801244B +:10E46000E40322400C882243DA804988817301202A +:10E4700010BD0000300007003C00D088010070B5DE +:10E48000104E021C0023F056002A02D0087001240E +:10E4900015E00023CD56854201D1012070BD281C16 +:10E4A00000F05FF9041C0AD00748357000680028A6 +:10E4B00003D000210A20F9F728FD3C000C89010057 +:10E4C00000F016FA201C70BDF46B01003CD901006D +:10E4D000031C081C002B80B506D0042111800422E7 +:10E4E0000449E7F7E3FD02E0006800F0CFF90120FE +:10E4F00080BD0000F474010010B5FFF73C004889AE +:10E50000010097FBFFF789FC041CFFF7B8FBFFF73E +:10E5100084FC002C02D1012800D110BD002010BDC8 +:10E520000000F8B5204F041C78780E1C02282ED06D +:10E530001E4AF968916114231D49584340183C0054 +:10E5400084890100417BB878F8F714FE00F08AF95D +:10E55000002504E00021B878F8F70CFE0135787842 +:10E560001423144958434018807AA842F2DC00254D +:10E5700008E00021B878F8F7FDFD0F48006820702A +:10E580003C00C089010001340135B542F4DB094A81 +:10E59000F86850617878022806D1B868321C211CCE +:10E5A0000004000CFFF725FDB8688019B860F8BDBD +:10E5B000000040D9010010000700648D01003020E8 +:10E5C00007003C00FC89010070B5061C0C4D0024BE +:10E5D0002C70FFF739FC0A4818211C30AC60E7F7B3 +:10E5E00043FD08484461F9F763F9002E06D1064857 +:10E5F0002969F6F7A7FC0020ECF7B0FE70BD00001B +:10E600007CD901003C00388A010020F70100346306 +:10E61000010030B5124C85B0206800281CD00F488E +:10E6200014388068002801D1FFF7C1FB206800235F +:10E63000006801AA04300121ECF7D1FD0849084A1D +:10E6400008310C3100923C00748A010003C900AB10 +:10E650004518997B019A20682B1CF2F72BFE05B018 +:10E6600030BD000090D901002981010010B5134C84 +:10E67000142360705843124BC1188A88E2801858DE +:10E68000E060087AA070FF283C00B08A010012D038 +:10E69000002208210D4BF8F722FD00220220E1683C +:10E6A000EFF7BDFE0A49E06848614A6802434A60E4 +:10E6B0008A68104388606078022801D1FFF7DFFC88 +:10E6C00010BD40D90100648D01003C00EC8A0100BE +:10E6D000B80B000010000700FE300006000E0621F7 +:10E6E000154B4143585C82061448920E4271C9187A +:10E6F0004A78D206D20E027142780C231A43427035 +:10E7000042788B78920892009B079B0F3C00288BE5 +:10E7100001001A4342700278C0239A4340320270CB +:10E72000027838231A4302700278C97804239A4386 +:10E730008900194011430170012070470000D88DF5 +:10E740000100880007008FB50020029003903C0074 +:10E75000648B0100074802AA03A900910192438932 +:10E76000028903C8FFF7D4FB03980299FFF704FC62 +:10E770008FBD0000048E010008494A78002A03D1A9 +:10E78000888000208860704714235A43044BD218B5 +:10E790003C00A08B0100D2884243C88842438A6073 +:10E7A000704740D90100648D0100F8B5254E041C66 +:10E7B000307A400840003072B07A0020B0720127F1 +:10E7C000012C204D01D0FC4213D1307B38433073F3 +:10E7D00000223C00DC8B0100211C0020FFF76EFBB7 +:10E7E000631C01D13F21E973B17AA0221143B172B8 +:10E7F000317A39433172F8BD307B400840003073C4 +:10E800000122211C0120FFF759FB01200021E9739F +:10E81000B17A02223C00188C01001143B172B17A26 +:10E8200004221143B172B17A30221143B172317AAC +:10E830003943317208494A6880239A434A600A681A +:10E840001A430A60317B39433173D7E700008800EF +:10E850000700400007003C00548C01006C000700DA +:10E86000B0B50E4D0E482969F6F79EFB0D48ECF742 +:10E8700093FD0D48094C00881C34A082F1F75AFF23 +:10E880002061FAF797F8021C231C00210020ECF706 +:10E890008BFF3220E860FFF73C00908C0100A5FA66 +:10E8A000B0BD7CD9010034630100DD84010020F794 +:10E8B0000100B0B50A4D687800280ED0142308492D +:10E8C00058434018447A06E0A868E0400106090E63 +:10E8D000A878F8F776FC083CF6D53C00CC8C010013 +:10E8E000B0BD000040D90100648D0100011C144836 +:10E8F000B0B501601348027F02239A430277027F7A +:10E90000012422430277104D00290CD0012200215E +:10E910000320EFF79FFD0D49487CA0433C00088D84 +:10E9200001004874687A20436872B0BD017F2143BA +:10E930000177687A400840006872012200210320B4 +:10E94000EFF7B1FDB0BDF47401003000070088009E +:10E9500007001000070010B5074C211C00203C00E8 +:10E96000448D0100F9F756FB05480023C0560128E5 +:10E9700003DD211C0020F9F719FB10BD651A00000A +:10E98000F46B01000000020008010100021804FFFE +:10E9900082E8D78000000000008000000001000134 +:10E9A0003C00808D010000180006020305010100F3 +:10E9B00000000000000080000100FF1000FFFFFFCA +:10E9C000FFFFFF0000000000020020000100021015 +:10E9D0000006020305010100000004050607080CFB +:10E9E0000D0E3C00BC8D0100FF1415161718191BE5 +:10E9F0001C1DFF1A1113120F10FF0200FF01030963 +:10EA00000A0B0000300D02000000280E0300000079 +:10EA10001E0C00000000300D020100001E0C000161 +:10EA20000000230D3C00F88D0100020100001D0DC7 +:10EA3000020100000000FFFEFB6D000080000200EC +:10EA400000000000000000000000000000000000C6 +:10EA500000000000000000000000000000000000B6 +:10EA60000000000000003C00348E010000000000A7 +:10EA70000000000000000000000000000000000096 +:10EA80000000000000000000000000000000000086 +:10EA90000000000000000000000000000000000076 +:10EAA00000000000000000003C00708E010000002B +:10EAB0000000000000000000000000000000000056 +:10EAC0000000000000000000000000000000000046 +:10EAD0000000000000000000000000000000000036 +:10EAE000000000000000000000003C00AC8E0100AF +:10EAF0000000000000000000000000000000000016 +:10EB00000000000000000000000000000000000005 +:10EB100000000000000000000000000000000000F5 +:10EB20000000000000000000000000003C00E88E33 +:10EB300001000000000000000000000000000000D4 +:10EB400000000000000000000000000000000000C5 +:10EB500000000000000000000000000000000000B5 +:10EB600000000000000000000000000000003C0069 +:10EB7000248F0100000000000000000000000000E1 +:10EB80000000000000000000000000000000000085 +:10EB90000000000000000000000000000000000075 +:10EBA0000000000000000000000000000000000065 +:10EBB0003C00608F01000000000000000000000029 +:10EBC0000000000000000000000000000000000045 +:10EBD0000000000000000000000000000000000035 +:10EBE0000000000000000000000000000000000025 +:10EBF00000003C009C8F01000000000000000000AD +:10EC00000000000000000000000000000000000004 +:10EC100000000000000000000000000000000000F4 +:10EC200000000000000000000000000000000000E4 +:10EC3000000000003C00D88F010000000000000030 +:10EC400000000000000000000000000000000000C4 +:10EC500000000000000000000000000000000000B4 +:10EC600000000000000000000000000000000000A4 +:10EC70000000000000003C001490010000000000B3 +:10EC80000000000000000000000000000000000084 +:10EC90000000000000000000000000000000000074 +:10ECA0000000000000000000000000000000000064 +:10ECB00000000000000000003C0050900100000037 +:10ECC0000000000000000000000000000000000044 +:10ECD0000000000000000000000000000000000034 +:10ECE0000000000000000000000000000000000024 +:10ECF000000000000000000000003C008C900100BB +:10ED00000000000000000000000000000000000003 +:10ED100000000000000000000000000000000000F3 +:10ED200000000000000000000000000000000000E3 +:10ED30000000000000000000000000003C00C8903F +:10ED400001000000000000000000000000000000C2 +:10ED500000000000000000000000000000000000B3 +:10ED600000000000000000000000000000000000A3 +:10ED700000000000000000000000000000003C0057 +:10ED800004910100000000000000000000000000ED +:10ED90000000000000000000000000000000000073 +:10EDA0000000000000000000000000000000000063 +:10EDB0000000000000000000000000000000000053 +:10EDC0003C00409101000000000000000000000035 +:10EDD0000000000000000000000000000000000033 +:10EDE0000000000000000000000000000000000023 +:10EDF0000000000000000000000000000000000013 +:10EE000000003C007C9101000000000000000000B8 +:10EE100000000000000000000000000000000000F2 +:10EE200000000000000000000000000000000000E2 +:10EE300000000000000000000000000000000000D2 +:10EE4000000000003C00B89101000000000000003C +:10EE500000000000000000000000000000000000B2 +:10EE600000000000000000000000000000000000A2 +:10EE70000000000000000000000000000000000092 +:10EE80000000000000003C00F491010000000000C0 +:10EE90000000000000000000000000000000000072 +:10EEA0000000000000000000000000000000000062 +:10EEB0000000000000000000000000000000000052 +:10EEC00000000000000000003C0030920100000043 +:10EED0000000000000000000000000000000000032 +:10EEE0000000000000000000000000000000000022 +:10EEF0000000000000000000000000000000000012 +:10EF0000000000000000000000003C006C920100C6 +:10EF100000000000000000000000000000000000F1 +:10EF200000000000000000000000000000000000E1 +:10EF300000000000000000000000000000000000D1 +:10EF40000000000000000000000000003C00A8924B +:10EF500001000000000000000000000000000000B0 +:10EF600000000000000000000000000000000000A1 +:10EF70000000000000000000000000000000000091 +:10EF800000000000000000000000000000003C0045 +:10EF9000E4920100000000000000000000000000FA +:10EFA0000000000000000000000000000000000061 +:10EFB0000000000000000000000000000000000051 +:10EFC0000000000000000000000000000000000041 +:10EFD0003C00209301000000000000000000000041 +:10EFE0000000000000000000000000000000000021 +:10EFF0000000000000000000000000000000000011 +:10F000000000000000000000000000000000000000 +:10F0100000003C005C9301000000000000000000C4 +:10F0200000000000000000000000000000000000E0 +:10F0300000000000000000000000000000000000D0 +:10F0400000000000000000000000000000000000C0 +:10F05000000000003C009893010000000000000048 +:10F0600000000000000000000000000000000000A0 +:10F070000000000000000000000000000000000090 +:10F080000000000000000000000000000000000080 +:10F090000000000000003C00D493010000000000CC +:10F0A0000000000000000000000000000000000060 +:10F0B0000000000000000000000000000000000050 +:10F0C0000000000000000000000000000000000040 +:10F0D00000000000000000003C001094010000004F +:10F0E0000000000000000000000000000000000020 +:10F0F0000000000000000000000000000000000010 +:10F1000000000000000000000000000000000000FF +:10F11000000000000000000000003C004C940100D2 +:10F1200000000000000000000000000000000000DF +:10F1300000000000000000000000000000000000CF +:10F1400000000000000000000000000000000000BF +:10F150000000000000000000000000003C00889457 +:10F16000010000000000000000000000000000009E +:10F17000000000000000000000000000000000008F +:10F18000000000000000000000000000000000007F +:10F1900000000000000000000000000000003C0033 +:10F1A000C494010000000000000000000000000006 +:10F1B000000000000000000000000000000000004F +:10F1C000000000000000000000000000000000003F +:10F1D000000000000000000000000000000000002F +:10F1E0003C0000950100000000000000000000004D +:10F1F000000000000000000000000000000000000F +:10F2000000000000000000000000000000000000FE +:10F2100000000000000000000000000000000000EE +:10F2200000003C003C9501000000000000000000D0 +:10F2300000000000000000000000000000000000CE +:10F2400000000000000000000000000000000000BE +:10F2500000000000000000000000000000000000AE +:10F26000000000003C007895010000000000000054 +:10F27000000000000000000000000000000000008E +:10F28000000000000000000000000000000000007E +:10F29000000000000000000000000000000000006E +:10F2A0000000000000003C00B495010000000000D8 +:10F2B000000000000000000000000000000000004E +:10F2C000000000000000000000000000000000003E +:10F2D000000000000000000000000000000000002E +:10F2E00000000000000000003C00F095010000005C +:10F2F000000000000000000000000000000000000E +:10F3000000000000000000000000000000000000FD +:10F3100000000000000000000000000000000000ED +:10F32000000000000000000000003C002C960100DE +:10F3300000000000000000000000000000000000CD +:10F3400000000000000000000000000000000000BD +:10F3500000000000000000000000000000000000AD +:10F360000000000000000000000000003C00689663 +:10F37000010000000000000000000000000000008C +:10F38000000000000000000000000000000000007D +:10F39000000000000000000000000000000000006D +:10F3A00000000000000000000000000000003C0021 +:10F3B000A496010000000000000000000000000012 +:10F3C000000000000000000000000000000000003D +:10F3D000000000000000000000000000000000002D +:10F3E000000000000000000000000000000000001D +:10F3F0003C00E0960100000000000000000000005A +:10F4000000000000000000000000000000000000FC +:10F4100000000000000000000000000000000000EC +:10F4200000000000000000000000000000000000DC +:10F4300000003C001C9701000000000000000000DC +:10F4400000000000000000000000000000000000BC +:10F4500000000000000000000000000000000000AC +:10F46000000000000000000000000000000000009C +:10F47000000000003C005897010000000000000060 +:10F48000000000000000000000000000000000007C +:10F49000000000000000000000000000000000006C +:10F4A000000000000000000000000000000000005C +:10F4B0000000000000003C009497010000000000E4 +:10F4C000000000000000000000000000000000003C +:10F4D000000000000000000000000000000000002C +:10F4E000000000000000000000000000000000001C +:10F4F00000000000000000003C00D0970100000068 +:10F5000000000000000000000000000000000000FB +:10F5100000000000000000000000000000000000EB +:10F5200000000000000000000000000000000000DB +:10F53000000000000000000000003C000C980100EA +:10F5400000000000000000000000000000000000BB +:10F5500000000000000000000000000000000000AB +:10F56000000000000000000000000000000000009B +:10F570000000000000000000000000003C0048986F +:10F58000010000000000000000000000000000007A +:10F59000000000000000000000000000000000006B +:10F5A000000000000000000000000000000000005B +:10F5B00000000000000000000000000000003C000F +:10F5C000849801000000000000000000000000001E +:10F5D000000000000000000000000000000000002B +:10F5E000000000000000000000000000000000001B +:10F5F000000000000000000000000000000000000B +:10F600003C00C09801000000000000000000000065 +:10F6100000000000000000000000000000000000EA +:10F6200000000000000000000000000000000000DA +:10F6300000000000000000000000000000000000CA +:10F6400000003C00FC9801000000000000000000E9 +:10F6500000000000000000000000000000000000AA +:10F66000000000000000000000000000000000009A +:10F67000000000000000000000000000000000008A +:10F68000000000003C00389901000000000000006C +:10F69000000000000000000000000000000000006A +:10F6A000000000000000000000000000000000005A +:10F6B000000000000000000000000000000000004A +:10F6C0000000000000003C007499010000000000F0 +:10F6D000000000000000000000000000000000002A +:10F6E000000000000000000000000000000000001A +:10F6F000000000000000000000000000000000000A +:10F7000000000000000000003C00B0990100000073 +:10F7100000000000000000000000000000000000E9 +:10F7200000000000000000000000000000000000D9 +:10F7300000000000000000000000000000000000C9 +:10F74000000000000000000000003C00EC990100F7 +:10F7500000000000000000000000000000000000A9 +:10F760000000000000000000000000000000000099 +:10F770000000000000000000000000000000000089 +:10F780000000000000000000000000003C00289A7B +:10F790000100000000000000000000000000000068 +:10F7A0000000000000000000000000000000000059 +:10F7B0000000000000000000000000000000000049 +:10F7C00000000000000000000000000000003C00FD +:10F7D000649A01000000000000000000000000002A +:10F7E0000000000000000000000000000000000019 +:10F7F0000000000000000000000000000000000009 +:10F8000000000000000000000000000000000000F8 +:10F810003C00A09A01000000000000000000000071 +:10F8200000000000000000000000000000000000D8 +:10F8300000000000000000000000000000000000C8 +:10F8400000000000000000000000000000000000B8 +:10F8500000003C00DC9A01000000000000000000F5 +:10F860000000000000000000000000000000000098 +:10F870000000000000000000000000000000000088 +:10F880000000000000000000000000000000000078 +:10F89000000000003C00189B010000000000000078 +:10F8A0000000000000000000000000000000000058 +:10F8B0000000000000000000000000000000000048 +:10F8C0000000000000000000000000000000000038 +:10F8D0000000000000003C00549B010000000000FC +:10F8E0000000000000000000000000000000000018 +:10F8F0000000000000000000000000000000000008 +:10F9000000000000000000000000000000000000F7 +:10F9100000000000000000003C00909B010000007F +:10F9200000000000000000000000000000000000D7 +:10F9300000000000000000000000000000000000C7 +:10F9400000000000000000000000000000000000B7 +:10F95000000000000000000000003C00CC9B010003 +:10F960000000000000000000000000000000000097 +:10F970000000000000000000000000000000000087 +:10F980000000000000000000000000000000000077 +:10F990000000000000000000000000003C00089C87 +:10F9A0000100000000000000000000000000000056 +:10F9B0000000000000000000000000000000000047 +:10F9C0000000000000000000000000000000000037 +:10F9D00000000000000000000000000000003C00EB +:10F9E000449C010000000000000000000000000036 +:10F9F0000000000000000000000000000000000007 +:10FA000000000000000000000000000000000000F6 +:10FA100000000000000000000000000000000000E6 +:10FA20003C00809C0100000000000000000000007D +:10FA300000000000000000000000000000000000C6 +:10FA400000000000000000000000000000000000B6 +:10FA500000000000000000000000000000000000A6 +:10FA600000003C00BC9C0100000000000000000001 +:10FA70000000000000000000000000000000000086 +:10FA80000000000000000000000000000000000076 +:10FA90000000000000000000000000000000000066 +:10FAA000000000003C00F89C010000000000000085 +:10FAB0000000000000000000000000000000000046 +:10FAC0000000000000000000000000000000000036 +:10FAD0000000000000000000000000000000000026 +:10FAE0000000000000003C00349D01000000000008 +:10FAF0000000000000000000000000000000000006 +:10FB000000000000000000000000000000000000F5 +:10FB100000000000000000000000000000000000E5 +:10FB200000000000000000003C00709D010000008B +:10FB300000000000000000000000000000000000C5 +:10FB400000000000000000000000000000000000B5 +:10FB500000000000000000000000000000000000A5 +:10FB6000000000000000000000003C00AC9D01000F +:10FB70000000000000000000000000000000000085 +:10FB80000000000000000000000000000000000075 +:10FB90000000000000000000000000000000000065 +:10FBA0000000000000000000000000003C00E89D94 +:10FBB0000100000000000000000000000000000044 +:10FBC0000000000000000000000000000000000035 +:10FBD0000000000000000000000000000000000025 +:10FBE00000000000000000000000000000003C00D9 +:10FBF000249E010000000000000000000000000042 +:10FC000000000000000000000000000000000000F4 +:10FC100000000000000000000000000000000000E4 +:10FC200000000000000000000000000000000000D4 +:10FC30003C00609E01000000000000000000000089 +:10FC400000000000000000000000000000000000B4 +:10FC500000000000000000000000000000000000A4 +:10FC60000000000000000000000000000000000094 +:10FC700000003C009C9E010000000000000000000D +:10FC80000000000000000000000000000000000074 +:10FC90000000000000000000000000000000000064 +:10FCA0000000000000000000000000000000000054 +:10FCB000000000003C00D89E010000000000000091 +:10FCC0000000000000000000000000000000000034 +:10FCD0000000000000000000000000000000000024 +:10FCE0000000000000000000000000000000000014 +:10FCF0000000000000003C00149F01000000000014 +:10FD000000000000000000000000000000000000F3 +:10FD100000000000000000000000000000000000E3 +:10FD200000000000000000000000000000000000D3 +:10FD300000000000000000003C00509F0100000097 +:10FD400000000000000000000000000000000000B3 +:10FD500000000000000000000000000000000000A3 +:10FD60000000000000000000000000000000000093 +:10FD7000000000000000000000003C008C9F01001B +:10FD80000000000000000000000000000000000073 +:10FD90000000000000000000000000000000000063 +:10FDA0000000000000000000000000000000000053 +:10FDB0000000000000000000000000003C00C89FA0 +:10FDC0000100000000000000000000000000000032 +:10FDD0000000000000000000000000000000000023 +:10FDE0000000000000000000000000000000000013 +:10FDF00000000000000000000000000000003C00C7 +:10FE000004A001000000000000000000000000004D +:10FE100000000000000000000000000000000000E2 +:10FE200000000000000000000000000000000000D2 +:10FE300000000000000000000000000000000000C2 +:10FE40003C0040A001000000000000000000000095 +:10FE500000000000000000000000000000000000A2 +:10FE60000000000000000000000000000000000092 +:10FE70000000000000000000000000000000000082 +:10FE800000003C007CA00100000000000000000019 +:10FE90000000000000000000000000000000000062 +:10FEA0000000000000000000000000000000000052 +:10FEB0000000000000000000000000000000000042 +:10FEC000000000003C00B8A001000000000000009D +:10FED0000000000000000000000000000000000022 +:10FEE0000000000000000000000000000000000012 +:10FEF0000000000000000000000000000000000002 +:10FF00000000000000003C00F4A001000000000020 +:10FF100000000000000000000000000000000000E1 +:10FF200000000000000000000000000000000000D1 +:10FF300000000000000000000000000000000000C1 +:10FF400000000000000000003C0030A101000000A3 +:10FF500000000000000000000000000000000000A1 +:10FF60000000000000000000000000000000000091 +:10FF70000000000000000000000000000000000081 +:10FF8000000000000000000000003C006CA1010027 +:10FF90000000000000000000000000000000000061 +:10FFA0000000000000000000000000000000000051 +:10FFB0000000000000000000000000000000000041 +:10FFC0000000000000000000000000003C00A8A1AC +:10FFD0000100000000000000000000000000000020 +:10FFE0000000000000000000000000000000000011 +:10FFF0000000000000000000000000000000000001 +:02000004800278 +:1000000000000000000000000000000000003C00B4 +:10001000E4A101000000000000000000000000005A +:1000200000000000000000000000000000000000D0 +:1000300000000000000000000000000000000000C0 +:1000400000000000000000000000000000000000B0 +:100050003C0020A2010000000000000000000000A1 +:100060000000000000000000000000000000000090 +:100070000000000000000000000000000000000080 +:100080000000000000000000000000000000000070 +:1000900000003C005CA20100000000000000000025 +:1000A0000000000000000000000000000000000050 +:1000B0000000000000000000000000000000000040 +:1000C0000000000000000000000000000000000030 +:1000D000000000003C0098A20100000000000000A9 +:1000E0000000000000000000000000000000000010 +:1000F0000000000000000000000000000000000000 +:1001000000000000000000000000000000000000EF +:100110000000000000003C00D4A20100000000002C +:1001200000000000000000000000000000000000CF +:1001300000000000000000000000000000000000BF +:1001400000000000000000000000000000000000AF +:1001500000000000000000003C0010A301000000AF +:10016000000000000000000000000000000000008F +:10017000000000000000000000000000000000007F +:10018000000000000000000000000000000000006F +:10019000000000000000000000003C004CA3010033 +:1001A000000000000000000000000000000000004F +:1001B000000000000000000000000000000000003F +:1001C000000000000000000000000000000000002F +:1001D0000000000000000000000000003C0088A3B8 +:1001E000010000000000000000000000000000000E +:1001F00000000000000000000000000000000000FF +:1002000000000000000000000000000000000000EE +:1002100000000000000000000000000000003C00A2 +:10022000C4A3010000000000000000000000000066 +:1002300000000000000000000000000000000000BE +:1002400000000000000000000000000000000000AE +:10025000000000000000000000000000000000009E +:100260003C0000A4010000000000000000000000AD +:10027000000000000000000000000000000000007E +:10028000000000000000000000000000000000006E +:10029000000000000000000000000000000000005E +:1002A00000003C003CA40100000000000000000031 +:1002B000000000000000000000000000000000003E +:1002C000000000000000000000000000000000002E +:1002D000000000000000000000000000000000001E +:1002E000000000003C0078A40100000000000000B5 +:1002F00000000000000000000000000000000000FE +:1003000000000000000000000000000000000000ED +:1003100000000000000000000000000000000000DD +:100320000000000000003C00B4A401000000000038 +:1003300000000000000000000000000000000000BD +:1003400000000000000000000000000000000000AD +:10035000000000000000000000000000000000009D +:1003600000000000000000003C00F0A401000000BC +:10037000000000000000000000000000000000007D +:10038000000000000000000000000000000000006D +:10039000000000000000000000000000000000005D +:1003A000000000000000000000003C002CA501003F +:1003B000000000000000000000000000000000003D +:1003C000000000000000000000000000000000002D +:1003D000000000000000000000000000000000001D +:1003E0000000000000000000000000003C0068A5C4 +:1003F00001000000000000000000000000000000FC +:1004000000000000000000000000000000000000EC +:1004100000000000000000000000000000000000DC +:1004200000000000000000000000000000003C0090 +:10043000A4A5010000000000000000000000000072 +:1004400000000000000000000000000000000000AC +:10045000000000000000000000000000000000009C +:10046000000000000000000000000000000000008C +:100470003C00E0A5010000000000000000000000BA +:10048000000000000000000000000000000000006C +:10049000000000000000000000000000000000005C +:1004A000000000000000000000000000000000004C +:1004B00000003C001CA6010000000000000000003D +:1004C000000000000000000000000000000000002C +:1004D000000000000000000000000000000000001C +:1004E000000000000000000000000000000000000C +:1004F000000000003C0058A60100000000000000C1 +:1005000000000000000000000000000000000000EB +:1005100000000000000000000000000000000000DB +:1005200000000000000000000000000000000000CB +:100530000000000000003C0094A601000000000044 +:1005400000000000000000000000000000000000AB +:10055000000000000000000000000000000000009B +:10056000000000000000000000000000000000008B +:1005700000000000000000003C00D0A601000000C8 +:10058000000000000000000000000000000000006B +:10059000000000000000000000000000000000005B +:1005A000000000000000000000000000000000004B +:1005B000000000000000000000003C000CA701004B +:1005C000000000000000000000000000000000002B +:1005D000000000000000000000000000000000001B +:1005E000000000000000000000000000000000000B +:1005F0000000000000000000000000003C0048A7D0 +:1006000001000000000000000000000000000000E9 +:1006100000000000000000000000000000000000DA +:1006200000000000000000000000000000000000CA +:1006300000000000000000000000000000003C007E +:1006400084A701000000000000000000000000007E +:10065000000000000000000000000000000000009A +:10066000000000000000000000000000000000008A +:10067000000000000000000000000000000000007A +:100680003C00C0A7010000000000000000000000C6 +:10069000000000000000000000000000000000005A +:1006A000000000000000000000000000000000004A +:1006B000000000000000000000000000000000003A +:1006C00000003C00FCA7010000000000000000004A +:1006D000000000000000000000000000000000001A +:1006E000000000000000000000000000000000000A +:1006F00000000000000000000000000000000000FA +:10070000000000003C0038A80100000000000000CC +:1007100000000000000000000000000000000000D9 +:1007200000000000000000000000000000000000C9 +:1007300000000000000000000000000000000000B9 +:100740000000000000003C0074A801000000000050 +:100750000000000000000000000000000000000099 +:100760000000000000000000000000000000000089 +:100770000000000000000000000000000000000079 +:1007800000000000000000003C00B0A801000000D4 +:100790000000000000000000000000000000000059 +:1007A0000000000000000000000000000000000049 +:1007B0000000000000000000000000000000000039 +:1007C000000000000000000000003C00ECA8010058 +:1007D0000000000000000000000000000000000019 +:1007E0000000000000000000000000000000000009 +:1007F00000000000000000000000000000000000F9 +:100800000000000000000000000000003C0028A9DB +:1008100001000000000000000000000000000000D7 +:1008200000000000000000000000000000000000C8 +:1008300000000000000000000000000000000000B8 +:1008400000000000000000000000000000003C006C +:1008500064A901000000000000000000000000008A +:100860000000000000000000000000000000000088 +:100870000000000000000000000000000000000078 +:100880000000000000000000000000000000000068 +:100890003C00A0A9010000000000000000000000D2 +:1008A0000000000000000000000000000000000048 +:1008B0000000000000000000000000000000000038 +:1008C0000000000000000000000000000000000028 +:1008D00000003C00DCA90100000000000000000056 +:1008E0000000000000000000000000000000000008 +:1008F00000000000000000000000000000000000F8 +:1009000000000000000000000000000000000000E7 +:10091000000000003C0018AA0100000000000000D8 +:1009200000000000000000000000000000000000C7 +:1009300000000000000000000000000000000000B7 +:1009400000000000000000000000000000000000A7 +:100950000000000000003C0054AA0100000000005C +:100960000000000000000000000000000000000087 +:100970000000000000000000000000000000000077 +:100980000000000000000000000000000000000067 +:1009900000000000000000003C0090AA01000000E0 +:1009A0000000000000000000000000000000000047 +:1009B0000000000000000000000000000000000037 +:1009C0000000000000000000000000000000000027 +:1009D000000000000000000000003C00CCAA010064 +:1009E0000000000000000000000000000000000007 +:1009F00000000000000000000000000000000000F7 +:100A000000000000000000000000000000000000E6 +:100A10000000000000000000000000003C0008ABE7 +:100A200001000000000000000000000000000000C5 +:100A300000000000000000000000000000000000B6 +:100A400000000000000000000000000000000000A6 +:100A500000000000000000000000000000003C005A +:100A600044AB010000000000000000000000000096 +:100A70000000000000000000000000000000000076 +:100A80000000000000000000000000000000000066 +:100A90000000000000000000000000000000000056 +:100AA0003C0080AB010000000000000000000000DE +:100AB0000000000000000000000000000000000036 +:100AC0000000000000000000000000000000000026 +:100AD0000000000000000000000000000000000016 +:100AE00000003C00BCAB0100000000000000000062 +:100AF00000000000000000000000000000000000F6 +:100B000000000000000000000000000000000000E5 +:100B100000000000000000000000000000000000D5 +:100B2000000000003C00F8AB0100000000000000E5 +:100B300000000000000000000000000000000000B5 +:100B400000000000000000000000000000000000A5 +:100B50000000000000000000000000000000000095 +:100B60000000000000003C0034AC01000000000068 +:100B70000000000000000000000000000000000075 +:100B80000000000000000000000000000000000065 +:100B90000000000000000000000000000000000055 +:100BA00000000000000000003C0070AC01000000EC +:100BB0000000000000000000000000000000000035 +:100BC0000000000000000000000000000000000025 +:100BD0000000000000000000000000000000000015 +:100BE000000000000000000000003C00ACAC010070 +:100BF00000000000000000000000000000000000F5 +:100C000000000000000000000000000000000000E4 +:100C100000000000000000000000000000000000D4 +:100C20000000000000000000000000003C00E8ACF4 +:100C300001000000000000000000000000000000B3 +:100C400000000000000000000000000000000000A4 +:100C50000000000000000000000000000000000094 +:100C600000000000000000000000000000003C0048 +:100C700024AD0100000000000000000000000000A2 +:100C80000000000000000000000000000000000064 +:100C90000000000000000000000000000000000054 +:100CA0000000000000000000000000000000000044 +:100CB0003C0060AD010000000000000000000000EA +:100CC0000000000000000000000000000000000024 +:100CD0000000000000000000000000000000000014 +:100CE0000000000000000000000000000000000004 +:100CF00000003C009CAD010000000000000000006E +:100D000000000000000000000000000000000000E3 +:100D100000000000000000000000000000000000D3 +:100D200000000000000000000000000000000000C3 +:100D3000000000003C00D8AD0100000000000000F1 +:100D400000000000000000000000000000000000A3 +:100D50000000000000000000000000000000000093 +:100D60000000000000000000000000000000000083 +:100D70000000000000003C0014AE01000000000074 +:100D80000000000000000000000000000000000063 +:100D90000000000000000000000000000000000053 +:100DA0000000000000000000000000000000000043 +:100DB00000000000000000003C0050AE01000000F8 +:100DC0000000000000000000000000000000000023 +:100DD0000000000000000000000000000000000013 +:100DE0000000000000000000000000000000000003 +:100DF000000000000000000000003C008CAE01007C +:100E000000000000000000000000000000000000E2 +:100E100000000000000000000000000000000000D2 +:100E200000000000000000000000000000000000C2 +:100E30000000000000000000000000003C00C8AE00 +:100E400001000000000000000000000000000000A1 +:100E50000000000000000000000000000000000092 +:100E60000000000000000000000000000000000082 +:100E700000000000000000000000000000003C0036 +:100E800004AF0100000000000000000000000000AE +:100E90000000000000000000000000000000000052 +:100EA0000000000000000000000000000000000042 +:100EB0000000000000000000000000000000000032 +:100EC0003C0040AF010000000000000000000000F6 +:100ED0000000000000000000000000000000000012 +:100EE0000000000000000000000000000000000002 +:100EF00000000000000000000000000000000000F2 +:100F000000003C007CAF0100000000000000000079 +:100F100000000000000000000000000000000000D1 +:100F200000000000000000000000000000000000C1 +:100F300000000000000000000000000000000000B1 +:100F4000000000003C00B8AF0100000000000000FD +:100F50000000000000000000000000000000000091 +:100F60000000000000000000000000000000000081 +:100F70000000000000000000000000000000000071 +:100F80000000000000003C00F4AF01000000000081 +:100F90000000000000000000000000000000000051 +:100FA0000000000000000000000000000000000041 +:100FB0000000000000000000000000000000000031 +:100FC00000000000000000003C0030B00100000004 +:100FD0000000000000000000000000000000000011 +:100FE0000000000000000000000000000000000001 +:100FF00000000000000000000000000000000000F1 +:10100000000000000000000000003C006CB0010087 +:1010100000000000000000000000000000000000D0 +:1010200000000000000000000000000000000000C0 +:1010300000000000000000000000000000000000B0 +:101040000000000000000000000000003C00A8B00C +:10105000010000000000000000000000000000008F +:101060000000000000000000000000000000000080 +:101070000000000000000000000000000000000070 +:1010800000000000000000000000000000003C0024 +:10109000E4B00100000000000000000000000000BB +:1010A0000000000000000000000000000000000040 +:1010B0000000000000000000000000000000000030 +:1010C0000000000000000000000000000000000020 +:1010D0003C0020B101000000000000000000000002 +:1010E0000000000000000000000000000000000000 +:1010F00000000000000000000000000000000000F0 +:1011000000000000000000000000000000000000DF +:1011100000003C005CB10100000000000000000085 +:1011200000000000000000000000000000000000BF +:1011300000000000000000000000000000000000AF +:10114000000000000000000000000000000000009F +:10115000000000003C0098B1010000000000000009 +:10116000000000000000000000000000000000007F +:10117000000000000000000000000000000000006F +:10118000000000000000000000000000000000005F +:101190000000000000003C00D4B10100000000008D +:1011A000000000000000000000000000000000003F +:1011B000000000000000000000000000000000002F +:1011C000000000000000000000000000000000001F +:1011D00000000000000000003C0010B20100000010 +:1011E00000000000000000000000000000000000FF +:1011F00000000000000000000000000000000000EF +:1012000000000000000000000000000000000000DE +:10121000000000000000000000003C004CB2010093 +:1012200000000000000000000000000000000000BE +:1012300000000000000000000000000000000000AE +:10124000000000000000000000000000000000009E +:101250000000000000000000000000003C0088B218 +:10126000010000000000000000000000000000007D +:10127000000000000000000000000000000000006E +:10128000000000000000000000000000000000005E +:1012900000000000000000000000000000003C0012 +:1012A000C4B20100000000000000000000000000C7 +:1012B000000000000000000000000000000000002E +:1012C000000000000000000000000000000000001E +:1012D000000000000000000000000000000000000E +:1012E0003C0000B30100000000000000000000000E +:1012F00000000000000000000000000000000000EE +:1013000000000000000000000000000000000000DD +:1013100000000000000000000000000000000000CD +:1013200000003C003CB30100000000000000000091 +:1013300000000000000000000000000000000000AD +:10134000000000000000000000000000000000009D +:10135000000000000000000000000000000000008D +:10136000000000003C0078B3010000000000000015 +:10137000000000000000000000000000000000006D +:10138000000000000000000000000000000000005D +:10139000000000000000000000000000000000004D +:1013A0000000000000003C00B4B301000000000099 +:1013B000000000000000000000000000000000002D +:1013C000000000000000000000000000000000001D +:1013D000000000000000000000000000000000000D +:1013E00000000000000000003C00F0B3010000001D +:1013F00000000000000000000000000000000000ED +:1014000000000000000000000000000000000000DC +:1014100000000000000000000000000000000000CC +:10142000000000000000000000003C002CB401009F +:1014300000000000000000000000000000000000AC +:10144000000000000000000000000000000000009C +:10145000000000000000000000000000000000008C +:101460000000000000000000000000003C0068B424 +:10147000010000000000000000000000000000006B +:10148000000000000000000000000000000000005C +:10149000000000000000000000000000000000004C +:1014A00000000000000000000000000000003C0000 +:1014B000A4B40100000000000000000000000000D3 +:1014C000000000000000000000000000000000001C +:1014D000000000000000000000000000000000000C +:1014E00000000000000000000000000000000000FC +:1014F0003C00E0B40100000000000000000000001B +:1015000000000000000000000000000000000000DB +:1015100000000000000000000000000000000000CB +:1015200000000000000000000000000000000000BB +:1015300000003C001CB5010000000000000000009D +:10154000000000000000000000000000000000009B +:10155000000000000000000000000000000000008B +:10156000000000000000000000000000000000007B +:10157000000000003C0058B5010000000000000021 +:10158000000000000000000000000000000000005B +:10159000000000000000000000000000000000004B +:1015A000000000000000000000000000000000003B +:1015B0000000000000003C0094B5010000000000A5 +:1015C000000000000000000000000000000000001B +:1015D000000000000000000000000000000000000B +:1015E00000000000000000000000000000000000FB +:1015F00000000000000000003C00D0B50100000029 +:1016000000000000000000000000000000000000DA +:1016100000000000000000000000000000000000CA +:1016200000000000000000000000000000000000BA +:10163000000000000000000000003C000CB60100AB +:10164000000000000000000000000000000000009A +:10165000000000000000000000000000000000008A +:10166000000000000000000000000000000000007A +:101670000000000000000000000000003C0048B630 +:101680000100000000000000000000000000000059 +:10169000000000000000000000000000000000004A +:1016A000000000000000000000000000000000003A +:1016B00000000000000000000000000000003C00EE +:1016C00084B60100000000000000000000000000DF +:1016D000000000000000000000000000000000000A +:1016E00000000000000000000000000000000000FA +:1016F00000000000000000000000000000000000EA +:101700003C00C0B601000000000000000000000026 +:1017100000000000000000000000000000000000C9 +:1017200000000000000000000000000000000000B9 +:1017300000000000000000000000000000000000A9 +:1017400000003C00FCB601000000000000000000AA +:101750000000000000000000000000000000000089 +:101760000000000000000000000000000000000079 +:101770000000000000000000000000000000000069 +:10178000000000003C0038B701000000000000002D +:101790000000000000000000000000000000000049 +:1017A0000000000000000000000000000000000039 +:1017B0000000000000000000000000000000000029 +:1017C0000000000000003C0074B7010000000000B1 +:1017D0000000000000000000000000000000000009 +:1017E00000000000000000000000000000000000F9 +:1017F00000000000000000000000000000000000E9 +:1018000000000000000000003C00B0B70100000034 +:1018100000000000000000000000000000000000C8 +:1018200000000000000000000000000000000000B8 +:1018300000000000000000000000000000000000A8 +:10184000000000000000000000003C00ECB70100B8 +:101850000000000000000000000000000000000088 +:101860000000000000000000000000000000000078 +:101870000000000000000000000000000000000068 +:101880000000000000000000000000003C0028B83C +:101890000100000000000000000000000000000047 +:1018A0000000000000000000000000000000000038 +:1018B0000000000000000000000000000000000028 +:1018C00000000000000000000000000000003C00DC +:1018D00064B80100000000000000000000000000EB +:1018E00000000000000000000000000000000000F8 +:1018F00000000000000000000000000000000000E8 +:1019000000000000000000000000000000000000D7 +:101910003C00A0B801000000000000000000000032 +:1019200000000000000000000000000000000000B7 +:1019300000000000000000000000000000000000A7 +:101940000000000000000000000000000000000097 +:1019500000003C00DCB801000000000000000000B6 +:101960000000000000000000000000000000000077 +:101970000000000000000000000000000000000067 +:101980000000000000000000000000000000000057 +:10199000000000003C0018B9010000000000000039 +:1019A0000000000000000000000000000000000037 +:1019B0000000000000000000000000000000000027 +:1019C0000000000000000000000000000000000017 +:1019D0000000000000003C0054B9010000000000BD +:1019E00000000000000000000000000000000000F7 +:1019F00000000000000000000000000000000000E7 +:101A000000000000000000000000000000000000D6 +:101A100000000000000000003C0090B90100000040 +:101A200000000000000000000000000000000000B6 +:101A300000000000000000000000000000000000A6 +:101A40000000000000000000000000000000000096 +:101A5000000000000000000000003C00CCB90100C4 +:101A60000000000000000000000000000000000076 +:101A70000000000000000000000000000000000066 +:101A80000000000000000000000000000000000056 +:101A90000000000000000000000000003C0008BA48 +:101AA0000100000000000000000000000000000035 +:101AB0000000000000000000000000000000000026 +:101AC0000000000000000000000000000000000016 +:101AD00000000000000000000000000000003C00CA +:101AE00044BA0100000000000000000000000000F7 +:101AF00000000000000000000000000000000000E6 +:101B000000000000000000000000000000000000D5 +:101B100000000000000000000000000000000000C5 +:101B20003C0080BA0100000000000000000000003E +:101B300000000000000000000000000000000000A5 +:101B40000000000000000000000000000000000095 +:101B50000000000000000000000000000000000085 +:101B600000003C00BCBA01000000000000000000C2 +:101B70000000000000000000000000000000000065 +:101B80000000000000000000000000000000000055 +:101B90000000000000000000000000000000000045 +:101BA000000000003C00F8BA010000000000000046 +:101BB0000000000000000000000000000000000025 +:101BC0000000000000000000000000000000000015 +:101BD0000000000000000000000000000000000005 +:101BE0000000000000003C0034BB010000000000C9 +:101BF00000000000000000000000000000000000E5 +:101C000000000000000000000000000000000000D4 +:101C100000000000000000000000000000000000C4 +:101C200000000000000000003C0070BB010000004C +:101C300000000000000000000000000000000000A4 +:101C40000000000000000000000000000000000094 +:101C50000000000000000000000000000000000084 +:101C6000000000000000000000003C00ACBB0100D0 +:101C70000000000000000000000000000000000064 +:101C80000000000000000000000000000000000054 +:101C90000000000000000000000000000000000044 +:101CA0000000000000000000000000003C00E8BB55 +:101CB0000100000000000000000000000000000023 +:101CC0000000000000000000000000000000000014 +:101CD0000000000000000000000000000000000004 +:101CE00000000000000000000000000000003C00B8 +:101CF00024BC010000000000000000000000000003 +:101D000000000000000000000000000000000000D3 +:101D100000000000000000000000000000000000C3 +:101D200000000000000000000000000000000000B3 +:101D30003C0060BC0100000000000000000000004A +:101D40000000000000000000000000000000000093 +:101D50000000000000000000000000000000000083 +:101D60000000000000000000000000000000000073 +:101D700000003C009CBC01000000000000000000CE +:101D80000000000000000000000000000000000053 +:101D90000000000000000000000000000000000043 +:101DA0000000000000000000000000000000000033 +:101DB000000000003C00D8BC010000000000000052 +:101DC0000000000000000000000000000000000013 +:101DD0000000000000000000000000000000000003 +:101DE00000000000000000000000000000000000F3 +:101DF0000000000000003C0014BD010000000000D5 +:101E000000000000000000000000000000000000D2 +:101E100000000000000000000000000000000000C2 +:101E200000000000000000000000000000000000B2 +:101E300000000000000000003C0050BD0100000058 +:101E40000000000000000000000000000000000092 +:101E50000000000000000000000000000000000082 +:101E60000000000000000000000000000000000072 +:101E7000000000000000000000003C008CBD0100DC +:101E80000000000000000000000000000000000052 +:101E90000000000000000000000000000000000042 +:101EA0000000000000000000000000000000000032 +:101EB0000000000000000000000000003C00C8BD61 +:101EC0000100000000000000000000000000000011 +:101ED0000000000000000000000000000000000002 +:101EE00000000000000000000000000000000000F2 +:101EF00000000000000000000000000000003C00A6 +:101F000004BE01000000000000000000000000000E +:101F100000000000000000000000000000000000C1 +:101F200000000000000000000000000000000000B1 +:101F300000000000000000000000000000000000A1 +:101F40003C0040BE01000000000000000000000056 +:101F50000000000000000000000000000000000081 +:101F60000000000000000000000000000000000071 +:101F70000000000000000000000000000000000061 +:101F800000003C007CBE01000000000000000000DA +:101F90000000000000000000000000000000000041 +:101FA0000000000000000000000000000000000031 +:101FB0000000000000000000000000000000000021 +:101FC000000000003C00B8BE01000000000000005E +:101FD0000000000000000000000000000000000001 +:101FE00000000000000000000000000000000000F1 +:101FF00000000000000000000000000000000000E1 +:102000000000000000003C00F4BE010000000000E1 +:1020100000000000000000000000000000000000C0 +:1020200000000000000000000000000000000000B0 +:1020300000000000000000000000000000000000A0 +:1020400000000000000000003C0030BF0100000064 +:102050000000000000000000000000000000000080 +:102060000000000000000000000000000000000070 +:102070000000000000000000000000000000000060 +:10208000000000000000000000003C006CBF0100E8 +:102090000000000000000000000000000000000040 +:1020A0000000000000000000000000000000000030 +:1020B0000000000000000000000000000000000020 +:1020C0000000000000000000000000003C00A8BF6D +:1020D00001000000000000000000000000000000FF +:1020E00000000000000000000000000000000000F0 +:1020F00000000000000000000000000000000000E0 +:1021000000000000000000000000000000003C0093 +:10211000E4BF01000000000000000000000000001B +:1021200000000000000000000000000000000000AF +:10213000000000000000000000000000000000009F +:10214000000000000000000000000000000000008F +:102150003C0020C001000000000000000000000062 +:10216000000000000000000000000000000000006F +:10217000000000000000000000000000000000005F +:10218000000000000000000000000000000000004F +:1021900000003C005CC001000000000000000000E6 +:1021A000000000000000000000000000000000002F +:1021B000000000000000000000000000000000001F +:1021C000000000000000000000000000000000000F +:1021D000000000003C0098C001000000000000006A +:1021E00000000000000000000000000000000000EF +:1021F00000000000000000000000000000000000DF +:1022000000000000000000000000000000000000CE +:102210000000000000003C00D4C0010000000000ED +:1022200000000000000000000000000000000000AE +:10223000000000000000000000000000000000009E +:10224000000000000000000000000000000000008E +:1022500000000000000000003C0010C10100000070 +:10226000000000000000000000000000000000006E +:10227000000000000000000000000000000000005E +:10228000000000000000000000000000000000004E +:10229000000000000000000000003C004CC10100F4 +:1022A000000000000000000000000000000000002E +:1022B000000000000000000000000000000000001E +:1022C000000000000000000000000000000000000E +:1022D0000000000000000000000000003C0088C179 +:1022E00001000000000000000000000000000000ED +:1022F00000000000000000000000000000000000DE +:1023000000000000000000000000000000000000CD +:1023100000000000000000000000000000003C0081 +:10232000C4C1010000000000000000000000000027 +:10233000000000000000000000000000000000009D +:10234000000000000000000000000000000000008D +:10235000000000000000000000000000000000007D +:102360003C0000C20100000000000000000000006E +:10237000000000000000000000000000000000005D +:10238000000000000000000000000000000000004D +:10239000000000000000000000000000000000003D +:1023A00000003C003CC201000000000000000000F2 +:1023B000000000000000000000000000000000001D +:1023C000000000000000000000000000000000000D +:1023D00000000000000000000000000000000000FD +:1023E000000000003C0078C2010000000000000076 +:1023F00000000000000000000000000000000000DD +:1024000000000000000000000000000000000000CC +:1024100000000000000000000000000000000000BC +:102420000000000000003C00B4C2010000000000F9 +:10243000000000000000000000000000000000009C +:10244000000000000000000000000000000000008C +:10245000000000000000000000000000000000007C +:1024600000000000000000003C00F0C2010000007D +:10247000000000000000000000000000000000005C +:10248000000000000000000000000000000000004C +:10249000000000000000000000000000000000003C +:1024A000000000000000000000003C002CC3010000 +:1024B000000000000000000000000000000000001C +:1024C000000000000000000000000000000000000C +:1024D00000000000000000000000000000000000FC +:1024E0000000000000000000000000003C0068C385 +:1024F00001000000000000000000000000000000DB +:1025000000000000000000000000000000000000CB +:1025100000000000000000000000000000000000BB +:1025200000000000000000000000000000003C006F +:10253000A4C3010000000000000000000000000033 +:10254000000000000000000000000000000000008B +:10255000000000000000000000000000000000007B +:10256000000000000000000000000000000000006B +:102570003C00E0C30100000000000000000000007B +:10258000000000000000000000000000000000004B +:10259000000000000000000000000000000000003B +:1025A000000000000000000000000000000000002B +:1025B00000003C001CC401000000000000000000FE +:1025C000000000000000000000000000000000000B +:1025D00000000000000000000000000000000000FB +:1025E00000000000000000000000000000000000EB +:1025F000000000003C0058C4010000000000000082 +:1026000000000000000000000000000000000000CA +:1026100000000000000000000000000000000000BA +:1026200000000000000000000000000000000000AA +:102630000000000000003C0094C401000000000005 +:10264000000000000000000000000000000000008A +:10265000000000000000000000000000000000007A +:10266000000000000000000000000000000000006A +:1026700000000000000000003C00D0C40100000089 +:10268000000000000000000000000000000000004A +:10269000000000000000000000000000000000003A +:1026A000000000000000000000000000000000002A +:1026B000000000000000000000003C000CC501000C +:1026C000000000000000000000000000000000000A +:1026D00000000000000000000000000000000000FA +:1026E00000000000000000000000000000000000EA +:1026F0000000000000000000000000003C0048C591 +:1027000001000000000000000000000000000000C8 +:1027100000000000000000000000000000000000B9 +:1027200000000000000000000000000000000000A9 +:1027300000000000000000000000000000003C005D +:1027400084C501000000000000000000000000003F +:102750000000000000000000000000000000000079 +:102760000000000000000000000000000000000069 +:102770000000000000000000000000000000000059 +:102780003C00C0C501000000000000000000000087 +:102790000000000000000000000000000000000039 +:1027A0000000000000000000000000000000000029 +:1027B0000000000000000000000000000000000019 +:1027C00000003C00FCC5010000000000000000000B +:1027D00000000000000000000000000000000000F9 +:1027E00000000000000000000000000000000000E9 +:1027F00000000000000000000000000000000000D9 +:10280000000000003C0038C601000000000000008D +:1028100000000000000000000000000000000000B8 +:1028200000000000000000000000000000000000A8 +:102830000000000000000000000000000000000098 +:102840000000000000003C0074C601000000000011 +:102850000000000000000000000000000000000078 +:102860000000000000000000000000000000000068 +:102870000000000000000000000000000000000058 +:1028800000000000000000003C00B0C60100000095 +:102890000000000000000000000000000000000038 +:1028A0000000000000000000000000000000000028 +:1028B0000000000000000000000000000000000018 +:1028C000000000000000000000003C00ECC6010019 +:1028D00000000000000000000000000000000000F8 +:1028E00000000000000000000000000000000000E8 +:1028F00000000000000000000000000000000000D8 +:102900000000000000000000000000003C0028C79C +:1029100001000000000000000000000000000000B6 +:1029200000000000000000000000000000000000A7 +:102930000000000000000000000000000000000097 +:1029400000000000000000000000000000003C004B +:1029500064C701000000000000000000000000004B +:102960000000000000000000000000000000000067 +:102970000000000000000000000000000000000057 +:102980000000000000000000000000000000000047 +:102990003C00A0C701000000000000000000000093 +:1029A0000000000000000000000000000000000027 +:1029B0000000000000000000000000000000000017 +:1029C0000000000000000000000000000000000007 +:1029D00000003C00DCC70100000000000000000017 +:1029E00000000000000000000000000000000000E7 +:1029F00000000000000000000000000000000000D7 +:102A000000000000000000000000000000000000C6 +:102A1000000000003C0018C8010000000000000099 +:102A200000000000000000000000000000000000A6 +:102A30000000000000000000000000000000000096 +:102A40000000000000000000000000000000000086 +:102A50000000000000003C0054C80100000000001D +:102A60000000000000000000000000000000000066 +:102A70000000000000000000000000000000000056 +:102A80000000000000000000000000000000000046 +:102A900000000000000000003C0090C801000000A1 +:102AA0000000000000000000000000000000000026 +:102AB0000000000000000000000000000000000016 +:102AC0000000000000000000000000000000000006 +:102AD000000000000000000000003C00CCC8010025 +:102AE00000000000000000000000000000000000E6 +:102AF00000000000000000000000000000000000D6 +:102B000000000000000000000000000000000000C5 +:102B10000000000000000000000000003C0008C9A8 +:102B200001000000000000000000000000000000A4 +:102B30000000000000000000000000000000000095 +:102B40000000000000000000000000000000000085 +:102B500000000000000000000000000000003C0039 +:102B600044C9010000000000000000000000000057 +:102B70000000000000000000000000000000000055 +:102B80000000000000000000000000000000000045 +:102B90000000000000000000000000000000000035 +:102BA0003C0080C90100000000000000000000009F +:102BB0000000000000000000000000000000000015 +:102BC0000000000000000000000000000000000005 +:102BD00000000000000000000000000000000000F5 +:102BE00000003C00BCC90100000000000000000023 +:102BF00000000000000000000000000000000000D5 +:102C000000000000000000000000000000000000C4 +:102C100000000000000000000000000000000000B4 +:102C2000000000003C00F8C90100000000000000A6 +:102C30000000000000000000000000000000000094 +:102C40000000000000000000000000000000000084 +:102C50000000000000000000000000000000000074 +:102C60000000000000003C0034CA01000000000029 +:102C70000000000000000000000000000000000054 +:102C80000000000000000000000000000000000044 +:102C90000000000000000000000000000000000034 +:102CA00000000000000000003C0070CA01000000AD +:102CB0000000000000000000000000000000000014 +:102CC0000000000000000000000000000000000004 +:102CD00000000000000000000000000000000000F4 +:102CE000000000000000000000003C00ACCA010031 +:102CF00000000000000000000000000000000000D4 +:102D000000000000000000000000000000000000C3 +:102D100000000000000000000000000000000000B3 +:102D20000000000000000000000000003C00E8CAB5 +:102D30000100000000000000000000000000000092 +:102D40000000000000000000000000000000000083 +:102D50000000000000000000000000000000000073 +:102D600000000000000000000000000000003C0027 +:102D700024CB010000000000000000000000000063 +:102D80000000000000000000000000000000000043 +:102D90000000000000000000000000000000000033 +:102DA0000000000000000000000000000000000023 +:102DB0003C0060CB010000000000000000000000AB +:102DC0000000000000000000000000000000000003 +:102DD00000000000000000000000000000000000F3 +:102DE00000000000000000000000000000000000E3 +:102DF00000003C009CCB010000000000000000002F +:102E000000000000000000000000000000000000C2 +:102E100000000000000000000000000000000000B2 +:102E200000000000000000000000000000000000A2 +:102E3000000000003C00D8CB0100000000000000B2 +:102E40000000000000000000000000000000000082 +:102E50000000000000000000000000000000000072 +:102E60000000000000000000000000000000000062 +:102E70000000000000003C0014CC01000000000035 +:102E80000000000000000000000000000000000042 +:102E90000000000000000000000000000000000032 +:102EA0000000000000000000000000000000000022 +:102EB00000000000000000003C0050CC01000000B9 +:102EC0000000000000000000000000000000000002 +:102ED00000000000000000000000000000000000F2 +:102EE00000000000000000000000000000000000E2 +:102EF000000000000000000000003C008CCC01003D +:102F000000000000000000000000000000000000C1 +:102F100000000000000000000000000000000000B1 +:102F200000000000000000000000000000000000A1 +:102F30000000000000000000000000003C00C8CCC1 +:102F40000100000000000000000000000000000080 +:102F50000000000000000000000000000000000071 +:102F60000000000000000000000000000000000061 +:102F700000000000000000000000000000003C0015 +:102F800004CD01000000000000000000000000006F +:102F90000000000000000000000000000000000031 +:102FA0000000000000000000000000000000000021 +:102FB0000000000000000000000000000000000011 +:102FC0003C0040CD010000000000000000000000B7 +:102FD00000000000000000000000000000000000F1 +:102FE00000000000000000000000000000000000E1 +:102FF00000000000000000000000000000000000D1 +:1030000000003C007CCD010000000000000000003A +:1030100000000000000000000000000000000000B0 +:1030200000000000000000000000000000000000A0 +:103030000000000000000000000000000000000090 +:10304000000000003C00B8CD0100000000000000BE +:103050000000000000000000000000000000000070 +:103060000000000000000000000000000000000060 +:103070000000000000000000000000000000000050 +:103080000000000000003C00F4CD01000000000042 +:103090000000000000000000000000000000000030 +:1030A0000000000000000000000000000000000020 +:1030B0000000000000000000000000000000000010 +:1030C00000000000000000003C0030CE01000000C5 +:1030D00000000000000000000000000000000000F0 +:1030E00000000000000000000000000000000000E0 +:1030F00000000000000000000000000000000000D0 +:10310000000000000000000000003C006CCE010048 +:1031100000000000000000000000000000000000AF +:10312000000000000000000000000000000000009F +:10313000000000000000000000000000000000008F +:103140000000000000000000000000003C00A8CECD +:10315000010000000000000000000000000000006E +:10316000000000000000000000000000000000005F +:10317000000000000000000000000000000000004F +:1031800000000000000000000000000000003C0003 +:10319000E4CE01000000000000000000000000007C +:1031A000000000000000000000000000000000001F +:1031B000000000000000000000000000000000000F +:1031C00000000000000000000000000000000000FF +:1031D0003C0020CF010000000000000000000000C3 +:1031E00000000000000000000000000000000000DF +:1031F00000000000000000000000000000000000CF +:1032000000000000000000000000000000000000BE +:1032100000003C005CCF0100000000000000000046 +:10322000000000000000000000000000000000009E +:10323000000000000000000000000000000000008E +:10324000000000000000000000000000000000007E +:10325000000000003C0098CF0100000000000000CA +:10326000000000000000000000000000000000005E +:10327000000000000000000000000000000000004E +:10328000000000000000000000000000000000003E +:103290000000000000003C00D4CF0100000000004E +:1032A000000000000000000000000000000000001E +:1032B000000000000000000000000000000000000E +:1032C00000000000000000000000000000000000FE +:1032D00000000000000000003C0010D001000000D1 +:1032E00000000000000000000000000000000000DE +:1032F00000000000000000000000000000000000CE +:1033000000000000000000000000000000000000BD +:10331000000000000000000000003C004CD0010054 +:10332000000000000000000000000000000000009D +:10333000000000000000000000000000000000008D +:10334000000000000000000000000000000000007D +:103350000000000000000000000000003C0088D0D9 +:10336000010000000000000000000000000000005C +:10337000000000000000000000000000000000004D +:10338000000000000000000000000000000000003D +:1033900000000000000000000000000000003C00F1 +:1033A000C4D0010000000000000000000000000088 +:1033B000000000000000000000000000000000000D +:1033C00000000000000000000000000000000000FD +:1033D00000000000000000000000000000000000ED +:1033E0003C0000D1010000000000000000000000CF +:1033F00000000000000000000000000000000000CD +:1034000000000000000000000000000000000000BC +:1034100000000000000000000000000000000000AC +:1034200000003C003CD10100000000000000000052 +:10343000000000000000000000000000000000008C +:10344000000000000000000000000000000000007C +:10345000000000000000000000000000000000006C +:10346000000000003C0078D10100000000000000D6 +:10347000000000000000000000000000000000004C +:10348000000000000000000000000000000000003C +:10349000000000000000000000000000000000002C +:1034A0000000000000003C00B4D10100000000005A +:1034B000000000000000000000000000000000000C +:1034C00000000000000000000000000000000000FC +:1034D00000000000000000000000000000000000EC +:1034E00000000000000000003C00F0D101000000DE +:1034F00000000000000000000000000000000000CC +:1035000000000000000000000000000000000000BB +:1035100000000000000000000000000000000000AB +:10352000000000000000000000003C002CD2010060 +:10353000000000000000000000000000000000008B +:10354000000000000000000000000000000000007B +:10355000000000000000000000000000000000006B +:103560000000000000000000000000003C0068D2E5 +:10357000010000000000000000000000000000004A +:10358000000000000000000000000000000000003B +:10359000000000000000000000000000000000002B +:1035A00000000000000000000000000000003C00DF +:1035B000A4D2010000000000000000000000000094 +:1035C00000000000000000000000000000000000FB +:1035D00000000000000000000000000000000000EB +:1035E00000000000000000000000000000000000DB +:1035F0003C00E0D2010000000000000000000000DC +:1036000000000000000000000000000000000000BA +:1036100000000000000000000000000000000000AA +:10362000000000000000000000000000000000009A +:1036300000003C001CD3010000000000000000005E +:10364000000000000000000000000000000000007A +:10365000000000000000000000000000000000006A +:10366000000000000000000000000000000000005A +:10367000000000003C0058D30100000000000000E2 +:10368000000000000000000000000000000000003A +:10369000000000000000000000000000000000002A +:1036A000000000000000000000000000000000001A +:1036B0000000000000003C0094D301000000000066 +:1036C00000000000000000000000000000000000FA +:1036D00000000000000000000000000000000000EA +:1036E00000000000000000000000000000000000DA +:1036F00000000000000000003C00D0D301000000EA +:1037000000000000000000000000000000000000B9 +:1037100000000000000000000000000000000000A9 +:103720000000000000000000000000000000000099 +:10373000000000000000000000003C000CD401006C +:103740000000000000000000000000000000000079 +:103750000000000000000000000000000000000069 +:103760000000000000000000000000000000000059 +:103770000000000000000000000000003C0048D4F1 +:103780000100000000000000000000000000000038 +:103790000000000000000000000000000000000029 +:1037A0000000000000000000000000000000000019 +:1037B00000000000000000000000000000003C00CD +:1037C00084D40100000000000000000000000000A0 +:1037D00000000000000000000000000000000000E9 +:1037E00000000000000000000000000000000000D9 +:1037F00000000000000000000000000000000000C9 +:103800003C00C0D4010000000000000000000000E7 +:1038100000000000000000000000000000000000A8 +:103820000000000000000000000000000000000098 +:103830000000000000000000000000000000000088 +:1038400000003C00FCD4010000000000000000006B +:103850000000000000000000000000000000000068 +:103860000000000000000000000000000000000058 +:103870000000000000000000000000000000000048 +:10388000000000003C0038D50100000000000000EE +:103890000000000000000000000000000000000028 +:1038A0000000000000000000000000000000000018 +:1038B0000000000000000000000000000000000008 +:1038C0000000000000003C0074D501000000000072 +:1038D00000000000000000000000000000000000E8 +:1038E00000000000000000000000000000000000D8 +:1038F00000000000000000000000000000000000C8 +:1039000000000000000000003C00B0D501000000F5 +:1039100000000000000000000000000000000000A7 +:103920000000000000000000000000000000000097 +:103930000000000000000000000000000000000087 +:10394000000000000000000000003C00ECD5010079 +:103950000000000000000000000000000000000067 +:103960000000000000000000000000000000000057 +:103970000000000000000000000000000000000047 +:103980000000000000000000000000003C0028D6FD +:103990000100000000000000000000000000000026 +:1039A0000000000000000000000000000000000017 +:1039B0000000000000000000000000000000000007 +:1039C00000000000000000000000000000003C00BB +:1039D00064D60100000000000000000000000000AC +:1039E00000000000000000000000000000000000D7 +:1039F00000000000000000000000000000000000C7 +:103A000000000000000000000000000000000000B6 +:103A10003C00A0D6010000000000000000000000F3 +:103A20000000000000000000000000000000000096 +:103A30000000000000000000000000000000000086 +:103A40000000000000000000000000000000000076 +:103A500000003C00DCD60100000000000000000077 +:103A60000000000000000000000000000000000056 +:103A70000000000000000000000000000000000046 +:103A80000000000000000000000000000000000036 +:103A9000000000003C0018D70100000000000000FA +:103AA0000000000000000000000000000000000016 +:103AB0000000000000000000000000000000000006 +:103AC00000000000000000000000000000000000F6 +:103AD0000000000000003C0054D70100000000007E +:103AE00000000000000000000000000000000000D6 +:103AF00000000000000000000000000000000000C6 +:103B000000000000000000000000000000000000B5 +:103B100000000000000000003C0090D70100000001 +:103B20000000000000000000000000000000000095 +:103B30000000000000000000000000000000000085 +:103B40000000000000000000000000000000000075 +:103B5000000000000000000000003C00CCD7010085 +:103B60000000000000000000000000000000000055 +:103B70000000000000000000000000000000000045 +:103B80000000000000000000000000000000000035 +:103B90000000000000000000000000003C0008D809 +:103BA0000100000000000000000000000000000014 +:103BB0000000000000000000000000000000000005 +:103BC00000000000000000000000000000000000F5 +:103BD00000000000000000000000000000003C00A9 +:103BE00044D80100000000000000000000000000B8 +:103BF00000000000000000000000000000000000C5 +:103C000000000000000000000000000000000000B4 +:103C100000000000000000000000000000000000A4 +:103C20003C0080D8010000000000000000000000FF +:103C30000000000000000000000000000000000084 +:103C40000000000000000000000000000000000074 +:103C50000000000000000000000000000000000064 +:103C600000003C00BCD80100000000000000000083 +:103C70000000000000000000000000000000000044 +:103C80000000000000000000000000000000000034 +:103C90000000000000000000000000000000000024 +:103CA000000000003C00F8D8010000000000000007 +:103CB0000000000000000000000000000000000004 +:103CC00000000000000000000000000000000000F4 +:103CD00000000000000000000000000000000000E4 +:103CE0000000000000003C0034D90100000000008A +:103CF00000000000000000000000000000000000C4 +:103D000000000000000000000000000000000000B3 +:103D100000000000000000000000000000000000A3 +:103D200000000000000000003C0070D9010000000D +:103D30000000000000000000000000000000000083 +:103D40000000000000000000000000000000000073 +:103D50000000000000000000000000000000000063 +:103D6000000000000000000000003C00ACD9010091 +:103D70000000000000000000000000000000000043 +:103D80000000000000000000000000000000000033 +:103D90000000000000000000000000000000000023 +:103DA0000000000000000000000000003C00E8D916 +:103DB0000100000000000000000000000000000002 +:103DC00000000000000000000000000000000000F3 +:103DD00000000000000000000000000000000000E3 +:103DE00000000000000000000000000000003C0097 +:103DF00024DA0100000000000000000000000000C4 +:103E000000000000000000000000000000000000B2 +:103E100000000000000000000000000000000000A2 +:103E20000000000000000000000000000000000092 +:103E30003C0060DA0100000000000000000000000B +:103E40000000000000000000000000000000000072 +:103E50000000000000000000000000000000000062 +:103E60000000000000000000000000000000000052 +:103E700000003C009CDA010000000000000000008F +:103E80000000000000000000000000000000000032 +:103E90000000000000000000000000000000000022 +:103EA0000000000000000000000000000000000012 +:103EB000000000003C00D8DA010000000000000013 +:103EC00000000000000000000000000000000000F2 +:103ED00000000000000000000000000000000000E2 +:103EE00000000000000000000000000000000000D2 +:103EF0000000000000003C0014DB01000000000096 +:103F000000000000000000000000000000000000B1 +:103F100000000000000000000000000000000000A1 +:103F20000000000000000000000000000000000091 +:103F300000000000000000003C0050DB0100000019 +:103F40000000000000000000000000000000000071 +:103F50000000000000000000000000000000000061 +:103F60000000000000000000000000000000000051 +:103F7000000000000000000000003C008CDB01009D +:103F80000000000000000000000000000000000031 +:103F90000000000000000000000000000000000021 +:103FA0000000000000000000000000000000000011 +:103FB0000000000000000000000000003C00C8DB22 +:103FC00001000000000000000000000000000000F0 +:103FD00000000000000000000000000000000000E1 +:103FE00000000000000000000000000000000000D1 +:103FF00000000000000000000000000000003C0085 +:1040000004DC0100000000000000000000000000CF +:1040100000000000000000000000000000000000A0 +:104020000000000000000000000000000000000090 +:104030000000000000000000000000000000000080 +:104040003C0040DC01000000000000000000000017 +:104050000000000000000000000000000000000060 +:104060000000000000000000000000000000000050 +:104070000000000000000000000000000000000040 +:1040800000003C007CDC010000000000000000009B +:104090000000000000000000000000000000000020 +:1040A0000000000000000000000000000000000010 +:1040B0000000000000000000000000000000000000 +:1040C000000000003C00B8DC01000000000000001F +:1040D00000000000000000000000000000000000E0 +:1040E00000000000000000000000000000000000D0 +:1040F00000000000000000000000000000000000C0 +:104100000000000000003C00F4DC010000000000A2 +:10411000000000000000000000000000000000009F +:10412000000000000000000000000000000000008F +:10413000000000000000000000000000000000007F +:1041400000000000000000003C0030DD0100000025 +:10415000000000000000000000000000000000005F +:10416000000000000000000000000000000000004F +:10417000000000000000000000000000000000003F +:10418000000000000000000000003C006CDD0100A9 +:10419000000000000000000000000000000000001F +:1041A000000000000000000000000000000000000F +:1041B00000000000000000000000000000000000FF +:1041C0000000000000000000000000003C00A8DD2E +:1041D00001000000000000000000000000000000DE +:1041E00000000000000000000000000000000000CF +:1041F00000000000000000000000000000000000BF +:1042000000000000000000000000000000003C0072 +:10421000E4DD0100000000000000000000000000DC +:10422000000000000000000000000000000000008E +:10423000000000000000000000000000000000007E +:10424000000000000000000000000000000000006E +:104250003C0020DE01000000000000000000000023 +:10426000000000000000000000000000000000004E +:10427000000000000000000000000000000000003E +:10428000000000000000000000000000000000002E +:1042900000003C005CDE01000000000000000000A7 +:1042A000000000000000000000000000000000000E +:1042B00000000000000000000000000000000000FE +:1042C00000000000000000000000000000000000EE +:1042D000000000003C0098DE01000000000000002B +:1042E00000000000000000000000000000000000CE +:1042F00000000000000000000000000000000000BE +:1043000000000000000000000000000000000000AD +:104310000000000000003C00D4DE010000000000AE +:10432000000000000000000000000000000000008D +:10433000000000000000000000000000000000007D +:10434000000000000000000000000000000000006D +:1043500000000000000000003C0010DF0100000031 +:10436000000000000000000000000000000000004D +:10437000000000000000000000000000000000003D +:10438000000000000000000000000000000000002D +:10439000000000000000000000003C004CDF0100B5 +:1043A000000000000000000000000000000000000D +:1043B00000000000000000000000000000000000FD +:1043C00000000000000000000000000000000000ED +:1043D0000000000000000000000000003C0088DF3A +:1043E00001000000000000000000000000000000CC +:1043F00000000000000000000000000000000000BD +:1044000000000000000000000000000000000000AC +:1044100000000000000000000000000000003C0060 +:10442000C4DF0100000000000000000000000000E8 +:10443000000000000000000000000000000000007C +:10444000000000000000000000000000000000006C +:10445000000000000000000000000000000000005C +:104460003C0000E00100000000000000000000002F +:10447000000000000000000000000000000000003C +:10448000000000000000000000000000000000002C +:10449000000000000000000000000000000000001C +:1044A00000003C003CE001000000000000000000B3 +:1044B00000000000000000000000000000000000FC +:1044C00000000000000000000000000000000000EC +:1044D00000000000000000000000000000000000DC +:1044E000000000003C0078E0010000000000000037 +:1044F00000000000000000000000000000000000BC +:1045000000000000000000000000000000000000AB +:10451000000000000000000000000000000000009B +:104520000000000000003C00B4E0010000000000BA +:10453000000000000000000000000000000000007B +:10454000000000000000000000000000000000006B +:10455000000000000000000000000000000000005B +:1045600000000000000000003C00F0E0010000003E +:10457000000000000000000000000000000000003B +:10458000000000000000000000000000000000002B +:10459000000000000000000000000000000000001B +:1045A000000000000000000000003C002CE10100C1 +:1045B00000000000000000000000000000000000FB +:1045C00000000000000000000000000000000000EB +:1045D00000000000000000000000000000000000DB +:1045E0000000000000000000000000003C0068E146 +:1045F00001000000000000000000000000000000BA +:1046000000000000000000000000000000000000AA +:10461000000000000000000000000000000000009A +:1046200000000000000000000000000000003C004E +:10463000A4E10100000000000000000000000000F4 +:10464000000000000000000000000000000000006A +:10465000000000000000000000000000000000005A +:10466000000000000000000000000000000000004A +:104670003C00E0E10100000000000000000000003C +:10468000000000000000000000000000000000002A +:10469000000000000000000000000000000000001A +:1046A000000000000000000000000000000000000A +:1046B00000003C001CE201000000000000000000BF +:1046C00000000000000000000000000000000000EA +:1046D00000000000000000000000000000000000DA +:1046E00000000000000000000000000000000000CA +:1046F000000000003C0058E2010000000000000043 +:1047000000000000000000000000000000000000A9 +:104710000000000000000000000000000000000099 +:104720000000000000000000000000000000000089 +:104730000000000000003C0094E2010000000000C6 +:104740000000000000000000000000000000000069 +:104750000000000000000000000000000000000059 +:104760000000000000000000000000000000000049 +:1047700000000000000000003C00D0E2010000004A +:104780000000000000000000000000000000000029 +:104790000000000000000000000000000000000019 +:1047A0000000000000000000000000000000000009 +:1047B000000000000000000000003C000CE30100CD +:1047C00000000000000000000000000000000000E9 +:1047D00000000000000000000000000000000000D9 +:1047E00000000000000000000000000000000000C9 +:1047F0000000000000000000000000003C0048E352 +:1048000001000000000000000000000000000000A7 +:104810000000000000000000000000000000000098 +:104820000000000000000000000000000000000088 +:1048300000000000000000000000000000003C003C +:1048400084E3010000000000000000000000000000 +:104850000000000000000000000000000000000058 +:104860000000000000000000000000000000000048 +:104870000000000000000000000000000000000038 +:104880003C00C0E301000000000000000000000048 +:104890000000000000000000000000000000000018 +:1048A0000000000000000000000000000000000008 +:1048B00000000000000000000000000000000000F8 +:1048C00000003C00FCE301000000000000000000CC +:1048D00000000000000000000000000000000000D8 +:1048E00000000000000000000000000000000000C8 +:1048F00000000000000000000000000000000000B8 +:10490000000000003C0038E401000000000000004E +:104910000000000000000000000000000000000097 +:104920000000000000000000000000000000000087 +:104930000000000000000000000000000000000077 +:104940000000000000003C0074E4010000000000D2 +:104950000000000000000000000000000000000057 +:104960000000000000000000000000000000000047 +:104970000000000000000000000000000000000037 +:1049800000000000000000003C00B0E40100000056 +:104990000000000000000000000000000000000017 +:1049A0000000000000000000000000000000000007 +:1049B00000000000000000000000000000000000F7 +:1049C000000000000000000000003C00ECE40100DA +:1049D00000000000000000000000000000000000D7 +:1049E00000000000000000000000000000000000C7 +:1049F00000000000000000000000000000000000B7 +:104A00000000000000000000000000003C0028E55D +:104A10000100000000000000000000000000000095 +:104A20000000000000000000000000000000000086 +:104A30000000000000000000000000000000000076 +:104A400000000000000000000000000000003C002A +:104A500064E501000000000000000000000000000C +:104A60000000000000000000000000000000000046 +:104A70000000000000000000000000000000000036 +:104A80000000000000000000000000000000000026 +:104A90003C00A0E501000000000000000000000054 +:104AA0000000000000000000000000000000000006 +:104AB00000000000000000000000000000000000F6 +:104AC00000000000000000000000000000000000E6 +:104AD00000003C00DCE501000000000000000000D8 +:104AE00000000000000000000000000000000000C6 +:104AF00000000000000000000000000000000000B6 +:104B000000000000000000000000000000000000A5 +:104B1000000000003C0018E601000000000000005A +:104B20000000000000000000000000000000000085 +:104B30000000000000000000000000000000000075 +:104B40000000000000000000000000000000000065 +:104B50000000000000003C0054E6010000000000DE +:104B60000000000000000000000000000000000045 +:104B70000000000000000000000000000000000035 +:104B80000000000000000000000000000000000025 +:104B900000000000000000003C0090E60100000062 +:104BA0000000000000000000000000000000000005 +:104BB00000000000000000000000000000000000F5 +:104BC00000000000000000000000000000000000E5 +:104BD000000000000000000000003C00CCE60100E6 +:104BE00000000000000000000000000000000000C5 +:104BF00000000000000000000000000000000000B5 +:104C000000000000000000000000000000000000A4 +:104C10000000000000000000000000003C0008E769 +:104C20000100000000000000000000000000000083 +:104C30000000000000000000000000000000000074 +:104C40000000000000000000000000000000000064 +:104C500000000000000000000000000000003C0018 +:104C600044E7010000000000000000000000000018 +:104C70000000000000000000000000000000000034 +:104C80000000000000000000000000000000000024 +:104C90000000000000000000000000000000000014 +:104CA0003C0080E701000000000000000000000060 +:104CB00000000000000000000000000000000000F4 +:104CC00000000000000000000000000000000000E4 +:104CD00000000000000000000000000000000000D4 +:104CE00000003C00BCE701000000000000000000E4 +:104CF00000000000000000000000000000000000B4 +:104D000000000000000000000000000000000000A3 +:104D10000000000000000000000000000000000093 +:104D2000000000003C00F8E7010000000000000067 +:104D30000000000000000000000000000000000073 +:104D40000000000000000000000000000000000063 +:104D50000000000000000000000000000000000053 +:104D60000000000000003C0034E8010000000000EA +:104D70000000000000000000000000000000000033 +:104D80000000000000000000000000000000000023 +:104D90000000000000000000000000000000000013 +:104DA00000000000000000003C0070E8010000006E +:104DB00000000000000000000000000000000000F3 +:104DC00000000000000000000000000000000000E3 +:104DD00000000000000000000000000000000000D3 +:104DE000000000000000000000003C00ACE80100F2 +:104DF00000000000000000000000000000000000B3 +:104E000000000000000000000000000000000000A2 +:104E10000000000000000000000000000000000092 +:104E20000000000000000000000000003C00E8E876 +:104E30000100000000000000000000000000000071 +:104E40000000000000000000000000000000000062 +:104E50000000000000000000000000000000000052 +:104E600000000000000000000000000000003C0006 +:104E700024E9010000000000000000000000000024 +:104E80000000000000000000000000000000000022 +:104E90000000000000000000000000000000000012 +:104EA0000000000000000000000000000000000002 +:104EB0003C0060E90100000000000000000000006C +:104EC00000000000000000000000000000000000E2 +:104ED00000000000000000000000000000000000D2 +:104EE00000000000000000000000000000000000C2 +:104EF00000003C009CE901000000000000000000F0 +:104F000000000000000000000000000000000000A1 +:104F10000000000000000000000000000000000091 +:104F20000000000000000000000000000000000081 +:104F3000000000003C00D8E9010000000000000073 +:104F40000000000000000000000000000000000061 +:104F50000000000000000000000000000000000051 +:104F60000000000000000000000000000000000041 +:104F70000000000000003C0014EA010000000000F6 +:104F80000000000000000000000000000000000021 +:104F90000000000000000000000000000000000011 +:104FA0000000000000000000000000000000000001 +:104FB00000000000000000003C0050EA010000007A +:104FC00000000000000000000000000000000000E1 +:104FD00000000000000000000000000000000000D1 +:104FE00000000000000000000000000000000000C1 +:104FF000000000000000000000003C008CEA0100FE +:1050000000000000000000000000000000000000A0 +:105010000000000000000000000000000000000090 +:105020000000000000000000000000000000000080 +:105030000000000000000000000000003C00C8EA82 +:10504000010000000000000000000000000000005F +:105050000000000000000000000000000000000050 +:105060000000000000000000000000000000000040 +:1050700000000000000000000000000000003C00F4 +:1050800004EB010000000000000000000000000030 +:105090000000000000000000000000000000000010 +:1050A0000000000000000000000000000000000000 +:1050B00000000000000000000000000000000000F0 +:1050C0003C0040EB01000000000000000000000078 +:1050D00000000000000000000000000000000000D0 +:1050E00000000000000000000000000000000000C0 +:1050F00000000000000000000000000000000000B0 +:1051000000003C007CEB01000000000000000000FB +:10511000000000000000000000000000000000008F +:10512000000000000000000000000000000000007F +:10513000000000000000000000000000000000006F +:10514000000000003C00B8EB01000000000000007F +:10515000000000000000000000000000000000004F +:10516000000000000000000000000000000000003F +:10517000000000000000000000000000000000002F +:105180000000000000003C00F4EB01000000000003 +:10519000000000000000000000000000000000000F +:1051A00000000000000000000000000000000000FF +:1051B00000000000000000000000000000000000EF +:1051C00000000000000000003C0030EC0100000086 +:1051D00000000000000000000000000000000000CF +:1051E00000000000000000000000000000000000BF +:1051F00000000000000000000000000000000000AF +:10520000000000000000000000003C006CEC010009 +:10521000000000000000000000000000000000008E +:10522000000000000000000000000000000000007E +:10523000000000000000000000000000000000006E +:105240000000000000000000000000003C00A8EC8E +:10525000010000000000000000000000000000004D +:10526000000000000000000000000000000000003E +:10527000000000000000000000000000000000002E +:1052800000000000000000000000000000003C00E2 +:10529000E4EC01000000000000000000000000003D +:1052A00000000000000000000000000000000000FE +:1052B00000000000000000000000000000000000EE +:1052C00000000000000000000000000000000000DE +:1052D0003C0020ED01000000000000000000000084 +:1052E00000000000000000000000000000000000BE +:1052F00000000000000000000000000000000000AE +:10530000000000000000000000000000000000009D +:1053100000003C005CED0100000000000000000007 +:10532000000000000000000000000000000000007D +:10533000000000000000000000000000000000006D +:10534000000000000000000000000000000000005D +:10535000000000003C0098ED01000000000000008B +:10536000000000000000000000000000000000003D +:10537000000000000000000000000000000000002D +:10538000000000000000000000000000000000001D +:105390000000000000003C00D4ED0100000000000F +:1053A00000000000000000000000000000000000FD +:1053B00000000000000000000000000000000000ED +:1053C00000000000000000000000000000000000DD +:1053D00000000000000000003C0010EE0100000092 +:1053E00000000000000000000000000000000000BD +:1053F00000000000000000000000000000000000AD +:10540000000000000000000000000000000000009C +:10541000000000000000000000003C004CEE010015 +:10542000000000000000000000000000000000007C +:10543000000000000000000000000000000000006C +:10544000000000000000000000000000000000005C +:105450000000000000000000000000003C0088EE9A +:10546000010000000000000000000000000000003B +:10547000000000000000000000000000000000002C +:10548000000000000000000000000000000000001C +:1054900000000000000000000000000000003C00D0 +:1054A000C4EE010000000000000000000000000049 +:1054B00000000000000000000000000000000000EC +:1054C00000000000000000000000000000000000DC +:1054D00000000000000000000000000000000000CC +:1054E0003C0000EF01000000000000000000000090 +:1054F00000000000000000000000000000000000AC +:10550000000000000000000000000000000000009B +:10551000000000000000000000000000000000008B +:1055200000003C003CEF0100000000000000000013 +:10553000000000000000000000000000000000006B +:10554000000000000000000000000000000000005B +:10555000000000000000000000000000000000004B +:10556000000000003C0078EF010000000000000097 +:10557000000000000000000000000000000000002B +:10558000000000000000000000000000000000001B +:10559000000000000000000000000000000000000B +:1055A0000000000000003C00B4EF0100000000001B +:1055B00000000000000000000000000000000000EB +:1055C00000000000000000000000000000000000DB +:1055D00000000000000000000000000000000000CB +:1055E00000000000000000003C00F0EF010000009F +:1055F00000000000000000000000000000000000AB +:10560000000000000000000000000000000000009A +:10561000000000000000000000000000000000008A +:10562000000000000000000000003C002CF0010021 +:10563000000000000000000000000000000000006A +:10564000000000000000000000000000000000005A +:10565000000000000000000000000000000000004A +:105660000000000000000000000000003C0068F0A6 +:105670000100000000000000000000000000000029 +:10568000000000000000000000000000000000001A +:10569000000000000000000000000000000000000A +:1056A00000000000000000000000000000003C00BE +:1056B000A4F0010000000000000000000000000055 +:1056C00000000000000000000000000000000000DA +:1056D00000000000000000000000000000000000CA +:1056E00000000000000000000000000000000000BA +:1056F0003C00E0F00100000000000000000000009D +:105700000000000000000000000000000000000099 +:105710000000000000000000000000000000000089 +:105720000000000000000000000000000000000079 +:1057300000003C001CF1010000000000000000001F +:105740000000000000000000000000000000000059 +:105750000000000000000000000000000000000049 +:105760000000000000000000000000000000000039 +:10577000000000003C0058F10100000000000000A3 +:105780000000000000000000000000000000000019 +:105790000000000000000000000000000000000009 +:1057A00000000000000000000000000000000000F9 +:1057B0000000000000003C0094F101000000000027 +:1057C00000000000000000000000000000000000D9 +:1057D00000000000000000000000000000000000C9 +:1057E00000000000000000000000000000000000B9 +:1057F00000000000000000003C00D0F101000000AB +:105800000000000000000000000000000000000098 +:105810000000000000000000000000000000000088 +:105820000000000000000000000000000000000078 +:10583000000000000000000000003C000CF201002D +:105840000000000000000000000000000000000058 +:105850000000000000000000000000000000000048 +:105860000000000000000000000000000000000038 +:105870000000000000000000000000003C0048F2B2 +:105880000100000000000000000000000000000017 +:105890000000000000000000000000000000000008 +:1058A00000000000000000000000000000000000F8 +:1058B00000000000000000000000000000003C00AC +:1058C00084F2010000000000000000000000000061 +:1058D00000000000000000000000000000000000C8 +:1058E00000000000000000000000000000000000B8 +:1058F00000000000000000000000000000000000A8 +:105900003C00C0F2010000000000000000000000A8 +:105910000000000000000000000000000000000087 +:105920000000000000000000000000000000000077 +:105930000000000000000000000000000000000067 +:1059400000003C00FCF2010000000000000000002C +:105950000000000000000000000000000000000047 +:105960000000000000000000000000000000000037 +:105970000000000000000000000000000000000027 +:10598000000000003C0038F30100000000000000AF +:105990000000000000000000000000000000000007 +:1059A00000000000000000000000000000000000F7 +:1059B00000000000000000000000000000000000E7 +:1059C0000000000000003C0074F301000000000033 +:1059D00000000000000000000000000000000000C7 +:1059E00000000000000000000000000000000000B7 +:1059F00000000000000000000000000000000000A7 +:105A000000000000000000003C00B0F301000000B6 +:105A10000000000000000000000000000000000086 +:105A20000000000000000000000000000000000076 +:105A30000000000000000000000000000000000066 +:105A4000000000000000000000003C00ECF301003A +:105A50000000000000000000000000000000000046 +:105A60000000000000000000000000000000000036 +:105A70000000000000000000000000000000000026 +:105A80000000000000000000000000003C0028F4BE +:105A90000100000000000000000000000000000005 +:105AA00000000000000000000000000000000000F6 +:105AB00000000000000000000000000000000000E6 +:105AC00000000000000000000000000000003C009A +:105AD00064F401000000000000000000000000006D +:105AE00000000000000000000000000000000000B6 +:105AF00000000000000000000000000000000000A6 +:105B00000000000000000000000000000000000095 +:105B10003C00A0F4010000000000000000000000B4 +:105B20000000000000000000000000000000000075 +:105B30000000000000000000000000000000000065 +:105B40000000000000000000000000000000000055 +:105B500000003C00DCF40100000000000000000038 +:105B60000000000000000000000000000000000035 +:105B70000000000000000000000000000000000025 +:105B80000000000000000000000000000000000015 +:105B9000000000003C0018F50100000000000000BB +:105BA00000000000000000000000000000000000F5 +:105BB00000000000000000000000000000000000E5 +:105BC00000000000000000000000000000000000D5 +:105BD0000000000000003C0054F50100000000003F +:105BE00000000000000000000000000000000000B5 +:105BF00000000000000000000000000000000000A5 +:105C00000000000000000000000000000000000094 +:105C100000000000000000003C0090F501000000C2 +:105C20000000000000000000000000000000000074 +:105C30000000000000000000000000000000000064 +:105C40000000000000000000000000000000000054 +:105C5000000000000000000000003C00CCF5010046 +:105C60000000000000000000000000000000000034 +:105C70000000000000000000000000000000000024 +:105C80000000000000000000000000000000000014 +:105C90000000000000000000000000003C0008F6CA +:105CA00001000000000000000000000000000000F3 +:105CB00000000000000000000000000000000000E4 +:105CC00000000000000000000000000000000000D4 +:105CD00000000000000000000000000000003C0088 +:105CE00044F6010000000000000000000000000079 +:105CF00000000000000000000000000000000000A4 +:105D00000000000000000000000000000000000093 +:105D10000000000000000000000000000000000083 +:105D20003C0080F6010000000000000000000000C0 +:105D30000000000000000000000000000000000063 +:105D40000000000000000000000000000000000053 +:105D50000000000000000000000000000000000043 +:105D600000003C00BCF60100000000000000000044 +:105D70000000000000000000000000000000000023 +:105D80000000000000000000000000000000000013 +:105D90000000000000000000000000000000000003 +:105DA000000000003C00F8F60100000000000000C8 +:105DB00000000000000000000000000000000000E3 +:105DC00000000000000000000000000000000000D3 +:105DD00000000000000000000000000000000000C3 +:105DE0000000000000003C0034F70100000000004B +:105DF00000000000000000000000000000000000A3 +:105E00000000000000000000000000000000000092 +:105E10000000000000000000000000000000000082 +:105E200000000000000000003C0070F701000000CE +:105E30000000000000000000000000000000000062 +:105E40000000000000000000000000000000000052 +:105E50000000000000000000000000000000000042 +:105E6000000000000000000000003C00ACF7010052 +:105E70000000000000000000000000000000000022 +:105E80000000000000000000000000000000000012 +:105E90000000000000000000000000000000000002 +:105EA0000000000000000000000000003C00E8F7D7 +:105EB00001000000000000000000000000000000E1 +:105EC00000000000000000000000000000000000D2 +:105ED00000000000000000000000000000000000C2 +:105EE00000000000000000000000000000003C0076 +:105EF00024F8010000000000000000000000000085 +:105F00000000000000000000000000000000000091 +:105F10000000000000000000000000000000000081 +:105F20000000000000000000000000000000000071 +:105F30003C0060F8010000000000000000000000CC +:105F40000000000000000000000000000000000051 +:105F50000000000000000000000000000000000041 +:105F60000000000000000000000000000000000031 +:105F700000003C009CF80100000000000000000050 +:105F80000000000000000000000000000000000011 +:105F90000000000000000000000000000000000001 +:105FA00000000000000000000000000000000000F1 +:105FB000000000003C00D8F80100000000000000D4 +:105FC00000000000000000000000000000000000D1 +:105FD00000000000000000000000000000000000C1 +:105FE00000000000000000000000000000000000B1 +:105FF0000000000000003C0014F901000000000057 +:106000000000000000000000000000000000000090 +:106010000000000000000000000000000000000080 +:106020000000000000000000000000000000000070 +:1060300000000000000000003C0050F901000000DA +:106040000000000000000000000000000000000050 +:106050000000000000000000000000000000000040 +:106060000000000000000000000000000000000030 +:10607000000000000000000000003C008CF901005E +:106080000000000000000000000000000000000010 +:106090000000000000000000000000000000000000 +:1060A00000000000000000000000000000000000F0 +:1060B0000000000000000000000000003C00C8F9E3 +:1060C00001000000000000000000000000000000CF +:1060D00000000000000000000000000000000000C0 +:1060E00000000000000000000000000000000000B0 +:1060F00000000000000000000000000000003C0064 +:1061000004FA010000000000000000000000000090 +:10611000000000000000000000000000000000007F +:10612000000000000000000000000000000000006F +:10613000000000000000000000000000000000005F +:106140003C0040FA010000000000000000000000D8 +:10615000000000000000000000000000000000003F +:10616000000000000000000000000000000000002F +:10617000000000000000000000000000000000001F +:1061800000003C007CFA010000000000000000005C +:1061900000000000000000000000000000000000FF +:1061A00000000000000000000000000000000000EF +:1061B00000000000000000000000000000000000DF +:1061C000000000003C00B8FA0100000000000000E0 +:1061D00000000000000000000000000000000000BF +:1061E00000000000000000000000000000000000AF +:1061F000000000000000000000000000000000009F +:106200000000000000003C00F4FA01000000000063 +:10621000000000000000000000000000000000007E +:10622000000000000000000000000000000000006E +:10623000000000000000000000000000000000005E +:1062400000000000000000003C0030FB01000000E6 +:10625000000000000000000000000000000000003E +:10626000000000000000000000000000000000002E +:10627000000000000000000000000000000000001E +:10628000000000000000000000003C006CFB01006A +:1062900000000000000000000000000000000000FE +:1062A00000000000000000000000000000000000EE +:1062B00000000000000000000000000000000000DE +:1062C0000000000000000000000000003C00A8FBEF +:1062D00001000000000000000000000000000000BD +:1062E00000000000000000000000000000000000AE +:1062F000000000000000000000000000000000009E +:1063000000000000000000000000000000003C0051 +:10631000E4FB01000000000000000000000000009D +:10632000000000000000000000000000000000006D +:10633000000000000000000000000000000000005D +:10634000000000000000000000000000000000004D +:106350003C0020FC010000000000000000000000E4 +:10636000000000000000000000000000000000002D +:10637000000000000000000000000000000000001D +:10638000000000000000000000000000000000000D +:1063900000003C005CFC0100000000000000000068 +:1063A00000000000000000000000000000000000ED +:1063B00000000000000000000000000000000000DD +:1063C00000000000000000000000000000000000CD +:1063D000000000003C0098FC0100000000000000EC +:1063E00000000000000000000000000000000000AD +:1063F000000000000000000000000000000000009D +:10640000000000000000000000000000000000008C +:106410000000000000003C00D4FC0100000000006F +:10642000000000000000000000000000000000006C +:10643000000000000000000000000000000000005C +:10644000000000000000000000000000000000004C +:1064500000000000000000003C0010FD01000000F2 +:10646000000000000000000000000000000000002C +:10647000000000000000000000000000000000001C +:10648000000000000000000000000000000000000C +:10649000000000000000000000003C004CFD010076 +:1064A00000000000000000000000000000000000EC +:1064B00000000000000000000000000000000000DC +:1064C00000000000000000000000000000000000CC +:1064D0000000000000000000000000003C0088FDFB +:1064E00001000000000000000000000000000000AB +:1064F000000000000000000000000000000000009C +:10650000000000000000000000000000000000008B +:1065100000000000000000000000000000003C003F +:10652000C4FD0100000000000000000000000000A9 +:10653000000000000000000000000000000000005B +:10654000000000000000000000000000000000004B +:10655000000000000000000000000000000000003B +:106560003C0000FE010000000000000000000000F0 +:10657000000000000000000000000000000000001B +:10658000000000000000000000000000000000000B +:1065900000000000000000000000000000000000FB +:1065A00000003C003CFE0100000000000000000074 +:1065B00000000000000000000000000000000000DB +:1065C00000000000000000000000000000000000CB +:1065D00000000000000000000000000000000000BB +:1065E000000000003C0078FE0100000000000000F8 +:1065F000000000000000000000000000000000009B +:10660000000000000000000000000000000000008A +:10661000000000000000000000000000000000007A +:106620000000000000003C00B4FE0100000000007B +:10663000000000000000000000000000000000005A +:10664000000000000000000000000000000000004A +:10665000000000000000000000000000000000003A +:1066600000000000000000003C00F0FE01000000FF +:10667000000000000000000000000000000000001A +:10668000000000000000000000000000000000000A +:1066900000000000000000000000000000000000FA +:1066A000000000000000000000003C002CFF010082 +:1066B00000000000000000000000000000000000DA +:1066C00000000000000000000000000000000000CA +:1066D00000000000000000000000000000000000BA +:1066E0000000000000000000000000000C0068FF37 +:1066F00001000000000000000000000000003C005D +:106700000010040070B52B4806218175C175017E0B +:10671000490849000176017E02229143017626490B +:106720000B785B085B000B7004238B700C234376A3 +:10673000202303751A244475242484761024C476F7 +:106740003C003C1004002A254D70057A3026B543E4 +:1067500020350572857A6D086D008572857A9543BE +:106760008572857A042635438572857A08263543F5 +:106770008572857AA5438572057B2C430473047B5F +:106780001C433C00781004000473047B40252C4318 +:106790000473847A23438372837AAB438372037BCB +:1067A00080242343037308789043087008780122FB +:1067B00010430870087804229043087070BD0000F0 +:1067C0000C8007003C00B4100400808007000149E1 +:1067D00004204873704740800700034980B50020BB +:1067E000088000F00AFB80BD0000FC6B01007047D0 +:1067F000000080B500F067FB80BD80B50A49182015 +:10680000C1F73BFA09493C00F01004000220C1F72F +:1068100037FA08491F20C1F733FA07491C20C1F78E +:106820002FFA06490320C1F72BFA80BD992A0000F0 +:1068300041250000552500005D2500003925000098 +:1068400080B5BFF791FD80BD3C002C11040080B5E0 +:10685000054A05490A20BFF74EFF0120044980027E +:106860000860486080BDB4740100B164000000108D +:10687000070080B500F091FE80BD80B5054A05494E +:106880001B20BFF738FF012004493C0068110400B9 +:10689000C0060860486080BDB87401002D6E00001D +:1068A0000010070080B5044800F080FE0349002076 +:1068B0004860886080BD0000414B0000BC7401004E +:1068C00080B5C5F7D5FECEF7D9F803493C00A41131 +:1068D0000400086003490A20D1F7EFF880BDBC74BA +:1068E0000100496E000080B5012220210620C8F772 +:1068F00056FCBFF770FE03490020086020210248C3 +:10690000BFF763F980BDCC5C0100646D01003C0001 +:10691000E0110400084880B50068002805D006484A +:106920005430426A0021BFF7F3F8044A04490320B7 +:10693000BFF7ACFD80BD0000506D010089980000DC +:106940009198000080B500F003F800F019F880BDC0 +:106950003C001C12040010B5094C6021201CBFF73C +:106960003AF90020C043A0602060FF200230E0849C +:106970002022201C40300249BFF75BF910BD0010F7 +:1069800007007052010000200A49C0438860094B8B +:106990000A493C0058120400002082000130000621 +:1069A000000E20289950F8D30649044A081C1030DC +:1069B000083A03C27047000000100700E07E0100A3 +:1069C0007575000000A00700044800210022002384 +:1069D0000EC00C383C009412040001214160704745 +:1069E0000000707801007047000003480021002279 +:1069F00000230EC008C070470000885A01000449F7 +:106A000080B500204861024840211C30BFF7E9F8FA +:106A100080BDFC5A01003C00D012040080B5CEF7C6 +:106A20003FF80349886103490320D1F755F880BD39 +:106A3000FC5A01000D17010080B5C0F7A5F980BD13 +:106A4000FEB56C4900200090C8786B4C6B4F430733 +:106A5000C006C017DB0EE3583C000C1304000130E5 +:106A600038623B61081C8078664E03224107A036DD +:106A70000296490F3172890061583C1C6161019195 +:106A8000C006C00F7862201C002787610020211CEF +:106A9000C86159485949007809793C0048130400F5 +:106AA0005A4C4E07760F711C8C46B1008E465649E3 +:106AB0008031002824D0524F01287F781AD0022834 +:106AC00071D14F48002F0CD0012F6CD140794D4D22 +:106AD0004007400F8200AA584B4D01303C00841300 +:106AE0000400EA61A07304224B48484DC8614A483B +:106AF000002F00D04A482F1C11E04248002F55D1EA +:106B00000770022747703F484078002810D00128BE +:106B100001D002284AD13F483D4FC8613F483C0060 +:106B2000C013040088613A4970460858351CB861A2 +:106B30006046607304E03C48022288613B48C861BB +:106B40000020324906E00E18B6787607760F042E3C +:106B50002FD801309042F6D3C8792E4FC007C00F0E +:106B60003C00FC130400F86033484168194341605D +:106B7000816819438160019AB9698C461143FA69A9 +:106B8000866811438E4386604668314341600199AF +:106B90000B43181C614608431043011C00220220CD +:106BA000C7F73C003814040003FA1E4E403E7078CC +:106BB000C008C00028437070701C017800E029E014 +:106BC0000825A94301700120C043B08000210120A5 +:106BD000CFF76CFC301C8030817809090901817085 +:106BE0000F2101703C0074140400164A69041160FE +:106BF0005160029E1021327A7B6A002B00D1002165 +:106C000011432173817829438170E0780121084381 +:106C1000E070D2F7F2F9012000900098FEBDC05755 +:106C200001006C4301003C00B0140400A46C01009E +:106C300040900700C91D0000811D0000A51D000037 +:106C4000991D0000F11D0000100007000010070052 +:106C50000349002088620870487008710862704714 +:106C6000AC7E010080B501213C00EC140400002042 +:106C7000CDF769FF80BDB0B50F48C0F718FC0E4DC9 +:106C8000032028700D490D480C3948600D480A4C06 +:106C9000886040211834201CBEF7C1FFFF216868BE +:106CA000090608432060FF2106223C002815040045 +:106CB000201DBFF779F80120E060B0BDC0A8130A1D +:106CC000206E0100C0A81301FFFFFF0080B502493C +:106CD0000120C8F745FF80BD9D1C000098B50C4CF5 +:106CE00000206060E0600B4B0B4982003C006415A3 +:106CF0000400013020289950FADB6A460949052032 +:106D0000BFF72FFD0020C043206006492020086007 +:106D1000486098BD00000040070030740100A9756C +:106D20000000B59F000000100700054900203C004E +:106D3000A0150400086005488178282291438170DD +:106D40008178114381707047786E01000000070060 +:106D500070470000414810B50068022188433F4950 +:106D60000860081C0068022108433C4908603C4850 +:106D70003C00DC1504004068802188433A494860A3 +:106D8000081C006880210843374908603748017AA9 +:106D9000012421430172017A022211430172017A16 +:106DA000042291430172017A082211430172017B8E +:106DB00021433C00181604000173017B0222114399 +:106DC0000173017B042211430173017B08221143EB +:106DD00001732E214173817B3822914328318173C5 +:106DE00020214174817BC908C900033181732221AC +:106DF000C17320493C0054160400097A41721E49AF +:106E0000497A01743C220277011C10314A735023E5 +:106E10008B735A23CB730D23011C20310B70174B3E +:106E200043840E234B7000214182302101700521E3 +:106E30004170042141713C00901604008471C471BA +:106E40000C210171F82141800F49CA728A72032214 +:106E50000A7209224A7208220A73027A40231A43EC +:106E600002724C73FFF7A2FC0848017821430170BD +:106E700010BD0000F00007003C00CC160400F40038 +:106E800007000C800700764601002409000080807E +:106E90000700A080070080B518210948BEF7D7FE7B +:106EA000084800213C3841608160C1600161416156 +:106EB000816101210162FFF75CFF3C0008170400BB +:106EC000C0F76CFF80BD0000247E0100B0B52148F2 +:106ED000006840081F4940000860081C0068012144 +:106EE00008431C4908601C4A1079012108431071AD +:106EF000107902218843107100F06CF83C004417AF +:106F00000400107A012108431072107AFE21884390 +:106F10000A301072282090725A20D072114D14201D +:106F200028772C1C1034A0731620A8751820E8753B +:106F3000FFF7A1FC0C486886E07B4006400E3C0051 +:106F4000801704000E210843E073E07B8021084392 +:106F5000E07307484179042211434171B0BD00003C +:106F6000F00007000080070030800700FF010000EC +:106F70005000070080B5FFF7AFFF00201449C04361 +:106F80003C00BC1704008860C1F70BF913490020CE +:106F90004862C860486108618861C8610F4B086237 +:106FA0000F4A086338331A8001225A710B4A403263 +:106FB000D0601360082313815060094A8A62FF225F +:106FC0000A703C00F81704004870054800210022B0 +:106FD000503000230EC0C1F7FFF880BD003007001D +:106FE000046C0100BEBA0000857500000348102142 +:106FF00081710221C1713021417270470080070008 +:10700000704700003C003418040000B5C1F7DBFBFA +:1070100000BD7047000080B5CDF787FD014988604D +:1070200080BD50D9010080B506210548BEF7FDFDA1 +:10703000044900200439086000F067F800F003F804 +:1070400080BDEC6701003C007018040010B5074CCF +:107050002C21201CBEF710FE0120207003490020C7 +:107060001C39C8600861886110BD000078690100A2 +:1070700080B5CDF75DFD0949886009490820D0F742 +:1070800073FD08490920D0F73C00AC1804006FFDDF +:1070900007491120D0F76BFD0648C2F774F980BD8F +:1070A00000007869010021350000A1380000453456 +:1070B0000000BD26010080B586B00F48C4F745F931 +:1070C00000F045F8FFF7D7FFFFF73C00E818040091 +:1070D000ABFF0C490320D0F74DFD0B4869460090EB +:1070E0000020019009480490094802900948039043 +:1070F000094805900020C4F7CFF806B080BD000015 +:10710000F467010045350000953200003C00241969 +:107110000400A07D0100FD320000CD310000457D5E +:10712000010010B5CDF7D5FC0948094C302160614C +:1071300008487430BEF7A9FD0020A062064920610E +:10714000E1636064A06414212165606210BD3C00AD +:1071500060190400B9750000447D0100701700003B +:1071600080B502210920044AD1F7E8FECDF7ECFCF6 +:107170000249086380BD000039390000447D0100E8 +:1071800080B5AC210348BEF783FD00F051F800F054 +:107190003C009C19040049F880BDA46C010008B5AE +:1071A00000F04DF800F045F800211620184AD1F7FC +:1071B000C8FE174A0421101C403001700021817064 +:1071C0001121C18014490181101C8030C17808222E +:1071D00091433C00D8190400C170C1781143C170BB +:1071E0006A460F491420BFF7F5FA0E490720D0F779 +:1071F000CDFC0D490F20D0F7C9FCCDF7ABFC0B49F6 +:1072000008600A4844388068002802D00020C6F789 +:107210006FF908BD3C00141A0400B53B0000009053 +:107220000700E7FD00008D410000CD480000D9496E +:107230000000A46C010080B500F06FFC80BD7047B9 +:10724000000080B500F061FC80BD70470000B0B563 +:1072500030210C48BEF73C00501A040025FD0B4CB1 +:1072600000250A48843C3822032170386560BEF747 +:10727000DDFD0648382201213838BEF7D7FD0E2043 +:10728000A5606070207000F01DF8B0BD946701002B +:10729000044900B5012048603C008C1A0400886055 +:1072A000C860C3F7F8FF00BD0000D467010080B5D7 +:1072B00002210A20024AD1F750FE80BD00001D5A6B +:1072C000000080B500F005F880BD80B500F0FDFB42 +:1072D00080BD80B502490420D0F73C00C81A0400E4 +:1072E00061FC80BD651F000000211748C94380B5BF +:1072F000164B0170181C102220300271002210332E +:107300009A73427904231A434271427918239A43AB +:1073100008324271081CD7F759F800283C00041BBA +:10732000040003D101219A20BFF7CBFB502009496B +:1073300050220A60C8608860486008610120486186 +:107340000020D7F7D8F80449FF20086080BDF46B0F +:1073500001003000070004020700F47401003C0043 +:10736000401B040080B5D7F7FBF880BD10B5FFF7D0 +:10737000ABFBBFF7DDFB8148CDF798FA0024231C57 +:1073800004220421002001F039FA002801D0BFF7BF +:10739000C9FB231C0022FF21002001F02FFA002846 +:1073A0003C007C1B040001D0BFF7BFFB231C002264 +:1073B000FF21002001F025FA002801D0BFF7B5FB1E +:1073C000C4F727FF704884706F497F2088706E492A +:1073D0000C60032008606B4844706C480480694866 +:1073E000C0783C00B81B0400082108436749C870F6 +:1073F000081CC078042108436449C87001F07EFA73 +:10740000FFF77EFFFFF72CFE01F046FBFFF718FBAE +:1074100001F052FAFFF782FB5F48C16810229143E6 +:10742000C16001693C00F41B04005D4A1143016125 +:107430000169D20A91430161C1685A4A1143C1608E +:10744000816A594A1143816200F077F901F01FF80F +:1074500000F093FA01F099FB00F0F1FF00F099FCC5 +:1074600000F0DDFC00F03C00301C040083FCFFF762 +:10747000B3FC01F031FA01F071FAFFF787FAFFF778 +:107480009BFA012101204B4AD1F77CFD012102200A +:10749000494AD1F777FD02210320484AD1F772FD0E +:1074A00002210420464AD1F73C006C1C04006DFD0B +:1074B00002210520454AD1F768FD02210620434AF2 +:1074C000D1F763FD01210720424AD1F75EFD022179 +:1074D0001720404AD1F759FD022108203F4AD1F731 +:1074E00054FDFFF7C8FD3D4804603C00A81C0400A3 +:1074F0004460FFF717FAFFF709FAFFF74FFC00F0B7 +:1075000043F9FFF733FAFFF7FBFA01F085F801F0D2 +:10751000EBF901F023FA01F071F900F0E3FFFFF756 +:107520006FFA00F0AFF900F0BDF900F03C00E41C88 +:107530000400ADFC00F09BFEFFF7CDFAFFF7ABFEB9 +:1075400000F0C3F9FFF7ABFD00F08DFF00F021FF65 +:1075500000F065F900F097F900F0FDFE00F0E5FE9F +:1075600000F03FF900F073F9FFF737FE00F03C0040 +:10757000201D040021F900F073FBFFF7E5FB00F08C +:10758000D3FBFFF7A9FE00F0BBFB00F009FF00F002 +:10759000DBF91848C9F756F81748C9F72BF8002245 +:1075A0000121F020D1F72EFD002010BDA9690000B7 +:1075B0003C005C1D040000000700F00007002C00E8 +:1075C0000700001007003C000800C03F7438FCDFD3 +:1075D0007F3855690000E5130000610C00006D0C58 +:1075E00000003D0C0000F10D0000C53300003D0F10 +:1075F00000003C00981D0400ADD80000800007008A +:10760000505701000440010080B501F0A9F900F0D5 +:10761000C9F8FFF7C5FE01F003FB01F093FAFFF78D +:10762000CBF92C48FFF7E8F900F0AAF800F058FF72 +:10763000FFF734FD3C00D41D0400FFF7F2FBFFF719 +:107640007AFAFFF700FA00F034F900F03CF901F0A3 +:10765000E2F8FFF77AF9FFF772F9FFF79AF901F00C +:1076600066F901F08EF901F0E0F800F006FF00F095 +:10767000F0FB00F046FB3C00101E040000F0BCFFD5 +:1076800000F0E4FC00F020FEFFF740FAFFF746FEB2 +:10769000FFF756FD00F02CF900F0FAFE00F08AFE2C +:1076A00000F0D4F800F0B4F800F078FE00F04EFEE0 +:1076B00000F0DEF8FFF7ACFD3C004C1E040000F0CB +:1076C0008CF800F0F8FAFFF776FBFFF720FE01F0E8 +:1076D000A6FA00F048FB00F07CFE00F05CF9BEF773 +:1076E00057FD002080BD803801000149002008605E +:1076F0007047A87E010010B5041C3C00881E0400E1 +:1077000001D1BFF739FA0F487D21C900846001809B +:107710000D490161802141800021C16001620B4857 +:1077200041801421818007214181064A4623043289 +:107730000524137054700A21917081763C00C41E98 +:1077400004000376048110BD0000C87401000087A6 +:10775000930330000700094880B50169426911436D +:107760008269C0691143014300220320C6F7BFFCB0 +:10777000CCF71BFA0020C2F792F980BD00003C0054 +:10778000001F0400A46C0100054880B50021816041 +:107790000221C16003394160C7F73AFF80BD000094 +:1077A0004020070008B56A4604491520BFF754F881 +:1077B0000120034940050860486008BDA52101007B +:1077C0003C003C1F04000010070070470000064802 +:1077D00080B58068C001800F05D10322C143C6F780 +:1077E000BAFCD6F700FE80BD00001000070070470D +:1077F000000080B502212A20064AD1F7EAFB0022C8 +:1078000007203C00781F04000449BEF7EDFE044841 +:10781000C7F758FC80BD00008D890000D59B000093 +:107820001046010002480021002200230EC07047CC +:10783000806E010080B502212C20064AD1F7CCFBD6 +:10784000002200203C00B41F04000449BEF7CFFE14 +:1078500004490220C8F70BFA80BD058A0000E99BA5 +:107860000000B18B000002480021002200230EC05E +:1078700070471075010080B502212B20044AD1F712 +:10788000AEFB002202203C00F01F04000249BEF7BC +:10789000B1FE80BD2D8A00008D8C00007047000075 +:1078A00080B502212D20074AD1F79CFB0022012040 +:1078B0000549BEF79FFE0548CBF756FA0448CCF7BA +:1078C000F7F880BDAD8A00003C002C20040021E2C6 +:1078D0000000F9DF00002044010070470000024969 +:1078E00000200860012048607047AC79010080B535 +:1078F00002490D20D0F79BF980BD619800007047C8 +:10790000000080B5CDF777F903493C0068200400FA +:107910000860011C0248CDF797F980BDA8790100E5 +:10792000C460010080B500F029F880BD80B586B044 +:107930000C48C3F76DFDD6F7D3FB0B480D490090FB +:107940000A48049101900A48694602903C00A4202C +:1079500004000020039005900120C3F700FD0749B3 +:107960000320D0F76AF906B080BD20F70100118727 +:107970000100958701005587010098D901006D87A6 +:10798000010080B50120D6F790FC034900203C009F +:10799000E02004000860486002481439486080BD57 +:1079A00090D901003D82010070B50026094C094DB7 +:1079B0002660666044215035281CA661BEF7C8F9D0 +:1079C0001420E060E8632820E861A06028642E703D +:1079D0003C001C21040070BD0000A46E010080B5B5 +:1079E00002211820044AD1F70CFB03490820D0F7E4 +:1079F0002AF980BD0000159C0000699C0000FEB5BE +:107A0000264D2878C0070CD425490020087028701E +:107A100024483C00582104008178490849008170BD +:107A200081780122114381700024FF261F4F013607 +:107A3000211C01A8C6F732F800AB187901281FD025 +:107A4000022819D003281ED1B8680021B043B860BD +:107A5000786830433C009421040078603A683240F2 +:107A6000A02005E03B683340934201D0012101E0B2 +:107A70000138F7D27868B0437860002903D001A8B4 +:107A800000F027FF02E001A800F045FF01342406C2 +:107A90002416062CCFDB3C00D0210400044902222E +:107AA0000878104308702870FEBD0000040007002D +:107AB000E06001000000070010000700B0B50020E2 +:107AC00015231449012542008D54521801300E2807 +:107AD0005370F8D30F481C223C000C2204001C38C1 +:107AE000BEF773F90D480E212A38BEF71CF90B4971 +:107AF000002008600B4C2A21201CBEF714F92570C9 +:107B00000E2060701720A070074853210170452196 +:107B1000417020218170B0BD00003C00482204006B +:107B2000E6780100E4620100EB620100E862010016 +:107B30000C490D48002241600C4981600C49C1602C +:107B40000C4901610C4941610C498261C1610C49D8 +:107B500001620C4941620C4981620C493C0084225B +:107B60000400C162C26370470000C9750000287A32 +:107B70000100C17500008175000099750000CD7588 +:107B800000008975000091750000B57500008D75C5 +:107B90000000C5750000B0B50E480E4908603C00F5 +:107BA000C02204000831C0F743FE0C49002548609C +:107BB0000B480A4C05600B48803C05601020207182 +:107BC000E070A07160712720C043C3F7F7FB282045 +:107BD000C3F7FCFB2572B0BDFF3F00002C7D010008 +:107BE0003C00FC2204001C6701002067010080B5F6 +:107BF0002C210148BEF7C7F880BD3C7E010080B54E +:107C000038210148BEF7BFF880BD687E010080B50D +:107C100002210E20024AD1F70CFA80BD000021E0BB +:107C200000003C003823040070470000F0B585B028 +:107C3000002700AB2F4E1F8100250024281CD6F7FB +:107C4000A1FB022D03D1D6F7F5FA00280CD00124B0 +:107C5000012D03D1072000AB187101E000AB1F71AB +:107C600000AB18793C0074230400D6F708FC002C04 +:107C700039D0082103A8D6F7F2FA00AB187BFE280A +:107C800031D1587B01282AD1022102A8D6F7E7FA80 +:107C900000AB1889002826D018891849884222D0BC +:107CA00019890020BFF73C00B023040013F9041C1D +:107CB000006900AB1989D6F7D5FA206800AB1A899C +:107CC000011C0831083ACBF7A1F9002806D0022898 +:107CD00004D0022194203760BEF762FF201CBFF75A +:107CE000C7F8D4E7012194203C00EC230400BEF740 +:107CF0005AFFD5F726FF01352D062D0E042DA5D3ED +:107D000005B0F0BD000058570100FFFF00000A4811 +:107D10000021021C183280B5094B02E0016083800B +:107D200008308242FAD104486C213C002824040027 +:107D30006C38BEF737F804490220C7F7D1FF80BD81 +:107D40007C790100FC0500009D75000080B50221D2 +:107D500026200D4AD1F77CF90C48C8F773FF0C4870 +:107D6000C8F776FF0B491020CFF794FF3C0064243E +:107D700004000A490C20CFF790FF09490020C7F7FB +:107D8000B2FFCCF76EFF0749086080BD00009DA6DA +:107D90000000A9A4000081A4000031A70000B96D73 +:107DA0000000BDA600000C790100024908783C00E3 +:107DB000A0240400400840000870704758000700E5 +:107DC0000021084880B541618161017041704160C6 +:107DD00081601422C26001614262C161FFF704F850 +:107DE00080BD00001C75010080B502211D20044AE1 +:107DF0003C00DC240400D1F734F903490820CFF714 +:107E000052FF80BD000011E3000009E4000080B5CE +:107E1000012125200A4AD1F724F9CCF728FF084987 +:107E2000086208490120CFF73EFF07490220CFF73B +:107E30003AFF3C0018250400FEF7E6FF0548C1F7AD +:107E4000E1F980BD29A900001C750100A1AA00006C +:107E50002D19000045A8000010B5064C0C22227018 +:107E6000A0180549BDF7D8FF0020C8F785FB012001 +:107E7000A06010BD3C0054250400A4690100905787 +:107E80000100B0B51F4C00256580012020700A203C +:107E9000A0809020E08030202081902060813020E0 +:107EA000A0811748042207211230BEF74CF814486D +:107EB0000422052116303C0090250400BEF746F848 +:107EC0001248114AE08120827032157055700020EE +:107ED0003C23410143438918F4319B1801300428A5 +:107EE0005960F5DB084806221A300949BDF79AFFA8 +:107EF0000748054C0C300FC83C00CC25040020344A +:107F00000FC42021201CBDF762FFB0BD0000F86047 +:107F100001002C090000584001007047000007488C +:107F200010B50068002808D00648BEF79CFE041C67 +:107F3000FFF79DFE201CBEF796FE3C0008260400BD +:107F400010BD000058570100B5AD0000044980B5D0 +:107F50000020887002212020024AD1F791F880BDCC +:107F6000B479010025B5000080B5CCF78FFE01493A +:107F7000486180BDB479010080B518213C004426D9 +:107F800004001448BDF729FF1448012101700021A5 +:107F9000C1604170016100F002F900F0AAF800F040 +:107FA0001EF800F0BAF900F0CCF900F020F900F06A +:107FB00064F900F0CEF900F0FCF800F082F93C0022 +:107FC0008026040000F028F800F06EF800F04AF86F +:107FD000FFF7C2FF00F072F980BD0000407C010095 +:107FE00018630100B0B5084C0025084825772060CB +:107FF000CEF7F0FD0020E562D0F7D0FA211F08800F +:108000003C00BC260400D0F76CFBB0BD0000D47966 +:1080100001009575000080B5CCF7C1FC80BD054915 +:1080200080B500200870487003480449034A0830AE +:10803000CCF727FE80BD2C630100EDBC00004DBDD8 +:1080400000003C00F826040080B5CCF72BFE054963 +:108050004860011C0448CCF74BFE04490320CFF7CD +:108060003DFE80BD2C630100C4600100C1BC000066 +:1080700004480021002200230EC008C00249103825 +:10808000016070473C0034270400047A01001CE6BC +:10809000010080B5CCF709FE0549054A4860022178 +:1080A0002420D0F7FCFF0348C9F76BFD80BD047A9C +:1080B000010069BE000071EB000010B5044C1421F2 +:1080C000201CBDF796FE3C0070270400024820608B +:1080D00010BD0000147A0100ECE5010080B5CCF77A +:1080E000E7FD0749074A486002211F20D0F7DAFF61 +:1080F00005490120086005490C20CFF7F5FD80BD3A +:10810000147A0100D5BF00003C00AC270400805A5F +:10811000010085FF000080B5FFF74FFD0121212000 +:10812000024AD0F7C2FF80BD0000C9C1000080B57F +:10813000CCF7C1FD02490863C9F757FD80BD287A15 +:10814000010010B5CCF7B7FD164C3C00E827040041 +:108150002061CCF7B3FD60611448154908601649E9 +:1081600014480860CCF7AAFD1449086000F034F800 +:10817000FFF7E0FFFFF75EFF00F004F900F08EF874 +:10818000FFF76EFFFFF7B0FFFFF78CFF3C002428DE +:108190000400FFF704FF00F0AAF80A48BFF7BDFF8C +:1081A000C9F7BBFD09490020CFF7A7FD10BD407CF2 +:1081B00001007DB70000187E0100BDB800001C7EE4 +:1081C0000100207E0100B9BA0000812401003C00BA +:1081D0006028040080B538210148BDF719FE80BD34 +:1081E000905C010070470000B0B50C4C0B4D0020B6 +:1081F0000C3460602560E0600A202081281CC8F7EC +:108200003FFD281CC8F73AFD083D68600448C9F7DF +:108210003C009C2804001BFD201CC0F76EFA28803F +:10822000B0BDB87A0100D5330100F8B51F4E1D4C22 +:1082300000200C2141438200013009190831000659 +:10824000000E0428B150F4D318480C383061CEF732 +:10825000F4F93C00D8280400144CA078000900016F +:10826000A0700027E77067700024A50070590770A0 +:10827000201CBEF753F9715908710021201CCEF75C +:108280007DF901342406240E042CEED3074C20780B +:10829000000900013C00142904000A3020702078F5 +:1082A000F021884330302070A0780F210843A0705F +:1082B000F8BD00500700107B010080B5CCF79FFB94 +:1082C00080BDB0B50C4C0B4D00200C3460602560B7 +:1082D000E0600A2020813C0050290400281CC8F7D7 +:1082E000E1FC281CC8F7D4FC083D6860201CC0F7DE +:1082F0000DFA28800248C9F79BFCB0BD2C7B010019 +:108300004900010080B5CAF72FF880BD7047000012 +:10831000B0B5124D3C21281C3C008C290400BDF74F +:1083200086FD0F4828213C30BDF781FD0D48002116 +:1083300014380161C160FF21017041700A490A4A85 +:10834000416001210C20D0F7C8FE2C1C30340C3DBC +:108350000020D0F74AF920800C3C3C00C8290400DA +:10836000AC42F8D1B0BD0000607B010020A1070045 +:1083700035CD0000084900200C22424352181071EC +:1083800001300528F8DB04480021083801704160FD +:10839000FF21417070470000747A01003C00042AFC +:1083A000040080B578210148BDF747FD80BDC47B3E +:1083B000010080B5CAF797FA80BD7047000010B57C +:1083C0000B4CFF210531201CBDF737FD0948F0217A +:1083D0000851201C4030C5F78EF96C2106483C003E +:1083E000402A0400BDF72CFD0448C0216C30BDF7C5 +:1083F00027FD10BDC4690100B0D90100C86A0100A1 +:10840000B0B50B4D00241C20604340196C30C3F7FD +:108410000FFE0134042CF6DBCCF76EFCA863C7F723 +:108420003C007C2A040075F90448C9F71CFC034889 +:10843000CFF703FAB0BDC4690100FD800000E1225E +:10844000010010B5054C00202080034806210830AB +:10845000BDF7D5FC1420606010BD987C010010B5FC +:10846000084C3C00B82A04000020208060800648A8 +:1084700006210C30BDF7C6FC034806211230BDF7BB +:10848000C1FC1420A06010BD587C010070470000A2 +:1084900080B502210D20054AD0F72EFE0448C8F70A +:1084A0001FFC04483C00F42A0400CAF744FC80BDC9 +:1084B000000031D4000051B1000009B100000849AA +:1084C00080B500200860FFF7D0FFFFF7C0FFFFF77F +:1084D00004FC00F04AF8FFF70AFC00F03CF880BD0D +:1084E0000000E46501003C00302B040080B500F082 +:1084F00029F800F01BF800F051F800F031F880BDC9 +:10850000704700007047000080B5FF2189310248A4 +:10851000BDF7A2FC80BD0000DC71010080B50249FE +:108520000820CFF711FC80BD3C006C2B040059D90A +:10853000000080B50348CFF74CF90249488080BD60 +:1085400000008D1F0000987C010080B50348CFF724 +:1085500040F90249888080BD0000D5230000587C86 +:1085600001007047000080B502483C00A82B0400C1 +:10857000CAF7E4FB80BD000071E0000080B5CCF7D5 +:10858000A5FB02210F20064AD0F7C2FD14210548A1 +:10859000BDF768FC034878211430BDF763FC80BD4B +:1085A00035E200008466010080B5CCF73C00E42B86 +:1085B0000400B7FB0549086105490E20CFF7CDFB44 +:1085C00004490820CFF7C9FB80BDEC65010001021A +:1085D0000100C12E0000014900200870704740D9F9 +:1085E00001007047000001490020087070473C00FE +:1085F000202C0400A079010080B50748C8F7F2FFDD +:10860000064948600648C0F707FB0648C0F786FBE6 +:108610000548C9F7A3FA80BDA9E40000A0790100CC +:10862000B9E40000852E000081E40000074880B511 +:108630003C005C2C04000021002200230EC008C076 +:108640001038C821016000210C38024ACCF761FBC8 +:1086500080BDD0600100FDE5000080B5CCF767FB70 +:1086600004490860011C02480430CCF786FB80BD39 +:1086700000003C00982C0400C0600100094880B54F +:108680000A21017041700849084A81600021C160D7 +:10869000527982700161416128211830BDF7EEFBEB +:1086A00080BD00007C780100A08601000C5A01000A +:1086B000F8B50F493C00D42C04000F480D884F88B2 +:1086C00006790024301B684368230C49584341183D +:1086D0007D20C000BDF70FFD6100094AA64250523F +:1086E00000D13D1C01342406240E102CEAD3054988 +:1086F00001200861F8BD3C00102D0400F65901006E +:108700000C5A010034440F00125A01007C78010019 +:1087100080B500F0E7FA02490120086180BD000041 +:108720007C78010010B5041C081C0F494979002908 +:1087300001D10E4B00E00E4B3C004C2D0400002CF0 +:1087400007D0042111800A1C0124191CBDF7CDFBA0 +:108750000AE00124011C181C1288BDF7C6FB00F0BA +:10876000C4FA054901200861201C10BD00000C5A04 +:108770000100FE590100FA5901003C00882D040057 +:108780007C7801000D488CB5C18800AB0C4A9980FB +:1087900001890420D980188002211320D0F7D0FC51 +:1087A00000F0A6FA074901200861FFF78DFF6A462D +:1087B00001A90020FFF7BCFF8CBD00003C00C42DC8 +:1087C0000400F459010095F900007C780100F8B527 +:1087D000134E0125B5700520F070114910480EC9DF +:1087E0002C300EC0002070610F480F49104F00243C +:1087F0004860A0003958201CD1F7D7F801343C005C +:10880000002E0400102CF7D3064C0B4A2034201CF9 +:108810000A49B560CCF792FACCF79EFA3061206035 +:10882000F8BD000064730100B05801000418020094 +:1088300060000700D444010045FA000071FA00000E +:108840003C003C2E04000C4930B50023CC560B4BA9 +:108850000020F0251A5C1107090F09190F2901DD05 +:108860000F2102E0002900DA00212A405118195492 +:1088700001300E28EEDB30BD000064730100C058EB +:1088800001003C00782E0400B0B50D1C002808D073 +:10889000012414800520CCF7B5F88003C00F2870A0 +:1088A00007E028780122410452040520D0F7AEFDEC +:1088B0000124201CB0BD000098B5054C6068CCF7C1 +:1088C000F5FD00903C00B42E040000AB1888E08059 +:1088D000CEF7FBFF98BDA058010038B5031C081C5B +:1088E0000024002B174D07D00E2111800A1C0124F3 +:1088F000291CBDF70CFB22E01188042917D1011CAB +:1089000068461288BDF73C00F02E040003FB009877 +:10891000002801DB323000E032380090011C642076 +:10892000BDF798FB0106091600900E22281CBDF722 +:1089300085FB06E00E2905D10A1C011C281CBDF789 +:10894000E9FA0124201C38BD3C002C2F0400DA5920 +:10895000010038B5031C081C0024002B174D07D05C +:108960000E2111800A1C0124291CBDF7D6FA22E031 +:108970001188042917D1011C68461288BDF7CDFA69 +:108980000098002801DB323000E03C00682F040032 +:1089900032380090011C6420BDF762FB0106091605 +:1089A00000900E22281CBDF74FFB06E00E2905D1D2 +:1089B0000A1C011C281CBDF7B3FA0124201C38BD79 +:1089C000CC590100034880B5017800203C00A42F59 +:1089D0000400CCF7B4FB80BD0000A658010070472E +:1089E00000000249032008700020487070479C7303 +:1089F000010080B502211120024AD0F7BCFB80BDE6 +:108A00000000A1FE0000F0B50B4F1C1C00233C0031 +:108A1000E02F0400FD562B1C062D01D10120F0BDD6 +:108A2000064E051CD80034363554801941708270CA +:108A30004460581C38700020F0BD0000985A0100B6 +:108A400010B5041C0C4800F021F96078FF2804D010 +:108A50003C001C3004000123E056062100F0CDF854 +:108A6000084A012110780843074908702023184359 +:108A70000870802318431070087010BD0000919B8F +:108A80000000E06001000400070010B50A49041C62 +:108A900008783C005830040040084000087008493D +:108AA0000870084800F0F8F86078FF2804D0012327 +:108AB000E056052100F0A4F810BD0000E0600100C0 +:108AC00004000700919B00000348002100220023BE +:108AD0000EC008C03C009430040070470000E860FD +:108AE00001007047000010B5074C00206060208036 +:108AF000E06002211420044AD0F749FB02481030FC +:108B0000A06010BD000058750100051D01007047F0 +:108B1000000010B548213C00D03004000A48BDF7E1 +:108B2000E3F9094CE0214834201CBDF7DDF90020B1 +:108B3000C10009190A1C083201301B284A60F7D30A +:108B400001480438046010BD685B010080B5022153 +:108B50002320024AD0F71EFB3C000C31040080BDEC +:108B600000004523010080B5FFF76BF880BD70471A +:108B70000000F8B501201D49C00748601D49FF20CD +:108B800008731C4E10203060050135601B4C80219D +:108B9000201CBDF7ACF90021194A3C004831040003 +:108BA000154F00200B011B195A60CB00DB191874FC +:108BB00001310829F6DB0F4CFA212180124961802E +:108BC000A0606A4611490420BDF730FF6A4610498B +:108BD0000820BDF72BFF1020706075603C008431C9 +:108BE000040060680221084360600B49064A081CC3 +:108BF0001030083A03C2F8BD000000010700006011 +:108C0000070000100700AC730100D1750000204E72 +:108C10000000052C0100112C010000A007003C0001 +:108C2000C031040070B50E1C0024C4F75BFE0028A0 +:108C30003BD04568FF2D38D00C2E28D201A39B5D78 +:108C40005B009F440507090B0D101316181B1E210E +:108C5000182420E030241EE060241CE0C0241AE028 +:108C60003C00FC310400FF24813417E00924A401F6 +:108C700014E00924E40111E00F4C0FE00924240260 +:108C80000CE00924640209E00324E40206E009245C +:108C9000A40203E009219E20BEF739F86000001904 +:108CA00040083C0038320400054980044018054A59 +:108CB000A900891848606420604370BDDC0700008B +:108CC0008038010004000700024980B50860D0F731 +:108CD00097F880BD5C5B0100F8B50026174C174B78 +:108CE000194926703C0074320400002014330D88AA +:108CF000154E154A04E0C100CF187A605E5001306D +:108D0000A842F8DBC6F72BFDFF21114DA531281C29 +:108D1000BDF7FFF80021281C021C1432C260101C91 +:108D200001311429F8DB3C00B03204000026C66093 +:108D300005480C3060C009481821BDF7EDF8012046 +:108D4000043441C40020F8BD705D010009A000009A +:108D500030D9010056570100045F0100A8600100EE +:108D600080B50020CFF7B6FC3C00EC32040001498E +:108D7000088080BD00002C7401001148F8B54179CD +:108D8000002902D105780F4E01E045780F4E0223ED +:108D9000F75E0024601B784364230C495843411854 +:108DA0007D20C000BDF7F5F961003C0028330400C8 +:108DB000094AAC42505201D10023F75E0134240627 +:108DC000240E102CE9D3F8BD0C5A0100FE59010005 +:108DD000FA59010034440F00325A010038B5104CE2 +:108DE000BE252573207A1821884320723C00643305 +:108DF00004006A460D490D20BDF733FE01200B49E2 +:108E000040030860486025732D20C003206025734F +:108E1000207A102108432072064806490860002085 +:108E2000486038BD0000000307008D3E01002400AB +:108E3000A0330400001007000087930304790100A9 +:108E400080B502211520024AD0F7C8F980BD000084 +:108E50000D3E010070470000040000600400440063 +:108E60000000040040200700FFFFFFFF4D656D6F0D +:108E7000727920636865636B2E2E2E00204F4B0A9B +:108E800000000000204641494C0A000057726974F6 +:108E9000696E67206669726D7761726520646174BE +:108EA0006120746F20666C6173680A005665726990 +:108EB0006679696E67206669726D77617265206494 +:108EC0006174610A00000000566572696679206667 +:108ED00061696C6564206174206279746520256421 +:108EE0002C2030782530327820213D2030782530F4 +:108EF00032780A004669726D776172652073756316 +:108F00006365737366756C6C792073746F726564D6 +:108F100020696E20666C617368210A0005000600F6 +:108F200000000001000001480000000B0000014C9F +:108F300000000009000001780000000F0000019C03 +:108F400000000001000001D800000001000001DC69 +:108F50000000000100000108000000010000010CF9 +:108F600000000001000001100000000100000114D9 +:108F70000000000100000118000000010000011CB9 +:108F80000000000100000120000000010000012499 +:108F9000000000030000012800000001000001346F +:108FA0000000000100000138000000010000013C49 +:108FB0000000000100000140000000010000014429 +:040000058000000077 +:00000001FF diff --git a/firmware/libraries/WiFi/extras/binary/wifi_dnld_2_1.elf b/firmware/libraries/WiFi/extras/binary/wifi_dnld_2_1.elf new file mode 100644 index 0000000..7ccbf4d Binary files /dev/null and b/firmware/libraries/WiFi/extras/binary/wifi_dnld_2_1.elf differ diff --git a/firmware/libraries/WiFi/extras/scripts/ArduinoWifiShield_upgrade.sh b/firmware/libraries/WiFi/extras/scripts/ArduinoWifiShield_upgrade.sh new file mode 100644 index 0000000..b767d76 --- /dev/null +++ b/firmware/libraries/WiFi/extras/scripts/ArduinoWifiShield_upgrade.sh @@ -0,0 +1,121 @@ +#!/bin/sh + +#WIFI_FW_PATH="/hardware/arduino/firmwares/wifishield/binary" +WIFI_FW_PATH="/libraries/WiFi/extras/binary" +AVR_TOOLS_PATH="/hardware/tools/avr/bin" + +TARGET_MICRO="at32uc3a1256" + + +progname=$0 + +usage () { +cat <&2 + usage + exit 1 + ;; + :) + echo "Option -$OPTARG requires an argument." >&2 + exit 1 + ;; + esac + done +else + echo "Please retry running the script as root.\n" +fi + +shift $(($OPTIND - 1)) diff --git a/firmware/libraries/WiFi/extras/wifiHD/.cproject b/firmware/libraries/WiFi/extras/wifiHD/.cproject new file mode 100644 index 0000000..fa7fcdd --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/.cproject @@ -0,0 +1,4045 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/firmware/libraries/WiFi/extras/wifiHD/.project b/firmware/libraries/WiFi/extras/wifiHD/.project new file mode 100644 index 0000000..c284bab --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/.project @@ -0,0 +1,77 @@ + + + wifiHD + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + ?name? + + + + org.eclipse.cdt.make.core.append_environment + true + + + org.eclipse.cdt.make.core.buildArguments + + + + org.eclipse.cdt.make.core.buildCommand + make + + + org.eclipse.cdt.make.core.buildLocation + ${workspace_loc:/wifiHD/Debug} + + + org.eclipse.cdt.make.core.contents + org.eclipse.cdt.make.core.activeConfigSettings + + + org.eclipse.cdt.make.core.enableAutoBuild + false + + + org.eclipse.cdt.make.core.enableCleanBuild + true + + + org.eclipse.cdt.make.core.enableFullBuild + true + + + org.eclipse.cdt.make.core.stopOnError + true + + + org.eclipse.cdt.make.core.useDefaultBuildCmd + true + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + + + + + + com.atmel.avr32.core.nature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + UC3 Software Framework + 2 + framework:/com.atmel.avr32.sf.uc3 + + + diff --git a/firmware/libraries/WiFi/extras/wifiHD/Release/wifiHD.elf b/firmware/libraries/WiFi/extras/wifiHD/Release/wifiHD.elf new file mode 100644 index 0000000..d4a8bde Binary files /dev/null and b/firmware/libraries/WiFi/extras/wifiHD/Release/wifiHD.elf differ diff --git a/firmware/libraries/WiFi/extras/wifiHD/Release/wifiHD.hex b/firmware/libraries/WiFi/extras/wifiHD/Release/wifiHD.hex new file mode 100644 index 0000000..0122587 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/Release/wifiHD.hex @@ -0,0 +1,16358 @@ +:0200000480007A +:10000000E08F100000000000000000000000000071 +:1000100000000000000000000000000000000000E0 +:1000200000000000000000000000000000000000D0 +:1000300000000000000000000000000000000000C0 +:1000400000000000000000000000000000000000B0 +:1000500000000000000000000000000000000000A0 +:100060000000000000000000000000000000000090 +:100070000000000000000000000000000000000080 +:100080000000000000000000000000000000000070 +:100090000000000000000000000000000000000060 +:1000A0000000000000000000000000000000000050 +:1000B0000000000000000000000000000000000040 +:1000C0000000000000000000000000000000000030 +:1000D0000000000000000000000000000000000020 +:1000E0000000000000000000000000000000000010 +:1000F0000000000000000000000000000000000000 +:1001000000000000000000000000000000000000EF +:1001100000000000000000000000000000000000DF +:1001200000000000000000000000000000000000CF +:1001300000000000000000000000000000000000BF +:1001400000000000000000000000000000000000AF +:10015000000000000000000000000000000000009F +:10016000000000000000000000000000000000008F +:10017000000000000000000000000000000000007F +:10018000000000000000000000000000000000006F +:10019000000000000000000000000000000000005F +:1001A000000000000000000000000000000000004F +:1001B000000000000000000000000000000000003F +:1001C000000000000000000000000000000000002F +:1001D000000000000000000000000000000000001F +:1001E000000000000000000000000000000000000F +:1001F00000000000000000000000000000000000FF +:1002000000000000000000000000000000000000EE +:1002100000000000000000000000000000000000DE +:1002200000000000000000000000000000000000CE +:1002300000000000000000000000000000000000BE +:1002400000000000000000000000000000000000AE +:10025000000000000000000000000000000000009E +:10026000000000000000000000000000000000008E +:10027000000000000000000000000000000000007E +:10028000000000000000000000000000000000006E +:10029000000000000000000000000000000000005E +:1002A000000000000000000000000000000000004E +:1002B000000000000000000000000000000000003E +:1002C000000000000000000000000000000000002E +:1002D000000000000000000000000000000000001E +:1002E000000000000000000000000000000000000E +:1002F00000000000000000000000000000000000FE +:1003000000000000000000000000000000000000ED +:1003100000000000000000000000000000000000DD +:1003200000000000000000000000000000000000CD +:1003300000000000000000000000000000000000BD +:1003400000000000000000000000000000000000AD +:10035000000000000000000000000000000000009D +:10036000000000000000000000000000000000008D +:10037000000000000000000000000000000000007D +:10038000000000000000000000000000000000006D +:10039000000000000000000000000000000000005D +:1003A000000000000000000000000000000000004D +:1003B000000000000000000000000000000000003D +:1003C000000000000000000000000000000000002D +:1003D000000000000000000000000000000000001D +:1003E000000000000000000000000000000000000D +:1003F00000000000000000000000000000000000FD +:1004000000000000000000000000000000000000EC +:1004100000000000000000000000000000000000DC +:1004200000000000000000000000000000000000CC +:1004300000000000000000000000000000000000BC +:1004400000000000000000000000000000000000AC +:10045000000000000000000000000000000000009C +:10046000000000000000000000000000000000008C +:10047000000000000000000000000000000000007C +:10048000000000000000000000000000000000006C +:10049000000000000000000000000000000000005C +:1004A000000000000000000000000000000000004C +:1004B000000000000000000000000000000000003C +:1004C000000000000000000000000000000000002C +:1004D000000000000000000000000000000000001C +:1004E000000000000000000000000000000000000C +:1004F00000000000000000000000000000000000FC +:1005000000000000000000000000000000000000EB +:1005100000000000000000000000000000000000DB +:1005200000000000000000000000000000000000CB +:1005300000000000000000000000000000000000BB +:1005400000000000000000000000000000000000AB +:10055000000000000000000000000000000000009B +:10056000000000000000000000000000000000008B +:10057000000000000000000000000000000000007B +:10058000000000000000000000000000000000006B +:10059000000000000000000000000000000000005B +:1005A000000000000000000000000000000000004B +:1005B000000000000000000000000000000000003B +:1005C000000000000000000000000000000000002B +:1005D000000000000000000000000000000000001B +:1005E000000000000000000000000000000000000B +:1005F00000000000000000000000000000000000FB +:1006000000000000000000000000000000000000EA +:1006100000000000000000000000000000000000DA +:1006200000000000000000000000000000000000CA +:1006300000000000000000000000000000000000BA +:1006400000000000000000000000000000000000AA +:10065000000000000000000000000000000000009A +:10066000000000000000000000000000000000008A +:10067000000000000000000000000000000000007A +:10068000000000000000000000000000000000006A +:10069000000000000000000000000000000000005A +:1006A000000000000000000000000000000000004A +:1006B000000000000000000000000000000000003A +:1006C000000000000000000000000000000000002A +:1006D000000000000000000000000000000000001A +:1006E000000000000000000000000000000000000A +:1006F00000000000000000000000000000000000FA +:1007000000000000000000000000000000000000E9 +:1007100000000000000000000000000000000000D9 +:1007200000000000000000000000000000000000C9 +:1007300000000000000000000000000000000000B9 +:1007400000000000000000000000000000000000A9 +:100750000000000000000000000000000000000099 +:100760000000000000000000000000000000000089 +:100770000000000000000000000000000000000079 +:100780000000000000000000000000000000000069 +:100790000000000000000000000000000000000059 +:1007A0000000000000000000000000000000000049 +:1007B0000000000000000000000000000000000039 +:1007C0000000000000000000000000000000000029 +:1007D0000000000000000000000000000000000019 +:1007E0000000000000000000000000000000000009 +:1007F00000000000000000000000000000000000F9 +:1008000000000000000000000000000000000000E8 +:1008100000000000000000000000000000000000D8 +:1008200000000000000000000000000000000000C8 +:1008300000000000000000000000000000000000B8 +:1008400000000000000000000000000000000000A8 +:100850000000000000000000000000000000000098 +:100860000000000000000000000000000000000088 +:100870000000000000000000000000000000000078 +:100880000000000000000000000000000000000068 +:100890000000000000000000000000000000000058 +:1008A0000000000000000000000000000000000048 +:1008B0000000000000000000000000000000000038 +:1008C0000000000000000000000000000000000028 +:1008D0000000000000000000000000000000000018 +:1008E0000000000000000000000000000000000008 +:1008F00000000000000000000000000000000000F8 +:1009000000000000000000000000000000000000E7 +:1009100000000000000000000000000000000000D7 +:1009200000000000000000000000000000000000C7 +:1009300000000000000000000000000000000000B7 +:1009400000000000000000000000000000000000A7 +:100950000000000000000000000000000000000097 +:100960000000000000000000000000000000000087 +:100970000000000000000000000000000000000077 +:100980000000000000000000000000000000000067 +:100990000000000000000000000000000000000057 +:1009A0000000000000000000000000000000000047 +:1009B0000000000000000000000000000000000037 +:1009C0000000000000000000000000000000000027 +:1009D0000000000000000000000000000000000017 +:1009E0000000000000000000000000000000000007 +:1009F00000000000000000000000000000000000F7 +:100A000000000000000000000000000000000000E6 +:100A100000000000000000000000000000000000D6 +:100A200000000000000000000000000000000000C6 +:100A300000000000000000000000000000000000B6 +:100A400000000000000000000000000000000000A6 +:100A50000000000000000000000000000000000096 +:100A60000000000000000000000000000000000086 +:100A70000000000000000000000000000000000076 +:100A80000000000000000000000000000000000066 +:100A90000000000000000000000000000000000056 +:100AA0000000000000000000000000000000000046 +:100AB0000000000000000000000000000000000036 +:100AC0000000000000000000000000000000000026 +:100AD0000000000000000000000000000000000016 +:100AE0000000000000000000000000000000000006 +:100AF00000000000000000000000000000000000F6 +:100B000000000000000000000000000000000000E5 +:100B100000000000000000000000000000000000D5 +:100B200000000000000000000000000000000000C5 +:100B300000000000000000000000000000000000B5 +:100B400000000000000000000000000000000000A5 +:100B50000000000000000000000000000000000095 +:100B60000000000000000000000000000000000085 +:100B70000000000000000000000000000000000075 +:100B80000000000000000000000000000000000065 +:100B90000000000000000000000000000000000055 +:100BA0000000000000000000000000000000000045 +:100BB0000000000000000000000000000000000035 +:100BC0000000000000000000000000000000000025 +:100BD0000000000000000000000000000000000015 +:100BE0000000000000000000000000000000000005 +:100BF00000000000000000000000000000000000F5 +:100C000000000000000000000000000000000000E4 +:100C100000000000000000000000000000000000D4 +:100C200000000000000000000000000000000000C4 +:100C300000000000000000000000000000000000B4 +:100C400000000000000000000000000000000000A4 +:100C50000000000000000000000000000000000094 +:100C60000000000000000000000000000000000084 +:100C70000000000000000000000000000000000074 +:100C80000000000000000000000000000000000064 +:100C90000000000000000000000000000000000054 +:100CA0000000000000000000000000000000000044 +:100CB0000000000000000000000000000000000034 +:100CC0000000000000000000000000000000000024 +:100CD0000000000000000000000000000000000014 +:100CE0000000000000000000000000000000000004 +:100CF00000000000000000000000000000000000F4 +:100D000000000000000000000000000000000000E3 +:100D100000000000000000000000000000000000D3 +:100D200000000000000000000000000000000000C3 +:100D300000000000000000000000000000000000B3 +:100D400000000000000000000000000000000000A3 +:100D50000000000000000000000000000000000093 +:100D60000000000000000000000000000000000083 +:100D70000000000000000000000000000000000073 +:100D80000000000000000000000000000000000063 +:100D90000000000000000000000000000000000053 +:100DA0000000000000000000000000000000000043 +:100DB0000000000000000000000000000000000033 +:100DC0000000000000000000000000000000000023 +:100DD0000000000000000000000000000000000013 +:100DE0000000000000000000000000000000000003 +:100DF00000000000000000000000000000000000F3 +:100E000000000000000000000000000000000000E2 +:100E100000000000000000000000000000000000D2 +:100E200000000000000000000000000000000000C2 +:100E300000000000000000000000000000000000B2 +:100E400000000000000000000000000000000000A2 +:100E50000000000000000000000000000000000092 +:100E60000000000000000000000000000000000082 +:100E70000000000000000000000000000000000072 +:100E80000000000000000000000000000000000062 +:100E90000000000000000000000000000000000052 +:100EA0000000000000000000000000000000000042 +:100EB0000000000000000000000000000000000032 +:100EC0000000000000000000000000000000000022 +:100ED0000000000000000000000000000000000012 +:100EE0000000000000000000000000000000000002 +:100EF00000000000000000000000000000000000F2 +:100F000000000000000000000000000000000000E1 +:100F100000000000000000000000000000000000D1 +:100F200000000000000000000000000000000000C1 +:100F300000000000000000000000000000000000B1 +:100F400000000000000000000000000000000000A1 +:100F50000000000000000000000000000000000091 +:100F60000000000000000000000000000000000081 +:100F70000000000000000000000000000000000071 +:100F80000000000000000000000000000000000061 +:100F90000000000000000000000000000000000051 +:100FA0000000000000000000000000000000000041 +:100FB0000000000000000000000000000000000031 +:100FC0000000000000000000000000000000000021 +:100FD0000000000000000000000000000000000011 +:100FE0000000000000000000000000000000000001 +:100FF00000000000000000000000000000000000F1 +:1010000000000000000000000000000000000000E0 +:1010100000000000000000000000000000000000D0 +:1010200000000000000000000000000000000000C0 +:1010300000000000000000000000000000000000B0 +:1010400000000000000000000000000000000000A0 +:101050000000000000000000000000000000000090 +:101060000000000000000000000000000000000080 +:101070000000000000000000000000000000000070 +:101080000000000000000000000000000000000060 +:101090000000000000000000000000000000000050 +:1010A0000000000000000000000000000000000040 +:1010B0000000000000000000000000000000000030 +:1010C0000000000000000000000000000000000020 +:1010D0000000000000000000000000000000000010 +:1010E0000000000000000000000000000000000000 +:1010F00000000000000000000000000000000000F0 +:1011000000000000000000000000000000000000DF +:1011100000000000000000000000000000000000CF +:1011200000000000000000000000000000000000BF +:1011300000000000000000000000000000000000AF +:10114000000000000000000000000000000000009F +:10115000000000000000000000000000000000008F +:10116000000000000000000000000000000000007F +:10117000000000000000000000000000000000006F +:10118000000000000000000000000000000000005F +:10119000000000000000000000000000000000004F +:1011A000000000000000000000000000000000003F +:1011B000000000000000000000000000000000002F +:1011C000000000000000000000000000000000001F +:1011D000000000000000000000000000000000000F +:1011E00000000000000000000000000000000000FF +:1011F00000000000000000000000000000000000EF +:1012000000000000000000000000000000000000DE +:1012100000000000000000000000000000000000CE +:1012200000000000000000000000000000000000BE +:1012300000000000000000000000000000000000AE +:10124000000000000000000000000000000000009E +:10125000000000000000000000000000000000008E +:10126000000000000000000000000000000000007E +:10127000000000000000000000000000000000006E +:10128000000000000000000000000000000000005E +:10129000000000000000000000000000000000004E +:1012A000000000000000000000000000000000003E +:1012B000000000000000000000000000000000002E +:1012C000000000000000000000000000000000001E +:1012D000000000000000000000000000000000000E +:1012E00000000000000000000000000000000000FE +:1012F00000000000000000000000000000000000EE +:1013000000000000000000000000000000000000DD +:1013100000000000000000000000000000000000CD +:1013200000000000000000000000000000000000BD +:1013300000000000000000000000000000000000AD +:10134000000000000000000000000000000000009D +:10135000000000000000000000000000000000008D +:10136000000000000000000000000000000000007D +:10137000000000000000000000000000000000006D +:10138000000000000000000000000000000000005D +:10139000000000000000000000000000000000004D +:1013A000000000000000000000000000000000003D +:1013B000000000000000000000000000000000002D +:1013C000000000000000000000000000000000001D +:1013D000000000000000000000000000000000000D +:1013E00000000000000000000000000000000000FD +:1013F00000000000000000000000000000000000ED +:1014000000000000000000000000000000000000DC +:1014100000000000000000000000000000000000CC +:1014200000000000000000000000000000000000BC +:1014300000000000000000000000000000000000AC +:10144000000000000000000000000000000000009C +:10145000000000000000000000000000000000008C +:10146000000000000000000000000000000000007C +:10147000000000000000000000000000000000006C +:10148000000000000000000000000000000000005C +:10149000000000000000000000000000000000004C +:1014A000000000000000000000000000000000003C +:1014B000000000000000000000000000000000002C +:1014C000000000000000000000000000000000001C +:1014D000000000000000000000000000000000000C +:1014E00000000000000000000000000000000000FC +:1014F00000000000000000000000000000000000EC +:1015000000000000000000000000000000000000DB +:1015100000000000000000000000000000000000CB +:1015200000000000000000000000000000000000BB +:1015300000000000000000000000000000000000AB +:10154000000000000000000000000000000000009B +:10155000000000000000000000000000000000008B +:10156000000000000000000000000000000000007B +:10157000000000000000000000000000000000006B +:10158000000000000000000000000000000000005B +:10159000000000000000000000000000000000004B +:1015A000000000000000000000000000000000003B +:1015B000000000000000000000000000000000002B +:1015C000000000000000000000000000000000001B +:1015D000000000000000000000000000000000000B +:1015E00000000000000000000000000000000000FB +:1015F00000000000000000000000000000000000EB +:1016000000000000000000000000000000000000DA +:1016100000000000000000000000000000000000CA +:1016200000000000000000000000000000000000BA +:1016300000000000000000000000000000000000AA +:10164000000000000000000000000000000000009A +:10165000000000000000000000000000000000008A +:10166000000000000000000000000000000000007A +:10167000000000000000000000000000000000006A +:10168000000000000000000000000000000000005A +:10169000000000000000000000000000000000004A +:1016A000000000000000000000000000000000003A +:1016B000000000000000000000000000000000002A +:1016C000000000000000000000000000000000001A +:1016D000000000000000000000000000000000000A +:1016E00000000000000000000000000000000000FA +:1016F00000000000000000000000000000000000EA +:1017000000000000000000000000000000000000D9 +:1017100000000000000000000000000000000000C9 +:1017200000000000000000000000000000000000B9 +:1017300000000000000000000000000000000000A9 +:101740000000000000000000000000000000000099 +:101750000000000000000000000000000000000089 +:101760000000000000000000000000000000000079 +:101770000000000000000000000000000000000069 +:101780000000000000000000000000000000000059 +:101790000000000000000000000000000000000049 +:1017A0000000000000000000000000000000000039 +:1017B0000000000000000000000000000000000029 +:1017C0000000000000000000000000000000000019 +:1017D0000000000000000000000000000000000009 +:1017E00000000000000000000000000000000000F9 +:1017F00000000000000000000000000000000000E9 +:1018000000000000000000000000000000000000D8 +:1018100000000000000000000000000000000000C8 +:1018200000000000000000000000000000000000B8 +:1018300000000000000000000000000000000000A8 +:101840000000000000000000000000000000000098 +:101850000000000000000000000000000000000088 +:101860000000000000000000000000000000000078 +:101870000000000000000000000000000000000068 +:101880000000000000000000000000000000000058 +:101890000000000000000000000000000000000048 +:1018A0000000000000000000000000000000000038 +:1018B0000000000000000000000000000000000028 +:1018C0000000000000000000000000000000000018 +:1018D0000000000000000000000000000000000008 +:1018E00000000000000000000000000000000000F8 +:1018F00000000000000000000000000000000000E8 +:1019000000000000000000000000000000000000D7 +:1019100000000000000000000000000000000000C7 +:1019200000000000000000000000000000000000B7 +:1019300000000000000000000000000000000000A7 +:101940000000000000000000000000000000000097 +:101950000000000000000000000000000000000087 +:101960000000000000000000000000000000000077 +:101970000000000000000000000000000000000067 +:101980000000000000000000000000000000000057 +:101990000000000000000000000000000000000047 +:1019A0000000000000000000000000000000000037 +:1019B0000000000000000000000000000000000027 +:1019C0000000000000000000000000000000000017 +:1019D0000000000000000000000000000000000007 +:1019E00000000000000000000000000000000000F7 +:1019F00000000000000000000000000000000000E7 +:101A000000000000000000000000000000000000D6 +:101A100000000000000000000000000000000000C6 +:101A200000000000000000000000000000000000B6 +:101A300000000000000000000000000000000000A6 +:101A40000000000000000000000000000000000096 +:101A50000000000000000000000000000000000086 +:101A60000000000000000000000000000000000076 +:101A70000000000000000000000000000000000066 +:101A80000000000000000000000000000000000056 +:101A90000000000000000000000000000000000046 +:101AA0000000000000000000000000000000000036 +:101AB0000000000000000000000000000000000026 +:101AC0000000000000000000000000000000000016 +:101AD0000000000000000000000000000000000006 +:101AE00000000000000000000000000000000000F6 +:101AF00000000000000000000000000000000000E6 +:101B000000000000000000000000000000000000D5 +:101B100000000000000000000000000000000000C5 +:101B200000000000000000000000000000000000B5 +:101B300000000000000000000000000000000000A5 +:101B40000000000000000000000000000000000095 +:101B50000000000000000000000000000000000085 +:101B60000000000000000000000000000000000075 +:101B70000000000000000000000000000000000065 +:101B80000000000000000000000000000000000055 +:101B90000000000000000000000000000000000045 +:101BA0000000000000000000000000000000000035 +:101BB0000000000000000000000000000000000025 +:101BC0000000000000000000000000000000000015 +:101BD0000000000000000000000000000000000005 +:101BE00000000000000000000000000000000000F5 +:101BF00000000000000000000000000000000000E5 +:101C000000000000000000000000000000000000D4 +:101C100000000000000000000000000000000000C4 +:101C200000000000000000000000000000000000B4 +:101C300000000000000000000000000000000000A4 +:101C40000000000000000000000000000000000094 +:101C50000000000000000000000000000000000084 +:101C60000000000000000000000000000000000074 +:101C70000000000000000000000000000000000064 +:101C80000000000000000000000000000000000054 +:101C90000000000000000000000000000000000044 +:101CA0000000000000000000000000000000000034 +:101CB0000000000000000000000000000000000024 +:101CC0000000000000000000000000000000000014 +:101CD0000000000000000000000000000000000004 +:101CE00000000000000000000000000000000000F4 +:101CF00000000000000000000000000000000000E4 +:101D000000000000000000000000000000000000D3 +:101D100000000000000000000000000000000000C3 +:101D200000000000000000000000000000000000B3 +:101D300000000000000000000000000000000000A3 +:101D40000000000000000000000000000000000093 +:101D50000000000000000000000000000000000083 +:101D60000000000000000000000000000000000073 +:101D70000000000000000000000000000000000063 +:101D80000000000000000000000000000000000053 +:101D90000000000000000000000000000000000043 +:101DA0000000000000000000000000000000000033 +:101DB0000000000000000000000000000000000023 +:101DC0000000000000000000000000000000000013 +:101DD0000000000000000000000000000000000003 +:101DE00000000000000000000000000000000000F3 +:101DF00000000000000000000000000000000000E3 +:101E000000000000000000000000000000000000D2 +:101E100000000000000000000000000000000000C2 +:101E200000000000000000000000000000000000B2 +:101E300000000000000000000000000000000000A2 +:101E40000000000000000000000000000000000092 +:101E50000000000000000000000000000000000082 +:101E60000000000000000000000000000000000072 +:101E70000000000000000000000000000000000062 +:101E80000000000000000000000000000000000052 +:101E90000000000000000000000000000000000042 +:101EA0000000000000000000000000000000000032 +:101EB0000000000000000000000000000000000022 +:101EC0000000000000000000000000000000000012 +:101ED0000000000000000000000000000000000002 +:101EE00000000000000000000000000000000000F2 +:101EF00000000000000000000000000000000000E2 +:101F000000000000000000000000000000000000D1 +:101F100000000000000000000000000000000000C1 +:101F200000000000000000000000000000000000B1 +:101F300000000000000000000000000000000000A1 +:101F40000000000000000000000000000000000091 +:101F50000000000000000000000000000000000081 +:101F60000000000000000000000000000000000071 +:101F70000000000000000000000000000000000061 +:101F80000000000000000000000000000000000051 +:101F90000000000000000000000000000000000041 +:101FA0000000000000000000000000000000000031 +:101FB0000000000000000000000000000000000021 +:101FC0000000000000000000000000000000000011 +:101FD0000000000000000000000000000000000001 +:101FE00000000000000000000000000000000000F1 +:101FF00000000000000000000000000000000000E1 +:08200000481F000080013E04AE +:102008003038F00C19005EBC5C7C4848F00C003994 +:10201800F00C093BB22A5EFC000011C0F80815015B +:102028003039F20C1800E08800035EFDF00B000B5D +:102038004828F00B032C5EFC00007B08580CC0D02D +:1020480048787829F00900293008720A143CC060E1 +:102058002FF82F895848CFA13FF85EF800007B0879 +:102068003038F00C18005EBCF60C001C30094838FB +:10207800F00C09295EFC000000007B085EFFD70316 +:10208800D4011988301EB6881998B6BEEA18FFFF21 +:10209800E818FF80B6AEB698580AC0301588C0A8B0 +:1020A80048981188F4081800C0303038C03848788B +:1020B80011B8B6C83EE8B6D83008B6E8302C306853 +:1020C800B208D802000016AB00000008D40130188E +:1020D800198EB68E199CB6A8EA1CFFFFE81CFF8073 +:1020E800B6B8B69C580AC0A0158CE06A00FFF00C80 +:1020F8001800F4081710F9B80001B6C83EE8B6D8B9 +:102108003008B6E8302C3068B208D802D421202D27 +:102118004AAA189E1698129674075807C071FACAE8 +:10212800FFF814F7F01F0026C4681989B6891999B1 +:10213800EA19FFFFE819FF80B6993039B0A9740988 +:102148007219F20C1618B0F9B0CCF9D9C108F3D944 +:10215800C208B0ECB0D9304BB0BB74097229F20C8C +:102168001618F169000CF16C0009F9D9C108F3D906 +:10217800C208F16C000BF16B0008F169000A7409E0 +:10218800300A7239F16A00133EEAF16A0012F20A63 +:102198001618F1690011F16A000EF16B000DF5D9FE +:1021A800C108F3D9C208F16A0010F169000F302C98 +:1021B8003138AC082FEDD8220000152C800020D42F +:1021C8003038F00C18005EBCF60C001B48F8F00B19 +:1021D800032858085E0C704958195E1C7029581954 +:1021E800C09148B8F00C003C9828B42878089508A5 +:1021F8005EFC71E85808F0091700F1F91001F1F8D0 +:10220800120A9509B4285EFC00007B08000011C082 +:10221800D4314BC8300A10941499910A1893301A83 +:102228004B984BA7910A3EE14B921296C0280A9907 +:10223800E0682710C0485808C5602018664AE21AA6 +:102248000201E04A0201CF81C4F8F2C5FFFFE20AA9 +:102258001800CEE10F9BF7DBC0C15825E0890005C7 +:102268003038300AC2E80FAA3038C148580BC0A02D +:10227800EE08070EEE08000CA96E2FE8199C1C0842 +:10228800C058F0CCFFFFEE080708201AF80800082D +:102298005C5A10395F9CEC0A18005F9EFDEC000C3C +:1022A800EC0C1800CE4110395F09F9DAC008EC0CC3 +:1022B80018005F0CF9E90009EC091800C020D83AA9 +:1022C800840C3009F20C1900CB34201D5C6A1ADB2F +:1022D8001AD849081ADA490C1AD51AD8F01F000F6B +:1022E8002FADCA6BDA3A662A68085C5A2FF8EE09ED +:1022F8000B0A8908E0480063FE9AFFA9305CD832CF +:10230800000014B0000011B8000014B8000016A2B4 +:102318008003792C80037AB0800094C4D431202DB6 +:102328004C68149570081896169712945808C0713E +:10233800FACAFFF814F8F01F0042CC38198830198F +:10234800B6881998B6A9EA18FFFFE818FF80B6986A +:102358004BC89088EDB80002C171189330023EE175 +:102368000788201D4B8C1AD8F01F00382FF22FED4C +:102378000788E2081800C0502FF3E0420400CF118C +:102388004B3CF01F00320DC83099F2081800E08865 +:1023980000114B09920A3009F20A1900E0840091F1 +:1023A8001AD84AD84ADC1AD8F01F00282FEDC88856 +:1023B800E0450032C290A3684A99E0450033C5D091 +:1023C800129B7209F2080309EECAFFFCF3360020DB +:1023D8003009AEB6C088760CF808030CF809070C6B +:1023E8002FF914CCEC091900CF7349A99289EDB9DA +:1023F8000004C5F149A97209F2080308499C1AD8D2 +:1024080049581AD8C538304BA368495A7409F20894 +:10241800030972C9AEBBF20B1618AEC9AEFBF7D9E9 +:10242800C108F3D9C208AEDBAEE948A99289EDB973 +:102438000004C1903046C3D80000152C800020D479 +:10244800000016A080037AF0800094C4800384D42E +:10245800000016A28003785880037AF8000015203F +:1024680080037B187409F208030870C8496C1AD8ED +:10247800304649681AD8C1A8301AAEBA720AF408A8 +:10248800030AF53A0038AECA491A948AEDBA00042C +:10249800C0303016C0E87209F2080308F138003875 +:1024A80048CC1AD8301648981AD8F01F000B2FEDD0 +:1024B8003EE80C07AEC83008AED82FB6A806302CB8 +:1024C8002FEDD83280037B2880037858000016A2AD +:1024D80080037B38800094C4D421204D4A981897F3 +:1024E800118A580AC0313FF6C0D84A7811BC118EFB +:1024F800119611A8B166EDEE1186EDE81086F9E6A1 +:1025080010064A289088EDB80002C0E14A08201D4C +:102518004A0C1ADA1AD61AD8505B5049F01F001E16 +:102528002FCD4009401B49D870085808C081FACA05 +:10253800FFF00E9C14F8F01F001AC2080F88B68826 +:102548000F98EA18FFFFE818FF80B6983018B6A869 +:102558003048B6B8F1D6C108B6E83EE8EC0A161815 +:10256800B6F6F7680008B6CA3008EDD6C208F768AC +:102578000009B6D63098302CB2082FCDD8220000EA +:102588000000152800007B28000016A28003782090 +:1025980080037B48800094C40000152C800020D460 +:1025A800D401580BC0313FF8C0C8178A17B917981B +:1025B800B168F1EA118817AAF1EA1088F3E810085F +:1025C800F00A161848E9B28AF5D8C208B2B8B29A21 +:1025D800F5D8C108B2AA48B99289EDB90002C0A1DC +:1025E800201D1AD848881ADC488C1AD8F01F000811 +:1025F8002FCD30194878B089D802000000007B2818 +:10260800000016A28003799C80037B74800094C428 +:1026180000001528D431204D4AE8189570081697FF +:1026280012965808C071FACAFFF014F8F01F002A71 +:10263800C4D84AA89088EDB80002C1711894300334 +:102648003EE20988201D4A6C1AD8F01F00262FF395 +:102658002FED0988E4081800C0502FF4E043040067 +:10266800CF114A1CF01F001F0B880BCCAE880B98AB +:10267800EA18FFFFE818FF80AE983004BA445014F7 +:102688003025FACAFFFCAEA5301BF01F0018304AEF +:10269800EF64000CEF6500084018F0091618AEF852 +:1026A800AEC99A49AEBAF5D8C108F1D8C208EF69DF +:1026B800000AAED8AEEA3EE8F3D9C108EF68000BCD +:1026C800EF69000930C8302CAC082FCDD832000093 +:1026D8000000152C800020D4000016A080037AF09A +:1026E800800094C4800384D4800021C8D40148A801 +:1026F8009088EDB80002C0E148887008201D1AD8FB +:10270800487811881AD84878487C1AD8F01F0007EA +:102718002FCDDA0A000016A200000008000016AB50 +:10272800800379E480037BA8800094C4D42148E620 +:10273800189E30076C0C580CC0A02FF72EC6E04727 +:102748000024CF91489CF01F000ADC2A4866EE0757 +:102758000027EC070027EF680010AECE8F0B8F2AFA +:102768008F39D822000011E080037BC4800094C414 +:10277800D4214C8618970C9A302830094C6B310CB0 +:10278800F01F00460C9A302830094C5B311CF01FB2 +:1027980000430C9A302830094C2B312CF01F003F95 +:1027A8000E990C9A30284C0B314CF01F003C0E99B6 +:1027B8000C9A30284BDB315CF01F00383018300998 +:1027C8004BBA4BCB320CF01F003530184BA73009F1 +:1027D8000E9B4BAA321CF01F00310E9B301830099B +:1027E8004B7A322CF01F002D4B6532390A9A0E9B1A +:1027F8003018129CF01F002932490A9A0E9B301893 +:10280800129CF01F002632590A9A0E9B3018129C0F +:10281800F01F00220A9A32690E9B3018129CF01F92 +:10282800001F0C9A302830094A7B336CF01F001BBC +:102838000E9B301830094A5A327CF01F00180C9A47 +:10284800302830094A2B330CF01F00144A1533394D +:102858000A9A0E9B3018129CF01F001033190A9A1E +:102868000E9B3018129CF01F000D0A9A33290E9BFC +:102878003018129CF01F00090C9A30283009496B57 +:10288800334CF01F00060E9B30183009493AC278C5 +:10289800800020D48000427C8000273480004118CA +:1028A8008000433080003FD080003EA88000208810 +:1028B800800026F48000208480002114800035ECFC +:1028C80080003514800034A480004B5480003740C9 +:1028D8008000232480003678800024E0335CF01FD9 +:1028E80000370C9A302830094B5B328CF01F0033CC +:1028F8000C9A302830094B3B32DCF01F00300C9A20 +:10290800302830094B0B32ECF01F002C0E9B30188E +:1029180030094AEA329CF01F00290E9B3018300912 +:102928004ABA32CCF01F00250E9B301830094A9A5B +:1029380032BCF01F00220C9A304830094A6B344CE4 +:10294800F01F001E0E9B301830094A4A32ACF01FA7 +:10295800001B0E9B301830094A1A345CF01F001710 +:102968000E9B3018300949FA32FCF01F00140E9BF8 +:102978003018300949CA337CF01F00100E9B3018FC +:10298800300949AA338CF01F000D0C9A30483009E1 +:10299800497B346CF01F00090C9A30283009495BD8 +:1029A800339CF01F00060E9B30183009492A33ACBF +:1029B800F01F0002D82200008000273480003D88E4 +:1029C80080003AC8800038B4800033FC800030D4DE +:1029D800800032848000375C800032088000300438 +:1029E8008000332880002F8C80002EC4800038841B +:1029F800800037CC8000261CD4013038580B5F1972 +:102A0800F00C18005F88F3E80008C060F40C0019A7 +:102A180048D8F009092B48D89088EDB80001C111B1 +:102A280048B848C9580AF20A1700F00A171048A807 +:102A38001ADA1ADB1ADC489C1AD8F01F00092FCDC5 +:102A4800D802000000007B08000016A280037BDC8F +:102A580080037BE4800378C080037BF0800094C40B +:102A6800D401580BF60A1700F7FA180BF01F0002EA +:102A7800D802000080002A00D401320A300B483CFA +:102A8800F01F0003D802000000007B088002E8BCA9 +:102A9800D421206D3087FAC6FFF00E9A4C6B18953A +:102AA8000C9CF01F0046304B0C9CF01F0045300872 +:102AB800FB68000DBA88FB680009FB68000BFB681F +:102AC800000CEE784240501830480E9BFB67000817 +:102AD800FB68000A300AFE7C2400F01F003A1897B1 +:102AE800C0F04B989088EDB80002C0814B78201D4B +:102AF8004B7C1AD8F01F00372FED301CC5A8E06AB0 +:102B0800F980EA1A03371A9BFE7C2400F01F003272 +:102B1800582CC0D14AC89008EE081900C0844AB899 +:102B2800201D4AEC1AD8F01F002B2FEDD303300AD2 +:102B3800E06B01204AACF01F002BD503E1B8000080 +:102B4800EE180001F5D8C201C020D303FE78240096 +:102B58003019705BF7D9D001915B705BF7D9D0C1A0 +:102B6800915B705BF7D9D081915B580AC020D5037F +:102B7800FE7C2400F01F001C0A9CF01F001C364A33 +:102B8800300B49BCF01F001BE06A0400300B49AC55 +:102B9800F01F0018E06A0400300B498CF01F001584 +:102BA800F01F0017497830079107F01F00170E9C97 +:102BB8002FADD822800382078002E7368000A280EA +:102BC8008000A618000016A2800379BC80037C0848 +:102BD800800094C48000A73C80037C2880002C10CF +:102BE8008000A3A08000A7EC80002778000014B81C +:102BF8008002E8BC00000DB8000009B880002A80F7 +:102C0800000000088000751CD401E1B80000EE182F +:102C18000001F5D8C201C020D303FE782400301982 +:102C2800706BF7D9D001916B706BF7D9D0C1916BEC +:102C3800706BF7D9D081916B580AC020D503FE7C00 +:102C480024007848EDB80000C0F1F01F0016C0C19C +:102C5800319CF01F0015495890092FF9B009301917 +:102C68004938B089C1B8E1B80000EE180001F5D8BC +:102C7800C201C020D303FE7824003019705BF7D955 +:102C8800D001915B705BF7D9D0C1915B705BF7D9CC +:102C9800D081915B580AC020D503D402D603000026 +:102CA800800022188000A2E6000014B40000151C61 +:102CB800D4313006189714931694950618983E093F +:102CC800C2C81095118A2FF8F20A1800C251580686 +:102CD800C21049E890093008F0091900C064089B3F +:102CE8000E9C5C7BF01F001A49A890093008F00977 +:102CF8001900C1040C070F98201D1AD849681AD466 +:102D08001AD690881AD84958495C1AD8F01F001565 +:102D18002FAD8706C1882FF60836CD4548D89009CB +:102D28003008F0091900C0353005C0D8201D48A862 +:102D38001AD690881AD8489848BC1AD83005F01F77 +:102D480000092FCD0A9CD832000016A680013DB498 +:102D5800000016A2000014B4800378D080037C48D9 +:102D6800800094C480037C6CD42118971696F01FB9 +:102D780000325F080E3C5F191895F1E91009C03060 +:102D88005808C5710B893E08F0091800C5210B9930 +:102D98003008F0091800C4D5E2190040C0E1EACAB9 +:102DA800FFFD0BAC1298C068158B2FF92FFB160A84 +:102DB80016081839CFA5C2384A089088EDB800021D +:102DC800C0D149F8201D49FC1AD8F01F001FF7D6BA +:102DD800C0100E9CF01F001D2FED3009EACAFFFD40 +:102DE8000BAC1298C0A81587159B2FF9F7E7108B25 +:102DF8002FEB160AF60800081839CF6510053EE9CA +:102E08000BB8F2081800C021DA2A4919920A3009C9 +:102E1800F20A1900C0E4201D1AD848E890881AD888 +:102E2800487848DC1AD8F01F0008300C2FCDD8227B +:102E3800D82A000080002CB8000016A080037974FE +:102E480080037C84800094C480013DB4000016A2F5 +:102E5800000014B480037C8CD4014918581CC0713C +:102E68003039334C9109F01F000FC0683049334C9A +:102E78009109F01F000D48D89088EDB80002C0D124 +:102E880048787008201D1AD848981AD8489848AC2D +:102E98001AD8F01F000A2FCDD80200000000000841 +:102EA8008000A2E68000A300000016A280037A3CFE +:102EB8008003821080037CB0800094C4D421FACDB2 +:102EC80001004AC81697700512965805C071FACACB +:102ED800FF0014F5F01F0028C4A81989301AB68914 +:102EE8001999B6AAEA19FFFFE819FF80B69919B926 +:102EF800F4091800C20119C53FF8F0051800C1B05F +:102F0800E06A00FF300B1A9CF01F001C1A9430086E +:102F1800C048E8080B082FF80A38CFC51A94AEB590 +:102F2800EEC8FFFCFA050009C038093A10CA123485 +:102F3800CFD1C15849256A0CF01F00120A98EECA71 +:102F4800FFFCEBDCC0083009AEB5C068700BF609B1 +:102F5800070B2FF914CBEA091900CF933EE80A07AB +:102F6800AEC83008AED82FB5302CAC052C0DD82201 +:102F78000000152C800020D48002E8BC0000011459 +:102F88008002EDD0D421202D49981697700E129604 +:102F9800580EC071FACAFFF814FEF01F0016C25886 +:102FA8001989B6891998EA18FFFFE818FF80B698BA +:102FB80030184915B6A86A0CF01F0010EEC9FFFCBE +:102FC8005C5C3008AEBCC0686A0AF408070A2FF8CF +:102FD80012CAF8081900CF933EE818072FBCAEC8EC +:102FE8003008AED8AC0C302C2FEDD8220000152CB0 +:102FF800800020D4000001148002EDD0D421202DBF +:103008004AE818967008169712955808C071FACAB7 +:10301800FFF814F8F01F002AC4D84AA811D4303891 +:10302800F0041800E08B0046FACAFFFC1A9B089CC3 +:10303800F01F00250D88C300AE880D98EA18FFFF21 +:10304800E818FF80AE983018AEA81BC8AEB89A280A +:10305800AEC83008C0B8F3D8C010400BF1DAB010D1 +:10306800EE09000AF6090709B4D9F0CAFFFF9A2940 +:10307800F2081900CF13F1D9C010EE0800083EEA93 +:10308800B0DA9AA82FA910073008AEE8AA09089C58 +:10309800F01F000EC0E8AE880D98EA18FFFFE81888 +:1030A800FF80AECCAE98AEAC3EE8AEB83048AA08C9 +:1030B800302C2FEDD82200000000152C800020D4E1 +:1030C80000000DB880006BF480006FBCD431202D57 +:1030D8004C5818967008169712955808C071BAE897 +:1030E800FACAFFFAF01F0041C728F8C8FFFDC3C09D +:1030F80011842FF4F0040004C37009893018F00912 +:103108001800C67109993EE8F0091800C6214B88D5 +:1031180090093008F0091900C5C44B681AD44B6CE3 +:103128001AD8F01F00362FEDC548099309A9F3E313 +:1031380010835C83C54809893018F0091800C1510B +:1031480009993EE8F0091800C1014A989009300829 +:10315800F0091900C0A44A781AD44A7C1AD8F01F7A +:1031680000272FEDC02830030DB43018F0041800E4 +:10317800C2D10DCC3038F00C1800E08B0028F5D304 +:10318800C008FACBFFF9F01F001E0D88C120AE88D9 +:103198000D98EA18FFFFE818FF80AEB4AE98AEA409 +:1031A8001BF8AEC83EE8AED83008AEE83068C0D8E4 +:1031B800AE880D98EA18FFFFE818FF80AE983EE841 +:1031C800AECCAEB8AEAC3048AA08302C2FEDD83211 +:1031D80009883029F2081800CA9030032FF8100423 +:1031E800CAB1CC3B0000152C800020D4000016A2E8 +:1031F8008003780C80037CBC800094C480006FE05E +:10320800D421202D49A81697700E1296580EC07119 +:10321800FACAFFF814FEF01F0017C2681989301A9D +:10322800B6891999B6AAEA19FFFFE819FF80B69975 +:1032380019B9F4091800C0D119C83039F2081800B2 +:10324800E08B000848C9F208033CF01F000CC028B6 +:10325800300C3018AEB83EE8AECCAED83008AEE888 +:10326800302C3068AC082FEDD82200000000152C57 +:10327800800020D400007B0880004D78D421202DC8 +:103288004A181697700E1296580EC071FACAFFF8AF +:1032980014FEF01F001EC3481989301AB6891999FF +:1032A800B6AAEA19FFFFE819FF80B69919B9F40917 +:1032B8001800C0B119CC3038F00C1800E08B0006AB +:1032C800F01F00135C8CC028300C3028AEB83EE8E4 +:1032D800AECCAEE85C7CF8081608AED83008AEF87C +:1032E8003078AC0848B89088EDB80002C08148A88A +:1032F8001ADC48AC1AD8F01F000A2FED302C2FED3D +:10330800D82200000000152C800020D480006D38E1 +:10331800000016A8800378A880037CD8800094C495 +:10332800D421202D4AA81697700512965805C07109 +:10333800FACAFFF814F5F01F0027C4781989301A63 +:10334800B6891999B6AAEA19FFFFE819FF80B69954 +:10335800303819B919C5F40918005F09F0051800C3 +:103368005F881268C19049C8F00503345804C060EA +:10337800089C301BF01F0019C10849989009E809FA +:103388001900C0A449781AD5497C1AD8F01F00172B +:10339800089C2FEDC028300C3018AEB83EE8AECCF3 +:1033A800AED83008AEE83068AC0849189088EDB857 +:1033B8000002C0A148B8201D1ADC48EC1AD51AD85A +:1033C800F01F000A2FCD302C2FEDD8220000152C2D +:1033D800800020D400007B0880004F1C000016A647 +:1033E8008003794080037CEC800094C4000016A818 +:1033F80080037D10D421202D4A181697700E12963E +:10340800580EC071FACAFFF814FEF01F001EC34818 +:103418001989301AB6891999B6AAEA19FFFFE81965 +:10342800FF80B69919B9F4091800C0F119C83039E4 +:10343800F2081800E08B000A4939F2080038300B0E +:10344800701CF01F0012C028300C3018AEB83EE8CF +:10345800AECCAED83008AEE83068AC0848C8908822 +:10346800EDB80002C08148B81ADC48BC1AD8F01F71 +:10347800000B2FED302C2FEDD82200000000152C6A +:10348800800020D400007B0880004F1C000016A894 +:1034980080037A6480037D28800094C4D40149584D +:1034A8009088EDB80002C08149381ADC493C1AD826 +:1034B800F01F00132FED49383009118AF20A18005D +:1034C800C021DC0AB089F01F0010581CC1004898C0 +:1034D80090093008F0091900C025DA0A48681ADC92 +:1034E80048AC1AD8F01F0006301C2FEDD802000097 +:1034F800000016A28003798480037D38800094C47C +:10350800000016AA80019EF880037D54D421202D46 +:103518004B281496700E16971295580EC071FACA59 +:10352800FFF814FEF01F002EC5681989B68919988E +:10353800EA18FFFFE818FF803014B698B6A4F01F09 +:103548000029C3E0E0460025C260E0460026C3200B +:10355800EEC9FFFCE0460024C0F0129AF9380020BA +:103568003009AEB8C058F809070B2FF914CBF00989 +:103578001900CFA3C28830682DACAEB8306A3008C5 +:10358800198B12CB2FF8201C5C88F4081900CF91F6 +:103598003068C19878C8F0091618AEF93049AEC835 +:1035A800AEB9F3D8C108F1D8C208AED9AEE83048F0 +:1035B800C0A8AEB4F9380038AEC83018C048AEB4A8 +:1035C800AECC18983EE91007AEC93009AED92FB86D +:1035D800302CAA082FEDD8220000152C800020D40A +:1035E8008001997CD421202D49F8189670081697E7 +:1035F80012955808C041FACAFFF8C1881988B688D8 +:103608001998EA18FFFFE818FF803019B698306853 +:10361800B6A9B6B81A9CF01F0015581CC0B00A9974 +:103628000E9B0C9CFACAFFF8300814F8F01F001023 +:10363800C1881BD8AEC81BC8AED81BB8AEE81BA83B +:10364800AEF81B98EF6800081B88EF6800093EE891 +:10365800EF68000A3008EF68000B302C30B8AA0871 +:103668002FEDD8220000152C80019128800020D44D +:10367800D421FACD010016961A971A9C173AF01F12 +:103688000025FAC9FF000D88F20800083009F16921 +:10369800FF004A189088EDB80002C08149F81AD78F +:1036A80049FC1AD8F01F001F2FED300849E749FAE6 +:1036B800AE88AE98AEA8AEB8B488109949CA0E9B29 +:1036C8001A9C1A96F01F001B5C5CC040E06C00FF5F +:1036D800C1E849189088EDB80002C1510F8A0FB9A6 +:1036E8000F98B168F1EA11880FAAF1EA1088F3E897 +:1036F8001008201D1AD848981AD648FC1AD8F01F66 +:1037080000092FCD30194898301CB0892C0DD822CB +:103718008002E736000016A280037A7C80037D646D +:10372800800094C400007B2800001528800025A88C +:103738008000C4C080037D84D401F01F0006E068C7 +:1037480000FF581CF00C1710F9BC0001D80200004B +:10375800800199CCD42118971696335CF01F001677 +:103768005827C1F10D980D89F1E910893018F00931 +:103778001900C1710DA80DBA0DC9303BF608180023 +:10378800E0880004300CC04848CBF608033CA96A1E +:10379800ECCBFFFB120A5C7AF01F00091897C028CF +:1037A8003FF7335CF01F0007E06C00FF5817F9BCC7 +:1037B8000001D8228000A30000007B08800053C0CD +:1037C8008000A2E6D421202D581CC4211789F809AD +:1037D8001800C3E1F6C8FFFE1796C170118AF20AF5 +:1037E8001800C131119A3EE9F20A1800C0E149B93E +:1037F800920A3009F20A1900C0841AD84988499CEB +:103808001AD8F01F00192FED3008FACAFFF8300B4C +:1038180014E80C9CF01F00159A3A18973038F006F7 +:103828001800E0880004300CC0484918F006033C32 +:103838005C7A0E9BF01F000F18950C9CF01F000E71 +:103848000E9CF01F000E5815C0310A9CC038E06C61 +:1038580000FF2FEDD8220000000016A28003795C3B +:1038680080037CBC800094C4800072DC00007B086C +:103878008000514080006E188002E28CD401582CE0 +:10388800C13117981789F1E910893018F009190022 +:10389800C0B117C817BA17ACA96A2FBBF00A000A3B +:1038A8005C7AF01F0002DA0A80007380D421581C69 +:1038B800C391580BC0311697C1E81788F80818004B +:1038C800C3411797C33817893018F0091800C13158 +:1038D80017993EE8F0091800C0E1497890093008C6 +:1038E800F0091900C08449581ADB495C1AD8F01F3E +:1038F80000152FED49089088EDB80002C08148F8FE +:103908001AD7491C1AD8F01F000F2FED3038F007CE +:103918001800E08B000848D8F007033CF01F000CA3 +:10392800DA2AE06C00FFD82230072FF8100BCCC140 +:10393800CE2B0000000016A2800379F880037CBC1F +:10394800800094C480037DA800007B088000599CF7 +:10395800D421202D4B981896169414971295908878 +:10396800EDB80002C1314B694B685805F2081700E1 +:10397800201D1AD816985C781ADA1AD84B281ADC3F +:103988004B2C1AD8F01F00322FAD3038F007180032 +:10399800E0880005E06C00FFC8584AE8F0070338E3 +:1039A80050085808C1504A59920A3009F20A1900B9 +:1039B800C0841AD84A484A8C1AD8F01F00252FED1F +:1039C800400CF01F002630094A28F00709391A9CD4 +:1039D800E06A04005016300B1ADC14981AD75C748D +:1039E8001ADB16991AD5089C1ADA169A1AD6F01FF5 +:1039F800001C49282FAD580CC3819088EDB80002EF +:103A0800C1511AD71AD41AD6403850461AD848D8AD +:103A180048B95805F2051700F005171048A81AD537 +:103A2800490C1AD8F01F000A2FAD0E9C400BF01F4E +:103A3800000E301CC3780000000016A280037DC869 +:103A480080037DC4800379C480037DCC800094C446 +:103A580000007B0880037DF88000599C80005D642D +:103A680080037E2480002A689088EDB80002C15146 +:103A78001AD71AD41AD6403850461AD848B848C95E +:103A88005805F2051700F005171048A81AD548ACD4 +:103A98001AD8F01F000A2FAD300948983FFCF007EC +:103AA80009392FEDD822000080037DC480037DC82A +:103AB800800379C480037E50800094C400007B0892 +:103AC800D431584CE081008E580BC2A01785F805F8 +:103AD8001800E081008A179817A7B167EFE81187E7 +:103AE80017B8EFE8108717C8F1E71007C7E80B8980 +:103AF8003018F0091800C7E10B993EE8F0091800E2 +:103B0800C7914C2890093008F0091900C7344C08AF +:103B18001AD54C0C1AD8F01F00402FEDC6B81697CE +:103B28003006C1F80B960BA8F1E610865C86C688AD +:103B380007893018F0091800C72107993EE8F009ED +:103B48001800C6D14B1890093008F0091900C6743E +:103B58004AF81AD34AFC1AD8F01F002F2FEDC5F8DF +:103B68003005C1B80795C61809893018F00918003A +:103B7800C61109993EE8F0091800C5C14A389009EC +:103B88003008F0091900C5644A181AD44A1C1AD812 +:103B9800F01F00212FEDC4E83003C1A80993C50820 +:103BA80009893018F0091800C13109993EE8F0096F +:103BB8001800C0E1495890093008F0091900C0847C +:103BC80049381AD4493C1AD8F01F00132FED06992A +:103BD8000A9AF7D6C0100E9CF01F0010581CC0306F +:103BE800E06C00FFD83230072FF5F6050005C80154 +:103BF800C98B0B833028F0031800C95030062FF307 +:103C0800EA030003C961CADB000016A280037A98A0 +:103C180080037CBC800094C4800039580784301825 +:103C2800F0041800CA0030052FF4E6040004C9D1D6 +:103C3800CB4B09883019F2081800CB1030032FF845 +:103C48001004CAF1CC5B0000D421202D3038169620 +:103C58001494F00B1800E08B0072300750074BA843 +:103C68001188EE081800C0B04B889008EE081900BB +:103C7800C654201D4B684B7C1AD8C0F84B69138971 +:103C8800F0091800C0E14B589008EE081900C56407 +:103C9800201D4AF84B2C1AD8F01F00322FEDC4E82B +:103CA8001A9AE0690400501712981ADAEBDCC0106F +:103CB8001ADB0E9A1AD70E9B1AD40A9C1AD93019F5 +:103CC8001AD7F01F00294A182FAD580CC1B1908897 +:103CD800EDB80002C1114A584A595804F2041700B5 +:103CE800F004171049A81AD64A2C1AD51AD41AD88B +:103CF800F01F001C2FCD0C9C400BF01F001F301C28 +:103D0800C1F89008EE081900C11449884989580477 +:103D1800F2041700F004171048D81AD6497C1AD5AF +:103D28001AD41AD8F01F000F2FCDA17630092FF61C +:103D380049383FFCF0060929C038E06C00FF2FED38 +:103D4800D822000000007B07000016A280037A102A +:103D580080037E80000016AB000016A680037EA0BC +:103D6800800094C480005D6480037DC480037DC8A6 +:103D780080037EB880002A6880037EDC00007B0810 +:103D8800D421583CC661580BC24017843028F0042F +:103D98001800C621179717A8F1E710875C87C5D8C0 +:103DA80009893018F0091800C5D109993EE8F009C9 +:103DB8001800C5814B6890093008F0091900C5241E +:103DC8004B481AD44B4C1AD8F01F00342FEDC4A816 +:103DD80016973006C1B80996C4B80B893018F0098F +:103DE8001800C4B10B993EE8F0091800C4614A886C +:103DF80090093008F0091900C4044A681AD54A6CB9 +:103E08001AD8F01F00262FEDC3883004C1A80B94E0 +:103E1800C3A80B893018F0091800C1310B993EE886 +:103E2800F0091800C0E149A890093008F009190004 +:103E3800C08449881AD5498C1AD8F01F00182FED6C +:103E48000E9C089A0C9B5C7CF01F0015581CC03017 +:103E5800E06C00FFD82230072FF4F6040004CA11E2 +:103E6800CB9B09853018F0051800CB6030062FF57C +:103E7800E8050005CB31CCAB0B883019F2081800E7 +:103E8800CC7030042FF81005CC51CDBB000016A221 +:103E98008003791480037CBC800094C480003C506B +:103EA800D431204D1495740A501A18961788301971 +:103EB800F2081800C771F6C7FFFE1794C1700F8982 +:103EC800F0091800C1310F993EE8F0091800C0E167 +:103ED8004B7890093008F0091900C0844B581AD75C +:103EE8004B5C1AD8F01F00352FED4B189088EDB8B1 +:103EF8000002C0A14AF81AD44B1C1AD61AD51AD8EF +:103F0800F01F002E2FCD3028F0041800E08B004B56 +:103F18003006304030114A624A63C3E80F88E0082F +:103F28001800C4010F990FA8B168F1E911880FB9F9 +:103F3800F1E910880FC92FB7F3E810085807C170C6 +:103F48000F89E2091800C1310F993EEAF4091800F7 +:103F5800C0E18409300AF4091900C0941AD7496CE1 +:103F68001AD35028F01F00152FED400850388489C7 +:103F7800EDB90002C0A11AD84029492C1AD91AD67D +:103F88001AD3F01F000E2FCDF9D6C008FACBFFF4D4 +:103F98002FF6F01F000D0836CC253008301CAAC8B3 +:103FA800C038E06C00FF2FCDD8320000000016A208 +:103FB80080037A4C80037CBC800094C480037F0813 +:103FC80080037F308000C19CD431203D3019149487 +:103FD800189674051788F2081800E0810085F6C75E +:103FE800FFFE1792C1700F89F0091800C1310F99AF +:103FF8003EE8F0091800C0E14BD890093008F009F4 +:104008001900C0844BB81AD74BBC1AD8F01F003B14 +:104018002FED4B789088EDB80002C0A14B581AD20A +:104028004B7C1AD61AD41AD8F01F00342FCD30384A +:10403800F0021800E08B005830064AD04AD1FAC383 +:10404800FFF8C4B80F88304AF4081800C4C10F99A3 +:104058000FA8B168F1E911880FB9F1E910880FC903 +:104068002FB7F3E810085807C1800F89301AF409F0 +:104078001800C1310F993EEAF4091800C0E180091F +:10408800300AF4091900C0941AD749BC1AD150282B +:10409800F01F001A2FED400850288089EDB9000262 +:1040A800C0911AD8497C1AD51AD61AD1F01F001314 +:1040B8002FCD5816C0805826C0B0069B0A9CF01F0A +:1040C8000012C0A8069B0A9CF01F0010C058069B4F +:1040D8000A9CF01F000F2FF60436CB553008301C11 +:1040E800A8C8C038E06C00FF2FDDD832000016A247 +:1040F800800378F080037CBC800094C480037F0830 +:1041080080037F308000CBC88000CA748000CA92C8 +:10411800D421FACD00884C6816979088EDB8000233 +:10412800C0B14C48201D1ADC1AD84C384C3C1AD85F +:10413800F01F00432FCD344A300BFAC6FFFC0C9C0D +:10414800F01F0040306AE06B00FFFACCFFDBF01F85 +:10415800003D0F8A31F8F00A1800E08B008930889A +:10416800EECBFFFFFB68003C0C9CF01F00370F896B +:10417800FB6900244AE89088EDB80002C0A14AE82B +:10418800201D4B2C1AD91AD61AD8F01F002D2FCD66 +:104198000F882FF8FAC6FFB810070C9C0E9B173A29 +:1041A800F01F002BFAC9FF780F88F20800083009C1 +:1041B800F169FFC049E89088EDB80002C0B10F88E6 +:1041C800201D1AD849C81AD64A2C1AD8F01F001C24 +:1041D8002FCD0F8A3018FAC7FFFC3089FACBFFB809 +:1041E8000E9CF01F001D581CC0C0491890093008CB +:1041F800F0091900C3C44908498C1AD81AD8C0E86C +:10420800497CF01F000F0E9C300BF01F001618970A +:10421800581CC080201D1ADC493CF01F00092FEDF6 +:10422800C268492CF01F00060E9CC238000016A276 +:1042380080037A248003787080037F50800094C4C0 +:104248008002E8BC8002E73680037CB08002EE0C76 +:1042580080037F648001908480037F7880037FA03F +:10426800800099A880037FB880037FC0E06C00FFBE +:104278002DEDD822D42120AD4A461697178A31F859 +:10428800F00A1800E08B002FFAC5FFF92FFB0A9CF3 +:10429800F01F001F0F88FAC9FFD8FB680027100914 +:1042A8003008F368FFDF8C88EDB80002C0814998B8 +:1042B8001AD5499C1AD8F01F00192FED300BFACCEB +:1042C800FFF9F01F00171897581CC1B048F890095B +:1042D8003008F0091900C1541ADC48E8491C1AD8FA +:1042E800C0D88C093008F0091900C0353FF7C098CC +:1042F800201D488848CC1AD83FF7F01F00082FED3A +:104308000E9C2F6DD8220000000016A28002E7360E +:10431800800378E080037B18800094C4800099A80B +:1043280080037D5480037FC4D431216D4D281697B6 +:104338009088EDB80002C0B14D08201D1ADC1AD8CB +:104348004CF84D0C1AD8F01F00502FCD321AFAC66F +:10435800FFFD300B0C9CF01F004D0F8A31F8F00A5E +:104368001800E08B0085EECBFFFF0C9CF01F004887 +:104378000F88FB6800234C089088EDB80002C081C4 +:104388004BF81AD64C3C1AD8F01F003F2FED0F8679 +:104398002FF6EE060006FAC7FFAC0C9B0E9C173AE8 +:1043A800F01F003D0D88FAC9FFA8F20800080E9C0E +:1043B8003003F163FFFCF01F00393038EFDCC00830 +:1043C8000D89F00718005FB53018F00918005F185C +:1043D80010450A94E6051800C4A1ECCBFFFDFAC30A +:1043E800FFDC2FE6069C0D8AF01F002B0D88FAC90A +:1043F800FFA8F2080008069BF165FFCCFAC5FFC0CC +:104408000A9CF01F002730D81896F00C18005F1986 +:104418003058F00C18005F18F3E80008E808180096 +:10442800C261FAC4FFB2306AE06B00FF089CF01F5B +:1044380000170C9B08990A9A0E9CF01F001A0E9CF4 +:10444800F01F0019300BFACCFFFDF01F0018581CA4 +:10445800C100489890093008F0091900C0844888BC +:104468001ADC493C1AD8F01F00082FEDE06C00FF59 +:104478002EADD832000016A280037888800379AC6C +:1044880080037F50800094C48002E8BC8002E73635 +:1044980080037FE48002EE0C8002DC2C80009868A8 +:1044A8008001927080019258800099A880037D5401 +:1044B800D401319CF01F0010E06B00EFFE7C280057 +:1044C800F01F000E581CC060FE7C2800F01F000C76 +:1044D800CFC0319CF01F000B48B890093008F00994 +:1044E8001900C0844898201D489C1AD8F01F00095C +:1044F8002FEDD8028000A3008000A7FA8000A7F261 +:104508008000A2E6000016A28003790880037FF0ED +:10451800800094C4D431202D3008FAC7FFF81696CD +:10452800189514930EE81694098B0A9C2FF4F01F23 +:104538000009581CC0B00E9B0A9CF01F0007089881 +:104548000C18E6081900CF13300C2FEDD8320000F4 +:104558008000A7FA8000A816D421202D30081496D0 +:10456800F80C002C129AFAC9FFF812E84A88F00CE5 +:10457800002C169578280C9B0A9C5D184A583049DF +:10458800319C9109F01F00249ABA0C9BFE7C2400F0 +:10459800F01F00221897319CF01F00214A189088BC +:1045A800EDB80002C0414A0CF01F002049D890889D +:1045B800EDB80002C0D149E8201D49EC1AD8F01F17 +:1045C800001B49D80A9C908BF01F001C2FED4958FE +:1045D8009088EDB80002C041499CF01F00144918AA +:1045E8009088EDB80002C0C14918201D491C1AD88E +:1045F800F01F000E9AFB0C9CF01F00102FED9A394B +:1046080049080E9CB0092FEDD8220000000011E0E7 +:10461800000011B88000A3008000451C8000A2E6BD +:10462800000016A080038008800094C480037800EE +:1046380080037C84000011BE80013DB48003800C9F +:10464800000011BCD431202D4BC43048E8C3FFF022 +:10465800BAF81897199616910C90F8C2FFFD2FC456 +:104668003005E21000400988EC081800C4B107883A +:104678003029F2081800C1F10A9C4B08EA05002508 +:10468800029AF00500240E9BE8C5FFF46839F01F74 +:10469800002CC030301CC4E868086A0A049B0FACC0 +:1046A8005D18BAFCE216004030181BF9F009180032 +:1046B800C3C1C3D85800E00A1700F9BA0100E8F8E6 +:1046C800FFFC049B0FAC5D18BAFC30190788F20890 +:1046D8001800C0B10A9C4998EA050025029AF0051D +:1046E80000250E9B6A39C0A83049F2081800C0A1FD +:1046F800029A0E9B0A9CFAC9FFF9F01F0011C170BB +:10470800C1882FF52EC42EC3E0450024CAD148D84D +:1047180090093008F0091900C08448B81AD648BC76 +:104728001AD8F01F000B2FED302CC048304CC02891 +:10473800300C2FEDD8320000000011E080004560F9 +:10474800000016A28003789880038010800094C42B +:10475800D421202D4BD8910C30094BD8118AF20A5C +:104768001800E08000DAB08930085018E1B800007D +:10477800EE180001F5D8C201C020D303FE7824004A +:104788003019706BF7D9D001916B706BF7D9D0C124 +:10479800916B706BF7D9D081916B580AC020D50303 +:1047A8004AC7FACAFFFC6E0B4ABCF01F002C1896C9 +:1047B800C6E04AB8303A6E09910A401B4A98161961 +:1047C800B009E06A03FFF4091900E0880005E06910 +:1047D8000400B0094A064A37EC0B000B4A2C8E8AB3 +:1047E800F01F002230084A2BAC8849FCF01F00213A +:1047F800584CC2204A089088EDB80002C0C149F858 +:10480800201D49FC1AD8F01F001F8E8B496CF01F21 +:10481800001E2FED49889088EDB80002C0D1497874 +:10482800201D497C1AD8F01F00174988490C908B25 +:10483800F01F00152FED4879300893084899B20801 +:1048480048799308C46800000000152C0000151C66 +:10485800000014B0000014B880002D70000011B8DA +:10486800000011BE00000DB88002E736000009B84C +:104878008000464C000016A0800379D880037C8411 +:10488800800094C480013DB4000011BCF01F0024D6 +:104898004A489008EC081900C0A44A3890881AD8E9 +:1048A8004A284A3C1AD8F01F00232FED4A289009BD +:1048B8003008F0091900C0644A084A1C909BF01F90 +:1048C80000214A19300893084A09B20849C9B28830 +:1048D800E06B0120FE7C0D80F01F001DE1B8000098 +:1048E800EE180001F5D8C201C020D303FE782400D9 +:1048F8003019705BF7D9D001915B705BF7D9D0C1E3 +:10490800915B705BF7D9D081915B580AC020D503C1 +:10491800319CF01F00102FEDD8220000800044B811 +:10492800000016A2000014B4800379D88003802CFC +:10493800800094C4000016A6000014B0000014B84B +:1049480080013DB4000011B8000011BE8000A20033 +:104958008000A300D431207D4B6730054B664B782F +:104968001188EA081800EC081710EE0817004B4CDD +:104978001AD8F01F00344B481188EA081800EC07D1 +:1049880017104B2C50074B2230074B23F01F002DDC +:104998000E942FED4B01CBD86A005800E08000B28E +:1049A80080286009201D1AD95028F01F002C602A81 +:1049B8002FFD580AE60A1700E20A171040185C781B +:1049C80060491AD84A681ADC1ADA4A6A5809F40996 +:1049D8001700F00917104A4C1AD91AD01AD61AD744 +:1049E800F01F001860482F8D5808C431E0C9FFBC7B +:1049F800720A580AC0E0744B201D49CC1ADB1ADA37 +:104A08001AD850595048F01F000F2FCD40084019B0 +:104A18002FF82FC95848CED161585808C610704988 +:104A2800493C1AD91AD8F01F00072FEDC598000085 +:104A3800800380548003805C000016AB8003806094 +:104A4800800094C400007B078003807400007B080A +:104A580080037BE480037BDC800096A880037DC410 +:104A680080037DC880038088800380B8800380D05D +:104A780061E85808C350F11900127008201D1AD8AF +:104A8800507850395028F01F002761EA2FFDF53B78 +:104A9800001040291AD940281AD81ADC4A2C1ADBE7 +:104AA8001ADA50B8F01F0021FACAFFE00C9B5084B4 +:104AB800FB5400240E9CF01F001E2FBD40305050A8 +:104AC8001AD0FB1800145028F01F00162FFD4018AC +:104AD8001AD81AD01ADC497CF01F00142FCD0E9C6E +:104AE800F01F001549594968580CF2081710201D85 +:104AF800494C1AD8F01F000D493CF01F000C2FED4F +:104B08002FF62FC55826FE91FF492FF75847C0505A +:104B1800E40700353006C41BF01F000C2FADD83257 +:104B2800800096A8800380E8800094C4800021C893 +:104B380080038114800070788003812C8003812891 +:104B480080038130800381408000D680D431204D9D +:104B58004BE812911896169711895809C1A119881E +:104B6800B6881998EA18FFFFE818FF80B6C9B69802 +:104B7800B6A93EE8B6B83048A2084B589088EDB8B8 +:104B88000002E08100E7201D4B284B3C1AD8C228C0 +:104B9800FACCFFF4F01F0031403366105800C1E131 +:104BA8000D88AE880D98EA18FFFFE818FF80AEA0C0 +:104BB800AE9830093EE8AEC9AEB83048A2084A48B7 +:104BC8009088EDB80002E08100C5201D4A184A4CC3 +:104BD8001AD8F01F00242FEDCBC858B0F9B0020A3C +:104BE80030044A12C0786408F004032C2FF4F01F34 +:104BF800001F641849C51034CF736A0C3004F01FC5 +:104C0800001B8B14661B580BC460A36B301CF01F71 +:104C180000188B0CC3A1497CC1486608F002030B3D +:104C28006A080408501B5008F01F00134008910C34 +:104C3800401B6A082FF4F002030C580CC20148FC10 +:104C4800F01F0008C2880000000016AA000016A283 +:104C58008003783C8003816080018F048003817C1D +:104C6800800094C4000015208002E28C8002DC3CA5 +:104C7800800381988002E2A4800381C0344AF01F37 +:104C880000376A182FF88B18E8021502344C66189A +:104C98001034CC430D88AE880D98EA18FFFFE81849 +:104CA800FF803005AE98AEA030364AD20A984AD96D +:104CB8000E93640AEA0B1502F40B030AF537002079 +:104CC800F4070B08ECCCFFFF2FF7E60C000C5C5741 +:104CD800300AE6060B07C0886404E80B0304E80AF8 +:104CE80007042FFA18C40E9EEE0A1900CF630E9A15 +:104CF8002FFAF4060006928A5C56EDBA0002C1D17A +:104D0800640A202DF40B0304503950281A9C306A89 +:104D1800E8CBFFDFF01F001168CA1ADAE93A003859 +:104D28001ADA491A1AD7491C1AD41AD51ADAF01FEE +:104D380000102F8D400840192FF50035CBB53EE8FF +:104D4800E6060B08069730080C07AE982FF6A20661 +:104D5800302C2FCDD83200008002E7360000152015 +:104D6800000016A28003783C800381E4800094C48C +:104D780048781188580CC0215EFF5C68100C300818 +:104D8800F9390015F00918005F1C5EFC00001530A9 +:104D9800D4211897580CC2A04968F129000030089E +:104DA800F2CA0004F00900065836F5D8E9062FF8CB +:104DB800EE06002C791C163CC17148F89088EDB8B5 +:104DC8000001C0A148D81ADB48DC1AD61AD71AD86D +:104DD800F01F000C2FCDF9D6C00830082F06EE06BC +:104DE80000278F18D8225848CDE1E06C00FFD82260 +:104DF80000001530000016A2800382688003830437 +:104E0800800094C4D42118971695580CC2B04978DC +:104E1800F12900003008F2CB0004F00900065836EA +:104E2800F7D8E9062FF8EE06002A751A580AC03096 +:104E38000A3AC16148E89088EDB80001C0A148D895 +:104E48001AD548DC1AD61AD71AD8F01F000C2FCD5D +:104E5800EE060027F9D6C008EF450044D822584886 +:104E6800CDD1E06C00FFD82200001530000016A25A +:104E780080038CF080038304800094C4D4211897A5 +:104E8800580CC2A049E8F12A00003008F4CC00040C +:104E9800F00A00065836F9D8E9062FF8EE06002978 +:104EA80073195809C170580BC0F049689088EDB85B +:104EB8000001C0A149481AD9494C1AD61AD71AD89C +:104EC800F01F00132FCDEE06002748D8B0866F1CC0 +:104ED800D8225848CDE1580BC10048A8900930089D +:104EE800F0091900C0A448881AD748AC1AD8F01F8E +:104EF8000008300C2FEDD822D82A00000000153009 +:104F0800000016A280038CB880038304800094C438 +:104F180080038324D4214CB816951188189730063D +:104F2800EC081800E08000B6300BF01F004718941A +:104F38005807E0800097580C5F19EC0518005F08C7 +:104F4800F3E81008EC081800E080008C4BF8908813 +:104F5800EDB80002C3314BE811894BE89088EDB8F1 +:104F68000001C2C15C69EE09002871185808C041E7 +:104F7800109E1096C098EE09000AF53E0015F2CA78 +:104F8800FFF8EE0A03266F5A201D580AF40C170082 +:104F9800F5FC10045808F00B1700F1FB10041ADE9A +:104FA8001AD61ADC1ADA1ADB1AD84AB81AD74ABC3F +:104FB8001AD91AD8F01F002A2F6D5805C3D068488F +:104FC80058485F1958085F181268C3304A08118991 +:104FD8004A089088EDB80001C2C15C69EE09002852 +:104FE80071185808C04110951096C098EE09000A2B +:104FF800F5350015F2CAFFF8EE0A03266F5A201D90 +:10500800580AF40C1700F5FC10045808F00B1700A8 +:10501800F1FB10041AD51AD61ADC1ADA1ADB1AD8D8 +:1050280048D81AD748DC1AD91AD8F01F000D2F6DA6 +:10503800E93C0013D8226F58F13C0013D822000035 +:10504800000016AB80004E84000016A80000153042 +:10505800000016A28003828C80038348800094C4D9 +:1050680048D890093008F0091900C1345807EE08EB +:105078001700EE041700EFF810151AD848781AD45C +:10508800487C1AD71AD8F01F0007300C2FCDD82229 +:10509800D82A0000000016A88003828C8003838C25 +:1050A800800094C4D421580CC25049D8F12900007A +:1050B8003008F2CA0004F00900075837F5D8E907A4 +:1050C8002FF8F807002E7D1E163EC12149589088FA +:1050D800EDB80001C0A149481ADB1AD71ADC493CCF +:1050E8001AD8F01F00132FCD0E9C5C5CD8225848AC +:1050F800CE31490890093008F0091900C045E06C24 +:1051080000FFD8224888201D1ADB1ADC48AC1AD8C0 +:10511800F01F0007E06C00FF2FCDD82200001530EB +:10512800000016A6800382BC80038304800094C418 +:10513800000016A2800383C0D421580C5F18580BB6 +:105148005F1918961695F3E800081494C590580A44 +:10515800C5704AC89088EDB80001C0C114985C7841 +:10516800201D1AD84A881ADB4A8C1AD8F01F002842 +:105178002FCD4A889088EDB80001C0D14A28201D5B +:105188004A5C1AD8F01F0022089B0A9C5C7BF01F1F +:1051980000232FED300A5C74149C089BF01F00203C +:1051A8001897C0E149789008F8081900C29449682E +:1051B8001AD649CC1AD8F01F00162FEDC1C8089A84 +:1051C8000A9B781CF01F00180E9B6DECF01F00174F +:1051D8005C5CC12048B890093008F0091900C08407 +:1051E80048981AD6492C1AD8F01F00092FED0E9CA2 +:1051F800F01F0010DC2A0E9CF01F000EDA2ADC2AB1 +:10520800000016A280038CE4800383E8800094C425 +:10521800000016A080037C8480013DB48000D31870 +:10522800800383FC8002E7368001153880038428D8 +:105238008000D13CD421149518971696580CC0417B +:10524800E06C00F6D822F01F00163FF8E9DCC00831 +:10525800F0041800C041E06C00FFD822491890887B +:10526800EDB80001C0E16C48201D1AD848E85C651B +:1052780048EC1AD51AD61AD71AD8F01F000D2FAD38 +:105288006C4858485F0948B8B0893008EE040004F3 +:10529800E9680068F01F00088F7CD82A800050ACAD +:1052A800000016A280038D1080038450800094C4EF +:1052B80000007B0780009504D43118971695F01FDD +:1052C80000353FF8EDDCC008F0061800C5E0EE0632 +:1052D80000083009F1690015ECC8FFF8EE0803244E +:1052E8005804C5304AC89088EDB80001C0A14AB832 +:1052F800201D4ABC1AD41AD41AD8F01F002A2FCD60 +:10530800EB1800726EF91238F20817B00838F0047A +:1053180017804A589088EDB80001C051F01F00234B +:105328004A38910CECC8FFEA3019EE08032B089AAA +:105338000A9C5C7AF01F001FE7DCC008C19049A8EE +:105348009088EDB80001C0F16A48201DF3D3B00879 +:105358001AD91AD41AD849181AD5497C1AD8F01F5C +:1053680000112FAD0C073008EF680015C10830197F +:10537800ECC8FFF8EE060006ED690015EE080329F3 +:105388000819EE080929C038E06300FF069CD832E6 +:10539800800050AC000016A680038C7880038474CB +:1053A800800094C4000016A2800095040000153403 +:1053B800800109C08003848CD43116941493189703 +:1053C800580CC1014AB89008F8081900E08400D3C5 +:1053D8004A98201D4A9C1AD8F01F00293FFC2FED3F +:1053E800D832300BF01F0027189B18960E9CF01F20 +:1053F80000263FF8EBDCC008F0051800E08000BB91 +:105408004A289088EDB80001C0E1F1D3C010201DF2 +:105418001AD849981AD449EC1AD61AD71AD8F01FAC +:1054280000182FAD49B89088EDB80001C0D14928BF +:10543800201D499C1AD8F01F0012F7D3C010089CF1 +:10544800F01F00162FED49189088EDB80001C4B17F +:105458004938118948789088EDB80001C4415C69E1 +:10546800EE09002871185808C1C11092109EC21880 +:10547800000016A280038D20800384C0800094C49D +:1054880080004E84800050AC000016A6800384D8AB +:10549800000016A080037C8480013DB40000153014 +:1054A800EE09000AF5320015F2CAFFF8EE0A032EDB +:1054B8006F5A201D580AF40C1700F5FC1004580800 +:1054C800F00B1700F1FB10041AD21ADE1ADC1ADAF4 +:1054D8001ADB1AD84A881AD74A8C1AD91AD8F01F50 +:1054E80000282F6D5806C46058045F183009F2036D +:1054F80019005F1AF5E80008F2081800C3B0EAC8F6 +:10550800FFEAEE08032C580CC3506C4858785F0B20 +:1055180058485F0AF7EA100AF20A1800C0515828DA +:10552800C0305838C2715C73089B069AF01F00158A +:10553800EAC9FFEA300AEE090328F0030B0A4928F2 +:105548009088EDB80001C0A1EE0903281AD848A830 +:1055580048EC1AD8F01F000A2FED48DB0C9C2F8569 +:10556800EE050923F01F000B0C9B0E9CF01F000A90 +:10557800DA3ADC3A80038D2080038348800094C4A3 +:105588008002E736000016A6800384FC800055A040 +:105598008000D662800052C0D431149518971696B0 +:1055A800580CC041E06C00F6D832F01F001D3FF8DF +:1055B800E9DCC008F0041800C041E06C00FFD832F4 +:1055C8003009EE040008F16900683019F169001526 +:1055D80049489088EDB80001C171E8C8FFF8EE08A5 +:1055E8000323F01F00114918201D1AD37008F8086A +:1055F80001081AD848E85C7548EC1AD51AD61AD8A2 +:10560800F01F000D2FAD2F84EE04032C580CC06042 +:105618000C9B0E9CF01F0009300CD832800050AC57 +:10562800000016A2800095040000153480038D50F8 +:1056380080038508800094C4800052C0D421189744 +:10564800580CC1C0F01F000E18965BFCC060EF3B01 +:10565800000B5C5CF01F000B48B89088EDB80001A7 +:10566800C0A148A8201D48AC1AD61AD71AD8F01FCE +:1056780000092FCD30094888B089D82280002044FD +:1056880080002068000016A280038D3C80038538C6 +:10569800800094C400007B07D4314898189711897A +:1056A80048889088EDB80001C3015C69F8090028B2 +:1056B80071185808C08110951096C0D80000153090 +:1056C800000016A2F809000AF5350015F2CAFFF81D +:1056D800F80A03266F5A201D580AF40C1700F5FC27 +:1056E80010045808F00B1700F1FB10041AD51AD64D +:1056F8001ADC1ADA1ADB1AD84C281AD74C2C1AD901 +:105708001AD8F01F00422F6D0E9C3005F01F004084 +:10571800EEC6FFBC0A924BF34BA45C5CF01F003E44 +:105728006C08300B2FF5109C5808C1D0F01F003BB7 +:105738006C0C300BF01F003A6C0C300BF01F00396A +:105748006C0C300BF01F00388688EDB80001C0B132 +:10575800201D1AD26C0870484B4C1AD81AD4F01F66 +:10576800002B2FCD2FC65845CDC16F5C580CC1D02A +:10577800300BF01F002A300B6F5CF01F002D6F5CA0 +:10578800F01F002C4A385C5C9088EDB80001C0D14D +:10579800201D5C6C1ADC6F5870481AD849984A6CFE +:1057A8001AD8F01F001A2FCD6FEC580CC060F01FEC +:1057B80000236FECF01F00224A28F1260000495808 +:1057C8009088EDB80001C0E1ECC8FFEAEE080328B4 +:1057D800201D1AD848B81AD649BC1AD8F01F000B91 +:1057E8002FCD2EA6EE06032C580CC060F01F001714 +:1057F8003008EE0609280E9CF01F0014D83200006D +:1058080080038CC880038348800094C480002044AF +:10581800000016A280006F288000D6588000D6624B +:105828008000D65C8000D668800385608000D66ED4 +:105838008000E50480038588800111C88001122852 +:1058480000001530800385B08002E28CD4211897BF +:10585800580CE080007EF01F00413FF8EDDCC008E6 +:10586800F0061800C750EE0600287114089CF01FB7 +:10587800003CEBDCC008C0D10A9B089CF01F003933 +:105888000A9B089CF01F00380A9B089CF01F0037F1 +:105898004B789088EDB80001C0D1F1D5B0081AD87E +:1058A80068481AD84B381AD44B3C1AD8F01F003322 +:1058B8002FCD4AF43FF8F0051800C1718809300867 +:1058C800F0091900C0D4EE0600287118201D1AD856 +:1058D8004AB81AD64ABC1AD8F01F00282FCD0C0790 +:1058E8003018EF68006CC368EE0600083009F169EB +:1058F800006CEE0600280E9C711BF01F00238888A0 +:10590800EDB80001C0E1ECC8FFEAEE080328201D4D +:105918001AD849B81AD649DC1AD8F01F00182FCD62 +:105928002EA6EE06032C580CC060F01F0019300894 +:10593800EE06092848E89088EDB80001C0B149088A +:10594800201D494C1AD8F01F000D2FEDC038E06516 +:1059580000FF0A9CD8220000800050AC8000E504BB +:105968008000D6588000D6628000D65C000016A25F +:1059780080038D2C800385CC800094C480038CD850 +:10598800800385F880004D98800385B08002E28C02 +:1059980080038624D4211897580CC0E14BE890085E +:1059A800F8081900C7744BD8201D4BDC1AD8F01F13 +:1059B800003D2FEDD82278264BB85806C121F12595 +:1059C8000000F01F003A0E9CEF34000BF01F003867 +:1059D800089B5C5CF01F00370A07EF660068D82256 +:1059E80011894AD89088EDB80001C2C15C69F809EC +:1059F800002871185808C04110951096C098F809E9 +:105A0800000AF5350015F2CAFFF8F80A03266F5A9E +:105A1800201D580AF40C1700F5FC10045808F00B68 +:105A28001700F1FB10041AD51AD61ADC1ADA1ADB99 +:105A38001AD849A81AD74A0C1AD91AD8F01F001927 +:105A48002F6D4998F1260000ECC5FFF0EE05002502 +:105A58006A1C580CC1F078485898C1C05808C1A0B1 +:105A6800F01F001648C85C5C9088EDB80001C0C102 +:105A7800201D5C6C1ADC6A181AD84888490C1AD898 +:105A8800F01F00082FCDEE0600260E9C6D1BF01FA0 +:105A9800000DD822000016A2800382988003864455 +:105AA800800094C400001530800056A08000204477 +:105AB800800020688003834880010CEC8003865CAA +:105AC80080005854D4214B0818979009169630082E +:105AD800F0091900C0F44AD8F12800001AD8F1DBFF +:105AE800B0081AD84AA81ADC4AAC1AD8F01F002AFB +:105AF8002FCD4AA811893008F0091800C0414A8CF6 +:105B0800F01F00253FB8F0061800C3C15807C110A0 +:105B180049E830091188F2081800C0B53039F20890 +:105B28001800E08900075C68EE080028711BC0288F +:105B3800300B0E9CF01F001B49389088EDB800010F +:105B4800C1114928F1280000201DF0C9FFEAEE091B +:105B580003291AD91AD848E8493C1AD8F01F000E68 +:105B68002FCD48A6ED2800002EA8EE08032C580CCF +:105B7800C090F01F000EED28000030092EA8EE0896 +:105B88000929D822000016A200001530800382A837 +:105B980080038680800094C4000016AB800386B41E +:105BA80080004D98800385B08002E28CD42118973C +:105BB8001696580CC4E04A8890093008F009190074 +:105BC800C0C4F1DBB0081ADC1AD84A481ADC4A4CBF +:105BD8001AD8F01F00242FCD4A3811893008F0094F +:105BE8001800C0414A1CF01F001F3FB8F0061800FB +:105BF800C301499890093008F0091900C084497810 +:105C08001AD749BC1AD8F01F00172FED0E9CF01FA9 +:105C180000194998F126000048F89088EDB800016D +:105C2800C0E1ECC8FFEAEE080328201D1AD848B8DE +:105C38001AD6492C1AD8F01F000B2FCD2EA6EE0627 +:105C4800032C580CC060F01F000E3008EE0609281F +:105C5800D8220000000016A2800382D0800386C8E4 +:105C6800800094C4000016AB800386B4800386F8D5 +:105C78008000564400001530800385B08002E28C15 +:105C8800D4311897149678CC94CAF80A000A8FCAA7 +:105C98001093169512946E385808C1504A5CF01F3C +:105CA8000026EF18001A3509F0090D083008F00928 +:105CB8001900C0414A1CF01F0020EF08001A2FF8F5 +:105CC800EF58001A49E89088EDB80001C171202DFD +:105CD800304A1A9C089BF01F001BF01F001BEF386E +:105CE8000014F3D3C01050091ADC1AD849781AD610 +:105CF800497C1AD8F01F00102FAD0A9AEF3B001408 +:105D08000C9CF01F001409890998B168F1E9118801 +:105D180009A9F1E9108809BBEF3C0014F5D3C010BC +:105D2800104BF01F000D0C9CF01F000CD832000027 +:105D380080037FB4800094C4800384D4000016A23A +:105D48008002E736800096A88003827C800387184B +:105D580080007130800020088000D13CD431204D73 +:105D6800502C503BFAC4FFCC10916800681268238D +:105D780068386846129568545819E088000E4B58E0 +:105D880090093008F0091900E08402B0201D4B2862 +:105D98004B2C1AD8C2F85801C0C14AE89008E2084A +:105DA8001900E08402A3201D4AB84ADC1AD8C22888 +:105DB8005802C0C14A789008E4081900E0840296A5 +:105DC800201D4A584A7C1AD8C158501A500837CB57 +:105DD800301CF01F0025401A18974008C10149D807 +:105DE8009008F8081900E0840281201D49A849FCA0 +:105DF8001AD8F01F001F2FEDE08F0278402999383C +:105E0800B829300840395C729900B831992599DA77 +:105E180099E999F29943F9480050F9480044F9483A +:105E28000048F948004C5803E080008C3058F95875 +:105E38000074F01F0010EF4C00784865580CC1D171 +:105E48008A08F8081900E084020C1AD748A8C8582C +:105E5800000016A280038CA880038744800387640F +:105E6800800387848002DC3C800387A8800094C478 +:105E780080011200800382F88A88EDB80001C131E0 +:105E88006E08201D8EA51AD8F01F00366FE8500541 +:105E98001ADC1AD84B481AD84B484B5C1AD8F01F52 +:105EA80000352FAD6E258EAA6FEC5805C1210E9BCB +:105EB800F01F00315C5CC2504B089008EA081900DA +:105EC800E08401CF1AD74A984ADC1AD8E08F0175C6 +:105ED8004ACBF01F002DF5DCC008C0E04A789009D5 +:105EE8003008F0091900E08401BC201D5C6A49F8FB +:105EF8001ADA1AD7C499EF3C0014149BF01F002338 +:105F08006FEC0E9A4A2BF01F002349C8908CE21CB4 +:105F18000002E08001A76FE8F11900141AD970197E +:105F28001AD9F11900121AD970081AD848E81AD8DB +:105F380048E8499C1AD8F01F000F2FADE08F018F59 +:105F4800F01F00161892C2F148C89008F808190006 +:105F5800E08401871AD749281AD8492CC2D90000E9 +:105F6800800096A88003825C800382F88003880CF6 +:105F7800800094C480011320000016A280038824A6 +:105F88008003B409800112608000200880005C88CA +:105F9800800111F8800388848000E34080038C6CC2 +:105FA800800387E04B880E9BB083F01F0038EF63B7 +:105FB800006FEF63006CEF63006DEF63006E6E2897 +:105FC8004B355808E08100BD049B0E9CF01F003142 +:105FD800E7DCB0086EFCF01F0030E6C8FFEAEE0808 +:105FE800092C8A88EDB80001C0A14AC8201D1ADC16 +:105FF8004ABC1AD31AD8F01F002B2FCD2EA34A451E +:10600800EE0303285808C0B18A09F0091900E08492 +:1060180001281AD74A184A4C1AD8CCE84A3B049C9B +:10602800F01F00234A3B049CF01F00234A3B049CBA +:10603800F01F0023304A4A3B049CF01F00234A38D3 +:106048003009B0898A88EDB80001C0C1EE03032881 +:10605800201D1AD849181AD249DC1AD8F01F001185 +:106068002FCD4898118948A89088EDB80001C5310E +:106078005C69EE09002871185808C2B11093109590 +:10608800C3080000000015308000D658000016A292 +:1060980080004E0C8002E2A480038C6C800388A8E8 +:1060A800800094C4800388C480005BB48000D668F4 +:1060B800800069888000D65C800055A08000D66288 +:1060C800800067B48000D67200007B07800388F4E4 +:1060D800EE09000AF5330015F2CAFFF8EE0A0325A7 +:1060E800201D5808F00B1700F1FB10046F5A580ACE +:1060F800F40C1700F5FC10041AD31AD51ADC1ADAB6 +:106108001ADB1AD84B681AD74B6C1AD91AD8F01F51 +:1061180000362F6D049C4B598EAA0E9BF01F00343D +:106128005C5CE080009F4B3890093008F00919004A +:10613800E08400971AD74AA84AFC1AD8C3D88A8894 +:10614800EDB80001C0F1301B0E9CF01F002C6F58F9 +:106158001ADC1AD84A281AD74A9C1AD8F01F0022E3 +:106168002FCD8EAA4A7B049CF01F00275C5CC120BF +:106178004A0890093008F0091900C724201D5C6CF2 +:1061880049781ADC1AD71AD84A0CF01F00172FCDF5 +:10619800C678049CE06B00FFF01F001DEF4C005414 +:1061A8004945580CC0D18A08F8081900C5941AD76F +:1061B80048B8498C1AD8F01F000C2FEDC5188A88EA +:1061C8004959E21800021389C4505C69EE09002895 +:1061D80071185808C2211095109BC27880038C6CE6 +:1061E80080038348800094C48000523C8000E350C0 +:1061F800000016A28003891080004E84800389382D +:106208008003B4098000D7708003884C8000DC04C8 +:106218008003896400001530EE09000AF535001581 +:10622800F2CAFFF8EE0A032B7843201D5808F00A3B +:106238001700F1FA10041AD51ADB1AD31ADC1ADA85 +:106248001AD84AC81AD74ACC1AD91AD8F01F002B1C +:106258002F6D4ABB6F5CF01F002B300CC0283FFC31 +:106268004A95580CC0E08A093008F0091900C3A4FF +:106278004A68201D4A6C1AD8F01F00202FEDC32849 +:106288008A88EDB80001C2914A284A396E204A31FD +:106298005800F2001700F00017108E226E484A09C5 +:1062A8006EF35808F20117108E355818C0316FEC8C +:1062B800C058301B0E9CF01F001B49481AD05C7256 +:1062C8001AD15C751AD21AD31AD51ADC496C1AD7A6 +:1062D8001AD8F01F000A2F8D8907EF660014300CBA +:1062E800C0580E9CF01F00113FFC2FCDD832000083 +:1062F80080038C6C80038348800094C480006434DD +:106308008000D66E000016A280038CA880038988BE +:1063180080037BDC80037BE480037DC880037DC42D +:1063280080004E84800389A8800056A0D431203D87 +:10633800300730194B38E06504001892169191091E +:10634800E06007D00A9350070E964AF4C22826CC7C +:1063580058ACE08B001F4ADEFC0C032F3016C198A6 +:106368003006C178680CF01F002AE7DCB010C118AD +:1063780030185008C0E8680CF01F0025EBDCB0109E +:10638800C0883017C068680CF01F0021E1DCB0102D +:106398004A0A029B049CF01F00205BFCCD91580622 +:1063A800C161498870080438C0A4E208032BFACCFC +:1063B800FFF8F01F001A402B580BC0A14988201D78 +:1063C800498C1AD8F01F00182FEDC198300B502BAC +:1063D800F1D5C0100C99FAC5FFFC300650161AD535 +:1063E8001AD6402E5C731ADEF9D0C0101AD70C9A50 +:1063F8001AD31ADB0C9BF01F000D2FAD2FDDD83AF6 +:1064080000007AB800007AC0800382208002DC2C69 +:10641800800389E08002E278800098FC0000000C8C +:10642800800389EC800094C480005D64D4211897AF +:106438001696580CC041E06C00F6D8224C1890888B +:10644800EDB80001C0A14C08201D1ADB1ADC4BFC7A +:106458001AD8F01F003F2FCD4BA89088EDB8000147 +:10646800C0F16C481AD8ED1800241AD8ED18001C91 +:106478001AD84B584B7C1AD8F01F00352FCD0C9BDF +:106488000E9CF01F0035EDDCB008ECC8FFEAEE0802 +:1064980003285808C0804B18201D4B1C1AD8F01F21 +:1064A800002C2FED6EFCF01F002FECC8FFEAEE0861 +:1064B800092C4A489088EDB80001C0A14A28201D3F +:1064C8001ADC4A9C1AD61AD8F01F00212FCDECC826 +:1064D800FFEAEE0803285808C10149A99209F00902 +:1064E8001900C08449881AD74A0C1AD8F01F001816 +:1064F8002FEDE06C00FFD8220E9B2F06EE0600263B +:106508006C1CF01F001B49BB6C1CF01F001B49BB17 +:106518006C1CF01F001B6C1C304A49ABF01F001AA2 +:106528000E9CF01F001A583CE08B00075C5C300A98 +:106538000E9BF01F0017F01F00178F7CD82A000051 +:10654800000016A2800382E8800389F0800094C4CA +:1065580080038A1480004E0C80038A3880039DC013 +:106568008002E2A4800388A8800388C48000D658EB +:10657800800069888000D65C80005ACC8000D6688C +:106588008000659C8000D6728000204480002A002C +:1065980080009504D43118971695580CC041E06CCA +:1065A80000F6D832F01F00473FF8EDDCC008F006CF +:1065B8001800C041E06C00FFD832ECC8FFF8EE08C4 +:1065C80003285808EFD6E108F1F91868F7B901FF70 +:1065D800F1F91E68EE0600083049F1380068F20843 +:1065E8001800E088001E4B89920A3009F20A190047 +:1065F800C0A41AD84B581AD74B5C1AD51AD8F01F12 +:1066080000352FCD0C070A9C3006301BEF6600685A +:10661800F01F0031E06C00FBEF66006CD8325805C3 +:10662800C1504AE89088EDB80001C101EAF800A815 +:106638001AD8EAF8009C1AD8EB3800AD1AD84A38AC +:106648004A7C1AD8F01F00232FCDECC8FFF8EE08BB +:1066580003245804C1D049C89088EDB80001C1810D +:10666800EE060008301BF1330068F132006C0E9C16 +:10667800F01F001C4958201D1AD41AD21AD31AD751 +:106688001AD51ADC498C1AD8F01F00122F8D0A9BD4 +:106698000E9CF01F0016EE0600033002E738006C6F +:1066A800E4081800C7100A9CF01F00113FF8E9DC45 +:1066B800C008F0041800C1D13018E768006CC4A8FD +:1066C800800050AC000016A280038C8C80038A4C9A +:1066D800800094C48000E124000016A880038A7C0E +:1066E80080004E8480038AB0800052C08000E50498 +:1066F800EE060028E762006C711B0E9CF01F002359 +:106708004A389088EDB80001C0E1ECC8FFEAEE080D +:106718000328201D1AD849F81AD649FC1AD8F01FA0 +:10672800001F2FCDECC3FFEAEE03032C580CC0600A +:10673800F01F001B3008EE03092849589088EDB86F +:106748000001C0814938201D496C1AD8F01F001378 +:106758002FED48F89088EDB80001C1610E9C301B00 +:106768000C07EF37006CF01F001048A81AD65C64BD +:106778001AD41AD71ADC48DC1AD51AD8F01F000721 +:10678800300C2FADD832D83A80004D98000016A2B0 +:1067980080038C8C800385B0800094C48002E28CD6 +:1067A8008003862480004E8480038AF0D4311897B1 +:1067B8001695580CC041E06C00F6D832F01F003E28 +:1067C8003FF8EDDCC008F0061800C041E06C00FF9F +:1067D800D8324BA89088EDB80001C1A1EE06000898 +:1067E800F1340068F133006C4B58301B11820E9C59 +:1067F800F01F00344B48201D1AD21AD31AD41AD7C6 +:106808001AD51ADC4B1C1AD8F01F00312F8DEE0652 +:1068180000083009F13A006CF20A1800C060F1393A +:1068280000682FF9F1690068EE060008F134006885 +:106838003088F0041800E08800224A68900930087F +:10684800F0091900C104301B0E9CF01F001E49E816 +:10685800201D1AD41AD71ADC49FC1AD51AD8F01FE9 +:10686800001C2FAD30080C070A9CEF680068301B2D +:10687800F01F001AE06C00FBD83249181189300863 +:10688800F0091800C0500A9B0E9CF01F0015EE0678 +:1068980000043008E939006CF0091800C6100A9C99 +:1068A800F01F00103FF8F00C1800C1D13018E9684B +:1068B800006CC3E8800050AC000016A800007B07FD +:1068C80080004E848003824C80038B2C800094C40B +:1068D800000016A280038B6C8000E124800052C067 +:1068E8008000E5040E9CF01F001F49F89088EDB861 +:1068F8000001C0E1ECC8FFEAEE080328201D1AD801 +:1069080049A81AD649AC1AD8F01F001A2FCDECC4E2 +:10691800FFEAEE04032C580CC060F01F0017300883 +:10692800EE040928EE0600083009F169006C48E811 +:106938009088EDB80001C1410E9C301BEE060006A0 +:10694800ED37006CF01F000D48881AD71ADC48CCC8 +:106958001AD51AD8F01F0007300C2FCDD832D83AE4 +:1069680080005644000016A28003824C800385B044 +:10697800800094C48002E28C80004E8480038B984F +:10698800D4311294580A5F1830091497F204180089 +:106998005F0318961695E7E80008F2081800C55036 +:1069A800335CF01F00406CC98EC8F20800088DC81F +:1069B8006C385808C0614BC89088EDB80001C231E6 +:1069C8004BA89088EDB80001C0918EC81AD84B88A2 +:1069D8004B8C1AD8F01F00382FED4B889088EDB8F3 +:1069E8000001C0C14B28201D4B5C1AD8F01F003293 +:1069F8008ECB6E1CF01F00332FEDED08001A2FF818 +:106A0800ED58001A0A9AED3B00140E9CF01F002E58 +:106A18004A689088EDB80001C1218EC8201D1AD897 +:106A28001ADCED38001430091AD91AD71AD51AD831 +:106A380049F84A6C1AD8F01F00202F8D0E9CF01FC1 +:106A48000024335CF01F002358075F081063C160FF +:106A580049689088EDB80001C0C1201D1AD5ED38ED +:106A680000141AD8492849CC1AD8F01F00132FCD82 +:106A78000A9B0C9CF01F0019C1385804C11048B873 +:106A880090093008F0091900C0B44898201D5C64CA +:106A98001AD7493C1AD41AD8F01F00072FCDD83A74 +:106AA8008000A300000016A6000016A280038C98A0 +:106AB80080038BC8800094C4000016A080037C84E7 +:106AC80080013DB48000713080038BD88000D13CB8 +:106AD8008000A2E680038C108000585480038C3C10 +:106AE800D42148C8189716969088EDB80001C0A11F +:106AF8004898201D1ADB1ADC488C1AD8F01F0008A9 +:106B08002FCDF7D6C0100E9CF01F0006D82200002B +:106B1800000016A280038D0480038C50800094C46A +:106B28008000D984D4213007C1B80C9C0E9B2FF665 +:106B3800F01F000D1895C0F078485808C0C1F01F24 +:106B4800000B0A9CEB35000BF01F00090A9B5C5CEC +:106B5800F01F00085846CEA12FF75827C03030063E +:106B6800CE5BD82280002024800056A080002044DC +:106B780080002068D4214978F00C07085808C071B3 +:106B88004959F20C070AF00A1800C1F04929F20C19 +:106B9800070AF4081800C1904909F80C001CF0080D +:106BA8000017A567EE0C0027120748D99289EDB99E +:106BB8000004C0C11AD848B81ADA48BC1AD71AD87B +:106BC800F01F000A2FCDC02830070E9CD8220000E5 +:106BD8000000153C0000153800007B2C000016A6AC +:106BE8008003901080038DE0800094C4D421169710 +:106BF8001496F01F0005C0609828AC087808301C6F +:106C08008F08D82280006B7CD43149B849B91092DA +:106C1800F00C0708F20C070718961AD7498C1AD8EF +:106C2800EC060014F01F001749732FEDA36431E53B +:106C3800EE070018A568E8080008E60800087009CB +:106C48005809C0C090BA90AB1ADB1AD9702848FC12 +:106C58001AD81ADAF01F000B2FCD2FF7E406070811 +:106C68005C57EE051800F9B70000EE081800CE11C1 +:106C7800D8320000000015380000153C80038DF460 +:106C8800800094C400007B2C80038E0CD431201D1E +:106C98004A181896F00C07073005F80C001849F048 +:106CA800A36849F149F231E349F4EE070019A569EF +:106CB800F0090009E0090009720A580AC1D0923B9C +:106CC800922A8289F40B010CE2190010F8050005DC +:106CD8005C855809C1105C7B5C7AF3D5C010201D17 +:106CE800492C1AD91ADB1ADA1AD61AD25068F01FA8 +:106CF80000102FAD40082FF7E80607095C57EE0390 +:106D08001800F9B70000EE091800CD010A9C2FFD04 +:106D1800D83200000000153C00007B2C000016A6AD +:106D280080038DA00000153880038E28800094C44D +:106D3800D421F01F000B48B8EFDCB0109088EDB8F4 +:106D48000004C0A10E985C781AD84878487C1AD8F4 +:106D5800F01F00072FED0E9CD822000080006C94D5 +:106D6800000016A680038D7080038E4C800094C4AA +:106D7800D4214A181897169631D9F20C1800E088D1 +:106D8800000F90093008F0091900C33449B81ADC1B +:106D980049BC1AD8F01F001B2FEDD822F60B001A99 +:106DA8009088F80C0019E2180010A569F20A002969 +:106DB800495AF40903055808C0A04908201D1ADCDF +:106DC800492C1AD51AD8F01F000F2FCD0A9CF01F96 +:106DD80000103008EC060016EE07001748A9A56752 +:106DE800EE060026F20600068D288D08AC28AC3881 +:106DF800D8220000000016A280038DD080038E6880 +:106E0800800094C400007B2C80038E888002E28C72 +:106E1800D4314948F80C00121896F00C0707A36201 +:106E2800491331E44915EE070018A568E40800087D +:106E3800E60803085808C0500E9C0C9BF01F000C75 +:106E48002FF7EA0607085C57EE041800F9B70000A8 +:106E5800EE081800CE914839300CF2060B08D832EB +:106E68000000153C00007B2C0000153880006D7870 +:106E7800D4211897580CC0E14A189008F80819004E +:106E8800C3C44A08201D4A0C1AD8F01F00202FED51 +:106E9800D82249FAF40B070CF8CEFFFFF80C001CB7 +:106EA800A56CF40B0B0E3008F60B0019F809002935 +:106EB800498CF809000993289308B228B23831E9B7 +:106EC800F20E1800C031F40B0B0848D89088EDB8C2 +:106ED8000004C10148E8F00B07081AD848E8F00B8D +:106EE80007081AD848781AD748CC1AD8F01F0007CC +:106EF8002FCD0E9CF01F000AD8220000000016A219 +:106F080080038D8480038E98800094C40000153C13 +:106F180000007B2C0000153880038DE08002E28C95 +:106F2800D42118970E9CF01F0005C060780C0E9BAA +:106F3800F01F0003CF8BD82280006B7C80006E7816 +:106F4800D421496818971696149512949088EDB82C +:106F58000001C0C14928201D1AD91ADA1ADB1ADC27 +:106F6800490C1AD8F01F00102FAD301B0A9CF01FD7 +:106F7800000FC080301B0A9CF01F000C784858088E +:106F8800C0510C9B0E9CF01F000A5804C0500A9B6D +:106F9800089CF01F0008D822000016A280038D600C +:106FA80080038EAC800094C48000202480006AE8AE +:106FB80080006E78D4211897F01F00061898C02119 +:106FC800D8220E9A782C700990ABF01F0003DA2AA9 +:106FD80080006B7C80006F48D42116961494189515 +:106FE800F01F001E1897C021D8229838982B7809CE +:106FF800F6081900C2B2F5D8C0105804C050F20AF9 +:107008000708AC88C068F20A0709AC892FF8B838B5 +:1070180049389088EDB80004C0D10D881AD86E0898 +:107028001AD88EB81AD848F848FC1AD8F01F000F9A +:107038002FCD8E3B8E28F6081900C0710A9A5C7B0A +:107048006E2C6E09F01F000ADA2A0A9A5C7B782CEB +:10705800F01F0007D82A000080006B7C000016A6ED +:1070680080038D9080038ED4800094C480006F4884 +:10707800D4211897F01F00231896C021D8224A2837 +:107088009088EDB80004C0D178081AD898A81AD802 +:107098008CB81AD849D849EC1AD8F01F001E2FCD41 +:1070A8008C398C28F0091900C020DA2A49A8908860 +:1070B800EDB80004C1614998201DF0070709498807 +:1070C8001AD9F00707081AD8F20818005F191AD950 +:1070D8006C081AD848D8493C1AD8F01F000E2FADB2 +:1070E8006C2C6C090E9A8CABF01F000F48C8F00787 +:1070F800070948A8F0070708F00918005F1CD822FC +:1071080080006B7C000016A680038DBC80038EE88F +:10711800800094C4000016A2000015380000153C39 +:1071280080038F0080006F48D43118951697149308 +:10713800580CC0311894CBD8F60B001A4A58F00BEB +:107148000708F0080019A569F20A00294A2AF40973 +:1071580003095809C1604A1A940B300AF40B190044 +:10716800C0A4201D1AD849E81AD949EC1AD8F01F2A +:10717800001E2FCD49780E9BF007070CF01F001B4F +:10718800301B8ACCF01F001A18961894E0800092E1 +:10719800189B30098ACA0A9CF01F00168A485C8C22 +:1071A800F00C1900C2C048D9920A3009F20A190035 +:1071B800C0B45C781AD848A81AD648FC1AD51AD888 +:1071C800F01F00092FCD0C9C3004F01F000CC718CD +:1071D8000000153800007B2C000016A280039004E4 +:1071E80080038F2C800094C480006D788002DC3C82 +:1071F8008000CEC480038F548002E28C4AE9F207F3 +:10720800070AF4CBFFFFF40A001AA56AEE07001874 +:10721800F2070B0BF40800284A8AF4080008300A21 +:107228009123B02C9106B03A31E8F00B1800C03128 +:10723800F2070B0A4A084A29F0070708F207070964 +:10724800F0091800C1C149F9920A3009F20A190077 +:10725800C0A4201D1AD81AD849B849CC1AD8F01F8A +:10726800001C2FCD4948F00707095809F9BA01FF52 +:10727800F3DAE109F9B9001DF0070B0949189088FC +:10728800EDB80004C1618AC848DAF407070A201D6E +:107298000D891ADA488AF407070A1ADA1AD91AD8A5 +:1072A80048981AD648BC1AD71AD8F01F00092F8D4B +:1072B800089CD8320000153800007B2C0000153CD3 +:1072C800000016A28003900480038F90800094C46D +:1072D80080038FBCD431203D1690502A1895F01F9A +:1072E8000021301BE5DCB010F9D2C010F01F001EE1 +:1072F8001896C2C049D8EA050019F0050707A3691E +:10730800189431E849A1189349ABEE070016A56611 +:10731800F2060006F60600066C0B580BC0B0089C77 +:107328008CAA50095018F01F00148CAA4018140495 +:1073380040092FF7E205070A5C57EE081800F9B76D +:107348000000EE0A1800CE110696402A5800E1F611 +:107358001A00580AF5F21C000C9C2FDDD8320000E8 +:1073680080006C948002DC3C0000153C000015385D +:1073780000007B2C8002E736D431303818971693FA +:107388001494F00C1800E088001B48989009300805 +:10739800F0091900C0353005CA2848681ADC3005DC +:1073A8001AD8485CF01F00052FEDC998000016A2F6 +:1073B80080038DB080038FE0800094C4F80C001A1D +:1073C8004C88F00C0708F0080019A569F20A002992 +:1073D8004C5AF40903095809C1604C4A940B300A05 +:1073E800F40B1900C0A4201D1AD84C181AD94C1C2B +:1073F8001AD8F01F00412FCD4BA80E9BF007070CA1 +:10740800F01F003E0892301B5C72049CF01F003C89 +:1074180018961895C640049A069BF01F003AEE0786 +:1074280000184B03E6070702E4020012A562E4080D +:1074380000224AD83001F0020002300B8506A4244D +:10744800A4310E9CF01F0030852CE60707082FF8A2 +:10745800E6070B0831E9F2081800C031E6070B010E +:107468004A084AA9F0070708F2070709F0091800AF +:10747800C1C149E9920A3009F20A1900C0A4201DC5 +:107488001AD81AD849A84A2C1AD8F01F001B2FCD91 +:107498004948F00707095809F9BA01FFF3DAE10981 +:1074A800F9B9001DF0070B0949089088EDB80004E8 +:1074B800C1610D884959F2070709201D1AD9489951 +:1074C800F20707091AD91AD848985C74491C1AD4C3 +:1074D8001AD61AD71AD8F01F00082F8D0A9CD8324E +:1074E8000000153800007B2C000016A280038DB028 +:1074F80080038F2C800094C480006D788002DC3C6F +:107508008002E736800020240000153C80038F901D +:1075180080038FBCD401E06A05A0300B482CF01F13 +:107528000003D80200007B2C8002E8BCD421202D67 +:10753800FE782800501C500B3FF7109E301CC308E3 +:10754800300B7049EDB90001CFD17049EDB9000990 +:10755800CFD140195809C0B01396F2C5FFFE138960 +:107568005015EDE91089F7D9D010C038F7D7D010E9 +:10757800913B7049EDB90000CFD17C2B40095C8B61 +:107588005809C080B29BF7DBC108B28B40092FE9CC +:107598005009F80A1900E0880006202A5C8A580A6F +:1075A800CD01FE78280070482FEDD822580CC06015 +:1075B800FE782800300A7019C058FE78280030FA82 +:1075C8007019F3DAD20491195EFC202D3008E069B5 +:1075D80013885018F8090249C058401A2FF82FFA92 +:1075E800501A1238CFB12FED5EFCD703D401303CCE +:1075F800F01F0005C060303CF01F0004F01F0004BD +:10760800D402D6038000A3708000A38880014014B0 +:10761800D401580CC060300B303CF01F0004D80275 +:10762800303CF01F0003D8028000A31A8000A35C3E +:10763800D401202D3008B888303CF01F0022303C9F +:10764800F01F0021309CF01F001F307CF01F001D30 +:107658003008501840192FF950192FF8E04861A840 +:10766800CFA1309CF01F00193008501840192FF98D +:1076780050192FF8E05886A0CFA1307CF01F0013D6 +:10768800340B300A492CF01F0013FE782800302AEA +:1076980070C9F3DAD108308A91C970C9F3DAD08495 +:1076A800301A91C970C9F3DAD06191C970C9F3DA97 +:1076B800D001303C91C9F01F00082FEDD80A000016 +:1076C8008000A2A88000A2BE8000A2E6800075F417 +:1076D8008000A3A08000A388D42120AD4C68E3B823 +:1076E8000001D5533017FE6810007109F3D7D20294 +:1076F800303AF1490040E06B1B00EA1B00B7FE7C02 +:107708000C00F01F003E310A201D30081ADA0E99CD +:10771800109B308AFE7C0C00F01F003930080E994F +:107728000E9A109BFE7C0C00F01F0036300BFE7C7E +:107738000C00F01F0035FE7C0C00F01F0034300CEC +:107748001ADC18981899189A1ADC189BFE7C0C00F9 +:10775800F01F002F0E9CF01F002F302BFE7C0C001A +:10776800F01F002DF01F002DD503304AFAC7FFD0B7 +:107778004ABB0E9CF01F002B302B0E9CF01F002ADA +:10778800FAC8FFDC4A99722C109B912CE06AF980A8 +:10779800EA1A0337F2E40000FE7C1800F0E5000066 +:1077A800F01F0023308A4A3B0E9CF01F001E310A4E +:1077B800FAC6FFEC300B0C9CF01F001F3018304B42 +:1077C800FB68002149DCF01F00180C9BFE7C280098 +:1077D800F01F001B3009FE7C2800129B129AF01F34 +:1077E80000190E9C0E96304BF01F000F2FCDFAC7D4 +:1077F800FFD8C2D8800376008000A5088000A4B016 +:107808008000A4CE8000A4E68000A4F48000A470C8 +:107818008000A2228000A4FE8000A3D080039038BC +:107828008002E7368000A2808003901C8000AA1C9A +:10783800800390308002E8BC800390288000A66214 +:107848008000A69C0D8C2FE6F01F000F0E36CFB1DE +:10785800FACBFFFCFE7C2800F01F000C3009FE7CF0 +:107868002800129A129BF01F000AFE7C2800F01FC5 +:107878000009302CF01F0008FE7C2800F01F0005CE +:107888002F6DD8228000A2BE8000A6628000A69C30 +:107898008000A7EC8000A2E6D42130A81896F00C4E +:1078A8001800C0C1E067271020175BF7C13030DB34 +:1078B800FE7C1800F01F0008CF81E0672710201712 +:1078C8005BF7C0800C9BFE7C1800F01F0003CF8183 +:1078D800D822DC2A8000A9AED401178A17B91798D4 +:1078E800B168F1EA118817AAF1EA1088F3E81008DC +:1078F8001AD81ADC483CF01F00042FEDD80200000B +:1079080080039064800094C4D421202D4AB811D9F2 +:10791800BAD97009500911C8BAC81A961895169498 +:10792800581CE08900064A6CF01F0026C448761CE3 +:10793800F01F0025201DEFDCC0084A4C1AD7F01FA5 +:1079480000212FED5825C2A0682CF01F001F201D14 +:10795800EDDCC00849EC1AD6F01F001A30182FEDDC +:10796800F0061800C111305A49AB0E9CF01F001ADE +:1079780030AA49AB0E9CF01F00180E9C308A498B28 +:10798800F01F0015C1883028F0061800C141300AE0 +:107998000E9C149BF01F0013C0E83038F007180045 +:1079A800E08B000A300B0E9CF01F000F1A9B306A08 +:1079B800F01F000E2FEDD82A800396B88003909808 +:1079C800800094C48002DC2C800390C4800390D093 +:1079D800800390E480007380800390EC800390F82B +:1079E800800072DC8000202480005140D421189649 +:1079F8001695582CC45176174B3B0E9CF01F00333C +:107A08001896C1014B2CF01F00334B38FE798000CB +:107A1800B0094B28B0064B28B0064B28B006E08FBB +:107A280001C44B1B0E9CF01F0029C1D14AA89088A5 +:107A3800201D4AEC1AD8F01F00274A8890884ACCA3 +:107A48005008F01F00244A6890884AAC5008F01F7C +:107A580000214A4890884A8C5008F01F001E2FEDDC +:107A6800E08F01A30E9C4A5BF01F0018C0C14A4C6E +:107A7800F01F0018E06900FF4978E08F0195582C45 +:107A8800E089000749FCF01F0013E08F018E762C77 +:107A9800F01F001D18975836E08101876A1649BB08 +:107AA8000C9CF01F000AC53148B85807E08A000846 +:107AB8009009A1A9B0095817C2A1C3089009A1C982 +:107AC800B009C2C8800391048002ECC88003910801 +:107AD800800094C4000016A2000016A6000016A09C +:107AE800000016A8800391148003911C8003913430 +:107AF8008003914C800391648003E18C8003917C26 +:107B0800800391888002DC2C800392144B799208C0 +:107B1800A1A8B2085827C071C0D84B499208A1C87B +:107B2800B208C0884B299208A1A8B2085837C0717A +:107B3800C0A84AF99208A1C8B208C0584AD9920800 +:107B4800A1A8CAC84AB99208A1C8CA884AAB0C9C5D +:107B5800F01F002AC2F14AA85807E08A00089009D5 +:107B6800A3A9B0095817C061C0C89009A3C9B00932 +:107B7800C08849E99208A3A8B2085827C071C0D89C +:107B880049A99208A3C8B208C08849999208A3A82D +:107B9800B2085837C071C0A849599208A3C8B2089A +:107BA800C05849499208A3A8C79849299208A3C868 +:107BB800C758494B0C9CF01F0011C3E149085807EE +:107BC800E08A00089009A1B9B0095817C061C1B886 +:107BD8009009A1D9B009C17848499208A1B8B2085A +:107BE8005827C161C1C80000000016A6000016A0F1 +:107BF800000016A88003921C8002ECC8000016A2A0 +:107C0800800392204B699208A1D8B208C0884B59CA +:107C18009208A1B8B2085837C071C0A84B19920889 +:107C2800A1D8B208C0584B099208A1B8C3784AE94C +:107C38009208A1D8C3384ADB0C9CF01F002DC30161 +:107C48004AC85807E08A00089009A3B9B00958172C +:107C5800C061C0C89009A3D9B009C0884A09920870 +:107C6800A3B8B2085827C071C0D849D99208A3D878 +:107C7800B208C08849B99208A3B8B2085837C07189 +:107C8800C0A849899208A3D8B208C058496992087F +:107C9800A3B8C04849499208A3D8B208C858496B44 +:107CA8000C9CF01F0013C3D149285807E08A00082C +:107CB8009009A5A9B0095817C061C0C89009A5C9FD +:107CC800B009C08848699208A5A8B2085827C151C8 +:107CD800C1B848399208A5C8B208C168000016A6FC +:107CE800000016A0000016A8800392248002ECC8A9 +:107CF800000016A2800392284AC99208A5A8B208D3 +:107D08005837C071C0A84A999208A5C8B208C05887 +:107D18004A799208A5A8CC2B4A599208A5C8CBEB5A +:107D28000C9C4A4BF01F0024C3F14A485807E08ACC +:107D3800000B9009EA19FFFFE8198000B0095817ED +:107D4800C071C1089009F3D9C00FB009C0B849C9BA +:107D58009208EA18FFFFE8188000B2085827C08187 +:107D6800C11849789009F3D9C00FB009C0B848F9CB +:107D78009208EA18FFFFE8188000B2085837C08157 +:107D8800C0E848A89009F3D9C00FB009C08848894D +:107D98009208EA18FFFFE8188000C80B48489009C5 +:107DA800F3D9C00FB009D82A000016A0000016A801 +:107DB800800392308002ECC8000016A2000016A6CC +:107DC800D421582CC2717617495B0E9CF01F001500 +:107DD800C1211897494CF01F0015201D494C1AD78E +:107DE800F01F00120E9C2FF7F01F00122FED5847BE +:107DF800CF51C1380E9CF01F0010201DEFDCC008C9 +:107E080048BC1AD7F01F00090E9CF01F000A2FED7E +:107E1800C04848ACF01F0005D82A000080039238FB +:107E28008002ECC88003923C800094C4800390C414 +:107E380080006C108002DC2C80039250D421207DBD +:107E4800306A18951696FAC7FFEAE06B00FF0E9C99 +:107E5800F01F00385825C1B16C1C4B7BF01F003750 +:107E68001896C4B14B6CF01F00370E9B0C9CF01F8A +:107E780000360E9B301CF01F00340E9B0A9CF01F2E +:107E880000320E9B303CF01F0030C5085825E08AB0 +:107E980000356C1CF01F002D6C2B1897500B169C8E +:107EA800F01F002B58DC5F04585C5F08E9E81008F5 +:107EB800ECC5FFFC109418963008FACCFFF8400B7C +:107EC800F0041800C0500C9AF01F0022C238F01FAE +:107ED800002258375F98580C5F091896F3E8100885 +:107EE800E8081800C0A15807C085C0916A08118920 +:107EF8003308F0091800C030498CC098585C5F18E6 +:107F080058DC5F19F3E80008C050495CF01F000D09 +:107F1800C0D85C570C9BFAC9FFEAFACAFFF80E9C56 +:107F2800F01F00100E9CF01F00102F9DD82A000093 +:107F38008002E8BC800392808002ECC880039288AB +:107F4800800094C48001921C8002DC2C8002EDD059 +:107F58008002EE0C800098688003929C800392DC7B +:107F68008001927080019258D421204D4ABC149609 +:107F7800F01F002B1A9CF01F002B581CC0504AAC55 +:107F8800F01F0027C0A81A9CF01F0028201D1ADC2B +:107F98004A7CF01F00232FEDF01F002618974A6C2B +:107FA800F01F001F5807C0514A4CF01F001DC04861 +:107FB8000E9CF01F00234A376E0CF01F0023C1F0FF +:107FC8006E087018201D1AD8F01F0020500C4A0C9B +:107FD800F01F00136E0870285008F01F001C500C8A +:107FE80049CCF01F000F6E0870385008F01F0017BA +:107FF800500C499CF01F000A2FEDC048497CF01F27 +:108008000008497CF01F00060DC93018F009180057 +:10801800C2A1494CC298000080039314800094C404 +:10802800800191288003932C8000967080039348E8 +:108038008001997C80039358800393A880009784DB +:10804800000080D08000CAE4800096A8800393686E +:10805800800393788003938880039398800393B078 +:10806800800393B8493CF01F0014FACCFFF4300B9E +:10807800F01F0012301B4037FACCFFF8F01F000F3A +:10808800201D1AD750574047F01F000D500C48DCF0 +:10809800F01F000950075047F01F0009500C48AC6A +:1080A800F01F0005F01F0009300C2FED2FCDD8224E +:1080B800800393C4800094C48000C1EC800096A81B +:1080C800800393D080039DC08000495CD421202D7B +:1080D8001695584CE089000649ECF01F001FC3684C +:1080E800FACCFFFC761BF01F001D6A2C4014F01F11 +:1080F800001C18976A3CF01F001A18966A4CF01F6B +:108108000018501418951ADC496C1AD61AD71AD4C4 +:10811800F01F0011089CF3D5C008F5D6C0080E9BC7 +:108128005C7BF01F00112FCD5BFCC10148F8900962 +:108138003008F0091900C0A448D81AD548DC1AD666 +:108148001AD71AD8F01F00042FCD2FEDD82A000017 +:10815800800393DC800094C4800098FC8002DC2CAF +:108168008003941480003958000016A280039054AC +:1081780080039448D4211695583CE089000649CCE0 +:10818800F01F001CC338761CF01F001B18976A2CC0 +:10819800F01F001918966A3CF01F00174978201D37 +:1081A80018941AD649651AD7580CF0051710495C67 +:1081B8001AD5F01F0010089AF7D6C0085C5A0E9C12 +:1081C8005C7CF01F00112FCD5BFCC10148F89009C1 +:1081D8003008F0091900C0A448D81AD648DC1AD7C4 +:1081E8001AD51AD8F01F00032FCDD82A80039488F7 +:1081F800800094C48002DC2C80037DC480037DC889 +:10820800800394B880003C50000016A28003969C1E +:10821800800394DCD421206D1697582CE089000641 +:108228004A4CF01F0025C438761CF01F00246E2B22 +:10823800F8C700011A9CF01F0022304A1A9BFAC6A0 +:10824800FFEC0C9CF01F001F201D40681AD8F01F7F +:10825800001E1ADC49DC1AD7F01F00170C9B0E9C75 +:108268005C5CF01F001BFACCFFE0300BF01F00191C +:10827800301B4087FACCFFE4F01F00162FDD505763 +:108288001AD74056F01F00101AD71ADC492C50870D +:10829800F01F00092FDD50461AD6F01F000B1AD622 +:1082A8001ADC48EC5076F01F00042FCD2FADD82AE9 +:1082B80080039510800094C48002DC2C800098FC18 +:1082C8008002E736800096A8800395388000C19C1C +:1082D8008000C1EC8003955480039564D421FACDC5 +:1082E8000108581CE0890006491CF01F0012C1D87B +:1082F800F6C9FFFCF8CA0001FAC7FFFCE06B0100F1 +:108308000E9CF01F000DC110300948CAFACBFEFCC4 +:108318000E9CF01F000B5C5CC0814418489C1AD866 +:108328001AD7F01F00042FED2BEDD82A800395747F +:10833800800094C480009710800078E08000C4C05A +:1083480080039064D43121AD18961695582CE08995 +:1083580000064A1CF01F0021C3B8FAC7FFFC344AC4 +:10836800300B0E9CF01F001E306AE06B00FFFACC49 +:10837800FFDBF01F001BFAC4FFB8EAC9FFFCECCA18 +:108388000002320B089CF01F00171893C210189AAD +:10839800089B0E9CF01F00143088FB6300242016F5 +:1083A800EA060326FB68003C0C9CF01F00100C9B9F +:1083B800189A30180E9C3089F01F000D581CC08088 +:1083C80048C8201D48CC1AD8F01F00042FED2E6D88 +:1083D800D83A000080039590800094C48002E8BCDD +:1083E800800097108002E7368002EDD080019084EB +:1083F80080039048800395B4D42121AD1696582C5B +:10840800C05049BCF01F001BC308FAC7FFFC344A20 +:10841800300B0E9CF01F0018306AE06B00FFFACC9E +:10842800FFDBF01F0015ECC9FFFC301AFAC6FFB8D5 +:10843800320B0C9CF01F00111895C170189A0C9BF8 +:108448000E9CF01F000F3088FB6500240E9CFB6813 +:10845800003CF01F000C581CC08048B8201D48BCC8 +:108468001AD8F01F00042FED2E6DD82A800395D45A +:10847800800094C48002E8BC800097108002E73630 +:1084880080018FF8800396AC800395ECD431204DA1 +:108498001493189516947406582CC091761C304A7B +:1084A8004A7BF01F0028C0513018C458584CC0806F +:1084B8004A5CF01F00264A6CF01F0024C3D8761BC4 +:1084C8001A9CF01F00240A9A1A9BFACCFFF4F01F9A +:1084D80000224A289088EDB80002C0B1201D40480B +:1084E8001AD849F81AD649FC1AD8F01F00182FCD07 +:1084F800FAC7FFF40C9C0E9BF01F001B682B1A9CFC +:10850800F01F0014304A1A9B0E9CF01F00130E9B9C +:108518000C9CF01F0016683B1A9CF01F000E304A96 +:108528001A9B0E9CF01F000C0E9B0C9CF01F001059 +:108538001A953008A6C82FCDD83A0000800392803B +:108548008002EDE680039610800094C48003964074 +:10855800800098FC8002E736000016A28003903C59 +:10856800800396688000CBC88000CA928000CA74D5 +:10857800D421212D581CE0890006491CF01F001148 +:10858800C1C8F6C9FFFCF8CA0001FAC7FFD8320B08 +:108598000E9CF01F000D1896C1000E9B189AFAC782 +:1085A800FFF90E9CF01F0009300BFB6600270E9C9C +:1085B800F01F0007F01F00072EEDD82A80039684CD +:1085C800800094C4800097108002E736800099A844 +:1085D8008000998CD401F01F0003F01F0003D80A13 +:1085E80080019EF880009820D40148BE1898300970 +:1085F8007C0C580CC0A1F2090019487EFC0900291E +:10860800932A9318930BD8022FF92F4E58F9CF11AC +:10861800DC0A000000001544D401484CF01F000497 +:1086280030194848B089D802800396C0800094C4A5 +:10863800000015F8D4314B68169570065806C050DE +:108648005816E08100BAC938580CE08000B5F01F10 +:1086580000314B18910C1897580CE08000AD19891F +:10866800EC091800C0415805C460C4284AB44AC37C +:108678008906C188EC060018E60800287012049CD8 +:108688005802C0E0F01F002718910E9CF01F00252B +:108698000E9BE20C0D4A049CF01F0023C3102FF61A +:1086A8008906680649D258E6FE98FFE658F6C28160 +:1086B8005805C210049749DCF01F001D3008498690 +:1086C8008508C128F0080018EC0800287009580926 +:1086D800C0807018201D497C1AD8F01F00152FED96 +:1086E8006E082FF88F086E0858E8FE98FFED492CA1 +:1086F800F01F000F4888700CF01F0010C5C80E9CB2 +:1087080048FB49074906F01F0011C2C8000016407F +:108718008002ED8400001644000015400000154456 +:108728008002EDD08002EDE6800396C8800094C4F4 +:10873800800396E0800396C48002E28C80039364F1 +:10874800000015FC000016008002EEB86E08EC0868 +:10875800092C2FF88F085908C070498B300CF01F6E +:108768000018580CCF41301949689109496949786E +:108778007008F0080018F20800284959702A720C8D +:108788007008494B5D18581CC1705805C040492CE9 +:10879800F01F001248E83007340A0E9B910748DCA6 +:1087A800F01F000F48F8700CF01F000F4858301CDD +:1087B8009107D832D83ADA3A800393648002EEB847 +:1087C800000016400000154400001540000015FC8C +:1087D80000001600800396C4800094C48002E8BCA0 +:1087E800000016448002E28CD421202D1897FACB81 +:1087F800FFFCFE7C1800F01F0012583CC080584C4B +:10880800C081E0690100FE7818009109301CC15848 +:10881800401C58DCC03130ACC0B8588CC081F01F47 +:108828000009320CF01F00071BFCC0285C5CF01F1D +:1088380000054018300CAE882FEDD8228000A9C260 +:10884800800078A0D431202D30A1FAC0FFF930D2B1 +:10885800308349B749B630043005009CF01F001A30 +:10886800C2A11BF8E20818005F0AE40818005F09B3 +:10887800124AF80A1800C0904929491A1298740B2C +:10888800950CF20B0B0CC188E6081800C0916E0815 +:108898002018F00C17708F0CEC0C0B04C0686E09D4 +:1088A800EC090B082FF98F096E08E0480050CD61DC +:1088B8008F05CD4B3008109C2FEDD832000016489C +:1088C8000000164C800087F0D401F01F0004301B14 +:1088D800F01F0003D80200008000884C8000863C0E +:1088E800D4314974169714951293580BC0B1680C7B +:1088F800580CC0311896C2181696F01F0012890736 +:10890800C1C868085808C0C1E06C0200F01F000E1A +:10891800890CC061189648DCF01F000DC0E80A9C5D +:10892800E066020048650C33E60617806A0B0C9A6D +:10893800F01F00086A088F080C9CD8320000169CAB +:108948008002E28C8002E2A4800396E8800094C44E +:10895800800090B4D401F01F0002D80A800091086A +:10896800D4213008FAC4FFEC19C9F0091800F9B885 +:108978000100E9F81A01E9F81A02E9F81A004A1898 +:108988001AD84A1818971AD8089B3008E8C9FFF867 +:10899800E8CAFFFC780CF01F001D8F0C2FED580C57 +:1089A800C021DC2AF01F001A300949AA301BE06CEC +:1089B8001388F01F00193009498A301BE06C00FA4F +:1089C800F01F00153009496A301BE06C01F4F01FF4 +:1089D80000123009493A301BE06CEA60F01F000EC3 +:1089E8003009491A301BE06C03E8F01F000B30090E +:1089F80048EA301BE06C03E8F01F0007DA2A0000A1 +:108A08008001365C80013C948000CCA88000CAB00C +:108A180080008A708000956C80008A6480008A5883 +:108A280080008A4C80008A4080008A34D401F01F7C +:108A38000002D8028000C664D401F01F0002D802E8 +:108A480080012984D401F01F0002D8028000B8B048 +:108A5800D401F01F0002D8028000C074D401F01FB6 +:108A68000002D8028000E68CD401F01F0002D80270 +:108A78008001326430194828B0895EFC000016AACB +:108A8800D401319CF01F0003319CF01F0003D80271 +:108A98008000A2D28000A2E6D421204D3FF819C957 +:108AA8001897F0091800F9B80001EFF80E0430081B +:108AB800201D1AD850581AD81AD850685058F01F84 +:108AC800001C49CB6E0CF01F001C0E9949BA49CB0B +:108AD80049CCF01F001D2FCD581CC08049B8201D5F +:108AE80049BC1AD8F01F001B2FEDF01F001BF01F08 +:108AF800001B0E9CF01F001AC0F049A8900930080E +:108B0800F0091900C0F44988201D498C1AD8F01FB3 +:108B180000112FEDC07830194958319CB089F01FE9 +:108B280000153018EF6800082FCDD822800089681A +:108B380080008C5C8000CAEE80008B7C80008BDC1F +:108B480080008A7C80009A188003973C80039DC02F +:108B5800800094C48000998C80019EF880002A9837 +:108B6800000016A28003972880039758000016A4D7 +:108B78008000A300D4211897333CF01F000F300663 +:108B88000FD8EC081800C0C048CCF01F000D6E0CC0 +:108B9800F01F000C6E0CF01F000CAED6C07848BC5D +:108BA800F01F00076E0CF01F000A3FFCF01F0009C1 +:108BB800D82200008000A2E680039774800094C445 +:108BC8008000B1D88000AE50800397908000CABC66 +:108BD80080002E60D42116971896333CF01F00149D +:108BE8000C9CF01F0014201D1ADC493CF01F0013D8 +:108BF80030182FED0FC6F0061800C121490CF01FE0 +:108C0800000F6E0CF01F000F48F849095C5CF20C6D +:108C18001700F00C1710F01F0009AED6C0486E0CF4 +:108C2800F01F000BF01F000BD82200008000A300EB +:108C3800800096E48003979C800094C4800397B8D2 +:108C48008000B950800397D080037FC08000CB8814 +:108C58008000C690D42149471896F01F0014189533 +:108C6800C110301CF01F00126C18201D1AD8F01FFC +:108C78000011500C490CF01F001130182FEDAE8870 +:108C8800D822AE8CF01F000E48E89008EA081900B8 +:108C9800C08448D8201D48DC1AD8F01F00082FEDE2 +:108CA800D8220000000016AB8000CAE480002E60C5 +:108CB800800096A8800397D8800094C480006B2C0D +:108CC800000016A28003995C800397E8D4211897C6 +:108CD800F01F0027300A4A7B4A7CF01F0028300A20 +:108CE8004A7B4A8CF01F00254A7B300A4A7CF01FD9 +:108CF80000230E9A4A6B4A7CF01F0020300A4A6B08 +:108D08004A6CF01F001E4A6B300A4A6CF01F001BA9 +:108D18000E9A4A5B4A5CF01F0019300A4A4B4A5CBB +:108D2800F01F0016300A4A4B4A4CF01F0014300A54 +:108D38004A3B4A4CF01F0011300A4A3B4A3CF01F9C +:108D4800000F300A4A2B4A3CF01F000C300A4A2B0D +:108D58004A2CF01F000A300A4A1B4A2CF01F000751 +:108D6800300A4A1B4A1CF01F0005D82280008620C2 +:108D7800800085DC80039804800085F08000857879 +:108D88008003980C80007E448003981480007F70D4 +:108D98008003981C800079F48003982480007DC8A3 +:108DA8008003982C80008494800398348000633476 +:108DB800800398408000834C80039848800084009A +:108DC80080039850800082E4800398588000821CB9 +:108DD800800398608000817C80039868800080D43C +:108DE800800398748000791080039880D4211897A4 +:108DF800F01F000BF01F000BF01F000BF01F000B03 +:108E08006E0CF01F000B48B811893008F0091800E3 +:108E1800C0406E0CF01F0008D82200008000951496 +:108E2800800088D080009504800193A080013BBC1D +:108E3800000016A480004758D421202D3029EE7850 +:108E48000000F1D9D1A23019F1D9D0033007501858 +:108E58000E9B5007337CF01F000F1A9BFE7C3800D6 +:108E6800F01F000D0E9BE06A01A4FE7C3800F01F85 +:108E7800000B0E9BE06A0348FE7C3800F01F0008D8 +:108E88000E9BFE7C3800F01F00072FEDD822000053 +:108E98008000A2308000A8388000A8F08000A926B1 +:108EA8008000A8D4D401333CF01F0009334CF01FD4 +:108EB8000008335CF01F0006333CF01F0006334CFB +:108EC800F01F0004335CF01F0003D8028000A2A842 +:108ED8008000A2E6D421202DF01F0034F01F0034BA +:108EE800F01F0034F01F0034E06C1B00EA1C00B7D0 +:108EF800F01F00324B28201D4B2C1AD8F01F0032CF +:108F080030CB301CF01F00312FED1897580CC08162 +:108F18004AF8201D4AFC1AD8F01F002B2FED344BBD +:108F2800301CF01F002A8F0CC0814A98201D4A9CD3 +:108F38001AD8F01F00252FED3FF80E9CAEC8F01F81 +:108F48000026300B169CF01F0025F01F0025F01F8F +:108F58000025C0804A48201D49EC1AD8F01F001A85 +:108F68002FEDFACAFFFC0E9B4A0CF01F0021581C7B +:108F7800C0C1401A49FB0E9CF01F001F581CC0516D +:108F88000E9CF01F001ECFDB58CCC04058DCC061DF +:108F9800C03849BCC04849BCC02849BCF01F000AB9 +:108FA800F01F001ACFEB000080008A88800076E06E +:108FB80080008EAC80008E408000AAE88003970C69 +:108FC80080039888800094C48002DC3C800398A8C1 +:108FD80080039DC080008CD4800095C88000C8E4C0 +:108FE8008000895C800398B8800088E880013E880A +:108FF80080008AA0800193BC80008DF4800398E4EF +:109008008003990C8003993080009514D4314A1458 +:1090180058095F081296189716951493A888E06067 +:109028000100E06100FFC2E88920A868E203190096 +:10903800E069FFFFE7D9E828E9F88A02E06901005A +:1090480088E8F2080108682989151039E9F8BA0290 +:10905800EE021608049CF01F0010301CF01F000FD1 +:10906800F01F000F5806C090049CF01F000E301C23 +:10907800F01F000DF01F000D6828101310071005D1 +:109088005C83F1D7C0085803CD01069CD832000094 +:10909800000016AC8000A0408000A19880009ED4FB +:1090A80080009F5C8000A17080009E94D4013009EC +:1090B8005C7AF01F0002D80280009014D40148584E +:1090C80090E9701B120C702AF01F0003D8020000F0 +:1090D800000016AC8002E736D4014888189B118A34 +:1090E8003009F20A1800C07090E9701C120B702A3F +:1090F800F01F0003D8020000000016AC8002E7361B +:10910800D421208D48D8F0E60008FAE70008F0EAF4 +:109118000000FAC8FFF0FAEB0000F0E70008F0EBF7 +:109128000000E06CF980EA1C0337F01F0005300CE2 +:109138002FCD2FCDD82200008003996C8000A1C0CC +:10914800D401FAC9FFFCF01F0002D80280031C1CDE +:10915800D401F01F0002D8028002EE88D401F01F6B +:109168000002D8028002ECACD401F01F0002D80241 +:109178008002F0ECD401F01F0002D8028002E71050 +:10918800D401F01F0002D8028002EE2CD401F01F97 +:109198000002D8028002ED84D401F01F0002D80238 +:1091A8008002ECC8D401F01F0002D8028002EE0C45 +:1091B800D401F01F0002D8028002EDD0D401F01FC4 +:1091C8000002D8028002E87ED401F01F0002D80213 +:1091D8008002E8BCD401F01F0002D8028002E73602 +:1091E800D401F01F0002D8028002E28CD401F01FE3 +:1091F8000002D8028002E8D0D401F01F0002D80291 +:109208008002E2A4D401580CC0707808B08B7808AA +:109218002FF89908D802F9DBC008F01F0002D8021D +:10922800800078A0D431189616971495580AE08AC9 +:1092380000153008109AC0282FF8EE08070BF40B19 +:109248001800CFB10A38F9B50400EBD8E515EDB927 +:109258000001C0313303C0283203E9D9C001C090EE +:109268003004C1082FF42015069B0C9CF01F000D3C +:109278005805FE99FFF9C0682FF42FF70C9CF01FD2 +:1092880000090F8B580BCF91C0782FF42015069B3F +:109298000C9CF01F00045805FE99FFF9089CD83271 +:1092A8008000920CD431204DFAC4FFCC109368177B +:1092B800189568041698580BC0B13308BADB08999A +:1092C800069ABAC8FACBFFFCF01F001FC3985809CA +:1092D8005F1B58AA5F09F7E90009C0605808C04435 +:1092E8005C383016C0283006EECB003A3009FAC791 +:1092F800FFF00EF9C0B8F00A0D00029912985898BC +:10930800F1DBE9082D080EF800985808CF515806E7 +:10931800C1005803C0B0EDB40001C08132DB0A9C23 +:109328002013F01F000A3016C04832D830060EF855 +:109338000899069A0E9B0A9CF01F00030C0C2FCD6F +:10934800D83200008000922C8000920CD431203D4D +:109358003007500A18951696325432D3330230919A +:109368003730C978E8081800E081008E2FF60D889C +:109378005808E0800093E8081800E0800085E608B7 +:109388001800F9B90100F7B600FFF9B90001C038B3 +:109398002FF6A1B90D88E4081800CFB03008C048EE +:1093A800F80E00182FF60D8AF008002EF4CC0030C5 +:1093B800F4CB0030E20B1800FE98FFF4E00A180026 +:1093C800C0A1109A4008110B50084B98580BF00B8D +:1093D8001700C548364BF60A1800C0A1361B400ACC +:1093E8001ADB1AD93019740B2FCA502AC358370BF5 +:1093F800F60A1800C121361A40091ADAF2CAFFFC27 +:10940800501A308A1ADA720B3009310A0A9CF01F96 +:1094180000292FED1807C3C8378BF60A1800C0417A +:10942800400A361BC078358BF60A1800C091400AEE +:10943800341B1ADB1AD9740B2FCA502ACE6B375B30 +:10944800F60A1800C0B1361B400A1ADB1AD93009CF +:10945800740B2FCA502A30AACDAB363BF60A180037 +:10946800C171109A4008700B2FC8FB6B0008500898 +:10947800FACBFFF83008FB6800090A9CF01F000EC1 +:109488001807C0682FF70D8B0A9CF01F000C2FF6E9 +:109498000D885808FE91FF685805EBF81000F9B9D7 +:1094A8000100F1F91E000E9C2FDDD8328003997C53 +:1094B800800092AC8000922C8000920CD401189B02 +:1094C800FACAFFFC300CF01F0002D8028000935447 +:1094D800D40148A972082FF89308F2F800CC58086C +:1094E800C040F2FC00D45D18FE780D003019918957 +:1094F8007078D402D6030000000001184838F0F94B +:1095080000D0700CB33C5EFC00000118D431495601 +:1095180030020C9730152F46EEC1FF2C0E930E9497 +:109528000D88E4081800C18166086E291039E08B9F +:1095380000146C185808C0306C2C5D180D98EA0897 +:109548001800E9F80000EFF90001F3D8E008EFF897 +:109558000A02EDF51E002EC62EC70236CE21D832DD +:1095680000000118D431300E189830A5494C1C96CB +:109578002FCCFCC3FFFF1897F9340008EC0418003F +:10958800C071FDD3C0082ECCEA0E1800CF311C9C48 +:1095980048B530030A96FC0E002EEAF500D0F00517 +:1095A8000D048F040D08EF630008EC0E0026080870 +:1095B800EF6B00098F188D498D3AD83200000118D9 +:1095C800D421300A16971896328B495CF01F001583 +:1095D800300AFE7C0D00149BF01F00134935FE7CF9 +:1095E8000D00EAFB00D0F60B1073A19BF01F0010D2 +:1095F800FE7C0D00F01F000FFE7C0D00F01F000E1A +:10960800EAC9FF2CEB4600CCEB4700D430182F45B5 +:10961800AA882EC51235CFD1D8220000800094D850 +:109628008000A3A08000A594000001188000A580F8 +:109638008000A57A8000A562D401306AF01F00027C +:109648005F0CD8028002E710D401F93A0020F738FD +:109658000020F4081800C020D80AF01F00035F0C8F +:10966800D80200008002E710D42119D919881AD924 +:1096780019C91AD919B91AD919A91AD91999486732 +:109688001AD9486A1AD8312B0E9CF01F00050E9C77 +:109698002FADD822000016E0800399848002EC40A8 +:1096A800D4214058F5D8C008F00916181ADAF5D8A8 +:1096B800C108F1D8C2081ADA48671AD8486A1AD90C +:1096C800310B0E9CF01F00050E9C2FCDD8220000F8 +:1096D800000016F4800399A48002EC40D421488746 +:1096E8001896321A300B0E9CF01F00060C9BED3AB0 +:1096F80000200E9CF01F00040E9CD822000016BC0F +:109708008002E8BC8002E736D431300318971696F9 +:109718001491129218950694C1D805002FF4009C54 +:10972800F01F0012F80300030C33E0880009201D25 +:1097380048FC1AD6F01F000F2FEDC108201DEE05BA +:10974800010B1AD00A9C0C0B48BAF01F000C2FED25 +:1097580018050234CE350E35C021D83A30080AF83B +:10976800EA07010CD83200008002EDD0800399B4DA +:10977800800094C4800399CC8002EC40D4211897CF +:109788002DFCF01F001B201D1ADC49ACF01F001A2D +:109798000E9CF01F001A500C499CF01F00176EC851 +:1097A800498C5008F01F00146EF82FED5818C0416E +:1097B800495CF01F0011EF3800383049F2081800F2 +:1097C800C0E03059F2081800C0603029F2081800CB +:1097D800C091C03848DCC04848DCC02848DCF01FCD +:1097E800000648DCF01F0004D822000080009670B4 +:1097F800800399CC800094C4800096E4800399D0BB +:10980800800399D8800399E8800399F480039A0823 +:1098180080039A1C800384D4D421202DFACCFFFC29 +:10982800F01F000C401870185808C04148ACF01FD1 +:10983800000B3007C0887008F007032CF01F0008E1 +:109848002FF75C57401870191237CF632FEDD822C5 +:1098580080018F0480039A40800094C4800097841C +:10986800D431202D300818921696BAE8169CF01FAD +:10987800001DEDBC0000C04149BCF01F001C3007B2 +:109888002FF649B30E94FAC5FFFCC208660BF6081A +:109898000709E2190044C210E04700405F9C0D8AA6 +:1098A800F60A0709E21900445F09F9E91009E8090D +:1098B8001800C131BADABAC8310A300B0A9C2FE64F +:1098C800F01F000CE4070B0C2FF7ED38FFFF5808CA +:1098D800CDE10E9C5C5CC028300C2FEDD832000026 +:1098E8008002EDD080039A50800094C40000049C4C +:1098F8008002F0ECD421204D1A981AD8FAC8FFF843 +:109908001AD8FAC8FFF01AD8FAC8FFE818971AD870 +:10991800169C49BBF01F001B2FCD584CC221403864 +:10992800E04800FFE08B001E402B580BC1A5E04B20 +:1099380000FFE089001740195809C135E04900FFC8 +:10994800E0890010400A580AC0C5E04A00FFE089D3 +:109958000009B16BF7E811881448F1E91088C028AC +:109968003008F0091618AEB8AE890E9CF3D8C208B4 +:10997800F1D8C108AE99AEA82FCDD82280039A603D +:109988008002EBF4486870085808F9BC00FFF9B980 +:109998000101F1F91E10F9BC01015EFC0000170479 +:1099A800D4214988169770085808C021DC2A580C19 +:1099B800C080189B321AF0CCFFEFF01F0013C0389C +:1099C800F16C003148F85807C080700C0E9B306A63 +:1099D8002CECF01F000DC088700C306A2CECE06B8A +:1099E80000FFF01F000A48787008F139003130088C +:1099F800F0091800C021DA2AF01F0005DA2A000051 +:109A0800000017048002E7368002E8BC80019EF857 +:109A1800D4314A241896169714951292680358035D +:109A2800C3B1338B301CF01F001E890C189BC0B1CA +:109A380049C89088EDB80003C2F1201D49A849BC67 +:109A48001AD8C10849ACF01F001B49691891581C65 +:109A5800C0E09288EDB80003C1F1201D4928496C87 +:109A68001AD8F01F00163FFC2FEDD8326808913243 +:109A7800F16300109106911791259288EDB80003C3 +:109A8800C020D8324888201D48DC1AD8F01F000BA7 +:109A9800029C2FEDD832DC3A000017048002DC3C2F +:109AA800000016A280039A8080039AE080009AC87A +:109AB80080018F2480039AF8800094C480039B203F +:109AC800D431202D1697581CC290C083582CC670CC +:109AD8004A78583CE08101A8C998F01F00264A48F6 +:109AE80018969088EDB80003C0A1F01F00234A38EB +:109AF8001ADC4A3C1AD8F01F00232FED333CF01F24 +:109B08000022334CF01F00216E185808E08001979E +:109B18006E3B0C9C5D18E08F019249589088EDB817 +:109B28000003C08149A8201D49AC1AD8F01F0015B0 +:109B38002FED334CF01F0014333CF01F0014EF39A5 +:109B480000103008F0091800E0800179F01F0012B9 +:109B5800581CE080017448689088EDB80003E081E3 +:109B6800016E201D48A848DC1AD8C659000016A264 +:109B78008001997C800096E480039AC880039B3812 +:109B8800800094C48000A3008000A2E680039CE8C3 +:109B980080039B5480019EF880039B784B589088E3 +:109BA800EDB80003C0814B48201D4B4C1AD8F01F5C +:109BB80000342FED4AF89088EDB80003C0814B18A7 +:109BC800201D4B1C1AD8F01F002E2FED333CF01F20 +:109BD800002F6E285808C0306E3C5D18EF39001011 +:109BE8003008F0091800E080012AF01F0029581CED +:109BF800E080012549F89088EDB80003E081011F55 +:109C0800201D4A084A3C1AD8C1699088EDB800035B +:109C1800C0814A18201D4A1C1AD8F01F00192FEDC0 +:109C28006E085808C0306E3C5D18EF3900103008D7 +:109C3800F0091800E0800103EF390031F00918003D +:109C4800E08000FDF01F00161894FACCFFFCF01F0E +:109C58000015581CC591401870185808C550300593 +:109C6800EEC1FFEFEEC3FFCE0A960A92C488000049 +:109C7800000016A280039ABC80039BAC800094C4A9 +:109C880080039A9880039BC48000A2E680019EF816 +:109C980080039BE880039AA880039C1C8001997C20 +:109CA80080018F04EF390031E4091800C080700882 +:109CB800029CF005032BF01F0041C1F0306A4C0BE9 +:109CC800069CF01F0040C0A040187008069CF005D4 +:109CD800032B2DFBF01F003CC1005806C0A0401804 +:109CE8006CC97008F005032870C81039E0890006AF +:109CF80040187008F00503262FF55C5540187019B8 +:109D08001235CD13C02830060C34C0415804E08108 +:109D1800009658065F1858045F19F1E90009C20057 +:109D2800089B0C9CF01F0025C1D068C8FE58FFC0D6 +:109D3800E08400856CCAF0C9FFF71439E084007F1D +:109D48004A299289EDB90003C0D1201D1ADA1AD820 +:109D580049F84A0C1AD8F01F00202FCDC0385808EF +:109D6800C0C0202DECCBFFDF306A1A9CF01F001B0F +:109D7800F01F001B2FEDC17849489088EDB800030B +:109D8800C0C1EECCFFEFF01F001749181ADC496C70 +:109D98001AD8F01F00112FEDEECCFFEFEF3B00318A +:109DA800F01F0012588CC060589CC2F0581CC21199 +:109DB800C458F01F000FC4288000965080039C38B8 +:109DC8008002EDE680009640000016A280039A8C7F +:109DD80080039C40800094C48002E73680019DDCAB +:109DE800800096E480039C6880019EA0800199CC45 +:109DF80049489088EDB80003C0814938201D493C86 +:109E08001AD8F01F00132FEDF01F0012581CC16064 +:109E180048C89088EDB80003C111201D48A848EC37 +:109E28001AD8C0989088EDB80003C081201D48B8A2 +:109E380048BC1AD8F01F00062FED2FEDD8320000CD +:109E4800000016A280039A8C80039C94800094C41E +:109E580080019EF880039CB080039ABC80039CCC50 +:109E6800D4012FEC580BC080F7DCC008FE7C28001A +:109E7800F01F0005D802F7DCC008FE7C2800F01FA0 +:109E88000003D8028000A6C68000A716D42148C7C0 +:109E9800C098300BFE7C2800F01F000A6E082FF8CF +:109EA8008F086E0CF7DCC008CF51F9DCC288F01FB0 +:109EB800000630194858B089D82200000000170859 +:109EC8008000A7FA80009E680000170CD40148683B +:109ED800300B700CF9DCC288F01F000430094848C8 +:109EE800B089D8020000170880009E680000170C8F +:109EF800D421202D4948301B700CF9DCC288F01F92 +:109F08000013E06B00D7FE7C2800F01F0011FAC791 +:109F1800FFFAE06B00FFFE7C2800F01F000D0E9B8F +:109F2800FE7C2800F01F000B9AB8EDB80007CF217F +:109F38004858300B700CF9DCC288F01F00042FED74 +:109F4800D82200000000170880009E688000A7FA49 +:109F58008000A816D421202D49B8A96C910C49B8C5 +:109F680011893008F0091800C030F01F00193009B5 +:109F780049684957B0896E0C301BF9DCC288F01F5C +:109F88000015E06B0082FE7C2800F01F00136E08AD +:109F9800F3D8C008FAC7FFF8F7D8C10CFE7C280030 +:109FA800F3EB109B0EDBB18BF01F000B0FABFE7CAD +:109FB8002800F01F00090FBBFE7C2800F01F0006D8 +:109FC8002FEDDA2A000017080000170C80009EF811 +:109FD80080009E688000A7FAD42149381897118913 +:109FE8003008F0091800C0604908700CA98CF01FEF +:109FF8000010EEC6FF000F3BFE7C2800F01F000D8E +:10A008000C37CFA14898300B700CF8CCFF00910C9E +:10A01800F9DCC288F01F000830194838301CB089B4 +:10A02800D82200000000170C0000170880009F5C71 +:10A038008000A7FA80009E68D421202D4A78A96C58 +:10A04800910C4A7811893008F0091800C030F01FC7 +:10A05800002530094A284A17B0896E0C301BF9DCF4 +:10A06800C288F01F0021E06B00D2FE7C2800F01FA0 +:10A07800001F6E08F3D8C008FAC7FFF8F7D8C10C5C +:10A08800FE7C2800F3EB109B0EDBB18BF01F001752 +:10A098000FABFE7C2800F01F00150FBBFE7C2800CC +:10A0A800F01F0012E06B00FFFE7C2800F01F000F7D +:10A0B800E06B00FFFE7C2800F01F000CE06B00FF47 +:10A0C800FE7C2800F01F0009E06B00FFFE7C2800E2 +:10A0D800F01F00062FEDDA2A000017080000170C01 +:10A0E80080009EF880009E688000A7FAD421202D69 +:10A0F800498818973009118AF20A1800C070B08987 +:10A108004958700CA98CF01F0015FAC5FFFAEEC665 +:10A11800FF00E06B00FFFE7C2800F01F00110A9B87 +:10A12800FE7C2800F01F000F9A380EC80C37CF218C +:10A138004898300B700CF8CCFF00910CF9DCC28801 +:10A14800F01F000930194838301CB0892FEDD8228B +:10A158000000170C000017088000A0408000A7FA34 +:10A168008000A81680009E68D4211897C088F01F28 +:10A178000006486CF01F000620175C87483C58070B +:10A18800CF71DA2A800090C40000171080009FE089 +:10A19800D4211897C088F01F0006486CF01F0006ED +:10A1A80020175C87483C5807CF71DA2A8000A0F452 +:10A1B80000001710800090E0D4213027FAC4FFEC8B +:10A1C8001896A887C0C80C9A089BFE7C2800F01F28 +:10A1D8000009C020D82A09882FF8A8880988EE081D +:10A1E8001800FE98FFF230094838301CB089D82290 +:10A1F8008000A73C0000170CE1B80000EE18000131 +:10A20800F1D8C201C020D3033019F20B094B994B86 +:10A21800783958085E0CD5035EFCFE681400700996 +:10A22800F3DCD0C191095EFCF8081605A968E0289E +:10A23800F000581BC0D0C063582BC0F0583BC12059 +:10A248005EFF3019F20C0949916991A9C108F60C11 +:10A25800094B915B91ABC0B83019F20C094991696F +:10A26800C0583019F20C0949915991993019F20CDA +:10A27800094C912C5EFDD703D4213007189616940B +:10A288000E95C0880D9B0D8C2FF72FE6F01F00044C +:10A2980018450837CF830A9CD82200008000A230D6 +:10A2A8003018F00C0948A59CA96CE02CF000F9487E +:10A2B800004899185EFC3018F00C0948A59CA96C58 +:10A2C800E02CF000F94800745EFC3018F00C0948E6 +:10A2D800A59CA96CE02CF000F94800785EFC3018C9 +:10A2E800F00C0948A59CA96CE02CF000F948005432 +:10A2F800F948004499185EFC3018F00C0948A59CF0 +:10A30800A96CE02CF000F9480058F9480044991865 +:10A318005EFC301AF8081605F40C0949A968E0280B +:10A32800F000F14900C4143BC080C043582BC0F171 +:10A33800C098F14900A8C038F14900A4F14900B813 +:10A34800C078F14900A8F14900B4C0285EFAF14983 +:10A3580000945EFD3018F00C0948A59CA96CE02C0F +:10A36800F000F94800985EFCF8081605A968E0288E +:10A37800F000F0F800D0F00C0A4CF9DCC0015EFCEB +:10A388003018F00C0948A59CA96CE02CF000F9489D +:10A3980000D85EFCC008D703F3DBC0054898A59B2E +:10A3A800F00B00387018F009092C4878F5DAC0026B +:10A3B800F00A0329FE780800F00B09295EFC00006A +:10A3C80080039CFC8003773CD42148F8E3B8000163 +:10A3D80048E848F9700E48FC3008FE7B0800C0E8E1 +:10A3E8007216EC0A00262FFA8D0C0E3ACFA3F60847 +:10A3F800092E2F892FF85948C0407207300ACF6BB1 +:10A40800D8220000800376008003773C80039CFC00 +:10A418008000A39CE0680083FE790800F00C010C22 +:10A42800F20C0328F0CAFFC0F20A032C580C5E0C89 +:10A438004869F80C1200F2080038F80C111F70185F +:10A44800F00C032C5EFC000080039CFC78C83019DB +:10A45800F1D9D10399C85EFC78C83019F1D9D00177 +:10A46800F1DBD20399C85EFCD421FAC4FFEC68176B +:10A47800680EEFD7C003FDDEC0013004E9D7D00372 +:10A48800E9DED0E1E9D7D103E9DED1E1E9DAD203A7 +:10A49800E9DBD2E1E9D8D303E9D9D3E199147958B2 +:10A4A800EDB80005CFD1D822D4213007405E2F8BDC +:10A4B800EFD8D021EFD9D104EFDAD204EFDED306FA +:10A4C800F80B0927D822F5E910192F8BF3E8102883 +:10A4D800F80B0329F3D8D043F80B09295EFC2F8B1E +:10A4E800F80B0328A1A8F80B09285EFC7958EDB8E9 +:10A4F8000000CFD15EFC7808F1DBD00299085EFC41 +:10A50800EC5BBB9FE08B0004304BC138E068C6BFF2 +:10A51800EA18002D103BE08B0004305BC0A8E0680F +:10A528001200EA18007A103BF9BB0306F9BB0207D0 +:10A5380078A8F1DBD00399A878A8F1DAD10399A813 +:10A548007808A3A899087958EDB80007CFD17808FA +:10A558003019F1D9D00299085EFC7808EDB80004EA +:10A56800CFD07808A1A899087808EDB80004CFD012 +:10A578005EFC301899485EFC7808EDB80004CFD02E +:10A58800992B7808EDB80004CFD05EFCD42130F8C0 +:10A5980014951697F00A18005FBA30181896F00B41 +:10A5A80018005FB9F5E91009C020D82AF00B180087 +:10A5B800C0A1FE7C0C00F01F0015300BFE7C0C00C7 +:10A5C800F01F00136C08EDB80004CFD0A377B1A733 +:10A5D800EFE510878D076C08EDB80004CFD06C0844 +:10A5E800E2180010CFD18D186C08EDB80004CFD058 +:10A5F8006C08EDB80004CFD03FF88D286C08EDB892 +:10A608000004CFD0DA2A00008000A4548000A4609F +:10A618003038F00A18005FB93078F00B18005F88FE +:10A62800F3E81008C1913108F00B1800E08B001511 +:10A63800E06800809908208BF4081601F5DAC0015B +:10A64800F1EB104B580AF9BA0100F9BA0002F7EA1F +:10A65800100A99CA5EFD302C5EFCD4013019189896 +:10A66800F73B000DF20B1800E0880004302CD802EC +:10A67800300AE06900809909301E7019149CF3DED5 +:10A68800D001F3DBD081F3DAD0E130FAF3DAD20487 +:10A698009119D802D4013018F00B18005FBEF00AE7 +:10A6A80018005FB81C48C030302CD8027818F1DB8D +:10A6B800D021F1DAD041F1D9D3089918D80A7819FC +:10A6C8001898EA19000F9919781CE21C0004C100B7 +:10A6D80030E9F20B1800E08B001A7019B16B300CDE +:10A6E800EA1BFFF0E81BFFFF126B911B5EFC303981 +:10A6F800F20B1800E08B000B70192F0B301AF40BBB +:10A70800094B5CDB126B911B5EFC302C5EFCE06835 +:10A718002710C0585808C0215EFF20187849EDB9A5 +:10A728000009CF917818EA18000F9918FC18010051 +:10A7380099085EFDD4313036F737000CEC07180065 +:10A74800E08B0050F733000B301EFC031800E08B41 +:10A758000049F73800083079F2081800E08800420C +:10A768003109F2081800E08B003D7619F205160150 +:10A77800F4050005EA090D04E8C90001E04900FEF6 +:10A78800E08B0030F0CA00080E923008EC1200018D +:10A79800A197F1D7D001F1D2D021F1D3D061F1DA6C +:10A7A800D084F73A0009F1D4D1081789F1DAD20830 +:10A7B800F73A000AF1DAD308FC091800C0C0C093C0 +:10A7C800302AF4091800C090EC091800C0A1C0781C +:10A7D80099C8C06899D8C04899E8C02899F8D83A63 +:10A7E800302CD832301899085EFC784CF9DCC0213E +:10A7F8005EFCE0682710C0585808C0215EFF20188A +:10A808007849EDB90001CF915C7B993B5EFDE0682A +:10A818002710C0585808C0215EFF20187849E2194F +:10A828000201E0490201CF717828300CB6085EFCBD +:10A8380076095829E08800035EFE7618A769109B00 +:10A84800E61BC000120CF3D8C003AFB91649109B21 +:10A85800E61B30001649109BE61B0C001649109B9E +:10A86800E61B03001649109BE61B00C01649109B07 +:10A87800E61B00301649109BE61B000C1649109B7E +:10A88800E61B00031649109BE21B60001649109B4B +:10A89800E21B10001649109BE21B0C001649109B86 +:10A8A800E21B03002FCC1649109BE21B0080109A74 +:10A8B8001649E21A0008109BE2180030E21B00401B +:10A8C8001649F3E81008144899085EFDF6081506BD +:10A8D800582BF9BC0BFFF9D8E80CF9B80805F9F8BA +:10A8E8008A00F9BC08005EFC582BE08800035EFE75 +:10A8F800F6081506F80800082FC87008EDB8000F0C +:10A90800C0C1A76BF3DAC010160C2ECC7808E0187B +:10A918000000F3E810089908F9DAC0105EFC582B1B +:10A92800E08800035EFEA76B160C7818EDB8000FE0 +:10A93800C0A12E4CF3DAC0107808E0180000F3E844 +:10A9480010089908F9DAC0105EFCD401F60E150457 +:10A958001C3AF9BE0210F9BE0308FC0B024BF608BC +:10A968001601F00A003AF40B0D0AF4091603F2C8AE +:10A978000001E048FFFEE0880003DA0A7818E86B77 +:10A988000000E418FFF7E018FECF590EF60E171076 +:10A99800F9BE0000FDE810089918F5DAC003F3EADB +:10A9A80011099989D80A7858EDB80001C030302CBF +:10A9B8005EFCF7DBC009997B5EFD7858E21800E081 +:10A9C800C030304C5EFC7859EDB90000F9BC010389 +:10A9D800F9F90006F00C1700E06A01FFF3DAE02845 +:10A9E800F7F80A005EFCE1B80000EE180001F1D8A3 +:10A9F800C201C020D3033FF9993978595808C020BB +:10AA0800D50330089918999899A8EA68610C9908AB +:10AA18005EFCD703D421201D500A16961897F01F04 +:10AA2800002F400A5806C5500DC83049F2081800D2 +:10AA3800E08800503095EA081800E08B004B0DD9EB +:10AA48003078F0091800E08B00458C39E068010186 +:10AA5800F0091900E08B003EED3900083038F009A4 +:10AA68001800E08B00376C0B0E9CF01F001D581C63 +:10AA7800C3000DC8EA081800C0416E18B1B8C05824 +:10AA880020586E19F3E810688F186E19ED3A00080F +:10AA98000DD8A978F1EA10E812488F18302A8C38B6 +:10AAA800F3D8C010F4081900E08800086E18ADB893 +:10AAB8008F1820298FA9C0586E18F1E910C98F196D +:10AAC8006E18E018FFF08F18300C35088F08C02872 +:10AAD800301C2FFDD82200008000A9EE8000A9526A +:10AAE8004828910C5EFC0000000018E8D431189842 +:10AAF800783E580EC620F90600105806C5E0300901 +:10AB08003FF3129A3344C1780E91E8071800C0A1A8 +:10AB1800F2CAFFFEF4C9FFFF5C7A5C89FC0A070AE7 +:10AB2800C0A8F6071800C4A05C75FC050709E4096D +:10AB380000095C89EC091900C0F2F2C5FFFFF9D9D8 +:10AB4800C0105C85FC0C000CEAC2FFFF19870E914F +:10AB5800E6071800CDA1580AC3003019F20A1800F8 +:10AB6800C0617028E06900802948C0C87028302971 +:10AB7800F20A1800C0412D483409C0482D48E06940 +:10AB880000C0300C3FF7C0D8F60A1800C1705C7ED0 +:10AB9800F00E070CEC0C000C5C8CF20C1900C0D207 +:10ABA800F8CEFFFF5C7C5C8EF00C000CFCC6FFFF4F +:10ABB800198AEE0A1800CE91300CD832D401F9085F +:10ABC800001CF3D8C010F2CEFFFE140EE04E004475 +:10ABD800E088000F48F8201D1AD8E06804E31AD866 +:10ABE80048D848EC1AD8F01F000E2FCDC008786E50 +:10ABF800FC090009F36B00F02FF8786BF3D8C0104C +:10AC0800F6090009F36A00F02FF8F958001CD80279 +:10AC180080039DC480039E0880039D9C800094C48B +:10AC2800D4013439F908001CF2081900E088000F33 +:10AC380048C8201D1AD8E06804EE1AD848A848BCAD +:10AC48001AD8F01F000B2FCDC008786AF3D8C010AF +:10AC5800F4090009F36B00F02FF8F958001CD8022A +:10AC680080039DC480039E5080039D9C800094C4F3 +:10AC7800D401580CC0E14B18201D1AD8E068062BE7 +:10AC88001AD84AF84AFC1AD8F01F002F2FCDC0084E +:10AC9800786A580AC0E14A98201D1AD8E068062C3C +:10ACA8001AD84AA84A7C1AD8F01F00272FCDC00806 +:10ACB800F908001C3439F2081900E088000F49F837 +:10ACC800201D1AD8E068062D1AD84A1849DC1AD867 +:10ACD800F01F001D2FCDC008F7D8C010160A3FFB83 +:10ACE800F56B00F02FF8129B5C88300AF958001CAD +:10ACF800C1584928201D1AD8E06806321AD8494890 +:10AD0800490C1AD8F01F00102FCDC008F1DEB01082 +:10AD1800786EFC090009F36A00F0F0CEFFFFF3D863 +:10AD2800C010F6081900FE98FFF3F958001CF3D973 +:10AD3800C002CE01D802000080039DC480039E8C0F +:10AD480080039D9C800094C480039EB080039EDC99 +:10AD5800D401F908001CF3D8C010F2CAFFFEE04A7B +:10AD68000044E088000F4918201D1AD8E06804F54F +:10AD78001AD848F848FC1AD8F01F000F2FCDC00881 +:10AD8800786AF4090009F5DBC108F36A00F02FF8C6 +:10AD9800786AF3D8C010F4090009F36B00F02FF8B3 +:10ADA800F958001CD802000080039DC480039F1C32 +:10ADB80080039D9C800094C4D401F908001CF3D83A +:10ADC800C010F2CAFFFCE04A0044E088000F49B80E +:10ADD800201D1AD8E06804FD1AD84998499C1AD849 +:10ADE800F01F00192FCDC008786AF4090009F60A87 +:10ADF8001618F36A00F0786A2FF8F3D8C010F4092F +:10AE08000009F5DBC208F36A00F0786A2FF8F3D876 +:10AE1800C010F4090009F5DBC108F36A00F02FF847 +:10AE2800786AF3D8C010F4090009F36B00F02FF822 +:10AE3800F958001CD802000080039DC480039F605D +:10AE480080039D9C800094C4D421F9380035A3D890 +:10AE5800F9680035189678A75807C2406E1C580C38 +:10AE6800C050F01F001130088F186E285808C09184 +:10AE78006E355805C061EF090010EA091900C0E0F5 +:10AE880048A8201D1AD8E06804C51AD84888489CE4 +:10AE98001AD8F01F00092FCDC0080E9CF01F00071C +:10AEA8008DA5D8228001122880039DC480039FA00D +:10AEB80080039D9C800094C48002E28CD421189762 +:10AEC800782C580CC050F01F000830088F286E3CB2 +:10AED800580CC070F01F00043008EF5800108F386D +:10AEE800D82200008002E28CD4211896580CC0E1C8 +:10AEF8004AE8201D1AD8E06805D11AD84AC84ADCA1 +:10AF08001AD8F01F002D2FCDC00878A75807C0E128 +:10AF18004A68201D1AD8E06805D31AD84A784A5CCE +:10AF28001AD8F01F00252FCDC0086E585808C0E069 +:10AF380049E8201D1AD8E06805D41AD84A0849DC1F +:10AF48001AD8F01F001D2FCDC0086E655805C0E047 +:10AF58004968201D1AD8E06805D51AD84998495C6F +:10AF68001AD8F01F00152FCDC0080A9AE06B0134DB +:10AF78000A9CF01F00158F5CC041E06C00FFD822CE +:10AF88009859E0680133F0091900E08B00214878EE +:10AF9800201D1AD8E06805DD1AD848C8485C1AD8B8 +:10AFA800F01F00052FCDC00880039DC480039FB407 +:10AFB80080039D9C800094C480039FD880039FFCDD +:10AFC8008003A0288000D3188003A054EF38001312 +:10AFD800EA081800C0514D3870092FF991097818FE +:10AFE800301B8F684CF9720A8F0AB09BB08B306B9C +:10AFF800B0ABF40B1618B0CBF7DAC2083009B0FAC8 +:10B00800B0DBF5DAC108305BB0B9F1690008F16965 +:10B018000009F169000AF169000BF169000CF16996 +:10B02800000DF169000EF169000FB0EAEF3A001265 +:10B03800F60A18005F0C30ABF60A18005F0BF9EB44 +:10B04800100BF20B1800C0513049F20A1800C0D199 +:10B058000DC9F169000C0DD9F169000D0DE9F1690F +:10B06800000E0DF9F169000F3009ECCAFFD1F16942 +:10B078000010F1690011F1690012F1690013F1691A +:10B088000014F1690015F1690016F1690017F169FA +:10B098000018F1690019F169001AF169001BF0CB79 +:10B0A800FFE4ED35002E3106EA091900F9BC02006B +:10B0B800F5FC380016CC2FF92FFA5C89EC09190039 +:10B0C800CF413009F0CAFFD4129C340B14CC2FF9AD +:10B0D8005C89F6091900CFB13009F0CAFF94129CB7 +:10B0E800E06B008014CC2FF95C89F6091900CFB108 +:10B0F8003639F16900EFF16900EC3829F16900EDA2 +:10B108003539F16900EE344A3009F0C8FF10EF59BB +:10B11800001C10C92FF95C89F4091900CFB1D82A8D +:10B12800000001F0D421580CC0E14A28201D1AD88B +:10B13800E06806141AD84A084A0C1AD8F01F0020EA +:10B148002FCDC00878A75807C0E149A8201D1AD8F4 +:10B15800E06806161AD849B8498C1AD8F01F0018A2 +:10B168002FCDC0086E5C580CC0E14928201D1AD8A4 +:10B17800E06806171AD84948490C1AD8F01F001079 +:10B188002FCDC0086E685808C0E148A8201D1AD8FD +:10B19800E06806181AD848D8488C1AD8F01F000852 +:10B1A8002FCDC008F01F000A30088F688F58D822AA +:10B1B80080039DC48003A09880039D9C800094C454 +:10B1C8008003A0BC8003A0E08003A10C8000D13CD8 +:10B1D800D42130D878A7EF390012F0091800EFF819 +:10B1E8001E12F9B80100EFF81E13300818968FE800 +:10B1F8008F988FB88FA88FD88FC8EF48004CEF482A +:10B208000048EF480044F01F0029EBDCC008C201E9 +:10B21800301A335B0E9CF01F0026307B0E9CF01F0B +:10B2280000250E9CF01F00246E5CEF0B001CF6CB73 +:10B23800FF105C7BF01F00210C983439EECAFFDC4C +:10B248006E5B6E1CF01F001E0C9CF01F001EEF387A +:10B2580000132FF85C58EF6800133099F2081800B3 +:10B26800E0880005E0692710C058E06903E8F009A4 +:10B2780002495C79E06801F4F2C9FE0DF2080C0895 +:10B288000C9CEF58001EF01F00100C9C48FBF01F90 +:10B2980000100C9C48DBF01F000F0C9C48BBF01FF3 +:10B2A800000E0A9CD82200008000AEF08000ABC4DB +:10B2B8008000AC288000AC788000D2108001139008 +:10B2C8008000B12C8000CABC8003B4098000CBC8C0 +:10B2D8008000CA748000CA92D421305878A7EF3908 +:10B2E8000012F0091800EFF81E12F9B80100EFF883 +:10B2F8001E131896F01F0026EBDCC008C2A1301AF6 +:10B30800335B0E9CF01F0023303B0E9CF01F002285 +:10B31800302A339B0E9CF01F001FED1B002C0E9C47 +:10B32800F01F001E0E9CF01F001E6E5CEF0B001C31 +:10B33800F6CBFF105C7BF01F001B0C983439EECA6B +:10B34800FFDC6E5B6E1CF01F00180C9CF01F0017D2 +:10B35800EF3800132FF85C58EF6800133099F208A3 +:10B368001800E0880005E0694E20C058E06907D061 +:10B37800F00902495C790A9CF2C9FE0DE06801F403 +:10B38800F2080C08EF58001ED82200008000AEF02A +:10B398008000ABC48000AC288000AD588000AC7839 +:10B3A8008000D210800113908000B12CD42118960F +:10B3B800580CC0E14AF8201D1AD8E06802F51AD8DE +:10B3C8004AD84AEC1AD8F01F002E2FCDC00878A70B +:10B3D8005807C4E0EF3900123088F0091800C4811A +:10B3E80017B8178A1799B169F3EA118917AAF3EA06 +:10B3F8001089F1E910096EA81039C3A130C8EF68A7 +:10B4080000123008EF680013F01F001E5C5CC28158 +:10B41800301A335B0E9CF01F001C304B0E9CF01F43 +:10B42800001B304A332B0E9CF01F00176EAB0E9C8E +:10B43800F01F00170E9CF01F00176E5CEF0B001C2E +:10B44800F6CBFF105C7BF01F00140C983439493A96 +:10B458006E5B6E1CF01F00120C9CF01F0012EF3880 +:10B4680000132FF8EF6800133148EF58001ED82258 +:10B4780080039DC48003A13880039D9C800094C4F0 +:10B488008000AEF08000ABC48000AC288000ADC066 +:10B498008000AC788000D2108003B405800113903E +:10B4A8008000B12CD421303878A7EF390012F00988 +:10B4B8001800EFF81E12F9B80100EFF81E131896DD +:10B4C800F01F002AEBDCC008C321301A335B0E9C46 +:10B4D800F01F0027303B0E9CF01F0026302A339BBC +:10B4E8000E9CF01F0023E06B02400E9CF01F002210 +:10B4F800304A332B0E9CF01F001E6EAB0E9CF01FC3 +:10B50800001F0E9CF01F001E6E5CEF0B001CF6CB9C +:10B51800FF105C7BF01F001B0C98343949AA6E5B46 +:10B528006E1CF01F001A0C9CF01F0019EF38001356 +:10B538002FF85C58EF6800133099F2081800E0887B +:10B548000005E0692710C058E06903E8F0090249DE +:10B558005C790A9CF2C9FE0DE06801F4F2080C0857 +:10B56800EF58001ED82200008000AEF08000ABC467 +:10B578008000AC288000AD588000ADC08000AC7859 +:10B588008000D2108003B405800113908000B12C94 +:10B59800D4214BD811B9118B119A11A8B16AF5EBC6 +:10B5A800118AF5E81088F3E8100878A78FA8EF3912 +:10B5B80000123068F0091800EFF81E12F9B80100FF +:10B5C800EFF81E131896F01F0031EBDCC008C3E13A +:10B5D800301A335B0E9CF01F002E301B0E9CF01FA0 +:10B5E800002D302A339B0E9CF01F0029ED1B002CE8 +:10B5F8000E9CF01F0029304A337B0E9CF01F00245C +:10B60800301B0E9CF01F0023303B0E9CF01F0021C6 +:10B6180031CB0E9CF01F001F306B0E9CF01F001DDD +:10B628000E9CF01F001E6E5CEF0B001CF6CBFF108B +:10B638005C7BF01F001B0C98343949AA6E5B6E1CAA +:10B64800F01F00190C9CF01F0019EF3800132FF899 +:10B658005C58EF6800133059F2081800E0880005BC +:10B66800FE79EA60C058E06903E8F20809495C79A4 +:10B678000A9CF2C9FE0DE06801F4F2080C08EF58C4 +:10B68800001ED8228003B4098000AEF08000ABC44D +:10B698008000AC288000AD588000AC788000D210C3 +:10B6A8008003B405800113908000B12CD421301898 +:10B6B80078A7EF390012F0091800EFF81E12F9B850 +:10B6C8000100EFF81E131896F01F0039EBDCC008D4 +:10B6D800C501301A335B0E9CF01F0036303B0E9CC0 +:10B6E800F01F0035302A339B0E9CF01F0032ED1BF3 +:10B6F800002C0E9CF01F0031304A332B0E9CF01F9B +:10B70800002D6EAB0E9CF01F002E304A336B0E9C42 +:10B71800F01F00286E9B0E9CF01F0029304A337BD7 +:10B728000E9CF01F0024301B0E9CF01F0023303BA2 +:10B738000E9CF01F002131CB0E9CF01F001F306BB8 +:10B748000E9CF01F001D0E9CF01F001E6E5CEF0B80 +:10B75800001CF6CBFF105C7BF01F001B0C983439E3 +:10B7680049AA6E5B6E1CF01F001A0C9CF01F001992 +:10B77800EF3800132FF85C58EF6800133059F208BF +:10B788001800E0880005FE79EA60C058E06903E81F +:10B79800F20809495C790A9CF2C9FE0DE06801F4D7 +:10B7A800F2080C08EF58001ED82200008000AEF006 +:10B7B8008000ABC48000AC288000AD588000ADC0CC +:10B7C8008000AC788000D2108003B405800113900B +:10B7D8008000B12CD421304878A7EF390012F00945 +:10B7E8001800EFF81E12F9B80100EFF81E131896AA +:10B7F800F01F0025EBDCC008C291301A335B0E9CA9 +:10B80800F01F0022303B0E9CF01F0021302A339B92 +:10B818000E9CF01F001EED1B002C0E9CF01F001D3F +:10B828000E9CF01F001D6E5CEF0B001CF6CBFF108A +:10B838005C7BF01F001A0C983439499A6E5B6E1CB9 +:10B84800F01F00180C9CF01F0018EF3800132FF899 +:10B858005C58EF6800133099F2081800E08800057A +:10B86800E0692710C058E06903E8F00902495C79EB +:10B878000A9CF2C9FE0DE06801F4F2080C08EF58C2 +:10B88800001ED8228000AEF08000ABC48000AC2837 +:10B898008000AD588000AC788000D2108003B405D9 +:10B8A800800113908000B12CD4314A5830167007AB +:10B8B80030A20C9330043055C3E86EA85808C3A0D2 +:10B8C800F1090022F2CA0001F15A0022EC0919001C +:10B8D800C151F1380012E40818005F0AE6081800A0 +:10B8E8005F09F5E91009E8091800C041EA081800DD +:10B8F800C2110E9CF01F0013C1D8F1090020F2CA32 +:10B908000001F15A0020EC091900C141F138001278 +:10B91800E40818005F0AE60818005F09F5E910094D +:10B92800E8091800C041EA081800C0410E9CF01F41 +:10B9380000066E075807CC21D8320000000080CCE2 +:10B948008000B7DC8000B2E0D4211896580CC0E122 +:10B958004C08201D1AD8E068024E1AD84BE84BFC58 +:10B968001AD8F01F003F2FCDC008F9380035A3D8EA +:10B97800F968003578A7F909002CE068023FF0095A +:10B988001900E088008B5807C091350CF01F00356E +:10B998001897E08000838DACC2E86E1C580CC0304C +:10B9A800F01F00316E585808C0E04AA8201D1AD868 +:10B9B800E068026C1AD84AD84A8C1AD8F01F0028B6 +:10B9C8002FCDC0086E285808C0916E385808C0613D +:10B9D800EF090010F0091900C0E049E8201D1AD845 +:10B9E800E068026E1AD84A2849CC1AD8F01F001C01 +:10B9F8002FCDC008350A300B0E9CF01F001EF01F1B +:10BA0800001E8F1C1895C0610E9CF01F001C8DA590 +:10BA1800C178344A49ABF01F001B499B343A6E1C6D +:10BA2800F01F00190C9A499B6E1CF01F00190C9C02 +:10BA3800F01F00185C5CC0700C9CF01F0017E06CD5 +:10BA480000FFD822ED380035A3B8ED680035D822BC +:10BA580080039DC48003A13880039D9C800094C40A +:10BA68008002E2A4800112288003A14880039FA0DD +:10BA78008002E8BC800112008002E28C8003B409D5 +:10BA880080011260800113208000BBBC800111F886 +:10BA98008000B5988000AE50E06C00FFD82200000E +:10BAA800D421202D1896580CC0E14BA8201D1AD877 +:10BAB800E06803781AD84B884B8C1AD8F01F0038E6 +:10BAC8002FCDC00878A75807C0E14B28201D1AD8E9 +:10BAD800E068037A1AD84B384B0C1AD8F01F00309C +:10BAE8002FCDC0086F295BF9C1102E2933C8E06A31 +:10BAF800FFFFF2080D081438F40817B0EF580020BB +:10BB08005808F9B80001EFF80C106F395BF9C1104B +:10BB18002E2933C8E06AFFFFF2080D081438F4082C +:10BB280017B0EF5800225808F9B80001EFF80C11C7 +:10BB38006EB850185808C041FC18FF0050186EC85D +:10BB480050085808C0716EA84019F3E80008A1A869 +:10BB58005008EECBFFD80C9CF01F0013FACBFFFC6B +:10BB68000C9CF01F00121A9B0C9CF01F00110C9CDF +:10BB7800F01F0010EF39001230A8F0091800EFF894 +:10BB88001E12F9B80100EFF81E132FEDD82200009D +:10BB980080039DC48003A16080039D9C800094C4A1 +:10BBA8008003A17C8000CBC88000CA928000CA7440 +:10BBB8008000CB88D43178A71896149574186E290C +:10BBC8005809C0916E395809C061EF0B0010F20B8B +:10BBD8001900C0E04BE8201D1AD8E06805651AD89E +:10BBE8004BC84BDC1AD8F01F003D2FCDC0088A5B2C +:10BBF80032BAF40B1900E088020F118B302AF40BCB +:10BC08001800E0810209F93C002EECCBFFD1F0CA04 +:10BC1800FFE4C0982FF917345C59153EFC0418004E +:10BC2800E08101FAF8091800CF6311FA11CB11D994 +:10BC380011E8B169F3EB1189F3E810896E08F5E9A9 +:10BC480010091039E08101E80E9CF01F00258A4C8C +:10BC5800E06800F0F00C1900E088000FF8CC00F064 +:10BC6800EF5C00105C7CF01F001F8F3CC051EF5C44 +:10BC78000010E08F01D1E06C00F0F01F001A8F2C4B +:10BC88001894C0C16E3C580CE08001C6F01F001625 +:10BC9800EF5400108F34E08F01BF189B3009E06A21 +:10BCA80000F00A9CF01F0011E06800F0F00C190089 +:10BCB800C2004878201D1AD8E068052E1AD848C84E +:10BCC800485C1AD8F01F00052FCDC00880039DC41A +:10BCD80080039FA080039D9C800094C48000AEC414 +:10BCE8008002E2A48002E28C8000CEC48003A1948A +:10BCF8006E3B580BE08001B2E06900F0EF1A0010CB +:10BD08000A9CF01F0036EF080010F8081900E080C0 +:10BD180001A54B38201D1AD8E06805351AD84B18EC +:10BD28004B1C1AD8F01F00312FCDC00819A8305A63 +:10BD3800F4081800E0810100EF3800123019F20809 +:10BD48001800E08100EC30086CA4333B89D889B82E +:10BD580089C8089CF01F0026C0F0F8C8FFFC19AB82 +:10BD6800119919BA1188B16AF5EB118AF5E81088AA +:10BD78001248E948004433AB089CF01F001DC0E09E +:10BD8800F8C8FFFC19AB119919BA1188B16AF5EB1B +:10BD9800118AF5E810881248C0386918A198E9484E +:10BDA800004833BB089CF01F0012C0E0F8C8FFFC35 +:10BDB80019AB119919BA1188B16AF5EB118AF5E82E +:10BDC80010881248C0286918E948004C6828F0C94A +:10BDD800FFF0C0F11298C1C88000CEC480039DC492 +:10BDE8008003A1C880039D9C800094C48000AAF4AD +:10BDF800F1390013F13B0010F13A0011F13800124B +:10BE0800B16AF5EB118AF5E81088F3E8100889A8FB +:10BE1800301B089CF01F0084C0E0F8C8FFFC19AB79 +:10BE2800119919BA1188B16AF5EB118AF5E81088E9 +:10BE3800124889B8303B089CF01F007BC0E0F8C866 +:10BE4800FFFC19AB119919BA1188B16AF5EB118A7F +:10BE5800F5E81088124889C831CB089CF01F007299 +:10BE6800C0E0F8C8FFFC19AB119919BA1188B16A7A +:10BE7800F5EB118AF5E81088124889D8306B089CD0 +:10BE8800F01F00691892C2E01998A38889E8582819 +:10BE9800F9B80B02E9F8BA0E3003C1D8E608150262 +:10BEA800E6C9FFF22FE8E8090029E4080008113E76 +:10BEB800113AB16AF5EE118A118EF5EE108A1191D8 +:10BEC800069CF5E11001F2CBFFFC93112FF3F01F54 +:10BED80000575C5368E81033CE23069C4D4BF01F87 +:10BEE80000536CA43008E93A00123089EF58001E5C +:10BEF800F20A1800E9F91E12E9F81E130C9C300A20 +:10BF0800E8CBFFD8F01F004BE93800132FF8E96899 +:10BF180000133018E958001EC7E820383029F20805 +:10BF28001800E08B007930080C9CEF58001EF01FB9 +:10BF38000042C7183069F2081800C3513019EF38A9 +:10BF48000012F20818005F0B3039F20818005F0978 +:10BF5800F7E91009C0813049F2081800C040F40818 +:10BF68001800C5916CA40C9C3003EF53001EF01F01 +:10BF780000330C9C4AEBF01F00320C9C4ACBF01F9C +:10BF880000310C9C4AABF01F0030E939001230C870 +:10BF98000C9CF0091800E9F31E13E9F81E12F01FB3 +:10BFA800002BC398302AF4081800C351EF38001248 +:10BFB800F2081800C30130086CA4EF58001E336B58 +:10BFC800089CF01F0019C270F8C8FFFC19AB119942 +:10BFD80019BA1188B16AF5EB118AF5E81088124888 +:10BFE80089986828F0C9FFF0C0311298C108F13962 +:10BFF8000013F13B0010F13A0011F1380012B16A58 +:10C00800F5EB118AF5E81088F3E8100889A80C9C6C +:10C01800F01F000F0E9CF01F000F0A9CF01F000E6F +:10C02800D83200008000AAF48000C19C8003B409C3 +:10C038008001384C8000BAA88000CABC8000CBC8F8 +:10C048008000CA748000CA928000B5988000B6B497 +:10C058008000AEC48000D13C335B0E9CF01F00030F +:10C06800FE91FE66CD8B00008000AAF4D4314C18F6 +:10C07800301370073002069430813050C7686EA6BE +:10C088005806C720ED05001EE6051900E0880006E1 +:10C098002015ED55001EC688E6051900C651ED3875 +:10C0A8000012306AED52001EF40818005F0A30C909 +:10C0B800F20818005F09F5E91009300AF4091800B8 +:10C0C800C501E8081800C0B1ED380013E0081800F1 +:10C0D800E08B00360E9CF01F0028C468E2081800A8 +:10C0E800C191ED380013E8081800E08B0010300A01 +:10C0F800ECCBFFD80E9CF01F0021ED380013ED5556 +:10C10800001E2FF8ED680013C2F80E9CF01F001CEB +:10C11800C2B8E0081800C0510E9CF01F001AC248AF +:10C128003049F2081800C0F1ED380013E208180091 +:10C13800E08B00060E9CF01F0014C1680E9CF01FD7 +:10C148000013C0F83039F2081800C0E1ED380013C8 +:10C15800E8081800E08B00060E9CF01F000DC04890 +:10C168000E9CF01F000C6E075807C8A1D8320000BB +:10C17800000080CC8000B6B48001384C8000BAA89A +:10C188008000B2E08000B7DC8000B1D88000B4AC99 +:10C198008000B598D4013019F20C1800E08B001D0E +:10C1A800580B5F1A48D9720958095F19F5E900094F +:10C1B800C13017B9178E179A17A8B16AF5EE118A08 +:10C1C800F5E81088F3E81008C0704858304AF00CB9 +:10C1D800002CF01F0004D80200001D5800001D505C +:10C1E8008002E736D42130181897F00B1800E08B3E +:10C1F80000074868304AF00B002BC038304A484BDB +:10C20800F01F00040E9CD82200001D508003B409C2 +:10C218008002E736D4313013189516911492E60C43 +:10C228001800E088000F4BB8201D1AD8E0680246B5 +:10C238001AD84B984B9C1AD8F01F00392FCDC0083C +:10C248004B89F20C0028F20C072B11BA119911A88E +:10C25800B169F3EB1189F3E81088F5E81008C0E13B +:10C268004AC8201D1AD8E06802471AD84AE84ABCCA +:10C278001AD8F01F002B2FCDC008300AE06B011030 +:10C28800149CF01F002A1897C041E06600FFC758A9 +:10C2980078045804C0E049F8201D1AD8E068024D17 +:10C2A8001AD84A3849DC1AD8F01F001D2FCDC0080B +:10C2B800781630CA089B0C9CF01F001EECC9FFF4CE +:10C2C800AC92ACD3E5D2C110ACA3ACC42011AC8203 +:10C2D80032EC2FF1F2C8FFFF300AC05810CBF5D26C +:10C2E800C0082FF1038BF4C2FFFFE80B18005F139F +:10C2F800F80B18005F16E7E60006E8061800CEF10E +:10C30800B28A0389E8091800C1601099CE3B000081 +:10C318008003A1E48003A22880039D9C800094C42C +:10C3280000001D508003A2408000D3188003A2643F +:10C338008002E8BCF0CBFFFB10C9B089B0A9301966 +:10C34800B099B0B96E180E9C101B5C7BF01F000CE6 +:10C3580048C848D6F0050025335A6C0C0A9BF01FD4 +:10C36800000B6C0C0A9A33590E9BF01F0009EDDC88 +:10C37800C0080E9CF01F00070C9CD8328000D21019 +:10C3880000001D5000001D5880011320800114F08A +:10C398008000D13CD421189A303CF80A1800E08873 +:10C3A800000F4BE8201D1AD8E068028A1AD84BC83B +:10C3B8004BCC1AD8F01F003C2FCDC0084BB8E06713 +:10C3C8000118F4070247F007000730180F8B169979 +:10C3D800F00B1800C0A0C603302BF6091800C0F0F7 +:10C3E800F8091800C4C1C4383008AEABAEB8AE986E +:10C3F800EECBFFF43028300CAE88C3680FA92019A3 +:10C408005C59AEA9C4910FBB2FFB5C5BAEBB0F9C04 +:10C41800304EFC0B1800C251F20C1800C1214A4AD8 +:10C4280015FB15CE15DC15EAB16CF9EE118CF9EA9D +:10C43800108AF7EA100AC050AEB9AEA8AE98D82252 +:10C44800EEF801105808C070EEFA0114300BEECC6B +:10C45800FFF45D183008AE883008EF480110D82284 +:10C46800AEABEECBFFF4F01F0013D8226E282018D5 +:10C478008F28C121EF480110AE88D8224878201DA6 +:10C488001AD8E06802C61AD848B8486C1AD8F01FFB +:10C4980000062FCDC008D8228003A1E48003A28023 +:10C4A80080039D9C800094C4000018F000001D507B +:10C4B8008000C21C8003A29CD431580B5F081292E2 +:10C4C80016974BB914967209189558095F04F1E448 +:10C4D8001004E08100B6580CE08000B31989E8091F +:10C4E8001800E08000AEF01F0033E04C00FFE08B46 +:10C4F80000A84B1B0A9CF01F0031C08137F8AEA47E +:10C50800AE88AE9C3018AEB8D8320A9CF01F002C0A +:10C51800F8081618AE88F1DCC208AEBCAE98F1DC9B +:10C52800C108AEA85BFCE081008F4A63300430305C +:10C5380006910788E0081800C171E80400280A9CE1 +:10C54800F00B1503101B2FFBE20B003B2FCBF01F4A +:10C55800001BC0A1E0680118B13449A8F004000428 +:10C56800E8F8010CC0782FF4E6C3FEE85844CE2161 +:10C578003FF8F0091618AE89F3D8C208AEB8AE99DC +:10C58800F3D8C108AEA95BF8C5E1300748E848DB35 +:10C59800118A0E9C0E9930313043F2C0FFFF178488 +:10C5A80016985804C1211297C358000000001D585E +:10C5B8008002EDD08003A2BC8002ECC880011E106E +:10C5C800000018F0000018ECE2041800C0C117C8F9 +:10C5D800F4080104F40801081838E08A0005F9D4C1 +:10C5E800C0081297F3D0C008F6CBFEE8E609180099 +:10C5F800CD513039F2071800E08B0027494BE0682D +:10C608000118EE080248F6080008118BF20B180012 +:10C61800C1B1F4C9FFFFB0CAF1460110301AF142A6 +:10C628000114B08AF0CCFFF448A80A9BB089F01F27 +:10C63800000A0E9CF01F0009E06C00F2D832E06C92 +:10C6480000F7D832D83AE06C00FFD832000018F072 +:10C65800000018EC8002ED708000C39CD40148985B +:10C6680070085808C0D0300CF01F0007301CF01FAD +:10C678000006302CF01F0004303CF01F0003D802E5 +:10C6880000001D588000C39CD421494C4946F01F26 +:10C6980000156C0518975805C1E1F01F00138D0CA3 +:10C6A800C1A0492B0A9AF01F00120A9A491B6C0C68 +:10C6B800F01F00116C085808C0E05807C0C0EE0908 +:10C6C800161848E8B0B7B089F3D7C208EFD7C10841 +:10C6D800B099B0A7D82200008003A2C800001D5856 +:10C6E80080011E10800112008003B40980011260CD +:10C6F8008000C704800111F800001D50D431E068A3 +:10C7080002001496944AF00A1900E08B00E331986D +:10C71800F00A1900E08800DE4DF75C7A30090E9BBC +:10C728000C9CF01F005E8C48F8081900E08100D2CC +:10C738000F993038F0091800E08B00CCE06501183B +:10C74800AB394D75120530290B8AF20A1800E081C1 +:10C7580000C1AA880FBAF5DAC004AADA0FD80FCB3D +:10C76800F1EB108B0FF80FEC5C8BF1EC108C3009AF +:10C778005C8C0FA8F2081800E084009DF20A1800EB +:10C788005F18301AF40B18005F1AF5E81008F20861 +:10C798001800E0810090EAC4FFF42F4708980F8939 +:10C7A800129AE21A00C0E04A00C0C1502FF7C098A0 +:10C7B800F3DBC0082FF7118BF40B1800C7B12FF863 +:10C7C800F2CB00010F8A5809CF41F20A1800C03095 +:10C7D8002FF8CE6B4B0B30082F4B1739129AE21AF1 +:10C7E80000C0E04A00C0C060120B1789F0091800A9 +:10C7F800CF51F1DCC0082FBB300E301A3047C58846 +:10C808001739129CE21C00C0E04C00C0C060120B3B +:10C818001789FC091800CF512FFB17CC17D9B1691C +:10C82800F3EC118917ECF7330008F3EC108917A221 +:10C8380017FC1781F9E91009F73C0009F9E3108C96 +:10C8480017B35C8CE7E2108317925C83E5E11082F2 +:10C85800F4021900C281F4031900C251EE0C190048 +:10C86800C2218B29E8593A80E0880005E8783A80A7 +:10C878008B28EAC7FEF42F6B304A0E9CF01F000984 +:10C88800EAF801105808C250EAFA01140E9B089CF5 +:10C898005D18C1F800001D5C8000CEC4000018F0CF +:10C8A8008002E7365C7C20182F6C5C58180B5808FF +:10C8B800CA81EAF801105808C070EAFA0114300B6E +:10C8C800EACCFFF45D183008AA883008EB4801105C +:10C8D8000C9CF01F0002D8328000D13CD401F01F1C +:10C8E8000003F01F0003D8028000C8F88000C6903B +:10C8F800D42149A949ABF2CCFEC4F2C8FF54300A8E +:10C90800F2C9FF50910A930AB22A172EF14EFFFC82 +:10C918002F092F081838CF71492949382FD9149C65 +:10C92800E019FFFCF0C6FFDC48D7490E910CEE0A6F +:10C938000405189BC098700493042FFB9109FC0A06 +:10C9480005045C8B0809EA0B1900CF632FC82FEA8E +:10C958000C38CED1D8220000000080D48003A2D8A1 +:10C9680000001F5C000072E88003A394D401580BF8 +:10C97800C200F1DBC002C0E048F8201D1AD8E06808 +:10C98800016B1AD848D848EC1AD8F01F000E2FCDE2 +:10C99800C00848D8F00C03299709F00C092B48B8AF +:10C9A800A56CF00C000CF8CCFF54780820189908F6 +:10C9B800D80200008003A2EC8003A33080039D9C72 +:10C9C800800094C4000072E8000080D4D421189834 +:10C9D800588CE088000F49F8201D1AD8E068013DFE +:10C9E8001AD849D849DC1AD8F01F001D2FCDC00825 +:10C9F80049CE49D9FC0C032CF0CAFFF5580CC230BB +:10CA0800A56AF00B15047807F20B000BFC08092740 +:10CA1800F6CBFF5414097608720A2FF8103AF3F887 +:10CA28003A009708F1DCC002C13048A8201D1AD886 +:10CA3800E068014F1AD848D8488C1AD8F01F000867 +:10CA48002FCDC008A56A140992282FF8B228D82239 +:10CA58008003A2EC8003A35080039D9C800094C4B3 +:10CA6800000072E8000080D48003A370580BC0C097 +:10CA780017B8178A179917ABB169F3EA1189F3EB5D +:10CA8800108BF1EB100B993B5EFC580BC0C017B82C +:10CA9800178A179917ABB169F3EA1189F3EB108B71 +:10CAA800F1EB100B992B5EFC4828910C5EFC000002 +:10CAB800000080D0D4211897F9380035EDB800006F +:10CAC800C0D1A1C8F968003578885808C0205D1819 +:10CAD8006E785808C0300E9C5D18D822F93C003595 +:10CAE800F9DCC0015EFC580CF9FB1A075EFCD703A1 +:10CAF800D421300A18971696302C96CBF01F001ABE +:10CB08001895C041E06600FFC2B80C9BF01F0017E3 +:10CB1800EDDCC008C0500A9CF01F0015C2180A9826 +:10CB280070095809C0301298CFCB6EF95809C15016 +:10CB38006F095809C0E148F8201D1AD8E068025367 +:10CB48001AD848D848DC1AD8F01F000D2FCDC008D5 +:10CB58009305EF480040C048EF4800408FF50C9C13 +:10CB6800D82200008000D3188000CF988000D13CE4 +:10CB78008003A3A88003A44480039D9C800094C4E0 +:10CB8800D4211897F9380035EDB80000C170A1A874 +:10CB9800F968003578885808C0205D186E785808FC +:10CBA800C0300E9C5D18EF380035EDB80005C06147 +:10CBB8000E9CEECBFFFCF01F0002D8228001370C40 +:10CBC800D42117881799B169F3E8118917A8F3E8F0 +:10CBD800108917B81697F1E91009189678181039BE +:10CBE800C27049A8700CC0A8780978356C1810393B +:10CBF800C041301BF01F00160A9C580CCF614958E1 +:10CC08007008C14870095809C1006C1A1439C0D19C +:10CC18000F8A0F99B169F3EA11890FAAF3EA10890B +:10CC28000FBAF5E91009910970385808CEC10F8A72 +:10CC38000FB90F98B168F1EA11880FAAF1EA1088C4 +:10CC4800F3E810088D18D8220000820C8000E12437 +:10CC580000008214D421149712961895F01F001022 +:10CC68005807C0C00FB80F8A0F990FA7B169F3EA28 +:10CC78001189F3E71087F1E710078B275806C0C022 +:10CC88000DB80D8A0D990DA6B169F3EA1189F3E67D +:10CC98001086F1E610068B36D82200008000CBC83B +:10CCA800D4213006999899169926993699A6997695 +:10CCB800998699F6F94600404908FAC4FFEC681EBF +:10CCC8006804F96600351185F96500382FF5B085D7 +:10CCD8001897994EF01F000A0E9C5D145C5C4898EA +:10CCE800580CEC071710F1F90000EFF90A00F1F7FA +:10CCF8000A000E9CD82200000000730C8000CC5C57 +:10CD0800000080CC1898300CC0482FFC70085C5C80 +:10CD18005808CFC15EFC580CF9F81207F9B901019F +:10CD2800F1D9E108F9F81C075EFCD703D401580CC7 +:10CD38005F08580B5F09F3E81008C1304978201DD7 +:10CD48001AD8E068028F1AD84958496C1AD8F01FC7 +:10CD580000162FCDC008964AF4080008B848129C5F +:10CD6800984878095809CF819859F0091900C0E006 +:10CD780048A8201D1AD8E06802971AD848B8489CD5 +:10CD88001AD8F01F00092FCDC0089649990BF20850 +:10CD98000008B848D80200008003A4708003A4B437 +:10CDA80080039D9C800094C48003A4ECD421169732 +:10CDB800F01F00065807EFF81207F9B90101F1D979 +:10CDC800E108EFF81C07D8228000CD34D421580C94 +:10CDD800C0E14B58201D1AD8E06801B01AD84B386A +:10CDE8004B3C1AD8F01F00332FCDC008580BC03168 +:10CDF800169CD8223008F00B1900C154F60911000E +:10CE080098585C89F2081900C0F24A78201D1AD88F +:10CE1800E06801B71AD84A884A5C1AD8F01F00257A +:10CE28002FCDC0081699F93E000C300A3037F40EA1 +:10CE380019005F08EE0E19005F061497104678185F +:10CE4800F4061800C0A0F00B01099919F8CAFFF000 +:10CE58001439C2029918DA2A201E3017EE0E19006A +:10CE6800E08B000CF40B1900C1D4985AF20A19008F +:10CE7800C19316189918C0E848B8201D1AD8E06858 +:10CE880001E61AD848D848AC1AD8F01F000A2FCDA6 +:10CE9800C00898581608B8589848F00B000BB84BBB +:10CEA800D82ADA2A8003A47080039EA480039D9C5C +:10CEB800800094C48003A51C8003A53CD43116913E +:10CEC8001497580CC0E14AD8201D1AD8E068033ED0 +:10CED8001AD84AB84ABC1AD8F01F002B2FCDC00860 +:10CEE800580BC070300518960A920A930A90C388A6 +:10CEF8004A28201D1AD8E068033F1AD84A384A1C25 +:10CF08001AD8F01F00212FCDC0085809C0A08C588E +:10CF1800F208010AF0091900C043F3DAB010C1F8A9 +:10CF2800F1D9C0108C54E8090109EE091900EE097D +:10CF380017B06C1BE9D9B010F9D5C010100BE20C72 +:10CF4800000C089A5C7AF01F0012E8030003081727 +:10CF5800E80500055C835C855C8730096C0658062B +:10CF68005F1AE40719005F18F5E80008E0081800E0 +:10CF7800CCD1069CD83200008003A4708003A5B0F1 +:10CF880080039D9C800094C48003A5D08002E7366E +:10CF9800D431580C5F08580B5F0918961697F3E8B8 +:10CFA8001008C06198499648F0091900C0E24C7809 +:10CFB800201D1AD8E06802FE1AD84C584C5C1AD8C2 +:10CFC800F01F00452FCDC00830050A945806C0E16F +:10CFD8004BE8201D1AD8E06803031AD84BF84BDC3D +:10CFE8001AD8F01F003D2FCDC0088C5808995C79DD +:10CFF8008E53F5D8C010F7D3C010121AF3D5C0104D +:10D00800F6090109123AE7D5E413E8091750F1D9EE +:10D01800E51308985C786C1C100CF1D5C0105C8383 +:10D028006E1BF5D3C010100BF01F002DE604000492 +:10D038008C585C84F0041900E088000F4A38201DE1 +:10D048001AD8E068030F1AD84A684A2C1AD8F01F71 +:10D0580000222FCDC008F0041900EDF60000F9B445 +:10D068000000E60500058E585C85F0051900E0888B +:10D07800000F4968201D1AD8E06803151AD849A876 +:10D08800494C1AD8F01F00142FCDC008F00519001C +:10D09800EFF72000F9B502005807C2908E598E4864 +:10D0A800F0091900C2416E085808C2104878201DBE +:10D0B8001AD8E068031F1AD848C8486C1AD8F01F55 +:10D0C80000062FCDC00800008003A4708003A5F4DB +:10D0D80080039D9C800094C48003A6248002E736C8 +:10D0E8008003A6348003A64C8003A6685806C16056 +:10D0F8008C598C48F0091900C1116C085808C0E017 +:10D108004898201D1AD8E06803241AD84878488C13 +:10D118001AD8F01F00082FCDC0085807FE91FF58F5 +:10D128000E9CD8328003A4708003A66880039D9C5F +:10D13800800094C4D421189B580CC0E14AB8201D23 +:10D148001AD8E068021C1AD84A984AAC1AD8F01FB4 +:10D15800002A2FCDC008F939000C3038F009180022 +:10D16800E088000F4A18201D1AD8E06802281AD84B +:10D178004A284A0C1AD8F01F00202FCDC0083007C3 +:10D18800303530169679F2C800015C885809C0E13C +:10D198004968201D1AD8E06802351AD84988495CC0 +:10D1A8001AD8F01F00152FCDC008B6785808C1B19D +:10D1B800F738000C169CF0C900017604EA0819003B +:10D1C800C031308CC068EC091900E08B0006307C57 +:10D1D800F01F000CC038F01F000C2FF7089B5C579D +:10D1E8005804CD110E9CD8228003A47080039EA4FD +:10D1F80080039D9C800094C48003A6948003A6AC01 +:10D208008000C9748002E28CD421580CC0E14B988C +:10D21800201D1AD8E068015F1AD84B784B7C1AD8C1 +:10D22800F01F00372FCDC0083019F938000CF2086C +:10D2380018005F1A3039F20818005F19F5E900097B +:10D24800C1405808C1203029F2081800C0E04A98A7 +:10D25800201D1AD8E06801631AD84AA84A7C1AD84F +:10D26800F01F00272FCDC0089848F00B1900C3F213 +:10D27800F3D8C0101897F1DBB0105C7B121BC27892 +:10D28800E04BFFFEE08A000F49A8201D1AD8E0688D +:10D2980001771AD849C8499C1AD8F01F00192FCD10 +:10D2A800C0088E481608AE486E075807C0E14918EE +:10D2B800201D1AD8E068017B1AD8494848FC1AD8BA +:10D2C800F01F000F2FCDC008F1DAB0108E59F00909 +:10D2D800010AF2081900FE9BFFD5AE48AE586E0C45 +:10D2E800580CC030F01F000A30088F08D822000000 +:10D2F8008003A4708003A70080039D9C800094C4D1 +:10D308008003A7188003A7348003A7488000D13C76 +:10D31800D431202D16971495581CC0B0C083582CB2 +:10D32800C040583CC0B1C1783004C0583144C0280E +:10D3380030042EC42E445C84C0F84C08201D1AD832 +:10D34800E06800D11AD84BE84BEC1AD8F01F003E21 +:10D358002FCDC00830045825E08B00065815E08210 +:10D3680000DDCBF85835E08100E6308CF01F00373F +:10D378001896E08000F25C740E99E8C8FFFD5C79AD +:10D38800E018FFFCB847E06A02443000F4080108DE +:10D39800F8040004F0090D472ED4E014FFFCAC5744 +:10D3A8009914F965000C99005C77F8C3FDAC0E047C +:10D3B8000833C0E24A18201D1AD8E06800EB1AD8D2 +:10D3C8004A384A0C1AD8F01F00202FCDC008580838 +:10D3D800E089000F4998201D1AD8E06800ED1AD896 +:10D3E80049C8498C1AD8F01F00182FCDC008F20779 +:10D3F800010700980A9918943015E0610243B8753E +:10D40800E0620244C6A850195008308CF01F000F83 +:10D418000E9B189A5C8BF4CEFFF0F6011900F60CFF +:10D428001720E40C173040194008580AC1610C9CB9 +:10D438001496F01F0009C9088003A4708003A76030 +:10D4480080039D9C800094C48000C9D48003A77C7D +:10D458008003A7B08000D13C9508890AF569000CC3 +:10D46800F560000DE047FFFFC0E14BD8201D1AD83A +:10D47800E06801071AD84BB84BBC1AD8F01F003B1C +:10D488002FCDC008951EB45CB44BFDDEC002C0E0D1 +:10D498004B38201D1AD8E068010D1AD84B484B2C80 +:10D4A8001AD8F01F00322FCDC0085C7C8CDB18170F +:10D4B80014946C1CF80B000B1633C0E24A88201D2C +:10D4C8001AD8E06801101AD84AA84A7C1AD8F01F5E +:10D4D80000272FCDC008B4755807FE99FF96C3786A +:10D4E8000E985C782FD8E018FFFC5C74E8CCFFED50 +:10D4F800E01CFFFC100CF01F00201896C2D030086A +:10D50800F8040004AC572ED4B847E014FFFCF968BF +:10D51800000C99149908C1B8307CF01F00181896AF +:10D52800C1B03008AC57F965000CB847990899188C +:10D53800C0E848B8201D1AD8E068013D1AD8490843 +:10D54800489C1AD8F01F00092FCDC0083018AC78B5 +:10D558003008ED68000D0C9C2FEDD8328003A470C4 +:10D568008003A7E480039D9C800094C48003A7F8EF +:10D578008003A77C8002E2A48000C9D48003A82885 +:10D58800D43149B8781918951094300CF2C2FFF4C8 +:10D59800F3310009700718961893C1E8EF380010A6 +:10D5A8000238C1716E585808C1400A9A0E9B6E6CB9 +:10D5B80004995D18C0E05806C0410C95301CC0A8FD +:10D5C8006E388D3868088F388907301C3005C028B8 +:10D5D800300C0E966E37E60C18005F0858075F1976 +:10D5E800F3E80008E6081800CDA1D832000073104F +:10D5F800E06C00FB5EFCD421E067040078A8F90B1E +:10D60800002C78C9F5DBC010F90E003C100AEE0EAC +:10D618001900E0880005E06E0400C0285C7EF4096B +:10D628000107EE0E010EC076F95B002E78CCF40CE3 +:10D63800010CD822F009010A580AE08A00063008CD +:10D64800F958002ED82AF2080108F958002ED82ACD +:10D65800996B5EFCF94B008C5EFCF94B00885EFC14 +:10D66800F94B00985EFC998B5EFCF96A0039F94B1E +:10D6780000945EFC5EFC5EFC48A87008C028703808 +:10D688005808CFE148887008C02870385808CFE19A +:10D6980048687008C02870385808CFE15EFC000060 +:10D6A8000000820C0000821400008220D4014A6825 +:10D6B8007008C30870495809C0E14A48201D1AD8A3 +:10D6C800E06805AC1AD84A284A2C1AD8F01F00225C +:10D6D8002FCDC0085819C0E149C8201D1AD8E068E4 +:10D6E80005AD1AD849D849BC1AD8F01F001B2FCD50 +:10D6F800C00858A9C0E14958201D1AD8E06805AEED +:10D708001AD84978493C1AD8F01F00132FCDC00801 +:10D7180070385808CD0149387008C128704958A98F +:10D72800C0E048A8201D1AD8E06805B11AD848E812 +:10D73800488C1AD8F01F00082FCDC0087038580838 +:10D74800CEE1DA0A0000820C8003A8688003A8AC46 +:10D7580080039D9C800094C48003A8D88003A904FA +:10D76800000082208003A934D43118961497784891 +:10D778005808C0E04C48201D1AD8E068011A1AD889 +:10D788004C284C3C1AD8F01F00432FCDC008580A2B +:10D79800C3514C19720C4C19720A4C19109E9207FD +:10D7A8004C08E069100070052FF70A985C87EE0EA8 +:10D7B8001900F2071790C088F104001C0E93EE04BC +:10D7C8001900CF3070385808CF811898C088F104F4 +:10D7D800001C0E93EE041900CE8070385808CF81D3 +:10D7E8001498C088F104001C0E93EE041900CDD0E3 +:10D7F80070385808CF814AA8B0074A887008C1F81D +:10D80800F109001C0E93EE091900C181700A580A2B +:10D81800E0800099580BE0800096178C1799B16941 +:10D82800F3EC118917ACF3EC108917BCF9E910096E +:10D83800E0800089123AE080008670385808CE11DE +:10D8480049887008C1A8F109001CEE091900C141F6 +:10D85800700A580AC770580BC750178C1799B169C6 +:10D86800F3EC118917ACF3EC108917BCF9E910092E +:10D87800C690123AC67070385808CE6148A870052C +:10D888000A98C2D88003A8688003A96080039D9C79 +:10D89800800094C40000822000008214000001F877 +:10D8A8000000820C0000821CF109001C0E93EE0996 +:10D8B8001900C141700A580AC450580BC430178C5B +:10D8C8001799B169F3EC118917ACF3EC108917BCFF +:10D8D800F9E91009C370123AC35070385808CE518C +:10D8E80049A87008C158F109001CEE091900C0F1D7 +:10D8F800178A1799B169F3EA118917AAF3EA108907 +:10D9080017BAF5E91009700A123AC1C070385808F8 +:10D91800CEB1580BC11017891798B168F1E9118871 +:10D9280017A9F1E9108817B9F3E81008C050304A70 +:10D938000C9CF01F00078D354868ED57001C9106B8 +:10D94800D83AE06C00F5D832000082208002E73631 +:10D958000000821CD4211897169CF01F0008C0B044 +:10D96800F908002C5808C0702288EE081900F00742 +:10D9780017305C870E9CD82280012228D421F90810 +:10D98800002C1897F3D8C010E06CFFFFF5DBC0102F +:10D99800F8090109123AE08A000F4948201D1AD8EF +:10D9A800E06801BD1AD84928492C1AD8F01F00127E +:10D9B8002FCDC008100BE0680800EF5B002CF00BBF +:10D9C8001900EFF8BC160E9CF01F000CE04C01FF8C +:10D9D800E08A000AEF380026A1B80E9CEF680026FE +:10D9E800F01F0007D82200008003A8688003A988D8 +:10D9F80080039D9C800094C48000D5FE80010CECBF +:10DA0800D4211896304CF01F000A1897C0E0ECE8B3 +:10DA18000000F8E90000ECE80008F8E900086C48A4 +:10DA28009948781CF01F00030E9CD8228000C9D4A6 +:10DA38008000CD1ED4211896580CC0311897C0B854 +:10DA4800781C580CC030F01F000518970C9B304C00 +:10DA5800F01F00030E9CD8228000D13C8000C974BE +:10DA6800D42130071896C0880C9C6C06F01F00055E +:10DA7800F80700075C575806CF810E9CD822000093 +:10DA88008000DA3CD4217848189758A85F1A5808BB +:10DA98005F19F5E90009C2005818C1E0F8FC0084D4 +:10DAA800580CC060F01F000D3008EF4800843FF8A4 +:10DAB800EEFC0080EF58003AF01F000930066FECCA +:10DAC800EF460080F01F00066FFCF01F0005EF46D0 +:10DAD800007CEF460078D8228000D13C8000DA68CC +:10DAE800D421169778081638C04176389908C11895 +:10DAF8004B899308C0A870390E39C0614B599308F7 +:10DB08006E399139C06812985808CF614B1993083B +:10DB180030060E9C8F36F01F00306E4858A85F19EB +:10DB280058185F181268EC081800C0C0EF380026B3 +:10DB3800EDB80000C071A1B80E9CEF680026F01F78 +:10DB480000276E485818C3206FE85808C0E04A48B4 +:10DB5800201D1AD8E06804F91AD84A284A2C1AD87D +:10DB6800F01F00222FCDC0086FF85808C0E049C840 +:10DB7800201D1AD8E06804FA1AD849D849AC1AD82E +:10DB8800F01F001A2FCDC008EEF800805808C0E03A +:10DB98004938201D1AD8E06804FC1AD84958492C7D +:10DBA8001AD8F01F00122FCDC00830088F48F01F78 +:10DBB8000012C0E148A8201D1AD8E06805021AD84A +:10DBC80048E8489C1AD8F01F00092FCDC008D82271 +:10DBD800000082188000DA8C80010CEC8003A868B1 +:10DBE8008003A9AC80039D9C800094C48003A9C4D1 +:10DBF8008003A9E08000D6B48003A9F8D42118973F +:10DC080078485808C0E04A68201D1AD8E0680175AD +:10DC18001AD84A484A4C1AD8F01F00242FCDC008F9 +:10DC2800303CF01F00231896C380EF08001CF958F9 +:10DC3800001C6E6899688E48A1B8B8483018994891 +:10DC4800EF38000BF968000BEF38000AF968000A92 +:10DC58006E089908497972080E38C0316E38C108C3 +:10DC680049599308C0A870390E39C06149299308E9 +:10DC78006E399139C06812985808CF6148E99308FD +:10DC880030080E9B8F38302CF01F000C48C948D83C +:10DC98008D8970098D3991060C9CD8228003A8685B +:10DCA8008003AA1880039D9C800094C48000C9D476 +:10DCB8000000821C000082188000C9748000D5F81A +:10DCC80000008214D431204D4B583005700910964D +:10DCD8002FF90A9491090A934B2830627007E08F54 +:10DCE800019E6E485808C0E14AF8201D1AD8E0681D +:10DCF80002571AD84AD84AEC1AD8F01F002E2FCD4E +:10DD0800C0085818C0E14A88201D1AD8E06802588F +:10DD18001AD84A984A6C1AD8F01F00262FCDC00886 +:10DD280058A8C0E14A08201D1AD8E06802591AD834 +:10DD38004A2849FC1AD8F01F001F2FCDC0085828C0 +:10DD4800C071EF38004EE4081800E0800081EF3819 +:10DD5800004E30CAF4081800C7A0EF3800AC10997C +:10DD6800E8081800C300EEF900A82FF9EF4900A849 +:10DD7800493A100AF53AFFFF1439C6B33009EF499A +:10DD880000A8E4081800F9B90801F1D9E808EFF883 +:10DD98008EAC0E9CF01F000BC5C80000000082105E +:10DDA8000000820C8003A8688003AA3C80039D9C25 +:10DDB800800094C48003AA688003AA948003AC38C6 +:10DDC80080010A20EF08003AE6081900F9B90401B1 +:10DDD800F1D9E408EFF84C1D6FF85808C3A0EF0913 +:10DDE800003AEF08004CF0091900C3356E4858286E +:10DDF800C100EF09004AEF0800484CD1A3581208A7 +:10DE0800EF39004EE2090709F0090948EF58004CBC +:10DE1800EF080060EF090056F0091900F00917B083 +:10DE2800EF08003CF3D9C02FEF590058F00A15014C +:10DE3800F0091900EFFA3C2CEF08003CEF53003AC8 +:10DE4800EF5800560E9CF01F003BC0383018C02811 +:10DE580030086E495869C0B16C0B6EDAF60A010ACF +:10DE6800E04A0028E08800042FF85C588ECAEDBA12 +:10DE78000003C39158495F0A58795F091449E809B2 +:10DE88001800C3106C0AEEFC00A0EEF100A4F80123 +:10DE980002416ED9EEFB009CF4090109E20B000E69 +:10DEA800E06A01F4FC0A0D00FAE100080039E08894 +:10DEB80000062FF830115C58C178EF3100ADE20C44 +:10DEC800034BF60A0D0A1439E088000E50180E9C10 +:10DED800F01F0019EF3900AD30012FF9EF6900ADDF +:10DEE8004018C0283001EEFC0080580CC1106ED9D3 +:10DEF8006C0A121AEF09004CF2091006123AC08394 +:10DF08005018F01F000E30004018EF4000806E4996 +:10DF18005839C1516C0A6ED9F4090109E049002841 +:10DF2800E08800182FF85C58C14800008003A85802 +:10DF3800800110608001109C8000DA685899C091B7 +:10DF48006C0A6ED9F4090109E04900F0E08B00047D +:10DF58005808C4900E9CF01F00434C385805C14027 +:10DF680070081037C0E14C18201D1AD8E06802E488 +:10DF78001AD84BF84BFC1AD8F01F003F2FCDC00819 +:10DF88006E388B38C13870090E39C0E04B78201DC7 +:10DF98001AD8E06802E81AD84B884B6C1AD8F01FD8 +:10DFA80000362FCDC0086E399109EEF80098580850 +:10DFB800C0403FBB6E6C5D185801C0F0EF180024DC +:10DFC800201DEEC9FFFC1AD80E9AEF18001C6EAB84 +:10DFD8006F7CF01F002B2FED0E9B302C6E37F01F3F +:10DFE8000029C1C8EF3900382FF9EF690038EF3A36 +:10DFF8000039F20A1800E08B0010EF680038EEF8DC +:10E0080000945808C0600E9B6E6C5D185C5CC04143 +:10E018000E9CF01F001D0E956E375807FE91FE638B +:10E0280049A849B410957006C6086C4858A8C0E0BD +:10E0380048E8201D1AD8E068030C1AD8495848DC6B +:10E048001AD8F01F000D2FCDC00868096CD8F20847 +:10E058000108E04800F0E08B004C0C976C36C4587F +:10E068008000DA8C0000820C8003A8688003AAC4B0 +:10E0780080039D9C800094C48003AAF08001023430 +:10E088008000C97480010CEC00008220000082101E +:10E098008003AB1C6A081036C0E149A8201D1AD8B5 +:10E0A800E068031B1AD84988498C1AD8F01F001851 +:10E0B8002FCDC0086C388F38C1386A080C38C0E0DA +:10E0C8004908201D1AD8E068031F1AD8491848FCC7 +:10E0D8001AD8F01F000F2FCDC0086C388B080C9B86 +:10E0E800302C6C36F01F000C5806CA01C0780C9C06 +:10E0F800F01F000A5807CCF1CE1B2FCDD8320000F4 +:10E108008003A8688003AB4C80039D9C800094C466 +:10E118008003AB748000C9748000DA8CD431202D60 +:10E1280018951691784858A8C0A1189B4A2CF01F3A +:10E1380000230A9B302CF01F0022C3B8780850082F +:10E148007818F903001C5018F9020024797778A68A +:10E15800F8F400987860189B49ACF01F00186BFC25 +:10E16800580CC030F01F00186BEC580CC030F01F72 +:10E178000016EAFC0080580CC030F01F00130A9B00 +:10E18800302CF01F000F5804C040009C3FBB5D14AA +:10E198005801C0F0201D5C72F1D3C0101AD20C9B3C +:10E1A800FAC9FFF4FACAFFF80E9CF01F00082FED19 +:10E1B8002FEDD832000082208000DAE88000C97490 +:10E1C8000000820C8000DA6880010234D42118969D +:10E1D800302CF01F00511897C5114D084D0A189999 +:10E1E8007008740BC0A870DAF60A010A123AF4092A +:10E1F8001720F00C172070385808CF61580CC04011 +:10E20800301BF01F0048302CF01F00431897C30143 +:10E218004C584C3A18997008740E37FBC178F13A8B +:10E228000014EC0A1800E08B000DF60A1800E08BC9 +:10E23800000970D7FC0701071237C033109CC0389B +:10E24800169A12977038149B0E995808CE91580C4C +:10E25800C040301BF01F0033302CF01F002F1897E0 +:10E26800C5704B28F10900D42019F15900D44AF897 +:10E27800F10900D42019F15900D4E06A00B0300B3C +:10E288000E9CF01F002B3408EF6800143FF8EF686D +:10E29800000B4A384A7A70097408F2080008950891 +:10E2A800EF48006CEF480068EF48005CEF4800500A +:10E2B8003008EF6800ADEF680038E0680800EF58F4 +:10E2C800002EEF58002C3068EF58004AEF58004CE9 +:10E2D800E0681000EF580072E0680200EF58003C58 +:10E2E8003FF8EF58003A3018EF5800564928EF48E1 +:10E2F800008CE068DD00EA18006DEF48009CE078CB +:10E3080024F88FD9EF4800A03098EF4800A40E9C5D +:10E31800D82200008000C9D40000822000008210AA +:10E328008000E1240000820C000080D48002E8BC58 +:10E33800000001F48000E5ECD401340CF01F000269 +:10E34800D80200008000E1D4D431189714961293B3 +:10E35800169578445804C0E04C98201D1AD8E068F7 +:10E36800020A1AD84C784C8C1AD8F01F00482FCDC6 +:10E37800C008580BC041E06600F7CB78304A140C4F +:10E38800F01F0043EF560024EF08001CE8081900AE +:10E39800C34110944BF84C0970064C08720B700C72 +:10E3A8004BF9E06A100092082FF80C995C88F00489 +:10E3B8001900F4081790C078F30E001CF00E19002D +:10E3C800CF4072395809CF911899C078F30E001CC4 +:10E3D800F00E1900CEA072395809CF911699C0785D +:10E3E800F30E001CF00E1900CE0072395809CF91B7 +:10E3F8004AB9B208EF58001C4AA84AB9700A72080C +:10E40800F40800089308EF48005CF0C90001E068D0 +:10E418000800EF580060EF58002CEF58002E300825 +:10E428008FC88FA8E0680200EF49006CEF490050E0 +:10E43800EF58003C0A9BE06C0200F01F001C5C8C4B +:10E44800F808100AEF5800583018EF430090EF58BA +:10E458000056EF5C003C30288F48495972080E3846 +:10E46800C0316E38C2C849399308C26870390E394C +:10E47800C221490993086E399139C2288003A868D6 +:10E488008003AB9C80039D9C800094C48002E73687 +:10E498000000820C0000821400008220000001F8B5 +:10E4A80000008210000001F48000D95C0000821C8A +:10E4B8000000821812985808CDA148D9930848D866 +:10E4C80070098F3991073019201D30081AD9109A10 +:10E4D8003029109B0E9CF01F00082FEDEDDCC008C2 +:10E4E800C0410E9CF01F00050C9CD8320000821819 +:10E4F8000000820C8001035080010CECD421189795 +:10E5080078465826C390E08B00075806C0C05816B6 +:10E51800C071C2785846C370C3635876C3C030060A +:10E528000C97C4184A8972081838C0317838C1085D +:10E538004A699308C0A870390E39C0614A399308EE +:10E548006E399139C06812985808CF6149F9930813 +:10E5580030080E9B8F38302C1097F01F001DC0A874 +:10E56800189B49CCF01F001C0E9B303CF01F001874 +:10E5780030070E96C188189B498CF01F00170E9B18 +:10E588000C9CCF5B301BF01F0016EDDCC008C0B13F +:10E598003058C088301BF01F0012EDDCC008C031B5 +:10E5A80030988F4858075F193008F00618005F0A3E +:10E5B800F5E90009F0091800C0400E9CF01F000999 +:10E5C8000C9CD8220000821C000082188000C974AC +:10E5D800000082148000DAE80000820C80010A0042 +:10E5E80080010CECD421169C1497580AC08094CB57 +:10E5F800F01F00070E9CF01F0007D82A5809C030EA +:10E60800149CD822F01F00045C5CD8228000D984B6 +:10E618008000D13C8000E504D42149887007C2A855 +:10E62800EEFB0084580BC140169AEEF8008C58088F +:10E63800C06030090E9B6E6C5D18C078169A1099F0 +:10E648000E9B109CF01F000E5C5CEFFC0A21EF385B +:10E658000026EDB80000C0D1A1B80E9CEF680026D6 +:10E66800F01F0008EF380026E018FFFCEF680026CE +:10E678006E375807CD61D8220000820C8000E5EC87 +:10E6880080010CECD401F01F0007487913882FF89B +:10E698005C58B288EDB80000C031F01F0004D80201 +:10E6A8008000E620000073148000DCCCD4314A6876 +:10E6B80070063058ED3E000C2EC6A58EF00E1900DF +:10E6C800E0880040205E3008A36E30175C8E302151 +:10E6D8003042E7DEC010E06401FFE0650200C2E8F6 +:10E6E800F5D8C010EC0A070BEE0B1800C080C293D7 +:10E6F800EC0A0009E20B1800C1B1C0382FF8C1D8E4 +:10E70800139BE40B1800C1D12FDA063AC1A413BA3F +:10E718002FC813A95C88F5E910895C89F2CA000141 +:10E72800E80A1900EA0917B0F959003CC0781399AA +:10E738005809C070F20800085C88FC081900CD135D +:10E74800D832000000007318D4217848189616971C +:10E75800F138000DEDB80000C1C1169C3007F01F5C +:10E768000020C368F138000DEDB80000C0E16C4826 +:10E77800F13A000CF139000DF3EA1089A1A9F16909 +:10E78800000DA989F169000C6E07F01F0016C0285A +:10E7980049555807C1D06E4811C411DBB16BF7E475 +:10E7A800118B11E48EEEF7E4108B6A0A8CE911F4F0 +:10E7B8000E9CE9EB100B16191409F20E010ECD3759 +:10E7C800C098141B6C1CAC6B5C7BF01F00088D0799 +:10E7D800D8225809FE99FFF7CFBB00008000DA68FD +:10E7E8008000DA3C0000731C8000D210D4314C58F1 +:10E7F80018971188EDB80004E081020C79994C282B +:10E80800F90C006070086FAAF208010BC186103974 +:10E81800C0614BE87008F4080108C1164BB87008CD +:10E82800103AC2914BA87008F139000FF138000E68 +:10E83800F3E81088F8081900E088001E4B487009B2 +:10E84800F338000FF339000EF1E910884AE972092C +:10E858005C88EF490064EF5800604AC97209EF49C3 +:10E8680000685808C080EF3900AC3008F00918007B +:10E87800EFF81EAC4A586F497008F009010B580BA5 +:10E88800E089004C3006EF5600704A2B960BEC0BD3 +:10E898001900C3215C7CEF160060F80A000A6FAC0F +:10E8A800EC0C000C143CC281EF0A003AF60A19007D +:10E8B800C2351039C211EF3800542FF85C58EF6890 +:10E8C80000543039F2081800E088000FEF090056AC +:10E8D800EF08003C12085C88F2081900E088014A39 +:10E8E800EF580056C469F2081800E08101430E9CF5 +:10E8F800F01F0009C3E93008EF680054C3A90000FD +:10E90800000073280000731C0000732400007318B3 +:10E91800000073208001016A5CD91009E08600D1EB +:10E928006F7912185808E08900CCEF380026EDB846 +:10E938000002C081A3C8EF680026EF080058EF580E +:10E948000056300A4D39EF6A004E720BEF6A0054D8 +:10E9580072096F48EF490050F6080108EF09007284 +:10E96800EF580070F2080008EF09004AEF580072EB +:10E97800EF080048A358F2080008EF58004C6E480A +:10E988005838E0880066EF080056EF090058F0098B +:10E998001900E0880006EF09003C1009C0A8EF192B +:10E9A800003CB339F7D8C010F20B0C0AF408000980 +:10E9B8005C89F0091900E088004CEF590056C488BA +:10E9C8006C08EF030074EF48007C6C1CF01F0032E9 +:10E9D800F8031900C0E24B18201D1AD8E06803B3E9 +:10E9E8001AD84AF84AFC1AD8F01F002F2FCDC008B1 +:10E9F800EF0800705808C09020186C49F339000DD2 +:10EA0800EDB90000EFF80C38EF0300746C1CF01F30 +:10EA1800002218130C9CEF530074F01F0024EF0819 +:10EA28000074EA081900C1606FF85808C1316FE82E +:10EA38005808C1014998201D1AD8E06803BF1AD8A0 +:10EA480049B8498C1AD8F01F00182FCDC0084914AE +:10EA580030056FF65806C2D06C4811CBF139000D5D +:10EA6800F3D9C0025F1A11D9B169F3EB118911EB1F +:10EA7800F3EB108911F81248680912188CE9F409A7 +:10EA8800000912085808FE9AFF9DE08F045F0000F5 +:10EA9800000073248000CD0C8003AC608003ACA818 +:10EAA80080039D9C800094C48000DA3C8003ACD035 +:10EAB8003FF8EF58003A3008EF680038C5A830082A +:10EAC800EF580070C5686C08EF030074EF480078D1 +:10EAD8006C1CF01F0021F8031900C0E249F8201D42 +:10EAE8001AD8E06803E01AD849D849EC1AD8F01FB8 +:10EAF800001E2FCDC008EF0800705808C0902018DD +:10EB08006C49F339000DEDB90000EFF80C38EF034C +:10EB180000746C1CF01F001018130C9CEF53007449 +:10EB2800F01F0012EF080074EA081900C2406FF8DD +:10EB38005808C2116FE85808C1E14888201D1AD842 +:10EB4800E06803EA1AD848A8486C1AD8F01F0006EB +:10EB58002FCDC0088000CD0C8003AC608003ACA82A +:10EB680080039D9C800094C48000DA3C8003ACD074 +:10EB78004C5430056FE65806C2106C4811CCF13978 +:10EB8800000D11DAF3D9C002B16AF5EC118A11EC63 +:10EB980011F858095F1B6809F5EC108AF1EA100AA8 +:10EBA8008CE8F20A010AF6080008F4080108C066B1 +:10EBB8006F7810195809FE9AFF886F085808C29094 +:10EBC8004B196F1A7209F4090109C2374AFB760B0F +:10EBD800EF0A0048F6080108F40B140316185C88BD +:10EBE800F00A000A5C8AEF09004AF40B14035C4837 +:10EBF800EF5A0048F20A14021419F2080008F6083D +:10EC08000009EF58004AEF59004C3008EF4800401F +:10EC180049F84A09900A6EA8580AE0800381720BE5 +:10EC2800F60911FF1009E08600B15C7AF0C9FFFF10 +:10EC38001619F20A010A580AE08900A849697216E9 +:10EC48005806C0E14958201D1AD8E06804461AD869 +:10EC58004938494C1AD8F01F00142FCDC008F00BC2 +:10EC6800010BE04B7FFEE08A002348C8201D1AD81C +:10EC7800E06804471AD848D848AC1AD8F01F000AE8 +:10EC88002FCDC008000073240000821000007320FC +:10EC98000000731C000073348003AC608003ACF088 +:10ECA80080039D9C800094C48003AD008CD81638E6 +:10ECB800C3148C48F3D8C0101639C0E44AB8201DD4 +:10ECC8001AD8E06804491AD84A984AAC1AD8F01FEA +:10ECD800002A2FCDC0081618300A5C88C058AC48E6 +:10ECE800AC5A121B6C068CD91639CFA55C3B0C9C10 +:10ECF8005C8BF01F0022C21049C8201D1AD8E0689A +:10ED080004561AD849E849BC1AD8F01F001B2FCD61 +:10ED1800C0085C3B0C9C5C8BF01F0018C0E04938B5 +:10ED2800201D1AD8E068045B1AD84958491C1AD81B +:10ED3800F01F00112FCDC0086C1A4929932A492ABF +:10ED48006EA8740B926C9508F80B000A101AB26A38 +:10ED5800F00A16187249B2F8B2CAF5D8C208F1D842 +:10ED6800C108B2DAB2E8C1B88003AC608003AD1064 +:10ED780080039D9C800094C48000CDD48003AD2086 +:10ED8800000073340000731C101BC097EF38002676 +:10ED9800A1B80E9CEF680026F01F00424C256EA912 +:10EDA8006A08F009010AE08602B7F0CAFFFFEF1B04 +:10EDB800002C121A161A580AE08902AE1039E0819E +:10EDC80001F54BA8906A7048F139000DF3D9C002DB +:10EDD8005F19F40900094B6AB409EF0A002CF20A1A +:10EDE8001900C462F13A000CF139000DF3EA1089F8 +:10EDF8005C89EDB90000C081E219FFFEF169000DE0 +:10EE0800A989F169000C4A98EF0A002CB06A704988 +:10EE1800F339000DEDB90001C031201AB06A4A3645 +:10EE28008CEB6C1CF01F00238C696C48F138000DCA +:10EE3800F1D8C0025F18F208000849D9B20849A9F8 +:10EE480072095C78EF1A002C12086EA9F4090009FF +:10EE58001238C0E04988201D1AD8E068048B1AD8F7 +:10EE68004968497C1AD8F01F00172FCDC008EEF664 +:10EE780000805806E08000BE48C46848F138000D9C +:10EE8800EDB80000C080C4B8109C7008EF4800803E +:10EE9800F01F000DEEF800805808CF71CAA80000D6 +:10EEA80080010CEC0000731C000073340000732018 +:10EEB8008000D2108003AC608003AD3480039D9C39 +:10EEC800800094C48000DA3CF138000DEDB80000F1 +:10EED800C1F16848F139000DF13A000CF3EA108AE3 +:10EEE8005C8A1499A1A95C79F20B1608EDBA0001A5 +:10EEF800C0F0F169000DF16B000C68488869F138C1 +:10EF0800000DF1D8C0025F18F2080008A6086C05C9 +:10EF18000A96F01F00455805C041C6984C324C432C +:10EF28006C4811C5868A11D9B169F3E5118911E5D3 +:10EF38008CEBF3E510890C9C11F5EBE91009F40949 +:10EF48000109640A1409F20B010BCBF7E08F0201E7 +:10EF58004B89EEF80080704811FB11C511DC11E8EF +:10EF6800B16CF9E5118CF9E81088F7E81008F00A97 +:10EF7800010A5C8AB26A7248F138000DEDB80001E6 +:10EF8800C031201AB26A4AB58AEB6A1CF01F002AFF +:10EF98008A696A48F138000DF1D8C0025F18F20892 +:10EFA80000084A39B2085C784A097209F009000A6F +:10EFB800EEF80080704811FB11CC11D911E8B16945 +:10EFC800F3EC1189F3E81089F7E91009123AC0E067 +:10EFD80049A8201D1AD8E06804C31AD84988499C52 +:10EFE8001AD8F01F00192FCDC0080C95EF450080E6 +:10EFF80048F848E9908A7209F40900098FA990082D +:10F00800EF09002CF0091900C22248C8201D1AD89F +:10F01800E06804CD1AD848D848AC1AD8F01F000ABE +:10F028002FCDC0088000DA3C0000731C000073205C +:10F03800000073348000D2108003AC608003AD6C94 +:10F0480080039D9C800094C48003ADA810190E9C79 +:10F05800EF59002CF01F004A4CA8300A7019924B47 +:10F06800F40B1900C0504C8A9509300991194C5875 +:10F078007048F138000DEDB80000C5B14C3913885F +:10F08800A5B8B288C56881098CEAF13B000DF7DBA9 +:10F09800C0025F1BF60A000A14098FA9EF0A002CA8 +:10F0A800F138000D8C69F1D8C002F7D9C0105808A2 +:10F0B8005F1EF9DAC010FC0B000B163CC0E44B488D +:10F0C800201D1AD8E06804F21AD84B284B2C1AD8FD +:10F0D800F01F00322FCDC008F409010958085F1845 +:10F0E800F20801080E9CEF58002CF01F00256C1B3D +:10F0F8009648E2081900C090680C580CC040F01FF0 +:10F108000028C028890B8D126C48F138000DEDB825 +:10F118000000C0810B88A5B8AA886E485848EFF34C +:10F128000A046C080C9CEF480080F01F001EC07891 +:10F1380049D030014944300249453073EEF6008029 +:10F148005806C1006C4811CB11D9B169F3EB11898C +:10F1580011EB6EAAF3EB108911FBF7E910091439CA +:10F16800C930EF380026EDB80000C041A1C80E9C98 +:10F17800CE68A1A8EF680026D83200008000D5FE2E +:10F18800000073340000732C000073298003AC6006 +:10F198008003ADC880039D9C800094C48000CD345A +:10F1A8008000DA3C0000731C0E9CF01F0040EEF655 +:10F1B80000805806C0714BECF01F003EEF4C0080F9 +:10F1C800D8326A093005F2CCFFFF6C4811CB11DA4E +:10F1D800B16AF5EB118A11EBF5EB108A11FBF7EA2E +:10F1E800100A1439C1214B2C8C689869F009190050 +:10F1F800E08800B4F01F002FE08000B05805EBFC59 +:10F208001A00EFFC0A20C0D85805C0D1F20A010B39 +:10F21800C4574A7CF01F0027E08000A0EF4C008014 +:10F228000C9BC3986A4B17F417C217D317EBB1633B +:10F23800E7E21183E7EB108BE9EB100B5CDB120BB9 +:10F24800C2D6F80A010B580BE0890029498CF01F37 +:10F2580000191897E08000826A4811F911CA11DB79 +:10F2680011E8B16BF7EA118BF7E8108B4928F3EB3B +:10F27800100B70088AE9101916095809E08A000964 +:10F28800F00B010B6A1CAA6B5C7BF01F000C8B0750 +:10F298000C9B0E9CF01F000AD8326C0B0C95580B77 +:10F2A800C1001696C93B000080010BF000007334C2 +:10F2B8008000DA080000731C8000D2108000E7503C +:10F2C80014195809E08A004AF138000DEDB8000019 +:10F2D800C4404A3CF01F00238D0CC3F06C4811F960 +:10F2E80011CA11DB11E8B16BF7EA118BF7E8108B43 +:10F2F80049D8F3EB100B70088CE910191609580956 +:10F30800E08A002CF00B010B6C1CAC6B5C7BF01FD3 +:10F318000017D8320E9CF01F0016D832720BF60870 +:10F328000109C0A62FFBEF19002CF60801081218D6 +:10F338005808E08A00130E9CEF380026A1B8EF6841 +:10F348000026F01F000CD8323008FE9FFBB4580985 +:10F35800FE99FE00FE9FFE4BD83200000000733479 +:10F368008000DA080000731C8000D21080010BF0C6 +:10F3780080010CECD4314B86ED0800922FF87819F7 +:10F388004B65ED5800928B091388F1D8C004F20838 +:10F39800002818971693109C4B148908F01F003109 +:10F3A8006A080E9C118BF7DBC004A36B5C3BF01F53 +:10F3B800002EC0718E493138F0091900E08B000B1E +:10F3C8004A580E9CF109009A2FF9F159009AE08FDA +:10F3D80003026A0C069B2F0CF01F0024C0B16A0AB6 +:10F3E800FC19E000F5380010B968E618F00012388A +:10F3F800C0A149980E9CF10900A02FF9F15900A06D +:10F40800E08F02E9F4CBFFF48EC830692F0A0E9C16 +:10F41800F01F00175C8CC080ED0800980E9C2FF838 +:10F42800ED580098C11868080E9CF13B000CA58B9C +:10F43800F60B10FCF01F000CC1C0ED08009A0E9CE2 +:10F448002FF8ED58009AED0800962FF8ED58009621 +:10F45800E08F02C6000080D40000733000007318EB +:10F468008000D67C8000CDD48001255880011E2CD8 +:10F47800680811CA11D9B169F3EA118911EAF3EAE6 +:10F48800108911FAF5E91009F20A1618B0CAF5D967 +:10F49800C208B0F9B0DAF5D9C108B0EA4B28910929 +:10F4A8006808F1390008F13A0009B16AF5E9118AEA +:10F4B800F139000AF5E9108AF139000BF3EA100A6C +:10F4C800F4091618F1690008F3DAC208F16A000BAA +:10F4D800F1690009F3DAC108F169000A4A386804D9 +:10F4E800910AE938000DF5D8C002F1D8C0064A0BD8 +:10F4F800B6884A086A09580A5F1A8E4514055C8559 +:10F50800B00549D87006CA586C485808C0E149B8CF +:10F51800201D1AD8E06800B71AD84998499C1AD80B +:10F52800F01F00192FCDC00858A8C0E14938201D88 +:10F538001AD8E06800B81AD84948492C1AD8F01FD8 +:10F5480000122FCDC0085818C24148C8201D1AD82B +:10F55800E06800B91AD848E848AC1AD8F01F000A81 +:10F568002FCDC0080000731C00007324000073280E +:10F57800000073200000820C8003AC608003ADF0B3 +:10F5880080039D9C800094C48003AE188003AE4421 +:10F59800098A0998F1EA1088ED0A0024F00A19008E +:10F5A800C56109AA09B8F1EA1088ED0A001CF00A39 +:10F5B8001900C4D1F33A000CF338000DB168F1EA30 +:10F5C8001188F33A000EF1EA1088F33A000FF5E8D3 +:10F5D80010086C1A103AC3B1F33A0010F33800114E +:10F5E800B168F1EA1188F33A0012F1EA1088F33AA7 +:10F5F8000013F5E810086C0A103AC2916C380C3800 +:10F60800C0E14CA8201D1AD8E06800C21AD84C885E +:10F618004C8C1AD8F01F00482FCDC008580CC06079 +:10F6280099384C6870098D3991066C380C38E0812E +:10F6380001A14BE8201D1AD8E06800C81AD84C0868 +:10F648004BCC1AD8F01F003C2FCDC0080C9C6C3650 +:10F658005806FE91FF5BE08F05296C4858A8C0E06A +:10F668004B28201D1AD8E06800D21AD84B584B1CDA +:10F678001AD8F01F00312FCDC008098B0998ED0A60 +:10F688000024F1EB1088F00A1900C77109AC09BB16 +:10F69800ED08001CF7EC108BF6081900C6E1F33CE6 +:10F6A800000CF33B000DB16BF7EC118BF33C000E33 +:10F6B800F7EC108BF33C000FF9EB100B6C1C163CAD +:10F6C800C5C1F33C0010F33B0011B16BF7EC118B93 +:10F6D800F33C0012F7EC108BF33C0013F9EB100B22 +:10F6E8006C0C163CC4A1498B178CEDBC0002E08061 +:10F6F800013AEDBC0001C2D1494B6CAC760BF60C5B +:10F70800010CC2D6ED14002C081C580CE089002806 +:10F718005C7A201D5C751ADA48DCEA0B000B5C7811 +:10F72800F2CAFFF0780CC7688003AC608003AE6C47 +:10F7380080039D9C800094C40000820C8003AE98D6 +:10F748008003AEC4000073280000731C00007324FB +:10F75800EDBC0000C0414CC870088DD84CB8900969 +:10F768003008F0091900E08000FEED3800260C9CF6 +:10F77800A1B8ED680026CF486C365806FE91FF6F99 +:10F788004C3870050C98CF286A0A580AC130F33CE7 +:10F798000010F33B0011B16BF7EC118BF33C001236 +:10F7A800F7EC108BF33C0013F9EB100B163AE081E1 +:10F7B80000DC09AB09BAF5EB108AEB0B001CF40B63 +:10F7C8001900E08100D25808C0706A3991394B0895 +:10F7D80070098B3991054AF81188EDB80004C1F118 +:10F7E8004AD8700913AB139A13B8201D1389F1EB8B +:10F7F8001088F5E910894A5B1AD9968C4A794A8BA0 +:10F808007209760BF2CAFFF0F80B000B4A5C780C11 +:10F818002FFC2F49F01F00242FEDCA48EDB8000136 +:10F82800E08100A1EB3C0014F01F00201896C08175 +:10F8380049F8F109009C2FF9F159009CC938497819 +:10F848007008F0C9FFF0C0311298C108F1390013EF +:10F85800F13B0010F13A0011F1380012B16AF5EBF2 +:10F86800118AF5E81088F3E810088D08EB08001CE9 +:10F87800ED58001C48987008F0C9FFF4C1A112980F +:10F88800C27800000000821000007320000082147B +:10F898000000732800007318000073300000731C08 +:10F8A80000007324800102348000E1D4000080D479 +:10F8B800F139000FF13B000CF13A000DF138000E60 +:10F8C800B16AF5EB118AF5E81088F3E810088D188D +:10F8D8004C587008118B1199F3EB1089ED590024DD +:10F8E80030398D494C197209F2CBFFFF8DCB8DABA6 +:10F8F800F13B000FF138000EF7E81088ED5800587A +:10F90800ED5800608A48E2180199AC486A684B8A49 +:10F918002019740C8D688D3C6A889506ED49006441 +:10F928008D880C9CF01F0033ECCBFFFCED1C003CD9 +:10F93800F01F00313019ED5C003C201D30081AD949 +:10F94800109A3129109B0C9CF01F002C2FED5C5C49 +:10F95800C0600C9C300BF01F002AC0480C9CF01FA4 +:10F9680000290E9CC3C80A986A355805FE91FF0EF7 +:10F9780049D56A08F13C000DF9DCC006F01F0022E9 +:10F988005806E08003504A188E4A6A09911791492F +:10F99800B06A30096E1A9109912A49D8910949D853 +:10F9A800B089ECFA0084580AC3C0ECF8008C5808F7 +:10F9B800C0500C9B6C6C5D18C06810990C9B109C17 +:10F9C800F01F00155C5CC041ED4C0084C2A80E9C81 +:10F9D8004928F10900962FF9F1590096F01F0010F7 +:10F9E800D8320000000073180000731C0000820C5D +:10F9F8008000E6B48000D95C800103508000E124D7 +:10FA080080010CEC8000D67E000073340000732C5B +:10FA1800000073298000E5EC000080D48000D13C10 +:10FA28004A9891064A981188EDB80002C3216C489B +:10FA38005828C0814A6870096D781039E081026BD6 +:10FA4800C1D84A49720A6CA9F4090109E08602631F +:10FA5800ED1A002C14195809E089025DE08F032182 +:10FA680049D8201D1AD8E06802271AD849B849CCC5 +:10FA78001AD8F01F001C2FCDC00849B91388A3B8A5 +:10FA8800B288ED380026A1C8ED680026E08F024351 +:10FA9800EDB80001C0616C4820285818E08B00A21E +:10FAA800492870088DD830080C9CED6800ADF01F0F +:10FAB80000106C4820285878E08B022D48D9F208AD +:10FAC800032F000000008224000073280000732424 +:10FAD8000000731C8003AC608003AEF480039D9C1F +:10FAE800800094C400007329000082108000E6B4EE +:10FAF8008003AC404CF811891298E218001259287A +:10FB0800C7A14CD8700A6DF8704811FB11C711DCF9 +:10FB180011E8B16CF9E7118CF9E81088F7E81008DA +:10FB28002FF8103AC681ED0800722FF8ED580072D0 +:10FB38004C287008ED4A0050F0CA00012FF88DC813 +:10FB48008DA84BF87008F139000FF138000EF3E872 +:10FB58001088ED5800603048ED4A00648D48EC0884 +:10FB6800000BED1C003CF01F00375C8CF808100AF5 +:10FB7800ED5C003CED580058ED0900563018F009CE +:10FB88001900C021A17CED5C0056ED0800745808EE +:10FB9800C0E14AD8201D1AD8E06802591AD84AB8D4 +:10FBA8004ABC1AD8F01F002B2FCDC00820186DFCB6 +:10FBB800ED5800747808ED48007C5808F9B800FF43 +:10FBC800F9B80100EDF81E4EED58003AF01F00227A +:10FBD800ECF800905808C050300A0C9B6C6C5D180B +:10FBE800ED380026A1B80C9CED680026F01F001B1C +:10FBF800E08F0191EDB90004E081018D4908700999 +:10FC080013AB139A13B8201D1389F1EB1088F5E98B +:10FC18001089493B1AD9968C4929488B7209760B69 +:10FC2800F2CAFFF0F80B000B483C780CC7980000AC +:10FC380000007328000073240000731C0000731870 +:10FC48008000D95C8003AC608003AF1480039D9C66 +:10FC5800800094C48000DA3C80010CEC0000732022 +:10FC6800000073304C281188EDB80004C5E14C1829 +:10FC7800700C6D485CD81808C3D66D78F808010870 +:10FC88005808E089003830488D486C885808C0E129 +:10FC98004B98201D1AD8E068027E1AD84B784B8CF6 +:10FCA8001AD8F01F00382FCDC008300A0C9B6C6C96 +:10FCB8005D185C5CC0700C9C301BF01F0033E08F3B +:10FCC80001A7ED0700560C9CF01F0030ED080070EE +:10FCD8005808F9B901FFF1D9E108EDF81C383019D5 +:10FCE800ED08003CF2071900C021A178ED58005634 +:10FCF800C2E84A78700913AB139A13B81389F1EB69 +:10FD08001088F5E910894A3B201D1AD94A29968797 +:10FD180072094A2BF2CAFFF0760BEE0B000B2F4943 +:10FD2800F01F001F2FEDCF68EDB80001E08100F350 +:10FD380049A870096CA820181039E08100EC0C9CC7 +:10FD4800F01F0018CE780C9CF01F0010496811882D +:10FD5800EDB80005E08100DFED380026A1B80C9C65 +:10FD6800ED680026F01F00113078CC1800007328C9 +:10FD7800000073248003AC608003AF2C80039D9C3B +:10FD8800800094C48000E1248000E7F40000731828 +:10FD980000007320000073300000731C80010234DF +:10FDA800800101000000732980010CEC0C9CF01FFD +:10FDB800003E4BE84BE91188E2180020C2D01388B6 +:10FDC800EDB80004C1F14BB870096D781039C1A1C4 +:10FDD800ED380026A1B80C9CED680026F01F00360F +:10FDE8000C9CF01F00364B6972080C38C5604B59E3 +:10FDF8009308C05870390C39C69012985808CFB17A +:10FE0800C6D8ED380026A1B80C9CED680026F01F76 +:10FE1800002A3088C6C81388EDB80004E081007B4A +:10FE28004A4870096D781039C7513068C6080C9C6B +:10FE3800F01F001D49D81188EDB80005C6B1ED388E +:10FE48000026A1B80C9CED680026F01F001B0C9C36 +:10FE5800F01F001A49A972080C38C1F04999930893 +:10FE6800C05870390C39C32012985808CFB1C368EC +:10FE78000C9CF01F000D48E81188EDB80004C4A1DF +:10FE880048C870096D781039C4510C9CF01F000BDC +:10FE980048B972080C38C0316C38C21848999308B0 +:10FEA800C1B800008000E7F400007329000073283F +:10FEB8000000732480010CEC8000DA8C0000820CB6 +:10FEC8000000821870390C39C0614C0993086C39EC +:10FED8009139C06812985808CF614BC99308300807 +:10FEE8008D384BB870098D39910630A88D48C128D6 +:10FEF8000C9CF01F00384B881188EDB80004C0A195 +:10FF08004B6870096D781039C0514B591388A5A8F2 +:10FF1800B2884B381188EDB80003C091ECF800980E +:10FF28005808C0803FAB6C6C5D18C048EDB8000441 +:10FF3800C0A10C9B4ABCF01F002C0C9B302CF01F5E +:10FF4800002BC658ED0A0070580AC090ECF80088DB +:10FF58005808C0505C7A0C9B6C6C5D184A48700855 +:10FF68005808C24049C91389EDB90003F1F9080DD1 +:10FF7800F9BA0001F3DAE039F1F90E0D49CAECF8E3 +:10FF8800008C5808C070740A30090C9B6C6C5D18A2 +:10FF9800C0781099740A0C9B109CF01F00165C5CCA +:10FFA800C05049387008ED48008448D81188EDB829 +:10FFB8000005C271ECF8008C5808C1D030090C9BC0 +:10FFC800129A6C6C5D18C1D800008218000082205B +:10FFD8008000E7F4000073280000732400007329F0 +:10FFE8000000820C8000DAE88000C9740000732CDD +:08FFF8008000E5EC10990C9B60 +:02000004800179 +:10000000109A109CF01F002E30094AE80C9C9109B0 +:10001000F01F002D30064AB891064AC76E1C580CD6 +:10002000C330F01F002B8F16C2F86A0BF738000D93 +:10003000EDB80002C2604A78F10C00A02FFCF15C20 +:1000400000A0F10C00962FFCF15C0096179C17A6FF +:1000500017B8178BF9EB108B201D49F972091ADBC1 +:1000600049EB968CF2CAFFF0F1E6108849CB2F4994 +:10007000760BF80B000B49BC780CF01F001B2FED22 +:100080000E9CF01F0013F01F0019C1714988201D3C +:100090001AD8E06801771AD84968497C1AD8F01F45 +:1000A00000172FCDC0085808FE90FCE0FE9FFCEB27 +:1000B00049387006FE9FFB67D83200008000E5ECEF +:1000C0000000822480010CEC000073348000D13CDD +:1000D000000080D400007330000073200000731C07 +:1000E00000007324800102348000D6B48003AC6029 +:1000F0008003AF4080039D9C800094C40000822058 +:10010000D42179F95809C3107208F8CEFF88F9484C +:10011000007C79E8C038109E70085808C1C0704B48 +:1001200017F617C417D5B165EBE41185724A17EBC2 +:1001300015F7EBEB108B15C5EDEB100B15D615EA8B +:10014000B166EDE51186EDEA108AEFEA100AF60ACB +:10015000010ACE2693089D093008F9480040F93875 +:10016000004E2FF8F968004ED822D42179F95809A9 +:10017000C600F9380026EDB80002C5B07208F8CE06 +:10018000FF88F948007C79E8C038109E700858084C +:10019000C1C0704B17F617C417D5B165EBE41185D4 +:1001A000724A17EB15F7EBEB108B15C5EDEB100B47 +:1001B00015D615EAB166EDE51186EDEA108AEFEA8B +:1001C000100AF60A010ACE26930830089D09F9485C +:1001D0000040F938004E2FF8F9090056F968004E32 +:1001E000F5D9C02FF9080060F7D8C02FF009190021 +:1001F000F60817B0F4081780F9580058F908003CC1 +:10020000F00915015C78A178F91A0058103AF9F94B +:100210005C2CF9380026A3A8F909003CF9680026EF +:10022000F20815011009F90800581009F95900568B +:10023000D822D703D43118941693149112921096A1 +:100240004097300A314B301CF01F00391895C6D04A +:1002500098593138F0091900E08B000F4B58201DD8 +:100260001AD8E068031F1AD84B384B4C1AD8F01F25 +:1002700000342FCDC0080E9878175C78AEB8A988E6 +:10028000AEA8E0685014EF68000DA988EF68000C74 +:10029000E8081618AEC8F1D4C208AED8E608161899 +:1002A000EF680008F1D3C208F3D6C010EF68000968 +:1002B000AE993088A9893006AEF4EF63000BAE89A1 +:1002C000EF66000FEF660012EF660013EF66001096 +:1002D000EF660011EF68000E3069049A029BE9D4C2 +:1002E000C108E7D3C108AEE4EF63000A98C8F01F65 +:1002F00000155C7CEF6C0011A98CEF6C0010201DC8 +:10030000491C30671AD70C98F9070090049A2FF708 +:10031000029BE06900FFF95700900A9CF01F000B58 +:100320000A9CF01F000B2FEDD83200008000D3187C +:100330008003AF5C8003AFA480039D9C800094C4C5 +:1003400080011E2C000080D4800122948000D13CCA +:10035000D43120BD14915098414A505A12961897A2 +:100360003009F20119005F08F20A18005F0AF1EA89 +:10037000000AF20A1800C110F3D6C002C0E14C789E +:10038000201D1AD8E06800AD1AD84C584C5C1AD819 +:10039000F01F00452FCDC008580B5F195089126817 +:1003A000C0E04BE8201D1AD8E06800AF1AD84BF81F +:1003B0004BCC1AD8F01F003C2FCDC008EF080072BC +:1003C000E2081900C0B2EF380026EA18FFFFE8186B +:1003D000FF80EF680026E08F02E34058F3D8C001A9 +:1003E000E2180002F9B8010CF009002950296FB099 +:1003F000EF02007431F8F0021900E08800144AC8D6 +:10040000F109009C2FF9F159009CE06C00FFEF38D6 +:100410000026EA18FFFFE818FF80EF680026E08F4B +:1004200002C36FF85802C2605808C1404028A38830 +:100430002FB8AD685C883003503B50A8F7D1B0109E +:10044000409A504BF5DAC001069406980695506A1A +:10045000C3796FE85808CEB14908201D1AD8E06862 +:1004600000D01AD8493848FC1AD8F01F000F2FCDF9 +:10047000C0085808C0416FE85808CD904878201D42 +:100480001AD8E06800D31AD848B8486C1AD8F01FB8 +:1004900000062FCDC00800008003AF5C8003AFD4FE +:1004A00080039D9C800094C48003B028000080D409 +:1004B0008003B0688003B0A450195008EF03003CDB +:1004C000304CF01F0042401918954008E080023C73 +:1004D000300B990B991B5809C0301894C118580853 +:1004E000C0E14BB8201D1AD8E06800EF1AD84B982D +:1004F0004B9C1AD8F01F00392FCDC008910C5C73AB +:10050000402A4069E60A010840435C73E6080D434F +:100510005C835809C3904028300AE608000B149CFD +:100520005C7BF01F002F8B1CE080020EF5D3C01007 +:10053000402B98D9F40B00081039C0E44A48201D1C +:100540001AD8E06800FF1AD84A684A3C1AD8F01F47 +:1005500000232FCDC008501AF01F0023401A18980E +:1005600040895809C0A0402B6A195008721C160C0B +:10057000403BF01F001E4008F00200026A185C8237 +:1005800070188B28C3D8406A402B149CF01F0014AD +:100590008B1CE08001D9F01F0014407AF8020002A1 +:1005A0005C82580AC2D0F7D3C010301A303CF01F1A +:1005B000000C189B6A1C580BC1C1F01F000D40694C +:1005C0008B19E08F01C100008000C9D48003AF5CAB +:1005D0008003B0D880039D9C800094C48000D31811 +:1005E0008003B0E88000CD0C8002E7368000D13C6B +:1005F000403897182FF28B285C82F01F003F320B97 +:10060000F6021900E08B01A0AA63314B6A1CF01FAF +:10061000003BC0904BA8F10900A42FF9F15900A4A8 +:10062000E08F0192EF39001C6A1870188B48B0896E +:10063000EF39001DB099EF3900246A48B0A9EF39AD +:100640000025B0B9E00916186A48B0C9F3D0C2084D +:10065000B0F0B0D9F3D0C108B0E96A48F16C00132A +:10066000F16C00126A48F13A000CF139000DF3EA1E +:100670001089E019FFC0EDE910095C79F169000DFE +:10068000A989F169000C405AEB6A000E404806182F +:100690005C88F3D3C0105048403B6A48120B503B73 +:1006A00040AA1200F139000DF3D9C006F5E910098E +:1006B0005C79F169000DA989F169000C0A98300A8A +:1006C000404BF40B19005F1B507B169A58045F09CE +:1006D000300B124AF60A1800FE91FEF0F5D2B01067 +:1006E000503A6FE05800E08000C260085808C0909F +:1006F0001090CFCB8000CD348000CDD4000080D4CA +:1007000080EA6048F139000DF3D9C0025F1B140B79 +:10071000E08000C45809E08100C1F7D6C0025F0C38 +:10072000301BF60618005F0BF9EB100BF20B1800EC +:10073000E08000B488EBEF19003C140B123BE08919 +:1007400000ADE13B000EE939000EF20B1800E0812C +:1007500000A5684911FE13FB504B11CC11DBB16BA6 +:10076000F7EC118B11ECF7EC108BFDEB100B160A6C +:1007700013CB13D8B168F1EB118813EB4049F1EBBF +:100780001088F3E81008103AE08100884028681CBF +:10079000F00B11EC5C8BF01F0037C0E04B68201DA4 +:1007A0001AD8E06801691AD84B484B5C1AD8F01F78 +:1007B00000352FCDC0086818905AF80A1900C0A15A +:1007C00070098919910C4032109C20125C82F01F34 +:1007D000002EF1D6C001681BC220580BC05188689A +:1007E000F6081900C0E04A48201D1AD8E0680177D1 +:1007F0001AD84A684A2C1AD8F01F00222FCDC008F8 +:100800006048F13A000CF139000DF3EA1089A1A912 +:10081000F169000DA989F169000CC1E8580BC050BD +:100820009659F0091900C0E14938201D1AD8E0682E +:10083000017A1AD84968492C1AD8F01F00122FCD16 +:10084000C008601CF01F001380698868F208000867 +:10085000A068680881080835E0051700E1F3020682 +:10086000089B304CF01F000CC198EF440078C16821 +:100870008000CDD48003AF5C8003B11C80039D9CBD +:10088000800094C48000D13C8003B1308003B1501B +:100890008000CD348000C97481040C98EDB600014D +:1008A000C040EDB60000C0312FF15C81EDD6C00133 +:1008B000EFF81826F9B90120F1D9E138EFF81E2632 +:1008C0006FB9F1D1C010F2080008EF520074EF4880 +:1008D000006CEF0800720218EF5800725802C14015 +:1008E0006FF85808C1116FE85808C0E14AF8201D98 +:1008F0001AD8E06801A11AD84AD84AEC1AD8F01FD1 +:10090000002E2FCDC00858055F193008F0031900DC +:100910005F1AF5E90009F0091800C4406A48580850 +:10092000C410409CE21C0002C3D1F13A000CF13922 +:10093000000DF3EA1089A3B9F169000DA989F169E5 +:10094000000CC318EF380026EA18FFFFE818FF80F4 +:10095000EF6800264998F109009C2FF9F159009C95 +:100960005804C040089CF01F0016EF0900743008BE +:10097000F0091900C1406FF85808C1116FE8580814 +:10098000C0E148A8201D1AD8E06801B41AD84888E8 +:10099000488C1AD8F01F00082FCDC008E06C00FF6B +:1009A000C028300C2F5DD8328003AF5C8003B16467 +:1009B00080039D9C800094C4000080D48000DA688D +:1009C000D421784E1298587E5F07584E5F09EFE9A0 +:1009D0001009C081582EC060583EC040E06C00F83D +:1009E000D822580AC031149CD822201D30095C7AC4 +:1009F0001AD9F01F00032FED5C5CD8228001035050 +:100A0000D4013008201D109A16991AD8149B30185A +:100A1000F01F00032FED5C5CD80200008001035042 +:100A2000D431189679F45804C05179E45804E08020 +:100A300000CE6848F133000DE7D3C001C06088697B +:100A40003008F00919005F03300A5C53301C14337E +:100A5000F9BB0114F9BB0015F01F005D1895E0808B +:100A600000B698593138F0091900E08B000F4D9805 +:100A7000201D1AD8E068040F1AD84D784D7C1AD87A +:100A8000F01F00572FCDC008684811FA11CB11D9BB +:100A900011E8B169F3EB1189F3E81089ED38001C16 +:100AA0007817F5E91009AE88EF3A000CED38001D13 +:100AB000AE98EF38000DF1EA1088ED3A0024AEAAA6 +:100AC000ED3B0025AEBBF20B1618AEF9AECBF7D955 +:100AD000C208F3D9C108AEDBAEE9ED390028EF69F1 +:100AE0000008ED390029EF690009ED39002AEF69A6 +:100AF000000AED39002BE018FFC0EF69000BA5A834 +:100B00005C88F5D8C010EF6A000DF40B1608EF6B87 +:100B1000000CED39002EEF69000EF1D8C006300947 +:100B2000E8185000ED3A002F5C78EF6A000FEF688C +:100B3000000DEF690011EF690012EF690013EF6912 +:100B40000010A988EF68000CED19002E6CA8F208BF +:100B500000088DC85803C110EF39000CEF38000DA4 +:100B6000F1E91088E018FFC0E8180011EF68000DE7 +:100B7000A988EF68000CC068682811897818F169A5 +:100B80000014ECC4FFFC8AC83069089A0C9B0A9CCC +:100B9000F01F00145C7CEF6C0011A98C4929EF6CEC +:100BA0000010F30C00902FFCF35C0090306C201DC3 +:100BB000ED39000B089A1ADC0C9B30080A9CF01FD8 +:100BC000000B0A9CF01F000A2FEDD8328000D318CA +:100BD0008003AF5C8003AFA480039D9C800094C41D +:100BE00080011E2C000080D4800122948000D13C22 +:100BF000D431300A1895314B301CF01F003918934E +:100C0000C041E06C00FED832EB380026EB39001C06 +:100C1000E018FFFCEB6800266B787817AE89EB399B +:100C2000001DAE99EB390024F00B1618AEA9F3D8CD +:100C3000C208EB3A0025AEF8F1D8C108AECBAEBA87 +:100C4000AED9AEE86AA8F0091618EF690008F3D823 +:100C5000C208E06A5010EF690009F3D8C1083004F7 +:100C6000EF68000BEF69000AF40B1608EB19002E71 +:100C7000EF6B000CEF6A000DEF69000FEF640012DC +:100C8000EF640013EF640010EF640011F20A16081D +:100C9000F2080008EF6A000E8BC8EAC6FFFC0A9B48 +:100CA0000C9A98C83069F01F000F5C7CEF6C001143 +:100CB000A98CEF6C0010306CEB38000AEB39000B9C +:100CC000201D0C9A1ADC0A9B069CF01F0007069C4C +:100CD000F01F0006089C2FEDD83200008000D318CA +:100CE00080011E2C800122948000D13CD431202D23 +:100CF0004AE8189770081838E08001A3F9080056F0 +:100D0000F9090060F0091900F20817805C785008B2 +:100D100079E6F9380026E2180002C1E05806C170F1 +:100D20008CEB6C48794911CCF609010911DBB16BE8 +:100D3000F7EC118B11FA11E8F7E81088400BF5E891 +:100D40001008F20800081638E08800070E9CF01F13 +:100D500000185C5CC7696FF55805C0B1EEC9FF8427 +:100D6000EEC2FFFC5019300349214930C2B9109539 +:100D70006A085808CFD1CF3BF13C000CF139000D87 +:100D8000F3EC108C5C8CEDBC0002C1F148B8201D66 +:100D90001AD8E06802471AD8489848AC1AD8F01F09 +:100DA000000A2FCDC00800000000822480010BF053 +:100DB000000080D4000082108003AF5C8003B18407 +:100DC00080039D9C800094C46FF95809C150EF3B8B +:100DD00000261699E2190044C0F16FE95809E08035 +:100DE0000133720E580EC081926EEF09003CF20E74 +:100DF0001900E08301296C09EF4900786E495829F0 +:100E0000C0E0A5AC5C7CF16C000DA98CF16C000C11 +:100E1000EF390026E019FFFCEF6900266EA9F20AFF +:100E20001618F16A0008F5D9C208F16A0009F5D967 +:100E3000C108F169000BF16A000AEF1A002EF16A8D +:100E4000000FF40B1608F16B000EF40900098FC9AE +:100E5000ED39000EEDB90000C061E06B0200EA1B45 +:100E60000204915BEF08003A3FF9F2081900F9B863 +:100E70000000EFF80C1D6E085808C071049CF01FAC +:100E80000075C45078188F086F085808C121600990 +:100E90006C48EF49004011F911CB11DA11E8B16A41 +:100EA000F5EB118AF5E81088F3E81008EF480044E4 +:100EB0006C1C6C4478199848985A9914E8090109EF +:100EC000121A1218B85AB84830695C78049A0E9B06 +:100ED000E9630010E9630011F01F005F30695C7C7A +:100EE000E96C0011A98CE96C0010E30800902FF860 +:100EF000201DE35800901AD9049AEF38000AEF3900 +:100F0000000B0E9B6C1CF01F00552FED6C4811FA66 +:100F1000F139000DF3D9C0025F1B11CC8CE9F60941 +:100F2000000911DB11E8B16BF7EC118BF7E81088C1 +:100F3000F5E810086F7AF2080008101AC037EF4879 +:100F4000005C5809C3B08D036FF85808C041EF46E4 +:100F5000007CC3286C4A15FE15C46A4915DBB16BC9 +:100F6000F7E4118B15E4F7E4108BFDEB100B13CEB7 +:100F700013FC13DAB16AF5EE118A13EEF5EE108A5E +:100F8000144CF60C010CC177401AC058109A700826 +:100F90005808C0E0704913C413FC13DEB16EFDE4C1 +:100FA000118E13E4FDE4108E1C4C161CCF068D0828 +:100FB0009506C0788B060C95C0480C9CF01F002845 +:100FC0006FE65806C3706C4811CC6F4A8CEB11D990 +:100FD000141BB169F3EC118911ECF3EC108911FCCD +:100FE000F9E91009F6090009400B1639FE98FEC60A +:100FF000EF3900AC3008F0091800C1C18CEB6C4827 +:10100000F60A010A11F911CC11DB11E8B16BF7EC0A +:10101000118BF7E81088F3E81008100AEF18006049 +:10102000103AF9B80B00EFF8BA2AF9B80B01EFF84B +:10103000BEACEF380026F1D8C007EF680026300CB0 +:101040002FEDD832E21B00A0FE91FED7CD2B000081 +:101050008001222880011E2C800122948000DA3C2D +:10106000D401189879FA580AC170149B7609580966 +:10107000C030129BCFCB71EC970CF1490040F14985 +:10108000007CF139004E2FF9F14A0078109CF1698B +:10109000004EF01F0002D80280010CECD431300A5F +:1010A0001896314B301CF01F00401895C7B0985966 +:1010B0003138F0091900E08B000F4BC8201D1AD8F9 +:1010C000E06803C91AD84BA84BAC1AD8F01F003AF5 +:1010D0002FCDC008ED39001C78176D78AE89ED3939 +:1010E000001DAE99ED3900242018AEA9F00B16189A +:1010F000ED3A0025F3D8C208AEF8F1D8C108AECB5E +:10110000AEBAAED9AEE86CA8F0091618EF690008BF +:10111000F3D8C208E06A5010EF690009F3D8C1089B +:101120003004EF68000BEF69000AF40B1608ED19A4 +:10113000002EEF6B000CEF6A000DEF69000FEF64FB +:101140000012EF640013EF640010EF640011F20A64 +:101150001608F2080008EF6A000E8DC8ECC3FFFC09 +:1011600098C83069069A0C9BF01F00145C7CEF6CE9 +:101170000011A98C4929EF6C0010F30C00902FFC92 +:10118000F35C0090306C201DED39000B08981ADCE0 +:10119000069A0C9B0A9CF01F000B0A9CF01F000A89 +:1011A0002FEDD8328000D3188003AF5C8003AFA44A +:1011B00080039D9C800094C480011E2C000080D47C +:1011C000800122948000D13CF9390010A3C948A8BD +:1011D000F969001011BA118B119911A8B169F3EBDB +:1011E0001189F3E81088F5E8100899183008F958C3 +:1011F00000145EFC8003B409997A996B5EFCD703F6 +:10120000D421301CF01F00071897C080320A300B21 +:10121000F01F00053FF8EF68000B0E9CD82200007D +:101220008000C9D48002E8BCD40148C9189B720868 +:101230001838C0D178389308C0C870395809C060D0 +:101240001639F7F90003F1F90A0370385808CF612D +:10125000301CF01F0003D802000082288000C974EF +:10126000D4214AB83009700E1C98C148103CC111F5 +:101270005809C0E04A78201D1AD8E06802541AD8EC +:101280004A584A6C1AD8F01F00262FCDC0083019D2 +:1012900070385808CEC1580BC0C017B817861797BA +:1012A00017ABB167EFE61187EFEB108BF1EB100B8B +:1012B000990B580AC2211C98E06A1000E0667FFF73 +:1012C0003007C0C8F10B0012F40B1900C061F6CA58 +:1012D000FFFF1C985C8AC0287038EC0A19005F1563 +:1012E00058085F1BEBEB000BEE0B1800CEC1580843 +:1012F000C040E06C00F5D822F95A00125809C0200D +:10130000D82A993E4828910C129CD82200008228A5 +:101310008003B19C8003B1E080039D9C800094C455 +:10132000D4213008169614951897F9090012F0097F +:101330001900C071300A189BF01F00145C5CC231A8 +:101340005806C0C00DB80D8A0D990DA6B169F3EA13 +:101350001189F3E61086F1E61006EF380010A3A815 +:101360008F16EF680010EF55001448987008109C15 +:10137000C0581837C021D82A783C580CCFB18F38C4 +:1013800048389107D82200008001126000008228AE +:10139000D43112971093169414911895F9090012EC +:1013A0003008F0091900C091300A189BF01F004561 +:1013B000E5DCC008E0810084308B089CF01F00420F +:1013C000C0310896C0E8300A308B301CF01F003F57 +:1013D0001896C041E06200FFC728089BF01F003C40 +:1013E0008C593078F0091900E08B000F4B98201DC4 +:1013F0001AD8E06801C51AD84B784B8C1AD8F01F60 +:1014000000382FCDC008EB3900120E986C175C78AD +:10141000AE893009EB3A0013AEB8AE9AA988AEF99E +:10142000AEE9AEA86A085808C041E6C2FFFCC10890 +:1014300066191238C0C00836C041E06200F7C3F830 +:101440000C9CE06200F7F01F0027C3980A928CC83A +:10145000F0091608AED8AEC9EB390010EDB900009E +:10146000C1403119029A049B0C9CF01F001F5C8C38 +:10147000F1DCC010AEF8A988AEE8580CF9B800FF4E +:10148000EFF80E07EFF80E0631181AD3049BEB396C +:10149000000B029A1AD80C9CEB38000AF01F0013BC +:1014A0002FEDE5DCC0080836C0400C9CF01F000D95 +:1014B00048F8F10900782FF9F1590078049CD832E6 +:1014C000800112608000CDD48000D3188000CDB49C +:1014D0008003B19C8003B1EC80039D9C800094C488 +:1014E0008000D13C80011E2C80012064000080D44B +:1014F000D421202D1897501B149C500A1296F01FCF +:10150000000C401B1898400AC0A148A8E06C00FCE1 +:10151000F10900862FF9F1590086C078F3D6C01082 +:101520000E9CF01F00055C5C2FEDD8228001222864 +:10153000000080D480011390D401F8CAFFFCF9198F +:101540000014F01F00035C5CD8020000800114F05E +:10155000D431203D4D98F109007A2FF9F159007AE4 +:10156000781716910F8818955C8898CAF3D8C0042C +:101570002FE9A369123AC0A5F1D8C004F00B1502F7 +:101580005C3BF01F004F1894C0904CC80A9CF109B6 +:1015900000822FF9F1590082C1D96A12EECCFFF016 +:1015A000029B502CF01F004705980583F1E3108340 +:1015B00005B805AE1896F1EE108E5C835C8E34484B +:1015C000F00E1900C2413438F0031900E081008B9D +:1015D00062A85808E080008770145804E0800083F7 +:1015E00068185808E0800092EF3A000CEF39000DBF +:1015F000B169F3EA1189EF3A000EF3EA1089EF3A84 +:10160000000FF5E910091238C6D1C7F84AE8089961 +:10161000700A089B1498500AC618F10C0012FC0CB2 +:101620001900C5A15806C041700C580CC1B0EF306C +:101630000010EF3C0011B16CF9E0118CEF3000129A +:10164000F9E0108CEF300013F60618005F1AE1EC99 +:10165000100C700018305F0CF5EC100CF60C180034 +:10166000C3B05804E08100D6F13C0010E21C000435 +:10167000F0041700CCE8701C580CC150EF3A000C75 +:10168000EF30000DB160E1EA11805010401AEF30E8 +:10169000000EF5E010805010EF30000F401A14409B +:1016A000003CC1A1400A10945809C0F0703893382A +:1016B000893A48589104C148000080D48000CDD4B4 +:1016C00080012558000082284C88F109008E2FF9EE +:1016D000F159008EC058109970385808C9F1580453 +:1016E000C141EF3A0010EF380011B168F1EA1188FA +:1016F000EF3A00126219F1EA1088EF3A0013F5E8A8 +:1017000010081039C6D1300405F805E9F1E9108850 +:10171000C130402A8AC83119EECBFFF40A9CF01F71 +:1017200000345C8CC0904B180A9CF10900802FF9A2 +:10173000F1590080C4F83F8B0A9CF01F002EC0E0D6 +:101740004AD8201D1AD8E06801141AD84AB84ACCE1 +:101750001AD8F01F002C2FCDC0085804C0D06866DE +:101760005806C3E0089BF1D3C010EEC9FFF40A9AF3 +:10177000687C5D16C5585806C261EF380010FC1928 +:10178000E000B968E618F0001238C1D00F8B0A9C4F +:10179000F7DBC0042FEBA36BF01F00166A180E389E +:1017A000C0E04958201D1AD8E068012F1AD84968AE +:1017B000493C1AD8F01F00132FCDC008303B0A9CBB +:1017C000F01F001248980A9CF10900882FF9F1597E +:1017D0000088F109007E2FF9F159007EC0280A9C8B +:1017E000F01F000BC1D80000000080D480011E2C27 +:1017F0008000CDD48003B19C8003B11C80039D9CEC +:10180000800094C48003B21C800118FC8000D13C8D +:10181000F10C0014E60C1900FE91FF5FC2DB2FDD16 +:10182000D8320000D431189316921494324B300AF7 +:10183000301CF01F00241897C43098593238F00932 +:101840001900E08B000F4A08201D1AD8E068012E0D +:101850001AD849E849EC1AD8F01F001E2FCDC0084D +:101860007816661531CAAC94AC823004ACC4ACD4E2 +:10187000ACE4ACF4661B781C2F8CF01F00170C9C9A +:10188000ACA4ACB48EDBF01F00155C7CACBCA98CA6 +:10189000ACAC201D492C30161AD60898F906006009 +:1018A000EACAFFF4E06900FF089B2FF6F9560060D2 +:1018B0000E9CF01F000C0E9CF01F000B2FEDD83279 +:1018C0008000D3188003B2308003B27880039D9CDF +:1018D000800094C48002E73680011F4A000080D453 +:1018E000800122948000D13CD401F5DBC00830BBDC +:1018F000F01F0002D802000080011824D401F5DB9B +:10190000C008303BF01F0002D802000080011824FC +:10191000D4314C62E50800622FF81694E558006255 +:10192000781618970D85EBD5C004A365EA0311005E +:101930005C83069BF01F003EE08101788E493038C1 +:10194000F0091900E08801726E1811893088F009D9 +:101950001800E081015DED380010ED310011B1613A +:10196000E3E81181ED380012E3E81081ED3800134F +:10197000089BF1E11001ECCCFFF0F01F002EC071CC +:10198000E611F000FC18E0001031C0914A780E9C7E +:10199000F10900742FF9F1590074C4498E49307867 +:1019A000F0091900E08801420E9CF01F00235C8CB6 +:1019B000C0A00E9CF01F0021E50800682FF8E55834 +:1019C0000068D832330B0E9CF01F0019C6E00A9B4A +:1019D0000E9CF01F0017189AC0E04998201D1AD8D5 +:1019E000E06800981AD84978497C1AD8F01F001787 +:1019F0002FCDC0088ECB302CF01F00151892E08040 +:101A0000011F98D9EAC8FFF81039C25248C8201DF2 +:101A10001AD8E06800A21AD848E848BC1AD8F01FC3 +:101A2000000B2FCDC0080000000080D48000CDD472 +:101A30008001255880011FAC8000D13C8003B2306A +:101A40008003B2A480039D9C800094C48000D318BE +:101A50008003B2D80E9BF01F00445C5CC0E04C38A1 +:101A6000201D1AD8E06800A51AD84C184C1C1AD8AA +:101A7000F01F00412FCDC008069B6416049CF01F88 +:101A8000003FC0E04B98201D1AD8E06800AB1AD880 +:101A90004BB84B8C1AD8F01F00382FCDC0080E9CC5 +:101AA0000497F01F0038C1383D0B0E9CF01F003327 +:101AB000C0E04AE8201D1AD8E06800B51AD84B08E3 +:101AC0004ACC1AD8F01F002C2FCDC008ED3A000CDC +:101AD000ED39000DB169F3EA1189ED3A000EED3BE5 +:101AE0000010F3EA1089ED3A000FF5E91009ED3A1C +:101AF0000011B16AF5EB118AED3B0012F5EB108A8B +:101B0000ED3B0013F7EA100AF40B16186E18ED6A95 +:101B1000000FED6B000CF7DAC208F5DAC108ED6AC8 +:101B2000000EF20A1618ED690013ED6A0010ED6B55 +:101B3000000DF5D9C208F3D9C108ED6A0011ED69AD +:101B40000012300911AAB08911B9F3EA1089FE7A9E +:101B5000F7FE5C89F4091900E0880016F2C9F7FF66 +:101B6000C14800008000CF988003B2308003B310DA +:101B700080039D9C800094C48000CDD48003B33842 +:101B80008000D13CF2C9F8005C79B0B9A989B0A94C +:101B9000ED380009E818FF00ED680009A988ED6834 +:101BA00000083008314BED68000BED68000A0C9C12 +:101BB000F01F00284A885C7CED6C000BA98CED6C52 +:101BC000000AF10900602FF90A9BF15900600E9C90 +:101BD000F01F00221898C0E04A18201D1AD8E068AB +:101BE00000D71AD849F84A0C1AD8F01F00202FCD78 +:101BF000C00830191AD4189A1AD9ECCBFFF4E0694E +:101C000000FF0E9CF01F001A2FEDC0B8E508007011 +:101C10002FF8E5580070E50800662FF8E5580066D3 +:101C20000E9CF01F0014D8320E9CF01F001248A822 +:101C3000F109006A2FF9F159006AD8320E9CF01FA1 +:101C4000000D4858F10900742FF9F1590074D83289 +:101C500080011F4A000080D48000CDD48003B230C0 +:101C60008003B36C80039D9C800094C48001206439 +:101C70008000D13CD431205D30951988FAC9FFF03D +:101C8000FACEFFFC5009330231033056F0C9003060 +:101C9000EA091800E08B00BAE4081800C03030A749 +:101CA000C1582FFC35891988F20818005F0A378956 +:101CB000F20818005F09F5E91009F9B70008F7BC48 +:101CC00001FFF9B70110F9F81800F8CAFFFF300951 +:101CD0003191F2070244F0C000301004F4CC00014E +:101CE000EA001800E08B0005E8C90030C1E80E9456 +:101CF000E6071800C1D1F0C400615C54EC04180080 +:101D0000E088000EF0C00041EC001800E08B0011EC +:101D1000E2041800E0880004341CC028361C2F6838 +:101D2000F00C010CF9E9104915882FFACD3B32EA85 +:101D3000F4081800C0814008103EC6701CA92FFC92 +:101D40001988CA5B5808C28030CAF40818005F1CA2 +:101D5000320AF40818005F1A146C300AF40C1800E8 +:101D6000C1B030DCF80818005F1730ACF808180074 +:101D70005F1CEFEC000CF40C1800C0E030BC309796 +:101D8000F80818005F1CEE0818005F18F9E8000852 +:101D9000F4081800C3A1FAC8FFFC101EA34E2FFEC2 +:101DA000582EC0B0E0890005580EC2F0C298583EC7 +:101DB000C0F0584EC251C168E064FFFFEA1400FF52 +:101DC0000839E08B00234018F3E81189C198E049F5 +:101DD000FFFFE08B001B4018402AB968F1EA1108A8 +:101DE000C0D8E04900FFE08B0011402A4018B968D4 +:101DF000F1EA1108403AF1EA1088F1E91009580BAC +:101E0000F7F91A00301CC028300C2FBDD832D70388 +:101E1000D401202DFACBFFFCF01F0004F9BC00FF19 +:101E2000FBFC10012FEDD80280011C74D431202D51 +:101E3000300630110C9EC4A898557812E7D5B01022 +:101E4000049430075008C0B8E92800000990202306 +:101E5000E1E810805C835C702FE40007E203190066 +:101E6000FE9BFFF40A944008E214FFFEE7D5C00190 +:101E700008023000E0031900C0400584A964080787 +:101E8000E9D7C010B187E80700070E94E0140000FE +:101E9000C060E9D7C010B187E80700075C77EBD5D1 +:101EA000C001EE0E000EEFDEC010B18EEE0E000E81 +:101EB0005805C0B0EFDEC108EC061101A96E5C56F2 +:101EC000FDDEC010EFEE100E780C580CCB615806FA +:101ED000C080F9DEC108A96EFDDEC010F9EE100E5B +:101EE00017B715BC17851796B166EDE5118617ABC8 +:101EF0001585EDEB108B5C781596EFEB100B15AAA2 +:101F0000EFDBC010B166B18BEDE511860E0BEDEA8B +:101F1000108AF9EA100AF40C1610F5DAC010F60A65 +:101F2000000A180AF4090009F2080008F00E000E71 +:101F3000F1DEC010B18EF00E000EF9DEC010B18ED1 +:101F40001C0C5CDC5C8C2FEDD832D4213008189945 +:101F5000F5DBB010301EC0B8F32600001397202A1E +:101F6000EFE610875C8A5C772FE90E08FC0A1900FF +:101F7000FE9BFFF41699E219FFFE120CEDBB000068 +:101F8000C0411989A9691208F3D8C010B188F208B4 +:101F900000081099E0190000C060F3D8C010B188A3 +:101FA000F20800085CD8F9D8B010D822D431300A31 +:101FB000301414981495C488985B7816EFDBB01031 +:101FC0000C9E3009C0B8FD2200001D932027E7E2D7 +:101FD00010835C875C732FEE06090E93E8071900E7 +:101FE000FE9BFFF3169EE21EFFFE1C06FDDBC001FA +:101FF000EA0E1900C0400D8EA96E1C09FDD9C01053 +:10200000B189FC090009129EE01E0000C060FDD9E4 +:10201000C010B189FC0900095C79F7DBC001F20846 +:102020000008F3D8C010B188F2080008580BC0B0FF +:10203000F3D8C108F40A1101A9685C5AF1D8C0109C +:10204000F3E81008780C580CCB81580AC080F3D8FC +:10205000C108A968F1D8C010F3E810085CD8F9D815 +:10206000B010D832D431201DFAC4FFD8169712937D +:102070001092681518966801580AE0800091500A7D +:10208000314BF01F0055400AC0A04D48E06C00FEE7 +:10209000F109005C2FF9F159005CCC286C148C59C3 +:1020A0003138F0091900E08B000F4CD8201D1AD8E8 +:1020B000E068022C1AD84CB84CBC1AD8F01F004B60 +:1020C0002FCDC0085C53E3E310815C71E961000926 +:1020D000A981E9610008158B1598B168F1EB1188A9 +:1020E00015ABF1EB108815BBF7E81008F00B1618CC +:1020F000E9680013E96B0010F7D8C208F1D8C108ED +:10210000E96B0011E9680012E81245005C72A892C0 +:10211000E4031608A883ED380008A8A8ED380009E4 +:102120004B39A8FCA8B8A8EC9208F7D8C010A8DBD7 +:10213000A98BA8CB2FF8B2085807C0D00F8B0FB9C6 +:102140000F98B168F1EB11880FABF1EB1088F3E851 +:102150001008C051EAC8FFFCEBF81001F00916188E +:10216000E968000FE969000CF3D8C208F1D8C1088A +:10217000E969000DE968000E3008E968000BE968BC +:10218000000A500A314B089CF01F001A5C7CE96C75 +:10219000000BA98CE96C000A400AC038781A2F0A93 +:1021A00048E8F10900482FF9F1590048158B1599B5 +:1021B000B169F3EB118915AB6A18F3EB108915BB04 +:1021C000F7E910091039C1910C9B0A9CF01F000A15 +:1021D000C26800008000CDD4000080D48003B3909A +:1021E0008003B3D880039D9C800094C40000734892 +:1021F00080011F4A8000CAF8EB08002C5808C0B0C4 +:102200008C49F0091900E08800070A9B0C9CF01F1C +:102210000006C0580C9B0A9C6A585D185C5C2FFD38 +:10222000D8320000800125A0D42149781896700783 +:10223000C1680E9CF01F0015C1100D8B0D98B16880 +:10224000F1EB11880DAB6E1AF1EB10886E290DBB06 +:10225000F7E8100814581268C1306E075807CEA16D +:1022600048B66C0C580CC040F01F0008C08148985C +:10227000F10900562FF9F1590056C0286C070E9C41 +:10228000D8220000000080CC8000CAE4000080D08A +:10229000000080D4D421204D1897503B149C502A24 +:1022A000501950084096F01F000D403B402A40193D +:1022B0004008C0A148A8E06C00FCF10900562FF9C5 +:1022C000F1590056C0881ADC0E9C1AD6F01F000582 +:1022D0002FED5C5C2FCDD82280012228000080D415 +:1022E00080012064D4314C05EB08004A2FF87817A0 +:1022F000EB58004A0F980F831694F1E31083189659 +:10230000E609160C3048F0091900C090F01F00379C +:10231000EB08005C2FF8EB58005CC2980FB8E7D3CD +:10232000C1040FA2A363F1E2108298585C82E60810 +:102330001900C0539848E4081900C0B20C9CF01F63 +:10234000002B4A98F10900522FF9F1590052C86840 +:10235000069B0E9CF01F00265C8CC0F00C9CF01FAE +:102360000023EB0800502FF8EB580050EB08004E0C +:102370002FF8EB58004ECD48F7D2C0100C9CEEC0A1 +:10238000FFF0F01F001C0895301249B10A9CF01FA5 +:10239000001BC1D0EAC8FFFCC1A06A185808C17070 +:1023A000EF3A0010EF390011B169F3EA1189EF3A01 +:1023B0000012F3EA1089EF3A0013F5E91009103919 +:1023C000C2A00A9B009CF01F000EC2515802E3F508 +:1023D0001000EBF5000030020835EBF50000580561 +:1023E000CD61C9F8000080D48000D13C80011F4A33 +:1023F0008000D210000080CC8000CAE48001255803 +:10240000EE03000307B807A9F1E910893448F00981 +:102410001900C2A0EF39000CEF38000DB168F1E9E6 +:102420001188EF39000EF1E91088EF39000FF3E859 +:102430001008C1B0089BEECCFFF4F01F003DC0A116 +:10244000EF38000CFC19E000B968E618F00012380B +:10245000C0C10C9CF01F00374B78F109004E2FF9DA +:10246000F159004EC5D808955805C0510C9CF01F75 +:102470000031C5680FE90FF8F1E91088F1D8C00EF6 +:10248000C0700C9CF01F002D1896C4A078174AC885 +:1024900091044AC8089B91070C9CF01F002BC3B104 +:1024A000EF3800095868C0B05918C0405818C11119 +:1024B000C0B8089B0C9CF01F0025C2D8089B0C9C40 +:1024C000F01F0023C288089B0C9CF01F0022C2381A +:1024D000089BEECCFFF0F01F0016C0F1EF380010A3 +:1024E000FC19E000B968E618F0001238C0608D17DA +:1024F000302B0C9CF01F00180C9CF01F000E48E8BD +:10250000F10900582FF9F1590058F109004E2FF93F +:10251000F159004E48A93008930848A99308D83AC1 +:10252000EF3800095918FE91FF77C6BB8001255886 +:102530008000D13C000080D4800129BC0000822CA6 +:10254000000082308000D588800115508000F37C27 +:1025500080011910800118FC19B9198A1998B168FD +:10256000F1EA118819AAF1EA1088F3E81008F0C915 +:1025700000015BD9E08800035EFFF7390035EDB953 +:102580000001C0E1761A1438C0B07629105A126AD8 +:10259000C0715CD9F3E8000812385F0C5EFC5EFD88 +:1025A000D431209D503B506A781B403AF519002CDD +:1025B000F2C80013502B5078214917EA17F8F1EAB6 +:1025C00010885C88109BF1D8C00DE21B2000984356 +:1025D000505B2143308B5018F20B0C0A1897F3DA3A +:1025E000B0105C8312985049A37830025C88314067 +:1025F0005088C938401B405AF1DBC00D14485008C0 +:10260000E3D3B010F1D3C01040791039E08900064F +:10261000400B4081ADBB500B300A314B302CF01FCA +:1026200000421894C3708E58313AF4081900E08BB8 +:10263000000F4BE8201D1AD8E06802C31AD84BC817 +:102640004BCC1AD8F01F003C2FCDC008314A402B8C +:10265000781CF01F003A6E19F1D0C010F208000883 +:102660006816EBD1B0108F188E58F0000100AE50F4 +:10267000C2188E52EA021900EA0217205C82C19049 +:10268000302A300B303CF01F0028C071089CF01F2E +:10269000002CE06C00FFC4586E18B842B852189B6A +:1026A00099180415089C5C85F01F00265805C02069 +:1026B0006E075805CDF1ED65000B40085C78ACF86D +:1026C000A988ACE8E2C8FFEC5C78ACB8A988314BCB +:1026D000ACA8ED65000A0C9CF01F001B5C7CED6C47 +:1026E000000BA98CED6C000A4039406A7258089BB7 +:1026F000129C5D18495BF70800302FF8089CF758CA +:102700000030F01F000F40180213404AE1D2B01011 +:1027100014085C835C8850185803FE91FF6D069C7A +:102720002F7DD8328000D3188003B4108003B45CAE +:1027300080039D9C800094C48002E7368000D13CD9 +:102740008000CD3480011F4A000080D4D40148F8B5 +:1027500070091839C04178099109C128580BC0E1A6 +:1027600048B8201D1AD8E06801341AD8489848ACF7 +:102770001AD8F01F000A2FCDC00878089708189BB8 +:10278000305CF01F0007D8020000734C8003B410C7 +:102790008003B47C80039D9C800094C48000C97435 +:1027A000D43118971696183BC0E14BC8201D1AD893 +:1027B000E06800A41AD84BA84BAC1AD8F01F003A16 +:1027C0002FCDC008580BC11076081838C0E04B3820 +:1027D000201D1AD8E06800A61AD84B484B1C1AD8FE +:1027E000F01F00312FCDC0086E156A1811CA11D91B +:1027F000F3EA1089C0303004C1D8118A1199109CB5 +:10280000B169F3EA118911AA11B8F3EA10891248E3 +:10281000314A8F18EECBFFF8F01F0025301B0A9CC1 +:10282000F01F00240A9CF01F002418940A9CF01F3B +:1028300000236E15C1486A1811B9118A119311A8A5 +:10284000B163E7EA1183E7E81083F3E31003F01FB5 +:10285000001A18040A9C0695F01F00180A9C5805D7 +:10286000CEB10C9B0E9CF01F001649689009F5D95B +:10287000C010083AC0E44898201D1AD8E06800C784 +:102880001AD84918487C1AD8F01F00072FCDC00865 +:102890000819089CB009D8328003B4108003B4989A +:1028A00080039D9C800094C48003B4A48002E7361A +:1028B000800118E88000CD0C8000D13C8001274CBD +:1028C000000073508003B4B8D431300618971692C4 +:1028D0004AB30C94300566080A9B0A9CC3E8EF3A99 +:1028E000000CEF39000DB169F3EA1189EF3A000EDF +:1028F000F3EA1089EF3A000FF5E91009705A123A1D +:10290000C1B1EF3A0010EF390011B169F3EA118952 +:10291000EF3A0012F3EA1089EF3A0013F5E91009D3 +:10292000706A123AC0910FCA0FD9F3EA1089906AFF +:10293000F20A1900C0D02FF5580CC090F13A001FD0 +:10294000F939001FF20A1800E08B0003109C70098F +:102950005809F00B171012985808CC21580CC04099 +:10296000F01F0008180658155F9804365F59F3E801 +:102970000008E8081800CAF10C9CD8320000734C1B +:10298000800127A0D42148C83007700CC108F9384D +:10299000001F7806F0C900015808C050F969001FEF +:1029A0001897C0480E9BF01F00050C9C580CCF01D7 +:1029B000D82200000000734C800127A0D431201DD4 +:1029C0004CD8F10900322FF9F159003278161895D8 +:1029D0000D835C83F3D3C004A3695949C080F10916 +:1029E00000442FF9F1590044E08F02570DF80DE132 +:1029F000F1E110810DB80DA24C07F1E21082F01F39 +:102A000000408E885C815C821894F808000858A801 +:102A1000E08A000D189B0C9CF01F003AC5708E8850 +:102A2000E808000858A8E08900524B783009700780 +:102A30005009C3D8ED39000CED38000DB168F1E94B +:102A40001188ED39000EF1E91088ED39000FF3E837 +:102A500010086E591039C291ED390010ED3800118F +:102A6000B168F1E91188ED390012F1E91088ED390A +:102A70000013F3E810086E691039C1710DC90DD843 +:102A8000F1E910888E69F0091900C0F149A8F1092F +:102A900000462FF9F15900460DE90DF8F1E91088CB +:102AA000F1D8C00DC360C3F850076E075807CC318A +:102AB000E08F021E089B0C9CF01F0012083CC065B2 +:102AC000305CF01F00121897C09148B8F109003C23 +:102AD0002FF9F159003CE08F01E0320A300B0E9CD7 +:102AE000F01F000B30394888EF69001F70098F090B +:102AF0009107C138000080D4000073508000CD0CD5 +:102B0000800128C80000734C8000C9D48002E8BC52 +:102B10008EF8F1D8C00DC070314A0C9BEECCFFF896 +:102B2000F01F004F4CF89009F20400045C84B004DC +:102B30000DE8A598EDB80000C120EF38001EE3D1E4 +:102B4000C00DE7D3C004A371E60310FCE20200024B +:102B5000A1A80602EF68001EEF52001C6A1811BB04 +:102B6000300A11AEF7EE108E118BB09AB0AAB0BA3F +:102B7000B08A1499F5DBC00411FBF40A10FC11ECC7 +:102B8000F7EC108CF9DCB00DA37CF7DCC010B0DBE7 +:102B9000A98B180EB0CB140E10935C8E3016F5DE98 +:102BA000C010B0FAA98AB0EA6E11029BC548761A25 +:102BB00015C015D2E5E010825C82E40C1900C292C7 +:102BC000F6021618B0BBB082E5DBC208F7DBC1081D +:102BD000B092B0AB5809E080008213E213FBF7E239 +:102BE000108BF60C1900E08300FF15DB15CAF7EA1D +:102BF000108AF40E1900E08B00F7EA0A1618B2B535 +:102C0000B28AF5D5C208EBD5C108B29AB2A5C6788A +:102C1000E40C1900E08000E815E015FBF7E0108BEC +:102C2000F60C1900E08300E05809C09013FB13E98B +:102C3000F7E91089E4091900F9B601001582159B1E +:102C40001499B16BF7E2118B15A215BAF7E2108B4C +:102C5000F5EB100B580BCAC1C52900008002E736FE +:102C60000000735013EB13FA11CCF5EB108A11DB53 +:102C7000F7EC108BF60A1900E088000F4BC8201DF6 +:102C80001AD8E068018E1AD84BA84BBC1AD8F01F8E +:102C9000003B2FCDC008EA0B1618B28BF7D5C2083F +:102CA000B2B5B29BEBD5C108B2A511CB11D9F3EBEC +:102CB0001089F20A1900F9B60100C1185801C0E0E4 +:102CC0004AB8201D1AD8E06801971AD84AC84AACF9 +:102CD0001AD8F01F002A2FCDC0088F15EF39001E1B +:102CE000EDB90000E08100E45806E08000E16E19D3 +:102CF000721A15CB15D9F3EB1089E08100D9118B2D +:102D000011951099B165EBEB118511AB11B8EBEB97 +:102D10001085F1E51005C1A807F86A1907EB13CC77 +:102D2000F1EB108B13D8F1EC1088F00B1900E08157 +:102D300000BF13881395B165EBE8118513A81293B2 +:102D4000EBE8108513B8F1E510055805CE61123A8D +:102D5000C1A14878201D1AD8E06801B91AD848984E +:102D6000485C1AD8F01F00052FCDC0088003B410AE +:102D70008003B4D480039D9C800094C48003B4F489 +:102D80008003B52C138A1398B168F1EA118813AA4D +:102D9000F1EA108813BAF5E81008C0E04C68201D6D +:102DA0001AD8E06801BB1AD84C484C5C1AD8F01FFE +:102DB00000452FCDC00813F813E9F1E91088EF0999 +:102DC000001C5C88F0091900C1704BB8201D1AD88E +:102DD000E06801BD1AD84BC84B9C1AD8F01F0039C7 +:102DE0002FCDC0080A9CF01F00394B9818143006EC +:102DF000B0040A9CC5982EC8EF58001C6E187016B7 +:102E00000D880D94B164E9E811840DA8E9E81084F7 +:102E10000DB8314AF1E41004EECBFFF80C9CF01F22 +:102E2000002DEF38001CACA8EF38001D0C9CED65A0 +:102E3000000BACB8ACE5ACF5ED65000A314BF01F0A +:102E400000265C7CED6C000BA98CED6C000A6E1604 +:102E5000C1586815089C3ECBF01F0020089B0C9CB5 +:102E6000F01F001F0B890BB80B94B164E9E91184C2 +:102E70000BA9E9E91084F1E410045804CEB10E9CCA +:102E8000400BF01F00180C9C49178E05F01F000F17 +:102E90001815AE05C0D849480A9CF109003630061D +:102EA0002FF9F1590036F01F0011C02830060C9C94 +:102EB0002FFDD8328003B4108003B53C80039D9C65 +:102EC000800094C48003B5608000CD0C0000735076 +:102ED0008002E73680011F4A8000CDD48000CD34C7 +:102EE0008001274C000080D48000D13C305CF01F72 +:102EF00000061897FE91FDF3FE9FFDDE5809FE9136 +:102F0000FEB3CDDA8000C9D4D4211898F937002E49 +:102F1000761E306CF8071800C0E04948201D1AD80A +:102F2000E06801B41AD84928492C1AD8F01F0012B9 +:102F30002FCDC008306C201C5C5CF20C0706FC0C2A +:102F40000007EF66000EF40C0706EF660014580C3D +:102F5000CF313089FD6C001BFD69001A109C706830 +:102F60005D185C5CD82200008003B5948003B5DC5A +:102F700080039D9C800094C4D4211897580CC0E114 +:102F800049D8201D1AD8E06800941AD849B849CC0D +:102F90001AD8F01F001C2FCDC00878185808C0E1BF +:102FA0004958201D1AD8E06800951AD84968494C3C +:102FB0001AD8F01F00142FCDC0086E186E06109C92 +:102FC0005808C0E148C8201D1AD8E06800991AD8EE +:102FD00048E848BC1AD8F01F000B2FCDC008F01FDE +:102FE000000C0E9B306C0C97F01F000A5806CE6147 +:102FF000D82200008003B5948003B62080039D9CF6 +:10300000800094C48003B62C8003B63C8000D13C81 +:103010008000C974D431201D500B1897580CC0C0C3 +:103020004D084D19118CF80815031818F2080028DE +:1030300070495829C0D030AA30094CBE129C1C924D +:10304000129B2ECE1298149314911490C1980F8A4B +:103050000F99B169F3EA11890FAA7018F3EA108980 +:103060000FBAF5E910091039CE714C08F109002E9C +:103070002FF9F159002ECE480C990A9C089B30A6D6 +:10308000EC031800C0A1FCF6FFFC5806C0611296C4 +:10309000189516941093C498FCF6FFFC5816C2417C +:1030A0005807C0F00F860F95B165EBE611850FA6A6 +:1030B000EBE610850FB6EDE5100564160C35C26021 +:1030C00064051D865805C080F2061800C2B3189525 +:1030D0001694109AC2A80C94F6061800C2331296E1 +:1030E00018951090C2285826C1D15807C1300F86B4 +:1030F0000F95B165EBE611850FA6EBE610850FB6CF +:10310000EDE5100564160C35C0514969109CB28874 +:10311000C9781D85F8051800C053129616941091B1 +:10312000C0481296189516942FF82E4E5C582E42D1 +:1031300030A9F2081800CA11F2031800C061400655 +:10314000EDB60000E081007B4005E2150002E08161 +:1031500000763098F0031800E089000A5C53C498A8 +:103160000000735200007354000080D430A8F001B6 +:103170001800C180E7D1C0084B38E60915030619CD +:10318000F00903285808C2304B08201D1AD8E068FF +:1031900001761AD84AE84AFC1AD8F01F002F2FCD22 +:1031A000C008F0001800C040E7D0C008C108E20A1B +:1031B0001800C4404A48E7DAC008E60615030616B8 +:1031C000F00600266C0CF01F00258D053098F003EA +:1031D0001800E088000F49D8201D1AD8E068018C3B +:1031E0001AD849F849BC1AD8F01F001B2FCDC008C7 +:1031F0004959E6081503300A0618F2080028F0C9F4 +:10320000FFF0930A5807C0D00F8B0FBA0F99B1691E +:10321000F3EB11890FABF3EB1089F5E91009911964 +:103220004899E60815030618F20800282F08300907 +:10323000069CB0C948B8B083C038E06C00FF2FFDD1 +:10324000D8320000000073548003B5948003B64C5C +:1032500080039D9C800094C480012F788003B66415 +:1032600000007352D431494730050E963EF42EC704 +:10327000ECC3FED40F882FF85C58AE88EEF9FFFC43 +:103280005829C061E8081800E08B0009C0F85819F7 +:10329000C0D1F2081800E088000A6C0C580CC0403D +:1032A000F01F00068D05EF45FFFC2E472E46063722 +:1032B000CE21D8320000735480012F78D431306889 +:1032C0001293189616951497F939002EF0091800E4 +:1032D000C0E04B78201D1AD8E06801DA1AD84B58A4 +:1032E0004B5C1AD8F01F00352FCDC008580BC5C055 +:1032F00017891798B168F1E9118817A9F1E91088C1 +:1033000017B9F3E81008C500189B0A9CF01F002CA1 +:103310001894C4A10B88FC19E000B968E618F00005 +:103320001238C420069B0A9CF01F00265C5CE80C47 +:103330001800C3C55C6C4A49F8081503302AF00C24 +:10334000010CF20C00289166F0C9FFF0930A0FDA25 +:10335000F16A000D0FCAF16A000C0FBAF16A000B96 +:103360000FAAF16A000A0F9A1095F16A0009ECC3DE +:10337000FFD10F8AB2C4F16A0008C0F87009701456 +:103380008B09F01F00120E99069A089B0C9CF01FE7 +:103390000010089CF01F000F6A08306C109B580842 +:1033A000CEE1109CD832E06C00F6D8328003B594A0 +:1033B0008003B67880039D9C800094C480012558CA +:1033C00080013014000073548000C97480012F08FC +:1033D0008000D13CD421189E580CC0E14958201DD2 +:1033E0001AD8E068024A1AD84938494C1AD8F01F4E +:1033F00000142FCDC008761AF4C8FFE4F137000F8F +:10340000F136000CF139000DF138000E782BB1695E +:10341000F3E61189F3E810897818EFE910091059DB +:103420001669C061F4CBFFD82ECAF01F0006D8225F +:103430008003B5948003A13880039D9C800094C4D0 +:10344000800132BCD431202D189616911495580C59 +:10345000C0E14CA8201D1AD8E068027F1AD84C8819 +:103460004C8C1AD8F01F00482FCDC00894593378DF +:10347000F0091900E08B000A4C48149CF109002265 +:103480002FF9F1590022C3087414E8C7FFE40F981C +:103490000F89F1E910893018F0091900C1E10FD83E +:1034A0000FC9F1E91089E0680604F0091900C1515B +:1034B0000FB80FA9F1E91089E0680800F0091900B8 +:1034C000C0C1E938001BE939001AF1E91089E06848 +:1034D0000806F0091900C0E04AC80A9CF109002852 +:1034E0002FF9F1590028F109001E2FF9F159001E9A +:1034F000CA184A68F109001A2FF9E8C3FFD6F15932 +:10350000001AFAC2FFFC304A069B049CF01F002000 +:10351000EF380018EF390019B169F3E81189EF3875 +:10352000001AF3E81089EF38001BF1E910096C1854 +:103530005808C0C01039C0A1049B3019E8CAFFDC8C +:103540000C9CF01F00143018C0A83009EECAFFF818 +:10355000FACBFFFC0C9CF01F000F30080FEA0FF9AC +:10356000F3EA1089301AF4091900C1503028F00923 +:103570001900C591C52800008003B5948003A138C7 +:1035800080039D9C800094C4000080D48002E736B4 +:10359000800132BC5808C4D03008AEE83028304A28 +:1035A000AEF8EECBFFF2EECCFFE8F01F0025304A7C +:1035B000069CEC0A000BF01F0022ED39002E30684B +:1035C000F0091800C0E049F8201D1AD8E06802D9B7 +:1035D0001AD849D849DC1AD8F01F001D2FCDC008D1 +:1035E000306820185C58EE080009F33B0008F36BC4 +:1035F0000012E808000AF56B000EE208070BF36BF7 +:103600000008E2080709F56900145808CEB10C9CBF +:103610006C680A9B5D18C0D80C9CFACBFFFCF01FAD +:10362000000DC07848C8F109002C2FF9F159002C81 +:103630000A9CF01F000A2FEDD83200008002E73606 +:103640008003B5948003B5DC80039D9C800094C406 +:103650008000B3B4000080D48000D13CD42178191C +:10366000F338001BF339001A1697F1E91088189601 +:10367000E0690800F2081900C070E0690806F20865 +:103680001900C231C1C8189B0E9CF01F00173E4B99 +:103690000C9CF01F0016C0E04958201D1AD8E068A5 +:1036A00004A41AD84938494C1AD8F01F00142FCD59 +:1036B000C0080E9B0C9CF01F0012C148189A169C63 +:1036C0002D1BF01F0010C0E848F8F10900282FF961 +:1036D000F1590028F109001E2FF9F159001EF01FC1 +:1036E000000BD82A800133D48000CDD48003B59458 +:1036F0008003B36C80039D9C800094C4800122E40D +:1037000080013444000080D48000D13CD431300AA0 +:1037100018941691303C338BF01F0042E8C8FFD15B +:103720001895580CC0A14C08E06700FFF10900246F +:103730002FF9F1590024C738985A3379F20A190041 +:10374000E08B000F4B98201D1AD8E06804311AD87E +:103750004B784B8C1AD8F01F00382FCDC008300999 +:103760007813E6C7FFE4AEE93019AEF93069E93AFB +:10377000002EF20A1800C0E04AC8201D1AD8E068DE +:1037800004391AD84AD84ABC1AD8F01F002B2FCDBA +:10379000C00830664AAB4ABA20165C56F006070CE1 +:1037A000EE060009F36C0008F606070CF36C001235 +:1037B000F406070CE6060009F36C000EF006070C91 +:1037C000F36C00145806CE913042EECCFFF2E802C2 +:1037D000000B049AF01F001C049A029BEECCFFE839 +:1037E000F01F00193069AED2AEC9AEB6AE863088D1 +:1037F000301AAEA8AE9AE769001BE768001A089C69 +:1038000068680A9B5D184888F10900182FF9EFDCF9 +:10381000C008F15900180A9CF01F000C0E9CD83209 +:103820008000D318000080D48003B5948003B6A034 +:1038300080039D9C800094C48003B5DC8003B71690 +:103840008003B58D8002E7368000D13CD4211694E8 +:103850001896189B1497089CF01F00541895E08147 +:1038600000DF09890998B168F1E9118809A9F1E92E +:10387000108809B9FC1AE000F3E810081099E6195D +:10388000F0001439E08000CC5808E08000C9301BFB +:10389000089CF01F00475C5CEA0C1800C0545807F5 +:1038A000E08100CBCC184C39EBDCB008EA081503FA +:1038B0000A18F20800282F0870095809F9B9000100 +:1038C000F1F90A004BB9EA0815030A18F2080028B2 +:1038D0007048F0C900015819E088000F4B68201D9E +:1038E0001AD8E06803A51AD84B484B5C1AD8F01FC9 +:1038F00000352FCDC00858185F0858075F09F3E856 +:103900001008C041E06400FFC078089B0C9CF01FC9 +:10391000002EE9DCC0085807E08000854A5AEA0911 +:1039200015030A19A369F409000870485828C0B1A2 +:103930002F890E9BF40900090C9CECCAFFD1F01FE3 +:103940000023C6B85818C6E110990E98905B904AAB +:10395000F40B1900C111700A580AC0E04968201D13 +:103960001AD8E06803C41AD84998495C1AD8F01FDD +:1039700000152FCDC008F13A000CF20A1800C05112 +:1039800070085808CE41C51890CB300A303CF01F63 +:1039900000111896C4F00E9BF01F000F5C5CC1F084 +:1039A0000C9CF01F000EC468800125588001301463 +:1039B000000073548003B5948003B6D480039D9CAB +:1039C000800094C48001370C80012F088003B6FC6E +:1039D0008000D3188000CF988000D13C306CF01F5D +:1039E000001AC170300899169908EA081503F00505 +:1039F00001054968F00500256A045804C07008985C +:103A000068045804CFD1910CC0288B0C089CD82294 +:103A10000C9CF01F000F089C5C5CD822E06C00F648 +:103A2000D822089C5C5CD8220E960E9CF01F0009E0 +:103A3000CD6B089C5C5C4888F10900242FF9F15992 +:103A40000024D8228000C9D4000073548000D13CE7 +:103A50008000CD1E000080D4D421202D169618970A +:103A6000149531CB0C9CF01F0027C0804A68E06C95 +:103A700000FE90592FF9B059C4180E9B0A9CF01FF4 +:103A80000023C3410B890B98B168F1E911880BA998 +:103A9000F1E910880BB9FC1AE000F3E8100810995E +:103AA000E619F0001439C0F13019BAA935E9BAC9DC +:103AB000F3D8C207BAF8BAD9A988BABCBAE8FAC921 +:103AC000FFFEC1586E1912586E291268C0906E38E8 +:103AD0005808C041E06C00FCC118EEC5FFF40C9A18 +:103AE0000A9B0E9CF01F000AC08848A90C9B0E9CE4 +:103AF000EECAFFD1F01F00085C5C2FEDD822000059 +:103B00008000CDD4000080D4800125588001384C3D +:103B10008003B58D80012F0878983019B0895EFC3C +:103B2000D4217897EF380024EF390025F0091800E8 +:103B3000C021D82AEE080028201D701630086C1904 +:103B40008CCA8CDB20EA1AD620EBF2CCFFF2F01FF5 +:103B500000182FED587CC0F0581CC0310C95C138AE +:103B6000EF3800242FF8F1D8C0030C9CEF68002434 +:103B7000F01F0010E06C00F4D8228ADB6A1CF01FF2 +:103B8000000E6A055805CFA1EF3800242FF8F1D8B0 +:103B9000C0030C9CEF680024F01F00064878E06C1E +:103BA00000F290092FF9B009D82200008001933467 +:103BB0008000D13C80013F7C000080D4D421204D86 +:103BC0001896F01F002D5806C5306C955805C50095 +:103BD0000B885808C4D0E0680600300ABA68E06B69 +:103BE0000600303CF01F00251897C3F03008FACBD0 +:103BF000FFF4AA88781CF01F00229A6B580BC35060 +:103C00005C7BFAC8FFF2FAC9FFFCFACAFFF86E1C27 +:103C1000F01F001C586CC2606E18402B101B40181F +:103C20005C5B0E9C100B5C7BF01F001749789019B1 +:103C30002FF9B0196E19F338001BF339001AF1E9A6 +:103C40001088E0690800F2081900C060E069080601 +:103C5000F2081900C0716C480C9B0E9C5D185C5CEE +:103C6000C0400E9CF01F000A0C9CF01F000A2FCDD4 +:103C7000D822000080013FA08000D31880013F5867 +:103C8000800192DC8000D210000080D48000D13C02 +:103C900080013B20D4211897580CC0E149B8201D61 +:103CA0001AD8E06801491AD8499849AC1AD8F01FC7 +:103CB000001A2FCDC008499899983778F9680036CE +:103CC00036C8F9680037496899584968189B996857 +:103CD000495CF01F0016496CF01F00163628EF688B +:103CE00000353068EECCFFD1EF68002EF01F0012D7 +:103CF000581CC040E06C00F4D822E06805DC300CB1 +:103D0000EF58002CD82200008003B71C8003A13894 +:103D100080039D9C800094C40000746C80013A581C +:103D200080013D5880013B1880013E6880013D388C +:103D300080018F4480019128D40116985C7A189BE9 +:103D40002F29109C5C79F01F00045C7CF9BC00FFFB +:103D5000D80200008000CEC4D42131B918977898D9 +:103D6000965AF20A1900E08B0005E06C00F4D822A4 +:103D7000F1390025F13C0024F2CAFFFFF5DAC00357 +:103D8000183AC041E06C00F2D822F16A0025F0092F +:103D90000028169C911B3F26F01F00050E9CF01F6B +:103DA0000005EC0C1800CFB0D82A00008000CD1E12 +:103DB00080013B20D42130061897E9DBC01030A5E4 +:103DC000C138EE060708201D48BC1AD8F01F000BAA +:103DD0002FED5806C080EC050C085809C041488CEE +:103DE000F01F00062FF60836CED5486CF01F0003F2 +:103DF000D822000080037AF0800094C48003B76862 +:103E0000800384D448CD48D0E3B00001D55348C0E6 +:103E100048C10230C06248C2A505A1240230CFD3F8 +:103E200048A048B10230C06230023003A122023003 +:103E3000CFE3488F000100008003760000000008F7 +:103E4000000009B88003F480000009B800008CC8A5 +:103E500080008EDCD4013018F96800087808580812 +:103E6000C030781C5D18D802D4014869930C931BAC +:103E7000F33800085808C040129CF01F0003DA0A0B +:103E80000000749880013E54D421201D1895169688 +:103E90001494300B30CA49DCF01F001D300B49DC94 +:103EA000F01F001D300B49DCF01F001D497B49DC71 +:103EB000F01F001D1897581CC0400E9C2FFDD822E3 +:103EC000F01F001A1897581CCF910C9B0A9C49862A +:103ED0008D07F01F00181897581CC04030088D0837 +:103EE000CEDB30088D08F01F00141897581CCE61E7 +:103EF000FACBFFFD302CF01F0011F9B701FFFBF8E2 +:103F00000803E9F80A00CDAB00007498800091D056 +:103F100080013F8C80018F3080013F3C80019F6099 +:103F200080013E54800144588001440C0000749488 +:103F300080018F488001443080014110D401169CDB +:103F4000580BC041F01F0004D802300B301CF01F8A +:103F50000002D80280014110D4014879F3380008EA +:103F60005808C021DC0A3008F3680008F01F00037D +:103F7000DA0A00000000749880014284D4015C7B5E +:103F8000F01F0002DA0A00008001433CD401169CB5 +:103F9000F7DAC010F01F0002D80200008001433C95 +:103FA000EBCD40C0203DF01F00164969F3380008F2 +:103FB0005808C04072085808C0402FDDE3CD80C0CB +:103FC000E0680100FAC6FFF4E06C01000CE8F01FA5 +:103FD000000E0C9B1897F01F000D9A5B580BC0A0A9 +:103FE0005C7BFAC8FFF81A99FACAFFFC0E9CF01F16 +:103FF00000080E9CF01F0007CE1B0000800140A4AB +:10400000000074988000920080013F58800192DC8B +:10401000800091E8D40148583019701CF1690009FA +:10402000700A5D1AD8020000000074A8EBCD40CCE5 +:10403000206D49A6FAC7FFF46C2E8F2EECE200002B +:10404000EEE3000016961093FACEFFF0580CC22053 +:104050007C08FC1C8000F1EC100BF4081509BBB8BF +:10406000F1E611C812481648301C9D08F01F000CDC +:104070000E9C30CA1A9BF01F000BFB38000AA68862 +:10408000FB39000B300CA699F01F00052FADE3CDD6 +:1040900080CC7C0BCE3B00008003B774800075B4ED +:1040A00080007534EBCD4080201D4987EF38000833 +:1040B000EDB80000C071EF3900093008F0091800B0 +:1040C000C0402FFDE3CD808030091A98129B129CCE +:1040D000305AF01F000F3FF91B88F2081800CF205C +:1040E0001B98EDB80001CEE13008301C109B302940 +:1040F000E06A00F0F01F000630186E1CEF6800093F +:104100006E095D19CDFB0000000074A88001402CF1 +:10411000EBCD40C0201D301AF40C1800C1B0C08394 +:104120003028F00C1800C2602FFDE3CFC0C01A97F2 +:10413000300630091A98E06A00F1129B301CF01F1B +:1041400000161B98EC081800CF51300C2FFDE3CD62 +:1041500080C018961A9730191A98E06A00F1300B4F +:10416000129CF01F000D1B98EC081800CF51300C6A +:10417000CEEB48A8F1390008F9D9C001F7FA1E00C2 +:10418000F9BC0100F9B8005AF7F80E002FFDE3CD95 +:1041900080C000008001402C000074A8EBCD406876 +:1041A00048F516961893AA4B301CF01F000E0A9C77 +:1041B000310A300BF01F000C069BF5D6C010300CF6 +:1041C000F01F0009304A300B488CF01F0007300CFC +:1041D000F01F00040C9CE3CD80680000000002107A +:1041E000800075B4800075348003B780EBCD40400B +:1041F00020ED30083009FAE90018FAE90000FAE980 +:104200000008FAE9001049BBFAC6FFD4762A8D2AC5 +:10421000F6E80000301CECE90000F01F0017320A3D +:10422000300B1A9CF01F00150C9C30CAFACBFFE033 +:10423000F01F0012300CF01F00103019FB38002A5C +:10424000F2081800C0503FFC2F2DE3CD804048C835 +:10425000F1390008F9D9C001CF8030083039304A2F +:10426000109B301CF01F00072F2DE3CF8040000073 +:104270008003B784800075B480007534000074A892 +:104280008001402CD42130094A881695F169000933 +:104290001896320BF01F00268C085CC82FE8F7D860 +:1042A000B010AA0BEFDCB010F6C90007E06805F902 +:1042B000F0091900E08B00300D890D98F208180004 +:1042C000C220F6071900C182E0640200F9D7C010CD +:1042D0005C7B181BEC0C000CE04B0200E80B17B0E9 +:1042E0005C7BF01F00138A0B0E0CEFDCB010EE0BA2 +:1042F0001900FE9BFFED48F83009118AF20A1800F8 +:10430000C0D1D8220DA8F2081800CDC10DB8F2080E +:104310001800CD813008AA08D822F5DBC010486CFF +:104320000C9BF01F0006D822000074A88001419C5D +:10433000000074A48003B76C8001447CD4314A38F7 +:1043400018921695118A3009F20A1800C3615805AF +:10435000C33049F83004F0C0FFF4E0610200C22825 +:10436000E06602000C970C93301CA006F01F0019A9 +:10437000300B497C314AF01F0018E404000C0E9AFF +:10438000300BF01F0015304A300B494CF01F001263 +:10439000300CF01F0010EA0601080604EBD8B0103C +:1043A000C0B0E2051900FE9BFFDDEDD5B010EFD6E1 +:1043B000C0100E93CDABD832F5DBC010189B488CE3 +:1043C000F01F0008CC5B0000000074A4000001FC9A +:1043D000800075B4800075348003B7808003B770A7 +:1043E0008001447CD401201D3009301C1A98E06AF9 +:1043F00000F5129BF01F0004314CF01F00042FFD4C +:10440000D80200008001402C800075D2D401F01F3A +:104410000007F01F0007C03030CCD802F01F0003A7 +:10442000F01F0003CFA1DA0A800143E4800141ECD0 +:10443000D401314CF01F0006F01F0006C03030CC14 +:10444000D802301CF01F0004DA0A0000800075D288 +:10445000800141EC80007618D4014878910C911BC2 +:10446000F0CCFFF8F01F0005F9BC010CF9BC00010D +:10447000D8020000000074A8800076385EFCD703E4 +:10448000EBCD40F849C56A096A181039C2F08B0CA7 +:10449000EAC7FFF0EAC6FFF4EEC30010EAC4FF70FB +:1044A0000F89EDB90000C091EDB90001C0616C0940 +:1044B0006A081039E08800082F072F060837CF1147 +:1044C000E3CD80F86E19300B169C5D190F883FDA2A +:1044D000F1EA0009EDB80002C0716609EEF8FFF8D4 +:1044E00012088D08CEABAE89CE8B5809CD118B1C2E +:1044F0008B0CCCFB000074B8EBCD408048CE1897F5 +:10450000300AFCCBFFF0F408150417892F88FC084B +:10451000000CEDB90000C0512FFA2F0B588ACF4183 +:104520003018F96800088F0AE3CF9080000074B853 +:104530002FFC4849A56C18091388A1D8B2885EFCE5 +:10454000000074B82FFC4848A56C30091808B089E1 +:104550005EFC0000000074B8EBCD40E0189E14979C +:104560001295587BE08B002C496AF6C8FFFFA568BE +:10457000F408000C1989EDB90001C1F0F608150422 +:104580001296F4080008A1B6F60915012FF9F409EE +:10459000093E740AB8869157FC0A000A913A5805F8 +:1045A000F9BC0001F9B90104EDD9E138F9F81E00B0 +:1045B000F9BC0101E3CD80E0E3CF80E0E3CFC0E0D0 +:1045C000000074B848387019700C121C5EFC0000B2 +:1045D000000074B85EFC300899085EFC1899780CED +:1045E000580CF9B80001F3F80A005EFC300899088D +:1045F0005EFC300899085EFC5EFC5EFC5EFC5EFCC6 +:10460000D401580BC110F80B000B300A487E7C090E +:10461000F40900092FDAF208141FB98810091019DB +:1046200018C9163CCF51D802000074B85EFD5EFF79 +:104630005EFF5EFF5EFF3FDC5EFC78082FF89908A6 +:104640005EFCD401780820189908C020D80A5D1BA8 +:10465000DA0A301899085EFCD401F01F0002D80273 +:1046600080016D6CEBCD406048784889F5DBC01067 +:104670001895189B7006720C5D160A9CF01F0004BA +:10468000E3CF906000007540000074B4800091E8B2 +:10469000D401E06A0088300B485CF01F0006F01F70 +:1046A00000064868300C9118910CD802000074B8CC +:1046B000800091D0800146C000008B545EFCD7037F +:1046C000D401F01F0011F01F0011301B4909169C86 +:1046D000490AF01F00114919491A301B303CF01FDC +:1046E000000EF01F0010300A301BE06C00F0F01FCD +:1046F000000EF01F000E300A302C149BF01F000C2F +:10470000D80A0000800148C0800147888003B79024 +:10471000800146BC800148548003B794800157A4AF +:104720008001499C800147E0800149F480014730C5 +:104730004828F00C092B5EFC00007548EBCD40E0EA +:104740004905189716966A085808C0205D1848E869 +:10475000F007032C580CC061C088F0061800C09008 +:104760002F8C19885808CFA16A085808C080C00843 +:1047700078193028F0091800FE9BFFF8E3CD80E09F +:1047800000007544000075485EFCD703EBCD40FC8B +:104790004935189630120A94EAC3FFF46A0858089B +:1047A000C0D068385808C19030185806CF805816C5 +:1047B000C0305808CF40E3CD80FC48976E28701970 +:1047C000703C700B5D196E2870296E188F29103996 +:1047D000EFF20A003008CEAB0697CF1B000084B47E +:1047E000EBCD40C018961497580BC24049789009F9 +:1047F000F6091900E088001BF60B00184949F20879 +:10480000002C781A74085808C171741E7428103E60 +:10481000C1507C283009951895099D369D07FD6B80 +:10482000001078089D18E3CD80C0307B305CF01F0D +:104830000009E3CD80C0741ECEDB306B305CF01F0E +:104840000005E3CD80C00000000002200000755C80 +:104850008001473CEBCD408049281497129E581B9D +:104860005F8A9009F80919005FB81468C130F80C24 +:10487000001AF60B0019F4CCFFFF48BB48B8F60A43 +:10488000002AF0090029952EF60C09299507E3CD99 +:104890008080302B305CF01F0006E3CD808000006C +:1048A000000002200000755C000084B48001473CD9 +:1048B000D401307B305CF01F0002D8028001473CFD +:1048C000EBCD404030084AB9B2884ABA940858083B +:1048D000C4D04AA95C784AABF00800184A9EA36885 +:1048E000300C2F88F6CAFFF4F20800082F89930CC9 +:1048F000F34AFFFCF34EFFF82F491039CF91F6CE63 +:10490000FFE84A1A49EB301C970C972A971A14981B +:10491000F4C9FED42EC8F148FFF41238CFC1F54ACD +:1049200001342F4BF4CAFEC01C3BCEF1E06A00807C +:10493000300B496CF01F00164948F0C9FF902F0852 +:10494000F148FFFC491A1238CFB130064918F54634 +:10495000007C910A9116310A0C9B48FCF01F000C58 +:1049600048E80C9C9106E3CD8040485BCC9B00005E +:1049700000007598000002200000755C000084B4FF +:10498000800148B0000082340000759C800091D006 +:1049900000007630000076200000761C4848485918 +:1049A000485A91099119913A912A5EFC000002241B +:1049B000800149D4800149EC48484859485A911926 +:1049C0009109913A912A5EFC00000224800149D4A9 +:1049D000800149EC48494858311AEA1A4000143C11 +:1049E0005E085E19800149D480014A0C481C5EFCB7 +:1049F000800149ECD4013019300A303BFC1C4000E6 +:104A0000F01F0002D8020000800186C8EBCD408074 +:104A10004B373099EA194000123CC310E088001F60 +:104A200030B9EA194000123CC2A0C4233139EA1956 +:104A30004000123CC500E069078AEA198000123C78 +:104A4000C241761CF01F0027300A4A77149B314C74 +:104A5000F01F00260E9CE3CD80803019EA1940003B +:104A6000123CC320E08800153079EA194000123C5E +:104A7000C0603089EA194000123CC0713019300A18 +:104A8000303BF01F001B49B70E9CE3CD8080FC1922 +:104A90004000123CCFA130194978300AF149004456 +:104AA000304C149BF01F00110E9CE3CD8080301918 +:104AB000300A303B30ACEA1C4000F01F000D48D7F4 +:104AC0000E9CE3CD8080302B300CF01F000C0E9C30 +:104AD000E3CD808048470E9CE3CD808080014A0C66 +:104AE0008001DA2C800149D480014658800186C8B3 +:104AF000800152F0000087F480018390D401201DD2 +:104B00001A9CF01F0008C07040085818E088000682 +:104B1000F01F00052FFDD802F01F00042FFDD80262 +:104B200080015F4480015EDC80015EB4EBCD40F823 +:104B3000201DFEF805EA189716951496103AC3A0A2 +:104B4000FEF805E0103AC610FEF805DC103AC06029 +:104B50000C970E9C2FFDE3CD80F8E068018CEA18DD +:104B60008000103CE08000F7E068078AEA188000C7 +:104B7000103CE08000ADE0680186EA188000103C3F +:104B8000CE8176170E9CF01F0169F01F0169C0915C +:104B9000FEF805A0EEEA0000F0EB00006E29912976 +:104BA0000C97FEFA0592300BFEFC0590F01F016495 +:104BB000CD1BF01F015F1894C4D1E0680184EA188E +:104BC00080001037E0800185E08B00D2E0680107AB +:104BD000EA1880001037E08001A0E0680183EA183D +:104BE00080001037CB616A170E9CF01F0156E080E1 +:104BF0000230FEF905523048F34800440E9B334C16 +:104C00000C97F01F0152CA6BFEF4053CE0680112DC +:104C1000EA188000E8F300F8103CC540E08B006320 +:104C2000E0680107EA188000103CE08000F7E068C7 +:104C3000010DEA188000103CE080010DE0680105DC +:104C4000EA188000103CC851761C1497F01F0140F0 +:104C5000C81BFEF304F2E0680188EA188000E6F45D +:104C600000F81037E08001B0E08B00ABE068018312 +:104C7000EA1880001037E080018BE0680184EA18B0 +:104C800080001037E080016EE0680107EA188000BC +:104C90001037FE91FF5F6A18303CF13B000BF01FAC +:104CA000012D3019300A303B30CCEA1C4000F01F97 +:104CB000012A300AFEF70470149B301CF01F0127F4 +:104CC000C49B761C1497F01F0126C44B6A1CF01F6E +:104CD0000125300AFEF70490149B314CF01F011F90 +:104CE000C39BE068018AEA188000103CE08000CB9A +:104CF000E068078AEA188000103CCE90E068011551 +:104D0000EA188000103CFE91FF2576150A9CF01FE2 +:104D100001170BC93048F0091800E08001BBE08B97 +:104D2000019B3008F0091800E08001BF6738301996 +:104D300011EAF20A1800E08001DD0A9CF01F010C64 +:104D4000FE90FF08300A0C97305C149BF01F0103A3 +:104D5000C01B76170E9CF01F0107F01F00F5C4F171 +:104D60000E9B33DC0C97F01F00F9CF4AE068018AF4 +:104D7000EA1880001037E08000BDE068078AEA1872 +:104D800080001037E0800099E0680188EA18800010 +:104D90001037FE91FEDF6A170E9CF01F00F7C0A0CF +:104DA000F01F00F63069FEF8039EFEF60376F14927 +:104DB00000440E9B336C0C97F01F00E4CCBAE06803 +:104DC000018EEA1880001037E08000B7E068078A9B +:104DD000EA1880001037FE90FF7BE068018AEA182D +:104DE00080001037FE91FEB66A160C9CF01F00E49E +:104DF0001897E0800114FEF7032ACACA3099FEF81A +:104E000003460C97F1490044FEFA032C300BFEFCDC +:104E10000372F01F00CBC9EA76150A9CF01F00DA76 +:104E2000302B169CF01F00D9FEF702FCF01F00C0CB +:104E30001896E08100DD0A9B337CF01F00C40C9AB9 +:104E40003019303B30ECEA1C4000F01F00C3FE9FDD +:104E5000FE8276160C9CF01F00CE302B304CFEF7F5 +:104E600002C6F01F00CAF01F00B2E08000EC30194B +:104E7000300A303B310CEA1C4000F01F00B7FE9FA7 +:104E8000FE6A76150A9CF01F00BE1897E08000BAF3 +:104E9000300A302C149BF01F00B13078E9480044F0 +:104EA000F01F00A3FE91FE560A9B0C9733BCF01F27 +:104EB00000A7FE9FFE506A1CF01F00AA089AFEF78A +:104EC00002A6089B314CF01F00A5FE9FFE446A1706 +:104ED0000E9CF01F00B0C060FEF9026C3058F34821 +:104EE00000440E9B335C0C97F01F0098FE9FFE332E +:104EF0006A170E9CF01F00A2C0803069FEF80248BD +:104F0000FEF60220F14900440E9B33BC0C97F01FC3 +:104F1000008FFE9FFE206A1B337CF01F008C089AD6 +:104F2000FEF702043019303B30ECEA1C4000F01F61 +:104F3000008AFE9FFE106938301911EAF20A180043 +:104F4000FE90FE086A1CF01F0094FE91FE03189A62 +:104F5000189BFEF70246301CF01F0080FE9FFDFBF1 +:104F60006A150A9CF01F008B1897E08000874F2A73 +:104F7000300BFEFC022AF01F00721897E08000AE92 +:104F800030580C97E7480044FE9FFDE56A150A9CDF +:104F9000F01F006C1897E08000956938301911EA0D +:104FA000F20A1800FE91FDD64E3A300B4FDCF01F8E +:104FB00000641897E08000A930480C97E748004447 +:104FC000FE9FFDC96A160C9CF01F006B1897C2600B +:104FD000F01F006A30684D37E7480044FE9FFDBB74 +:104FE000EACBFFFC301A30DCF01F005C3019300ACD +:104FF000303B30CCEA1C4000F01F0057FE9FFDAB59 +:10500000F01F004BFE90FF4E0E9A3019303B30CC13 +:10501000EA1C4000F01F0050C44B303B30CCEA1C6F +:10502000400030190E9AF01F004C0DEB304CF01F71 +:1050300000490E9A0E9B301C4BB7F01F0048FE9F94 +:10504000FD8A0C9B33ACF01F0041FE9FFD844D3662 +:10505000FE9FFDD63068F0091800FE98FE693828DA +:10506000F0091800FE91FD76300A0C97325C149B13 +:10507000F01F003AFE9FFD6F189A303B30CCEA1CBF +:1050800040003019F01F0034EB3B000D303CCD0BDD +:105090003008FACBFFFC0C9716F8301A30ECF01FF2 +:1050A000002FFE9FFD580A9CF01F003FFE90FD520E +:1050B000300A0C97306C149BF01F0028FE9FFD4BAC +:1050C0000BCB302CF01F00230E9A0E9B301C4B375D +:1050D000F01F0022FE9FFD3F189A303B30CCEA1CA7 +:1050E00040003019F01F001CEB3B000D301CCA0BB8 +:1050F00048D7F01F000FFE91FF750A9B338CF01FFD +:105100000013FE9FFD28189A303B30CCEA1C40006B +:105110003019F01F00110BCB301CC8AB800152F0CE +:10512000800151A8800156388001D9AC800185E406 +:105130000000763880018E9C8001E03C8001EF20E9 +:105140008001E88C000087F480016D6C8001E2D45E +:1051500080018390800186C8800146588001E00864 +:105160008001DA2C800149D48001E2FC80016D4A83 +:105170008001D9C88001E4D080014AFC8001E4307C +:105180008001E0D48001D9FC800183A08001D9E8AE +:105190008001E81C8001E3DC80014A0C8001E7B853 +:1051A0008001E58880016D48EBCD40C04C96189792 +:1051B0003138EA184000103CE0800087E088002485 +:1051C000E068010DEA188000103CC150E088004002 +:1051D000E0680115EA188000103CC0D0E068018A40 +:1051E000EA188000103CC070E0680112EA188000E4 +:1051F000103CC3910E9C4B7AF01F003718960C9C04 +:10520000E3CD80C03018EA184000103CC510E0889B +:10521000002E30D8EA184000103CC1003108EA18CE +:105220004000103CC3F030C8EA184000103CC1B147 +:10523000301C302BF01F00290E9C3019300A303BF7 +:10524000F01F00274A760C9CE3CD80C0E068010582 +:10525000EA188000103CCCF0E0680107EA188000F2 +:10526000103CCC900C9CE3CD80C0E04C008ACC304C +:10527000FC184000103CCF71307949B8300AF14930 +:105280000044149B302CF01F0019300A30FC149B92 +:10529000F01F0016302B300CF01F00100C9CE3CDDB +:1052A00080C0303C302BF01F000D0E9CCC7B48E9B9 +:1052B0007298ABC8300A9398149B303CF01F000BD7 +:1052C0000C9CE3CD80C048A60C9CE3CD80C00000C0 +:1052D000800151A880014B2C800183A0800186C8E9 +:1052E00080015638000087F480014658800149D477 +:1052F000D421FACD00E4FEF602E21898FEF502E0B1 +:10530000ECF700F83109EA194000123CE08000D5C2 +:10531000E08B003630A9EA194000123CE08000C260 +:10532000E088005330C9EA194000123CE08000A830 +:10533000C6A330D9EA194000123CE080011930F9C7 +:10534000EA194000123CC3D1FEFA0298300BFEFC71 +:105350000296F01F00A61896C341189BFEFA02841D +:10536000FEFC028CF01F00A1304C301BF01F00A18E +:105370000C9A0C9B301CF01F00A0C238E06901841D +:10538000EA198000123CE0880011E0690188EA19FE +:105390008000123CC100E08B00A5E0690186EA199B +:1053A0008000123CC0E1C078E0690183EA19800006 +:1053B000123CC363109CFEFA0226F01F0090189561 +:1053C0000A9C2C7DD8223079EA194000123CC7C0D3 +:1053D000E08800973089EA194000123CE08000CF55 +:1053E0003099EA194000123CCEC14FEA300BFEFC66 +:1053F000020EF01F007E1894E08000CF3048ED4888 +:105400000044CDFB4F7A300B4FECF01F0078CD916C +:10541000189A189B4FC5301CF01F0077CD2BE06900 +:105420000107EA198000123CCC60E0690115EA1915 +:105430008000123CC1203139EA194000123CCC11E5 +:10544000300A301C149BF01F006C300A304C149B47 +:105450004EE5F01F0069CB5B6F38301911EAF20A94 +:105460001800C72076160C9CF01F00690C9CF01FDA +:1054700000694E98580CF0051710CA3B303B3019A4 +:10548000300AF01F0066302B303CF01F005A300A03 +:10549000301C149BF01F00584E150A9C2C7DD822FE +:1054A0004D0A300B4DFCF01F00511897C3B0305817 +:1054B000ED480044C86B303B3019300AF01F0057EC +:1054C000302B304CCE3B6C9BE21B0040C2414C5A0F +:1054D0004D5CF01F0046C9D03028ED480044C71B82 +:1054E000E069018AEA198000123CFE90FF65E069DC +:1054F000018EEA198000123CFE91FF64C5CBFC19B5 +:105500004000123CFE91FF5E300A149B149CF01F79 +:10551000003AC57B300A4BC5149B301CF01F003687 +:10552000C50B30481A9BBAE8336CF01F00400E9A46 +:105530003019303B30ECEA1C4000F01F00384B893A +:105540004BB89119C3EB76170E9CF01F00310FC9B1 +:105550003068F0091800FE9BFF354B15F01F003531 +:10556000C2A10E9B338CF01F0031C2BB4AC530195B +:10557000300A303BF01F0029C24B49AA300B4AAC1D +:10558000F01F001ACAA1304849F5BAC81A9B334C1B +:10559000F01F0026C16B306AEECBFFE2FACCFFFCB5 +:1055A000F01F002530481A9BBA68335CF01F001FBB +:1055B000089ACBFB3019300A303B30CCEA1C400053 +:1055C000F01F00160FCB305CF01F000A300A301CB1 +:1055D000149BF01F0009CF5A000087F4800152F09D +:1055E00080018E9C8001E7548001EF208001E03C27 +:1055F000800183908001465880014B2C8001E58812 +:105600008001DA5480014A0C800149D48001E2FC17 +:1056100080016D48800151A8800186C880015638FC +:105620008001E7B88001EA8C80016D6C00000224E3 +:10563000800185E48002E736EBCD40804C9731084D +:10564000EA184000103CC6F0E088001DE068018CBC +:10565000EA188000103CC3B0E088002EE068019397 +:10566000EA188000103CC440E0680194EA18800009 +:10567000103CC2714BC7761CF01F003C0E9CE3CD62 +:10568000808030C8EA184000103CC400E088001D4B +:1056900030D8EA184000103CC21030E8EA18400048 +:1056A000103CC0F14B2A300B4B2CF01F00330E9CEA +:1056B000E3CD8080E0680186EA188000103CC0706D +:1056C0000E9CE3CD8080E04C008ACFB14A5AF01F97 +:1056D000002B18970E9CE3CD8080F01F00294A4ACA +:1056E000300B4A8CF01F00240E9CE3CD8080761C8A +:1056F000F01F0025F01F0025C0514A5B33CCF01F7E +:10570000002549970E9CE3CD80804A39731858983C +:10571000CD803098496AF3480044300B49FCF01FB3 +:105720000016CCFB49C973185888CCB03088F348B0 +:105730000044F2F900F87338301911EAF20A18003F +:10574000C0A03019300A303B30DCEA1C4000F01FAA +:105750000014CB7B486A300B492CF01F0007CB1B91 +:105760008001563880014A0C8001DA4680018E9C07 +:105770008001E03C8001EF2080014B2C80015E34F1 +:105780008001DA448001DA48800185E4000076383F +:1057900080016D6C000087F48001E0D4800186C830 +:1057A0008001E094EBCD40F84A37189416956E18B6 +:1057B0006E090E930E96C118300B301CEA1C400087 +:1057C0005D19300B6C39FC1C40005D196C388D285C +:1057D0006E186E091238C2001039C190300B301C9F +:1057E000EA1C40005D19300B6E19FC1C40005D196D +:1057F0006E188F086E296E381039CDF10A9B089CFF +:105800005D19873C6629123CCF71CE3B0A9B089CF0 +:105810005D198F1CCF0B5805C0706A085818C060FE +:105820000A9CF01F0006E3CD80F8EACCFFFCF01FD5 +:105830000004CF7B00000224800091E88001D3A8FF +:105840004878F14C00F8580CF9F81004F9B9010146 +:10585000F1D9E108F9F81A045EFC0000000087F4B1 +:10586000EBCD40C04948FAC6FFF4F0F700F4580702 +:10587000C051C1E8F8C70008C1B0EECAFFDC740827 +:10588000204D502815C9FB69000C15D8FB68000D88 +:105890006C0850080DC9BAC90DD8BAD8F01F000756 +:1058A0002FCD580CC0516E2C580CCE5118970E9C11 +:1058B000E3CD80C0000087F480018898D40149D9E5 +:1058C000F2F800F41838C0B078285808C2B0784808 +:1058D000201899482F8CF01F0018D802580CF9F89E +:1058E0001004F9BA01FFF1DAE108F9F81A043008F6 +:1058F000F34800F448FA78285808C180F0C9000835 +:10590000F54900F4CE8072482FF89348F4F900F47A +:105910005809CE10724820182F8C9348F01F0006AB +:10592000D80278385808CD41D802F54800F4CD3B6C +:10593000000087F48001F2A0D4014989F2F800F058 +:105940001838C0A078085808C240784820189948EC +:10595000F01F0013D802580CF9F81004F9BA01FF2F +:10596000F1DAE108F9F81A043008F34800F0780A8F +:10597000F34A00F0580ACED074482FF89548487979 +:10598000F2F900F05809CE50724820189348CE1B07 +:1059900078185808CDB1CDFB000087F48001F2A043 +:1059A000EBCD40801897580AC2C07858F608010815 +:1059B0001438E08800274948F0FB00F8580BC190E4 +:1059C000F8CAFFDC15D8204DFB68000D740950297A +:1059D00015C8F6CAFFDCFB68000C7408500815C92E +:1059E000BAC915D8BAD8F01F00092FCD580CC091EC +:1059F0000E9CF01F00070E9CF01F0006E3CF908066 +:105A0000E3CF8080000087F48001889880015938B6 +:105A1000800158BCD4214A141895E8F700F05807C3 +:105A2000C27079383006704AC02810976F387049B4 +:105A30001439E08A00086E080E965808CF710E9649 +:105A400010970A37C0D06A085808C0B00A9CF01FE7 +:105A500000145806C1300A9B0C9CF01F0012D8227B +:105A60006A185808CF416A482FF88B48CF3BE94C59 +:105A700000F078482FF89948D8220A9B0E9CF01F16 +:105A800000090E9CE94500F0F01F00050E9B0A9CE2 +:105A9000F01F0004D8220000000087F48001F2A06B +:105AA0008001F28CEBCD40C04A48FAC7FFF4F0F613 +:105AB00000F05806C051C3D86C065806C3A06D3814 +:105AC000707C2F4CF8E80000212DFAE90024F8EA58 +:105AD0000008FAEB002CF8E80010FAE90034F8EAC4 +:105AE0000018FAEB003CF9380020FB680044F93953 +:105AF0000021FB690045EEE80000FAE90000EEEA4B +:105B00000008FAEB0008EEE80010FAE90010EEEAEF +:105B10000018FAEB0018EF380020FB680020EF397E +:105B20000021FB690021F01F00062EED580CCC501F +:105B30000C9CE3CD80C00000000087F48001891038 +:105B4000EBCD40E0205D7608502817C9FB69000CBA +:105B500017D81697FB68000DF8CBFFE2306A18964D +:105B60001A9CF01F0034F01F00342FCD580CC05188 +:105B7000300C2FFDE3CD80E06E7C2F4CF8E8000068 +:105B8000212DFAE90024F8EA0008FAEB002CF8E8E5 +:105B90000010FAE90034F8EA0018FAEB003CF93892 +:105BA0000020FB680044F9390021FB6900456D388D +:105BB000707C2F4CF8E80000FAE90000F8EA0008D1 +:105BC000FAEB0008F8E80010FAE90010F8EA00180B +:105BD000FAEB0018F9380020FB680020F9390021A1 +:105BE000FB690021F01F00152EED580CCC20320B64 +:105BF000300CF01F00131895CBC0189A0E99491B52 +:105C0000F01F00110BF93008F0091800EDF800132F +:105C1000F1F90807EBF90E07FACCFFFC6D3818D83C +:105C20001A9CED45004CF01F0009301CCA3B0000D7 +:105C30008002E73680018898800189108001D8DCD5 +:105C40008001D3EC8001AD408001D3A8EBCD40C0F2 +:105C500049C649D86C09700A1439C05530070E9CE2 +:105C6000E3CD80C0350CF01F00191897CF906C0859 +:105C70002FF8350A8D08300BF01F0015320B300C51 +:105C8000F01F0014EF4C004C1898C16030084929EF +:105C90008F680E9CF30A017C8F28EF5A001CEF6876 +:105CA000002A8FF88F488F58EF4800408F188F08D0 +:105CB0008F38E3CD80C00E9C1097F01F0008CD0BED +:105CC000000076440000025880009200800091D0CD +:105CD0008001D8DC00000260800091E8EBCD4080BC +:105CE000189778485808E08A0004E3CD8080793816 +:105CF0005808C0402B4CF01F000648697208201855 +:105D00000E9C9308F01F0004E3CD80808001D3A88F +:105D100000007644800091E8D4014899F2FC00F834 +:105D2000580CC0A07848201899483008F34800F86B +:105D3000F01F0004D802F34C00F8D802000087F4EA +:105D400080015CDCEBCD40F84B131894E6F700F8CB +:105D50005807C060189B0E9CF01F002EC1D1E6F7BB +:105D600000F05807C4203006C1285806C0706F38AC +:105D70006D39704A7248103AC064E6F800F80E387F +:105D8000EE0617106E070E955807C0900E9C089BE4 +:105D9000F01F0020CEB00E9CE3CD80F8F01F001E57 +:105DA00058065F18580C5F0918971069EA0918001F +:105DB000C201089B306AEECCFFDCF01F0018089B84 +:105DC000306AEECCFFE2F01F00156F3A0899149C80 +:105DD000493BF01F001430080E9C8F088F18F01FED +:105DE00000120E9CE3CD80F8F01F000B1897CE2B0D +:105DF0000C9CF01F000E0C9CF01F000D0C9CF01F63 +:105E0000000DF01F00051897CD51CC6B000087F4F2 +:105E100080015B4080015C4C800091DC8001D3EC10 +:105E20008001AD4080015A1480015938800158BC6E +:105E300080015CDCEBCD40E04905EAF700F458074F +:105E4000C0D1C158F0C600080E9CF01F000D0E9C7A +:105E5000F01F000C5806C0B00C976E285808CF31C0 +:105E60000E9CF01F00070E9CF01F00063008EB4848 +:105E700000F4E3CD80E00000000087F4800158BC0E +:105E800080015CDC580CC04078185B98C110489ABF +:105E900074991298EDB90001F9BC0101F9BB001029 +:105EA000F3DBE038F5F80A09F9BC00015EFC5EFDA1 +:105EB000000087F4489A7498109CF0091604E21CBC +:105EC0000002F9BB0110F1DBE138F5F81A09F9B865 +:105ED0000101F3D8E12C5EFC000087F4489A749825 +:105EE000109CF0091604E21C0002F9BB01EFF1DB83 +:105EF000E128F5F81A09F9B80101F3D8E12C5EFCA4 +:105F0000000087F448887099129CA589E21C000261 +:105F1000F9BA0101F3DAE148F9B90101F1D9E12C4B +:105F20005EFC0000000087F418994868709CE21C31 +:105F30000002F1F8103FF3F81A00F9BC01015EFC11 +:105F4000000087F418994868709CE21C0002F1F880 +:105F50001041F3F81A00F9BC01015EFC000087F45F +:105F600018984859729CE21C0002F3F81A41F9BCD7 +:105F700001015EFC000087F44839300C7298A7C814 +:105F800093985EFC000087F44839300C7298A5D8CD +:105F900093985EFC000087F4D401E06A0100300BA6 +:105FA000482CF01F0003DA0A00007648800091D0E8 +:105FB000EBCD40C04A0A18967498109CE21C00026F +:105FC000C1D0F4F700F85807C1801099E2190020F9 +:105FD000C270A5C8A7A8F4FB00BC95983009497AFF +:105FE000E06CEA60F01F00163008F0061800C100EF +:105FF0003018F0061800C040301CE3CD80C0311CC2 +:10600000EECBFFE2306AF01F000FE3CF90C0312CDF +:10601000EECBFFE2306AF01F000BE3CF90C0A5B8D3 +:10602000F4FB00B89598E06CEA60487AF01F000431 +:10603000CDCB0000000087F480015F7880014558D7 +:106040008001465880015F88D401F01F0002D80209 +:1060500080018040D40148687098E2180002C03185 +:10606000109CD802F01F0003D8020000000087F443 +:10607000800183FCD40148687098E2180002C031A6 +:10608000109CD802F01F0003D8020000000087F423 +:10609000800183D8D431FACD0188E06A0168300BE1 +:1060A0001A9CF01F002CFAC6FE541A901A9CF01F7E +:1060B000002A581CC03029EDD832FAC5FFF8401824 +:1060C000F0081016EA0800081035C4120A97FAC43E +:1060D000FE98ECC1FFF8C09840182EA7F0081016E3 +:1060E000EA0800081037C3326C08204D50280DC94B +:1060F000FB69000C0DD80E9BFB68000D306A1A9CE2 +:10610000F01F0016F01F00162FCD580CCE60EECBFE +:10611000FFFA310AFACCFE88F01F0010E2E8000016 +:10612000310AE8E90000089BE2E20008FACCFE88A8 +:10613000E8E30008F01F000BCD01189B316A0E9CAC +:10614000F01F0004009CF01F0008CB6B29EDD83A2B +:10615000800091D0800160748002E73680018898C9 +:106160008000917C80016054D431FACD018CE06ACA +:106170000168300BFACCFFFCF01F0050FAC5FE504E +:10618000FACCFFFCF01F004E581CC03029DDD8327D +:10619000402858F8E088007FF0081016FAC1FFF494 +:1061A000E20800081031E0820087E06801685018BA +:1061B000EACBFFF8FAC6FFF002973004FAC0FE946B +:1061C000500BC0C85804C36040282EA7F008101612 +:1061D0002EA6E20800081037C4926A08204D502805 +:1061E0000BC9FB69000C0BD80E9BFB68000D306AD5 +:1061F0001A9CF01F0034F01F00342FCD580CCE3005 +:10620000ECCBFFFE310AFACCFE84F01F002E400BCF +:10621000F6E80000310AE0E90000FACCFE84F6E27C +:106220000008009BE0E30008F01F0028CB005804A2 +:10623000CCC10F89E8091800CC810F98F20818002A +:10624000CC410FA9F0091800CC010FB8F2081800D2 +:10625000CBC10D89F0091800CB810FD8F2081800C6 +:10626000F9B40100EE041700CB0B5804C2400A9B9E +:10627000306A089CF01F0013EACBFFF8310AE8CC23 +:10628000FFFAF01F0010FACCFFFCF01F001129DD0F +:10629000D832F00A1110FAC1FFF4F40A1016E2081D +:1062A000000C300BF01F00053108E0690168502830 +:1062B0005019C7FB3FDCC6BB800091D080016074E1 +:1062C0008002E736800188988000917C80016054CC +:1062D000EBCD40C0208DBACBBA8A189B4968709C20 +:1062E000E21C0002C06118970E9C2F8DE3CD80C088 +:1062F0003008FAC6FFF8504850281A99FACAFFFC2D +:106300000C9CF01F000EC111189740285808C0407F +:106310000C9CF01F000B404C580CCE70F01F000975 +:106320000E9C2F8DE3CD80C00C9CF01F0007581CE5 +:106330005F07CECB000087F48001E1308001D3A855 +:10634000800091E880018E9CEBCD40C0201D491754 +:1063500018966E9CE21C0002C0412FFDE3CD80C068 +:106360001A9CF01F000DEF4600FCEEF801105808D3 +:10637000C051301C2FFDE3CD80C0EECCFEECEF3AD7 +:10638000011BEF3B011AF01F0005301CCF4B000032 +:10639000000087F4800177A4800162D0EBCD4080BB +:1063A000201DBA8C48C76E98EDB80001C0402FFD83 +:1063B000E3CF808030181A99300A308B487CF01F68 +:1063C0000008581CCF511B88EF4801202FFDE3CD5A +:1063D00080800000000087F48003B7A08001776C04 +:1063E000D401201D48B91898729CE21C0002C0E03C +:1063F000300AF368004C308BFAC9FFFC486C12F885 +:106400003018F01F0006581C5F0C2FFDD80200004A +:10641000000087F48003B7A88001776CD401203D89 +:10642000BA8C496A749CE21C0002C0312FDDD8028C +:106430001B8B3038F00B1800E089001DE06832003B +:10644000EA18312EE069352EEA19312EFAE90004F6 +:10645000F4F800F8F3DBB008300A5808F1F91A0F25 +:10646000308B30181A99FACCFFFCF01F0005581C2D +:10647000CDE03FECCDCB0000000087F48001776CCD +:10648000D421206D4A0618976C98EDB80001C040E1 +:10649000300C2FADD822584C5FB8E04C00FF5F198C +:1064A0001268C0303FECCF6B300814995028169A10 +:1064B0005008189B1A951A9CF01F0014CEA01A9C25 +:1064C000F01F0013400818945808C0401A9CF01F91 +:1064D0000011402C580CC030F01F000F5814CD9103 +:1064E0006C98EDB80007C0C15837E08B000AEE0881 +:1064F000150648A9300A1009089C930ACCBB301C29 +:10650000CC9B0000000087F48001E1A480018E9CF8 +:106510008001D3A8800091E800007648EBCD40C010 +:10652000202D496718966E98E2180002C2103FF8B5 +:10653000FACAFFFEBAF8BAA8BAB8BAC8BAD8BAE85E +:10654000300BF01F000F6E98EDB80007C0E1583611 +:10655000E08B000CEC081506300A48A9301C100925 +:10656000930A2FEDE3CD80C02FEDE3CF90C0109CB8 +:106570002FEDE3CD80C00000000087F4800164802F +:1065800000007648EBCD40C0202D49F66C9CE21C03 +:106590000002C2703FF8BAF8BAA8BAB8BAC8BAD8F6 +:1065A000BAE8ECFB00F8580BC260F6CCFFE2303AD8 +:1065B000300BF01F0016FAC7FFFE301CF01F00144E +:1065C000303B0E9A300CF01F00136C99300B129870 +:1065D000ED4B0110A3D88D98EDB90007C050301CC9 +:1065E0002FEDE3CD80C0E06A010048BCF01F000B36 +:1065F000301CCF7BFAC7FFFE303A0E9CF01F000321 +:10660000CDDB0000000087F4800162D08001651CB2 +:106610008001648000007648800091D0D43120DD74 +:10662000FB690010FB68000CFAC9FFA8FEF7023CEA +:1066300018956E981696149272307201E218000244 +:1066400072147223C041300C2F3DD832E04B002031 +:10665000E08800043FFCCF9B584CE08B002158DBC6 +:106660005FBA301BFB380010F60818005F09126A89 +:10667000C030580CC1413078FACCFFD4FB680033ED +:10668000F01F007B3008303C50785058F01F0079E4 +:1066900058D6C070E08B00315856C0303FECCD5B0F +:1066A00030683019FB680033EF49011CFACCFFCD8C +:1066B000F01F0071501C1AD31AD41AD1FB38001CD9 +:1066C00004991AD80C9AFB380043FACCFFDC0A9BD9 +:1066D000F01F006A2FCD580CC1B140585808C05067 +:1066E000FACCFFECF01F0066407C580CCAD0F01FBB +:1066F0000065300CCAAB5906C6C0E0460020CCF19C +:1067000030283029FB680033EF49011CCD0BFACC4F +:10671000FFECF01F005D500C40585808C050FACCF8 +:10672000FFECF01F0057407C580CC030F01F0055A4 +:1067300040085818C8915800EFF81009F9B9010835 +:10674000F1D9E138EFF81A093009FB380010F208E6 +:106750001800C051F9D5B008F01F004C6E98EDB884 +:106760000001C0514C18F0F800FC501840185808AF +:10677000C080FB3A0010FB3B000C089CF01F00445B +:10678000306A089BEECCFEECF01F0042301AFACBC8 +:10679000FFF4EECCFEE6F01F003FEECCFEE5301A33 +:1067A000FACBFFF0F01F003B3018EF480110FB68F8 +:1067B00000326E9C4AD7EDBC0001C120EDBC000741 +:1067C000C061FB38000C50285845C1E1301CC3DBC8 +:1067D00030483039FB680033EF49011CC68B300864 +:1067E0004ADB1099109A109CF01F002CC3401ADC51 +:1067F0003018FAC9FFCA300A308B4A9CF01F0029B2 +:106800006E9C2FFDCDCBEA0915064A780C9AF0094B +:106810000007049BEF650026EF560024EECCFFFC3A +:10682000F01F001C089BEF610036306AEECCFFD8E9 +:10683000F01F00185803C110069B308AEECCFFD21F +:10684000F01F001440288FF0EF68003830188F08D0 +:10685000109CCFBA6E9CCB3B069B308AEECCFFD20D +:10686000F01F0012CF0B0000000087F4800177A416 +:106870008001EF6C80017BD88001E2148001D3A8F5 +:10688000800091E880018E9C8001641C800162D0B0 +:10689000800091DC80015E8480016AF48003B798F7 +:1068A0008001773000007648800091D0EBCD40C069 +:1068B000300749A60E98A7682FF7EC08000B76085A +:1068C0005808C0F10E985847CF714957EF3C004C1B +:1068D000F01F0014EEFC0100F01F0013E3CF90C086 +:1068E00076F8F6C9FFD2F73C00261AD8F6C8FFD8CA +:1068F0001AD91AD8F7390036F6CAFFFC1AD9F73870 +:106900000038F7390027F71B0024F01F00082FCDAF +:10691000581CCD90E3CF80C000007648000087F47B +:10692000800163E0800163488001661C7808301CA8 +:10693000F80A094C201C106C5EFCD70348787008DC +:106940005808C0901838C041C078103CC05070B88A +:106950005808CFC15EFD5EFF0000778C189A48F89A +:10696000709CE21C00025E0C70A8EDB80000C03004 +:10697000305C5EFC48AC780B583BE089000D300978 +:106980004888F00B003891189109950BF6C8FFFF65 +:1069900099085EFF3FDC5EFC000087F4000077880A +:1069A0000000776848D972A8EDB80000C1313008FE +:1069B000780A99D848ABF60A003A741999E974181C +:1069C000F8C9FFCC910C7808301CF60800389119F2 +:1069D0005EFC305C5EFC0000000087F4000077681D +:1069E000EBCD40C0189778B95809C18078C893C8D2 +:1069F0006EC891096E3C580CC050F01F000B300857 +:106A00008F3833CA6EA635AB0E9CF01F00080C9B66 +:106A10000E9CF01F0007E3CF80C078C94858911939 +:106A200078B9CE7B800091E8800091D0800183B05E +:106A30000000778CEBCD40801897580CC180789877 +:106A40005D1848F972095809C051C11872B958093E +:106A5000C0E01237CFC16E785808C0B06E3C580CF9 +:106A6000C060F01F000830088F588F38E3CF908047 +:106A70000E9C301BF01F0004E3CF90800000778C49 +:106A8000800091E8800169E0EBCD4080496972A8FF +:106A9000EDB80000C040305CE3CD8080493870091B +:106AA0001839E08A001E4928F00C00376E09580991 +:106AB000C15072DA580AF3F8000EEFF80A01F3FA3F +:106AC000000DF3F8100EF5F81A0E72E8129C910AF8 +:106AD000F01F00086E095809CED1E3CF90803FCC5B +:106AE000E3CD8080000087F400007788000077689D +:106AF00080016A34EBCD40F81897169614951294DD +:106B0000109333CCF01F000CC1403008990799B89E +:106B10009938995899889996994599649973487ABA +:106B2000301899A8741999C9930CF8C8FFD495180E +:106B3000E3CD80F8800092000000778CD401202DF6 +:106B4000500A48C972A8EDB80000C040305C2FED73 +:106B5000D80248981A99F00B032A3048FA08000B1B +:106B6000F01F0006581CF9BC0001F9BC01FECF0B58 +:106B7000000087F4000077488001F1D8EBCD40C0D9 +:106B8000201D4AC618976CA8EDB80000C441580CE7 +:106B9000C3F0789B580BC3C0780A580AC3954A695A +:106BA000F20A033850085808C061C1A870D85008CC +:106BB0005808C1601037CFB1F40815036EDA580ACF +:106BC000F3D8E009EFF8000EF3F80A01EFF8100E21 +:106BD000F5F81A0E400870DA70E9930A6E9B3F9838 +:106BE0008F18580BC0300E9C5D1B6E8B581BC0500D +:106BF000582BC150580BC0516E2A1A9CF01F000F21 +:106C00000E9C301BF01F000E2FFDE3CF90C02FFD18 +:106C1000E3CF90C0305C2FFDE3CD80C0ECF801B82D +:106C20000E38CEF130094838F14901B8CEAB00003A +:106C3000000087F40000776880016B3C800169E008 +:106C4000D40148C9169E72A8F1D8C001C031305C89 +:106C5000D8024898304A76A9F00C032C1ADAF6C804 +:106C6000FFF833CAF01F00052FFD581C5F0CD80237 +:106C7000000087F4000077488001F164D431204D92 +:106C800030084931189650285018FAC5FFF4FAC256 +:106C9000FFF802901A93FAC4FFFCC098E006032A9A +:106CA000F01F000C0E9B401CF01F000B3049049B92 +:106CB0000A9AE206032CF01F0009304818970A9937 +:106CC0001A9B089C5817CEB02FCDD83200007748B9 +:106CD0008001F1D880016B7C8001F0B4EBCD40E005 +:106CE000201D49356AA8A1A8300A49298BA8149704 +:106CF000930A14984906EC08002C2FF748FA303B09 +:106D0000F01F000F581CC0F10E985887CF5148D87B +:106D1000300991189109301B1A9CF01F000B2FFDB0 +:106D2000E3CD80E06AA8A1C88BA8CF2B000087F430 +:106D300000007788000077488001692C8001F05CB2 +:106D40000000778C8001695C5EFD5EFFEBCD4080CA +:106D5000189778785808C030788C5D180E9CF01F12 +:106D60000003E3CD80800000800091E8D4314B1017 +:106D70001895169260095809C58030047258721926 +:106D80000A38F7B400FF5809CFA10891E80C1502A2 +:106D9000F01F00291893C46060075807C2303006FE +:106DA000C0486E175807C1E06E580A38CFB10E9C24 +:106DB000F01F0022E60609276E485808C0F06E1939 +:106DC0005809EFF80002E1F80A01EFF90001EFF8C5 +:106DD0001002F3F81A026E2891092FF66E17580761 +:106DE000CE415804C1A006953006C0380836C154BB +:106DF0006A07049C6E686E8B5D18491B0E9CF01F21 +:106E000000112FF62FC56E485808CF100E9C48CBA6 +:106E1000F01F000C0836CED5069CF01F000B029C1C +:106E2000D8321891029CD83212941291CB0B0000E8 +:106E300000007794800092008001463A80016D4CFA +:106E400080014642800091E8EBCD4080324CF01F3B +:106E500000081897C080324A300BF01F00060E9CC5 +:106E6000F01F00050E9CE3CD8080000080009200A2 +:106E7000800091D080014652EBCD40FC18961695CB +:106E80001494129310924077F01F000AC100995693 +:106E900099359964998799739942487A3008991875 +:106EA00074199929930CF8C8FFFC9518E3CD80FC60 +:106EB00080016E4800007794D431FACEFFDC189739 +:106EC00016901491129310927C157C04580CC26099 +:106ED00078095809C26049A66C085808C051C09882 +:106EE00070185808C0601039CFC13018109CD832C3 +:106EF000F01F0014C13099509931996399859972A6 +:106F00009944300899186C199929930CF8C8FFFC1A +:106F10008D188F0C3018109CD8323008109CD83245 +:106F200008981AD50499069A029B009CF01F000647 +:106F30002FFD580C5F188F0CCDAB0000000077942C +:106F400080016E4880016E78EBCD40404856ECCC15 +:106F5000FFF8F01F000530088D168D08E3CD804046 +:106F600000007794800145D6EBCD40807847785A71 +:106F70006E18103AE0880004E3CF8080783B6E0CF6 +:106F8000F01F000B6E285808C0406E1B6E0C5D1879 +:106F90006E3CE04C002BC050300A149BF01F0005E3 +:106FA0000E9CF01F0005E3CF90800000800091DC74 +:106FB00080014658800091E8EBCD40C0203D30086C +:106FC00018979928990814961A9C308AF01F001176 +:106FD000FACBFFF80E9CF01F00102FED580CC101EA +:106FE0006E085808C0400E9CF01F000C6E2C580C08 +:106FF000C040F01F000B300C2FFDE3CD80C05806C1 +:10700000FBF81000EDF81A002FFDE3CF90C0000050 +:107010008002E7368001DE6C8001D3A8800091E811 +:10702000EBCD40C0189778185B98C0C0783B580BE0 +:10703000C17078465806C04078685908C050E3CF00 +:1070400090C0E3CF80C0785A590AE08800153FF815 +:107050008D28ECCCFFF4F01F000CE3CF90C0784CEF +:10706000580CCEE06E685908CEB12F4CF01F0006C8 +:10707000E3CF90C06C0CF01F00056E5830198D18CE +:107080008D29CE8B8001A25C800091DCEBCD40E0AD +:10709000201D1697E04C0081E0800088E08A0027E0 +:1070A000E04C0083C2F0C2B4760A1A9C300BF01F89 +:1070B0000064E08A004F585CC490314CF01F0061BE +:1070C0004008913C4009723A580AC7A06E0830093E +:1070D000990899399919EF380008992840083149D9 +:1070E000301A91594008911AC1D8584CC4A0E04CAC +:1070F0000080C330300C2FFDE3CD80E0E04C0085F4 +:10710000CFA16E0A300B1A9CF01F004DE08A0022BE +:10711000585CC1C0EF3900084008300A9119400896 +:10712000915A301B400CF01F0048581CCE41400CB7 +:10713000F01F0046C0B0400B76785808C070300C85 +:10714000F01F0043581C5F0CCD7B2FFDE3CF90E078 +:107150003FEC2FFDE3CD80E07645760A1A9C300B9C +:10716000F01F0037FE9AFFF6585CCF005805C49117 +:1071700040089135400993550FCA4008911ACD2B0C +:107180007626760A1A9C300BF01F002DFE9AFFE23D +:10719000585CCDC05806C1914008301A913640095C +:1071A00093564008911ACBEB760A1A9C300BF01FCD +:1071B0000024FE9AFFCF585CCC900FC9CAEB3FD891 +:1071C00093184009935ACAEBECC5FFED0A9CF01FD7 +:1071D000001D4008913C1899400A743B580BC2406E +:1071E0006E080C9A93089336EECBFFF430162F0CF2 +:1071F0009316F01F00184008915540099316C92BAB +:1072000040060A9CF01F000F8D3C4009723C580C50 +:10721000C1000A9A6E5BF01F000F400891550FC91C +:1072200040089119C7FB3FD895184009935BC7AB3D +:107230003FD893184009935CC75B000080016B3C0A +:1072400080009200800169A48001693C80016C404B +:10725000800091DCEBCD40FC4C151696189476021C +:107260006A095909E088001B4BE7C15878BA580AE7 +:10727000F9F8000CEFF80A01F9F8100CF5F81A0CFF +:10728000201978C8910A8B09F01F00376A0959093B +:10729000E08800056E0C580CCEA16C2338086C36C3 +:1072A000ECCCFFCCF0041800C260F01F003018973F +:1072B000C2F0B8C464080C9A990899A6069B2CCC15 +:1072C0008F9CF01F002B3808F0041800C2303818CB +:1072D000F0041800C2B04A3B30088FB8761A8FCA43 +:1072E0009507EEC9FFD46A0897192FF8301C8B0850 +:1072F000E3CD80FC64495809CD90ECC8FFC9E01883 +:10730000FFFCF009000CF01F00191897CD31E3CDF8 +:1073100080FC318A049BEECCFFF4F01F00156E7ADE +:107320008F2A580AC1018F8ACD7BEEC6FFF4318ABD +:10733000300B0C9CF01F000F049B0C9C308AF01F3C +:10734000000CCCAB6EA82FD8E018FFFC6E9C100C84 +:107350008F8C645BF01F0006CBFB0000000077A061 +:1073600000000234800091E880009200800091DCEF +:10737000800091D0D421207D1297FACEFFD04B29E6 +:1073800018947298EDB80001C040300C2F9DD8229F +:10739000FCE800003006BB295C7A50265046FAC54E +:1073A000FFF8FAC9FFE00A9CF01F00282FED580CE7 +:1073B000C2D05807C0B08F368F5640680E9B0C9CC9 +:1073C0008F28F01F0023581CC2E11A9CF01F0021D7 +:1073D0005BBCC29040076E4C580CC070F01F001E82 +:1073E00030088F388F4840075807C0401A9CF01F5C +:1073F000001B402C580CC030F01F00175804FBF83D +:107400001006E9F81A002F9DDA2A40085808C040F3 +:107410001A9CF01F0012402C580CCB80F01F000E5D +:107420002F9DD82A40085808C0401A9CF01F000B16 +:10743000402C580CC0313FDCCAABF01F00073FDCCA +:10744000CA6B0000000087F48001DF7480016C408B +:1074500080018E9C800091E88001D3A8EBCD40E0B4 +:10746000208D149616951897308A300BF01F001354 +:1074700059F6E08800052F8DE3CF80E00A9B0C9A37 +:107480001A9CF01F000FFAC9FFE030080C09FACC73 +:107490000001F368FFE0F8C6FFFF300B30AA0C9C38 +:1074A000F01F000832EB0ECC0C9CF01F0007CF4100 +:1074B0002F8DE3CF90E00000800091D0800091DC20 +:1074C0008000917080009164D43120AD189E109599 +:1074D00014974C781292709CE21C0002C0511896CE +:1074E0000C9C2F6DD832169AFAC6FFE41C9B0C9C9C +:1074F000F01F00400C9BFAC3FFFCFACAFFDC069C9D +:10750000F01F003D1896581CCEC15807C2F10E91CD +:107510000E90069CF01F0039401818945808C0407F +:10752000069CF01F0037403C580CC030F01F00355F +:107530005BB4C4D05807C170E06B0BB8E0CCFFF46B +:10754000F01F00315BDCC3A0582CC07060285BF8D2 +:10755000C04060188508CC5B029C301B3006F01FD1 +:10756000002BCBFB40988B08CBCB3FF8310C8B0822 +:10757000F01F002718941890C280F8C8FFF4500834 +:10758000109CF01F00248907640930088919089AA3 +:1075900031094A1B109CF01F00211891C20040982D +:1075A000189B9928300CF01F001E581CCB300C9BE8 +:1075B000029C3FD6F01F001BC94B029C301BF01FE2 +:1075C000001340988B08C8DB3FD6C8BB5807CFD004 +:1075D000029C301B3FD6F01F000DC83B400CF01F33 +:1075E0000012089C3FD6F01F0007C7BB000087F4BD +:1075F0008001745C80016FB880018E9C8001D3A8EB +:10760000800091E88001A22880016B7C80009200BC +:107610008001A28C8001702080016AF480016C409E +:10762000800169E08001A27CEBCD40E0209D49F81B +:1076300018991495709CE21C0002C06118960C9C6D +:107640002F7DE3CD80E0169AFAC6FFE8129B0C9CD2 +:10765000F01F00170C9B1A97FACAFFE01A9CF01F44 +:1076600000151896581CCEC11A9CF01F0013400834 +:1076700018965808C0401A9CF01F0010402C580C57 +:10768000C030F01F000F5BB6C0313FD6CD9B300C31 +:107690008B3C8B5C40880A9B8B28F01F000A581C8F +:1076A000CCF03FD6CCDB0000000087F48001745C96 +:1076B00080016FB880018E9C8001D3A8800091E882 +:1076C00080016C40EBCD40FC1895169414921293F7 +:1076D00010974076310CF01F0012C1D099369905F1 +:1076E00099149927189A3008310948EB109CF01F1B +:1076F000000E1896C100069B049C0C9AF01F000B0C +:107700001897581CC0500C9C301BF01F00090E9C91 +:10771000E3CD80FC30070E9CE3CD80FC800092001E +:1077200080016F6880016AF480017628800169E039 +:10773000EBCD406E202D4086129310951491169A31 +:10774000189B1A9CF01F0008069B0C99FAE2000097 +:107750000A9ABB23029CF01F00052FED2FEDE3CD0D +:10776000806E00008001745C80017374EBCD406812 +:10777000202D129310961495169A189B1A9CF01FA0 +:107780000008FAE800000C9ABB29069B0A9C300905 +:10779000F01F00042FED2FEDE3CD80688001745CB5 +:1077A00080017374EBCD40401896303CF01F00040C +:1077B0007848301C8D08E3CD804000008001EF6CDC +:1077C000EBCD406048A618952F060C9CF01F0009D1 +:1077D000303CF01F0009310AF8CBFF8C0A9CF01FE7 +:1077E00000070C9CF01F0006E3CF9060000087F4B8 +:1077F000800145F88001EF6C800091DC800145FA42 +:10780000D42149461894ECC5FFF00A9CF01F0012E1 +:10781000ECF700F85807C0C06F38707B2F4B322A46 +:10782000089CF01F000E0A9CF01F000DDA2A303C65 +:10783000F01F000CC060F9380088EE081800C06026 +:10784000ECCCFFF0F01F0006D82AF8CBFF78CE8BE7 +:10785000000087F4800145F88002E736800145FA90 +:107860008001EF6CEBCD40E049061895ECC7FFF0C6 +:107870000E9CF01F000F303CF01F000EECF600F8DD +:107880005806C0C0ECCBFFE2306A0A9CF01F000A29 +:107890000E9CF01F000AE3CF90E00E9CF01F000743 +:1078A0000C9CE3CD80E00000000087F4800145F8E7 +:1078B0008001EF6C8002E736800145FAEBCD404055 +:1078C000209DE04B0020E08B001CBABB580BC1B1DF +:1078D0003FF8BAA849162F060C9CF01F0011303C47 +:1078E000F01F0010322AFACBFFFEF8CCFF78F01F11 +:1078F000000E0C9CF01F000D2F7DE3CF90402F7DDC +:10790000E3CFC0403008169ABAA8189BFACCFFFC07 +:10791000F01F0007CE0B0000000087F4800145FC3B +:107920008001EF6C8002E736800145FE800091DC2B +:10793000EBCD40E01895303CF01F000B1897C110BC +:1079400048A62F060C9CF01F000A0A9B306AEECC5A +:10795000FF56F01F00080C9CF01F0007E3CF90E0DB +:10796000E3CD80E08001EF6C000087F4800145FCEE +:10797000800091DC800145FED401F01F0002D80296 +:1079800080017930EBCD40EC202D18961697586B7E +:10799000C0503FFC2FEDE3CD80ECFACCFFF8E06364 +:1079A000312EEA13322EE0623100EA12312EB92371 +:1079B00016980C99300A308B1A9CF01F0010301C5E +:1079C000F01F000F48F81893F0C5FFF00A9CF01F55 +:1079D000000E5803C0C00E9A0C9B069CF01F000BB3 +:1079E0000A9CF01F000B2FEDE3CF90EC0A9CF01FD8 +:1079F0000008069CCD0B00008001776C8001EF6CC5 +:107A0000000087F4800145FC800091DC800145FE88 +:107A1000EBCD40E01897303CF01F0018EEC8000195 +:107A200018955818E0880004E3CF80E058175F09E4 +:107A300049366D1858385F0AF5E90009C0E1582742 +:107A40005F08F5E80008C030E3CF90E0F01F000DBC +:107A5000C0A18B47E3CF90E0F01F000B6D185838A2 +:107A60005F0ACEEB303CF01F000578485818CF2055 +:107A7000F01F0005CEFB00008001EF6C000087F4D2 +:107A800080017BC88001F340EBCD40F81696189337 +:107A900076085858E08A002A49A83064F0C5FFF0FB +:107AA00097040A9CF01F0018301CF01F001818974C +:107AB000C160202D189B089A1A9CF01F0015F01F1A +:107AC00000152FED580CC1616C0A0E9B069CF01F2F +:107AD00000120A9CF01F0011E3CF90F80A9CF01FDF +:107AE000000F0E9CE3CD80F830683FFC9708E3CD93 +:107AF00080F80A9CF01F00093FBCE3CD80F800002D +:107B0000000087F4800145F88001EF6C8002E736C1 +:107B1000800188B0800091DC800145FA0050F200BD +:107B2000000FAC003008F9480320F94803245EFC3C +:107B3000EBCD40C016971496F8FE0320FCCBFFFF58 +:107B4000F60A141FE069851FEA1951EBF60904488B +:107B5000A5591419F8FA0324F2091064121B143BF6 +:107B6000C0B0F94B0320F80E0927FCC8FF9CF808A9 +:107B70000926E3CF90C0E3CF80C0D401189EF8FC63 +:107B80000324FCF803201838C1F0F8C8FF9CFC0C53 +:107B9000032CFC08032930089709E069851FEA19BE +:107BA00051EBFCFB0324FC0B09282FFBF6090448CE +:107BB000F60A141FA5591419F2091064F6090109EF +:107BC000FD490324D802D80A4838F0F900F85809CA +:107BD0005F1C5EFC000087F43018198CF00C180054 +:107BE0005F0A3058F00C18005F09124AC0F1306883 +:107BF000F00C1800C0B03028F00C1800C080584CB1 +:107C0000F9BC0003F9BC01005EFC5EFF302C5EFC99 +:107C100048C8F0F800FC5818C0D0C0635828C0D03D +:107C20005838C0505EFF580C5F0C5EFC583C5F8CAF +:107C30005EFC581C5F8C5EFC582C5F8C5EFC000068 +:107C4000000087F4EBCD40C01897169E740A580ABE +:107C5000C0D0753A580AC0A0747A580AC0704FF85C +:107C6000F0F901045889E0880004E3CF80C04FC8D0 +:107C7000F009032F94D8EDB80004CF813008301CF0 +:107C80009D08E3CD80C0F53900C83FF8F009180021 +:107C9000CED0F51B00D2580BCE90F51C00D030266C +:107CA000F4FA00D8F40C002811B9EC091800E080AF +:107CB00000BFF8C8FFFF3009F40800280C9CF0CA88 +:107CC000FFFDC07815882FCAF8081800E08000B0C2 +:107CD0002FF91639CF85CCABF53900C83FF8F0093C +:107CE0001800CC40F51B00D2580BCC00F51C00D07E +:107CF0003016F4FA00D8F40C002811B9EC09180079 +:107D0000E08000A4F8C8FFFF3009F40800280C9CAC +:107D1000F0CAFFFDC07815882FCAF8081800E08067 +:107D200000952FF91639CF85CA1BF53900A43FF805 +:107D3000F0091800C9B0F51B00B2580BC970F51C4A +:107D400000B03026F4FA00B8F40C002811B9EC09A0 +:107D50001800C660F8C8FFFF3009F40800280C9C22 +:107D6000F0CAFFFDC06815882FCAF8081800C58042 +:107D70002FF91639CF95C7ABF53900A43FF8F009B4 +:107D80001800FE90FF74F51B00B2580BFE90FF6FB9 +:107D9000F51C00B03026F4FA00B8F40C002811B934 +:107DA000EC091800C3D0F8C8FFFF3009F408002818 +:107DB0000C9CF0CAFFFDC06815882FCAF80818008F +:107DC000C2F02FF91639CF95C51BF53900A43FF83D +:107DD000F0091800FE90FF4BF51B00B2580BFE9007 +:107DE000FF46F51C00B03016F4FA00B8F40C002879 +:107DF00011B9EC091800C220F8C8FFFF3009F408D7 +:107E000000280C9CF0CAFFFDC06815882FCAF8082E +:107E10001800C1402FF9123BFE99FFF9C27B3028B0 +:107E2000AE8830199D09129CE3CD80C03028AE8801 +:107E30003029301C9D09E3CD80C03018AE88301940 +:107E40009D09129CE3CD80C03018AE883029301CCB +:107E50009D09E3CD80C00000000087F48003B7B027 +:107E60003028F00C1800C390E088001B3048F00C5C +:107E70001800C3503058F00C1800C21030093028D8 +:107E8000F00B1800C160F00B1800E08B001B3018DD +:107E9000F00B1800C100300812385F5C5EFC30182F +:107EA000F00C1800CEC130193028F00B1800CEC1EC +:107EB0003038C02830181039CF045EFE3029CE0B80 +:107EC0003048F00B1800C0703058F00B1800CE414D +:107ED0003028CF2B3048CF0B3039CD2B3049CD0B4C +:107EE000D431307977387075B8891894581AC0D061 +:107EF000C043582AC4C0D83A7738707A94D9EDB9BB +:107F00000004E0800087DA3AEB3900A43FF8F0097A +:107F10001800CF20EB0800B03009F2081900CF405C +:107F2000149112923006307B30533060C1A8E007C4 +:107F30001800C2B03028F0071800C7A03048EE087B +:107F40001800F9BC0003F9BC0100F01F003CE9F780 +:107F50001E002FF6EB1800B00C38FE9AFFD6098BE6 +:107F6000EAF800B8F006002811B70E9CF01F0034A4 +:107F7000FE9AFFF1E20718005F08E60718005F09A4 +:107F80001248E4081800CD40301CCE0BEB3900C875 +:107F90003FF8F0091800CB00EB0800D03009F208D8 +:107FA0001900CB2012913006307B301230533060F4 +:107FB000C1A8E0071800C2B03028F0071800C3A01D +:107FC0003048EE081800F9BC0003F9BC0100F01FAE +:107FD000001BE9F71E002FF6EB1800D00C38FE9AB4 +:107FE000FF94098BEAF800D8F006002811B70E9C20 +:107FF000F01F0013FE9AFFF1E40718005F08E60780 +:1080000018005F091248E2081800CD40301CCE0B62 +:10801000307B305CF01F000AFE9AFF77301CF01FA7 +:108020000007FE90FF723058301CA888D832302CE0 +:10803000C8DB302CCCDB000080017C1080017E602E +:108040003008484A48499508951893085EFC000096 +:10805000000089EC00008C5CEBCD4080189E198BF1 +:10806000580BC130300A3017149CFC0A00092FFA53 +:1080700013982018EE080948F9E81008F9D8B0104C +:10808000163ACF45E3CD8080169CE3CD80807938C9 +:10809000707A3308F53900C8F0091800C0205EFD79 +:1080A000F51800D4E218000C5848C0E0E08A000837 +:1080B0005888C08058C8CF41310C5EFC5808CF01A9 +:1080C0005EFF304C5EFC302C5EFCD703EBCD40E015 +:1080D00030081896109A169C8D084927760E301590 +:1080E000109BC0A8F80A00082FFA11C9EE0B070868 +:1080F000A7D91039C0A01C3ACF652FFB58DBE08B05 +:10810000000E300A780ECF8B6C08EA0B0949124832 +:108110008D082FFB58DBFE98FFF6E3CF90E00000C0 +:108120008003B7F4EBCD40C030069906149EF8C723 +:10813000FFFC1799EC091800C0E00C9AF60A000839 +:1081400011A90EC978082FF899082FFA1798143832 +:10815000FE99FFF61D993008F0091800C0F0300BA9 +:10816000FC0B000811A9EE0B0B0978082FF89908F1 +:108170002FFB1D981638FE99FFF5E3CF90C0EBCD8D +:1081800040F816941897780B68065806E08A002C79 +:10819000F6C8FFFCE8C5FFFCF8080003300E2FCC42 +:1081A000EA0E070A580BE08A00130FC81458F1D8DA +:1081B000C007C1503009C078F80907081458F1D831 +:1081C000C007C0D02FF9123BFE99FFF8597BE08B16 +:1081D000000706CA6E0B2FFB8F0B68062FFE1C369E +:1081E000FE99FFE0E3CF90F8EBCD40FE1894169295 +:1081F0001497780676055805E08A0025ECC8FFFC40 +:10820000F6C3FFFCF8080001300EF4CCFFFCE60ECC +:10821000070A6E0B580BE08A00120FC81458F1D8E9 +:10822000C007C1203009C078F80907081458F1D8F0 +:10823000C007C0A02FF91639CF852FFE1C35FE9937 +:10824000FFE8E3CF90FE5976FE9BFFF902CA68066D +:108250002FF689062FFE64051C35FE99FFDACF2B19 +:10826000D42178045804E08A0027F8C7FFFC493875 +:108270000F8B700C11C6580CE08A0017F0C5FFFC7C +:10828000300EEDEB2008F1D8C007C0F00A9A300993 +:10829000C0782FFA15881658F1D8C007C0602FF99A +:1082A000123CFE99FFF8D82A2FFE2FF7083EC03463 +:1082B0000F8BCE8BDA2A00000000023CD4211897E5 +:1082C00076055805E08A0026F6C6FFFCF8CEFFFCCE +:1082D000300B1694C0482FFB0A3BC1B4EC0B070AC5 +:1082E000E80A1800CF946E0C580CE08A00120FC8F0 +:1082F0001458F1D8C007CF003009C078FC0907082E +:108300001458F1D8C007CE802FF91839CF85D82A54 +:10831000DA2A3248F00C1800C110E08800113488C5 +:10832000F00C1800C0B0E08800183608F00C1800F7 +:10833000C05036C8F00C1800C0E15EFF3128F00CC8 +:108340001800CFC03188F00C1800CF8030C8F00C76 +:108350001800CF405EFD3308F00C1800CFC1CEEB03 +:10836000EBCD40E078055805E08A0010F8C6FFFC28 +:108370003007C0380A37C0940D8C2FF72FF6F01F46 +:108380000004CF90E3CF90E0E3CF80E08001831240 +:108390004838F14B01DCF14C01D85EFC000087F459 +:1083A0004838F14B01ECF14C01E85EFC000087F429 +:1083B000EBCD40801697581BC050582BC080E3CFA0 +:1083C0008080F01F00050E9CE3CD8080F01F00022E +:1083D000E3CF9080800091E8D401580CC070486BC6 +:1083E000760AE04A0168E0880003D80AF01F00031B +:1083F000DA0A0000000089EC800091DCD401580CFE +:10840000C0A078185908E08B0007780AE04A016894 +:10841000E0880003D80A189B482CF01F0003DA0AF2 +:10842000000089EC800091DCEBCD4040350A1896C5 +:10843000F01F000330088D48E3CD8040800091DCC0 +:10844000D401306AF01F0002D8020000800091DCE5 +:10845000D401300CF01F0002DA0A000080016C7CAD +:10846000D421201D189414971296169A1095189BD3 +:108470001A9CF01F001CE08A0032585CC27058063B +:108480005F1858075F191268C241300840099338D5 +:10849000400A95584008301B9115400CF01F0012FF +:1084A000581CC100400C78785808C090189B089C54 +:1084B000F01F000E581CC0A03FDCC098301BF01FFE +:1084C000000C400C78785808CF21301C2FFDD822A2 +:1084D0004008913740099356CDEB3FEC2FFDD82251 +:1084E00080016B3C800169A480016C40800169E0DF +:1084F000EBCD40C018971696303CF01F00283DD8B1 +:108500003079AE88AE9935083F29300BAEB8AEC988 +:1085100030283019AED8EF6B0008AEABAEEBAEF939 +:1085200058065F1AF8F900BC58095F181468F60875 +:108530001800C310F8F800D05818F9B80008EFF880 +:108540000E08F8F800CC5818EFF80808F9B900043C +:10855000F1D9E038EFF80E08F8F800C85818EFF82D +:108560000808F9B90002F1D9E038EFF80E08F8F878 +:1085700000C45818EFF80808F9B90001F1D9E0383B +:10858000EFF80E08F8F900D4EF380008F1E91048C8 +:10859000EF680008E3CD80C08001EF6CEBCD404078 +:1085A0001896303C5C76F01F000E5876E088000488 +:1085B000E3CF804048B8F006032FF90C00C6E3CDA6 +:1085C0008040F90C00CAE3CD8040F90C00CEE3CD29 +:1085D0008040F90C00D2E3CD804000008001EF6CB8 +:1085E0008003B7D4D40130DCF01F0002784CD802ED +:1085F0008001EF6CEBCD40FC207D31CA1893300B2D +:108600001A9C1A92F01F001266045804E08A00189F +:10861000E6C6FFFC30070D852FF72FF60A9CF01FEA +:10862000000DC0A14008FACAFFE4F0C9FFFF100A1C +:108630005009F565FFE80E34FE99FFEF1A9B069C82 +:1086400031CAF01F00052F9DE3CD80FC800091D042 +:1086500080018312800091DCEBCD40E0207D300B67 +:10866000189731CA1A9CF01F00171A956E0B580BF9 +:10867000E08A0024300AFAC6FFFCEEC9FFFC0C9C1D +:10868000149EC0582FF9143BE08A000D2FFA13886E +:10869000FC081800CF8418C82FF96E0B143BFE9904 +:1086A000FFF7F80601061A9B50060E9C31CAF01F10 +:1086B00000062F9DE3CD80E0FAC6FFFC0C9CCF2B7B +:1086C000800091D0800091DCD421129618971695E5 +:1086D0001494580CC1205809C111314CF01F0009E5 +:1086E000C0C09907B8C599249936487A7419994930 +:1086F000930CF8C8FFF49518D822F01F0004D82274 +:1087000080009200000077A4800147E0EBCD40C0DC +:108710001896580CC110308CF01F000C1897C090A0 +:108720000C9CF01F000B8F1C1898C0A030188F08ED +:108730000E9CE3CD80C018970E9CE3CD80C00E9CAC +:108740001097F01F0004CF5B800092008001D920B9 +:10875000800091E8EBCD40C049566C075807C180B6 +:108760006E395809EFF80004EDF80A01EFF810042B +:10877000F3F81A046E4891096E2A0FCB6E0CF01FA5 +:10878000000D0E9CF01F000C6C075807CEA148B8D6 +:10879000F0C7FFEC0E9CF01F000AC071302CF01FD8 +:1087A00000090E9CF01F0008E3CD80C0000077A4F4 +:1087B000800147E0800091E8000087F4800145DCFB +:1087C0008001478C800145ECD4014848300991185C +:1087D0009109F01F0003D802000077A4800187549C +:1087E000EBCD40FE4A0618976C0816951494201895 +:1087F000E0480167E0880004E3CFC0FE580A5F1933 +:108800006C1A300B580A5F181268F6081800CF501F +:10881000183A5FB858FC5F891268F6081800CED085 +:1088200016910C92C0B82FF7641958F75F8A0E3969 +:108830005FB81468E2081800CE00EE031016306A24 +:10884000E6CCFFF80A9BEC0C000CF01F0008CEC130 +:10885000485B089C060B310A2F2BF01F00050E9C6D +:10886000E3CD80FE000089EC8000917C800091DCEB +:10887000EBCD40E018951697300C18960E9A0A9B8F +:108880002F07F01F0005C0452FF62FFCCF8B0C9C47 +:10889000E3CD80E0800187E0D401306AFACCFFFCB0 +:1088A000FACBFFF4F01F00025F0CD8028000917C2D +:1088B000EBCD4068205D3FF8FACAFFDC15D9FB68B4 +:1088C0000013FB68000EFB68000FFB680010FB68DC +:1088D0000011FB680012FAC6FFF8ACD974088D08C5 +:1088E00015C9FAC3FFFEACC93065FACBFFF20A9A8C +:1088F000069CF01F00060A9A069B0C9CF01F0004C1 +:108900005F0C2FBDE3CD80688002E7368000917C4C +:10891000D401FACBFFFCF73900241788F0091800BE +:10892000C020D80AF73A00251798F4081800CFA1FC +:10893000F6CCFFFE2DABF01F00035F0CD802000049 +:108940008000917CEBCD4040211D303CF01F001E8B +:10895000322A1896FACBFFB4FA0A000CF01F001B5B +:10896000ECC6FF78ECE80000FAE90000ECEA000849 +:10897000FAEB0008ECE80010FAE90010ECEA001845 +:10898000FAEB0018ED380020FB680020ED390021DB +:10899000FB690021FB3A00221B88F4081800C05034 +:1089A000300C2EFDE3CD80401B9AFB380023F408E9 +:1089B0001800CF71FACBFFFEFACCFFDCF01F0004E9 +:1089C0005F0CCF0B8001EF6C8002E7368000917C5A +:1089D000EBCD40E0203D4B571896EF3900943FF81F +:1089E000F0091800C3507938707C2F4CF8E800006B +:1089F000209DFAE90000F8EA0008FAEB0008F8E820 +:108A00000010FAE90010F8EA0018FAEB0018F9383B +:108A10000020FB680020F9390021FB690021F01FCC +:108A200000242F7D580CC0412FDDE3CD80E0202DA8 +:108A3000EEC7FF4A306A0E9B1A9CF01F001EF01F03 +:108A4000001E2FED580CC1C02FDDE3CF90E0F8CB16 +:108A5000FFE2306A1A9CF01F0017EECBFF4AFAC6FD +:108A6000FFFA306A0C9CF01F00130C9B1A9C306AB2 +:108A70001A95F01F00125F0C2FDDE3CD80E0ECCBE8 +:108A8000FFE2FAC5FFFA306A0A9CF01F000A0E9B4B +:108A9000306A1A9CF01F00071A9B0A9C306A1A96CB +:108AA000F01F00065F0CCC1B0000026080018944AF +:108AB0008002E736800188B08000917CD401201DBF +:108AC000500C580CC0401A9CF01F00022FFDD80219 +:108AD0008001D3A8D401201D500C580CC0401A9C12 +:108AE000F01F00022FFDD8028001D3A8EBCD40C0BB +:108AF000E06B00E41896300CF01F000A1897C0E0F5 +:108B0000E06A00E40C9BF01F0008ECC9FFF8EECA15 +:108B1000FFF8486B0E9CF01F00060E9CE3CD80C052 +:108B20008001D8DC800091DC8001D3EC8001ACA80E +:108B3000EBCD40C0E06B00EC1896300CF01F000A43 +:108B40001897C0E0E06A00EC0C9BF01F0008ECC92D +:108B5000FFF0EECAFFF0486B0E9CF01F00060E9C63 +:108B6000E3CD80C08001D8DC800091DC8001D3ECB3 +:108B70008001ACA8EBCD40FE129210914A88F0F92A +:108B800000F818933DD8733C316916977874AE8815 +:108B9000AE9930083509AEA8AEB93F283019301665 +:108BA00014954A0B303AAEC8AED9AE36EECCFFF8CB +:108BB000F01F001D069CEF65000BAE76AE66308B95 +:108BC000F01F001A8F5CC290303A496BF01F0016FC +:108BD0006E58B0B28EE86E5C303AF808002C491B33 +:108BE000F01F00116E598EE8F2080028B0B1E919A3 +:108BF00000B0E91800B21208E93900A5A3682F08EF +:108C00001039C030E3CF90FE0F9830092FE8EF59AC +:108C10000010AE98E3CF90FEE3CD80FE000087F415 +:108C200080017B1C800091DC8001D3ECD431201DBD +:108C3000314E1697330BAE9EAE8B1090FACBFFD809 +:108C40007618500818921493129176055805E08A08 +:108C50000006EA0815042EA8AE983016303AAE1673 +:108C600049E4EECCFFFCE8CBFFFCF01F001D049CA8 +:108C7000AEF3AE56AE46AE75EA0B15042F8BF01F61 +:108C800000198F4CC280303AE8CBFFFCF01F001473 +:108C90006E48B0B18EC86E4CE8CBFFFCF808002CD3 +:108CA000303AF01F000F6E498EC8F2080028B0B0AD +:108CB0003289AE695805E08A000D6E488EC98EDC97 +:108CC000EA0A1504120C400BF00C002CF01F0004F3 +:108CD0002FFDDA3A2FFDD83280017B1C800091DC19 +:108CE0008001D3ECEBCD40E0201D500B1897580CC1 +:108CF000C070169A4C4C0E9BF01F0044C6404C4668 +:108D000030080DA9F0091800C050301C2FFDE3CD2C +:108D100080E0ECCCFFE4F01F003FCF815807C2F0A9 +:108D2000301CF01F003DC3304B751A9B4B6CF01F7D +:108D3000003B1897C320F01F003A3018ED4C00CCD0 +:108D4000ACA80E9C3005400BED5500D04B07F01F32 +:108D500000351896581CC3F1EECCFFE4F01F00322A +:108D60004B28F1090142EA091900CD006E98EDB8CF +:108D7000000ECCC0F01F002E0C9CCC9B4A25EAF9BB +:108D80000320EAF803241039CCC1CD0BECCCFFE46E +:108D9000F01F0025301CCBBBECF801245818C04054 +:108DA000301CF01F0024ECCCFFE4F01F001FEAF998 +:108DB0000324EAF803201238CA90301CF01F001672 +:108DC000301CCA5B492AF50B00D2F80B1900C0A071 +:108DD0003FBCC9DBEECCFFE4AEA5F01F00133FBCE7 +:108DE000C96B3018F55800D24909F3080142F6085A +:108DF0001900CEF07498EDB8000ECEB0F01F000C44 +:108E00003FBCC85B000084CC80017B30000087F44D +:108E1000800145DC80019F3080017B7A800145C460 +:108E200080014664800145EC000002608001FBFC8B +:108E30008001A128EBCD40C01897F01F0015C1B0EC +:108E40006E4849468D186E598D2930096E2C8F2930 +:108E50006E486E3BE2180080F9B80001EDF80E0292 +:108E6000F01F000D1897581CC0803008300CACA8BB +:108E7000E3CD80C0E3CF90C0F01F00083008ED4C78 +:108E800000CCED5800D00E9CE3CD80C08001C6A080 +:108E9000000087F480014664800145C4EBCD40802A +:108EA000491A18977498EDB80001C111F4F801241B +:108EB0005818C0A07848951878599529F01F000BCC +:108EC000C091E3CD8080109CE3CD80803FBCE3CD9A +:108ED000808030086E2C6E3B8F28F01F0005E3CD9C +:108EE00080800000000087F48001C6A080018CE42F +:108EF000106104000000000040200700FFFFFFFF9A +:108F0000000000004869F2F802045828C0205EFE04 +:108F1000580CCFE0F2C8FFF099085EFF000077AC74 +:108F20005EFDD7034828912C913B5EFF000077AC93 +:108F300048384849910C930B5EFC000000007540D6 +:108F4000000074B45EFCD703D431202D500C3008DF +:108F5000FAC1FFF81690109402D84A424A43E269D7 +:108F60005A4C089A0819029B009C40085D181895F5 +:108F70005804C0B1584CF80A1780F9BA0B0449DB01 +:108F8000401CF01F001DC2E140165805C1000A97A1 +:108F90005907EE0A1780F9BA0B100C9B1417140628 +:108FA00064085C7A660C5D185807CF310A04E24405 +:108FB0005A4BFE98FFD65875E088000D4018EACC51 +:108FC000000848CBF00C000C2F8B308AF01F000AF1 +:108FD000C0913009009C129A129B40085D182FED39 +:108FE000DA3A30DC2FEDD83200007540000074B45E +:108FF00080018EF08000917CEBCD40FC49F8189404 +:10900000F0C3FDDCF0C7FFBC3072C0B8321A089B59 +:109010000A9CF01F001B1896C1D02C470637C16070 +:10902000EEC5002C5804CF316E08109C5808CF6054 +:10903000F01F00148F04EF44FFF86E185808CEE1BB +:109040008F248F322C470637CEC15804C0D0E3CFCF +:10905000C0FC6ABC580CC080F01F000A8B968BB60F +:109060006AC85808C030E3CF90FC8BD8301C3078E9 +:109070008BE8E3CD80FC0000000077AC8000917CA1 +:10908000800091E8EBCD40FE109114961895169251 +:109090001293F4C80008E0480037E08B00185859D4 +:1090A000C18049D8F0C4FE08F0C7FFE86EB8580880 +:1090B000C1300E9C321A0A9BF01F0018C1D02C47F9 +:1090C0000837CF51307CE3CD80FE30ACE3CD80FE5D +:1090D000129CE3CD80FEECCBFFFF049CF01F001040 +:1090E0000A9B8FBC8F968FD18FE30E9C321AF01F94 +:1090F000000DE3CF90FE6EBCF01F000B049CECCB88 +:10910000FFFFF01F00078FE38FBC8F968FD1E3CF57 +:1091100090FE0000000077AC8000917C8000918878 +:10912000800091DC800091E8D401487BF6F80204CD +:109130005828C020DC0AF6CBFE04306AF01F00037A +:10914000DA0A0000000077AC800091DCEBCD40FE35 +:10915000209D580B5F09580A5F08169314941069F4 +:10916000C341580BC4514A9264585808C2E03005B4 +:10917000FAC1FFFD0A970A9CC0D8ED3A0020FB38DF +:109180000023F4081800C2E00E9C64580E38E088F2 +:10919000001E64482FF7F00C03265803CEF1306A06 +:1091A000089B5804C0A0202D1A9CF01F0019F01F26 +:1091B00000192FED580CC0E05805C0506AC96CC8A2 +:1091C0001238CE350C95CE1B30050A9C2F7DE3CD91 +:1091D00080FE306A089BECCCFFDFF01F000FCD5102 +:1091E000CECB029B0C9CF01F000CCCF1CD9B189BAE +:1091F000069AFACCFFFDF01F0009FB6300234832FA +:1092000064585808CB51CE1B000077AC8002E7367B +:10921000800188B08000917C800091DCEBCD4060C3 +:10922000306A202D169618951A9CF01F0009F01F21 +:1092300000090C9A5F0B0A9CF01F00072FED581CC9 +:10924000F9BC0001F9BC01FFE3CD80608002E73684 +:10925000800188B080016480D4015C6CF01F000440 +:10926000581CF9BC0001F9BC01FFD8028001641C44 +:10927000EBCD406E202D1293189116921495300B61 +:10928000308A1A9CF01F0012306A069B1A96202D15 +:109290001A9CF01F0010F01F001030085F091AD848 +:1092A0000A9A1AD6049B1AD3029C1AD83038F01F97 +:1092B000000B2FAD5BFCC070581CF9BC01FF2FEDFB +:1092C000E3CD806E304C2FEDE3CD806E800091D0E9 +:1092D0008002E736800188B08001661CEBCD406ECD +:1092E00010911892169314951296F01F00113008E1 +:1092F0000C991AD80A9A1AD1069B049CF01F000DEB +:109300002FED583CE0890007582CC085306CE3CD28 +:10931000806E584CC070E3CFC06E5BECC050581CE0 +:10932000CFB1E3CF906E30BCE3CD806E8001A1DC85 +:109330008001F7D8EBCD4040201D10964978F0FE13 +:109340000204582EC0503FFC2FFDE3CD804030EE8C +:10935000FAC8FFFC10DE300E1A985C761ADE1AD6B8 +:10936000F01F000F2FEDFE5CFC17E0890010FE5C83 +:10937000FC16C114FE5CFB4FC070FE5CFBB4C0B0B9 +:10938000FE5CFAECCE11307CCE0B5BECC040581C7E +:10939000CDB1CDBB30BCCD9B000077AC8001F54496 +:1093A000D4014858F0F902045809C030F01F0003F6 +:1093B000D8020000000077AC80014480EBCD40E88B +:1093C0004D56189514971693E06A0218300B0C9CB2 +:1093D000F01F00524D288D05700C8D133005A36CC5 +:1093E000ED450204F01F004F8D4CC031E3CFC0E8C3 +:1093F0000A9CF01F004D581CCFA11AD5F1D7C00808 +:109400000A990A9A310B320CF01F00482FFD581CA4 +:10941000CEE1F01F0047581CCEA11AD50A980A9930 +:109420004C4A0A9B302CF01F00442FFD580CCDF005 +:1094300030670A981AD70A994BEA0A9B322CF01F18 +:10944000003E2FFD580CCD3030780A991AD84B9A2F +:109450000A980A9B323CF01F00382FFD580CCC7044 +:109460001AD50E9C0A980A994B2A0A9BF01F0032C3 +:109470002FFD580CCBC030270A981AD70A994ADA20 +:109480000A9B304CF01F002C2FFD580CCB001AD734 +:109490000A984A8A0A990A9B305CF01F00272FFD20 +:1094A000580CCA50301C0A981ADC0A994A1A0A9BAE +:1094B000F01F00212FFD580CC9A030390A981AD985 +:1094C00049CA0A990A9B31CCF01F001B2FFD580C8A +:1094D000C8E0F01F001A581CC8A1F01F0019581C42 +:1094E000FE91FF860A980C9730490C9A495B0A9CBA +:1094F000F01F0015FE90FF7C189A308B493CF01F3E +:109500000014581CFE91FF74ED4C0204EF45020C50 +:10951000E3CD80E8000077AC800091D000000258D5 +:1095200080009200800200AC8002067C8001FFB4C3 +:109530008001984C80016E788001FD8C8001A00034 +:109540008001955080016AF48003B8048001762878 +:10955000EBCD40E078185B98C031E3CFC0E078569F +:109560005866CFC1783B0C9A4985EAC7FE040E9C29 +:10957000F01F0017303A497B0E9CF01F0017C131D5 +:10958000F01F00163026EB460204F01F00150C9C5D +:10959000F01F00146A195809C14048C8700C5D19C1 +:1095A000E3CF80E037A83C49EB6801FC30E80C9B36 +:1095B0000E9CEB6901FDEB6801FEF01F000BCE1B5A +:1095C000129CE3CD80E00000000077AC800091DCCD +:1095D0008003B80C8000917C8001FD8080020290A5 +:1095E0008002023480017984EBCD40FC7875580B01 +:1095F000F9B80100F7F81A001693EB3900C83FF8E4 +:10960000F0091800C250EB0900D03008F009190029 +:10961000C4D0307430073022EE061502EAF800D8C4 +:109620000C082FF711BC089BF01F0027E08A0009E7 +:10963000EAF800D80C0811B45803E7F21A00EB1846 +:1096400000D00E38FE99FFEA089CE3CD80FCEB3891 +:1096500000A4F2081800C250EB0900B03008F0096D +:109660001900C240307430073012EE061502EAF8D5 +:1096700000B80C082FF711BC089BF01F0013E08AFC +:109680000009EAF800B80C0811B45803E7F21A0010 +:10969000EB1800B00E38FE99FFEA089CE3CD80FC81 +:1096A000787992D8EDB80004C040307CE3CD80FCDE +:1096B000307B305CF01F0004FE9AFFF9305CE3CD94 +:1096C00080FC000080017E60D431201D4D876E58E3 +:1096D0005808C0E030060C996E48F009032CF01FC2 +:1096E00000552FF66E580C990C38FE9BFFF730068C +:1096F0001A9B8F560C9CF01F00501A94400C580C6B +:10970000C0312FFDD832A36CF01F004C1890CFA0B1 +:10971000400A0C9BA36AF01F004A40085808E08AE0 +:1097200000260C950096C0782FF52FC640080A3801 +:10973000E08A001D350CF01F00418D0CCF614009FF +:109740005809E08A000F009530062FF66A0C580C75 +:10975000C040F01F003840092FC50C39FE99FFF7B3 +:10976000009CF01F00342FFDD8321A9B009CF01F84 +:1097700000324B4972084009F0090D488F585808CB +:10978000CE00300408930891A363E003000264084C +:109790006E467135344CF01F0029F9410040060631 +:1097A0008D0C6A796E48F2CBFFF2F0030306F33AB0 +:1097B000000D0C9CF01F00246A78F139000D306A0E +:1097C000ED690020ECCCFFDF640B2E2BF01F001E98 +:1097D000029B0A9CF01F001DED6C00386A498DC980 +:1097E0006A585808F9B805008DD86A79F338005ED0 +:1097F000ED6800276A7992C88DA80BF9ED59002C05 +:1098000030290BEAF20A1800E2081710F9B8000133 +:109810008DF830286E49F20309062FF4F00A18007B +:1098200008936E580838FE9BFFB1C8AB000077ACB8 +:10983000800091E88002105880009200800091D052 +:1098400000000258800091DC800195E8EBCD40C01B +:10985000201D1696582BC680E0880013586BC590C3 +:10986000587BC2D0583BC4804C076E295809C05061 +:109870004BE80C9C703B5D192FFDE3CD80C0580B6D +:10988000C0F14BA7EEF902085819C6C0EEF8020C59 +:109890003019A1D8EF690210EF48020CCE7B581B9B +:1098A000CE414B273008EEF9020C4B1AA3A9EF6802 +:1098B0000210A1D9B488EF49020CCD8B4ACA3008F6 +:1098C0001589F0091800C4C14A87EEF8020CEDB8FA +:1098D0000001CD31EF380210F2081800CCE1F01F82 +:1098E0000025F01F0025EEF8020C3016E018FFF9F5 +:1098F000EF48020CCBBBF01F002049C7EEF9020C69 +:10990000EDB90004CBA11298A5C8EF48020CCAEB30 +:1099100049673019EEF8020CEF690210A1D8300641 +:10992000EF48020CCA3B4917EEF8020CA3C81A9C78 +:10993000EF48020CF01F001140085828C050F01FDB +:10994000000DF01F000D300A4898B08AEF39021060 +:10995000F4091800C9204858F16A0210C87BB4887D +:10996000C8CB4838B089C89B000077AC000079C4E8 +:1099700080021298800196C8800177A4D401201D2E +:1099800048F9F2F802045828C0302FFDD80AF339FC +:1099900002103008F0091800C0711A9CF01F00096D +:1099A00040085828CF31F01F0008CF00F8CAFFE266 +:1099B000300B169CF01F00052FFDD802000077AC7D +:1099C000800177A4800210FC8001914CEBCD408097 +:1099D000201D4967EEF802045828C0503FFC2FFDB7 +:1099E000E3CD8080F01F0012C051302C2FFDE3CD5D +:1099F0008080EEF9020CEDB90002CF10EDB9000144 +:109A0000C031309CCEDB1A9CF01F000A4008580879 +:109A1000CED0F01F0009581CCE21EEF8020CA3A8EE +:109A2000EF48020CCDDB0000000077AC800210FC98 +:109A3000800211088001F370EBCD40C020AD189872 +:109A40001697580BC07076DC581CC0402F6DE3CDC4 +:109A500080C0109BF13A0020FAC6FFFE0C9CF01F5C +:109A6000001B0C9B209D322A1A9CF01F0019F01F2E +:109A700000192F7D580CCEB0793CFACBFFDCF01FDB +:109A8000001640985818C150C0923058F808180075 +:109A9000F9BC0003F9BC0102CDAB5828C030301C22 +:109AA000CD6B5807C0D06EC85808C0A0305CCCFB46 +:109AB0005807C0806EC85808C050304CCC8B307CE2 +:109AC000CC6B306CCC4B00008002113C8002E7363E +:109AD0008001F2BC800195E8D43120EDFEF3029CB8 +:109AE000FAC1FFA4E6F8020C18971694E2180006D3 +:109AF000C040309C2F2DD832F01F00A1C040308CC8 +:109B00002F2DD832E74C02085807C130BA8CF5D453 +:109B1000C008FAC6FFFEBA9A0E9B0C9CF01F009973 +:109B20000C9C1B9BF01F0098581CC0802F2DDC3A0A +:109B3000BA97BA87FAC6FFFECF4B029CF01F00937C +:109B40001892581CCF41029A089B0E9CF01F00905F +:109B50001890C580E6C7FFE8E6C6FE08EF3A002089 +:109B6000E1380020F4081800E08000A02C470C37F2 +:109B7000CF6130070E950E9B009CF01F0086E136EA +:109B800000381897CD40585CE08000C2E08B00B9E7 +:109B9000583CE08000B4584CC020300CF01F007ED0 +:109BA0003048F0061800E08000A83054E80618009D +:109BB000E08000983028F0061800E080009A300C11 +:109BC000F01F0076E8061800E080008F300CF01FD0 +:109BD00000745837E08B007960F85818C710301CB3 +:109BE000F01F0070300B4F0CF01F0070CA00F01F08 +:109BF0000070581CC9C1E6F8020CA1B8E748020C75 +:109C0000C7ABFAC5FFCE306A029B0A9CF01F005D0D +:109C1000FAC6FFDE0C9CF01F00673FF81AD00C9BC1 +:109C20001AD2310A1AD8204D1A9CF01F00630A9BE1 +:109C3000202D306A1A9CF01F00600499209DE6CC0C +:109C4000FDECFB380069FAEA0048FAE20050FB68D4 +:109C50000021FAEB0000FB380068FAEA0058FAE34A +:109C60000008FAE20060FAEB0010FAE30018FB6863 +:109C70000020303A0098129B4C03F01F00502EED4C +:109C80001895581CFE91FF54009BE6FC0214F01F2F +:109C9000004C5BBCC620580CC3E1189BE6FC0214C8 +:109CA000F01F00483FFCC27B0E9C009BF01F00464B +:109CB000FE91FF5E6EB55805EA071700C5DB302C34 +:109CC000F01F0038C90B5805FE90FF320A9AE13B9D +:109CD0000020009CF01F003D3018E7480208C7DB59 +:109CE000301CF01F002E301CF01F002DC73B302C05 +:109CF000F01F002AC6CB303CCFCB301CC50B586CB4 +:109D0000C080587CFE91FF4B308CC49B307CC47B60 +:109D1000305CC45B344CF01F002E089A18960E9BE2 +:109D2000F01F0018029B306AED640020ECCCFFDFCE +:109D3000F01F001400991AD60A984A6A009B31CC89 +:109D4000F01F00252FFD580CC0E0E6F8020C0A9C1D +:109D5000A1B8E748020CCCFA009BE6FC0214F01F05 +:109D60000019CC8A189BE6FC0214F01F00160C9C0C +:109D7000F01F001A3FFCCBFA000077AC800210FC09 +:109D8000800091DC800178BC800179788001914C61 +:109D900080019A3880015F60800163488001639C84 +:109DA00080017A1080018F208001FD408001F3A0A6 +:109DB000800177C08002E73680020BFC80020A70C7 +:109DC00080020B408000917C800214708000920021 +:109DD00080019E0080016E78800091E8D401202DE2 +:109DE000FACAFFF415D8BAD87409500915C8300B4F +:109DF000BAC8169CF01F00022FEDD80280019AD835 +:109E0000EBCD40E049F51697EAFC0214300BF01F49 +:109E1000001EF01F001EEEC6FFDFEF3B00200C9A75 +:109E20000E9CF01F001BC150EAF8020CA1D8202D97 +:109E30000C9BEB48020C306A1A9CEF360020F01F96 +:109E400000150C9B0E9CF01F00142FED581CC060D9 +:109E5000EAF8020CEDB80001C0600E9CF01F000F84 +:109E6000E3CD80E0301B300CF01F000D302B300CA8 +:109E7000F01F000B0E9CF01F0009E3CD80E00000F6 +:109E8000000077AC80020B40800196C88001914CA5 +:109E90008002E73680019AD8800091E88001984CD2 +:109EA000EBCD40E0202D18951697580CC0513FFC83 +:109EB0002FEDE3CD80E0580BCFB0E04B0020FE9BB0 +:109EC000FFF8FAC6FFFE306AE06B00FF0C9CF01F43 +:109ED0000008306A202D0C9B1A9CF01F00060E9B78 +:109EE0000A9CF01F00052FEDCE4B0000800091D0A2 +:109EF0008002E73680019AD8EBCD408048B7EEF873 +:109F000002045828C030E3CFC080F01F0009581C5D +:109F1000F9BC0109EFF80083F9B90010F1D9E03874 +:109F2000EFF80A83E3CD8080000077AC80020A84DA +:109F3000D40148B9F338000A104CF36C000A7218C7 +:109F40005808C0B05828C0803028726C9318301B55 +:109F500072595D19D80AD80ADA0A0000000079C8D7 +:109F60004828916B915C5EFC000079C8EBCD40C045 +:109F7000203D5CBBBA89502B109714965CC85C8856 +:109F80005807C0513FFC2FDDE3CD80C05C784959B4 +:109F90005018B28C3048FAC9FFF8300A306B492C9F +:109FA000F01F0012581CCEF11B89491A1898B48969 +:109FB000306B1A99300A48FCF01F000C581CCE3147 +:109FC00048D8300AB007306B304848CCFA0800094E +:109FD000F01F0006581CCD7148989146CD5B0000DB +:109FE00000007A288003B8108001776C0000025CC2 +:109FF0008003B8180000025E8003B820000079C812 +:10A00000EBCD40C030074A161AD78D078D17ED6784 +:10A010000008ED670009ED67000A8D378D470E983F +:10A020000E9949BA0E9B302CF01F001A2FFD580CC8 +:10A03000C0413FFCE3CD80C01AD70E980E99496A03 +:10A040000E9B304CF01F00132FFD580CCF301AD749 +:10A050000E980E99491A0E9B32ECF01F000E2FFD40 +:10A06000580CCE8031483019E06A138830AB0E9C12 +:10A07000F01F000B581CCDE10E9BECCCFFF4F01F41 +:10A080000009581CCD71CD7B000079C88001A0F07B +:10A0900080016E788001A1A08001A0A480019F6C46 +:10A0A000800144F8D401F01F000E48EA74085838C3 +:10A0B000C12030289508F539000A3008F009180049 +:10A0C000C020D8023018300B9518487C487AF01F11 +:10A0D0000008D80230089508D80200008001DA365E +:10A0E000000079C88001DA5880018E348001EF20A9 +:10A0F000EBCD408048973018EF6800086E4958094A +:10A10000C0A0308CF01F00066E4C3009485A6E3BE0 +:10A11000F01F0005E3CD8080000079C880019F30EA +:10A120008001A1CC80014558D4014989F80C11FF68 +:10A13000F338000A106CF36C000AC1E1F33800092F +:10A14000F8081800C19072185808C161F338000867 +:10A15000F8081800C06072085808C0F05818C0C04D +:10A160003018300B931848AA48ACF01F000B300B86 +:10A17000331CF01F000AD802301B485A930B488C3E +:10A18000F01F0005D8020000000079C880018E345D +:10A190008001DA588001EF2080016D6C8001DA8443 +:10A1A000EBCD404048766C3CF01F0007308CF01F30 +:10A1B000000730083009ED6800088D09E3CD8040C4 +:10A1C000000079C8800145308001A128D401308C7D +:10A1D000F01F0002D80A00008001A128EBCD4080CA +:10A1E00048E76E185828C030E3CD80806E58300B99 +:10A1F0006E6C5D18300B8F1B4899F2FA0324F2F84D +:10A2000003201438C040169CF01F0006300B332C7E +:10A21000F01F0005E3CD8080000079C8000084CCE9 +:10A2200080018CE480016D6CEBCD40C018971696D0 +:10A23000F01F0009C0C06E0C581CC0700C9B0E9C17 +:10A24000F01F0006CF91302CE3CD80C03FDCE3CD82 +:10A2500080C000008001462C80014636EBCD404096 +:10A26000301818969908F01F00040C9CF01F00038A +:10A27000E3CD80408001463280014634D401580C41 +:10A28000C030F01F0002D80280014630D4013008EF +:10A290009908F01F0002D8028001462ED401189EB2 +:10A2A000580AC0C196199688F9D9C010103CC165EA +:10A2B000F2C8FFFF973AB618D802581AC06096192C +:10A2C000F2C8FFFFB618D802969996881039C0F4E4 +:10A2D0007648F0090709B889CF3B1D897648F00C0C +:10A2E0000B099619F2C8FFFFB618D8023008973844 +:10A2F000B8889619F2C8FFFFB618D802EBCD408097 +:10A300001897580AC1D1961C9689FDDCC010FCC86C +:10A31000FFFF1238F7FA4A03F7F85004F1DEE508B8 +:10A32000EFF95801F1F95E00EFFA5800F1FA5E0119 +:10A33000F7FC5201F8C8FFFEB618E3CD8080581A2A +:10A34000C070961CF8C8FFFEB618E3CD8080969AC0 +:10A350009689F4C8FFFF1238C09476481408119902 +:10A36000B889118AB89A961CCEEB30089738B8088D +:10A37000961CF8C8FFFEB618E3CD8080EBCD408078 +:10A38000189E169C580AC0F1961B9889EFDBC010E6 +:10A39000EEC8FFFD1238C205F6C8FFFC993AB8189E +:10A3A000E3CD8080581AC070981BF6C8FFFCB8181F +:10A3B000E3CD8080969B9889F6C8FFFD1238C1C412 +:10A3C000784A160A15B8BC8815A9BC991598BCA876 +:10A3D0001589BCB9CEAB1DB8784A0E0AB4881DA940 +:10A3E000B4991D98B4A81D89B4B9981BF6C8FFFC90 +:10A3F000B818E3CD8080300899389D08981BF6C8BE +:10A40000FFFCB818E3CD8080EBCD4068189316951B +:10A410001496F01F000C0C9A0A9BE6CCFFFFF01F6D +:10A4200000090C9A0A9BE6CCFFFEF01F00060C9A6E +:10A430000A9BE6CCFFFDF01F0003E3CD806800001F +:10A440008001A29CD4211697189596141496F01F9B +:10A4500000080C9A0E9BEACCFFFEF01F00060BC80A +:10A460005808F1D4E108EFF81C01D8228001A2FCC1 +:10A470008001A408EBCD4068189316951496F01F40 +:10A4800000060C9A0A9BE6CCFFFCF01F0003E3CD0C +:10A49000806800008001A37CEBCD4068189316957E +:10A4A0001496F01F00090C9A0A9BE6CCFFFCF01FE3 +:10A4B00000070C9A0A9BE6CCFFFAF01F0004E3CDDC +:10A4C000806800008001A37C8001A2FCEBCD406885 +:10A4D000189316951496F01F000F0C9A0A9BE6CC61 +:10A4E000FFFCF01F000D0C9A0A9BE6CCFFFBF01F4F +:10A4F000000A0C9A0A9BE6CCFFFAF01F00070C9AA0 +:10A500000A9BE6CCFFF9F01F0004E3CD8068000051 +:10A510008001A37C8001A29CEBCD40681893169526 +:10A520001496F01F000C0C9A0A9BE6CCFFFCF01F5F +:10A53000000A0C9A0A9BE6CCFFFAF01F00080C9A5E +:10A540000A9BE6CCFFF9F01F0005E3CD8068000010 +:10A550008001A37C8001A2FC8001A29CEBCD40681D +:10A56000189316951496F01F00150C9A0A9BE6CCCA +:10A57000FFFCF01F00120C9A0A9BE6CCFFF8F01FBC +:10A5800000100C9A0A9BE6CCFFF6F01F000D0C9A07 +:10A590000A9BE6CCFFF4F01F00090C9A0A9BE6CC5C +:10A5A000FFF0F01F00070C9A0A9BE6CCFFEEF01FAD +:10A5B0000004E3CD806800008001A37C8001A2FC40 +:10A5C000EBCD4068189316951496F01F00090C9A6D +:10A5D0000A9BE6CCFFFCF01F00060C9A0A9BE6CC17 +:10A5E000FFF8F01F0003E3CD806800008001A37C2A +:10A5F000EBCD4068189316951496F01F00060C9A40 +:10A600000A9BE6CCFFFCF01F0003E3CD806800004E +:10A610008001A37CEBCD4068189316951496F01F2B +:10A62000000C0C9A0A9BE6CCFFFCF01F00090C9A68 +:10A630000A9BE6CCFFF8F01F00060C9A0A9BE6CCBA +:10A64000FFF4F01F0003E3CD806800008001A37CCD +:10A65000EBCD4068189316951496F01F00330C9AB2 +:10A660000A9BE6CCFFFCF01F00300C9A0A9BE6CC5C +:10A67000FFF8F01F002D0C9A0A9BE6CCFFF4F01FA8 +:10A68000002B0C9A0A9BE6CCFFF2F01F00280C9AD4 +:10A690000A9BE6CCFFF0F01F00250C9A0A9BE6CC43 +:10A6A000FFEEF01F00220C9A0A9BE6CCFFECF01F95 +:10A6B000001F0C9A0A9BE6CCFFEAF01F001C0C9AC4 +:10A6C0000A9BE6CCFFE8F01F00190C9A0A9BE6CC27 +:10A6D000FFE6F01F00160C9A0A9BE6CCFFE4F01F81 +:10A6E00000130C9A0A9BE6CCFFE2F01F00110C9AB3 +:10A6F0000A9BE6CCFFE1F01F000E0C9A0A9BE6CC09 +:10A70000FFE0F01F00090C9A0A9BE6CCFFDCF01F6B +:10A7100000060C9A0A9BE6CCFFD8F01F0005E3CD9B +:10A72000806800008001A37C8001A2FC8001A29CC3 +:10A73000EBCD4068189316951496F01F00120C9AF2 +:10A740000A9BE6CCFFFCF01F00100C9A0A9BE6CC9B +:10A75000FFFBF01F000D0C9A0A9BE6CCFFFAF01FDE +:10A76000000A0C9A0A9BE6CCFFF9F01F00070C9A2E +:10A770000A9BE6CCFFF8F01F0004E3CD80680000E0 +:10A780008001A37C8001A29CEBCD406818931695B4 +:10A790001496F01F00060C9A0A9BE6CCFFFCF01FF3 +:10A7A0000003E3CD806800008001A37CEBCD40680E +:10A7B000189316951496F01F00060C9A0A9BE6CC87 +:10A7C000FFFCF01F0003E3CD806800008001A37C44 +:10A7D000EBCD4068189316951496F01F00060C9A5E +:10A7E0000A9BE6CCFFFCF01F0003E3CD806800006D +:10A7F0008001A37CEBCD4068189316951496F01F4A +:10A8000000060C9A0A9BE6CCFFFCF01F0003E3CD88 +:10A81000806800008001A37CEBCD406818931695FA +:10A820001496F01F00060C9A0A9BE6CCFFFCF01F62 +:10A830000003E3CD806800008001A37CEBCD40687D +:10A84000189316951496F01F00060C9A0A9BE6CCF6 +:10A85000FFFCF01F0003E3CD806800008001A37CB3 +:10A86000EBCD4068189316951496F01F00060C9ACD +:10A870000A9BE6CCFFFCF01F0003E3CD80680000DC +:10A880008001A37CEBCD4068189316951496F01FB9 +:10A8900000060C9A0A9BE6CCFFFCF01F0003E3CDF8 +:10A8A000806800008001A37CEBCD4068189316956A +:10A8B0001496F01F00060C9A0A9BE6CCFFFCF01FD2 +:10A8C0000004E3CD806800008001A37C8001A650D5 +:10A8D000EBCD4068189316951496F01F00060C9A5D +:10A8E0000A9BE6CCFFFCF01F0003E3CD806800006C +:10A8F0008001A37CEBCD4068189316951496F01F49 +:10A9000000090C9A0A9BE6CCFFFCF01F00060C9A8B +:10A910000A9BE6CCFFF8F01F0003E3CD806800003F +:10A920008001A37CEBCD4068189316951496F01F18 +:10A9300000060C9A0A9BE6CCFFFCF01F0003E3CD57 +:10A94000806800008001A37CEBCD406818931695C9 +:10A950001496F01F00090C9A0A9BE6CCFFFCF01F2E +:10A9600000060C9A0A9BE6CCFFF8F01F0003E3CD2B +:10A97000806800008001A37CEBCD40681893169599 +:10A980001496F01F00090C9A0A9BE6CCFFFCF01FFE +:10A9900000060C9A0A9BE6CCFFF8F01F0003E3CDFB +:10A9A000806800008001A37CEBCD40681893169569 +:10A9B0001496F01F00060C9A0A9BE6CCFFFCF01FD1 +:10A9C0000003E3CD806800008001A37CEBCD4068EC +:10A9D000189316951496F01F00090C9A0A9BE6CC62 +:10A9E000FFFCF01F00060C9A0A9BE6CCFFF8F01F54 +:10A9F0000003E3CD806800008001A37CEBCD4068BC +:10AA0000189316951496F01F00060C9A0A9BE6CC34 +:10AA1000FFFCF01F0003E3CD806800008001A37CF1 +:10AA2000EBCD4068189316951496F01F00090C9A08 +:10AA30000A9BE6CCFFFCF01F00060C9A0A9BE6CCB2 +:10AA4000FFF8F01F0003E3CD806800008001A37CC5 +:10AA5000EBCD4068189316951496F01F00090C9AD8 +:10AA60000A9BE6CCFFFCF01F00060C9A0A9BE6CC82 +:10AA7000FFF8F01F0003E3CD806800008001A37C95 +:10AA8000EBCD4068189316951496F01F00060C9AAB +:10AA90000A9BE6CCFFFCF01F0003E3CD80680000BA +:10AAA0008001A37CEBCD4068189316951496F01F97 +:10AAB00000060C9A0A9BE6CCFFFCF01F0003E3CDD6 +:10AAC000806800008001A37CEBCD40681893169548 +:10AAD0001496F01F00060C9A0A9BE6CCFFFCF01FB0 +:10AAE0000003E3CD806800008001A37CEBCD4068CB +:10AAF000189316951496F01F00060C9A0A9BE6CC44 +:10AB0000FFFCF01F0004E3CD806800008001A37CFF +:10AB10008001A29CEBCD4068189316951496F01F07 +:10AB200000060C9A0A9BE6CCFFFCF01F0004E3CD64 +:10AB3000806800008001A37C8001D434EBCD4068A4 +:10AB4000189316951496F01F00330C9A0A9BE6CCC6 +:10AB5000FFDEF01F00310C9A0A9BE6CCFFD4F01FF9 +:10AB6000002F0C9A0A9BE6CCFFC2F01F002D0C9A16 +:10AB70000A9BE6CCFFBFF01F002B0C9A0A9BE6CC89 +:10AB8000FFBCF01F00290C9A0A9BE6CCFFB0F01F17 +:10AB900000270C9A0A9BE6CCFFACF01F00250C9A0C +:10ABA0000A9BE6CCFFA4F01F00230C9A0A9BE6CC7C +:10ABB000FF9CF01F00210C9A0A9BE6CCFF98F01F27 +:10ABC000001F0C9A0A9BE6CCFF8CF01F001D0C9A0C +:10ABD0000A9BE6CCFF72F01F001B0C9A0A9BE6CC86 +:10ABE000FF68F01F00190C9A0A9BE6CCFF44F01F87 +:10ABF00000170C9A0A9BE6CCFF50F01F00150C9A28 +:10AC00000A9BE6CCFF30F01F0013E3CD8068000004 +:10AC10008001D3448001D2DC8001D2748001CAF863 +:10AC20008001C9D88001D8608001CA688001CA9CAF +:10AC30008001CA0C8001C9A48001D4348001CDB444 +:10AC40008001CE848001D5588001D6B08001D4E443 +:10AC50008001CFFCEBCD4068189316951496F01F39 +:10AC6000000F0C9A0A9BE6CCFFFCF01F000D0C9A1B +:10AC70000A9BE6CCFFFAF01F000B0C9A0A9BE6CC6D +:10AC8000FFF9F01F00080C9A0A9BE6CCFFF8F01FB2 +:10AC90000006E3CD806800008001A37C8001A2FC57 +:10ACA0008001A29C8001AB3CEBCD406C14951296C8 +:10ACB00018921693E06A00DC129B0A9CF01F001A9F +:10ACC000ECC9FF98EACAFF98069B049CF01F001786 +:10ACD000ECC9FFBCEACAFFBC069B049CF01F001431 +:10ACE000ECC9FF68EACAFF68069B049CF01F0011CC +:10ACF000ECC9FF50EACAFF50069B049CF01F000EEF +:10AD0000ECC9FF44EACAFF44069B049CF01F000BF9 +:10AD1000ECC9FF30EACAFF30069B049CF01F000814 +:10AD2000E3CD806C8002E7368001D1588001D24C9F +:10AD30008001D1E88001D1C08001D21C8001CF9C6C +:10AD4000EBCD40EC1296F2E80000F4E90000ECE8EC +:10AD50000008F4E90008ECE20010F4E30010ECE86D +:10AD6000001814971695F4E90018E06B00E85D15DB +:10AD70008F7CC0D030CA6C7BF01F00066E7A6C7975 +:10AD8000149C0A9B2F492F4AF01F0003E3CD80EC4F +:10AD9000800091DC8001ACA8EBCD40C014971696E2 +:10ADA00074385808C160949E948AF60E00081438CE +:10ADB000F5DEE916F9B80900EFF89A03580CC090CF +:10ADC0005809C0C1189B0C9A6E4C1C0CF01F000A4D +:10ADD0008E180C08AE18E3CD80C05819CFA16E4B69 +:10ADE0000C9A1C0BF01F00048E180C08AE18E3CD53 +:10ADF00080C00000800091DCEBCD40E016971496F7 +:10AE00001895581AC0B0F01F000C0C99189B0E9A98 +:10AE10000A9CF01F000AE3CD80E09698968614996C +:10AE20001016169A0C9BF01F00053008EA060B0856 +:10AE3000E3CD80E0800091B88001AD98EBCD406813 +:10AE4000189316951496F01F00060C9A0A9BE6CCF0 +:10AE5000FFFCF01F0004E3CD806800008001A37CAC +:10AE60008001ADF8EBCD4068189316951496F01F4D +:10AE700000060C9A0A9BE6CCFFFCF01F0004E3CD11 +:10AE8000806800008001A37C8001ADF8EBCD4068B4 +:10AE9000189316951496F01F000F0C9A0A9BE6CC97 +:10AEA000FFFCF01F000C0C9A0A9BE6CCFFF8F01F89 +:10AEB00000090C9A0A9BE6CCFFF4F01F00060C99DF +:10AEC0000A9AE6CCFFF0320BF01F0003E3CD806856 +:10AED0008001A37C8001AD98EBCD40681893169556 +:10AEE0001496F01F000C0C9A0A9BE6CCFFFCF01F96 +:10AEF00000090C9A0A9BE6CCFFF8F01F00060C999B +:10AF00000A9AE6CCFFF4320BF01F0003E3CD806811 +:10AF10008001A37C8001AD98EBCD40681893169515 +:10AF20001496F01F000C0C9A0A9BE6CCFFFCF01F55 +:10AF300000090C9A0A9BE6CCFFF8F01F00070C9959 +:10AF40000A9AE6CCFFF7303BF01F0004E3CD80689F +:10AF50008001A37C8001A29C8001AD98EBCD40686C +:10AF6000189316951496F01F00180C9A0A9BE6CCBD +:10AF7000FFFCF01F00150C9A0A9BE6CCFFF8F01FAF +:10AF800000120C9A0A9BE6CCFFF4F01F000F0C9AFB +:10AF90000A9BE6CCFFF0F01F000C0C9A0A9BE6CC53 +:10AFA000FFECF01F000A0C9A0A9BE6CCFFEAF01FA8 +:10AFB00000080C990A9AE6CCFFE9303BF01F000527 +:10AFC000E3CD80688001A37C8001A2FC8001A29C6B +:10AFD0008001AD98EBCD4068189316951496F01F3C +:10AFE00000280C9A0A9BE6CCFFFCF01F00250C9A67 +:10AFF0000A9BE6CCFFF8F01F00220C9A0A9BE6CCD5 +:10B00000FFF4F01F00200C9A0A9BE6CCFFF2F01F21 +:10B01000001E0C9A0A9BE6CCFFF1F01F001B0C9A55 +:10B020000A9BE6CCFFF0F01F00180C9A0A9BE6CCB6 +:10B03000FFEFF01F00150C9A0A9BE6CCFFEEF01F05 +:10B0400000120C990A9AE6CCFFED306BF01F000F4E +:10B050000C9A0A9BE6CCFFE7F01F000B0C9A0A9BA8 +:10B06000E6CCFFE6F01F00080C990A9AE6CCFFE553 +:10B07000320BF01F0006E3CD806800008001A37C46 +:10B080008001A2FC8001A29C8001AD98EBCD4068BC +:10B09000189316951496F01F00150C9A0A9BE6CC8F +:10B0A000FFFCF01F00120C9A0A9BE6CCFFF8F01F81 +:10B0B000000F0C9A0A9BE6CCFFF4F01F000C0C9AD0 +:10B0C0000A9BE6CCFFF0F01F000A0C9A0A9BE6CC24 +:10B0D000FFEEF01F00080C990A9AE6CCFFED303B1A +:10B0E000F01F0005E3CD80688001A37C8001A2FCF5 +:10B0F0008001A29C8001AD98EBCD40681893169515 +:10B100001496F01F00120C9A0A9BE6CCFFFCF01F6D +:10B1100000100C9A0A9BE6CCFFFBF01F000D0C9967 +:10B120000A9AE6CCFFFA302BF01F000A0C9A0A9B11 +:10B13000E6CCFFF8F01F00050C9A0A9BE6CCFFF462 +:10B14000F01F0002E3CD80688001A37C8001A29CF7 +:10B150008001AD98EBCD4068189316951496F01FBA +:10B1600000120C9A0A9BE6CCFFFCF01F00100C9A10 +:10B170000A9BE6CCFFFBF01F000D0C990A9AE6CC67 +:10B18000FFFA302BF01F000A0C9A0A9BE6CCFFF85E +:10B19000F01F00050C9A0A9BE6CCFFF4F01F00029A +:10B1A000E3CD80688001A37C8001A29C8001AD98E2 +:10B1B000EBCD4068189316951496F01F000C0C9A6E +:10B1C0000A9BE6CCFFFCF01F000A0C9A0A9BE6CC17 +:10B1D000FFFBF01F00070C990A9AE6CCFFFA302B10 +:10B1E000F01F0004E3CD80688001A37C8001A29C55 +:10B1F0008001AD98EBCD4068189316951496F01F1A +:10B2000000090C9A0A9BE6CCFFFCF01F00070C9982 +:10B210000A9AE6CCFFFB303BF01F0004E3CD8068C8 +:10B220008001A37C8001A29C8001AD98EBCD406899 +:10B23000189316951496F01F00090C9A0A9BE6CCF9 +:10B24000FFFCF01F00070C990A9AE6CCFFFB303B8D +:10B25000F01F0004E3CD80688001A37C8001A29CE4 +:10B260008001AD98EBCD4068189316951496F01FA9 +:10B2700000090C9A0A9BE6CCFFFCF01F00070C9912 +:10B280000A9AE6CCFFFB303BF01F0004E3CD806858 +:10B290008001A37C8001A29C8001AD98EBCD406829 +:10B2A000189316951496F01F000C0C9A0A9BE6CC86 +:10B2B000FFFCF01F00090C9A0A9BE6CCFFF8F01F78 +:10B2C00000070C990A9AE6CCFFF7303BF01F000408 +:10B2D000E3CD80688001A37C8001A29C8001AD98B1 +:10B2E000EBCD4068189316951496F01F000C0C9A3D +:10B2F0000A9BE6CCFFFCF01F00090C9A0A9BE6CCE7 +:10B30000FFF8F01F00070C990A9AE6CCFFF7303BD4 +:10B31000F01F0004E3CD80688001A37C8001A29C23 +:10B320008001AD98EBCD4068189316951496F01FE8 +:10B33000000C0C9A0A9BE6CCFFFCF01F00090C9A4B +:10B340000A9BE6CCFFF8F01F00070C990A9AE6CC9E +:10B35000FFF7303BF01F0004E3CD80688001A37C41 +:10B360008001A29C8001AD98EBCD406818931695A2 +:10B370001496F01F000C0C9A0A9BE6CCFFFCF01F01 +:10B3800000090C9A0A9BE6CCFFF8F01F00070C9905 +:10B390000A9AE6CCFFF7303BF01F0004E3CD80684B +:10B3A0008001A37C8001A29C8001AD98EBCD406818 +:10B3B000189316951496F01F00090C9A0A9BE6CC78 +:10B3C000FFFCF01F00070C990A9AE6CCFFFB303B0C +:10B3D000F01F0004E3CD80688001A37C8001A29C63 +:10B3E0008001AD98EBCD4068169514961893F01F28 +:10B3F00000220C990A9AE6CCFFFC308BF01F001F4C +:10B400000C9A0A9BE6CCFFF4F01F001B0C9A0A9BD7 +:10B41000E6CCFFF0F01F00180C9A0A9BE6CCFFEC7C +:10B42000F01F00150C9A0A9BE6CCFFE8F01F0012F3 +:10B430000C9A0A9BE6CCFFE4F01F000F0C9A0A9BC3 +:10B44000E6CCFFE0F01F000E0C9A0A9BE6CCFFDE74 +:10B45000F01F000B0C9A0A9BE6CCFFDCF01F0008E3 +:10B460000C990A9AE6CCFFDA302BF01F0004E3CDEA +:10B47000806800008001A37C8001AD988001A2FC5F +:10B48000EBCD4068189316951496F01F00090C9A9E +:10B490000A9BE6CCFFFCF01F00070C990A9AE6CC49 +:10B4A000FFFB303BF01F0004E3CD80688001A37CEC +:10B4B0008001A29C8001AD98EBCD40681695149652 +:10B4C0001893F01F00060C990A9AE6CCFFFC308B0B +:10B4D000F01F0003E3CD80688001A37C8001AD985C +:10B4E000EBCD4068189316951496F01F00090C9A3E +:10B4F0000A9BE6CCFFFCF01F00070C990A9AE6CCE9 +:10B50000FFFB303BF01F0004E3CD80688001A37C8B +:10B510008001A29C8001AD98EBCD406818931695F0 +:10B520001496F01F00100C9A0A9BE6CCFFFCF01F4B +:10B53000000E0C990A9AE6CCFFFB306BF01F000B53 +:10B540000A9AE6CCFFF50C99306BF01F00080C9AB4 +:10B550000A9BE6CCFFEFF01F0004E3CD80680000FB +:10B560008001A37C8001A29C8001AD98EBCD406856 +:10B57000169514961893F01F000C0C990A9AE6CCB5 +:10B58000FFFC306BF01F00090C9A0A9BE6CCFFF61B +:10B59000F01F00070C9A0A9BE6CCFFF5F01F000491 +:10B5A000E3CD80688001A37C8001AD988001A29CDE +:10B5B000EBCD4068169514961893F01F000D0C996A +:10B5C0000A9AE6CCFFFC306BF01F000A0A9AE6CC20 +:10B5D000FFF60C99302BF01F00070C9A0A9BE6CC63 +:10B5E000FFF4F01F0005E3CD806800008001A37C1C +:10B5F0008001AD988001AB3CEBCD40681695149668 +:10B600001893F01F000D0C990A9AE6CCFFFC306BE2 +:10B61000F01F000A0A9AE6CCFFF60C99302BF01FB7 +:10B6200000070C9A0A9BE6CCFFF4F01F0005E3CD5F +:10B63000806800008001A37C8001AD988001AB3C54 +:10B64000EBCD4068169514961893F01F00100C99D6 +:10B650000A9AE6CCFFFC306BF01F000D0C9A0A9B97 +:10B66000E6CCFFF6F01F000B0C9A0A9BE6CCFFF429 +:10B67000F01F00080C990A9AE6CCFFF2302BF01F5D +:10B680000004E3CD806800008001A37C8001AD98B8 +:10B690008001A2FCEBCD4068169514961893F01F1C +:10B6A000000A0C990A9AE6CCFFFC306BF01F0007E9 +:10B6B0000C990A9AE6CCFFF6302BF01F0004E3CD7C +:10B6C000806800008001A37C8001AD98EBCD4068CC +:10B6D000169514961893F01F000A0C990A9AE6CC56 +:10B6E000FFFC306BF01F00070C990A9AE6CCFFF6BE +:10B6F000302BF01F0004E3CD806800008001A37CA4 +:10B700008001AD98EBCD4068189316951496F01F04 +:10B7100000220C9A0A9BE6CCFFFCF01F00200C9A3A +:10B720000A9BE6CCFFFAF01F001D0C9A0A9BE6CCA0 +:10B73000FFF8F01F001A0C990A9AE6CCFFF6306B5E +:10B74000F01F00170C9A0A9BE6CCFFF0F01F0015C3 +:10B750000C9A0A9BE6CCFFEFF01F00120C990A9A94 +:10B76000E6CCFFEE302BF01F000E0C9A0A9BE6CCC5 +:10B77000FFECF01F00090C9A0A9BE6CCFFE8F01FD3 +:10B7800000060C9A0A9BE6CCFFE4F01F0007E3CD0D +:10B79000806800008001A37C8001A2FC8001AD983C +:10B7A0008001A29C8001AB3CEBCD406816951496BD +:10B7B0001893F01F000C0C990A9AE6CCFFFC306B32 +:10B7C000F01F00090C9A0A9BE6CCFFF6F01F000759 +:10B7D0000C9A0A9BE6CCFFF5F01F0004E3CD8068CD +:10B7E0008001A37C8001AD988001A29CEBCD4068D4 +:10B7F000169514961893F01F000C0C990A9AE6CC33 +:10B80000FFFC306BF01F00090C9A0A9BE6CCFFF698 +:10B81000F01F00070C9A0A9BE6CCFFF5F01F00040E +:10B82000E3CD80688001A37C8001AD988001A29C5B +:10B83000EBCD4068189316951496F01F00120C9AE1 +:10B840000A9BE6CCFFFCF01F00100C9A0A9BE6CC8A +:10B85000FFFAF01F000D0C9A0A9BE6CCFFF8F01FD0 +:10B86000000A0A9AE6CCFFF60C99306BF01F00072D +:10B870000C9A0A9BE6CCFFF0F01F0005E3CD806830 +:10B880008001A37C8001A2FC8001AD988001AB3CCB +:10B89000EBCD4068189316951496F01F00100C9A83 +:10B8A0000A9BE6CCFFFCF01F000E0C9A0A9BE6CC2C +:10B8B000FFFAF01F000B0C990A9AE6CCFFF8306BE8 +:10B8C000F01F00080C990A9AE6CCFFF2302BF01F0B +:10B8D0000005E3CD806800008001A37C8001A2FC0C +:10B8E0008001AD98EBCD4068189316951496F01F23 +:10B8F00000090C9A0A9BE6CCFFFFF01F00060C998A +:10B900000A9AE6CCFFFE302BF01F0003E3CD8068DF +:10B910008001A29C8001AD98EBCD406816951496ED +:10B920001893F01F00130C990A9AE6CCFFFF306BB6 +:10B93000F01F00100C9A0A9BE6CCFFF9F01F000CD8 +:10B940000C9A0A9BE6CCFFF8F01F00090A9AE6CC95 +:10B95000FFF70C99306BF01F00070C9A0A9BE6CC9E +:10B96000FFF1F01F0003E3CD806800008001A29C7E +:10B970008001AD98EBCD4068189316951496F01F92 +:10B9800000060C9A0A9BE6CCFFFCF01F0004E3CDF6 +:10B99000806800008001A37C8001B918EBCD40686D +:10B9A0001696149518931499169A306BF01F000888 +:10B9B0000A9A0C9BE6CCFFFAF01F00060A9A0C9B31 +:10B9C000E6CCFFF9F01F0003E3CD80688001AD985D +:10B9D0008001A29CEBCD4068189316951496F01F39 +:10B9E00000060C9A0A9BE6CCFFFCF01F0004E3CD96 +:10B9F000806800008001A37C8001B99CEBCD406889 +:10BA0000189316951496F01F00090C9A0A9BE6CC21 +:10BA1000FFFFF01F00060C990A9AE6CCFFFE306B80 +:10BA2000F01F0003E3CD80688001A29C8001AD98E7 +:10BA3000EBCD4068189316951496F01F00060C9AEB +:10BA40000A9BE6CCFFFCF01F0004E3CD80680000F9 +:10BA50008001A37C8001B9FCD4011499169A308B23 +:10BA6000F01F0002D80200008001AD98EBCD4068C5 +:10BA7000169514961893F01F00090A9AE6CCFFFC5D +:10BA80000C99306BF01F00060C9A0A9BE6CCFFF66F +:10BA9000F01F0004E3CD80688001A37C8001AD9895 +:10BAA0008001A2FCEBCD4068189316951496F01F08 +:10BAB00000090C9A0A9BE6CCFFFCF01F00070C99CA +:10BAC0000A9AE6CCFFFB303BF01F0004E3CD806810 +:10BAD0008001A37C8001A29C8001AD98D4011499BF +:10BAE000169A320BF01F0002D80200008001AD98B8 +:10BAF000EBCD4068189316951496F01F00180C9A19 +:10BB00000A9BE6CCFFE0F01F00160C9A0A9BE6CCDD +:10BB1000FFDEF01F00140C9A0A9BE6CCFFDDF01F3D +:10BB200000110C990A9AE6CCFFDC306BF01F000E76 +:10BB30000C9A0A9BE6CCFFD6F01F000C0C9A0A9BCD +:10BB4000E6CCFFCEF01F00070C9A0A9BE6CCFFCD97 +:10BB5000F01F0004E3CD80688001BADC8001A2FC04 +:10BB60008001A29C8001AD988001BA58EBCD40685D +:10BB7000189316951496F01F00060C9A0A9BE6CCB3 +:10BB8000FFFCF01F0004E3CD806800008001A37C6F +:10BB90008001BAF0D4011499169A303BF01F0002CC +:10BBA000D80200008001AD98EBCD40E018971695C3 +:10BBB0001496F01F000D6E1C580CC0800C990A9A48 +:10BBC0006E0BF01F000AE3CD80E05816C0918A99F1 +:10BBD0006A4812088F186E098A181208AA18E3CD4D +:10BBE00080E000008001A37C8001AD98EBCD40682F +:10BBF000189316951496F01F00060C9A0A9BE6CC33 +:10BC0000FFFCF01F0004E3CD806800008001A37CEE +:10BC10008001BBA8EBCD4068189316951496F01FD1 +:10BC200000100C9A0A9BE6CCFFFCF01F000E0C994A +:10BC30000A9AE6CCFFFB303BF01F000B0A9AE6CCD9 +:10BC4000FFF80C99308BF01F00080C9A0A9BE6CC89 +:10BC5000FFF0F01F0006E3CD806800008001A37CA8 +:10BC60008001A29C8001AD988001BBA8EBCD40680B +:10BC7000169514961893F01F00090A9AE6CCFFFC5B +:10BC80000C99308BF01F00060C9A0A9BE6CCFFF44F +:10BC9000F01F0004E3CD80688001A37C8001AD9893 +:10BCA0008001BBA8EBCD40801697189B580AC0F1C5 +:10BCB0008E1C8E89FDDCC010FCC8FFF91238C285CD +:10BCC000F8C8FFF88F3AAE18E3CD8080581AC070DC +:10BCD0008E1CF8C8FFF8AE18E3CD80808E9A8E894E +:10BCE000F4C8FFF91238C2C46E48140811F9B889B3 +:10BCF00011EAB89A11D9B8A911CAB8BA11B9B8C914 +:10BD000011AAB8DA1199B8E9118AB8FACE2B17F846 +:10BD10006E4A1C0AB48817E9B49917D8B4A817C991 +:10BD2000B4B917B8B4C817A9B4D91798B4E8178923 +:10BD3000B4F98E1CF8C8FFF8AE18E3CD8080300B44 +:10BD4000308A8F3BF01F00028E1CCC4B800091D0BC +:10BD5000EBCD4068189316951496F01F000C0C9AC2 +:10BD60000A9BE6CCFFF8F01F000A0C9A0A9BE6CC6F +:10BD7000FFF6F01F00070C9A0A9BE6CCFFF4F01FB9 +:10BD80000005E3CD806800008001BCA48001A2FC16 +:10BD90008001AB3CEBCD40F8206D169714961499BA +:10BDA0001895169A306BF01F002D0C9A0E9BEACC5A +:10BDB000FFFAF01F002B0C9A0E9BEACCFFF9F01F44 +:10BDC00000280C9A0E9BEACCFFF8F01F00260C9A74 +:10BDD0000E9BEACCFFF0F01F00240C9A0E9BEACCDD +:10BDE000FFECF01F0021318A0E9B1A9CF01F001FF0 +:10BDF000EAC3FFE81A940C9A1A9B069CF01F001ADB +:10BE00005816C1801A9B0C9A6A7CF01F00199A98E8 +:10BE10008E992048F00901098B690C9A069C0E9BAB +:10BE2000F01F00116A698E181208AE182FADE3CD0D +:10BE300080F86A698E182FC81208E06B00E8BA080B +:10BE40006E5CF01F000C8B7CCF20505C1A9B0C9A10 +:10BE5000F01F0007CE3B00008001AD988001A29C3E +:10BE60008001BCA48001A37C800091DC8001BD50D6 +:10BE70008001D3ECEBCD4068189316951496F01F13 +:10BE800000120C9A0A9BE6CCFFFCF01F00100C9AE3 +:10BE90000A9BE6CCFFFAF01F000D0C9A0A9BE6CC39 +:10BEA000FFF8F01F00090C9A0A9BE6CCFFF4F01F84 +:10BEB00000060C9A0A9BE6CCFFF0F01F0005E3CDCC +:10BEC000806800008001A37C8001A2FC8001BD94F9 +:10BED000EBCD40E0189716951496F01F000B0C9AC6 +:10BEE0000A9BEECCFFFCF01F00090FD93008F009C7 +:10BEF0001800C0700C9A0A9BEECCFFF8F01F0004EB +:10BF0000E3CD80E08001A37C8001B8E48001BD9492 +:10BF1000EBCD4060202D301A18951696FACCFFFE16 +:10BF2000F01F00089A181BF92FE8F0090109AC0965 +:10BF30001BCA8B5A1BD88B482FEDE3CD80600000C5 +:10BF40008001A444EBCD40E07808975818971696E6 +:10BF50007859E049003FE0880004E3CF80E0FEF834 +:10BF6000029AF009032F78455815E0800127E04533 +:10BF70000080CF41780C301AF01F00A1E3CF90E091 +:10BF800078485808C391780C301AF01F009EE3CF10 +:10BF900090E07848F0C90005E049008FFE9BFFDF84 +:10BFA000FEF80264F009032F7848E0480081E08041 +:10BFB000010CE08A002BE0480083E0800118E08556 +:10BFC0000110E0480085CCA1780C301AF01F008FDA +:10BFD000E3CF90E0780C301AF01F008DE3CF90E0B3 +:10BFE0007848F0C90001E049009BFE9BFFB8FEF8CD +:10BFF0000222F009032FE0480081CB01780C301AAF +:10C00000F01F0085E3CF90E05848E08000E4E0486E +:10C010000080CA41781A300B780CF01F00806E0C3B +:10C020000C9B301AF01F007EE3CF90E0780C301AA2 +:10C03000F01F007CE3CF90E0780C301AF01F007AFC +:10C04000E3CF90E0780C301AF01F0078E3CF90E057 +:10C05000780C301AF01F0076E3CF90E0780C301A9D +:10C06000F01F0074E3CF90E0780C301AF01F0072DC +:10C07000E3CF90E0780C301AF01F0070E3CF90E02F +:10C08000780C301AF01F006EE3CF90E0780C301A75 +:10C09000F01F006CE3CF90E0780C301AF01F006ABC +:10C0A000E3CF90E0780C301AF01F0068E3CF90E007 +:10C0B000780C301AF01F0066E3CF90E0780C301A4D +:10C0C000F01F0064E3CF90E0780C301AF01F00629C +:10C0D000E3CF90E0780C301AF01F0060E3CF90E0DF +:10C0E000780C301AF01F005EE3CF90E0780C301A25 +:10C0F000F01F005CE3CF90E0780C301AF01F005A7C +:10C10000E3CF90E0780C301AF01F0058E3CF90E0B6 +:10C11000780C301AF01F0056E3CF90E0780C301AFC +:10C12000F01F0054E3CF90E0780C301AF01F00525B +:10C13000E3CF90E0780C301AF01F0050E3CF90E08E +:10C14000780C301AF01F004EE3CF90E0780C301AD4 +:10C15000F01F004CE3CF90E0780C301AF01F004A3B +:10C16000E3CF90E0780C301AF01F0048E3CF90E066 +:10C17000780C301AF01F0046E3CF90E0780C301AAC +:10C18000F01F0044E3CF90E0780C301AF01F00421B +:10C19000E3CF90E0780C301AF01F0040E3CF90E03E +:10C1A000780C301AF01F003EE3CF90E0780C301A84 +:10C1B000F01F003CE3CF90E0780C0A9AF01F003AA1 +:10C1C0000A9CE3CD80E0780C301AF01F0038E3CFF2 +:10C1D00090E0780C301AF01F0036E3CF90E0780C36 +:10C1E000301AF01F0034E3CF90E0780C301AF01FC3 +:10C1F0000032E3CF90E000008003B8288001AAEC71 +:10C200008001A4988003B9288001B3248001A37C15 +:10C210008003BB688001A4CC800091D08001BC1455 +:10C220008001BAA48001A4748001BA6C8001AC546E +:10C230008001AA808001AE8C8001AAC88001AAA4D6 +:10C240008001AA208001AF5C8001A9CC8001A9787F +:10C250008001A9488001A8F48001A8D08001A884A9 +:10C260008001A8608001B1548001B1B08001B1F4B7 +:10C270008001A8188001AA508001B0F88001A83C74 +:10C280008001A7F48001B4E08001B56C8001B5B0F5 +:10C290008001B5F88001B6408001BED08001B5189C +:10C2A0008001B9748001AE3C8001B3AC8001A6145A +:10C2B0008001B3688001B2E0EBCD40C012971499C1 +:10C2C0008E96109A582CC280E08A0008584CC360A1 +:10C2D000587CC190E3CF80C0580CC0A0581CCFB18F +:10C2E00058EBFE9BFFF9FEF80312F00B032F580BDF +:10C2F000CF21129C0E9BF01F00C28E98F006010CFD +:10C30000E3CD80C0202BE04B007FFE9BFFE5FEF8D5 +:10C3100002F2F00B032F582BE080015DE089001A38 +:10C32000580BC260581BCD71129C0E9BF01F00B6BB +:10C330008E98F006010CE3CD80C0580BCCC1129C46 +:10C340000E9BF01F00B28E98F006010CE3CD80C06A +:10C35000584BC170E0850148585BCBD1129C0E9BB5 +:10C36000F01F00AB8E98F006010CE3CD80C0129C4C +:10C370000E9BF01F00A88E98F006010CE3CD80C044 +:10C38000129C0E9BF01F00A48E98F006010CE3CDCA +:10C3900080C0129C0E9BF01F00A18E98F006010C2D +:10C3A000E3CD80C0129C0E9BF01F009D8E98F0067E +:10C3B000010CE3CD80C0129C0E9BF01F009A8E985A +:10C3C000F006010CE3CD80C0129C0E9BF01F00967E +:10C3D0008E98F006010CE3CD80C0129C0E9BF01FDE +:10C3E00000938E98F006010CE3CD80C0129C0E9B4A +:10C3F000F01F008F8E98F006010CE3CD80C0129CD8 +:10C400000E9BF01F008C8E98F006010CE3CD80C0CF +:10C41000129C0E9BF01F00888E98F006010CE3CD55 +:10C4200080C0129C0E9BF01F00858E98F006010CB8 +:10C43000E3CD80C0129C0E9BF01F00818E98F00609 +:10C44000010CE3CD80C0129C0E9BF01F007E8E98E5 +:10C45000F006010CE3CD80C0129C0E9BF01F007A09 +:10C460008E98F006010CE3CD80C0129C0E9BF01F4D +:10C4700000778E98F006010CE3CD80C0129C0E9BD5 +:10C48000F01F00738E98F006010CE3CD80C0129C63 +:10C490000E9BF01F00708E98F006010CE3CD80C05B +:10C4A000129C0E9BF01F006C8E98F006010CE3CDE1 +:10C4B00080C0129C0E9BF01F00698E98F006010C44 +:10C4C000E3CD80C0129C0E9BF01F00658E98F00695 +:10C4D000010CE3CD80C0129C0E9BF01F00628E9871 +:10C4E000F006010CE3CD80C0129C0E9BF01F005E95 +:10C4F0008E98F006010CE3CD80C0129C0E9BF01FBD +:10C50000005B8E98F006010CE3CD80C0129C0E9B60 +:10C51000F01F00578E98F006010CE3CD80C0129CEE +:10C520000E9BF01F00548E98F006010CE3CD80C0E6 +:10C53000129C0E9BF01F00508E98F006010CE3CD6C +:10C5400080C0129C0E9BF01F004D8E98F006010CCF +:10C55000E3CD80C0129C0E9BF01F00498E98F00620 +:10C56000010CE3CD80C0129C0E9BF01F00468E98FC +:10C57000F006010CE3CD80C0129C0E9BF01F004220 +:10C580008E98F006010CE3CD80C0129C0E9BF01F2C +:10C59000003F8E98F006010CE3CD80C0129C0E9BEC +:10C5A000F01F003B8E98F006010CE3CD80C0129C7A +:10C5B0000E9BF01F00388E98F006010CE3CD80C072 +:10C5C000129C0E9BF01F00348E98F006010CE3CDF8 +:10C5D00080C0129C0E9BF01F00318E98F006010C5B +:10C5E000E3CD80C0129C0E9BF01F002D8E98F006AC +:10C5F000010CE3CD80C000008003BDD88001A49869 +:10C600008003BE148001BC6C8001AE648001A5C0B3 +:10C610008001B4B88001A5F08001B8308001B29CDF +:10C620008001B6948001B6CC8001B9D48001BA30C3 +:10C630008001BB6C8001B7048001B7EC8001BA6C4B +:10C640008001B8908001BE748001A5188001A55CAE +:10C650008001B7A88001A7308001A7888001AE8C37 +:10C660008001AED88001A7D08001AB148001AF1843 +:10C670008001A9FC8001A9A88001AFD48001A92470 +:10C680008001B08C8001A8A88001B22C8001A7ACE9 +:10C690008001B2648001BBEC8001B4808001B3E40E +:10C6A000EBCD40FE208D306A18977853784578019D +:10C6B000FAC2FFE6300B049CF01F00384B88F139BA +:10C6C000010BE06AFFFFFB69001E300B1A9CF01F94 +:10C6D0000035302A1A9B049CF01F0033029A302840 +:10C6E0001A990A9B069CF01F00319A194B08F9D938 +:10C6F000C0101188103CF9B60200F1DCE318E06AC2 +:10C7000000FFF1DAE326EDD9E309FBF93C01F9D6A4 +:10C71000E30C1A944A78118A580AC060F4C80001E0 +:10C72000F9E80008C2918F3CF01F00238F2CC31042 +:10C730006E3A300BF01F0019FB66001F6E2BFB6377 +:10C74000001CFB65001D8E78F5D8C01020281A9CAF +:10C75000FB58001AF01F0013049C1A9B300AF01FAC +:10C7600000121A99029A0A9B069C3008F01F000FCB +:10C770002F8DE3CF90FE9A18F4C90001F9E9000962 +:10C78000F40901095C591208120CBA181206CCCB34 +:10C790002F8DE3CD80FE0000800091D0000087F453 +:10C7A0008001C7B88001A4448001C2B8000079E5C7 +:10C7B000000079E48000920030083019B838B818C9 +:10C7C000B828B80A3008994B993999285EFCD703E4 +:10C7D000EBCD4068189316951496F01F00090C9A3B +:10C7E0000A9BE6CCFFFFF01F00060C9A0A9BE6CCE2 +:10C7F000FFFEF01F0004E3CD806800008001A29CD2 +:10C800008001A2FCEBCD40681696149518931499FC +:10C81000169A303BF01F00050A9A0C9BE6CCFFFDF0 +:10C82000F01F0003E3CD80688001AD988001A29CD9 +:10C83000EBCD40681696149518931499169A303BD0 +:10C84000F01F00050A9A0C9BE6CCFFFDF01F0003C9 +:10C85000E3CD80688001AD988001A29CD431FACEEE +:10C86000FFDC189616971494129210907C157C0198 +:10C87000581AC2D0C153582AC1300D893FF8F00967 +:10C880001800C2100D98E2081900E08B0005E008BE +:10C890001900C6E23FF83009AC88AC99D83A8E1836 +:10C8A000AE383FF80D89F0091800C0D00C9C089AEA +:10C8B0000E9BF01F0034089A0E9BECCCFFFFF01F7C +:10C8C0000031CDCB3008300CAC98D83296285808BF +:10C8D000C4C0B618AE3830088B08AC983FFAAC8AA2 +:10C8E0008E198E08F2081900FE98FFEE1494ECC31E +:10C8F000FFFFC1D8E8081800EDF41E000D9A8E184D +:10C900008E89F408000B5C781019123AE089002631 +:10C91000AE1B6A082FF88B080D89E8091800CB3187 +:10C920008E198E08F2081900FE98FFCEAE39301A23 +:10C930000E9B0C9CF01F0013301A0E9B069CF01FE0 +:10C9400000110D88E4081800CD618E888E990D9A2B +:10C950001218103AE08A000E3FF83009AC88AC9902 +:10C960008E182028AE08C8AB9618B628CB4BDA3AFA +:10C970006A0A6E293018F00A094810498F29C7EB56 +:10C980008001A29CEBCD4040201D1A9E9AF65C7857 +:10C990001ADE1AD6F01F00032FED2FFDE3CD8040E5 +:10C9A0008001C85CEBCD40E0302818951AD8169667 +:10C9B00014973069F01F00072FFD580CC0700E9AB5 +:10C9C0000C9BEACCFFFEF01F0004E3CD80E00000EA +:10C9D0008001C9848001A2FCEBCD40E0301818959D +:10C9E0001AD81696149732A9F01F00072FFD580C7D +:10C9F000C0700E9A0C9BEACCFFFEF01F0004E3CD42 +:10CA000080E000008001C9848001A29CEBCD40E061 +:10CA1000305818951AD8169614973029F01F001020 +:10CA20002FFD580CC190EACCFFFE0E9A0C9BF01F14 +:10CA3000000D0E9A0C9BEACCFFFCF01F000B0E9A27 +:10CA40000C9BEACCFFFBF01F00080E9A0C9BEACC73 +:10CA5000FFFAF01F0005E3CD80E000008001C984EB +:10CA60008001A2FC8001A29CEBCD40E0301818951B +:10CA70001AD8169614973039F01F00072FFD580C5E +:10CA8000C0700E9A0C9BEACCFFFEF01F0004E3CDB1 +:10CA900080E000008001C9848001A29CEBCD40E0D1 +:10CAA000306818951AD8169614973049F01F001060 +:10CAB0002FFD580CC190EACCFFFE0E9A0C9BF01F84 +:10CAC000000D0E9A0C9BEACCFFFDF01F000A0E9A97 +:10CAD0000C9BEACCFFFCF01F00080E9A0C9BEACCE2 +:10CAE000FFFAF01F0005E3CD80E000008001C9845B +:10CAF0008001A29C8001A2FCEBCD40E0301818958B +:10CB00001AD81696149730A9F01F00072FFD580C5D +:10CB1000C0700E9A0C9BEACCFFFEF01F0004E3CD20 +:10CB200080E000008001C9848001A29CD43120BD36 +:10CB30005019500818961697581AC390C272E06898 +:10CB400000FDE06900DD1AD8300A3018F01F005CE3 +:10CB50002FFD580CC1E0300A0E9BECCCFFFEF01FFD +:10CB60000059300A0E9BECCCFFFDF01F0056300A36 +:10CB70000E9BECCCFFFCF01F0053ECCCFFFB0E9B9C +:10CB8000300AF01F0050301CC048582AC040301CEA +:10CB90002F5DD83219893FF8F0091800E080008B2A +:10CBA0009618301C2FA8B6182F5DD832761850581A +:10CBB000B1485038760A504AF6E80008F8C2FFFE3D +:10CBC000FAE90018F8C3FFFDF6EA0010F8C9FFFB08 +:10CBD000FAEB0020F8C4FFFC50293FF5FAC0FFD85B +:10CBE000E06100FDC0680D998E382FE81208AE286C +:10CBF0001AD030181AD1E06900DD109A0E9B0C9CF7 +:10CC0000F01F00312FED580CC4105805FBF5500AE9 +:10CC1000FBF8400AF9B90401F1D9E408EBD8E405BE +:10CC2000301A0E9B049CF01F0027301A0E9B069CA6 +:10CC3000F01F0024301A0E9B089CF01F00220DA844 +:10CC40003009F2081800CD010DB83509F2081800B6 +:10CC5000CCB10DC83F29F2081800CC61301A0E9BE8 +:10CC6000402CF01F00180DD84019F2081800CBC155 +:10CC70004038301CAE28F80509496E2812488F2824 +:10CC800040095809C8509305C84B4038FB58001458 +:10CC9000FAE80020EEE90010FAEA0010EEEB0000DE +:10CCA000FAE80018EEE90008AC9C3FF8AC882F5D6C +:10CCB000D8323008B898300CC6CB00008001C98447 +:10CCC0008001A29C8001C85CD431207D1895169704 +:10CCD00014961293581AC110C0B2300830290C9A19 +:10CCE0000E9B0A9CF01F0032C5712F9DD832582A26 +:10CCF000CF50301C2F9DD83276185018760AF0008D +:10CD00001410500A1A91F6E80008F8C4FFFAFAE97C +:10CD100000083FF6F6EA0010FAC2FFE8FAEB00104E +:10CD2000C1A85806FBF65006FBF84006F9B9040105 +:10CD3000F1D9E408EDD8E406301A0E9B089CF01FE8 +:10CD4000001D0BE8E6081800C1D00B998E382FE8BB +:10CD50001208AE2804983029301A0E9B0A9CF01F46 +:10CD60000014CE01BA20E2E80010EEE90010E2E87B +:10CD70000000EEE90000E2EA0008EEEB00082F9D5B +:10CD8000D83230186E29F006094AAE201449109C9A +:10CD90008F292F9DD8320B982FF8EACCFFFA0C9AE6 +:10CDA0000E9BAA98F01F0003301CCA5B8001CB2C9D +:10CDB0008001A29CEBCD40EC206D301918971693A2 +:10CDC0001495F01F002DC0412FADE3CD80ECEECCCB +:10CDD000FFF90A9A069BF01F00290A9A069BEECCDF +:10CDE000FFF8F01F00260A9A069BEECCFFF7F01F13 +:10CDF00000230A9A069BEECCFFF6F01F00210A9A48 +:10CE0000069BEECCFFF2F01F001E0A9A069BEECCAA +:10CE1000FFEEF01F001B0A9A069BEECCFFEAF01F04 +:10CE2000001858055F0858255F091248CCE06608CD +:10CE30005008661886160A9A5018EBD8B010BA1522 +:10CE4000E6E80008FAE900082026E6E20010E068BB +:10CE500000FD0A16AE961A9BFAE300100E9C1AD833 +:10CE6000E06900DD3018F01F00072FFD2FADE3CD86 +:10CE700080EC00008001CCC88001A29C8001C7D05A +:10CE80008001C984EBCD40EC206D18971693149562 +:10CE9000582AC18119893FF8F0091800F9F91801D9 +:10CEA000F7F81201F9BA0102F1DAE108F1D9E10863 +:10CEB000F7F81C01F9B80000F9F80E012FADE3CD29 +:10CEC00080EC3009F01F0019CFA0EECCFFF90A9AD0 +:10CED000069BF01F00170A9A069BEECCFFF8F01F86 +:10CEE00000145805CEC166085008661886160A9ABE +:10CEF0005018EBD8B010BA15E6E80008FAE90008B7 +:10CF00002026E6E20010E06800FD0A16AE961A9BA5 +:10CF1000FAE300100E9C1AD8E06900DD3018F01F0B +:10CF200000052FFDCCCB00008001CCC88001A29C65 +:10CF30008001C984D42112951497580A5F095805B5 +:10CF40005F08169A1248C2510B986E29F0C4FFFE72 +:10CF5000F2C800015BD8E08B0015129C089B5D1A9B +:10CF600018965806C0C06E086E192FF80809089A5E +:10CF70000A9B8F088F190C9CF01F00080C9CD8226C +:10CF8000089B5D1A300818968F2C8F188F08CEAB2F +:10CF900030060C9CD8220000800091DCEBCD40FCD8 +:10CFA00012951494580A5F0958055F0818921248A0 +:10CFB0001693C191300995296A085808E08A00162D +:10CFC00012966A270E99089A069B049CF01F000B84 +:10CFD0002FF6EEF7FFF86A085807F7B701F80C3894 +:10CFE000FE99FFF2E3CD80FCEAE80000F4E90000DE +:10CFF0006A2A892AE3CD80FC8001CF34EBCD40FC46 +:10D0000018931695581AC2C0C053582AC5E0E3CDEC +:10D0100080FC782778085808FE9AFFFB7819580991 +:10D02000FE9AFFF79698300612087649F208000437 +:10D030000F9A0E9B2FEA1414089CF01F00332FF652 +:10D04000EEF7FFF866085807F7B701F80C38FE99B5 +:10D05000FFF166198A181208AA18E3CD80FC9628F9 +:10D060005808C3C0B618F9D8B010AA3C300830121E +:10D0700087088718872810948A1C8A0E189AFC0C37 +:10D080001900C212F7DAC0106A46EC0B00081199B9 +:10D09000F2C7FFFE5827C250F1DEC0101618103735 +:10D0A000E0890020E40409496A2B2FF4F3EB00081F +:10D0B000C1C0F4070008AA18F9D8B010189AFC0CDF +:10D0C0001900CE13E3CD80FC781C580CFE9AFFA10A +:10D0D00096181808B618E3CD80FC961CB62CCC6BBD +:10D0E000AA0CFDDCB010CCBBF3EB1008069A8A99B1 +:10D0F0008B28EC090009485B6A5CF01F00058A1A5E +:10D100008A0ECD8B800091DC8001D3EC8001CF347E +:10D11000EBCD40F83FF510941697149340661388B2 +:10D12000EA081800C05130070E9CE3CD80F858047F +:10D130005F1858065F991268CF700C9B5D1718979F +:10D14000C0600C9A089BF01F0004CEFBA685A69C2D +:10D15000CECB0000800091DCEBCD40C0129EF2E807 +:10D160000000F4E9000014977C2A8F2A18961D8984 +:10D17000169C3FF8F0091800C1401D993058F0097D +:10D180001800E088000F2039E06A5556EA1A555514 +:10D19000F20B141FF20A04481619F2090019C028EC +:10D1A00030091AD9189B1C990C9C7C280E9AF01FE8 +:10D1B00000042FFD8F2CE3CD80C000008001D11032 +:10D1C000EBCD406CF2E20000F4E3000072289528F9 +:10D1D0001495722813961AD6F01F00032FFD8B2C7E +:10D1E000E3CD806C8001D110EBCD406FF2E2000006 +:10D1F000F4E30000F2E00008F4E10008F2E20010BD +:10D20000F4E300101495725813961AD6F01F000319 +:10D210002FFD8B5CE3CD806F8001D110EBCD406F93 +:10D22000F2E20000F4E30000F2E00008F4E100089C +:10D23000724895481495724813961AD6F01F000349 +:10D240002FFD8B4CE3CD806F8001D110EBCD406C76 +:10D25000F2E20000F4E30000722895281495722889 +:10D2600013961AD6F01F00032FFD8B2CE3CD806C94 +:10D270008001D110D421310418971AD41696149530 +:10D2800030183329F01F00142FFD580CC0B058057A +:10D29000C0E18C986C4C0F9A100CEECBFFFEF01F87 +:10D2A000000F0F998C181208AC18D8225815CFA16E +:10D2B0000F9AE80A1800E08800073FF83009AE88A6 +:10D2C000AE99CF0B8C986C4BEECCFFFE100BF01F81 +:10D2D0000003CE8B8001C984800091DCD4213018FA +:10D2E000189716961495308410991AD4F01F0014CC +:10D2F0002FFD580CC0B05805C0E18C986C4C0F9AAB +:10D30000100CEECBFFFEF01F000F0F998C181208C7 +:10D31000AC18D8225815CFA10F9AE80A1800E08857 +:10D3200000073FF83009AE88AE99CF0B8C986C4B54 +:10D33000EECCFFFE100BF01F0003CE8B8001C984E2 +:10D34000800091DCEBCD40E0320930081AD9189505 +:10D35000169714961099F01F00132FFD580CC0F06B +:10D360005806C0F18E986E4C0B9A100CEACBFFFE5B +:10D37000F01F000D0B998E181208AE18E3CD80E057 +:10D380005816CF918E986E4B0B9A100BEACCFFFE7D +:10D39000F01F00050B998E181208AE18CF0B000075 +:10D3A0008001C984800091ACD421201D7809189691 +:10D3B000F2C800015BD8E08B0014F2C80008C0E09E +:10D3C0001A943005C0280E98500870079105680C13 +:10D3D000F01F00068D055807CF712FFDD8223008A9 +:10D3E00099082FFDD8220000800091E8EBCD40C0C5 +:10D3F00018971696F6CCFFF8F01F000DC130EEF826 +:10D40000FFF8EEC900089908F8C7FFF8930C9916C1 +:10D410000C9AE06B00FF0E9CF01F00060E9CE3CD03 +:10D4200080C018970E9CE3CD80C000008000920061 +:10D43000800091D0EBCD40FC32E818931AD81692B8 +:10D44000149430683079F01F00232FFD580CC03140 +:10D45000E3CD80FC089A049BE6CCFFFEF01F001E83 +:10D4600007993058F0091800E088001F2039E06A59 +:10D470005556EA1A5555F20B141FF20A0448F20BDE +:10D4800001055814C18030060C972FF6662C0899B8 +:10D490000E0C049A2FD7303BF01F00100C35FE996C +:10D4A000FFF6E3CD80FC5814F9B80000E7F80A0253 +:10D4B000E3CD80FCEA050017645C0E9BF01F0008BA +:10D4C000872CCC700E9A300BF01F0006CDDB0000CD +:10D4D0008001C9848001BB948001AD988001D3ECA8 +:10D4E000800091D0D421189616951497582AC161BE +:10D4F00019893FF8F0091800F9F91801F7F8120135 +:10D50000F9BA0102F1DAE108F1D9E108F7F81C01F2 +:10D51000F9B80000F9F80E01D82230083049F01FA0 +:10D52000000CC0C00D98F0C400045817C0800E99BC +:10D530000A9A089B6C2CF01F0007D822089B6A5C93 +:10D54000F01F00058D2CCF41CF9B00008001CB2C1C +:10D550008001AD988001D3ECEBCD40FC206D189498 +:10D5600016951493582AC18119893FF8F0091800BB +:10D57000F9F91801F7F81201F9BA0102F1DAE10834 +:10D58000F1D9E108F7F81C01F9B80000F9F80E012B +:10D590002FADE3CD80FC30083019F01F0040CF9054 +:10D5A0006A1E501E6A0A500AEAE80008FAE90008F2 +:10D5B000EAEA0010FAEB0010EDDEB0105813C600D6 +:10D5C000E8C7FFFA0999ECC8FFFE12080E9CE5D8DF +:10D5D000B010069A0A9BF01F00328A18E40819005E +:10D5E000CD82069A0A9BE8CCFFF8F01F002E8A181D +:10D5F000E4081900CCE2E8CCFFF4069A0A9BF01F7D +:10D600000028685C88693008F0091900C0E01896A5 +:10D6100030070C9C2FF7069A0A9BF01F00222FC69A +:10D6200088E80E38FE99FFF78A18E4081900CB1233 +:10D63000069AE8CCFFF20A9BF01F0019685888E9A7 +:10D64000887AF009002C3008F00A1900C0E018961A +:10D6500030070C9C2FF7069A0A9BF01F00132FC669 +:10D6600088F80E38FE99FFF78A18E4081900C912E5 +:10D67000069A0A9BE8CCFFF0F01F0009C8ABE8C788 +:10D68000FFFA30EA300B0E9CF01F0008099B6A5C21 +:10D69000F01F0007895CC97B8001CB2C8001A2FCB4 +:10D6A0008001C8308001C804800091D08001D3EC93 +:10D6B000EBCD40FC206D189416951493582AC18127 +:10D6C00019893FF8F0091800F9F91801F7F8120163 +:10D6D000F9BA0102F1DAE108F1D9E108F7F81C0121 +:10D6E000F9B80000F9F80E012FADE3CD80FCE06839 +:10D6F00000FF33091AD83008F01F00532FFD580CD3 +:10D70000CF406A1E501E6A0A500AEAE80008FAE989 +:10D710000008EAEA0010FAEB0010EDDEB010581332 +:10D72000E0800085E8C7FFFE0999ECC8FFFE1208FB +:10D730000E9CE5D8B010069A0A9BF01F00448A1888 +:10D74000E4081900CD22069A0A9BE8CCFFFCF01FE2 +:10D7500000408A18E4081900CC82E8CCFFF8069A49 +:10D760000A9BF01F003A684C88493008F0091900FC +:10D77000C0E0189630070C9C2FF7069A0A9BF01F02 +:10D7800000342FC688C80E38FE99FFF78A18E408BF +:10D790001900CAB2069AE8CCFFF60A9BF01F002BCC +:10D7A000684888C9885AF009002C3008F00A190026 +:10D7B000C0E0189630070C9C2FF7069A0A9BF01FC2 +:10D7C00000252FC688D80E38FE99FFF78A18E4087E +:10D7D0001900C8B2069A0A9BE8CCFFF4F01F001BA0 +:10D7E0008A18E4081900C812069AE8CCFFF20A9BCE +:10D7F000F01F001688C988D81208684A8879F4088A +:10D80000002C3008F0091900FE90FF7018963007C0 +:10D810000C9C2FF706990A9A310BF01F000F2F0668 +:10D8200088F80E38FE99FFF6C60BE8C7FFFE30EA0F +:10D83000300B0E9CF01F0009099B6A5CF01F00086A +:10D84000894CC73B8001C9848001A2FC8001C8309B +:10D850008001C8048001AD98800091D08001D3EC94 +:10D86000EBCD40E0E06800FE18971AD816951496A4 +:10D8700030483059F01F00162FFD580CC031E3CD51 +:10D8800080E0EECCFFFE0C9A0A9BF01F00120C9A6F +:10D890000A9BEECCFFFDF01F000F0C9A0A9BEECC0A +:10D8A000FFFCF01F000C5816C0A00F9B0C990A9AA1 +:10D8B0006E2C203BF01F0008E3CD80E00F9B6A5CDC +:10D8C000203BF01F00068F2CCF11CDAB8001C98407 +:10D8D0008001A29C8001AD988001D3ECEBCD40E0AB +:10D8E00018951696F6CCFFF8F01F000CC12099167B +:10D8F00030089908F8C7FFF80C9A5805EBF71A0595 +:10D90000E06B00FF0E9CF01F00060E9CE3CD80E054 +:10D9100018970E9CE3CD80E080009200800091D0AB +:10D92000EBCD40C0201DF8C60008300C6C1BF01F6A +:10D930000014C1A0500C3007C1286C1B400CF01F14 +:10D9400000111897C1406C1AECCBFFF8EF4AFFFCAE +:10D950000E9CF01F000D6C065806C0505807CEE113 +:10D960004007CF2B400C2FFDE3CD80C01A9CF01F49 +:10D9700000070E9C2FFDE3CD80C000008001D8DCA5 +:10D980008001D3EC800091DC8001D3A8D401E06851 +:10D990000081301999489959189A7408129C11CE2F +:10D9A000F20E18005F089708D802D703486830398C +:10D9B000F0FA00F830089569985BF00B19005F0CDD +:10D9C0005EFC0000000087F419C8300A4869F2F9CB +:10D9D00000F8F4081800F9BC0001F9BC0100F3FCE0 +:10D9E0001A065EFC000087F448483009F0FA00F897 +:10D9F000301C95695EFC0000000087F448B8985A16 +:10DA0000F0FB00F83178F00A1900E08B000B3018B9 +:10DA1000F00A0948E4180080E01803FEC0205EFF09 +:10DA20003008301C97685EFC000087F478185808AE +:10DA30005F0C5EFC5EFF19C830192018F208180050 +:10DA40005FBC5EFC5EFD5EFD19C93008F009180080 +:10DA50005F0C5EFC5EFD5EFFEBCD4080308B189767 +:10DA6000991B300CF01F00078F0CC0803078E069E4 +:10DA700000818F588F49E3CF9080E3CD80800000F4 +:10DA80008001D8DCEBCD40C018971696308B991BDF +:10DA9000300CF01F00108F0CC160301830298F58E7 +:10DAA0008F4948D8B826118948C8B8E948C71189AC +:10DAB000B8F96EB899086EBC580CC0752FFC8FBCB5 +:10DAC000E3CF90C0E3CD80C0F01F0006CF9B0000E5 +:10DAD0008001D8DC00007A280000025C000087F496 +:10DAE00080018450EBCD40FE1897FACCFFE01694ED +:10DAF000781330CB14928F1B129178061095300C4E +:10DB0000F01F00118F0CC1A0307830498F588F4919 +:10DB10009905B8E6B8F1F9630008B8C4B8D248B8B6 +:10DB200048B9B084B28248B76EB899086EBC580C38 +:10DB3000C0752FFC8FBCE3CF90FEE3CD80FEF01FBD +:10DB40000006CF9B8001D8DC000079E5000079E475 +:10DB5000000087F480018450EBCD40FC1897FACC8C +:10DB6000FFE4314B781414938F1B129278061095B2 +:10DB7000300CF01F00158F0CC2003018F3D4C01009 +:10DB80008F488F589913B8429935F9560010F954B7 +:10DB9000001248E7F1D6C0100A481248F9B800FF51 +:10DBA000F9B80100B8586EB999096EBC580CC07527 +:10DBB0002FFC8FBCE3CF90FCE3CD80FCF01F000472 +:10DBC000CF9B00008001D8DC000087F480018450E6 +:10DBD000D401780A3009740B15F8129C129AF01FC0 +:10DBE0000002DA0A80018460D401780A3009740BDB +:10DBF000F538000B129C129AF01F0002DA0A00009E +:10DC000080018460D401780A3009740BF538000B68 +:10DC1000129C129AF01F0002DA0A00008001846050 +:10DC2000D401780A3009740BF538000B129C129A53 +:10DC3000F01F0002DA0A000080018460D401780A33 +:10DC40003009740BF538000B129C129AF01F000279 +:10DC5000DA0A000080018460D401780A3009740B6C +:10DC6000F538000B129C129AF01F0002DA0A00002D +:10DC700080018460D401780A3009740B15F8129C75 +:10DC8000129AF01F0002DA0A80018460EBCD40F89E +:10DC900030C618979916169414930C9B300CF01FED +:10DCA00000108F0C1895C160307831690C9A8F582C +:10DCB000089B8F49F01F000B48B66CB88B086CBCF2 +:10DCC000580CC0A52FFC8DBC301C6A088708E3CD1A +:10DCD00080F8E3CD80F8F01F0005CF6B8001D8DC21 +:10DCE000800091DC000087F480018450EBCD40F887 +:10DCF000308618979916169414930C9B300CF01FCD +:10DD000000108F0C1895C160307831490C9A8F58EB +:10DD1000089B8F49F01F000B48B66CB88B086CBC91 +:10DD2000580CC0A52FFC8DBC301C6A088708E3CDB9 +:10DD300080F8E3CD80F8F01F0005CF6B8001D8DCC0 +:10DD4000800091DC000087F480018450EBCD40F826 +:10DD500033C618979916169414930C9B300CF01F29 +:10DD600000108F0C1895C160307831390C9A8F589B +:10DD7000089B8F49F01F000B48B66CB88B086CBC31 +:10DD8000580CC0A52FFC8DBC301C6A088708E3CD59 +:10DD900080F8E3CD80F8F01F0005CF6B8001D8DC60 +:10DDA000800091DC000087F480018450EBCD40F8C6 +:10DDB000318618979916169414930C9B300CF01F0B +:10DDC00000108F0C1895C160307831190C9A8F585B +:10DDD000089B8F49F01F000B48B66CB88B086CBCD1 +:10DDE000580CC0A52FFC8DBC301C6A088708E3CDF9 +:10DDF00080F8E3CD80F8F01F0005CF6B8001D8DC00 +:10DE0000800091DC000087F480018450EBCD40F865 +:10DE1000330618979916169414930C9B300CF01F28 +:10DE200000108F0C1895C160307831090C9A8F580A +:10DE3000089B8F49F01F000B48B66CB88B086CBC70 +:10DE4000580CC0A52FFC8DBC301C6A088708E3CD98 +:10DE500080F8E3CD80F8F01F0005CF6B8001D8DC9F +:10DE6000800091DC000087F480018450D421189751 +:10DE7000169530CB991B300CF01F00128F0C1896A2 +:10DE8000FAC4FFEC580CC190302830098F588F49E4 +:10DE900048D76EB899086EBC580CC1052FFC8FBCD2 +:10DEA0005805EDF81000EBF81A00089BECCCFFFCCD +:10DEB000308AF01F0006DA2AD822F01F0005CF0BA7 +:10DEC0008001D8DC000087F4800091DC8001845060 +:10DED000EBCD40E018961695310B991B300CF01FD6 +:10DEE00000108D0C1897C1503078317A0A998D58EE +:10DEF0008D4A48CBF8CAFFFCF01F000B48B56AB842 +:10DF00008F086ABC580CC0752FFC8BBCE3CF90E027 +:10DF1000E3CD80E0F01F0006CF9B00008001D8DC3D +:10DF20008001D3EC8001D158000087F48001845037 +:10DF3000EBCD408078076E285808C0B0300C189A96 +:10DF40005C586E0B3109300CF01F0009E3CF908054 +:10DF5000310CF01F00086E189908EF390016991956 +:10DF60006E3899286E4999396E28CEAB800184604D +:10DF700080009200EBCD40FC189716931495314B1E +:10DF80001294991B300CF01F001C8F0C1896FAC2CB +:10DF9000FFE4580CC200302830198F588F495805BB +:10DFA000C1C18D455C7549576EB88D086EBC580C63 +:10DFB000C1F52FFC8FBC5804EDF81000E9F81A00E9 +:10DFC000049B308AECCCFFFCF01F000D301C8D351B +:10DFD000E3CD80FCE3CF80FC5C750A9CF01F000958 +:10DFE0008D4CCF90069B0A9AF01F0005CDDBF01FE9 +:10DFF0000006CE1B8001D8DC000087F4800091DC95 +:10E000008000920080018450EBCD40801897F93C4D +:10E01000000BF01F00084888F0F900F85809C0709C +:10E02000EECBFFFC310A313CF01F0004E3CF9080BF +:10E0300080015FB0000087F480014658D42130C8C9 +:10E040001896109B4904300CE8F500F88D18F01F65 +:10E05000000F8D0C1897C120301830D98D582FCC57 +:10E06000EACBFFE28D49F01F000A68B88F0868BC50 +:10E07000580CC0552FFC89BCDA2AD822F01F0005A5 +:10E08000CFBB0000000087F48001D8DC8001844011 +:10E0900080018450D42130CB1897991B300CF01F8D +:10E0A000000B8F0C1894C1004898301530868F559E +:10E0B0008F462FCCF0FB00F82E2BF01F00060A9C99 +:10E0C000E966000AD822D8228001D8DC000087F453 +:10E0D00080018440EBCD40E030CB1896991B300C8A +:10E0E000F01F00108D0C1897C1703018305948E59A +:10E0F0008D588D492FCCEAFB00F82E2BF01F000B1A +:10E100003028AE586AB98F096ABC580CC0752FFC0C +:10E110008BBCE3CF90E0E3CD80E0F01F0005CF9B08 +:10E120008001D8DC000087F48001844080018450A5 +:10E13000EBCD40FC30C518969915169414931292A5 +:10E140000A9B300CF01F00138D0C1897C1D03018AB +:10E150008D458D580A9A300BF01F000FEECCFFFC56 +:10E16000089BF01F000E078848D6EF68000A058953 +:10E17000EF69000B6CB88F086CBC580CC0752FFC95 +:10E180008DBCE3CF90FCE3CD80FCF01F0006CF9B5D +:10E190008001D8DC800091D080018440000087F4A9 +:10E1A00080018450EBCD40FC30C51896991516942B +:10E1B000149312920A9B300CF01F00128D0C1897CA +:10E1C000C1B0301830B98D588D490A9A300BF01F04 +:10E1D000000E306AAEC4AED3049BEE0A000CF01FF2 +:10E1E000000B48B66CB88F086CBC580CC0752FFC7F +:10E1F0008DBCE3CF90FCE3CD80FCF01F0006CF9BED +:10E200008001D8DC800091D0800091DC000087F490 +:10E2100080018450D431203D502B5018FACEFFD0CD +:10E2200033857C3499157C181896149312917C00D0 +:10E2300050087C220A9B300CF01F00228D0C18978E +:10E24000C370301830A98D580A9A8D49300BF01FD1 +:10E25000001E069A029BEECCFFFCF01F001CEF5341 +:10E2600000244028049BEF680026EF600027306AF6 +:10E27000EECCFFD8F01F00155804C1C0089B308AAF +:10E28000EECCFFD2F01F00114008EF6800364018B6 +:10E2900048F6EF6800376CB88F086CBC580CC05556 +:10E2A0002FFC8DBC2FDDDA3AF01F000ACFBB2FDD2B +:10E2B000D832089B308AEECCFFD2F01F0003CE5B31 +:10E2C0008001D8DC800091D0800091DC000087F4D0 +:10E2D00080018450D4012FCC7808202D500819C912 +:10E2E000BAC919D8BAD8F01F00052FED580CF9B8E3 +:10E2F000010DF9F81A06DA0A80015860D40148D8ED +:10E30000F8CBFFF5F0F900F8733C7808204D502861 +:10E3100019C9FB69000C19D8306AFB68000D1A9CFA +:10E32000F01F0005F01F00052FCD580C5F1CD80210 +:10E33000000087F48002E73680018898EBCD40FE2C +:10E340003007FAC5FFE0189116924A134A1466087E +:10E350000E38E08A00216A08204D50280BC9FB695D +:10E36000000C0BD8EE061504FB68000DE806000A49 +:10E3700015D8BAD87409500915C8BAC8F01F0016C4 +:10E380002FCD580CC0A12FF75907CE2118970E9CFE +:10E39000E3CD80FEEE061504E80600060A9B0C9C01 +:10E3A000F01F000EF3D2C001EE081501AC692FF882 +:10E3B000E808093166090E39FE99FFEBEEC9FFFF47 +:10E3C00048380E9C9109E3CD80FE000000008C5C73 +:10E3D00000008B5C8001889880018440EBCD4080F8 +:10E3E000300819C9F0091800C10048E8F0F700F832 +:10E3F0005807C130F01F000C0E9CF01F000C0E9C43 +:10E40000F01F000BE3CF8080486830A9F0FA00F8D5 +:10E41000301C9569E3CD80800E9CE3CD80800000A8 +:10E42000000087F480015D188001593880015CDCB0 +:10E43000EBCD40E01896F01F00224A2A0DE9F4F7D0 +:10E4400000F85809C1103018F0091800C32030280E +:10E45000F0091800C31030488F687498300CABC8AE +:10E460009598E3CD80E06F3930D8322A8F68496CB7 +:10E47000727B2F4BF01F00156F3C3FF8787BF7390C +:10E4800000C8F0091800C130202DF71600D47845D7 +:10E49000306AEECBFFE21A9CF01F000C0C9B0A9C2A +:10E4A000F01F000B301C2FEDE3CD80E0E3CF90E0B8 +:10E4B00030088F68CD3B30588F68CD0B8001F00459 +:10E4C000000087F400008C608002E7368001E33CA6 +:10E4D000EBCD40E01896F01F00284A8A0DE9F4F7CA +:10E4E00000F85809C1503018F0091800C3603028EE +:10E4F000F0091800C3906F0830492FF88F69EF4872 +:10E5000000407498300CABC89598E3CD80E06F392B +:10E5100030D8322A8F6849AC727B2F4BF01F00191C +:10E520006F3C3FF8787BF73900C8F0091800C1301C +:10E53000202DF71600D47845306AEECBFFE21A9C06 +:10E54000F01F00100C9B0A9CF01F000F301C2FEDD9 +:10E55000E3CD80E0E3CF90E06F0830092FF88F69BA +:10E56000EF480040CCFB6F0830592FF88F69EF4817 +:10E570000040CC8B8001F004000087F400008C6028 +:10E580008002E7368001E33CD421310B1896991BB9 +:10E59000300CF01F00198D0C1897C28030183049CC +:10E5A0008D588D494955302CEAF400F8F01F0014BD +:10E5B000E8CBFFE21896EECCFFF8F01F00126C38A3 +:10E5C000AE38EAF901045819C0D03008AE2830B886 +:10E5D00089686AB98F096ABC580CC0952FFC8BBC3E +:10E5E000DA2AEAF8011C5818CF20D82AF01F0006B2 +:10E5F000CF7B00008001D8DC000087F48001EF6C45 +:10E600008001844080018450EBCD40F81897169427 +:10E6100030CCF01F0046303CF01F00441895302CE1 +:10E62000F01F0042E06A00EC1896E06B00FF0E9CC1 +:10E63000F01F003FE8CBFFE2EECCFFF6F01F003DFD +:10E640006C384BD9AE289208AE483DD86939727BF8 +:10E65000F73A009AF00A1800C480F73900803DD8D4 +:10E66000F0091800C52030050A93F01F00349838CF +:10E67000AE381896F93900A83FF8F0091800C09094 +:10E68000F8C9FF58EECAFF584ADB0E9CF01F002D58 +:10E69000ED3900CC3FF8F0091800C1900E9CECC990 +:10E6A000FF34EECAFF344A6BF01F0027089CF01FAE +:10E6B0000027583CE089000C4A587099ABC99199E1 +:10E6C0003FFA301CEF6A009EE3CD80F85805CF502A +:10E6D000EECCFF62069BF01F001F49D9301C7298D8 +:10E6E000ABA89398E3CD80F8F73900A03008F00983 +:10E6F0001800CB41EAF900B85819CB01F72800A25D +:10E700001295F003161FCB2BF73900863018F0094D +:10E710001800CAA1EAFC00B8581CCA61F728008892 +:10E720001895F003161FCA2B8001EF6C800091D062 +:10E73000800184400000025E8001EFF88001D3EC8C +:10E740008001D1E88001D21C8001808E000087F416 +:10E75000800184F0D421E06800EC1897109B4924D4 +:10E76000300CE8F500F88F18F01F00108F0C189689 +:10E77000C090301830798F588F490A9BF01F000CD9 +:10E78000C021D82A0C9CF01F000B30C88B6868B9D8 +:10E790008D0968BC580CC0452FFC89BCDA2AF01FD3 +:10E7A0000006CFCB000087F48001D8DC8001E608AA +:10E7B0008001F03080018450D421E06800EC18978B +:10E7C000109B4924300CE8F500F88F18F01F00105A +:10E7D0008F0C1896C090301830698F588F490A9B5B +:10E7E000F01F000CC021D82A0C9CF01F000B30C871 +:10E7F0008B6868B98D0968BC580CC0452FFC89BC72 +:10E80000DA2AF01F0006CFCB000087F48001D8DCA5 +:10E810008001E6088001F03080018450EBCD40405B +:10E82000201D18961A9CF01F001849888C69F0FB6F +:10E8300000F85809C1203018F0091900C0B030287C +:10E84000F0091900C170770830492FF89769F74827 +:10E8500000402FFDE3CF80407738301911EA301C9B +:10E86000F20A1800F9B8000CF7F80A062FFDE3CDFC +:10E870008040770830592FF89769F74800402FFDFE +:10E88000E3CF8040800177A4000087F4D401496879 +:10E8900019C9F0FA00F85809C1803028F0091800A9 +:10E8A000C1803048F0091800C0503018F009180035 +:10E8B000C180750830492FF89569F548004019CB9B +:10E8C000302CF01F000AD80A3088301C9568D80216 +:10E8D000750830592FF89569F548004019CBCF1BC2 +:10E8E000301BCEFB000087F480018390D431215D82 +:10E8F000303C169614911290F01F00584D83F8C4C6 +:10E90000FFB0189531CA089B069CF01F0056C0A1A5 +:10E910006D3830AA707BE6CCFFE42D2BF01F005140 +:10E92000C7B06D38FAC7FFC8707B0E9CF6CAFFC827 +:10E930002D2BF01F004D089B0E9CF01F004CC0417A +:10E94000300C2EBDD83231CA0E9BFA0A0002049C4C +:10E95000F01F0047049CF01F004730080E9A500833 +:10E960001A97089B1A9CF01F00446D38707930E8A4 +:10E97000F33A005EF00A1800C670EB3A0074580AC9 +:10E98000CE006D387079EB380075F33B005EF60809 +:10E990001800C0F0EACCFF8A3009C0581938F608D0 +:10E9A0001800C0502FF9123AFE99FFFA123ACC9093 +:10E9B000049CF01F0032CC50049B1A9CF01F0030C6 +:10E9C0001A9B029CF01F002F049B009CF01F002D3F +:10E9D000089B31CA4A2CF01F00266D3830AA707B84 +:10E9E000E6CCFFE42D2BF01F00226D38312A707B1E +:10E9F000E6CCFFDA2C8BF01F001E029B304AE6CCDF +:10EA0000FFC8F01F001B009BE6CCFFC4304AF01F7C +:10EA10000018301CC97B6D38312A707BE6CCFFDAD8 +:10EA20002C8BF01F0010FE91FF7E304AE6CBFFC812 +:10EA3000029CF01F000FE6CBFFC4009C304AF01F81 +:10EA4000000C301CC7FB049CF01F000FFE90FF7AE7 +:10EA50001A9CF01F000EC92B8001EF6C000079E8B2 +:10EA60008000917C80018124800182BC800091DC47 +:10EA700080018658800181E8800182608001817E6A +:10EA8000800180CC80018360800185F4EBCD40FC67 +:10EA9000FACD0110300733095407FEF3022EE6F8D1 +:10EAA00000F854281896129B0E9C8D19F01F0088B0 +:10EAB0008D0C1895E080008A3018303C8D588D4CB4 +:10EAC000F01F0084FACBFEFC1894FACAFEF8FACCC8 +:10EAD000FEF2F01F0081442871390E9CE06B00ECBF +:10EAE0007277F01F007BC710540CE0680420B83820 +:10EAF000442B7738707992D9EDB90000C6B0EDB9E2 +:10EB00000001C06144099238A1B8B238442BE8F83A +:10EB100000B85808C0C07738707A94D9EDB90009A8 +:10EB2000C06144099238A9B8B238442BFAC2FEF148 +:10EB3000441A049CF01F006944185818E08000A58E +:10EB4000C6823079FB38010FF2081800C050440922 +:10EB50009238A5A8B238440CF01F0061049CF01F45 +:10EB600000614428E74C0100EACAFFF071390A9CB1 +:10EB70004DDBF01F005E6858AA286869AA394D3C31 +:10EB800069B85808C440442B773870793078F33A24 +:10EB90000074F00A1800C240EAC9FFF4EACAFFF89C +:10EBA000300CF01F0053581CC53030063018E748B1 +:10EBB000004444095809C0A0FACCFF00F01F004DE2 +:10EBC0000C9C2BCDE3CD80FC30060C9C2BCDE3CDF3 +:10EBD00080FC44099238A1A8B238442BC99BF8F8AC +:10EBE00001AC5808C050F8CCFE54F01F004230CBA6 +:10EBF000300CF01F0037E74C01AC189AC080442855 +:10EC0000713B76794B8B28C9F01F003B442BCC5BC2 +:10EC10005828CA51442C1A9B2E2CF01F00381A96E3 +:10EC20001AD61ADC442BFB380116FB390117EF3AD0 +:10EC300000CF169CF6CBFF34F01F003144283289F8 +:10EC4000F15900D8442CF01F00262FEDC88BE8F8AE +:10EC500000B85808C2916AB93FF8F368009A3028A2 +:10EC60003039E7480044442891694426F01F0025C4 +:10EC7000ED4C004466B88B0866BC580CC2352FFCBE +:10EC800087BC3016C94B440BEF3A00AF169CFB38DB +:10EC9000010EFB39010FF6CBFF58F01F001B440C8F +:10ECA000F01F000FC5CB44287139727A94D8EDB8A3 +:10ECB0000001CD21189B6ABCF8CCFF66F01F001341 +:10ECC000CCFBF01F0013CDDB000087F48001D8DC03 +:10ECD0008001EF6C80017C4480017EE08001F03097 +:10ECE00080017BD88001D3EC8001AD408001E8EC4D +:10ECF0008001D3A88001D1588001887080018C2CBC +:10ED0000800145C480018B74800184F080018450AF +:10ED1000D431203D189616971493303CF01F0070A4 +:10ED2000301831798D588D4930086C068F0858039A +:10ED3000EDF81805E7F81A0018950DC40898A7D83B +:10ED4000C0505898C0302FDDD83A0DD93018F0098E +:10ED50001800C1003008F0041800F9B80500EFF8F9 +:10ED60005A00F9BC0501F9BC0401EFFC4A002FDD93 +:10ED7000D832303CF01F005A6C98F93A0074F13BDD +:10ED8000005E580ACE80F9380075F6081800C0A059 +:10ED900028AC30092FF91439CDE41938F00B1800DC +:10EDA000CFA1ECC0FFF8009CF01F004E1891CD30B1 +:10EDB0006BB85808C090793870793078F33A00749D +:10EDC000F00A1800C6E0FACCFFF8F01F0047581C04 +:10EDD000C0A0F01F0046029B835C350A31DCF01FA7 +:10EDE0000044CB9B40285818CF51FACCFFFCF01FB1 +:10EDF0000041581CCEF1401820785818FE9BFFEBBC +:10EE00004BD8F0F900F85809CE501A9CF01F003B7F +:10EE1000581CCE01400820285818FE9BFFDC6C9E31 +:10EE20002F4EFCE80000212DFAE90024FCE8000840 +:10EE3000FAE9002CFCE20010FAE30034FCE80018C8 +:10EE4000FAE9003CFD3C0020FB6C0044FD38002149 +:10EE5000322AFB6800454AAB1A9CF01F002AF01FBB +:10EE6000002A2EED580CCB606C9A3FF8F53900C89B +:10EE7000F0091800CAF06008F51B00D4202D6C6C56 +:10EE8000500801C9BAC901D8BAD8F01F0020A56C32 +:10EE900049FB310A180B315CF01F00152FEDC9AB8F +:10EEA0004955EAF801AC5808C050EACCFE54F01FAE +:10EEB000001930CB300CF01F0018EB4C01AC189A45 +:10EEC00048D5580CFE90FF816338494B707928C9AA +:10EED000F01F00136A98ABB88B98C76B8001EF6C7A +:10EEE00080015D44800177A4800145C480014658BB +:10EEF00080015F44000087F480015F2800008C607F +:10EF00008002E736800189108001E33C00008B5CC1 +:10EF10008001D3A88001D8DC8001D3EC8001D158D6 +:10EF2000EBCD40E0206D300818991495502850081A +:10EF30001A9C1A965D191897C10140085808C040DC +:10EF40001A9CF01F0009402C580CC030F01F00071D +:10EF50000E9C2FADE3CD80E01A9C5D15581C5F0719 +:10EF6000CEDB00008001D3A8800091E858DCE08867 +:10EF700000035EFD49B8F00C032F49B8F0CCFFF454 +:10EF80005EFC4998F0CCFFE45EFC4978F0CCFFD4FD +:10EF90005EFC4958F0CCFFCC5EFC4938F0CCFFC495 +:10EFA0005EFC4918F0CCFF305EFC48F8F0CCFF1C4A +:10EFB0005EFC48D8F0CCFEF45EFC48B8F0CCFEBC59 +:10EFC0005EFC4898F0CCFE945EFC487C5EFC486891 +:10EFD000F0CCFFFC5EFC4848F0CCFE785EFC000004 +:10EFE0008003C01400000260483930089318930869 +:10EFF0005EFC000000008C844828700C5EFC000061 +:10F0000000008C84EBCD40C0487618976C1C580CDF +:10F01000C030F01F00060E9CF01F00058D1CE3CDD4 +:10F0200080C0000000008C8480018AD480018AECBA +:10F03000EBCD40C0487618976C0C580CC030F01FD0 +:10F0400000060E9CF01F00058D0CE3CD80C0000073 +:10F0500000008C8480018ABC80018B30D4211894FC +:10F060001696149530CCF01F00121897C1D03018A6 +:10F0700099069915F0060946EC0C1502F01F000CD4 +:10F080008F2CC0F05806E08A000B3009129A6E28C7 +:10F09000F009092A2FF91236FE99FFFB8907DA2AAF +:10F0A0000E9CF01F00043FDCD8220000800092007C +:10F0B000800091E8D4311893169214901291580C54 +:10F0C000C36078093018760CF0090945580CC390D4 +:10F0D000189468160A36C1A468075807C0606E48BD +:10F0E0000238C1B03FCCD832662CF8060327580747 +:10F0F000CF71ECC8FFFFF808002CC0582FF8190793 +:10F100005807CEE110960A38CFA5089CF01F0013CF +:10F1100030083FEC8508D832029A009C6E3BF01F05 +:10F120000010301C89166E088908D832760C580CED +:10F13000C040F01F000ADA3A66093018F0090945A4 +:10F14000308CF01F00081894C060850C30089918A6 +:10F150009908CC0BD8320000800091E8800091DC47 +:10F1600080009200D431109412907818409618952F +:10F17000169214910C9B780A089C5D181893318C98 +:10F18000F01F00131897C1F00C9CF01F00118F3C6A +:10F19000C170089B0C9AF01F000F30088F468F1229 +:10F1A0008F218F508F086A29F203002C78085808A5 +:10F1B000C0C0109970085808CFD19307DA3A0E9C56 +:10F1C000F01F00053FDCD8329907DA3A8000920040 +:10F1D000800091DC800091E8D431203D501C500B20 +:10F1E000149112921090580AC4307418009B740A3B +:10F1F000129C5D18A36C502C6228F00C0307580772 +:10F20000C3706E450A990035C3610E940E93C09881 +:10F210006E075807C2D008936E490A39C2C10E94CE +:10F220006E3B0A9A049CF01F00181896CF214019D3 +:10F230006E18930840086E2991098F1C8F2C6E3C24 +:10F24000F01F00128F468F3640296228F009000C0B +:10F2500078090E39EFF80000F9F80A00EFF810000D +:10F26000E7F81A000E9CF01F00092FDDDA3A3FEC98 +:10F270002FDDD8326E385808CFB00039CF903FCC50 +:10F280002FDDD8328000917C800091E8163C5E0C26 +:10F290007808971C990B97085808F1FB1A015EFC37 +:10F2A00078195809F9F81000F3F81A007808580886 +:10F2B000F1F91A013008990899185EFCD40149380F +:10F2C000FACEFFFC709CE21C0002C1D0209DFD3AEA +:10F2D0000021FB6A0021FCE80000FAE90000FCEADA +:10F2E0000008FAEB0008FCE80010FAE90010FCEA5C +:10F2F0000018FAEB0018FD380020FB680020F01F12 +:10F3000000042F7DD8020000000087F480015AA479 +:10F31000D4014898709CE21C0002C0C0300930CC77 +:10F32000EA1C4000303B129AF01F0004F01F00045A +:10F33000301CD802000087F4800186C88001875401 +:10F34000D4014898709CE21C0002C0C0300930DC37 +:10F35000EA1C4000303B129AF01F0004F01F00042A +:10F36000301CD802000087F4800186C880018754D1 +:10F37000D4014898709CE21C0002C0C03009310CD6 +:10F38000EA1C4000303B129AF01F0004F01F0004FA +:10F39000301CD802000087F4800186C880018754A1 +:10F3A000EBCD4080495818977098E2180002C04190 +:10F3B000109CE3CD8080F01F00126F38302911EAD5 +:10F3C000F20A1800C0D03009303B129A307CEA1C97 +:10F3D0004000F01F000CF01F000CE3CF90806E681F +:10F3E0005898CF213009303B129A30BCEA1C4000BB +:10F3F000F01F0004CF1B0000000087F4800158407C +:10F40000800186C88001875458DBE08A0012F939F0 +:10F41000000C3078F0091800E08B000C595BE08A92 +:10F420000008F939000E3AA8F0091800C0D05EFDB6 +:10F430003888F0091800CFC1F939000D38E8F00913 +:10F4400018005F0C5EFCF938000FF2081800CF01BD +:10F45000F93900103038F0091800CEA1F93900113F +:10F460003008F0091800CE41F93A0012F20A1800EB +:10F47000CDF1F9380013F4081800CDA1F9390014C2 +:10F480003888F0091800CD41F939001538E8F0093D +:10F4900018005F0C5EFCD7033019482891095EFC08 +:10F4A00000007A38EBCD40C0208D48D730088E0957 +:10F4B000F0091900C101E06AFFFF300B1A9CF01F30 +:10F4C00000091A9B302AFACCFFE8F01F00079A18AF +:10F4D0001A96AE088E0C2F8DE3CD80C000007A2ADC +:10F4E0008001C7B88001A498D401F01F00054858D6 +:10F4F000F139010B120C5C8CD80200008001F4A4DD +:10F50000000087F4EBCD4060208D306AFAC5FFE63D +:10F51000300B0A9CF01F00091A9CE06AFFFF300BB9 +:10F52000F01F00070A9C1A9B302AF01F00061A964B +:10F530009A1C2F8DE3CD8060800091D08001C7B8E8 +:10F540008001A444D43120DDFEF60234FACEFFA8B7 +:10F55000189516916C9C1494129310907C177C0251 +:10F56000E21C0002C0312F3DD832FEF802167009AD +:10F570005809C041FE7CFBB4CF7BECF8012458183D +:10F58000C041FE7CFC17CF0BECC9FFE85019129C60 +:10F59000F01F007D581CE08000E30D890D98F009F4 +:10F5A0001800E08200E6302CF01F0078E08000D2E6 +:10F5B0006CB850282FF88DB85807FBF91002EFF9F6 +:10F5C0001A00F01F0073C0E0029B0A9CF01F00713C +:10F5D000E08000C96C98EDB80006C0414E88402913 +:10F5E00091D9F01F006D6008EFDCB010F3D7C010A8 +:10F5F00050091039E08B006C0D882FF8AC880D99FC +:10F60000F0091800C061300A320C149BF01F00632F +:10F61000E8C800020E08FB58002EED38010B30043C +:10F62000FB680032400A300BFB640030FB640031A1 +:10F63000FB640033069CF01F005A069BFAC7FFF4D8 +:10F64000400A0E9CF01F0057300A0E9BFACCFFD2E6 +:10F65000F01F0055ED38010BF9D2C003BA78F01F46 +:10F660000053300CFB520028FB5C002AE041003EB6 +:10F67000E0880008EB39000C3888F0091800C2D087 +:10F680004028300A50980E9BFACCFFDCF01F00484F +:10F690004009ECCCFFE88109F01F0046F01F00464E +:10F6A0003008ED4C00CCED5800D04C49F30A014233 +:10F6B000F00A1900C0604B297298EDB8000EC031F5 +:10F6C000301CC52BF01F003E301CC4EBECCCFFE817 +:10F6D000F01F00383FFCC48BEB39000D38E8F0090F +:10F6E0001800CCF1EB39000E3018F0091800CC915D +:10F6F000EB39000F3038F0091800CC313028EB3BE3 +:10F700000012F00B18005F1A3FE8F00B18005F19A9 +:10F71000126AE80A1800CB51EB380013E218001DFA +:10F720005818CAF1EB380014E21800C85888CA917A +:10F73000189A31F9EA090708F4081800CA212FF9C4 +:10F74000E049003FCF81E0680400FB58002AC99BD4 +:10F75000401CF01F0018FE7CFAECC06BFE7CFC160F +:10F76000C03BECCCFFE8F01F00133FECCFDA401CAD +:10F77000F01F0010FE7CFB4FCF7A0000000087F4E2 +:10F7800000007A38800145DC80019F3080015F04F1 +:10F790008001F4088001F4E880014658800091D08F +:10F7A0008001C7B88001A4448001859C8001A49891 +:10F7B000800145EC800145C4000002608001FBFC33 +:10F7C000D401302CF01F0003300948389109D802C9 +:10F7D0008001A12800007A38D431FACD01385009CF +:10F7E000FACEFEA416971896FEFB031C14947C1305 +:10F7F0007C00F6F801245818C460FEFA030A749CD1 +:10F80000E21C0002C05118970E9C2B2DD832E068E4 +:10F8100000F8FAC5FEFCF5D7C0100C9B0A9C548872 +:10F82000549654A730025472F01F00B8FAC1FEE497 +:10F830000A9B029CF01F00B644C95879E08B00284F +:10F840003018F0090948E2180085C2104488FAC946 +:10F85000FFF45012502854D944D80A9B5478029C83 +:10F86000F01F00ACC1C1302744D95809CCE0FAC818 +:10F87000FFF41039CCA0FACCFECCF01F00A70E9CF0 +:10F880002B2DD83230270E9C2B2DD832448B300CA8 +:10F89000F01F00A2E08000B354DCCDFB44C9E04976 +:10F8A000003FE088000B300744B8EDB80007E08067 +:10F8B000009EF01F009BCD9BFEF80268F009032F0D +:10F8C000ECCAFFFC1588EC08000889080DD81589DA +:10F8D000400BEE0901093067F208010A970A44B8A3 +:10F8E000CE5B44B8F0C90001E0490097E088008988 +:10F8F000447CF01F008D44C8189A300944BC303B4A +:10F90000BFBCF9E8108CF01F0089F01F0085301B88 +:10F91000300CF01F008744B83027CC8B44B8E04847 +:10F920000082C090E08900A9E0480080C040E04823 +:10F930000081CEE10E9B0C9CF01F007ECE9B44B854 +:10F94000E0480082E08000C4E08900915978E080BE +:10F9500000C4E0480081CCD1029CF01F0077CD8B21 +:10F9600044B85808C7E144D65803EDF81000E7F84A +:10F970001A008C28A008FB1A0106445814088908AC +:10F98000FB190104F20A0105400A30EB95056807EE +:10F990000E9CF01F006AE08000AE4DB9F2F801D075 +:10F9A0005808E080009E0A9B0E9C5D18E08000993C +:10F9B00030270DE84D4BF768007B44B8C77B44B84F +:10F9C0005818CB90E0480080CA31CB5B447B44BCE4 +:10F9D000F01F005B44BCF8C800805818FE9BFF99DC +:10F9E000029B5C5CF01F0057C93B30084C69300B30 +:10F9F000B2A8169CF01F0054C5DB3FD7C06B4D3832 +:10FA0000F009032F029CF01F0052C82B029CF01F2C +:10FA10000051C7EB029CF01F0050C7AB029CF01FC7 +:10FA2000004FC76B029CF01F004EC72B029CF01FBB +:10FA3000004DC6EBF01F004C4B3AF54C00D4C68B82 +:10FA4000029CF01F004AC64B029CF01F0049C60BE7 +:10FA5000029CF01F0048C5CB447CF01F0047C58BBB +:10FA6000E0480081C1403027C21BF0C8008F5828F1 +:10FA7000FE9BFF40C4DBE0480084FE90FF5DFE95E6 +:10FA8000FF5BE0480085FE91FF44C55B49E91388B0 +:10FA900020185C58B28844D7C29049BB7698E218C7 +:10FAA0000040C20076D96E081039E088002944B8B9 +:10FAB000A7D854B85803F9B70003EFF81000E7F8D7 +:10FAC0001A00F9B70103FBF8104BCF0A447B32EC64 +:10FAD000F01F002AC1DB029CF01F0029C19B3047A8 +:10FAE000C69B0FD8F768007ACE3B302CF01F00255C +:10FAF000CD5BF01F0025CF403FE7C5CBF01F0023B3 +:10FB0000CD7B0000000087F48001C7B88001BF10E2 +:10FB10008001BF448001D3A88001D8DC80018754D4 +:10FB20008003C04C8001870C800186C880016A88F0 +:10FB3000800237E8800208948001F4088001708C0C +:10FB40008001725480018CE48003C14C8002084023 +:10FB50008002085880020864800208708002087CD5 +:10FB600080020888800145C48002084C8002083465 +:10FB7000800209B48001DA3480016D6C8002094092 +:10FB80008001A12880015F048001F310EBCD406863 +:10FB90003006493C1AD61AD649250C9899064929A7 +:10FBA000492A302B0A9CF01F001249231AD60C98C0 +:10FBB0001AD60699490A303BEACCFFFCF01F000C2C +:10FBC0000C981AD606991AD6EACCFFF848BA305BD8 +:10FBD000F01F0007301C2FADE3CD806800007A389D +:10FBE00000007A2C8001F4988003C3AC80016EB8C9 +:10FBF0008001F7C08003C3C48003C3E05EFCD70369 +:10FC0000EBCD40E0203D1897580CC1F07938707A60 +:10FC100094D9EDB90001C1D04C166C785828C15068 +:10FC20000E9CF01F0040C110ED3900943FF8F00920 +:10FC30001800C1405017FACAFFFC1A9BFACCFFF615 +:10FC4000F01F0039581CC180301C2FDDE3CD80E04F +:10FC50004B366C785818CE51CF8B202D306A1A9CB9 +:10FC60004AFBF6CBFF4AF01F0031F01F00312FEDA9 +:10FC7000580CCEB1CE0BFAC5FFF5400A401B0A9CCA +:10FC8000F01F002C581CCE113079FB38000BF20805 +:10FC90001800C35140187139727A94D8EDB8000435 +:10FCA000CD404A5AF4F801045818C3206DE85808AA +:10FCB000C1D1ED3B008049AA580BC2806F387079E2 +:10FCC000F5380081F33C005EF8081800C1F0F4CA72 +:10FCD000FF7E3009C0581538F8081800C0402FF9C9 +:10FCE0001639CFA516395F0CCB1B48D973F85808C5 +:10FCF000CE10F4F801AC5808CDD1CA7B0A9CF01F95 +:10FD0000000FF01F000FCA10CCDB3009CECB3059EA +:10FD1000FB38000BF2081800C981CC9B0000026080 +:10FD2000800189D080017C448002E736800188B060 +:10FD300080017EE0000087F480017BD880017C1088 +:10FD4000EBCD40E048D818961695F0F700F058072C +:10FD5000C0E00E9CF01F000AC0715806C0A00E9CA7 +:10FD60000A9B5D16C0606E075807CF41E3CF80E065 +:10FD70000E9CE3CD80E00000000087F48001FC00D1 +:10FD8000D401F01F0002D80280021500EBCD40F82C +:10FD9000204DE0683100EA18312EE069312EEA1971 +:10FDA000322E306CFAE90000F01F00631894E080F6 +:10FDB00000B9303CF01F00611896301CF01F005F46 +:10FDC000306A202D189B18951A9CF01F005DF01FBB +:10FDD000005D2FED580CE080008732B80A9C1AD8DD +:10FDE000308930084D8A306BF01F00582FFD1A9370 +:10FDF000ECFC00D8F01F0056ECFC00DCF01F0055B6 +:10FE0000ECFC00E4F01F0054ECFC00E8F01F005391 +:10FE1000ECFC00ECF01F0052ECFC00F0F01F005175 +:10FE2000ED3C00B7F01F00506DC85808F9B801014B +:10FE3000EDF81A1BED3C006FF01F004CECFC012CA0 +:10FE4000F01F004BF01F004BF01F004BF01F004B4A +:10FE5000F01F004BECF800F85808C6616D084C978D +:10FE6000EF4800D8ECFC0130F01F0047300830A903 +:10FE700032B54C6A1AD5E06B0080EECCFED8F01F8C +:10FE80000033EEC6FE58304A300B0C9CF01F004089 +:10FE900030081AD530594BFA0C9C304BF01F002B10 +:10FEA0004BD82FEDF10A01423009F20A1900C26065 +:10FEB0006E99EDB9000EC201A7B930688F9950381C +:10FEC0001A9CFAC8FFF8FAC9FFF4089A308BF01FA1 +:10FED00000331897581CC140089CF01F00312FCDEB +:10FEE000E3CF80F8189A0A991A933068308B1A9CDD +:10FEF000F01F002CC7EBF01F002C6E99CDEB089C77 +:10FF0000F01F00273009303B129A311CEA1C4000D8 +:10FF1000F01F0026F01F00260E9C2FCDE3CD80F8A9 +:10FF20002FCDE3CD80F8300A301B149CF01F002148 +:10FF3000C96B0000800092008001EF6C8002E73600 +:10FF4000800188B08003B804800176C480020594E3 +:10FF500080020538800204DC8002048080020424D0 +:10FF6000800203C8800202F880020374800202D477 +:10FF70008002078C800168AC8002017080020EFC58 +:10FF8000000087F48002031C8003C400800091D02D +:10FF90008003C40C00000260800174C8800091E8F6 +:10FFA0008001776C8001FBFC800186C8800187544A +:10FFB00080020B34EBCD406830094AF63068ACA9BA +:10FFC000AC893129314AAC988D99300530130A9BA0 +:10FFD000ED4500ECED4500E88DA58DC5ED550040E3 +:10FFE000ED550042ED55004EED4500D88DB3ECCCFB +:10FFF000FEF0F01F0022ED450124F01F0021ED5519 +:02000004800278 +:1000000000D0ED4C00CCED5500D249ECF01F001EA5 +:10001000F01F001EED4501B8F01F001DF01F001D70 +:10002000F01F001D0A9BECCCFF48F01F001C0A9B30 +:10003000ECCCFF44F01F0019069BECCCFF40F01FF6 +:100040000017069BECCCFF3CF01F0014ED4300446E +:10005000F01F0013F01F001330DCF01F0013F93CF9 +:10006000000FF01F0012F01F0006ED4C01CC069CA3 +:10007000E3CD8068000087F4800091D0800145C402 +:10008000000084CC80017B24800237D080016CDCAE +:100090008001FB8C8001EFE8800144F8800187C873 +:1000A000800205EC8001EF6C800202B8EBCD40606D +:1000B000E06A01F8300B49D518960A9CF01F001C25 +:1000C000F01F001C0C9CF01F001CEACCFFF4F01F7A +:1000D000001BEACCFFE0F01F0019EACCFFF0F01F94 +:1000E0000017EACCFFECF01F0016EACCFFE8F01F87 +:1000F0000014EACCFFE4F01F0012300930DC1AD9FA +:100100001298129A129BF01F000FF01F000FF01FA1 +:10011000000FF01F000FF01F000FF01F000F301C2A +:100120002FFDE3CD80600000000087F4800091D0B7 +:1001300080016F4880021124800145D6800145F27C +:100140008002067C80014690800149B88001804091 +:1001500080015F98800201584848300A4849911848 +:10016000910A930A5EFC000000007A3C00007A4489 +:10017000D421219D4A846808F3D8C001FB6900633B +:10018000E2180002C14030183005FB6800634A3CA9 +:10019000F01F00233018189BFAC9FF9D300A49FC54 +:1001A000F01F0020581CC2802E7DD8225809C1C0E3 +:1001B000109549D870065806CEB0EA050019FA091C +:1001C00000170C9B0E9C306A2FA72FF5F01F00170D +:1001D0006C265806CDD05905CF516808F1D8C0011A +:1001E000F0051700CD5B306AE06B00FF1A9C3015FC +:1001F000F01F000FCDFB48FCF01F0009EA050018B6 +:10020000189BA1781A99300A48ACF01F00062E7D81 +:10021000D822000000007A448003C414800091B802 +:100220008001776C00007A3C800091DC800091D0E6 +:100230008003C41CD40148697208104C930CEDBCB7 +:100240000002C021DA0AF01F0003D80200007A443D +:1002500080020170EBCD408048C76E095809C1305B +:10026000722A580AF3F80003EFF80A01F3F81003B2 +:10027000F5F81A037238129C910AF01F00056E09F6 +:100280005809CEF1E3CF908000007A3C800091E8DD +:10029000D401F01F0007581CC020D802485972082A +:1002A000EDB80002CFB0F01F0004D8028002025463 +:1002B00000007A4480020170F8C900013058F0094A +:1002C0001800E08B00054838B09C5EFF3FCC5EFC18 +:1002D000000087F4D401201DFAC9FFFC12DC1A9932 +:1002E0003048300A307B483CF01F00032FFDD80215 +:1002F0008003C43C8001776CD401201D3018BA8C77 +:100300001A99300A306B484CF01F0004581C5F0CDF +:100310002FFDD8028003C45C8001776CEBCD406870 +:10032000201D48F61893FAC5FFFC2F060AFC0C9C0A +:10033000F01F000C303CF01F000CF94301300C9C06 +:10034000F01F000A0A993018300A307B488CF01FE1 +:100350000009581C5F0C2FFDE3CD8068000087F476 +:10036000800145FC8001EF6C800145FE8003C46C78 +:100370008001776CEBCD4040201D48E6BA8C2F06FB +:100380000C9CF01F000D303CF01F000C1B88F9483E +:10039000006C0C9CF01F000A30181A99300A309B30 +:1003A000488CF01F0009581C5F0C2FFDE3CD8040E6 +:1003B000000087F4800145FC8001EF6C800145FE60 +:1003C0008003C4748001776CEBCD4068201D1898C1 +:1003D0005CB81895FAC3FFFC48D606D82F060C9CCB +:1003E000F01F000C303CF01F000CF94500F00C9C95 +:1003F000F01F000A1A993048300A309B488CF01FD1 +:100400000009581C5F0C2FFDE3CD8068000087F4C5 +:10041000800145FC8001EF6C800145FE8003C480B3 +:100420008001776CEBCD4068201D18985CB818955A +:10043000FAC3FFFC48D606D82F060C9CF01F000C10 +:10044000303CF01F000CF94500EC0C9CF01F000A3A +:100450001A993048300A309B488CF01F0009581C0C +:100460005F0C2FFDE3CD8068000087F4800145FC20 +:100470008001EF6C800145FE8003C48C8001776CA5 +:10048000EBCD4068201D18985CB81895FAC3FFFCA6 +:1004900048D606D82F060C9CF01F000C303CF01FED +:1004A000000CF94500E80C9CF01F000A1A9930482E +:1004B000300A309B488CF01F0009581C5F0C2FFD40 +:1004C000E3CD8068000087F4800145FC8001EF6C7B +:1004D000800145FE8003C4988001776CEBCD4068B5 +:1004E000201D18985CB81895FAC3FFFC48D606D8AA +:1004F0002F060C9CF01F000C303CF01F000CF9453F +:1005000000E40C9CF01F000A1A993048300A309B16 +:10051000488CF01F0009581C5F0C2FFDE3CD80684C +:10052000000087F4800145FC8001EF6C800145FEEE +:100530008003C4A48001776CEBCD4068201D18981F +:100540005CB81895FAC3FFFC48D606D82F060C9C59 +:10055000F01F000C303CF01F000CF94500DC0C9C37 +:10056000F01F000A1A993048300A309B488CF01F5F +:100570000009581C5F0C2FFDE3CD8068000087F454 +:10058000800145FC8001EF6C800145FE8003C4B012 +:100590008001776CEBCD4060201D48F5BABC2F057B +:1005A0000A9CF01F000E303CF01F000DFAC6FFFC45 +:1005B0000D78F94800D80A9CF01F000A0C993018F1 +:1005C000300A306B488CF01F0009581C5F0C2FFD5F +:1005D000E3CD8060000087F4800145FC8001EF6C72 +:1005E000800145FE8003C4BC8001776CEBCD40C028 +:1005F000206D49EC3008F939010DF93B010850082C +:1006000050281AD9F93A010C1ADAFAC7FFF8F93961 +:10061000010AF93A01090E9CF01F00152FED580C44 +:10062000C10140085808C0401A9CF01F0012402C1D +:10063000580CC040F01F0010300C2FADE3CD80C02F +:100640001A9CF01F000E400818965808C0401A9CCB +:10065000F01F0008402C580CC030F01F000758163F +:100660005F0C2FADE3CD80C0000087F48001DAE499 +:100670008001D3A8800091E880018E9CD4214C0792 +:10068000405EEF6C0108EF6B0109EF6E010D1495F0 +:100690001294109A3019F2081800C120EEF801B037 +:1006A0005808C3D05828C4C04B5CEF3B01B5338811 +:1006B000F00B1800C5403398F00B1800C440EF6AE7 +:1006C000010CF01F0030EDDCB010F01F002F0C0CFF +:1006D0005C5C5805C1E11895F01F002A1815EF65FC +:1006E000010AF01F0029EDDCB010F01F00260C0CF1 +:1006F0005C5C5804C3F11894F01F00221814EF64D6 +:10070000010B6E98EDB80001C031F01F0020DA2A0D +:10071000EA0C1800FE98FFE23FCCD822EF3901B571 +:100720003348F0091800CC11EF3901B63418F0093C +:100730001800FE98FFC630E8EF68010CCC3BEF696B +:10074000010CCC0BEF3901B63408F0091800FE9803 +:10075000FFB8301948A8F169010CCB4BF93901B643 +:100760003408F0091800FE98FFA835A8F968010CB4 +:10077000CA9BE80C1800FE9BFFD1CBFB000087F45E +:100780008001F4A48001F504800205ECEBCD40E08B +:10079000303CF01F002330CB18954A26300CF01F58 +:1007A0000022ED4C01AC1897C360303BF01F001FD6 +:1007B0008F2CECF901AC72275807C2903078300BBF +:1007C000B2883068ECFA01ACB498ECF901ACB2AB89 +:1007D000ECF801ACB0BBECF901ACB2CBECF801AC7D +:1007E000EB390075702AB489ECF801ACEB39007470 +:1007F000702AB499ECF801ACEAFB00847029B2AB22 +:10080000ECFC01ACF01F000AE3CF90E0ECCCFE540E +:10081000F01F00080E9CE3CD80E000008001EF6C2B +:10082000000087F48001D8DC8001D3EC800208D47A +:100830008001D3A8D401F01F0002DA0A8001DA5641 +:10084000D401F01F0002DA0A8001DF30D401F01F6A +:100850000002DA0A8001DBE8D401F01F0002DA0AA4 +:100860008001DC04D401F01F0002DA0A8001DC20E0 +:10087000D401F01F0002DA0A8001DC3CD401F01F31 +:100880000002DA0A8001DC58D401F01F0002DA0A03 +:100890008001DC74D401201D1A9BF01F000CC09055 +:1008A00040085808C06048AA7499EDB90000C030EB +:1008B0002FFDDA0A1298A1C831CC9598300A149B02 +:1008C000F01F00042FFDDA0A8001D98C000087F4A4 +:1008D00080014658EBCD40C0206D4958189B709C54 +:1008E000E21C0002C06118970E9C2FADE3CD80C0C2 +:1008F00030081A96502850081A9CF01F000EC1119B +:10090000189740085808C0401A9CF01F000B402C54 +:10091000580CCEB0F01F00090E9C2FADE3CD80C067 +:100920001A9C3017F01F0006CEDB0000000087F491 +:100930008001DED08001D3A8800091E880018E9CE8 +:10094000EBCD4080201D300A1A9BF01F0017C0F02D +:1009500040085808C0F149576E99EDB9000BC071B5 +:10096000EEF801A84917F1D8C001C1212FFDE3CF4E +:10097000908048E76E99EDB90000CF01A1C9300A17 +:100980008F9931CC149BF01F000A6E99CE7BEEFC40 +:1009900001ACF01F00086E98301CABD88F982FFD6B +:1009A000E3CD80808001ED10000087F4800146587F +:1009B000800208D4D401F01F0002DA0A8001DBD0E3 +:1009C000EBCD40FC206D4A5318951097169266980F +:1009D0001496109C1294E21C0002C2D05BF5C30175 +:1009E000303CF01F001F300BF3D7C010F5D4C010FF +:1009F0001AD90C981ADAF3D2C010504B502BFAC601 +:100A0000FFF8F93B00F70A9A0C9CF01F00162FED37 +:100A1000580CC1B1189740085808C0401A9CF01FE4 +:100A20000012402C580CC030F01F00100E9C2FAD4F +:100A3000E3CD80FC18970E9C2FADE3CD80FCEDB884 +:100A40000000CCF13FB7CF3B6698A1A81A9C8798CD +:100A50003017F01F0007CE0B000087F48001EF6C09 +:100A60008001DB588001D3A8800091E880018E9C32 +:100A7000D40130085C7B1099109AF01F0002D80254 +:100A8000800209C0D4013008364B1099109A109C8E +:100A9000F01F0002D8020000800209C0EBCD40E048 +:100AA00020AD3006507CFB6B00201497500650267A +:100AB0001A95FACAFFDCFACBFFE81A9CF01F00195E +:100AC000C111189640085808C0401A9CF01F001623 +:100AD000402C580CC030F01F00150C9C2F6DE3CD3E +:100AE00080E05807C09040980E9B0C9C8F28F01F08 +:100AF0000010581CC0611A9C3016F01F000ECE3B2F +:100B000040085808C0401A9CF01F0007402C580CA1 +:100B1000C0313FD6CE3BF01F00053FD6CDFB0000D5 +:100B20008001DC8C8001D3A8800091E880016C40BA +:100B300080018E9CD401F01F0002D80280020A9C22 +:100B4000EBCD40E0209D3018189A1697F00C09481C +:100B50004A5B7609F1E9000CC06118970E9C2F7D65 +:100B6000E3CD80E0F00811FF12683006507A970854 +:100B7000500650261A95FACAFFE0FACBFFE81A9CF5 +:100B8000F01F001AC1E05807C09040880E9B0C9CD3 +:100B90008F28F01F0017581CC1611A9C3017F01FD6 +:100BA000001540085808C0401A9CF01F0013402C44 +:100BB000580CCD50F01F00110E9C2F7DE3CD80E02E +:100BC0001897CF0B40085808C0401A9CF01F000A25 +:100BD000402C580CC0313FD7CC2BF01F00083FD71A +:100BE000CBEB000000007A4C8001DCEC80016C4013 +:100BF00080018E9C8001D3A8800091E8EBCD40F865 +:100C0000216DFAC6FF901897FB69000EFB68000F74 +:100C1000FB6B0010FB6A00116CF46D036D15ECCCDE +:100C2000FFD4F01F0038306ABA6CECCBFFDCFACC92 +:100C3000FFEDF01F00350D88FB6800190D99ECCB16 +:100C4000FFFEFB69001A320AFACCFFE5F01F002E06 +:100C50004AEE30097C0B301CF809094AF5EB000814 +:100C6000C0902FF95899CF9130060C9C2EADE3CD52 +:100C700080F8F7EA10089D085BF9CF705024FB63F9 +:100C8000001250195807EFF91A003006FAC7FFC4CE +:100C900050F65116FACAFFAC1A9B0E9CF01F001CAE +:100CA000C111189640F85808C0400E9CF01F00195A +:100CB000411C580CCDB0F01F00180C9C2EADE3CD9C +:100CC00080F85805C09041580A9B0C9C8B28F01F57 +:100CD0000013581CC0610E9C3016F01F0011CE3B53 +:100CE00040F85808C0400E9CF01F000A411C580CE8 +:100CF000C0313FD6CBBBF01F00083FD6CB7B0000F6 +:100D000080018058800091DC00007A4C8001DD4C2D +:100D10008001D3A8800091E880016C4080018E9C06 +:100D2000D42120DD4B0510946A0E4126F1DEC0016E +:100D3000C0B0EDBE0001C411EDBE0002C411300709 +:100D40000E9C2F3DD82210973018FB6B002A508A3A +:100D50005077FDE8100850998B08FB540028580C78 +:100D6000F9F71A001A953007FACAFFD05007502732 +:100D7000FACBFFE81A9CF01F001DC101189740082C +:100D80005808C0401A9CF01F001A402C580CCD90F7 +:100D9000F01F00180E9C2F3DD8225806C09040C866 +:100DA0000C9B0E9C8D28F01F0014581CC0C11A9C6F +:100DB0003017F01F0012CE4B30173028CC7B302775 +:100DC0003048CC4B40085808C0401A9CF01F00081F +:100DD000402C580CC0313FD7CB4BF01F00063FD7FB +:100DE000CB0B000000007A488001DDAC8001D3A865 +:100DF000800091E880016C4080018E9CEBCD40E04A +:100E0000207D300616975006189B50261A95FACA70 +:100E1000FFE81A9CF01F001AC111189640085808E4 +:100E2000C0401A9CF01F0017402C580CC030F01F17 +:100E300000160C9C2F9DE3CD80E05807C1904068C0 +:100E40000E9B0C9C8F28F01F0011581CC1104008ED +:100E50005808C0401A9CF01F000B402C580CC0D002 +:100E6000F01F000930060C9C2F9DE3CD80E01A9CFA +:100E70003016F01F0007CD3B1896CDCB8001DE0C5D +:100E80008001D3A8800091E880016C4080018E9C95 +:100E9000D40120CDFB5A0012FB590014FACAFFCC32 +:100EA000502874197408FB590016501874397428A6 +:100EB000FB59001AFB580018745974485039FB58F4 +:100EC000001C74797468FB590020FB58001E74994B +:100ED000748850A95098300974A8FB6C0022FB5B01 +:100EE0000010FB68002C74BBFB6900231A9CF01FE8 +:100EF00000032F4DD802000080020DFCEBCD40EE28 +:100F000020CD3FF94CC850A950B94CC93005303CF0 +:100F100091059305F01F004A322A18961A971A9CD9 +:100F20000A9BF01F0048FAC3FFDE306AE06B00FF47 +:100F3000069CF01F00441AD5ED38004F1AD86D28D2 +:100F40001AD86D191AD9ED1800361AD8ED190032D1 +:100F50001AD96CE81AD8ED19002E1AD9ED18002A02 +:100F60001AD8ED1900261AD9ED1800221AD86C6982 +:100F700030BB1AD9301C6D08ED1900FEED3A001F88 +:100F8000F01F0031ECFB01282F4DF6C80001581866 +:100F9000E0880045ED3100F7ECCAFF8C30153006D3 +:100FA0001AD61AD540D81AD8F4E80000206D069B4E +:100FB000FAE900081A9CF4E20008306AFAE300102B +:100FC000F01F0022EF380021209DFB680021EEE891 +:100FD0000000FAE90000EEE20008FAE30008EEE89B +:100FE0000010FAE90010EEE20018FAE30018EF38FA +:100FF0000020029BFB6800200A990C98FACCFF9015 +:10100000303AF01F00130C9A2EED0C9B40ACF01FF1 +:1010100000110A9C2F4DE3CD80EE1AD50A98FACC28 +:10102000FFD05C5B0A99FE7AFF6AF01F000B2FFD70 +:10103000CB2B000000007A4C00007A488001EF6C56 +:10104000800091D080020E908002E73680020BFC77 +:1010500080020A9C80020D20D431202D500B189163 +:101060004A1776026E9CE21C0002C350304C5011AD +:101070005801E2021700F01F001DEEF700F0189073 +:101080005807C2D030043013C0A82FF45802C1B1A1 +:101090005801F9B301FF5805C1100A9760B66E05F3 +:1010A000F01F00130C9A189B0E9CF01F0012CEE04C +:1010B0000E9CF01F00115805CF114008069C9104AA +:1010C0002FEDD83240182012110C0E9B5018F01F33 +:1010D000000BCE2B1893069C2FEDD8320E943013B4 +:1010E000CEDB0000000087F48001EF6C800145C476 +:1010F000800159A080015CDC800184284828F0FC34 +:1011000000F85EFC000087F4486871195879F9B856 +:101110000001F9F80A00F9B80100F9F81A005EFFB9 +:10112000000087F44828F14C007C5EFC000087F446 +:101130004828F14C01D05EFF000087F4EBCD40C0A1 +:1011400018971496E04A0020E088000830083FF91C +:10115000B898B889E3CF80C02FECF01F00043008A6 +:10116000AE96AE88E3CF90C0800091DCEBCD40FC22 +:10117000206D18941695F01F00431897C1A0F939F7 +:1011800000CC3FF8F0091800C3910896EF3900A889 +:101190003FF8F0091800C5414BB8F0F700F85807C0 +:1011A000C0A1EC040104301C8B042FADE3CD80FC06 +:1011B0000896CF3BE06AFFFF300B1A9CF01F00330C +:1011C0006F38302A707C1A9B2F4CF01F00311A9216 +:1011D0006A0A9A93063AC0442FADE3CFC0FC0C9B39 +:1011E0001A9C5C7AF01F00296F380606707C1A9BE7 +:1011F0002F4C300AF01F0026CD5BE06AFFFF300B5A +:101200001A9CF01F0022302AEEC2FF341A9B049C65 +:10121000F01F00201A966A0A9A93063ACDE55C7A86 +:10122000089B1A9CF01F00191A9B049C300AF01F9F +:1012300000196A08E803000606188B08CA8BE06AE2 +:10124000FFFF300B1A9CF01F0011302AEEC7FF5829 +:101250001A9B0E9CF01F00101A926A0A9A93063A83 +:10126000CBC50C9B5C7A1A9CF01F00081A9B0E9C45 +:10127000300AF01F00096A08060606188B08C8DB4A +:101280008001EFF8000087F48001C7B88001D344E3 +:101290008001D6B08001D558D401F01F0002D802D9 +:1012A00080015D18EBCD40F8FACD00803225149313 +:1012B00018941297BA85FAC6FFFF0C9CF01F001B0A +:1012C000300806063019AC85AC981A951A9A498BE5 +:1012D000089CF01F0018C0503FFC2E0DE3CD80F895 +:1012E0000E9CF01F0015E04C0040C1701AD7493A1F +:1012F000E06B00800A9CF01F00120A9A3019491B0B +:10130000089CF01F000C2FFD1897580CCE61089C0C +:10131000F01F000D0E9CCE2B0E9A089C3019489B96 +:10132000F01F0004CDB0CD9B800091DC8003C4FC95 +:1013300080023BB8800091B8800399D0800091482A +:101340008003C50480024328D421210D300B4B6655 +:10135000169CF01F00368D0CC2B078075807C2A04B +:101360006F985808C2704B283014EF4400641A95E7 +:10137000340B1AD84AFA0A9CF01F002F08990A9ACF +:101380004AEB0E9CF01F002E2FFD580CC2506C082B +:10139000700CF01F002C6C09300893086C08700961 +:1013A0004A98722A910A6C09300893486C0C2F0DE8 +:1013B000D822F01F00261897CF70F01F00254A583A +:1013C0004A59118A4A5B0E9CF01F0025C2056E29FE +:1013D00049D89109CE9B08994A2A4A3B0E9CF01F96 +:1013E0000018C1C14A18340B1AD8492A0A9CF01FA8 +:1013F000001208990A9A49EB0E9CF01F00112FFD6C +:10140000580CC0C13088EF480054CC9B0E9CF01F94 +:10141000000D6C0930089308CC7B0E9CF01F00096E +:10142000CB7B000000008C8C80023B4C8003C50805 +:10143000800399D0800091488003C4FC80023BB8AF +:1014400080024190000003FC80024F4080023B225A +:10145000000004000000042800000404800212A41C +:101460008003C5108003C5148003C5188003C538E8 +:10147000D421169849871495189B109A49740E9C8C +:10148000A888F01F00170A9B30064965EF66002008 +:10149000341A0A9CF01F001449484959EB66004071 +:1014A000700B720CF01F00131896C0C0F01F0012D2 +:1014B0000A99098A0E9B0C9CF01F00106D185808A1 +:1014C000C021D822ECCAFFDC0A9C3209341BF01F71 +:1014D000000CD8220000040400000400800091DC0D +:1014E00000000428800091AC000003FC00008C8CFC +:1014F00080023B0680023B22800212A480023A68EE +:10150000D421210D328A300B1A9CF01F00301A9C16 +:1015100030073014504750544AD5F01F002E8B0C22 +:101520001A96C4A0FAC6FFD8318A0E9B0C9CF01FF5 +:1015300000274A984A990C9B50E850A96A0CF01F62 +:1015400000281896C3B04A7CF01F00274A761AD7A5 +:10155000304B1AD70E984A694A6AEC0B000CF01F00 +:1015600000260E981AD74A591AD74A5A302B0C9C83 +:10157000F01F00210E981AD74A291AD74A2A311B80 +:10158000ECCCFFF8F01F001C0E981AD749F91AD7B7 +:1015900049FA312BECCCFFF4F01F00170E982F8D79 +:1015A000ECCCFFF01AD749B91AD749BA315BF01F12 +:1015B0000012089C2FED2F0DD8226A0CF01F001787 +:1015C0000C9C8B06CF9B0000800091D000007A50CD +:1015D00080022B4C8003C5448003C54C80022C0440 +:1015E000800216FC8002113000007A5480021670CE +:1015F0008003C55480016EB8800217408003C3ACDD +:10160000800216C48003C5708002168C8003C58CCE +:101610008002161C8003C5A480022AF8EBCD40C0CE +:1016200021AD189798E8EDB80000C181368A300BDB +:101630001A9CF01F000C306A0E9B1A9CF01F000AC7 +:101640006E2830195C3850395028488870091A962D +:101650001A9A720C306BF01F00062E6DE3CD80C01D +:10166000800091D0800091DC00007A508002792CBB +:10167000D40148587009300A720C301BF01F000367 +:10168000D802000000007A508002792CEBCD404057 +:1016900021AD368A300B1A9CF01F000830084889AB +:1016A000500872081A961A9A700C302BF01F000519 +:1016B0002E6DE3CD80400000800091D000007A5074 +:1016C0008002792CEBCD404021AD368A300B1A9C3C +:1016D000F01F000830184889500872081A961A9AA4 +:1016E000700C302BF01F00052E6DE3CD8040000004 +:1016F000800091D000007A508002792CD401487883 +:10170000700EF6C9000E189AF8CBFFFA2F2A7C0C3F +:10171000F01F0003DA0A000000007A50800224E083 +:10172000D401580CC051304CF01F0004D802304C8A +:10173000F01F0003D80200008001A12880019F3023 +:10174000EBCD40E0FACD0170FACCFE98F01F001905 +:10175000581CC22145A85818E088001FE068010005 +:10176000FACBFE901A9C16D8F01F00131A95189603 +:10177000FAC7FF00368A300B0E9CF01F0010581677 +:10178000C11048F870090E9A720C300BF01F000D52 +:101790002A4DE3CD80E0300CF01F000B2A4DE3CD45 +:1017A00080E045B85808FE9AFFEE540D5418CEABB1 +:1017B00080015F448002116C800091D000007A505B +:1017C0008002792C80021720000000000000000039 +:1017D000EBCD40C0F8F800D418971696F0F80088C2 +:1017E000F8FA00E85808C040F8FC00C45D185876C4 +:1017F000C1A058065F0858365F091248C11030185A +:10180000EF4800ECEEF900D473985808C050300B44 +:10181000EEFC00C45D18EF4600E8E3CD80C05846FA +:10182000CEF0CFABEEF800EC5808CF603008301B9C +:10183000EF4800ECEF4B00F0EEF800D47198580838 +:10184000CE81CEABD401F01F0002D802800217D0A7 +:10185000F8FC00E85EFCD401F8F800D471A8580840 +:10186000C050F8FC00C45D18D802109CD802D40106 +:10187000F8F800D471185808C050F8FC00C45D187E +:10188000D802DC0AD401F8F800D471285808C050F6 +:10189000F8FC00C45D18D802DC0AD703EBCD408009 +:1018A0003008F8F90108F94801085809C031C08822 +:1018B0000E997207129CF01F00045807CFA1E3CDC8 +:1018C00080800000800091E8D401F8FC00DCF01F6B +:1018D0000002D8028002B4A4D401F8FC0090F01FEA +:1018E0000002D80280023B8CD401F8FC0090F01F6B +:1018F0000002D80280023C84EBCD40C01696F8F777 +:1019000001085807C051C0B86E075807C080EECC18 +:10191000FFFC306A0C9BF01F0004CF710E9CE3CDDE +:1019200080C000008000917CD4011699F8F801185D +:101930005808C0A1F8F800D470285808C0C0F8FCB6 +:1019400000C45D18D802F8CBFF64306A129CF01F07 +:101950000003D80ADC0A0000800091DCEBCD40F8DF +:1019600020AD1897F8F801185808C06030070E9C91 +:101970002F6DE3CD80F8F8F800D470385808CF7098 +:10198000F8FC00C41A9B1A935D181895CF05EEF861 +:1019900001185808C431EEF800D470285808CE70E9 +:1019A000FAC4FFE0EEFC00C4089B5D18CE05EEFC17 +:1019B000009078465806C301EEF800D45808C2C01B +:1019C000700C49BBF01F001BEFFC0024F9B60001AE +:1019D000EFFC102478075807C111CCAB5806C0B0F3 +:1019E0006E885808CC50EECBFFE8306A089CF01F98 +:1019F0000012CBE06E075807CBB0EEF80194580800 +:101A0000CFA16E581035CEB16E4B0A9A1A9CF01FBA +:101A1000000ACE70CE4B3006CDEBFAC4FFE0306A40 +:101A2000EECBFF64089CF01F0005CC2B8003C65C46 +:101A3000800091A08000917C800091DCD401F01F97 +:101A40000002D8028002195CD42120AD3008FB5876 +:101A50000024508816961897F6F801845818C0404C +:101A60003FFC2F6DD82277185808CFB0F8F500B892 +:101A70005885C2205905CF512DCB0A9A1A9CF01FC8 +:101A800000171A940A9A303BEEFE00D47C5858088E +:101A9000CE801ADA1AD43009EF490104EEFC00C4F2 +:101AA00030681AD8FACAFFD430181ADA48CA7C56F5 +:101AB0005D162FCDCD7B2DCB318A1A9CF01F0007F0 +:101AC0000A9AECCBFFCCFACCFFE8F01F00041A9482 +:101AD000320A302BCDAB0000800091DC80039C38B3 +:101AE000D42118951696F01F000F1897C05078381B +:101AF0002FF89938D82A310CF01F000B1894C0F039 +:101B00000C9B306A2FCCF01F000930188938EAF995 +:101B100001088909EB4401080E9CD822DC2A000048 +:101B2000800218F880028F24800091DCEBCD40FC0D +:101B3000EDD9C010407218941693ECCCFFFC1495AC +:101B4000910CF01F00161897C190E8F800907039BA +:101B5000EC081608B893B889B8B6B8A85805C100FB +:101B60000C9A0A9BF8C6FFFC0C9CF01F000D0E9C03 +:101B70005802E5F61A00E3CD80FCE3CD80FC0C9A18 +:101B80000A9BF8C6FFFC0C9CF01F00060E9C580236 +:101B9000E5F61A00E3CD80FC80009200800091DC25 +:101BA000800091D0D401401E5C791ADEF01F000243 +:101BB0002FFDD80280021B2CEBCD40F8203DF8F819 +:101BC00000BC1493129458485F0A58285F0918976C +:101BD00016961449C0603FF70E9C2FDDE3CD80F8C8 +:101BE000F8FC00DCF01F002BC0305816CF50EEC5BB +:101BF000FF64306A4A8B0A9CF01F0028C0D1EEF8BF +:101C000000D470285808C060EEFC00C41A9B5D1810 +:101C1000C370EEC5FF043008F7D6C0081AD8F3D455 +:101C2000C010FAC8FFF4069A0E9CF01F001D2FFD8D +:101C30001896580CCD1040296E2C580CC1001298E3 +:101C40000A9B0C99E06A888EF01F001618970C9C6E +:101C5000F01F00150E9C2FDDE3CD80F8EEF800D4C8 +:101C600071845804C0B01298EEFC00C40A9B0C9911 +:101C7000E06A888E5D141897CEBB3FF7CE9B306A22 +:101C8000485B1A9CF01F0005CC501A95CC5B0000F5 +:101C900080028F78800217C88000917C80021B2C04 +:101CA00080028154800091E8EBCD40C0189EEFDAAD +:101CB000C010782C580CC0600E9AF01F0009E3CDBC +:101CC00080C0FCFA00D475865806C0700E9AFCFCE1 +:101CD00000C45D16E3CD80C0E3CFC0C08002815454 +:101CE000D421497A1894301BF01F0016300A089B43 +:101CF000495CE8C5FF64F01F0015E8F701085807C4 +:101D0000C1C03006C0680E966E0C580CC1601897A2 +:101D1000306A0A9BEECCFFFCF01F000DCF51580635 +:101D2000EFF80000E9F80A42EFF81000EDF81A00A9 +:101D30000E9CF01F0008D822D82200008003C66441 +:101D400080023A1A80023058800274008000917C30 +:101D5000800091E8D401F01F0002D80280021CE04C +:101D6000EBCD408048FA1897301BF01F000FEEF8BB +:101D700000BC5818C0F00E9B300A48CCF01F000C75 +:101D80000E9CF01F000C0E9C307BF01F000BE3CD6F +:101D900080800E9C305BF01F0008E3CD8080000047 +:101DA0008003C68880023A1A8002360080027400DE +:101DB00080021CE0800217D0EBCD4040486A1896A4 +:101DC000301BF01F00060C9B300A485CF01F00051A +:101DD000E3CD80408003C6A880023A1A8002360014 +:101DE00080027400EBCD40F81894F8FC00CC580C3D +:101DF000C360E8F800D05808E08A00321897E8C3BA +:101E0000FF643005C0A8580AC200EEC7FF64E8F8B6 +:101E100000D00A38E08A00242FF5E8F600B0306AD6 +:101E2000069B0E9CF01F0015CF115806C0E06C5A9F +:101E30006EA81438CE91EECCFFFA6C4BF01F000F59 +:101E4000C0406C5A580ACE215807C0906F5AEECB4A +:101E5000FFD4E8FC00DCF01F000AC0403FFCE3CDEB +:101E600080F8EECBFFA8E8FC00DCEEFA0080F01F63 +:101E70000005CF60CF4B00008000917C8002B58CC4 +:101E80008002B52CD4211895E06C009CF01F001B3B +:101E90001897C310EAF401185804C2A1EAF800D454 +:101EA00070C85808C250189B301AEAFC00C45D186C +:101EB0001898C1E50E9C3016E06B009CF0060D46AC +:101EC000EC0B024BF01F000E58065F09580C5F1810 +:101ED0001248E8081800F8071710EAFC00CCF01FB9 +:101EE0000009089CEB4600D0EB4700CCD8220E9CA2 +:101EF000F01F0004DC2A000080009200800091F4B2 +:101F0000800091E8EBCD40801897F01F0008C031A9 +:101F1000E3CD80800E9CF01F0006C0550E9CF01F84 +:101F20000003CF7BE3CFC08080021DE480021E84CB +:101F3000EBCD40FE208D18961697149512921091B5 +:101F4000580BC580F6FB0080580BC0E16F5B580B47 +:101F5000C3210C9CFEFA02E4303BF01F00B93FFCA9 +:101F60002F8DE3CD80FE7568EDB80001CF011A9A80 +:101F7000EECCFFA8F01F00B3CEA16B484029126839 +:101F8000CE606B3840191268CE206B584039126809 +:101F9000CDE0FEFA02B2301B0C9CF01F00A9EEC48B +:101FA000FFD4302A303BECFC00DCF01F00A8089C7A +:101FB0006F5AC4386B68EDB80000CCC1EEC4FFD4D2 +:101FC0001A9A089CF01F009FCC516B484029126858 +:101FD000CC106B3840191268CBD06B58403912685E +:101FE000CB90FEFA026A301B0C9CF01F0095301A51 +:101FF000CDAB7568E21800021A93F9B40102F9B486 +:102000000001F8FC00DC1A9BF01F0092C1F05BECB1 +:10201000C4001A9C320A300BF01F008F6B48502806 +:102020006B3950196B585038089A303BECFC00DC87 +:10203000F01F0086300C189A189BECFC00DCF01F97 +:102040000087C3602F8DE3CFC0FE402A6B49F3EABF +:102050000008C0D0401A6B39F3EA0008C110403ABA +:102060006B59F3EA0008C1B04004CDFB1AD9302BFC +:102070001ADA0C9C4FAAF01F00722FEDCCBB1AD9B4 +:10208000302B1ADA0C9C4F7AF01F006D2FEDCC2B01 +:102090004F5A302B0C9CF01F006ACBCB1AD9302B37 +:1020A0001ADA0C9C4F1AF01F00662FEDCB3B580735 +:1020B000EE0B1700F60A1700F9B80158EFD8E10B3C +:1020C000EFFA1020ECFC00DCF01F0069CBC16B487C +:1020D0004029F1E90009EDB90004C5D0EDB90003CC +:1020E000C750EDB90002E081009430484E1AED4827 +:1020F00000B8301B0C9CF01F00526B384019F1E9FE +:102100000009EDB90004C500EDB90003C7513088DE +:102110004D9AED4800B4301B0C9CF01F00496B58E1 +:102120004039F1E90009EDB90000E080007FEDB928 +:102130000001C55130284D1AED4800BC301B0C9CE5 +:10214000F01F003FECFA00BC306BECFC00DCF01F31 +:10215000003FECFA00B4304BECFC00DCF01F003B1D +:10216000ECFA00B8305BECFC00DCF01F0038029A9F +:10217000049BECFC00DCF01F00421894FE91FF640D +:102180006B57E2170002C191ECFC00DCF01F003D30 +:102190000E9CCE7A31084BCAED4800B8301B0C9C1F +:1021A000F01F0027CABB31084B8AED4800B4301B32 +:1021B0000C9CF01F0023CB4BECFC00DCEACBFFDCDB +:1021C000320AF01F0033089CCCCA30884B1AED4805 +:1021D00000B8301B0C9CF01F001AC90BEDB90004AD +:1021E000FE91FF3231084ACAED4800BC301B0C9CFE +:1021F000F01F0013CA8BEDB90000FE91FF25301BC4 +:102200004A6AED4B00B40C9CF01F000DC89BEDB961 +:102210000001FE91FF1930284A1AED4800B8301B22 +:102220000C9CF01F0007C6AB301B49EAED4B00BC0D +:102230000C9CF01F0003C87B8003C8EC80023A1A94 +:102240008002BD688003C6C08002B4D48003C6E0AB +:102250008002C04C800091D08002B58C8003C734CE +:102260008003C7788003C7008003C7BC8002B52CF9 +:102270008003C8288003C86C8003C8B08002B64CB5 +:102280008002B9EC8003C8008003C8588002B91CE2 +:102290008003C8148003C8CC8003C8808003C84072 +:1022A0008003C894EBCD40C07758EDB80003F9B86F +:1022B0000008F9F80A2FF9B80104F9F81A2F18974D +:1022C000300A1696F8FC00DC149BF01F0025300A3B +:1022D000EEFC00DC149BF01F0023300AEEFC00DC57 +:1022E000149BF01F002130183009ECCBFECCEF48D6 +:1022F00000B8EF4800B4EF4900C02FF976085858ED +:10230000E08B00225808C2512FCB5849CF71EEFA0A +:1023100000BC306BEEFC00DCF01F0014EEFA00B4E1 +:10232000304BEEFC00DCF01F0011EEFA00B8305B21 +:10233000EEFC00DCF01F000DEEFC00DCF01F000CDA +:10234000E3CD80C03048EF4800B8EF4800B4CE0B72 +:102350003028EF4800B8EF4800B4CDAB8002B58C10 +:102360008002B52C8002B5EC8002B4D480028F804C +:10237000EBCD40E0205D1897F8F600B0F8F800BC0F +:102380005828C57059085F0958485F081248C2901C +:10239000302BEEFC00E0F01F002F314A300B1A9C6E +:1023A000F01F002D1A95EEFA00BC588AC200EEF814 +:1023B00000905808C03070785028149958895F18D8 +:1023C00058195F191069ECF8017CEEFC00E01A9ACC +:1023D0000C9B50495038F01F00212FBDE3CD80E009 +:1023E000300BEEFC00E0F01F001BCD8B30085018C6 +:1023F000301B500BECF900F0F3EB0008FBFB1A016B +:10240000EDB90001C120EEF800905808C1F0EEFCD3 +:1024100000D4580CCD10780C491BF01F0012FBFCA7 +:102420000A01EEFA00BCCC4B4018A1B85018CECB34 +:10243000300BF8FC00E0F01F000C300BEEFC00E06D +:10244000F01F000AEEF800BCC9EB3089CB8B00000E +:1024500080026178800091D08002581C8003C65CA5 +:10246000800091A0800261A48002618CEBCD40E0ED +:10247000189716951496F8F800905808C0D0704830 +:102480005808C0A1F8FC00D4580CC060780C48EB88 +:10249000F01F000EC1501AD648DA1AD5301B0E9C18 +:1024A000F01F000C300A0E9B48BCF01F000C0E9968 +:1024B0000C9B0A9C3008488AF01F00092FEDE3CDE1 +:1024C00080E000008003C65C800091A08003C960AA +:1024D00080023A1A800230588002740080027474BC +:1024E000D4211295169614941897F8F900BC5849FF +:1024F000C1C0F8FA00F4580AC10158895F08581998 +:102500005F0B104BF40B1800F9BB000AF9BB014636 +:10251000F01F0019EEFA00F4F4C8FFFFEF4800F4D2 +:10252000EEF900945809C020D822306A0C9BEECCFA +:10253000FF04F01F0012EEF800BC5828C111EEF89D +:1025400000D471585808C040EEFC00C45D180A99C8 +:10255000089A0C9BEEFC00DCF01F0009D8220A99B7 +:10256000089A0C9BEEFC00E0F01F0006FE99FFDECF +:10257000CE7B00008002246C800091DC8002C3CC02 +:10258000800261FCEBCD406C1ADA18951ADB1692CA +:102590001493301B48AAF01F000B48B6300A0A9B60 +:1025A0000C9CF01F000A0A990C9A069B049C3008A8 +:1025B000F01F00072FEDE3CD806C00008003C99071 +:1025C00080023A1A8002360080027400800274741D +:1025D000D401F01F0002D80280022584EBCD40C058 +:1025E000189E1497109CFCF800BC5888C240580BE9 +:1025F000C1A0FCCAFF64FCF600D46C585808C19016 +:102600001ADC16981AD9300BFCFC00C41ADBFD4BFF +:102610000104490E0E991ADE301B6C565D162FCD43 +:10262000E3CD80C0FCF600D448BA6C585808CE916F +:10263000E3CFC0C0585CF9B80002F9B80104580BE8 +:10264000C040FD4800B4CD6BFD4800B8482ACD4BD2 +:1026500080037E2080039C38EBCD40F8FACEFFE863 +:1026600018967C35F8F400D47C037C17685C7C2ECB +:10267000580CC0F01AD51ADE300E1AD71AD3ED4E08 +:102680000104ECFC00C468565D162FCDE3CD80F844 +:10269000E3CFC0F8D42118951694F8F70104580731 +:1026A000C020D822F8F900D472585808C4C01AD7EC +:1026B000F94701041AD70E981AD74B6A1AD70E9BFE +:1026C0007256F8FC00C40E995D16EAF900D42FCDBD +:1026D00072585808C3801AD7EB4701041AD70E98CE +:1026E0001AD74ACA1AD70E9B7256EAFC00C4301990 +:1026F0005D16EAF900D42FCD72585808C2401AD797 +:10270000EB4701041AD70E981AD74A2A1AD70E9BFC +:102710007256EAFC00C430295D16EAF900D42FCDC8 +:1027200072585808C1001AD7EB4701041AD70E98FF +:102730001AD7498A1AD70E9B7256EAFC00C4303960 +:102740005D162FCD5804C200EAFA00D47458580818 +:10275000C12030091AD91AD9EB4901041AD91298A3 +:102760001AD9129B7456EAFC00C4089A5D16EAFA5C +:1027700000D42FCD75A85808C070089B3019300AB6 +:10278000EAFC00C45D183018EB480104D8220000B0 +:1027900080039C38D421204DF8F900D41897169561 +:1027A00073885808C2C11094F8C6FFEAC1C8EEFC8D +:1027B00000C45D1B1AD4189B0E984C19E06A888ED1 +:1027C0000C9CF01F00408F2C2FFD580CC111580598 +:1027D000C140189B305CF01F003CEEF900D47388B8 +:1027E0005808C0D1737B580BCE31169CCE4BEECB24 +:1027F000FFF0F01F0036C1302FCDDC2A7378580867 +:10280000C0B0EEFC00C45D18C070189B306AEECCFE +:10281000FFF0F01F002F6E2C580CCEA1EF39007A7C +:102820003008F0091800C3A1EEF800D47048580829 +:10283000C100301BEEFC00C45D18C0B4EEF800D43B +:1028400071485808C0601A9BEEFC00C45D18C214A1 +:10285000300B0E9CF01F001FEEF800D47099580941 +:10286000C070300BEEFC00C45D19EEF800D470A807 +:102870005808C050301BEEFC00C45D183018EF48FB +:1028800000C84959300C72082FF893082FCDD82270 +:102890004038F1D8C002CDD0CB0B300848891AD8C7 +:1028A000E06A888E0E98EECBFFF0EECCFF86F01F2C +:1028B00000058F3C2FFD580CCB81C9FB800224E022 +:1028C0008002819C80028F1C800281E4800091DC68 +:1028D0008002269400007A6CEBCD40E018971695A4 +:1028E000300BF01F001DEEC6FF64306A49BB0C9C24 +:1028F000F01F001BC2E0EEF801185808C1F00C9B55 +:102900000E9CF01F00183006EEFC00DC0C9BEF461E +:1029100000B0F01F00150C9A0C9BEEFC00E0F01FBD +:1029200000130C9BEEFC00E0F01F00110C9BEEFC72 +:1029300000E0F01F0010E3CD80E0EEF800D470D886 +:102940005808CDE00A9A0C9BEEFC00C45D18CD8BB4 +:102950001896CD6B800217D0800217C88000917C3A +:10296000800226948002B9D48002581C800261E85B +:10297000800261D4D401F01F0002D802800228D85E +:10298000EBCD40C01897F8F800C45808C230303B6F +:10299000F01F003DEEF800D470495809C070300BAC +:1029A000EEFC00C45D19EEF800D470A95809C0709F +:1029B000300BEEFC00C45D19EEF800D47098580896 +:1029C000C050300BEEFC00C45D18300B0E9CF01FA5 +:1029D000002F6E2C3006F01F002E8F266E3C580CF8 +:1029E000C040F01F002B8F36EEF800E45808F9B80D +:1029F0000100EFF81A39EEFC0090580CC060F01F8F +:102A000000253008EF480090EEFC008CF01F0022FB +:102A10003006EEFC00DC0C9BEF46008CF01F001F24 +:102A2000EEFC00E0F01F001EEEFC00DCEF4600E0D4 +:102A3000F01F001CEEFC00DCF01F001BEEFC00DCB5 +:102A4000F01F001A0E9CEF4600DCF01F0019EEFC90 +:102A500000CCF01F00110E9CEF4600D0EF4600CCDA +:102A6000F01F00140E9CF01F0014EEFC00C4580C64 +:102A7000C070EEF800D470785808C0205D18E3CD1F +:102A800080C00000800228D88002269480028174D1 +:102A9000800242B4800091E88002B4CC800256ECFF +:102AA00080029438800294088002C0788002189CCA +:102AB00080021DB880021CE0EBCD4080169778099B +:102AC0001639C0F1761899080E9CF01F000A0E9C6A +:102AD000F01F0009E3CF808072180E38C060109993 +:102AE0005809CFB1E3CFC0806E189318CEEB000029 +:102AF00080022980800091E8EBCD40801897580C27 +:102B0000C051C1980E9CF01F000D6E0B580BCFB139 +:102B1000F01F000BF01F000B6E4C580CC060F01F34 +:102B2000000A6E4CF01F00096E8CF01F00080E9C0E +:102B3000F01F0006E3CD808080022AB88002724C2C +:102B40008002728480028F20800091E8EBCD40C02B +:102B50001897580CC05130060C9CE3CD80C0F01F74 +:102B60000021CFA1334CF01F00201896CF606E08D3 +:102B70006E19991899296E286E89993899996E3C21 +:102B8000580CC040F01F00198D4C6E7C580CC04092 +:102B9000F01F00168D8C6E498D59495891096E5A57 +:102BA0008D6A4948910A49486E698D7991090C9C52 +:102BB000F01F0012C11130196C988DB95808EDF949 +:102BC0001A0C6C285808CC906C185808CC606C4CC7 +:102BD000F01F000BCC200C9C3006F01F000ACBDB52 +:102BE0008002720880028F24800091940000046C9F +:102BF00000007AA400007AA0800275F880028F1E7F +:102C000080022AF8D431204D580C5F08580B5F0918 +:102C1000189316971248C05030050A9C2FCDD83211 +:102C2000E06C011CF01F00C01895CF803018F948E7 +:102C3000010CFEF102F66E22620B580BC100580225 +:102C4000E0800144E2C4FFFC3006760B049CF01FD8 +:102C500000B8C0C02FF6090B580BCF810A9CF01F9B +:102C600000B50A9CF01F00B4CD8BE2060328EB48A8 +:102C700000D46E0C580CE0800122F01F00B0EB4C29 +:102C8000008CF01F00AFEB4C0090CE906E185808EF +:102C9000C0A0785CF01F00A86E1CEAF60090F01F40 +:102CA00000A78D5C6E385808C0C0EAF8009070BC70 +:102CB000F01F00A16E3CEAF60090F01F00A08DBC52 +:102CC000EAF800905808CCB06E4C580CCC80F01F3D +:102CD000009DE04C0063FE9BFFC3EAC1FFEA364A59 +:102CE0006E4B029CF01F00986E5C580CE08100F95E +:102CF0006620340CF01F008C1897CB10FEF8024CA5 +:102D00008F78FEF8024AFEF9024A8F98FEF80248D0 +:102D10008F058F458F658F898FC83006FEF4023C82 +:102D20008F168FA4FEF202388FB2EAF900907288F3 +:102D30008FD8EAF9009072988FE8EAF9009072A8AB +:102D40008FF8F01F0088EB4C00E0E08000C20C9B85 +:102D5000F01F00850C9BEAFC00E0F01F0084EAF8FD +:102D600000D470685808E08000A7029B0A9C5D1898 +:102D7000EB4C00C4FE90FF74EAF8009070BBEAF8D8 +:102D800000D470895809C0605D19FE95FF69EAF8A2 +:102D900000D471685808C0F0EAFC00C45D181897A8 +:102DA000C0A0029BF01F0062C0600E9B364A029CCE +:102DB000F01F006534CCF01F005CFE90FF514EC840 +:102DC0004EC9991899294EC84EC9993899494EC883 +:102DD0004EC9995899694EC84EC9997899894EC873 +:102DE0004EC9999899A94EC84EC999B899D94EC853 +:102DF0004EC999C899E94EC84EC9F9440040F942F4 +:102E00000044990599F8F9490048F01F0069EB4C16 +:102E100000DCFE90FF25EB39007A3008F00918003D +:102E2000C5C1300A029BF01F0063EAF80090EAFC7B +:102E300000DC707BF01F0060EAFB00E0EAFC00DCD5 +:102E4000F01F005EEAFA009074C85808C60174D8F2 +:102E50005808C52174EA580AC080302BEAFC00DC0F +:102E6000F01F0057FE91FEFC009B0A9CF01F0055CE +:102E7000FE95FEF6EACBFFF0EAFC00DCF01F005204 +:102E80003FF8EB4800E4EAF900D473485808C0D092 +:102E90001A9BEAFC00C45D18C0814038EDB80002FE +:102EA000C0413018EB4801188B0366088B18870562 +:102EB000FE9FFEB5EB4800C4CD2A6E3B6E1CF01F92 +:102EC0000043EB4C0090CFDAF94B00D4CD3A0E9C86 +:102ED000F01F0019FE9FFEC4EACAFF86CA4BF01F0E +:102EE000001958FCFE9BFEBC6E5B310AEACCFF86E3 +:102EF000F01F0015CFEA109A301BEAFC00DCF01F2F +:102F00000030FE91FEADEAFA0090CA5B109A300BD9 +:102F1000EAFC00DCF01F002AFE91FEA2EAFA009013 +:102F2000C97B000080028F2400000470800091A003 +:102F300080022980800091E88000919480021348EB +:102F4000800091B8800091AC80021D60800225DC79 +:102F500080021BB8800218C8800218E8800218D8C6 +:102F60008002609C800261E8800261D48002184483 +:102F700080021850800225D0800229748002304CD3 +:102F8000800226588002360080021A3C80021928EE +:102F900080021CA880021F0480021BA480021D5412 +:102FA0008002186E80021884800218568002C0DCED +:102FB0008002B4C08002B4B88002B4CC8002B4D421 +:102FC000800227948002B90480023B4CEBCD40E0A4 +:102FD000306A18971695F8C6FF64497B0C9CF01F61 +:102FE0000017C270EEF801185808C1800C9B0E9CA7 +:102FF000F01F00130E9CF01F00133006EEFC00DCE7 +:103000000C9BEF4600B0F01F00100C9A0C9BEEFCDE +:1030100000E0F01F000EE3CD80E0EEF800D470E891 +:103020005808CE500A9A0C9BEEFC00C45D18CDFBEC +:103030001896CDDB800217C88000917C8002269410 +:10304000800276648002B9D48002581CD401F01F3B +:103050000002D80280022FCCEBCD40C0499BF8C7BC +:10306000FF641896306A0E9CF01F0017EDFB189C49 +:10307000E06800A2EDD8E007EDFB08A20FD81AD84F +:103080000FC91AD90FB81AD80FA91AD90F9848FA28 +:103090001AD80C9C1ADB302BF01F000D0E9B0C9CD9 +:1030A000F01F000CECFC00DCF01F000B303B0C9C14 +:1030B000F01F000A30182FADED4800A8E3CD80C006 +:1030C000800217C88000917C8003C9B880023A1A38 +:1030D00080021AE08002BA1C80022FCCD431FACDD3 +:1030E00000D03007F94700A8189516941491580B92 +:1030F000E0800217F6F60084E8CCFFFA76ABF01F0A +:10310000012A1AD61ADC09D81AD809C91AD909B855 +:103110001AD809A91AD909981AD809890A9C1AD95A +:10312000FEFA0488302BF01F01220E9B306A2F8D8F +:10313000EACCFF64F01F011F306A089BEACCFF5EF7 +:10314000F01F011D0A9CF01F011D300AEAFC00DC83 +:10315000149BF01F011B635AEDBA0003C061E2F833 +:1031600001745808E08100B1301063795809C0E05B +:10317000E1D9C0011298EDB90001E08000A4EDB9D9 +:103180000002F9B80004E1D8E030EAF800D4710890 +:103190005808C060009BEAFC00C45D18635A5804DC +:1031A000C07069585808C5A0F1DAC002C6E114978A +:1031B000E2170013C5B1029B0A9CF01F0102FAC876 +:1031C000FF9453375028089B0A9CF01F00FFEAF831 +:1031D00000B45828E08001BAE089007F5818E080E8 +:1031E000017130285038EAF800B85828C7F058283C +:1031F000E08900805818E080016230285048EAF9E0 +:1032000000BC58495F0B58895F08F7E81008C78071 +:10321000E2C9FECCE2C8FF0C16963007EC1600019E +:103220005019500812931092505766095809E081BE +:1032300001122FF72FC32F025847CF81EAF900BCA4 +:103240005889C671E2F800F04059F1D8C002F3E89D +:103250001008E08101311096C5F8E8F800805808A0 +:10326000CA70F1DAC002CA40C1083509FAC8FF3095 +:1032700010D9029AFAC9FF94300B50290A9CF01F0A +:1032800000D3CA202CCDD832E2F801485808E0819A +:10329000010FEAF900B0089A300BEAFC00DCF01FDD +:1032A00000CCE080017A3509FAC8FF3010D9029AC3 +:1032B000FAC9FF94089B50290A9CF01F00C4C8401B +:1032C000CE2BA1B0C5DBE2F801785808F9B00004B4 +:1032D000F9B00105C4BB5848C8605908C831303935 +:1032E0005039EAF800B85828C83130195049C88B0D +:1032F0005848C8505908C82130395049C81B3008AF +:103300005058E2C8FECC30165018E2C8FF0C5008E6 +:103310005909E080011FEAF800D470A85808C0508D +:103320000C9BEAFC00C45D18303B0A9CF01F00A90E +:10333000354AFAC7FFE8300B0E9CF01F009E580478 +:10334000E0800126E8F8008450645098E8C8FFFA4D +:10335000507868A95089E2FA0184581AE080009EEA +:103360004029403850A950C84049433850D950B836 +:10337000EAF800BC5848E08000E7E0890088581867 +:10338000E08000A43018510A4014400350E850F087 +:10339000FACAFFAC0899069BFACCFF9C7208580841 +:1033A000C040F54BFFF0720814A82FC92F0B183A34 +:1033B000CF61E2F801445198EAF601185806E0801E +:1033C0000089FEFA0212302B0A9CF01F0079301996 +:1033D000EAF800BC5908E080008F5809E0800098A6 +:1033E000305B300A0A9CF01F007D40585808C1C06D +:1033F000EAF800D471485808C170FACBFF44EAFCDF +:1034000000C45D18C1114328EDB80001C0D1189760 +:103410004F30189268095809E08100A12FF72FC496 +:103420002F035847CF81EAF800B05808C070103118 +:10343000C050EAFC00E0F01F006BEAFC00DC029BDD +:10344000EB4100B0F01F00680A9CF01F00682CCD13 +:10345000D832EAFB00D4E2FA014476585808C13069 +:103460001AD91AD23009EB4901041AD94DC90E3ABA +:103470005F081AD94DEA76560E99301BEAFC00C453 +:103480005D162FCD30165056CD5A5888C2005908B7 +:10349000FE91FF7A3048C78BE2F901A45809FE9AE1 +:1034A000FF6140985808FBF90A09C5BB6368F1D869 +:1034B000C021CF0A50375047C2FB30085048CA0AD3 +:1034C00030085038FE9FFE913008C5EB3038C5CB30 +:1034D000EAF800D470F85808FE90FF750E9BEAFCDD +:1034E00000C45D18FE95FF6F0C99EAF800BC5908FE +:1034F000FE91FF75029B0A9CF01F003E0A9CF01F84 +:10350000003E307B0A9CF01F0033C70BEAF80090A6 +:1035100070495819F9BB000AF9BB013CC63B745B02 +:10352000744CF01F00214B5A1ADC302B0A9CF01F00 +:103530000020306A089BEACCFF5EF01F001E2FFDC2 +:10354000FE9FFE023028C20B30195039FE9FFE4DFF +:10355000029B0A9CF01F0027CDFAEAFB00D4E2FA96 +:10356000014476585808FE90FF5B1AD91AD3EB42F3 +:1035700001041AD20E3A5F081AD00E99765649CA3B +:10358000301BEAFC00C45D162FCDC49B6248507806 +:1035900062595089CE1A301BEAFC00E0F01F001877 +:1035A000FE9FFE8380023A1C8003C9F880023A1A0B +:1035B000800091D0800091DC80021DB88002B5ECC3 +:1035C000800222A48002269480021F308002938011 +:1035D000800217D08003CA6C8002246C80037E2096 +:1035E000800257488002B9D48002237080039C383F +:1035F00080021A4880021CE08003CA488002559667 +:10360000EBCD40C021AD1897F8F800AC5808C68142 +:10361000F8F6010CEEFB009076095809C061C8F875 +:1036200072095809E080008CF2F801945808CF9193 +:103630003008EF48010C76495809C670EEFC00D4FA +:10364000580CC0E04DAB780CF01F005AEFF8002486 +:10365000F1FC0A04EEFB009076485808C560EEF8CD +:1036600000E85818E088008D760AEEF800C858186F +:10367000C3F0580AC090103AC041C3981438C370C0 +:10368000740A580ACFC15826C04076485828C690B8 +:10369000580AEFFA1A32F9B80001EFF80A32EEF9D7 +:1036A00001105809C04176485818C710EEF80118A3 +:1036B0005808C4F1580AF40B1700F60A1700F5FB76 +:1036C0001004F5FA1005EEF800D470B85808C410CC +:1036D000EEFC00C45D18C3D12E6DE3CD80C0F8F6BA +:1036E000010C5806C9812E6DE3CD80C0740A580ABA +:1036F000CCB0F4F801945808CFA175885808CC4193 +:1037000076485828CF41CC0B0E9CF01F002BCE5092 +:10371000EEF800B05808EFFC0A2C0E9CF01F0027B2 +:10372000300B1A9C368AF01F00261A961A9A0E9CA5 +:10373000300BF01F00242E6DE3CD80C05806FE91A3 +:10374000FF790E9C301BF01F00202E6DE3CD80C052 +:103750000E9C300A30ABF01F001D2E6DE3CD80C0F3 +:10376000580AC1D074085808EFFA1A32F9B80001A3 +:10377000EFF80A320E9C300BF01F0015CAEB302B0D +:103780000E9CF01F0011EEFB0090C6FBEF480110ED +:10379000129A0E9C303BF01F000BC9FB30180E9C98 +:1037A000EF4800C8149BF01F0009C97B8003C65C6A +:1037B000800091A08002195C80022370800091D06B +:1037C0008002792C800217D080022584800230DCB0 +:1037D0004848300A48499118910A930A5EFF000050 +:1037E00000007A7000007A78EBCD40681695189347 +:1037F000F6CCFFEDF01F0022314A1896300BF01F77 +:1038000000210A9A8D15ECCCFFF0069BF01F001EDC +:1038100049EAF5090042AC09F50800422FF8F558CD +:10382000004249B530088D286A198D3993062F86D4 +:103830008B1649866C08F0C9FFFF8D095909E0888D +:1038400000180A936A0C782A580AF9F80003E7F876 +:103850000A01F9F81003F5F81A0320197838910ACB +:103860008D09F01F000D6C095909FE9BFFED300A10 +:10387000326C149BF01F0009E3CF90688000920027 +:10388000800091D0800091DC000087F400007A7005 +:1038900000007A78800091E880014658EBCD40E046 +:1038A00030961697305E300B33A51989F2C8003078 +:1038B000EC081800E08B0019F2CA0030580AC2C5A3 +:1038C0001999F2C80030EC081800E08B0017F2C814 +:1038D00000305808C215F1EA1048EE0B0B08585B8F +:1038E000C291E3CF80E0F2C80061FC081800E08BD1 +:1038F000000EF2CA0057CE3BF2C80061FC08180067 +:10390000E08B000DF2C80057CE5BF2C80041FC0806 +:103910001800E088000DE3CFC0E0F2C80041FC08C9 +:103920001800FE9BFFFAF2C80037CD4BF2CA0037F1 +:10393000CC6B19A8EA081800CEF12FFB586BCD20EC +:103940002FDCCB4BEBCD40E016961497580AC4C041 +:10395000300B3095305EC1B8F2CA0030580AC365EA +:103960001999F2C80030EA081800E08B0021F2C86B +:1039700000305808C2B5F1EA10485808C275EC0B7F +:103980000B082FFB1637E08800302FEC1989F2C89E +:103990000030EA081800FE98FFE1F2C80061FC0858 +:1039A0001800E08B000EF2CA0057CD9BF2C80061F0 +:1039B000FC081800E08B000DF2C80057CDBBF2C820 +:1039C0000041FC081800E088000DE3CFC0E0F2C819 +:1039D0000041FC081800FE9BFFFAF2C80037CCAB90 +:1039E000F2CA0037CBCBE3CF80E0F6CA00015E6CB1 +:1039F000F80A000913882FF85C58B2885E1CF6C8D4 +:103A00000002100CC08819882FF85C58B888201C58 +:103A100058085E1C201ACF875EFC5EFCEBCD40C0D0 +:103A200049071696189BE0460020F9B60B200E9C1D +:103A30000C9AF01F000D3008EE060B080F8858088E +:103A4000C0D00E9C35E935FA2208F2081800F9FAC0 +:103A5000BE002FFC19885808CF81482CE3CD80C0C8 +:103A600000007A7C800091DCEBCD40FE189114922E +:103A7000169C1293580BC2A0E20B00045809C20016 +:103A800002973006C0881835E08A001418070C33F6 +:103A9000E0880018E4060708E80701051AD80E9C1C +:103AA00048CA0A9B2FF6F01F000C2FFD580CCEC4FD +:103AB0003008EE01010CE968FFFFE3CD80FE0297BC +:103AC0003008EE01010CE968FFFFE3CD80FE000045 +:103AD0008003DA3080009148580CC140F8FC00D0D7 +:103AE000580CC1002FCCF8F8FFFC5808C0417809E9 +:103AF0005809C0901638C0302F8CCF6B7808143816 +:103B0000CFC15EFF5EF9780C580C5E0C7828163831 +:103B1000C0515EFC782816385E0C780C580CCFB17A +:103B20005EFC30383189F94800F0F9480058F9480E +:103B3000005431E8F949004CF94800503FF9E06879 +:103B40000576F949017CF948019C5EFCEBCD40E02B +:103B500018961695344CF01F000C1897C1103018A9 +:103B60009978993899485806C0500C9CF01F000766 +:103B70008F5C5805C0500A9CF01F00048FBC0E9C3F +:103B8000E3CD80E080028F2480009194EBCD40C093 +:103B9000169679075807C051C0C86E375807C090AD +:103BA0006E0C0C9BF01F0004CF910E9CE3CD80C0E7 +:103BB000E3CF80C0800091A0EBCD40FC1695189417 +:103BC000580C5F0B58055F081493104B1292C040BD +:103BD0003FFCE3CD80FC580ACFC048E73006C06800 +:103BE0002FF62E07E0460038CF406E0B0A9CF01FE0 +:103BF000000ACF710699049A089B0E9C6E185D18F6 +:103C0000F9BC01FFF9BC0000E0460038CE31CE1B04 +:103C10008003CC00800091A0EBCD40801897580C19 +:103C2000C0A0780CF01F00056E1CF01F00040E9C55 +:103C3000F01F0002E3CD8080800091E8D421189429 +:103C4000169579075807C1A03006C0680E966E3CDD +:103C5000580CC14018970A9B6E0CF01F0009CF71D9 +:103C60005806EFF81003EDF81A03EFF80003E9F82F +:103C70000A100E9CF01F0003D82ADC2A800091A0B5 +:103C800080023C18EBCD406016961895760BF01F1D +:103C900000056B088D38EB460040E3CD80600000E6 +:103CA00080023C3CD431202D500B129CF01F003C74 +:103CB0001890C730198A580AC670300118965011EA +:103CC000320230930294C0382FF60D8AE40A1800AD +:103CD0005F08E60A18005F091248E8081800CF518B +:103CE000580AC2C00D87E40718005F18E6071800DD +:103CF0005F191268E8081800C4505807C4300C95C2 +:103D0000C0385807C0D02FF50B87E40718005F189C +:103D1000E60718005F191268E8081800CF31AA8476 +:103D20004A0B0C9CF01F0020C171A1A15807C06074 +:103D3000EAC6FFFF0D8A580ACCA1009CF01F001BA9 +:103D40005801C2404008F141005C40195809C25175 +:103D5000129C2FEDD832496B0C9CF01F0013C03120 +:103D6000A1B1CE5B0C9C493BF01F000FF9B80004D9 +:103D7000E3D8E031FBF91001F7B901FFFBF91A01B3 +:103D8000CD6B0C95CCDBF01F0009300840093FFCDF +:103D9000F348005C2FEDD8322FEDDC3A800091948F +:103DA0008003D304800091A0800091E88003D30CAD +:103DB0008003D314EBCD40FE169CF01F00451891F4 +:103DC000C6B0198A580AC7A0189630023203309438 +:103DD000E80A18005F08E60A18005F091049300871 +:103DE000F0091800C0E0109B2FF60D8AE60A1800B3 +:103DF0005F08E80A18005F091248F6081800CF515A +:103E0000580AC4500D87E80718005F18E607180025 +:103E10005F1910693008F0091800C3705807C350C3 +:103E2000109A0C95C0385807C0D02FF50B87E607BD +:103E300018005F18E80718005F191268F4081800E6 +:103E4000CF3130084A3BAA880C9CF01F0023C0F1F8 +:103E5000A5A25807C060EAC6FFFF0D8A580ACB9199 +:103E6000029CF01F001E049CE3CD80FE49CB0C9CFD +:103E7000F01F0019C031A3B2CEDB49AB0C9CF01F80 +:103E80000016C0E1A3A2CE6B0C95CDCB029CF01F17 +:103E900000135802CE913FF2049CE3CD80FE492BE3 +:103EA0000C9CF01F000DC031A1B2CD4B0C9C48FB07 +:103EB000F01F0009C071A1A2CCDBF01F00083FF287 +:103EC000CD3B029C3FF2F01F0005CCEB80009194AB +:103ED00080039A74800091A0800091E880039A6C1E +:103EE0008003D31C8003D3248003C8E4EBCD40803F +:103EF0001697149C129BF01F00085BFCC031E3CFA7 +:103F0000C0801898E018FFE1CFB1EF4C0050109C32 +:103F1000E3CD808080023DB4EBCD40801697149CA9 +:103F2000129BF01F00085BFCC031E3CFC0801898E3 +:103F3000E018FFE6CFB1EF4C004C109CE3CD808041 +:103F400080023DB4D431201D500B129CF01F00485C +:103F50001891E080007F198A580AC6B0300218967E +:103F6000049032033094E80A18005F08E60A18004B +:103F70005F0910493008F0091800C0E0109B2FF6C7 +:103F80000D8AE60A18005F08E80A18005F0912485F +:103F9000F6081800CF51580AC2F00D87E80718003C +:103FA0005F18E60718005F1910693008F00918005B +:103FB000C3E05807C3C0109A0C95C0385807C0D04A +:103FC0002FF50B87E60718005F18E80718005F1940 +:103FD0001268F4081800CF3130084A6BAA880C9C8C +:103FE000F01F0025C161A1B25807C060EAC6FFFFFB +:103FF0000D8A580ACB91029CF01F00205802C1B0D4 +:104000004009F34200545800C241009C2FFDD832B1 +:1040100049BB0C9CF01F0018C031A1A2CE6B499B7C +:104020000C9CF01F0015C0E1A3B2CDFB0C95CD5B3D +:10403000F01F0012300840093FFCF34800542FFDE8 +:10404000D832491B0C9CF01F000CC051A3A2CCDB42 +:104050002FFDDC3A0C9C48DBF01F0007F9B800107C +:10406000E5D8E032F7B001FFCC0B0000800091945E +:104070008003C8C4800091A0800091E88003D32C05 +:104080008003D3348003C8E48003C8E0D431202DFA +:10409000500B129CF01F00391890C6D0198A580A8C +:1040A000C610300118955011320230930294C03876 +:1040B0002FF50B8AE40A18005F08E60A18005F096A +:1040C0001248E8081800CF51580AC2C00B87E4070D +:1040D00018005F18E60718005F191268E808180052 +:1040E000C3F05807C3D00A96C0385807C0D02FF67F +:1040F0000D87E40718005F18E60718005F191268BB +:10410000E8081800CF31AC8449DB0A9CF01F001D81 +:10411000C171A1A15807C060ECC5FFFF0B8A580A06 +:10412000CCA1009CF01F00185801C1E04008F141EB +:10413000005840195809C1F1129C2FEDD832493B63 +:104140000A9CF01F0010C031A1B1CE5B0A9C490B44 +:10415000F01F000CCFA040192FF95019CDCB0A96B3 +:10416000CD3BF01F0009300840093FFCF3480058E0 +:104170002FEDD8322FEDDC3A800091948003D340AC +:10418000800091A0800091E88003D3448003D3484D +:10419000EBCD40401896784CF01F00466D2CF01F78 +:1041A0000045ECFC00D0F01F00436DACF01F004157 +:1041B0006DCCF01F00406DECF01F003EECFC008069 +:1041C000F01F003CECFC0088F01F003AECFC009073 +:1041D000F01F0038ECFC0094F01F0036ECFC009857 +:1041E000F01F0034ECFC009CF01F0032ECFC00A03F +:1041F000F01F0030ECFC00A4F01F002EECFC00A827 +:10420000F01F002CECFC00ACF01F002AECFC00B00E +:10421000F01F0028ECFC00B4F01F0026ECFC00B8F6 +:10422000F01F0024ECFC00BCF01F0022ECFC00C0DE +:10423000F01F0020ECFC00C4F01F001EECFC00C8C6 +:10424000F01F001CECFC00CCF01F001AECFC00D4AA +:10425000F01F0018ECFC00D8F01F0016ECFC00DC8E +:10426000F01F0014ECFC00E0F01F0012ECFC00E872 +:10427000F01F0010ECFC00ECF01F000EECFC0150F5 +:10428000F01F000CECFC016CF01F000AECFC01803C +:10429000F01F0008ECFC018CF01F0006ECFC01A0F4 +:1042A000F01F00040C9CF01F0003E3CD80400000D1 +:1042B000800091E8EBCD40C0189678085808C031CE +:1042C000C0880E987007109CF01F00155807CFA1EA +:1042D0006D085808C031C0880E987037109CF01FC8 +:1042E00000115807CFA16C5CF01F000F6C6CF01F21 +:1042F000000E6C8CF01F000C6C9CF01F000B6CAC63 +:10430000F01F00096CBCF01F00086C1CF01F0006B9 +:104310000C9CF01F0005E3CD80C00000800241909E +:1043200080023C18800091E8EBCD4040320818969E +:104330001AD8E0691000F8C8FFDC785A784B792C5D +:10434000F01F000430182FFDED480044E3CD8040FD +:104350008002B254D421F60815011695F0C6FFFF6D +:1043600018940C9CF01F00061897C0600A99089AD0 +:104370000C9BF01F00040E9CD822000080028F24AA +:1043800080023A68EBCD40E016951896F6CCFFFD1A +:10439000F01F00091897C0C00C9B0A9A322618C655 +:1043A000F01F0006EE0500093008B296B2A80E9C78 +:1043B000E3CD80E080009200800091DCD401580CB5 +:1043C000C1D0580BC160198835E92208F2081800DD +:1043D000E08B0013129A3009C088F80907082208F8 +:1043E000F4081800E08B00092FF9123BFE9BFFF741 +:1043F000F01F0003D802F01F0003D802800243849C +:1044000080024354D4011698F6FC0140580CC06059 +:10441000189BF0CCFEDCF01F0002D802800243BCE7 +:10442000D4011698F6FC013C580CC060189BF0CCE7 +:10443000FEECF01F0002D802800243BCD4011698A3 +:10444000F6FC0138580CC060189BF0CCFEFCF01F45 +:104450000002D802800243BCD4011698F6FC013455 +:10446000580CC060189BF0CCFF0CF01F0002D80263 +:10447000800243BCEBCD40F831EC1694F01F0028CD +:104480001896C3906979F8C3FFE2EDB90000C360E4 +:104490001897EDB90001C1614A294A380C37F20872 +:1044A0001710E60701051AD84A0A0A9B0E9CF01F4E +:1044B00000202FFD580CC1C51835E08A001A1807D6 +:1044C0006979EDB90002C171496949780C37F20880 +:1044D00017100E9C1AD8E6070107496A0E9BF01FB9 +:1044E00000142FFD580CC0451837E089000530082E +:1044F000E768FFFF0C9CE3CD80F848B848EA1AD87B +:1045000031EBF01F000B2FFD580CCF2559DCFE9925 +:10451000FFF0EC0C00076979CBDB000080028F24F0 +:104520008003936480037E208003D35880009148E9 +:104530008003D3648003D350EBCD40F81894332C20 +:10454000F01F003E1896C650F8C3FFCEEDB400042D +:10455000C6301897EDB40003C1514B994B980C37F6 +:10456000F2081710E60701051AD84B7A0A9B0E9C31 +:10457000F01F00362FFD580CC4951835E08A00470F +:104580001807EDB40002C1514AD94AE80C37F208C5 +:104590001710E60701051AD84ADA0A9B0E9CF01F8D +:1045A000002B2FFD580CC3251835E08A0030180762 +:1045B000EDB40001C1514A294A280C37F2081710FE +:1045C000E60701051AD84A3A0A9B0E9CF01F001F05 +:1045D0002FFD580CC1B51835E08A00191807EDB445 +:1045E0000000C171496949780C37F20817100E9C18 +:1045F0001AD8E6070107498A0E9BF01F00142FFD09 +:10460000580CC0451837E08900053008E768FFFFFF +:104610000C9CE3CD80F848B8490A1AD8332BF01F18 +:10462000000B2FFD580CCF25E04C0031FE99FFEF19 +:10463000EC0C0007C90B000080028F2480039364F8 +:1046400080037E208003D374800091488003D37C54 +:104650008003D3888003D3908003D36CD401774C3C +:10466000F01F0002D802000080024538D401773CD8 +:10467000F01F0002D802000080024538EBCD40F860 +:10468000332C1693F01F00401896C6906759F8C453 +:10469000FFCEEDB90001C6601897EDB90000C16109 +:1046A0004BA94BB80C37F2081710E80701051AD8C8 +:1046B0004B8A0A9B0E9CF01F00382FFD580CC4C576 +:1046C0001835E08A004A18076759EDB90003C1613F +:1046D0004AE94AF80C37F2081710E80701051AD81A +:1046E0004AEA0A9B0E9CF01F002C2FFD580CC34574 +:1046F0001835E08A003218076759EDB90002C16128 +:104700004A294A380C37F2081710E80701051AD869 +:104710004A3A0A9B0E9CF01F00202FFD580CC1C581 +:104720001835E08A001A18076759EDB90004C171FD +:10473000496949780C37F20817100E9C1AD8E80717 +:104740000107498A0E9BF01F00142FFD580CC0452D +:104750001837E08900053008E968FFFF0C9CE3CDBD +:1047600080F848B8490A1AD8332BF01F000B2FFDE8 +:10477000580CCF25E04C0031FE99FFEFEC0C000700 +:104780006759C8CB80028F248003936480037E2006 +:104790008003D3A4800091488003D3B08003D390DA +:1047A0008003D3BC8003D398EBCD40C030AC1696C9 +:1047B000F01F00181897C1806D69EDB90000C17035 +:1047C000189A301BEDB90001C0F149384939580B2E +:1047D000F0091700149C1AD9EECBFFF6141B490AF6 +:1047E000F01F00102FFD0E9CE3CD80C048B848EAB2 +:1047F0001AD830ABF01F000B2FFD580CCF55589C2A +:10480000FE99FFF3EE0C000A6D69300BCDCB000072 +:1048100080028F248003936480037E208003D3D0A2 +:10482000800091488003D3C8EBCD40C01697768CAA +:10483000580CC05118960C9CE3CD80C0314CF01F31 +:1048400000101896CF90EF38001DEF3A00181AD8D4 +:10485000EF39001C1AD9EF38001B1AD8EF39001AAB +:104860001AD9EF380019314B1AD81ADA485AF01F02 +:10487000000630082FADED680013CDEB80009200EC +:104880008003DA4880009148EBCD40E078351696F9 +:10489000314CF01F000A1897C0C0EC050308488A85 +:1048A0001AD8314BF01F000730082FFDEF680013B6 +:1048B0000E9CE3CD80E00000800092008003DD6864 +:1048C00080009148EBCD40801697772C580CC09013 +:1048D000F01F0009189B6F2CF01F0008E3CD8080AB +:1048E000771C580CC060F6CCFFDC320BF01F0004C4 +:1048F000E3CD8080800091B88002438480024354DD +:10490000EBCD40807838F60800076E085808C0C024 +:10491000784C580CC0C0F60C030C189B109CF01F70 +:104920000007E3CD8080109CE3CD8080109CF01FB9 +:1049300000046E08CF3B0000800243BC800091B8A9 +:10494000EBCD40F83228169418961989F009180012 +:10495000C0A0F01F001BEBDCC001C19030070E9C13 +:10496000E3CD80F8F8C7FFFF322B0E9CF01F001537 +:10497000CF6019985808CF31B8880E9CF01F0010EE +:10498000890C0E9CF01F00101897CEABF80316018F +:10499000E6CCFFFFF01F000D1897CE200C9C069A66 +:1049A0000E9BF01F000BC051EE030B0C8903CD8B47 +:1049B0000E9C0A97F01F0007CD3B0000800091B8C5 +:1049C00080009158800091948000920080023944C8 +:1049D000800091E8D421205D18951094129C1696C1 +:1049E000F01F000F1897C1906C0A590AE08B001451 +:1049F000189B0A9CF01F000B0E9CF01F000B48BA7E +:104A00001AD4314BFACCFFFCF01F0009300C2FFDFB +:104A10002FBDD822F01F00042FBDDC2A80024940A0 +:104A2000800091DC800091E88003D3D88000914819 +:104A3000D4013038F6CCFEDCF6CBFEC0F01F00020D +:104A4000D8020000800249D4D4013028F6CCFEEC14 +:104A5000F6CBFEC4F01F0002D8020000800249D449 +:104A6000D4013018F6CCFEFCF6CBFEC8F01F0002D5 +:104A7000D8020000800249D4D4013008F6CCFF0CE3 +:104A8000F6CBFECCF01F0002D8020000800249D411 +:104A9000EBCD40F8201D18971693129C1A9BF01F1F +:104AA00000171895C2306E595809C0504008103987 +:104AB000E08B00206E695809C04040081039C133AE +:104AC0006E366E44E60600066C0CF01F000D8D0578 +:104AD0006E4C580CC0504008300CE60409082FFDFD +:104AE000E3CD80F80A9CF01F00062FFDE3CFC0F84D +:104AF000F01F00033FFCCF4B80024940800091E84B +:104B0000EBCD40FEF6F700D05807C0510E94089C3C +:104B1000E3CD80FE364CF01F00191894CF90EEC6FE +:104B2000FFFCF8C3FF9C189749514962ECFCFFFC5D +:104B3000580CC2116C0B580BC1A02F86F01F00122D +:104B4000CF600837E2081700E40817101ADCE60700 +:104B500001051AD80E9C48DA0A9BF01F000D2FEDB4 +:104B60001807580CC0451835FE99FFE23008E76871 +:104B7000FFFFCCEB6C0BCE2B80028F2480037E20BA +:104B800080039364800271BC8003D3E48000914869 +:104B9000D431205D500B129CF01F0056502CE08049 +:104BA000008E198A580AE080009B3009402650196F +:104BB000503912905049320230931294C0382FF677 +:104BC0000D8AE40A18005F08E60A18005F09124817 +:104BD000E8081800CF51580AC4E00D87E407180010 +:104BE0005F18E60718005F191268E8081800C64049 +:104BF0005807C6200C95C0385807C0D02FF50B8732 +:104C0000E40718005F18E60718005F191268E80843 +:104C10001800CF31AA842FF0403CE00B1503F01FA1 +:104C200000361891C4E040490C9CE20900060C9B38 +:104C3000F01F00328D1C6C085808C141580CC1018E +:104C400040182FF850185807C15040482F88504836 +:104C5000EAC6FFFF0D8A580AC3C05031CB3B591C2E +:104C6000C2404009F2F801782FF8F348017858075C +:104C7000CED15031E0C8FFFFF0071503402CF01FE4 +:104C800000200E9B403CF01F001CC2E0F8000039E1 +:104C90003008931893084008F14C00D04019580987 +:104CA000C0D1129C2FBDD8324009F2F801742FF800 +:104CB000F3480174CC9B0C95CAEB3FFC2FBDD83256 +:104CC000403CF01F000F402CF01F000D2FBDDC3AC0 +:104CD000E0C8FFFF5031F0071503CD1B501A308795 +:104CE000503A1490CCCB403CF01F00053FFCCE7BEB +:104CF00080009194800091F48002720C800091E811 +:104D0000D4213228129716951389F0091800C0A0F3 +:104D1000320A2DCB0E9CF01F00271896C2F03FFCE4 +:104D2000D822EEC6FFFF322B0C9CF01F0023C3C01D +:104D3000F8060107EEC80008E0480037FE9BFFF1C7 +:104D40006B2C580CC060F01F001D0E3CC2606B2C19 +:104D50003004EB440044F01F001AEECCFFFFF01FBC +:104D60000019EB4C0048CDC00C9B0E9AF01F0016AA +:104D70006B28089CF0070B04D822EF390040F80993 +:104D80001800CCE16B2CF01F000E3018EB460048E9 +:104D90000C9CEB480044D8220E9A0C9B6B2CF01F05 +:104DA000000BCD61CBEB0C9CF01F00041897CC3BA3 +:104DB0008002394480009158800091B8800091E8C9 +:104DC00080009200800091DC8000917CEBCD4080DF +:104DD0001697129C2E8BF01F0006F9BC01FFF9B844 +:104DE0000001EFF80A08E3CD808000008002389CC3 +:104DF000EBCD40C018976E38129CF00B000630AA1D +:104E0000300BF01F000C8D0C18996E585808C030EC +:104E1000103CC0956E6C580CC0401839E0890007F2 +:104E2000E3CF80C08D08E3CFC0C08D0CE3CFC0C0FE +:104E300080009170D42116941895782B580BE08A35 +:104E400000557817683E6E0C78381C38C410EECACE +:104E5000FFFC3009C058150C78381C38C3902FF966 +:104E60001639CFA52FFB0E9CA36BF01F00241896BC +:104E7000C3506A2C580CE08A003B6C08683E7039BD +:104E80001C39C355ECC8FFFC300AC0A81097700845 +:104E9000F40B15027039EEC8FFFC1C39C2052FFA5D +:104EA000143CFE99FFF5F4C8FFFFEC0A002BA36841 +:104EB0001697F80A010AEC08000CA36AF01F00100C +:104EC0008F048B166A28300C2FF88B28D82218985C +:104ED000781C580CCFD19114D822DC2AF4C8FFFFDB +:104EE000EC0B000BA368CE6B7817CBDB0C97300A6A +:104EF00030480C9BCDFB0000800091F4800091C4F1 +:104F0000D4211895781CF01F000D300C8B1C8B2CB5 +:104F10006A075807C0F0189618948F140E9B0A9CC5 +:104F2000F01F00076E07F9B605FF5807CF710C9CFC +:104F3000D8220E96CFDB0000800091E880024E342C +:104F4000D421189578095809C1E03FFAC028109972 +:104F50007228F4080C4A72085808CFA1F4C4FFFF65 +:104F60001296E06C01A8F01F000A1897C0A09924BF +:104F70005806EDFC1A00EBFC0A000A9CF01F000525 +:104F80000E9CD82212961294CEDB000080028F2451 +:104F900080024F005EFD5EFD5EFD5EFD5EFD5EFD1E +:104FA000D401584BC0E0E0880007586BC0A0587B84 +:104FB000C040D802580BC091300CF01F0005D80239 +:104FC000301CF01F0003D802D80200008002172016 +:104FD000D401581BC070300A323C149BF01F0005EE +:104FE000D80A300A322C149BF01F0002D80A0000A5 +:104FF00080014658EBCD40FE201D1094129216956C +:10500000F01F0057E8C8FFF25C7C4D69F00C000609 +:10501000F33A0109580AC060EC0A0D085809E0810A +:10502000008F3003500CE6060001029CF01F004E7A +:105030000A9B1897306A400CEE0C000CF01F004BD6 +:10504000400C306A4CAB140CEE0C000CF01F004707 +:10505000400C302A4C7B2F4CEE0C000CF01F004310 +:10506000400C089A049B2F2CEE0C000CF01F003F04 +:10507000FAC8FFFC3005114A0E991AD5EE0A000C49 +:105080001AD5EC0A010A30EBF01F003B2FED581C3B +:10509000C5914009EC090108E048003EE08B001092 +:1050A0008E085CC806085CC8AED3029B0E9CAE0896 +:1050B000F01F0032300C2FFDE3CD80FEEE09000E14 +:1050C0003888FD39000CF0091800CEB1FD39000D0B +:1050D00038E8F0091800CE51FD38000EF808180025 +:1050E000CE01FD39000F3038F0091800CDA130286D +:1050F000FD3A0012F00A18005F1B3FE8F00A1800A2 +:105100005F19126BEA0B1800CCC1FD380013E218CE +:10511000001D5818CC61FD380014E21800C85888EA +:10512000CC01FCCAFFC1FCC9FFE1C0482FF914390A +:10513000C0E01388F6081800CFA0CB3BF4090103A8 +:10514000C72B0E9CF01F000E3FFCCB6B0FC92FA985 +:10515000EE0900091388A3A8B288CA3B8001F4E8CD +:10516000000087F480009200800091DC00007AA8A3 +:105170008003D6548001F54480014664800091E8A4 +:10518000D401201D3068FACBFFFC16D81A9B486C5E +:10519000F01F00064848581CF00C1700F9BC01002D +:1051A0002FFDD80200007AA880017A88EBCD40401C +:1051B000310A1696300B0C9CF01F000630F930783F +:1051C0008D198D09300C30398D288D39E3CD804013 +:1051D000800091D0D401F01F0002D80A80016048FD +:1051E000EBCD4068206DFAC3FFEE1496069C306A42 +:1051F000F01F0010FAC5FFFE0C9B310A0A9CF01F3D +:10520000000D0A9B204D310A1A9CF01F000B069BD3 +:10521000202D306A1A9CF01F0008F01F00082FADE7 +:10522000581CF9BC01FFF9BC00002FADE3CD80682C +:10523000800091DC8002E73680016094EBCD40680D +:10524000206DFAC3FFEE1496069C306AF01F001022 +:10525000FAC5FFFE0C9B310A0A9CF01F000D0A9B49 +:10526000204D310A1A9CF01F000B069B202D306A3E +:105270001A9CF01F0008F01F00082FAD581CF9BC45 +:1052800001FFF9BC00002FADE3CD8068800091DC08 +:105290008002E73680016168D401F01F0005581CC8 +:1052A000F9BC01FFF9BC0000D80200008001F370D6 +:1052B000D401F01F0005581CF9BC01FFF9BC000027 +:1052C000D80200008001F310D401169CF01F0004E6 +:1052D000581CF9BC01FFF9BC0000D802800163E052 +:1052E000D431207DFACEFFC050287C027C387C1758 +:1052F00050087C2E501E16901894149B1293580A36 +:10530000C5C0FAC5FFEA306A0A9CF01F0031202DA3 +:10531000306A0A9B1A9CF01F002FF01F002F5802C2 +:105320005F1858075F1918912FED1268C181300678 +:105330005800C26168193018F0030948F00811FFDD +:10534000F1E9000C891C580CC365BFBC891CF01F17 +:10535000002318975817C2F02F9DDC3A5887FE9B00 +:10536000FFFDFAC6FFF2308A300B0C9CF01F001CC8 +:105370000E9A049B0C9CF01F00165800CDC04028CC +:1053800058015F091AD8069C1AD630381AD530163B +:10539000404A403B1AD6F01F00136819EC03094835 +:1053A0001248F1D8C01F189789180C9CF01F000EE6 +:1053B0002FCDCD1B2F9DD83AFAC5FFEA306AE06B9E +:1053C00000FF0A9CF01F0006CA3B0000800091DC31 +:1053D0008002E736800188B080016584800091D02A +:1053E0008001661C8001639CEBCD40C01896308C18 +:1053F000F01F00091897C0C0300899069918F01FCF +:105400000007301CF01F00060E9CE3CD80C0E3CDEA +:1054100080C0000080028F248001604880017A10E3 +:10542000EBCD4080209D1697FACCFFFEF01F0009BF +:10543000581CC0402F7DE3CFC0800E9C1BBAFACB16 +:10544000FFFCF01F00051BBC2F7DE3CD808000001A +:1054500080017800800091DCEBCD4080202D580B3E +:10546000C120FAC7FFFE306A0E9CF01F000C0E9C94 +:10547000F01F000B581CF9BC01FFF9BC00002FED18 +:10548000E3CD8080FAC7FFFE306AE06B00FF0E9C20 +:10549000F01F0004CEDB0000800091DC8001793039 +:1054A000800091D0EBCD4040485B1896F01F00057E +:1054B0000C9CF01F0005E3CD8040000080039C3869 +:1054C00080025458800091E8EBCD40C0202DFAC7EF +:1054D000FFFE16960E9CF01F0008581CC0402FEDD2 +:1054E000E3CFC0C00E9B0C9C306AF01F00042FED70 +:1054F000E3CF80C080017864800091DCEBCD40C0B8 +:1055000018977939580BC0305839C0E03018EF4837 +:1055100000BC3038EF48004C1039C0808F2830086C +:105520008F58E3CD80C0F949004C6F682FF8EEFA30 +:10553000010CEF4800586FA830098F288F59301B95 +:10554000746C7486487A5D16EEF80094EEF900905B +:105550002FF82FF9EF480094EF490090E3CD80C079 +:1055600080037E20580C5E0C580BF9FB4A19580A30 +:10557000F9FA4A225809F9F94A1A5808F9F84A1B5F +:105580005EFC580CF9F81024F9B90101F1D9E108D1 +:10559000F9F81A245EFC580C5E0C580BF9B801019E +:1055A000F9F81A45F9FB0A455EFCD703EBCD40C07C +:1055B0001897580CC04079385858C030E3CD80C097 +:1055C000F8F8010C3009706C7086488A301B5D1643 +:1055D000EEF80094EEF900902FF82FF9EF480094C0 +:1055E000EF490090E3CD80C080037E20580CF9FC89 +:1055F00010315EFC580CC0B0F8F800D45808C070E8 +:10560000F8F800D89708F8FC00D45EFC300897083A +:105610005EF8D703580CC040588BE08800035EFD4D +:1056200048D8F00B032FF8FC00E05EFCF8FC00DC2F +:105630005EFC78BC5EFCF8FC00805EFC79FC5EFCE5 +:10564000F8FC00845EFC784C5EFC797C5EFC786C37 +:105650005EFC00008003D6FC580C5E0C588B5EBCD0 +:1056600048E8F00B032FF94A00E05EFCF94A00DC41 +:105670005EFC99BA5EFCF94A00805EFCF94A007C47 +:105680005EFCF94A00845EFC994A5EFCF94A005CC3 +:105690005EFC996A5EFC00008003D720580CC05065 +:1056A000580BC031783C5EFC5EFD580C5E0C580B0C +:1056B000F9FA0A035EFCD401580CC0A0F8FC010CF6 +:1056C000580CC06078A85808C030780C5D18D80213 +:1056D000D401580CC021D80AF8FC010C580CCFC0DA +:1056E00078B85808CF90780C5D18D802EBCD408080 +:1056F0001897580CC1E0189A300B48FCF01F000FA7 +:105700000E9A300B48ECF01F000DEEFC00C0F01FAD +:10571000000DEEFC00CCF01F000CEEFC00D4F01FDE +:10572000000AEEFC010CF01F00080E9CF01F0006A2 +:10573000E3CD80808002608C800274008002602053 +:10574000800270E0800091E8D401580CC050F8FC51 +:1057500000C0F01F0002D80280026410D401580C6F +:10576000C050F8FC00C0F01F0002D802800264287C +:10577000D401189A580CC0A030583019F8FC00C059 +:10578000F548004C95C9F01F0002D802800263BAA8 +:10579000EBCD40801897580BC04079E85888C0403E +:1057A0003018EF4800BC30193088EF490044EF480A +:1057B00000788F99EEFC00C0F01F0004F9B80100DA +:1057C000EFF81A39E3CD8080800263B2EBCD40E080 +:1057D000201D189716951496580CC0513FFC2FFDAC +:1057E000E3CD80E0F8FC00C0F01F000ACF801A9BD8 +:1057F000EEFC00C0F01F0008189BCF10400C0C3CC2 +:10580000CEF30C9A0A9CF01F0005300CCE9B0000D2 +:10581000800263B2800263CE800091DCEBCD40C099 +:1058200018971496580CC1F0F94B00C4580AC1B02F +:1058300074087419F94800F8F94900FC7428F9480B +:105840000100F8FC00C0580CC0E0742BF01F0007EA +:105850006C3BEEFC00C0F01F00066C4BEEFC00C081 +:10586000F01F0004E3CD80C0800263A6800263AC19 +:1058700080026408D431FACD00A81897F8F600CC5D +:105880005806C0F0F8F800F85808C0B00DA80DB9D7 +:10589000F3E81089F8F800D02FC91039E088000427 +:1058A0002D6DD832ECC4FFFC0999500909A0F01FF6 +:1058B000006FFAC1FFF8340A029B0E9CF01F006CC7 +:1058C0001895CEF5590CE0800090580CCEA132020C +:1058D0005012EEF800E45808C7D1E8C5FFE4FAC357 +:1058E000FF68310A0A9B069CF01F0062310A300BE8 +:1058F0000A9CF01F00610DAA0DB9049BF3EA108900 +:10590000FACCFFD8EEFA00CC0A982FC9F01F005B42 +:10591000310A0A9B069CF01F005AC7614009E1E961 +:1059200010880DB9EBD8B0100DA8F3E81089320833 +:10593000F2CE002CF00519005FB9E04E00205F9A0E +:10594000124AF80A1800CAD15C751C35C630580EC8 +:10595000CA81FAC3FF88029B0A9A069CF01F004581 +:105960003018308AEF4800E4E8CBFFFDEECCFF189A +:10597000F01F0040EEFC010C78965806C0D0E93AC2 +:10598000001B0A98149B0699780CE21B0080F5DA3C +:10599000C0025D16C865E939001B3008F00918001F +:1059A000C5753018EF48011CEEF901185809C0718F +:1059B000EEF800FCEDB80000FE90FF7430188FD8B0 +:1059C000EEFC010C78785808FE90FF6C780C5D189E +:1059D000C68B308AE8CBFFFDEECCFF18F01F002805 +:1059E000FE94FF60C7BB189A029B0E9CF01F00201C +:1059F000FE91FF580A9A029BFACCFFD80A92F01F38 +:105A0000001D5015C67B069B0A9C310AF01F001929 +:105A1000C48BFAC6FFB8E8CBFFF50C9C310AF01F27 +:105A20000015049A029BFACCFFA8F01F0012FAC3DB +:105A3000FF880A9AE8CBFFD4069CF01F000E40199D +:105A40000C9A2F090A9B069CF01F000EC8AB301859 +:105A5000EF480118EEF9011C5809CB11EEF800FCD3 +:105A6000EDB80001CAC1C1DB8002575C800257CC8F +:105A7000800091DC800091D080028EF88000917CC3 +:105A800080029C38D431201D3003189730140695BD +:105A900030213040EF4500BC6F4A580AE08000C911 +:105AA0006F585808E08100C56E7C580CE08100C238 +:105AB0006EB85808E08000BE6F385828EFF41A2FEF +:105AC000EEF8010CEF41004C3009706C7086FEFA64 +:105AD000051E029B5D16EF4400548FC5EEF800983A +:105AE000EEF900902FF82FF9EF480098EF49009059 +:105AF0006E7C580CC0516EB85808E08100EC6FC83D +:105B0000EF4400705818EFF41A2F6FD85808E0814E +:105B100000F8580CE08100A76EE85808E08100A367 +:105B20006FE8F0C900015879E08B000EFEF804C45C +:105B3000F009032FEF4400BCEF410078EF4500402F +:105B4000EF4400C8EEFC00C0F01F012BE08000B560 +:105B5000EF4400BC2FF3E0430064C9D10E9A300B30 +:105B6000FEFC0498F01F012630090E98FEFA048C02 +:105B7000129B129CF01F0123EEF9010C72285808A9 +:105B8000C0E0EEF801105808C0A058185F0B3008AC +:105B90000E9CEF480110723A72285D182FFDD83222 +:105BA000EEF80088EF4400BCEF4000788F55EF45D9 +:105BB000007CEF4500C88F08CC6B6E585808E08118 +:105BC00000DF6E4B580BE08100D06E085808C161B1 +:105BD0003078EF4400BCEF480078EF440048CB3BFE +:105BE000EEF900845809E08101846FF85808E081DB +:105BF000015C6E4B580BE08100B86E685808CA30E3 +:105C00000E9CF01F0101C9FB6E485808E08100A9F5 +:105C10006E585808E08100B06E685808C9406F0897 +:105C20005808C910300B0E9CF01F00F7C8CB6E7CD3 +:105C30006EA95809C2F16F885808C2C06F38EF4585 +:105C400000605818EFF41A2FEF44004CEF4500584D +:105C5000EF4500548FC58FE4EF450118EF45011C57 +:105C6000C49B6FE8EEFC00CC5818EFF41A2FEF44F9 +:105C70000078F01F00E6EEFC00D4EF4500CCF01FEA +:105C800000E3EEFC00C0EF4500D4F01F00E18FE51B +:105C9000C5AB580CCD416EB85808CD105829C3B0CB +:105CA0005819C4706F3820185878FE9BFF26FEF9EB +:105CB0000362F208032FEEF800BC5808FE91FF4C77 +:105CC000C5CB6E585808E08100FE6ED85808E080B9 +:105CD00000FE6FC95819FE90FF1A5829FE91FF1E49 +:105CE0006FD85808FE90FF1A0E9CEF490070EF44E1 +:105CF00000BCF01F00C96E7CEF450074C0BB0E9C59 +:105D0000EF4400BCEF410070F01F00C36E7CEF4514 +:105D10000074C00B6F885828CC606F388FC45898B7 +:105D2000EFF41A2FEF4100603098EF48004CCE4A54 +:105D30006F885818CB806F3858A8EFF91A2FEEF9F2 +:105D4000010C30A88FC5EF440060EF48004CFEFA0C +:105D5000029E7286726C302B0A995D16CC0A6F080F +:105D60005808FE90FF573068EF4400BC8FF4EF48AE +:105D70000078CE9A6F085808FE90FF503038EF44F4 +:105D800000BC8F05EF440080EF480078CDCA6E69F3 +:105D90005809C0A06ED85808E0810117EEF800F845 +:105DA0005808E08100FC6E485808E08100EB6E88DE +:105DB0005808C0506ED85808E08000E46F28580892 +:105DC000C050300B0E9CF01F00956E7CC93A6F7866 +:105DD0005808C8018F88EF4400BCEF40004CEF48E2 +:105DE0000058EF4800448FF8EF4800488F98EF4480 +:105DF0000040C82A6E1B580BCE606E585808FE90A3 +:105E0000FF6A3089EF4400BCEF49004CEF44005C6E +:105E1000C73A6E2B580BC2716F696FB81039CD330A +:105E20006ED85808C2003058EF4400BCEF48004C10 +:105E30008FC4EF440110FE9FFE60580AFE91FF4B95 +:105E4000EF4A011CEF4400BCEF44004CEF4A0060F5 +:105E5000EF4A0058EF4A00548FCA8FE4EF4A011806 +:105E6000FE9FFE4B6E685808C7B16E485808C78140 +:105E70006E585808CC71580BFE91FF2D6F696FB8A2 +:105E80001039FE93FF286ED85808FE91FF24307811 +:105E90008FCBEF48004CEF4400BC6F98EF410110EE +:105EA0008F18FE9FFE2AEEF80088EF4900C8EF44E5 +:105EB00000BCEF4000788F59EF49007C8F08FE9FAF +:105EC000FE436ED85808E081008AEF4400BCEF44DE +:105ED000004CEF450060EF450058EF4500548FC57A +:105EE0008FE4EF450118EF45011CFE9FFE06305977 +:105EF000EF4400BCEF4900781A9BEEFC00C0F01F95 +:105F000000481892C290EEF8010C4009189A708669 +:105F1000706C300B5D16049CF01F003CEEF800C85E +:105F20005808EFF81028F9B90101F1D9E108EFF8A4 +:105F30001A28EFF80029F9B90001F1D9E008EFF8C3 +:105F40000A29EEF90090EEF8009C2FF92FF8EF499E +:105F50000090EF48009CEF450084FE9FFDF5EF4464 +:105F600000BCEF40004CEF450058EF4500448FF572 +:105F7000EF4500488F958F85EF440040FE9FFDBDA3 +:105F80003078EF4400BCEF48004C8FC56F98EF416C +:105F900001108F186E7CFE9FFDAEEEF800FC5808D5 +:105FA000FE91FF038FD4EEFC010C78785808C040B6 +:105FB000780C5D186E695809FE90FEF76ED8580887 +:105FC000FE90FEF36E7C3059EF4400BCEF49004C6C +:105FD0008FC4EF440110FE9FFD8E3088EF4400BC5B +:105FE000EF48004CEF44005CFE9FFD8780037E205D +:105FF0008003D744800268308002608C8002740085 +:106000008002747480025790800091E88002653CA1 +:106010008003D76480025874800254FC800263E6D7 +:10602000EBCD408076085808F9B901FFF1D9E108B5 +:10603000F7F81A0076185808F9B901FFF1D9E10804 +:10604000F7F81A0176285808F9B901FFF1D9E108E3 +:10605000F7F81A0276385808F9B901FFF1D9E108C2 +:10606000F7F81A03169718991698486A300B301CDF +:10607000F01F00050E9CF01F0005E3CD808000009E +:10608000800260208002747480025A84D401169CBD +:10609000F01F0002D802000080025A84D421203D63 +:1060A0001895E06C0120F01F00221897C38031E89A +:1060B0003039F9480088F948006833C8F949006C5C +:1060C000F9480064F945010C300430CA99A4089BD2 +:1060D0001A9CF01F00186AF850286ADA500A6AE819 +:1060E0005018EEF8010C1A99704A493B0E9CF01FAB +:1060F0000013EF4C00C01A961898C14030160E9C41 +:106100008F76F01F000F0E9C8F74F01F000D0E98FD +:1061100008990C9C48BA089BF01F000B0E9C2FDDC1 +:10612000D8220E9C1097F01F0009CF9B80028F246D +:10613000800091D0000004788002711C80025A8493 +:106140008002602080027474800091E8D401580CB1 +:10615000C090F8F800D45808C050F8F800805808EB +:10616000C020D8023018F94800809958F01F00026A +:10617000D802000080025A84D401580CC04099AB68 +:10618000F01F0002D802000080025A84D401580C8B +:10619000C060F94B00E0994BF01F0002D8020000EC +:1061A00080025A84EBCD40801897580CC090996BB0 +:1061B000F94B00DC580BC0610E9CF01F0005E3CDCD +:1061C0008080F8FC00C0F01F0003CF7B80025A845F +:1061D000800263BAD401580CC04099DBF01F000262 +:1061E000D802000080025A84D401580CC04099BBE8 +:1061F000F01F0002D802000080025A84EBCD40E07C +:10620000189714951296580CC3A0F8F8008C2FF824 +:10621000F948008C5839E08B0009F8F800A82FF8ED +:10622000F94800A8E3CF80E01588306AF94800B04B +:10623000F8CCFF4CF01F0042ECCA00040BA90BB8CD +:10624000F1E910861436E08B00130B99300CF80935 +:106250001800C4603038F0091800C130EEF800A80A +:10626000301C2FF8EF4800A8E3CD80E0EEF800AC3A +:10627000300C2FF8EF4800ACE3CD80E0E3CF80E0B6 +:10628000E046002BE088004C3FE80BCBF00B1800F9 +:106290005F0A3028F00B18005F09124AF80A18004C +:1062A000CEE13018F00B1800C3A1EEFC00CCF01FBB +:1062B00000252FC60C9CF01F0024EF4C00CCC2F030 +:1062C0000C9A0A9BF01F001E0E9CEF4600D0301661 +:1062D000EF460074F01F001D0C9CE3CD80E0EEF84B +:1062E00001145808C100300830398FC8EF48011434 +:1062F0008F29EF49004CEEFC010C78C85808C030DB +:10630000780C5D18EEFC00D4F01F000E0C9CEF46DC +:1063100000D8F01F000DEF4C00D4C031E3CF90E067 +:10632000EACBFFFCEEFA00D8F01F00050E9C3016F9 +:106330008F56F01F00060C9CE3CD80E0800091DCBE +:10634000800091E88000920080025A84EBCD40806A +:10635000189779685808C0B079BB580BC08070494D +:106360005D193008EF480058EF48006CE3CD80809D +:10637000EBCD40C01897580BC04078085878C04003 +:106380003018EF48006030786FA68F086F9C6C293A +:10639000300A305B5D196FA86F9C7029301A304B42 +:1063A0005D19E3CD80C0F94B00745EFCF94B00B081 +:1063B0005EFC580CF9FC10135EFC580CF9B8010196 +:1063C000F9F81A06F9B9010BF9F91A005EFC580C34 +:1063D000C08079485808C05079589708794C5EFCBD +:1063E000300897085EF8580CC0C0791A580AC09057 +:1063F000792897083009F9490048F94900445EFABC +:106400003008109A97085EFAF94B00C45EFCD70377 +:10641000D401580CC040483BF01F0003D8020000D4 +:106420008003D7B08002634CEBCD40801897580CA6 +:10643000C0F079A8300B7019799C5D19C0916E6815 +:106440005808C0606E2820385818E0880004E3CD52 +:1064500080806F485808F9B80101EFF81A136FA847 +:106460006F9C7029301A300B5D19EEFC00A4483A7D +:10647000302BF01F0003CECB8003D7BC80023A1A2A +:10648000EBCD40801897580BC040780858B8C040F2 +:106490003018EF4800606F4930B88F085809F9B8D4 +:1064A0000101EFF81A136FA86F9C7029301A300B96 +:1064B0005D196FA86F9C7029300A305B5D196FA859 +:1064C0006F9C301A7029304B5D19EEFC00A4484ACD +:1064D000302BF01F0004E3CD808000008003D81C27 +:1064E00080023A1AEBCD40C01897580BC04078088C +:1064F00058C8C0403018EF48006030C86FA68F08F9 +:106500006F9C6C29301A302B5D196FA86F9C702915 +:10651000300A305B5D196FA86F9C301A7029304BC0 +:106520005D19EEFC00A4484A302BF01F0004E3CDB7 +:1065300080C000008003D86080023A1AEBCD406032 +:106540001896784CF01F000B30056D1C8D45F01F20 +:1065500000096D4CED450044F01F00066DA8ED45A7 +:1065600000500A9A6D9C70290A9B5D19E3CD8060EA +:10657000800091E8EBCD40E01897580BC4F0780804 +:106580005808C4C130088F086FD95809C0B06F6867 +:106590005808C08070985808C0506FBB0E9C5D189A +:1065A000C4114A4B0E9CF01F00246FA83006301512 +:1065B0008F16EF4500408F268F666EFA70490C9B50 +:1065C0006F9C5D196FA80C9A70290C9B6F9C5D19CC +:1065D0006FA80C9A7029302B6F9C5D196F4CF01FBF +:1065E00000176FA80A9BEF460050EF46004C0C9A2C +:1065F00070296F9C5D193FF80C9A8F386FA5303B5E +:106600006F9C6A295D196FA80C9A7029304B6F9C9A +:106610005D19EF4600C0E3CD80E03018EF48006020 +:10662000CB2B6F686FBB70A90E9C5D19CBFB000074 +:106630008003D8948002634C800091E8EBCD40E069 +:10664000205D1897580BC04078085858C040301843 +:10665000EF48006030588F086F695809C4406FA830 +:10666000FACBFFF070596F9C5D19310A300B189509 +:106670001A9CF01F00256F1C6EE850086E295019F7 +:106680006E6850286F095039F01F002030086F6B7A +:10669000EF48005CEF480044EEC8FFB81A9A0A9928 +:1066A0001AD80E9C405876566FBB5D16EF4C0044CE +:1066B00040188FE82FFD5808C1616F785808C13124 +:1066C00040188F2840298F694038EF4800406F6894 +:1066D00070695809C08070785808C0506FBB0E9C14 +:1066E0005D19C0412FBDE3CD80E06F4CF01F000766 +:1066F0006F68EECAFFAC70796FBB0E9C5D19EF4CF2 +:106700000050CF1B800091D0800091E8EBCD4080FD +:106710001897580BC04078085868C0403018EF48A8 +:10672000006030686E4C8F08F01F001A6F18580810 +:10673000C2E0EEF800B05808C2216EA86F2C8F3866 +:10674000F01F00158F4CC0706F2A6F1BF01F0013D5 +:106750006F288F586FA8301A7029303B6F9C5D19D5 +:106760006FA86F9C7029300A305B5D196FA86F9C11 +:1067700070496EFA300B5D19E3CD8080310AEECBA3 +:10678000FF7CEECCFF6CF01F0005CD8B8F48CE9BBD +:10679000800091E880009200800091DCEBCD40FC0D +:1067A000201D79A81897169214931294799C700959 +:1067B0005D191896C2F06F685808C23070C8580842 +:1067C000C2000E9C1A9A6FBB5D181895C1A0400CB0 +:1067D0002FBC870CF01F0015C1D03028B892B888A4 +:1067E00030188699B8B9A9891897B8A9B8C80A9B6A +:1067F000400A2FBCF01F000E0E9C2FFDE3CD80FC45 +:106800005804C0416DCC580CC0A16DB86DA5580599 +:10681000C0A130070E9C2FFDE3CD80FC6DD81895EC +:106820005008CD6B5008CD4B80009200800091DC69 +:10683000D431209D3004F8C9FF7CF8C8FF6C18974C +:1068400050195008F8C0FFB808956FA8EF450060D0 +:10685000301B70196F9C5D19C0706FA8306B701978 +:106860006F9C5D19C2F16FA8306B70196F9C5D1938 +:10687000C140EEF800C45808C101EEF800C0E0487D +:106880000032E08A0025E0480033E080011C6F8878 +:106890005808C1003014CDAB6E085818F9B8010182 +:1068A000EFF81A18EF4500C030188F086F885808A5 +:1068B000CF216F7C580CE80C1700F9BC01012F7D2B +:1068C000D832301B0E9CF01F01EECE2B6E0958A95A +:1068D000FE9BFFDFFEF807ACF009032F30183029CC +:1068E000EF4800608F09CD4B300B0E9CF01F01E686 +:1068F000CCFB6E196EB81039C760300B0E9CF01FC0 +:1069000001E2CC6B6EA96E381039E0800137300B94 +:106910006E8E580EC1B06E685808C1806EAA6E396E +:10692000123AE08000BBEEF800B05808C0F0F2C8A0 +:10693000FFFFF1D8C008103AE08000B0F2C8FFFEB7 +:10694000F1D8C008103AE08000A96E2C582CC20083 +:106950006E985808E08001236E685828E080011F77 +:106960006EAA6E39123AE0800146EEF800B058087F +:10697000C0F0F2C8FFFFF1D8C008103AE080013B38 +:10698000F2C8FFFEF1D8C008103AE08001346E78FA +:1069900058085F1A3008F5EB0009F0091800E0818B +:1069A000010FEC1B0001F5EB0008F2081800E08075 +:1069B00001056EBB1699582BE080012A6E16580609 +:1069C000C071581BE080021B582BE08101630C3B17 +:1069D000E080014F0C995919C0F1580EC0416FE881 +:1069E0005808C0A0300B0E9CF01F01A8C51B6EEB11 +:1069F000580BFE90FF7C300B0E9CF01F01A5C48B42 +:106A00006FA8305B70196F9C5D19C7016FA8307B50 +:106A100070196F9C5D19C0506E685808FE91FF395F +:106A20006FA8300B70396F9C5D19C0516E68582883 +:106A3000FE90FF2F6FA8308B70196F9C5D19FE912F +:106A4000FF286FA8189B70396F9C5D19C0516E6844 +:106A50005828FE91FF1E6FA8307B70196F9C5D193E +:106A6000C0806E285828C0506E685808FE90FF11EC +:106A70006E185918E080025C5998FE91FF0AEEF8F2 +:106A800000805808FE90FF056E685808FE90FF01D0 +:106A90006E285848FE91FEFD300B0E9CF01F017DC4 +:106AA000CF7A6FA8306B70196F9C5D19FE90FEF164 +:106AB000EEFB00C4580BFE91FEEC0E9CF01F017023 +:106AC000CE7A3328EEFC00A4FEFA05CC1AD8302B7F +:106AD000F01F0172EEF800C0301B16080E9CEF4844 +:106AE00000C0F01F016F2FFDCD3A6FAA3038FACBEE +:106AF000FFE08F0830136F9CEF43006074595D19FD +:106B00008F95507C8F85EF4500788F758FA58FB559 +:106B10008FC58FD55F0A408B1896583B5F88104A07 +:106B2000EA0A1800C23119A919B8F1E910885068A9 +:106B3000103BC1C319988FA8EEF900B05809C09056 +:106B4000069C4019FACAFFE8FACBFFE4F01F015592 +:106B50000D893028F0091800E080011CE08B008DC1 +:106B60003018F0091800E0800123EEF800C02FF87B +:106B7000EF4800C0FE9FFE8D6E785808FE90FEC95B +:106B8000EEF800B05808C080310A400B401CF01FDE +:106B90000146FE91FEBE301BCBCA580EFE90FEF998 +:106BA0006E685808FE91FEF56E185918FE91FEDACF +:106BB000583CFE91FED7CECA6E19C0EB301830A9F2 +:106BC000EF4800608F096F1CF01F01386E485808AD +:106BD000C1A06E5CF01F0136EF4C0044FE90FE59E0 +:106BE0006E5A6E4BF01F01336E58EF480048FE9FFF +:106BF000FE50300B0E9CF01F012AFE9FFE4A30090A +:106C000050494048EF480044FE9FFE436F08580833 +:106C1000FE90FED6301830996FAA8F09EF480060B9 +:106C20007458FACBFFE86F9C5D1819A919B818962B +:106C3000F1E910885848E08B01476F1CF01F011BD9 +:106C4000305CEF450044EF4C00486EA6F01F011881 +:106C5000E08001853029B896B889EF18004AB8C994 +:106C6000B8B8A988B8A8EF4C0044FE9FFE12584C53 +:106C7000FE90FEB3CB8A3038F0091800E08000DCCB +:106C80003048F0091800FE91FF7230188F98C6EB5B +:106C900030181693EF48006030496FA8E04B00FEB3 +:106CA000EFF3000D8F096EC670096F9C5D19069A8F +:106CB0000C9BF01F0101E08100C36F1CF01F00FB63 +:106CC0006FA8EF4500446EA270096F9C5D19503C9F +:106CD000FACCFFE8F01F00F91893C9206EB8E0481D +:106CE00000FEE08101516FA8406670096F9C5D193C +:106CF00030C8505CA376EF480048ECCCFFECF01FA6 +:106D000000EC1891E080012E3FE9B892B8C9302913 +:106D1000B889F8C8FFFBB0A5B085B095F8C9FFF8F1 +:106D20003038B285B295B2A5B2B8504CF8C2FFF473 +:106D30000A96C298661A6ED81438C210405CF01FCA +:106D400000DE049AE4CBFFFC580CC1903FE814C865 +:106D50008689B4896608A988B4986609B4A907C861 +:106D6000B68886A9B6996618A988B6A86619B6B96C +:106D7000F6C2FFFC60082FF62F88810866F35803DF +:106D8000E0800099660B6EC81638CD50661ACD7B30 +:106D90006E185918FE91FEEB40685848FE98FEE7C1 +:106DA0003018EF4800780DC98FB9CE0A406A584AAA +:106DB000FE98FEDD30188F780DC98FB9E04900FECE +:106DC000FE91FED558BAFE98FED2ECC9FFFB139C8B +:106DD000138A13A8F1EA1108F1EC1088ECCBFFF844 +:106DE0008FC817AC17B81789179AF1E91188F1EA1B +:106DF0001108F1EC10888FD8CB9A6FA83089EF4B2F +:106E000000608F09FACBFFE0705A6F9C5D1AFEFAA2 +:106E100002AE302BEEFC00A4F01F00A06F1CF01F90 +:106E200000A30C99EF460044009A6EAB0E9CF01F35 +:106E300000A5C1AB30188F88FE9FFE990C9C069B65 +:106E4000F01F00A1FE90FF3B6FD85808C0906F6AFA +:106E5000580AC06074096EC81039E0800086FEFBD5 +:106E6000026A0E9C3006F01F009A6EB88F186F6C85 +:106E7000580CE08000CD5806C54078B86FBB0E9C1A +:106E80005D18EF4C006C6FB65806E08000CA6F6A60 +:106E90006ECB30188F287429FEFA02381AD91AD30B +:106EA0001ADB302BEEFC00A4F01F007C2FDDFE9FD0 +:106EB000FCF05806C4206F285C78A2B8A988A2A864 +:106EC000FE9FFEA1F0CC0004F0C20005F01F007888 +:106ED0001893FE90FEB45802C120ECCCFFFB300AA0 +:106EE00035DB1938F0C90021F6091800F9B80B5F35 +:106EF000E60A0B082FFA1432FE9BFFF53008E60273 +:106F00000B084F581AD34F5A1AD8302BEEFC00A456 +:106F1000F01F0062069CF01F00652FEDFE9FFE8FA4 +:106F200078380E9C5D18EF4C006CCAEB6FF858086F +:106F3000FE90FCAFFE9FFDAA04983FE910C9B0A6E1 +:106F4000B086B096E4C9FFFCB2B6B286B296B2A6DD +:106F50006F282F88EF480048CB0B0A9CFE9FFE85C8 +:106F60005045FE9FFE5074181033FE91FF7A7499BD +:106F70005809FE90FF766FBB0E9C5D19FE90FF7165 +:106F80003016C74B3058406CEF4800482FACF01F0C +:106F900000481896FE90FE35B89230283039B888EF +:106FA000B8C9504CF8C2FFFB50250A91C1A8661A17 +:106FB0006EB8103AC130403CF01F003FC0F0660888 +:106FC0005808C5A040285808C0913FE904C93018A6 +:106FD000502860082FF12FF8810866F35803C0602D +:106FE000660B580BCE50661ACE7B5801EFF8101284 +:106FF000E5F10E00EFF80012F7B800FFEFF80A1203 +:107000005C78ACB8A988ACA8FE9FFDFD069B6ECC51 +:10701000F01F002DEF4C0058FE90FE51C2DB6FA810 +:107020006F9C70095D196F6870291AD91AD36EC8E0 +:1070300018921AD8302B4AAAEEFC00A4F01F0017B1 +:10704000EF4600588F268F1658025F1B6EB92FDD52 +:1070500058D95F081668EC081800FE90FE30E4F876 +:1070600001605808FE91FC15E4F801685808FE908C +:10707000FE26FE9FFC0E661804C8CACB800265740B +:107080008003D7848002670C8002663C80026370B4 +:10709000800264808003D8A080023A1A800264E4EF +:1070A00080028D9C8000917C800091E8800092009D +:1070B000800091DC80023AD8800271E48003D8F02D +:1070C0008002679C800271908003D9248002634C07 +:1070D0008003D9708003D8D08003D3E48003D930F3 +:1070E000EBCD40801897580CC0E0488BF01F00088B +:1070F0000E9CF01F0008EEFC00ACF01F00070E9C79 +:10710000F01F0006E3CD80808003D9AC8002634C81 +:107110008002653C8002D298800091E8EBCD40F877 +:10712000203D1896169414931295E06C00C8F01F39 +:1071300000151897C1C033C8F946006499F8F9449E +:107140000068F94300A430CA300B1A9CF01F000EEF +:107150006A2850286A0950096A181A9C5018F01FAA +:10716000000BEF4C00AC1A961898C0500E9C2FDD07 +:10717000E3CD80F80E9C1097F01F0005CF8B000028 +:1071800080028F24800091D08002D2C4800091E8D8 +:10719000189948A8700C580CC051C0D878FC580CED +:1071A000C0A078081238CFB1781816385E0C78FC79 +:1071B000580CCF815EFD000000007AB01899489805 +:1071C000700C580CC051C0C878FC580CC09078089E +:1071D0001238CFB178181638CF81782C5EFC5EFD5E +:1071E00000007AB0189B4888700C580CC0A0189901 +:1071F000300A2FFA72F95809CFD1149897085EFC1B +:107200001898CFDB00007AB05EFDD703EBCD40E0ED +:1072100048D81896169570075807C051C0E86EF701 +:107220005807C0B06E2C0C9BF01F0008CF916E0861 +:107230008B086E1CE3CD80E030088B08109CE3CDFA +:1072400080E0000000007AB0800091A0EBCD40C04B +:1072500048B70E966E095809C0B072F88D08129C96 +:1072600072D85808C0705D186E095809CF71E3CD07 +:1072700080C0129CF01F0003CEEB000000007AB02B +:10728000800091E8EBCD40C048D66C485808C0312A +:10729000C0880E987057109CF01F000A5807CFA1A5 +:1072A0006C6CF01F000930086C3C8D68F01F000505 +:1072B0006C8CF01F0004E3CD80C0000000008C90B7 +:1072C000800091E880014544EBCD40F8495718967D +:1072D000169314946E2B12952FFB6E3CA56BF01F2A +:1072E0000012C1D06E28A568F80809066E29A569A4 +:1072F000F8090009932593146E2AF4081504F80878 +:10730000000891336E188F3C2FFA1036EFF69A0171 +:107310008F2A3018300C8FC8E3CD80F8E3CFC0F847 +:1073200000008C90800091F4EBCD404CE0634DD395 +:10733000EA1310621896F01F000DF8030648A7899B +:10734000E06A03E8F20A0248F8080109121CF20A8E +:10735000024AF80304428D1ABF5CA743E60C010CF5 +:107360008D0CE3CD804C0000800145C4EBCD408006 +:10737000202D4A076E495809C2C06E581039C29074 +:107380001A9CF01F001D6E484009700A1439C2444F +:107390007018401BF40901091618C276F00B141F6F +:1073A000E06A03E8F20A024AE0694DD3EA19106282 +:1073B000F0090448A7491619F20A000C580CE08A93 +:1073C000000E300948DA6E6BF01F000D6E488F58C2 +:1073D0002FEDE3CD80801439C030301CCF3B7018C6 +:1073E000401B103BCFB4CD7B2019F028BDC0CD7B16 +:1073F00000008C9080027328800275188001455827 +:10740000D43149A0189516931492604C580CC2B010 +:1074100030060C940C91785778480A38C09018962A +:107420000E9C5807CF91F01F0012089CD8325BF3D6 +:107430005F0A782906395F081448E2081800CF006F +:107440005BF25F0A783904395F081448E2081800D3 +:10745000CE705806E1F70A04EDF71A052FF4F01F75 +:107460000005CDFB1894CE0B00008C908002736C4D +:10747000800091E8EBCD40FC18961695149212947A +:107480001093318CF01F00211897C3A0F01F00202B +:107490006E0A6E1B0C0AEA0B000B8F0A8F1BEE5B49 +:1074A000423FE08A000B2FFAEE3B42408F0A8F1BCF +:1074B000EE5B423FFE99FFF98F248F338F423008F5 +:1074C0008F58494C78495809C1D072081438E0895E +:1074D000001A2F0CC0A8F2CCFFEC72595809C0A0BA +:1074E00072081438E0890007103ACF617218103B17 +:1074F000CF348F599907F01F0008E3CF80FCE3CF0A +:10750000C0FC2F0CCF7B000080009200800273280B +:1075100000008C908002736CEBCD40E0202D49661A +:107520001A9CF01F00166C475807C1F040096E08FE +:107530001238E089001B3005C05840096E08103928 +:10754000C1451039C0516E1940181238C0E56E5847 +:107550008D558D486E3B6E486E2C5D180E9CF01F4D +:1075600000086C475807CEA1F01F00062FEDE3CFAF +:1075700080E0000000008C9080027328800091E879 +:107580008002736CEBCD408049A76E3E580EC2B0AE +:107590006E2A580AC280E08A002B7C081838C27014 +:1075A000FCC9FFF0300BC05872082F091838C050C2 +:1075B0002FFB163AFE99FFFA143BC170201A163AB7 +:1075C000C0F0161AF60C1504A56AFC0C000C2FFB73 +:1075D000A56BFC0B000BF01F00086E2A201A301858 +:1075E0008F2A8FC8E3CD8080E3CD8080300BCE7BA7 +:1075F00000008C90800091C4EBCD406048861895C7 +:10760000334A300B0C9CF01F0007ECCCFFE88D05D3 +:10761000301BF01F0005E3CF8060000000008C905D +:10762000800091D0800144F80050F2010100000078 +:107630000000000000000000F6F800DC5808C05010 +:10764000F8F800F85808C0205EFDF6FB00D0580B93 +:10765000CFC076085808C04176185808CF602F8BE5 +:10766000CF9BD703EBCD4080300B1897F01F001352 +:10767000306A300BEECCFF64F01F0011306A300B23 +:10768000EECCFF5EF01F000E300BEEFC00E0F01FB2 +:10769000000D300BEEFC00E0F01F000BEEF800BC1C +:1076A0005828C030E3CD8080EEFC00E0300BF01FA6 +:1076B0000007E3CD80800000800217D0800091D0C9 +:1076C000800261E8800261D4800261A4EBCD408039 +:1076D0001897F8F800945808C160300BF94B0094E3 +:1076E000F8F800D470985808C040F8FC00C45D1841 +:1076F000486A302B0E9CF01F0006300A0E9C149B2B +:10770000F01F0004E3CD80808003D9D480023A1AB0 +:1077100080022584D431209D500C761558155F9831 +:107720007607169058075F1910693008F00918009D +:10773000E08000B8EEC4FFFF0989F2C6FFFE0C35F9 +:10774000E08500B010923DD33301C168E208180013 +:10775000C2800C0758155F9958075F181268E40833 +:107760001800E080009EEEC4FFFF0989F2C6FFFE0C +:107770000A36E08900960C150F88E6081800CE71CD +:10778000305AF4091800FE98FFE6EECCFFFE306A8E +:107790004DFBF01F0060C0B00F88E2081800CDA1BB +:1077A00009883019F2081800FE98FFD540080E9B92 +:1077B0000C9AF0FC00DCF01F00581897C711400A23 +:1077C000FACBFFFCF4FC00DCF01F0054C21540793A +:1077D0005809C1E040685808E0890007C19840682E +:1077E0001037C1644079EE0B1504F20B000B400911 +:1077F0003008F2FC00DC2FF71099109AF01F0048B7 +:10780000CEF14008301BF0FC00E0F01F004660465F +:10781000605558065F1958155F981069C760ECC429 +:10782000FFFF0989F2C7FFFE0E35C6F53003069249 +:107830000691C1A85802C0610D88330AF4081800E7 +:10784000C3A00E060E1558065F1858155F991268EA +:10785000E2081800C3F0ECC4FFFF0989F2C7FFFE7D +:107860000A37E08900385803CE610D883DDAF40804 +:107870001800CE113058F0091800FE98FFDD306A6C +:107880004A3BECCCFFFEF01F0023CD5140090E9A7D +:107890000C9BF2FC00DC3013F01F0023CCCB600704 +:1078A0005807CB604009300AF2FC00DC149BF01F43 +:1078B000001ACAEB09883019F2081800FE98FFC3B5 +:1078C00040080E9A0C9BF0FC00DC3012F01F0017F1 +:1078D000CB9B5803C0F05802C0B160485808C08024 +:1078E0004008049AF0FC00DC049BF01F00102F7D80 +:1078F000D83260465806CF004009300AF2FC00DC5E +:10790000149BF01F0009CE8B3002CF5B80027628DB +:107910008000917C8002B5EC8002C04C8002938094 +:10792000800255968002B58C8002B52CD431FACDF8 +:10793000009018911497586BE08B00C4FEF807482C +:10794000F00B032F580AC0A0F8F800907009739A42 +:10795000580AC0410E9BF01F01CD304B029CF01F16 +:1079600001CCE2F801185808E0810312FAC7FF942D +:10797000E2F800D470285808C4C00E9BE2FC00C492 +:107980005D18C475E2C6FF64306A0C9B0E9CF01F44 +:1079900001C1C3F0FB3800711AD8FB3900741AD941 +:1079A000FB3800771AD8FB39007A1AD9FB38007DEA +:1079B0001AD8FB390080FEFA06DE1AD9301B029C69 +:1079C000F01F01B6306A0E9B0C9CF01F01B5306AA7 +:1079D000300BE2CCFF5EF01F01B3E2FA00BC2FAD2A +:1079E000584A5F08590A5F091248C081588AE080E6 +:1079F000030C0E9B029CF01F01ACE2F80090704952 +:107A00005819E08102D5E2F800B05808E08002D0B1 +:107A1000FB3800711AD8FB3900741AD9FB3800778B +:107A20001AD8FB39007A1AD9FB38007D1AD8FB39ED +:107A30000080302B1AD9FEFA0672029CF01F0197C3 +:107A4000E2FB00B02FAD580BC040029CF01F019824 +:107A50000E9BE2FC00DCF01F0197622CF01F0196E8 +:107A6000300BE2FC00E0F01F0195300BE2FC00E07F +:107A7000F01F0193E2F800BC5828C061300BE2FC13 +:107A800000E0F01F0190301BE2FC00E0F01F018BD2 +:107A9000300BE34B00F4E2F900BC59095F0A584986 +:107AA0005F081448F6081800E0800216029CF01FD8 +:107AB0000186307B029CF01F0176029CF01F01833F +:107AC0002DCDD832580ACFD0149B7439F8FC00DC85 +:107AD000742AF01F017F2DCDD832F8FB00BC590B62 +:107AE000CF00F8F800E85858E08002355838E08BAD +:107AF0000234E2C7FF64306AFEFB05D80E9C2F8B70 +:107B0000F01F0164EE0B1710E06800A2E3D8E00B51 +:107B1000029CF01F0171E2FC00DCF01F0170FEFA14 +:107B200005BE302B029CF01F015DE2FA00BC584AF2 +:107B30005F08590A5F091248C0B1588AE08002976D +:107B400030080E9BE3480104029CF01F0157029C81 +:107B5000F01F01642DCDD832FEFA058C303BF01FAA +:107B6000014F5807E08002806E0858085F1B169A84 +:107B7000E2FC00DC301BF01F015DFACCFF94F01F2B +:107B8000015CE2F800985808E08001D541B9F2089C +:107B90000108E048003CE08A01A6E34900982DCDA9 +:107BA000D832F01F0154E08501EBE2F900907248F1 +:107BB0005828C870E2F800AC5808C831E2FA00CC86 +:107BC0001094500AE2F000D072285808E08A00A908 +:107BD000300850187218401AF00A032850585800FC +:107BE000E08A0097400530020A96C11808973003D2 +:107BF00030142FF2ECC6FF6404305F983009E9E8D6 +:107C00000008F2081800E08000970E940C9B029C7C +:107C10000C93F01F0139C05078385818FE99FFE8CE +:107C20006D585808C051ECF800805808CE004059F3 +:107C30005809CDD0ECC8FFFAECCAFFA8ECC9FFD4B4 +:107C40005048502A50394057C0486E175807CCF05A +:107C5000EEF801945808CFA16CAA6E58103ACF6183 +:107C60006E4B404CF01F010BCF116E885808E0811D +:107C700000E16F6AEDBA0001C061ECFB0080580BB7 +:107C8000E08100E3F1DAC001300AF4081800CDE029 +:107C90006D5B580BCDB0FACAFF94403CF01F011742 +:107CA000CD516F6841B91268CD106F3841C9126863 +:107CB000CCD06F4841D91268CC906F5841E9126816 +:107CC000CC5058065F04C96B149BF01F00F02DCDFB +:107CD000D832149B2EACF01F010A1896FE91FEF2CA +:107CE0006F9B580BE080012A581BFE91FEEBE34B83 +:107CF00000D8029CF01F00FB622CF01F01028326BB +:107D0000CE0A5803E08100BF0E94E2F900904018BB +:107D10002FF850187228401A103AFE95FF5DE2F8CD +:107D200001085808E0800121029CF01F00F7E2F9E9 +:107D30000090C4BB5804CE600E923006C108049770 +:107D4000089930032FF6EAC5FF640C305F98F3E81A +:107D500000083009F2081800CD500E920A9B029CD0 +:107D60000A93F01F00E5C05078385818FE99FFE9D3 +:107D700040585808CE50EACAFFFA4057506AC078B7 +:107D80006AA8103AC5006E175807CDA0EEF8019406 +:107D90005808CFA16E5A580ACF416E885808C1E1E1 +:107DA0006F5BEDBB0002C040EDBB0003CED1F1DB49 +:107DB000C002C0806B585808CE71EAF8008058089D +:107DC000CE31EEF8014C5808C110EB190088EDB91E +:107DD0000001CDA058055F09CB6B306AEECBFFE800 +:107DE0000A9CF01F00ACCD01CDCB1099EEC8FECCA3 +:107DF0002FF9700A580AC2612FC85849CFA1EDBBAC +:107E00000003C071EEF800F0F1D8C002F9BA010128 +:107E1000EB190088EDB90004C030580A5F0A580A0F +:107E2000CB30CD6B6E4B406CF01F009ACAD1CB6B40 +:107E3000306AEECBFFE80C9CF01F0096FE91FF0726 +:107E4000C19B301ACDDBFACAFF94402CF01F00AB67 +:107E5000C0306F6AC18B6F6A41B8F5E80008FE90C8 +:107E6000FF136F3841C91268FE90FF0E6F4841D969 +:107E70001268FE90FF096F5841E91268FE90FF04F6 +:107E8000C21BE2F800A85808C131306AE2CBFF6497 +:107E9000069CF01F0080C170E2F800E85838C081ED +:107EA000306AE2CBFF5E069CF01F007AC0C00E9BDA +:107EB000029CF01F007FE08100B50E9A069B029C99 +:107EC000F01F0092009A400BE2FC00DCF01F0090D3 +:107ED000FE9FFDF8169A029C30ABF01F008EFE9FAD +:107EE000FDEE3017FEFA0230303B029CE34700946F +:107EF000F01F006AE06B2710300CF01F0088E2F8DA +:107F000000D470985808C0500E9BE2FC00C45D1865 +:107F100030EB029CF01F0082300A029BFEFC020440 +:107F2000F01F0081300802994FEA109B33CCF01FFC +:107F3000007F41B9FE9FFE33E2F800D85808FE905A +:107F4000FDC1E34B00D8029C301BF01F0079FE9F5F +:107F5000FDB9582BC780E07A86A0300B029CF01F39 +:107F60000075FE9FFDC8305BE2F801105818C7206D +:107F7000029C300AF01F006FFE9FFDA4E2F9009002 +:107F800072485828FE90FD9E301BCEFBFAC7FF9426 +:107F9000E2C6FF64306A0C9B0E9CF01F0041E2F8C1 +:107FA00001185808FE91FCF8FE9FFCE4029CF01FAB +:107FB00000621896C230F8FB0194580BC1F1795851 +:107FC000E2180013C351189B029CF01F005CE2F8FA +:107FD00000B05808C0701036C050E2FC00E0F01F3E +:107FE0000058E2FC00DC0C9BE34600B0F01F00559B +:107FF000029CF01F0055FE9FFD0D029C303BF01FC0 +:108000000053FE9FFD5FE2F800B05808FE90FCF3BD +:10801000F0F800F0F1D8C002FE91FCEDFE9FFCEFFD +:10802000029C300A30ABF01F0043FE9FFD4B350928 +:10803000FAC8FF70189A10D9029CFAC9FFE4F01F21 +:108040000044CC6B4C3AF01F0015E2F800E8FE9FAC +:10805000FD4F72485818F9B80002E3F80A44F9BB1A +:108060000000C87B0E9BFE9FFD84E2F800B058081C +:10807000FE90FD68F0F800F0F1D8C002FE91FD62BC +:10808000FE9FFD678003D9B880027714800217D065 +:108090008000917C8003D9F880023A1A800091DC3C +:1080A000800091D0800226948003DA3880027638EE +:1080B0008002BA4C80028172800261E8800261D441 +:1080C000800261A480021CE080021DB88002979C9F +:1080D0008002762880021AE08002BA1C8003DAA8A7 +:1080E000800276648003DAE48002D19C80028F549F +:1080F00080021E84800218F88002BD68800091A072 +:10810000800281748002189C800230DC800298A476 +:108110008002246C8003DB0480028F1C800228D83C +:10812000800276CC800274008002747480022794EE +:10813000800225848002195C800222A480025748B4 +:108140008002B9D48002237080022FCC80021F30BD +:108150008003DA68580C5E0E5E1DD401201D3008C5 +:10816000767C3009BA881A9A7668129B5D182FFDC2 +:10817000D8025EFCEBCD40801897580CC090789CDC +:10818000580CC035F01F00040E9CF01F0004E3CD16 +:108190008080000080027584800091E8EBCD40F87B +:1081A0001896129510944063328CF01F000B1897AC +:1081B000C0F00C9B311AF01F00093FFC8F658F74D3 +:1081C0008F838F9C30090E9A485BF01F00060E9C2F +:1081D000E3CD80F880028F24800091AC8002815A28 +:1081E000800272C8D4011698306AF8CBFFEF109C59 +:1081F000F01F0002D80A0000800091DCD431213D3C +:1082000076FE511E760A503A761950497628505813 +:10821000763E506E764A507A7669508976785098D4 +:10822000768E50AE769A50BA76B950D976C850E864 +:1082300076DE189850FEF8C9FFF876EA510A7654AF +:1082400076AB500C5019E02BA44F50CB110EF8CB4D +:10825000FFF45008512E403A700340487205502BED +:10826000E069A478EA19D76AFC0900091409760ABA +:10827000E06BB756EA1BE8C7F40B000B100BF5E5F3 +:108280002008066814581009E06870DBEA182420FA +:10829000EBE3200AF20E1507FDE9139E060EFDEA38 +:1082A000000A0A5A1005140BFDE32008F606150C07 +:1082B000EDEB13461C06EDE800080658405AE0694D +:1082C000CEEEEA19C1BD14051005EDEE2008EA0B4B +:1082D0001511F7E512FB0C0BF7E800081C58120308 +:1082E0004069120310034078E6051516E0690FAFE8 +:1082F000EA19F57CEBE312A5F00900091605F7E68B +:108300002008EBE800080C581C091009EBEB2008CA +:10831000F2031507E7E913930A03E7E80008165884 +:10832000E06AC62AEA1A4787E80A000A0C0A100A15 +:10833000E7E52008F402150CE5EA13420602E5E839 +:1083400000080A58408EE0694613EA19A830FC0973 +:10835000000916091009E5E32008F2061511EDE9F8 +:1083600012F60406EDE800080658409AE06B950105 +:10837000EA1BFD46F40B000B0A0B100B40A840C98A +:10838000F60E1516FE395BB1FDEB12AEE06A98D819 +:10839000EA1A69800C0E40BBF00A000AEDE22008E0 +:1083A000FDE80008045840C1060A50C9100AE069F7 +:1083B000F7AFEA198B44FDE62008F6090009F40B33 +:1083C0001507F7EA139B1C0BF7E800080C58F7EEAB +:1083D000200A0C0104091009F206150CEDE91346F8 +:1083E0001606EDEB2008EDEA000A1C5A1401E2051E +:1083F0001511EBE112F50C05EBE80008165840DA10 +:10840000E069D7BEEA19895CF40900091C09100962 +:1084100040E8F20E1516E06A1122EA1A6B90FDE9A7 +:1084200012AEF00A000A0A0EEBE62008160AFDE872 +:10843000000840FB0C58E0697193EA19FD98100A96 +:10844000F6090009FDE52008F40B1507F7EA139B70 +:108450001C0BF7E800080A580C0910094108F2063D +:10846000150CE06A438EEA1AA679EDE91346F00A84 +:10847000000A1606F7EE2008EDE800081C580A0A64 +:10848000100A4118F4051511E0690821EA1949B4E8 +:10849000EBEA12F5F00900090C05EDEB2008EBE81A +:1084A000000816581C091009F2031516E7E912A373 +:1084B0000A03E7E520080C680A58404EE06A256286 +:1084C000EA1AF61EFC0A000A160A408B100A40D867 +:1084D000F40E1505E069B340EA19C040FDEA13BE89 +:1084E000F6090009060E403B0C09E0665A51EA16EF +:1084F000265EF0060006FDE320080A68065810090B +:10850000E062C7AAEA12E9B6F6020002F20B150908 +:10851000F7E9137B41191C0BF7EE200806681C587D +:108520000A0606021006E063E681EA13D8A1F20308 +:108530000003EC09150EF3E613291609F3EB2008E6 +:108540001C68165840CA10024078E065105DEA15B4 +:10855000D62FE0611453EA110244E8050005F40146 +:1085600000011C051601E40A1514E06EFBC8EA1EA2 +:10857000E7D3F5E212CAF00E000E120AF5E9200860 +:10858000166840BB125812031005E066CDE6EA16E5 +:1085900021E1F6060006EA0B1505F7E513BB140BFF +:1085A000F7EA2008126841091458E06507D6EA1571 +:1085B000C3371001F2050005E2091509F3E113794B +:1085C0001609F3EB20081468165810034068140EBF +:1085D0001606E60A150EE0620D87EA12F4D5F5E3F9 +:1085E000132AF0020002120AF5E92008166840ABCF +:1085F00012581205100EE06314EDEA13455AF60303 +:108600000003FC0B1514F7EE12CB140BF7EA20084D +:10861000126840F91458E061E905EA11A9E310066F +:10862000F2010001EC091505F3E613B91609F3EBA5 +:10863000200814681658100540581402E066A3F884 +:10864000EA16FCEFEA0A1509F0060006F5E5137ACA +:10865000120AF5E9200816681258409E1002160307 +:10866000E40B150EF7E2132B140BF7EA200812683F +:108670001458E06502D9EA15676F1003FC05000580 +:10868000E60E1514FDE312CE160EFDEB200814685D +:1086900016581201100140A840E91406E060F68166 +:1086A000EA108771E20A1505F0000000F5E113BA3F +:1086B0001C0AF5EE200816681C58E0624C8AEA1283 +:1086C0008D2A1006F2020002EC091509F3E613796F +:1086D0001409F3EA20081C681458160540DB10053D +:1086E0004108E434C6BEE0616122EA116D9DE80AEA +:1086F0000007F6010001E066380CEA16FDE5F00619 +:108700000006EA08150EF1E513281208F1E9200B1E +:10871000F7EA000A125A1C021402407A404E120074 +:108720001001E063CFA9EA134BDEF4030003E40A6F +:108730001514F5E212CA100AF5EB200BF5E8200833 +:10874000EE0B000BF6091504F3EB13C914091258CC +:1087500014061000F3EA200AE065EA44EA15A4BE14 +:10876000E008150BFC050005F1E01358120512088E +:10877000105A10031401F1E92009E20B1510F7E17A +:10878000130B100B1659F7E820081206EC0E1517FC +:10879000FDE6129E160E1C5810054098FDEB200AAF +:1087A000EA061504E0694B60EA19F6BBEDE513C66D +:1087B000F00900091C0616090C5AEDEE20081403F6 +:1087C00040CBE605150BEBE313550C050A58E06AA0 +:1087D000BC70EA1ABEBF1009F60A000AEBE62008D0 +:1087E000F20B1510F7E9130B0A0B16581C0A100AA6 +:1087F00040F8F40E1517E0697EC6EA19289BFDEAD9 +:10880000129EF0090009160EF7E520081C580C0905 +:1088100010094038F2061504E06A27FAEA1AEAA1BC +:10882000EDE913C6F00A000A1C06FDEB20080C58FF +:108830000A0A100A4068F405150BE0693085EA1948 +:10884000D4EFEBEA1355F00900090C05EDEE200812 +:1088500016090A58408B1009E06A1D05EA1A0488B7 +:10886000EBE62008F60A000AF20B1510F7E9130BE5 +:108870000A0B16581C0A100A40B8F40E1517E069C6 +:10888000D039EA19D9D4FDEA129EF0090009160E72 +:10889000F7E520081C580C09100940E8F2061504F9 +:1088A000E06A99E5EA1AE6DBEDE913C6F00A000A88 +:1088B0001C06FDEB20080C580A0A100A4118F405A2 +:1088C000150BE0697CF8EA191FA2EBEA1355F009D1 +:1088D00000090C05EDEE200816090A58405B100946 +:1088E000E06A5665EA1AC4ACEBE62008F60A000A0C +:1088F000F20B15101C0AF7E9130BE0692244EA1980 +:10890000F4290A0B1658100A4032F40E15171202F9 +:10891000FDEA129EEA0811FF160E409AFDE81008C3 +:10892000E069FF97EA19432A1658F40900090A0971 +:108930000C0241061002F60811FFE40A1506F5E2E2 +:1089400013AA1C0AF5E810081C58F2080005E06993 +:1089500023A7EA19AB941206FC0811FFEC0B000BDD +:10896000EA06150AEDE513661406EDE8100814583A +:10897000F6080008E069A039EA19FC93F00B150F1E +:10898000FA243942F7E8131BE80900050C0BEA0E3C +:10899000000EF40811FFF7E810080C58E06959C3FD +:1089A000EA19655BFC08000540E2EA0E15151202A3 +:1089B000FDE512BEEC0811FF160EFDE81008165872 +:1089C000E40A000AE069CC92EA198F0CF40800026C +:1089D0004068F00900090C09E40A1506F60811FFC1 +:1089E000F5E213AA1C0AF5E810081C58F208000268 +:1089F000E069F47DEA19FFEF40C1FC0811FF1201A4 +:108A0000E406150AE20B000BE0695DD1EA198584E2 +:108A1000EDE213661406EDE8100814584045F60818 +:108A200000011205E20B150FEA0E000EF7E1131B11 +:108A3000F40811FF0C0BE0697E4FEA196FA8F7E804 +:108A4000100840A30C581203E60A000AFC080005AF +:108A5000EC0811FFEA0E1515FDE512BE160EFDE835 +:108A600010081658F4080003411AF60811FFE069CF +:108A7000E6E0EA19FE2CF4090009E60A15060C09DD +:108A8000F5E313AA1C0AF5E810081C58F2080003C5 +:108A90004088E0694314EA19A301F00900091609A6 +:108AA000FC0811FF40FBE605150AEBE3136514050E +:108AB000EBE810081458F2080008E06911A1EA195F +:108AC0004E08F6090009F20E000EF006150FE069D7 +:108AD0007E82EA19F753EDE81316F40811FF0A062F +:108AE000EDE810080A58FC080001407E120EEA0862 +:108AF00011FFFC0A000AE20E1515FDE112BE0C0E74 +:108B0000FDE810080C58F40800094128F20A15067F +:108B1000F5E913AA1C0AF4080009E068F235EA181E +:108B2000BD3A990940D91009EC0811FFF205000B74 +:108B3000F5E8100840091C58720CF6080001E069BD +:108B4000D2BBEA192AD740581208E20B150AF006E0 +:108B50000009F7E1136BFC0811FF140BF7E810088C +:108B60001458F208000640B8E069D391EA19EB8680 +:108B7000F0090009F20E0008F40A11FF400EEC099A +:108B8000150FF3E613191609F20C000CF3EA100A9C +:108B9000165AF00A0006EC081515F1E612B8100C8A +:108BA0009D0C401A7408120895084028700916098F +:108BB00091092EDDD832D703EBCD40E03809764855 +:108BC000F1D8C066F608000AF56900181895F00A91 +:108BD000113F1697F6080008F0CCFFE7587AE08BB3 +:108BE0000056300BF01F002DEEC6FFE8EECCFFA8BC +:108BF0000C9B1798178917BAF3E8108917A8F1EAA0 +:108C00001088F3E8110916A9183BCF410C9B0E9C64 +:108C1000F01F0023338A300B0C9CF01F00200C9BAC +:108C2000ECCCFFC81798178917BAF3E8108917A872 +:108C3000F1EA1088F3E8110916A9183BCF416E48F4 +:108C40006E590C9B0E9CEF480050EF490054F01FEA +:108C500000140E9BEECCFFF01798178917BAF3E8B3 +:108C6000108917A8F1EA1088F3E8110916A9183B32 +:108C7000CF410E9B0A9C310AF01F000A0E9C304A1D +:108C8000300BF01F0006E3CD80E0208A300BEEC6EB +:108C9000FFE8F01F0002CC4B800091D0800281FCE5 +:108CA000800091DCEBCD40FC1493784AF40300384B +:108CB000103AF9F98005F9F9B005F7B90BFFF9F9A0 +:108CC000BA059948E608161DF20800089958189444 +:108CD0001692F1DAC066C381F8C5FFE8E043003FB1 +:108CE000E088002C3006EAC7FFC0E406000B340A17 +:108CF0000A9CF01F00290A9B1798178917BAF3E8F6 +:108D0000108917A8F1EA1088F3E8110916A90E3B9B +:108D1000CF410A9B089CF01F00212C06E6060108A3 +:108D2000E048003FFE9BFFE3E6C80040E7D8C006EE +:108D3000E018FFC02C081002069A049B0A9CF01F42 +:108D40000016E3CD80FCF00711402E88100C0E3386 +:108D5000C1D30E9AF01F0010E8C5FFE8E8CCFFA8C9 +:108D60000A9B1798178917BAF3E8108917A8F1EA30 +:108D70001088F3E8110916A9183BCF410E130E0213 +:108D80000A9B089CF01F0005CAAB069AF01F000260 +:108D9000E3CD80FC800091DC800281FCEBCD40FCC7 +:108DA000216DE0682301EA186745E06EAB89EA1E91 +:108DB000EFCD30075008501EE068DCFEEA1898BA84 +:108DC000E06E5476EA1E1032504750575028503EFD +:108DD00018931292580CC140149416951A962FF7B6 +:108DE000090A0B0B1A9CF01F00080E33FE9BFFF9BB +:108DF0001A9B049CF01F00052EADE3CD80FC1A9653 +:108E0000CF8B000080028CA480028BB8D431FACDC5 +:108E10000088501C500B14931292109142B0585A73 +:108E2000E08B0056E04B0040E08B0054FAC4FFF8A2 +:108E3000340A300B089CF01F002E400A401B089C8F +:108E40000896F01F002CFAC5FFB808970D88EC189B +:108E500000360CC80A36CFB1340851845128580363 +:108E6000C110FACCFF9CFACBFFB4300AE60E150213 +:108E7000E40A030818A8E20A030916A92FCA1C3A33 +:108E8000CF81E6CCFFFF00990A9AFAC3FFA0069BA8 +:108E9000F01F0019340A300B089CF01F0015400A1F +:108EA000401B089CF01F00130F88EC18005C0EC8D4 +:108EB0000C37CFB1310C3408513C5184519000999A +:108EC0000A9A069B5128302CF01F000B2DEDD8324A +:108ED000FAC6FF881A9A0C99FACBFFFC301CF01FD7 +:108EE0000006310850165008CA2B0000800091D0AF +:108EF000800091DC80028D9CD401202D501A5009F5 +:108F0000301A1AD8FAC9FFF8FAC8FFFCF01F00039C +:108F10002FFD2FEDD802000080028E0C5EFC5EFE5D +:108F20005EFCD703EBCD40C01896F01F00061897E3 +:108F3000C0500C9A300BF01F00040E9CE3CD80C093 +:108F400080009200800091D0D401F01F0002D80A66 +:108F500080014600D401F8CBFFFCF01F0002D80AC4 +:108F6000800145D4780C580C5E0C3008F948004C50 +:108F7000780C580CCFC15EFC580CF9FC10435EFC19 +:108F8000580CF9B80100F9F81A435EFCEBCD40E04B +:108F9000189716961495314CF01F0005F9F71A032F +:108FA000F9F61A04F9F51A02E3CD80E080028F2465 +:108FB000EBCD40E01696149578075807C160580627 +:108FC000C080306A0C9BEECCFFC0F01F000AC0A12D +:108FD0005805C0B0EECCFFFC310A0A9BF01F00051B +:108FE000C0406E075807CEC10E9CE3CD80E0000064 +:108FF0008000917CEBCD4040781820181696991887 +:10900000784B78390C9C5D190C9CF01F0003E3CD64 +:1090100080400000800091E8EBCD4080202D300A98 +:109020001897189B49BCF01F001C300A0E9B49BCC6 +:10903000F01F00196E085808C2201A9CF01F001873 +:109040006E08400A70EC0E993008141C109BF8084A +:109050000C4C490A2FFCF01F00136E2BF6FA010C82 +:10906000580AC1006E08400A712C0E99141C300871 +:1090700048AAF8080C4C109BF01F000A2FEDE3CD16 +:109080008080F6CBFEB80E9CF01F0007CF80CEBBD1 +:10909000800290E4800274008002913080028F543C +:1090A0008002747480028FB0EBCD40C01896580CCB +:1090B000C1407809300899085809C031C0880E9914 +:1090C0007207129CF01F00065807CFA10C9CF01FDE +:1090D00000050C9CF01F0002E3CD80C0800091E8E9 +:1090E00080029018EBCD4080202D18971A9CF01F1D +:1090F000000E6E0A580AC0C1C1087408149B8F087C +:10910000300A0E9CF01F00096E0A580AC06074E90C +:1091100040081039FE9AFFF30E9CF01F00052FED5A +:10912000E3CD808080028F5480028FF480029018FB +:10913000D4013008782AF548010C7829F2FC0104A2 +:10914000F01F0002D8020000800255ACD43120CDBF +:109150001096782814941293E04A00205FBAF0F930 +:109160000160189758295F18169241511448C05051 +:1091700030060C9C2F4DD832354CF01F00621890F1 +:10918000CF80089A049B2ECCF01F005F81D4FAC9CF +:10919000FFE450965083FAC5FFF84DC81AD5303A0F +:1091A000089B049C4DA65086F01F005AE0C8FFFCA7 +:1091B0000A9B5018310A109CF01F0053FACCFFD4C0 +:1091C000F01F0055E0C8FFC0502840BC6E29F2F8DF +:1091D0000150F808000881E86E2AF4FB0150F4F908 +:1091E0000154E06A851FEA1A51EBB739F20A0648C2 +:1091F000301AA599180981FAE1490048306A402CD3 +:10920000069BF01F0041E141004C2FFD6E06580601 +:10921000C2903005C0680C956C0C580CC58018962F +:10922000ECCBFFC0306A069CF01F003CCF516CD8DD +:109230000838C5505805EDF80000EFF80A00EDF8C1 +:109240001000EBF81A006E29F2F8010C0C38F9B88E +:109250000000F3F80A430C9B301A0E9CF01F0030FC +:109260006E066E1859F8E08A00155806C3200C9A4D +:1092700015088F086E28F0F90128ECCBFFC0720C9E +:1092800072F85D180C9B300A0E9CF01F00256E06CC +:109290005806C1F060EA6CE8103AC074C1A872E8E0 +:1092A0001438E089000612966C095809CF9181099B +:1092B0008D006E2C6E18400A401B2FF88F18F8F99D +:1092C00001280096720C72E85D18C54B6E06CCAB97 +:1092D00081068F000E9CF01F0013CECB089A049BD2 +:1092E000ECCCFFECF01F000DCA61310A400BECCC56 +:1092F000FFFCF01F000AC9F1009CF01F000BC3AB7C +:1093000080028F24800091DC8003DB248003DB9CBF +:109310008002B14480028F548000917C80028FF4DF +:1093200080029018800091E8EBCD4080189E78076D +:10933000580BC06116970E9CE3CD80806E075807CE +:10934000CFB06F381638CFB11AD814997C286EDA9E +:10935000F0C8FEC8EECBFFEC1C9CF01F00092FFDEF +:10936000580CF8071700EFF8100EF9F81A0EF80766 +:109370001710F9B80101F9F81A14CDEB8002914CDD +:10938000EBCD40FC1897300CEF4C010C1496129268 +:109390001094EEF50108580BC080169A189B0A9C91 +:1093A000F01F0016EF4C010C58065F13EEFC010C89 +:1093B000580C5F09F3E30008C16158045F18F3E833 +:1093C0000008C0A05803C0800C9A049B0A9CF01FA0 +:1093D000000CEF4C010C580CF9BC00FFF9BC01006B +:1093E000E3CD80FC300A0C9B0A9CF01F00045F094F +:1093F000EF4C010CCE3B000080028FB0800293281E +:109400000000000000000000EBCD4080580CC100BF +:10941000F8F901103008F94801105809C031C08826 +:109420000E997207129CF01F00045807CFA1E3CDDC +:1094300080800000800091E8EBCD40C01897580C68 +:10944000C250F8F801245808C210189B300A491C71 +:10945000F01F0011EEFC0124F01F00103006306AEE +:109460000C9BEF460124EECCFEE4F01F000DEEFC59 +:109470000114F01F000CEF460114EEFC0118580C0B +:10948000C050F01F0008EF460118E3CD80C0000077 +:109490008002996880027400800256EC800091D0AE +:1094A00080028174EBCD40F8205D189716951494D6 +:1094B000F8F601245806C0503FFC2FBDE3CD80F8DC +:1094C000F8FA012817D81AD817C91AD917B81AD80C +:1094D00017A91AD917981AD81789301B1AD9740CDA +:1094E0004C6AF01F0047EEC3FEC81AD60E984C59BE +:1094F000E06A88C7069BEEFC0140F01F0043EF4C7A +:1095000001142F9D580CC6F0EEFC0144580CC0E02D +:109510001AD6069B0E984BB9E06A88C7F01F003A2E +:10952000EF4C01182FFD580CC5E0340CF01F00372C +:109530001896C5B0EEF8012870099909EEF80128CF +:109540003019700A4B2899199928994A99374B185C +:10955000EEF9012C998899599967EEF8012871095B +:1095600099A9EEF80128711999B9F01F002BEF4C59 +:109570000124C3D0314A300B1A9CF01F0028EEF9A9 +:1095800001305804E9F8105FFBF81A03300650293F +:109590001A9A089B50165006EEFC0124F01F00207A +:1095A000306830593FFAEEFC0124149BF01F001D77 +:1095B000306A0A9BEECCFEE4F01F001B301BEEFC71 +:1095C0000124F01F001A301BEEFC0124F01F0018CC +:1095D0000C980E99497A0C9BEEFC0158F01F00166E +:1095E0000C9CC6CB3FECC6AB3FCCC68B0C9CF01F93 +:1095F00000133FDCC63B00008003DBA880023A1A60 +:1096000080029AF08002819C80028F2480029A243A +:10961000800299C48002609C800091D08002581C16 +:1096200080025564800091DC800261D4800261E890 +:109630008002996880027474800091E8EBCD40FC50 +:109640001897F8F801105808C6F0F8F801284CAA45 +:10965000700C301BF01F0049EEF801245808C0A020 +:10966000EEF801284C6A700C301BF01F0044E3CD6B +:1096700080FCEEF801605828CF41EEF80128700C0C +:1096800070295D19587CCED1EEF8016C5818CE9136 +:10969000EEF501105805C410EEC2FEB8EAC3FFFC97 +:1096A000300A069BEEFC0108F01F0036306A189461 +:1096B000069B049CF01F0034C0605804C3706948C6 +:1096C0005808C341EB3800091AD8EB3800081AD8FB +:1096D0000BF81AD80BE8EEF601281AD80BD91AD9CC +:1096E0000BC84AAA1AD8301B6C0CF01F00242FADEF +:1096F0005804C090EEF90128E8CAFFFC069B720CE2 +:1097000072E85D186A080A9CEF480110F01F0020FB +:10971000EEF501105805CC31EEF8012849DA700C4D +:10972000301BF01F0016E3CD80FCEB3800091AD87F +:10973000EB380008EEF601281AD80BF81AD80BE817 +:109740001AD80BD91AD90BC8493A1AD8301B6C0C45 +:10975000F01F000A6A08069BEEFA0134EF48011078 +:109760000E9CF01F000E0A9CF01F00092FADE3CDE8 +:1097700080FC00008003DBEC80023A1A8003DC14DA +:1097800080028FB08000917C8003DCA0800091E893 +:109790008003DCFC8003DC4C800294A4EBCD40F819 +:1097A0001695189414931297F8FB0134580BC05077 +:1097B000F6F801485808C5D15807C4C0E8F60110AA +:1097C0005806C4A03007C0680C976C0C580CC440F5 +:1097D0001896306A0A9BECCCFFFCF01F002CCF518E +:1097E0005807EDF81000EFF81A00EDF80000E9F85E +:1097F0000A44E04303E7E08A003BE8FA0110580A14 +:10980000C4006C3B74381638C065C3B8723816385B +:10981000C054129A74095809CFA18D0995061AD31C +:109820000BD80B8CE8F601281AD80BC91AD90BB83B +:109830001AD80BA91AD90B98495A1AD8301B1ADC16 +:109840006C0CF01F0014089CF01F00132F9DE3CD3B +:1098500080F8E3CD80F8310CF01F00101896C0F0AE +:10986000306A0A9BECCCFFFCF01F000D8D33CC6BF3 +:109870000A9AF8FC0108F01F000BC9FBE3CD80F841 +:109880008D0AE9460110CCCB8000917C8003DD2459 +:1098900080023A1A8002963C80028F24800091DC7C +:1098A00080029328EBCD40F8208D169414971895DC +:1098B000F8F801345808C470F01F0027EEC6000104 +:1098C000C426E068009C1A93EC080248E8080007E8 +:1098D000EAC4FEB8C0682016EEC7009C5806C3351F +:1098E000EAF901346EAA7258103ACF61724BEECC8D +:1098F000FFFAF01F001ACF01306A089B0E9CF01F80 +:109900000017CEA0EEFB0080580BCE601A9AEECC6A +:10991000FFA8F01F0013CE01189A0E9BEAFC010865 +:10992000F01F0010C13079485808CD604048EDB8AC +:109930000000CD213019E06A03E80E9B0A9CF01F5D +:10994000000ACCAB2F8DE3CD80F84048F3D8C0019E +:10995000CF3B0000800294088000917C8002BD68AB +:1099600080028FB08002979CEBCD4060F9380121D6 +:10997000F8F501281AD8F93901201AD9F938011F48 +:109980001AD8F939011E1AD9F938011D1AD8F9392E +:10999000011C489A1AD9302B18966A0CF01F000740 +:1099A0000C9CF01F00070C9CF01F00062FADE3CDB0 +:1099B000806000008003DD6C80023A1A80029438D7 +:1099C0008002963CEBCD40E0201D1897F8F801147A +:1099D0005808C0613FF60C9C2FFDE3CD80E0F8F8FD +:1099E0000128300C5C791ADC5C5B700C70D6FAC80C +:1099F000FFFC5D162FFD1895580CCED01899400825 +:109A0000E06A88C7EECBFEE4EEFC0114F01F000410 +:109A100018960A9CF01F0003CDFB000080028154C1 +:109A2000800091E8EBCD40E0208D14971896580BFC +:109A3000C2614A781AD8EEF60128EF3801211AD807 +:109A4000EF3901201AD9EF38011F1AD8EF39011E5A +:109A50001AD9EF38011D1AD8EF39011C49DA1AD981 +:109A6000302B6C0CF01F001C0E9CF01F001C0E9C79 +:109A7000F01F001B2F9D2F8DE3CD80E01A95320A39 +:109A80001A9BF01F0018C1211A9B320AEEF801340C +:109A90008F8A1AD8EEC9FEE4EEC8FEC8EEFC0108B3 +:109AA000F01F001149182FFDCC6B0C9C310A1A9B3A +:109AB000F01F000CC090EEF8012848DA700C302B33 +:109AC000F01F0005CB7B1A9B310ACE1B8003AD2C07 +:109AD0008003DE1880023A1A800294388002963C95 +:109AE000800257CC8002914C8003DDB48003DDCC32 +:109AF000EBCD40F81897169514931294F8F80124BA +:109B00005808C090F8C6FEE4306A48BB0C9CF01FB1 +:109B1000000BC031E3CD80F80C9C306A0A9BF01F2B +:109B20000007CF910899069A0A9BEEFC0124F01FCA +:109B30000004CF1B800294008000917C800261FCB5 +:109B4000EBCD40F8FACD01001293109418961697B9 +:109B5000149530081A99F2080B082FF8E048010014 +:109B6000CFB1300E1A9C1C9BEC0B0709198AFC0A1A +:109B700000081208FAC9FF00FDD8C0081C09F33814 +:109B8000FF0018C8F36AFF002FFBFAC8FF000E3B66 +:109B9000F9BB0200103CCE915805C4C0300E1C9792 +:109BA0001C9CF8C8FFFFFACAFF00F9D8C008180AC1 +:109BB000F53BFF00F60E0008FAC9FF00FDD8C0080B +:109BC0001C09F338FF00F568FF00F36BFF002FF767 +:109BD0000E35FE9BFFE85804C2A006963007F8C871 +:109BE000FFFFFACAFF00F9D8C008180AF539FF00CC +:109BF000F20E0008FACBFF00FDD8C0081C0BF738A6 +:109C0000FF00F568FF00F769FF00F538FF00100955 +:109C1000F3D9C008FACAFF00120A0D89F538FF000F +:109C200012580CC82FF70E34FE9BFFDB2C0DE3CD32 +:109C300080F80A9E0A9CCD0BD401129E16981899A2 +:109C40001C9B149C300AF01F0002D80280029B402B +:109C500000000000D431FACD0180340AFAC4FEC0FD +:109C6000510C089CF01F04BF688A516A689950A97A +:109C700068A8509868B65086684568216830416683 +:109C800050E5685250D2686A50CA687950B968087D +:109C90005158E3E8200868D50C580A586812F00AB1 +:109CA000150150F2F5E813FA517A68E868F640E5D4 +:109CB00040A9105940980C580A5802580059F00A07 +:109CC00015010459F5E813FAF20215014178E5E9A6 +:109CD00013F2519A518240C54089105968C80458FE +:109CE00040E20A58045840D6F00A15010C59F5E82C +:109CF00013FA005951AA419840B640D5416240CA72 +:109D0000F2071501EFE913F768D9105968E80E5802 +:109D1000045814580C590A59F0051501F20615019A +:109D2000EBE813F5EDE913F640B851C551B641A281 +:109D300068F940AA416504591459105941780C58E2 +:109D400040960C580A58F2021501F00A1501E5E98F +:109D500013F2F5E813FA41C851EA51D2408640A502 +:109D6000409A418910594198045868C204581458BF +:109D70000C590A59F0051501F2061501EBE813F527 +:109D8000EDE913F6408851F6520541E268DA68C5FC +:109D9000EFE220091459105941A80C5868E60C58F4 +:109DA0000A58F2021501F00A1501E5E913F2F5E887 +:109DB00013FA52124208522A41B968F668D568EA85 +:109DC000105941C804584172045814580C590A5982 +:109DD000F0051501F2061501EBE813F5EDE913F6B0 +:109DE0005245523668F84222418A417541D9045998 +:109DF0001459105941E80C5841960C580A58F2026F +:109E00001501F00A1501E5E913F2F5E813FA4248E5 +:109E1000418641A5525241F9105942080E59045841 +:109E20000C5941920A580458526AF20A1501F5E990 +:109E300013FAF0091501F3E813F9426841B641C578 +:109E400041A2527A52894219105942280C59145889 +:109E50000E590A580458F20A1501F5E913FAF009E7 +:109E60001501529AF3E813F9428852A941D641B537 +:109E700041E2423910594248145841CA0458145812 +:109E80000C5941FA0A59F0051501F2061501EBE8E3 +:109E900013F5EDE913F641D852C542A241E552B699 +:109EA00042590459145942CA105942680C58420682 +:109EB0000C580A5841F6F20E1501F0021501FDE9A1 +:109EC00013FEE5E813F2421942781458420A42257B +:109ED000125842890C581C59F00615010A59EDE830 +:109EE00013F61459F20A1501F5E913FA0C951493B7 +:109EF000423952E652FA4216424A52D24298045825 +:109F0000125842A90C580A5942261459F00A150150 +:109F1000F5E813FA0C59530A1496F2081501425A3F +:109F2000F1E913F84239109C531842B806581458F6 +:109F3000426A125842C90C591459424A1459F00A3B +:109F40001501F5E813FAF2081501F1E913F8109B71 +:109F500053384278FDEC20091059425810595019D5 +:109F60004289E5EA200812584269125840195008FF +:109F70004018A178F1E913F8400953484008A17846 +:109F8000F1E913F853584298EBEB20091059427845 +:109F9000105942A850194349E7E92009105942884D +:109FA000105940185009532A4019A179F3E813F9C0 +:109FB000400853694009A179F3E813F953794358EC +:109FC000EDE8200942B810594298105942C850197A +:109FD0004369F9E92009105942A81059401850095D +:109FE0004019A179F3E813F9400853894009A17990 +:109FF000F3E813F943785399F5E8200942B81C595E +:10A00000105950194389F7E92009129842C9045898 +:10A010001258401950084018A178F1E913F8400986 +:10A0200053A84008A178F1E913F8434953B843987D +:10A0300010590A591C59501943A94358125840192C +:10A04000065804584012A172E5E913F253C2F00217 +:10A050001501E5E813F243B84369105943780C59E8 +:10A060000A5943C50A581858065853D2F202150126 +:10A07000E5E913F2F0091501F3E813F943D853F9B0 +:10A08000438910594398145904580C5916581858B4 +:10A0900053E243F54342F20C1501F0061501F9E9CC +:10A0A00013FCEDE813F643A943B80A5918580459AC +:10A0B0001459435A145816585406436A4402F20677 +:10A0C0001501F0051501EDE913F6EBE813F543482A +:10A0D00054255416435543C904591459105943D8AB +:10A0E000F20215010C58E5E913F2437654320C588C +:10A0F0000A58F00A1501F5E813FA544A890A442966 +:10A1000043864365437A43E8125843F90C5804598F +:10A110000A584392F0061501EDE813F654568916D5 +:10A1200004591459F2051501EBE913F55465892515 +:10A13000444243AA4389F9E2200814581258F00215 +:10A140001501E5E813F25472439544090C5943B6DE +:10A1500089320C590A59F20A1501F5E913FA548AA1 +:10A16000894A43C6446943A5441812580C580A58F2 +:10A17000F0061501EDE813F6549643BA4429045944 +:10A1800043D2895604591459F2051501EBE913F528 +:10A1900054A58965448243EA43C944380458145895 +:10A1A0001258F0021501E5E813F254B243D54449C0 +:10A1B0000C5943F689720C5944080A59446A045AE6 +:10A1C000105A0C5AF2061501EDE913F654C6447BF9 +:10A1D00089860C5BF4061501EDEA13F654E6441586 +:10A1E00044A243E9445889A60A5B045818581258F7 +:10A1F000F0051501EBE813F554D58995185BF602C7 +:10A200001501E5EB13F254F289B2444A4489449BA8 +:10A210000A590C5B4405442644A804581458F3E634 +:10A22000200A0C580A5A5028E0657999EA155A8292 +:10A23000504A410644325116441AEE050009F7E22D +:10A2400020081458E062EBA1EA126ED95038507918 +:10A25000040E0C99506EE068BCDCEA188F1B0C9A57 +:10A26000100C2F8A505C512A1306511941087403AF +:10A27000720C2F485138410A2F0A514A700A41483E +:10A28000700941580A08F0090009EC081505F1E6C3 +:10A2900013B8F2080008F5E3200918691459F00909 +:10A2A000000740F80A08F00A0009F80B151EF7EC41 +:10A2B000122BF7E320080C680658F2080008EE0994 +:10A2C0001505F3E713B9EC0A151EF009000EF5E6C3 +:10A2D000122AFC091505F7EA2008F3EE13B9EFE896 +:10A2E000000816580A01EE0C151E0601F9E7122C9B +:10A2F0001001F9EA200812011C68E209150514583A +:10A30000F3E113B90A001600100040E812000A0831 +:10A31000F00A0009FC0B151EF7EE122BF7EC2008D3 +:10A3200002681858F2080008E0091505F3E013B9AF +:10A33000F009000640D80A08F00C0009E20A151ED0 +:10A34000F5E1122AF5EB200800681658F20800081B +:10A35000EC091505F3E613B9F009000E40C80A0828 +:10A36000F00B0009E00C151EF9E0122CF9EA2008A8 +:10A370000C681458F2080008FC091505F3EE13B92F +:10A38000F009000340B80A08F00A0009EC0B151E9A +:10A39000F7E6122BF7EC20081C681858F2080008A2 +:10A3A000E6091505F3E313B9F009000641680A0848 +:10A3B000F00C0009FC0A151EF5EE122AF5EB200838 +:10A3C00006681658F2080008EC091505F3E613B9FB +:10A3D000F009000E40A90A091609E60C151EF9E35A +:10A3E000122CF9EA20080C681458F2080008FC093D +:10A3F0001505F3EE13B9F009000340980A08F00AB6 +:10A400000009EC0B151EF7E6122BF7EC20081C6870 +:10A410001858F2080008E6091505F3E313B9F00926 +:10A42000000640890A091809FC0A151EF5EE122AD1 +:10A43000F5EB200806681658F2080008EC09150527 +:10A44000F3E613B9F009000E68C80A08F00B00091A +:10A45000E60C151EF9E3122CF9EA20080C681458D2 +:10A46000F2080008FC091505F3EE13B9F009000124 +:10A4700068D90A091409EC0B151EF7E6122BF7EC44 +:10A4800020081C681858F2080006E2091505F3E1D7 +:10A4900013B968E8EC0900030A08F00C0009FC0A8B +:10A4A000151EF5EE122AF5EB200802681658F20880 +:10A4B0000008E6091505F3E313B9F009000E68F981 +:10A4C0000A091609E20C151EF9E1122CF9EA200816 +:10A4D00006681458F208000BFC091505F3EE13B9D1 +:10A4E0004178F60900000A08F00A0009E606151E80 +:10A4F000EDE31226EDEC20081C681858F208000A5B +:10A50000E0091505F3E013B9F409000341890A09CC +:10A510001809FC0A151EF5EE122AF5E62008006857 +:10A520000C58F208000CE6091505F3E313B941983D +:10A53000F80900010A08F0060009E00B151EF7E013 +:10A54000122BF7EA200806681458F2080008E209FE +:10A550001505F3E113B94077F009000E1407FC0963 +:10A560001505E60A151EF3EE13B9F5E3122AF5EB0D +:10A57000200802681658EE080008F009000341A8F8 +:10A580000408F00B0009E20C151EF9E1122CF9EA9F +:10A5900020081C58F2080008E6091505F3E313B972 +:10A5A000F009000541B904091409FC0B151EF7EE6A +:10A5B000122BF7EC20080658F2080008EA091505E6 +:10A5C000F3E513B9F009000641C80408F00C0009CE +:10A5D000E60A151EF5E3122AF5EB20080A58F208E0 +:10A5E0000008EC091505F3E613B9F009000E41D98E +:10A5F00004091609EA0C151EF9E5122CF9EA2008DF +:10A600000C58F2080008FC091505F3EE13B9F0091F +:10A61000000541E80408F00A0009EC0B151EF7E6F6 +:10A62000122BF7EC20081C58F2080008EA0915055F +:10A63000F3E513B9F009000641F904091809FC0A09 +:10A64000151EF5EE122AF5EB20080A58F20800084C +:10A65000EC091505F3E613B9F009000E42080408E9 +:10A66000F00B0009EA0C151EF9E5122CF9EA200896 +:10A670000C58F2080008FC091505F3EE13B9F009AF +:10A680000005421904091409EC0B151EF7E6122BFC +:10A69000F7EC20081C58F2080008EA091505F3E554 +:10A6A00013B9F009000642280408F00C0009FC0A5E +:10A6B000151EF5EE122AF5EB20080A58F2080008DC +:10A6C000EC091505F3E613B9F009000E4239040947 +:10A6D0001609EA0C151EF9E5122CF9EA20080C58A7 +:10A6E000F2080008FC091505F3EE13B9F00900059E +:10A6F00042480408F00A0009EC0B151EF7E6122B7D +:10A70000F7EC20081C58F2080008EA091505F3E5E3 +:10A7100013B9F0090006425904091809FC0A151E6C +:10A72000F5EE122AF5EB20080A58F2080008EC09A9 +:10A730001505F3E613B9F009000E42680408F00BA2 +:10A740000009EA0C151EF9E5122CF9EA20080C584C +:10A75000F2080008FC091505F3EE13B9F00900032F +:10A76000427904091409EC0B151EF7E6122BF7ECDD +:10A7700020081C58F2080008E6091505F3E313B990 +:10A78000F0090005428904091809FC0A151EF5EEB6 +:10A79000122AF5EB20080658F2080008EA09150508 +:10A7A000F3E513B9F009000E429904091609E60C05 +:10A7B000151EF9E3122CF9EA20080A58F208000BDA +:10A7C000FC091505F3EE13B9F609000042A90409C6 +:10A7D0001409EA06151EEDE51226EDEC20081C58BA +:10A7E000F208000AE0091505F3E013B9F4090003C3 +:10A7F00042B9FC0A151E0409F5EE122A1809F5E6FD +:10A80000200800584065F208000C1405E6091505FB +:10A81000E00B151EF3E313B9F7E0122BF809000162 +:10A82000F7EA200AE2081505065AF1E113B842C911 +:10A8300004090C091409E60A151EF208000EF5E3D6 +:10A84000122AF5EB20080258EA080008E066BCDC92 +:10A85000EA168F1BFC091505F3EE13B9F009000089 +:10A8600042D80C08E20C151EF00B0002F9E1122C84 +:10A87000FDEC0008FDEC100914691049E00815050D +:10A88000F1E013B8E4090009F208000242E80C08FC +:10A89000FC0B151EF00A0005F7EE122BE1EB000889 +:10A8A000E1EB100918691049E4081505EA090009E7 +:10A8B000F1E213B8E00A151EF2080005F5E0122ACD +:10A8C00042F9E5EA00080C09F20C0003E5EA100978 +:10A8D00016691049EA081505F1E513B8E6090009FB +:10A8E000F208000343080C08E40C151EF00B0006E8 +:10A8F000F9E2122CEBEC0008EBEC1009146910499A +:10A90000E6081505EC090009F1E313B8EA0B151E7A +:10A91000F2080006F7E5122B4319E065BCDCEA15E6 +:10A920008F1BE7EB00080A09F20A000AE7EB10099F +:10A9300018691049EC081505F1E613B8F409000987 +:10A94000F208000243280A08E60A151EF00C000C63 +:10A95000F5E3122AEDEA0008EDEA1009166910493C +:10A96000E4081505F8090009F1E213B8EC0C151E0E +:10A97000F208000EF9E6122C4339E5EC00080A094A +:10A98000F20B000BE5EC100914691049FC081505E1 +:10A99000120BF1EE13B84349F6080005E40B151E3F +:10A9A000F7E2122BE062BCDCEA128F1BFDEB000821 +:10A9B0000409F20A000AFDEB100918691049EA08B7 +:10A9C0001505F1E513B8F4090009F208000643582B +:10A9D0000408FC0A151EF00C000CF5EE122AEBEA36 +:10A9E0000008EBEA100916691049EC081505F8098A +:10A9F0000009F1E613B8EA0C151EF208000EF9E59D +:10AA0000122C4369EDEC00080409F20B000BEDEC8D +:10AA1000100914691049FC081505F1EE13B8F60980 +:10AA20000009F208000543780408EC0B151EF00A33 +:10AA3000000AF7E6122BFDEB0008FDEB1009186980 +:10AA40001049EA081505F4090009F1E513B8FC0AF4 +:10AA5000151EF2080006F5EE122A4389EBEA0008FB +:10AA60000409F20C000CEBEA100916691049EC0815 +:10AA70001505F1E613B8F8090009F208000E43982D +:10AA80000408EA0C151EF00B000BF9E5122CEDEC96 +:10AA90000008EDEC100914691049FC081505F609C9 +:10AAA0000009F1EE13B8EC0B151EF2080005F7E6ED +:10AAB000122B43A9FDEB00080409F20A000AFDEB82 +:10AAC000100918691049EA081505F1E513B8F409E9 +:10AAD0000009F208000643B80408FC0A151EF00C31 +:10AAE000000CF5EE122AEBEA0008EBEA10091669F1 +:10AAF0001049EC081505F8090009F1E613B8EA0C4D +:10AB0000151EF208000EF9E5122C43C9EDEC000801 +:10AB10000409F20B000BEDEC100914691049FC0854 +:10AB20001505F1EE13B8F6090009F208000343D841 +:10AB30000408EC0B151EF00A000AF7E6122BFDEBD9 +:10AB40000008FDEB100918691049F4090009E6082E +:10AB50001505F1E313B8F208000543E90409FC0AFE +:10AB6000151EF20C000CF5EE122AE7EA0008E7EADF +:10AB7000100916691049F8090009EA081505F1E5F8 +:10AB800013B8F208000E43F90409E60C151EF20B87 +:10AB9000000BF9E3122CEBEC0008EBEC1009146944 +:10ABA00010494057FC0815051407F1EE13B8F609D3 +:10ABB000000AEA0B151EF7E5122BFDEB0009F4085D +:10ABC0000003FDEB1008E60A15051868F5E313BA53 +:10ABD0001248EE080009F20A00054409E06AC1D6ED +:10ABE000EA1ACA6214091809FC06151EEDEE1226AF +:10ABF000EDEB20080658F2080008EA091505F3E510 +:10AC000013B9F009000A4419E068C1D6EA18CA620B +:10AC100010091609E60C151EF9E3122CF9E62008B6 +:10AC20000A58F2080008F4091505F3EA13B9EA0B0B +:10AC3000151EF0090003F7E5122B4429E065C1D683 +:10AC4000EA15CA620A090C09F7EC20081458F20840 +:10AC50000008E6091505F3E313B9F009000EFC0935 +:10AC60001505F3EE13B9F406151EEDEA1226443A63 +:10AC7000EDEB20080A0A0658180A100A120A44497D +:10AC80000A091609E60C151EF9E3122CF9E620084C +:10AC90001C58F2080008F4091505F3EA13B9FC057D +:10ACA000151EF0090003EBEE1225E6091505EBEC85 +:10ACB0002008F3E313B91458E062C1D6EA12CA625D +:10ACC000445B040B0C0BF406151E100BEDEA122668 +:10ACD000120BEDE52008F60915050658F3EB13B93C +:10ACE000446A040A180A100A4478F409000E040899 +:10ACF000F0050009E60A151EF5E3122AF5E620081C +:10AD00001658F2080008FC091505F3EE13B9F0090E +:10AD10000005448904090C09F60C151EF9EB122CE8 +:10AD2000F9EA20081C58F2080008EA091505F3E5BD +:10AD300013B9F009000344980408F00A0009FC0B59 +:10AD4000151EF7EE122BF7EC20080A58F20800083F +:10AD5000E6091505F3E313B9F009000E44A9040947 +:10AD60001809EA06151EEDE51226EDEB2008065837 +:10AD7000F2080008FC091505F3EE13B9F009000507 +:10AD8000EA091505F3E513B944BAE60C151E040AE1 +:10AD9000F9E3122C160AF9E620081C58100A120AC8 +:10ADA00044C904090C09FC0B151EF7EE122BF7EC35 +:10ADB00020080A58F2080002F4091505F3EA13B94D +:10ADC00044D8E409000EE069C1D6EA19CA62120843 +:10ADD000EA06151EF00C0009EDE51226EDEB200841 +:10ADE0001458F2080008FC091505F3EE13B9F00930 +:10ADF000000CE068C1D6EA18CA62F405151EF8090D +:10AE00001505EBEA1225F3EC13B944EA100AEBE658 +:10AE10002008160A1C58100AFC02151EF40900012D +:10AE2000E5EE1222E06AC1D6EA1ACA62E5E5200818 +:10AE3000E20915051858F3E113B944FB140B404A15 +:10AE40000C0BA17A100B44B8F609000E4049F5E945 +:10AE500013FA14584459F1E9200B4438E069C1D67B +:10AE6000EA19CA6289CAF7E820074108F806151EE0 +:10AE7000120AEDEC1226700CEDE22008120C0258BA +:10AE8000FC091505F3EE13B90A0AE203151E100AB0 +:10AE9000E7E11223120AE7E62008E069C1D6EA19C1 +:10AEA000CA621C5840354030A170E1E513F0E0095A +:10AEB000000BF4091505040BF3EA13B9100B402835 +:10AEC0004021120BE065C1D6EA15CA62A171E3E820 +:10AED00013F1E2050008F0060009FC02151EE5EE7C +:10AEE0001222E5E320081458F2080008F6091505B7 +:10AEF000F3EB13B9F406151EF009000EEDEA122665 +:10AF0000EE051501410AEBE713F5EDE220080A0C06 +:10AF10001658060CFC091505100CF3EE13B9120CAB +:10AF2000950C411972081C089308F609151E412A50 +:10AF3000F3EB1229740812089508413870090C09BE +:10AF4000910989D089E189F541466C080408089C7B +:10AF50008D08340A300BF01F00042A0DD83200008F +:10AF6000800091DC800091D0EBCD40F878581494AB +:10AF7000A37AF40800099959123AF9F98006F9F907 +:10AF8000B006F7B90BFFF9F9BA06FDD8C066E808B4 +:10AF9000161DF2080008996818951693E80E000926 +:10AFA000E049003FE08B000F3006FCCCFFE4E606F2 +:10AFB000000BEA0C000CE806010AF01F0014E3CDB8 +:10AFC00080F8FC061140FCCCFFE40C9AEA0C000C63 +:10AFD000F01F000EEACBFFE40A9CF01F000DECC846 +:10AFE000FFC11034E088000FE60600070E9B0A9CA4 +:10AFF0002C07F01F00072C06ECC8FFC11034FE9B85 +:10B00000FFF7300ECD3B0000800091DC80029C54A5 +:10B01000D421202D16961895300B1A94583BF9B868 +:10B020000B14F9B80818F60911FFEC08030AF3D954 +:10B03000C002A379F4090A4AE80B0B0A2FFB588BCC +:10B04000CEE1301A49EBC038301A49EB0C9CF01FA6 +:10B05000001E6C58E21801F8E04801C0CF61308A48 +:10B060001A9B0C9CF01F00183007EE081602EE0920 +:10B0700011FFEC08032AF3D9C002A379F4090A4AA4 +:10B08000EA070B0A2FF75947CF11300B340AECCCE3 +:10B09000FFE4F01F000E0E9A300B0C9CF01F000B0B +:10B0A000ECCCFFEC308A300BF01F00081A9C308A81 +:10B0B000300BF01F00062FEDD82200008003DE5871 +:10B0C00080029C508002AF68800091D0EBCD40FCA4 +:10B0D000217DE0682301EA186745E06EAB89EA1E2E +:10B0E000EFCD5008E068DCFEEA1898BA3007501E31 +:10B0F0005028E06E5476EA1E1032E068E1F0EA185B +:10B10000C3D250675057503E504818931292580C73 +:10B11000C140149416951A962FF7090A0B0B1A9C26 +:10B12000F01F00070E33FE9BFFF91A9B049CF01FD3 +:10B1300000052E9DE3CD80FC1A96CF8B8002AF6870 +:10B140008002B010D431FACD008C501C500B1493F7 +:10B150001292109142C0585AE08B0056E04B0040CA +:10B16000E08B0054FAC4FFF8340A300B089CF01F3F +:10B17000002E400A401B089C0896F01F002CFAC5C0 +:10B18000FFB808970D88EC1800360CC80A36CFB106 +:10B190003408518451285803C110FACCFF9CFACBD3 +:10B1A000FFB4300AE60E1502E40A030818A8E20A02 +:10B1B000030916A92FCA1C3ACF81E6CCFFFF0099DC +:10B1C0000A9AFAC3FFA0069BF01F0019340A300B3D +:10B1D000089CF01F0015400A401B089CF01F00133C +:10B1E0000F88EC18005C0EC80C37CFB1314C340816 +:10B1F000513C5184519000990A9A069B5128302C59 +:10B20000F01F000B2DDDD832FAC6FF881A9A0C9970 +:10B21000FACBFFFC301CF01F0006314850165008D6 +:10B22000CA2B0000800091D0800091DC8002B0CC5D +:10B23000D401202D501A5009301A1AD8FAC9FFF833 +:10B24000FAC8FFFCF01F00032FFD2FEDD80200000D +:10B250008002B144D43121AD5009502B501A1892BC +:10B2600042395809C6D0504850593008FAC7FFAC87 +:10B270005038FAC3FFD4FAC0FFC0FAC4FFE8049CF8 +:10B28000F01F003140382FF850381AD34038518819 +:10B2900040285168FAC8FF98519830484046517884 +:10B2A000B986FB380013FAC9FFA0FB68006B189B36 +:10B2B0000E98FB66006840454046302A1891B185DB +:10B2C000049CFB650069A986FB66006AF01F001FED +:10B2D000314A069B009CF01F001E2FFD40085818A5 +:10B2E000E08A001C301608983149069A029B049C9B +:10B2F000F01F0018314A089B069CF01F0015009AA9 +:10B30000089B17381589125814C80E3ACFB12FF67A +:10B3100040080C38FE99FFE940560C985946F9B69A +:10B320000B140C180C9A5058009B404CF01F00084E +:10B3300040585808C05040480C085048CA1B2E6D51 +:10B34000D8320000800091B88002B144800091DCC6 +:10B350008002B230D43120EDFACEFFA4109530082F +:10B3600018927C14149716911296FB680036FB68AD +:10B3700000377C00149CF01F00275804C3003018CD +:10B38000FAC9FFC9508850685097FAC8FFCA505C84 +:10B3900050B6507550A950C85934E0880023300782 +:10B3A000FAC3FFECFAC6FFDCC088FB680036E8078A +:10B3B00001055935E088001CE00700080C991AD8EF +:10B3C0002EC70698304A029B049CF01F00132FFDE5 +:10B3D000FB3800362FF80E34FE9BFFE92F2DD832B4 +:10B3E00008953007FAC3FFECFAC6FFDC0C99069803 +:10B3F0001A96049C1AD6029B304AF01F00070A9A3C +:10B400000C9BE007000CF01F00052FFD2F2DD832FC +:10B41000800091B88002B144800091DC00000000FF +:10B4200000000000EBCD4080129E1097584CC26087 +:10B43000E08A0013588CC140590CC101590B5F18A8 +:10B4400058FA5FA91248C0A130689D083039300C05 +:10B450008F09E3CD8080582CC1E0E3CFC080E04B62 +:10B4600000205F1859FA5FA91248CF8130689D0803 +:10B470003029300C8F09E3CD808058DB5F1858CA23 +:10B480005FA91248CEB130099D093018129C8F086F +:10B49000E3CD8080585B5F18584A5FA91248CF40BF +:10B4A000E3CFC080580C5E0CF8F8010C5808F9B8CE +:10B4B0000100F9F81A435EFC580CF9FB1A4C5EFCCB +:10B4C000580CF9FA1A51F9FB1A505EFC580CF9FBAA +:10B4D0001A415EFC580CC080586BE08800035EFD8A +:10B4E0004928F00B032F5EFEF94A016C5EFDF94A14 +:10B4F00001685EFDF94A01645EFDF94A01605EFD86 +:10B50000580ACF20F94A01585EFDF4C80001E0480E +:10B510000063FE9BFFEAF94A01545EFD580ACE40E3 +:10B52000F94A01505EFD00008003DE5CEBCD40E097 +:10B53000189716951496580CC130F8FC0180F01F2E +:10B54000001158055F0858065F091248C0B030085E +:10B55000EF480188EF480180109CE3CD80E0E3CF05 +:10B56000C0E00C9CF01F0008EF4C0180CF900A9BBC +:10B570000C9AF01F0006300CEF460188E3CD80E006 +:10B58000800091E880009200800091DCEBCD40E0EB +:10B59000189716951496580CC130F8FC017CF01FD2 +:10B5A000001158055F0858065F091248C0B03008FE +:10B5B000EF480184EF48017C109CE3CD80E0E3CFAD +:10B5C000C0E00C9CF01F0008EF4C017CCF900A9B60 +:10B5D0000C9AF01F0006300CEF460184E3CD80E0AA +:10B5E000800091E880009200800091DCEBCD40E08B +:10B5F000189716951496580CC130F8FC0174F01F7A +:10B60000001158055F0858065F091248C0B030089D +:10B61000EF480178EF480174109CE3CD80E0E3CF60 +:10B62000C0E00C9CF01F0008EF4C0174CF900A9B07 +:10B630000C9AF01F0006300CEF460178E3CD80E055 +:10B64000800091E880009200800091DCEBCD40FE0C +:10B65000189716961493580CC031E3CFC0FE7409A6 +:10B66000F8F801605828C5E0F8F1016CF8F50168B8 +:10B67000F8F201645979FE98FFF23DD8304AB68855 +:10B68000ECCCFFFEFEFB0238F01F008E30083019B4 +:10B69000ACF8ACE9ECC4FFF85905E08000A158858E +:10B6A000E08000AA5845E08100BC0A9AFEFB02181F +:10B6B000089CF01F00843018A8C8E8C9FFFB3008B8 +:10B6C000B288E8C5FFFA5902E08000905882E08114 +:10B6D000009F304A4FDB0A9CF01F007A3018AAC83E +:10B6E000EAC9FFFB3008B2882FA55811E080008A14 +:10B6F0005821E08100A5304A4F5B0A9CF01F007181 +:10B70000EAC9FFFCEC0811FE1208AC98F206010C25 +:10B71000CA56870CEEF501745805E08000C1E3CFEE +:10B7200080FEF8F8010CF8F2016C5808F9B801280D +:10B73000F9B80016F8FA0168F8F401641039C8E3A2 +:10B7400033083009B688B6B93018B6A8F6C5FFFC7C +:10B75000590AC6F0588AE0800082584AE081009772 +:10B760004DCB0A9CF01F00573018AAC8EAC9FFFB4E +:10B770003008B2882FA55904C6B05884E081007EF5 +:10B78000304A4D5B0A9CF01F004F3018AAC8EAC926 +:10B79000FFFB3008B2882FA55812C661304A4CFB17 +:10B7A0000A9CF01F0048EAC8FFFC300AB08AB09A31 +:10B7B000EAC9FFFAEEF8010C5808CA503018B288EE +:10B7C000EAC9FFF9EACCFFF8B28A310AEEFB010CB4 +:10B7D0002FCBF01F003CEAC9FFE8C95B304A4C0B95 +:10B7E000089CF01F0038C68B304A4BDB0A9CF01FC8 +:10B7F0000035C75B304A4B5B089CF01F0032C5CB5D +:10B80000304A4B8B0A9CF01F002FC7BB5812FE9189 +:10B81000FF26304A4B4B0A9CF01F002AC60B5825C6 +:10B82000FE91FF1D304A4B1B089CF01F0026C44BA5 +:10B83000304A4AFB0A9CF01F0023C97B5901FE9144 +:10B84000FF0E304A4ABB0A9CF01F001EC5AB304AAF +:10B850004A7B0A9CF01F001BC99B304A49EB0A9C9B +:10B86000F01F0018C82B5822FE91FEF9304A4A2BCF +:10B870000A9CF01F0014C98B5814FE91FEF0304A48 +:10B8800049EB0A9CF01F000FC81B582AFE91FEE7E7 +:10B89000304A49BB0A9CF01F000BC67BF01F001901 +:10B8A000EF4C0174FE90FEDB0C9B660AF01F000556 +:10B8B00066080A9CEF480178E3CD80FE8003DE989D +:10B8C000800091DC8003DEA08003DE8C8003DE7CC0 +:10B8D0008003DE888003DE808003E1EC8003E1E406 +:10B8E0008003DE9C8003DEA48003DE948003DEB44C +:10B8F0008003DEB08003E1E88003DEA88003DE84FD +:10B9000080009200D401580CC060F8CCFEC8306AA8 +:10B91000F01F0002D8020000800091DCD4011898CA +:10B92000580CC040918AF01F0002D802800091DCC0 +:10B93000EBCD40F8208D189416971493F6C6FFF0BF +:10B94000F8F501685885C2E0E8F801645818C1604C +:10B950006EC8E8F901286E0B1AD81AD66E2849CAA3 +:10B960001AD81AD3720C72666E186E395D162FCD06 +:10B97000580CC1552F8DE3CF80F86EC9E8FA012825 +:10B980006E0B1AD91AD66E291AD91AD3740C74668A +:10B990006E3948FA5D162FCD580CCED42F8DE3CFDB +:10B9A000C0F80C9B310A1A9CF01F000A0A9AEECBD1 +:10B9B000FFD8FACCFFF0F01F00070A9AEECBFFE0A9 +:10B9C000FACCFFE81A96F01F0003CBFB80039C38EB +:10B9D000800091DCD401580CC070F94B0134F8FCA4 +:10B9E0000108F01F0002D80280028F64D401580CB5 +:10B9F000C110F8F8010C5808C08070DAF0CBFFECE9 +:10BA0000998AF01F0005D802320A109B998AF01F0C +:10BA10000003D802800091DC800091D0EBCD408003 +:10BA20001897F01F000AEEF801287029700C5D19B4 +:10BA3000585CEFF80057F9B90001F1D9E008EFF8C8 +:10BA40000A57E3CD8080000080029438EBCD40C0DF +:10BA500018971696580CC190306AF8CCFEB8F01FB3 +:10BA6000000F308A300BEECCFF10F01F000D3008B5 +:10BA700030190C9BEF4800F8EF4900EC306AEECC2F +:10BA8000FEE4F01F0008C030E3CD80C00E9CF01F24 +:10BA90000006E3CD80C00000800091DC800091D0E2 +:10BAA0008000917C80029438EBCD40C016971496AC +:10BAB000F6F8010C1838C0D0768A78D8103AC03021 +:10BAC000E3CD80C0F8CBFFEC0E9CF01F000ECF91B1 +:10BAD0003008EF48010C5806CF41320A0C9B0E9CEF +:10BAE000F01F0009EEF90128301B720C72485D1836 +:10BAF000EEF801280C9A700C70390C9B5D19CE1B66 +:10BB00008000917C800091D0D431189716941493C2 +:10BB1000300B324A069CEE040005F01F0052EEC6C0 +:10BB2000FFFF0C35E0880034E8C800013DD2EE0884 +:10BB30000004C0D8E4091800C2B01499F2C8FFFE8E +:10BB40001007EEC6FFFF0C35E08800220F89E409DC +:10BB50001800C4B10837C1B00D8A580AC180F4C8B2 +:10BB6000FFFEEE0800081035C4733308F009180012 +:10BB7000CE2187270D882FE887380D89F2C8FFFE70 +:10BB80001007EEC6FFFF0C35FE9BFFE2D83A580ABD +:10BB9000CFE03058F00A1800E08B003FEEC8FFFB02 +:10BBA0001035E08B002B14993061E2091800FE98E3 +:10BBB000FFC7EEC0FFFE304A4ABB009CF01F002BBF +:10BBC000C3900D89E2091800FE98FFBA009C304A24 +:10BBD0004A7BF01F0026C071EEC9FFFA87790D88F5 +:10BBE000204887880D89CABB0D8AF4C8FFFEEE087D +:10BBF00000081035CBB2DC3A14993138F00A18003D +:10BC0000FE98FFD4304A49BBEECCFFFEF01F001770 +:10BC1000C1900D89CCAB304A497BEECCFFFEF01FC2 +:10BC20000013C0610FE93018F0091800C1000D8A37 +:10BC3000CB6BEEC9FFFA87590D88204887680D89BC +:10BC4000C7EBEEC8FFFA87480D89C79B0FF8F808C5 +:10BC50001800CEE187070D882FE887180D89C6FBED +:10BC6000800091D08003DE788000917C8003DEAC80 +:10BC70008003DE908003DE98EBCD4080304A189739 +:10BC8000496BF01F0017C031E3CF9080304A495B09 +:10BC90000E9CF01F0013C041302CE3CD8080304A51 +:10BCA000491B0E9CF01F000EC041308CE3CD8080FC +:10BCB000304A48EB0E9CF01F000AC041310CE3CD26 +:10BCC00080800E9C304A48ABF01F0005F9BC000490 +:10BCD000F9BC0100E3CD80808003DEA88000917C68 +:10BCE0008003DE848003DE808003DEB48003DE8890 +:10BCF000EBCD4080304A1897496BF01F0017C031D8 +:10BD0000E3CF9080304A495B0E9CF01F0013C04186 +:10BD1000302CE3CD8080304A491B0E9CF01F000E72 +:10BD2000C041308CE3CD8080304A48EB0E9CF01F40 +:10BD3000000AC041310CE3CD80800E9C304A48ABF4 +:10BD4000F01F0005F9BC0004F9BC0100E3CD8080C0 +:10BD50008003DEA48000917C8003DE948003DE8C6F +:10BD60008003E1E48003DEA0EBCD40FC189416963E +:10BD70001497580BC160198B3308F00B1800C1D011 +:10BD80003008301595789548956895589505308810 +:10BD90009535952895185876E08B009BE3CFC0FC2D +:10BDA000301830898F7B8F4B8F6B8F5B9538950860 +:10BDB00095299519E3CFC0FC300531099545956566 +:10BDC000955595759529951930289508301A8F3A0B +:10BDD0005836FE98FFE51988F6081800CE01199923 +:10BDE000ECC800021039CDB119B919A8F1E91088D1 +:10BDF000F4081900CD4120465836E08A01112FC4BD +:10BE0000089CF01F008A8F2C20465816E08A010BF0 +:10BE10008F15E8CCFFFC19991988F1E91082CBF055 +:10BE2000ECC30002E40815021033CB95F8C4FFFE02 +:10BE300030056E16089CF01F007D0C4C8F1C2FC423 +:10BE400020432FF50A32FE99FFF65813E08A00E5E9 +:10BE5000300A8F3A09990988F1E91082CA00202333 +:10BE6000E40815021033C9B5E8C6FFFE14956E3418 +:10BE7000304A4EFB0C9CF01F006FE08100C430186C +:10BE800008488F382FC620432FF50A32FE99FFF15C +:10BE90005813E08A00940D990D88F1E910888F48B5 +:10BEA000E6CB0002581BE08A008AECCCFFFE199812 +:10BEB0001989F3E810898F59F6C80002A56912386C +:10BEC000C7F5F8C8FFFE300C8F68E3CD80FC1989F8 +:10BED0003DD8F0091800FE91FF631999ECC80002E3 +:10BEE0001039FE91FF5D304A4D3B2FECF01F0051A1 +:10BEF0001893FE91FF5509F909E8F1E91088EA085D +:10BF00001900FE91FF4DECCA0008583AE08A005E25 +:10BF1000E8CCFFF8F01F00498F2CECCA000C0A3A5D +:10BF2000E08A00578F13E8CCFFF419991988F1E9DA +:10BF30001082FE90FF35F4C30002E40815021033AE +:10BF4000FE95FF2EF8C4FFFE30056E16089CF01F0C +:10BF5000003B0C4C8F1C2FC420432FF50A32FE9956 +:10BF6000FFF65813E08A0042300A8F3A099909888F +:10BF7000F1E91082FE90FF142023E408150210332B +:10BF8000FE95FF0EE8C6FFFE14956E340C9C304AF9 +:10BF90004ABBF01F0028C211301808488F382FC63E +:10BFA00020432FF50A32FE99FFF25813E08A00145D +:10BFB0000D880D99F1E910888F48E3CF80FC300897 +:10BFC0008F58109CE3CD80FC580AFE99FEE9581A60 +:10BFD000FE90FEE6E3CF80FC304A49AB0C9CF01F9C +:10BFE0000015C0613028CDAB5813CF51CD8A0C9CC1 +:10BFF000304A495BF01F000FF9B80010F9B8010092 +:10C00000CCDB0C9C304A491BF01F000AF9B8000237 +:10C01000F9B80100C36B5813CD11CC1A5806FE991C +:10C02000FEBF5816CCB1CBBA8002BC788003E1ECDD +:10C030008000917C8003DE988002BCF08003DE9C4F +:10C040008003DE7C8003DEB08003E1E8D401580C7D +:10C05000C021DC0AF8F801745808CFC0169AF8FB22 +:10C060000178109CF01F0004F9BC01FEF9BC00002F +:10C07000D80200008002BD68EBCD40801897580CB4 +:10C08000C1D0F8FC0108F01F000F300A0E9B48ECED +:10C09000F01F000EEEFC0174F01F000DEEFC017CA1 +:10C0A000F01F000BEEFC0180F01F0009EEFC0128E0 +:10C0B000F01F00070E9CF01F0006E3CD80800000FB +:10C0C000800290A88002C0D080027400800091E8B5 +:10C0D000D401F01F0002D8028002963CEBCD40C094 +:10C0E0001896E06C018CF01F00131897C19030185F +:10C0F000E069A8C0F94800ECF9490150346833C937 +:10C10000F9480154F9460128F9490158189A189B31 +:10C11000489CF01F000AEF4C01081898C0400E9C84 +:10C12000E3CD80C00E9C1097F01F0005CF9B000050 +:10C1300080028F248002BAA880028F8C800091E850 +:10C14000EBCD4060149E1DD81896158CECF5012897 +:10C150001AD81DC91AD91DB81AD81DA91AD91D98DF +:10C1600048CA1AD81ADC1ADB303B6A0CF01F000AE6 +:10C17000ECF90128311B720C72585D18ECF901289A +:10C18000300A720C7238149B5D182F9DE3CD8060CD +:10C190008003DF4880023A1AEBCD40C0205D109743 +:10C1A000581BC130582BC0402FBDE3CD80C0310B90 +:10C1B0001A98F01F00091A961A9B0E9C310AF01F5C +:10C1C00000072FBDE3CD80C0310BF01F00052FBD50 +:10C1D000E3CD80C08002B230800091DC80028EF816 +:10C1E000D431201DFACEFFD81894500B149012961B +:10C1F00010917C237C077C12306A49AB129CF01FA3 +:10C20000001AC1D05803C0800698009B400C0499C6 +:10C210000E9AF01F00160C9BE8F501280498F5D142 +:10C22000C0100E996A0C6AA65D16E8FC0104F01FA6 +:10C2300000100E9CF01F000F2FFDD832E8C5FEB88D +:10C24000306A488B0A9CF01F0008CDD1E8F801281D +:10C250000A9B700C70995D19EA061740CD4B0000DF +:10C260008002B41C8000917C8002C19880025582BB +:10C27000800091E8EBCD40E0189716961495F8F8F9 +:10C2800001685848E0800081E08A00495888C780EA +:10C290005908C4F04C19EEF801645848C480584855 +:10C2A000E089004A5818C6605828C6604BB81AD9A9 +:10C2B0001AD8EEFA01280DD81AD80DC91AD90DB816 +:10C2C0001AD80DA91AD90D981AD80D89302B1AD958 +:10C2D000740C4B3AF01F0033EEF801282F8D700BD1 +:10C2E000707C300AF01F0030EEF90128720C72C821 +:10C2F0005D18EEF90128307B720C72185D18580534 +:10C30000C201EEFC010C580CC07079485808F9B80D +:10C310000100F9F81A14E3CD80E05818C33058280A +:10C32000CBA14A29EEF801645848CBA14A08CC0BAE +:10C330004A09CB2B5888C2205908CB9149D8CB8BBE +:10C34000EEF801280C9B700C71263019303A5D16FE +:10C35000301BEEFC0104F01F0018EEF8016C5828A9 +:10C36000C15030080E99495A109B301CF01F001420 +:10C37000CC9B4948C9DB48D8C9BB4938C99B492926 +:10C38000C8BB4909C89B48A9C87B301BEEFC010407 +:10C39000F01F000ECE7B00008003C6288003DF74F0 +:10C3A00080023A1A800274008003DF088003DF10E5 +:10C3B00080039A74800261D48002C0D080027474B9 +:10C3C0008003C8E480039A6C800261A4D431FACD62 +:10C3D00000DC1897169314951296E0490062E08BE2 +:10C3E000000630060C9C2C9DD832129CF01F034492 +:10C3F0001892E08000D60C9A0A9BF01F034205A910 +:10C4000005B8F1E910880599F5D8B0103038F00971 +:10C410001800C0603006049CF01F033BCE4BECC8F4 +:10C420000004EBDAC01030090A385F3AE045005EDC +:10C430005F88F5E8100CF20C1800CED13FE8E4C19B +:10C44000FFFC038AF00A18005F1B3028F00A18006E +:10C450005F19F7E90004F8041800CDD1EEFC0104DF +:10C46000F01F032A039903A8F1E91088EDD8B01052 +:10C47000FDD6C003506E1C9930182019F009190020 +:10C48000E08800043FF6CC8BEEF8016459085F0A9F +:10C490003028F00E19005F19126AE80A1800C080EF +:10C4A000EEF801685908CEF0EDB60003CEC0EEF804 +:10C4B00000F85808E08100ABE1D6C0100098E218FF +:10C4C0002080CE10009AE21A0800502ACDC12FC554 +:10C4D00000995055E21901005039C641405AE339DC +:10C4E000005DE338005E263AF1E91088F7D8B01015 +:10C4F000E9DBC010083AE0830598EEF9016058299D +:10C50000E0800550EDB00003E0810333E21000301D +:10C51000CBA140395809E08001CAEEF90128305B0F +:10C52000720C72185D18039903A8F1E91088E339B9 +:10C53000005DEBD8B010E33B005EFACAFF50F7E9AC +:10C54000108BE2CCFFA1F01F02F243185808C04044 +:10C55000EDB5000CC231EEC3FEB8EEF60134EEF8D4 +:10C56000017C5808E08004E742C95809E08004C80B +:10C57000EEFB017C580BC79042DAEEF80184103ACA +:10C58000C70042FE42EC1ADE14981ADC069A0E9C92 +:10C59000FEFB0B80F01F02E02FED3016C3DB3FF6F1 +:10C5A000C22BE2C6FFB3FAC4FF84310A0C9B089C7D +:10C5B000F01F02D440685C785048EEF800A8580894 +:10C5C000C301EEF800A45808FE90FF5E310A300B5C +:10C5D0000C9CF01F02D2049A404BEECCFFDC0C986E +:10C5E0004059F01F02CF0C9B089C310AF01F02CD6E +:10C5F000FE91FF4A308AE2CBFFFBEECCFF10F01F2A +:10C6000002C13018EF4800F8C6AB308AEECBFF10FD +:10C61000E2CCFFFBF01F02C3FE99FF503FF6CFCAEA +:10C62000402B310A0C9CF01F02BD049A404B0C9821 +:10C630004059EEC5FF9C0A9CF01F02B9310A0C9BC1 +:10C64000089CF01F02B8CBE13018EF4C00A80A9B01 +:10C65000EF4800A4340AEECCFFDCF01F02AACCBBEA +:10C66000129CF01F02B0C10142EC580CC160EEFBFD +:10C670000180580BC12042FEEEF80188103EC090A8 +:10C6800042C942DAC81B42FE42C942EC42DAC7CB79 +:10C690001C9AF01F02A4CF81EEF801605818E080C8 +:10C6A00000E6320AE2CBFFF3EECCFF34F01F029D2E +:10C6B000FE91FF7503B903C8F1E91088F3D8B010F3 +:10C6C000EEF801645888E08000CC5908E08000CA88 +:10C6D000EEF80128FAC9FF2C1AD970D6700C35F97A +:10C6E000FAC8FF24300A303B5D162FFD1896580C0F +:10C6F000FE90FF55EEF80160E06900FE5828F20850 +:10C700001710435AB48840680A99E2190200F1E907 +:10C7100010094358E8190108F20B1608B09B435A58 +:10C72000B4A9EEF801605828E0810093300843591D +:10C73000B2B8435AB4C8435C308AE2CBFFFB2FBC8B +:10C74000F01F02704358300AF16A005D4359F36AE2 +:10C75000005E4358406A2B381AD84379E068888EC7 +:10C760001AD9EECBFFDC1AD606990E9CF01F026E8A +:10C770003018EF4800EC5C752FDDEDB50006C0F118 +:10C78000FEFA09A8F4E80000FAE9007CEEF801647A +:10C790005888E08003F65908E08003D90A90E21037 +:10C7A0000200C0E0EEFA01283019740C069B7528CF +:10C7B000129A5D18301BEEFC0104F01F025DEEF8CA +:10C7C0000128306B700C70195D1943165806FE90E5 +:10C7D000FEE64328FAC4FF84F0C50002334A300B5A +:10C7E000089CF01F024EE0450020FE9BFED80D88FD +:10C7F000F1D8C00252280D89F3D9C041C050EEF8DB +:10C80000016458185F095209ECCBFFFE0A9AFACC72 +:10C81000FF74F01F023C0A9A52B50898FAC9FF7CCF +:10C820000A9BEEFC0168F01F0243FE91FEB8E2CACB +:10C83000FFC3089B0E9CF01F0240FE91FEB0009AC1 +:10C84000069B0E9C3016F01F023DFE9FFDE6435CEA +:10C85000302AE2CBFFFD2FDCF01F022AC6DB3208B4 +:10C86000F0091900FE91FE9BC34B42EB580BFE9062 +:10C87000FF1A58065F1AEEF9018058095F0814681C +:10C88000FE90FF116D68EDB80001FE91FF0C42F8BB +:10C89000069A1AD80E9C1ADBFEFB08A442F842E95D +:10C8A000F01F021D2FEDFE9FFE7AEEF90128720C9B +:10C8B00072885D18FE90FE73EEF80128305B700CF4 +:10C8C00070195D19403BFAC6FF50324A0C9CF01FAC +:10C8D0000213EEF801605828C0C1E338005DE33B65 +:10C8E000005E0C9AF7E8108BE2CCFFA1F01F020863 +:10C8F00043065806C0E0EEFC010C580CE08003D162 +:10C90000F8CBFFFC310A0C9CF01F0206E08003C04C +:10C910003005EEF8016C5818E08000D45805C0606E +:10C92000EEFB016C581BE080029BEEF800EC58080F +:10C93000E08102B5EEC8FF545008EECAFEB8EEC959 +:10C94000FF9CE2C8FFF3508AEEC6FEC850A950987B +:10C95000306A6E85408B0C9CF01F01F2E08500FB75 +:10C96000306A408BFAC0FFD0009CF01F01E60C9BA0 +:10C97000306AFACCFFCAF01F01E3320A409B400C38 +:10C98000F01F01E8E08500D0320A409BFACCFFC4DA +:10C99000F01F01DC320A400BFACCFFA4F01F01D9D2 +:10C9A000340E1ADE40BE00991ADE34C80A9BFEFA25 +:10C9B00007920E9CF01F01E4EEC5FF6CFAC3FF7CEA +:10C9C0000A9B308A069CF01F01CF0A9CEEC6FF64CA +:10C9D000308A0C9BF01F01CB069B0C9C308AF01F09 +:10C9E00001C93018EF4800A82FEDEEF50178EEF000 +:10C9F00001745800FE90FDD3EEFA0128FAC8FF2812 +:10CA0000E9D5B0101AD8E8C9FFA1740C74D6FAC8D9 +:10CA1000FF285C79300A303B5D162FFD1893580CC7 +:10CA2000FE90FDBDEEF80160E06900FE5828F208B6 +:10CA30001710436AB48843683019B0994066436858 +:10CA40005C760C9AA3BAB0AAEEF901605829C631F7 +:10CA500030084369B2B8436AB4C8436CE2CBFFFB09 +:10CA6000308A2FBCF01F01A74368F3D4C108F169D5 +:10CA7000005D43680A9AF165005E009B436C2A1CC6 +:10CA8000F01F01A0400B436C320A2F3CF01F019DA8 +:10CA9000408940AB43682B381AD8436C0C9A1ADC97 +:10CAA000E068888E1AD30E9CF01F019F40CBEECC1D +:10CAB000FF34320A3016F01F01932FDDFE9FFCADCC +:10CAC000EEFC0104580CFE90FF2B320A0E9BF01F67 +:10CAD000019FC361320A8F8AEEF8013406991AD891 +:10CAE0000E9BEEC8FEC8EEFC0108F01F0199580627 +:10CAF0005F1AEEF9010C2FFD58095F081468FE90CB +:10CB0000FF0F0C9A069BEEFC0108F01F0192FE91AC +:10CB1000FF0EC05B436C302AE2CBFFFD2FDCF01F21 +:10CB20000179C9CB400B320AFACCFFC4F01F017562 +:10CB3000320A409BFACCFFA4F01F0172C32B310ACA +:10CB40000E9BEEFC0104F01F0181E08101B4310A6B +:10CB5000CC3B0C9BFAC0FFD0306A009CF01F0169EF +:10CB6000306A408BFACCFFCAF01F0166C07B009B85 +:10CB7000E21B2000FE91FD13403A580AFE90FD0F83 +:10CB8000334AFAC0FFD0009CF01F0164EEF901287F +:10CB90007228720C5D1850BC039903A8F1E9108843 +:10CBA000E339005DE7D8B010E338005EF1E91088A2 +:10CBB000EEF90160F7D8B0105829E080011303B9ED +:10CBC00003C8F1E910895189EBDBC0100A34E08316 +:10CBD00000CB3028406EF00E1900E08001D80A9694 +:10CBE000129B0098FAC9FFC80C9AEEFC0168F01F6E +:10CBF0000151E08100B9F5D3C010F1DAC082501ABA +:10CC000050F830194068F2081900E08000C7302859 +:10CC1000406EF00E1900E08000A4401AF1DAC0C1A5 +:10CC2000C050EEF8016458185F0850D8EEF801289B +:10CC3000306B700C70195D19009BE2CAFFC30E9C2B +:10CC4000F01F013D1895FE91FCAAEEF80128FAC9E3 +:10CC5000FF2C0A9A1AD9303B700C70D635F9FAC8F5 +:10CC6000FF245D162FFD1894580CFE90FC98EEF8EA +:10CC70000160E06900FE5828F20817104066435A28 +:10CC80005C76B488E21300304358E8130300E7E60B +:10CC9000100CF80B1608B09B4359B2ACEEF80160CB +:10CCA0005828E08102234358B0B54359B2C5435CCC +:10CCB000E2CBFFFB308A2FBCF01F01124358300A31 +:10CCC000F16A005D4359F36A005E43582B381AD865 +:10CCD00043790C9A1AD9EEC6FEB81AD40C99E068BA +:10CCE000888EEECBFFDC0E9CF01F010F2FDD40B9CC +:10CCF0005879E08101F1EEF801685848E08001E6DA +:10CD0000E08901DC5818E080014B5828E08001469A +:10CD1000FEF804441AD8EEFA0128EF38014D1AD86B +:10CD2000EF39014C1AD9EF38014B1AD8EF39014AC3 +:10CD30001AD9EF3801491AD8EF390148302B1AD9DE +:10CD4000740CFEFA0416F01F0106EEF80128307B81 +:10CD5000700C701930165D192F9DFE9FFB5EF1D58A +:10CD6000C003C0A0EEF80128306B700C70193016AB +:10CD70005D19FE9FFB52E0460020FE9BFFF5EC0B89 +:10CD80001603FAC9FFC0E2CAFFA1EECCFFCCF01F28 +:10CD900000F5FE90FF44CE7B310AE2CBFFD3FAC40C +:10CDA000FF84089CF01F00D7310AEECBFFCCFACCF1 +:10CDB000FF74F01F00D4E0450020FE9BFFD5FAC6AB +:10CDC000FFC00A9AE2CBFFA10C9CF01F00CE0A988C +:10CDD0000C99089CE06A0100320BF01F00E3C1EBE4 +:10CDE0005C7BFACAFF50E2CCFFA1F01F00C94318D8 +:10CDF0005808CB90F3D3C0105019EDB9000CCB31CB +:10CE000043282028FAC9FFC8109A5188149B00981B +:10CE1000EEFC0168F01F00C7CA61431B1788F1D8F8 +:10CE2000C00250F81789F3D9C041C050EEF8016430 +:10CE300058185F0950D94328F0CA0002E04A002080 +:10CE4000FE9BFF922FEBFACCFFC0F01F00AEEEF975 +:10CE50000128306B720C72185D18CEFAEEF80128BA +:10CE600030091AD9129A700C70D6FAC8FF285D16CC +:10CE70002FFD1893580CFE90FB92EEF5012818999F +:10CE8000EECBFEB84358E06A888E6A0C6AA65D163F +:10CE9000069CF01F009DFE9FFB82EECEFF54320BDE +:10CEA000500E1C9CF01F00B1C1F1EF4C00ECFE9F36 +:10CEB000FD46EEF80128FEFA02B6700C303BF01F7A +:10CEC00000A8EEF80128FEFA02AA700C303BF01F11 +:10CED00000A4EEF8010C5808FE90FB613008EF4802 +:10CEE000010CFE9FFD1FEEF80128FEFA028A700C6D +:10CEF000303B3016F01F009AFE9FFA8F42EC580C20 +:10CF0000FE91FBB7EEF8017C5808C061EEF8018095 +:10CF10005808FE90FBC342F830091AD8069A1AD96D +:10CF20000E9C42F8FEFB0254F01F007B2FEDFE9F8B +:10CF3000FB36EEF801805808FE91FB18EEF9012847 +:10CF4000720C72B85D18FE9FFB111099303BEEF821 +:10CF500001605828C180E2CCFFC31AD9EEC8FFBCDB +:10CF6000EEFA012830691AD830181AD930091ADCBB +:10CF7000740C7466069A5D162FCDFE9FFC11302B43 +:10CF80003209CE6BFACCFF84CE9B5875FE98FEEC2E +:10CF9000EAC60008FE9FFE264F98CBDA4F98CBBA20 +:10CFA000EDB0000CFE91FAB0EEF800A45808FE9027 +:10CFB000FA6B3018406EF00E1900C490406AF20A05 +:10CFC0001900FE91FAA1F1D4C003FE91FA5DF6C8F2 +:10CFD00000085C88109550785C750A9CF01F00482A +:10CFE0001896FE90FA51E2C4FFA11899089AEA0B2C +:10CFF0001603EECCFFCCF01F005BC2310A9A0C9BEB +:10D00000089CF01F00400C9CF01F003F4078EA098C +:10D0100016085C58E369005DE368005E5C59F1E95D +:10D020001084FE9FFA711ADA1AD4EEF801284D6ABC +:10D03000700C302B3FF6F01F004A2FEDFE9FF9EDEC +:10D040000C9C3FF6F01F0030FE9FF9E7FAC6FF8404 +:10D05000310AE2CBFFD30C9CF01F002A310AEECB41 +:10D06000FFCCFACCFF74F01F00270898E2C9FFA19B +:10D070000C9CE06A0100320BF01F003BE339005DBD +:10D08000E338005EF1E91084FE9FFA3E0E9CF01F2B +:10D09000003FEEFC0104F01F003EFE9FFC480C9A8E +:10D0A000069BEEFC0108F01F002BEF4C010CFE91DB +:10D0B000FC293015FE9FFC2F5888C0A05908FE910E +:10D0C000FE294B48FE9FFE284B38FE9FFE254B381D +:10D0D000FE9FFE22401A0C9BE21A02000E9C3016A4 +:10D0E000F01F0016FE9FF999435C302AE2CBFFFD4A +:10D0F0002FDCF01F0004FE9FFDDC0000800092008A +:10D10000800091DC800091E88002575C8002BB08BF +:10D110008003E0488002C140800091D08002C19825 +:10D120008000917C8002C1E08003E1DC800261D458 +:10D130008002B4248002B9308002C2748003E0848B +:10D140008003E1788002B354800257CC8002914C76 +:10D1500080028FB08003C6288003E19080023A1AD3 +:10D160008002D8A080029B4080028F488003E0F0BC +:10D170008003E1308003E14C8003E0048003DF089A +:10D180008003C8E48003DFC88002B9EC80025770D6 +:10D1900080039A748003DF1080039A6CD431204D91 +:10D1A0001894F8F80128E8F9016416955909F9B3BB +:10D1B0000002F9B301011492700C1A9070991A9B35 +:10D1C0005D19C635E8F80128FAC9FFF8300A1AD9FE +:10D1D000303B700C70D635F9FAC8FFF05D162FFDA4 +:10D1E0001891580CC520E8F80160E06900FE402A5B +:10D1F0005828F2081710B4880697E8F800A4ABB7CF +:10D200005808C050E0680900E7E810075805E068D2 +:10D210000400EFD8E1375802F9B80108EFD8E13738 +:10D220004028F3D7C108B09940283006B0A740295C +:10D23000B2B64028308AB0C6E8C5FF04402C0A9B2D +:10D240002FBCF01F00130A9C308BF01F00124028E7 +:10D25000F166005D4029F366005E0E99E219010057 +:10D26000FBF81002F9BA014DF1DAE1091AD9404888 +:10D2700000991AD8069A1AD1089CE068888EE8CBE3 +:10D28000FFDCF01F00052FDD2FCDD832800091DCB0 +:10D29000800239EA8002C1E0EBCD40804879720813 +:10D2A000201893081897C031F01F00050E9CF01F3E +:10D2B0000005E3CD8080000000007AB48002D2F83F +:10D2C000800091E8EBCD40C048976E065806C041FB +:10D2D000F01F0008C0916E082FF8304C8F08F01F27 +:10D2E0000006E3CD80C00C9CE3CD80C000007AB482 +:10D2F0008002D30480028F24D401F01F0002D802E0 +:10D300008002D996D401F01F0002D8028002D9947D +:10D31000D4211789179A17B8F1E9118817A9F1EAEA +:10D320001108F1E91088990817CA17D8B168F1EA0D +:10D33000118817EA17F91258F1EA10889918F73A84 +:10D340000008F739000BF7380009B168F1EA1188D5 +:10D35000F73A000A1258F1EA10889928189EF73A0D +:10D36000000CF738000DF739000FF8C5FFE4B1687D +:10D37000F73C000EF1EA11883007125849B4F1EC7D +:10D38000108C49B69D3CC038149C2F05E80707084F +:10D390002F0EFCF9FFF0F3E82189EC0C0F88E2185E +:10D3A000FF001059EC0C0F98E61800FF1059EC0C18 +:10D3B0000FB8F1D8C1081059FCF8FFF4EC0C0FAB12 +:10D3C000A96BE61BFF0016599D091059FCF8FFF8E0 +:10D3D0009D1910599D29FCF8FFFCF3E8200A8B0ADF +:10D3E0002FF758A7CD21D8228003E2F08003E6FC76 +:10D3F000EBCD40FE1892F01F002F0493E4CBFF60AA +:10D40000E4C4FFFCE4C5FF5CE4C6FFF8E4C7FF58D2 +:10D41000E4CEFFF4E4CCFF54E4C1FFB06609760823 +:10D4200087089709680A6A0889088B0A6E086C09D8 +:10D430008D088F097C0A78089D08990A2F03210B13 +:10D440002F0421052F0621072F0E210C023BCE7140 +:10D45000E4C4FFF030134985498608972F046E0A0B +:10D46000EC0A0F98EA080F9EEC0A0F88EA080F9C56 +:10D47000EC0A0FB8EA080F9BEC0A0FA8F809150888 +:10D48000FC0A1510F3EC1389F5EE130A1659EA0895 +:10D490000F9BF6081518F1EB1288105914590EA9B4 +:10D4A0000E34CDE12FF358A3CD91E3CD80FE0000E3 +:10D4B0008002D3108003E2FC8003E6FCD431209D7F +:10D4C000F736000E505A178A780917B8F1EA118812 +:10D4D000179A1258F1EA210817AEF1EE208E506E1D +:10D4E000781817CA17F9105917D8F3EA2189F3E801 +:10D4F000210917EEF3EE208E507E7828F7390008C8 +:10D50000F73A000B105AF7380009F5E9218AF73984 +:10D51000000AF5E8210AF5E920827839F73A000C8B +:10D52000F738000FFEF7034412581894F1EA2188E7 +:10D53000F739000DF8CAFF60F1E92108500AF1E659 +:10D5400020800E91E0081618406AEE080326F3DAF0 +:10D55000C008F1D2C208EE090329EE080328504999 +:10D560005038407AEE0A0F9950296878684B105667 +:10D570004068EE000FACEE080FBA4079165AEE097B +:10D580000F8BF6081508F1EB1388F8091518105AD7 +:10D59000F3EC1289EE020F9C125AF8081510F1EC08 +:10D5A0001308F5E82008685E68654079EE090FBB4E +:10D5B00050884068EE020F8C1C5BEE080FAEF80836 +:10D5C0001508F1EC1388EE000F9A105BFC09151892 +:10D5D000F4081510F3EE1289F1EA1308125B407992 +:10D5E000F7E82003EE000F8BF6081508F1EB13881F +:10D5F000EE020FBCEE090FAE0A5CFC091518105CB8 +:10D60000F3EE12894068125CEE080F9B404A4048D6 +:10D61000F6091510A968F3EB1309F1EA1388F9E983 +:10D620002000105640394038B968F1E912882E04BC +:10D63000105640294028B169400AF3E81309EDE982 +:10D6400020021434C770E4081618408AF3DAC008C0 +:10D65000E208032EE2090326F1D0C208E2030F9983 +:10D66000E20803255019E2020FACE2030F8B6809B0 +:10D67000F6081508F1EB1388E20A0FBA125AF809F6 +:10D680001518105AF3EC1289E2000F9C125AF80890 +:10D690001510F1EC1308F5E82008E2030FBB506801 +:10D6A00040886819E2000F8AE2080FAC125BF408A8 +:10D6B0001508F8091518F1EA1388F3EC1289E2004D +:10D6C0000FBAE2020F9C105BF8081510125BF1EC28 +:10D6D0001308F7E8200850786829E2030FAC125AC3 +:10D6E000F8091518F3EC1289E2020F8BF6081508F9 +:10D6F000F1EB1388105A125A4089E2090F9B6839DE +:10D70000F6081510F1EB1308125EF5E82002EC099B +:10D710001508EA081518F3E61389F1E51288125E78 +:10D720004019105EB1694018F3E81309FDE92000C3 +:10D73000C0AB4089F1D3C1084CDBFDD9C008F60865 +:10D740000706E40A1618EBD0C208F60A0709F60520 +:10D750000708F60E070CF9E9118CF3D3C008F9E8B5 +:10D76000110C4088B988F608070AF6090708F3D2B1 +:10D77000C208F1EA1188F609070AF3D0C108680E59 +:10D78000F1EA1108F609070AF1EA10881C58F009B5 +:10D790001618405AB4B8B4894059F00A1610A9882E +:10D7A000B29AB2A8E6091618F609070AF3D0C0081B +:10D7B000F6090708F1EA1188408AF3DAC208F60987 +:10D7C000070AF3D2C108F1EA1108F609070A40591D +:10D7D000681EF1EA10881C58B2F8F0091618405A71 +:10D7E000B4C94059F00A1610A988B2DAB2E8E009C3 +:10D7F0001618F609070AF3D2C008F6090708F3D38A +:10D80000C208F1EA1188F609070AF1EA1108408A0C +:10D81000F3DAC108F609070A4059682EF1EA1088C0 +:10D820001C58F368000BF0091618405AF5690008F7 +:10D830004059F00A1610A988F36A0009F368000A33 +:10D840006839405AF9E6108C125CF8081618F80985 +:10D850001610F56C000FF568000CA98CF569000D29 +:10D86000F56C000E2F7DD8328003E2FC8003E1F0DE +:10D87000EBCD40C01897590BC030E3CF80C0E06CAF +:10D8800000B0F01F00061896CF900E9BF01F00040A +:10D890000C9CE3CD80C00000800092008002D3F099 +:10D8A000D431209D129714961895500B308A0C9BFA +:10D8B000FAC2FFE4049CF01F0034ECCBFFF8400AEE +:10D8C0000E9CA37AF01F00300A9C310BF01F002F32 +:10D8D0001893C57040082018EE08003840095028F9 +:10D8E0005C39400A5C59F40A00285019E9D8C0088C +:10D8F0003050FAC7FFF4FAC1FFEC40095809E08A3A +:10D90000002940251296308A049B0E9CF01F001EB1 +:10D91000FB390013E806000812580A9BFB68001345 +:10D92000308A029CF01F00180E9A0E9B069CF01F76 +:10D930000018308A0E9B049CF01F001320160A9CCE +:10D94000308A2085029BF01F00105806FE99FFDDEB +:10D95000401A2010E80A0008E9D8C0085BF0CCE1C2 +:10D96000069CF01F000C049C3A691988F208180004 +:10D97000C0812FFCFAC8FFDC103CCF812F7DD83A44 +:10D980002F7DDC3A800091DC8002D8708002D4BC0C +:10D99000800091E85EFD5EFCD4311A97202D109E28 +:10D9A000129514965809C4911638E0880057F0086B +:10D9B0001200C0D0F608094BF0091120FC08094EEE +:10D9C000F4090A49F4080946F3EB100BFC0516109C +:10D9D000F9DEC010F6050D0AEC0816101499F1EBEB +:10D9E0001108B93A103AE088000C20191C08103EC2 +:10D9F000E08B0007103AF7B90B01F1DEEB08F00AF3 +:10DA0000010BEDD6C010F6050D0AEDEB11061498CA +:10DA1000F40C024C0C3CE088000A20181C060C3E5A +:10DA2000E08B00050C3CF7B80B01F1E9110B300C51 +:10DA3000169A189B2FEDD8321639E08B0051F20C54 +:10DA40001200C53114385F8916355F381049F8095E +:10DA50001800C450301BC4585808C0513019F2087F +:10DA60000D08109EFC081200E08100911C1BFC05B3 +:10DA70001610F3DEC010301CF6050D0AEC08161067 +:10DA8000F4090243F1EB1108149B1033E088000CF9 +:10DA9000201B1C08103EE08B00071033F7BB0B0166 +:10DAA000F1DEEB08F0030103EDD6C010E6050D0230 +:10DAB000EDE311060498E40902490C39E088000AF4 +:10DAC00020181C060C3EE08B00050C39F7B80B0142 +:10DAD000F1EB110B169A189B2FEDD832300B169CD8 +:10DAE000169A189B2FEDD832F20C0945F80E11202A +:10DAF000F00C0943F40E0A46F00E0A48F60E0A4EE0 +:10DB00000A48F0011610FC010D04EEE5FFF8F60CD2 +:10DB10000949EBD8C010EDE910090896F20E16106D +:10DB2000EEF4FFF8EC05024BFDE4110E1C3BE0881F +:10DB300000072016100E1C38E088006D161EF3D961 +:10DB4000C010FC010D00F3E11109009BE005024E3D +:10DB5000123EE0880007201B10091238E0880055AB +:10DB6000F7E6110B1C19F60306420639C0935F094C +:10DB7000F40C094C043C5F38F3E80008C020201B7B +:10DB8000300C169A189B2FEDD832F6080949FC087C +:10DB9000094EF0011120FC051610F4010A42F601AD +:10DBA0000A411242E2050D00F3DEC010E406161031 +:10DBB0000093EDE11106E009024C0C3CE0880007FF +:10DBC00020131C060C3EE088002CEC0C0101F7D25F +:10DBD000C010E2050D00F7E1110B009CE0090241C5 +:10DBE0001631E088000C201C1C0B163EE08B000751 +:10DBF0001631F7BC0B01F7DEEB0BF4080946021BEC +:10DC0000F9E3110CC3AB123EF3D8EB09F7BB0B01E0 +:10DC1000CA8B1C3BF7B60B01FDD8EB0EC90B0C3CB5 +:10DC2000F7B30B01EDDEEB06CD1BD703D40130AA11 +:10DC3000300BF01F0002D8028002F0ECD4014848FB +:10DC4000169A189B700CF01F0003D802000005986C +:10DC50008002DC54D421F40B024BF01F00151897FE +:10DC6000C230F8FAFFFCE01AFFFC204AE04A002428 +:10DC7000E08B00181898593AE088000F300910A975 +:10DC800010A959BAE088000910A910A9E04A002497 +:10DC9000C03110A910A9300910A991199109C048E3 +:10DCA000300BF01F00040E9CD82200008002E2BC62 +:10DCB0008002E8BCD421300EF6C80001F60614013B +:10DCC000F808002818991897C07870046E050EA4FB +:10DCD00091052FFE20480C3ECF95F40B000B1897B2 +:10DCE000F6C80001300EF8080028A15BC078700566 +:10DCF0006E060EA591062FFE2048163ECF95F4C85D +:10DD00000001A15AF808002C3008C078780E720B78 +:10DD100012AE990B2FF8204C1438CF95D822D70388 +:10DD2000D431205D502C503816971496580C5F0B48 +:10DD300058075F0C1295F9EB100B40E33008F00B1D +:10DD40001800E081028058095F09580A5F08F3E86B +:10DD50000008F6081800E08102764BE4402B6808C2 +:10DD60001638E0840270EE08032C580CE080026B39 +:10DD70004B9BF01F003AC06168082FF88908E08FBC +:10DD8000026268085808C05130184B598908930836 +:10DD90005806C14032D90D88F20818005F0232B926 +:10DDA000F20818005F08E5E81008C0805802F9B2D0 +:10DDB0000101F9B200022FF6C0884AACF01F002A18 +:10DDC000F9B20102F9B200004A5870085818C61199 +:10DDD0005812C2B049F95822C4A0129872043001F6 +:10DDE00032DB32BA7009F2C0FFFFEE09032C580C87 +:10DDF000E080023B1989F6091800C0805803E080D2 +:10DE00000225F4091800E081022150015014492B29 +:10DE1000F01F0012C411EE04002C029B301A2FF4E4 +:10DE2000F01F0012E08F022148A87009EE090328B4 +:10DE30005808C2F0118A32DBF60A1800C2A0580353 +:10DE4000E080020832BBF60A1800E0810203C21823 +:10DE500000007AB88003EC008002ECC800007ABCB5 +:10DE60008003EC04800326948002DCB47208EE0880 +:10DE700003285808C0E0118832D9F2081800C09071 +:10DE80005803E08001E032B9F2081800E08101DBBC +:10DE90003009500950195805E08000A44BE4680887 +:10DEA000302AEE08032C4BDBF01F003DC0D0580396 +:10DEB000E08000986808EE080328118932B8F0095C +:10DEC0001800E081008F4B7468085818E081008AC0 +:10DED0004B187008302AEE08032C4B0BF01F003053 +:10DEE000F9B80002E9F80A004AB468084AD1EE0815 +:10DEF000032C620833DB100CF01F002B1893C0E1D9 +:10DF00006808EE08032CF01F002968096208EE0972 +:10DF10000323F80801081803C08868086209EE089E +:10DF20000328F8080108121850430A910C933FF493 +:10DF300030001096C4784989720849A9EE08032C6C +:10DF400072080C9A100CF01F0016C3A1620CF01F8F +:10DF500000171836C051069600944043C3C85BF4BE +:10DF6000C2E0493870085808C7C062081AD848A8E3 +:10DF700070096E08EE090329A564EA04030A1ADA97 +:10DF80001AD91AD848B8700848BB702CF01F000B7B +:10DF90002FCDC67800007AB88003EC008002E7102D +:10DFA00000007ABC8002ECAC8002EDD0000004A43A +:10DFB000000005988003EC1480031FE800942FF004 +:10DFC0002F01620B580BCB81069640435BF4C031A6 +:10DFD0000898C0A8E8081504EA0800087018C048A6 +:10DFE0003FF83003109458065F19F3E403F9C03189 +:10DFF0003006C5484BE162084BE3EE08032966088A +:10E000000C9CF208070BF01F003C1896C2D14BB8CD +:10E0100070085808C11062096608EE090329F20861 +:10E0200007081AD86E081AD84B5870084B5B702C2A +:10E03000F01F00352FED4AF8700B2FFB910B4AC9EA +:10E04000720AEE0A032CF80B070C300BF60C1800C2 +:10E05000F7BA00FFF3FA0A00F9B90001F1F90A0072 +:10E0600033F8109CC818199833A9F2081800C0306A +:10E070003008C08819A9F0091800F9B80002F9B8E9 +:10E08000010149CA49A97209EE09032974030D8ADD +:10E090002FF3F203000349D9930A5818C1505828A6 +:10E0A000C0405808C6C0C208078933D8F009180014 +:10E0B000F7B300FF4968078A3009F20A1800C10166 +:10E0C00030069106C718078933D8F0091800F7B34E +:10E0D00000FF30080789F0091800C1B048C8910353 +:10E0E0003019484891093006C5F8000000007AB898 +:10E0F00000007ABC8002ECAC000004A4000005988B +:10E100008003EC5080031FE8000004A000007AC0E8 +:10E110004C08402B70082FF81638C2954BE8700851 +:10E120005808C1C06E084BD71AD86E084BCB702C5C +:10E13000F01F003C2FFD5BF4C0906E08A5644BAB54 +:10E14000EA0403091AD9702CC0686E080D894B7B4C +:10E150001AD9702CF01F00332FFD4AE933A8720A38 +:10E16000109C2FFA930A4B299308C6D84B19EE0836 +:10E17000032A3018930A10964AF9C1584AE95BF409 +:10E18000C0D1720A2FFA930A4A2B760BEE0B032B9F +:10E19000F60A070AF00A1800C03130189308300850 +:10E1A0004A49109693085802C1B140094A285809B3 +:10E1B0005F19700858185F08F3E80008E4081800B1 +:10E1C000C0F04018ECCAFFFFEE08002C400BF01F17 +:10E1D000001B40182FF8F006000648E8C0A8496860 +:10E1E00070085818C07148B870092FF9F206000677 +:10E1F00091065BF4C240403B580BF7F41A00A5644B +:10E2000008056A3C6A285808C1E0910C300CC1B876 +:10E2100000007AB8000004A4000005988003EC70A8 +:10E2200080031FE88003EC948003EC9C000004A0B2 +:10E2300000007AC000007ABC8002DCB448C8700CD0 +:10E24000C0283FFC2FBDD83291002FF1FE9FFDCC9E +:10E25000488B97084888F2CAFFFF3019910A129C30 +:10E2600048389109CF0B48489104CECB000004A058 +:10E2700000007AC000007AB8D40130091AD9129887 +:10E28000F01F00022FFDD8028002DD20D401484893 +:10E29000189B700CF01F0003D802000000000598C6 +:10E2A0008003217CD4014848189B700CF01F0003A8 +:10E2B000D8020000000005988002E2BCD431F6C705 +:10E2C000FFF518955967F9B70810F9B80BF8EFD8AA +:10E2D000EB2716375F38F1E713F8C05030C899388C +:10E2E000E08F01F4F01F0050E04701F7E08B001CC5 +:10E2F000EE0316034CD8F003003870361036C061B8 +:10E30000ECC8FFF870361036C0C06C18E018FFFC7F +:10E310006C3AEC0800090A9C6C289528913AC4785C +:10E320002FE3C4D8EE081609C041EE031603C278E5 +:10E330005848E08B0006EE0316062C83C2085948A5 +:10E34000E08B0005F0C3FFA5C1A8E0480054E08BB6 +:10E350000006EE03160C2923C128E0480154E08B87 +:10E360000006EE03160F2893C0A8EE031612E0482D +:10E370000554E088000437E3C02828434ABAF40370 +:10E38000003A7436C1986C19E019FFFCF207010BD2 +:10E3900058FBE08A00042013C1186C38580BC0B534 +:10E3A0006C2AEC0900090A9C912A95387218A1A8D8 +:10E3B0009318CBD810961436CE712FF349BAF4CCFB +:10E3C000FFF878261836C6F06C19E019FFFCF20742 +:10E3D000010858F8E0890091993C992C5808C055DB +:10E3E000EC0900090A9CCE3BE04901FFE08B0013D9 +:10E3F000A399F4090038702B8D388D2B9736912610 +:10E40000A3497418301BF6090949F1E91009951957 +:10E41000C4A8F20816095848E08B000AF20A16064A +:10E420002C8AC2488002E8CA0000059C5948E08B4B +:10E430000005F0CAFFA5C1A8E0480054E08B000623 +:10E44000F20A160C292AC128E0480154E08B000684 +:10E45000F20A160F289AC0A8F20A1612E0480554CC +:10E46000E088000437EAC028284A4C8BF60A0034BA +:10E4700068280838C0E17619A34A301EFC0A094A08 +:10E48000F3EA100A1099971AC0A870280838C060DB +:10E49000701AE01AFFFC1439CF9370398D398D282A +:10E4A00091369326E6081402301B4B84F608094B7C +:10E4B0006818103BE08B006EF7E80009C0B1E0136C +:10E4C000FFFCA17B2FC3C0382FC3A17BF7E8000955 +:10E4D000CFC0E803003E06921C916236C2E86C1A77 +:10E4E000E01AFFFCF407010858F8E08A00156C3ABE +:10E4F0006C299529933A0E99EC070007A1A9993741 +:10E5000099278D19EE0809088F2C8F3CA1A80A9C29 +:10E510008F18C0D86C395808C0F5EC0A000A741876 +:10E52000A1A80A9C95186C2893289139F01F00180F +:10E53000ECCCFFF8D83212960236CD212FF2F1D270 +:10E54000C002C0302F81CCAB1C98F3D3C002C08175 +:10E550006819F60811FFF3E800088918C078F0C9B7 +:10E560000008201370081238CF10A17B6818103BE8 +:10E57000E08B0010580BC0D00493C0382FC3A17B90 +:10E58000F7E80009CA71CFBB0000059C8002E8CC07 +:10E5900068236612E012FFFC0E325F39E4070108BF +:10E5A00058F85FAAF5E91009E08000A24C887001D4 +:10E5B0004C882F0170080E015BF8C0402811E01153 +:10E5C000FF80029B0A9CF01F004418965BFCC6E08B +:10E5D000E6020008103CC0320833C6814BFA7409C9 +:10E5E000E209000995091036C0A1F5D6C007C0712F +:10E5F000E20200026828A1A29112C4C84B5A740B0F +:10E600005BFBC0319506C068EC0900094B3A101954 +:10E610009509F1D6C003F00911085808F20817103F +:10E62000EDD8E1062808EC0100010A9CE3D1C007FF +:10E63000F0010101029BF01F00284A885BFCEC0CF2 +:10E640001700F9B1000070090C1C8926020C120198 +:10E65000A1AC91018D1C0833C1D058F2E08B0005AC +:10E6600030188D18C238305920C2E012FFF8E60287 +:10E670000008912991196618F1D8C001E5E8100841 +:10E68000871858F2E0880007E6CBFFF80A9CF01FD5 +:10E6900000144949720A491870081438F3F8BA008E +:10E6A0004919720A1438F3F8BA0068287018E0188B +:10E6B000FFFC0E385F390E1858F85FAAF5E910090B +:10E6C000C1600A9CF01F0009D83A000000007ACC13 +:10E6D000000009A88002EBC800007AD08003217CEA +:10E6E00000007AC800007AC48002E8CC6826A1A89D +:10E6F0000E99A1A98D19EC0700070A9C89278F188C +:10E70000F01F0003ECCCFFF8D83200008002E8CC08 +:10E71000D4013008C0D8F808070EF6080709201AF7 +:10E720002FF8F20E1800C040FC09010CD802580A5C +:10E73000CF31149CD802588AC2F5F9EB1009E219BE +:10E740000003E0810097E04A0020C3B4F4081402FB +:10E75000F0091108FE09002F7669996976599959CF +:10E7600076499949763999397629992976199919E5 +:10E7700076099909F608002BF8080028E01A00032A +:10E78000F40A1104FE0A002F17A9B0A91799B0992D +:10E790001789B0895EFCF40A1109FE0A002F17F9E7 +:10E7A000B8F917E9B8E917D9B8D917C9B8C917B965 +:10E7B000B8B917A9B8A91799B8991789B8895EFC8B +:10E7C000EBCD40C01899220AB707B326B707B32686 +:10E7D000B707B326B707B326220ACF742F0AC0653E +:10E7E000B707B326B707B326210A5C3AFE0A003FF3 +:10E7F000D703D703F736000EF366000EF736000D89 +:10E80000F366000DF736000CF366000CF736000BCC +:10E81000F366000BF736000AF366000AF7360009C4 +:10E82000F3660009F7360008F3660008F7360007BC +:10E83000F3660007F7360006F3660006F7360005B4 +:10E84000F3660005F7360004F3660004F7360003AC +:10E85000F3660003F7360002F3660002F7360001A4 +:10E86000F3660001F7360000F3660000E3CD80C0D8 +:10E87000201AF60A0709F80A0B09CFB15EFCD40189 +:10E88000183BC192F60A0009123CC152F80A000B6B +:10E890003008C068F208070E201AF6080B0E201880 +:10E8A000580ACF91D802F6080709201AF8080B0970 +:10E8B0002FF8C0283008580ACF71D8021898C038ED +:10E8C00010CB201A580ACFD15EFC5EFC5EFCD70349 +:10E8D000D4014848169A189B700CF01F0003D80208 +:10E8E000000005988002E8E8D431201D16941892A3 +:10E8F000149B5804C051F01F005B1895C5B9500A0D +:10E90000F01F0059400BE8C10008F6C6FFF5621C75 +:10E910005966F9B60810F9B80BF8EDD8EB2616369B +:10E920005F38F1E613F8C05030C830058538C42987 +:10E930001890E010FFFC0C30E08401124CB8E200AB +:10E94000000970250A39C090721AA1CAF20A000A99 +:10E95000741AEDBA0000C220721AE01AFFFCF4002B +:10E9600000030A39C131ECC7FFF00E33C195E2064E +:10E9700000090C13A1A393139129049C6218089514 +:10E98000F1D8C00110468316C1390C33C0957228E6 +:10E990000297723993289139CE48300A1499EDBC08 +:10E9A0000000E080009D6207E20701076E1CE01C8A +:10E9B000FFFC5809C5E0F80000030A39C4811403BC +:10E9C000ECC9FFF01233C5556E3A6E299529933A7A +:10E9D000EEC5FFF8E0CA0004E04A0024E08B002501 +:10E9E0000A99593AE088001A09098B0909098F39EF +:10E9F000EEC9FFF059BAE0880011090B930B090921 +:10EA00008F59EEC9FFE8E04A0024C071090A930A51 +:10EA1000EEC9FFE0090A8F7A090A12AA680A930A66 +:10EA2000681A931AC0785008089B0A9CF01F0010BF +:10EA30004008EE0600090C13A1A393139129049C2E +:10EA40006E18F1D8C00110468F16CB2814030C3372 +:10EA5000C10572287239932891396E286E39C0F831 +:10EA60008002E2BC8002E8CA0000059C8002E87EC9 +:10EA7000F80000030C33C3356E396E2893289139A2 +:10EA8000E0CA0004EECCFFF8E04A0024E08B00244A +:10EA9000593AE088001A0908990809088F38EECC1D +:10EAA000FFF059BAE08800110908990809088F5841 +:10EAB000EECCFFE8E04A0024C07109089908EECCCA +:10EAC000FFE009088F78090818A8680899086818ED +:10EAD0009918C478089BF01F0039C438049CF01FB3 +:10EAE00000381895C3A06218F8C90008A1C8E20848 +:10EAF00000081039C07172130297E013FFFC000385 +:10EB0000C308E0CA0004E04A0024E08B0020089912 +:10EB10001898593AE0880014130B10AB130B10AB84 +:10EB200059BAE088000D130B10AB130B10ABE04A81 +:10EB30000024C051130A10AA130A10AA130A10AA1B +:10EB4000720A910A72199119C048089BF01F001BA4 +:10EB5000089B049CF01F001B049CC2A80093029712 +:10EB6000E60601096E1858F9E0880016F1D8C001D0 +:10EB7000EDE810088F181298A1A8EE06000BF60910 +:10EB8000000997187218A1A82F8B9318049CF01FE6 +:10EB9000000DC0B8F1D8C001E7E810088F18EE03E7 +:10EBA00000036618A1A88718049CEEC5FFF8F01FA3 +:10EBB00000060A9C2FFDD8328002E87E8002E2BC6B +:10EBC0008003217C8002E8CCD42130081897487655 +:10EBD000169C8D08F01F00065BFCC0516C0858089D +:10EBE000EFF81A03D822000000008CC48002F1E87C +:10EBF0005EFDD703D421217DE06802041697BA6830 +:10EC0000504C500CF01F000B3008512850D848A829 +:10EC100050983FF8BA784898505C501CFAC9FF9059 +:10EC20000E9A700C1A9BF01F00062E9DD822000031 +:10EC30008002EDD08002EBF00000059880030C4CC0 +:10EC4000D421217D4988FAC9FF9016977006580B88 +:10EC5000C064E068008B3FFC8D38C228580BF60872 +:10EC600017005807F9BB01FFEFDBE10850585028A7 +:10EC7000E0680208BA683FF8504C500CBA781A9B0A +:10EC80000C9CF01F000A5BFCC044E068008B8D38D0 +:10EC90005807F9B90100FBF81000F1F91E002E9D8C +:10ECA000D8220000000005988002F5685C5BC0284F +:10ECB0002FFC19885808C050F6081800CFA15EFC38 +:10ECC000580B5E0C5E1DD703F9EB100AE21A000325 +:10ECD000C341780A76095CEAC170123AC151781AC8 +:10ECE00076195CEAC110123AC0F1782A76295CEAFA +:10ECF000C0B0123AC091783A76395CEAC0502F0C15 +:10ED00002F0B123ACE70F9DAC308F7D9C3085E0C9C +:10ED1000161C5E1CF9DAC208F7D9C2085E0C161C74 +:10ED20005E1CF9DAC108F7D9C1085E0C161C5E1C1E +:10ED30005C5A5C59121A5EFA178A1989580A5E09D8 +:10ED400014195E19179A1999580A5E0914195E194F +:10ED500017AA19A9580A5E0914195E1917BA19B920 +:10ED6000580A5E0914195E192FCB2FCCCE6B000008 +:10ED70003008F6080709F8080B092FF85809CFA141 +:10ED80005EFCD703D4014848189B700CF01F0003A9 +:10ED9000D8020000000005988002ED9CD42118974D +:10EDA0001696169CF01F0008F8C5FFFF0E9C0A9BE4 +:10EDB000F01F00061897C0500A9A0C9BF01F000421 +:10EDC0000E9CD8228002EDD08002E2BC8002E736A1 +:10EDD00030091898C0282FF8118AF20A1800CFC1FC +:10EDE000F00C010C5EFC580AC0815EFA580AC0B0F3 +:10EDF0005808C0902FFC2FFB201A19881789F0099A +:10EE00001800CF50198C1788101C5EFC3008103A7F +:10EE10005E0CF6080709F8080B092FF85809CF818E +:10EE2000103A5E0CF8080B092FF8CFBBD401484804 +:10EE3000169A189B700CF01F0003D802000005986A +:10EE40008002EE44D421300816951696C0282FF67D +:10EE5000580AC060201A0D89F0091800CF910A16CF +:10EE6000ECCBFFFFF01F00071897C0800A9B0C9A9D +:10EE7000F01F00053008EE060B080E9CD82200009B +:10EE80008002E2BC8002E736D42118981696580B0F +:10EE9000C0C03007C0481897F8C8FFFF109C0C9BF3 +:10EEA000F01F0005CF91C048F01F000318970E9C7B +:10EEB000D82200008002ECACD421201D4A351897DE +:10EEC0006A04E8F600E85806C351500B350CF01FF1 +:10EED00000206A08E94C00E8F0F900E89326930660 +:10EEE0009316F0F900E893469336F0F900E893663C +:10EEF0009356F0F900E893B693A6F0F900E893D69C +:10EF000093C6F0F900E893F693E6F0F900E8F346CB +:10EF10000044F3460040F0F900E8F346004CF346A5 +:10EF20000048F0F900E8F366001CF0F800E8400B38 +:10EF30009196486870080E9CF0FA00E83019F01FAE +:10EF400000052FFDD8220000000005988002E2A4F1 +:10EF50008002EF54D421580CC041740C580CC2905C +:10EF600018981697113EC0A80C3EC0815809C030B1 +:10EF7000109CCF7B9508B889D8220F365806CF5100 +:10EF8000580EC051950E1C9CD822129810991697B5 +:10EF9000133E0F361C36C0A1580EFC091700F9BBF2 +:10EFA0000100F1FB1E009509D8225806CF31CEEBA7 +:10EFB000D822D703D431203D4CC8502C700116986C +:10EFC000113EE20E0706E2160008CFB1E04E002D1A +:10EFD000C041113E3016C058E04E002BC021113EFA +:10EFE00058095F0C59095F053007F9E51005EE0572 +:10EFF0001800C1E0E04E0030C131118535843783FF +:10F00000E80518005F04E60518005F05E9E510054E +:10F01000EE051800C050119E31092FE8C098580C19 +:10F02000C070E04E0030F9B90008F9B9010AE06C8F +:10F03000FFFFEA1C7FFF3007FC1580000E930E36A1 +:10F04000F80517000E9CEA090D0408925005E20E1F +:10F050000704E1D4C001F9B00137F9B000575010EE +:10F06000FCC500300890E2100004C0814010E9D4D3 +:10F07000C002FC0001055804C1C01235C1A4043C03 +:10F080005FBEFDE713FEE60E1800C101043C5F0EF3 +:10F0900040070E355F97EFEE000EE60E1800C061D8 +:10F0A000B33C3017EA0C000CC0283FF7113ECD0BE3 +:10F0B0005BF7C0E1E069FFFFEA197FFFFC1C8000FD +:10F0C00040205806F20C170032298139C0485806F2 +:10F0D000FBBC0100580AC0705807F9B901FFF1D90B +:10F0E000E10B950B2FDDD8320000049CD401485869 +:10F0F0001499169A189B700CF01F0003D802000098 +:10F10000000005988002EFB43028D6733FFC358BA1 +:10F11000580C5E4C482A950B5EFC000000008CC425 +:10F120003058D6733FFC358B580C5E4C482A950BF3 +:10F130005EFC000000008CC43038D6733FFC358B79 +:10F14000580C5E4C482A950B5EFC000000008CC4F5 +:10F150003048D6733FFC358B580C5E4C482A950BD3 +:10F160005EFC000000008CC430B8D6733FFC358BC9 +:10F17000580C5E4C482A950B5EFC000000008CC4C5 +:10F180003098D6733FFC358B580C5E4C482A950B53 +:10F190005EFC000000008CC4D421210D16971A9B40 +:10F1A000F01F0011C0343FFCC1C84008AE08401831 +:10F1B000AE1840288F184038AE484048AE584058E6 +:10F1C000AE684068AE7840888F4840A88FB840C885 +:10F1D0008FC840D88F5840E8300C8F7840F88F980F +:10F1E0002F0DD8228002F180D40148C87009580937 +:10F1F000C03148B99109489948AA7208F00C000C2E +:10F20000143CE08B0004930CC068F01F000730C86A +:10F2100099083FF8109CD80200007AF800008CC8CA +:10F220000000F00080031D20D431208DFAC4FFBC03 +:10F23000504B682E505812967C0B7005506E580B30 +:10F24000F40B17006803681140493008C2C92FFB4E +:10F25000325C178AF80A18005F1EF00A18005F1C5B +:10F26000FDEC000CF00C1800CF31580AE0800129A9 +:10F27000300C3FFA1890503A18941892F80C003C51 +:10F280001697507C4CDC0F3AF80A070E407C1C0C99 +:10F290004CBEFC0C070E201E500E4CAEFC0C070C96 +:10F2A000507C400C587CE08B00F84C7EFC0C032F0B +:10F2B000368BF60A1800E08000F0371BF60A1800BB +:10F2C000C07034CBF60A1800C051A3B4CE58A5B410 +:10F2D000CE380F8B36CAF40B1800C051A5B4EECB54 +:10F2E000FFFFCDB8A5A4CD88EBD5C005367CF80AC4 +:10F2F0001800E08B0027365BF60A1800C48234FB46 +:10F30000F60A1800C480E08B000C345BF60A180083 +:10F31000C3E0347BF60A1800C3A0344BC088358B99 +:10F32000F60A1800C2C0E08B0007355BF60A180029 +:10F33000C351C318363BF60A1800C2F0364BC0E87A +:10F34000370BF60A1800C250E08B000D36EBF60AB8 +:10F350001800C1F0E08B0014369BF60A1800C1E1DA +:10F36000C0E8375BF60A1800C0A0378BF60A180011 +:10F37000C060373BF60A1800C111C0B8EDB40004F4 +:10F38000C0A0EDB40005C0913020C0883040C068F6 +:10F390003030C0483010C0283000403B5BFBC040DC +:10F3A000E20B0920C7985860E08B00776C0AEACC22 +:10F3B000FFFF486EFC00032F8003EE088003ED641E +:10F3C0008003ECF88003ECAC8003ECCCF4CBFFF8CA +:10F3D0008D0BF4EA0000E605083AC0F8F4CBFFFC18 +:10F3E0008D0B740AE605093AC088F4CBFFF88D0B43 +:10F3F000F4EA0000E605083A0E9B1895C4E8620A94 +:10F400005BFAC0B150195028E06A0080300B029CB2 +:10F41000F01F004D40284019E4CC00010E9B503CE9 +:10F42000F20C0C49C3A8620A5BFAC0B1501950280B +:10F43000E06A0080300B029CF01F00434028401916 +:10F440002012300A0E9BE202092AF2020C49C2582D +:10F4500016976C0AF4CBFFFC8D0B740A0E9BE60525 +:10F46000093A2FF5C1A8F4C20030C068E4020022B6 +:10F470002FF7F40200120F8A580AC0E0230A589AA4 +:10F48000FE98FFF6C0982FF70F8A580AC050230A3B +:10F49000589AFE98FFFA0E9B407C30BAF40C180084 +:10F4A000FE91FEEE4042178C0A325F4AF00C1800C3 +:10F4B0005F1CF9EA000AF00A1800FE91FECB300842 +:10F4C000404E178AE2050021F00A1800FC091710C7 +:10F4D000E6050038069EC2A8620A583AC1E0E089F3 +:10F4E0000007581AC1A0582AC181C058585AC0C034 +:10F4F000C0B5C1386C0AF4CCFFF88D0CF4E2000002 +:10F50000F0E30000C1086C0AF4CCFFF88D0CF4E2C3 +:10F510000000F0E30000C0786C0AF4CCFFFC8D0C16 +:10F52000740A910A2FF52F882FC11235FE9AFFD643 +:10F530001C934052406E85059D0B404BE60B003CF2 +:10F540002F8DD8328002E8BCD42114977428580833 +:10F55000C0419518109CD822F01F000330088F1866 +:10F560008F28D82280032320D431FACD068850A9D1 +:10F57000169014971893580CC06078685808C031DA +:10F58000F01F004E4CE81030C0316600C0A84CD8C7 +:10F590001030C0316610C0584CB81030E7F000028F +:10F5A0008068EDB80003C04160485808C071009BF6 +:10F5B000069CF01F0046E0810B4080681099E2191C +:10F5C000001A58A9C3D18079300AF4091900C385FB +:10F5D000A1D8FB5805B86088FB4805CC60A8FB485B +:10F5E00005D4FAC8FFD4FB4805BCFB4805ACE0686D +:10F5F0000400FB4805C0FB4805B43008FB5905BAB8 +:10F600000E9A40A9FAC7FA54FB4805C4069C0E9B03 +:10F61000F01F002F506CC0950E9B069CF01F002D14 +:10F62000406EF9BE01FF506EFB0805B8EDB800064C +:10F63000E0810B058068A7A8A068E08F0B00300868 +:10F64000FAC4F9F85098FB480678409CFB480674C9 +:10F65000FB48067CFB48068050573FF8FB44067089 +:10F66000FB48052C506C1896069150204055C02838 +:10F670002FF50B88300B325AF60818005F19F40882 +:10F6800018005F181268F6081800CF314059EA09CF +:10F690000107C2E0FAF806780E088909FB480678E7 +:10F6A0008917FAF806742FF8FB4806745878E08931 +:10F6B00000132F84C1A8000080031F388003EF2CA3 +:10F6C0008003EF4C8003EF6C80031C388002F568E8 +:10F6D00080031D2CFACAF990402B029CF01F00A158 +:10F6E000E0810AA6FAC4F9F840680E0850680B8851 +:10F6F0003007EE081800E0800A8AEAC2FFFF3003F4 +:10F700005052FB6706873FFE50745043503E0690B0 +:10F71000508506920C944057C0683FFC0A97503CB5 +:10F72000C02830000F38C0281292E0480063E08003 +:10F7300001CCE0890045E0480039E0890026E04836 +:10F740000031E0840198E048002BE0800101E0896D +:10F75000000FE0480023E080008EE048002AE080AF +:10F76000008CE0480020E0810897C7B8E048002EF0 +:10F77000E08000F1E0480030E080017BE048002DAF +:10F78000E081088ACE28505750420897408540743F +:10F790001092E048004FE0800439E0890008E0481A +:10F7A0000044E081087DE08F01DEE0480055E08004 +:10F7B00005DFE0480058E0810873C428E048006F86 +:10F7C000C430E089001FE0480069C450E089000AA5 +:10F7D000E0480064C400E0480068E081085DC63984 +:10F7E000E048006CE0800163505750420897408524 +:10F7F00040741092E048006EE0810852E08F02ED04 +:10F80000E0480073E0800553E089000BE048007099 +:10F81000E08004F9E0480071E081083EC5295057B6 +:10F8200050420897408540741092E0480075E0808F +:10F8300005A0E0480078E0810833E08F06964CABE5 +:10F84000509BE08F06945057408508975042407473 +:10F85000E08F03DD50574085089750424074C83907 +:10F86000FB380687300AF4081800FE91FF5D320865 +:10F87000C6E8A1A3C58B0F89F2C800305898E08B69 +:10F88000001EEEC8FFFF300B2309F60B002BF20B16 +:10F89000001B1139F2CA0030589AFE98FFF7E04970 +:10F8A0000024FE91FF40E04B0020E08909C1201BAD +:10F8B000FAF90680123BC095C108FAF90680ECCA35 +:10F8C000FFFF1236C1F5C268FAC9F9781097F20B3A +:10F8D000003BF6F2FDA4C358FAC7F9841AD7109773 +:10F8E000FAC2FAD01AD2FAC8FBCC029C1AD8FAC8CB +:10F8F000F974FAC9FFCC40BAF01F001C2FDD780262 +:10F90000C208FACEF9781496FC040038F0F2FDA48F +:10F91000C18840A859F9E0890011F0CBFFFC50AB39 +:10F920007002FACCF978F8090038F142FDA42FF9F9 +:10F930001496FB490680C058700214962FC850A830 +:10F940005802FE94FEF15C32A3A3CEDAFB68068770 +:10F95000CEAA0F38E048002AC0A03009C7D800005E +:10F960008002F5488003EDD08002F2280F88F0C9AC +:10F9700000305899E08B001EEEC5FFFF300B2308C6 +:10F98000F60B002BF00B001B0B38F0C90030589918 +:10F99000FE98FFF7E0480024FE91FEC5E04B0020F2 +:10F9A000E0890946201BFAF80680103BC095C10883 +:10F9B000FAF90680ECCAFFFF1236C1F5C288FACA0E +:10F9C000F978F40B003BF6FBFDA4503BC3C8FAC921 +:10F9D000F9841AD9FAC8FAD01AD8FAC8FBCC029C12 +:10F9E0001AD8FAC8F974FAC9FFCC40BAF01F027AE3 +:10F9F0002FDD780C503CC278FACEF9780E95FC04D5 +:10FA000000381496F0F8FDA45038C1D840A859F930 +:10FA1000E0890014F0CBFFFC700850AB5038FACCF2 +:10FA2000F978403BF8090038F14BFDA42FF90E9509 +:10FA3000FB4906801496C07870090E952FC850397E +:10FA4000149650A840385808FE95FE690A97C6BA21 +:10FA5000F40B00190F38F209002BF0CA0030589A45 +:10FA6000FE98FFF83FFEF20E0C495039C5FAA7B3D5 +:10FA7000C5AA30092308F2090029F00900190F3836 +:10FA8000F0CA0030589AFE98FFF7E0480024FE9133 +:10FA9000FE4DE0490020E08908CBF2C4000130109F +:10FAA000FE9FFE42A7A3FE9FFE3F0F89F0091800AC +:10FAB000C0512FF7A5B3FE9FFE37A5A3FE9FFE34CE +:10FAC000A5B3FE9FFE3150575042089740854074C1 +:10FAD0000C99FAF806805800C1D01037C064FACCEF +:10FAE000F978F8070037C1D8FAC8F9841AD8FAC8E3 +:10FAF000FAD01AD8FAC8FBCC1AD8FAC8F974FAC9DD +:10FB0000FFCC0A9A0E9B029CF01F02332FDD19B81E +:10FB1000C2282FF61039C084FACBF978F6070037DF +:10FB2000EF38FDA7C18840A959F8E0890012F2CA50 +:10FB3000FFFC50AA7209FAC2F978E408003A2FF8DB +:10FB4000F549FDA4FB480680F1D9C008C04813B8A8 +:10FB50002FC950A9300EFB680648FB6E0687E08F60 +:10FB600006A7A5A30C92EDB30005C4D1FAF8068050 +:10FB70005800C1E01037C064FACCF978F8070037B4 +:10FB8000C1F8FAC8F9841AD8FAC8FAD00A9A1AD869 +:10FB9000FAC8FBCC1AD8FAC9FFCCFAC8F9740E9B84 +:10FBA000029CF01F020D2FDD781A7809C288ECC282 +:10FBB000FFFF1036C0A4FACBF978F6070037EEFA4B +:10FBC000FDA8EEF9FDA4C1B840A959F8E0890013D9 +:10FBD000F2CAFFF850AAFAC6F978721AEC08003B8C +:10FBE0007209F74AFDA8F749FDA42FF8FB480680E3 +:10FBF000C068F2C8FFF8721A50A87209049650093A +:10FC0000501ACD58EDB30004C441FAF806805800EC +:10FC1000C1D01037C064FACEF978FC070037C1E8CC +:10FC2000FAC8F9841AD8FAC8FAD00A9A1AD8FAC8BF +:10FC3000FBCC0E9B1AD8029CFAC8F974FAC9FFCC07 +:10FC4000F01F01E52FDD780AC218ECC2FFFF103665 +:10FC5000C084FACCF978F8070037EEFAFDA4C16841 +:10FC600040A959F8E0890010F2CAFFFC50AAFACB6B +:10FC7000F978720AF6080039F34AFDA42FF8FB4818 +:10FC80000680C048720A2FC950A90496501AC8D8D5 +:10FC9000EDB30006C481FAF806805800C1D01037D1 +:10FCA000C064FAC8F978F0070037C1E8FAC8F984E7 +:10FCB0001AD8FAC8FAD01AD8FAC8FBCC1AD8FAC897 +:10FCC000F974FAC9FFCC0A9A0E9B029CF01F01C27C +:10FCD0002FDD9818C238ECC2FFFF1036C084FAC678 +:10FCE000F978EC070037EF08FDA6C18840A959F85C +:10FCF000E0890012F2CAFFFC50AA7209FACEF97824 +:10FD0000FC08003A2FF8F549FDA4FB480680F1D91C +:10FD1000B010C04892182FC950A950180496BF5867 +:10FD20005008C458FAF806805800C1D01037C06493 +:10FD3000FACBF978F6070037C1E8FAC8F9841AD87F +:10FD4000FAC8FAD00A9A1AD8FAC8FBCC0E9B1AD86D +:10FD5000029CFAC8F974FAC9FFCCF01F019F2FDD8D +:10FD6000780AC218ECC2FFFF1036C084FACAF978CC +:10FD7000F4070037EEFAFDA4C16840A959F8E089FC +:10FD80000010F2CAFFFC50AAFAC6F978720AEC0811 +:10FD90000039F34AFDA42FF8FB480680C048720AD8 +:10FDA0002FC950A90496501ABF5A500AFAEA000007 +:10FDB000580A5C2BC0E43008FAEA00003009F00A67 +:10FDC000010AF20B014B32D8FAEB0000FB68068700 +:10FDD0003010E08F04E30C99EDB30005C471FAF81C +:10FDE00006805800C1D01037C064FACAF978F40709 +:10FDF0000037C1D8FAC8F9841AD8FAC8FAD00A9AD2 +:10FE00001AD8FAC8FBCC0E9B1AD8029CFAC8F9740F +:10FE1000FAC9FFCCF01F01702FDD780AC2082FF657 +:10FE20001039C084FAC9F978F2070037EEFAFDA458 +:10FE3000C16840A959F8E0890010F2CAFFFC50AA35 +:10FE4000FAC3F978720AE6080039F34AFDA42FF8DC +:10FE5000FB480680C048720A2FC950A94062049826 +:10FE60009512BF589508FE9FFC03EDB30004C441F2 +:10FE7000FAF806805800C1D01037C064FACEF9787D +:10FE8000FC070037C1D8FAC8F9841AD8FAC8FAD0E2 +:10FE90000A9A1AD8FAC8FBCC0E9B1AD8029CFAC848 +:10FEA000F974FAC9FFCCF01F014C2FDD780AC208A3 +:10FEB0002FF61039C084FACCF978F8070037EEFA3B +:10FEC000FDA4C16840A959F8E0890010F2CAFFFCFE +:10FED00050AAFACBF978720AF6080039F34AFDA461 +:10FEE0002FF8FB480680C048720A2FC950A9406904 +:10FEF0009509FE9FFBBDE2130040C440FAF806805E +:10FF00005800C1D01037C064FAC8F978F00700373C +:10FF1000C1D8FAC8F9841AD8FAC8FAD00A9A1AD8F5 +:10FF2000FAC8FBCC0E9B1AD8029CFAC8F974FAC91D +:10FF3000FFCCF01F01292FDD780AC2082FF61039F7 +:10FF4000C084FAC3F978E6070037EEFAFDA4C16869 +:10FF500040A959F8E0890010F2CAFFFC50AAFAC281 +:10FF6000F978720AE4080039F34AFDA42FF8FB4837 +:10FF70000680C048720A2FC950A9406EB40EFE9F79 +:10FF8000FB77FAF806805800C1D01037C064FACC6D +:10FF9000F978F8070037C1D8FAC8F9841AD8FAC82E +:10FFA000FAD00A9A1AD8FAC8FBCC0E9B1AD8029C2F +:10FFB000FAC8F974FAC9FFCCF01F01072FDD780ADF +:10FFC000C2082FF61039C084FACBF978F60700374B +:10FFD000EEFAFDA4C16840A959F8E0890010F2CA00 +:10FFE000FFFC50AAFAC3F978720AE6080039F34A0E +:10FFF000FDA42FF8FB480680C048720A2FC950A9FB +:02000004800377 +:1000000040629502FE9FFB34A5A30C99EDB3000559 +:10001000C571FAF806805800C2601037C0A4FACE45 +:10002000F978FC070037EEEAFDA4FAEB0000C1887E +:10003000FAC8F9841AD8FAC8FAD01AD8FAC8FBCC88 +:100040001AD8FAC8F974FAC9FFCC0A9A0E9B029C16 +:10005000F01F00E12FDDF8E80000FAE900003000B1 +:10006000E08F03992FF61039C0B4FAC8F978F00779 +:100070000037EEEAFDA4FAEB0000E08F038C40A904 +:1000800059F8E0890016F2CAFFF850AAF2EA000017 +:10009000FAEB0000FACAF978F4080039FAEA00002D +:1000A000F2EBFDA42FF8FB480680E08F0374F2EA20 +:1000B00000002F89FAEB000050A9E08F036CEDB32C +:1000C0000004C141FAF806805800C0801037C60409 +:1000D000FACAF978F4070037C7782FF61039C774D1 +:1000E000FAC9F978F2070037C6F8EDB30006C45133 +:1000F000FAF806805800C1D01037C064FACCF978FD +:10010000F8070037C1D8FAC8F9841AD8FAC8FAD063 +:100110001AD8FAC8FBCC1AD8FAC8F974FAC9FFCCB5 +:100120000A9A0E9B029CF01F00AC2FDD9818C22883 +:100130002FF61039C084FACBF978F6070037EF08AC +:10014000FDA6C18840A959F8E0890012F2CAFFFC57 +:1001500050AA7209FAC2F978E408003A2FF8F54972 +:10016000FDA4FB480680F1D9B010C04892182FC9F1 +:1001700050A95C785018C418FAF806805800C1D00D +:100180001037C064FACCF978F8070037C1D8FAC83C +:10019000F9841AD8FAC8FAD00A9A1AD8FAC8FBCC45 +:1001A0000E9B1AD8029CFAC8F974FAC9FFCCF01F4A +:1001B000008A2FDD780AC2082FF61039C084FACBE6 +:1001C000F978F6070037EEFAFDA4C16840A959F89E +:1001D000E0890010F2CAFFFC50AAFAC2F978720A4C +:1001E000E4080039F34AFDA42FF8FB480680C04814 +:1001F000720A2FC950A9501A300E500E1C90E08F71 +:1002000002CA505750420897408540740C99FAF83A +:1002100006805800C1D01037C064FACCF978F807CE +:100220000037C1D8FAC8F9841AD8FAC8FAD01AD84F +:10023000FAC8FBCC1AD8FAC9FFCCFAC8F9740A9AE2 +:100240000E9B029CF01F00642FDD7809C2182FF668 +:100250001039C084FACBF978F6070037EEF9FDA41F +:10026000C17840A959F8E0890010F2CAFFFC50AAF1 +:10027000FAC2F9787209E408003AF549FDA42FF8AA +:10028000FB480680C058F2C8FFFC50A8720933082A +:10029000300EFB6806844D1C37885019A1B3FB68EB +:1002A0000685500E509CE08F02755057300B50421F +:1002B000FB6B06870897408540740C99FAF8068016 +:1002C0005800C1D01037C064FACAF978F407003773 +:1002D000C1D8FAC8F9841AD8FAC8FAD01AD8FAC814 +:1002E000FBCC0E9B1AD80A9AFAC8F974FAC9FFCC4B +:1002F000029CF01F00392FDD7807C2082FF6103955 +:10030000C084FAC9F978F2070037EEF7FDA4C16896 +:1003100040A959F8E0890010F2CAFFFC50AA720700 +:10032000FAC2F978E4080039F347FDA42FF8FB4836 +:100330000680C04872072FC950A9403E580EC1051B +:100340001C9A300B0E9CF01F0026E08002B6F807C6 +:100350000105403C1835E08902B0E08F02AF0E9CE9 +:100360003000F01F00201895E08F02A9A5A30C997A +:10037000EDB30005C581FAF806805800C2001037B9 +:10038000C064FACBF978F6070037C208FAC8F984D6 +:100390001AD8FAC8FAD00A9A1AD80E9BFAC8FBCC17 +:1003A000029C1AD8FAC8F974FAC9FFCCF01F000AE7 +:1003B0002FDDF8EA0000FAEB0000C3282FF6103911 +:1003C000C124FACAF978F4070037EEE8FDA4FAE987 +:1003D0000000C2688002F2288003EDE4800328A4B4 +:1003E0008002EDD040A959F8E0890015F2CAFFF863 +:1003F00050AAF2EA0000FAEB0000FACAF978F40811 +:100400000039FAEA0000F2EBFDA42FF8FB48068061 +:10041000C078F2EA00002F89FAEB000050A93010F2 +:10042000E08F01B9EDB30004C141FAF8068058002D +:10043000C0801037C604FACAF978F4070037C778C5 +:100440002FF61039C774FAC9F978F2070037C6F8E1 +:10045000EDB30006C451FAF806805800C1D0103739 +:10046000C064FACCF978F8070037C1D8FAC8F98423 +:100470001AD8FAC8FAD01AD8FAC8FBCC1AD8FAC8CF +:10048000F974FAC9FFCC0A9A0E9B029CF01F0086F1 +:100490002FDD9818C2282FF61039C084FACBF978CE +:1004A000F6070037EF08FDA6C18840A959F8E08992 +:1004B0000012F2CAFFFC50AA7209FAC2F978E408E5 +:1004C000003A2FF8F549FDA4FB480680F1D9B01099 +:1004D000C04892182FC950A95C785018C418FAF86F +:1004E00006805800C1D01037C064FACCF978F807FC +:1004F0000037C1D8FAC8F9841AD8FAC8FAD00A9ACB +:100500001AD8FAC8FBCC0E9B1AD8029CFAC8F97408 +:10051000FAC9FFCCF01F00642FDD780AC2082FF65D +:100520001039C084FACBF978F6070037EEFAFDA44B +:10053000C16840A959F8E0890010F2CAFFFC50AA2E +:10054000FAC2F978720AE4080039F34AFDA42FF8D8 +:10055000FB480680C048720A2FC950A9501A300EB5 +:100560003010500EC1794D1C509CEDB30005C541B3 +:10057000FAF806805800C2201037C0A4FACBF978E8 +:10058000F6070037EEE8FDA4FAE90000CF28FAC824 +:10059000F9841AD8FAC8FAD00A9A1AD80E9BFAC85F +:1005A000FBCC029C1AD8FAC8F974FAC9FFCCF01F28 +:1005B000003E2FDDF8EA0000C0C8ECCAFFFF10368D +:1005C000C0B4FAC9F9781496F2070037EEEAFDA430 +:1005D000FAEB0000CCE840A959F8E0890016F2E6F1 +:1005E0000000F2CBFFF8FAE7000050ABFAC6F9784A +:1005F000EC080039FAE60000F2E7FDA42FF81496A3 +:10060000FB480680CB68F2E600002F89FAE700007D +:1006100050A91496CAE8EDB30004C161FAF8068047 +:100620005800C0801037C6A4FACEF978FC0700370E +:10063000C838ECCAFFFF1036E0840082FACCF978A3 +:10064000F8070037C788EDB30006C4D1FAF8068072 +:100650005800C1D01037C064FACCF978F8070037D9 +:10066000C1F8FAC8F9841AD8FAC8FAD01AD8FAC860 +:10067000FBCC1AD8FAC8F974FAC9FFCC0A9A0E9BB7 +:10068000029CF01F00092FDD9818C2A8ECCAFFFFDA +:100690001036C0D4FACBF9781496F6070037EF0875 +:1006A000FDA6C1E88002F2288003EDE440A959F8D4 +:1006B000E0890013F2CBFFFC50AB7209FAC6F9785F +:1006C000EC08003B2FF8F749FDA4FB480680149680 +:1006D000F1D9B010C058921814962FC950A95C785F +:1006E0005018C458FAF806805800C1D01037C064BA +:1006F000FACCF978F8070037C1F8FAC8F9841AD8A3 +:10070000FAC8FAD00E9B1AD8FAC8FBCC0A9A1AD8A3 +:10071000029CFAC8F974FAC9FFCCF01F00C42FDD9F +:10072000780BC248ECCAFFFF1036C094FACBF978B8 +:10073000F60700371496EEFBFDA4C18840A959F8CE +:10074000E0890011F2CBFFFC50ABFAC6F978720BCE +:10075000EC080039F34BFDA42FF81496FB480680F3 +:10076000C058720B14962FC950A9501B300E500E52 +:100770004008401C300B18485F18E7E80008F608EE +:100780001800C0703308FB620685A1B3FB680684BD +:100790003020300AFB6A068740395809C025A7D3A4 +:1007A0004038401758085F194008FAC5F9900E48BC +:1007B00030025F18F3E81008E4081800C5E03018AC +:1007C000F0001800C0603028F0001800C051C3E8E5 +:1007D0000A970690C2C80A97FAE80000F5D8C00345 +:1007E0002D0A0EFAF00B1603F20C1603F7E911DBD3 +:1007F0001899169858085C29CF21FAE90000EDB342 +:100800000000C4613309F20A1800C4200EF9C408BC +:10081000F01F008730A82D0A3009AE8AFAEA0000DE +:10082000F01F008416991498FAE90000EECC00013C +:1008300030A83009FAEA00001897589A5C2BFE9B02 +:10084000FFE91BF800932D08C2080A97FAE8000098 +:10085000F5D8C004409EFC0A070A0EFAF20B1604F3 +:10086000F00A1604F5E911CA1699149858085C297B +:10087000CF01FAE90000C0C85800C091EDB30000F4 +:10088000C061FAC7F9913308AE88C0280A970E15DF +:100890004030C14850425057407410925802E08096 +:1008A00001B6300CFB620648FB6C06873015300041 +:1008B000FAC7F9B8C03840353000069A0699E21AEE +:1008C0000002E2190084508A5079EA000C42FB3899 +:1008D0000687300BF6081800F7B201FF580AF7B286 +:1008E00001FE5809C4514048041850385808E0899E +:1008F000001DC3E8FB4C06784CFE310C890E891CA8 +:10090000FB4B0674587BE08900042F84C0B8FACAF8 +:10091000F990402B029CF01F0049E0810189FAC444 +:10092000F9F8403B210B503BFAF90678FAF80674C7 +:10093000F2CCFFF0F0CBFFFF4BFA403E590EFE9990 +:10094000FFDB1C09890AFB490678891EFB4B0674EC +:10095000587BE08900042F84C0B8FACAF990402B74 +:10096000029CF01F0036E0810163FAC4F9F8FB38FD +:100970000687300CF8081800C1F0FAF80678FAC9B2 +:10098000F9792FF88909FB4806783019FAF80674C6 +:1009900089192FF8FB4806745878E08900042F84E1 +:1009A000C0B8FACAF990402B029CF01F0024E081E5 +:1009B000013FFAC4F9F8408B580BC1F0FAF80678F9 +:1009C000FAC9F97C2FE88909FB4806783029FAF83A +:1009D000067489192FF8FB4806745878E0890004DA +:1009E0002F84C0B8FACAF990402B029CF01F001364 +:1009F000E081011EFAC4F9F8407AE04A0080C5118E +:100A00004049041950395809E0890029C4A848C848 +:100A1000310EFB4C06788908891EFB4B0674587B07 +:100A2000E08900102F84C1788002F228800373408F +:100A30008002D9988003EDF88002F5488003ECE845 +:100A4000FACAF990402B029CF01F0052E08100F09E +:100A5000FAC4F9F8403C210C503CFAF90678FAF84F +:100A60000674F2CCFFF0F0CBFFFF4CBA403E590EBB +:100A7000FE99FFCF1C09890AFB490678891EFB4BAA +:100A80000674587BE08900042F84C0B8FACAF99034 +:100A9000402B029CF01F003FE08100CAFAC4F9F825 +:100AA0000A105800E089001BC3B8FB4C0678310AD5 +:100AB0004B9C891A890CFB4B0674587BE089000417 +:100AC0002F84C0B8FACAF990402B029CF01F003165 +:100AD000E08100AEFAC4F9F82100FAF90678FAF8D4 +:100AE0000674F2CCFFF0F0CBFFFF4ABA5900FE9932 +:100AF000FFDE0009890AFB4906788910FB4B067462 +:100B0000587BE08900042F84C0B8FACAF990402BC2 +:100B1000029CF01F0020E081008BFAC4F9F8FAF87B +:100B2000067889158907F0050005FAF80674FB4573 +:100B300006782FF8FB4806745878E08900042F8463 +:100B4000C0A8FACAF990402B029CF01F0012C6F10F +:100B5000FAC4F9F8E2130004C41040470417580718 +:100B6000E089001CC3B8FB4C067889058913FB4B50 +:100B70000674587BE08900042F84C098009A402BAB +:100B8000029CF01F0004C531FAC4F9F82107C0988F +:100B90008002F5488003ECE84AB53103FAC0F990C9 +:100BA000FAF90678FAF80674F2CCFFF0F0CBFFFF02 +:100BB0004A5A5907FE99FFD90E09890A8917FB4934 +:100BC0000678FB4B0674587BE08A0009FACAF99054 +:100BD000402B029CF01F001DC2A140684049E4095F +:100BE0000C4204085068FAF806785808C080FACA1F +:100BF000F990402B029CF01F0015C1913003FAC4FC +:100C0000F9F8FB430674FE9FF53302934020FAF88F +:100C100006785808C080029CFACAF990009BF01F21 +:100C2000000BC0613008FB480674C0284020806873 +:100C3000EDB80006C0313FF25062406CFE3DF978DD +:100C4000D83200008003EDF88002F548D431FACDA7 +:100C500001E03007503C16961295507A5087505755 +:100C60000E930E905047407E1D8957795809E080B9 +:100C700007A22FFE4D5C507E780C502CF809070817 +:100C8000E2180008C1B06C185808E08900070C9BF6 +:100C9000403CF01F004FCE816C084CCBF0C9FFFFE9 +:100CA000760A1188F4080708EDB80003CDD16C1856 +:100CB0008D0920182FF08D18CE7BE0490025E081AA +:100CC000008906941091109236CA344C358E407BC0 +:100CD0001739507B364BF6091800E08000BBE08BDB +:100CE0000042F8091800E08000B4E08B0021339B3B +:100CF000F6091800E08B01D2330BF6091800E082E8 +:100D00000094325BF6091800C640E08B000B5809CE +:100D1000E080074F324BF6091800E08101BFC8A8F8 +:100D200032ABF6091800E08101B9C6D8FC091800F9 +:100D3000E08000A4E08B000C34CBF6091800C7005B +:100D400034FAF4091800E08101A9C8C835BAF409D9 +:100D50001800E0800098363AF4091800E081019EFE +:100D6000C9E836FBF6091800C7E0E08B0017369B90 +:100D7000F6091800C720E08B0008368BF60918002A +:100D8000E081018CC4F8F4091800C3F036EAF409D4 +:100D90001800E0810183C8D8373AF4091800C1303F +:100DA000E08B0008370AF4091800E0810177C7A832 +:100DB000375AF4091800C5C0378AF4091800E081D1 +:100DC000016DC5B83029C7590000049C800328BCB8 +:100DD0006C185808E08900080C9B403CF01F006428 +:100DE000E08106E0407A6C08F539FFFF118AF20ACB +:100DF0001800E08106E02FF82FF08D086C182018FD +:100E00008D18C32BA5A1C64B407B1789F409180088 +:100E1000C0512FFBA1B1507BC5BBA1A1C59BA1B106 +:100E2000C57BA3A1C55BE4020022A17223021202CA +:100E3000C4FBE0420020E08B0007E4C4000130184E +:100E40003002C46B3168403A9538E08F06ABA1A1FF +:100E50004C8930AE5089C2B84C6C300B508C505B12 +:100E6000C279A1A14C4A3089508A5059C2194C2EDE +:100E700030AC508E505CC1C94BFBA9B1508B310ACC +:100E8000C169301950085019407BFACCFFD4F01FCB +:100E9000003BA7A1507C40194008C0B9A7A1300968 +:100EA000C0894B59E81102205089310E505EC009AB +:100EB000EDB10004FE90FED9EDB10002C441580826 +:100EC000C2500E34C064FACCFE20F8040024C2786C +:100ED000FACAFED40A99F407002A0E98130B14AB31 +:100EE0002FF81034CFC4EEC9FFFFEE0811FFF0C792 +:100EF000FFFF2FE808080807EA080025F2070007A7 +:100F0000FAC8FED4F0040324C1C8E6C8FFFF0E33BC +:100F1000C094FACBFE201093F6040024E8F4FF4CB2 +:100F2000C1086A042FC559F7E089000B1093FACA6B +:100F3000FE20F40700282FF7F144FF4CC02810933F +:100F4000A800C92AEDB10000C1A15808E0800088BE +:100F50000E34C635FACAFED40A99F407002A0E9850 +:100F6000130B14AB2FF81034CFC4C678800328BC01 +:100F70008002EFB480032E6C800329ECE2110002A2 +:100F8000C4805808C2500E34C064FACCFE20F80465 +:100F90000024C278FACAFED40A99F407002A0E98EF +:100FA000130B14AB2FF81034CFC4EEC9FFFFEE08BB +:100FB00011FFF0C7FFFF2FE808080807EA0800251F +:100FC000F2070007FAC8FED4F0040324C1C8E6C83B +:100FD000FFFF0E33C094FACBFE201093F6040024DA +:100FE000E8F4FF4CC1086A042FC559F7E089000BEB +:100FF0001093FACAFE20F40700282FF7F144FF4CA3 +:10100000C0281093E008141F89108908FE9FFE2D48 +:101010005808C2500E34C064FAC9FE20F2040024FD +:10102000C278FACAFED40A99F407002A0E98130B64 +:1010300014AB2FF81034CFC4EEC9FFFFEE0811FF38 +:10104000F0C7FFFF2FE808080807EA080025F207A5 +:101050000007FAC8FED4F0040324C1C8E6C8FFFFA5 +:101060000E33C094FAC2FE201093E4040024E8F486 +:10107000FF4CC1086A042FC559F7E089000B109393 +:10108000FACEFE20FC0700282FF7F144FF4CC028C1 +:1010900010938900FE9FFDE9402CF8090709EDB97E +:1010A0000000C021A1A14C7B30AA508B505A30398E +:1010B0006C1A580AE089000C501950080C9B403CEF +:1010C000F01F004140194008E081056CEDB10006B9 +:1010D000C151C1F86C1A201A8D1A580AE08A00040E +:1010E0008D0CC0B8501950080C9B403CF01F0036C6 +:1010F00040194008E08105562FF06C0A4B3EF4CCB5 +:10110000FFFF7C0B158AF60A070AEDBA0003CE3002 +:101110005829E08001C05839E080031D5819E0804B +:10112000011B029CE21C0010502C5802F9B2000175 +:10113000E3D1C001E080009B580CC0303001C4985E +:101140005808C2500E34C064FACBFE20F6040024C6 +:10115000C278FACAFED40A99F407002A0E98130B33 +:1011600014AB2FF81034CFC4EEC9FFFFEE0811FF07 +:10117000F0C7FFFF2FE808080807EA080025F20774 +:101180000007FAC8FED4F0040324C228E6C8FFFF13 +:101190000E33C094FACAFE201093F4040024E8F43D +:1011A000FF4CC1686A042FC559F7E08900111093FC +:1011B000FAC9FE20F20700282FF7F144FF4CC0883F +:1011C0008002EFB4800328BC0000049C10930891B7 +:1011D00030044D5E7C081034E08004E46C08118912 +:1011E000FAC8FE200808F169FFCC6C1820188D1889 +:1011F0006C082FF8308A8D08300BFACCFE2CF01FCB +:10120000004B2FF4FAC8FE2C0899FACAFE54029B30 +:10121000403CF01F00475BFCE08004C4580CC061F8 +:10122000402C580CC051830CC0385BECC0B0080097 +:10123000402B2012580BF9B40100F7B100FCFBF46D +:1012400000026C185808E089000B0C9B403CF01F12 +:101250000039C0505804C050E08F04A45802CBA1FC +:10126000402A580AFE91FD01C718402E580EC1A011 +:101270006C186C090438C0F4100910128D091001A3 +:101280000C9B403CF01F002BCF405801E08101E651 +:10129000E08F0488040904188D098D180401E08F7B +:1012A00001DD5808C2500E34C064FACCFE20F804A8 +:1012B0000024C278FACAFED40A99F407002A0E98CC +:1012C000130B14AB2FF81034CFC4EEC9FFFFEE0898 +:1012D00011FFF0C7FFFF2FE808080807EA080025FC +:1012E000F2070007FAC8FED4F0040324C258E6C887 +:1012F000FFFF0E33C094FACBFE201093F6040024B7 +:10130000E8F4FF4CC1986A042FC559F7E08900142E +:101310001093FACAFE20F40700282FF7F144FF4C7F +:10132000C0B80000000009AC8002E8BC800328407F +:10133000800328BC1093049A089C0C99301BF01F62 +:1013400000C9E080042FF800000040492FF95049FF +:10135000FE9FFC8B5802F9B200FFEDB10004C261A0 +:1013600030040891C1286C188D0920188D182FF4AD +:101370000832E080008D5808E08900080C9B403C52 +:10138000F01F00B9E08100846C08FACEFE20F0C99D +:10139000FFFF1188FC080008F138FE4CE208180035 +:1013A000CE315804C741E08F04065808C2500E34AD +:1013B000C064FACCFE20F8040024C278FACAFED435 +:1013C0000A99F407002A0E98130B14AB2FF8103467 +:1013D000CFC4EEC9FFFFEE0811FFF0C7FFFF2FE8F3 +:1013E00008080807EA080025F2070007FAC8FED433 +:1013F000F0040324C1C8E6C8FFFF0E33C094FACB43 +:10140000FE201093F6040024E8F4FF4CC1086A049F +:101410002FC559F7E089000B1093FACAFE20F40794 +:1014200000282FF7F144FF4CC02810930891300892 +:10143000C1886C1A201A8D1A133A02CA8D095802F3 +:10144000C1D06C195809E089000D50080C9B403C34 +:10145000F01F00854008C0500831C101E08F03A291 +:101460006C0AFACEFE2014992012158AFC0A000A92 +:10147000F53AFE4CF00A1800CDD1E2040104E080F8 +:10148000039A404C2FFC504C3008A2880800FE9F65 +:10149000FBEC029BE21B0010502B5802F9B200FF3C +:1014A000E3D1C001E08000BC580BC050FACAFE2452 +:1014B000506AC4385808C2500E34C064FAC9FE20BD +:1014C000F2040024C278FACAFED40A99F407002A6A +:1014D0000E98130B14AB2FF81034CFC4EEC9FFFFD6 +:1014E000EE0811FFF0C7FFFF2FE808080807EA0819 +:1014F0000025F2070007FAC8FED4F0040324C1C88F +:10150000E6C8FFFF0E33C094FACEFE201093FC0411 +:101510000024E8F4FF4CC1086A042FC559F7E0899C +:10152000000B1093FACCFE20F80700282FF7F144A7 +:10153000FF4CC0281093506430014CC4C598680813 +:101540001031E080032FFAC8FE200208F169FFCCB9 +:101550006C1820188D186C082FF8308A8D08300B05 +:10156000FACCFE2CF01F00422FF1FAC8FE2C029993 +:10157000FACAFE54406B403CF01F003E5BFCE0802A +:101580000311580CC041406B970CC0385BECC23063 +:10159000406A740CF01F0038C100FAC4FE20020437 +:1015A0002354C088098B201120140C9A403CF01F52 +:1015B00000335801CF81C2C80200402920125809C7 +:1015C000F8011710FBF80006F7B800FCFBF80A0654 +:1015D000FBF100026C185808E089000B0C9B403CA2 +:1015E000F01F0021C0505801E08102DCC1186C08D6 +:1015F00058025F1A11894A2E300C7C08F00907083E +:10160000EC180008F5E80238F8081800C991402BDA +:10161000580BFE91FB2A406A950BC98A402E580E42 +:10162000C300C1086C188D0A20188D182FF10232E2 +:10163000C1405808E08900070C9B403CF01F000A9D +:10164000C0C16C0848ECF0CAFFFF78091188F208A5 +:101650000708EDB80003CE710200FE9FFB060000F4 +:10166000800320B8800328BC000009AC8002E8BCDD +:10167000800328408003274880032FF40000049C47 +:101680005808C2500E34C064FACBFE20F604002481 +:10169000C278FACAFED40A99F407002A0E98130BEE +:1016A00014AB2FF81034CFC4EEC9FFFFEE0811FFC2 +:1016B000F0C7FFFF2FE808080807EA080025F2072F +:1016C0000007FAC8FED4F0040324C1C8E6C8FFFF2F +:1016D0000E33C094FACAFE201093F4040024E8F4F8 +:1016E000FF4CC1086A042FC559F7E089000B10931D +:1016F000FAC9FE20F20700282FF7F144FF4CC0285A +:1017000010930891C1286C1920198D19113902C93B +:101710008D085802C1506C185808E08900070C9BCE +:10172000403CF01F0059C0C16C094D8E12987C0AD4 +:1017300013892012F4090709EDB90003CE51404C7A +:101740002FFC504C08103008E2000000A288FE9FD9 +:10175000FA8CE4C90001E0490026E08B0005300B5B +:10176000506BC058E4CA00273272506A3009FACE72 +:10177000FE54509950A7E8110D80502E35894057DE +:101780006C0A339C158AF80A1800E08B0015338B1D +:10179000F60A1800C4E2330BF60A1800C270E08B98 +:1017A000004532BBF60A1800C51032DBF60A1800F5 +:1017B000C7C1C4C8F20A1800C4E0E08B000AF4CB29 +:1017C0000041305EFC0B1800E08B0070C398361CA3 +:1017D000F80A1800C6A3366BF60A1800E088003134 +:1017E000378EFC0A1800C611C368029BEDB1000BCE +:1017F000C3C15807E06B0200E3DBE031F9B7000832 +:10180000EDB1000AC041E011FA7FC2F8409B406C84 +:101810002FFB580CF7BC0101FBFC1A06F7B201FFC5 +:10182000E011FC7F509BC248499EFC070417C0B8DA +:10183000497CF80704175887E0890006C36858A751 +:10184000E08A0034E011F47FC108EDB10007C2D195 +:10185000A7D1C0B8029BE21B0600E04B0200C251B8 +:10186000A9D13107E8110500402B16CA502B6C1A7C +:10187000201A8D1A580AE08A000D6C0A2FFA8D0A78 +:10188000C1180000800328BC0000049C8003EF08FE +:10189000501950080C9B403CF01F00BD40194008F7 +:1018A000C0412012FE91FF6E505740A7EDB10008D5 +:1018B000C161FAC9FE54402A123AE088000B40295F +:1018C0000C9A137B403C50085029F01F00B240088E +:1018D000FAC9FE5440221232E080016D029AE21AE7 +:1018E0000010E081014B402EBC8A50084059FACBD1 +:1018F000FE54403C40825D1202994008E2190020EB +:10190000C2A05808C1400E34C064FACEFE20FC04C8 +:101910000024C1D9FACAFED40A99F407002A0E9805 +:10192000130B14AB2FF81034CFC4CF68E6C8FFFFF9 +:101930000E33C064FACBFE20F6040024C0796A049A +:101940002FC559F7E08901151093FACAFE20F40754 +:101950000028C0A9EDB10002C4415808C2500E349D +:10196000C064FAC9FE20F2040024C278FACAFED488 +:101970000A99F407002A0E98130B14AB2FF81034B1 +:10198000CFC4EEC9FFFFEE0811FFF0C7FFFF2FE83D +:1019900008080807EA080025F2070007FAC8FED47D +:1019A000F0040324C1C8E6C8FFFF0E33C094FAC296 +:1019B000FE201093E4040024E8F4FF4CC1086A04FC +:1019C0002FC559F7E089000B1093FACEFE20FC07D3 +:1019D00000282FF7F144FF4CC0281093A80CCCA886 +:1019E000F5D1C001C2A05808C1400E34C064FACB82 +:1019F000FE20F6040024CAB8FACAFED40A99F407F5 +:101A0000002A0E98130B14AB2FF81034CFC4C8481B +:101A1000E6C8FFFF0E33C064FACAFE20F4040024B7 +:101A2000C9586A042FC559F7E08900A31093FAC971 +:101A3000FE20F2070028C988E2110002C5904D6916 +:101A400040821232C091FACBFE544059403C5008BB +:101A5000F01F0052C088FACBFE544059403C500859 +:101A6000F01F004F40085808C2500E34C064FACE30 +:101A7000FE20FC040024C278FACCFED40A99F807B0 +:101A8000002C0E98130E18AE2FF81034CFC4EEC9E8 +:101A9000FFFFEE0811FFF0C7FFFF2FE80808080757 +:101AA000EA080025F2070007FAC8FED4F004032470 +:101AB000C1C8E6C8FFFF0E33C094FACCFE201093D5 +:101AC000F8040024E8F4FF4CC1086A042FC559F754 +:101AD000E089000B1093FAC9FE20F20700282FF7C7 +:101AE000F144FF4CC0281093891A890BC438580858 +:101AF000C2500E34C064FAC8FE20F0040024C2783C +:101B0000FACAFED40A99F407002A0E98130B14ABF4 +:101B10002FF81034CFC4EEC9FFFFEE0811FFF0C755 +:101B2000FFFF2FE808080807EA080025F20700076A +:101B3000FAC8FED4F0040324C1C8E6C8FFFF0E3380 +:101B4000C094FAC2FE20E40400241093E8F4FF4C91 +:101B5000C1086A042FC559F7E089000B1093FACE2B +:101B6000FE20FC070028F144FF4C2FF7C0281093FB +:101B7000890C404C2FFC504CFAC8FE54409B10106E +:101B8000402A1600F4000000FE9FF86F800328BC76 +:101B900080032FF480032E6C80032CE480032B340D +:101BA00040495809C0508C68EDB80006C0313FF874 +:101BB0005048404C288DD832D421217D1497189656 +:101BC000129A5807C064E068008B99383FFCC2281D +:101BD0005807EE0C1700F9B901FFEFD9E10C109985 +:101BE000E0680208BA683FF8504B505C500B502C2C +:101BF000BA781A9B0C9CF01F00095BFCC044E0689B +:101C0000008B8D385807F9B90100FBF81000F1F985 +:101C10001E002E9DD82200008002F568D401129883 +:101C20001499169A189B483C780CF01F0003D802B0 +:101C30000000059880031BB8D4214B3818961697DE +:101C4000700C580CC06078685808C031F01F002F25 +:101C50004AF81037C0514AC870087007C0E84AD81F +:101C60001037C0514A8870087017C0784AA81037DA +:101C7000C0414A58700870278E68EDB80003C1E073 +:101C8000EDB80004C3E1EDB80002C1516EDB580BA2 +:101C9000C0A0EEC8FFBC103BC0400C9CF01F001F52 +:101CA00030088FD88E68E018FFDBAE6830088F18D8 +:101CB0006E488F088E68A3B8AE686E485808C0B1E9 +:101CC0008E68E2180280E0480200C0500C9C0E9B17 +:101CD000F01F00138E69F1D9C001C07030088F2841 +:101CE0006E585C388F68C068EDB90001EFF81005D8 +:101CF0008F286E485808C0618E68EDB80007C02173 +:101D0000DC2AD82A0000059880031F388003EF2CB6 +:101D10008003EF4C8003EF6C8003217C8003276CF1 +:101D20004828700C2F4C5EFC00000598D4211697B3 +:101D3000189676485808C7D0580CC060786858087C +:101D4000C031F01F003D4BD81037C0316C07C0A820 +:101D50004BB81037C0316C17C0584BA81037EDF78F +:101D600000028E6A1498EDBA0003C420ABBAAE6AC2 +:101D70006E185808E08900066F085808E08A005A73 +:101D80006EB85808C560E21A1000C0306F55C0F830 +:101D900030196E8B0C9C5D1818955BFCC0816C38FB +:101DA00059D8C4708E68A7A8AE68D8228E68EDB8DE +:101DB0000002C0916E1810156ED85808EFF8101078 +:101DC000EBD8E1156EB80C9C30090A9A6E8B5D1841 +:101DD0008E680A3CC261ABD8300C6E49AE688F1C6D +:101DE0008F09EDB8000CC251EF450054D8226E4562 +:101DF0005805C1F06E04F5DAC0028F05F9B801008C +:101E0000EFF800050A148F28C11808990A9A6EA8DD +:101E10006E8B0C9C5D181814580CE08900078E68B6 +:101E2000A7A83FFCAE68D82218055804FE99FFEF1A +:101E3000D82A000080031F388003EF2C8003EF4C6A +:101E40008003EF6CD401189B580CC0714868487B24 +:101E5000700CF01F0007D8024868700CF01F0003D8 +:101E6000D80200008003ECA880031D2C800325E825 +:101E7000000005985EFC5EFCD401483BF01F0003A7 +:101E8000D80200008003629080032640D42116957A +:101E9000F606105CECCBFFF4F01F00071897C0901B +:101EA0009915300B2F4C0C9A8F2C8F0BF01F0003C1 +:101EB0000E9CD8228002E2BC8002E8BCD42149C832 +:101EC000189670076E685808C0410E9CF01F0019E4 +:101ED000EEC7FF2830056E2C6E18C0689869EA09B5 +:101EE0001900C1202A4C2018CFA76E085808C071CD +:101EF000304B0C9CF01F00108F0CC0306E07CECB07 +:101F000030C88D38D8223008F948004C99089928F3 +:101F1000991899489958996899D899E8F9480048C2 +:101F20003FF8B8783018B868D82200008003ECA8D1 +:101F300080031F3880031E8CD421189678675807B9 +:101F4000C4714A48301599A8F94700D8F94700DC10 +:101F5000F94700E09965F01F00208D0C0C9CF01FE4 +:101F6000001E8D1C0C9CF01F001C6C093048930750 +:101F7000B268931793276C18B27793479357936778 +:101F80009389910791179127494E495B939E93AB93 +:101F9000494A495493BA93C43099B069B07591C411 +:101FA0009147915791679188919E91AB91BA8D2CF1 +:101FB00031289907B868991799273028B87899C4B3 +:101FC0009967999E99AB99BA99479957998CD82254 +:101FD00080031E7880031EBC80032B1080032AD848 +:101FE00080032AAC80032A9CD4014858169AFAC967 +:101FF000FFFC189B700CF01F0003D802000005982E +:1020000080033424D43114901291169310971895AC +:10201000F20A02425802C0310491C418580CC06040 +:1020200078685808C031F01F001F49F81037C031D8 +:102030006A07C0A849D81037C0316A17C05849C8C4 +:102040001037EBF700026E185808C03430088F18AC +:102050000496C148F01F00176E08080308160E9B6F +:10206000F00400040A9C8F04F01F0013C070E40603 +:102070000109F2000D081091C1286E146E08069C2B +:10208000089A109B0836FE9BFFE70C9AF01F000988 +:102090006E080C088F086E180C188F18029CD83226 +:1020A00080031F388003EF2C8003EF4C8003EF6C1C +:1020B0008002E736800328BCD40112981499169A3E +:1020C000189B483C780CF01F0003D80200000598CC +:1020D00080032004D42116951897F01F00234A345A +:1020E00068287016E016FFFCECC8FF91F0050105AA +:1020F000E015FF80EAC50080E045007FE08A00230C +:10210000300B0E9CF01F001A68280C08103CC1A16F +:10211000EA0B11000E9CF01F00165BFCC171300B26 +:102120000E9CF01F00136828F808010958F9E08A8E +:10213000000AA1A9911948F8700948F8F80901099D +:1021400091090E9CF01F000DD82A68280A16A1A636 +:102150009116489870090A190E9C9109F01F000702 +:10216000DA2A00008002E8CA0000059C8002EBC861 +:10217000000009A800007AD08002E8CCD42116968D +:102180001897580BE08000CAF01F004E20864CEADA +:102190006C18742EF9D8C001A1C8EC080009721B94 +:1021A000E01BFFFC1C39C1D1F6080008580CC081A7 +:1021B0006C09121612086C3B6C299729933B1099F5 +:1021C0009526A1A98D194C1972091238C0634C08C3 +:1021D0000E9C700BF01F003F0E9CF01F003FD8229A +:1021E000931B580CC030300CC1086C0EF4C5FFF8BE +:1021F0001C161C086C2E0A3EF9BC0001EDF51003FC +:10220000EBFE1A02FDF51A03F20B000E7C1EEDBE6A +:102210000000C1301608580CC0C14ABE722B2F8E68 +:102220001C3BC071973697268D2B8D3B301CC058B8 +:10223000722B7239932B97391099EC080908A1A9D0 +:102240008D19580CC671E04801FFE08B0013A3986C +:10225000F4080039722B8D398D2B97369326A348BD +:102260007419301BF6080948F3E810089518C528BA +:10227000F00916095849E08B0006F00B16062C8B66 +:10228000C2D85949E08B0005F2CBFFA5C278E049DE +:102290000054E08B0006F00B160C292BC1F8E04926 +:1022A0000154E08B0006F00B160F289BC178F00B51 +:1022B0001612E0490554E088001137EBC0F8000021 +:1022C0008002E8CA0000059C000009A400007ACC46 +:1022D000800320D48002E8CC284BF40B003C782902 +:1022E0001839C0E17418A34B301CF80B094BF1EB03 +:1022F000100B1298951BC0A872291839C060721A69 +:10230000E01AFFFC1438CF9372388D388D2993363C +:1023100091260E9CF01F0002D82200008002E8CC1B +:10232000D431203D14941895169774285808E080ED +:10233000014A9668EDB80003C04176485808C0C10C +:102340000E9B0A9CF01F00A1C0708E68A7A8AE6803 +:1023500030988B38C3598E6368000696E2160002E7 +:10236000C2103003E06204000696C04860036016A5 +:102370002F805806CFC0E0460400EC091780E4091E +:1023800017B0069A6EA86E8B0A9C5D181816580C2A +:10239000E08A0114682818188928E08001141803BD +:1023A000CE9BE7D3C001C07050060C930C91501522 +:1023B0000892CA0806960891C048600360162F80EC +:1023C0005806CFC08E686E241099E2190200C570BD +:1023D0000836C4531099E2190480C4106E4B6E097C +:1023E000161950096E59109CF209001A3028F40889 +:1023F0000C08FAE9000410944009E21C04002FF9CB +:102400000C091238F2041730580CC110089B0A9CB2 +:10241000F01F006F1892C150400A6E4BF01F006D04 +:102420008E68E018FB7FA7B8AE68C0E8089A0A9CDF +:10243000F01F00691892C0816E4B0A9CF01F006764 +:1024400030C88B38CBA8400A4009E80A010AE409E1 +:1024500000088F548F2A8F088F420C940836EC04A2 +:102460001730069B089A6E0CF01F005D6E08080876 +:102470008F086E2808180C948F28C30808365FBA96 +:102480006E0C6E48103C5FB8F5E80008F2081800C2 +:10249000C0E0069B089AF01F00526E0808080E9BC9 +:1024A0008F080A9CF01F004FC190C8786E591236F1 +:1024B000C0A36EA8069A6E8B0A9C5D181894E089DA +:1024C000000EC7B80C9A069BF01F00456E080C085A +:1024D0000C948F086E280C188F28622808188328FF +:1024E000C71008160803C6DB6003601130082F8090 +:1024F00050085801CFA0400A580AC181029A30AB57 +:10250000069CF01F0039F9B80101F9D8E106EDD3B6 +:10251000E116F9B90101FBF91A00F9B80001E3D895 +:10252000E006F9B80001FBF80A000236EC04178057 +:10253000E20417B06E596E25F20500050A345F9A61 +:102540006E0C6E48103C5FB8F5E80008300AF408DD +:102550001800C0E0069B0A9AF01F00216E080A08C6 +:102560000E9B8F08401CF01F001FC180C2681234F0 +:10257000C0A56EA8069A6E8B401C5D181895E08960 +:10258000000EC1B8089A069BF01F00156E080808D7 +:1025900008958F086E2808188F280A16C0710E9BA0 +:1025A000401CF01F0010C091500664280A188528AE +:1025B000C0900A110A03C9EB8E68A7A8AE683FFC59 +:1025C000C028300C2FDDD83280031C388002E2BCDA +:1025D0008002E7368002E8E88003217C8002E87E02 +:1025E00080031D2C800328A4D43130051893169045 +:1025F0000A91F01F00123FF2E6C7FF28C1786E264D +:102600006E142F46C0D88C08E2081900C0808C18C0 +:10261000E4081900C040069C5D1018452A462014A5 +:10262000ECCB000C5804CF046E075807CE91F01F76 +:1026300000040A9CD832000080031E7480031E76BA +:10264000D43130051691F8C7FF280A92F01F001008 +:102650003FF3C1686E266E142F46C0C88C08E4088C +:102660001900C0708C18E6081900C0305D111845BB +:102670002A462014ECCC000C5804CF146E075807DF +:10268000CEA1F01F00040A9CD832000080031E7403 +:1026900080031E76D401201D4848189B1A9A700C9E +:1026A000F01F00032FFDD80200000598800326B01C +:1026B000D431169414921895F01F00204A08700720 +:1026C0005807C050300633DA0C98C0780A9CF01FC7 +:1026D000001D0E9CD8322FF6E8060709F0091800F5 +:1026E0005F1BF40918005F191669F0091800CF4143 +:1026F000C1A8029C0C9A089BF01F0013C1216E0117 +:102700000C010388E6081800C0C148D870080A9C6C +:102710001017A3478507F01F000BE2CCFFFFD8324C +:102720002FC7C02833D36E015801CE410A9CF01F39 +:102730000005029CD8320000800361BC000009B093 +:10274000800361BE8002EDE6E04C00FFE0880003FC +:102750005EFD48487008F00C070CE21C00085EFCA7 +:102760000000049C481C5EFC8003EF8CD42120FDFB +:10277000966816971896E2180002C3C1967BF00B74 +:102780001900C0551A9AF01F002AC0F48E650A98E5 +:10279000ABB8E2150080AE683004E0680400F9B51B +:1027A0000140F0051700C1B84018E218F000E048F9 +:1027B00020005F04E0488000C0D16EB949D81039CC +:1027C000C0918E68E0650400ABA8EF450050AE688C +:1027D000C0688E68E0650400ABB8AE680A9B0C9CCC +:1027E000F01F00158E68C0D1EDB80009C1E0A1B896 +:1027F000AE68EEC8FFB98F488F0830188F58C1589F +:10280000A7B88F4CAE688F5548C88F0C8DA8580458 +:10281000C0C08E7CF01F000AEFF81206F9B9010162 +:10282000F1D9E138EFF81C062F1DD822800362A8E9 +:1028300080032AAC8002E2BC80031E788002F1682B +:10284000D42118971096580AC041149B3019486A31 +:10285000F01F00065BFCC06130088D08E068008A4C +:102860008F38D82280037E208003286C201D5809D1 +:102870005F09580BFA0B1700580A5F18F3E80008B5 +:102880003009F2081800C0303FECC0B8580AC03117 +:10289000149CC078158997091589F00918005F1CE8 +:1028A0002FFD5EFCF7DBC008C068201A19881638B7 +:1028B0005E0C2FFC580ACFA15EFAD703D4211697DD +:1028C0001896580CC06078685808C031F01F00385E +:1028D0004B881037C0316C07C0A84B781037C03117 +:1028E0006C17C0584B581037EDF7000230088F189E +:1028F0008E68EDB80005C590EDB80002C1A0EDB836 +:102900000004C060A7A8AE6830988D38C4D8EDB870 +:102910000003C0B10E9B0C9CF01F0029C4618E689F +:102920008F6CA3D88F2CAE688E68A3A8AE68C14800 +:102930006EDB580BC110EEC8FFBC103BC0400C9CB6 +:10294000F01F0020300C6F088FDC8F185808C04033 +:102950006EF88F08D8226E485808C0510E9B0C9C08 +:10296000F01F00198E68F1D8C002C0604978498B09 +:10297000700CF01F00186E4A6E980C9C8F0A6E59EE +:102980006E8B5D188E688F1CADD8AE68580CE08ACF +:102990000003D82A580CC041A5B8AE68C058A7A8F3 +:1029A000AE6830088F18DC2ADC2A000080031F384C +:1029B0008003EF2C8003EF4C8003EF6C80031D2C11 +:1029C0008003217C8003276C8003ECA8800329D43A +:1029D00080032640D4019868E21800095898C02066 +:1029E000D80AF01F0002D80280031E44D431189E7A +:1029F0001738E048005EC030300AC0381738301A47 +:102A00003009FC090B0A2FF9E0490100CFB1580841 +:102A1000C041F6CC0001D832149632D4EC16000135 +:102A2000300735D5C0381498129BFC080B06F6C940 +:102A3000FFFF178A129CE80A1800C090EA0A1800E3 +:102A4000C1E0EE0A1800CF01169CD832138C103C5E +:102A50005F53E04C005D5F0AE7EA100AEE0A1800D7 +:102A6000C03032D8CE2BF0CAFFFFFC0A000A14C6D1 +:102A70002FF81838CFD52FEB2FE9CDCBD8321498BB +:102A8000F5DBC01FF00C1100104CFC187FF0F5ECCA +:102A900013FCF00C010CBF9C5EFCD703D401967BA9 +:102AA000F01F0002D8020000800353E0D4211697E3 +:102AB000967BF01F00098E681099ADC95BFCEFF999 +:102AC0000C06EFFC1A15E0691000F1D9E138EFF8B7 +:102AD0001C06D822800362D4D421966816971495D8 +:102AE0001294E21801001896C0603029300A967BD3 +:102AF000F01F00068E68ADC808990A9A8E7B0C9C60 +:102B0000AE68F01F0003D822800362D4800353B460 +:102B1000D4211697967BF01F0007C0656F581808E0 +:102B2000EF480054D8228E68ADC8AE68D8220000A5 +:102B30008003694CD431208D4DB8500B7008507C07 +:102B4000502A1295501816970F36401AF4060704AB +:102B5000E2140008CFA1E046002DC0410F3630142A +:102B6000C058E046002BC0210F3658055F085905B4 +:102B70005F0A3009F1EA100AF20A1800C1D0E046F3 +:102B80000030C1210F8A358B378CF60A18005F0B95 +:102B9000F80A18005F0A144BF20B1800C0500F9689 +:102BA00031052FE7C0985808C070E0460030F9B5ED +:102BB0000008F9B5010A5804C0713FF0E061FFFF59 +:102BC000EA117FFFC0483000FC118000EA03141FA7 +:102BD0000A980699009A029BF01F00340699505AF1 +:102BE0000A98009A029BF01F0032069C14981699CE +:102BF000300A30003001149E109212934019F206F0 +:102C0000070BF3DBC001F9B90137F9B90057506977 +:102C1000ECC80030EDBB0002C0804069F7DBC002A9 +:102C2000EC090108580BC2D00A38C2B40430E601DE +:102C300013005FB9F3EA13FAFC0A1800C1F104307B +:102C4000E60113005F09405A14385F9AF5E900095C +:102C5000FC091800C131E005064AEA010249504862 +:102C6000F8000349BF58F20B000B5038FAE0000C93 +:102C70001400E20B0041301AC0283FFA0F36CBFB9C +:102C80005BFAC1715804C0713FF0E061FFFFEA11C7 +:102C90007FFFC0483000FC11800032284079933813 +:102CA000C10800000000049C800373408002D99892 +:102CB0005804C07030083009F0000100F2010141F1 +:102CC00040285808C0B0580AF9B801FFEFD8E10A07 +:102CD000FBFA1A00402940089308009A029B2F8DA6 +:102CE000D8320000D431209D4DE816927008508CE7 +:102CF000505A1295504816970F36404EFC0607035F +:102D0000E2130008CFA1E046002DC0410F3630137A +:102D1000C058E046002BC0210F3658055F08590502 +:102D20005F0A3009F1EA100AF20A1800C1D0E04641 +:102D30000030C1210F8A358B378CF60A18005F0BE3 +:102D4000F80A18005F0A144BF20B1800C0500F96D7 +:102D500031052FE7C0985808C070E0460030F9B53B +:102D60000008F9B5010AEA04141F0A9808993FFA05 +:102D70003FFBF01F003D0899502B503A0A983FFA4C +:102D80003FFBF01F003A300B300830094041E206AB +:102D9000070EE1DEC001ECCC00305800F9B101377C +:102DA000F9B100571C90E2100004C061EC01010C65 +:102DB000FDDEC002C3700A3CC354FAE000080038CC +:102DC000E20913005FBE3000FDEB13FBE00B1800BF +:102DD000C261FAE00008143C5F9E0038E20913006B +:102DE0005F0B3000FDEB000BE00B1800C181F0051C +:102DF0000640EA09024BFAE10000E808034BF6013D +:102E00000001507C5001BF5CFAE00000506C301BA8 +:102E1000FAE800180008F2010049C0283FFB0F360D +:102E2000CB6B5BFBC071322840803FF981383FF8A3 +:102E3000C0985803C07030043005E8080108EA095A +:102E40000149405E580EC080580BF9BA01FFEFDA15 +:102E5000E102405A9502109A129B2F7DD832000051 +:102E60000000049C8002D99880037340D431203D37 +:102E70004C48502C70011698113EE20E0705E215E1 +:102E80000008CFB1E04E002DC041113E3015C058B2 +:102E9000E04E002BC021113E58095F0C59095F0616 +:102EA0003007F9E61006EE061800C1E0E04E0030EB +:102EB000C131118635843783E80618005F04E606C1 +:102EC00018005F06E9E61006EE061800C050119ED5 +:102ED00031092FE8C098580CC070E04E0030F9B9A5 +:102EE0000008F9B9010A3FF3E6090D023007500363 +:102EF0000E9C0E93E20E0704E1D4C001F9B0013735 +:102F0000F9B000575010FCC600300890E2100004E1 +:102F1000C0814010E9D4C002FC0001065804C1C0C1 +:102F20001236C1A4043C5FBEFDE713FEE60E180096 +:102F3000C101043C5F0E40070E365F97EFEE000EB6 +:102F4000E60E1800C061B33C3017EC0C000CC02832 +:102F50003FF7113ECD0B5BF7C061322940200E9C3C +:102F60008139C0485805FBBC0100580AC070580799 +:102F7000F9B901FFF1D9E10B950B2FDDD832000033 +:102F80000000049CD421169776DBEEC8FFBC103BF2 +:102F9000C171E06B0400F01F0015C250E06804002E +:102FA0008FDC8FE8EF380046F8CCFC03B8A8EF3888 +:102FB0000045B898EF380044B8888F0CC1386EE5EA +:102FC000EA041501089AF01F000A1896C0C00A9A70 +:102FD000189BF80500050A9CF01F00068FE48F057A +:102FE0008FD6D82ADC2A00008002E2BC8002E8E802 +:102FF0008002E736D4211697149618955BFBC650CD +:10300000580CC06078685808C031F01F00314B1868 +:103010001036C0316A06C0A84AF81036C0316A16A8 +:10302000C0584AE81036EBF600028C68A5D8AC68A8 +:10303000EDB80002C140EDB80004C461EDB8000372 +:10304000C0B10C9B0A9CF01F0026C3E18C688D6CFC +:10305000A3D88D2CAC688C68A3A8AC680E946CD8EF +:103060005C545808C1006C196CE81039C0650A9CA2 +:103070000C9BF01F001CC2816C0820188D08B084C6 +:103080000897C0C86C495809C0C06C081238E0885D +:10309000000911770837C0518D086C182FF8C12826 +:1030A0006C18ED4800406C088DF8ECC8FFBC8DD85A +:1030B00030388DE8ECC8FFBAED6400468D080897FB +:1030C00030188D18C0283FF70E9CD82280031F3877 +:1030D0008003EF2C8003EF4C8003EF6C80031D2CEA +:1030E00080032F84D431208DFAC4FFBC504B682E4E +:1030F000505812967C0B7005506E580BF40B17004D +:103100006803681140493008C2C92FFB325C178A36 +:10311000F80A18005F1EF00A18005F1CFDEC000C96 +:10312000F00C1800CF31580AE0800129300C3FFA2A +:103130001890503A18941892F80C003C1697507C4E +:103140004CDC0F3AF80A070E407C1C0C4CBEFC0C01 +:10315000070E201E500E4CAEFC0C070C507C400C91 +:10316000587CE08B00F84C7EFC0C032F368BF60A63 +:103170001800E08000F0371BF60A1800C07034CB4E +:10318000F60A1800C051A3B4CE58A5B4CE380F8BA0 +:1031900036CAF40B1800C051A5B4EECBFFFFCDB872 +:1031A000A5A4CD88EBD5C005367CF80A1800E08BC5 +:1031B0000027365BF60A1800C48234FBF60A1800B2 +:1031C000C480E08B000C345BF60A1800C3E0347B4B +:1031D000F60A1800C3A0344BC088358BF60A1800D5 +:1031E000C2C0E08B0007355BF60A1800C351C31854 +:1031F000363BF60A1800C2F0364BC0E8370BF60A29 +:103200001800C250E08B000D36EBF60A1800C1F032 +:10321000E08B0014369BF60A1800C1E1C0E8375B6A +:10322000F60A1800C0A0378BF60A1800C060373BBA +:10323000F60A1800C111C0B8EDB40004C0A0EDB486 +:103240000005C0913020C0883040C0683030C04890 +:103250003010C0283000403B5BFBC040E20B09202F +:10326000C7985860E08B00776C0AEACCFFFF486E85 +:10327000FC00032F8003F2708003F1D48003F16817 +:103280008003EFC88003EFE8F4CBFFF88D0BF4EA7E +:103290000000E605083AC0F8F4CBFFFC8D0B740A79 +:1032A000E605093AC088F4CBFFF88D0BF4EA00007C +:1032B000E605083A0E9B1895C4E8620A5BFAC0B1AD +:1032C00050195028E06A0080300B029CF01F004D1E +:1032D00040284019E4CC00010E9B503CF20C0C49F4 +:1032E000C3A8620A5BFAC0B150195028E06A008096 +:1032F000300B029CF01F0043402840192012300A76 +:103300000E9BE202092AF2020C49C25816976C0A77 +:10331000F4CBFFFC8D0B740A0E9BE605093A2FF5E2 +:10332000C1A8F4C20030C068E40200222FF7F40202 +:1033300000120F8A580AC0E0230A589AFE98FFF636 +:10334000C0982FF70F8A580AC050230A589AFE983F +:10335000FFFA0E9B407C30BAF40C1800FE91FEEE92 +:103360004042178C0A325F4AF00C18005F1CF9EAE1 +:10337000000AF00A1800FE91FECB3008404E178A72 +:10338000E2050021F00A1800FC091710E6050038D4 +:10339000069EC2A8620A583AC1E0E0890007581A9E +:1033A000C1A0582AC181C058585AC0C0C0B5C13840 +:1033B0006C0AF4CCFFF88D0CF4E20000F0E300009E +:1033C000C1086C0AF4CCFFF88D0CF4E20000F0E3C5 +:1033D0000000C0786C0AF4CCFFFC8D0C740A910AD2 +:1033E0002FF52F882FC11235FE9AFFD61C9340521D +:1033F000406E85059D0B404BE60B003C2F8DD8326F +:103400008002E8BCD421149774285808C04195184C +:10341000109CD822F01F000330088F188F28D82264 +:1034200080032320D431FACD06BC5109169114979C +:103430001895F01F0056780C50CC5805C0706A687B +:103440005808C0410A9CF01F00524D281031C0316D +:103450006A01C0A84D081031C0316A11C0584CF83B +:103460001031EBF100028268EDB80003C041624800 +:103470005808C071029B0A9CF01F0049E0810F941C +:1034800082681099E219001A58A9C3D18279300ACA +:10349000F4091900C385A1D8FB5805D06288FB4800 +:1034A00005E462A8FB4805ECFAC8FFBCFB4805D45C +:1034B000FB4805C4E0680400FB4805D8FB4805CC80 +:1034C0003008FB5905D20E9A4109FAC7FA3CFB486D +:1034D00005DC0A9C0E9BF01F003350BCC0950E9B70 +:1034E0000A9CF01F003140BEF9BE01FF50BEFB0830 +:1034F00005D0EDB80006E0810F598268A7A8A26840 +:10350000E08F0F543008FB4806B4FB480690FB4898 +:10351000068CFB4806B03008300950A75078FAC432 +:10352000F9E03FF85059FB440688FB480544129CDB +:10353000506950D950E950B9129740A2325A300818 +:10354000C0282FF20589F00918005F1BF409180044 +:103550005F19F3EB000BF00B1800CF4140ABE40B0D +:103560000106C300FAF806900C08890BFB48069088 +:103570008916FAF8068C2FF8FB48068C5878E089F3 +:1035800000152F84C1C800008003276480031F3802 +:103590008003EF2C8003EF4C8003EF6C80031C381A +:1035A0008003342480031D2CFACAF978029B0A9CFC +:1035B000F01F0071E0810EF4FAC4F9E040BA0C0A81 +:1035C00050BA05893008F0091800E0800ED930099A +:1035D000FB6806BB0E96E4C8FFFF3FFE50945041C7 +:1035E0000E940491508950A8502E50391293129085 +:1035F00010970A92C0783FFC0A97502CC038300BC5 +:10360000503B0F38C0281290F0C90020E049005804 +:10361000E08B0A4A4D9AF409032F50A750800C976B +:103620000495089602924D6940941090404150D9FB +:10363000E08F08AA3008FB3906BBF0091800CE213C +:103640003208C6E8A1A3CDEB0F89F2C80030589824 +:10365000E08B001DEEC8FFFF300B2309F60B002B9B +:10366000F20B001B1139F2CA0030589AFE98FFF78E +:10367000E0490024CC51E04B0020E0890E90201B53 +:10368000FAF906B4123BC095C108FAF906B4ECCABF +:10369000FFFF1236C1F5C268FACEF9441097FC0B51 +:1036A000003BF6F0FD88C3581097FAC8F9501AD8B5 +:1036B000FAC8FAB81AD8FAC8FBB4029A1AD8049C05 +:1036C000FAC8F940FAC9FFB4F01F002E2FDD7800C8 +:1036D000C208FACCF9441496F8040038F0F0FD88DA +:1036E000C188410859F9E0890011F0CBFFFC510B6A +:1036F0007000FACBF944F6090038F140FD882FF943 +:103700001496FB4906B4C058700014962FC851088F +:103710005800FE94FF785C30A3A3C74B32B8FB6817 +:1037200006BBC70B0F38E048002AC0303009C80874 +:103730000F88F0C900305899E08B0026EEC5FFFFD6 +:10374000300B2308F60B002BF00B001B0B38F0C9D5 +:1037500000305899FE98FFF7E0480024FE91FF5191 +:10376000E04B0020E0890E1B201BFAF806B4103B4A +:10377000C115C188800334048003F0048003EDD0B8 +:10378000800330E4FAFA06B4ECC9FFFF1436C1F541 +:10379000C288FACAF944F40B003BF6FBFD88502BB3 +:1037A000C3C8FAC8F9501AD8FAC8FAB81AD8FAC869 +:1037B000FBB4029A1AD8049CFAC8F940FAC9FFB4BB +:1037C000F01F017B2FDD780C502CC27812960E95DD +:1037D000FAC9F944F2040038F0F8FD885028C1D83D +:1037E000410859FAE0890014F0CBFFFC7008510B36 +:1037F0005028FAC6F944402EEC0A0038F14EFD88F4 +:103800002FFA0E95FB4A06B41296C078700C0E95EE +:103810002FC8502C12965108402B580BFE95FEEDE8 +:103820000A97CF0AF20900290F38F4090019F0CAE3 +:103830000030589AFE98FFF83FFAF20A0C495029D6 +:10384000CE4AA7B3CDFA30092308F2090029F009BE +:1038500000190F38F0CA0030589AFE98FFF7E04878 +:103860000024FE91FED2E0490020E0890D98F2C4C8 +:10387000000130195039CC6AA3B3CC4AA7A3CC2A93 +:103880000F8836CEFC081800C0412FF7A5B3CBAA8D +:10389000A5A3CB8AA5B3CB6A50A750800C971090F4 +:1038A00008960495409402920E994041FAF806B4A5 +:1038B000403C580CC1D01036C064FACBF944F6062F +:1038C0000036C1D8FAC8F9501AD8FAC8FAB81AD8C6 +:1038D000FAC8FBB41AD8FAC8F940FAC9FFB4049A76 +:1038E0000C9B0A9CF01F01322FDD19B8C2282FF75C +:1038F0001039C084FACAF944F4060036ED38FD8B5D +:10390000C188410959F8E0890012F2CAFFFC510A46 +:103910007209FAC6F944EC08003A2FF8F549FD8817 +:10392000FB4806B4F1D9C008C04813B82FC95109E3 +:10393000FB680660300E30083012FB6806BB502E64 +:10394000E08F08C450A750800C9704950896029207 +:10395000409410904041A5A3C0A850A750800C9758 +:10396000049508960292409410904041EDB30005F2 +:10397000C511FAF806B4403C580CC1E01036C064DA +:10398000FACBF944F6060036C208FAC8F9501AD83C +:10399000FAC8FAB80C9B1AD8FAC8FBB41AD8FAC9F4 +:1039A000FFB4FAC8F940049A0A9CF01F01012FDD08 +:1039B000781B7809C2B8EECAFFFF1037C0B4FAC945 +:1039C000F9441497F2060036ECFBFD8CECF9FD8807 +:1039D000C1D8410959F8E0890014F2CBFFF8510B26 +:1039E000FAC6F944721BEC08003C7209F94BFD8CD5 +:1039F000F949FD882FF81497FB4806B4C078F2C83F +:103A0000FFF8721B1497510872091698FAE9000022 +:103A1000CAE8EDB30004C171FAF806B4403E580E8E +:103A2000C0801036C694FACCF944F8060036C8288F +:103A3000EECAFFFF1037E0840081FACBF944F606A6 +:103A40000036C778EDB30006C4B1FAF806B4403CBE +:103A5000580CC1D01036C064FACBF944F6060036D3 +:103A6000C1F8FAC8F9501AD8FAC8FAB81AD8FAC878 +:103A7000FBB41AD8FAC8F940FAC9FFB4049A0C9BEF +:103A80000A9CF01F00CB2FDD9818C268EECAFFFF1A +:103A90001037C094FAC9F9441497F2060036ED08BD +:103AA000FD8AC1A8410959F8E0890013F2CBFFFC57 +:103AB000510B7209FAC6F944EC08003B2FF8F7499C +:103AC000FD88FB4806B41497F1D9B010C05892187D +:103AD00014972FC951095018BF585008C488FAF8D4 +:103AE00006B4403C580CC1D01036C064FACBF9443F +:103AF000F6060036C1F8FAC8F9501AD8FAC8FAB86A +:103B00000C9B1AD8FAC8FBB4049A1AD80A9CFAC8B3 +:103B1000F940FAC9FFB4F01F00A62FDD780BC248A8 +:103B2000EECAFFFF1037C094FAC9F944F206003616 +:103B30001497ECFBFD88C188410959F8E089001110 +:103B4000F2CBFFFC510BFAC6F944720BEC080039BA +:103B5000F34BFD882FF81497FB4806B4C058720B3E +:103B600014972FC95109501BBF5B500BFAEA000094 +:103B7000580A5C2BC0E43008FAEA00003009F00A69 +:103B8000010AF20B014B32D8FAEB0000FB6806BBCE +:103B90003018E08F071150A750800C9704950896B5 +:103BA00002924094109040410E99EDB30003C4116D +:103BB000FAF806B4403A580AC1901036C645FAC819 +:103BC000F9501AD8FAC8FAB81AD8FAC8FBB40C9B3C +:103BD0001AD8049AFAC8F940FAC9FFB40A9CF01F2F +:103BE00000742FDD78165076C4882FF71039C0C4C2 +:103BF000FACEF944FC060036ECFCFD8C507CECF669 +:103C0000FD885056C668410959F8E0890010F2CA8B +:103C1000FFF8721B510A7209FACAF944507B5059D5 +:103C2000F4080039405B407AC47872185078C4C8F0 +:103C3000FAF806B4403E580EC2301036C094FACCA2 +:103C4000F944F8060036ECFBFD8C507BCD9BFAC89E +:103C5000F9501AD8FAC8FAB8049A1AD8FAC8FBB4B4 +:103C60000C9B1AD80A9CFAC8F940FAC9FFB4F01F95 +:103C700000502FDD781A507A780C505CC2A82FF7CC +:103C80001039C094FAC9F944F2060036ECF8FD8CFC +:103C90005078CB6B410959F8E0890015F2CAFFF85A +:103CA00072167209510A5059FACEF9445076FC083E +:103CB0000039405B0C9AF2EBFD882FF8FB4806B404 +:103CC000C088721C507CF2C8FFF851087209505924 +:103CD000405B407AF01F00371896C1503008300919 +:103CE000405B407AF01F0034C04032D8FB6806BB0E +:103CF0004B284B36A7D3E0400047F00617A03032E0 +:103D0000E08F06E7405B407AF01F002EC0C05026CF +:103D10004AD84AE6A7D3E0400047F00617A0303261 +:103D2000E08F06DD402A5BFAC04130695029C11896 +:103D3000E04000475F09E04000675F08F3E81008D3 +:103D4000F8081800C06040285808F9B80001502849 +:103D500040784059FAE90694A9A3FAF8069458085D +:103D6000C065405E300C506E509CC078405B32DACB +:103D7000EE1B8000509A506BE04000465F09E04027 +:103D800000665F08F3E810085048C0404022303910 +:103D9000C228E04000455F09E04000655F084046FA +:103DA0001049EC091800C1314022C148800330E4B9 +:103DB0008003697880036FC08003F2408003F2447F +:103DC00080032A7E8003F2488003F24C402EFCC21E +:103DD000FFFF3029FAC8F95C1AD8FAC8F9541AD882 +:103DE000FAC8F94C0A9C1AD80498409B40AAF01FC4 +:103DF00001E0E04000475F19E04000675F18189657 +:103E00002FDDF3E80008C041EDB30000C301EC0270 +:103E1000000C503C404B580BC1500D893308F00941 +:103E20001800C0B130083009406B407AF01F01D152 +:103E3000FBB20001FBF20BAB403AFAF806AC100AF9 +:103E4000503A406B30083009407AF01F01CAC090E8 +:103E50004039FB4906A4C05810C9FB4806A4C02835 +:103E60003309FAF806A4403E1C38CF73E0400047FF +:103E70005F09E04000675F08F3E81008FAF906A45C +:103E80000C1950695808C0B0FAF806AC5BD8C05598 +:103E9000402C1838E08A006A2020C058E0400065B5 +:103EA000E0890046FAFB06ACFB60069C201BFB4B3E +:103EB00006ACC0475C3B32D8C02832B8FB68069DD0 +:103EC000589BE08A001DFAC9FA3530AA12980E9C58 +:103ED0000C92F60A0C060E9B2D0B10FB0C9B5896B1 +:103EE000FE99FFF92D0B1897049610FBFACAF96298 +:103EF000C038113B14CB1238CFD3C0982D0B3308E8 +:103F0000FB6B069FFB68069EFACAF960FAC8F96463 +:103F1000F408010850E81092406B1602581BE08923 +:103F20000005EDB30000C3512FF2C338E040006636 +:103F3000C1C1FAF206AC5802E08A000C402A580AC5 +:103F4000C041EDB30000C2512FF240291202C0B8A7 +:103F500040285808C061EDB30000C0303012C1984D +:103F600040222FE23660C158FAF206AC406E1C3295 +:103F7000C065EDB30000F7B200FFC0A8E40811026D +:103F8000406C5802F00217A0F9B20901180236700D +:103F9000409B580BE080059D32D8FB6806BBE08F44 +:103FA000059C50A704950C970292089640414094B6 +:103FB0000E99EDB30005C481FAF806B4403E580EE0 +:103FC000C1D01036C064FACCF944F8060036C1D826 +:103FD000FAC8F9501AD8FAC8FAB8049A1AD8FAC81E +:103FE000FBB40C9B1AD80A9CFAC8F940FAC9FFB472 +:103FF000F01F01612FDD780AC2082FF71039C08445 +:10400000FACBF944F6060036ECFAFD88C16841099E +:1040100059F8E0890010F2CAFFFC510AFAC6F944C7 +:10402000720AEC080039F34AFD882FF8FB4806B401 +:10403000C048720A2FC9510940BE1C98951EBF582E +:104040009508FE9FFA7CEDB30004C480E2130040A3 +:10405000C450FAF806B4403C580CC1D01036C064C5 +:10406000FACBF944F6060036C1D8FAC8F9501AD886 +:10407000FAC8FAB8049A1AD8FAC8FBB40C9B1AD832 +:104080000A9CFAC8F940FAC9FFB4F01F013B2FDDC2 +:10409000780AC2082FF71039C084FACAF944F40626 +:1040A0000036ECFAFD88C168410959F8E089001032 +:1040B000F2CAFFFC510AFAC6F944720AEC08003948 +:1040C000F34AFD882FF8FB4806B4C048720A2FC98E +:1040D000510940BEB40EFE9FFA32FAF806B4403CD5 +:1040E000580CC1D01036C064FACBF944F60600363D +:1040F000C1D8FAC8F9501AD8FAC8FAB8049A1AD826 +:10410000FAC8FBB40C9B1AD80A9CFAC8F940FAC941 +:10411000FFB4F01F01192FDD780AC2082FF71039FC +:10412000C084FACAF944F4060036ECFAFD88C16886 +:10413000410959F8E0890010F2CAFFFC510AFAC699 +:10414000F944720AEC080039F34AFD882FF8FB485D +:1041500006B4C048720A2FC9510940BE950EFE9F91 +:10416000F9EE50A750800C9704950896029240945F +:1041700010904041A5A3C0A850A750800C9704956B +:1041800008960292409410904041EDB30005C5D1CD +:10419000FAF806B4403C580CC2601036C0A4FACB02 +:1041A000F944F6060036ECE8FD88FAE90000C1881B +:1041B000FAC8F9501AD8FAC8FAB8049A1AD80C9B57 +:1041C000FAC8FBB40A9C1AD8FAC8F940FAC9FFB475 +:1041D000F01F00E92FDDF8EA0000FAEB00003008DC +:1041E000E08F03E7EECAFFFF1037C0B4FAC9F94405 +:1041F0001497F2060036ECEAFD88FAEB0000C1885D +:10420000410959F8E0890018F2E60000F2CBFFF806 +:10421000FAE70000510BFAC6F944EC080039FAE657 +:104220000000F2E7FD882FF81497FB4806B44038E9 +:10423000E08F03BFF2E600004038FAE700002F8964 +:1042400014975109E08F03B5EDB30004C161FAF88A +:1042500006B4403E580EC0801036C674FACCF944FD +:10426000F8060036C808EECAFFFF1037C7F4FACBCD +:10427000F944F6060036C768EDB30006C4A1FAF8A3 +:1042800006B4403C580CC1D01036C064FACBF94497 +:10429000F6060036C1F8FAC8F9501AD8FAC8FAB8C2 +:1042A0001AD8FAC8FBB41AD8FAC8F940FAC9FFB448 +:1042B000049A0C9B0A9CF01F00B02FDD9818C2686E +:1042C000EECAFFFF1037C094FAC9F9441497F206FA +:1042D0000036ED08FD8AC1A8410959F8E0890013AC +:1042E000F2CBFFFC510B7209FAC6F944EC08003B13 +:1042F0002FF8F749FD88FB4806B41497F1D9B010A0 +:10430000C058921814972FC951095C785018C46886 +:10431000FAF806B4403C580CC1D01036C064FACB51 +:10432000F944F6060036C1F8FAC8F9501AD8FAC8A6 +:10433000FAB80C9B1AD8FAC8FBB4049A1AD80A9C8B +:10434000FAC8F940FAC9FFB4F01F008B2FDD780BD3 +:10435000C248EECAFFFF1037C094FAC9F944F2060A +:1043600000361497ECFBFD88C188410959F8E089B3 +:104370000011F2CBFFFC510BFAC6F944720BEC08AA +:104380000039F34BFD882FF81497FB4806B4C0584A +:10439000720B14972FC95109501B300E500E1C98E8 +:1043A000E08F030750A750800C970495089602925F +:1043B000409440410E99FAF806B4403C580CC1D0E4 +:1043C0001036C064FACBF944F6060036C1D8FAC8F4 +:1043D000F9501AD8FAC8FAB81AD8FAC8FBB41AD8D9 +:1043E000FAC9FFB4FAC8F940049A0C9B0A9CF01F62 +:1043F00000622FDD7809C2182FF71039C084FACA7D +:10440000F944F4060036ECF9FD88C178410959F801 +:10441000E0890010F2CAFFFC510AFAC6F944720999 +:10442000EC08003AF549FD882FF8FB4806B4C0585F +:10443000F2C8FFFC510872093308FB6806B83788D8 +:10444000300EFB6806B94CDC5019A1B3500E50DC9D +:1044500030283780E08F02AD50A750801090300890 +:10446000FB6806BB0C970495089602924094404165 +:104470000E99FAF806B4403B580BC1D01036C06410 +:10448000FACAF944F4060036C1D8FAC8F9501AD865 +:10449000FAC8FAB81AD8FAC8FBB40C9B1AD8049A0E +:1044A000FAC8F940FAC9FFB40A9CF01F00332FDDA7 +:1044B0007806C2082FF71039C084FAC9F944F20609 +:1044C0000036ECF6FD88C168410959F8E089001012 +:1044D000F2CAFFFC510A7206FACEF944FC08003910 +:1044E000F346FD882FF8FB4806B4C04872062FC972 +:1044F0005109402C580CC105189A300B0C9CF01F28 +:104500000020E08002E9F8060102402B1632E08923 +:1045100002E3E08F02DE300A0C9C502AF01F0019E3 +:104520001892E08F02DC50A750800C9704950896F3 +:104530000292409410904041A5A3C0A850A750807B +:104540000C97049508960292409410904041EDB368 +:104550000005C611FAF806B440395809C2C0103631 +:10456000C124FAC8F944F0060036C2E88003552C8D +:1045700080036F32800330E48003EDE4800328A4DD +:104580008002EDD0FAC8F9501AD8FAC8FAB81AD889 +:10459000FAC8FBB41AD8FAC8F940FAC9FFB4049AA9 +:1045A0000C9B0A9CF01F00C82FDDF8E80000FAE918 +:1045B0000000C2E8EECAFFFF1037C0B4FAC8F944E1 +:1045C0001497F0060036ECEAFD88FAEB0000C2080A +:1045D000410959F8E0890016F2E60000F2CBFFF835 +:1045E000FAE70000510BFAC6F944EC080039FAE684 +:1045F0000000F2E7FD882FF81497FB4806B4C08846 +:10460000F2E600002F89FAE70000510914973018EC +:10461000E08F01CFEDB30004C161FAF806B4403E6B +:10462000580EC0801036C674FACCF944F80600362D +:10463000C808EECAFFFF1037C7F4FACBF944F606F4 +:104640000036C768EDB30006C4A1FAF806B4403CD2 +:10465000580CC1D01036C064FACBF944F6060036C7 +:10466000C1F8FAC8F9501AD8FAC8FAB81AD8FAC86C +:10467000FBB41AD8FAC8F940FAC9FFB4049A0C9BE3 +:104680000A9CF01F00912FDD9818C268EECAFFFF48 +:104690001037C094FAC9F9441497F2060036ED08B1 +:1046A000FD8AC1A8410959F8E0890013F2CBFFFC4B +:1046B000510B7209FAC6F944EC08003B2FF8F74990 +:1046C000FD88FB4806B41497F1D9B010C058921871 +:1046D00014972FC951095C785018C468FAF806B4C9 +:1046E000403C580CC1D01036C064FACBF944F606F1 +:1046F0000036C1F8FAC8F9501AD8FAC8FAB80C9BB3 +:104700001AD8FAC8FBB4049A1AD80A9CFAC8F94015 +:10471000FAC9FFB4F01F006C2FDD780BC248EECA57 +:10472000FFFF1037C094FAC9F944F2060036149717 +:10473000ECFBFD88C188410959F8E0890011F2CBF2 +:10474000FFFC510BFAC6F944720BEC080039F34B2D +:10475000FD882FF81497FB4806B4C058720B1497C5 +:104760002FC95109501B300E3018500EC21950A7D6 +:1047700050800C970495089602924D4C40941090EE +:10478000404150DCEDB30005C551FAF806B4403B9A +:10479000580BC2201036C0A4FACAF944F4060036F9 +:1047A000ECE8FD88FAE90000CF58FAC8F9501AD8A9 +:1047B000FAC8FAB8049A1AD80C9BFAC8FBB40A9C37 +:1047C0001AD8FAC8F940FAC9FFB4F01F003F2FDD2C +:1047D000F8EA0000C0C8EECAFFFF1037C0B4FAC93B +:1047E000F9441497F2060036ECEAFD88FAEB000073 +:1047F000CD18410959F8E0890016F2E60000F2CB25 +:10480000FFF8FAE70000510BFAC6F944EC0800394A +:10481000FAE60000F2E7FD882FF81497FB4806B48B +:10482000CB98F2E600002F89FAE7000051091497AF +:10483000CB18EDB30004C171FAF806B4403E580E2F +:10484000C0801036C6C4FACCF944F8060036C85801 +:10485000EECAFFFF1037E0840084FACBF944F60675 +:104860000036C7A8EDB30006C4E1FAF806B4403C30 +:10487000580CC1D01036C064FACBF944F6060036A5 +:10488000C1F8FAC8F9501AD8FAC8FAB81AD8FAC84A +:10489000FBB41AD8FAC8F940FAC9FFB4049A0C9BC1 +:1048A0000A9CF01F00092FDD9818C2A8EECAFFFF6E +:1048B0001037C0D4FAC9F9441497F2060036ED084F +:1048C000FD8AC1E8800330E48003EDE4410959F832 +:1048D000E0890013F2CBFFFC510B7209FAC6F944D0 +:1048E000EC08003B2FF8F749FD88FB4806B4149705 +:1048F000F1D9B010C058921814972FC951095C789B +:104900005018C468FAF806B4403C580CC1D01036B0 +:10491000C064FACBF944F6060036C1F8FAC8F9507B +:104920001AD8FAC8FAB80C9B1AD8FAC8FBB4049A79 +:104930001AD80A9CFAC8F940FAC9FFB4F01F00C996 +:104940002FDD780BC248EECAFFFF1037C094FAC9BA +:10495000F944F20600361497ECFBFD88C188410942 +:1049600059F8E0890011F2CBFFFC510BFAC6F9446B +:10497000720BEC080039F34BFD882FF81497FB48B5 +:1049800006B4C058720B14972FC95109501B300E32 +:10499000500E4008401C18485F18E7E80008C07037 +:1049A0003308FB6006B9A1B3FB6806B830283009AC +:1049B000FB6906BB402B580BC025A7D3402A4009F2 +:1049C000580A5F1A4016FAC2F9780C495F19F5E9DE +:1049D0001009C5C03019F2081800C0603029F2086B +:1049E0001800C041C3C80496C3080496FAE8000042 +:1049F000F5D8C0032D0A0CFAF00B1603F20C1603BF +:104A0000F7E911DB1899169858085C29CF21FAE9C3 +:104A10000000EDB30000C4513309F20A1800C410BD +:104A20000CF9C3F8FAEA000030A83009F01F008E34 +:104A300030A82D0A3009AC8AFAEA0000F01F008B7A +:104A400016991498FAE900002016FAEA0000589A1C +:104A50005C2BFE9BFFE91BF82D08C2080496FAE8C0 +:104A60000000F5D8C00440DEFC0A070A0CFAF20B7D +:104A70001604F00A1604F5E911CA16991498580894 +:104A80005C29CF01FAE90000C0C85808C091EDB315 +:104A90000000C061FAC6F9793308AC88C0280496D2 +:104AA0000C12C1C850A7508040940C9710900495E8 +:104AB00040415808E0800464FB680660300C300810 +:104AC0003012FB6806BB502CFAC6F9A0C078300B38 +:104AD000502BC0484022300A502A4029E4090C4992 +:104AE000FB3806BB5039069E3009E21E0002F20870 +:104AF0001800FBF81003F7B801FFFBF81A03069B38 +:104B0000580EFBFC1003F7BC01FEFBFC1A03E21B72 +:104B1000008450FE509BC451408A4039121A504ABA +:104B2000580AE089001FC3D82F092FF84D0E310C09 +:104B3000FB490690890E891CFB48068C5878E08951 +:104B400000042F84C0B8FACAF978029B0A9CF01FAF +:104B50000049E0810425FAC4F9E0404B210B504B99 +:104B6000FAF90690FAF8068C4C1A404E590EFE9946 +:104B7000FFDD1C092FF8890AFB490690891EFB48B6 +:104B8000068C5878E08900042F84C0B8FACAF978F6 +:104B9000029B0A9CF01F0037E0810402FAC4F9E08E +:104BA0003009FB3806BBF2081800C1F0FAF806908D +:104BB000FAC9F9452FF88909FB4806903019FAF827 +:104BC000068C89192FF8FB48068C5878E089000478 +:104BD0002F84C0B8FACAF978029B0A9CF01F0025FE +:104BE000E08103DEFAC4F9E040FC580CC1F0FAF8A9 +:104BF0000690FAC9F9482FE88909FB480690302940 +:104C0000FAF8068C89192FF8FB48068C5878E08949 +:104C100000042F84C0B8FACAF978029B0A9CF01FDE +:104C20000015E08103BDFAC4F9E0409BE04B008031 +:104C3000C511408A4039121A504A580AE089002B9F +:104C4000C4982F092FF848CE310CFB490690890EE5 +:104C5000891CFB48068C5878E08900102F84C178A5 +:104C6000800330E4800373408002D9988003F250BF +:104C7000800334048003F260FACAF978029B0A9C2C +:104C8000F01F004CE081038CFAC4F9E0404B210B8B +:104C9000504BFAF90690FAF8068C4C7A404E590EB1 +:104CA000FE99FFD11C092FF8890AFB490690891E3D +:104CB000FB48068C5878E08900042F84C0B8FACAF3 +:104CC000F978029B0A9CF01F003BE0810369FAC45B +:104CD000F9E0402C041C502C580CE089001FC3D86C +:104CE0002F092FF84B4B310AFB490690890B891A83 +:104CF000FB48068C5878E08900042F84C0B8FACAB3 +:104D0000F978029B0A9CF01F002BE0810349FAC44A +:104D1000F9E0402921095029FAF90690FAF8068CA1 +:104D20004A5A402E590EFE99FFDD1C092FF8890AB8 +:104D3000FB490690891EFB48068C5878E0890004E0 +:104D40002F84C0B8FACAF978029B0A9CF01F001998 +:104D5000E0810326FAC4F9E0EDB30008C0B0FAF828 +:104D6000069089128906F0020002FB420690E08F4D +:104D700001DBE0400065E08A01DD30083009405B7E +:104D8000407AF01F000EC7E0FAF8069048C92FF8E5 +:104D90008909FB4806903019FAF8068C89192FF812 +:104DA000FB48068C5878E089000D2F84C14800002C +:104DB000800334048003F26080036F328003A6C056 +:104DC000FACAF978029B0A9CF01F0078E08102E899 +:104DD000FAC4F9E0FAF806AC406C1838C055EDB3E7 +:104DE0000000E081026DFAF806902FF840CBFB48F6 +:104DF00006903019FAF8068C890B2FF88919FB48B0 +:104E0000068C5878E08900042F84C0B8FACAF97873 +:104E1000029B0A9CF01F0065E08102C2FAC4F9E01F +:104E2000406620165806E089001DE08F02492F09D0 +:104E30002FF8FB49069089028910FB48068C5878A8 +:104E4000E08900042F84C0B8FACAF978029B0A9C52 +:104E5000F01F0056E08102A4FAC4F9E02106C03830 +:104E60004D323100FAF90690FAF8068C4D0A5906CF +:104E7000FE99FFDF0C09890AFB4906902FF8891675 +:104E8000C559FAFA06AC580AE0890096FAF8069075 +:104E90004C892FF88909FB4806903019FAF8068CDE +:104EA00089192FF8FB48068C5878E08900042F8474 +:104EB000C0B8FACAF978029B0A9CF01F003CE08156 +:104EC000026FFAC4F9E0FAF806AC5808C081406AEB +:104ED000580AC051EDB30000E08101F240C9FAF870 +:104EE00006902FF88909FB4806903019FAF8068CCD +:104EF00089192FF8FB48068C5878E08900042F8424 +:104F0000C0B8FACAF978029B0A9CF01F0028E08119 +:104F10000247FAC4F9E0FAF206AC5C325802E089C2 +:104F2000001DC3B82F092FF8310EFB4906908900E8 +:104F3000891EFB48068C5878E08900042F84C0B88D +:104F4000FACAF978029B0A9CF01F0018E081022837 +:104F5000FAC4F9E02102C0284950FAF90690FAF89B +:104F6000068C493A5902FE99FFDF04092FF8890A95 +:104F7000FB4906908912FB48068C5878E0890004AA +:104F80002F84C0B8FACAF978029B0A9CF01F000768 +:104F9000E0810206FAC4F9E0406CFAF8069089064E +:104FA000891C1808CBE80000800334048003F260F9 +:104FB0008003A6C0FAF90690FAF8068C406B163A00 +:104FC000C6D516092FF88906FB490690891BFB48B0 +:104FD000068C5878E08900042F84C0B8FACAF978A2 +:104FE000029B0A9CF01F006FE08101DAFAC4F9E02D +:104FF000FAF606AC406A14165806E089001CC3B8DD +:105000002F092FF8FB49069089028910FB48068C6E +:105010005878E08900042F84C0B8FACAF978029B56 +:105020000A9CF01F0060E08101BBFAC4F9E0210690 +:10503000C0384DD23100FAF90690FAF8068C4DAA24 +:105040005906FE99FFDF0C092FF8890AFB490690E3 +:105050008916FB48068C5878E08900042F84C0B874 +:10506000FACAF978029B0A9CF01F004EE081019871 +:10507000FAC4F9E0EDB30000E081012240C9FAF87A +:1050800006902FF88909FB4806903019FAF8068C2B +:1050900089192FF8FB48068CC04914092FF8FB49E1 +:1050A00006908906891AFB48068C5878E089000426 +:1050B0002F84C0B8FACAF978029B0A9CF01F003905 +:1050C000E081016EFAC4F9E040C88908FAF8069058 +:1050D0002FF83019FB4806908919FAF8068C2FF83A +:1050E000FB48068CFAF206AC5878E08900042F845D +:1050F000C0B8FACAF978029B0A9CF01F002AE08126 +:10510000014FFAC4F9E00406FAF806AC8906FAF988 +:1051100006904066406E1016F208010889161C08B9 +:10512000FB480690FAF8068C2FF8FB48068CCB98C3 +:10513000406C581CE0890006EDB30000E081008758 +:10514000FAF806902FF83019FB4806908906FAF80D +:10515000068C89192FF8FB48068C5878E0890004E2 +:105160002F84C0B8FACAF978029B0A9CF01F000D80 +:10517000E0810116FAC4F9E0FAF806902FF840CB66 +:10518000FB4806903019FAF8068C890B2FF889191C +:10519000FB48068C5878E08900092F84C10800007C +:1051A000800334048003F260FACAF978029B0A9CF7 +:1051B000F01F006FE08100F4FAC4F9E03008300914 +:1051C000405B407AF01F006B40682018580CC0D13B +:1051D0002FF689188906FAF606901006FAF8068C5A +:1051E000FB4606902FF8C2F810965808E089001C7C +:1051F000C4982F092FF8FB49069089028910FB48B3 +:10520000068C5878E08900042F84C0B8FACAF9786F +:10521000029B0A9CF01F0056E08100C2FAC4F9E02C +:105220002106C0384D423100FAF90690FAF8068C92 +:105230004D1A5906FE99FFDF0C09890AFB490690B1 +:105240002FF88916FB48068CC0E8FAF806902FF86C +:105250003019FB4806908906FAF8068C89192FF850 +:10526000FB48068C5878E08900042F84C0B8FACA3D +:10527000F978029B0A9CF01F003EE0810091FAC47D +:10528000F9E040EAFAF806901408FAC9F964FB4814 +:105290000690891AFAF8068C89092FF8FB48068CC3 +:1052A0005878E08900042F84C0A8FACAF978029BD4 +:1052B0000A9CF01F002FC731FAC4F9E0E213000482 +:1052C000C3D04086403912165806E089001AC368D8 +:1052D0002F092FF8FB49069089038912FB48068C99 +:1052E0005878E08900042F84C098009A029B0A9C99 +:1052F000F01F001FC541FAC4F9E02106C05849F368 +:105300003102FAC0F978FAF90690FAF8068C49BA2F +:105310005906FE99FFDF0C092FF8890A8916FB4907 +:105320000690FB48068C5878E08A0009FACAF9789A +:10533000029B0A9CF01F000EC32140BC4036408EE9 +:10534000EC0E0C48100C50BCFAF806905808C080BF +:10535000FACAF978029B0A9CF01F0005C201300BC3 +:10536000FAC4F9E0FB4B068CFE9FF0E9800334049D +:1053700080036F328003F2608003F250FAF80690E7 +:105380005808C0800A9CFACAF978029BF01F0009ED +:10539000C0613008FB48068CC02840418268EDB8E7 +:1053A0000006C0313FFA50BA40BCFE3DF944D83245 +:1053B00080033404D42116981897109C3008149B4D +:1053C0004866129A8D08F01F00065BFCC0516C08FD +:1053D0005808EFF81A03D82200008CC48002F1505C +:1053E000D421300818974876169C8D08F01F0006C7 +:1053F0005BFCC0516C085808EFF81A03D822000073 +:1054000000008CC48002F108D431202D1897784810 +:1054100076460C38C034300CC858ECC2FFFCF6C3DA +:10542000FFECF6020329F802032C2FF92016F809E5 +:105430000D08F6020022EEC4FFEC10955808C410C7 +:105440003009069A08981291500B700EB18E501EBA +:10545000150EFC001610FDDEC010EA0E0341FDD152 +:10546000C010B181401BEA000240E2000000E3D01E +:10547000C010021B501B700BE3DBC0100209F20EC0 +:10548000010EB01EFC091410401EFC090009B009F1 +:10549000E00116102FC8B149043AFE98FFD8400B1E +:1054A000580CC0F1ECC8FFFBEE080028C0282016FD +:1054B00020480838E088000570095809CF908F46C9 +:1054C0000E9CF01F001AC2D52FF508983009070B63 +:1054D000F60A1610700CF7DBC010F80E1610141E2A +:1054E000F5DCC010161A120AB01AB14AFC0A0009FB +:1054F000B0092FC8B1490433FE98FFEBECC8FFFB9D +:10550000EE0803295809C0D1EE080028C02820164B +:1055100020480838E088000570095809CF908F4668 +:105520000A9C2FEDD8320000800363EED43121AD08 +:10553000FAC4FF7418971695682C50C96816680944 +:1055400050E81494512CFAE5000851596E9558050D +:10555000C091310CF01F004799358F9C9915992502 +:1055600099056E9972085808C0F0721A911A301A8B +:105570007219F4090949109B91290E9CF01F003EF5 +:105580006E9830099109402810945808C064F1D8E9 +:10559000C01F50283018C02830088D08FC1C7FF030 +:1055A00040260C98E6187FF01838C1C1E068270F34 +:1055B000415B9708403A580AC061EDD6C014C0312B +:1055C0004AECC0284AEC41295809E08005DEF8C8B9 +:1055D000FFFD3009118AF20A1800C190F8C8FFF8DF +:1055E000C168FAEA00083008FAEB003C3009F01F05 +:1055F0000025C1103018415A950841294A285809F8 +:10560000C041109CE08F05C1109C2FF841258B08EC +:10561000E08F05BBFAC8FF9CFAC9FFA0FAEA003C7C +:105620000E9CEBD6C28BF01F001918935805C0D002 +:10563000FAEA003C3004F1DBC014EAC503FF109B1A +:105640005174EA1B3FF0C3284188419C100CF8C5F7 +:10565000FBCEE0450020E08A001BF8CCFBEE403B8F +:10566000EA081140F60C0A4CEC0809460C4CC148FB +:105670008002E2A4800364208003F3708003F37C43 +:1056800080036F328003A6C0800364D0EA0C11202F +:10569000403AF40C094CF01F006BFC18FE10301956 +:1056A000EAC50433F00B000B51793008FC193FF8C0 +:1056B000F01F0065E0684361EA18636FE06987A73F +:1056C000EA193FD2F01F0061E068C8B3EA188B60A6 +:1056D000E0698A28EA193FC6F01F005D0A9C149011 +:1056E0001691F01F005CE06879FBEA18509FE069B2 +:1056F0004413EA193FD3F01F005514981699009AE5 +:10570000029BF01F005314901691F01F00533008B5 +:1057100018963009009A029BF01F0050C0C00C9CE4 +:10572000F01F004C14981699009A029BF01F004C31 +:10573000F7B600015966E088000530185148C128C5 +:105740004C88FAEA003CF0060238F01F0044F9B435 +:105750000000FBF40A14F7B60101F9BC0100FBFCE0 +:105760001A14419020100A10C04650403000C04822 +:10577000300B5C30504BEC0211005806FBFA400431 +:10578000F5D6E40AFBFA4A04FBF64A11F9B2040022 +:10579000E1D6E510F9B90500FBF95A1140C858984F +:1057A000E08B00205858F9B40A01FBF5900CF7B5CE +:1057B0000904FBF59A0CF9B4090040CC583CC2D05E +:1057C000E0890005582CC101C18840CB584BC0600E +:1057D000585BC0A1301A50DAC228301950D9C0F82D +:1057E0003008301450C83FF5301C300B509550DC59 +:1057F0000A91312850EBC208300A50DA40E95809C2 +:10580000E089000730185098109150E8C15840E5E1 +:1058100050950A910A98C108300C50DC40EBEC0B13 +:10582000000B509B16982FF85808E089000510913E +:105830003018C028109130096E9A95193049C178F6 +:1058400080036E4A80036B7C800369A480036D181B +:1058500080036E5280036E2480036FC080036F321A +:105860008003F38C6A1AA1792FFA8B1A6E95F2CA0B +:10587000FFEC103AFE98FFF86A1B0E9CF01F0053D5 +:1058800058E15F888B0CF1E400046E987008508832 +:10589000E08001985806E08A0040F3D6C0044CC866 +:1058A000F0090234FAE50018EC041404EDB4000425 +:1058B000C0303025C0F84C78F0E80020FAEA003C0F +:1058C000E9D4C004F01F0044303514981699FAE961 +:1058D00000084C0C50A30C931896C0F8FAEA001874 +:1058E000EDB40000C081ECE800002FF5F01F003B94 +:1058F000FAEB0018A1542F865804CF11FAE80018CB +:10590000FAEA00080696F01F003440A3149816998E +:10591000FAE90008C2D8EC081100C0313025C2886D +:105920004ACCF0041404501CF1D8C0044A89FAEAA5 +:10593000003CF2080238F01F0029401C506330255B +:105940000C93FAEB00081896C0F8FAEA0008EDB4D8 +:105950000000C081ECE800002FF5F01F0020FAEBFA +:105960000008A1542F865804CF1106964063414A7F +:10597000580AC370FAE8000858015F94FAE9001861 +:105980003008FC193FF0FAEA0018F01F0015F9BCC6 +:105990000000F9BC0101E9EC000CC2304098580845 +:1059A000E08A010C3008FC194024ECC40001FAEA3A +:1059B00000182FF55064F01F0009409414981699B0 +:1059C000FAE90008C1080000800364588003F38CE2 +:1059D0008003F45480037028800369A480036FC09F +:1059E000506602940A9CF01F0069FAE80008F01F54 +:1059F00000683008FC19401CF01F006614981699C6 +:105A0000FAE90028FC18FCC040A5100550A5580470 +:105A1000C211FAEA00083008FC194014F01F005EB9 +:105A200040BCFAEB000814981699189A0A9BF01FCC +:105A3000005BE08102740A9840B9EE188000FAEA2F +:105A40000008109512980A99F01F0054E081025E38 +:105A5000CB484D39E8C8000140D55805C4F0300C9A +:105A6000F2080238513C300AFC1B3FE0F01F004DA9 +:105A7000FAE800284085F01F0048FAEB0028FAEA0F +:105A80000008F01F0049516CF01F0040149816994F +:105A9000FAEA0008F01F0040FAEB000841682D0800 +:105AA0000AC841392FF95139FAE80028F01F003BA4 +:105AB000E081035AFAE80008300AFC1B3FF0F01FAF +:105AC0000036FAE80028F01F0035FAEA002830080E +:105AD000FC194024E08100E8413C083CC6E4F01F8A +:105AE000002C3008FAEB0028FC194024FAEA0008E0 +:105AF000F01F0027FAEB0008CC3B40850805F208B0 +:105B0000023A5135FAE800284085F01F0021FAEBEF +:105B10000028FAEA0008F01F0024516CF01F001B57 +:105B200014981699FAEA0008F01F001BFAEB000817 +:105B300041682D080AC8413C1835C3713008FC196A +:105B40003FE0FAEA0028F01F00134085FAE8000859 +:105B50000805F01F0012E08100A7FAE80028300ACB +:105B6000FC1B3FE0F01F000C14981699FAEA00089D +:105B7000F01F000AC22033090A98117AF20A1800AD +:105B8000E08102F21095CF9B80036E52800369A4DE +:105B900080036D1880036B7C80036FC08003F38CDF +:105BA0008003702880036E243008FC194024F01F05 +:105BB0000056FAEB0008CAEBFAEA003CFAEB0008E0 +:105BC00058E65FAB418A3008F40911FFF7E903F9A1 +:105BD000F0091800E080008140EA58015FA9F3EA6B +:105BE00003F94CAAF4060234FAE50010F009180093 +:105BF000C1405801E081018A3008FC194014089A1C +:105C00000A9BF01F0041FAE80008F01F0041E08104 +:105C1000017D0292E08F018540853014FAE8001082 +:105C2000FAEA0008F01F003BF01F003B1892F01F3B +:105C3000003BFAE80010F01F003414981699FAEAB5 +:105C40000008F01F0037FAEB0008E4C8FFD00AC8CC +:105C5000FC19402430080234C331FAE80008F01F70 +:105C600000311691149014980299FAEA0010F01F6E +:105C7000002EC1A1FAE80010009A029BF01F002B31 +:105C8000E0800271E5D2C001C0F1E08F026C408A71 +:105C90001438C0301095C098330840892FF6B28868 +:105CA0004088C088406633990A98117AF20A180031 +:105CB000CEF0506611892FF9B089E08F0255F01FA0 +:105CC00000122FF4FAEB000830083009F01F00171B +:105CD000CA60E08F024840D85808C0510498009527 +:105CE00040D4C4A840C55815E08900224174580426 +:105CF000C040F4C9FBCDC0484199F209113604985F +:105D00000095C2F8800369A48003F38C80036F5868 +:105D10008003702880036E2480036E5280036B7CA6 +:105D200080036D1880036FC080036F32E2C80001EA +:105D30005801E0051740E2091740E1D1E515F9B92E +:105D400005001032E5D8E418F1D2E518E5D8E502EF +:105D5000FBFC5011F9D8E50CFBFC5A11F9B8050011 +:105D6000404B120B5008504B1200301B0E9CF01F82 +:105D7000010840081894404A58055F99580A5F9AEC +:105D8000F5E90009C080404CF8050D49121C1210BD +:105D9000504C12155802E08A002740DB580BC1D046 +:105DA0005808E08A0017109A5008089B0E9CF01FB4 +:105DB00000F9069A189B18940E9CF01F00F718998A +:105DC000069B50190E9CF01F00F5401940081293D5 +:105DD000E408010AC080C028049A069B0E9CF01FAC +:105DE00000ED1893301B0E9CF01F00E9411A189229 +:105DF000580AE08A0007189B0E9CF01F00E61892D4 +:105E000040C95819E089001440385808C101402998 +:105E1000F1D9C014C0C11298E6187FF0C080404C80 +:105E2000301B2FFC2FF0504C506BC038300A506A9A +:105E300041195809C031301CC09864482FC8E40883 +:105E4000032CF01F00D7F80C1120404BF80B000872 +:105E5000F1D8C005C0C0F00811205848E08A0006FB +:105E60002048100B504BC0785848C070404A2E480C +:105E7000100A504A100010055800E08A0008069BDE +:105E8000009A0E9CF01F00C7189340495809E08AF9 +:105E90000008049B129A0E9CF01F00C21892414801 +:105EA0005808C1B0049B069CF01F00BFC164069B4C +:105EB000300930AA0E9CF01F00BD2016189340DC5C +:105EC000580CC0314091C098089B4091300930AACD +:105ED0000E9CF01F00B6189458015FA940CB582BB8 +:105EE0005F98F3E80008C2505801C111049B029961 +:105EF000305A0E9CF01F00AD1892189B069CF01FA4 +:105F000000AAE089000FC0383002049440EA30094A +:105F10005CDA4085506A5049C0F9089240660494A2 +:105F20002FF65066331840850AC830085048C049DB +:105F300040DC580CE08000B55805E08A0008089B5A +:105F40000A9A0E9CF01F00971894406B580BC031B2 +:105F5000089CC138681B0E9CF01F0095684A189574 +:105F6000E8CBFFF42FEA2F4CA36AF01F00920A9BA4 +:105F7000301A0E9CF01F008B5044403A3019F5DA6D +:105F8000C001189450DA40855099502650E1049B86 +:105F9000069CF01F0089404BF8C0FFD0069CF01F04 +:105FA0000082089A506C049B0E9CF01F008418918C +:105FB00078385808C0303016C068189B069CF01F0F +:105FC000007A18960E9C029BF01F007440CCEDECFA +:105FD0001008C0D140DB580BC0A14026E04000397A +:105FE000C300406A580AE0890024C2F84069580991 +:105FF000C085129840CC1848C1D140DB580BC1A1D4 +:106000000C9940265809E08A0021069B301A0E9C04 +:10601000F01F0064049B1893F01F0063E0890006E2 +:10602000C141EDB00000C111E0400039C0A02FF027 +:10603000C0C85806E08A000C4026E0400039C04144 +:1060400033980AC8C6782FF00AC0C7580AC0409AC9 +:1060500040E9123AC430069B300930AA0E9CF01F6A +:106060000053404818930838C091109B300930AA5B +:106070000E9CF01F004E504CC0E8404B300930AA37 +:106080000E9CF01F004A089B504C300930AA0E9C11 +:10609000F01F00461894409C2FFC509CC79B301862 +:1060A0000690408508930C941096049B009CF01F6A +:1060B00000422D0C0ACC0236C0A4009B300930AA45 +:1060C0000E9C2FF6F01F00391890CF0B0896300B5E +:1060D0000694504B00931890C0284026069B301A17 +:1060E0000E9CF01F0030049B1893F01F002FE089D6 +:1060F0000012C1B1E1D0C001C0D1C17840891238CD +:10610000C0301095C0882FF650663318408CB88880 +:10611000C138339A0A981179F4091800CF002FF981 +:10612000B089C0981095C02833090A98117AF20AEC +:106130001800CF905066049B0E9CF01F0018580466 +:10614000C120404B083B5F19580B5F18F3E800086B +:10615000C0400E9CF01F0011089B0E9CF01F000F0A +:10616000C02850660E9C069BF01F000C3008AA88C1 +:106170004068415A2FF841299508408C5809FBF88E +:106180001012F1F51A002E6DD8320000800368005D +:10619000800368A0800366F88003642080036300A6 +:1061A00080036664800363EE80036818800364588C +:1061B0008002E736800354088003658C5EFC5EFC39 +:1061C000D42118961697580BC0311695C508F01FA4 +:1061D00000295806C0706C685808C0410C9CF01F1C +:1061E00000264A681037C0316C07C0A84A481037EB +:1061F000C0316C17C0584A381037EDF700028E696D +:106200003008F0091900C051F01F001F3005C2F816 +:106210000E9B0C9CF01F001D6EC818955808C0609E +:106220006E8B0C9C5D18F9B505FF8E68EDB8000704 +:10623000C0516E4B0C9CF01F00166EDB580BC0A0BB +:10624000EEC8FFBC103BC0400C9CF01F0011300892 +:106250008FD86F2B580BC0700C9CF01F000D3008AE +:10626000EF4800483008AE68F01F00070A9CD822AB +:1062700080031E7480031F388003EF2C8003EF4CD3 +:106280008003EF6C80031E7680031D2C8003217C2D +:10629000D4014848189B700CF01F0003D80200007E +:1062A00000000598800361C0D42116981897109CAF +:1062B00030084876149B8D08F01F00065BFCC05127 +:1062C0006C085808EFF81A03D822000000008CC4AC +:1062D0008002F198D42116981897109C3008149BCE +:1062E0004866129A8D08F01F00065BFCC0516C08CE +:1062F0005808EFF81A03D82200008CC48002F1205D +:106300001898E01C0000F0091510580CF20817004E +:10631000F9BC0010F9BC0100109AF0091508E61A42 +:10632000FF00F7BC00F8F2081700109AF0091504F6 +:10633000E61AF000F7BC00FCF2081700109AF0090A +:106340001502E61AC000F7BC00FEF2081700580854 +:106350005E5CEDB8001EF9BC0120F7BC00FF5EFCDE +:1063600018997808F9D8C003C150EDB80000C021D1 +:106370005EFD109BF00A1601E21B0002A388580B79 +:10638000F3FA1A00F9BC0101F3F80A00F9BC0002A3 +:106390005EFCF5D8C010F00B1610580AF60817006E +:1063A000F9BC0010F7D8C008F00A1608580BF7BC63 +:1063B00000F8F4081700F7D8C004F00A1604580BC8 +:1063C000F7BC00FCF4081700F7D8C002F00A160268 +:1063D000580BF7BC00FEF4081700EDB80000C060D1 +:1063E000A198C031320C5EFC2FFC93085EFCD401F6 +:1063F00018987649784C121CC1312FB9A369120B39 +:10640000F00900092EC8134E174A143EC060F9BCAB +:1064100003FFF9BC0201D8021039FE9BFFF6D80237 +:10642000D4211897169578965806C091310CF01F14 +:10643000000A99368F9C9916992699065805C0909E +:106440006A196E987038F009032A8B0AF009092539 +:10645000D82200008002E2A4D421189716967895DD +:106460005805C091310CF01F001999358F9C991572 +:10647000992599056E956A385808C0B1310A304B94 +:106480000E9CF01F00138B3C6E98703C580CC1B0F2 +:106490006E987038F0060028700C580CC0407809CF +:1064A0009109C0E80E9C30170E9BEE060947EECA14 +:1064B000FFFBA36AF01F0006C060991699273008F9 +:1064C00099389948D82200008002E2A48002DC5466 +:1064D000D431202D1693129610951492301BF01F74 +:1064E0000029F3D3C0145009F1D3C01FF0011614D2 +:1064F000FC1A0010F3DAE139FBF91A00189458027B +:10650000C1E0FACCFFF818D2F01F001F4018C0D02D +:106510004009F80A1120F20A094AF5E810088958DA +:10652000F20C0A495009C028895840085808F9B3A4 +:106530000102F9B3000189688943C0981A9CF01FD1 +:106540000012301340082E0C894389585801C0901E +:10655000E2C1043318018D01F80C11358B0CC0D841 +:10656000E6C8FFFCF8CC0432A5738D0CE808032CB8 +:10657000F01F000618138B03089C2FEDD832000083 +:10658000800364588003636080036300D4317448DF +:106590007645169714961015C1312FB8EECEFFEC44 +:1065A000A368F408000BEE080008114A1749123AD4 +:1065B000C030C0E2C0781C38FE9BFFF9C4A8580563 +:1065C000C0640E9830150C971096C02830056E1BCD +:1065D000F01F00246E496C4499352FB4F2C5FFFBBF +:1065E000EC040024EE0500252EC62EC7F8C8FFECEB +:1065F000300A0F0E0D0BFC021610F6031610FDDE0E +:10660000C010E4030103F7DBC010FC0B010BF60A1A +:10661000000AB01AB14AE60A000AB00A2FC8B14A05 +:106620000836CE83C0D80F0BF60E1610F7DBC0105D +:10663000160AB01AB14A1C0AB00A2FC8B14A0A3762 +:10664000CF33C0282019114A580ACFD09949D832DF +:10665000300BF01F00043018994830089958D83290 +:1066600080036458D43116977646F40214052FF649 +:10667000149318940406761B6E28C0382FFBA1785B +:106680001036FE99FFFD089CF01F001A300918957E +:10669000F8C8FFEC129AC03810AA2FF90439CFD5E8 +:1066A0006E4BE7D3C0052FBBEEC9FFECEE0B002B02 +:1066B0005803C130E60C1120300A7202E40309428B +:1066C000044A10AA130AF40C0A4A1639CF73910A25 +:1066D000580AC0702FF6C058130A10AA1639CFD323 +:1066E000089C20160E9B8B46F01F00030A9CD83294 +:1066F0008003645880036420D431202D7649744887 +:10670000169614951039EC081750EA061750F00544 +:1067100017506C2876437442761BE4030007103749 +:10672000F7BB09FFF01F0036EEC4FFFBF8C9FFEC12 +:10673000F8040024300A1298C02810AA0838CFE3C1 +:106740002FB32FB2EC030023EA020022ECCBFFECC4 +:106750005012EACAFFECC44894955805C20012983A +:106760001696300E50090D02E400161070017009E3 +:10677000B181E5D2C010E0050341AB32E1D9C010D0 +:106780000002E40E000EB01EB18E1C01B001E20E3C +:1067900016102FC80636CE834009910E94865806EF +:1067A000C1D072021298169E3005B0121D0190825F +:1067B000E1D1C010AD30E0020002E4050005B005F3 +:1067C000B185B1812FC8AD319092E20200020A0278 +:1067D000E4051610063ECEA391022FCA2FC9401819 +:1067E000103ACBB3C02820175807E08A00050948A3 +:1067F0005808CFA099472FEDD83200008003645885 +:10680000D4211697301BF01F00043019995799496D +:10681000D822000080036458D431300812951697AE +:1068200018967644F6C9FFEC720BF60C1610F7DBDF +:10683000C010F40C024CF40B0345F7D5C010B18521 +:106840001805EA0C1510F80B000B12AB2FF8B185E8 +:106850000838CEB55805C1D06E281034C1456E1B1E +:106860000C9C2FFBF01F000C6E4AEECBFFF418932C +:106870002FEA2F4CA36AF01F00090E9B0C9CF01FFF +:1068800000080697E8C8FFFF2FB48F48EE040925DB +:106890000E9CD832800364588002E736800364205F +:1068A000D431149618971694F1DAC002C0902018CB +:1068B0004A19F208032A3009F01F00201894A34651 +:1068C000C3706E955805C091310CF01F001D9935AD +:1068D0008F9C9915992599056E9366255805C0D109 +:1068E000E06B02710E9CF01F0017872C3008189582 +:1068F0009908C038069C1895EDB60000C0C1089BE9 +:106900000A9A0E9CF01F0010089B18930E9C069488 +:10691000F01F000EA156C0C06A035803CEC10A9AE8 +:106920000A9B0E9CF01F00088B0C9903CE5B089C01 +:10693000D83200008003F380800368188002E2A44C +:1069400080036800800366F880036420D4211698D1 +:106950001897109C3008149B4866129A8D08F01FF7 +:1069600000065BFCC0516C085808EFF81A03D822E7 +:1069700000008CC48002F1381498FC197FF0F5DB1C +:10698000C01FF00B1100F7E81008F5E813F8F20843 +:106990000108F00C1100F9E81008F00C141F2FFC8E +:1069A0005EFCD703F5EB101CE08000DCD421F7E996 +:1069B000200EEFDBC28B3015C430AB6BF7EA136BE4 +:1069C000AB6AF7D5D3C2EDD9C28BC5C0A1785CF94B +:1069D000F3D5D2ABE04707FFC770E04607FFC740DB +:1069E000EE06000CE02C03FEF6080644F40907440A +:1069F000F4080646F609064A0807F405004A5C0B47 +:106A0000EDBB0014C050A1775CFA5CFB201C580C55 +:106A1000E08A006FE04C07FFE084009CF7DCD28B3B +:106A2000EDEA11F6EFE61217EE178000F1B7042039 +:106A30000E0A5C0BEDBE001FEFBB001FD822E41B4B +:106A4000000FF40C1200F6061200F7BC03E1F80682 +:106A50001730F7B60201E0460020C0D4EC0C11203C +:106A6000F606094BF40C0A4C184BF406094A20B6FA +:106A70000C17CAABF406094BC640300A20B60C17F7 +:106A8000CA3BE419000FF00C1200F2051200F7BC2B +:106A900003EAF8051730F7B5020AE0450020C0D434 +:106AA000EA0C1120F2050949F00C0A4C1849F005CE +:106AB000094820250A16C8FBF0050949C4203008FA +:106AC00020250A16C88BE419000FE41B000F144B95 +:106AD0001049E04707FFC091580BC381E04607FF0C +:106AE000C3815809C360C3285809C330C2F85C3C4D +:106AF0002FFCF1BC04C0E04C0020C114F8081120A8 +:106B00000E46EE0C0A47F40809491247F40C0A4AEB +:106B1000F6080949124AF60C0A4BC83BF80811203E +:106B2000F9B90000C030F60809490E46EDEA101622 +:106B3000F40C0A4AF3EA1007F60C0A4A300BC71B9A +:106B40001C9BE61B8000300AD8223FFB3FFAD8226C +:106B5000F06B0000EDBE001FEFBB001F300AD82213 +:106B6000F7E9200BE61B8000F9D9C28BE04C07FF48 +:106B70005E1C3FFA3FFB5EFCEE198000F7E9200C3B +:106B8000E08600CAEBCD40E0169CE61C8000BFDB2F +:106B9000BFD9103AF20B1300C0921697129B0E99B0 +:106BA0001497109A0E98EE1C8000F6071614AB7B13 +:106BB000F7EA135BAB7ABFBBF2061614C440AB799D +:106BC000F3E81359AB78BFB9E04707FFC4F00E26CE +:106BD000C120EC051120E0460020C7C2F005094E97 +:106BE000F2050945F0060A48F2060A490A48580E15 +:106BF0005F1E1C48101AF609014BF6061200C0E091 +:106C0000C783EC0E1120F606094BF40E0A4E1C4BFE +:106C1000F406094A0C17E08A0039F4091515AB9AF5 +:106C2000F5EB115AAB9BF7D7D28B184BFC178000B2 +:106C3000EDBA0000F7B701FF0E395F29120A5C0BAD +:106C4000E3CD80E0AB79F3E81359AB78F3E8100EAD +:106C5000F9B60101EE0E1100F9B70001EFBB001FFC +:106C6000F7EA100EF9B70000CB0BBFDBF7EA100E06 +:106C7000C081E04607FFC050F9E7114BE3CD80E04B +:106C80003FFA3FFBE3CD80E05C372FF7F1B704C05C +:106C9000E0470020C114EE081120F40809495F16EE +:106CA000F4070A4A0C4AF6080949F5E9100AF407FC +:106CB0000A4B3007CB3BEE081140F608094914494E +:106CC0005F16F6070A4A0C4A300B3007CA7BE3CD41 +:106CD00080E0F1B604C0F00E1700C040F205094E86 +:106CE000104EF2060A483009580E5F1E1C48C83B79 +:106CF000F4061200F9B70300F9B60300F9BC03006B +:106D0000F7B602E0F406094B300A0C17FE9AFFBEF4 +:106D1000C85B0000EE198000F7E9200CFE96FF2EFC +:106D2000EBCD40E0169CE61C8000BFDBBFD9123BD8 +:106D3000C0721697129B0E991497109A0E98300EE7 +:106D4000EFDBC28BF7DBC014B5ABEDD9C28BC5F05E +:106D5000F3D9C014B5A9E04707FFC2500E26C0F012 +:106D6000EC051120E0460020C352F005094EF20563 +:106D70000945F0060A48F2060A490A48100AF609C7 +:106D8000004BEDBB0015C340F7D7D28B184BF9DA97 +:106D9000C001184EEE1E8000F1BE04201C0A5C0BE0 +:106DA000E3CD80E0B5CBF7EA100EC101E04607FF66 +:106DB000C030E3CD80E0B5C9F3E8100EC071300AF1 +:106DC000FC1B7FF0184BE3CD80E03FFA3FFBE3CDA7 +:106DD00080E0F1B604C0F00E1700C060F205094E65 +:106DE00058085F18104EF2060A483009CC8BFDEEA9 +:106DF000101EA19B5D0A5D0E2FF7E04707FFF9BA51 +:106E00000000F9BB0000F9BE0000CBFB30165807AC +:106E1000CA31B5CB100AF609004B184BE3CD80E020 +:106E2000580B5E6DF60C1501B59CE02C03FF5E3D22 +:106E3000F80C111F1699AB7BBFBBF7EA135BF60C7E +:106E40000A4BA1795E2B5C3B5EFBF8CB0000300C5B +:106E5000C038189B5C4B300A5E0BD401E069041EFD +:106E6000F6081200C170C0C3F00E1120F608094BDD +:106E7000F40E0A4E1C4BF408094A1019C0B8F40865 +:106E80001200F9B80300F7B802E0F408094B300A21 +:106E900010195809E08900305C392FF9E0490036B3 +:106EA000C043300B300AC2682F69F2081120E04954 +:106EB0000020C0B2F408094EF6080948F4090A4A4D +:106EC000F6090A4B104BC088F608094E144E169A64 +:106ED000300BF4090A4AEDBA0000C0921C7EC04192 +:106EE000EDBA0001C0422FFAF7BB02FF5CFC5D0B5C +:106EF0005D0AD802E06803FFEDBA000BF7B800FFA7 +:106F0000100A5C0BF7B903FEE04907FFC055300AD1 +:106F1000FC1BFFE0C0C8EDBB001FF7B90101AB9A35 +:106F2000F5EB115AA17BAB9BF7E9115BA17C5D0BE3 +:106F3000D802103AF20B1300C080A17BA179144B48 +:106F4000124B104B5E0F5EFDA17BFC1CFFE0580A4C +:106F5000F80B13005E8F5EFD1ADE1AD7A17B5F3C33 +:106F6000A1795F375CFCFC1EFFE0580AFC0B1300A4 +:106F7000E08B001D5808FC091300E08B0018580B2B +:106F8000F5BA0000C1501B071B0E583CC0A0581C8E +:106F9000C0335E0F5E1D103AF20B13005E2F5E3D94 +:106FA0001438F60913005E2F5E3D1B07D80A5817E8 +:106FB0005F0C5809F5B800001B071B0E5E0F5EFC46 +:106FC0001ADE1AD7A17B5F3CA1795F375CFCFC1EFF +:106FD000FFE0580AFC0B1300E08B001D5808FC0969 +:106FE0001300E08B0018580BF5BA0000C1501B07C6 +:106FF0001B0E583CC0A0581CC0335E0D5E1F103ADB +:10700000F20B13005E2D5E3F1438F60913005E2D5F +:107010005E3F1B07D80A58175F1C5809F5B80000D7 +:107020001B071B0E5E0D5EFCEBCD40FFF7E9200E4B +:10703000F6071614A97BF7EA137BA97ABDBBE41BFC +:107040003FFFABD7E08000CCE04707FFE08400B50E +:10705000F2061614A979F3E81379A978BDB9E419F1 +:107060003FFFABD6E08000E2E04607FFE08400B2DD +:107070000C17FE37FC01FC1C8000F8031601E9D94F +:10708000C3625CD4E7D4D382E6090644F80501253F +:10709000E6050644EA031502E6090644F80501255B +:1070A000E6050644EA031502E6090644F80501254B +:1070B000E6050644EA031502E6080640E40907402F +:1070C000E609064402045C05A365EBE413E5A3644A +:1070D0005C34F8050145E6040640E4050740E60592 +:1070E000064402045C05EA031502E7E413E3E80240 +:1070F0001502E6080640E4090740E60906440204D2 +:107100005C05A365EBE413E5A3645C34F805014575 +:10711000E6040640E4050740E605064402045C0573 +:10712000EA031502E7E413E3E8021502E60A064063 +:10713000E40B0740E60B064202025C03EDB3001CC1 +:10714000C090A1725CF32017A39AF5EB11DAA39B10 +:10715000C058A58AF5EB11CAA58B5807E08A008BA9 +:10716000E012FF00E8120080E6080640E40907404C +:10717000E4080644E60906480005F00100485C09F9 +:10718000F9D2C10158045C25F4081300F609130074 +:107190005F36F8061700E40A1608F5E3118AE60BD5 +:1071A0001608F7D7D28BEDBE001FEFBB001F0C0AED +:1071B0005C0BE3CD80FFE41B000F144BE08100A7C4 +:1071C000F2061614ABD6E04607FFE08100A4C9E83A +:1071D000E419000F1049E081009AC928A37BF7EA5F +:1071E00013DBA37AF5EB1004E08000A0F604120094 +:1071F000C170C0C3E8051120F604094BF4050A4527 +:107200000A4BF404094A0817C0B8F4041200F9B490 +:107210000300F7B402E0F404094B300A0817A38A0C +:10722000F5EB11EAA38BC11BA379F3E813D9A3787B +:10723000F3E81004C6F0F2041200C170C0C3E80500 +:107240001120F2040949F0050A450A49F0040948E9 +:107250000816C0B8F0041200F9B40300F7B402E055 +:10726000F004094930080816A388F1E911E8A38958 +:10727000CFCA5C372FF7F1B704C0E0470020C154F4 +:10728000EE061120E4070A42E606094C1842E6071A +:107290000A43F4060941F4070A4AF606094C184A5B +:1072A000F6070A4B3000C158EE061120F9B0000075 +:1072B000F9BC0000C050F4060940F606094CE60788 +:1072C0000A423003F4070A411841F6070A4A300B14 +:1072D000E012FF00E8120080E6080646E4090746CF +:1072E000E4080644E60906480C05F00700485C0976 +:1072F0003007F9D2C1010034E2051300C46B1C9BB6 +:10730000E61B8000300AE3CD80FF3FFB300AE3CD6F +:1073100080FFF5EB1004C0901C9BE61B8000EA1B6D +:107320007FF0300AE3CD80FFF1E91015CEF0E9D906 +:10733000C28BE04407FFCE41F1E910C5CE10CE6B01 +:10734000D4311A97202D109C1295149E16931696E0 +:107350005809C4411638E088005AF0081200C0D01D +:10736000F6080946F808094CF00B1120F408094EFC +:10737000F40B0A4BF7E61006F80A1610EBDCC01007 +:10738000EC0A0D02FC091610EA02024BF3E31109A4 +:10739000123BE08800091809123CE08B0005123B03 +:1073A000F3DCEB09F20B010BFDDEC010F60A0D0A4F +:1073B000FDEB110EEA0A024A1C3AE0880009180E99 +:1073C0001C3CE08B00051C3AFDDCEB0EFC0A010ABC +:1073D000300BF4080A4A2FEDD8321639FE9BFFFD18 +:1073E000F2091200C46114385F8B06355F3AF7EA80 +:1073F000100AF20A1800C060FC08010AE6050146FE +:10740000149E0C9B1C9A2FEDD8325808C05130198D +:10741000F2080D08109CF8081200E0810084EC0CC2 +:10742000010BF8031610EBDCC010F6030D0AFC0983 +:107430001610EA0A024AF3EB1109123AE088000931 +:107440001809123CE08B0005123AF3DCEB09141921 +:10745000FDDEC010F2030D02FDE3110EEA02024A46 +:107460001C3AFE98FFB5180E1C3CFE9BFFB1CACB20 +:10747000F20E1120EA090945F609094BE60E0A4306 +:10748000F0090941F4090942F00E0A48F40E0A4ACB +:107490000A48164AF0061610F9D8C010E6060D0480 +:1074A000F4031610089BE7E51103E80C02450635C6 +:1074B000E0880007201B10030638E0880072F5DA28 +:1074C000C0100A13E6060D04F5E51106E80C024C9F +:1074D000089A0C3CE0880007201A10060C38E08857 +:1074E000005AF5EB110B1816F601064A149C1636D5 +:1074F000C0735F0514325F3AEBEA000AC060F8011E +:107500000104F608014B089CE40C010AEC0B01464F +:10751000EC090A4BF4090A4AEC0E09460C4A2FED15 +:10752000D832F0011120F4010A4BF808094CEC089C +:107530000949EC010A41F7E91009F8031610EBDCE0 +:10754000C010E2030D00F20B1610EA00024EF7E144 +:10755000110B163EE0880006180B163CE088002749 +:10756000F60E0101F3D9C010E2030D00F3E1110999 +:10757000EA00024B123BE08800091809123CE08B3C +:107580000005123BF3DCEB09F20B010BF408094E8A +:10759000C4DB0C3CF7BA0B01EDD8EB06CA3B063551 +:1075A000F7BB0B01E7D8EB03C8BB163EF7DCEB0BD0 +:0275B000CD8B81 +:10760000C0080000C0080000C0080000C00800005A +:10761000C0080000C0080000C0080000C00800004A +:10762000C0080000C0080000C0080000C00800003A +:10763000C0080000C0080000C0080000C00800002A +:10764000C0080000C00800000000000000000000AA +:10765000C008000000000000000000000000000062 +:10766000C008000000000000000000000000000052 +:10767000C008000000000000000000000000000042 +:1076800000000000000000000000000000000000FA +:1076900000000000000000000000000000000000EA +:1076A00000000000000000000000000000000000DA +:1076B00000000000000000000000000000000000CA +:1076C00000000000000000000000000000000000BA +:1076D00000000000000000000000000000000000AA +:1076E000000000000000000000000000000000009A +:1076F000000000000000000000000000000000008A +:10770000C0080000300CF01F0012580CF80F1710C2 +:10771000D603301CF01F000E580CF80F1710D603BC +:10772000302CF01F000B580CF80F1710D603303C0C +:10773000F01F0007580CF80F1710D60300000104C3 +:107740004000011280000120C000012E8000A41C16 +:107750000000000000000000000000000000000029 +:107760000000000000000000000000000000000019 +:107770000000000000000000000000000000000009 +:1077800000000000000000000000000000000000F9 +:1077900000000000000000000000000000000000E9 +:1077A00000000000000000000000000000000000D9 +:1077B00000000000000000000000000000000000C9 +:1077C00000000000000000000000000000000000B9 +:1077D00000000000000000000000000000000000A9 +:1077E0000000000000000000000000000000000099 +:1077F0000000000000000000000000000000000089 +:1078000073656E645265706C790000006765745F23 +:10781000646174615F7463705F636D645F63620071 +:107820006765745F7265706C795F686F73745F62AF +:10783000795F6E616D655F63620000006765745F0C +:107840007265706C795F7363616E5F6E6574776F7C +:10785000726B735F636200006765745F7265706C62 +:10786000795F6964785F6E65745F63620000000031 +:107870007365745F706173737068726173655F6361 +:107880006D645F63620000007365745F6B65795FB0 +:10789000636D645F6362000063616C6C5F7265704E +:1078A0006C795F6362000000617661696C5F64619E +:1078B00074615F7463705F636D645F636200000096 +:1078C0007365744D6170536F636B4D6F6465000039 +:1078D0006765745374617274436D6453657100001D +:1078E0007365745F6E65745F636D645F63620000EF +:1078F0007365745F69705F636F6E6669675F636D00 +:10790000645F63620000000073656E644572726FAD +:107910007200000073746172745F736572766572D1 +:107920005F7463705F636D645F6362007370695F4F +:10793000736C61766552656365697665496E74003E +:107940006765745F636C69656E745F737461746599 +:107950005F7463705F636D645F63620073656E6420 +:107960005F646174615F7564705F636D645F6362BF +:1079700000000000636865636B4D7367466F726D4E +:107980006174000073746172745F7363616E5F6E23 +:1079900065745F636D645F6362000000666F756E9F +:1079A00064486F737442794E616D65007365745FEE +:1079B0006B65795F636D645F63620000696E697413 +:1079C0005370690073746172745F636C69656E747F +:1079D0005F746370000000007370695F706F6C6C9F +:1079E000000000006765745F726573756C745F6397 +:1079F0006D645F636200000073746F705F636C6935 +:107A0000656E745F7463705F636D645F63620000D2 +:107A100073746172745F7365727665725F7463709C +:107A2000000000007365745F706173737068726149 +:107A300073655F636D645F63620000007365745F0C +:107A4000726573756C745F636D6400007365745F59 +:107A5000646E735F636F6E6669675F636D645F63B7 +:107A6000620000006765745F73746174655F7463BE +:107A7000705F636D645F6362000000007265715F38 +:107A80007265706C795F686F73745F62795F6E6145 +:107A90006D655F636200000073746172745F636C94 +:107AA00069656E745F7463705F636D645F636200C9 +:107AB000572D5B25735D2057726F6E67207465725A +:107AC0006D696E6174696F6E20696E6465783A25C0 +:107AD00064206E506172616D3A2564206964783A61 +:107AE00025642031366269743A25640A000000007A +:107AF0003078257820000000572D5B25735D2049E4 +:107B00006E646578206F7574206F662072616E6791 +:107B1000653A2025640A00005B25735D20535349B4 +:107B2000443A25730A0000005B25735D20525353CD +:107B3000493A25640A0000005B25735D20454E43E9 +:107B4000543A25640A0000005B25735D205365618B +:107B5000726368696E6720666F7220486F73743A4B +:107B60002069703D3078257820666F756E643D25FC +:107B7000640A00005B25735D20666F756E64486F54 +:107B8000737442794E616D653A20466F756E64205C +:107B9000486F73743A206E616D653D25732069707E +:107BA0003D307825780A00005B25735D20696653B7 +:107BB00074617475733A256420726573756C743AD8 +:107BC00025640A004C69737420436F6D6D616E64A7 +:107BD000732066756C6C210A000000005245434515 +:107BE000495645005452414E534D4954000000003F +:107BF0005B25735D204D6170205B25642C20257012 +:107C00002C2025735D0A00005B25735D20535049CD +:107C100020696E697469616C697A6174696F6E203C +:107C20006661696C65642100572D5B25735D204595 +:107C300072726F7220636F6E6669677572696E67C4 +:107C4000205350490A000000572D5B25735D202505 +:107C5000645D20446973616C6C2E2025642F25645B +:107C600020636D643A25640A00000000572D5B25EF +:107C7000735D2025645D20446973616C6C2E202542 +:107C8000640A00005B25735D3A200000572D5B25D8 +:107C9000735D2025645D204E6F7420666F756E6481 +:107CA00020656E6420636D643A20307825780A0080 +:107CB0005B25735D2025732025640A00572D5B2505 +:107CC000735D20456E64206F6620636D6420706173 +:107CD00072616D73000000005B25735D2064617448 +:107CE00061417661696C3A25640A0000572D5B2575 +:107CF000735D2054544350206E6F7420666F756E10 +:107D00006420666F7220736F636B3A25640A00000B +:107D10005B25735D20736F636B3A25642073746118 +:107D200074653A25640A00005B25735D20737461F5 +:107D300074653A25640A00005B25735D2053746105 +:107D40007274204E6574776F726B205363616E207E +:107D500025640A00572D5B25735D206572723D25F1 +:107D6000640A00005B25735D204C6F6F6B696E6762 +:107D700020666F7220486F73743A206E616D653DA6 +:107D800025730A005B25735D20466F756E6420487D +:107D90006F73743A206E616D653D25732069703D87 +:107DA000307825780A0000005B25735D2053746FDE +:107DB0007020636C69656E7420736F636B3A256421 +:107DC0000A00000055445000544350005B25735D89 +:107DD00020416464723A307825782C20706F727478 +:107DE0003A25642C20736F636B3A25642C207072E3 +:107DF0006F743A25730A0000572D5B25735D205080 +:107E0000726576696F757320636C69656E74202581 +:107E100070206E6F742073746F7070656420210A17 +:107E2000000000005B25735D205374617274204371 +:107E30006C69656E74202573202570205B30782571 +:107E4000782C2025642C2025645D204F4B210A00CE +:107E50005B25735D20537461727420436C69656E99 +:107E600074202573202570205B307825782C202500 +:107E7000642C2025645D204641494C4544210A007C +:107E8000572D5B25735D205374696C6C20636F6E96 +:107E90006E65637465642E2E2E776169740A000026 +:107EA000572D5B25735D20494620646F776E2E2E1B +:107EB0002E776169740A00005B25735D205374613D +:107EC000727420536572766572202573205B256479 +:107ED0002C2025645D204F4B210A0000572D5B2587 +:107EE000735D2053746172742053657276657220DD +:107EF0002573205B25642C2025645D204641494C78 +:107F00004544210A000000005B25735D2025702098 +:107F10006E756D506172616D3D2564207061726D8A +:107F200073546F4368616E67653D25640A00000005 +:107F30005B25735D2025645D206E69663A2570209F +:107F40006C7769705F616464723D307825780A00EF +:107F50005B25735D20257320706172616D733D2513 +:107F6000640A00005B25735D20506173733A20251D +:107F7000732025640A000000572D5B25735D2025C2 +:107F800073203A204661696C656420746F206164D7 +:107F90006420706173737068726173650A00000019 +:107FA000436F6E6E65637420746F206E6574776FB7 +:107FB000726B2E2E2E0000006572723D25640A0041 +:107FC0004F4B0A00572D5B25735D205353494420C6 +:107FD0006C656E206F7574206F662072616E6765C8 +:107FE000000000005B25735D2025730A000000007F +:107FF000572D5B25735D2053656E642053504920D7 +:108000006572726F72210A003D3D3E003C3D3D00AD +:10801000572D5B25735D20556E6B6E6F776E2063F9 +:108020006D6420307825780A00000000572D5B250C +:10803000735D2025645D20436865636B20666F7205 +:108040006D6174206D7367206661696C6564210AD7 +:1080500000000000444F574E000000005550000043 +:1080600049462020207374617475733A2025730A81 +:1080700000000000434F4E4E207374617475733AD4 +:108080002025730A00000000536F636B6574206E37 +:108090002E3A256428256429205B307825785D20D8 +:1080A000257320257320616464723A257320706FF4 +:1080B00072743A25640A00005B2564207470637052 +:1080C0002D25705D2D5374617475733A25640A0013 +:1080D0005B746C63702D25705D2D537461747573C2 +:1080E0003A25640A000000005B757063702D2570EE +:1080F0005D20666C6167733A3078257820206C6F5C +:1081000063616C3A25735B307825785D2D25640AB0 +:108110000000000072656D6F74653A257328307831 +:108120002578292D25640A004E4F0000594553003B +:108130004461746120617661696C3A25730A0000BC +:108140002D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D5F +:108150002D2D2D2D2D2D2D2D2D2D2D2D2D2D0A009F +:108160005B25735D205363616E206E6F7420636FB7 +:108170006D706C65746564210A0000005B25735D99 +:10818000204E6574776F726B73206E6F7420666F0C +:10819000756E64210A000000636F756C64206E6F59 +:1081A0007420616C6C6F6361746520616C6C206716 +:1081B0007569206E65742061727261790A00000031 +:1081C000636F756C64206E6F7420616C6C6F63619B +:1081D000746520616C6C20677569206E6574730A24 +:1081E000000000005B25735D202564202D20257391 +:1081F000205B25645D2D202564202D202564202D05 +:1082000020307825780A000D000B000C000A0000D1 +:108210007365745F726573756C745F636D64000081 +:108220008000636C800063988000637E80006398A8 +:108230008000638E80006398800063648000639890 +:10824000800063688000638A800063786174637073 +:108250005F706F6C6C5F636F6E6E00007564705F53 +:10826000737461727400000072656D6F76654E659F +:1082700077436C69656E74436F6E6E0061756470F0 +:108280005F726563765F6362000000006765745328 +:1082900074617465546370006172645F7463705FCD +:1082A00073746F7000000000617463705F636F6EC1 +:1082B0006E5F6572725F6362000000006765744EF6 +:1082C0006577436C69656E74436F6E6E4964000038 +:1082D000617463705F636F6E6E5F636C695F65721C +:1082E000725F636200000000617463705F616363CA +:1082F0006570745F636200007564705F73746172AF +:10830000740000005B25735D20747463703A2570FF +:108310002069643D25642C20747063623D25700AD9 +:1083200000000000572D5B25735D204E6F205661C5 +:108330006C696420636C69656E7420666F7220746A +:108340007463703A25700A005B25735D2025645DB7 +:1083500020747463703A257020747063623A2570DB +:108360002073746174653A2564206C7063623A25E9 +:10837000702073746174653A2564206C6566743A84 +:1083800025642073656E743A25640A00572D5B25B9 +:10839000735D20544350206E6F7420696E69746958 +:1083A000616C697A656420747463703A2570207416 +:1083B0007063623A2570206C7063623A25700A001F +:1083C000572D5B25735D204E6F2056616C696420CC +:1083D000496420666F7220747463703A257020704F +:1083E00063623A25700A00005B25735D2062756642 +:1083F0003A2570206C656E3A25640A00572D5B257E +:10840000735D2054544350205B25705D3A20636FA8 +:10841000756C64206E6F7420616C6C6F6361746541 +:1084200020706275660A0000572D5B25735D20542D +:10843000544350205B25705D3A207564705F73650E +:108440006E642829206661696C65640A000000007A +:108450005B25735D2054544350205B25702D25709F +:108460005D3A20636F6E6E65637420256420256419 +:108470000A0000005B25735D206C6566743D256411 +:10848000206C656E3A25640A000000005B25735D70 +:10849000207463705F7772697465206661696C65CA +:1084A000642025702073746174653A2564206C65BE +:1084B0006E3A2564206572723A25640A0000000055 +:1084C000572D5B25735D2074746370203D3D204EF5 +:1084D000554C4C210A0000005B25735D20747463C9 +:1084E000703A2570207063623A2570206275663A92 +:1084F0002570206C656E3A25640A00005B25735D6B +:1085000020272573270A00005B25735D20506163D7 +:108510006B65742073656E74207063623A257020F9 +:108520006C656E3A2564206475723A2564206C652A +:1085300066743A25640A00005B25735D2054544339 +:1085400050205B25705D3A20636C65616E536F63EC +:108550006B53746174655F63622025640A000000D8 +:108560005B25735D20436C6F73696E672074706365 +:10857000623A2073746174653A30782578206572A8 +:10858000723A25640A0000005B25735D20436C6F1E +:1085900073696E67206C7063623A207374617465EE +:1085A0003A30782578206572723A25640A00000016 +:1085B0005B25735D2046726565696E672070617921 +:1085C0006C6F61642025642D25700A005B25735D46 +:1085D00020436C6F73696E6720747063625B2570F3 +:1085E0005D3A2073746174653A307825782065723D +:1085F000723A25640A000000572D5B25735D204305 +:10860000616E6E6F7420636C6F73652069643A25C8 +:10861000642D2570207075742070656E64696E67B6 +:108620000A0000005B25735D202D2D2D2D2D2D2D95 +:108630002D2D2D2D2D2D2D2D2D2D2D2D2D2D2D0A8D +:1086400000000000572D5B25735D2074746370205B +:108650003D204E554C4C210A000000005B25735D07 +:1086600020666C75736820646174613A207470636D +:10867000623A2570206572723A25640A0000000093 +:10868000572D5B25735D2054544350205B25705D4E +:108690003A20636F6E6E656374696F6E20657272E7 +:1086A0006F723A202564206375727249643A2564BA +:1086B0000A00000041626F727420636F6E6E656322 +:1086C00074696F6E0A000000572D5B25735D20549E +:1086D000544350205B25705D3A20636F6E6E656376 +:1086E00074696F6E206572726F723A202564206122 +:1086F00072673A25700A0000572D5B25735D205480 +:10870000544350205B25705D3A2066726565206D8C +:10871000656D6F72790A00005B25735D20554450CA +:1087200020496E7365727420257020736F636B3AF5 +:10873000256420616464723A257320706F72743A04 +:1087400025640A00572D5B25735D20545443502047 +:108750005B2D5D3A20696E76616C6964206D6F6493 +:10876000650A0000572D5B25735D2054544350204B +:108770005B2D5D3A20696E76616C6964206E62756E +:10878000660A0000572D5B25735D2054544350202A +:108790005B2D5D3A20696E76616C69642062756656 +:1087A0006C656E0A00000000572D5B25735D205438 +:1087B000544350205B2D5D3A20636F756C64206ECE +:1087C0006F7420616C6C6F63617465206D656D6F93 +:1087D000727920666F7220747463700A0000000062 +:1087E000572D5B25735D2054544350205B25705DED +:1087F0003A20636F756C64206E6F7420616C6C6FCF +:1088000063617465207063620A0000005B25735D1C +:108810002025732C20757063623A25702025733AE9 +:1088200025640A00572D5B25735D20545443502066 +:108830005B25705D3A2075647020636F6E6E6563B2 +:1088400074206661696C65640A000000572D5B2521 +:10885000735D2054544350205B25705D3A2062695B +:108860006E64206661696C6564206572723D256482 +:1088700020506F727420616C726561647920757329 +:1088800065640A005B25735D2025732C206C6F6383 +:108890003A307825782D25642072656D3A30782538 +:1088A000782D25640A0000005B25735D20416C6C07 +:1088B0006F63207061796C6F61642025642D257071 +:1088C0000A000000572D5B25735D2054544350204F +:1088D0005B25705D3A20636F756C64206E6F742049 +:1088E000616C6C6F63617465207061796C6F616439 +:1088F0000A0000005B25735D205B747063625D2D70 +:108900002570207061796C6F61643A25700A0000EF +:10891000572D5B25735D2054544350205B25705DBB +:108920003A2074637020636F6E6E656374206661B5 +:10893000696C65640A0000005B25735D2042454652 +:108940004F52452042494E4420747463703A25705A +:10895000206C7063623A2570207063623A25700A59 +:1089600000000000572D5B25735D205454435020B8 +:108970005B25705D3A206C697374656E2066616971 +:108980006C65640A00000000572D5B25735D205361 +:108990007461727420736572766572204641494C29 +:1089A0004544210A000000005B25735D20545443B8 +:1089B00050205B25702D25705D3A206E6275663DF6 +:1089C00025642C206275666C656E3D25642C2070D4 +:1089D0006F72743D2564202825732F2573290A00A2 +:1089E0007574726C3A6E3A703A7600002573000026 +:1089F0005B25735D2041524420544350205B257019 +:108A00005D3A20616363657074206E6577205B2535 +:108A1000705D0A005B25735D206C6F63616C3A25A5 +:108A2000642072656D6F74653A2564207374617497 +:108A3000653A25640A0000007061796C6F616420FA +:108A40006E6F74206672656564210000572D5B258A +:108A5000735D2041524420544350205B25705D20BB +:108A60006172673D257020726574726965733D257A +:108A7000642061626F72740A000000005B25735D00 +:108A8000206B656570416C697665436E743A256448 +:108A9000206B6565705F69646C653A25642070655C +:108AA00072736973745F636E743A25640A00000020 +:108AB0005B25735D2041524420544350205B257058 +:108AC0002D25705D206172673D257020726574727E +:108AD0006965733D25642070656E642E636C6F73E9 +:108AE000653A2564206C656E3A25640A0000000032 +:108AF0005B25735D2041524420544350205B257018 +:108B00002D25705D2074727920746F20636C6F73F3 +:108B1000652070656E64696E673A256420657272BF +:108B20003A25642069643A25640A00005B25735D78 +:108B30002041524420544350205B25702D25705D08 +:108B4000206172673D257020726574726965733D9E +:108B500025642070656E642E636C6F73653A2564BE +:108B600020636F6E6E3A25640A000000572D5B2566 +:108B7000735D2041524420544350205B25702D25C5 +:108B8000705D206172673D25702072657472696541 +:108B9000733D25640A0000005B25735D204152444B +:108BA00020544350205B25702D25705D2074727910 +:108BB00020746F20636C6F73652070656E64696EDE +:108BC000673A25640A0000005B25735D206C656EC2 +:108BD0003A25640A000000005B25735D20736F6313 +:108BE0006B3A2564207063623A2570207062756666 +:108BF0003A2570206572723A256420627566537456 +:108C00006F72653A2570206C656E3A25640A000023 +:108C10005B25735D20617463705F726563765F636B +:108C20006220703D4E554C4C206F6E20736F636B0D +:108C30003A2564207063623A25700A00572D5B253F +:108C4000735D206572723D256420703D25700A00B9 +:108C50005B25735D205265636569766564202570C8 +:108C6000206C656E3A25640A000000006174637030 +:108C70005F737461727400007463705F73656E6417 +:108C80005F646174615F70636200000061746370AF +:108C90005F706F6C6C000000617463705F7265637D +:108CA000765F6362000000006172645F7463705FEE +:108CB000737461727400000067657446697273743E +:108CC000436C69656E7400006172645F7463705F09 +:108CD00064657374726F7900636C6F73655F636F43 +:108CE0006E6E000073656E6455647044617461005B +:108CF000696E736572744E6577436C69656E744313 +:108D00006F6E6E0061636B5F726563766564000011 +:108D10007463705F636F6E6E6563745F636200009F +:108D200073656E645463704461746100636C6F7347 +:108D3000655F636F6E6E5F7063620000636C656198 +:108D40006E536F636B53746174655F636200000000 +:108D50007463705F646174615F73656E74000000BA +:108D600061636B416E6446726565446174610000C5 +:108D7000676574417661696C5463704461746142E3 +:108D80007974650066726565744461746100000001 +:108D9000676574546370446174614279746500005E +:108DA00063616C634D657267654C656E0000000021 +:108DB000696E73657274427566000000697341766E +:108DC00061696C5463704461746142797465000038 +:108DD00066726565744461746149647800000000DE +:108DE0005B25735D202570205B25642C25645D0A5E +:108DF00000000000686561644275663D256420746A +:108E000061696C4275663D25640A000025645D2039 +:108E10007063623A2570204275663A202570204CB6 +:108E2000656E3A25640A00005B25735D20205B2592 +:108E3000645D3A206C656E3A2564206964783A2551 +:108E40006420746F743A25640A0000005B25735D2A +:108E500020417661696C61626C6564206461746153 +:108E60003A2025640A000000572D5B25735D2069B8 +:108E70006478427566206F7574206F662072616E2B +:108E800067653A2025640A005B25735D2025702004 +:108E90006964783A25640A00572D5B25735D20428A +:108EA0007566203D3D204E554C4C21005B25735D81 +:108EB0002041636B207063623A2570206C656E3AC6 +:108EC000256420736F636B3A256420646174613A92 +:108ED00025700A005B25735D206765743A25642060 +:108EE00025702025640A00005B25735D206368659A +:108EF000636B3A25642025642025700A0000000079 +:108F00005B25735D2046726565202570206F74684F +:108F1000657220627566202564207461696C3A254B +:108F20006420686561643A25640A0000572D5B255A +:108F3000735D204F76657277726974696E6720621F +:108F40007566666572202570206964783A2564210B +:108F50000A000000572D5B25735D20706275665F07 +:108F6000636F70795F7061727469616C20666169AA +:108F70006C65643A207372633A25702C20647374B4 +:108F80003A25702C206C656E3A25640A00000000BA +:108F9000572D5B25735D2041766F696420746F20C7 +:108FA0004F76657277726974652064617461205BC5 +:108FB00025642D25645D210A000000005B25735D9A +:108FC00020496E736572745B25645D3A2025703AA2 +:108FD00025642D2564205B25642C25645D0A000032 +:108FE000572D5B25735D20536F636B206F75742065 +:108FF0006F662072616E67653A20736F636B3D2503 +:1090000064000000696E736572745F70427566007B +:109010006765745F70427566000000000000E10043 +:1090200008040000000000000F01110110011301ED +:109030000E01110110010F0106000500636D645F50 +:109040007365745F69700000636D645F736574704D +:1090500061737300636D645F7374617274436C69F0 +:1090600000000000466F756E6420486F73743A20EC +:109070006E616D653D25732069703D307825780AF5 +:109080000000000075736167653A206474203C310C +:109090007C303E0A0000000075736167653A2073FA +:1090A000656E64556470205B736F636B5D0A097352 +:1090B0006F636B3A20736F636B6574204E756D62DE +:1090C00065720A00536F636B65743A2025640A0069 +:1090D0005061747465726E547970653A2025640A23 +:1090E0000000000050726F766100000031323334AE +:1090F000353637383930000046696E65546573740B +:10910000000000006F6666004465627567204F4688 +:10911000460A00007072696E740000004465627552 +:10912000672009656E61626C65643A203078257845 +:109130000A000000566572626F736520656E616299 +:109140006C65643A20307825780A000044756D70AB +:109150002009656E61626C65643A20307825780A72 +:1091600000000000504F6F6C6C2009656E61626CEE +:1091700065643A20307825780A00000044656275FD +:1091800067204F4E0A00000075736167653A2064DE +:1091900065627567203C73656374696F6E3E203C41 +:1091A0006C6576656C3E0A0973656374696F6E3A27 +:1091B00020696E69742C20636D2C207370692C20DB +:1091C000746370202C207574696C2C207761726E2A +:1091D0000A096C6576656C20203A203020286F667D +:1091E00066292C203120286F6E292C2032202876E9 +:1091F0006572626F7365290A096F723A206465624D +:109200007567207072696E742F6F6E2F6F66660AB5 +:1092100000000000696E697400000000737069004E +:1092200074637000636D00007574696C0000000069 +:109230007761726E00000000616C6C0044756D70A7 +:1092400020416C6C20427566666572730A000000EE +:1092500075736167653A2064756D7050627566203C +:109260005B736F636B5D0A09736F636B3A20736F97 +:10927000636B6574204E756D6265720A00000000B4 +:109280006E6F6E650000000044656C6574696E6702 +:1092900020574550206B6579730A0000757361672C +:1092A000653A207365746B6579203C6B65795F69FD +:1092B00064782028302D33293E203C6B6579206965 +:1092C0006E206865783E0A09206F723A20736574D3 +:1092D0006B6579206E6F6E650A000000205745505F +:1092E000206B6579206D75737420626520313020A4 +:1092F000285745502D343029206F722032362028CF +:109300005745502D31303429206469676974730AD8 +:1093100000000000776C5F61706920766572736988 +:109320006F6E2076322E372E300A00006661696C2F +:10933000656420746F20676574206D6163206164CB +:1093400064726573730A0000687720616464723A1E +:109350002025730A000000006C696E6B2073746135 +:109360007475733A20000000697020616464723A79 +:10937000202573202D2000006E65746D61736B3A9B +:10938000202573202D200000676174657761793A8C +:109390002025730A00000000697020696E746572F0 +:1093A0006661636520697320646F776E0A00000050 +:1093B00064686370203A2000656E61626C65640ABF +:1093C0000000000064697361626C65640A0000005B +:1093D000444E533A202573202D2000007573616799 +:1093E000653A207374617274436C69203C697061E2 +:1093F0006464723E203C706F72743E203C736F63F5 +:109400006B3E203C7463702830292F7564702831BE +:10941000293E0A00537461727420636C69656E742E +:10942000206F6E206164647220307825782C207063 +:109430006F727420256420736F636B202564206D28 +:109440006F64652025640A00572D5B25735D2053EA +:109450007461727420636C69656E74206F6E207025 +:109460006F727420256420736F636B2025642070F5 +:10947000726F74202564206D6F646520256420461A +:1094800041494C45440A000075736167653A207391 +:1094900074617274537276203C706F72743E203C1B +:1094A000736F636B3E203C7463702830292F7564A2 +:1094B000702831293E0A00005374617274202573AC +:1094C00020736572766572206F6E20706F727420E3 +:1094D000256420736F636B2025640A00572D5B257C +:1094E000735D2053746172742025732073657276E6 +:1094F0006572206F6E20706F727420256420736F08 +:10950000636B202564204641494C45440A00000015 +:1095100075736167653A20736574646E73205B319F +:109520002D325D206161612E6262622E6363632E63 +:109530006464640A0000000053657420444E5320A4 +:1095400073657276657220256420746F2025730A16 +:10955000000000003D3D3E20444E53313A2025732B +:109560000A0000003D3D3E20444E53323A20257310 +:109570000A00000075736167653A20676574486F7B +:109580007374203C686F73746E616D653E0A0000F1 +:1095900075736167653A207770617373203C7373EC +:1095A00069643E203C706173737068726173653EDC +:1095B0000A0000002573203A204661696C6564202A +:1095C000746F20616464207061737370687261737A +:1095D000650A000075736167653A20647061737392 +:1095E000203C737369643E0A000000002573203A32 +:1095F000204661696C656420746F2064656C6574D5 +:109600006520706173737068726173650A00000091 +:1096100075736167653A206970636F6E666967206C +:109620003C69703E203C6E65746D61736B3E203CFE +:10963000676174657761792D69703E0A00000000EA +:1096400020206F72203A206970636F6E6669672010 +:109650006E6F6E652028746F20656E61626C652088 +:1096600044484350290A00005B25735D206E6966FB +:109670003A2570206C7769705F616464723D307860 +:1096800025780A0075736167653A20636F6E6E65B1 +:109690006374203C737369643E0A0000636D645F09 +:1096A000737461727453727600000000636D645FBE +:1096B00064656C70617373004D494D4C4644000005 +:1096C0000A24200024200000617661696C61626CCC +:1096D0006520636F6D6D616E64733A0A000000006F +:1096E000202025730A000000636F756C64206E6F84 +:1096F0007420616C6C6F63617465206669726D774C +:10970000617265206275666665720A00547565202F +:109710004D61722032362032323A30393A353420B7 +:109720003230313300000000776C5F696E69745F1E +:10973000636F6D706C6574655F6362006661696C10 +:10974000656420746F20696E697420776C20636F84 +:109750006E6E206D67720000572D5B25735D205380 +:109760007069206E6F7420696E697469616C697AC2 +:1097700065640A006C696E6B20646F776E2C2072D2 +:10978000656C6561736520646863700A00000000A1 +:109790006C696E6B20646F776E0A00006C696E6B8B +:1097A0002075702C20636F6E6E6563746564207421 +:1097B0006F20222573220A007265717565737469C2 +:1097C0006E672064686370202E2E2E20000000003B +:1097D0004641494C45440A00626F756E6420746FBF +:1097E0002025730A00000000572D5B25735D20497A +:1097F0006E74657266616365206E6F74207570218A +:109800000A0000007363616E00000000636F6E6EFB +:10981000656374007365746B6579000073746174BB +:1098200075730000646562756700000064756D7093 +:10983000427566006970636F6E66696700000000BC +:10984000747463700000000077706173730000002F +:109850006470617373000000676574486F7374000F +:10986000736574444E53000073746172745372765E +:10987000000000007374617274436C6900000000A2 +:1098800073656E645564700041726475696E6F2013 +:109890005769666920537461727475702E2E2E207C +:1098A0005B25735D0A0000006F7574206F66206D84 +:1098B000656D6F72790000006661696C6564207483 +:1098C0006F207072657061726520666F72206669C4 +:1098D000726D7761726520646F776E6C6F61640A78 +:1098E00000000000436F756C64206E6F7420646527 +:1098F0007465637420776C206465766963652C20D9 +:1099000061626F7274696E670A000000496E766169 +:109910006C6964206669726D776172652064617438 +:10992000612C2061626F7274696E670A000000002A +:109930004661696C656420746F2073746172742071 +:10994000776C20696E697469616C697A6174696F9A +:109950006E0A0000312E312E3000000069705F73F6 +:1099600074617475735F63620000000002000000A0 +:1099700000B71B000800000100010000286E756C94 +:109980006C290000253032782D253032782D253095 +:1099900032782D253032782D253032782D25303211 +:1099A00078000000256C752E256C752E256C752EA3 +:1099B000256C75007373696420746F6F206C6F6E13 +:1099C0006720286D6178202564290A00257320000E +:1099D00022257322000000002052535349202564A1 +:1099E0002064426D200000002041642D486F6320F8 +:1099F00000000000202857455020656E6372797082 +:109A000074696F6E290000002028544B495020656E +:109A10006E6372797074696F6E2900002028434369 +:109A20004D5020656E6372797074696F6E29000005 +:109A3000202020002530325820000000256300003F +:109A40006E6F206E65747320666F756E640A000019 +:109A5000496E76616C6964206C656E6774680A0093 +:109A600025642E25642E25642E256400544B495010 +:109A70000000000043434D500000000057455000D7 +:109A8000776C5F636D5F696E6974000073656C6508 +:109A900063745F6E65740000776C5F636F6E6E5FFA +:109AA0006C6F73745F636200776C5F7363616E5F8A +:109AB000636F6D706C6574655F636200776C5F6582 +:109AC00076656E745F636200776C5F6D6564696173 +:109AD0005F636F6E6E65637465645F636200000050 +:109AE0005B25735D20434D3A206F7574206F6620AF +:109AF0006D656D6F72790A005B25735D20434D3A89 +:109B000020636F756C64206E6F7420726567697373 +:109B1000746572206576656E742063620A000000C9 +:109B20005B25735D20434D3A20696E697469616CF1 +:109B3000697A65640A0000005B25735D20434D3A35 +:109B400020636F6E6E656374656420746F20257387 +:109B50000A0000005B25735D20434D3A20636F6E61 +:109B60006E656374206661696C65642C2073636143 +:109B70006E6E696E670A00005B25735D20434D3A87 +:109B800020636F756C64206E6F74207374617274DF +:109B9000207363616E20616674657220636F6E6E00 +:109BA000656374206661696C210A00005B25735D42 +:109BB00020434D3A20646973636F6E6E656374650C +:109BC000640A00005B25735D20434D3A20636F6E8D +:109BD0006E656374696F6E206C6F73742C20736391 +:109BE000616E6E696E670A005B25735D20434D3AB6 +:109BF00020636F756C64206E6F742073746172746F +:109C0000207363616E20616674657220636F6E6E8F +:109C1000656374206C6F7374210A00005B25735DAB +:109C200020434D3A207363616E20636F6D706C65E5 +:109C30007465640A00000000FFFFFFFFFFFF0000E3 +:109C40005B25735D20434D3A20526F616D696E67ED +:109C50002066726F6D207273736920256420746FA3 +:109C60002025640A000000005B25735D20434D3A07 +:109C7000204E6F2063616E64696461746520666F55 +:109C8000756E6420666F7220737369642022257379 +:109C9000220A00005B25735D20434D3A206661690E +:109CA0006C656420746F20636F6E6E6563740A0068 +:109CB0005B25735D20434D3A206661696C656420C5 +:109CC000746F207363616E0A000000005B25735D92 +:109CD00020434D3A20756E68616E646C6564206542 +:109CE00076656E740A000000776C5F636F6E6E5F5E +:109CF0006661696C7572655F636200000000000157 +:109D0000000018500000000B00001854000000096B +:109D1000000018800000000F000018A400000001DF +:109D2000000018E000000001000018E4000000013D +:109D300000001810000000010000181400000001CD +:109D400000001818000000010000181C00000001AD +:109D5000000018200000000100001824000000018D +:109D600000001828000000010000182C000000036B +:109D700000001830000000010000183C0000000145 +:109D8000000018400000000100001844000000011D +:109D900000001848000000010000184C4173736572 +:109DA0007274696F6E2022257322206661696C656A +:109DB00064206174206C696E6520256420696E20C2 +:109DC00025730A002E2E2F7372632F534F4654575C +:109DD0004152455F4652414D45574F524B2F5345D7 +:109DE0005256494345532F4C5749502F6C77697051 +:109DF0002D312E332E322F7372632F636F72652FC6 +:109E0000646863702E630000646863705F6F7074D1 +:109E1000696F6E3A20646863702D3E6F7074696F6D +:109E20006E735F6F75745F6C656E202B2032202B14 +:109E3000206F7074696F6E5F6C656E203C3D2044CE +:109E40004843505F4F5054494F4E535F4C454E006E +:109E5000646863705F6F7074696F6E5F6279746558 +:109E60003A20646863702D3E6F7074696F6E735F23 +:109E70006F75745F6C656E203C20444843505F4FA3 +:109E80005054494F4E535F4C454E00006468637018 +:109E90005F6F7074696F6E5F747261696C65723A3E +:109EA000206468637020213D204E554C4C0000001A +:109EB000646863705F6F7074696F6E5F74726169FC +:109EC0006C65723A20646863702D3E6D73675F6FD6 +:109ED000757420213D204E554C4C0A006468637017 +:109EE0005F6F7074696F6E5F747261696C65723AEE +:109EF00020646863702D3E6F7074696F6E735F6F5E +:109F000075745F6C656E203C20444843505F4F5031 +:109F100054494F4E535F4C454E0A000064686370CD +:109F20005F6F7074696F6E5F73686F72743A2064EC +:109F30006863702D3E6F7074696F6E735F6F7574B8 +:109F40005F6C656E202B2032203C3D2044484350FE +:109F50005F4F5054494F4E535F4C454E0000000038 +:109F6000646863705F6F7074696F6E5F6C6F6E674B +:109F70003A20646863702D3E6F7074696F6E735F12 +:109F80006F75745F6C656E202B2034203C3D20443F +:109F90004843505F4F5054494F4E535F4C454E001D +:109FA0007265706C79207761736E277420667265B4 +:109FB00065640000646863705F6372656174655F07 +:109FC000726571756573743A206E657469662021D7 +:109FD0003D204E554C4C0000646863705F637265B1 +:109FE0006174655F726571756573743A2064686346 +:109FF0007020213D204E554C4C0000006468637079 +:10A000005F6372656174655F726571756573743ADB +:10A0100020646863702D3E705F6F7574203D3D2035 +:10A020004E554C4C00000000646863705F637265BD +:10A030006174655F726571756573743A20646863F5 +:10A04000702D3E6D73675F6F7574203D3D204E55DA +:10A050004C4C0000646863705F6372656174655F97 +:10A06000726571756573743A20636865636B2074FB +:10A07000686174206669727374207062756620630B +:10A08000616E20686F6C64207374727563742064F1 +:10A090006863705F6D736700646863705F64656CAC +:10A0A0006574655F726571756573743A206E657469 +:10A0B000696620213D204E554C4C00006468637059 +:10A0C0005F64656C6574655F726571756573743A1C +:10A0D000206468637020213D204E554C4C000000E8 +:10A0E000646863705F64656C6574655F72657175E3 +:10A0F0006573743A20646863702D3E705F6F757489 +:10A1000020213D204E554C4C0000000064686370D7 +:10A110005F64656C6574655F726571756573743ACB +:10A1200020646863702D3E6D73675F6F75742021C6 +:10A130003D204E554C4C00006E6574696620213DF3 +:10A14000204E554C4C0000007062756620705F6FA9 +:10A150007574207761736E2774206672656564007C +:10A16000646863705F62696E643A206E65746966E4 +:10A1700020213D204E554C4C000000006468637067 +:10A180005F62696E643A206468637020213D204EEE +:10A19000554C4C00726574203D3D2073697A656FA3 +:10A1A000662873747275637420646863705F6D737E +:10A1B0006729202D20444843505F4F5054494F4E4B +:10A1C000535F4C454E000000726574203D3D206495 +:10A1D0006863702D3E6F7074696F6E735F696E5F38 +:10A1E0006C656E002E2E2F7372632F534F4654579B +:10A1F0004152455F4652414D45574F524B2F5345B3 +:10A200005256494345532F4C5749502F6C7769702C +:10A210002D312E332E322F7372632F636F72652FA1 +:10A22000646E732E63000000646E73207365727633 +:10A230006572206F7574206F66206172726179009B +:10A24000646E732073657276657220686173206E28 +:10A250006F20495020616464726573732073657464 +:10A260000000000070627566206D75737420626571 +:10A2700020696E206F6E652070696563650000005F +:10A28000617272617920696E646578206F757420DF +:10A290006F6620626F756E6473000000756E6B6E82 +:10A2A0006F776E20646E735F7461626C6520656E9B +:10A2B0007472792073746174653A00006C6F636125 +:10A2C0006C686F73740000003230382E36372E32CF +:10A2D00032322E3232320000000400040004000248 +:10A2E000002000050002001E002000002E2E2F730B +:10A2F00072632F534F4654574152455F4652414D6A +:10A3000045574F524B2F53455256494345532F4CB7 +:10A310005749502F6C7769702D312E332E322F73A1 +:10A3200072632F636F72652F6D656D702E63000011 +:10A330006D656D705F667265653A206D656D207044 +:10A34000726F7065726C7920616C69676E6564000C +:10A350006D656D705F6D616C6C6F633A20747970C0 +:10A3600065203C204D454D505F4D41580000000098 +:10A370006D656D705F6D616C6C6F633A206D656DBE +:10A38000702070726F7065726C7920616C69676E95 +:10A3900065640000001C002000B0002400140020B0 +:10A3A00000080010025400002E2E2F7372632F53EA +:10A3B0004F4654574152455F4652414D45574F52C3 +:10A3C0004B2F53455256494345532F4C5749502F15 +:10A3D0006C7769702D312E332E322F7372632F6399 +:10A3E0006F72652F6E657469662E6300626F6775A4 +:10A3F0007320706275663A206C656E20213D207472 +:10A400006F745F6C656E20627574206E6578742061 +:10A410003D3D204E554C4C210000000073686F7587 +:10A420006C64206E6F74206265206E756C6C207396 +:10A43000696E636520666972737420213D206C61CA +:10A4400073742100696620666972737420213D204F +:10A450004E554C4C2C206C617374206D75737420B8 +:10A46000616C736F20626520213D204E554C4C007D +:10A470002E2E2F7372632F534F4654574152455F10 +:10A480004652414D45574F524B2F53455256494323 +:10A4900045532F4C5749502F6C7769702D312E330F +:10A4A0002E322F7372632F636F72652F7062756621 +:10A4B0002E630000286820213D204E554C4C292059 +:10A4C000262620287420213D204E554C4C2920283A +:10A4D00070726F6772616D6D65722076696F6C6105 +:10A4E000746573204150492900000000702D3E74AE +:10A4F0006F745F6C656E203D3D20702D3E6C656E07 +:10A5000020286F66206C6173742070627566206904 +:10A510006E20636861696E2900000000696E6372D5 +:10A52000656D656E745F6D61676E697475646520D5 +:10A530003C3D20702D3E6C656E0000006261642021 +:10A5400070627566207479706500000070627566CF +:10A550005F74616B653A20696E76616C6964206234 +:10A5600075660000706275665F74616B653A20699C +:10A570006E76616C6964206461746170747200004D +:10A58000706275665F74616B653A20696E76616CA6 +:10A590006964207062756600646964206E6F74205F +:10A5A000636F707920616C6C2064617461000000DD +:10A5B000706275665F636F70795F706172746961F4 +:10A5C0006C3A20696E76616C696420627566000081 +:10A5D000706275665F636F70795F706172746961D4 +:10A5E0006C3A20696E76616C696420646174617094 +:10A5F00074720000706275665F636F70793A2074E0 +:10A600006172676574206E6F742062696720656E81 +:10A610006F75676820746F20686F6C6420736F7546 +:10A6200072636500705F746F20213D204E554C4C65 +:10A63000000000006F66667365745F746F203C3DB8 +:10A6400020705F746F2D3E6C656E00006F666673E0 +:10A6500065745F66726F6D203C3D20705F66726F3F +:10A660006D2D3E6C656E0000706275665F636F7085 +:10A6700079282920646F6573206E6F7420616C6C7B +:10A680006F77207061636B65742071756575657394 +:10A69000210A0000706275665F667265653A207314 +:10A6A000616E6520747970650000000070627566E7 +:10A6B0005F667265653A20702D3E726566203E20A9 +:10A6C00030000000702D3E746F745F6C656E203D2D +:10A6D0003D20702D3E6C656E202B20712D3E746FD9 +:10A6E000745F6C656E000000702D3E746F745F6C5B +:10A6F000656E203D3D20702D3E6C656E00000000B3 +:10A70000706275665F7265616C6C6F633A20702071 +:10A71000213D204E554C4C00706275665F7265613C +:10A720006C6C6F633A2073616E6520702D3E747996 +:10A730007065000067726F77203C206D61785F75EF +:10A7400031365F7400000000706275665F7265618B +:10A750006C6C6F633A207120213D204E554C4C00AB +:10A76000706275665F616C6C6F633A206261642031 +:10A7700070627566206C617965720000636865635C +:10A780006B20702D3E7061796C6F6164202B20709E +:10A790002D3E6C656E20646F6573206E6F74206F44 +:10A7A000766572666C6F77207062756600000000D7 +:10A7B000504255465F504F4F4C5F42554653495AA1 +:10A7C00045206D75737420626520626967676572E4 +:10A7D000207468616E204D454D5F414C49474E4D98 +:10A7E000454E540072656D5F6C656E203C206D6156 +:10A7F000785F7531365F7400706275665F616C6C8E +:10A800006F633A207062756620712D3E7061796CBD +:10A810006F61642070726F7065726C7920616C6911 +:10A82000676E656400000000706275665F616C6C45 +:10A830006F633A206572726F6E656F7573207479FD +:10A8400070650000706275665F636F707920666185 +:10A85000696C656400000000010203040506070737 +:10A8600007070707070000002E2E2F7372632F5370 +:10A870004F4654574152455F4652414D45574F52FE +:10A880004B2F53455256494345532F4C5749502F50 +:10A890006C7769702D312E332E322F7372632F63D4 +:10A8A0006F72652F7463702E630000007463705FB5 +:10A8B000706362735F73616E653A20616374697679 +:10A8C00065207063622D3E737461746520213D20A4 +:10A8D000434C4F53454400007463705F7063627370 +:10A8E0005F73616E653A2061637469766520706399 +:10A8F000622D3E737461746520213D204C49535490 +:10A90000454E00007463705F706362735F73616EC5 +:10A91000653A20616374697665207063622D3E73C9 +:10A920007461746520213D2054494D452D5741499E +:10A93000540000007463705F706362735F73616ED4 +:10A94000653A207477207063622D3E73746174657C +:10A95000203D3D2054494D452D57414954000000AC +:10A960007463705F62696E643A2063616E206F6E1B +:10A970006C792062696E6420696E207374617465FD +:10A9800020434C4F534544007463705F7265637697 +:10A9900065643A206C656E20776F756C6420777201 +:10A9A0006170207263765F776E640A00756E7365FE +:10A9B0006E74207365676D656E7473206C65616B72 +:10A9C000696E6700756E61636B6564207365676DA2 +:10A9D000656E7473206C65616B696E6700000000C2 +:10A9E0006F6F736571207365676D656E7473206C2E +:10A9F00065616B696E6700007463705F7063625FAE +:10AA000072656D6F76653A207463705F7063627310 +:10AA10005F73616E652829007463705F6C6973747D +:10AA2000656E3A2070636220616C726561647920A2 +:10AA3000636F6E6E65637465640000007463705FBD +:10AA4000736C6F77746D723A2061637469766520F8 +:10AA50007063622D3E737461746520213D20434C08 +:10AA60004F5345440A0000007463705F736C6F7746 +:10AA7000746D723A20616374697665207063622D2B +:10AA80003E737461746520213D204C495354454EFA +:10AA90000A0000007463705F736C6F77746D723AB4 +:10AAA00020616374697665207063622D3E73746102 +:10AAB000746520213D2054494D452D574149540A84 +:10AAC000000000007463705F736C6F77746D723A8E +:10AAD000206D6964646C652074637020213D20746E +:10AAE00063705F6163746976655F706362730000B1 +:10AAF0007463705F736C6F77746D723A20666972FD +:10AB0000737420706362203D3D207463705F6163E5 +:10AB1000746976655F706362730000007463705FD0 +:10AB2000736C6F77746D723A2054494D452D5741BF +:10AB30004954207063622D3E7374617465203D3DFD +:10AB40002054494D452D5741495400007463705FAE +:10AB5000736C6F77746D723A206D6964646C6520F4 +:10AB600074637020213D207463705F74775F70633D +:10AB7000627300007463705F736C6F77746D723A08 +:10AB800020666972737420706362203D3D20746397 +:10AB9000705F74775F706362730000007463705F4E +:10ABA000636F6E6E6563743A2063616E206F6E6CC6 +:10ABB0007920636F6E6E65637465642066726F6D75 +:10ABC00020737461746520434C4F5345440000006A +:10ABD00053594E5F53454E540000000053594E5F89 +:10ABE000524356440000000045535441424C4953DF +:10ABF0004845440046494E5F574149545F31000083 +:10AC000046494E5F574149545F320000434C4F5311 +:10AC1000455F574149540000434C4F53494E47004C +:10AC20004C4153545F41434B0000000054494D4593 +:10AC30005F5741495400000003060C18306078004B +:10AC40008000FAFC8000FC6C8000FD4E8000FDB4AA +:10AC50008000FE368000FD4E8000FE788000FEF809 +:10AC60002E2E2F7372632F534F4654574152455F18 +:10AC70004652414D45574F524B2F5345525649432B +:10AC800045532F4C5749502F6C7769702D312E3317 +:10AC90002E322F7372632F636F72652F7463705F30 +:10ACA000696E2E63000000007063622D3E736E6457 +:10ACB0005F71756575656C656E203E3D20706275CF +:10ACC000665F636C656E286E6578742D3E70290032 +:10ACD0007463705F726563656976653A2076616C4E +:10ACE0006964207175657565206C656E67746800B0 +:10ACF000696E7365672E7020213D204E554C4C00C7 +:10AD0000696E73616E65206F6666736574210000FD +:10AD10007062756620746F6F2073686F72742100A3 +:10AD2000706275665F686561646572206661696CF2 +:10AD3000656400007463705F726563656976653A87 +:10AD4000207365676D656E74206E6F742074726910 +:10AD50006D6D656420636F72726563746C792074C5 +:10AD60006F207263765F776E640A00007463705FB1 +:10AD7000726563656976653A207365676D656E74A3 +:10AD8000206E6F74207472696D6D656420636F72DC +:10AD9000726563746C7920746F206F6F73657120B6 +:10ADA00071756575650A00007463705F726563652F +:10ADB0006976653A207463706C656E203E2072631C +:10ADC000765F776E640A00007463705F7265636516 +:10ADD0006976653A206F6F736571207463706C6576 +:10ADE0006E203E207263765F776E640A000000007A +:10ADF0007463705F696E7075743A2061637469760C +:10AE000065207063622D3E737461746520213D205E +:10AE1000434C4F53454400007463705F696E707516 +:10AE2000743A20616374697665207063622D3E73A5 +:10AE30007461746520213D2054494D452D57414989 +:10AE4000540000007463705F696E7075743A20611D +:10AE50006374697665207063622D3E7374617465F6 +:10AE600020213D204C495354454E00007463705FCF +:10AE7000696E7075743A207063622D3E6E657874E9 +:10AE800020213D2070636220286265666F72652014 +:10AE900063616368652900007463705F696E707533 +:10AEA000743A207063622D3E6E65787420213D20D7 +:10AEB00070636220286166746572206361636865EF +:10AEC000290000007463705F696E7075743A2054D5 +:10AED000494D452D57414954207063622D3E73748E +:10AEE000617465203D3D2054494D452D57414954DD +:10AEF000000000007463705F696E7075743A2070B2 +:10AF000063622D3E737461746520213D20434C4F74 +:10AF1000534544007063622D3E736E645F717565C6 +:10AF200075656C656E203E20300000007063622DF8 +:10AF30003E61636365707420213D204E554C4C008A +:10AF40007463705F696E7075743A207463705F70BB +:10AF50006362735F73616E65282900002E2E2F7364 +:10AF600072632F534F4654574152455F4652414DED +:10AF700045574F524B2F53455256494345532F4C3B +:10AF80005749502F6C7769702D312E332E322F7325 +:10AF900072632F636F72652F7463705F6F75742EA9 +:10AFA00063000000636865636B20746861742066E9 +:10AFB0006972737420706275662063616E20686FB9 +:10AFC0006C6420737472756374207463705F68645A +:10AFD000720000007463705F656E71756575653A27 +:10AFE000207061636B6574206E65656473207061A9 +:10AFF000796C6F61642C206F7074696F6E732C2094 +:10B000006F722053594E2F46494E202870726F6739 +:10B0100072616D6D65722076696F6C617465732005 +:10B0200041504929000000007463705F656E7175BE +:10B030006575653A206C656E20213D2030207C7C52 +:10B0400020617267203D3D204E554C4C2028707287 +:10B050006F6772616D6D65722076696F6C61746582 +:10B0600073204150492900007463705F656E7175EB +:10B070006575653A207062756673206F6E20717514 +:10B08000657565203D3E206174206C656173742098 +:10B090006F6E65207175657565206E6F6E2D656DBF +:10B0A000707479007463705F656E71756575653A6B +:10B0B000206E6F207062756673206F6E20717565EB +:10B0C0007565203D3E20626F7468207175657565F9 +:10B0D0007320656D707479007573656720213D205C +:10B0E0004E554C4C00000000636865636B2074682B +:10B0F0006174206669727374207062756620636182 +:10B100006E20686F6C642074686520636F6D706C6E +:10B11000657465207365676C656E000070627566A6 +:10B120005F686561646572206661696C65640A00C8 +:10B1300046494E20656E71756575656420746F674C +:10B140006574686572207769746820646174610051 +:10B150007A65726F2D6C656E6774682070627566B3 +:10B16000000000007463705F656E71756575653A07 +:10B170002076616C6964207175657565206C656EFB +:10B1800067746800525354206E6F74206578706540 +:10B190006374656420686572652100002E2E2F732C +:10B1A00072632F534F4654574152455F4652414DAB +:10B1B00045574F524B2F53455256494345532F4CF9 +:10B1C0005749502F6C7769702D312E332E322F73E3 +:10B1D00072632F636F72652F7564702E63000000B9 +:10B1E000726562696E64203D3D203000636865636E +:10B1F0006B20746861742066697273742070627564 +:10B20000662063616E20686F6C642073747275636E +:10B2100074207564705F686472000000702D3E7069 +:10B2200061796C6F6164203D3D20697068647200D3 +:10B230002E2E2F7372632F534F4654574152455F42 +:10B240004652414D45574F524B2F53455256494355 +:10B2500045532F4C5749502F6C7769702D312E3341 +:10B260002E322F7372632F636F72652F697076347D +:10B270002F69636D702E6300636865636B2074686B +:10B2800061742066697273742070627566206361F0 +:10B290006E20686F6C642069636D70206D657373D8 +:10B2A0006167650069636D705F696E7075743A20DF +:10B2B0006D6F76696E6720702D3E7061796C6F617D +:10B2C0006420746F2069702068656164657220660F +:10B2D00061696C65640A0000636865636B2074686B +:10B2E0006174206669727374207062756620636190 +:10B2F0006E20686F6C642073747275637420746858 +:10B30000652049434D502068656164657200000006 +:10B3100069636D705F696E7075743A20636F7079E0 +:10B32000696E6720746F206E657720706275662085 +:10B330006661696C65640A0069636D705F696E704F +:10B3400075743A20726573746F72696E67206F72DC +:10B350006967696E616C20702D3E7061796C6F61F8 +:10B3600064206661696C65640A00000043616E27B1 +:10B3700074206D6F7665206F7665722068656164F4 +:10B38000657220696E207061636B65740000000057 +:10B390002E2E2F7372632F534F4654574152455FE1 +:10B3A0004652414D45574F524B2F534552564943F4 +:10B3B00045532F4C5749502F6C7769702D312E33E0 +:10B3C0002E322F7372632F636F72652F697076341C +:10B3D0002F69702E63000000636865636B207468DA +:10B3E000617420666972737420706275662063618F +:10B3F0006E20686F6C64207374727563742069705A +:10B400005F68647200FFFFFFFF00000000000000A3 +:10B410002E2E2F7372632F534F4654574152455F60 +:10B420004652414D45574F524B2F53455256494373 +:10B4300045532F4C5749502F6C7769702D312E335F +:10B440002E322F7372632F636F72652F697076349B +:10B450002F69705F667261672E630000746869739C +:10B46000206E656564732061207062756620696E68 +:10B47000206F6E65207069656365210073616E6978 +:10B48000747920636865636B206C696E6B656420FA +:10B490006C697374000000007072657620213D2095 +:10B4A00069707200707265762D3E6E657874203D0D +:10B4B0003D2069707200000069705F72656173738E +:10B4C0005F70627566636F756E74203E3D20636CBD +:10B4D000656E0000636865636B20667261676D6509 +:10B4E0006E747320646F6E2774206F7665726C6162 +:10B4F000700000006E6F2070726576696F75732042 +:10B50000667261676D656E742C2074686973206D56 +:10B51000757374206265207468652066697273743F +:10B5200020667261676D656E7421000073616E69DB +:10B53000747920636865636B0000000076616C6954 +:10B54000646174655F646174616772616D3A6E65B0 +:10B5500078745F70627566213D4E554C4C0000005A +:10B5600076616C69646174655F646174616772615E +:10B570006D3A646174616772616D20656E64213D2E +:10B58000646174616772616D206C656E00FFFFFF1E +:10B59000FFFFFF002E2E2F7372632F534F46545719 +:10B5A0004152455F4652414D45574F524B2F5345EF +:10B5B0005256494345532F4C5749502F6C77697069 +:10B5C0002D312E332E322F7372632F6E65746966A0 +:10B5D0002F6574686172702E630000006E65746977 +:10B5E000662D3E6877616464725F6C656E206D7570 +:10B5F0007374206265207468652073616D652061D5 +:10B6000073204554484152505F4857414444525F6B +:10B610004C454E20666F722065746861727021001F +:10B620007120213D204E554C4C000000712D3E7084 +:10B6300020213D204E554C4C00000000722D3E70E4 +:10B6400020213D204E554C4C000000006172705F7F +:10B650007461626C655B695D2E71203D3D204E55C5 +:10B660004C4C000069203C204152505F5441424CF8 +:10B67000455F53495A4500006E657469662D3E6802 +:10B6800077616464725F6C656E203D3D204554486F +:10B690004152505F4857414444525F4C454E000070 +:10B6A000636865636B207468617420666972737483 +:10B6B00020706275662063616E20686F6C64207311 +:10B6C0007472756374206574686172705F68647207 +:10B6D000000000006172705F7461626C655B695D9F +:10B6E0002E7374617465203D3D2050454E44494E93 +:10B6F00047206F7220535441424C45006E6F2070BA +:10B7000061636B65742071756575657320616C6C20 +:10B710006F77656421000000000000002E2E2F735B +:10B7200072632F534F4654574152455F4652414D25 +:10B7300045574F524B2F53455256494345532F4C73 +:10B740005749502F6C7769702D706F72742D312EA0 +:10B75000332E322F48442F69662F6E657469662F29 +:10B76000776C69662E6300000A09000052580000D9 +:10B7700054580000FFFFFF740000000001FFFFFFAE +:10B780000000FFFFFFFFFF400000000001FFFFFF80 +:10B7900041505000484D4700312E352E312E370094 +:10B7A000312E352E312E3100312E352E312E3400F2 +:10B7B00080017C7C80017C7480017C7C80017C6ABF +:10B7C00080017DCA80017D7880017D2A80017CD83E +:10B7D00080017C86800185D2800185CA800185CA6E +:10B7E000800185D2800185C2800185C2800185BA31 +:10B7F000800185BA02040B0C121618242C30424822 +:10B80000606C0000322E312E312E310078C40E00D3 +:10B81000352E332E31000000352E332E350000003A +:10B82000352E332E340000008001BF808001BF928E +:10B830008001BFA88001BF5A8001BF668001BFD4CC +:10B840008001BF5A8001BFE08001BF5A8001BF5A0A +:10B850008001BF5A8001BF5A8001BF5A8001BF5A80 +:10B860008001BF5A8001BF5A8001BF5A8001BF5A70 +:10B870008001BF5A8001BF5A8001BF5A8001BF5A60 +:10B880008001BF5A8001BF5A8001BF5A8001BF5A50 +:10B890008001BF5A8001BF5A8001BF5A8001BF5A40 +:10B8A0008001BF5A8001BF5A8001BF5A8001BF5A30 +:10B8B0008001BF5A8001BF5A8001BF5A8001BF5A20 +:10B8C0008001BF5A8001BF5A8001BF5A8001BF5A10 +:10B8D0008001BF5A8001BF5A8001BF5A8001BF5A00 +:10B8E0008001BF5A8001BF5A8001BF5A8001BF5AF0 +:10B8F0008001BF5A8001BF5A8001BF5A8001BF5AE0 +:10B900008001BF5A8001BF5A8001BF5A8001BF5ACF +:10B910008001BF5A8001BF5A8001BF5A8001BF5ABF +:10B920008001BF5A8001BF7C8001C0448001BF5AA2 +:10B930008001C0448001BF5A8001C17C8001BF5A90 +:10B940008001C1708001BF5A8001C1648001BF5A6B +:10B950008001BF5A8001BF5A8001BF5A8001C1AC2B +:10B960008001BF5A8001BF5A8001C1A08001BF5A27 +:10B970008001C1948001BF5A8001BF5A8001BF5A23 +:10B980008001BF5A8001BF5A8001BF5A8001BF5A4F +:10B990008001BF5A8001BF5A8001BF5A8001BF5A3F +:10B9A0008001BF5A8001BF5A8001BF5A8001BF5A2F +:10B9B0008001BF5A8001BF5A8001BF5A8001BF5A1F +:10B9C0008001BF5A8001BF5A8001BF5A8001BF5A0F +:10B9D0008001BF5A8001BF5A8001BF5A8001BF5AFF +:10B9E0008001BF5A8001BF5A8001BF5A8001BF5AEF +:10B9F0008001BF5A8001BF5A8001BF5A8001BF5ADF +:10BA00008001BF5A8001BF5A8001BF5A8001BF5ACE +:10BA10008001BF5A8001BF5A8001BF5A8001BF5ABE +:10BA20008001BF5A8001BF5A8001BF5A8001BF5AAE +:10BA30008001BF5A8001BF5A8001BF5A8001BF5A9E +:10BA40008001BF5A8001BF5A8001BF5A8001BF5A8E +:10BA50008001BF5A8001BF5A8001BF5A8001BF5A7E +:10BA60008001BF5A8001BF5A8001BF5A8001BF5A6E +:10BA70008001BF5A8001BF5A8001BF5A8001BF5A5E +:10BA80008001BF5A8001BF5A8001BF5A8001BF5A4E +:10BA90008001BF5A8001BF5A8001BF5A8001BF5A3E +:10BAA0008001BF5A8001BF5A8001BF5A8001BF5A2E +:10BAB0008001BF5A8001BF5A8001BF5A8001BF5A1E +:10BAC0008001BF5A8001BF5A8001BF5A8001BF5A0E +:10BAD0008001BF5A8001BF5A8001BF5A8001BF5AFE +:10BAE0008001BF5A8001BF5A8001BF5A8001BF5AEE +:10BAF0008001BF5A8001BF5A8001BF5A8001BF5ADE +:10BB00008001BF5A8001BF5A8001BF5A8001BF5ACD +:10BB10008001BF5A8001C02C8001C1588001C02C17 +:10BB20008001C02C8001C1888001BF5A8001C044BF +:10BB30008001BF5A8001C0508001BF5A8001C050AF +:10BB40008001BF5A8001C02C8001BF5A8001C02CE7 +:10BB50008001C0388001C0388001C0388001BF5AE0 +:10BB60008001C02C8001C02C8001C14C8001BF5AD3 +:10BB70008001BF5A8001C1408001BF5A8001BF5A75 +:10BB80008001BF5A8001BF5A8001BF5A8001BF5A4D +:10BB90008001BF5A8001BF5A8001BF5A8001BF5A3D +:10BBA0008001C1348001BF5A8001BF5A8001BF5A51 +:10BBB0008001BF5A8001BF5A8001BF5A8001BF5A1D +:10BBC0008001C1288001BF5A8001BF5A8001BF5A3D +:10BBD0008001BF5A8001BF5A8001BF5A8001BF5AFD +:10BBE0008001BF5A8001BF5A8001BF5A8001BF5AED +:10BBF0008001BF5A8001BF5A8001BF5A8001BF5ADD +:10BC00008001BF5A8001BF5A8001BF5A8001BF5ACC +:10BC10008001BF5A8001BF5A8001BF5A8001BF5ABC +:10BC20008001BF5A8001BF5A8001BF5A8001BF5AAC +:10BC30008001BF5A8001BF5A8001BF5A8001BF5A9C +:10BC40008001BF5A8001BF5A8001BF5A8001BF5A8C +:10BC50008001BF5A8001BF5A8001BF5A8001BF5A7C +:10BC60008001BF5A8001BF5A8001BF5A8001BF5A6C +:10BC70008001BF5A8001BF5A8001BF5A8001BF5A5C +:10BC80008001BF5A8001BF5A8001BF5A8001BF5A4C +:10BC90008001BF5A8001BF5A8001BF5A8001BF5A3C +:10BCA0008001BF5A8001BF5A8001BF5A8001BF5A2C +:10BCB0008001BF5A8001BF5A8001BF5A8001BF5A1C +:10BCC0008001BF5A8001BF5A8001BF5A8001BF5A0C +:10BCD0008001BF5A8001BF5A8001BF5A8001BF5AFC +:10BCE0008001BF5A8001BF5A8001BF5A8001BF5AEC +:10BCF0008001BF5A8001BF5A8001BF5A8001BF5ADC +:10BD00008001BF5A8001BF5A8001BF5A8001BF5ACB +:10BD10008001BF5A8001BF5A8001BF5A8001BF5ABB +:10BD20008001BF5A8001BF5A8001BF5A8001BF5AAB +:10BD30008001BF5A8001BF5A8001BF5A8001BF5A9B +:10BD40008001BF5A8001BF5A8001BF5A8001BF5A8B +:10BD50008001BF5A8001BF5A8001BF5A8001BF5A7B +:10BD60008001BF5A8001BF5A8001BF5A8001C11CA7 +:10BD70008001C1108001BF5A8001C1048001BF5AF7 +:10BD80008001BF5A8001BF5A8001C0F88001C0EC19 +:10BD90008001BF5A8001BF5A8001C0E08001BF5AB4 +:10BDA0008001BF5A8001C0D48001C0C88001C0BCDE +:10BDB0008001C0B08001C0A48001C0988001C08C07 +:10BDC0008001BF5A8001C0808001C0748001BF5AC9 +:10BDD0008001C0688001C05C8001C48E8001C47C89 +:10BDE0008001C46A8001C4588001C4468001C43403 +:10BDF0008001C3928001C3928001C4228001C410DB +:10BE00008001C3FE8001C3EC8001C3DA8001C3C896 +:10BE10008001C3B68001C3A48001C3A48001C4A073 +:10BE20008001C2D48001C2D48001C2D48001C5C0C7 +:10BE30008001C5AE8001C59C8001C2D48001C2D4FE +:10BE40008001C58A8001C2D48001C2D48001C57836 +:10BE50008001C5668001C5548001C5428001C5309E +:10BE60008001C51E8001C50C8001C4FA8001C4E8B0 +:10BE70008001C2D48001C4D68001C4C48001C2D470 +:10BE80008001C2D48001C2D48001C2D48001C2D456 +:10BE90008001C2D48001C2D48001C2D48001C2D446 +:10BEA0008001C2D48001C2D48001C2D48001C2D436 +:10BEB0008001C2D48001C2D48001C2D48001C2D426 +:10BEC0008001C2D48001C2D48001C2D48001C2D416 +:10BED0008001C2D48001C2D48001C2D48001C2D406 +:10BEE0008001C2D48001C2D48001C2D48001C2D4F6 +:10BEF0008001C2D48001C2D48001C2D48001C2D4E6 +:10BF00008001C2D48001C2D48001C2D48001C2D4D5 +:10BF10008001C2D48001C2D48001C2D48001C2D4C5 +:10BF20008001C2D48001C2D48001C2D48001C2D4B5 +:10BF30008001C2D48001C2D48001C2D48001C2D4A5 +:10BF40008001C2D48001C2D48001C2D48001C2D495 +:10BF50008001C2D48001C2D48001C2D48001C2D485 +:10BF60008001C2D48001C2D48001C2D48001C2D475 +:10BF70008001C2D48001C2D48001C2D48001C2D465 +:10BF80008001C2D48001C2D48001C2D48001C2D455 +:10BF90008001C2D48001C2D48001C2D48001C2D445 +:10BFA0008001C2D48001C2D48001C2D48001C2D435 +:10BFB0008001C2D48001C2D48001C2D48001C2D425 +:10BFC0008001C2D48001C2D48001C2D48001C2D415 +:10BFD0008001C2D48001C2D48001C2D48001C2D405 +:10BFE0008001C2D48001C2D48001C2D48001C2D4F5 +:10BFF0008001C2D48001C2D48001C2D48001C2D4E5 +:10C000008001C2D48001C2D48001C2D48001C2D4D4 +:10C010008001C4B28001EFCA8001EFCE8001EF7AC7 +:10C020008001EF7A8001EF828001EF8A8001EF9238 +:10C030008001EF9A8001EFA28001EFAA8001EFB2A8 +:10C040008001EFBA8001EFC28001EFD68001F96074 +:10C050008001F93E8001F9CC8001F8A68001F9BE8B +:10C060008001F91C8001F8A68001F8E28001F8A6A1 +:10C070008001F8A68001F8A68001F8A68001F8A644 +:10C080008001F8A68001F8A68001F8A68001F8A634 +:10C090008001F8A68001F8A68001F8A68001F8A624 +:10C0A0008001F8A68001F8A68001F8A68001F8A614 +:10C0B0008001F8A68001F8A68001F8A68001F8A604 +:10C0C0008001F8A68001F8A68001F8A68001F8A6F4 +:10C0D0008001F8A68001F8A68001F8A68001F8A6E4 +:10C0E0008001F8A68001F8A68001F8A68001F8A6D4 +:10C0F0008001F8A68001F8A68001F8A68001F8A6C4 +:10C100008001F8A68001F8A68001F8A68001F8A6B3 +:10C110008001F8A68001F8A68001F8A68001F8A6A3 +:10C120008001F8A68001F8A68001F8A68001F8A693 +:10C130008001F8A68001F8A68001F8A68001F8A683 +:10C140008001F8A68001F8A68001F8C08001FA58A5 +:10C150008001F8F08001F8F08001F90E8001F8F01C +:10C160008001F8F08001F8F08001F8F08001F8F02B +:10C170008001F8F08001F8F08001F8F08001F8F01B +:10C180008001F8F08001F90E8001F8F08001F8F0EC +:10C190008001F8F08001F8F08001F8F08001F8F0FB +:10C1A0008001F8F08001FA488001F8F08001F8F091 +:10C1B0008001F8F08001F8F08001F8F08001F8F0DB +:10C1C0008001F8F08001F8F08001F8F08001F8F0CB +:10C1D0008001F8F08001F8F08001F8F08001F8F0BB +:10C1E0008001F8F08001F8F08001F8F08001F8F0AB +:10C1F0008001F8F08001F8F08001F8F08001F8F09B +:10C200008001F8F08001F8F08001F8F08001F8F08A +:10C210008001F8F08001F8F08001F8F08001F8F07A +:10C220008001F8F08001F8F08001F8F08001F8F06A +:10C230008001F8F08001F8F08001F8F08001F8F05A +:10C240008001F8F08001F8F08001F8F08001F8F04A +:10C250008001F8F08001F8F08001F8F08001F8F03A +:10C260008001F8F08001F8F08001F8F08001F8F02A +:10C270008001F8F08001F8F08001F8F08001F8F01A +:10C280008001F8F08001F8F08001F8F08001F8F00A +:10C290008001F8F08001F8F08001F8F08001F8F0FA +:10C2A0008001F8F08001F8F08001F8F08001F8F0EA +:10C2B0008001F8F08001F8F08001F8F08001F8F0DA +:10C2C0008001F8F08001F8F08001F8F08001F8F0CA +:10C2D0008001F8F08001F8F08001F8F08001F8F0BA +:10C2E0008001F8F08001F8F08001F8F08001F8F0AA +:10C2F0008001F8F08001F8F08001F8F08001F8F09A +:10C300008001F8F08001F8F08001F8F08001F8F089 +:10C310008001F8F08001F8F08001F8F08001F8F079 +:10C320008001F8F08001F8F08001F8F08001F8F069 +:10C330008001F8F08001F8F08001F8F08001F8F059 +:10C340008001F8F08001F8F08001F8F08001F8F049 +:10C350008001F90E8001FA348001F8F08001F90EB5 +:10C360008001F8F08001F8F08001F8F08001F8F029 +:10C370008001F8F08001F8F08001F8F08001F90EFA +:10C380008001F8F08001F8F08001FA2C8001FA2495 +:10C390008001FA1C8001FA148001FA0C8001FA0471 +:10C3A0008001FA408001F8F08001FA5057455F495A +:10C3B0004E445F38303231315F434F4E4E45435427 +:10C3C0004544000057455F494E445F3830323131B3 +:10C3D0005F444953434F4E4E454354494E47000036 +:10C3E00057455F494E445F38303231315F494253DF +:10C3F000535F444953434F4E4E4543544544000018 +:10C40000332E312E322E312E34000000352E3233B1 +:10C4100000000000352E32322E320000352E32322E +:10C420002E310000352E322E39000000352E3138E5 +:10C430002E310000352E31382E320000352E3232AA +:10C440002E340000352E32342E320000352E323498 +:10C450002E310000352E31312E310000352E322E96 +:10C4600032000000352E31362E320000352E3136A6 +:10C470002E310000312E312E312E323200000000DC +:10C48000352E322E31392E3500000000352E322E59 +:10C4900031392E3400000000352E322E31392E3342 +:10C4A00000000000352E322E31392E3200000000FF +:10C4B000352E322E31392E3100000000352E322E2D +:10C4C00031000000352E31312E320000352E313151 +:10C4D0002E330000352E31312E340000352E31310F +:10C4E0002E350000352E31312E360000352E3131FB +:10C4F0002E380000352E31312E37000073736964F9 +:10C500000000000070736B004A756E6B41500000B4 +:10C5100057534300656170005746412D53696D7054 +:10C520006C65436F6E6669672D456E726F6C6C65E6 +:10C53000652D312D300000006964656E7469747971 +:10C54000000000006E7277696669000064656661CC +:10C55000756C740057455F494E445F383032313155 +:10C560005F444953434F4E4E4543544544000000F9 +:10C5700057455F494E445F50414952574953455FC3 +:10C580004D49435F4552524F5200000057455F49A5 +:10C590004E445F47524F55505F4D49435F4552529D +:10C5A0004F52000057455F494E445F43414E444956 +:10C5B000444154455F4C495354000000494E4143A7 +:10C5C0005449564500000000444953434F4E4E45E0 +:10C5D00043544544000000005343414E4E494E47EA +:10C5E000000000004153534F43494154494E470016 +:10C5F0004153534F43494154454400003457415936 +:10C600005F48414E445348414B45000047524F5507 +:10C61000505F48414E445348414B4500434F4D50B5 +:10C620004C45544544000000554E4B4E4F574E006C +:10C630004354524C2D4556454E542D5445524D4968 +:10C640004E4154494E47202D207369676E616C201E +:10C650002564207265636569766564007769726533 +:10C660006400000043616E63656C6C696E672061F5 +:10C67000757468656E7469636174696F6E2074693E +:10C680006D656F75740000005750413A2045415068 +:10C690004F4C2070726F63657373696E6720636FB0 +:10C6A0006D706C657465000043616E63656C6C69E8 +:10C6B0006E67207363616E207265717565737400B7 +:10C6C00052534E3A207573696E672049454545209F +:10C6D0003830322E3131692F44392E3000000000BD +:10C6E0005750413A207573696E672049454545208A +:10C6F0003830322E3131692F44332E3000000000A3 +:10C700005750413A204661696C656420746F20700F +:10C7100061727365205750412049452066726F6DE4 +:10C72000206173736F63696174696F6E20696E66EF +:10C730006F0000005750413A2044726976657220BC +:10C74000757365642064697361626C6564206772E7 +:10C750006F75702063697068657220307825782065 +:10C76000286D61736B203078257829202D20726523 +:10C770006A656374000000005750413A20447269B2 +:10C7800076657220757365642064697361626C6597 +:10C790006420706169727769736520636970686588 +:10C7A00072203078257820286D61736B20307825D1 +:10C7B0007829202D2072656A656374005750413ACC +:10C7C00020447269766572207573656420646973AC +:10C7D00061626C6564206B6579206D616E6167656F +:10C7E0006D656E74203078257820286D61736B201C +:10C7F0003078257829202D2072656A6563740000E1 +:10C800005750413A207573696E672047544B204357 +:10C81000434D50005750413A207573696E67204769 +:10C82000544B20544B4950005750413A207573697E +:10C830006E672047544B205745503130340000007C +:10C840005750413A207573696E672047544B205703 +:10C8500045503430000000005750413A207573694C +:10C860006E672050544B2043434D50005750413A7F +:10C87000207573696E672050544B20544B4950000B +:10C880005750413A207573696E672050544B204EC3 +:10C890004F4E45005750413A207573696E67204BE3 +:10C8A00045595F4D474D54203830322E31580000E5 +:10C8B0005750413A207573696E67204B45595F4D5B +:10C8C000474D54205750412D50534B005750413A3B +:10C8D000207573696E67204B45595F4D474D542055 +:10C8E0005750412D4E4F4E45000000005750413AE1 +:10C8F000204661696C656420746F2073656C6563A4 +:10C9000074205750412F52534E0000004661696C0D +:10C91000656420746F20706172736520746865208F +:10C92000636F6E66696775726174696F6E206669A0 +:10C930006C652027257327202D2065786974696E22 +:10C94000670000005265636F6E6669677572617497 +:10C95000696F6E20636F6D706C65746564000000B4 +:10C9600053657474696E672061757468656E746967 +:10C97000636174696F6E2074696D656F75743A20B8 +:10C98000256420736563202564207573656300004A +:10C9900053657474696E67207363616E207265718C +:10C9A000756573743A2025642073656320256420BF +:10C9B000757365630000000041757468656E746985 +:10C9C000636174696F6E20776974682025303278EE +:10C9D0003A253032783A253032783A253032783A72 +:10C9E000253032783A253032782074696D656420BC +:10C9F0006F75742E00000000547279696E672074A0 +:10CA00006F206173736F63696174652077697468FF +:10CA100020253032783A253032783A253032783A4B +:10CA2000253032783A253032783A2530327820284D +:10CA3000535349443D2725732720667265713D2570 +:10CA400064204D487A290000547279696E67207419 +:10CA50006F206173736F63696174652077697468AF +:10CA60002053534944202725732700004173736FD7 +:10CA700063696174696F6E20726571756573742086 +:10CA8000746F2074686520647269766572206661CF +:10CA9000696C6564000000007770615F7375707089 +:10CAA0006C6963616E742076302E352E31300A4306 +:10CAB0006F7079726967687420286329203230307A +:10CAC000332D323030382C204A6F756E69204D611D +:10CAD0006C696E656E203C6A4077312E66693E2037 +:10CAE000616E6420636F6E7472696275746F7273C5 +:10CAF00000000000546869732070726F6772616D86 +:10CB0000206973206672656520736F667477617241 +:10CB1000652E20596F752063616E2064697374728D +:10CB2000696275746520697420616E642F6F72206C +:10CB30006D6F646966792069740A756E6465722028 +:10CB4000746865207465726D73206F662074686503 +:10CB500020474E552047656E6572616C20507562A6 +:10CB60006C6963204C6963656E73652076657273CA +:10CB7000696F6E20322E0A0A416C7465726E6174A0 +:10CB80006976656C792C207468697320736F66749C +:10CB900077617265206D61792062652064697374C4 +:10CBA0007269627574656420756E6465722074685C +:10CBB00065207465726D73206F66207468650A4223 +:10CBC0005344206C6963656E73652E205365652040 +:10CBD000524541444D4520616E6420434F505949B0 +:10CBE0004E4720666F72206D6F72652064657461B8 +:10CBF000696C732E0A0000002530325800000000D6 +:10CC00008003C4FC80024A908002490000000010AA +:10CC100000000014000000000000002000000000E0 +:10CC20008003D3EC80024DF0800248880000006051 +:10CC300000000000000000000000000100000000F3 +:10CC40008003D3F880024DCC800248280000000009 +:10CC500000000000000000000000000000000000D4 +:10CC60008003C50480024D00800248C4000000001B +:10CC700000000000000000000000000000000001B3 +:10CC80008003D4008002408C800247A8000000008E +:10CC90000000000000000000000000000000000094 +:10CCA0008003D40880023F448002467C00000000DC +:10CCB0000000000000000000000000000000000074 +:10CCC0008003D41480023F188002466C00000000EC +:10CCD0000000000000000000000000000000000054 +:10CCE0008003D42080023EEC8002465C00000000FD +:10CCF0000000000000000000000000000000000034 +:10CD00008003D42880023CA4800244740000000008 +:10CD10000000000000000000000000000000000013 +:10CD20008003C51480024B9080024B00000000007D +:10CD300000000000000000000000000000000000F3 +:10CD40008003C53880024A908002490000000068D4 +:10CD50000000006C00000000000000000000000067 +:10CD60008003D43480024A908002490000000070A1 +:10CD7000000000740000000000000000000000003F +:10CD80008003D44880024A90800249000000007865 +:10CD90000000007C000000100000002000000001E6 +:10CDA0008003D45080024A90800249000000008035 +:10CDB00000000084000000000000000000000000EF +:10CDC0008003D45480024A90800249000000008809 +:10CDD0000000008C000000000000000000000001C6 +:10CDE0008003D46080024A908002490000000090D5 +:10CDF0000000000000000000000000000000000033 +:10CE00008003D46880024A908002490000000094A8 +:10CE10000000000000000000000000000000000012 +:10CE20008003D47080024A9080024900000000987C +:10CE300000000000000000000000000000000000F2 +:10CE40008003D47C80024A90800249000000009C4C +:10CE500000000000000000000000000000000000D2 +:10CE60008003D48880024A9080024900000000A01C +:10CE700000000000000000000000000000000001B1 +:10CE80008003D49C80024A9080024900000000A4E4 +:10CE90000000000000000000000000000000000092 +:10CEA0008003D4A480024A9080024900000000A8B8 +:10CEB0000000000000000000000000000000000072 +:10CEC0008003D4B480024A9080024900000000AC84 +:10CED0000000000000000000000000000000000052 +:10CEE0008003D4C880024A9080024900000000B04C +:10CEF0000000000000000000000000000000000032 +:10CF00008003D4D480024A9080024900000000B41B +:10CF10000000000000000000000000000000000011 +:10CF20008003D4E080024A9080024900000000B8EB +:10CF300000000000000000000000000000000000F1 +:10CF40008003D4F080024A9080024900000000BCB7 +:10CF500000000000000000000000000000000000D1 +:10CF60008003D50080024A9080024900000000C082 +:10CF700000000000000000000000000000000001B0 +:10CF80008003D51480024A9080024900000000C44A +:10CF90000000000000000000000000000000000091 +:10CFA0008003D52080024A9080024900000000C81A +:10CFB0000000000000000000000000000000000071 +:10CFC0008003D53080024A9080024900000000CCE6 +:10CFD0000000000000000000000000000000000051 +:10CFE0008003D54480024A9080024900000000D4AA +:10CFF0000000000000000000000000000000000031 +:10D000008003D54C80024A9080024900000000D87D +:10D010000000000000000000000000000000000010 +:10D020008003D55480024A9080024900000000DC51 +:10D0300000000000000000000000000000000000F0 +:10D040008003D55C80024A9080024900000000E025 +:10D0500000000000000000000000000000000001CF +:10D060008003D56080024A9080024900000000E8F9 +:10D0700000000000000000000000000000000000B0 +:10D080008003D56C80024A9080024900000000ECC9 +:10D090000000000000000000000000000000000090 +:10D0A0008003D65C80024DF080024888000000E4D6 +:10D0B0000000000000000000000000000000000070 +:10D0C0008003D57480024DF080024888000000F093 +:10D0D0000000000000000000000000000000000050 +:10D0E0008003D58080024A78800244580000000006 +:10D0F000000000000000000000000000000000012F +:10D100008003D58C80024A608002443C000000000D +:10D11000000000000000000000000000000000010E +:10D120008003D59880024A48800244200000000015 +:10D1300000000000000000000000000000000001EE +:10D140008003D5A480024A3080024404000000001D +:10D1500000000000000000000000000000000001CE +:10D160008003D5B080024DF0800248880000014461 +:10D1700000000000000000000000000000000000AF +:10D180008003D5C080024DF0800248880000000C6A +:10D19000000000000000000000000000000000008F +:10D1A0008003D5CC80024DF0800248880000017CCD +:10D1B000000000000000000000000000000000006F +:10D1C0008003D5DC80024A90800249000000018083 +:10D1D000000000000000000000000000000000004F +:10D1E0008003D5E880024DF0800248880000019C51 +:10D1F000000000000000000000000000000000002F +:10D200008003D5F880024DF0800248880000018438 +:10D21000000000000000000000000001000000000D +:10D220008003D60080024DF0800248880000006430 +:10D2300000000000000000000000000200000000EC +:10D240008003D60880024DF0800248880000014823 +:10D2500000000000000000000000000100000000CD +:10D260008003D62080024DF080024888000001949F +:10D2700000000000000000000000000100000000AD +:10D280008003D62C80024A9080024900000001A051 +:10D29000000000000000000000000000000000008E +:10D2A0008003D63480024DF0800248880000019847 +:10D2B000000000000000000000000001000000006D +:10D2C0008003D63C80024DF0800248880000014C6B +:10D2D000000000000000000000000001000000004D +:10D2E0008003D64880024DF080024888000001A4E7 +:10D2F00000000000000000000000271000000000F7 +:10D300002A0000004F50454E000000005348415293 +:10D31000454400004C454150000000005745503145 +:10D320003034000057455034300000005750412D34 +:10D3300045415000494545453830323158000000DC +:10D340005750410052534E005750413200000000E8 +:10D3500025734F50454E00002573534841524544B4 +:10D360000000000025734C454150000025734343E5 +:10D370004D5000002573544B49500000257357450C +:10D3800050313034000000002573574550343000D0 +:10D3900025734E4F4E45000025735750412D505375 +:10D3A0004B00000025735750412D454150000000AF +:10D3B000257349454545383032315800257357505B +:10D3C000412D4E4F4E45000025735750410000003F +:10D3D000257352534E0000007765705F6B657925A9 +:10D3E0006400000025732573000000007363616E04 +:10D3F0005F73736964000000627373696400000006 +:10D4000070726F746F0000006B65795F6D676D748B +:10D4100000000000706169727769736500000000A8 +:10D4200067726F7570000000617574685F616C678A +:10D4300000000000616E6F6E796D6F75735F6964D7 +:10D44000656E74697479000065617070736B0000BB +:10D450006E61690070617373776F72640000000021 +:10D4600063615F636572740063615F70617468001B +:10D47000636C69656E745F6365727400707269765F +:10D480006174655F6B657900707269766174655F60 +:10D490006B65795F706173737764000064685F66C1 +:10D4A000696C65007375626A6563745F6D6174634E +:10D4B00068000000616C747375626A6563745F6D07 +:10D4C000617463680000000063615F6365727432B9 +:10D4D0000000000063615F7061746832000000004A +:10D4E000636C69656E745F6365727432000000007E +:10D4F000707269766174655F6B6579320000000057 +:10D50000707269766174655F6B6579325F706173A3 +:10D510007377640064685F66696C653200000000C0 +:10D520007375626A6563745F6D617463683200006D +:10D53000616C747375626A6563745F6D617463684E +:10D5400032000000706861736531000070686173BB +:10D5500065320000706373630000000070696E0044 +:10D56000656E67696E655F69640000006B65795F71 +:10D57000696400006561706F6C5F666C6167730061 +:10D580007765705F6B657930000000007765705FCC +:10D590006B657931000000007765705F6B657932EB +:10D5A000000000007765705F6B6579330000000054 +:10D5B0007765705F74785F6B6579696478000000E7 +:10D5C0007072696F72697479000000006561705F44 +:10D5D000776F726B61726F756E6400007061635F6C +:10D5E00066696C6500000000667261676D656E7447 +:10D5F0005F73697A650000006D6F6465000000006C +:10D600007573655F7770730070726F6163746976AC +:10D61000655F6B65795F63616368696E67000000D1 +:10D6200064697361626C65640000000069645F7323 +:10D6300074720000706565726B6579006D6978655C +:10D64000645F63656C6C00006672657175656E631E +:10D6500079000000888E000077696669656E6769E9 +:10D660006E65000057694669456E67696E65000022 +:10D670008003D6588003D664800254C880025420A8 +:10D6800080024F98800252E0800253E8800254A446 +:10D690000000000080024F9A800252C880024F941E +:10D6A00080024F96800252B08002529880024F9CB6 +:10D6B00080024F9E8002523C800251E0800251D491 +:10D6C000800251AC00000000000000008002518088 +:10D6D00080024FF480024FD00000000000000000E4 +:10D6E000000000000000000000000000000000003A +:10D6F000000000000000000080024FA08002564E93 +:10D700008002564A80025646800256408002563CAD +:10D7100080025636800256328002562C80025626EF +:10D72000800256928002568C800256888002568271 +:10D730008002567C80025676800256728002566CB9 +:10D740008002566680025B3480025C0880025BE0E7 +:10D7500080025BBA80025BA080025B3480025B3493 +:10D7600080025B3480025DC280025E3A80025E12FB +:10D7700080025D8E80025CC280025AF680025DF4F7 +:10D7800080025DCE800268DC80026AA280026A00AC +:10D7900080026904800268F2800269EE800268DC1F +:10D7A000800268DC800268E8800268E8800268E83D +:10D7B000696E76616C696461746500004354524C13 +:10D7C0002D4556454E542D4541502D535543434507 +:10D7D0005353204541502061757468656E746963C8 +:10D7E0006174696F6E20636F6D706C657465642021 +:10D7F0007375636365737366756C6C7920286261F9 +:10D80000736564206F6E206C6F776572206C617930 +:10D810006572207375636365737329004354524CBA +:10D820002D4556454E542D4541502D5355434345A6 +:10D830005353204541502061757468656E74696367 +:10D840006174696F6E20636F6D706C6574656420C0 +:10D850007375636365737366756C6C7900000000A3 +:10D860004354524C2D4556454E542D4541502D465E +:10D8700041494C55524520454150206175746865B9 +:10D880006E7469636174696F6E206661696C65644A +:10D8900000000000494E495449414C495A45000096 +:10D8A0004541503A206D6F7265207468616E202585 +:10D8B000642061757468656E7469636174696F6E04 +:10D8C00020726F756E6473202D2061626F72740018 +:10D8D0004354524C2D4556454E542D4541502D4EE6 +:10D8E0004F54494649434154494F4E2000000000DF +:10D8F0004354524C2D4556454E542D4541502D53C1 +:10D900005441525445442045415020617574686526 +:10D910006E7469636174696F6E207374617274658B +:10D92000640000004745545F4D4554484F44000093 +:10D930004541503A204661696C656420746F2069E6 +:10D940006E697469616C697A6520454150206D6526 +:10D9500074686F643A2076656E646F722025752056 +:10D960006D6574686F642025752028257329000073 +:10D970004354524C2D4556454E542D4541502D4D46 +:10D980004554484F44204541502076656E646F727F +:10D99000202575206D6574686F6420257520282505 +:10D9A00073292073656C656374656400454150207C +:10D9B0006465696E697400008002794480027ADAD5 +:10D9C00080027B5880027BA280027CC880027CD2CD +:10D9D00080027AC45750413A20544B495020636F1B +:10D9E000756E7465726D656173757265732073749D +:10D9F0006F707065640000004173736F63696174D8 +:10DA0000656420746F2061206E6577204253533A1D +:10DA10002042535349443D253032783A25303278FC +:10DA20003A253032783A253032783A253032783A11 +:10DA300025303278000000004173736F63696174B0 +:10DA40006564207769746820253032783A25303251 +:10DA5000783A253032783A253032783A25303278A3 +:10DA60003A253032780000005750413A20342D5783 +:10DA700061792048616E647368616B6520666169D5 +:10DA80006C6564202D207072652D73686172656409 +:10DA9000206B6579206D617920626520696E636F06 +:10DAA00072726563740000004354524C2D45564514 +:10DAB0004E542D444953434F4E4E45435445442004 +:10DAC0002D20446973636F6E6E656374206576659F +:10DAD0006E74202D2072656D6F7665206B6579738D +:10DAE000000000004D69636861656C204D4943206A +:10DAF0006661696C757265206465746563746564DC +:10DB000000000000544B495020636F756E746572BD +:10DB10006D65617375726573207374617274656489 +:10DB200000000000000000080000000600000006E1 +:10DB3000496E646578202F204141202F20504D4BA5 +:10DB40004944202F2065787069726174696F6E2076 +:10DB500028696E207365636F6E647329202F206FB0 +:10DB600070706F7274756E69737469630A00000077 +:10DB7000256420253032783A253032783A25303203 +:10DB8000783A253032783A253032783A2530327872 +:10DB9000200000002025642025640A00504D4B2001 +:10DBA0004E616D650000000052534E3A207374615F +:10DBB0007274696E67207072652D61757468656E28 +:10DBC0007469636174696F6E2077697468202530A9 +:10DBD00032783A253032783A253032783A25303268 +:10DBE000783A253032783A253032780052534E3A1E +:10DBF0002070726F63657373696E6720504D4B536D +:10DC0000412063616E646964617465206C6973743A +:10DC10000000000052534E3A206E6F7420696E204F +:10DC20007375697461626C652073746174652066D4 +:10DC30006F72206E6577207072652D6175746865EE +:10DC40006E7469636174696F6E00000052534E3ADE +:10DC500020504D4B53412063616E6469646174656B +:10DC600020253032783A253032783A253032783AE9 +:10DC7000253032783A253032783A253032782073A0 +:10DC8000656C656374656420666F72207072652DC3 +:10DC900061757468656E7469636174696F6E0000A4 +:10DCA00052534E3A20504D4B53412063616E64698C +:10DCB0006461746520253032783A253032783A250F +:10DCC0003032783A253032783A253032783A253079 +:10DCD000327820646F6573206E6F74206E656564A2 +:10DCE000207072652D61757468656E746963617406 +:10DCF000696F6E20616E796D6F72650052534E3A96 +:10DD0000206E6F206D6F72652070656E64696E673E +:10DD100020504D4B53412063616E646964617465AA +:10DD20007300000052534E3A2061646465642050D1 +:10DD30004D4B53412063616368652063616E646984 +:10DD40006461746520253032783A253032783A257E +:10DD50003032783A253032783A253032783A2530E8 +:10DD60003278207072696F202564000052534E3A59 +:10DD7000207072652D61757468656E746963617475 +:10DD8000696F6E207769746820253032783A2530C3 +:10DD900032783A253032783A253032783A253032A6 +:10DDA000783A253032782074696D6564206F757417 +:10DDB00000000000636F6D706C657465642073759E +:10DDC000636365737366756C6C79000052534E3AE9 +:10DDD000206661696C656420746F20676574206DCE +:10DDE00061737465722073657373696F6E206B6500 +:10DDF000792066726F6D207072652D617574682070 +:10DE00004541504F4C207374617465206D616368A7 +:10DE1000696E65730000000052534E3A20707265BF +:10DE20002D61757468656E7469636174696F6E20C5 +:10DE30007769746820253032783A253032783A256F +:10DE40003032783A253032783A253032783A2530F7 +:10DE50003278202573000000800000008002B51C8D +:10DE60008002B50A8002B5008002B4FA8002B4F4E0 +:10DE70008002B4EE8002B4E8000FAC010050F20260 +:10DE8000000FAC02000FAC01000FAC050050F20215 +:10DE9000000FAC040050F2010050F2010050F201FA +:10DEA0000050F2050050F200000FAC00000FAC0370 +:10DEB0000050F200000FAC0449454545203830328F +:10DEC0002E315820286E6F20575041290000000045 +:10DED0005750412F49454545203830322E31582F73 +:10DEE00045415000575041322F4945454520383073 +:10DEF000322E31582F45415000000000575041321A +:10DF00002D50534B000000005745502D3430000079 +:10DF10005745502D313034007061697277697365EF +:10DF20005F6369706865723D25730A67726F75700B +:10DF30005F6369706865723D25730A6B65795F6D13 +:10DF4000676D743D25730A005750413A20257320B0 +:10DF5000287372633D253032783A253032783A257D +:10DF60003032783A253032783A253032783A2530D6 +:10DF7000327829005750413A204B6579206E656709 +:10DF80006F74696174696F6E20636F6D706C657416 +:10DF90006564207769746820253032783A253032FC +:10DFA000783A253032783A253032783A253032784E +:10DFB0003A25303278205B50544B3D25732047542E +:10DFC0004B3D25735D0000005750413A20496E7665 +:10DFD000616C6964204541504F4C2D4B657920663A +:10DFE00072616D65202D206B65795F6461746120BD +:10DFF0006F766572666C6F7720282564203E202539 +:10E000006C752900494520696E20332F34206D73CB +:10E010006720646F6573206E6F74206D6174636830 +:10E02000207769746820494520696E2042656163E4 +:10E030006F6E2F50726F62655265737020286E6F1D +:10E040002049453F29000000494520696E20332FB3 +:10E0500034206D736720646F6573206E6F74206D5C +:10E0600061746368207769746820494520696E206F +:10E07000426561636F6E2F50726F62655265737097 +:10E0800000000000506F737369626C6520646F77E5 +:10E090006E67726164652061747461636B2064658E +:10E0A000746563746564202D2052534E207761732C +:10E0B00020656E61626C656420616E642052534E0F +:10E0C0002049452077617320696E206D7367203386 +:10E0D0002F342C20627574206E6F7420696E20427C +:10E0E0006561636F6E2F50726F6265526573700069 +:10E0F0005750413A204661696C656420746F20670F +:10E100006574206D61737465722073657373696FD4 +:10E110006E206B65792066726F6D204541504F4CC3 +:10E12000207374617465206D616368696E65730046 +:10E130005750413A204B65792068616E647368617D +:10E140006B652061626F7274656400005750413ADC +:10E15000204661696C656420746F20676574207265 +:10E16000616E646F6D206461746120666F7220530C +:10E170004E6F6E6365000000506169727769736568 +:10E18000206B657920657870616E73696F6E000031 +:10E190005750413A2047726F75702072656B6579F0 +:10E1A000696E6720636F6D706C6574656420776954 +:10E1B000746820253032783A253032783A2530326A +:10E1C000783A253032783A253032783A253032782C +:10E1D000205B47544B3D25735D00000000000000AC +:10E1E000000000000050F204000FAC02000FAC0170 +:10E1F00052096AD53036A538BF40A39E81F3D7FBBC +:10E200007CE339829B2FFF87348E4344C4DEE9CB05 +:10E21000547B9432A6C2233DEE4C950B42FAC34E7A +:10E22000082EA16628D924B2765BA2496D8BD12530 +:10E2300072F8F66486689816D4A45CCC5D65B692D4 +:10E240006C704850FDEDB9DA5E154657A78D9D8478 +:10E2500090D8AB008CBCD30AF7E45805B8B3450698 +:10E26000D02C1E8FCA3F0F02C1AFBD0301138A6BB2 +:10E270003A9111414F67DCEA97F2CFCEF0B4E673E2 +:10E2800096AC7422E7AD3585E2F937E81C75DF6E90 +:10E2900047F11A711D29C5896FB7620EAA18BE1BF6 +:10E2A000FC563E4BC6D279209ADBC0FE78CD5AF49C +:10E2B0001FDDA8338807C731B11210592780EC5FE2 +:10E2C00060517FA919B54A0D2DE57A9F93C99CEF3E +:10E2D000A0E03B4DAE2AF5B0C8EBBB3C835399613F +:10E2E000172B047EBA77D626E169146355210C7D7D +:10E2F00001020408102040801B36000051F4A75092 +:10E300007E4165531A17A4C33A275E963BAB6BCB8D +:10E310001F9D45F1ACFA58AB4BE303932030FA55FF +:10E32000AD766DF688CC7691F5024C254FE5D7FC9D +:10E33000C52ACBD726354480B562A38FDEB15A49B2 +:10E3400025BA1B6745EA0E985DFEC0E1C32F750232 +:10E35000814CF0128D4697A36BD3F9C6038F5FE70C +:10E3600015929C95BF6D7AEB955259DAD4BE832DE8 +:10E37000587421D349E069298EC9C84475C2896A95 +:10E38000F48E797899583E6B27B971DDBEE14FB6AE +:10E39000F088AD17C920AC667DCE3AB463DF4A1869 +:10E3A000E51A31829751336062537F45B16477E05B +:10E3B000BB6BAE84FE81A01CF9082B947048685892 +:10E3C0008F45FD1994DE6C87527BF8B7AB73D3236E +:10E3D000724B02E2E31F8F576655AB2AB2EB280758 +:10E3E0002FB5C20386C57B9AD33708A5302887F29C +:10E3F00023BFA5B202036ABAED16825C8ACF1C2B3A +:10E40000A779B492F307F2F04E69E2A165DAF4CD90 +:10E410000605BED5D134621FC4A6FE8A342E539D94 +:10E42000A2F355A0058AE132A4F6EB750B83EC3913 +:10E430004060EFAA5E719F06BD6E10513E218AF9C1 +:10E4400096DD063DDD3E05AE4DE6BD4691548DB5EB +:10E4500071C45D050406D46F605015FF1998FB2444 +:10E46000D6BDE997894043CC67D99E77B0E842BDD5 +:10E4700007898B88E7195B3879C8EEDBA17C0A47EE +:10E480007C420FE9F8841EC90000000009808683E1 +:10E49000322BED481E1170AC6C5A724EFD0EFFFB14 +:10E4A0000F8538563DAED51E362D39270A0FD96453 +:10E4B000685CA6219B5B54D124362E3A0C0A67B1C6 +:10E4C0009357E70FB4EE96D21B9B919E80C0C54F29 +:10E4D00061DC20A25A774B691C121A16E293BA0A21 +:10E4E000C0A02AE53C22E043121B171D0E090D0BAC +:10E4F000F28BC7AD2DB6A8B9141EA9C857F119855E +:10E50000AF75074CEE99DDBBA37F60FDF701269F39 +:10E510005C72F5BC44663BC55BFB7E348B4329765D +:10E52000CB23C6DCB6EDFC68B8E4F163D731DCCAB6 +:10E53000426385101397224084C61120854A247DAA +:10E54000D2BB3DF8AEF93211C729A16D1D9E2F4BEC +:10E55000DCB230F30D8652EC77C1E3D02BB3166CEE +:10E56000A970B999119448FA47E96422A8FC8CC4AF +:10E57000A0F03F1A567D2CD8223390EF87494EC722 +:10E58000D938D1C18CCAA2FE98D40B36A6F581CF5A +:10E59000A57ADE28DAB78E263FADBFA42C3A9DE4DB +:10E5A0005078920D6A5FCC9B547E4662F68D13C202 +:10E5B00090D8B8E82E39F75E82C3AFF59F5D80BE74 +:10E5C00069D0937C6FD52DA9CF2512B3C8AC993BE8 +:10E5D00010187DA7E89C636EDB3BBB7BCD267809DA +:10E5E0006E5918F4EC9AB701834F9AA8E6956E65B8 +:10E5F000AAFFE67E21BCCF08EF15E8E6BAE79BD973 +:10E600004A6F36CEEA9F09D429B07CD631A4B2AF86 +:10E610002A3F2331C6A5943035A266C0744EBC375C +:10E62000FC82CAA6E090D0B033A7D815F104984A6E +:10E6300041ECDAF77FCD500E1791F62F764DD68D3F +:10E6400043EFB04DCCAA4D54E49604DF9ED1B5E320 +:10E650004C6A881BC12C1FB84665517F9D5EEA0439 +:10E66000018C355DFA877473FB0B412EB3671D5A1D +:10E6700092DBD252E91056336DD647139AD7618C8C +:10E6800037A10C7A59F8148EEB133C89CEA927EEEA +:10E69000B761C935E11CE5ED7A47B13C9CD2DF5941 +:10E6A00055F2733F1814CE7973C737BF53F7CDEACD +:10E6B0005FFDAA5BDF3D6F147844DB86CAAFF38150 +:10E6C000B968C43E3824342CC2A3405F161DC372FF +:10E6D000BCE2250C283C498BFF0D954139A80171FE +:10E6E000080CB3DED8B4E49C6456C1907BCB846143 +:10E6F000D532B670486C5C74D0B85742C66363A517 +:10E70000F87C7C84EE777799F67B7B8DFFF2F20DB7 +:10E71000D66B6BBDDE6F6FB191C5C55460303050A4 +:10E7200002010103CE6767A9562B2B7DE7FEFE1978 +:10E73000B5D7D7624DABABE6EC76769A8FCACA45B1 +:10E740001F82829D89C9C940FA7D7D87EFFAFA153B +:10E75000B25959EB8E4747C9FBF0F00B41ADADEC18 +:10E76000B3D4D4675FA2A2FD45AFAFEA239C9CBFA0 +:10E7700053A4A4F7E47272969BC0C05B75B7B7C28E +:10E78000E1FDFD1C3D9393AE4C26266A6C36365A4D +:10E790007E3F3F41F5F7F70283CCCC4F6834345CC1 +:10E7A00051A5A5F4D1E5E534F9F1F108E2717193D1 +:10E7B000ABD8D873623131532A15153F0804040CC5 +:10E7C00095C7C752462323659DC3C35E30181828DA +:10E7D000379696A10A05050F2F9A9AB50E070709D5 +:10E7E000241212361B80809BDFE2E23DCDEBEB264C +:10E7F0004E2727697FB2B2CDEA75759F1209091BB2 +:10E800001D83839E582C2C74341A1A2E361B1B2DF4 +:10E81000DC6E6EB2B45A5AEE5BA0A0FBA45252F664 +:10E82000763B3B4DB7D6D6617DB3B3CE5229297B1B +:10E83000DDE3E33E5E2F2F7113848497A65353F5D7 +:10E84000B9D1D16800000000C1EDED2C402020605E +:10E85000E3FCFC1F79B1B1C8B65B5BEDD46A6ABE5C +:10E860008DCBCB4667BEBED97239394B944A4ADE4E +:10E87000984C4CD4B05858E885CFCF4ABBD0D06B19 +:10E88000C5EFEF2A4FAAAAE5EDFBFB16864343C569 +:10E890009A4D4DD766333355118585948A4545CFBA +:10E8A000E9F9F91004020206FE7F7F81A05050F0C2 +:10E8B000783C3C44259F9FBA4BA8A8E3A25151F352 +:10E8C0005DA3A3FE804040C0058F8F8A3F9292AD2A +:10E8D000219D9DBC70383848F1F5F50463BCBCDF60 +:10E8E00077B6B6C1AFDADA75422121632010103055 +:10E8F000E5FFFF1AFDF3F30EBFD2D26D81CDCD4CF3 +:10E90000180C0C1426131335C3ECEC2FBE5F5FE11B +:10E91000359797A2884444CC2E17173993C4C4570F +:10E9200055A7A7F2FC7E7E827A3D3D47C86464AC61 +:10E93000BA5D5DE73219192BE6737395C06060A06C +:10E94000198181989E4F4FD1A3DCDC7F442222663F +:10E95000542A2A7E3B9090AB0B8888838C4646CA0B +:10E96000C7EEEE296BB8B8D32814143CA7DEDE79C5 +:10E97000BC5E5EE2160B0B1DADDBDB76DBE0E03B45 +:10E9800064323256743A3A4E140A0A1E924949DBEE +:10E990000C06060A4824246CB85C5CE49FC2C25D85 +:10E9A000BDD3D36E43ACACEFC46262A6399191A8DB +:10E9B000319595A4D3E4E437F279798BD5E7E73242 +:10E9C0008BC8C8436E373759DA6D6DB7018D8D8CA2 +:10E9D000B1D5D5649C4E4ED249A9A9E0D86C6CB48F +:10E9E000AC5656FAF3F4F407CFEAEA25CA6565AFE8 +:10E9F000F47A7A8E47AEAEE9100808186FBABAD525 +:10EA0000F07878884A25256F5C2E2E72381C1C24DD +:10EA100057A6A6F173B4B4C797C6C651CBE8E8238E +:10EA2000A1DDDD7CE874749C3E1F1F21964B4BDDFD +:10EA300061BDBDDC0D8B8B860F8A8A85E07070907E +:10EA40007C3E3E4271B5B5C4CC6666AA904848D8B3 +:10EA500006030305F7F6F6011C0E0E12C26161A350 +:10EA60006A35355FAE5757F969B9B9D017868691BF +:10EA700099C1C1583A1D1D27279E9EB9D9E1E13899 +:10EA8000EBF8F8132B9898B322111133D26969BBB4 +:10EA9000A9D9D970078E8E89339494A72D9B9BB6E4 +:10EAA0003C1E1E2215878792C9E9E92087CECE49F0 +:10EAB000AA5555FF50282878A5DFDF7A038C8C8F64 +:10EAC00059A1A1F8098989801A0D0D1765BFBFDA10 +:10EAD000D7E6E631844242C6D06868B8824141C375 +:10EAE000299999B05A2D2D771E0F0F117BB0B0CBFD +:10EAF000A85454FC6DBBBBD62C16163A002020201F +:10EB000020202020202028282828282020202020DD +:10EB100020202020202020202020202020881010AD +:10EB20001010101010101010101010101004040409 +:10EB300004040404040404101010101010104141C7 +:10EB400041414141010101010101010101010101B5 +:10EB500001010101010101011010101010104242C9 +:10EB60004242424202020202020202020202020285 +:10EB70000202020202020202101010102000000025 +:10EB80000000000000000000000000000000000085 +:10EB90000000000000000000000000000000000075 +:10EBA0000000000000000000000000000000000065 +:10EBB0000000000000000000000000000000000055 +:10EBC0000000000000000000000000000000000045 +:10EBD0000000000000000000000000000000000035 +:10EBE0000000000000000000000000000000000025 +:10EBF0000000000000000000000000000000000015 +:10EC00002D2D0000504F5349584C595F434F5252DD +:10EC10004543540025733A206F7074696F6E20600D +:10EC200025732720697320616D626967756F75733D +:10EC30002028636F756C6420626520602D2D25731C +:10EC400027206F7220602D2D257327290A000000D0 +:10EC500025733A20696E76616C6964206F707469FF +:10EC60006F6E202D2D20602D2563270A00000000E7 +:10EC700025733A20617267756D656E7420726571D7 +:10EC8000756972656420666F72206F7074696F6E4B +:10EC9000206000002D2D2573270A00002D256327F5 +:10ECA0000A00000043000000000004A88002F4668F +:10ECB0008002F4888002F2B08002F2E88002F4520E +:10ECC0008002F4508002F3FE8002F4268002F3DC1E +:10ECD0008002F3DC8002F3CC8002F3DC8002F3EAF2 +:10ECE0008002F3EA8002F3DC3030303030303030F4 +:10ECF000303030303030303001020B040B0506016B +:10ED00000B01020B040B0506010B0B0B03040B0597 +:10ED10000B0B0B0B0B0B040B050B0B0B0B0B0B0B50 +:10ED20000B0B0B0B0B05080B040B0B070B0B0B0949 +:10ED30000B040B050B0B0B0B0A0B040B0B0B0B0B38 +:10ED40000B0B0B040B0B0B0B0B0B0B030B0B0B0B22 +:10ED50000B0B0B0B080B0B0B0B0B0B00000000003D +:10ED6000000000000001000304000000000001009A +:10ED7000030400000000000007030400000000007E +:10ED80000000030400000000000000000400000078 +:10ED90000000020003040000000000010005060559 +:10EDA0000000000001000506000000000000000354 +:10EDB0000400000000000008000000000000000047 +:10EDC000080000000000000000000000000000003B +:10EDD0003031323334353637383941424344454691 +:10EDE0000000000030313233343536373839616253 +:10EDF0006364656600000000202020202020202081 +:10EE000020202020202020200808080808080808C2 +:10EE10000808080808080808080808080808080872 +:10EE2000080808080808080807080807020808076B +:10EE30000808060708070508000101010101010192 +:10EE40000101080808080808080408040404040468 +:10EE50000808080803080804080808040804080843 +:10EE6000040808080808080808040804040404043E +:10EE70000304030803080404040308040304080843 +:10EE8000040803080808080808080808080808080B +:10EE900008080808080808080808080808080808F2 +:10EEA00008080808080808080808080808080808E2 +:10EEB00008080808080808080808080808080808D2 +:10EEC00008080808080808080808080808080808C2 +:10EED00008080808080808080808080808080808B2 +:10EEE00008080808080808080808080808080808A2 +:10EEF0000808080808080808080808080808080892 +:10EF00000808080808080808000A000100020003B1 +:10EF1000000400050006000700080009000A000BB5 +:10EF2000000C000D000E000F00100000000000009B +:10EF300000000000000000000000000000000000D1 +:10EF400000000000000000000000000000000000C1 +:10EF500000000000000000000000000000000000B1 +:10EF600000000000000000000000000000000000A1 +:10EF70000000000000000000000000000000000091 +:10EF800000000000000000000000000080037FB4CB +:10EF900080037E2080037E2080037E2080037E20ED +:10EFA00080037E2080037E2080037E2080037E20DD +:10EFB00080037E20FFFFFFFFFFFFFFFF49534F2D20 +:10EFC000383835392D310000800333228003334433 +:10EFD0008003316C800331A48003330E8003330C33 +:10EFE000800332BA800332E2800332988003329881 +:10EFF0008003328880033298800332A6800332A6D1 +:10F00000800332988003363480034AA480034AA4E4 +:10F010008003364480034AA480034AA480034AA4A0 +:10F0200080034AA480034AA480034AA4800336488C +:10F030008003371C80034AA48003371880033724D9 +:10F0400080034AA480033842800338468003384650 +:10F0500080033846800338468003384680033846AC +:10F0600080033846800338468003384680034AA42C +:10F0700080034AA480034AA480034AA480034AA4CC +:10F0800080034AA480034AA480034AA480034AA4BC +:10F0900080034AA48003394480033B9680034AA43A +:10F0A00080033B9680034AA480034AA480034AA4B9 +:10F0B00080034AA48003387880034AA480034AA4CA +:10F0C0008003416280034AA480034AA480034AA4C7 +:10F0D00080034AA480034AA48003452680034AA4EF +:10F0E00080034AA48003361A80034AA480034AA4FA +:10F0F00080034AA480034AA480034AA480034AA44C +:10F1000080034AA480034AA480034AA480034AA43B +:10F11000800338988003395A80033B9680033B96DE +:10F1200080033B968003387C8003395A80034AA4CD +:10F1300080034AA48003388080034AA480033FA24E +:10F1400080034178800343A48003389480034AA459 +:10F150008003445880034AA48003453C80034AA4AA +:10F1600080034AA48003476E01020B040B050601CD +:10F170000B01020B040B0506010B0B0B03040B0523 +:10F180000B0B0B0B0B0B040B050B0B0B0B0B0B0BDC +:10F190000B0B0B0B0B05080B040B0B070B0B0B09D5 +:10F1A0000B040B050B0B0B0B0A0B040B0B0B0B0BC4 +:10F1B0000B0B0B040B0B0B0B0B0B0B030B0B0B0BAE +:10F1C0000B0B0B0B080B0B0B0B0B0B0000000000C9 +:10F1D0000000000000010003040000000000010026 +:10F1E000030400000000000007030400000000000A +:10F1F0000000030400000000000000000400000004 +:10F2000000000200030400000000000100050605E4 +:10F2100000000000010005060000000000000003DF +:10F2200004000000000000080000000000000000D2 +:10F2300008000000000000000000000000000000C6 +:10F24000494E4600696E66004E414E006E616E008A +:10F2500020202020202020202020202020202020AE +:10F26000303030303030303030303030303030309E +:10F27000080808080808080808080808080808080E +:10F2800008080808080808080808080808080808FE +:10F2900007080807020808070808060708070508FE +:10F2A0000001010101010101010108080808080825 +:10F2B00008040804040404040808080803080804EF +:10F2C00008080804080408080408080808080808CA +:10F2D00008040804040404040304030803080404E1 +:10F2E00004030804030408080408030808080808BD +:10F2F000080808080808080808080808080808088E +:10F30000080808080808080808080808080808087D +:10F31000080808080808080808080808080808086D +:10F32000080808080808080808080808080808085D +:10F33000080808080808080808080808080808084D +:10F34000080808080808080808080808080808083D +:10F35000080808080808080808080808080808082D +:10F36000080808080808080808080808080808081D +:10F37000496E66696E697479000000004E614E0046 +:10F3800000000005000000190000007D3FF00000B3 +:10F390000000000040240000000000004059000070 +:10F3A00000000000408F40000000000040C38800C3 +:10F3B0000000000040F86A0000000000412E848038 +:10F3C00000000000416312D0000000004197D78484 +:10F3D0000000000041CDCD65000000004202A05FAA +:10F3E0002000000042374876E8000000426D1A9481 +:10F3F000A200000042A2309CE540000042D6BCC4FE +:10F400001E900000430C6BF5263400004341C37985 +:10F4100037E080004376345785D8A00043ABC16DF8 +:10F42000674EC80043E158E460913D004415AF1DAC +:10F4300078B58C40444B1AE4D6E2EF504480F0CFCC +:10F44000064DD59244B52D02C7E14AF644EA784309 +:10F4500079D99DB44341C37937E080004693B8B56C +:10F46000B5056E174D384F03E93FF9F55A827748D5 +:0CF47000F9301D3275154FDD7F73BF3C75 +:10F480000000000455736167653A2074746370204E +:10F490002D742F2D72205B2D6F7074696F6E735DEC +:10F4A00020686F73740A20202020202020202D6CDB +:10F4B0002020202020206C656E677468206F6620F5 +:10F4C00062756673207772697474656E20746F203C +:10F4D0006E6574776F726B202864656661756C74F5 +:10F4E0002031303234290A20202020202020202DD5 +:10F4F0006E2020202020206E756D626572206F6660 +:10F500002062756673207772697474656E20746FFB +:10F51000206E6574776F726B202864656661756C08 +:10F52000742031303234290A20202020202020204D +:10F530002D70202020202020706F7274206E756D39 +:10F5400062657220746F2073656E6420746F20286A +:10F5500064656661756C742032303030290A202071 +:10F560002020202020202D752020202020207564A0 +:10F57000700A20202020202020202D7620202020EE +:10F580002020766572626F73650A000080039954CB +:10F59000000000000000000000000000000000006B +:10F5A000000000000000000000000000000000005B +:10F5B000000000000000000000000000000000004B +:10F5C000000000000000000000000000000000003B +:10F5D000000000000000000000000000000000002B +:10F5E000000000000000000000000000000000001B +:10F5F000000000000000000000000000000000000B +:10F6000000000000000000000000000000000000FA +:10F6100000000000000000000000000000000000EA +:10F6200000000000000000000000000000000000DA +:10F6300000000000000000000000000000000000CA +:10F6400000000000000000000000000000000000BA +:10F6500000000000000000000000000000000000AA +:10F660000000000400000000ABCD00000000196E97 +:10F6700010000000FFFFFFFFFFFFFFFFFF7590007E +:10F68000000001FFFFFFFFFEFFFFFFFFFF751000FF +:10F69000000001FFFFFFFFFE00050000800149ECB4 +:10F6A000800149EC800149EC800149EC0000000038 +:10F6B000000002340000000C02040B0C1216182487 +:10F6C0003048606C000000000000000000000000F6 +:10F6D00000000010010000146D3E86B0FFFFFFFF28 +:10F6E000FFFF0000000003E800000001000000012F +:10F6F00000000320000000010000000000000008DE +:10F70000000000020000006400000000000000058E +:10F710000000000F000000050000000F000013882B +:10F7200000001388000007D00000138800003E800E +:10F73000000000020000000C02040B0C121618243A +:10F740003048606C00000000000000000000000075 +:10F7500000000000000000000D0102030405060780 +:10F7600008090A0B0C0D000000000011FF0000004A +:10F770000000000000000000000000000000000089 +:10F780000000000000000000000000000000FFFF7B +:10F79000FFFFFFFF00000001000000030000000168 +:10F7A0000000000100000000000000010000000156 +:10F7B0000000000100000001000000000000000146 +:10F7C0000000000A00000005000000000000000525 +:10F7D00000000000FFFFFFFF00000001000000002C +:10F7E00000000002FF000000000000000000000018 +:10F7F0000000000000000000000000000000000009 +:10F80000000000000000FFFFFFFFFFFF00000001FD +:10F810000000000300000000000007D000000064AA +:10F8200003010100060200000000000C82848B8CA2 +:10F83000129618243048606C0000000000000000A0 +:10F8400000000000000000000000000100000001B6 +:10F85000000000010014000000000014000007D0A8 +:10F860000000000000000001000000000000000691 +:10F8700000000001FFFFFFFF0A00000064756D6DCE +:10F88000795F7373696400000000000000000000ED +:10F890000000000000000000000000000000000068 +:10F8A000303030313032303330343035303630373C +:10F8B0003038303930613062306330643065306602 +:10F8C0003130313131323133313431353136313714 +:10F8D00031383139316131623163316431653166DA +:10F8E00000000000000000028003D670000000004D +:10F8F000800255EC80025614800256588002569CB5 +:10F90000800256AA800255F4800256B6800256D074 +:10F910008002614C8003EAFD0000003F000000010E +:10F920008003EF2C8003EF4C8003EF6C000000009D +:10F9300000000000000000000000000000000000C7 +:10F940008003ECA4000000000000000000000000A4 +:10F9500000000000000000000000000000000000A7 +:10F960000000000000000000000000000000000097 +:10F970000000000000000000000000000000000087 +:10F980000000000000000000000000000000000077 +:10F990000000000000000000000000000000000067 +:10F9A0000000000000000000000000000000000057 +:10F9B0000000000000000000000000000000000047 +:10F9C0000000000000000000000000000000000037 +:10F9D0000000000000000000000000000000000027 +:10F9E0000000000000000000000000000000000017 +:10F9F0000000000000000000000000000000000007 +:10FA000000000000000000000000000000000000F6 +:10FA1000000004A800000000000000000000059C99 +:10FA20000000059C000005A4000005A4000005AC32 +:10FA3000000005AC000005B4000005B4000005BCE2 +:10FA4000000005BC000005C4000005C4000005CC92 +:10FA5000000005CC000005D4000005D4000005DC42 +:10FA6000000005DC000005E4000005E4000005ECF2 +:10FA7000000005EC000005F4000005F4000005FCA2 +:10FA8000000005FC00000604000006040000060C4F +:10FA90000000060C00000614000006140000061CFE +:10FAA0000000061C00000624000006240000062CAE +:10FAB0000000062C00000634000006340000063C5E +:10FAC0000000063C00000644000006440000064C0E +:10FAD0000000064C00000654000006540000065CBE +:10FAE0000000065C00000664000006640000066C6E +:10FAF0000000066C00000674000006740000067C1E +:10FB00000000067C00000684000006840000068CCD +:10FB10000000068C00000694000006940000069C7D +:10FB20000000069C000006A4000006A4000006AC2D +:10FB3000000006AC000006B4000006B4000006BCDD +:10FB4000000006BC000006C4000006C4000006CC8D +:10FB5000000006CC000006D4000006D4000006DC3D +:10FB6000000006DC000006E4000006E4000006ECED +:10FB7000000006EC000006F4000006F4000006FC9D +:10FB8000000006FC00000704000007040000070C4A +:10FB90000000070C00000714000007140000071CF9 +:10FBA0000000071C00000724000007240000072CA9 +:10FBB0000000072C00000734000007340000073C59 +:10FBC0000000073C00000744000007440000074C09 +:10FBD0000000074C00000754000007540000075CB9 +:10FBE0000000075C00000764000007640000076C69 +:10FBF0000000076C00000774000007740000077C19 +:10FC00000000077C00000784000007840000078CC8 +:10FC10000000078C00000794000007940000079C78 +:10FC20000000079C000007A4000007A4000007AC28 +:10FC3000000007AC000007B4000007B4000007BCD8 +:10FC4000000007BC000007C4000007C4000007CC88 +:10FC5000000007CC000007D4000007D4000007DC38 +:10FC6000000007DC000007E4000007E4000007ECE8 +:10FC7000000007EC000007F4000007F4000007FC98 +:10FC8000000007FC00000804000008040000080C45 +:10FC90000000080C00000814000008140000081CF4 +:10FCA0000000081C00000824000008240000082CA4 +:10FCB0000000082C00000834000008340000083C54 +:10FCC0000000083C00000844000008440000084C04 +:10FCD0000000084C00000854000008540000085CB4 +:10FCE0000000085C00000864000008640000086C64 +:10FCF0000000086C00000874000008740000087C14 +:10FD00000000087C00000884000008840000088CC3 +:10FD10000000088C00000894000008940000089C73 +:10FD20000000089C000008A4000008A4000008AC23 +:10FD3000000008AC000008B4000008B4000008BCD3 +:10FD4000000008BC000008C4000008C4000008CC83 +:10FD5000000008CC000008D4000008D4000008DC33 +:10FD6000000008DC000008E4000008E4000008ECE3 +:10FD7000000008EC000008F4000008F4000008FC93 +:10FD8000000008FC00000904000009040000090C40 +:10FD90000000090C00000914000009140000091CEF +:10FDA0000000091C00000924000009240000092C9F +:10FDB0000000092C00000934000009340000093C4F +:10FDC0000000093C00000944000009440000094CFF +:10FDD0000000094C00000954000009540000095CAF +:10FDE0000000095C00000964000009640000096C5F +:10FDF0000000096C00000974000009740000097C0F +:10FE00000000097C00000984000009840000098CBE +:10FE10000000098C00000994000009940002000011 +:0CFE2000FFFFFFFF0000000100007AFC63 +:040000058000000077 +:00000001FF diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/CONFIG/conf_access.h b/firmware/libraries/WiFi/extras/wifiHD/src/CONFIG/conf_access.h new file mode 100644 index 0000000..2d38d50 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/CONFIG/conf_access.h @@ -0,0 +1,170 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Memory access control configuration file. + * + * This file contains the possible external configuration of the memory access + * control. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _CONF_ACCESS_H_ +#define _CONF_ACCESS_H_ + +#include "compiler.h" +#include "board.h" + + +/*! \name Activation of Logical Unit Numbers + */ +//! @{ +#define LUN_0 DISABLE //!< On-Chip Virtual Memory. +#define LUN_1 ENABLE //!< AT45DBX Data Flash. +#define LUN_2 DISABLE //!< SD/MMC Card over SPI. +#define LUN_3 DISABLE +#define LUN_4 DISABLE +#define LUN_5 DISABLE +#define LUN_6 DISABLE +#define LUN_7 DISABLE +#define LUN_USB DISABLE //!< Host Mass-Storage Memory. +//! @} + +/*! \name LUN 0 Definitions + */ +//! @{ +#define VIRTUAL_MEM LUN_0 +#define LUN_ID_VIRTUAL_MEM LUN_ID_0 +#define LUN_0_INCLUDE "virtual_mem.h" +#define Lun_0_test_unit_ready virtual_test_unit_ready +#define Lun_0_read_capacity virtual_read_capacity +#define Lun_0_wr_protect virtual_wr_protect +#define Lun_0_removal virtual_removal +#define Lun_0_usb_read_10 virtual_usb_read_10 +#define Lun_0_usb_write_10 virtual_usb_write_10 +#define Lun_0_mem_2_ram virtual_mem_2_ram +#define Lun_0_ram_2_mem virtual_ram_2_mem +#define LUN_0_NAME "\"On-Chip Virtual Memory\"" +//! @} + +/*! \name LUN 1 Definitions + */ +//! @{ +#define AT45DBX_MEM LUN_1 +#define LUN_ID_AT45DBX_MEM LUN_ID_1 +#define LUN_1_INCLUDE "at45dbx_mem.h" +#define Lun_1_test_unit_ready at45dbx_test_unit_ready +#define Lun_1_read_capacity at45dbx_read_capacity +#define Lun_1_wr_protect at45dbx_wr_protect +#define Lun_1_removal at45dbx_removal +#define Lun_1_usb_read_10 at45dbx_usb_read_10 +#define Lun_1_usb_write_10 at45dbx_usb_write_10 +#define Lun_1_mem_2_ram at45dbx_df_2_ram +#define Lun_1_ram_2_mem at45dbx_ram_2_df +#define LUN_1_NAME "\"AT45DBX Data Flash\"" +//! @} + +/*! \name LUN 2 Definitions + */ +//! @{ +#define SD_MMC_SPI_MEM LUN_2 +#define LUN_ID_SD_MMC_SPI_MEM LUN_ID_2 +#define LUN_2_INCLUDE "sd_mmc_spi_mem.h" +#define Lun_2_test_unit_ready sd_mmc_spi_test_unit_ready +#define Lun_2_read_capacity sd_mmc_spi_read_capacity +#define Lun_2_wr_protect sd_mmc_spi_wr_protect +#define Lun_2_removal sd_mmc_spi_removal +#define Lun_2_usb_read_10 sd_mmc_spi_usb_read_10 +#define Lun_2_usb_write_10 sd_mmc_spi_usb_write_10 +#define Lun_2_mem_2_ram sd_mmc_spi_mem_2_ram +#define Lun_2_ram_2_mem sd_mmc_spi_ram_2_mem +#define LUN_2_NAME "\"SD/MMC Card over SPI\"" +//! @} + +/*! \name USB LUNs Definitions + */ +//! @{ +#define MEM_USB LUN_USB +#define LUN_ID_MEM_USB LUN_ID_USB +#define LUN_USB_INCLUDE "host_mem.h" +#define Lun_usb_test_unit_ready(lun) host_test_unit_ready(lun) +#define Lun_usb_read_capacity(lun, nb_sect) host_read_capacity(lun, nb_sect) +#define Lun_usb_read_sector_size(lun) host_read_sector_size(lun) +#define Lun_usb_wr_protect(lun) host_wr_protect(lun) +#define Lun_usb_removal() host_removal() +#define Lun_usb_mem_2_ram(addr, ram) host_read_10_ram(addr, ram) +#define Lun_usb_ram_2_mem(addr, ram) host_write_10_ram(addr, ram) +#define LUN_USB_NAME "\"Host Mass-Storage Memory\"" +//! @} + +/*! \name Actions Associated with Memory Accesses + * + * Write here the action to associate with each memory access. + * + * \warning Be careful not to waste time in order not to disturb the functions. + */ +//! @{ +#define memory_start_read_action(nb_sectors) +#define memory_stop_read_action() +#define memory_start_write_action(nb_sectors) +#define memory_stop_write_action() +//! @} + +/*! \name Activation of Interface Features + */ +//! @{ +#define ACCESS_USB DISABLED //!< MEM <-> USB interface. +#define ACCESS_MEM_TO_RAM ENABLED //!< MEM <-> RAM interface. +#define ACCESS_STREAM ENABLED //!< Streaming MEM <-> MEM interface. //mlf +#define ACCESS_STREAM_RECORD DISABLED //!< Streaming MEM <-> MEM interface in record mode. +#define ACCESS_MEM_TO_MEM DISABLED //!< MEM <-> MEM interface. +#define ACCESS_CODEC DISABLED //!< Codec interface. +//! @} + +/*! \name Specific Options for Access Control + */ +//! @{ +#define GLOBAL_WR_PROTECT DISABLED //!< Management of a global write protection. +//! @} + + +#endif // _CONF_ACCESS_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/CONFIG/conf_at45dbx.h b/firmware/libraries/WiFi/extras/wifiHD/src/CONFIG/conf_at45dbx.h new file mode 100644 index 0000000..3280e4f --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/CONFIG/conf_at45dbx.h @@ -0,0 +1,83 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief AT45DBX configuration file. + * + * This file contains the possible external configuration of the AT45DBX. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with an SPI module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _CONF_AT45DBX_H_ +#define _CONF_AT45DBX_H_ + + +#include "conf_access.h" + +#if AT45DBX_MEM == DISABLE + #error conf_at45dbx.h is #included although AT45DBX_MEM is disabled +#endif + + +#include "at45dbx.h" + + +//_____ D E F I N I T I O N S ______________________________________________ + +//! Size of AT45DBX data flash memories to manage. +#define AT45DBX_MEM_SIZE AT45DBX_1MB + +//! Number of AT45DBX components to manage. +#define AT45DBX_MEM_CNT 1 + +//! First chip select used by AT45DBX components on the SPI module instance. +//! AT45DBX_SPI_NPCS0_PIN always corresponds to this first NPCS, whatever it is. +#define AT45DBX_SPI_FIRST_NPCS AT45DBX_SPI_NPCS + +//! SPI master speed in Hz. +#define AT45DBX_SPI_MASTER_SPEED 12000000 + +//! Number of bits in each SPI transfer. +#define AT45DBX_SPI_BITS 8 + + +#endif // _CONF_AT45DBX_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/CONFIG/conf_ebi.h b/firmware/libraries/WiFi/extras/wifiHD/src/CONFIG/conf_ebi.h new file mode 100644 index 0000000..aacdb13 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/CONFIG/conf_ebi.h @@ -0,0 +1,108 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief CONF_EBI EBI/SMC driver for AVR32 UC3. + * + * \note The values defined in this file are device-specific. See the device + * datasheet for further information. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with an SMC module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _CONF_EBI_H_ +#define _CONF_EBI_H_ + +#include "compiler.h" +#include "board.h" + +#if (ET024006DHU_SMC_USE_NCS == 0) +#define SMC_USE_NCS0 +#define SMC_COMPONENT_CS0 ET024006DHU_SMC_COMPONENT_CS +#else + +#if (ET024006DHU_SMC_USE_NCS == 2) +#define SMC_USE_NCS2 +#define SMC_COMPONENT_CS2 ET024006DHU_SMC_COMPONENT_CS + +#else +#error This board is not supported +#endif +#endif + +#define EBI_DATA_0 ET024006DHU_EBI_DATA_0 +#define EBI_DATA_1 ET024006DHU_EBI_DATA_1 +#define EBI_DATA_2 ET024006DHU_EBI_DATA_2 +#define EBI_DATA_3 ET024006DHU_EBI_DATA_3 +#define EBI_DATA_4 ET024006DHU_EBI_DATA_4 +#define EBI_DATA_5 ET024006DHU_EBI_DATA_5 +#define EBI_DATA_6 ET024006DHU_EBI_DATA_6 +#define EBI_DATA_7 ET024006DHU_EBI_DATA_7 +#define EBI_DATA_8 ET024006DHU_EBI_DATA_8 +#define EBI_DATA_9 ET024006DHU_EBI_DATA_9 +#define EBI_DATA_10 ET024006DHU_EBI_DATA_10 +#define EBI_DATA_11 ET024006DHU_EBI_DATA_11 +#define EBI_DATA_12 ET024006DHU_EBI_DATA_12 +#define EBI_DATA_13 ET024006DHU_EBI_DATA_13 +#define EBI_DATA_14 ET024006DHU_EBI_DATA_14 +#define EBI_DATA_15 ET024006DHU_EBI_DATA_15 + +#if BOARD==EVK1105 +#ifdef EVK1105_REV3 +#define EBI_ADDR_19 AVR32_EBI_ADDR_19 +#define EBI_NCS_2 ET024006DHU_EBI_NCS +#else +#define EBI_ADDR_21 ET024006DHU_EBI_ADDR_21 +#define EBI_NCS_0 ET024006DHU_EBI_NCS +#endif +#elif BOARD == UC3C_EK +#define EBI_ADDR_22 AVR32_EBI_ADDR_22 +#define EBI_NCS_0 ET024006DHU_EBI_NCS +#elif BOARD == EVK1104 +#define EBI_ADDR_21 ET024006DHU_EBI_ADDR_21 +#define EBI_NCS_0 ET024006DHU_EBI_NCS +#endif + + +#define EBI_NWE0 ET024006DHU_EBI_NWE +#define EBI_NRD ET024006DHU_EBI_NRD + +#endif // _CONF_EBI_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/CONFIG/conf_sd_mmc_spi.h b/firmware/libraries/WiFi/extras/wifiHD/src/CONFIG/conf_sd_mmc_spi.h new file mode 100644 index 0000000..94b55e1 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/CONFIG/conf_sd_mmc_spi.h @@ -0,0 +1,73 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief SD/MMC configuration file. + * + * This file contains the possible external configuration of the SD/MMC. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with an SPI module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _CONF_SD_MMC_SPI_H_ +#define _CONF_SD_MMC_SPI_H_ + + +#include "conf_access.h" + +#if SD_MMC_SPI_MEM == DISABLE + #error conf_sd_mmc_spi.h is #included although SD_MMC_SPI_MEM is disabled +#endif + + +#include "sd_mmc_spi.h" + + +//_____ D E F I N I T I O N S ______________________________________________ + +//! SPI master speed in Hz. +#define SD_MMC_SPI_MASTER_SPEED 12000000 + +//! Number of bits in each SPI transfer. +#define SD_MMC_SPI_BITS 8 + + +#endif // _CONF_SD_MMC_SPI_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/ASM/trampoline.x b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/ASM/trampoline.x new file mode 100644 index 0000000..c127121 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/ASM/trampoline.x @@ -0,0 +1,74 @@ +/* This file is part of the ATMEL AVR32-SoftwareFramework-AT32UC3A-1.4.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief AVR32 UC3 ISP trampoline. + * + * In order to be able to program a project with both BatchISP and JTAGICE mkII + * without having to take the general-purpose fuses into consideration, add this + * file to the project and change the program entry point to _trampoline. + * + * The pre-programmed ISP will be erased if JTAGICE mkII is used. + * + * - Compiler: GNU GCC for AVR32 + * - Supported devices: All AVR32UC devices can be used. + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (C) 2006-2008, Atmel Corporation All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of ATMEL may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#include "conf_isp.h" + + +//! @{ +//! \verbatim + + + // This must be linked @ 0x80000000 if it is to be run upon reset. + .section .reset, "ax", @progbits + + + .global _trampoline + .type _trampoline, @function +_trampoline: + // Jump to program start. + rjmp program_start + + .org PROGRAM_START_OFFSET +program_start: + // Jump to the C runtime startup routine. + lda.w pc, _stext + + +//! \endverbatim +//! @} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/arduino.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/arduino.h new file mode 100644 index 0000000..e687723 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/arduino.h @@ -0,0 +1,237 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief AT32UC3A EVK1100 board header file. + * + * This file contains definitions and services related to the features of the + * EVK1100 board rev. B and C. + * + * To use this board, define BOARD=EVK1100. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 AT32UC3A devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _ARDUINO_H_ +#define _ARDUINO_H_ + +#include "compiler.h" + +#ifdef __AVR32_ABI_COMPILER__ // Automatically defined when compiling for AVR32, not when assembling. +# include "led.h" +#endif // __AVR32_ABI_COMPILER__ + + +/*! \name Oscillator Definitions + */ +//! @{ + +// RCOsc has no custom calibration by default. Set the following definition to +// the appropriate value if a custom RCOsc calibration has been applied to your +// part. +//#define FRCOSC AVR32_PM_RCOSC_FREQUENCY //!< RCOsc frequency: Hz. + +#define FOSC32 32768 //!< Osc32 frequency: Hz. +#define OSC32_STARTUP AVR32_PM_OSCCTRL32_STARTUP_8192_RCOSC //!< Osc32 startup time: RCOsc periods. + +#define FOSC0 12000000 //!< Osc0 frequency: Hz. +#define OSC0_STARTUP AVR32_PM_OSCCTRL0_STARTUP_2048_RCOSC //!< Osc0 startup time: RCOsc periods. + +// Osc1 crystal is not mounted by default. Set the following definitions to the +// appropriate values if a custom Osc1 crystal is mounted on your board. +//#define FOSC1 12000000 //!< Osc1 frequency: Hz. +//#define OSC1_STARTUP AVR32_PM_OSCCTRL1_STARTUP_2048_RCOSC //!< Osc1 startup time: RCOsc periods. + +//! @} + + +//! Number of LEDs. +#define LED_COUNT 0 + +/*! \name GPIO Connections of LEDs + */ +//! @{ +#define LED0_GPIO AVR32_PIN_PB19 +#define LED1_GPIO AVR32_PIN_PB20 +#define LED2_GPIO AVR32_PIN_PB21 +#define DEB_PIN_GPIO AVR32_PIN_PA20 +#define DEB2_PIN_GPIO AVR32_PIN_PB00 +//! @} + +/*! \name PWM Channels of LEDs + */ +//! @{ +#define LED0_PWM 0 +#define LED1_PWM 1 +#define LED2_PWM 2 +//! @} + +/*! \name PWM Functions of LEDs + */ +//! @{ +#define LED0_PWM_FUNCTION AVR32_PWM_0_FUNCTION +#define LED1_PWM_FUNCTION AVR32_PWM_1_FUNCTION +#define LED2_PWM_FUNCTION AVR32_PWM_2_FUNCTION +//! @} + +/*! \name Color Identifiers of LEDs to Use with LED Functions + */ +//! @{ +#define LED_MONO0_GREEN LED0 +#define LED_MONO1_RED LED1 +#define LED_MONO2_BLU LED2 +//! @} + +#if 0 +/*! \name SPI Connections of the DIP204 LCD + */ +//! @{ +#define DIP204_SPI (&AVR32_SPI1) +#define DIP204_SPI_NPCS 2 +#define DIP204_SPI_SCK_PIN AVR32_SPI1_SCK_0_0_PIN +#define DIP204_SPI_SCK_FUNCTION AVR32_SPI1_SCK_0_0_FUNCTION +#define DIP204_SPI_MISO_PIN AVR32_SPI1_MISO_0_0_PIN +#define DIP204_SPI_MISO_FUNCTION AVR32_SPI1_MISO_0_0_FUNCTION +#define DIP204_SPI_MOSI_PIN AVR32_SPI1_MOSI_0_0_PIN +#define DIP204_SPI_MOSI_FUNCTION AVR32_SPI1_MOSI_0_0_FUNCTION +#define DIP204_SPI_NPCS_PIN AVR32_SPI1_NPCS_2_0_PIN +#define DIP204_SPI_NPCS_FUNCTION AVR32_SPI1_NPCS_2_0_FUNCTION +//! @} + +/*! \name GPIO and PWM Connections of the DIP204 LCD Backlight + */ +//! @{ +#define DIP204_BACKLIGHT_PIN AVR32_PIN_PB18 +#define DIP204_PWM_CHANNEL 6 +#define DIP204_PWM_PIN AVR32_PWM_6_PIN +#define DIP204_PWM_FUNCTION AVR32_PWM_6_FUNCTION +//! @} +#endif + +/*! \name SPI Connections of the AT45DBX Data Flash Memory + */ +//! @{ +#define AT45DBX_SPI (&AVR32_SPI1) +#define AT45DBX_SPI_NPCS 2 +#define AT45DBX_SPI_SCK_PIN AVR32_SPI1_SCK_0_0_PIN +#define AT45DBX_SPI_SCK_FUNCTION AVR32_SPI1_SCK_0_0_FUNCTION +#define AT45DBX_SPI_MISO_PIN AVR32_SPI1_MISO_0_0_PIN +#define AT45DBX_SPI_MISO_FUNCTION AVR32_SPI1_MISO_0_0_FUNCTION +#define AT45DBX_SPI_MOSI_PIN AVR32_SPI1_MOSI_0_0_PIN +#define AT45DBX_SPI_MOSI_FUNCTION AVR32_SPI1_MOSI_0_0_FUNCTION +#define AT45DBX_SPI_NPCS2_PIN AVR32_SPI1_NPCS_2_0_PIN +#define AT45DBX_SPI_NPCS2_FUNCTION AVR32_SPI1_NPCS_2_0_FUNCTION +#define AT45DBX_CHIP_RESET AVR32_PIN_PA02 +//! @} + + +/*! \name GPIO and SPI Connections of the SD/MMC Connector + */ +//! @{ +//#define SD_MMC_CARD_DETECT_PIN AVR32_PIN_PA02 +//#define SD_MMC_WRITE_PROTECT_PIN AVR32_PIN_PA07 +#define SD_MMC_SPI (&AVR32_SPI1) +#define SD_MMC_SPI_NPCS 1 +#define SD_MMC_SPI_SCK_PIN AVR32_SPI1_SCK_0_0_PIN +#define SD_MMC_SPI_SCK_FUNCTION AVR32_SPI1_SCK_0_0_FUNCTION +#define SD_MMC_SPI_MISO_PIN AVR32_SPI1_MISO_0_0_PIN +#define SD_MMC_SPI_MISO_FUNCTION AVR32_SPI1_MISO_0_0_FUNCTION +#define SD_MMC_SPI_MOSI_PIN AVR32_SPI1_MOSI_0_0_PIN +#define SD_MMC_SPI_MOSI_FUNCTION AVR32_SPI1_MOSI_0_0_FUNCTION +#define SD_MMC_SPI_NPCS_PIN AVR32_SPI1_NPCS_1_0_PIN +#define SD_MMC_SPI_NPCS_FUNCTION AVR32_SPI1_NPCS_1_0_FUNCTION +//! @} + +/* Timer Counter to generate clock for WiFi chip*/ +# define WIFI_TC (&AVR32_TC) +# define WIFI_TC_CHANNEL_ID 0 +# define WIFI_TC_CHANNEL_PIN AVR32_TC_A0_0_0_PIN +# define WIFI_TC_CHANNEL_FUNCTION AVR32_TC_A0_0_0_FUNCTION +// Note that TC_A0_0_0 pin is pin 6 (PB23) on AT32UC3A1512 QFP100. + +/* Pin related to WiFi chip communication */ +#ifndef USE_POLL + #define USE_POLL +#endif + #define SPI_CS 0 + #define AVR32_SPI AVR32_SPI1 + #define GPIO_IRQ_PIN AVR32_PIN_PA03 + #define GPIO_IRQ AVR32_GPIO_IRQ_7 + #define GPIO_W_RESET_PIN AVR32_PIN_PA07 + #define GPIO_W_SHUTDOWN_PIN AVR32_PIN_PA09 + +/* Pin related to shield communication */ + #define ARDUINO_HANDSHAKE_PIN AVR32_PIN_PA25 + #define ARDUINO_EXTINT_PIN AVR32_PIN_PA04 //not used + + #define AVR32_PDCA_PID_TX AVR32_PDCA_PID_SPI1_TX + #define AVR32_PDCA_PID_RX AVR32_PDCA_PID_SPI1_RX + + +#if 0 +/*! \name TWI Connections of the Spare TWI Connector + */ +//! @{ +#define SPARE_TWI (&AVR32_TWI) +#define SPARE_TWI_SCL_PIN AVR32_TWI_SCL_0_0_PIN +#define SPARE_TWI_SCL_FUNCTION AVR32_TWI_SCL_0_0_FUNCTION +#define SPARE_TWI_SDA_PIN AVR32_TWI_SDA_0_0_PIN +#define SPARE_TWI_SDA_FUNCTION AVR32_TWI_SDA_0_0_FUNCTION +//! @} + + +/*! \name SPI Connections of the Spare SPI Connector + */ +//! @{ +#define SPARE_SPI (&AVR32_SPI0) +#define SPARE_SPI_NPCS 0 +#define SPARE_SPI_SCK_PIN AVR32_SPI0_SCK_0_0_PIN +#define SPARE_SPI_SCK_FUNCTION AVR32_SPI0_SCK_0_0_FUNCTION +#define SPARE_SPI_MISO_PIN AVR32_SPI0_MISO_0_0_PIN +#define SPARE_SPI_MISO_FUNCTION AVR32_SPI0_MISO_0_0_FUNCTION +#define SPARE_SPI_MOSI_PIN AVR32_SPI0_MOSI_0_0_PIN +#define SPARE_SPI_MOSI_FUNCTION AVR32_SPI0_MOSI_0_0_FUNCTION +#define SPARE_SPI_NPCS_PIN AVR32_SPI0_NPCS_0_0_PIN +#define SPARE_SPI_NPCS_FUNCTION AVR32_SPI0_NPCS_0_0_FUNCTION +//! @} +#endif + +#endif // _ARDUINO_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/led.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/led.c new file mode 100644 index 0000000..d7cd439 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/led.c @@ -0,0 +1,346 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief AT32UC3A EVK1100 board LEDs support package. + * + * This file contains definitions and services related to the LED features of + * the EVK1100 board. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 AT32UC3A devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#include +#include "preprocessor.h" +#include "compiler.h" +#include "arduino.h" +#include "led.h" + + +//! Structure describing LED hardware connections. +typedef const struct +{ + struct + { + U32 PORT; //!< LED GPIO port. + U32 PIN_MASK; //!< Bit-mask of LED pin in GPIO port. + } GPIO; //!< LED GPIO descriptor. + struct + { + S32 CHANNEL; //!< LED PWM channel (< 0 if N/A). + S32 FUNCTION; //!< LED pin PWM function (< 0 if N/A). + } PWM; //!< LED PWM descriptor. +} tLED_DESCRIPTOR; + + +//! Hardware descriptors of all LEDs. +static tLED_DESCRIPTOR LED_DESCRIPTOR[LED_COUNT] = +{ +#define INSERT_LED_DESCRIPTOR(LED_NO, unused) \ + { \ + {LED##LED_NO##_GPIO / 32, 1 << (LED##LED_NO##_GPIO % 32)},\ + {LED##LED_NO##_PWM, LED##LED_NO##_PWM_FUNCTION } \ + }, + MREPEAT(LED_COUNT, INSERT_LED_DESCRIPTOR, ~) +#undef INSERT_LED_DESCRIPTOR +}; + + +//! Saved state of all LEDs. +static volatile U32 LED_State = (1 << LED_COUNT) - 1; + + +U32 LED_Read_Display(void) +{ + return LED_State; +} + + +void LED_Display(U32 leds) +{ + // Use the LED descriptors to get the connections of a given LED to the MCU. + tLED_DESCRIPTOR *led_descriptor; + volatile avr32_gpio_port_t *led_gpio_port; + + // Make sure only existing LEDs are specified. + leds &= (1 << LED_COUNT) - 1; + + // Update the saved state of all LEDs with the requested changes. + LED_State = leds; + + // For all LEDs... + for (led_descriptor = &LED_DESCRIPTOR[0]; + led_descriptor < LED_DESCRIPTOR + LED_COUNT; + led_descriptor++) + { + // Set the LED to the requested state. + led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; + if (leds & 1) + { + led_gpio_port->ovrc = led_descriptor->GPIO.PIN_MASK; + } + else + { + led_gpio_port->ovrs = led_descriptor->GPIO.PIN_MASK; + } + led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; + led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; + leds >>= 1; + } +} + + +U32 LED_Read_Display_Mask(U32 mask) +{ + return Rd_bits(LED_State, mask); +} + + +void LED_Display_Mask(U32 mask, U32 leds) +{ + // Use the LED descriptors to get the connections of a given LED to the MCU. + tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; + volatile avr32_gpio_port_t *led_gpio_port; + U8 led_shift; + + // Make sure only existing LEDs are specified. + mask &= (1 << LED_COUNT) - 1; + + // Update the saved state of all LEDs with the requested changes. + Wr_bits(LED_State, mask, leds); + + // While there are specified LEDs left to manage... + while (mask) + { + // Select the next specified LED and set it to the requested state. + led_shift = 1 + ctz(mask); + led_descriptor += led_shift; + led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; + leds >>= led_shift - 1; + if (leds & 1) + { + led_gpio_port->ovrc = led_descriptor->GPIO.PIN_MASK; + } + else + { + led_gpio_port->ovrs = led_descriptor->GPIO.PIN_MASK; + } + led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; + led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; + leds >>= 1; + mask >>= led_shift; + } +} + + +Bool LED_Test(U32 leds) +{ + return Tst_bits(LED_State, leds); +} + + +void LED_Off(U32 leds) +{ + // Use the LED descriptors to get the connections of a given LED to the MCU. + tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; + volatile avr32_gpio_port_t *led_gpio_port; + U8 led_shift; + + // Make sure only existing LEDs are specified. + leds &= (1 << LED_COUNT) - 1; + + // Update the saved state of all LEDs with the requested changes. + Clr_bits(LED_State, leds); + + // While there are specified LEDs left to manage... + while (leds) + { + // Select the next specified LED and turn it off. + led_shift = 1 + ctz(leds); + led_descriptor += led_shift; + led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; + led_gpio_port->ovrs = led_descriptor->GPIO.PIN_MASK; + led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; + led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; + leds >>= led_shift; + } +} + + +void LED_On(U32 leds) +{ + // Use the LED descriptors to get the connections of a given LED to the MCU. + tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; + volatile avr32_gpio_port_t *led_gpio_port; + U8 led_shift; + + // Make sure only existing LEDs are specified. + leds &= (1 << LED_COUNT) - 1; + + // Update the saved state of all LEDs with the requested changes. + Set_bits(LED_State, leds); + + // While there are specified LEDs left to manage... + while (leds) + { + // Select the next specified LED and turn it on. + led_shift = 1 + ctz(leds); + led_descriptor += led_shift; + led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; + led_gpio_port->ovrc = led_descriptor->GPIO.PIN_MASK; + led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; + led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; + leds >>= led_shift; + } +} + + +void LED_Toggle(U32 leds) +{ + // Use the LED descriptors to get the connections of a given LED to the MCU. + tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; + volatile avr32_gpio_port_t *led_gpio_port; + U8 led_shift; + + // Make sure only existing LEDs are specified. + leds &= (1 << LED_COUNT) - 1; + + // Update the saved state of all LEDs with the requested changes. + Tgl_bits(LED_State, leds); + + // While there are specified LEDs left to manage... + while (leds) + { + // Select the next specified LED and toggle it. + led_shift = 1 + ctz(leds); + led_descriptor += led_shift; + led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; + led_gpio_port->ovrt = led_descriptor->GPIO.PIN_MASK; + led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; + led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; + leds >>= led_shift; + } +} + + +U32 LED_Read_Display_Field(U32 field) +{ + return Rd_bitfield(LED_State, field); +} + + +void LED_Display_Field(U32 field, U32 leds) +{ + // Move the bit-field to the appropriate position for the bit-mask. + LED_Display_Mask(field, leds << ctz(field)); +} + + +U8 LED_Get_Intensity(U32 led) +{ + tLED_DESCRIPTOR *led_descriptor; + + // Check that the argument value is valid. + led = ctz(led); + led_descriptor = &LED_DESCRIPTOR[led]; + if (led >= LED_COUNT || led_descriptor->PWM.CHANNEL < 0) return 0; + + // Return the duty cycle value if the LED PWM channel is enabled, else 0. + return (AVR32_PWM.sr & (1 << led_descriptor->PWM.CHANNEL)) ? + AVR32_PWM.channel[led_descriptor->PWM.CHANNEL].cdty : 0; +} + + +void LED_Set_Intensity(U32 leds, U8 intensity) +{ + tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; + volatile avr32_pwm_channel_t *led_pwm_channel; + volatile avr32_gpio_port_t *led_gpio_port; + U8 led_shift; + + // For each specified LED... + for (leds &= (1 << LED_COUNT) - 1; leds; leds >>= led_shift) + { + // Select the next specified LED and check that it has a PWM channel. + led_shift = 1 + ctz(leds); + led_descriptor += led_shift; + if (led_descriptor->PWM.CHANNEL < 0) continue; + + // Initialize or update the LED PWM channel. + led_pwm_channel = &AVR32_PWM.channel[led_descriptor->PWM.CHANNEL]; + if (!(AVR32_PWM.sr & (1 << led_descriptor->PWM.CHANNEL))) + { + led_pwm_channel->cmr = (AVR32_PWM_CPRE_MCK << AVR32_PWM_CPRE_OFFSET) & + ~(AVR32_PWM_CALG_MASK | + AVR32_PWM_CPOL_MASK | + AVR32_PWM_CPD_MASK); + led_pwm_channel->cprd = 0x000000FF; + led_pwm_channel->cdty = intensity; + AVR32_PWM.ena = 1 << led_descriptor->PWM.CHANNEL; + } + else + { + AVR32_PWM.isr; + while (!(AVR32_PWM.isr & (1 << led_descriptor->PWM.CHANNEL))); + led_pwm_channel->cupd = intensity; + } + + // Switch the LED pin to its PWM function. + led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; + if (led_descriptor->PWM.FUNCTION & 0x1) + { + led_gpio_port->pmr0s = led_descriptor->GPIO.PIN_MASK; + } + else + { + led_gpio_port->pmr0c = led_descriptor->GPIO.PIN_MASK; + } + if (led_descriptor->PWM.FUNCTION & 0x2) + { + led_gpio_port->pmr1s = led_descriptor->GPIO.PIN_MASK; + } + else + { + led_gpio_port->pmr1c = led_descriptor->GPIO.PIN_MASK; + } + led_gpio_port->gperc = led_descriptor->GPIO.PIN_MASK; + } +} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/led.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/led.h new file mode 100644 index 0000000..a577124 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/led.h @@ -0,0 +1,191 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief AT32UC3A EVK1100 board LEDs support package. + * + * This file contains definitions and services related to the LED features of + * the EVK1100 board. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 AT32UC3A devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _LED_H_ +#define _LED_H_ + +#include "compiler.h" + + +/*! \name Identifiers of LEDs to Use with LED Functions + */ +//! @{ +#define LED0 0x01 +#define LED1 0x02 +#define LED2 0x04 +#define LED3 0x08 +#define LED4 0x10 +#define LED5 0x20 +#define LED6 0x40 +#define LED7 0x80 +//! @} + + +/*! \brief Gets the last state of all LEDs set through the LED API. + * + * \return State of all LEDs (1 bit per LED). + * + * \note The GPIO pin configuration of all LEDs is left unchanged. + */ +extern U32 LED_Read_Display(void); + +/*! \brief Sets the state of all LEDs. + * + * \param leds New state of all LEDs (1 bit per LED). + * + * \note The pins of all LEDs are set to GPIO output mode. + */ +extern void LED_Display(U32 leds); + +/*! \brief Gets the last state of the specified LEDs set through the LED API. + * + * \param mask LEDs of which to get the state (1 bit per LED). + * + * \return State of the specified LEDs (1 bit per LED). + * + * \note The GPIO pin configuration of all LEDs is left unchanged. + */ +extern U32 LED_Read_Display_Mask(U32 mask); + +/*! \brief Sets the state of the specified LEDs. + * + * \param mask LEDs of which to set the state (1 bit per LED). + * + * \param leds New state of the specified LEDs (1 bit per LED). + * + * \note The pins of the specified LEDs are set to GPIO output mode. + */ +extern void LED_Display_Mask(U32 mask, U32 leds); + +/*! \brief Tests the last state of the specified LEDs set through the LED API. + * + * \param leds LEDs of which to test the state (1 bit per LED). + * + * \return \c TRUE if at least one of the specified LEDs has a state on, else + * \c FALSE. + * + * \note The GPIO pin configuration of all LEDs is left unchanged. + */ +extern Bool LED_Test(U32 leds); + +/*! \brief Turns off the specified LEDs. + * + * \param leds LEDs to turn off (1 bit per LED). + * + * \note The pins of the specified LEDs are set to GPIO output mode. + */ +extern void LED_Off(U32 leds); + +/*! \brief Turns on the specified LEDs. + * + * \param leds LEDs to turn on (1 bit per LED). + * + * \note The pins of the specified LEDs are set to GPIO output mode. + */ +extern void LED_On(U32 leds); + +/*! \brief Toggles the specified LEDs. + * + * \param leds LEDs to toggle (1 bit per LED). + * + * \note The pins of the specified LEDs are set to GPIO output mode. + */ +extern void LED_Toggle(U32 leds); + +/*! \brief Gets as a bit-field the last state of the specified LEDs set through + * the LED API. + * + * \param field LEDs of which to get the state (1 bit per LED). + * + * \return State of the specified LEDs (1 bit per LED, beginning with the first + * specified LED). + * + * \note The GPIO pin configuration of all LEDs is left unchanged. + */ +extern U32 LED_Read_Display_Field(U32 field); + +/*! \brief Sets as a bit-field the state of the specified LEDs. + * + * \param field LEDs of which to set the state (1 bit per LED). + * \param leds New state of the specified LEDs (1 bit per LED, beginning with + * the first specified LED). + * + * \note The pins of the specified LEDs are set to GPIO output mode. + */ +extern void LED_Display_Field(U32 field, U32 leds); + +/*! \brief Gets the intensity of the specified LED. + * + * \param led LED of which to get the intensity (1 bit per LED; only the least + * significant set bit is used). + * + * \return Intensity of the specified LED (0x00 to 0xFF). + * + * \warning The PWM channel of the specified LED is supposed to be used only by + * this module. + * + * \note The GPIO pin configuration of all LEDs is left unchanged. + */ +extern U8 LED_Get_Intensity(U32 led); + +/*! \brief Sets the intensity of the specified LEDs. + * + * \param leds LEDs of which to set the intensity (1 bit per LED). + * \param intensity New intensity of the specified LEDs (0x00 to 0xFF). + * + * \warning The PWM channels of the specified LEDs are supposed to be used only + * by this module. + * + * \note The pins of the specified LEDs are set to PWM output mode. + */ +extern void LED_Set_Intensity(U32 leds, U8 intensity); + + +#endif // _LED_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/evk1105.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/evk1105.h new file mode 100644 index 0000000..edda44c --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/evk1105.h @@ -0,0 +1,433 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief AT32UC3A EVK1105 board header file. + * + * This file contains definitions and services related to the features of the + * EVK1105 board rev. B. + * + * To use this board, define BOARD=EVK1105. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 AT32UC3A devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _EVK1105_H_ +#define _EVK1105_H_ + +#ifdef EVK1105_REV3 +# include "evk1105_rev3.h" +#else + +#include "compiler.h" + +#ifdef __AVR32_ABI_COMPILER__ // Automatically defined when compiling for AVR32, not when assembling. +# include "led.h" +#endif // __AVR32_ABI_COMPILER__ + + +/*! \name Oscillator Definitions + */ +//! @{ + +// RCOsc has no custom calibration by default. Set the following definition to +// the appropriate value if a custom RCOsc calibration has been applied to your +// part. +//#define FRCOSC AVR32_PM_RCOSC_FREQUENCY //!< RCOsc frequency: Hz. + +#define FOSC32 32768 //!< Osc32 frequency: Hz. +#define OSC32_STARTUP AVR32_PM_OSCCTRL32_STARTUP_8192_RCOSC //!< Osc32 startup time: RCOsc periods. + +#define FOSC0 12000000 //!< Osc0 frequency: Hz. +#define OSC0_STARTUP AVR32_PM_OSCCTRL0_STARTUP_2048_RCOSC //!< Osc0 startup time: RCOsc periods. + +#define FOSC1 11289600 //!< Osc1 frequency: Hz +#define OSC1_STARTUP AVR32_PM_OSCCTRL1_STARTUP_2048_RCOSC //!< Osc1 startup time: RCOsc periods. + + +//! @} + + +/*! \name SDRAM Definitions + */ +//! @{ + +//! Part header file of used SDRAM(s). +#define SDRAM_PART_HDR "MT48LC16M16A2TG7E/mt48lc16m16a2tg7e.h" + +//! Data bus width to use the SDRAM(s) with (16 or 32 bits; always 16 bits on +//! UC3). +#define SDRAM_DBW 16 +//! @} + + +/*! \name USB Definitions + */ +//! @{ +//! Multiplexed pin used for USB_ID: AVR32_USBB_USB_ID_x_x. +//! To be selected according to the AVR32_USBB_USB_ID_x_x_PIN and +//! AVR32_USBB_USB_ID_x_x_FUNCTION definitions from . +#define AVR32_USBB_USB_ID_0_2_PIN 21 +#define AVR32_USBB_USB_ID_0_2_FUNCTION 2 +#define USB_ID AVR32_USBB_USB_ID_0_2 + +//! Multiplexed pin used for USB_VBOF: AVR32_USBB_USB_VBOF_x_x. +//! To be selected according to the AVR32_USBB_USB_VBOF_x_x_PIN and +//! AVR32_USBB_USB_VBOF_x_x_FUNCTION definitions from . +# define USB_VBOF AVR32_USBB_USB_VBOF_0_1 + + +//! Active level of the USB_VBOF output pin. +# define USB_VBOF_ACTIVE_LEVEL LOW + +//! USB overcurrent detection pin. +# define USB_OVERCURRENT_DETECT_PIN AVR32_PIN_PX15 + +//! @} + + +//! GPIO connection of the MAC PHY PWR_DOWN/INT signal. +# define MACB_INTERRUPT_PIN AVR32_PIN_PA26 + + + +//! Number of LEDs. +#define LED_COUNT 4 + +/*! \name GPIO Connections of LEDs + */ +//! @{ +# define LED0_GPIO AVR32_PIN_PB27 +# define LED1_GPIO AVR32_PIN_PB28 +# define LED2_GPIO AVR32_PIN_PA05 +# define LED3_GPIO AVR32_PIN_PA06 +//! @} + +/*! \name Color Identifiers of LEDs to Use with LED Functions + */ +//! @{ +#define LED_MONO0_GREEN LED0 +#define LED_MONO1_GREEN LED1 +#define LED_MONO2_GREEN LED2 +#define LED_MONO3_GREEN LED3 +//! @} + +/*! \name PWM Channels of LEDs + */ +//! @{ +#define LED0_PWM 4 +#define LED1_PWM 5 +#define LED2_PWM (-1) +#define LED3_PWM (-1) +//! @} + +/*! \name PWM Functions of LEDs + */ +//! @{ +/* TODO: Implement PWM functionality */ +#define LED0_PWM_FUNCTION (-1)//AVR32_PWM_0_FUNCTION +#define LED1_PWM_FUNCTION (-1)//AVR32_PWM_1_FUNCTION +#define LED2_PWM_FUNCTION (-1) +#define LED3_PWM_FUNCTION (-1) +//! @} + +//! External interrupt connection of touch sensor. +#define QT1081_EIC_EXTINT_PIN AVR32_EIC_EXTINT_1_PIN +#define QT1081_EIC_EXTINT_FUNCTION AVR32_EIC_EXTINT_1_FUNCTION +#define QT1081_EIC_EXTINT_IRQ AVR32_EIC_IRQ_1 +#define QT1081_EIC_EXTINT_INT AVR32_EIC_INT1 +/*! \name Touch sensor low power mode select + */ +#define QT1081_LP_MODE AVR32_PIN_PB29 + +/*! \name GPIO Connections of touch buttons + */ +//! @{ +#define QT1081_TOUCH_SENSOR_0 AVR32_PIN_PB22 +#define QT1081_TOUCH_SENSOR_0_PRESSED 1 +#define QT1081_TOUCH_SENSOR_1 AVR32_PIN_PB23 +#define QT1081_TOUCH_SENSOR_1_PRESSED 1 +#define QT1081_TOUCH_SENSOR_2 AVR32_PIN_PB24 +#define QT1081_TOUCH_SENSOR_2_PRESSED 1 +#define QT1081_TOUCH_SENSOR_3 AVR32_PIN_PB25 +#define QT1081_TOUCH_SENSOR_3_PRESSED 1 +#define QT1081_TOUCH_SENSOR_4 AVR32_PIN_PB26 +#define QT1081_TOUCH_SENSOR_4_PRESSED 1 + +#define QT1081_TOUCH_SENSOR_ENTER QT1081_TOUCH_SENSOR_4 +#define QT1081_TOUCH_SENSOR_ENTER_PRESSED QT1081_TOUCH_SENSOR_4_PRESSED +#define QT1081_TOUCH_SENSOR_LEFT QT1081_TOUCH_SENSOR_3 +#define QT1081_TOUCH_SENSOR_LEFT_PRESSED QT1081_TOUCH_SENSOR_3_PRESSED +#define QT1081_TOUCH_SENSOR_RIGHT QT1081_TOUCH_SENSOR_2 +#define QT1081_TOUCH_SENSOR_RIGHT_PRESSED QT1081_TOUCH_SENSOR_2_PRESSED +#define QT1081_TOUCH_SENSOR_UP QT1081_TOUCH_SENSOR_0 +#define QT1081_TOUCH_SENSOR_UP_PRESSED QT1081_TOUCH_SENSOR_0_PRESSED +#define QT1081_TOUCH_SENSOR_DOWN QT1081_TOUCH_SENSOR_1 +#define QT1081_TOUCH_SENSOR_DOWN_PRESSED QT1081_TOUCH_SENSOR_1_PRESSED +//! @} + +/*! \name SPI Connections of the AT45DBX Data Flash Memory + */ +//! @{ +#define AT45DBX_SPI (&AVR32_SPI0) +#define AT45DBX_SPI_NPCS 0 +#define AT45DBX_SPI_SCK_PIN AVR32_SPI0_SCK_0_0_PIN +#define AT45DBX_SPI_SCK_FUNCTION AVR32_SPI0_SCK_0_0_FUNCTION +#define AT45DBX_SPI_MISO_PIN AVR32_SPI0_MISO_0_0_PIN +#define AT45DBX_SPI_MISO_FUNCTION AVR32_SPI0_MISO_0_0_FUNCTION +#define AT45DBX_SPI_MOSI_PIN AVR32_SPI0_MOSI_0_0_PIN +#define AT45DBX_SPI_MOSI_FUNCTION AVR32_SPI0_MOSI_0_0_FUNCTION +#define AT45DBX_SPI_NPCS0_PIN AVR32_SPI0_NPCS_0_0_PIN +#define AT45DBX_SPI_NPCS0_FUNCTION AVR32_SPI0_NPCS_0_0_FUNCTION +//! @} + +/*! \name GPIO and SPI Connections of the SD/MMC Connector + */ +//! @{ +#define SD_MMC_CARD_DETECT_PIN AVR32_PIN_PA02 +#define SD_MMC_WRITE_PROTECT_PIN AVR32_PIN_PA18 +#define SD_MMC_SPI (&AVR32_SPI0) +#define SD_MMC_SPI_NPCS 1 +#define SD_MMC_SPI_SCK_PIN AVR32_SPI0_SCK_0_0_PIN +#define SD_MMC_SPI_SCK_FUNCTION AVR32_SPI0_SCK_0_0_FUNCTION +#define SD_MMC_SPI_MISO_PIN AVR32_SPI0_MISO_0_0_PIN +#define SD_MMC_SPI_MISO_FUNCTION AVR32_SPI0_MISO_0_0_FUNCTION +#define SD_MMC_SPI_MOSI_PIN AVR32_SPI0_MOSI_0_0_PIN +#define SD_MMC_SPI_MOSI_FUNCTION AVR32_SPI0_MOSI_0_0_FUNCTION +#define SD_MMC_SPI_NPCS_PIN AVR32_SPI0_NPCS_1_0_PIN +#define SD_MMC_SPI_NPCS_FUNCTION AVR32_SPI0_NPCS_1_0_FUNCTION +//! @} + + +/*! \name TWI expansion + */ +//! @{ +#define EXPANSION_TWI (&AVR32_TWI) +#define EXPANSION_RESET AVR32_PIN_PX16 +#define EXPANSION_TWI_SCL_PIN AVR32_TWI_SCL_0_0_PIN +#define EXPANSION_TWI_SCL_FUNCTION AVR32_TWI_SCL_0_0_FUNCTION +#define EXPANSION_TWI_SDA_PIN AVR32_TWI_SDA_0_0_PIN +#define EXPANSION_TWI_SDA_FUNCTION AVR32_TWI_SDA_0_0_FUNCTION +//! @} + +/*! \name Wireless expansion + */ + +#define WEXPANSION_EXTINT_PIN AVR32_EIC_EXTINT_8_PIN +#define WEXPANSION_EXTINT_FUNCTION AVR32_EIC_EXTINT_8_FUNCTION +#define WEXPANSION_GPIO1 AVR32_PIN_PB30 +#define WEXPANSION_GPIO2 AVR32_PIN_PB31 + +#define WEXPANSION_SPI (&AVR32_SPI0) +#define WEXPANSION_SPI_NPCS 2 +#define WEXPANSION_SPI_SCK_PIN AVR32_SPI0_SCK_0_0_PIN +#define WEXPANSION_SPI_SCK_FUNCTION AVR32_SPI0_SCK_0_0_FUNCTION +#define WEXPANSION_SPI_MISO_PIN AVR32_SPI0_MISO_0_0_PIN +#define WEXPANSION_SPI_MISO_FUNCTION AVR32_SPI0_MISO_0_0_FUNCTION +#define WEXPANSION_SPI_MOSI_PIN AVR32_SPI0_MOSI_0_0_PIN +#define WEXPANSION_SPI_MOSI_FUNCTION AVR32_SPI0_MOSI_0_0_FUNCTION +#define WEXPANSION_SPI_NPCS_PIN AVR32_SPI0_NPCS_2_0_PIN +#define WEXPANSION_SPI_NPCS_FUNCTION AVR32_SPI0_NPCS_2_0_FUNCTION + +//! @} + +/*! \name ET024006DHU TFT display + */ +//! @{ + +#define ET024006DHU_TE_PIN AVR32_PIN_PX19 +#define ET024006DHU_RESET_PIN AVR32_PIN_PX22 +#define ET024006DHU_BL_PIN AVR32_PWM_6_PIN +#define ET024006DHU_BL_FUNCTION AVR32_PWM_6_FUNCTION +#define ET024006DHU_DNC_PIN AVR32_EBI_ADDR_21_1_PIN +#define ET024006DHU_DNC_FUNCTION AVR32_EBI_ADDR_21_1_FUNCTION +#define ET024006DHU_EBI_NCS_PIN AVR32_EBI_NCS_0_1_PIN +#define ET024006DHU_EBI_NCS_FUNCTION AVR32_EBI_NCS_0_1_FUNCTION + +//! @} +/*! \name Optional SPI connection to the TFT + */ +//! @{ + +#define ET024006DHU_SPI (&AVR32_SPI0) +#define ET024006DHU_SPI_NPCS 3 +#define ET024006DHU_SPI_SCK_PIN AVR32_SPI0_SCK_0_0_PIN +#define ET024006DHU_SPI_SCK_FUNCTION AVR32_SPI0_SCK_0_0_FUNCTION +#define ET024006DHU_SPI_MISO_PIN AVR32_SPI0_MISO_0_0_PIN +#define ET024006DHU_SPI_MISO_FUNCTION AVR32_SPI0_MISO_0_0_FUNCTION +#define ET024006DHU_SPI_MOSI_PIN AVR32_SPI0_MOSI_0_0_PIN +#define ET024006DHU_SPI_MOSI_FUNCTION AVR32_SPI0_MOSI_0_0_FUNCTION +#define ET024006DHU_SPI_NPCS_PIN AVR32_SPI1_NPCS_3_0_PIN +#define ET024006DHU_SPI_NPCS_FUNCTION AVR32_SPI1_NPCS_3_0_FUNCTION + +//! @} + + +/*! \name Audio amplifier connection to the DAC + */ +//! @{ + +#define TPA6130_ABDAC (&AVR32_ABDAC) + +#define TPA6130_DATA0_PIN AVR32_ABDAC_DATA_0_1_PIN +#define TPA6130_DATA0_FUNCTION AVR32_ABDAC_DATA_0_1_FUNCTION +#define TPA6130_DATAN0_PIN AVR32_ABDAC_DATAN_0_1_PIN +#define TPA6130_DATAN0_FUNCTION AVR32_ABDAC_DATAN_0_1_FUNCTION +#define TPA6130_DATA1_PIN AVR32_ABDAC_DATA_1_1_PIN +#define TPA6130_DATA1_FUNCTION AVR32_ABDAC_DATA_1_1_FUNCTION +#define TPA6130_DATAN1_PIN AVR32_ABDAC_DATAN_1_1_PIN +#define TPA6130_DATAN1_FUNCTION AVR32_ABDAC_DATAN_1_1_FUNCTION + +#define TPA6130_ABDAC_PDCA_PID AVR32_PDCA_PID_ABDAC_TX +#define TPA6130_ABDAC_PDCA_CHANNEL 0 +#define TPA6130_ABDAC_PDCA_IRQ AVR32_PDCA_IRQ_0 +#define TPA6130_ABDAC_PDCA_INT_LEVEL AVR32_INTC_INT3 + +#define TPA6130_TWI (&AVR32_TWI) +#define TPA6130_TWI_SCL_PIN AVR32_TWI_SCL_0_0_PIN +#define TPA6130_TWI_SCL_FUNCTION AVR32_TWI_SCL_0_0_FUNCTION +#define TPA6130_TWI_SDA_PIN AVR32_TWI_SDA_0_0_PIN +#define TPA6130_TWI_SDA_FUNCTION AVR32_TWI_SDA_0_0_FUNCTION + +//! }@ +/*! \name TI TLV320AIC23B sound chip + */ +//! @{ +#define TLV320_SSC (&AVR32_SSC) +#define TLV320_SSC_TX_CLOCK_PIN AVR32_SSC_TX_CLOCK_0_PIN +#define TLV320_SSC_TX_CLOCK_FUNCTION AVR32_SSC_TX_CLOCK_0_FUNCTION +#define TLV320_SSC_TX_DATA_PIN AVR32_SSC_TX_DATA_0_PIN +#define TLV320_SSC_TX_DATA_FUNCTION AVR32_SSC_TX_DATA_0_FUNCTION +#define TLV320_SSC_TX_FRAME_SYNC_PIN AVR32_SSC_TX_FRAME_SYNC_0_PIN +#define TLV320_SSC_TX_FRAME_SYNC_FUNCTION AVR32_SSC_TX_FRAME_SYNC_0_FUNCTION + +#define TLV320_TWI (&AVR32_TWI) +#define TLV320_TWI_SCL_PIN AVR32_TWI_SCL_0_0_PIN +#define TLV320_TWI_SCL_FUNCTION AVR32_TWI_SCL_0_0_FUNCTION +#define TLV320_TWI_SDA_PIN AVR32_TWI_SDA_0_0_PIN +#define TLV320_TWI_SDA_FUNCTION AVR32_TWI_SDA_0_0_FUNCTION + +#define TLV320_PM_GCLK_PIN AVR32_PM_GCLK_0_0_PIN +#define TLV320_PM_GCLK_FUNCTION AVR32_PM_GCLK_0_0_FUNCTION +//! @} + +////! \name SPI: Apple Authentication Chip Hardware Connections +////! @{ +#define IPOD_AUTH_CHIP_SPI (&AVR32_SPI0) +#define IPOD_AUTH_CHIP_SPI_IRQ AVR32_SPI0_IRQ +#define IPOD_AUTH_CHIP_SPI_NPCS 2 +#define IPOD_AUTH_CHIP_SPI_SCK_PIN AVR32_SPI0_SCK_0_0_PIN +#define IPOD_AUTH_CHIP_SPI_SCK_FUNCTION AVR32_SPI0_SCK_0_0_FUNCTION +#define IPOD_AUTH_CHIP_SPI_MISO_PIN AVR32_SPI0_MISO_0_0_PIN +#define IPOD_AUTH_CHIP_SPI_MISO_FUNCTION AVR32_SPI0_MISO_0_0_FUNCTION +#define IPOD_AUTH_CHIP_SPI_MOSI_PIN AVR32_SPI0_MOSI_0_0_PIN +#define IPOD_AUTH_CHIP_SPI_MOSI_FUNCTION AVR32_SPI0_MOSI_0_0_FUNCTION +#define IPOD_AUTH_CHIP_SPI_NPCS_PIN AVR32_SPI0_NPCS_2_0_PIN +#define IPOD_AUTH_CHIP_SPI_NPCS_FUNCTION AVR32_SPI0_NPCS_2_0_FUNCTION +#define IPOD_AUTH_CHIP_SPI_N_RESET_PIN AVR32_PIN_PB30 +#define IPOD_AUTH_CHIP_SPI_CP_READY_PIN AVR32_PIN_PB31 +//! }@ + +/*! \name Connections of the iPOD Authentication Coprocessor + */ +//! @{ + +#define IPOD_AUTH_CHIP_TWI (&AVR32_TWI) +#define IPOD_AUTH_CHIP_TWI_SCL_PIN AVR32_TWI_SCL_0_0_PIN +#define IPOD_AUTH_CHIP_TWI_SCL_FUNCTION AVR32_TWI_SCL_0_0_FUNCTION +#define IPOD_AUTH_CHIP_TWI_SDA_PIN AVR32_TWI_SDA_0_0_PIN +#define IPOD_AUTH_CHIP_TWI_SDA_FUNCTION AVR32_TWI_SDA_0_0_FUNCTION +#define IPOD_AUTH_CHIP_TWI_N_RESET_PIN AVR32_PIN_PX16 + +//! @} + +/*! \name USART connection to the UC3B board controller + */ +//! @{ + +#define USART0_RXD_PIN AVR32_USART0_RXD_0_0_PIN +#define USART0_RXD_FUNCTION AVR32_USART0_RXD_0_0_FUNCTION +#define USART0_TXD_PIN AVR32_USART0_TXD_0_0_PIN +#define USART0_TXD_FUNCTION AVR32_USART0_TXD_0_0_FUNCTION +#define USART0_RTS_PIN AVR32_USART0_RTS_0_0_PIN +#define USART0_RTS_FUNCTION AVR32_USART0_RTS_0_0_FUNCTION +#define USART0_CTS_PIN AVR32_USART0_CTS_0_0_PIN +#define USART0_CTS_FUNCTION AVR32_USART0_CTS_0_0_FUNCTION + +//! @} + +#define ADC_VEXT_PIN AVR32_ADC_AD_7_PIN +#define ADC_VEXT_FUNCTION AVR32_ADC_AD_7_FUNCTION + +/*! \name LCD Connections of the ET024006DHU display + */ +//! @{ +#define ET024006DHU_SMC_USE_NCS 0 +#define ET024006DHU_SMC_COMPONENT_CS "smc_et024006dhu.h" + +#define ET024006DHU_EBI_DATA_0 AVR32_EBI_DATA_0 +#define ET024006DHU_EBI_DATA_1 AVR32_EBI_DATA_1 +#define ET024006DHU_EBI_DATA_2 AVR32_EBI_DATA_2 +#define ET024006DHU_EBI_DATA_3 AVR32_EBI_DATA_3 +#define ET024006DHU_EBI_DATA_4 AVR32_EBI_DATA_4 +#define ET024006DHU_EBI_DATA_5 AVR32_EBI_DATA_5 +#define ET024006DHU_EBI_DATA_6 AVR32_EBI_DATA_6 +#define ET024006DHU_EBI_DATA_7 AVR32_EBI_DATA_7 +#define ET024006DHU_EBI_DATA_8 AVR32_EBI_DATA_8 +#define ET024006DHU_EBI_DATA_9 AVR32_EBI_DATA_9 +#define ET024006DHU_EBI_DATA_10 AVR32_EBI_DATA_10 +#define ET024006DHU_EBI_DATA_11 AVR32_EBI_DATA_11 +#define ET024006DHU_EBI_DATA_12 AVR32_EBI_DATA_12 +#define ET024006DHU_EBI_DATA_13 AVR32_EBI_DATA_13 +#define ET024006DHU_EBI_DATA_14 AVR32_EBI_DATA_14 +#define ET024006DHU_EBI_DATA_15 AVR32_EBI_DATA_15 + +#define ET024006DHU_EBI_ADDR_21 AVR32_EBI_ADDR_21_1 + +#define ET024006DHU_EBI_NWE AVR32_EBI_NWE0_0 +#define ET024006DHU_EBI_NRD AVR32_EBI_NRD_0 +#define ET024006DHU_EBI_NCS AVR32_EBI_NCS_0_1 +//! @} + + +#endif // !EVK1105_REVA + +#endif // _EVK1105_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/led.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/led.c new file mode 100644 index 0000000..561652a --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/led.c @@ -0,0 +1,346 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief AT32UC3A EVK1105 board LEDs support package. + * + * This file contains definitions and services related to the LED features of + * the EVK1105 board. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 AT32UC3A devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#include +#include "preprocessor.h" +#include "compiler.h" +#include "evk1105.h" +#include "led.h" + + +//! Structure describing LED hardware connections. +typedef const struct +{ + struct + { + U32 PORT; //!< LED GPIO port. + U32 PIN_MASK; //!< Bit-mask of LED pin in GPIO port. + } GPIO; //!< LED GPIO descriptor. + struct + { + S32 CHANNEL; //!< LED PWM channel (< 0 if N/A). + S32 FUNCTION; //!< LED pin PWM function (< 0 if N/A). + } PWM; //!< LED PWM descriptor. +} tLED_DESCRIPTOR; + + +//! Hardware descriptors of all LEDs. +static tLED_DESCRIPTOR LED_DESCRIPTOR[LED_COUNT] = +{ +#define INSERT_LED_DESCRIPTOR(LED_NO, unused) \ + { \ + {LED##LED_NO##_GPIO / 32, 1 << (LED##LED_NO##_GPIO % 32)},\ + {LED##LED_NO##_PWM, LED##LED_NO##_PWM_FUNCTION } \ + }, + MREPEAT(LED_COUNT, INSERT_LED_DESCRIPTOR, ~) +#undef INSERT_LED_DESCRIPTOR +}; + + +//! Saved state of all LEDs. +static volatile U32 LED_State = (1 << LED_COUNT) - 1; + + +U32 LED_Read_Display(void) +{ + return LED_State; +} + + +void LED_Display(U32 leds) +{ + // Use the LED descriptors to get the connections of a given LED to the MCU. + tLED_DESCRIPTOR *led_descriptor; + volatile avr32_gpio_port_t *led_gpio_port; + + // Make sure only existing LEDs are specified. + leds &= (1 << LED_COUNT) - 1; + + // Update the saved state of all LEDs with the requested changes. + LED_State = leds; + + // For all LEDs... + for (led_descriptor = &LED_DESCRIPTOR[0]; + led_descriptor < LED_DESCRIPTOR + LED_COUNT; + led_descriptor++) + { + // Set the LED to the requested state. + led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; + if (leds & 1) + { + led_gpio_port->ovrc = led_descriptor->GPIO.PIN_MASK; + } + else + { + led_gpio_port->ovrs = led_descriptor->GPIO.PIN_MASK; + } + led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; + led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; + leds >>= 1; + } +} + + +U32 LED_Read_Display_Mask(U32 mask) +{ + return Rd_bits(LED_State, mask); +} + + +void LED_Display_Mask(U32 mask, U32 leds) +{ + // Use the LED descriptors to get the connections of a given LED to the MCU. + tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; + volatile avr32_gpio_port_t *led_gpio_port; + U8 led_shift; + + // Make sure only existing LEDs are specified. + mask &= (1 << LED_COUNT) - 1; + + // Update the saved state of all LEDs with the requested changes. + Wr_bits(LED_State, mask, leds); + + // While there are specified LEDs left to manage... + while (mask) + { + // Select the next specified LED and set it to the requested state. + led_shift = 1 + ctz(mask); + led_descriptor += led_shift; + led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; + leds >>= led_shift - 1; + if (leds & 1) + { + led_gpio_port->ovrc = led_descriptor->GPIO.PIN_MASK; + } + else + { + led_gpio_port->ovrs = led_descriptor->GPIO.PIN_MASK; + } + led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; + led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; + leds >>= 1; + mask >>= led_shift; + } +} + + +Bool LED_Test(U32 leds) +{ + return Tst_bits(LED_State, leds); +} + + +void LED_Off(U32 leds) +{ + // Use the LED descriptors to get the connections of a given LED to the MCU. + tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; + volatile avr32_gpio_port_t *led_gpio_port; + U8 led_shift; + + // Make sure only existing LEDs are specified. + leds &= (1 << LED_COUNT) - 1; + + // Update the saved state of all LEDs with the requested changes. + Clr_bits(LED_State, leds); + + // While there are specified LEDs left to manage... + while (leds) + { + // Select the next specified LED and turn it off. + led_shift = 1 + ctz(leds); + led_descriptor += led_shift; + led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; + led_gpio_port->ovrs = led_descriptor->GPIO.PIN_MASK; + led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; + led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; + leds >>= led_shift; + } +} + + +void LED_On(U32 leds) +{ + // Use the LED descriptors to get the connections of a given LED to the MCU. + tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; + volatile avr32_gpio_port_t *led_gpio_port; + U8 led_shift; + + // Make sure only existing LEDs are specified. + leds &= (1 << LED_COUNT) - 1; + + // Update the saved state of all LEDs with the requested changes. + Set_bits(LED_State, leds); + + // While there are specified LEDs left to manage... + while (leds) + { + // Select the next specified LED and turn it on. + led_shift = 1 + ctz(leds); + led_descriptor += led_shift; + led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; + led_gpio_port->ovrc = led_descriptor->GPIO.PIN_MASK; + led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; + led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; + leds >>= led_shift; + } +} + + +void LED_Toggle(U32 leds) +{ + // Use the LED descriptors to get the connections of a given LED to the MCU. + tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; + volatile avr32_gpio_port_t *led_gpio_port; + U8 led_shift; + + // Make sure only existing LEDs are specified. + leds &= (1 << LED_COUNT) - 1; + + // Update the saved state of all LEDs with the requested changes. + Tgl_bits(LED_State, leds); + + // While there are specified LEDs left to manage... + while (leds) + { + // Select the next specified LED and toggle it. + led_shift = 1 + ctz(leds); + led_descriptor += led_shift; + led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; + led_gpio_port->ovrt = led_descriptor->GPIO.PIN_MASK; + led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; + led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; + leds >>= led_shift; + } +} + + +U32 LED_Read_Display_Field(U32 field) +{ + return Rd_bitfield(LED_State, field); +} + + +void LED_Display_Field(U32 field, U32 leds) +{ + // Move the bit-field to the appropriate position for the bit-mask. + LED_Display_Mask(field, leds << ctz(field)); +} + + +U8 LED_Get_Intensity(U32 led) +{ + tLED_DESCRIPTOR *led_descriptor; + + // Check that the argument value is valid. + led = ctz(led); + led_descriptor = &LED_DESCRIPTOR[led]; + if (led >= LED_COUNT || led_descriptor->PWM.CHANNEL < 0) return 0; + + // Return the duty cycle value if the LED PWM channel is enabled, else 0. + return (AVR32_PWM.sr & (1 << led_descriptor->PWM.CHANNEL)) ? + AVR32_PWM.channel[led_descriptor->PWM.CHANNEL].cdty : 0; +} + + +void LED_Set_Intensity(U32 leds, U8 intensity) +{ + tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; + volatile avr32_pwm_channel_t *led_pwm_channel; + volatile avr32_gpio_port_t *led_gpio_port; + U8 led_shift; + + // For each specified LED... + for (leds &= (1 << LED_COUNT) - 1; leds; leds >>= led_shift) + { + // Select the next specified LED and check that it has a PWM channel. + led_shift = 1 + ctz(leds); + led_descriptor += led_shift; + if (led_descriptor->PWM.CHANNEL < 0) continue; + + // Initialize or update the LED PWM channel. + led_pwm_channel = &AVR32_PWM.channel[led_descriptor->PWM.CHANNEL]; + if (!(AVR32_PWM.sr & (1 << led_descriptor->PWM.CHANNEL))) + { + led_pwm_channel->cmr = (AVR32_PWM_CPRE_MCK << AVR32_PWM_CPRE_OFFSET) & + ~(AVR32_PWM_CALG_MASK | + AVR32_PWM_CPOL_MASK | + AVR32_PWM_CPD_MASK); + led_pwm_channel->cprd = 0x000000FF; + led_pwm_channel->cdty = intensity; + AVR32_PWM.ena = 1 << led_descriptor->PWM.CHANNEL; + } + else + { + AVR32_PWM.isr; + while (!(AVR32_PWM.isr & (1 << led_descriptor->PWM.CHANNEL))); + led_pwm_channel->cupd = intensity; + } + + // Switch the LED pin to its PWM function. + led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; + if (led_descriptor->PWM.FUNCTION & 0x1) + { + led_gpio_port->pmr0s = led_descriptor->GPIO.PIN_MASK; + } + else + { + led_gpio_port->pmr0c = led_descriptor->GPIO.PIN_MASK; + } + if (led_descriptor->PWM.FUNCTION & 0x2) + { + led_gpio_port->pmr1s = led_descriptor->GPIO.PIN_MASK; + } + else + { + led_gpio_port->pmr1c = led_descriptor->GPIO.PIN_MASK; + } + led_gpio_port->gperc = led_descriptor->GPIO.PIN_MASK; + } +} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/led.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/led.h new file mode 100644 index 0000000..7766b6a --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/led.h @@ -0,0 +1,187 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief AT32UC3A EVK1105 board LEDs support package. + * + * This file contains definitions and services related to the LED features of + * the EVK1105 board. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 AT32UC3A devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _LED_H_ +#define _LED_H_ + +#include "compiler.h" + + +/*! \name Identifiers of LEDs to Use with LED Functions + */ +//! @{ +#define LED0 0x01 +#define LED1 0x02 +#define LED2 0x04 +#define LED3 0x08 +//! @} + + +/*! \brief Gets the last state of all LEDs set through the LED API. + * + * \return State of all LEDs (1 bit per LED). + * + * \note The GPIO pin configuration of all LEDs is left unchanged. + */ +extern U32 LED_Read_Display(void); + +/*! \brief Sets the state of all LEDs. + * + * \param leds New state of all LEDs (1 bit per LED). + * + * \note The pins of all LEDs are set to GPIO output mode. + */ +extern void LED_Display(U32 leds); + +/*! \brief Gets the last state of the specified LEDs set through the LED API. + * + * \param mask LEDs of which to get the state (1 bit per LED). + * + * \return State of the specified LEDs (1 bit per LED). + * + * \note The GPIO pin configuration of all LEDs is left unchanged. + */ +extern U32 LED_Read_Display_Mask(U32 mask); + +/*! \brief Sets the state of the specified LEDs. + * + * \param mask LEDs of which to set the state (1 bit per LED). + * + * \param leds New state of the specified LEDs (1 bit per LED). + * + * \note The pins of the specified LEDs are set to GPIO output mode. + */ +extern void LED_Display_Mask(U32 mask, U32 leds); + +/*! \brief Tests the last state of the specified LEDs set through the LED API. + * + * \param leds LEDs of which to test the state (1 bit per LED). + * + * \return \c TRUE if at least one of the specified LEDs has a state on, else + * \c FALSE. + * + * \note The GPIO pin configuration of all LEDs is left unchanged. + */ +extern Bool LED_Test(U32 leds); + +/*! \brief Turns off the specified LEDs. + * + * \param leds LEDs to turn off (1 bit per LED). + * + * \note The pins of the specified LEDs are set to GPIO output mode. + */ +extern void LED_Off(U32 leds); + +/*! \brief Turns on the specified LEDs. + * + * \param leds LEDs to turn on (1 bit per LED). + * + * \note The pins of the specified LEDs are set to GPIO output mode. + */ +extern void LED_On(U32 leds); + +/*! \brief Toggles the specified LEDs. + * + * \param leds LEDs to toggle (1 bit per LED). + * + * \note The pins of the specified LEDs are set to GPIO output mode. + */ +extern void LED_Toggle(U32 leds); + +/*! \brief Gets as a bit-field the last state of the specified LEDs set through + * the LED API. + * + * \param field LEDs of which to get the state (1 bit per LED). + * + * \return State of the specified LEDs (1 bit per LED, beginning with the first + * specified LED). + * + * \note The GPIO pin configuration of all LEDs is left unchanged. + */ +extern U32 LED_Read_Display_Field(U32 field); + +/*! \brief Sets as a bit-field the state of the specified LEDs. + * + * \param field LEDs of which to set the state (1 bit per LED). + * \param leds New state of the specified LEDs (1 bit per LED, beginning with + * the first specified LED). + * + * \note The pins of the specified LEDs are set to GPIO output mode. + */ +extern void LED_Display_Field(U32 field, U32 leds); + +/*! \brief Gets the intensity of the specified LED. + * + * \param led LED of which to get the intensity (1 bit per LED; only the least + * significant set bit is used). + * + * \return Intensity of the specified LED (0x00 to 0xFF). + * + * \warning The PWM channel of the specified LED is supposed to be used only by + * this module. + * + * \note The GPIO pin configuration of all LEDs is left unchanged. + */ +extern U8 LED_Get_Intensity(U32 led); + +/*! \brief Sets the intensity of the specified LEDs. + * + * \param leds LEDs of which to set the intensity (1 bit per LED). + * \param intensity New intensity of the specified LEDs (0x00 to 0xFF). + * + * \warning The PWM channels of the specified LEDs are supposed to be used only + * by this module. + * + * \note The pins of the specified LEDs are set to PWM output mode. + */ +extern void LED_Set_Intensity(U32 leds, U8 intensity); + + +#endif // _LED_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/board.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/board.h new file mode 100644 index 0000000..78ee91e --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/board.h @@ -0,0 +1,120 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Standard board header file. + * + * This file includes the appropriate board header file according to the + * defined board. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include + +/*! \name Base Boards + */ +//! @{ +#define EVK1100 1 //!< AT32UC3A EVK1100 board. +#define EVK1101 2 //!< AT32UC3B EVK1101 board. +#define UC3C_EK 3 //!< AT32UC3C UC3C_EK board. +#define EVK1104 4 //!< AT32UC3A3 EVK1104 board. +#define EVK1105 5 //!< AT32UC3A EVK1105 board. +#define STK1000 6 //!< AT32AP7000 STK1000 board. +#define NGW100 7 //!< AT32AP7000 NGW100 board. +#define STK600_RCUC3L0 8 //!< STK600 RCUC3L0 board. +#define UC3L_EK 9 //!< AT32UC3L-EK board. +#define USER_BOARD 99 //!< User-reserved board (if any). +//! @} + +/*! \name Extension Boards + */ +//! @{ +#define EXT1102 1 //!< AT32UC3B EXT1102 board. +#define MC300 2 //!< AT32UC3 MC300 board. +#define USER_EXT_BOARD 99 //!< User-reserved extension board (if any). +//! @} + +#if BOARD == EVK1100 + #include "EVK1100/evk1100.h" +#elif BOARD == EVK1101 + #include "EVK1101/evk1101.h" +#elif BOARD == UC3C_EK + #include "UC3C_EK/uc3c_ek.h" +#elif BOARD == EVK1104 + #include "EVK1104/evk1104.h" +#elif BOARD == EVK1105 + #include "EVK1105/evk1105.h" +#elif BOARD == STK1000 + #include "STK1000/stk1000.h" +#elif BOARD == NGW100 + #include "NGW100/ngw100.h" +#elif BOARD == STK600_RCUC3L0 + #include "STK600/RCUC3L0/stk600_rcuc3l0.h" +#elif BOARD == UC3L_EK + #include "UC3L_EK/uc3l_ek.h" +#elif BOARD == ARDUINO + #include "ARDUINO/arduino.h" +#else + #error No known AVR32 board defined +#endif + +#if (defined EXT_BOARD) + #if EXT_BOARD == EXT1102 + #include "EXT1102/ext1102.h" + #elif EXT_BOARD == MC300 + #include "MC300/mc300.h" + #elif EXT_BOARD == USER_EXT_BOARD + // User-reserved area: #include the header file of your extension board here + // (if any). + #endif +#endif + + +#ifndef FRCOSC + #define FRCOSC AVR32_PM_RCOSC_FREQUENCY //!< Default RCOsc frequency. +#endif + + +#endif // _BOARD_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/board.h.my b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/board.h.my new file mode 100644 index 0000000..78ee91e --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/BOARDS/board.h.my @@ -0,0 +1,120 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Standard board header file. + * + * This file includes the appropriate board header file according to the + * defined board. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include + +/*! \name Base Boards + */ +//! @{ +#define EVK1100 1 //!< AT32UC3A EVK1100 board. +#define EVK1101 2 //!< AT32UC3B EVK1101 board. +#define UC3C_EK 3 //!< AT32UC3C UC3C_EK board. +#define EVK1104 4 //!< AT32UC3A3 EVK1104 board. +#define EVK1105 5 //!< AT32UC3A EVK1105 board. +#define STK1000 6 //!< AT32AP7000 STK1000 board. +#define NGW100 7 //!< AT32AP7000 NGW100 board. +#define STK600_RCUC3L0 8 //!< STK600 RCUC3L0 board. +#define UC3L_EK 9 //!< AT32UC3L-EK board. +#define USER_BOARD 99 //!< User-reserved board (if any). +//! @} + +/*! \name Extension Boards + */ +//! @{ +#define EXT1102 1 //!< AT32UC3B EXT1102 board. +#define MC300 2 //!< AT32UC3 MC300 board. +#define USER_EXT_BOARD 99 //!< User-reserved extension board (if any). +//! @} + +#if BOARD == EVK1100 + #include "EVK1100/evk1100.h" +#elif BOARD == EVK1101 + #include "EVK1101/evk1101.h" +#elif BOARD == UC3C_EK + #include "UC3C_EK/uc3c_ek.h" +#elif BOARD == EVK1104 + #include "EVK1104/evk1104.h" +#elif BOARD == EVK1105 + #include "EVK1105/evk1105.h" +#elif BOARD == STK1000 + #include "STK1000/stk1000.h" +#elif BOARD == NGW100 + #include "NGW100/ngw100.h" +#elif BOARD == STK600_RCUC3L0 + #include "STK600/RCUC3L0/stk600_rcuc3l0.h" +#elif BOARD == UC3L_EK + #include "UC3L_EK/uc3l_ek.h" +#elif BOARD == ARDUINO + #include "ARDUINO/arduino.h" +#else + #error No known AVR32 board defined +#endif + +#if (defined EXT_BOARD) + #if EXT_BOARD == EXT1102 + #include "EXT1102/ext1102.h" + #elif EXT_BOARD == MC300 + #include "MC300/mc300.h" + #elif EXT_BOARD == USER_EXT_BOARD + // User-reserved area: #include the header file of your extension board here + // (if any). + #endif +#endif + + +#ifndef FRCOSC + #define FRCOSC AVR32_PM_RCOSC_FREQUENCY //!< Default RCOsc frequency. +#endif + + +#endif // _BOARD_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx.c new file mode 100644 index 0000000..93d3dd9 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx.c @@ -0,0 +1,653 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Management of the AT45DBX data flash controller through SPI. + * + * This file manages the accesses to the AT45DBX data flash components. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with an SPI module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +//_____ I N C L U D E S ___________________________________________________ + +#include "conf_access.h" + + +#if AT45DBX_MEM == ENABLE + +#include "compiler.h" +#include "board.h" +#include "gpio.h" +#include "spi.h" +#include "conf_at45dbx.h" +#include "at45dbx.h" + + +#if AT45DBX_MEM_CNT > 4 + #error AT45DBX_MEM_CNT must not exceed 4 +#endif + + +//_____ D E F I N I T I O N S ______________________________________________ + +/*! \name AT45DBX Group A Commands + */ +//! @{ +#define AT45DBX_CMDA_RD_PAGE 0xD2 //!< Main Memory Page Read (Serial/8-bit Mode). +#define AT45DBX_CMDA_RD_ARRAY_LEG 0xE8 //!< Continuous Array Read, Legacy Command (Serial/8-bit Mode). +#define AT45DBX_CMDA_RD_ARRAY_LF_SM 0x03 //!< Continuous Array Read, Low-Frequency Mode (Serial Mode). +#define AT45DBX_CMDA_RD_ARRAY_AF_SM 0x0B //!< Continuous Array Read, Any-Frequency Mode (Serial Mode). +#define AT45DBX_CMDA_RD_SECTOR_PROT_REG 0x32 //!< Read Sector Protection Register (Serial/8-bit Mode). +#define AT45DBX_CMDA_RD_SECTOR_LKDN_REG 0x35 //!< Read Sector Lockdown Register (Serial/8-bit Mode). +#define AT45DBX_CMDA_RD_SECURITY_REG 0x77 //!< Read Security Register (Serial/8-bit Mode). +//! @} + +/*! \name AT45DBX Group B Commands + */ +//! @{ +#define AT45DBX_CMDB_ER_PAGE 0x81 //!< Page Erase (Serial/8-bit Mode). +#define AT45DBX_CMDB_ER_BLOCK 0x50 //!< Block Erase (Serial/8-bit Mode). +#define AT45DBX_CMDB_ER_SECTOR 0x7C //!< Sector Erase (Serial/8-bit Mode). +#define AT45DBX_CMDB_ER_CHIP 0xC794809A //!< Chip Erase (Serial/8-bit Mode). +#define AT45DBX_CMDB_XFR_PAGE_TO_BUF1 0x53 //!< Main Memory Page to Buffer 1 Transfer (Serial/8-bit Mode). +#define AT45DBX_CMDB_XFR_PAGE_TO_BUF2 0x55 //!< Main Memory Page to Buffer 2 Transfer (Serial/8-bit Mode). +#define AT45DBX_CMDB_CMP_PAGE_TO_BUF1 0x60 //!< Main Memory Page to Buffer 1 Compare (Serial/8-bit Mode). +#define AT45DBX_CMDB_CMP_PAGE_TO_BUF2 0x61 //!< Main Memory Page to Buffer 2 Compare (Serial/8-bit Mode). +#define AT45DBX_CMDB_PR_BUF1_TO_PAGE_ER 0x83 //!< Buffer 1 to Main Memory Page Program with Built-in Erase (Serial/8-bit Mode). +#define AT45DBX_CMDB_PR_BUF2_TO_PAGE_ER 0x86 //!< Buffer 2 to Main Memory Page Program with Built-in Erase (Serial/8-bit Mode). +#define AT45DBX_CMDB_PR_BUF1_TO_PAGE 0x88 //!< Buffer 1 to Main Memory Page Program without Built-in Erase (Serial/8-bit Mode). +#define AT45DBX_CMDB_PR_BUF2_TO_PAGE 0x89 //!< Buffer 2 to Main Memory Page Program without Built-in Erase (Serial/8-bit Mode). +#define AT45DBX_CMDB_PR_PAGE_TH_BUF1 0x82 //!< Main Memory Page Program through Buffer 1 (Serial/8-bit Mode). +#define AT45DBX_CMDB_PR_PAGE_TH_BUF2 0x85 //!< Main Memory Page Program through Buffer 2 (Serial/8-bit Mode). +#define AT45DBX_CMDB_RWR_PAGE_TH_BUF1 0x58 //!< Auto Page Rewrite through Buffer 1 (Serial/8-bit Mode). +#define AT45DBX_CMDB_RWR_PAGE_TH_BUF2 0x59 //!< Auto Page Rewrite through Buffer 2 (Serial/8-bit Mode). +//! @} + +/*! \name AT45DBX Group C Commands + */ +//! @{ +#define AT45DBX_CMDC_RD_BUF1_LF_SM 0xD1 //!< Buffer 1 Read, Low-Frequency Mode (Serial Mode). +#define AT45DBX_CMDC_RD_BUF2_LF_SM 0xD3 //!< Buffer 2 Read, Low-Frequency Mode (Serial Mode). +#define AT45DBX_CMDC_RD_BUF1_AF_SM 0xD4 //!< Buffer 1 Read, Any-Frequency Mode (Serial Mode). +#define AT45DBX_CMDC_RD_BUF2_AF_SM 0xD6 //!< Buffer 2 Read, Any-Frequency Mode (Serial Mode). +#define AT45DBX_CMDC_RD_BUF1_AF_8M 0x54 //!< Buffer 1 Read, Any-Frequency Mode (8-bit Mode). +#define AT45DBX_CMDC_RD_BUF2_AF_8M 0x56 //!< Buffer 2 Read, Any-Frequency Mode (8-bit Mode). +#define AT45DBX_CMDC_WR_BUF1 0x84 //!< Buffer 1 Write (Serial/8-bit Mode). +#define AT45DBX_CMDC_WR_BUF2 0x87 //!< Buffer 2 Write (Serial/8-bit Mode). +#define AT45DBX_CMDC_RD_STATUS_REG 0xD7 //!< Status Register Read (Serial/8-bit Mode). +#define AT45DBX_CMDC_RD_MNFCT_DEV_ID_SM 0x9F //!< Manufacturer and Device ID Read (Serial Mode). +//! @} + +/*! \name AT45DBX Group D Commands + */ +//! @{ +#define AT45DBX_CMDD_EN_SECTOR_PROT 0x3D2A7FA9 //!< Enable Sector Protection (Serial/8-bit Mode). +#define AT45DBX_CMDD_DIS_SECTOR_PROT 0x3D2A7F9A //!< Disable Sector Protection (Serial/8-bit Mode). +#define AT45DBX_CMDD_ER_SECTOR_PROT_REG 0x3D2A7FCF //!< Erase Sector Protection Register (Serial/8-bit Mode). +#define AT45DBX_CMDD_PR_SECTOR_PROT_REG 0x3D2A7FFC //!< Program Sector Protection Register (Serial/8-bit Mode). +#define AT45DBX_CMDD_LKDN_SECTOR 0x3D2A7F30 //!< Sector Lockdown (Serial/8-bit Mode). +#define AT45DBX_CMDD_PR_SECURITY_REG 0x9B000000 //!< Program Security Register (Serial/8-bit Mode). +#define AT45DBX_CMDD_PR_CONF_REG 0x3D2A80A6 //!< Program Configuration Register (Serial/8-bit Mode). +#define AT45DBX_CMDD_DEEP_PWR_DN 0xB9 //!< Deep Power-down (Serial/8-bit Mode). +#define AT45DBX_CMDD_RSM_DEEP_PWR_DN 0xAB //!< Resume from Deep Power-down (Serial/8-bit Mode). +//! @} + + +/*! \name Bit-Masks and Values for the Status Register + */ +//! @{ +#define AT45DBX_MSK_BUSY 0x80 //!< Busy status bit-mask. +#define AT45DBX_BUSY 0x00 //!< Busy status value (0x00 when busy, 0x80 when ready). +#define AT45DBX_MSK_DENSITY 0x3C //!< Device density bit-mask. +//! @} +#if AT45DBX_MEM_SIZE == AT45DBX_1MB + +/*! \name AT45DB081 Memories + */ +//! @{ +#define AT45DBX_DENSITY 0x24 //!< Device density value. +#define AT45DBX_BYTE_ADDR_BITS 9 //!< Address bits for byte position within buffer. + +//! @} +#elif AT45DBX_MEM_SIZE == AT45DBX_2MB + +/*! \name AT45DB161 Memories + */ +//! @{ +#define AT45DBX_DENSITY 0x2C //!< Device density value. +#define AT45DBX_BYTE_ADDR_BITS 10 //!< Address bits for byte position within buffer. +//! @} + +#elif AT45DBX_MEM_SIZE == AT45DBX_4MB + +/*! \name AT45DB321 Memories + */ +//! @{ +#define AT45DBX_DENSITY 0x34 //!< Device density value. +#define AT45DBX_BYTE_ADDR_BITS 10 //!< Address bits for byte position within buffer. +//! @} + +#elif AT45DBX_MEM_SIZE == AT45DBX_8MB + +/*! \name AT45DB642 Memories + */ +//! @{ +#define AT45DBX_DENSITY 0x3C //!< Device density value. +#define AT45DBX_BYTE_ADDR_BITS 11 //!< Address bits for byte position within buffer. +//! @} + +#else + #error AT45DBX_MEM_SIZE is not defined to a supported value +#endif + +//! Address bits for page selection. +#define AT45DBX_PAGE_ADDR_BITS (AT45DBX_MEM_SIZE - AT45DBX_PAGE_BITS) + +//! Number of bits for addresses within pages. +#define AT45DBX_PAGE_BITS (AT45DBX_BYTE_ADDR_BITS - 1) + +//! Page size in bytes. +#define AT45DBX_PAGE_SIZE (1 << AT45DBX_PAGE_BITS) + +//! Bit-mask for byte position within buffer in \ref gl_ptr_mem. +#define AT45DBX_MSK_PTR_BYTE ((1 << AT45DBX_PAGE_BITS) - 1) + +//! Bit-mask for page selection in \ref gl_ptr_mem. +#define AT45DBX_MSK_PTR_PAGE (((1 << AT45DBX_PAGE_ADDR_BITS) - 1) << AT45DBX_PAGE_BITS) + +//! Bit-mask for byte position within sector in \ref gl_ptr_mem. +#define AT45DBX_MSK_PTR_SECTOR ((1 << AT45DBX_SECTOR_BITS) - 1) + + +/*! \brief Sends a dummy byte through SPI. + */ +#define spi_write_dummy() spi_write(AT45DBX_SPI, 0xFF) + + +//! Boolean indicating whether memory is in busy state. +static Bool at45dbx_busy; + +//! Memory data pointer. +static U32 gl_ptr_mem; + +//! Sector buffer. +static U8 sector_buf[AT45DBX_SECTOR_SIZE]; + + +/*! \name Control Functions + */ +//! @{ + + +Bool at45dbx_init(spi_options_t spiOptions, unsigned int pba_hz) +{ + // Setup SPI registers according to spiOptions. + for (spiOptions.reg = AT45DBX_SPI_FIRST_NPCS; + spiOptions.reg < AT45DBX_SPI_FIRST_NPCS + AT45DBX_MEM_CNT; + spiOptions.reg++) + { + if (spi_setupChipReg(AT45DBX_SPI, &spiOptions, pba_hz) != SPI_OK) return KO; + } + + // Memory ready. + at45dbx_busy = FALSE; + + return OK; +} + + +/*! \brief Selects or unselects a DF memory. + * + * \param memidx Memory ID of DF to select or unselect. + * \param bSelect Boolean indicating whether the DF memory has to be selected. + */ +static void at45dbx_chipselect_df(U8 memidx, Bool bSelect) +{ + if (bSelect) + { + // Select SPI chip. + spi_selectChip(AT45DBX_SPI, AT45DBX_SPI_FIRST_NPCS + memidx); + } + else + { + // Unselect SPI chip. + spi_unselectChip(AT45DBX_SPI, AT45DBX_SPI_FIRST_NPCS + memidx); + } +} + + +Bool at45dbx_mem_check(void) +{ + U8 df; + U16 status = 0; + + // DF memory check. + for (df = 0; df < AT45DBX_MEM_CNT; df++) + { + // Select the DF memory to check. + at45dbx_chipselect_df(df, TRUE); + + // Send the Status Register Read command. + spi_write(AT45DBX_SPI, AT45DBX_CMDC_RD_STATUS_REG); + + // Send a dummy byte to read the status register. + spi_write_dummy(); + spi_read(AT45DBX_SPI, &status); + + // Unselect the checked DF memory. + at45dbx_chipselect_df(df, FALSE); + + // Unexpected device density value. + if ((status & AT45DBX_MSK_DENSITY) < AT45DBX_DENSITY) return KO; + } + + return OK; +} + + +/*! \brief Waits until the DF is ready. + */ +static void at45dbx_wait_ready(void) +{ + U16 status; + + // Select the DF memory gl_ptr_mem points to. + at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, TRUE); + + // Send the Status Register Read command. + spi_write(AT45DBX_SPI, AT45DBX_CMDC_RD_STATUS_REG); + + // Read the status register until the DF is ready. + do + { + // Send a dummy byte to read the status register. + spi_write_dummy(); + spi_read(AT45DBX_SPI, &status); + } while ((status & AT45DBX_MSK_BUSY) == AT45DBX_BUSY); + + // Unselect the DF memory gl_ptr_mem points to. + at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE); +} + + +Bool at45dbx_read_open(U32 sector) +{ + U32 addr; + + // Set the global memory pointer to a byte address. + gl_ptr_mem = sector << AT45DBX_SECTOR_BITS; // gl_ptr_mem = sector * AT45DBX_SECTOR_SIZE. + + // If the DF memory is busy, wait until it's ready. + if (at45dbx_busy) at45dbx_wait_ready(); + at45dbx_busy = FALSE; + + // Select the DF memory gl_ptr_mem points to. + at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, TRUE); + + // Initiate a page read at a given sector. + + // Send the Main Memory Page Read command. + spi_write(AT45DBX_SPI, AT45DBX_CMDA_RD_PAGE); + + // Send the three address bytes, which comprise: + // - (24 - (AT45DBX_PAGE_ADDR_BITS + AT45DBX_BYTE_ADDR_BITS)) reserved bits; + // - then AT45DBX_PAGE_ADDR_BITS bits specifying the page in main memory to be read; + // - then AT45DBX_BYTE_ADDR_BITS bits specifying the starting byte address within that page. + // NOTE: The bits of gl_ptr_mem above the AT45DBX_MEM_SIZE bits are useless for the local + // DF addressing. They are used for DF discrimination when there are several DFs. + addr = (Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_PAGE) << AT45DBX_BYTE_ADDR_BITS) | + Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_BYTE); + spi_write(AT45DBX_SPI, LSB2W(addr)); + spi_write(AT45DBX_SPI, LSB1W(addr)); + spi_write(AT45DBX_SPI, LSB0W(addr)); + + // Send 32 don't care clock cycles to initialize the read operation. + spi_write_dummy(); + spi_write_dummy(); + spi_write_dummy(); + spi_write_dummy(); + + return OK; +} + + +void at45dbx_read_close(void) +{ + // Unselect the DF memory gl_ptr_mem points to. + at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE); + + // Memory ready. + at45dbx_busy = FALSE; +} + + +Bool at45dbx_write_open(U32 sector) +{ + U32 addr; + + // Set the global memory pointer to a byte address. + gl_ptr_mem = sector << AT45DBX_SECTOR_BITS; // gl_ptr_mem = sector * AT45DBX_SECTOR_SIZE. + + // If the DF memory is busy, wait until it's ready. + if (at45dbx_busy) at45dbx_wait_ready(); + at45dbx_busy = FALSE; + +#if AT45DBX_PAGE_SIZE > AT45DBX_SECTOR_SIZE + // Select the DF memory gl_ptr_mem points to. + at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, TRUE); + + // Transfer the content of the current page to buffer 1. + + // Send the Main Memory Page to Buffer 1 Transfer command. + spi_write(AT45DBX_SPI, AT45DBX_CMDB_XFR_PAGE_TO_BUF1); + + // Send the three address bytes, which comprise: + // - (24 - (AT45DBX_PAGE_ADDR_BITS + AT45DBX_BYTE_ADDR_BITS)) reserved bits; + // - then AT45DBX_PAGE_ADDR_BITS bits specifying the page in main memory to be read; + // - then AT45DBX_BYTE_ADDR_BITS don't care bits. + // NOTE: The bits of gl_ptr_mem above the AT45DBX_MEM_SIZE bits are useless for the local + // DF addressing. They are used for DF discrimination when there are several DFs. + addr = Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_PAGE) << AT45DBX_BYTE_ADDR_BITS; + spi_write(AT45DBX_SPI, LSB2W(addr)); + spi_write(AT45DBX_SPI, LSB1W(addr)); + spi_write(AT45DBX_SPI, LSB0W(addr)); + + // Unselect the DF memory gl_ptr_mem points to. + at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE); + + // Wait for end of page transfer. + at45dbx_wait_ready(); +#endif + + // Select the DF memory gl_ptr_mem points to. + at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, TRUE); + + // Initiate a page write at a given sector. + + // Send the Main Memory Page Program through Buffer 1 command. + spi_write(AT45DBX_SPI, AT45DBX_CMDB_PR_PAGE_TH_BUF1); + + // Send the three address bytes, which comprise: + // - (24 - (AT45DBX_PAGE_ADDR_BITS + AT45DBX_BYTE_ADDR_BITS)) reserved bits; + // - then AT45DBX_PAGE_ADDR_BITS bits specifying the page in main memory to be written; + // - then AT45DBX_BYTE_ADDR_BITS bits specifying the starting byte address within that page. + // NOTE: The bits of gl_ptr_mem above the AT45DBX_MEM_SIZE bits are useless for the local + // DF addressing. They are used for DF discrimination when there are several DFs. + addr = (Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_PAGE) << AT45DBX_BYTE_ADDR_BITS) | + Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_BYTE); + spi_write(AT45DBX_SPI, LSB2W(addr)); + spi_write(AT45DBX_SPI, LSB1W(addr)); + spi_write(AT45DBX_SPI, LSB0W(addr)); + + return OK; +} + + +void at45dbx_write_close(void) +{ + // While end of logical sector not reached, zero-fill remaining memory bytes. + while (Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_SECTOR)) + { + spi_write(AT45DBX_SPI, 0x00); + gl_ptr_mem++; + } + + // Unselect the DF memory gl_ptr_mem points to. + at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE); + + // Memory busy. + at45dbx_busy = TRUE; +} + + +//! @} + + +/*! \name Single-Byte Access Functions + */ +//! @{ + + +U8 at45dbx_read_byte(void) +{ + U16 data; + + // Memory busy. + if (at45dbx_busy) + { + // Being here, we know that we previously finished a page read. + // => We have to access the next page. + + // Memory ready. + at45dbx_busy = FALSE; + + // Eventually select the next DF and open the next page. + // NOTE: at45dbx_read_open input parameter is a sector. + at45dbx_read_open(gl_ptr_mem >> AT45DBX_SECTOR_BITS); // gl_ptr_mem / AT45DBX_SECTOR_SIZE. + } + + // Send a dummy byte to read the next data byte. + spi_write_dummy(); + spi_read(AT45DBX_SPI, &data); + gl_ptr_mem++; + + // If end of page reached, + if (!Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_BYTE)) + { + // unselect the DF memory gl_ptr_mem points to. + at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE); + + // Memory busy. + at45dbx_busy = TRUE; + } + + return data; +} + + +Bool at45dbx_write_byte(U8 b) +{ + // Memory busy. + if (at45dbx_busy) + { + // Being here, we know that we previously launched a page programming. + // => We have to access the next page. + + // Eventually select the next DF and open the next page. + // NOTE: at45dbx_write_open input parameter is a sector. + at45dbx_write_open(gl_ptr_mem >> AT45DBX_SECTOR_BITS); // gl_ptr_mem / AT45DBX_SECTOR_SIZE. + } + + // Write the next data byte. + spi_write(AT45DBX_SPI, b); + gl_ptr_mem++; + + // If end of page reached, + if (!Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_BYTE)) + { + // unselect the DF memory gl_ptr_mem points to in order to program the page. + at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE); + + // Memory busy. + at45dbx_busy = TRUE; + } + + return OK; +} + + +//! @} + + +/*! \name Multiple-Sector Access Functions + */ +//! @{ + + +Bool at45dbx_read_multiple_sector(U16 nb_sector) +{ + while (nb_sector--) + { + // Read the next sector. + at45dbx_read_sector_2_ram(sector_buf); + at45dbx_read_multiple_sector_callback(sector_buf); + } + + return OK; +} + + +Bool at45dbx_write_multiple_sector(U16 nb_sector) +{ + while (nb_sector--) + { + // Write the next sector. + at45dbx_write_multiple_sector_callback(sector_buf); + at45dbx_write_sector_from_ram(sector_buf); + } + + return OK; +} + + +//! @} + + +/*! \name Single-Sector Access Functions + */ +//! @{ + + +Bool at45dbx_read_sector_2_ram(void *ram) +{ + U8 *_ram = ram; + U16 i; + U16 data; + + // Memory busy. + if (at45dbx_busy) + { + // Being here, we know that we previously finished a page read. + // => We have to access the next page. + + // Memory ready. + at45dbx_busy = FALSE; + + // Eventually select the next DF and open the next page. + // NOTE: at45dbx_read_open input parameter is a sector. + at45dbx_read_open(gl_ptr_mem >> AT45DBX_SECTOR_BITS); // gl_ptr_mem / AT45DBX_SECTOR_SIZE. + } + + // Read the next sector. + for (i = AT45DBX_SECTOR_SIZE; i; i--) + { + // Send a dummy byte to read the next data byte. + spi_write_dummy(); + spi_read(AT45DBX_SPI, &data); + *_ram++ = data; + } + + // Update the memory pointer. + gl_ptr_mem += AT45DBX_SECTOR_SIZE; + +#if AT45DBX_PAGE_SIZE > AT45DBX_SECTOR_SIZE + // If end of page reached, + if (!Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_BYTE)) +#endif + { + // unselect the DF memory gl_ptr_mem points to. + at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE); + + // Memory busy. + at45dbx_busy = TRUE; + } + + return OK; +} + + +Bool at45dbx_write_sector_from_ram(const void *ram) +{ + const U8 *_ram = ram; + U16 i; + + // Memory busy. + if (at45dbx_busy) + { + // Being here, we know that we previously launched a page programming. + // => We have to access the next page. + + // Eventually select the next DF and open the next page. + // NOTE: at45dbx_write_open input parameter is a sector. + at45dbx_write_open(gl_ptr_mem >> AT45DBX_SECTOR_BITS); // gl_ptr_mem / AT45DBX_SECTOR_SIZE. + } + + // Write the next sector. + for (i = AT45DBX_SECTOR_SIZE; i; i--) + { + // Write the next data byte. + spi_write(AT45DBX_SPI, *_ram++); + } + + // Update the memory pointer. + gl_ptr_mem += AT45DBX_SECTOR_SIZE; + +#if AT45DBX_PAGE_SIZE > AT45DBX_SECTOR_SIZE + // If end of page reached, + if (!Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_BYTE)) +#endif + { + // unselect the DF memory gl_ptr_mem points to in order to program the page. + at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE); + + // Memory busy. + at45dbx_busy = TRUE; + } + + return OK; +} + + +//! @} + + +#endif // AT45DBX_MEM == ENABLE diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx.h new file mode 100644 index 0000000..e5263b2 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx.h @@ -0,0 +1,270 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Management of the AT45DBX data flash controller through SPI. + * + * This file manages the accesses to the AT45DBX data flash components. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with an SPI module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _AT45DBX_H_ +#define _AT45DBX_H_ + + +#include "conf_access.h" + +#if AT45DBX_MEM == DISABLE + #error at45dbx.h is #included although AT45DBX_MEM is disabled +#endif + + +#include "spi.h" + + +//_____ D E F I N I T I O N S ______________________________________________ + +/*! \name Available AT45DBX Sizes + * + * Number of address bits of available AT45DBX data flash memories. + * + * \note Only memories with page sizes of at least 512 bytes (sector size) are + * supported. + */ +//! @{ +#define AT45DBX_1MB 20 +#define AT45DBX_2MB 21 +#define AT45DBX_4MB 22 +#define AT45DBX_8MB 23 +//! @} + +// AT45DBX_1MB +#define AT45DBX_SECTOR_BITS 8 //! Number of bits for addresses within sectors. +// AT45DBX_2MB AT45DBX_4MB AT45DBX_8MB +//#define AT45DBX_SECTOR_BITS 9 //! Number of bits for addresses within sectors. + +//! Sector size in bytes. +#define AT45DBX_SECTOR_SIZE (1 << AT45DBX_SECTOR_BITS) + + +//_____ D E C L A R A T I O N S ____________________________________________ + +/*! \name Control Functions + */ +//! @{ + +/*! \brief Initializes the data flash controller and the SPI channel by which + * the DF is controlled. + * + * \param spiOptions Initialization options of the DF SPI channel. + * \param pba_hz SPI module input clock frequency (PBA clock, Hz). + * + * \retval OK Success. + * \retval KO Failure. + */ +extern Bool at45dbx_init(spi_options_t spiOptions, unsigned int pba_hz); + +/*! \brief Performs a memory check on all DFs. + * + * \retval OK Success. + * \retval KO Failure. + */ +extern Bool at45dbx_mem_check(void); + +/*! \brief Opens a DF memory in read mode at a given sector. + * + * \param sector Start sector. + * + * \retval OK Success. + * \retval KO Failure. + * + * \note Sector may be page-unaligned (depending on the DF page size). + */ +extern Bool at45dbx_read_open(U32 sector); + +/*! \brief Unselects the current DF memory. + */ +extern void at45dbx_read_close(void); + +/*! \brief This function opens a DF memory in write mode at a given sector. + * + * \param sector Start sector. + * + * \retval OK Success. + * \retval KO Failure. + * + * \note Sector may be page-unaligned (depending on the DF page size). + * + * \note If \ref AT45DBX_PAGE_SIZE > \ref AT45DBX_SECTOR_SIZE, page content is + * first loaded in buffer to then be partially updated by write byte or + * write sector functions. + */ +extern Bool at45dbx_write_open(U32 sector); + +/*! \brief Fills the end of the current logical sector and launches page programming. + */ +extern void at45dbx_write_close(void); + +//! @} + + +/*! \name Single-Byte Access Functions + */ +//! @{ + +/*! \brief Performs a single byte read from DF memory. + * + * \return The read byte. + * + * \note First call must be preceded by a call to the \ref at45dbx_read_open + * function. + */ +extern U8 at45dbx_read_byte(void); + +/*! \brief Performs a single byte write to DF memory. + * + * \param b The byte to write. + * + * \retval OK Success. + * \retval KO Failure. + * + * \note First call must be preceded by a call to the \ref at45dbx_write_open + * function. + */ +extern Bool at45dbx_write_byte(U8 b); + +//! @} + + +/*! \name Multiple-Sector Access Functions + */ +//! @{ + +/*! \brief Reads \a nb_sector sectors from DF memory. + * + * Data flow is: DF -> callback. + * + * \param nb_sector Number of contiguous sectors to read. + * + * \retval OK Success. + * \retval KO Failure. + * + * \note First call must be preceded by a call to the \ref at45dbx_read_open + * function. + * + * \note As \ref AT45DBX_PAGE_SIZE is always a multiple of + * \ref AT45DBX_SECTOR_SIZE, there is no need to check page end for each + * byte. + */ +extern Bool at45dbx_read_multiple_sector(U16 nb_sector); + +/*! \brief Callback function invoked after each sector read during + * \ref at45dbx_read_multiple_sector. + * + * \param psector Pointer to read sector. + */ +extern void at45dbx_read_multiple_sector_callback(const void *psector); + +/*! \brief Writes \a nb_sector sectors to DF memory. + * + * Data flow is: callback -> DF. + * + * \param nb_sector Number of contiguous sectors to write. + * + * \retval OK Success. + * \retval KO Failure. + * + * \note First call must be preceded by a call to the \ref at45dbx_write_open + * function. + * + * \note As \ref AT45DBX_PAGE_SIZE is always a multiple of + * \ref AT45DBX_SECTOR_SIZE, there is no need to check page end for each + * byte. + */ +extern Bool at45dbx_write_multiple_sector(U16 nb_sector); + +/*! \brief Callback function invoked before each sector write during + * \ref at45dbx_write_multiple_sector. + * + * \param psector Pointer to sector to write. + */ +extern void at45dbx_write_multiple_sector_callback(void *psector); + +//! @} + + +/*! \name Single-Sector Access Functions + */ +//! @{ + +/*! \brief Reads 1 DF sector to a RAM buffer. + * + * Data flow is: DF -> RAM. + * + * \param ram Pointer to RAM buffer. + * + * \retval OK Success. + * \retval KO Failure. + * + * \note First call must be preceded by a call to the \ref at45dbx_read_open + * function. + */ +extern Bool at45dbx_read_sector_2_ram(void *ram); + +/*! \brief Writes 1 DF sector from a RAM buffer. + * + * Data flow is: RAM -> DF. + * + * \param ram Pointer to RAM buffer. + * + * \retval OK Success. + * \retval KO Failure. + * + * \note First call must be preceded by a call to the \ref at45dbx_write_open + * function. + */ +extern Bool at45dbx_write_sector_from_ram(const void *ram); + +//! @} + + +#endif // _AT45DBX_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx_mem.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx_mem.c new file mode 100644 index 0000000..4c0ace2 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx_mem.c @@ -0,0 +1,234 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief CTRL_ACCESS interface for the AT45DBX data flash controller. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with an SPI module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +//_____ I N C L U D E S ___________________________________________________ + +#include "conf_access.h" + + +#if AT45DBX_MEM == ENABLE + +#include "conf_at45dbx.h" +#include "at45dbx.h" +#include "at45dbx_mem.h" + + +//_____ D E F I N I T I O N S ______________________________________________ + +//! Whether to detect write accesses to the memory. +#define AT45DBX_MEM_TEST_CHANGE_STATE ENABLED + + +#if (ACCESS_USB == ENABLED || ACCESS_MEM_TO_RAM == ENABLED) && AT45DBX_MEM_TEST_CHANGE_STATE == ENABLED + +//! Memory data modified flag. +static volatile Bool s_b_data_modify = FALSE; + +#endif + + +/*! \name Control Interface + */ +//! @{ + + +Ctrl_status at45dbx_test_unit_ready(void) +{ + return (at45dbx_mem_check() == OK) ? CTRL_GOOD : CTRL_NO_PRESENT; +} + + +Ctrl_status at45dbx_read_capacity(U32 *u32_nb_sector) +{ + *u32_nb_sector = (AT45DBX_MEM_CNT << (AT45DBX_MEM_SIZE - AT45DBX_SECTOR_BITS)) - 1; + + return CTRL_GOOD; +} + + +Bool at45dbx_wr_protect(void) +{ + return FALSE; +} + + +Bool at45dbx_removal(void) +{ + return FALSE; +} + + +//! @} + + +#if ACCESS_USB == ENABLED + +#include "usb_drv.h" +#include "scsi_decoder.h" + + +/*! \name MEM <-> USB Interface + */ +//! @{ + + +Ctrl_status at45dbx_usb_read_10(U32 addr, U16 nb_sector) +{ + if (addr + nb_sector > AT45DBX_MEM_CNT << (AT45DBX_MEM_SIZE - AT45DBX_SECTOR_BITS)) return CTRL_FAIL; + + at45dbx_read_open(addr); + at45dbx_read_multiple_sector(nb_sector); + at45dbx_read_close(); + + return CTRL_GOOD; +} + + +void at45dbx_read_multiple_sector_callback(const void *psector) +{ + U16 data_to_transfer = AT45DBX_SECTOR_SIZE; + + // Transfer read sector to the USB interface. + while (data_to_transfer) + { + while (!Is_usb_in_ready(g_scsi_ep_ms_in)) + { + if(!Is_usb_endpoint_enabled(g_scsi_ep_ms_in)) + return; // USB Reset + } + + Usb_reset_endpoint_fifo_access(g_scsi_ep_ms_in); + data_to_transfer = usb_write_ep_txpacket(g_scsi_ep_ms_in, psector, + data_to_transfer, &psector); + Usb_ack_in_ready_send(g_scsi_ep_ms_in); + } +} + + +Ctrl_status at45dbx_usb_write_10(U32 addr, U16 nb_sector) +{ + if (addr + nb_sector > AT45DBX_MEM_CNT << (AT45DBX_MEM_SIZE - AT45DBX_SECTOR_BITS)) return CTRL_FAIL; + +#if AT45DBX_MEM_TEST_CHANGE_STATE == ENABLED + if (nb_sector) s_b_data_modify = TRUE; +#endif + + at45dbx_write_open(addr); + at45dbx_write_multiple_sector(nb_sector); + at45dbx_write_close(); + + return CTRL_GOOD; +} + + +void at45dbx_write_multiple_sector_callback(void *psector) +{ + U16 data_to_transfer = AT45DBX_SECTOR_SIZE; + + // Transfer sector to write from the USB interface. + while (data_to_transfer) + { + while (!Is_usb_out_received(g_scsi_ep_ms_out)) + { + if(!Is_usb_endpoint_enabled(g_scsi_ep_ms_out)) + return; // USB Reset + } + + Usb_reset_endpoint_fifo_access(g_scsi_ep_ms_out); + data_to_transfer = usb_read_ep_rxpacket(g_scsi_ep_ms_out, psector, + data_to_transfer, &psector); + Usb_ack_out_received_free(g_scsi_ep_ms_out); + } +} + + +//! @} + +#endif // ACCESS_USB == ENABLED + + +#if ACCESS_MEM_TO_RAM == ENABLED + +/*! \name MEM <-> RAM Interface + */ +//! @{ + + +Ctrl_status at45dbx_df_2_ram(U32 addr, void *ram) +{ + if (addr + 1 > AT45DBX_MEM_CNT << (AT45DBX_MEM_SIZE - AT45DBX_SECTOR_BITS)) return CTRL_FAIL; + + at45dbx_read_open(addr); + at45dbx_read_sector_2_ram(ram); + at45dbx_read_close(); + + return CTRL_GOOD; +} + + +Ctrl_status at45dbx_ram_2_df(U32 addr, const void *ram) +{ + if (addr + 1 > AT45DBX_MEM_CNT << (AT45DBX_MEM_SIZE - AT45DBX_SECTOR_BITS)) return CTRL_FAIL; + +#if AT45DBX_MEM_TEST_CHANGE_STATE == ENABLED + s_b_data_modify = TRUE; +#endif + + at45dbx_write_open(addr); + at45dbx_write_sector_from_ram(ram); + at45dbx_write_close(); + + return CTRL_GOOD; +} + + +//! @} + +#endif // ACCESS_MEM_TO_RAM == ENABLED + + +#endif // AT45DBX_MEM == ENABLE diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx_mem.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx_mem.h new file mode 100644 index 0000000..de24fa3 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx_mem.h @@ -0,0 +1,164 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief CTRL_ACCESS interface for the AT45DBX data flash controller. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with an SPI module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _AT45DBX_MEM_H_ +#define _AT45DBX_MEM_H_ + + +#include "conf_access.h" + +#if AT45DBX_MEM == DISABLE + #error at45dbx_mem.h is #included although AT45DBX_MEM is disabled +#endif + + +#include "ctrl_access.h" + + +//_____ D E C L A R A T I O N S ____________________________________________ + +/*! \name Control Interface + */ +//! @{ + +/*! \brief Tests the memory state and initializes the memory if required. + * + * The TEST UNIT READY SCSI primary command allows an application client to poll + * a LUN until it is ready without having to allocate memory for returned data. + * + * This command may be used to check the media status of LUNs with removable + * media. + * + * \return Status. + */ +extern Ctrl_status at45dbx_test_unit_ready(void); + +/*! \brief Returns the address of the last valid sector in the memory. + * + * \param u32_nb_sector Pointer to the address of the last valid sector. + * + * \return Status. + */ +extern Ctrl_status at45dbx_read_capacity(U32 *u32_nb_sector); + +/*! \brief Returns the write-protection state of the memory. + * + * \return \c TRUE if the memory is write-protected, else \c FALSE. + * + * \note Only used by removable memories with hardware-specific write + * protection. + */ +extern Bool at45dbx_wr_protect(void); + +/*! \brief Tells whether the memory is removable. + * + * \return \c TRUE if the memory is removable, else \c FALSE. + */ +extern Bool at45dbx_removal(void); + +//! @} + + +#if ACCESS_USB == ENABLED + +/*! \name MEM <-> USB Interface + */ +//! @{ + +/*! \brief Tranfers data from the memory to USB. + * + * \param addr Address of first memory sector to read. + * \param nb_sector Number of sectors to transfer. + * + * \return Status. + */ +extern Ctrl_status at45dbx_usb_read_10(U32 addr, U16 nb_sector); + +/*! \brief Tranfers data from USB to the memory. + * + * \param addr Address of first memory sector to write. + * \param nb_sector Number of sectors to transfer. + * + * \return Status. + */ +extern Ctrl_status at45dbx_usb_write_10(U32 addr, U16 nb_sector); + +//! @} + +#endif + + +#if ACCESS_MEM_TO_RAM == ENABLED + +/*! \name MEM <-> RAM Interface + */ +//! @{ + +/*! \brief Copies 1 data sector from the memory to RAM. + * + * \param addr Address of first memory sector to read. + * \param ram Pointer to RAM buffer to write. + * + * \return Status. + */ +extern Ctrl_status at45dbx_df_2_ram(U32 addr, void *ram); + +/*! \brief Copies 1 data sector from RAM to the memory. + * + * \param addr Address of first memory sector to write. + * \param ram Pointer to RAM buffer to read. + * + * \return Status. + */ +extern Ctrl_status at45dbx_ram_2_df(U32 addr, const void *ram); + +//! @} + +#endif + + +#endif // _AT45DBX_MEM_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/UCR1/GCC/lib_ucr1_hd_sdio_v2.7.0.a b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/UCR1/GCC/lib_ucr1_hd_sdio_v2.7.0.a new file mode 100644 index 0000000..e01ab14 Binary files /dev/null and b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/UCR1/GCC/lib_ucr1_hd_sdio_v2.7.0.a differ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/UCR1/GCC/lib_ucr1_hd_spi_v2.7.0.a b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/UCR1/GCC/lib_ucr1_hd_spi_v2.7.0.a new file mode 100644 index 0000000..9aa4f24 Binary files /dev/null and b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/UCR1/GCC/lib_ucr1_hd_spi_v2.7.0.a differ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/UCR1/GCC/lib_ucr1_hd_wl_sta_intwpa_v2.7.0.a b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/UCR1/GCC/lib_ucr1_hd_wl_sta_intwpa_v2.7.0.a new file mode 100644 index 0000000..00536f5 Binary files /dev/null and b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/UCR1/GCC/lib_ucr1_hd_wl_sta_intwpa_v2.7.0.a differ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/UCR2/GCC/lib_ucr2_hd_sdio_v2.7.0.a b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/UCR2/GCC/lib_ucr2_hd_sdio_v2.7.0.a new file mode 100644 index 0000000..a61dea3 Binary files /dev/null and b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/UCR2/GCC/lib_ucr2_hd_sdio_v2.7.0.a differ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/UCR2/GCC/lib_ucr2_hd_spi_v2.7.0.a b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/UCR2/GCC/lib_ucr2_hd_spi_v2.7.0.a new file mode 100644 index 0000000..6883192 Binary files /dev/null and b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/UCR2/GCC/lib_ucr2_hd_spi_v2.7.0.a differ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/UCR2/GCC/lib_ucr2_hd_wl_sta_intwpa_v2.7.0.a b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/UCR2/GCC/lib_ucr2_hd_wl_sta_intwpa_v2.7.0.a new file mode 100644 index 0000000..0b09aa8 Binary files /dev/null and b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/UCR2/GCC/lib_ucr2_hd_wl_sta_intwpa_v2.7.0.a differ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/revision.txt b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/revision.txt new file mode 100644 index 0000000..5420c93 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/revision.txt @@ -0,0 +1 @@ +Revision: 2491 diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wl_api.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wl_api.h new file mode 100644 index 0000000..17ba2ba --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wl_api.h @@ -0,0 +1,1687 @@ +/* + * Programming interface for wl_api. + * Copyright (C) 2010 HD Wireless AB + * + * You should have received a copy of the license along with this library. + */ + +/*! \file wl_api.h ************************************************************* + * + * \brief Basic WiFi API + * + * This file provides the wl_api interface. + * + * - Compiler: GNU GCC for AVR32 + * - Supported devices: + * \li SPB104 + EVK1100 + * \li SPB104 + EVK1101 + * \li SPB104 + EVK1104 + * \li SPB104 + EVK1105 (SPI) + * \li SPB104 + EVK1105 (SPI + irq) + * \li SPB105 + EVK1105 (SPI) + * - AppNote: + * + * \author H&D Wireless AB: \n + * + ***************************************************************************** + * + * \section intro Introduction + * This is the documentation for the generic WiFi Driver API \a wl_api. + * + * \section files Main Files + * - wl_api.h : WiFi driver interface. + * - lib_ucr*_hd_wifi_standalone_v*.*.a - Driver library. + * + */ +/** \mainpage wl_api Reference Manual + +\image html images/wl_api_block_diagram_small.png "wl_api Architecture" + +(o)WL API © is a programming interface for WiFi (802.11). It aims +to be a complete interface for embedded applications wanting to use +wireless as a communications interface. (o)WL API © is shortened +"wl_api" in this document. + +wl_api has been designed to meet the following goals : + \li Simple : The API is as simple as is practicable + to make it easy to use. + \li Minimal size : The API is usable on very resource constrained + platforms. + \li Portable : The API is deployable on any platform with a standards + compliant C compiler. + \li OS independent : The API is deployable on systems using a real time + operating system as well as with applications running on the + "bare metal" of a hardware platform (that is without an operating system). + +As a consequence of these design goals wl_api does not allow very fine +grained control of most parameters relating to 802.11 networks. That +would increase the flexibility of the API while also increasing +complexity and code size. When the underlying WiFi hardware can +support a richer feature set the extra features can be offered as a +add-on library if required. + +The wl_api is implemented by two libraries. The core library is +compiled for a hardware platform and is independent of operating +system or IP stack. The core library contains all WiFi +functionality. The core library is supported by a suite of transport +libraries. The transport libraries implements the hardware +communication layer and are specific to the type of hardware interface +used to connect the host platform to the WiFi hardware. For example, +there are transport libraries for SPI and for SDIO. Only the core +library has a public interface (wl_api.h) but applications will need +to link with both the core library and a transport library matching +the hardware configuration. + +\section wl_api_princ Operation Principles + +There are three important properties of wl_api to keep in mind when +programming with it. + +The first is that wl_api is \b asynchronous. For instance, when the +\a wl_connect() function is called to attempt connection with an access +point it will trigger a sequence of packets being exchanged with the +access point after which, if everything is okay, a connection has been +established. The \a wl_connect() call is asynchronous (or non-blocking) +which means that you don't know if the connection attempt has +succeeded after the call returns. You only know if the sequence was +successfully started or not. To find out if, and when, the connection +attempt was successful you must register an event handler using the +function \a wl_register_event_cb(). This is true of a number of API calls +(which is indicated in their documentation). + +The second important property is that wl_api is \b polled. wl_api +never executes "by itself", since it would then have to support +interrupts, timers, locks and other operating system dependent +features. Instead all asynchronous processes proceed when wl_api is +polled by calling the \a wl_tick() function. When \a wl_tick() is called +wl_api reacts to any received management frames, expires any internal timers and +performs any other tasks necessary for forward progress. After +\a wl_tick() returns nothing will happen unless it or some other wl_api +function is called again. Also, to send and receive data, the \a wl_process_rx() +and \a wl_process_tx() must be invoked upon reception and transmission of data. + +The third important property is that wl_api is \b not \b thread \b safe. +All wl_api calls must execute in the same context since the +library has no knowledge of the locking mechanisms available (if any). + +\section wl_api_code_examples A note on the code examples + +The code examples illustrate how to call the different wl_api functions. +They do not constitute a complete program. Functions with the prefix "app_" +in the code examples are application specific calls that illustrate a +particular action. These functions are not part of the API and will have +to be implemented if needed. For a complete working code example see +one of the H&D Wireless software reference designs, such as the WiFi HTTP +server demo code in the Atmel Software Framework. + +The API is structured into these functional groups: + +\li \ref wl_api +\li \ref wl_wifi +\li \ref wl_data +\li \ref wl_transport +\li \ref wl_custom + +Also documented here is the transport layers for SPI and SDIO. +There interfaces are only necessary when porting the library to +a new hardware platform. + +\li \ref wl_spi +\li \ref wl_sdio + + * \section contactinfo Contact Information + * For further information, visit + * H&D Wireless.\n + * Support and FAQ: http://www.atmel.com/ + */ + +#ifndef WL_API_H +#define WL_API_H + +#define WL_API_RELEASE_NAME "v2.7.0" + +/*! Maximum size of a SSID */ +#define WL_SSID_MAX_LENGTH 32 +/*! Size of a MAC-address or BSSID */ +#define WL_MAC_ADDR_LENGTH 6 +/*! Maximum length of a passphrase */ +#define WL_MAX_PASS_LEN 64 +/*! Indicates that there is no SNR information */ +#define WL_SNR_UNKNOWN -128 + +#define SPB104 104 +#define SPB105 105 + +/*! \ingroup wl_api + * API Error codes */ +typedef enum { + WL_FAILURE = -1, + WL_SUCCESS = 1, + WL_NOEFFECT, + WL_OOM, + WL_INVALID_LENGTH, + WL_NOT_SUPPORTED, + WL_ABSORBED, + WL_RESOURCES, + WL_BUSY, + WL_RETRY, /*!< Retry the operation later. The driver is busy + resolving an operation that conflicts with the + request. */ + WL_INVALID_ARGS, + WL_AVAIL, + WL_CARD_FAILURE, /*!< Could not detect SPB device */ + WL_FIRMWARE_INVALID, /*!< Invalid firmware data */ + +} wl_err_t; + +/*! \ingroup wl_wifi + * Event identifiers */ +enum wl_event_id_t { + WL_EVENT_MEDIA_CONNECTED = 0, + WL_EVENT_CONN_FAILURE, + WL_EVENT_MEDIA_DISCONNECTED, + WL_EVENT_SCAN_COMPLETE, + WL_EVENT_FAILURE, + MAX_WL_EVENT +}; + +/*! \ingroup wl_wifi + * Authentication modes */ +enum wl_auth_mode { + AUTH_MODE_INVALID, + AUTH_MODE_AUTO, + AUTH_MODE_OPEN_SYSTEM, + AUTH_MODE_SHARED_KEY, + AUTH_MODE_WPA, + AUTH_MODE_WPA2, + AUTH_MODE_WPA_PSK, + AUTH_MODE_WPA2_PSK +}; + +/*! \ingroup wl_wifi + * Encryption modes */ +enum wl_enc_type { /* Values map to 802.11 encryption suites... */ + ENC_TYPE_WEP = 5, + ENC_TYPE_TKIP = 2, + ENC_TYPE_CCMP = 4, + /* ... except these two, 7 and 8 are reserved in 802.11-2007 */ + ENC_TYPE_NONE = 7, + ENC_TYPE_AUTO = 8 +}; + +enum wl_host_attention_mode { + WL_HOST_ATTENTION_SDIO = 0x1, /*!< For SDIO or polled SPI */ + WL_HOST_ATTENTION_SPI = 0x5a /*!< For SPI with interrupt line */ +}; + +/*! \ingroup wl_wifi + * Event descriptor +*/ +struct wl_event_t { + enum wl_event_id_t id; /**< Event identifier. */ + +}; + +/*! \ingroup wl_wifi + * Infrastructure (ESS) or Ad-hoc (IBSS) connection modes. + */ +enum wl_conn_type_t { + WL_CONN_TYPE_INFRA, /*!< For infrastructure mode (default) */ + WL_CONN_TYPE_ADHOC /*!< For ad-hoc mode */ +}; + +/* Note: + * If your environment does not have stdint.h you will have to + * define the fixed-width integer types specified in that file + * yourself, make sure that those definitions are included + * before any inclusions of wl_api.h, and build with the macro + * WITHOUT_STDINT defined. In this case the wl_api library + * must have been built with the same integer type definitions. + */ + +#ifndef WITHOUT_STDINT +#include +#endif + +/* Note: + * If your environment does not have stdio.h you will have to define + * the size_t type yourself, make sure that that definition is + * included before any inclusions of wl_api.h, and build with the + * macro WITHOUT_STDIO defined. In this case the wl_api library must + * have been built with the same size_t type definition. + */ +#ifndef WITHOUT_STDIO +#include +#endif + +/*! \ingroup wl_wifi + * + * \brief SSID representation. + * + * The SSID is a binary string and cannot be treated as a + * C-string safely. An empty SSID is represented by a + * SSID struct with the len field set to 0. + */ +struct wl_ssid_t +{ + char ssid[WL_SSID_MAX_LENGTH]; /**< Octet array containing the SSID data. */ + uint8_t len; /**< Length of valid data in ssid member. + * Cannot be longer than WL_SSID_MAX_LENGTH. */ +}; + +/*! \ingroup wl_wifi + * + * MAC-address/BSSID representation + * + * A broadcast BSSID is one with all octets set to 0xFF. + */ +struct wl_mac_addr_t +{ + uint8_t octet[WL_MAC_ADDR_LENGTH]; /**< Octet array containing the MAC address + * data. This array is always WL_MAC_ADDR_LENGTH bytes. + */ +}; + +/*! \ingroup wl_wifi + * + * Network representation + * + */ +struct wl_network_t +{ + struct wl_ssid_t ssid; /**< The SSID of the network. */ + struct wl_mac_addr_t bssid; /**< The BSSID of the network. */ + uint8_t channel; /**< The wlan channel which the network uses */ + uint32_t beacon_period; /**< Beacon period for the network */ + uint16_t dtim_period; /**< DTIM period for the network */ + int32_t rssi; /**< Received Signal Strength in dBm (measured on beacons) */ + int32_t snr; /**< Received Signal to noise ratio in dBm (measured on beacons) */ + uint8_t enc_type; /**< The encryption type used in the network. */ + + enum wl_conn_type_t net_type; /**< Type of network (Infrastructure or Ad-Hoc */ + size_t ie_len; /**< Always 0 unless wl_api has been built with WL_CONFIG_WPA_SUPPLICANT */ + + uint8_t ie[0]; /**< Not used unless wl_api has been built with WL_CONFIG_WPA_SUPPLICANT */ +}; + +/*! \ingroup wl_wifi + * Network list representation. Array of pointers to wl_network_t entries. + * + */ +struct wl_network_list_t +{ + struct wl_network_t **net; /**< The list of pointers to networks */ + size_t cnt; /**< Number of networks */ +}; + +#define WL_RATE_1MBIT 2 +#define WL_RATE_2MBIT 4 +#define WL_RATE_5_5MBIT 11 +#define WL_RATE_6MBIT 12 +#define WL_RATE_9MBIT 18 +#define WL_RATE_11MBIT 22 +#define WL_RATE_12MBIT 24 +#define WL_RATE_18MBIT 36 +#define WL_RATE_22MBIT 44 +#define WL_RATE_24MBIT 48 +#define WL_RATE_33MBIT 66 +#define WL_RATE_36MBIT 72 +#define WL_RATE_48MBIT 96 +#define WL_RATE_54MBIT 108 +#define WL_RATE_NUM_RATES 14 +#define WL_RATE_INVALID WL_RATE_NUM_RATES + +/*! \ingroup wl_wifi + * + * Rate representation + * + */ +typedef uint8_t wl_rate_t; + +/** \defgroup wl_api Library support functions + * + * These functions manage the library in general. They concern initalizing + * the library, downloading firmware to the WiFi chip and handling events + * from the library. + +For this example we assume that the application is running stand-alone +without an operating system. + +Before the library can do anything it needs to start up the WiFi +hardware by downloading a firmware image. The firmware image is +relatively big (around 144kB) and is therefore not included in the library +it is only needed once. It is up to the application to decide where to +store the firmware image and how to read it into the wl_api library. + +Step one is to write a function of the type \a ::wl_fw_read_cb_t +that wl_api will call to retrive the firmware image. Assuming that you +have some spare RAM (or whatever memory type is used for read only +data, such as FLASH memory) on your platform you can simply include +the firmware image from the \a wl_fw.h header file and write a +firmware read function like this + +\code +static size_t fw_read_cb(void* ctx, + uint8_t** buf, + size_t offset, + size_t len) +{ + if ( NULL == buf ) { + return 0; + } + *buf = ((uint8_t*) fw_buf) + offset; + if ( len > ( fw_len - offset ) ) { + return fw_len - offset; + } + return len; +} + +\endcode + +If the firmware image is stored in ROM this function may have to read +it back block by block instead. + +First, firmware must be downloaded to the device + +\code +if ( wl_transport_init(fw_read_cb, NULL, &mode) != WL_SUCCESS ) { + app_error("Firmware download failed"); + return 0; +} +\endcode + +The wl_api library is then initialized like this + +\code +if ( wl_init(NULL, init_complete_cb, mode) != WL_SUCCESS ) { + app_error("Init failed"); + return 0; +} +\endcode + +The library startup process will now require \a wl_poll() to be called +a number of times before it can complete. In addition, if the +application needs to know when the startup process has completed so +that it can, for example, start up an IP stack it will have to supply +a valid callback function of the type \a ::wl_init_complete_cb_t as a parameter +to the \a wl_init() call and start polling the wl_api library. + +The init complete callback will only be executed during a call to \a wl_poll() +or another wl_api function. This simplifies the implementation since no +internal locking is required and the wl_api library becomes OS-independent. + +\code +static void init_complete_cb(void* ctx) { + init_ip_stack(); +} +\endcode + +Registering the event callback is straightforward : + +\code +if (wl_register_event_cb(event_cb, NULL) != WL_SUCCESS) { + app_error("Failed to register event handler"); + return 0; +} +\endcode + +Similar to \a wl_poll(), there is also a \a wl_tick() function that takes a +free running "tick" counter with millisecond resolution as an argument so +that it can trigger internal timers when necessary. Assuming that such a tick +counter is provided by the macro GET_MS_TICK() the wl_api execution loop becomes + +\code +while (TRUE) { + wl_tick(GET_MS_TICK()); + wl_poll(); +} +\endcode + +In a stand-alone application this loop would usually be the main application +loop and include application specific calls as well. + +After some number of main loop iterations the init_complete_cb will be +invoked and the application can initialize its IP stack. + + * @{ + */ + +/*! \brief WiFi event callback. + * + * This function receives WiFi events that the application + * wants notification of. This function is supplied by the user + * of the API. + * + * @param event Struct describing the type of event and, for some + * events, additional information regarding the + * status of the event. See wl_event_t for additional + * information. + * @param ctx A context handle. This handle is passed + * untouched to the callback and has the same value + * as the context registered with the callback in + * wl_register_event_cb(). + */ +typedef void (*wl_event_cb_t) (struct wl_event_t event, void* ctx); + + +/*! \brief Initialization complete callback function. + * + * Invoked when WiFi initialization is complete. + * + * @param ctx Opaque context pointer as provided to \a wl_init() that will be + * passed back to the callback. + */ +typedef void (wl_init_complete_cb_t)(void* ctx); + + +/*! \brief Register an event handler. + * + * Register an event handler with the driver. This + * event handler will be called whenever a event + * listed in #wl_event_id_t occurs. + * See #wl_event_cb_t and #wl_event_id_t for more details. + * + * @param cb Event callback function to register. + * @param ctx Opaque context pointer that will be + * passed to the callback when it is + * invoked. This parameter is never + * accessed by the API. + * @return WL_SUCCESS + */ +wl_err_t wl_register_event_cb(wl_event_cb_t cb, void* ctx); + +/*! \brief Initialize the wl_api library. + * + * Note that \a wl_poll() must be called for this function to progress + * towards complete init + * + * The startup process will proceed asynchronously and will inkove + * init_complete_cb when completed. The callback will not be invoked if any + * error occurs during initialization. + * + * This function should be called after firmware has been downloaded to the + * device. + * + * @param ctx Opaque context pointer that will be passed to the callback + * when invoked. This parameter is never accessed by the API. + * @param init_complete_cb callback function to invoke when initialization is + * complete. + * @param mode Indicates the host attention mode used by the device. If + * \a wl_transport_init() was used to download the firmware image to the + * device, the proper mode can be obtained from the mode parameter of + * that function. + * + * @return + * - WL_SUCCESS + * - WL_FAILURE + */ +wl_err_t wl_init(void* ctx, wl_init_complete_cb_t init_complete_cb, + enum wl_host_attention_mode mode); + + +/*! \brief Shutdown the wl_api library and free resources. + * + * \a wl_init() must be invoked to startup the library + * again. + * + * @return + * - WL_SUCCESS on success + * - WL_FAILURE + * + */ +wl_err_t wl_shutdown(void); + + +/*! \brief WiFi driver timer tick function + * + * Periodic timers are triggered from this function so it should be called as + * often as possible if precision timing is required (traffic timeouts, + * authentication timeouts etc). + * + * @param tick A tick count in us. This is used to expire timers + * in the driver. + */ +void wl_tick(uint32_t tick); + +/*! @} */ + + +/** \defgroup wl_wifi Connection Management + * + * These functions access WiFi-specific functionality such as + * scanning, connect/disconnect, authentication and encryption, + * and power save modes. + * + +\section scanning Scanning + +To scan all channels that are available in the current regulatory +domain + +\code + if ( wl_scan() != WL_SUCCESS ) { + // May be busy scanning already, no fatal error + return 0; + } +\endcode + +Since wl_scan() only starts the scanning process the application +should add code to the event handler to catch the "scan complete" event +and retrieve the list of seen networks from the library + +\code +static void event_cb(struct wl_event_t event, void* ctx) { + switch(event.id) { + case WL_EVENT_SCAN_COMPLETE: + struct wl_network_list_t *netlist; + uint8_t netcnt; + + wl_get_network_list(&netlist); + netcnt = netlist->cnt; + while (--netcnt) { + print_network(netlist->net[netcnt]); + } + break; + } +} +\endcode + +The function print_network() could display the network name, the SSID, in +a user interface. It is important to keep in mind is that despite the fact +that the SSID is usually presented as a ASCII string, it is +in fact just a byte string and can legally contain all kinds of +non-printable characters, including a 0-byte. This means that it is +easy to end up with buffer overrun bugs if the SSID is ever treated +as a normal string without precautions. + +\code +void print_network(struct wl_network_t* wl_network) +{ + char ssid[WL_SSID_MAX_LENGTH + 1]; + memset(ssid, 0, sizeof(ssid)); + memcpy(ssid, wl_network->ssid.ssid, wl_network->ssid.len); + if (app_is_printable(ssid)) { + app_print("\"%s\" ", ssid); + } + else { + app_print(" "); + } + switch (wl_network->enc_type) { + case ENC_TYPE_WEP : + app_print("(WEP encryption)"); + break; + case ENC_TYPE_TKIP : + app_print("(TKIP encryption)"); + break; + case ENC_TYPE_CCMP : + app_print("(CCMP encryption)"); + break; + } + app_print("\n"); +} +\endcode + +\section connecting Connecting + +To connect to an access point (beware binary SSIDs) the connection process +must be started + +\code + if ( wl_connect("My AP", strlen("My AP")) + != WL_SUCCESS ) { + app_error("Connection failed.\n"); + return 0; + } +\endcode + +and the \a WL_EVENT_MEDIA_CONNECTED and \a WL_EVENT_CONN_FAILURE events should be +caught. To detect that a connection is terminated after it has been successfully established +(such as when the AP goes out of range) the \a WL_EVENT_MEDIA_DISCONNECTED event +must be also be caught + + +\code +static void event_cb(struct wl_event_t event, void* ctx) { + switch(event.id) { + case WL_EVENT_SCAN_COMPLETE: + struct wl_network_list_t *netlist; + uint8_t netcnt; + + wl_get_network_list(&netlist); + netcnt = netlist->cnt; + while (--netcnt) { + print_network(netlist->net[netcnt]); + } + break; + case WL_EVENT_CONN_FAILURE: + app_error("Connection failed\n"); + break; + case WL_EVENT_MEDIA_CONNECTED: + app_print("Connected to Access Point\n"); + app_ip_interface_up(); + break; + case WL_EVENT_MEDIA_DISCONNECTED: + app_print("Disconnected from Access Point\n"); + app_ip_interface_down(); + break; + } +} +\endcode + +\section security Security + +To use WEP a WEP key must be added before the connection is initiated. +To set the 40-bit WEP key 0xDEADBEEF00 as default key for key index 0 do + +\code + char key[5] = { 0xDE, 0xAD, 0xBE, 0xEF, 0x00 }; + struct wl_mac_addr_t bssid; + + // This means that the bssid is a broadcast bssid and the WEP key will be a default key instead of a key-mapping key. + memset(&bssid.octet, 0xff, sizeof bssid.octet); + + if ( wl_add_wep_key(0, sizeof key, key, &bssid) + != WL_SUCCESS ) { + app_error("Failed to add WEP key."); + return 0; + } +\endcode + +To use WPA/WPA2 with a Pre-shared key a passphrase must be associated +with the network before the connection is initiated. + +\code + struct wl_network_t net; + char passphrase[] = "MySecretKey"; + + memset(&net, 0, sizeof net); + memset(net.bssid.octet, 0xFF, sizeof net.bssid.octet); + strncpy(net.ssid.ssid, "My AP", strlen("My AP")); + net.ssid.len = strlen("My AP"); + net.enc_type = ENC_TYPE_AUTO; + if (wl_set_passphrase(&net, + passphrase, + strlen(passphrase), + ENC_TYPE_AUTO, + AUTH_MODE_AUTO) + != WL_SUCCESS) { + app_error("Failed to add passphrase"); + } +\endcode + +The library supports several passphrase-network associations to be +configured simultaneously. Be aware that the \a wl_connect() call +can take up to 15 seconds longer than normal when using a pre-shared +WPA/WPA2 key since the platform must calculate a temporal encryption +key from the passphrase before the connection attempt can start. + + * @{ + */ + + +/*! \brief Scan all channels. + * + * Starts a scan of all WiFi channels allowed in this regulatory + * domain. The list of allowed channels (the domain) is adapted to the + * channels announced as allowed by the first AP heard. + * + * The scan will proceed asynchronously and will raise a + * WL_EVENT_SCAN_COMPLETE event when completed. + * + * Currently, there's a limit on the scan list size that depends on the + * architecture (6 networks for the AVR32 UCR1 architecture 16 networks for + * other architectures. If more network exist, the strongest networks are + * chosen. Note that the limitation on the scan list size does not limit the + * networks which the device can connect to. See wl_connect() for more + * details. + * + * @return + * - WL_SUCCESS + * - WL_FAILURE. + */ +wl_err_t wl_scan(void); + +/*! \brief Get the list of currently known networks. + * + * Retrieves the list of currently known networks from + * the driver. To ensure that this list is up-to-date + * a wl_scan() call should be issued and this function + * should be called upon reception of the WL_EVENT_SCAN_COMPLETE + * event. This function can be called at other times + * but the list of networks retrieved then might not + * correspond to the networks actually in range. + * + * Note that a successful scan does not necessarily + * find any networks. + * + * @param network_list Output buffer. The API call returns + * a pointer to allocated memory containing the network list. + * @return + * - WL_SUCCESS + * - WL_FAILURE. + */ +wl_err_t wl_get_network_list(struct wl_network_list_t **network_list); + +#ifdef WFE_6_12 +/*! \brief Start a Ad-hoc network. + * + * Attempt to start a Ad-hoc (IBSS) network. If a Ad-hoc network + * is successfully started then a WL_EVENT_MEDIA_CONNECTED event + * will be raised once the first peer station connects to the Ad-hoc + * network (and not when the network is announced on the air). + * + * If a Ad-hoc network should be started with encryption + * enabled then \a wl_set_passphrase() should be called before + * \a wl_start_adhoc_net() to configure the security parameters. + * The Ad-hoc network is started with the security parameters + * (if any) that was configured for the specified \a ssid. + * + * @param ssid The SSID of the new network. If there's a network + * already present with this SSID this call will fail. + * @param channel The channel to use. Valid channels are 1-14 + * @param auth_mode The authentication mode to use. Supported + * authentication modes for Ad-hoc networks are + * AUTH_MODE_OPEN_SYSTEM and AUTH_MODE_SHARED_KEY. + * Passing other modes will cause a WL_INVALID_ARGS return. + * If AUTH_MODE_SHARED_KEY is used then a valid WEP + * key must be set with a call to \a wl_add_wep_key() + * and the default WEP key index must be set with a + * call to \a wl_set_default_wep_key(). + * @return + * - WL_SUCCESS on success. + * - WL_INVALID_ARGS if the ssid is malformed, if + * the channel not valid or if the authentication mode + * is invalid. + * - WL_RETRY if the driver is busy resolving a conflicting + * operation. The operation should be retried after a wait + * (at least one call to wl_poll() for polled implementations). + * - WL_BUSY if the driver is already connected or if a network + * with the same SSID is already known. + * + */ +wl_err_t wl_start_adhoc_net(struct wl_ssid_t ssid, + uint8_t channel, + enum wl_auth_mode auth_mode); +#endif +/*! \brief Connect to a SSID. + * + * Attempt to connect to a given SSID. If the driver is already + * connected to an AP with a different SSID then this call will + * return WL_BUSY and wl_disconnect() should be called before + * trying again. + * + * The connection process will proceed asynchronously and will raise a + * WL_EVENT_MEDIA_CONNECTED event when completed, or a WL_EVENT_CONN_FAILURE + * when failed. After a WL_EVENT_MEDIA_CONNECTED event has been raised + * a WL_EVENT_MEDIA_DISCONNECT event will be raised if the connection is + * terminated. Note that this can be caused by external factors and can + * happen at any time. + * + * If wl_connect() is invoked with a network that is not shown in the + * scan list, the device will probe for that specific network and connect + * to it, if found. This is also the method to use in order to connect to + * "hidden" networks (AP's that doesn't broadcast its SSID). + * + * @param ssid Pointer to the SSID string. + * Freed by caller. + * @param ssid_len Length of the SSID string in octets. Max value is 32. + * @return + * - WL_SUCCESS + * - WL_FAILURE if the network could not be found + * - WL_BUSY if the driver is already connected + * - WL_RETRY if the driver is busy resolving a conflicting operation. + * The operation should be retried after a wait (at least one call to wl_poll() + * for polled implementations). + */ +wl_err_t wl_connect(char* ssid, size_t ssid_len); + +/*! \brief Connect to a BSSID + * + * Attempt to connect to a given BSSID. If the driver is already + * connected to an AP with a different BSSID then this call will + * return WL_BUSY and wl_disconnect() should be called before + * trying again. + * + * The connection process will proceed asynchronously and will raise a + * WL_EVENT_MEDIA_CONNECTED event when completed, or a WL_EVENT_CONN_FAILURE + * when failed. After a WL_EVENT_MEDIA_CONNECTED event has been raised + * a WL_EVENT_MEDIA_DISCONNECT event will be raised if the connection is + * terminated. Note that this can be caused by external factors and can + * happen at any time. + * + * If wl_connect_bssid() is invoked with a network that is not shown in the + * scan list, the device will probe for that specific network and connect + * to it, if found. + * + * @param bssid Pointer to the BSSID. Freed by caller. + * @return + * - WL_SUCCESS + * - WL_FAILURE if the network could not be found + * - WL_BUSY if the driver is already connected + * - WL_RETRY if the driver is busy resolving a conflicting operation. + * The operation should be retried after a wait (at least one call to wl_poll() + * for polled implementations). + */ +wl_err_t wl_connect_bssid(struct wl_mac_addr_t bssid); + +/*! \brief Disconnect from the network + * + * Disconnect from any currently associated network. + * + * The disconnection process will proceed asynchronously and will raise a + * WL_EVENT_MEDIA_DISCONNECTED event when completed. + * @return + * - WL_SUCCESS if the disconnect process was started + * - WL_FAILURE if the driver was not connected + * - WL_RETRY if the driver is in the process of connecting. + * In this case the disconnect must be retried after + * the connection attempt has completed (resulted in a + * WL_EVENT_MEDIA_CONNECTED or a WL_EVENT_CONN_FAILURE event). + */ +wl_err_t wl_disconnect(void); + +/*! + * @brief Add a WEP encryption key to the device. + * + * Configure a key into the device. The key type (WEP-40, WEP-104) + * is determined by the size of the key (5 bytes for WEP-40, 13 bytes for WEP-104). + * + * @param key_idx The key index to set. Valid values are 0-3. + * @param key_len Length of key in bytes. Valid values are 5 and 13. + * @param key Key input buffer. + * @param bssid BSSID that the key applies to. If this is + * the broadcast BSSID then the key is configured + * as one of the default keys (not _the_ default key, + * this must be set by calling set_default_wep_key() + * after adding it). If the BSSID is a valid unicast + * bssid then the key is configured as a key-mapping + * key ( See 802.11-2007 8.2.1.3 ). + * @return + * - WL_SUCCESS on success. + * - WL_INVALID_LENGTH if the key length is bad. + * - WL_FAILURE on failure + */ +wl_err_t wl_add_wep_key(uint8_t key_idx, + size_t key_len, + const void *key, + struct wl_mac_addr_t *bssid); + +/*! @brief Set the default WEP key index. + * + * Select which WEP key to use for transmitted packets. + * For this to work correctly you must have added a WEP + * key with \a wl_add_wep_key() as a default key, using the + * same index as the one set in this call. + * @param key_idx Index of the key to make the default key. + * Valid values are 0-3. + * @return WL_SUCCESS or WL_FAILURE. + */ +wl_err_t wl_set_default_wep_key(uint8_t key_idx); + +/*! \brief Delete a WEP key. + * + * Deletes a WEP key from the driver. + * + * @param key_idx The index of the key to delete. Valid values are 0-3. + * @param bssid BSSID that the key applies to. If this is + * the broadcast BSSID then the key deleted is a default key. + * If the BSSID is a valid unicast bssid then the deleted + * key is a key-mapping key. + * @return WL_SUCCESS or WL_FAILURE + */ +wl_err_t wl_delete_wep_key(uint8_t key_idx, struct wl_mac_addr_t *bssid); + +/*! @brief Set a WPA/WPA2 passphase + * + * Associate a WPA/WPA2/RSN passphrase with a network. + * The number of passphrases that can be stored can + * vary but is always at least one. Passphrases can + * be added until \a wl_add_wpa_passphrase() returns + * WL_RESOURCES. + * + * @param net Network with which to associate the passphrase. + * @param passphrase Passphrase. Valid characters in a passphrase + * must lie between ASCII 32-126 (decimal). + * @param len Length of passphrase. Valid lengths are 8-63. + * @param enc_type Encryption type. If this is set to ENC_TYPE_AUTO + * then the most secure supported mode will be automatically + * selected. Normally you only need to pass something else here + * if you need to enforce picking a certain encryption mode when + * the network supports several modes and you don't want to use + * the best one. + * @param auth_mode Authentication mode. If this is set to AUTH_MODE_AUTO + * then the most secure mode will be automatically selected. + * Normally you only need to pass something else here if the network + * announces support for both WPA and WPA2/RSN and the passphrases are + * different. + * @return + * - WL_SUCCESS + * - WL_INVALID_ARGS if the passphrase length is invalid. + * - WL_RESOURCES if no more passphrases can be added. + */ +wl_err_t wl_set_passphrase(const struct wl_network_t *net, + const char *passphrase, + const size_t len, + const enum wl_enc_type enc_type, + const enum wl_auth_mode auth_mode); + +/*! @brief Remove a WPA/WPA2 passphase + * + * Remove a WPA/WPA2/RSN passphrase associated with a network. + * + * @param net Network with which to associate the passphrase. + * If net is NULL then all stored passphrases will be + * cleared. + * @return + * - WL_SUCCESS + * - WL_FAILURE if no passphrase was associated with the net. + */ +wl_err_t wl_clear_passphrase(struct wl_network_t *net); + + +/*! \brief Enable legacy power save mode + * + * Enable legacy power save mode. In legacy power save mode, the device + * will power down when idle. When connected, the device will wake up to + * receive beacon frames and any buffered data from the AP. The response + * time when legacy power save is enabled might therefore be as long as the + * AP beacon interval (mostly 100 ms). However, the throughput should not + * be affected. + * + * @return WL_SUCCESS or WL_FAILURE. + */ +wl_err_t wl_enable_ps(void); + +/*! \brief Disable legacy power save mode + * + * @return WL_SUCCESS or WL_FAILURE. + */ +wl_err_t wl_disable_ps(void); + +/*! \brief Configure power save parameters. + * + * @param use_ps_poll Use PS-Poll frames to retrieve buffered data. Any changes + * to this parameter will take effect upon next connect + * or when power save is enabled through wl_enable_ps(). + * Note: To retrieve one buffered packet, the ps poll scheme + * needs one ps poll packet to the AP instead of two null + * packets in the power management bit scheme. Ps poll avoids + * the overhead of traffic monitoring time in active mode as + * well. But since each ps poll request can make the AP + * release only one buffered packet, it is not the optimal + * scheme for applications with heavy downlink traffic. + * @param ps_traffic_timeout Timeout in [ms] to wait for more buffered data + * from AP. This setting has no effect if + * use_ps_poll is 1. Any changes to this parameter + * will take effect immediately. + * @param ps_delay Power save will de delayed ps_delay [ms] after connecting to + * an AP. + * @param rx_all_dtim If set to 1, then STA will wake up to listen to every + * beacon containing DTIM (delivery traffic indication messages) when + * connected. The actual DTIM interval is configured in the AP. + * If the DTIM interval, as configured in the AP, is larger than + * \a listen_interval, the STA will wakeup according to the + * \a listen_interval parameter. + * @param listen_interval The Listen Interval field is used to indicate to the + * AP how often a STA in power save mode wakes to listen + * to beacon frames. The value of this parameter is expressed in units + * of Beacon Interval. An AP may use the Listen Interval information in + * determining the lifetime of frames that it buffers for a STA. + * Any changes to this parameter will take effect upon next association. + * + * @return WL_SUCCESS or WL_FAILURE. + */ +wl_err_t wl_conf_ps(uint8_t use_ps_poll, + uint32_t ps_traffic_timeout, + uint32_t ps_delay, + uint8_t rx_all_dtim, + uint16_t listen_interval); + +/*! \brief Get the interface MAC address. + * + * Return the 802.3 MAC address of the network interface. + * + * @param buf Output buffer. It must be at least WL_MAC_ADDR_LENGTH + * bytes long and only the first WL_MAC_ADDR_LENGTH bytes + * will contain valid data. + * @return + * - WL_FAILURE if the interface is not up. + * - WL_SUCCESS + */ +wl_err_t wl_get_mac_addr(uint8_t* buf); + +/*! \brief Return the associated network. + * + * Return the description of the currently associated + * network, if any. + * + * @return The network description, or NULL of the driver + * is unconnected. + */ +struct wl_network_t* wl_get_current_network(void); +/*! @} */ + +/** \defgroup wl_data Data Transfer + * + * \brief Packet processing interface. + * + * Note that the examples in this group assumes that the transport library + * functions in the \a wl_transport group are being used. For more information, + * See the documentation for those functions in the \a wl_transport group. + +For the IP stack integration you need to intercept received packets so +they can be sent up the stack and to transmit packets coming down the +stack. + +By default the wl_api library discards all data packets. To receive +them the application must register a rx interrupt service routine (isr) +using the \a wl_register_rx_isr() function. + +\code +static void rx_isr(void* ctx) { + rx_pending = TRUE; +} +\endcode + +Since the rx_isr() function is only called in interrupt context, it is not +safe to perform the actual read directly from rx_isr(). If an OS is used, +the normal case is to signal a receiver thread to invoke the ip stack +read function to read the pending data. In a system that runs without an OS +(as in the example), a flag is set to indicate that wl_rx() can be invoked +from the ip stack read function next time the ip stack is polled. +The beginning of a ip stack read function can look like this + +\code +static void ip_stack_rx_pkt() { + char *pkt = malloc(MAX_PKT_SIZE); + uint16_t len = MAX_PKT_SIZE; + + if (p == NULL) { + app_error("Out of memory."); + return; + } + wl_rx(pkt, &len); + if (0 == len) { + app_error("Packet reception failed."); + free(pkt); + return + } +} +\endcode + +Since the ip_stack_rx_pkt() function should only be called when there is +actually a packet ready to read you do not have to check the return value +from \a wl_rx() since it only returns failure if there is no packet ready to +read. + +A packet arriving from the WiFi interface can be either a data +packet or a message from the WiFi hardware to the WiFi driver +(which is implemented by the wl_api library). This means that +wl_api must process every packet to decide if it is an internal +message or a data frame that +should be passed up to the application. Data packets are +prefixed with an extra header containing some administrative +information, and may be followed by padding bytes and so +wl_api also needs to strip the extra header and any padding +before the packet can be safely ingested by the IP stack. +All this happens in the function \a wl_process_rx() which \b must +be called on every packet received by a call to \a wl_rx(). + +Continuing the ip_stack_rx_pkt() example + +\code + { + char* stripped_pkt; + size_t stripped_pkt_len; + uint16_t vlan; + int status; + + status = wl_process_rx(pkt, + len, + &stripped_pkt, + &stripped_pkt_len, + &vlan); + if (WL_ABSORBED == status) { + // This is normal. The packet was a + // wl_api-internal message. + free(pkt); + return; + } + app_ip_stack_input(stripped_pkt, + stripped_pkt_len, + vlan); + free(pkt); + } +} +\endcode + +If \a wl_process_rx() decides that the packet was a command it processes +it and returns \a WL_ABSORBED to signal that the packet should +not be used by anyone else. Otherwise stripped_pkt is +pointing to the beginning of a 802.3 Ethernet frame of length +stripped_pkt_len. If the IP stack supports VLAN and QoS +the extra VLAN tag should be passed to the IP stack +together with the packet. For IP stacks without this support the VLAN tag +contents can safely be ignored, but it must still be filled in by \a wl_process_tx(). + +To register the receive isr + +\code + wl_register_rx_isr(rx_isr, NULL); +\endcode + +Transmitting data packets happens in a similar way but does not +require a callback/isr since the application/IP stack knows when it has +packets to send. + +\code +int ip_stack_tx_pkt(char *pkt, size_t len, uint16_t vlan_tag) { + int status; + char wlan_hdr[WL_HEADER_SIZE]; + // The packet must have an Ethernet header + if (len < ETHERNET_HEADER_SIZE) { + app_error("Invalid packet length"); + return 0; + } + hdr_len = sizeof wlan_hdr; + status = wl_process_tx(pkt, + ETHERNET_HEADER_SIZE, + len, + wlan_hdr, + vlan_tag, + NULL); + if ( WL_SUCCESS != status ) { + app_error("Packet processing failed"); + return 0; + } + // Transmit the header first + if (wl_tx(wlan_hdr, hdr_len) != WL_SUCCESS) { + app_error("Header transmission failed"); + return 0; + } + // Then transmit the data packet + if (wl_tx(pkt, len) != WL_SUCCESS) { + app_error("Packet transmission failed"); + return 0; + } +} +\endcode + +The final piece of the puzzle in the IP stack integration is +the MAC address of the WiFi interface + +\code + char mac_addr[WL_MAC_ADDR_LENGTH]; + + wl_get_mac_addr(mac_addr); + ip_stack_set_mac_address(mac_addr); +\endcode + + * @{ + */ + +/*! Size of the wl_api packet header */ +#ifdef WFE_6_12 +#define WL_HEADER_SIZE 16 +#else +#define WL_HEADER_SIZE 14 +#endif + +/*! Maximum packet size (including wl_api headers and paddings) + * + * Maximum packet size is obtained with the following data: + * + * 1500 bytes of Ethernet payload (MTU) + 14 bytes of Ethernet header + + * WL_HEADER_SIZE of wl header. This data is then size-aligned to 16. + * + */ +#define WL_MAX_PKT_LEN 1536 + + +/*! + * \brief Process rx packet. + * + * Processes a raw rx packet by unencrypting it (if necessary) + * and stripping headers so as to output a 802.3 frame. + * + * wl_process_rx() will strip bytes both from the head and from the tail. + * + * Upon return from wl_process_rx(), the pointer at stripped_pkt will + * point to the start of the Ethernet header, hence adjusting the offset + * by WL_HEADER_LEN bytes. Any padding (added by the wifi device) will + * be removed from the tail of the packet, hence making len smaller. + * + * The wl_api library of the device will not perform any Ethernet padding + * removal. The padding removal performed by wl_process_rx() is only for + * the padding used in the protocol shared by the host and the device. + * This padding is mainly there to ensure that the host does not have to + * deal with rx of odd-sized data buffers (which some DMA's have problems + * to handle). + * + * @param pkt Input buffer (raw packet) + * @param pkt_len Length of the input buffer (in bytes) + * @param stripped_pkt Pointer to the packet with the + * transport header stripped. + * @param stripped_pkt_len Length of the stripped packet. + * @param vlanid_prio VLAN ID and 802.1p priority value + * using following format: + *
+ *        1
+ *  5|432109876543|210
+ *  -+------------+---
+ *  0|   VLANID   |PRI
+ * 
+ * + * @returns + * - WL_FAILURE + * - WL_ABSORBED if the packet was an internal driver command + * and not a proper data packet. The packet should + * be freed and the stripped_pkt will not point + * to a valid packet. + * - WL_SUCCESS + */ +wl_err_t wl_process_rx(char *pkt, size_t pkt_len, char **stripped_pkt, + size_t *stripped_pkt_len, uint16_t *vlanid_prio); + +/*! \brief Process tx packet. + * + * Prepare tx packet for transmission. + * + * This function is typically used only by the TCP/IP stack driver. + * + * Takes a Ethernet II frame header and generates a message passing header + * for it. + * + * The caller should ensure that any frames injected into wl_process_tx() + * are proper Ethernet frames. The wl_api library or the device will not + * perform any Ethernet padding if the frames are too short. + * + * The Ethernet header is assumed to have the following layout : + * ... + * The rest of the Ethernet header buffer (if any) is ignored. + * + * A note on the TX packet representation : + * If your TX packets are simple contiguous buffers you can ignore + * the rest of this note and pass NULL in parameter \a pkt_handle. + * A TX packet may have a more complex structure than a RX packet + * (which must be a contiguous, flat buffer). The IP stack may + * for example represent a packet as a linked list of buffers where + * the Ethernet header, the IP header and other headers, are represented + * by separate buffers. In some cases, such as when the driver is + * running in SoftAP mode, a TX packet has to be copied and queued + * internally for later processing and to support this when packets + * have a complicated structure a special data access function can + * be registered. See \a wl_register_pkt_read_cb() for details. + * If you use \a wl_process_tx() with non-simple packets you + * should pass a handle to the packet in parameter \a pkt_handle + * and register an access function with \a wl_register_pkt_read_cb(). + * + * @param eth_hdr Input buffer (Ethernet header) + * @param eth_hdr_len Input buffer length (must be >= 14) + * This is usually the same as pkt_len unless e.g linked list or buffers + * chained in other ways are being used. + * @param pkt_len Length of the complete data packet (in bytes) + * @param hdr Pointer to the header buffer (must be + * allocated by the caller). The length of the buffer + * must be at least WL_HEADER_SIZE bytes. + * @param vlanid_prio VLAN ID and 802.1p priority value + * using following format: + *
+ *        1
+ *  5|432109876543|210
+ *  -+------------+---
+ *  0|   VLANID   |PRI
+ * 
+ * Ignored for legacy association (no WMM) + * @param pkt_handle A handle to the complete packet. If this parameter + * is NULL then \a eth_hdr is expected to point to the whole packet + * in a single contiguous buffer (the default). If a different packet + * representation is used this parameter should be a handle to the + * complete packet and will be passed unmodified to the data + * access function that was registered with \a wl_register_pkt_read_cb(). + * + * @returns + * - WL_FAILURE + * - WL_RESOURCES if packet can not be processed at the moment. + * The caller must either drop the packet or try + * retransmit it later. + * - WL_AVAIL if network not available + * - WL_SUCCESS if packet is ready for transmission through wl_tx(). + */ +wl_err_t wl_process_tx(char *eth_hdr, + size_t eth_hdr_len, + size_t pkt_len, + char *hdr, + uint16_t vlanid_prio, + void *pkt_handle); + + +/*! \brief Get current TX and RX rate used for data transfer + * + * During transmission and reception of data, the actual rate used will depend + * on the signal quality. This function can be used to get the actual rate used + * for the last tx and rx data. + * + * @param tx will hold the tx rate upon successful return. + * @param rx will hold the rx rate upon successful return. + * + * @return + * - WL_SUCCESS on success + * - WL_FAILURE on failure. + */ +wl_err_t wl_get_rate(wl_rate_t *tx, wl_rate_t *rx); + + +/*! @} */ /* End wl_data group */ + + +/** \defgroup wl_transport Transport interface + * + * \brief Low level transport interface. + * + * These functions access the low level transport driver which makes + * the application independent of the actual physical transport + * layer (usually SDIO or SPI). + * + +For applications running on an real time kernel or without an +operating system, the provided transport library will fit right into the +application design. However, when running on a more complex operating system +(such as windows or linux) which has its own transport primitivies and +components (and probably its own IP stack) it might be preferred to design a +custom transport library for that specific environment. Therefore, these +transport interface functions are fully optional. + + + * @{ + */ + +#define WL_RX_MIN_PKT_LEN 32 + + +/*! \brief WiFi event callback. + * + * This function is invoked in interrupt context when there is new data + * available from the mac. This function is supplied by the user + * of the API. + * + * This function is typically used only by the TCP/IP stack driver. + * + * @param ctx A context handle. This handle is passed + * untouched to the callback and has the same value + * as the context registered with the callback in + * wl_register_event_cb(). + */ +typedef void (*wl_rx_isr_t) (void* ctx); + + +/*! \brief Firmware access function. + * + * Reads the WiFi firmware image. This function is supplied by + * the user of this API since storage for the firmware image is + * managed by the application. + * + * This function should read the specified number of bytes of the + * firmware image starting at the specified \a offset. The number of + * bytes to read is given in \a len. Upon return, \a buf should point + * to a buffer which holds the read data and the number of valid bytes + * in \a buf is returned from the call. + * + * This function will be called repeatedly until the complete firmware + * image has been read. + * + * This function may be called again at any time while the driver is + * running to download further pieces of the WiFi firmware image as + * needed by the runtime requirements. This will normally only happen + * when the driver switches between networks of different kinds such + * as from WEP to WPA, or from ESS to IBSS for example. + * + * For convenience, any time a firmware chunk has been completely + * downloaded this function will be called once with the \a buf + * parameter set to NULL to indicate that no more data is needed right + * now and that any dynamically allocated buffers which holds firmware + * data can be freed without much performance impact. + * + * @param ctx Opaque context pointer as provided to \a wl_init() that will be + * passed back to the callback. + * @param buf Should be assigned the address of the buffer holding the read + * data upon return. This parameter can be NULL which indicates + * that there are no further immediately pending accesses. + * @param offset Offset in bytes from the start of the firmware image. + * Data should be copied into buf starting at \a offset. + * @param len The number of bytes to copy into \a buf. + * @return The number of bytes copied into buf. This may be smaller than + * \len if the implementation of the function so requires. + */ +typedef size_t (wl_fw_read_cb_t)(void *ctx, + const uint8_t **buf, + size_t offset, + size_t len); + + +/*! \brief Initialize the transport interface and download the WiFi firmware + * image to the device. + * + * This operation will proceed synchronously until the firmware is completely + * downloaded. wl_init() should be called after this function has returned to + * perform device initialization. + * + * @param fw_read_cb callback function to invoke during firmware download. + * @param ctx Opaque context pointer that will be passed to the callbacks + * when they are invoked. This parameter is never + * accessed by the API. + * @param mode will hold the host attention mode used by the transport layer. + * This parameter can be passed directly to \a wl_init(). + * + * @return + * + * - WL_CARD_FAILURE if the wl hardware device is not available + * - WL_FIRMWARE_INVALID if the firmware obtained through fw_read_cb is + * invalid. + * - WL_OOM if the necessary memory could not be allocated. + */ +wl_err_t wl_transport_init(wl_fw_read_cb_t *fw_read_cb, + void *ctx, + enum wl_host_attention_mode *mode); + +/*! \brief WiFi driver forward progress function + * + * This function must be called in polled environments to + * ensure forward progress. The call can be made as often as possible from + * the main application loop. However, the call will not have any effect unless + * there is an interrupt pending from the hardware. + * + * In interrupt mode, wl_poll() must be called if no interrupt + * handler is registered through wl_register_rx_isr(). When an interrupt + * handler is registered, it is no longer necessary to invoke wl_poll(). + * + * Note that this function should not be invoked from interrupt context. + * + */ +void wl_poll(void); + + +/*! \brief Register RX callback + * + * Register function to be called by the low level transport driver + * when a new packet is available or when there is a state change in the + * data path. When invoked, any pending data can be fetched by calling wl_rx(). + * + * This function is typically used only by the TCP/IP stack driver. + * Note, the registered function is called in interrupt context. + * + * @param isr rx interrup handler. + * @param ctx Opaque context pointer that is passed unmodified to the + * rx_cb callback when it is invoked. + * + * @return WL_SUCCESS + */ +wl_err_t wl_register_rx_isr(wl_rx_isr_t isr, void* ctx); + + +/*! \brief Read pending packet + * + * Read a pending packet from the low level transport driver. + * The read packet must be passed to the wl_process_rx() function + * for proper driver operation. + * + * @param buf Buffer to read the packet into. This buffer must be + * at least WL_MAX_PKT_LEN bytes long. + * @param len Length of buf in bytes. Contains the length of the + * read packet in bytes on output. + * @return + * - WL_FAILURE if no RX packet is pending. + * - WL_SUCCESS + */ +wl_err_t wl_rx(uint8_t* buf, uint16_t* len); + +/*! \brief Send processed tx packet + * + * Send a packet to the low level transport driver. + * This packet has to have been successfully processed by the + * wl_process_tx() function. + * + * @param buf Buffer to send. + * @param len Length of buf in bytes. + * + * @return + * - WL_FAILURE if the interface is not ready to send. + * - WL_SUCCESS if the packet was successfully transmitted. + */ +wl_err_t wl_tx(const uint8_t* buf, uint16_t len); + + +/*! \brief Configure data alignment + * + * This function can be used if the host SDIO/SPI controller has certain + * requirements on the data transfer sizes that can be used on the SDIO/SPI bus. + * + * If the txsize parameter is non-zero, additional padding data should be added + * when performing the low level transfer of data buffer of sizes that are not + * a multiple of the size_align parameter. See \ref wl_sdio and \ref wl_spi for + * more information. + * + * @param txsize will configure the size alignment for tx data. + * + */ +void wl_conf_alignment(uint8_t txsize); + + +/*! @} */ /* End wl_transport group */ + + +/** \defgroup wl_custom Custom environment support + * + * \brief Support for custom environments + * + * These functions should only be used in cases where the transport library is + * not used at all. This usually applies to operating systems and environments + * where there already exists a transport layer framework, e.g. linux or + * windows. + * + * + +Note that the \a wl_poll() function is part of the transport library. Therefore, +it should not be used in custom environments. Therefore, it is necessary to +implement a custom polling or interrupt based scheme to ensure that any +incoming packets are processed by the core. + + * @{ + */ + + /*! \brief Wakeup callback function. + * + * Invoked when the WiFi device should wake up from power save mode. + * This function should send the proper commands to the device. + * + * Note that this type should only be used in custom environments, where + * the transport library is not used. + * + * @param ctx Opaque context pointer as provided to \a wl_register_wakeup_cb() + * that will be passed back to the callback. + * @param wakeup indicates whether wakeup should be set or cleared in the + * device. + */ +typedef void (wl_wakeup_cb_t)(void* ctx, uint8_t wakeup); + +/*! \brief Register wakeup callback function. + * + * Register a function that will be invoked when the WiFi device should wake + * up from power save mode. + * + * Note that this function should only be used in custom environments, where + * the transport library is not used. + * + * @param wakeup_cb Will be invoked when the device should wakeup from sleep + * mode. + * @param ctx Opaque context pointer that will be passed back to the callback. + */ +void wl_register_wakeup_cb(wl_wakeup_cb_t *wakeup_cb, void *ctx); + + +/*! \brief Management tx callback function. + * + * Invoked when the a management message should be transmitted to the + * WiFi device. This function should ensure that the message is passed through + * to the device and should never fail. + * + * Note that this type should only be used in custom environments, where + * the transport library is not used. + * + * @param ctx Opaque context pointer as provided to \a wl_register_mgmt_tx_cb() + * that will be passed back to the callback. + * @param buf Points to the buffer which holds the management data, + * @param len Size of the buffer. + */ +typedef void (wl_mgmt_tx_cb_t)(void *ctx, const uint8_t *buf, uint16_t len); + + +/*! \brief Register management tx callback function + * + * Register a function that will be invoked when a management message should + * be transmitted to the device. + * + * Note that this function should only be used in custom environments, where + * the transport library is not used. + * + * IMPORTANT : In a custom environment without a transport library \a + * wl_register_mgmt_tx_cb() \b must have been called + * before \a wl_fw_download() is called since \a + * wl_fw_download() depends on the \a mgmt_tx_cb() to send + * the firmware data to the WiFi chip. + * + * @param mgmt_tx_cb The callback function to invoke. + * @param ctx Opaque context pointer that will be passed back to the callback. + */ +void wl_register_mgmt_tx_cb(wl_mgmt_tx_cb_t *mgmt_tx_cb, void *ctx); + + + +/*! \brief Download the WiFi firmware image to the device. + * + * This operation will proceed synchronously until the firmware is completely + * downloaded. wl_init() should be called after this function has returned to + * perform device initialization. This function depends on \a + * wl_register_mgmt_tx_cb(). See that function for details. + * + * @param ctx Opaque context pointer that will be passed to the callbacks + * when they are invoked. This parameter is never + * accessed by the API. + * @param fw_read_cb callback function to invoke during firmware download. + * + * @return + * + * - WL_CARD_FAILURE if the wl hardware device is not available + * - WL_FIRMWARE_INVALID if the firmware obtained through fw_read_cb is + * invalid. + * - WL_OOM if the necessary memory could not be allocated. + */ + wl_err_t wl_fw_download(wl_fw_read_cb_t *fw_read_cb, void *ctx); + + + +/*! @} */ /* End wl_custom group */ + + + +#endif diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wl_fw.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wl_fw.h new file mode 100644 index 0000000..5be5f37 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wl_fw.h @@ -0,0 +1,19287 @@ +/* + * Programming interface for wl_api. + * Copyright (C) 2010 HD Wireless AB + * + * You should have received a copy of the license along with this library. + */ + +#ifndef WITHOUT_STDINT +#include +#endif +const uint8_t fw_buf[154188] = { + 0x10, 0x61, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x10, 0x61, 0x04, 0x00, + 0x38, 0x61, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x20, 0x61, 0x04, 0x00, + 0x30, 0x61, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x30, 0x61, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x61, 0x04, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xee, 0xee, + 0xee, 0xee, 0x18, 0xf0, 0x9f, 0xe5, 0x18, 0xf0, + 0x9f, 0xe5, 0x18, 0xf0, 0x9f, 0xe5, 0x18, 0xf0, + 0x9f, 0xe5, 0x00, 0x00, 0xa0, 0xe1, 0x18, 0xf0, + 0x9f, 0xe5, 0x18, 0xf0, 0x9f, 0xe5, 0x44, 0x00, + 0x00, 0x00, 0xb4, 0x08, 0x00, 0x00, 0xb4, 0x08, + 0x00, 0x00, 0xb4, 0x08, 0x00, 0x00, 0xb4, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x08, + 0x00, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0xe1, 0x1f, 0x00, 0xc0, 0xe3, + 0x13, 0x00, 0x80, 0xe3, 0xc0, 0x00, 0x80, 0xe3, + 0x00, 0xf0, 0x2f, 0xe1, 0x1c, 0xf0, 0x9f, 0xe5, + 0x3d, 0x02, 0x00, 0xeb, 0x5a, 0x02, 0x00, 0xeb, + 0x8d, 0x02, 0x00, 0xeb, 0x01, 0x00, 0x8f, 0xe2, + 0x10, 0xff, 0x2f, 0xe1, 0x41, 0xf0, 0xde, 0xfb, + 0x01, 0xf0, 0xdc, 0xfd, 0x3c, 0x00, 0x78, 0x00, + 0x00, 0x00, 0xfe, 0xe7, 0x00, 0x00, 0x5c, 0x00, + 0x00, 0x00, 0x78, 0x47, 0xc0, 0x46, 0x01, 0x00, + 0x00, 0xea, 0x78, 0x47, 0xc0, 0x46, 0x17, 0x00, + 0x00, 0xea, 0x8c, 0x11, 0x9f, 0xe5, 0x00, 0x20, + 0x91, 0xe5, 0x00, 0x30, 0x0f, 0xe1, 0x84, 0x11, + 0x9f, 0xe5, 0xfd, 0x20, 0xa1, 0xe8, 0x80, 0x01, + 0x9f, 0xe5, 0x80, 0x21, 0x9f, 0xe5, 0x01, 0x20, + 0x42, 0xe0, 0x0d, 0x00, 0x40, 0xe0, 0x3c, 0x00, + 0xb4, 0x00, 0x00, 0x00, 0x02, 0x00, 0x50, 0xe1, + 0x28, 0x00, 0x00, 0xaa, 0x68, 0x01, 0x9f, 0xe5, + 0x0d, 0x00, 0x50, 0xe1, 0x02, 0x00, 0x00, 0xba, + 0x04, 0x20, 0x10, 0xe4, 0x04, 0x20, 0x81, 0xe4, + 0xfa, 0xff, 0xff, 0xea, 0x58, 0x11, 0x9f, 0xe5, + 0x58, 0x01, 0x9f, 0xe5, 0x00, 0x00, 0x81, 0xe5, + 0x3c, 0x11, 0x9f, 0xe5, 0x50, 0x01, 0x9f, 0xe5, + 0x00, 0x00, 0x81, 0xe5, 0x1e, 0xff, 0x2f, 0xe1, + 0x3c, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x48, 0x11, + 0x9f, 0xe5, 0x00, 0x00, 0x91, 0xe5, 0x24, 0x11, + 0x9f, 0xe5, 0x00, 0x00, 0x81, 0xe5, 0x2c, 0x11, + 0x9f, 0xe5, 0x38, 0x01, 0x9f, 0xe5, 0x00, 0x00, + 0x81, 0xe5, 0x1e, 0xff, 0x2f, 0xe1, 0x74, 0x02, + 0x00, 0xeb, 0x10, 0x01, 0x9f, 0xe5, 0x28, 0x11, + 0x9f, 0xe5, 0x04, 0x20, 0x91, 0xe4, 0x04, 0x20, + 0x00, 0xe4, 0x04, 0x21, 0x9f, 0xe5, 0x02, 0x00, + 0x51, 0xe1, 0x3c, 0x00, 0x2c, 0x01, 0x00, 0x00, + 0xfa, 0xff, 0xff, 0x1a, 0xf0, 0x10, 0x9f, 0xe5, + 0xfd, 0x20, 0xb1, 0xe8, 0x03, 0xf0, 0x2f, 0xe1, + 0xe0, 0x10, 0x9f, 0xe5, 0x00, 0x20, 0x81, 0xe5, + 0xe8, 0x10, 0x9f, 0xe5, 0xf4, 0x20, 0x9f, 0xe5, + 0x00, 0x20, 0x81, 0xe5, 0x02, 0x10, 0x80, 0xe2, + 0x00, 0x00, 0x20, 0xe0, 0x01, 0x00, 0x40, 0xe2, + 0x11, 0xff, 0x2f, 0xe1, 0x01, 0x00, 0x8f, 0xe2, + 0x10, 0xff, 0x2f, 0xe1, 0x3c, 0x00, 0x68, 0x01, + 0x00, 0x00, 0x01, 0xf0, 0x9c, 0xf8, 0x78, 0x47, + 0x00, 0x00, 0x01, 0x00, 0x8f, 0xe2, 0x10, 0xff, + 0x2f, 0xe1, 0x01, 0xf0, 0x94, 0xf8, 0x78, 0x47, + 0x00, 0x00, 0x03, 0x00, 0x2d, 0xe9, 0x00, 0x10, + 0x0f, 0xe1, 0x00, 0x10, 0x80, 0xe5, 0xb8, 0x10, + 0x9f, 0xe5, 0x04, 0x10, 0x80, 0xe5, 0x00, 0x10, + 0xa0, 0xe1, 0x10, 0x00, 0x80, 0xe2, 0xfc, 0x1f, + 0xa0, 0xe8, 0x00, 0x20, 0xa0, 0xe1, 0x3c, 0x00, + 0xa4, 0x01, 0x00, 0x00, 0x01, 0x30, 0xa0, 0xe1, + 0x03, 0x00, 0xbd, 0xe8, 0x08, 0x00, 0x83, 0xe5, + 0x0c, 0x10, 0x83, 0xe5, 0xd3, 0x00, 0xa0, 0xe3, + 0x00, 0xf0, 0x21, 0xe1, 0x00, 0x60, 0xa2, 0xe8, + 0x00, 0x10, 0x4f, 0xe1, 0x04, 0x10, 0x82, 0xe4, + 0xd2, 0x00, 0xa0, 0xe3, 0x00, 0xf0, 0x21, 0xe1, + 0x00, 0x60, 0xa2, 0xe8, 0x00, 0x10, 0x4f, 0xe1, + 0x04, 0x10, 0x82, 0xe4, 0xd1, 0x00, 0xa0, 0xe3, + 0x3c, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, 0xf0, + 0x21, 0xe1, 0x00, 0x7f, 0xa2, 0xe8, 0x00, 0x10, + 0x4f, 0xe1, 0x04, 0x10, 0x82, 0xe4, 0xd7, 0x00, + 0xa0, 0xe3, 0x00, 0xf0, 0x21, 0xe1, 0x00, 0x60, + 0xa2, 0xe8, 0x00, 0x10, 0x4f, 0xe1, 0x04, 0x10, + 0x82, 0xe4, 0xdb, 0x00, 0xa0, 0xe3, 0x00, 0xf0, + 0x21, 0xe1, 0x00, 0x60, 0xa2, 0xe8, 0x00, 0x10, + 0x4f, 0xe1, 0x00, 0x10, 0x82, 0xe5, 0x00, 0x00, + 0x93, 0xe5, 0x3c, 0x00, 0x1c, 0x02, 0x00, 0x00, + 0x00, 0xf0, 0x2f, 0xe1, 0x1e, 0xff, 0x2f, 0xe1, + 0x20, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x00, + 0x20, 0xee, 0x01, 0x00, 0xd8, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0xf0, 0x9f, 0xe5, + 0x10, 0x01, 0x00, 0x00, 0x08, 0x03, 0x00, 0x00, + 0xee, 0xee, 0xee, 0xee, 0x24, 0x03, 0x00, 0x00, + 0x20, 0x02, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, + 0x63, 0x1c, 0x0b, 0x4d, 0x3c, 0x00, 0x58, 0x02, + 0x00, 0x00, 0x01, 0xd1, 0x6c, 0x69, 0x10, 0xe0, + 0x00, 0xf0, 0x6c, 0xfb, 0x09, 0x48, 0xff, 0xf7, + 0x0c, 0xff, 0xec, 0x60, 0x08, 0x4a, 0x51, 0x68, + 0x50, 0x68, 0x88, 0x42, 0xfc, 0xd0, 0x02, 0x20, + 0x28, 0x70, 0x01, 0x21, 0x8a, 0x20, 0x01, 0xf0, + 0x12, 0xf8, 0x20, 0x1c, 0xb0, 0xbd, 0x30, 0x00, + 0x07, 0x00, 0x51, 0x02, 0x00, 0x00, 0x00, 0x03, + 0x07, 0x00, 0xb0, 0xb5, 0x05, 0x1c, 0x3c, 0x00, + 0x94, 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0xf0, + 0x50, 0xfb, 0x14, 0x48, 0xff, 0xf7, 0xf0, 0xfe, + 0x13, 0x49, 0x14, 0x48, 0xc1, 0x60, 0x01, 0x21, + 0x13, 0x4a, 0x49, 0x03, 0x91, 0x60, 0x13, 0x49, + 0xca, 0x78, 0x08, 0x23, 0x9a, 0x43, 0xca, 0x70, + 0xca, 0x78, 0x04, 0x23, 0x1a, 0x43, 0xca, 0x70, + 0x6b, 0x1c, 0x0d, 0xd0, 0x0e, 0x4b, 0x5a, 0x68, + 0x59, 0x68, 0x91, 0x42, 0xfc, 0xd0, 0xbe, 0x21, + 0x3c, 0x00, 0xd0, 0x02, 0x00, 0x00, 0x19, 0x73, + 0x19, 0x7a, 0x11, 0x22, 0x91, 0x43, 0x19, 0x72, + 0x19, 0x7a, 0xc9, 0x07, 0xfc, 0xd4, 0x02, 0x21, + 0x01, 0x70, 0xff, 0xf7, 0xd0, 0xfe, 0x20, 0x1c, + 0xb0, 0xbd, 0x91, 0x02, 0x00, 0x00, 0xff, 0xff, + 0xff, 0x00, 0x30, 0x00, 0x07, 0x00, 0x00, 0x10, + 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x03, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x0c, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x84, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, + 0x08, 0x47, 0x10, 0x47, 0x18, 0x47, 0x20, 0x47, + 0x28, 0x47, 0x30, 0x47, 0x38, 0x47, 0x10, 0xb5, + 0x04, 0x1c, 0x10, 0x1c, 0x00, 0xf0, 0x23, 0xf9, + 0x03, 0xc4, 0x10, 0xbc, 0x08, 0xbc, 0x18, 0x47, + 0x00, 0x00, 0x3c, 0x00, 0xfc, 0x03, 0x00, 0x00, + 0x10, 0xb4, 0x04, 0x2a, 0x0e, 0xd3, 0x03, 0x1c, + 0x0b, 0x43, 0x9b, 0x07, 0x0a, 0xd1, 0x08, 0xc8, + 0x10, 0xc9, 0xa3, 0x42, 0x02, 0xd1, 0x04, 0x3a, + 0x04, 0x2a, 0xf8, 0xd2, 0xa3, 0x42, 0x01, 0xd0, + 0x04, 0x38, 0x04, 0x39, 0x00, 0x2a, 0x02, 0xd1, + 0x00, 0x20, 0x10, 0xbc, 0x70, 0x47, 0xd3, 0x07, + 0x01, 0xd5, 0x01, 0x32, 0x05, 0xe0, 0x03, 0x78, + 0x0c, 0x78, 0x01, 0x31, 0x3c, 0x00, 0x38, 0x04, + 0x00, 0x00, 0x01, 0x30, 0xa3, 0x42, 0x07, 0xd1, + 0x03, 0x78, 0x0c, 0x78, 0x01, 0x31, 0x01, 0x30, + 0xa3, 0x42, 0x01, 0xd1, 0x02, 0x3a, 0xf1, 0xd1, + 0x18, 0x1b, 0xe9, 0xe7, 0x00, 0x00, 0x78, 0x47, + 0x00, 0x00, 0x00, 0x20, 0xa0, 0xe3, 0x04, 0x00, + 0x51, 0xe3, 0x08, 0x00, 0x00, 0x3a, 0x03, 0xc0, + 0x10, 0xe2, 0x0d, 0x00, 0x00, 0x0a, 0x04, 0xc0, + 0x6c, 0xe2, 0x02, 0x00, 0x5c, 0xe3, 0x3c, 0x00, + 0x74, 0x04, 0x00, 0x00, 0x01, 0x20, 0xc0, 0xe4, + 0x01, 0x20, 0xc0, 0xa4, 0x01, 0x20, 0xc0, 0xc4, + 0x0c, 0x10, 0x41, 0xe0, 0x06, 0x00, 0x00, 0xea, + 0x81, 0xcf, 0xb0, 0xe1, 0x01, 0x20, 0xc0, 0x24, + 0x01, 0x20, 0xc0, 0x24, 0x01, 0x20, 0xc0, 0x44, + 0x1e, 0xff, 0x2f, 0xe1, 0x78, 0x47, 0x00, 0x00, + 0x00, 0x20, 0xa0, 0xe3, 0x00, 0x40, 0x2d, 0xe9, + 0x02, 0x30, 0xa0, 0xe1, 0x02, 0xc0, 0xa0, 0xe1, + 0x3c, 0x00, 0xb0, 0x04, 0x00, 0x00, 0x02, 0xe0, + 0xa0, 0xe1, 0x20, 0x10, 0x51, 0xe2, 0x0c, 0x50, + 0xa0, 0x28, 0x0c, 0x50, 0xa0, 0x28, 0x20, 0x10, + 0x51, 0x22, 0xfb, 0xff, 0xff, 0x2a, 0x01, 0x1e, + 0xb0, 0xe1, 0x0c, 0x50, 0xa0, 0x28, 0x0c, 0x00, + 0xa0, 0x48, 0x00, 0x40, 0xbd, 0xe8, 0x01, 0x11, + 0xb0, 0xe1, 0x04, 0x20, 0x80, 0x24, 0x1e, 0xff, + 0x2f, 0x01, 0x01, 0x20, 0xc0, 0x44, 0x01, 0x20, + 0xc0, 0x44, 0x3c, 0x00, 0xec, 0x04, 0x00, 0x00, + 0x40, 0x04, 0x11, 0xe3, 0x01, 0x20, 0xc0, 0x14, + 0x1e, 0xff, 0x2f, 0xe1, 0x78, 0x47, 0x00, 0x00, + 0x03, 0x00, 0x52, 0xe3, 0x3e, 0x00, 0x00, 0x9a, + 0x03, 0xc0, 0x10, 0xe2, 0x08, 0x00, 0x00, 0x0a, + 0x01, 0x30, 0xd1, 0xe4, 0x02, 0x00, 0x5c, 0xe3, + 0x0c, 0x20, 0x82, 0xe0, 0x01, 0xc0, 0xd1, 0x94, + 0x01, 0x30, 0xc0, 0xe4, 0x01, 0x30, 0xd1, 0x34, + 0x04, 0x20, 0x42, 0xe2, 0x3c, 0x00, 0x28, 0x05, + 0x00, 0x00, 0x01, 0xc0, 0xc0, 0x94, 0x01, 0x30, + 0xc0, 0x34, 0x03, 0x30, 0x11, 0xe2, 0x1e, 0x00, + 0x00, 0x0a, 0x04, 0x20, 0x52, 0xe2, 0x2f, 0x00, + 0x00, 0x3a, 0x03, 0xc0, 0x31, 0xe7, 0x02, 0x00, + 0x53, 0xe3, 0x08, 0x00, 0x00, 0x0a, 0x0f, 0x00, + 0x00, 0x8a, 0x2c, 0x34, 0xa0, 0xe1, 0x04, 0xc0, + 0xb1, 0xe5, 0x04, 0x20, 0x52, 0xe2, 0x0c, 0x3c, + 0x83, 0xe1, 0x04, 0x30, 0x80, 0xe4, 0x3c, 0x00, + 0x64, 0x05, 0x00, 0x00, 0xf9, 0xff, 0xff, 0x2a, + 0x01, 0x10, 0x81, 0xe2, 0x23, 0x00, 0x00, 0xea, + 0x2c, 0x38, 0xa0, 0xe1, 0x04, 0xc0, 0xb1, 0xe5, + 0x04, 0x20, 0x52, 0xe2, 0x0c, 0x38, 0x83, 0xe1, + 0x04, 0x30, 0x80, 0xe4, 0xf9, 0xff, 0xff, 0x2a, + 0x02, 0x10, 0x81, 0xe2, 0x1b, 0x00, 0x00, 0xea, + 0x2c, 0x3c, 0xa0, 0xe1, 0x04, 0xc0, 0xb1, 0xe5, + 0x04, 0x20, 0x52, 0xe2, 0x0c, 0x34, 0x83, 0xe1, + 0x3c, 0x00, 0xa0, 0x05, 0x00, 0x00, 0x04, 0x30, + 0x80, 0xe4, 0xf9, 0xff, 0xff, 0x2a, 0x03, 0x10, + 0x81, 0xe2, 0x13, 0x00, 0x00, 0xea, 0x78, 0x47, + 0x00, 0x00, 0x10, 0x40, 0x2d, 0xe9, 0x20, 0x20, + 0x52, 0xe2, 0x05, 0x00, 0x00, 0x3a, 0x18, 0x50, + 0xb1, 0x28, 0x18, 0x50, 0xa0, 0x28, 0x18, 0x50, + 0xb1, 0x28, 0x18, 0x50, 0xa0, 0x28, 0x20, 0x20, + 0x52, 0x22, 0xf9, 0xff, 0xff, 0x2a, 0x02, 0xce, + 0xb0, 0xe1, 0x3c, 0x00, 0xdc, 0x05, 0x00, 0x00, + 0x18, 0x50, 0xb1, 0x28, 0x18, 0x50, 0xa0, 0x28, + 0x18, 0x00, 0xb1, 0x48, 0x18, 0x00, 0xa0, 0x48, + 0x10, 0x40, 0xbd, 0xe8, 0x02, 0xcf, 0xb0, 0xe1, + 0x04, 0x30, 0x91, 0x24, 0x04, 0x30, 0x80, 0x24, + 0x1e, 0xff, 0x2f, 0x01, 0x82, 0x2f, 0xb0, 0xe1, + 0x01, 0x20, 0xd1, 0x44, 0x01, 0x30, 0xd1, 0x24, + 0x01, 0xc0, 0xd1, 0x24, 0x01, 0x20, 0xc0, 0x44, + 0x01, 0x30, 0xc0, 0x24, 0x3c, 0x00, 0x18, 0x06, + 0x00, 0x00, 0x01, 0xc0, 0xc0, 0x24, 0x1e, 0xff, + 0x2f, 0xe1, 0x78, 0x47, 0x00, 0x00, 0xff, 0x30, + 0x01, 0xe2, 0x02, 0x10, 0xa0, 0xe1, 0x03, 0x24, + 0x83, 0xe1, 0x02, 0x28, 0x82, 0xe1, 0x88, 0xff, + 0xff, 0xea, 0x78, 0x47, 0x00, 0x00, 0x80, 0x24, + 0x10, 0xe2, 0x00, 0x00, 0x60, 0x42, 0x41, 0x30, + 0x32, 0xe0, 0x00, 0x10, 0x61, 0x22, 0xa1, 0xc1, + 0x70, 0xe0, 0x20, 0x00, 0x00, 0x3a, 0x3c, 0x00, + 0x54, 0x06, 0x00, 0x00, 0x21, 0xc4, 0x70, 0xe0, + 0x0f, 0x00, 0x00, 0x3a, 0x00, 0x04, 0xa0, 0xe1, + 0xff, 0x24, 0x82, 0xe3, 0x21, 0xc2, 0x70, 0xe0, + 0x17, 0x00, 0x00, 0x3a, 0x21, 0xc4, 0x70, 0xe0, + 0x09, 0x00, 0x00, 0x3a, 0x00, 0x04, 0xa0, 0xe1, + 0xff, 0x28, 0x82, 0xe3, 0x21, 0xc4, 0x70, 0xe0, + 0x00, 0x04, 0xa0, 0x21, 0xff, 0x2c, 0x82, 0x23, + 0x21, 0xc2, 0x70, 0xe0, 0x0e, 0x00, 0x00, 0x3a, + 0x3c, 0x00, 0x90, 0x06, 0x00, 0x00, 0x00, 0xc0, + 0x70, 0xe2, 0x83, 0x00, 0x00, 0x2a, 0x20, 0x04, + 0xa0, 0x21, 0xa1, 0xc3, 0x70, 0xe0, 0x80, 0x13, + 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0x21, 0xc3, + 0x70, 0xe0, 0x00, 0x13, 0x41, 0x20, 0x02, 0x20, + 0xa2, 0xe0, 0xa1, 0xc2, 0x70, 0xe0, 0x80, 0x12, + 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0x21, 0xc2, + 0x70, 0xe0, 0x00, 0x12, 0x41, 0x20, 0x02, 0x20, + 0xa2, 0xe0, 0x3c, 0x00, 0xcc, 0x06, 0x00, 0x00, + 0xa1, 0xc1, 0x70, 0xe0, 0x80, 0x11, 0x41, 0x20, + 0x02, 0x20, 0xa2, 0xe0, 0x21, 0xc1, 0x70, 0xe0, + 0x00, 0x11, 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, + 0xa1, 0xc0, 0x70, 0xe0, 0x80, 0x10, 0x41, 0x20, + 0x02, 0x20, 0xa2, 0xe0, 0x01, 0xc0, 0x70, 0xe0, + 0x00, 0x10, 0x41, 0x20, 0x02, 0x20, 0xb2, 0xe0, + 0xe5, 0xff, 0xff, 0x2a, 0xc3, 0x0f, 0x32, 0xe0, + 0xa3, 0x0f, 0x80, 0xe0, 0x3c, 0x00, 0x08, 0x07, + 0x00, 0x00, 0x00, 0x10, 0x61, 0x22, 0x1e, 0xff, + 0x2f, 0xe1, 0x78, 0x47, 0x00, 0x00, 0x00, 0x20, + 0xa0, 0xe3, 0xa1, 0xc1, 0x70, 0xe0, 0x20, 0x00, + 0x00, 0x3a, 0x21, 0xc4, 0x70, 0xe0, 0x0f, 0x00, + 0x00, 0x3a, 0x00, 0x04, 0xa0, 0xe1, 0xff, 0x24, + 0x82, 0xe3, 0x21, 0xc2, 0x70, 0xe0, 0x17, 0x00, + 0x00, 0x3a, 0x21, 0xc4, 0x70, 0xe0, 0x09, 0x00, + 0x00, 0x3a, 0x00, 0x04, 0xa0, 0xe1, 0x3c, 0x00, + 0x44, 0x07, 0x00, 0x00, 0xff, 0x28, 0x82, 0xe3, + 0x21, 0xc4, 0x70, 0xe0, 0x00, 0x04, 0xa0, 0x21, + 0xff, 0x2c, 0x82, 0x23, 0x21, 0xc2, 0x70, 0xe0, + 0x0e, 0x00, 0x00, 0x3a, 0x00, 0xc0, 0x70, 0xe2, + 0x50, 0x00, 0x00, 0x2a, 0x20, 0x04, 0xa0, 0x21, + 0xa1, 0xc3, 0x70, 0xe0, 0x80, 0x13, 0x41, 0x20, + 0x02, 0x20, 0xa2, 0xe0, 0x21, 0xc3, 0x70, 0xe0, + 0x00, 0x13, 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, + 0x3c, 0x00, 0x80, 0x07, 0x00, 0x00, 0xa1, 0xc2, + 0x70, 0xe0, 0x80, 0x12, 0x41, 0x20, 0x02, 0x20, + 0xa2, 0xe0, 0x21, 0xc2, 0x70, 0xe0, 0x00, 0x12, + 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0xa1, 0xc1, + 0x70, 0xe0, 0x80, 0x11, 0x41, 0x20, 0x02, 0x20, + 0xa2, 0xe0, 0x21, 0xc1, 0x70, 0xe0, 0x00, 0x11, + 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0xa1, 0xc0, + 0x70, 0xe0, 0x80, 0x10, 0x41, 0x20, 0x02, 0x20, + 0xa2, 0xe0, 0x3c, 0x00, 0xbc, 0x07, 0x00, 0x00, + 0x01, 0xc0, 0x70, 0xe0, 0x00, 0x10, 0x41, 0x20, + 0x02, 0x20, 0xb2, 0xe0, 0xe5, 0xff, 0xff, 0x2a, + 0x02, 0x00, 0xa0, 0xe1, 0x1e, 0xff, 0x2f, 0xe1, + 0x78, 0x47, 0x00, 0x00, 0x0a, 0x10, 0x40, 0xe2, + 0x20, 0x01, 0x40, 0xe0, 0x20, 0x02, 0x80, 0xe0, + 0x20, 0x04, 0x80, 0xe0, 0x20, 0x08, 0x80, 0xe0, + 0xa0, 0x01, 0xa0, 0xe1, 0x00, 0x21, 0x80, 0xe0, + 0x82, 0x10, 0x51, 0xe0, 0x3c, 0x00, 0xf8, 0x07, + 0x00, 0x00, 0x01, 0x00, 0x80, 0x52, 0x0a, 0x10, + 0x81, 0x42, 0x1e, 0xff, 0x2f, 0xe1, 0x30, 0xb4, + 0x44, 0x1c, 0x81, 0x07, 0x08, 0xd0, 0x01, 0x78, + 0x01, 0x30, 0x00, 0x29, 0x02, 0xd1, 0x00, 0x1b, + 0x30, 0xbc, 0x70, 0x47, 0x81, 0x07, 0xf6, 0xd1, + 0x0b, 0x4a, 0xd5, 0x01, 0x02, 0xc8, 0x8b, 0x1a, + 0x8b, 0x43, 0x2b, 0x40, 0xfa, 0xd0, 0x00, 0x1b, + 0x0a, 0x06, 0x01, 0xd1, 0x03, 0x38, 0x3c, 0x00, + 0x34, 0x08, 0x00, 0x00, 0xef, 0xe7, 0x0a, 0x04, + 0x12, 0x0e, 0x01, 0xd1, 0x02, 0x38, 0xea, 0xe7, + 0x09, 0x02, 0x09, 0x0e, 0xe7, 0xd1, 0x01, 0x38, + 0xe5, 0xe7, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, + 0xf0, 0xb4, 0x03, 0x1c, 0x04, 0x1c, 0x0c, 0x43, + 0xa4, 0x07, 0x0c, 0xd1, 0x10, 0x4d, 0xef, 0x01, + 0x02, 0xe0, 0x04, 0x31, 0x04, 0x3a, 0x10, 0xc3, + 0x04, 0x2a, 0x04, 0xd3, 0x0c, 0x68, 0x66, 0x1b, + 0x3c, 0x00, 0x70, 0x08, 0x00, 0x00, 0xa6, 0x43, + 0x3e, 0x40, 0xf5, 0xd0, 0x00, 0x2a, 0x07, 0xd0, + 0x0c, 0x78, 0x01, 0x31, 0x1c, 0x70, 0x01, 0x33, + 0x00, 0x2c, 0x03, 0xd0, 0x01, 0x3a, 0xf7, 0xd1, + 0xf0, 0xbc, 0x70, 0x47, 0x01, 0x2a, 0xfb, 0xd9, + 0x51, 0x1e, 0x00, 0x22, 0x1a, 0x70, 0x01, 0x33, + 0x01, 0x39, 0xfb, 0xd1, 0xf4, 0xe7, 0x01, 0x01, + 0x01, 0x01, 0x78, 0x47, 0x00, 0x00, 0x02, 0x00, + 0xa0, 0xe3, 0x3c, 0x00, 0xac, 0x08, 0x00, 0x00, + 0x02, 0x10, 0xa0, 0xe3, 0x2e, 0xfe, 0xff, 0xea, + 0x1f, 0x40, 0x2d, 0xe9, 0x00, 0x00, 0x0f, 0xe1, + 0xc0, 0x00, 0x80, 0xe3, 0x00, 0xf0, 0x2f, 0xe1, + 0x81, 0x00, 0xa0, 0xe3, 0x02, 0x10, 0xa0, 0xe3, + 0x01, 0x20, 0x8f, 0xe2, 0x12, 0xff, 0x2f, 0xe1, + 0x00, 0xf0, 0xe6, 0xfc, 0x78, 0x47, 0x00, 0x00, + 0x1f, 0x40, 0xbd, 0xe8, 0xfe, 0xff, 0xff, 0xea, + 0x1f, 0x50, 0x2d, 0xe9, 0x3c, 0x00, 0xe8, 0x08, + 0x00, 0x00, 0x01, 0x00, 0x8f, 0xe2, 0x10, 0xff, + 0x2f, 0xe1, 0x00, 0xf0, 0x40, 0xfb, 0x78, 0x47, + 0x00, 0x00, 0x1f, 0x50, 0xbd, 0xe8, 0x04, 0xf0, + 0x5e, 0xe2, 0x1f, 0x50, 0x2d, 0xe9, 0x01, 0x00, + 0x8f, 0xe2, 0x10, 0xff, 0x2f, 0xe1, 0x00, 0xf0, + 0x18, 0xfb, 0x78, 0x47, 0x00, 0x00, 0x1f, 0x50, + 0xbd, 0xe8, 0x04, 0xf0, 0x5e, 0xe2, 0x00, 0xbd, + 0x01, 0xb5, 0x00, 0xa0, 0x00, 0x47, 0x3c, 0x00, + 0x24, 0x09, 0x00, 0x00, 0x00, 0x30, 0x0f, 0xe1, + 0xc0, 0x30, 0xc3, 0xe3, 0x03, 0xf0, 0x21, 0xe1, + 0x01, 0x00, 0x8f, 0xe2, 0x10, 0xff, 0x2f, 0xe1, + 0x01, 0xbd, 0x01, 0xb5, 0x00, 0xa0, 0x00, 0x47, + 0x00, 0x30, 0x0f, 0xe1, 0xc0, 0x30, 0x83, 0xe3, + 0x03, 0xf0, 0x21, 0xe1, 0x01, 0x00, 0x8f, 0xe2, + 0x10, 0xff, 0x2f, 0xe1, 0x01, 0xbd, 0x00, 0x00, + 0x18, 0x00, 0x9f, 0xe5, 0x04, 0x10, 0x90, 0xe4, + 0x3c, 0x00, 0x60, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x51, 0xe3, 0x02, 0x00, 0x00, 0x0a, 0x04, 0x20, + 0x90, 0xe4, 0x00, 0x20, 0x81, 0xe5, 0xf9, 0xff, + 0xff, 0xea, 0x0e, 0xf0, 0xa0, 0xe1, 0x7c, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, + 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0xd8, 0x03, + 0x00, 0x00, 0xd8, 0x03, 0x00, 0x00, 0xd8, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x9c, 0x09, 0x00, 0x00, + 0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, + 0x44, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, + 0x00, 0x80, 0x01, 0x00, 0x10, 0x8e, 0x01, 0x00, + 0x10, 0x8e, 0x01, 0x00, 0x88, 0xf8, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, + 0xc4, 0x33, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x50, 0xa0, 0xe1, + 0x58, 0x40, 0x9f, 0xe5, 0x3c, 0x00, 0xd8, 0x09, + 0x00, 0x00, 0x04, 0x00, 0x94, 0xe4, 0x01, 0x00, + 0x50, 0xe3, 0x05, 0xf0, 0xa0, 0x01, 0x04, 0x10, + 0x94, 0xe4, 0x04, 0x20, 0x94, 0xe4, 0x03, 0x00, + 0x00, 0xeb, 0x04, 0x00, 0x94, 0xe4, 0x04, 0x10, + 0x94, 0xe4, 0x07, 0x00, 0x00, 0xeb, 0xf5, 0xff, + 0xff, 0xea, 0x01, 0x00, 0x50, 0xe1, 0x0e, 0xf0, + 0xa0, 0x01, 0x02, 0x00, 0x51, 0xe1, 0x04, 0x30, + 0x90, 0x14, 0x04, 0x30, 0x81, 0x14, 0x3c, 0x00, + 0x14, 0x0a, 0x00, 0x00, 0xfb, 0xff, 0xff, 0x1a, + 0x0e, 0xf0, 0xa0, 0xe1, 0x14, 0x20, 0x9f, 0xe5, + 0x00, 0x20, 0x92, 0xe5, 0x01, 0x00, 0x50, 0xe1, + 0x04, 0x20, 0x80, 0x14, 0xfc, 0xff, 0xff, 0x1a, + 0x0e, 0xf0, 0xa0, 0xe1, 0x80, 0x09, 0x00, 0x00, + 0xcc, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, + 0x20, 0xe6, 0x01, 0x00, 0x13, 0x00, 0x00, 0x00, + 0x53, 0x56, 0x43, 0x5f, 0x00, 0x04, 0x00, 0x00, + 0x3c, 0x00, 0x50, 0x0a, 0x00, 0x00, 0x20, 0xee, + 0x01, 0x00, 0x12, 0x00, 0x00, 0x00, 0x49, 0x52, + 0x51, 0x5f, 0x00, 0x02, 0x00, 0x00, 0x20, 0xf2, + 0x01, 0x00, 0x11, 0x00, 0x00, 0x00, 0x46, 0x49, + 0x51, 0x5f, 0x80, 0x00, 0x00, 0x00, 0x20, 0xf4, + 0x01, 0x00, 0x17, 0x00, 0x00, 0x00, 0x41, 0x42, + 0x54, 0x5f, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xf4, + 0x01, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x55, 0x4e, + 0x44, 0x5f, 0x3c, 0x00, 0x8c, 0x0a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0xf4, 0x01, 0x00, + 0x1f, 0x00, 0x00, 0x00, 0x55, 0x53, 0x52, 0x5f, + 0x01, 0x00, 0x00, 0x00, 0x0e, 0x50, 0xa0, 0xe1, + 0x00, 0x60, 0x0f, 0xe1, 0x8c, 0x40, 0x9f, 0xe5, + 0x04, 0x10, 0x94, 0xe4, 0x01, 0x00, 0x51, 0xe3, + 0x09, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x94, 0xe4, + 0x01, 0x10, 0x80, 0xe0, 0x03, 0x10, 0xc1, 0xe3, + 0x04, 0x20, 0x94, 0xe4, 0x3c, 0x00, 0xc8, 0x0a, + 0x00, 0x00, 0xc0, 0x20, 0x82, 0xe3, 0x02, 0xf0, + 0x2f, 0xe1, 0x04, 0xd0, 0x41, 0xe2, 0x04, 0x20, + 0x94, 0xe4, 0x13, 0x00, 0x00, 0xeb, 0xf2, 0xff, + 0xff, 0xea, 0x06, 0xf0, 0x2f, 0xe1, 0x05, 0xf0, + 0xa0, 0xe1, 0x0e, 0x50, 0xa0, 0xe1, 0x00, 0x60, + 0x0f, 0xe1, 0x44, 0x40, 0x9f, 0xe5, 0x04, 0x10, + 0x94, 0xe4, 0x01, 0x00, 0x51, 0xe3, 0x08, 0x00, + 0x00, 0x0a, 0x04, 0x00, 0x94, 0xe4, 0x3c, 0x00, + 0x04, 0x0b, 0x00, 0x00, 0x01, 0x10, 0x80, 0xe0, + 0x03, 0x10, 0xc1, 0xe3, 0x04, 0x20, 0x94, 0xe4, + 0xc0, 0x20, 0x82, 0xe3, 0x02, 0xf0, 0x2f, 0xe1, + 0x04, 0xd0, 0x41, 0xe2, 0x04, 0x20, 0x94, 0xe4, + 0xf3, 0xff, 0xff, 0xea, 0x06, 0xf0, 0x2f, 0xe1, + 0x05, 0xf0, 0xa0, 0xe1, 0x01, 0x00, 0x50, 0xe1, + 0x04, 0x20, 0x80, 0x14, 0xfc, 0xff, 0xff, 0x1a, + 0x0e, 0xf0, 0xa0, 0xe1, 0x3c, 0x0a, 0x00, 0x00, + 0x3c, 0x00, 0x40, 0x0b, 0x00, 0x00, 0x01, 0x60, + 0xc0, 0x46, 0xc0, 0x46, 0xc0, 0x46, 0x70, 0x47, + 0x00, 0x00, 0x10, 0x1e, 0x10, 0xee, 0x02, 0x00, + 0x11, 0xe3, 0xfc, 0xff, 0xff, 0x1a, 0x10, 0x0e, + 0x01, 0xee, 0x10, 0x1e, 0x10, 0xee, 0x02, 0x00, + 0x11, 0xe3, 0xfc, 0xff, 0xff, 0x1a, 0x1e, 0xff, + 0x2f, 0xe1, 0x10, 0x1e, 0x10, 0xee, 0x01, 0x00, + 0x11, 0xe3, 0x03, 0x00, 0x00, 0x0a, 0x10, 0x1e, + 0x11, 0xee, 0x3c, 0x00, 0x7c, 0x0b, 0x00, 0x00, + 0x00, 0x10, 0x80, 0xe5, 0x01, 0x00, 0xa0, 0xe3, + 0x1e, 0xff, 0x2f, 0xe1, 0x00, 0x00, 0x20, 0xe0, + 0x1e, 0xff, 0x2f, 0xe1, 0x8d, 0x46, 0x97, 0x46, + 0x78, 0x47, 0xc0, 0x46, 0x78, 0xfd, 0xff, 0xea, + 0x10, 0xb5, 0x04, 0x1c, 0x03, 0x28, 0x01, 0xd9, + 0x00, 0xf0, 0xac, 0xfb, 0x0c, 0x48, 0x40, 0x68, + 0x00, 0x28, 0x00, 0xd0, 0x03, 0x24, 0x0b, 0x48, + 0x01, 0x68, 0x09, 0x48, 0x3c, 0x00, 0xb8, 0x0b, + 0x00, 0x00, 0x12, 0x30, 0x00, 0x29, 0x05, 0xd0, + 0x06, 0x21, 0x61, 0x43, 0x40, 0x5c, 0xc3, 0x00, + 0x18, 0x18, 0x04, 0xe0, 0x06, 0x21, 0x61, 0x43, + 0x40, 0x5c, 0x14, 0x23, 0x58, 0x43, 0x0a, 0x30, + 0x00, 0x06, 0x00, 0x0e, 0x10, 0xbd, 0xd4, 0x7a, + 0x01, 0x00, 0xa8, 0x69, 0x01, 0x00, 0x80, 0xb5, + 0x09, 0x4a, 0x09, 0x49, 0x03, 0x20, 0x00, 0xf0, + 0xf2, 0xf9, 0x08, 0x49, 0x08, 0x20, 0x3c, 0x00, + 0xf4, 0x0b, 0x00, 0x00, 0x08, 0x60, 0x48, 0x60, + 0x07, 0x49, 0x1d, 0x20, 0x01, 0xf0, 0xb2, 0xfc, + 0x06, 0x49, 0x1e, 0x20, 0x01, 0xf0, 0xae, 0xfc, + 0x80, 0xbd, 0x00, 0x00, 0x00, 0x6c, 0x01, 0x00, + 0x31, 0x27, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, + 0x29, 0x25, 0x00, 0x00, 0x31, 0x25, 0x00, 0x00, + 0x05, 0x49, 0x80, 0xb5, 0x08, 0x20, 0x88, 0x60, + 0x1d, 0x20, 0x01, 0xf0, 0xbf, 0xfc, 0x1e, 0x20, + 0x3c, 0x00, 0x30, 0x0c, 0x00, 0x00, 0x01, 0xf0, + 0xbc, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x10, + 0x07, 0x00, 0x02, 0x1c, 0x08, 0x1c, 0xd1, 0x2a, + 0x80, 0xb5, 0x01, 0xd1, 0x05, 0xf0, 0x19, 0xfc, + 0x80, 0xbd, 0x03, 0x49, 0x80, 0xb5, 0x00, 0x20, + 0x08, 0x80, 0x05, 0x20, 0x05, 0xf0, 0xd5, 0xfb, + 0x80, 0xbd, 0xb0, 0x74, 0x01, 0x00, 0x80, 0xb5, + 0x54, 0x28, 0x01, 0xd1, 0x06, 0xf0, 0xcd, 0xf8, + 0x80, 0xbd, 0x3c, 0x00, 0x6c, 0x0c, 0x00, 0x00, + 0xb0, 0xb5, 0x10, 0x4d, 0x02, 0x1c, 0x01, 0x24, + 0x01, 0x2a, 0x0d, 0x48, 0x29, 0x68, 0x06, 0xd0, + 0xc4, 0x2a, 0x03, 0xd1, 0x6a, 0x68, 0x00, 0x2a, + 0x05, 0xd0, 0xac, 0x60, 0xb0, 0xbd, 0x0e, 0xf0, + 0x89, 0xfb, 0x6c, 0x60, 0x08, 0xe0, 0x00, 0x22, + 0xaa, 0x60, 0x6c, 0x60, 0x0e, 0xf0, 0x82, 0xfb, + 0x00, 0x21, 0x04, 0x20, 0x12, 0xf0, 0xc8, 0xfc, + 0x06, 0xf0, 0xd8, 0xf8, 0x3c, 0x00, 0xa8, 0x0c, + 0x00, 0x00, 0xb0, 0xbd, 0x00, 0x00, 0xc4, 0x60, + 0x01, 0x00, 0xbc, 0x74, 0x01, 0x00, 0x05, 0x4a, + 0x51, 0x69, 0x08, 0x1a, 0x11, 0x69, 0x09, 0x68, + 0x10, 0x31, 0x81, 0x42, 0x01, 0xd8, 0x50, 0x61, + 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x8c, 0x6e, + 0x01, 0x00, 0x01, 0x49, 0x49, 0x68, 0x40, 0x1a, + 0x70, 0x47, 0x8c, 0x6e, 0x01, 0x00, 0x01, 0x48, + 0x40, 0x69, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, + 0xe4, 0x0c, 0x00, 0x00, 0x8c, 0x6e, 0x01, 0x00, + 0x02, 0x4a, 0x51, 0x69, 0x08, 0x18, 0x50, 0x61, + 0x70, 0x47, 0x00, 0x00, 0x8c, 0x6e, 0x01, 0x00, + 0x0e, 0x49, 0x0f, 0x48, 0x10, 0xb5, 0x19, 0x22, + 0x92, 0x01, 0x41, 0x60, 0x89, 0x18, 0xc1, 0x60, + 0x0b, 0x49, 0x00, 0x22, 0x0c, 0x31, 0x01, 0x60, + 0x0a, 0x49, 0x82, 0x60, 0x09, 0x68, 0x01, 0x23, + 0xdb, 0x03, 0xc9, 0x18, 0x08, 0x4c, 0x41, 0x61, + 0x3c, 0x00, 0x20, 0x0d, 0x00, 0x00, 0x21, 0x68, + 0x00, 0x29, 0x02, 0xd0, 0x07, 0x49, 0x01, 0x61, + 0x01, 0xe0, 0x00, 0xf0, 0x0c, 0xf8, 0x22, 0x60, + 0x10, 0xbd, 0x44, 0xdc, 0x01, 0x00, 0x8c, 0x6e, + 0x01, 0x00, 0xc8, 0x09, 0x00, 0x00, 0x34, 0x58, + 0x01, 0x00, 0xc4, 0x09, 0x00, 0x00, 0x01, 0x48, + 0x02, 0x49, 0x08, 0x61, 0x70, 0x47, 0xc8, 0x09, + 0x00, 0x00, 0x8c, 0x6e, 0x01, 0x00, 0x08, 0x28, + 0x05, 0xd2, 0x3c, 0x00, 0x5c, 0x0d, 0x00, 0x00, + 0x03, 0x4b, 0x80, 0x00, 0x19, 0x50, 0x02, 0x49, + 0x20, 0x31, 0x0a, 0x50, 0x70, 0x47, 0x00, 0x00, + 0x64, 0x6d, 0x01, 0x00, 0x70, 0xb5, 0x06, 0x1c, + 0x0d, 0x48, 0x0d, 0x1c, 0x00, 0x68, 0x14, 0x1c, + 0x00, 0x28, 0x03, 0xd1, 0x20, 0x1c, 0x00, 0xf0, + 0x09, 0xfc, 0x70, 0xbd, 0x28, 0x06, 0x01, 0xd5, + 0x00, 0xf0, 0x22, 0xfe, 0x22, 0x1c, 0x29, 0x1c, + 0x30, 0x1c, 0x08, 0xf0, 0x3c, 0x00, 0x98, 0x0d, + 0x00, 0x00, 0xdd, 0xfd, 0x01, 0x1c, 0x03, 0x48, + 0x54, 0x30, 0x43, 0x69, 0x32, 0x1c, 0xff, 0xf7, + 0x1b, 0xfb, 0x70, 0xbd, 0x00, 0x00, 0x50, 0x6d, + 0x01, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x0d, 0x48, + 0x1f, 0x1c, 0x00, 0x68, 0x15, 0x1c, 0x0c, 0x1c, + 0x00, 0x28, 0x02, 0xd1, 0x28, 0x1c, 0x00, 0xf0, + 0xe8, 0xfb, 0x20, 0x06, 0x01, 0xd5, 0x00, 0xf0, + 0x02, 0xfe, 0x2a, 0x1c, 0x21, 0x1c, 0x3c, 0x00, + 0xd4, 0x0d, 0x00, 0x00, 0x30, 0x1c, 0x08, 0xf0, + 0xbd, 0xfd, 0x01, 0x1c, 0x03, 0x48, 0x54, 0x30, + 0x43, 0x69, 0x3a, 0x1c, 0xff, 0xf7, 0xfb, 0xfa, + 0xf8, 0xbd, 0x00, 0x00, 0x50, 0x6d, 0x01, 0x00, + 0xf8, 0xb5, 0xf1, 0x28, 0x4e, 0xd1, 0x2a, 0x48, + 0x69, 0x46, 0x82, 0x69, 0xff, 0xf7, 0xee, 0xfa, + 0x27, 0x49, 0x00, 0x26, 0x54, 0x39, 0xc8, 0x68, + 0x8b, 0x68, 0xc2, 0x00, 0x01, 0x30, 0xd5, 0x18, + 0x3c, 0x00, 0x10, 0x0e, 0x00, 0x00, 0x07, 0x28, + 0xc8, 0x60, 0x00, 0xd1, 0xce, 0x60, 0x22, 0x48, + 0x6c, 0x68, 0x00, 0x68, 0x00, 0x28, 0x03, 0xd0, + 0x00, 0x21, 0x20, 0x1c, 0x08, 0xf0, 0x3b, 0xfb, + 0x6e, 0x60, 0x25, 0x68, 0x20, 0x89, 0xa9, 0x78, + 0x02, 0x39, 0x40, 0x1a, 0xe9, 0x78, 0x40, 0x1a, + 0x20, 0x81, 0xa8, 0x78, 0x28, 0x18, 0x02, 0x38, + 0x20, 0x60, 0x6e, 0x78, 0x28, 0x78, 0x08, 0x28, + 0x17, 0xd2, 0x3c, 0x00, 0x4c, 0x0e, 0x00, 0x00, + 0x30, 0x06, 0x07, 0xd5, 0x27, 0x1c, 0x20, 0x1c, + 0x00, 0xf0, 0x7a, 0xfc, 0x04, 0x1c, 0x38, 0x1c, + 0x00, 0xf0, 0x9c, 0xfb, 0x28, 0x78, 0x0f, 0x49, + 0x40, 0x39, 0x80, 0x00, 0x0a, 0x58, 0x00, 0x2a, + 0x04, 0xd0, 0x31, 0x1c, 0x20, 0x1c, 0xff, 0xf7, + 0xb3, 0xfa, 0x08, 0xe0, 0x05, 0x21, 0x00, 0xe0, + 0x04, 0x21, 0x06, 0x20, 0x00, 0xf0, 0x10, 0xfa, + 0x20, 0x1c, 0x00, 0xf0, 0x3c, 0x00, 0x88, 0x0e, + 0x00, 0x00, 0x87, 0xfb, 0x30, 0x06, 0x01, 0xd5, + 0x00, 0xf0, 0xa1, 0xfd, 0xf8, 0xbd, 0x01, 0x21, + 0x06, 0x20, 0x00, 0xf0, 0x04, 0xfa, 0xf9, 0xe7, + 0x00, 0x00, 0xa4, 0x6d, 0x01, 0x00, 0xcc, 0x5c, + 0x01, 0x00, 0xf8, 0xb5, 0x1a, 0x4d, 0x19, 0x4f, + 0x01, 0x24, 0x54, 0x35, 0x29, 0x1c, 0x03, 0x20, + 0x7c, 0x60, 0x17, 0x4b, 0x18, 0x4a, 0x05, 0xf0, + 0xf4, 0xfb, 0x00, 0x28, 0x02, 0xd0, 0x3c, 0x00, + 0xc4, 0x0e, 0x00, 0x00, 0x00, 0x20, 0x38, 0x60, + 0x1f, 0xe0, 0x3c, 0x60, 0x07, 0x21, 0x28, 0x1c, + 0xea, 0x69, 0xff, 0xf7, 0x83, 0xfa, 0x38, 0x20, + 0x00, 0xf0, 0x80, 0xfc, 0x00, 0x24, 0xb8, 0x60, + 0xb8, 0x68, 0xe6, 0x00, 0x35, 0x18, 0x68, 0x46, + 0x02, 0x21, 0x00, 0xf0, 0x75, 0xfb, 0x28, 0x60, + 0x28, 0x1c, 0x00, 0xf0, 0xa5, 0xfd, 0xb8, 0x68, + 0x81, 0x59, 0x06, 0x48, 0x54, 0x30, 0x02, 0x6a, + 0x3c, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xff, 0xf7, + 0x6c, 0xfa, 0x01, 0x34, 0x07, 0x2c, 0xea, 0xdb, + 0x00, 0x20, 0xf8, 0x60, 0x38, 0x61, 0xf8, 0xbd, + 0x00, 0x00, 0x50, 0x6d, 0x01, 0x00, 0x81, 0x9a, + 0x00, 0x00, 0x61, 0x9a, 0x00, 0x00, 0x05, 0x48, + 0x80, 0xb5, 0x00, 0x68, 0x00, 0x28, 0x05, 0xd0, + 0x03, 0x48, 0x54, 0x30, 0x42, 0x6a, 0x00, 0x21, + 0xff, 0xf7, 0x53, 0xfa, 0x80, 0xbd, 0x50, 0x6d, + 0x01, 0x00, 0x3c, 0x00, 0x3c, 0x0f, 0x00, 0x00, + 0x70, 0x47, 0x00, 0x00, 0x70, 0xb5, 0x0a, 0x4e, + 0x09, 0x4d, 0x08, 0x4c, 0x08, 0x3e, 0xa1, 0x69, + 0x00, 0x29, 0x07, 0xd0, 0x30, 0x68, 0x41, 0x60, + 0x00, 0x7b, 0x81, 0x00, 0x69, 0x58, 0xff, 0xf7, + 0x3e, 0xfa, 0xf4, 0xe7, 0x03, 0x49, 0x02, 0x20, + 0x08, 0x70, 0x70, 0xbd, 0x00, 0x10, 0x07, 0x00, + 0xe0, 0x7e, 0x01, 0x00, 0x00, 0x02, 0x07, 0x00, + 0x70, 0xb5, 0x0a, 0x4e, 0x3c, 0x00, 0x78, 0x0f, + 0x00, 0x00, 0x09, 0x4d, 0x08, 0x4c, 0x08, 0x3e, + 0xe1, 0x69, 0x00, 0x29, 0x07, 0xd0, 0x70, 0x68, + 0x41, 0x60, 0x00, 0x7b, 0x81, 0x00, 0x69, 0x58, + 0xff, 0xf7, 0x24, 0xfa, 0xf4, 0xe7, 0x03, 0x49, + 0x02, 0x20, 0x08, 0x70, 0x70, 0xbd, 0x00, 0x10, + 0x07, 0x00, 0xe0, 0x7e, 0x01, 0x00, 0x00, 0x02, + 0x07, 0x00, 0xb0, 0xb5, 0x09, 0x4d, 0x04, 0x1c, + 0x28, 0x1c, 0x20, 0x22, 0x40, 0x30, 0x3c, 0x00, + 0xb4, 0x0f, 0x00, 0x00, 0x05, 0x49, 0xff, 0xf7, + 0x9f, 0xfa, 0xe0, 0x68, 0xe8, 0x60, 0x20, 0x69, + 0x28, 0x61, 0xa0, 0x6a, 0xa8, 0x62, 0x60, 0x68, + 0x68, 0x60, 0xb0, 0xbd, 0x70, 0x52, 0x01, 0x00, + 0x00, 0x10, 0x07, 0x00, 0xf8, 0xb5, 0x00, 0x24, + 0x00, 0x23, 0x20, 0x28, 0x01, 0xdb, 0x01, 0x24, + 0x07, 0xe0, 0x08, 0x4e, 0x80, 0x00, 0x35, 0x58, + 0x07, 0x4f, 0xbd, 0x42, 0x00, 0xd0, 0x2b, 0x1c, + 0x3c, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x31, 0x50, + 0x13, 0x60, 0x00, 0x2c, 0x03, 0xd0, 0x21, 0x1c, + 0x82, 0x20, 0x00, 0xf0, 0x52, 0xf9, 0x20, 0x1c, + 0xf8, 0xbd, 0xe0, 0x7e, 0x01, 0x00, 0x75, 0x75, + 0x00, 0x00, 0xb0, 0xb5, 0x0b, 0x4d, 0x04, 0x1c, + 0x28, 0x68, 0x00, 0x28, 0x0f, 0xd0, 0x20, 0x1c, + 0x12, 0xf0, 0xb7, 0xfd, 0x00, 0x28, 0x0a, 0xd0, + 0x21, 0x7a, 0x28, 0x7a, 0x0a, 0x07, 0x00, 0x07, + 0x00, 0x0f, 0x3c, 0x00, 0x2c, 0x10, 0x00, 0x00, + 0x12, 0x0f, 0x90, 0x42, 0x29, 0x72, 0x01, 0xd0, + 0x01, 0x20, 0xb0, 0xbd, 0x00, 0x20, 0xb0, 0xbd, + 0x70, 0x78, 0x01, 0x00, 0xf0, 0xb5, 0x42, 0x4e, + 0x05, 0x1c, 0x30, 0x68, 0x85, 0xb0, 0x00, 0x28, + 0x63, 0xd0, 0x00, 0x24, 0x00, 0x20, 0x00, 0x2d, + 0x06, 0xd0, 0x69, 0x78, 0x18, 0x29, 0x03, 0xd1, + 0xe9, 0x79, 0x01, 0x29, 0x00, 0xd1, 0x01, 0x20, + 0x00, 0x28, 0x45, 0xd0, 0x3c, 0x00, 0x68, 0x10, + 0x00, 0x00, 0x00, 0x20, 0xb0, 0x72, 0x81, 0x00, + 0x4a, 0x19, 0x93, 0x7a, 0x59, 0x06, 0x89, 0x0f, + 0xdb, 0x06, 0x04, 0xd5, 0xb3, 0x7a, 0x01, 0x27, + 0x8f, 0x40, 0x3b, 0x43, 0xb3, 0x72, 0xd2, 0x7a, + 0x13, 0x09, 0x12, 0x07, 0x12, 0x0f, 0x93, 0x42, + 0x05, 0xd3, 0x01, 0x22, 0x8a, 0x40, 0x14, 0x43, + 0x01, 0xaa, 0x89, 0x00, 0x50, 0x50, 0x01, 0x30, + 0x04, 0x28, 0xe4, 0xdb, 0xb0, 0x7a, 0x3c, 0x00, + 0xa4, 0x10, 0x00, 0x00, 0x20, 0x40, 0x01, 0x07, + 0x0d, 0xd5, 0x41, 0x07, 0x09, 0xd5, 0xc1, 0x07, + 0x05, 0xd5, 0x81, 0x07, 0x01, 0xd5, 0x00, 0x24, + 0x05, 0xe0, 0x02, 0x99, 0x02, 0xe0, 0x01, 0x99, + 0x00, 0xe0, 0x03, 0x99, 0x04, 0x91, 0x41, 0x07, + 0x09, 0xd5, 0xc1, 0x07, 0x05, 0xd5, 0x81, 0x07, + 0x01, 0xd5, 0x00, 0x24, 0x03, 0xe0, 0x02, 0x99, + 0x00, 0xe0, 0x01, 0x99, 0x03, 0x91, 0xc1, 0x07, + 0x3c, 0x00, 0xe0, 0x10, 0x00, 0x00, 0x05, 0xd5, + 0x81, 0x07, 0x01, 0xd5, 0x00, 0x24, 0x01, 0xe0, + 0x02, 0x99, 0x01, 0x91, 0x80, 0x07, 0x01, 0xd5, + 0x00, 0x24, 0x22, 0xe0, 0x0f, 0x2c, 0x20, 0xd1, + 0x70, 0x68, 0x00, 0x28, 0x0b, 0xd0, 0x04, 0x9a, + 0x02, 0xab, 0x00, 0x92, 0x0a, 0xcb, 0x01, 0x9a, + 0x28, 0x1c, 0x0b, 0xf0, 0x8a, 0xfb, 0x00, 0x20, + 0x70, 0x60, 0x10, 0xe0, 0x17, 0xe0, 0x30, 0x7a, + 0x29, 0x7a, 0x3c, 0x00, 0x1c, 0x11, 0x00, 0x00, + 0x00, 0x07, 0x09, 0x07, 0x09, 0x0f, 0x00, 0x0f, + 0x88, 0x42, 0x07, 0xd0, 0x04, 0x9a, 0x02, 0xab, + 0x00, 0x92, 0x0a, 0xcb, 0x01, 0x9a, 0x28, 0x1c, + 0x0b, 0xf0, 0x76, 0xfb, 0x28, 0x7a, 0x30, 0x72, + 0x01, 0x20, 0x0f, 0x2c, 0x00, 0xd0, 0x00, 0x20, + 0x05, 0xb0, 0xf0, 0xbd, 0x01, 0x20, 0xfb, 0xe7, + 0x70, 0x78, 0x01, 0x00, 0x0d, 0x4a, 0x70, 0xb5, + 0x11, 0x68, 0x00, 0x20, 0x3c, 0x00, 0x58, 0x11, + 0x00, 0x00, 0x00, 0x29, 0x0e, 0xd0, 0x11, 0x7a, + 0x09, 0x06, 0x0b, 0xd5, 0x53, 0x7a, 0x94, 0x7a, + 0x03, 0x21, 0x01, 0x25, 0x2a, 0x1c, 0x8a, 0x40, + 0x1e, 0x1c, 0x16, 0x40, 0x03, 0xd0, 0x22, 0x40, + 0x01, 0xd1, 0x01, 0x20, 0x70, 0xbd, 0xff, 0x31, + 0x09, 0x06, 0x09, 0x16, 0xf2, 0xd5, 0x70, 0xbd, + 0x00, 0x00, 0x70, 0x78, 0x01, 0x00, 0x10, 0xb5, + 0x08, 0x4c, 0x20, 0x68, 0x00, 0x28, 0x3c, 0x00, + 0x94, 0x11, 0x00, 0x00, 0x04, 0xd0, 0x60, 0x68, + 0x00, 0x28, 0x01, 0xd1, 0x0b, 0xf0, 0xc0, 0xfb, + 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x07, 0xc4, + 0x0c, 0x3c, 0x01, 0x20, 0x60, 0x60, 0x10, 0xbd, + 0x70, 0x78, 0x01, 0x00, 0x01, 0x49, 0x01, 0x20, + 0x08, 0x60, 0x70, 0x47, 0x70, 0x78, 0x01, 0x00, + 0xf8, 0xb5, 0x0e, 0x4d, 0x04, 0x1c, 0x00, 0x20, + 0x68, 0x72, 0x20, 0x1c, 0x12, 0xf0, 0xde, 0xfc, + 0x3c, 0x00, 0xd0, 0x11, 0x00, 0x00, 0x00, 0x28, + 0x12, 0xd0, 0x00, 0x20, 0x03, 0x21, 0x01, 0x22, + 0x0f, 0x1a, 0x16, 0x1c, 0x23, 0x7a, 0xbe, 0x40, + 0x33, 0x40, 0x04, 0xd0, 0x6b, 0x7a, 0x16, 0x1c, + 0x86, 0x40, 0x33, 0x43, 0x6b, 0x72, 0x01, 0x30, + 0x00, 0x06, 0x00, 0x0e, 0x03, 0x28, 0xef, 0xd9, + 0xf8, 0xbd, 0x70, 0x78, 0x01, 0x00, 0x92, 0x00, + 0x51, 0x18, 0x8a, 0x7a, 0x12, 0x07, 0x12, 0x0f, + 0x02, 0x70, 0x3c, 0x00, 0x0c, 0x12, 0x00, 0x00, + 0xca, 0x7a, 0x12, 0x07, 0x12, 0x0f, 0x42, 0x70, + 0xca, 0x7a, 0x12, 0x09, 0x82, 0x70, 0x09, 0x7b, + 0x81, 0x80, 0x70, 0x47, 0x03, 0x4a, 0x0f, 0x21, + 0x52, 0x7a, 0x01, 0x20, 0x91, 0x43, 0x00, 0xd0, + 0x00, 0x20, 0x70, 0x47, 0x70, 0x78, 0x01, 0x00, + 0x40, 0x07, 0x05, 0x49, 0x40, 0x0f, 0x05, 0x4a, + 0x09, 0x56, 0x52, 0x7a, 0x01, 0x20, 0x0a, 0x40, + 0x00, 0xd1, 0x00, 0x20, 0x3c, 0x00, 0x48, 0x12, + 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x5e, 0x46, + 0x01, 0x00, 0x70, 0x78, 0x01, 0x00, 0x12, 0x4a, + 0x70, 0xb5, 0x53, 0x7a, 0x94, 0x7a, 0xff, 0x20, + 0x03, 0x21, 0x01, 0x25, 0x2a, 0x1c, 0x8a, 0x40, + 0x1e, 0x1c, 0x16, 0x40, 0x14, 0xd0, 0x22, 0x40, + 0x12, 0xd1, 0x08, 0x06, 0x00, 0x0e, 0x07, 0xd0, + 0x01, 0x28, 0x07, 0xd0, 0x02, 0x28, 0x07, 0xd0, + 0x03, 0x28, 0x07, 0xd1, 0x07, 0x20, 0x3c, 0x00, + 0x84, 0x12, 0x00, 0x00, 0x70, 0xbd, 0x03, 0x20, + 0x70, 0xbd, 0x01, 0x20, 0x70, 0xbd, 0x05, 0x20, + 0x70, 0xbd, 0xff, 0x20, 0x70, 0xbd, 0xff, 0x31, + 0x09, 0x06, 0x09, 0x16, 0xe1, 0xd5, 0x70, 0xbd, + 0x70, 0x78, 0x01, 0x00, 0xf8, 0xb5, 0x04, 0x1c, + 0x13, 0x48, 0x0d, 0x1c, 0x81, 0x68, 0x00, 0x29, + 0x05, 0xd0, 0x01, 0x7b, 0x00, 0x29, 0x01, 0xd1, + 0x04, 0x73, 0x45, 0x73, 0xf8, 0xbd, 0x0f, 0x4e, + 0x3c, 0x00, 0xc0, 0x12, 0x00, 0x00, 0x31, 0x1c, + 0x20, 0x31, 0x8a, 0x79, 0x00, 0xab, 0x1a, 0x70, + 0xc9, 0x79, 0x59, 0x70, 0x42, 0x68, 0x00, 0x2a, + 0x07, 0xd0, 0x20, 0x02, 0x28, 0x43, 0x01, 0x1c, + 0x00, 0x20, 0xff, 0xf7, 0x7e, 0xf8, 0x00, 0x28, + 0x04, 0xd1, 0x2a, 0x1c, 0x21, 0x1c, 0x00, 0x20, + 0x11, 0xf0, 0x0f, 0xf8, 0x00, 0xab, 0x18, 0x88, + 0xf0, 0x84, 0xe2, 0xe7, 0x00, 0x00, 0x88, 0x5a, + 0x01, 0x00, 0x3c, 0x00, 0xfc, 0x12, 0x00, 0x00, + 0x00, 0x10, 0x07, 0x00, 0x80, 0xb5, 0x01, 0x21, + 0x81, 0x20, 0xff, 0xf7, 0xcd, 0xff, 0x80, 0xbd, + 0x01, 0x49, 0x01, 0x20, 0x88, 0x60, 0x70, 0x47, + 0x88, 0x5a, 0x01, 0x00, 0x05, 0x49, 0x80, 0xb5, + 0x00, 0x20, 0x88, 0x60, 0x08, 0x7b, 0x00, 0x28, + 0x02, 0xd0, 0x49, 0x7b, 0xff, 0xf7, 0xbc, 0xff, + 0x80, 0xbd, 0x00, 0x00, 0x88, 0x5a, 0x01, 0x00, + 0x02, 0x4a, 0x01, 0x1c, 0x3c, 0x00, 0x38, 0x13, + 0x00, 0x00, 0x50, 0x68, 0x51, 0x60, 0x70, 0x47, + 0x00, 0x00, 0x88, 0x5a, 0x01, 0x00, 0x10, 0xb5, + 0x0c, 0x1c, 0x07, 0xf0, 0x64, 0xfa, 0x04, 0x61, + 0x00, 0x20, 0x10, 0xbd, 0x00, 0x00, 0xff, 0xb5, + 0x0e, 0x1c, 0x1f, 0x1c, 0x38, 0x20, 0x81, 0xb0, + 0x00, 0xf0, 0x3d, 0xfa, 0x1d, 0x49, 0x04, 0x1c, + 0x48, 0x69, 0x00, 0x28, 0x01, 0xd1, 0x4c, 0x61, + 0x00, 0xe0, 0x04, 0x60, 0x30, 0x01, 0x3c, 0x00, + 0x74, 0x13, 0x00, 0x00, 0x00, 0x90, 0x00, 0x04, + 0x00, 0x0c, 0x00, 0xf0, 0x15, 0xfa, 0x05, 0x1c, + 0x00, 0x99, 0xff, 0xf7, 0x8b, 0xf8, 0x00, 0x20, + 0x73, 0x1e, 0x04, 0xe0, 0x01, 0x01, 0x4a, 0x19, + 0x10, 0x32, 0x6a, 0x50, 0x01, 0x30, 0x98, 0x42, + 0xf8, 0xd3, 0x00, 0x01, 0x2d, 0x50, 0x38, 0x21, + 0x20, 0x1c, 0xff, 0xf7, 0x7b, 0xf8, 0xa5, 0x60, + 0x65, 0x60, 0xe6, 0x85, 0x0c, 0x20, 0x60, 0x86, + 0x3c, 0x00, 0xb0, 0x13, 0x00, 0x00, 0xaf, 0x20, + 0x80, 0x01, 0xe0, 0x61, 0x0e, 0x20, 0xe0, 0x86, + 0x00, 0x20, 0x20, 0x60, 0x01, 0x98, 0xe0, 0x60, + 0x38, 0x68, 0x60, 0x61, 0x03, 0x99, 0x04, 0x48, + 0x08, 0x60, 0x04, 0x48, 0x38, 0x60, 0x05, 0xb0, + 0x00, 0x20, 0xf0, 0xbd, 0x00, 0x00, 0xfc, 0x5a, + 0x01, 0x00, 0xdd, 0x15, 0x01, 0x00, 0xfd, 0x16, + 0x01, 0x00, 0x02, 0x1c, 0x08, 0x1c, 0xf0, 0x2a, + 0x80, 0xb5, 0x3c, 0x00, 0xec, 0x13, 0x00, 0x00, + 0x04, 0xd0, 0xf1, 0x2a, 0x07, 0xd1, 0x06, 0xf0, + 0x09, 0xfb, 0x80, 0xbd, 0x07, 0xf0, 0x0c, 0xfa, + 0x0d, 0xf0, 0xa8, 0xfa, 0x80, 0xbd, 0x01, 0x21, + 0x02, 0x20, 0xff, 0xf7, 0x4d, 0xff, 0x80, 0xbd, + 0x01, 0x49, 0x00, 0x20, 0x48, 0x61, 0x70, 0x47, + 0xfc, 0x5a, 0x01, 0x00, 0x00, 0x28, 0x02, 0xd0, + 0x00, 0x29, 0x00, 0xd0, 0xc1, 0x60, 0x70, 0x47, + 0xf8, 0xb5, 0x17, 0x1c, 0x3c, 0x00, 0x28, 0x14, + 0x00, 0x00, 0x0e, 0x1c, 0x05, 0x1c, 0x1c, 0x1c, + 0x1c, 0x30, 0x07, 0xf0, 0xc8, 0xf8, 0x01, 0x69, + 0x42, 0x69, 0x80, 0x68, 0x89, 0x19, 0x89, 0x1a, + 0x81, 0x42, 0x06, 0xd2, 0x23, 0x1c, 0x3a, 0x1c, + 0x31, 0x1c, 0x28, 0x1c, 0x00, 0xf0, 0x05, 0xf8, + 0xf8, 0xbd, 0x00, 0x20, 0x38, 0x60, 0x20, 0x60, + 0xfa, 0xe7, 0xff, 0xb5, 0x85, 0xb0, 0x05, 0x98, + 0x01, 0x27, 0x0e, 0x1c, 0x1c, 0x30, 0x3c, 0x00, + 0x64, 0x14, 0x00, 0x00, 0x07, 0xf0, 0xae, 0xf8, + 0x04, 0x1c, 0x80, 0x88, 0x04, 0x30, 0x03, 0x90, + 0x2c, 0x48, 0x04, 0x90, 0x80, 0x79, 0x02, 0x90, + 0xa0, 0x69, 0xb0, 0x42, 0x17, 0xd2, 0x35, 0x1a, + 0x11, 0xe0, 0x03, 0x98, 0xff, 0xf7, 0x16, 0xfc, + 0x00, 0x28, 0x06, 0xd1, 0x01, 0x21, 0x8e, 0x20, + 0xff, 0xf7, 0x08, 0xff, 0x00, 0x25, 0x00, 0x27, + 0x05, 0xe0, 0x21, 0x68, 0x01, 0x60, 0x20, 0x60, + 0x3c, 0x00, 0xa0, 0x14, 0x00, 0x00, 0xa0, 0x69, + 0x01, 0x30, 0xa0, 0x61, 0x01, 0x3d, 0xeb, 0xd2, + 0x00, 0x2f, 0x35, 0xd0, 0xa0, 0x69, 0x80, 0x1b, + 0xa0, 0x61, 0x20, 0x69, 0x80, 0x19, 0x20, 0x61, + 0x61, 0x69, 0x40, 0x1a, 0xe1, 0x68, 0x88, 0x42, + 0x03, 0xd9, 0x07, 0x21, 0x8e, 0x20, 0xff, 0xf7, + 0xec, 0xfe, 0x25, 0x68, 0x2f, 0x1c, 0x70, 0x1e, + 0x01, 0x95, 0x00, 0xe0, 0x3f, 0x68, 0x01, 0x38, + 0xfc, 0xd2, 0x3c, 0x00, 0xdc, 0x14, 0x00, 0x00, + 0x38, 0x68, 0x20, 0x60, 0x02, 0x98, 0x04, 0x99, + 0x88, 0x71, 0x2e, 0x68, 0x2c, 0x60, 0x32, 0x1d, + 0x00, 0x92, 0x29, 0x1c, 0x20, 0x31, 0x01, 0x22, + 0x28, 0x1d, 0x05, 0x9b, 0x08, 0xf0, 0x7a, 0xfc, + 0xbd, 0x42, 0x01, 0xd0, 0x35, 0x1c, 0xf0, 0xe7, + 0x00, 0x20, 0x38, 0x61, 0x01, 0x98, 0x07, 0x99, + 0x04, 0x30, 0x08, 0x60, 0x08, 0x98, 0x04, 0x37, + 0x07, 0x60, 0x09, 0xb0, 0x3c, 0x00, 0x18, 0x15, + 0x00, 0x00, 0xf0, 0xbd, 0x02, 0x98, 0x04, 0x99, + 0x88, 0x71, 0xf9, 0xe7, 0x00, 0x00, 0x20, 0x10, + 0x07, 0x00, 0x38, 0xb5, 0x04, 0x1c, 0x15, 0x1c, + 0x00, 0x20, 0x0c, 0x60, 0x09, 0xe0, 0xe2, 0x68, + 0x20, 0x1c, 0x00, 0x92, 0xa3, 0x8a, 0x21, 0x68, + 0xa2, 0x69, 0x08, 0xf0, 0x56, 0xfc, 0x20, 0x1c, + 0xe4, 0x68, 0x00, 0x2c, 0xf3, 0xd1, 0x28, 0x60, + 0x38, 0xbd, 0x80, 0xb5, 0x0c, 0xe0, 0x3c, 0x00, + 0x54, 0x15, 0x00, 0x00, 0xc2, 0x68, 0x8a, 0x42, + 0x08, 0xd1, 0x00, 0x21, 0xc1, 0x60, 0x00, 0x28, + 0x03, 0xd1, 0x06, 0x21, 0x8e, 0x20, 0xff, 0xf7, + 0x9d, 0xfe, 0x80, 0xbd, 0x10, 0x1c, 0x00, 0x28, + 0xf7, 0xd0, 0xef, 0xe7, 0x10, 0xb5, 0x04, 0x1c, + 0x0c, 0xd0, 0xa0, 0x69, 0x00, 0x28, 0x06, 0xd1, + 0x20, 0x69, 0x00, 0x28, 0x03, 0xd0, 0x06, 0xf0, + 0xf7, 0xfd, 0x00, 0x20, 0x20, 0x61, 0x20, 0x1c, + 0x3c, 0x00, 0x90, 0x15, 0x00, 0x00, 0x06, 0xf0, + 0xf2, 0xfd, 0x10, 0xbd, 0x00, 0x00, 0x10, 0xb5, + 0x00, 0x28, 0x09, 0xd0, 0xc4, 0x68, 0x03, 0xe0, + 0xff, 0xf7, 0xe7, 0xff, 0x20, 0x1c, 0xf9, 0xe7, + 0x00, 0x2c, 0xf9, 0xd1, 0xff, 0xf7, 0xe1, 0xff, + 0x10, 0xbd, 0x01, 0x1c, 0x00, 0x20, 0x04, 0xe0, + 0x0a, 0x89, 0xc9, 0x68, 0x10, 0x18, 0x00, 0x04, + 0x00, 0x0c, 0x00, 0x29, 0xf8, 0xd1, 0x70, 0x47, + 0x00, 0x00, 0x3c, 0x00, 0xcc, 0x15, 0x00, 0x00, + 0x00, 0xe0, 0x08, 0x1c, 0xc1, 0x68, 0x00, 0x29, + 0xfb, 0xd1, 0x70, 0x47, 0xf8, 0xb5, 0x06, 0x1c, + 0x0c, 0x1c, 0x1c, 0x20, 0x00, 0xf0, 0x68, 0xfa, + 0x05, 0x1c, 0x00, 0x2e, 0x01, 0xd1, 0x00, 0x2c, + 0x02, 0xd1, 0x30, 0x1c, 0x01, 0x21, 0x03, 0xe0, + 0x20, 0x1c, 0x00, 0xf0, 0x5d, 0xfa, 0x00, 0x21, + 0x00, 0x22, 0x00, 0x92, 0x0a, 0x1c, 0x01, 0x1c, + 0x23, 0x1c, 0x28, 0x1c, 0x3c, 0x00, 0x08, 0x16, + 0x00, 0x00, 0x08, 0xf0, 0xf2, 0xfb, 0x28, 0x1c, + 0xf8, 0xbd, 0xb0, 0xb5, 0x03, 0x32, 0x92, 0x08, + 0x92, 0x00, 0x14, 0x04, 0x24, 0x0c, 0x09, 0x19, + 0x1d, 0x1c, 0xc9, 0x18, 0x09, 0x04, 0x09, 0x0c, + 0xff, 0xf7, 0xd7, 0xff, 0x01, 0x89, 0x02, 0x68, + 0x12, 0x19, 0x09, 0x1b, 0x49, 0x1b, 0x02, 0x60, + 0x01, 0x81, 0xb0, 0xbd, 0x00, 0x00, 0xf8, 0xb5, + 0x0a, 0x4c, 0xa0, 0x21, 0x20, 0x1c, 0x3c, 0x00, + 0x44, 0x16, 0x00, 0x00, 0xfe, 0xf7, 0x2a, 0xff, + 0x00, 0x20, 0x26, 0x1c, 0xa0, 0x36, 0x07, 0x4d, + 0x07, 0xe0, 0x0c, 0x21, 0x41, 0x43, 0x49, 0x19, + 0x0e, 0xc9, 0x27, 0x1d, 0x0e, 0xc7, 0x20, 0x34, + 0x01, 0x30, 0xa6, 0x42, 0xf5, 0xd1, 0xf8, 0xbd, + 0xd0, 0x5c, 0x01, 0x00, 0xc8, 0x3f, 0x01, 0x00, + 0xf7, 0xb5, 0xc4, 0x68, 0x06, 0x1c, 0x00, 0x25, + 0x00, 0x2c, 0x82, 0xb0, 0x23, 0xd0, 0x20, 0x89, + 0x3c, 0x00, 0x80, 0x16, 0x00, 0x00, 0x90, 0x42, + 0x20, 0xd3, 0xe1, 0x68, 0x87, 0x1a, 0x01, 0x91, + 0x00, 0x21, 0xe1, 0x60, 0x03, 0x99, 0x00, 0x20, + 0xff, 0xf7, 0xa1, 0xff, 0x05, 0x1c, 0x20, 0x89, + 0xc0, 0x1b, 0x20, 0x81, 0x2a, 0x68, 0x03, 0x99, + 0x30, 0x1c, 0x00, 0xf0, 0x16, 0xf8, 0x20, 0x89, + 0xc0, 0x19, 0x20, 0x81, 0x01, 0x99, 0x20, 0x1c, + 0xff, 0xf7, 0xb1, 0xfe, 0x21, 0x1c, 0x28, 0x1c, + 0xff, 0xf7, 0x3c, 0x00, 0xbc, 0x16, 0x00, 0x00, + 0xad, 0xfe, 0x29, 0x1c, 0x30, 0x1c, 0xff, 0xf7, + 0xa9, 0xfe, 0x01, 0x20, 0x00, 0x2d, 0x00, 0xd1, + 0x00, 0x20, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, + 0xf7, 0xb5, 0x04, 0x1c, 0x0e, 0x1c, 0x00, 0x20, + 0x01, 0xe0, 0x20, 0x1c, 0x0c, 0x1c, 0xe1, 0x68, + 0x00, 0x29, 0xfa, 0xd1, 0x27, 0x89, 0xb7, 0x42, + 0x0a, 0xd3, 0xb8, 0x1b, 0x00, 0x04, 0x00, 0x0c, + 0x20, 0x81, 0x21, 0x68, 0x3c, 0x00, 0xf8, 0x16, + 0x00, 0x00, 0x09, 0x18, 0x02, 0x98, 0x32, 0x1c, + 0xfe, 0xf7, 0xfb, 0xfe, 0xfe, 0xbd, 0xf1, 0x1b, + 0x0d, 0x04, 0x2d, 0x0c, 0x00, 0x28, 0x19, 0xd0, + 0x01, 0x89, 0xa9, 0x42, 0x16, 0xd3, 0x49, 0x1b, + 0x09, 0x04, 0x09, 0x0c, 0x01, 0x81, 0x00, 0x68, + 0x41, 0x18, 0x02, 0x98, 0x2a, 0x1c, 0xfe, 0xf7, + 0xe8, 0xfe, 0x21, 0x68, 0x02, 0x98, 0x72, 0x1b, + 0x40, 0x19, 0xfe, 0xf7, 0xe2, 0xfe, 0x3c, 0x00, + 0x34, 0x17, 0x00, 0x00, 0x20, 0x89, 0xc0, 0x1b, + 0x20, 0x81, 0x20, 0x68, 0xc0, 0x19, 0x20, 0x60, + 0xdf, 0xe7, 0x03, 0x21, 0x8e, 0x20, 0xff, 0xf7, + 0xad, 0xfd, 0xda, 0xe7, 0xf8, 0xb5, 0x04, 0x1c, + 0x00, 0x26, 0x13, 0xe0, 0x21, 0x89, 0x00, 0x20, + 0xff, 0xf7, 0x3e, 0xff, 0x05, 0x1c, 0x22, 0x89, + 0x21, 0x68, 0x00, 0x68, 0xfe, 0xf7, 0xc8, 0xfe, + 0x00, 0x2e, 0x01, 0xd1, 0x2e, 0x1c, 0x03, 0xe0, + 0x3c, 0x00, 0x70, 0x17, 0x00, 0x00, 0x29, 0x1c, + 0x38, 0x1c, 0xff, 0xf7, 0x50, 0xfe, 0xe4, 0x68, + 0x2f, 0x1c, 0x00, 0x2c, 0xe9, 0xd1, 0x30, 0x1c, + 0xf8, 0xbd, 0xb0, 0xb5, 0x04, 0x1c, 0x00, 0x89, + 0x40, 0x1a, 0x05, 0x04, 0x20, 0x68, 0x2d, 0x0c, + 0x40, 0x18, 0x29, 0x1c, 0xff, 0xf7, 0x1f, 0xff, + 0x21, 0x89, 0x49, 0x1b, 0x21, 0x81, 0xe1, 0x68, + 0xc1, 0x60, 0xe0, 0x60, 0xb0, 0xbd, 0x10, 0xb5, + 0x03, 0x30, 0x3c, 0x00, 0xac, 0x17, 0x00, 0x00, + 0x09, 0x4a, 0x81, 0x08, 0x10, 0x68, 0x3d, 0x24, + 0x08, 0x4b, 0x64, 0x01, 0x89, 0x00, 0x09, 0x18, + 0x1b, 0x19, 0x99, 0x42, 0x01, 0xd8, 0x11, 0x60, + 0x10, 0xbd, 0x0f, 0x21, 0x80, 0x20, 0xff, 0xf7, + 0x6b, 0xfd, 0x00, 0x20, 0x10, 0xbd, 0x00, 0x00, + 0xb4, 0xcf, 0x01, 0x00, 0x14, 0xc8, 0x01, 0x00, + 0x10, 0xb5, 0x11, 0xf0, 0x61, 0xff, 0x04, 0x1c, + 0x03, 0xd1, 0x0d, 0x21, 0x3c, 0x00, 0xe8, 0x17, + 0x00, 0x00, 0x80, 0x20, 0xff, 0xf7, 0x5b, 0xfd, + 0x20, 0x1c, 0x10, 0xbd, 0x00, 0x00, 0xb0, 0xb5, + 0x01, 0x1f, 0x0b, 0x68, 0x0d, 0x48, 0x00, 0x22, + 0x83, 0x42, 0x04, 0xd0, 0x01, 0x32, 0x10, 0x30, + 0x03, 0x2a, 0xf9, 0xd3, 0x01, 0xe0, 0x03, 0x2a, + 0x06, 0xd3, 0x09, 0x24, 0x21, 0x1c, 0x80, 0x20, + 0xff, 0xf7, 0x45, 0xfd, 0x20, 0x1c, 0xb0, 0xbd, + 0x05, 0x4b, 0x00, 0x24, 0x9a, 0x79, 0x3c, 0x00, + 0x24, 0x18, 0x00, 0x00, 0x85, 0x68, 0x0d, 0x60, + 0x81, 0x60, 0x9a, 0x71, 0xf5, 0xe7, 0x00, 0x00, + 0x20, 0x57, 0x01, 0x00, 0x20, 0x10, 0x07, 0x00, + 0xb0, 0xb5, 0x00, 0x21, 0x10, 0x4a, 0x00, 0x23, + 0xd4, 0x68, 0x84, 0x42, 0x04, 0xd2, 0x01, 0x33, + 0x10, 0x32, 0x03, 0x2b, 0xf8, 0xd3, 0x01, 0xe0, + 0x03, 0x2b, 0x01, 0xd3, 0x04, 0x21, 0x0e, 0xe0, + 0x0a, 0x4c, 0xa3, 0x79, 0x90, 0x68, 0x00, 0x28, + 0x3c, 0x00, 0x60, 0x18, 0x00, 0x00, 0x02, 0xd1, + 0xa3, 0x71, 0x03, 0x21, 0x06, 0xe0, 0x05, 0x68, + 0x95, 0x60, 0xa3, 0x71, 0x00, 0x29, 0x01, 0xd1, + 0x04, 0xc0, 0xb0, 0xbd, 0x80, 0x20, 0xff, 0xf7, + 0x14, 0xfd, 0x00, 0x20, 0xb0, 0xbd, 0x20, 0x57, + 0x01, 0x00, 0x20, 0x10, 0x07, 0x00, 0xa0, 0x30, + 0x00, 0x8a, 0x40, 0x07, 0x40, 0x0f, 0x08, 0x28, + 0x0f, 0xd2, 0x01, 0xa3, 0x1b, 0x5c, 0x5b, 0x00, + 0x9f, 0x44, 0x3c, 0x00, 0x9c, 0x18, 0x00, 0x00, + 0x05, 0x03, 0x03, 0x05, 0x07, 0x07, 0x09, 0x09, + 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, + 0x02, 0x20, 0x70, 0x47, 0x03, 0x20, 0x70, 0x47, + 0x04, 0x20, 0x70, 0x47, 0xb0, 0xb5, 0x10, 0x4d, + 0x68, 0x69, 0x00, 0x28, 0x07, 0xd0, 0x0e, 0x49, + 0x00, 0x22, 0x2c, 0x31, 0x03, 0xc9, 0x01, 0x43, + 0x03, 0x20, 0x06, 0xf0, 0xcf, 0xff, 0x0b, 0x4c, + 0x00, 0x22, 0x03, 0xcc, 0x3c, 0x00, 0xd8, 0x18, + 0x00, 0x00, 0x08, 0x3c, 0x01, 0x43, 0x03, 0x20, + 0x06, 0xf0, 0xaf, 0xff, 0x03, 0xcc, 0x08, 0x43, + 0x07, 0x49, 0x4a, 0x68, 0x02, 0x43, 0x4a, 0x60, + 0x8a, 0x68, 0x10, 0x43, 0x88, 0x60, 0x01, 0x20, + 0x68, 0x61, 0xb0, 0xbd, 0x00, 0x00, 0x64, 0x73, + 0x01, 0x00, 0xb0, 0x58, 0x01, 0x00, 0x10, 0x00, + 0x07, 0x00, 0xb0, 0xb5, 0x0c, 0x1c, 0x0f, 0xf0, + 0xa8, 0xfa, 0x05, 0x4d, 0xe8, 0x6a, 0x3c, 0x00, + 0x14, 0x19, 0x00, 0x00, 0x00, 0x28, 0x06, 0xd1, + 0x00, 0x2c, 0x04, 0xd0, 0x20, 0x1c, 0x0f, 0xf0, + 0xb7, 0xfd, 0x01, 0x20, 0x28, 0x70, 0xb0, 0xbd, + 0xf4, 0x6e, 0x01, 0x00, 0x05, 0x49, 0x80, 0xb5, + 0x88, 0x6a, 0x00, 0x28, 0x04, 0xda, 0x00, 0x20, + 0x88, 0x62, 0x01, 0x21, 0x0d, 0xf0, 0x42, 0xfd, + 0x80, 0xbd, 0x00, 0x00, 0xac, 0x7e, 0x01, 0x00, + 0xf8, 0xb5, 0x1e, 0x4d, 0x04, 0x1c, 0x00, 0x20, + 0x3c, 0x00, 0x50, 0x19, 0x00, 0x00, 0x68, 0x62, + 0xa8, 0x70, 0x1c, 0x48, 0x00, 0x78, 0xc0, 0x07, + 0x22, 0xd5, 0xb8, 0x20, 0x03, 0x59, 0x1a, 0x48, + 0x00, 0x78, 0x0e, 0x28, 0x09, 0xd1, 0x0a, 0x1c, + 0x80, 0x32, 0x06, 0xd0, 0x18, 0x4e, 0x0d, 0x20, + 0x32, 0x5c, 0x8a, 0x42, 0x01, 0xdd, 0x01, 0x38, + 0xfa, 0xd1, 0x59, 0x1e, 0x0b, 0x06, 0x1b, 0x0e, + 0xab, 0x70, 0xab, 0x62, 0x0e, 0x28, 0x0b, 0xd2, + 0x08, 0xe0, 0x3c, 0x00, 0x8c, 0x19, 0x00, 0x00, + 0x62, 0x18, 0xb0, 0x32, 0x12, 0x7b, 0x82, 0x42, + 0x02, 0xd8, 0x58, 0x1a, 0xa8, 0x62, 0x02, 0xe0, + 0x01, 0x39, 0x00, 0x29, 0xf4, 0xda, 0x0e, 0xf0, + 0x35, 0xf9, 0x00, 0x90, 0x00, 0xab, 0x18, 0x78, + 0x59, 0x78, 0x81, 0x42, 0x00, 0xd9, 0x58, 0x78, + 0xed, 0x30, 0xe8, 0x70, 0x01, 0x21, 0x20, 0x1c, + 0x0d, 0xf0, 0x02, 0xfd, 0xf8, 0xbd, 0x00, 0x00, + 0xac, 0x7e, 0x01, 0x00, 0x3c, 0x00, 0xc8, 0x19, + 0x00, 0x00, 0x1d, 0x75, 0x01, 0x00, 0x11, 0x67, + 0x01, 0x00, 0xc7, 0x52, 0x01, 0x00, 0x0e, 0x49, + 0x10, 0xb5, 0x08, 0x69, 0x8b, 0x68, 0xc2, 0x00, + 0xd4, 0x18, 0x62, 0x68, 0x00, 0x2a, 0x0f, 0xd1, + 0x01, 0x30, 0x08, 0x61, 0x07, 0x28, 0x01, 0xd1, + 0x00, 0x20, 0x08, 0x61, 0x20, 0x1c, 0x00, 0xf0, + 0x24, 0xf8, 0x05, 0x48, 0x21, 0x68, 0x54, 0x30, + 0x02, 0x6a, 0xfe, 0xf7, 0xec, 0xfc, 0x3c, 0x00, + 0x04, 0x1a, 0x00, 0x00, 0x10, 0xbd, 0x06, 0x21, + 0x06, 0x20, 0xff, 0xf7, 0x4b, 0xfc, 0x10, 0xbd, + 0x50, 0x6d, 0x01, 0x00, 0x08, 0x49, 0x09, 0x79, + 0xc9, 0x07, 0x08, 0x4a, 0x08, 0xd4, 0x00, 0xe0, + 0x08, 0x1c, 0xc1, 0x68, 0x00, 0x29, 0xfb, 0xd1, + 0x01, 0x89, 0x04, 0x31, 0x01, 0x81, 0x00, 0xe0, + 0x00, 0x20, 0xd0, 0x62, 0x70, 0x47, 0x00, 0x00, + 0x60, 0x80, 0x07, 0x00, 0x04, 0x6c, 0x01, 0x00, + 0x3c, 0x00, 0x40, 0x1a, 0x00, 0x00, 0x10, 0xb5, + 0x04, 0x1c, 0x19, 0x21, 0x89, 0x01, 0x00, 0x20, + 0xff, 0xf7, 0xc5, 0xfd, 0x01, 0x1c, 0x60, 0x60, + 0x20, 0x68, 0xff, 0xf7, 0xe0, 0xfc, 0x60, 0x68, + 0x21, 0x68, 0x08, 0x30, 0x08, 0x60, 0x10, 0xbd, + 0x00, 0x00, 0x0a, 0x28, 0x01, 0xda, 0x04, 0x20, + 0x04, 0xe0, 0x50, 0x28, 0x01, 0xda, 0x05, 0x20, + 0x00, 0xe0, 0x07, 0x20, 0x04, 0x4a, 0x11, 0x78, + 0x38, 0x23, 0x3c, 0x00, 0x7c, 0x1a, 0x00, 0x00, + 0xc0, 0x00, 0x18, 0x40, 0x99, 0x43, 0x08, 0x43, + 0x10, 0x70, 0x70, 0x47, 0x88, 0x00, 0x07, 0x00, + 0xb0, 0xb5, 0x05, 0x1c, 0x07, 0x48, 0x40, 0x68, + 0x08, 0xe0, 0x01, 0x69, 0xa9, 0x42, 0x04, 0xd1, + 0x44, 0x68, 0x05, 0xf0, 0xc7, 0xfd, 0x20, 0x1c, + 0x00, 0xe0, 0x40, 0x68, 0x00, 0x28, 0xf4, 0xd1, + 0xb0, 0xbd, 0x00, 0x00, 0x58, 0x75, 0x01, 0x00, + 0xf8, 0xb5, 0x00, 0x25, 0x3c, 0x00, 0xb8, 0x1a, + 0x00, 0x00, 0x06, 0xf0, 0x84, 0xfd, 0x11, 0x4f, + 0x04, 0x1c, 0xbe, 0x79, 0x20, 0x68, 0x00, 0x28, + 0x07, 0xd1, 0xa0, 0x88, 0x04, 0x30, 0xff, 0xf7, + 0xf2, 0xf8, 0x00, 0x28, 0x06, 0xd1, 0x01, 0x21, + 0x0f, 0xe0, 0x01, 0x68, 0x21, 0x60, 0xa1, 0x69, + 0x01, 0x39, 0xa1, 0x61, 0x10, 0xc0, 0x05, 0x1c, + 0x20, 0x69, 0x01, 0x30, 0x20, 0x61, 0x61, 0x69, + 0x40, 0x1a, 0xe1, 0x68, 0x88, 0x42, 0x3c, 0x00, + 0xf4, 0x1a, 0x00, 0x00, 0x03, 0xd9, 0x07, 0x21, + 0x8e, 0x20, 0xff, 0xf7, 0xd3, 0xfb, 0xbe, 0x71, + 0x28, 0x1c, 0xf8, 0xbd, 0x20, 0x10, 0x07, 0x00, + 0xb0, 0xb5, 0x09, 0xf0, 0xbb, 0xff, 0x2f, 0x4c, + 0x00, 0x28, 0x20, 0x74, 0x03, 0xd0, 0x01, 0x21, + 0x01, 0x20, 0x0a, 0xf0, 0x71, 0xfc, 0x2b, 0x4d, + 0x14, 0x35, 0x28, 0x68, 0x00, 0x28, 0x4d, 0xd0, + 0x01, 0x21, 0x0f, 0x20, 0x11, 0xf0, 0x82, 0xfd, + 0x3c, 0x00, 0x30, 0x1b, 0x00, 0x00, 0x28, 0x89, + 0x08, 0xf0, 0xfb, 0xff, 0x01, 0x1c, 0x01, 0x22, + 0x0f, 0x20, 0x11, 0xf0, 0x40, 0xfd, 0xe0, 0x78, + 0x01, 0x25, 0x02, 0x28, 0x36, 0xd1, 0x0a, 0xf0, + 0xc6, 0xf8, 0x00, 0x28, 0x0a, 0xd0, 0x0b, 0xf0, + 0x92, 0xfb, 0x1e, 0x49, 0x09, 0x68, 0x40, 0x18, + 0x11, 0xf0, 0x5f, 0xf8, 0x00, 0x28, 0x01, 0xd1, + 0x02, 0x20, 0x2f, 0xe0, 0xe0, 0x78, 0x02, 0x28, + 0x24, 0xd1, 0x3c, 0x00, 0x6c, 0x1b, 0x00, 0x00, + 0x60, 0x70, 0x25, 0x70, 0x60, 0x68, 0x01, 0x28, + 0x1c, 0xd0, 0x15, 0x48, 0x10, 0x38, 0x81, 0x7b, + 0x00, 0x29, 0x04, 0xd1, 0x85, 0x73, 0x0f, 0x20, + 0x13, 0x49, 0x10, 0xf0, 0x01, 0xfc, 0x08, 0xf0, + 0x4f, 0xfe, 0x00, 0x28, 0x07, 0xd0, 0x0e, 0x48, + 0x01, 0x21, 0x98, 0x38, 0x00, 0x69, 0x01, 0xf0, + 0xb7, 0xfd, 0x00, 0x28, 0x05, 0xd0, 0x01, 0x20, + 0x0e, 0xf0, 0x0c, 0xfd, 0x3c, 0x00, 0xa8, 0x1b, + 0x00, 0x00, 0x01, 0x20, 0x0e, 0xf0, 0x1d, 0xfc, + 0xb0, 0xbd, 0x05, 0xf0, 0xdc, 0xfe, 0xb0, 0xbd, + 0xe0, 0x78, 0x00, 0x28, 0x01, 0xd1, 0x25, 0x70, + 0xf7, 0xe7, 0x03, 0x20, 0x00, 0xe0, 0x04, 0x20, + 0x0d, 0xf0, 0x8d, 0xfa, 0xb0, 0xbd, 0x84, 0x66, + 0x01, 0x00, 0x6c, 0x57, 0x01, 0x00, 0xe9, 0x03, + 0x01, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0x00, 0x21, + 0x00, 0x20, 0x0a, 0x4d, 0x00, 0xe0, 0x3c, 0x00, + 0xe4, 0x1b, 0x00, 0x00, 0x01, 0x31, 0xcb, 0x00, + 0x5a, 0x19, 0x16, 0x79, 0x01, 0x2e, 0x02, 0xd0, + 0x52, 0x79, 0xa2, 0x42, 0x02, 0xd0, 0x0b, 0x29, + 0xf4, 0xd3, 0x70, 0xbd, 0x0b, 0x29, 0xfc, 0xd2, + 0xc8, 0x00, 0x01, 0x21, 0x5a, 0x19, 0x28, 0x58, + 0x11, 0x71, 0x70, 0xbd, 0x38, 0x58, 0x01, 0x00, + 0x05, 0x48, 0x80, 0xb5, 0x00, 0x7f, 0x24, 0x23, + 0x04, 0x49, 0x58, 0x43, 0x40, 0x18, 0x00, 0x6a, + 0x3c, 0x00, 0x20, 0x1c, 0x00, 0x00, 0xfe, 0xf7, + 0xda, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0xd4, 0x79, + 0x01, 0x00, 0x94, 0x46, 0x01, 0x00, 0x80, 0xb5, + 0x04, 0xf0, 0x37, 0xff, 0x00, 0x20, 0x11, 0xf0, + 0x84, 0xfc, 0x00, 0x20, 0x80, 0xbd, 0xb0, 0xb5, + 0x05, 0x4c, 0x05, 0x1c, 0x20, 0x6b, 0xe1, 0x6a, + 0x02, 0xf0, 0xe3, 0xfd, 0x29, 0x1c, 0xa0, 0x6a, + 0x02, 0xf0, 0x11, 0xfb, 0xb0, 0xbd, 0xa4, 0x6c, + 0x01, 0x00, 0x3c, 0x00, 0x5c, 0x1c, 0x00, 0x00, + 0xb0, 0xb5, 0x03, 0x1c, 0x08, 0x1c, 0x14, 0x1c, + 0x00, 0x2b, 0x0c, 0x4d, 0x09, 0xd0, 0x69, 0x69, + 0x89, 0x00, 0x01, 0x31, 0x0a, 0x04, 0x12, 0x0c, + 0x22, 0x80, 0x29, 0x1c, 0xfe, 0xf7, 0x3e, 0xfc, + 0x0a, 0xe0, 0x01, 0x1c, 0x28, 0x1c, 0x22, 0x88, + 0xfe, 0xf7, 0x38, 0xfc, 0x20, 0x88, 0x01, 0x28, + 0x02, 0xd9, 0x80, 0x08, 0x01, 0x38, 0x68, 0x61, + 0x01, 0x20, 0xb0, 0xbd, 0x3c, 0x00, 0x98, 0x1c, + 0x00, 0x00, 0x20, 0x6e, 0x01, 0x00, 0xf1, 0xb5, + 0x00, 0x98, 0x00, 0x26, 0xc1, 0x68, 0x08, 0x68, + 0x09, 0x89, 0x1c, 0x29, 0x34, 0xd3, 0xc1, 0x88, + 0xff, 0x23, 0x01, 0x33, 0x99, 0x42, 0x2f, 0xd1, + 0x01, 0x88, 0xc9, 0x1a, 0x2c, 0xd1, 0x41, 0x88, + 0x08, 0x29, 0x29, 0xd1, 0x01, 0x79, 0x06, 0x29, + 0x26, 0xd1, 0x41, 0x79, 0x04, 0x29, 0x23, 0xd1, + 0x00, 0x25, 0x00, 0x24, 0x07, 0x1c, 0x3c, 0x00, + 0xd4, 0x1c, 0x00, 0x00, 0x18, 0x37, 0x0b, 0xe0, + 0xa0, 0x00, 0x41, 0x18, 0x04, 0x31, 0x04, 0x22, + 0x38, 0x1c, 0xfe, 0xf7, 0x8b, 0xfb, 0x00, 0x28, + 0x01, 0xd1, 0x01, 0x25, 0x04, 0xe0, 0x01, 0x34, + 0x0a, 0x49, 0x48, 0x69, 0xa0, 0x42, 0xef, 0xd8, + 0x08, 0x49, 0x08, 0x78, 0x00, 0x28, 0x0a, 0xd0, + 0x01, 0x28, 0x01, 0xd0, 0x02, 0x28, 0x06, 0xd1, + 0x00, 0x2d, 0x04, 0xd1, 0x00, 0x98, 0xc0, 0x68, + 0x3c, 0x00, 0x10, 0x1d, 0x00, 0x00, 0xff, 0xf7, + 0x42, 0xfc, 0x01, 0x26, 0x30, 0x1c, 0xf8, 0xbd, + 0x00, 0x00, 0x20, 0x6e, 0x01, 0x00, 0x01, 0x48, + 0x40, 0x68, 0x70, 0x47, 0x00, 0x00, 0x20, 0x6e, + 0x01, 0x00, 0x02, 0x49, 0x48, 0x60, 0x01, 0x20, + 0x48, 0x61, 0x70, 0x47, 0x00, 0x00, 0x20, 0x6e, + 0x01, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0x01, 0x26, + 0x03, 0xf0, 0xef, 0xfa, 0x25, 0x1c, 0x10, 0x35, + 0x00, 0x28, 0x3c, 0x00, 0x4c, 0x1d, 0x00, 0x00, + 0x04, 0xd0, 0x00, 0x20, 0x20, 0x77, 0x03, 0xf0, + 0xf1, 0xfb, 0x07, 0xe0, 0x03, 0xf0, 0x38, 0xfd, + 0x00, 0x28, 0x09, 0xd0, 0x01, 0x20, 0x20, 0x77, + 0x03, 0xf0, 0xce, 0xfc, 0x01, 0x1c, 0x06, 0x22, + 0x28, 0x1c, 0xfe, 0xf7, 0xc3, 0xfb, 0x02, 0xe0, + 0x02, 0x20, 0x20, 0x77, 0x00, 0x26, 0x30, 0x1c, + 0x70, 0xbd, 0x00, 0x00, 0x03, 0x48, 0x80, 0x7a, + 0xc0, 0x07, 0x03, 0x49, 0x3c, 0x00, 0x88, 0x1d, + 0x00, 0x00, 0xc0, 0x0f, 0x88, 0x62, 0x70, 0x47, + 0x00, 0x00, 0x40, 0x90, 0x07, 0x00, 0xa4, 0x6c, + 0x01, 0x00, 0x01, 0x49, 0x01, 0x20, 0x88, 0x62, + 0x70, 0x47, 0xa4, 0x6c, 0x01, 0x00, 0x06, 0x48, + 0x80, 0x7a, 0xc1, 0x07, 0x06, 0x4a, 0xc9, 0x0f, + 0x91, 0x62, 0x20, 0x21, 0x80, 0x07, 0x00, 0xd4, + 0x00, 0x21, 0xa0, 0x32, 0x11, 0x70, 0x70, 0x47, + 0x00, 0x00, 0x40, 0x90, 0x07, 0x00, 0x3c, 0x00, + 0xc4, 0x1d, 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, + 0x07, 0x4a, 0x12, 0x68, 0x07, 0x4b, 0x9b, 0x69, + 0x1a, 0x40, 0x01, 0xd0, 0x01, 0x22, 0x00, 0xe0, + 0x00, 0x22, 0x0a, 0x60, 0x01, 0x21, 0x00, 0x2a, + 0x00, 0xd0, 0x00, 0x21, 0x01, 0x60, 0x70, 0x47, + 0x10, 0x00, 0x07, 0x00, 0xa4, 0x6c, 0x01, 0x00, + 0x01, 0x22, 0x02, 0x60, 0x0a, 0x60, 0x70, 0x47, + 0xb0, 0xb5, 0x0d, 0x1c, 0x01, 0x1c, 0x58, 0x31, + 0x3c, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x04, 0x1c, + 0x06, 0x22, 0x28, 0x1d, 0xfe, 0xf7, 0x77, 0xfb, + 0x21, 0x1c, 0x5e, 0x31, 0x06, 0x22, 0x28, 0x1c, + 0x0a, 0x30, 0xfe, 0xf7, 0x70, 0xfb, 0x21, 0x1c, + 0x64, 0x31, 0x06, 0x22, 0x28, 0x1c, 0x10, 0x30, + 0xfe, 0xf7, 0x69, 0xfb, 0xb0, 0xbd, 0xfe, 0xb5, + 0x00, 0x25, 0x1d, 0x72, 0x17, 0x1c, 0x0e, 0x1c, + 0xb2, 0x6d, 0x00, 0x21, 0x92, 0x19, 0x50, 0x32, + 0xd2, 0x7a, 0x3c, 0x00, 0x3c, 0x1e, 0x00, 0x00, + 0x1c, 0x1c, 0x5a, 0x72, 0x00, 0x78, 0x32, 0x1c, + 0x80, 0x32, 0xc0, 0x07, 0xc0, 0x17, 0x01, 0x30, + 0x01, 0x90, 0x08, 0x98, 0x02, 0x92, 0x00, 0x28, + 0x01, 0xd1, 0x30, 0x7f, 0x2b, 0xe0, 0x37, 0x48, + 0x00, 0x68, 0x00, 0x28, 0x00, 0xdd, 0x01, 0x1c, + 0x01, 0x98, 0x00, 0x28, 0x02, 0xd0, 0x08, 0x98, + 0x01, 0x28, 0x10, 0xd1, 0x02, 0x9a, 0x90, 0x6b, + 0x00, 0x28, 0x06, 0xd0, 0x3c, 0x00, 0x78, 0x1e, + 0x00, 0x00, 0x88, 0x42, 0x01, 0xd9, 0x45, 0x1a, + 0x01, 0x3d, 0x70, 0x19, 0xb0, 0x30, 0x03, 0xe0, + 0xb5, 0x6d, 0x01, 0x3d, 0x70, 0x19, 0x50, 0x30, + 0x00, 0x7b, 0x0f, 0xe0, 0x02, 0x9a, 0x10, 0x6a, + 0x00, 0x28, 0x07, 0xd0, 0x88, 0x42, 0x01, 0xd9, + 0x45, 0x1a, 0x01, 0x3d, 0x70, 0x19, 0xa0, 0x30, + 0x00, 0x79, 0x03, 0xe0, 0xbd, 0x69, 0x01, 0x3d, + 0x78, 0x19, 0x00, 0x7f, 0xa0, 0x72, 0x3c, 0x00, + 0xb4, 0x1e, 0x00, 0x00, 0x0e, 0xf0, 0x0c, 0xf8, + 0x0e, 0x28, 0x11, 0xd1, 0xa0, 0x7a, 0x08, 0xf0, + 0x67, 0xff, 0x00, 0x28, 0x0c, 0xd0, 0x78, 0x68, + 0x00, 0x28, 0x05, 0xd1, 0x1b, 0x48, 0x00, 0x25, + 0x00, 0x78, 0x08, 0xf0, 0x4b, 0xff, 0x02, 0xe0, + 0x45, 0x1e, 0x78, 0x19, 0x00, 0x7a, 0xa0, 0x72, + 0x02, 0x9a, 0x50, 0x69, 0x00, 0x28, 0x17, 0xd0, + 0x08, 0x98, 0x01, 0x28, 0x14, 0xd0, 0xa0, 0x7a, + 0x3c, 0x00, 0xf0, 0x1e, 0x00, 0x00, 0x08, 0xf0, + 0x4e, 0xff, 0x00, 0x28, 0x0f, 0xd0, 0x01, 0x98, + 0x00, 0x28, 0x07, 0xd0, 0x02, 0x20, 0x20, 0x72, + 0x70, 0x6c, 0x80, 0x19, 0x40, 0x30, 0xc0, 0x79, + 0x60, 0x72, 0x04, 0xe0, 0x7d, 0x68, 0x01, 0x3d, + 0x78, 0x19, 0x00, 0x7a, 0xa0, 0x72, 0x02, 0x9a, + 0xa0, 0x7a, 0x91, 0x69, 0x08, 0xf0, 0x51, 0xff, + 0x20, 0x60, 0x02, 0x9a, 0x60, 0x7a, 0x91, 0x69, + 0x08, 0xf0, 0x3c, 0x00, 0x2c, 0x1f, 0x00, 0x00, + 0x4b, 0xff, 0x60, 0x60, 0xa0, 0x7a, 0xe0, 0x72, + 0x25, 0x73, 0xfe, 0xbd, 0xd4, 0x7e, 0x01, 0x00, + 0x90, 0x57, 0x01, 0x00, 0x00, 0x06, 0x00, 0x0e, + 0x00, 0x2a, 0x8c, 0xb5, 0x01, 0xd0, 0x8a, 0x22, + 0x00, 0xe0, 0x88, 0x22, 0x00, 0xab, 0x1a, 0x80, + 0x0c, 0xf0, 0xc2, 0xf8, 0x01, 0x90, 0x68, 0x46, + 0x0b, 0xf0, 0xbc, 0xfa, 0x8c, 0xbd, 0x00, 0x00, + 0x01, 0x1c, 0x08, 0x48, 0x3c, 0x00, 0x68, 0x1f, + 0x00, 0x00, 0x80, 0xb5, 0x00, 0x68, 0x00, 0x28, + 0x09, 0xd0, 0x49, 0x68, 0x02, 0x20, 0x00, 0x29, + 0x00, 0xd1, 0x01, 0x20, 0x01, 0x06, 0x09, 0x0e, + 0x00, 0x20, 0x06, 0xf0, 0xd8, 0xff, 0x80, 0xbd, + 0x00, 0x00, 0x20, 0x67, 0x01, 0x00, 0x1c, 0xb5, + 0x01, 0x90, 0x04, 0x1c, 0x44, 0x30, 0x01, 0xaa, + 0x69, 0x46, 0x11, 0xf0, 0xb8, 0xfd, 0x00, 0x28, + 0x0b, 0xd0, 0xa0, 0x69, 0x00, 0x21, 0x3c, 0x00, + 0xa4, 0x1f, 0x00, 0x00, 0xc2, 0x07, 0xd2, 0x0f, + 0x02, 0x20, 0xff, 0xf7, 0xc9, 0xff, 0x00, 0x21, + 0x20, 0x1c, 0x0f, 0xf0, 0xd9, 0xfe, 0x1c, 0xbd, + 0x04, 0x21, 0x98, 0x20, 0xff, 0xf7, 0x72, 0xf9, + 0xf9, 0xe7, 0x00, 0x00, 0x8c, 0xb5, 0x00, 0xab, + 0x84, 0x21, 0x19, 0x80, 0x05, 0x4b, 0x02, 0x1c, + 0x18, 0x1c, 0x99, 0x8a, 0x0c, 0xf0, 0x8e, 0xf8, + 0x01, 0x90, 0x68, 0x46, 0x0b, 0xf0, 0x7c, 0xfa, + 0x3c, 0x00, 0xe0, 0x1f, 0x00, 0x00, 0x8c, 0xbd, + 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0x70, 0x47, + 0x00, 0x00, 0x06, 0x49, 0x80, 0xb5, 0xc9, 0x68, + 0x14, 0x23, 0x40, 0x31, 0x89, 0x7a, 0x04, 0x4a, + 0x59, 0x43, 0x89, 0x18, 0x80, 0x00, 0x08, 0x58, + 0xfe, 0xf7, 0xe9, 0xf9, 0x80, 0xbd, 0x70, 0x7c, + 0x01, 0x00, 0x54, 0x47, 0x01, 0x00, 0x80, 0xb5, + 0x00, 0x20, 0xff, 0xf7, 0xd6, 0xff, 0x80, 0xbd, + 0x00, 0x00, 0x3c, 0x00, 0x1c, 0x20, 0x00, 0x00, + 0x80, 0xb5, 0x12, 0x48, 0x11, 0x49, 0x80, 0x8a, + 0x0a, 0x8b, 0x00, 0x21, 0x00, 0x28, 0xc2, 0xb0, + 0x0c, 0xd1, 0x01, 0x2a, 0x05, 0xd0, 0x02, 0x2a, + 0x15, 0xd0, 0x00, 0xab, 0x5a, 0x80, 0x0e, 0x22, + 0x07, 0xe0, 0x02, 0x22, 0x00, 0xab, 0x5a, 0x80, + 0x99, 0x80, 0x04, 0xe0, 0x00, 0xab, 0x5a, 0x80, + 0x0d, 0x22, 0x00, 0xab, 0x9a, 0x80, 0x00, 0xab, + 0x18, 0x80, 0xff, 0x20, 0x3c, 0x00, 0x58, 0x20, + 0x00, 0x00, 0x98, 0x71, 0xd9, 0x71, 0x68, 0x46, + 0x00, 0xf0, 0xd1, 0xf9, 0x42, 0xb0, 0x80, 0xbd, + 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0x10, 0xb5, + 0x09, 0xf0, 0x5f, 0xfc, 0x00, 0x20, 0x05, 0xf0, + 0x2a, 0xf9, 0x03, 0x4c, 0xe0, 0x8a, 0x05, 0xf0, + 0x36, 0xf9, 0x20, 0x1c, 0x0f, 0xf0, 0xb3, 0xfe, + 0x10, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x1c, 0xb5, + 0x09, 0xf0, 0x4f, 0xfc, 0x07, 0x20, 0x3c, 0x00, + 0x94, 0x20, 0x00, 0x00, 0x00, 0xab, 0x07, 0x4c, + 0x18, 0x80, 0xe1, 0x8a, 0x20, 0x1c, 0x0c, 0xf0, + 0x0b, 0xf8, 0x01, 0x90, 0x68, 0x46, 0x0b, 0xf0, + 0x17, 0xfa, 0x20, 0x1c, 0x0f, 0xf0, 0x9e, 0xfe, + 0x1c, 0xbd, 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, + 0x80, 0xb5, 0x02, 0x21, 0x98, 0x20, 0xff, 0xf7, + 0xf1, 0xf8, 0x80, 0xbd, 0x10, 0xb5, 0x15, 0x4c, + 0xc2, 0xb0, 0xa0, 0x8a, 0x00, 0x28, 0x03, 0xd0, + 0x3c, 0x00, 0xd0, 0x20, 0x00, 0x00, 0x01, 0x28, + 0x1e, 0xd1, 0x02, 0x20, 0x00, 0xe0, 0x01, 0x20, + 0xe1, 0x68, 0x40, 0x31, 0x88, 0x72, 0x20, 0x69, + 0x08, 0xf0, 0x23, 0xfd, 0x02, 0x1c, 0x0c, 0x48, + 0x18, 0x38, 0x80, 0x88, 0xe1, 0x68, 0x0f, 0xf0, + 0xa4, 0xfe, 0xa0, 0x8a, 0x00, 0xab, 0x18, 0x80, + 0x01, 0x20, 0x58, 0x80, 0x00, 0x20, 0x98, 0x80, + 0xff, 0x21, 0x99, 0x71, 0xd8, 0x71, 0x68, 0x46, + 0x00, 0xf0, 0x3c, 0x00, 0x0c, 0x21, 0x00, 0x00, + 0x7b, 0xf9, 0x42, 0xb0, 0x10, 0xbd, 0x03, 0x21, + 0x98, 0x20, 0xff, 0xf7, 0xc5, 0xf8, 0xf8, 0xe7, + 0x70, 0x7c, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x80, 0xb5, 0x03, 0x48, 0x0f, 0xf0, 0x60, 0xfe, + 0x00, 0x20, 0x05, 0xf0, 0xcd, 0xf8, 0x80, 0xbd, + 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x48, + 0x0f, 0xf0, 0x56, 0xfe, 0x80, 0xbd, 0x00, 0x00, + 0x70, 0x7c, 0x01, 0x00, 0x3c, 0x00, 0x48, 0x21, + 0x00, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x98, 0x20, + 0xff, 0xf7, 0xa9, 0xf8, 0x80, 0xbd, 0x80, 0xb5, + 0x03, 0x20, 0xff, 0xf7, 0x34, 0xff, 0x80, 0xbd, + 0x00, 0x00, 0xf0, 0xb5, 0x21, 0x4e, 0x00, 0x27, + 0xb1, 0x8a, 0x30, 0x1c, 0x00, 0x25, 0x04, 0x24, + 0x00, 0x29, 0x00, 0x8b, 0xc3, 0xb0, 0x1e, 0xd1, + 0x01, 0x28, 0x07, 0xd0, 0x31, 0x1c, 0x49, 0x8b, + 0x02, 0x28, 0x12, 0xd1, 0x00, 0x29, 0x3c, 0x00, + 0x84, 0x21, 0x00, 0x00, 0x07, 0xd1, 0x00, 0x24, + 0x05, 0xe0, 0x00, 0x24, 0x01, 0x25, 0x02, 0x20, + 0x00, 0xab, 0xd8, 0x80, 0x1f, 0x81, 0x0f, 0xf0, + 0x7f, 0xff, 0x00, 0x2c, 0x10, 0xd1, 0xf1, 0x68, + 0x05, 0x20, 0x40, 0x31, 0x88, 0x72, 0x0e, 0xe0, + 0x00, 0x29, 0x1a, 0xd1, 0x00, 0xab, 0xd8, 0x80, + 0x0e, 0x20, 0x02, 0xe0, 0x00, 0xab, 0xd8, 0x80, + 0x0d, 0x20, 0x00, 0xab, 0x18, 0x81, 0x07, 0xe0, + 0x3c, 0x00, 0xc0, 0x21, 0x00, 0x00, 0x30, 0x1c, + 0x0f, 0xf0, 0x13, 0xfe, 0x20, 0x1c, 0xff, 0xf7, + 0xfc, 0xfe, 0x00, 0x2d, 0x08, 0xd0, 0xb0, 0x8a, + 0x00, 0xab, 0x98, 0x80, 0xff, 0x20, 0x98, 0x72, + 0xdf, 0x72, 0x01, 0xa8, 0x00, 0xf0, 0x11, 0xf9, + 0x43, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0x70, 0x7c, + 0x01, 0x00, 0x10, 0xb5, 0x00, 0x20, 0x05, 0xf0, + 0x6c, 0xf8, 0x04, 0x4c, 0xe0, 0x8a, 0x05, 0xf0, + 0x78, 0xf8, 0x3c, 0x00, 0xfc, 0x21, 0x00, 0x00, + 0x0f, 0xf0, 0x4c, 0xff, 0x20, 0x1c, 0x0f, 0xf0, + 0xf3, 0xfd, 0x10, 0xbd, 0x70, 0x7c, 0x01, 0x00, + 0x80, 0xb5, 0x04, 0x20, 0xff, 0xf7, 0xd8, 0xfe, + 0x01, 0x48, 0x0f, 0xf0, 0xe9, 0xfd, 0x80, 0xbd, + 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x20, + 0xff, 0xf7, 0xce, 0xfe, 0x01, 0x20, 0x05, 0xf0, + 0x5f, 0xf8, 0x02, 0x48, 0x0f, 0xf0, 0xdc, 0xfd, + 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x38, 0x22, + 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, + 0x03, 0x20, 0xff, 0xf7, 0xc0, 0xfe, 0x80, 0xbd, + 0x00, 0x00, 0xb0, 0xb5, 0x1d, 0x4d, 0xc2, 0xb0, + 0x28, 0x8b, 0x00, 0xab, 0xff, 0x21, 0x58, 0x80, + 0x99, 0x71, 0x00, 0x21, 0xd9, 0x71, 0xaa, 0x8a, + 0x00, 0x24, 0x01, 0x2a, 0x18, 0xd1, 0x2a, 0x1c, + 0x52, 0x8b, 0x02, 0x28, 0x0f, 0xd1, 0x00, 0x2a, + 0x16, 0xd1, 0x03, 0x20, 0x58, 0x80, 0x3c, 0x00, + 0x74, 0x22, 0x00, 0x00, 0x99, 0x80, 0x2c, 0x1c, + 0xff, 0x22, 0x98, 0x1d, 0xe9, 0x69, 0xfe, 0xf7, + 0x3b, 0xf9, 0xe1, 0x68, 0x04, 0x20, 0x40, 0x31, + 0x88, 0x72, 0x10, 0xe0, 0x00, 0x2a, 0x06, 0xd1, + 0x01, 0x24, 0x0e, 0x20, 0x01, 0xe0, 0x01, 0x24, + 0x0d, 0x20, 0x00, 0xab, 0x98, 0x80, 0x28, 0x1c, + 0x0f, 0xf0, 0xa4, 0xfd, 0x04, 0x20, 0xff, 0xf7, + 0x8d, 0xfe, 0x00, 0x2c, 0x05, 0xd0, 0xa8, 0x8a, + 0x3c, 0x00, 0xb0, 0x22, 0x00, 0x00, 0x00, 0xab, + 0x18, 0x80, 0x68, 0x46, 0x00, 0xf0, 0xa5, 0xf8, + 0x42, 0xb0, 0xb0, 0xbd, 0x00, 0x00, 0x70, 0x7c, + 0x01, 0x00, 0x10, 0xb5, 0x00, 0x20, 0x05, 0xf0, + 0x00, 0xf8, 0x03, 0x4c, 0xe0, 0x8a, 0x05, 0xf0, + 0x0c, 0xf8, 0x20, 0x1c, 0x0f, 0xf0, 0x89, 0xfd, + 0x10, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, + 0x04, 0x20, 0xff, 0xf7, 0x6e, 0xfe, 0x01, 0x48, + 0x0f, 0xf0, 0x3c, 0x00, 0xec, 0x22, 0x00, 0x00, + 0x7f, 0xfd, 0x80, 0xbd, 0x70, 0x7c, 0x01, 0x00, + 0x80, 0xb5, 0x02, 0x20, 0xff, 0xf7, 0x64, 0xfe, + 0x01, 0x20, 0x04, 0xf0, 0xf5, 0xff, 0x02, 0x48, + 0x0f, 0xf0, 0x72, 0xfd, 0x80, 0xbd, 0x00, 0x00, + 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x03, 0x20, + 0xff, 0xf7, 0x56, 0xfe, 0x80, 0xbd, 0x00, 0x00, + 0xb0, 0xb5, 0x19, 0x4d, 0x04, 0x24, 0xa9, 0x8a, + 0x28, 0x1c, 0x02, 0x8b, 0x3c, 0x00, 0x28, 0x23, + 0x00, 0x00, 0xc2, 0xb0, 0x01, 0x29, 0x14, 0xd1, + 0x40, 0x8b, 0x04, 0x2a, 0x0b, 0xd1, 0x00, 0x28, + 0x00, 0xd1, 0x00, 0x24, 0x0f, 0xf0, 0xad, 0xfe, + 0x00, 0x2c, 0x19, 0xd1, 0xe9, 0x68, 0x05, 0x20, + 0x40, 0x31, 0x88, 0x72, 0x17, 0xe0, 0x00, 0x28, + 0x10, 0xd1, 0x00, 0xab, 0x5a, 0x80, 0x0e, 0x20, + 0x02, 0xe0, 0x00, 0xab, 0x5a, 0x80, 0x0d, 0x20, + 0x00, 0xab, 0x98, 0x80, 0x19, 0x80, 0x3c, 0x00, + 0x64, 0x23, 0x00, 0x00, 0xff, 0x20, 0x98, 0x71, + 0x00, 0x20, 0xd8, 0x71, 0x68, 0x46, 0x00, 0xf0, + 0x49, 0xf8, 0x42, 0xb0, 0xb0, 0xbd, 0x28, 0x1c, + 0x0f, 0xf0, 0x38, 0xfd, 0x20, 0x1c, 0xff, 0xf7, + 0x21, 0xfe, 0xf6, 0xe7, 0x70, 0x7c, 0x01, 0x00, + 0x10, 0xb5, 0x00, 0x20, 0x04, 0xf0, 0x9e, 0xff, + 0x03, 0x4c, 0xe0, 0x8a, 0x04, 0xf0, 0xaa, 0xff, + 0x20, 0x1c, 0x0f, 0xf0, 0x27, 0xfd, 0x10, 0xbd, + 0x3c, 0x00, 0xa0, 0x23, 0x00, 0x00, 0x70, 0x7c, + 0x01, 0x00, 0x80, 0xb5, 0x04, 0x20, 0xff, 0xf7, + 0x0c, 0xfe, 0x01, 0x48, 0x0f, 0xf0, 0x1d, 0xfd, + 0x80, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, + 0x02, 0x20, 0xff, 0xf7, 0x02, 0xfe, 0x01, 0x20, + 0x04, 0xf0, 0x93, 0xff, 0x02, 0x48, 0x0f, 0xf0, + 0x10, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0x70, 0x7c, + 0x01, 0x00, 0xb0, 0xb5, 0x0a, 0x4d, 0x01, 0x1c, + 0x44, 0x31, 0x3c, 0x00, 0xdc, 0x23, 0x00, 0x00, + 0x04, 0x1c, 0x06, 0x22, 0x28, 0x1c, 0xfe, 0xf7, + 0x89, 0xf8, 0xec, 0x60, 0x20, 0x69, 0x03, 0xf0, + 0x97, 0xf8, 0x01, 0x1c, 0x06, 0x22, 0xa8, 0x18, + 0xfe, 0xf7, 0x80, 0xf8, 0x04, 0x20, 0xff, 0xf7, + 0xf7, 0xfd, 0xb0, 0xbd, 0x70, 0x7c, 0x01, 0x00, + 0x90, 0xb5, 0x04, 0x1c, 0x80, 0x88, 0x93, 0xb0, + 0x00, 0x28, 0x06, 0xd0, 0x15, 0x49, 0x06, 0x22, + 0x48, 0x80, 0x18, 0x31, 0x3c, 0x00, 0x18, 0x24, + 0x00, 0x00, 0x88, 0x1f, 0xfe, 0xf7, 0x6d, 0xf8, + 0x68, 0x46, 0x0c, 0xf0, 0x14, 0xf8, 0x20, 0x88, + 0x01, 0x28, 0x08, 0xd1, 0x60, 0x88, 0x03, 0x28, + 0x05, 0xd1, 0xa0, 0x88, 0x00, 0x28, 0x02, 0xd1, + 0x06, 0x20, 0x0c, 0xa9, 0x08, 0x70, 0xa0, 0x79, + 0x06, 0x21, 0xff, 0x28, 0x04, 0xd0, 0xe0, 0x79, + 0x00, 0x28, 0x01, 0xd0, 0x01, 0x1c, 0x08, 0x31, + 0x0b, 0x20, 0x08, 0xaa, 0x50, 0x72, 0x3c, 0x00, + 0x54, 0x24, 0x00, 0x00, 0x20, 0x1c, 0x08, 0xf0, + 0x3b, 0xff, 0x03, 0x90, 0x68, 0x46, 0x0b, 0xf0, + 0x31, 0xf8, 0x13, 0xb0, 0x90, 0xbd, 0x00, 0x00, + 0x58, 0x7c, 0x01, 0x00, 0x07, 0x4b, 0x1a, 0x78, + 0x82, 0x42, 0x01, 0xd0, 0x00, 0x29, 0x07, 0xd0, + 0xff, 0x20, 0x18, 0x70, 0x04, 0x48, 0x01, 0x88, + 0x01, 0x22, 0x52, 0x03, 0x91, 0x43, 0x01, 0x80, + 0x70, 0x47, 0x00, 0x00, 0x4c, 0x7b, 0x01, 0x00, + 0x3c, 0x00, 0x90, 0x24, 0x00, 0x00, 0x32, 0x80, + 0x07, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x0c, 0x23, + 0x07, 0x49, 0x58, 0x43, 0x40, 0x18, 0x00, 0x79, + 0x0a, 0xf0, 0x4f, 0xf9, 0x01, 0x20, 0x03, 0x49, + 0xa0, 0x40, 0x08, 0x39, 0x0a, 0x78, 0x10, 0x43, + 0x08, 0x70, 0x10, 0xbd, 0x00, 0x00, 0x74, 0x7a, + 0x01, 0x00, 0x03, 0x4a, 0x00, 0x21, 0x11, 0x54, + 0x80, 0x00, 0x30, 0x32, 0x10, 0x58, 0x01, 0x70, + 0x70, 0x47, 0x3c, 0x00, 0xcc, 0x24, 0x00, 0x00, + 0xe0, 0x7a, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, + 0x05, 0x28, 0x01, 0xd3, 0xfe, 0xf7, 0x12, 0xff, + 0x20, 0x1c, 0xff, 0xf7, 0xed, 0xff, 0x00, 0x21, + 0x20, 0x1c, 0x0e, 0xf0, 0x89, 0xfb, 0x10, 0xbd, + 0x05, 0x49, 0x80, 0xb5, 0x88, 0x60, 0x08, 0x7f, + 0x24, 0x23, 0x04, 0x49, 0x58, 0x43, 0x08, 0x58, + 0xfd, 0xf7, 0x6c, 0xff, 0x80, 0xbd, 0x00, 0x00, + 0xd4, 0x79, 0x01, 0x00, 0x3c, 0x00, 0x08, 0x25, + 0x00, 0x00, 0x94, 0x46, 0x01, 0x00, 0x80, 0xb5, + 0x01, 0x21, 0x91, 0x20, 0xfe, 0xf7, 0xc7, 0xfe, + 0x80, 0xbd, 0x02, 0x4a, 0x11, 0x68, 0x81, 0x43, + 0x11, 0x60, 0x70, 0x47, 0x00, 0x00, 0x78, 0x6e, + 0x01, 0x00, 0x80, 0xb5, 0xfe, 0xf7, 0xe9, 0xfe, + 0x80, 0xbd, 0x80, 0xb5, 0xfe, 0xf7, 0xe5, 0xfe, + 0x80, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x31, 0xfa, + 0x80, 0xbd, 0x03, 0x49, 0x80, 0xb5, 0x3c, 0x00, + 0x44, 0x25, 0x00, 0x00, 0x04, 0x20, 0x88, 0x60, + 0x00, 0xf0, 0xd0, 0xf9, 0x80, 0xbd, 0x00, 0x00, + 0x00, 0x30, 0x07, 0x00, 0x80, 0xb5, 0x00, 0xf0, + 0x99, 0xfa, 0x80, 0xbd, 0x80, 0xb5, 0x00, 0xf0, + 0x99, 0xfb, 0x80, 0xbd, 0x38, 0xb5, 0x20, 0x28, + 0x15, 0xd2, 0x0d, 0x4c, 0x22, 0x1c, 0x20, 0x32, + 0x95, 0x79, 0x00, 0xab, 0x1d, 0x70, 0xd2, 0x79, + 0x5a, 0x70, 0x0a, 0x4b, 0x82, 0x00, 0x99, 0x50, + 0x3c, 0x00, 0x80, 0x25, 0x00, 0x00, 0x01, 0x21, + 0x81, 0x40, 0x08, 0x48, 0x01, 0x60, 0x42, 0x68, + 0x11, 0x43, 0x41, 0x60, 0x00, 0xab, 0x18, 0x88, + 0xe0, 0x84, 0x38, 0xbd, 0x01, 0x21, 0xff, 0x20, + 0xfe, 0xf7, 0x83, 0xfe, 0xf9, 0xe7, 0x00, 0x10, + 0x07, 0x00, 0x30, 0x74, 0x01, 0x00, 0x00, 0x40, + 0x07, 0x00, 0x20, 0x28, 0x09, 0xd2, 0x05, 0x49, + 0x06, 0x4b, 0x82, 0x00, 0x99, 0x50, 0x05, 0x4a, + 0x51, 0x68, 0x3c, 0x00, 0xbc, 0x25, 0x00, 0x00, + 0x01, 0x23, 0x83, 0x40, 0x99, 0x43, 0x51, 0x60, + 0x70, 0x47, 0x00, 0x00, 0xa9, 0x75, 0x00, 0x00, + 0x30, 0x74, 0x01, 0x00, 0x00, 0x40, 0x07, 0x00, + 0x02, 0x4a, 0x11, 0x68, 0x08, 0x43, 0x10, 0x60, + 0x70, 0x47, 0x00, 0x00, 0x78, 0x6e, 0x01, 0x00, + 0x0b, 0x48, 0x01, 0x68, 0x03, 0x22, 0x12, 0x04, + 0x11, 0x43, 0x01, 0x60, 0x01, 0x68, 0x07, 0x22, + 0x12, 0x06, 0x91, 0x43, 0x3c, 0x00, 0xf8, 0x25, + 0x00, 0x00, 0x01, 0x22, 0x52, 0x06, 0x89, 0x18, + 0x01, 0x60, 0x01, 0x68, 0x12, 0x0c, 0x11, 0x43, + 0x01, 0x60, 0x01, 0x68, 0x52, 0x08, 0x11, 0x43, + 0x01, 0x60, 0x70, 0x47, 0x00, 0x00, 0x80, 0x00, + 0x07, 0x00, 0xfe, 0xb5, 0x1c, 0x4e, 0x05, 0x1c, + 0xb0, 0x8a, 0xf2, 0x68, 0x12, 0xd0, 0x01, 0x24, + 0x00, 0x29, 0x09, 0xd1, 0x11, 0x6d, 0x02, 0xaa, + 0x01, 0xab, 0xfe, 0xf7, 0xf8, 0xfe, 0x3c, 0x00, + 0x34, 0x26, 0x00, 0x00, 0x02, 0x98, 0x00, 0x28, + 0x01, 0xd0, 0x00, 0x24, 0x0b, 0xe0, 0x01, 0xaa, + 0x02, 0xa9, 0x28, 0x1c, 0xfe, 0xf7, 0x70, 0xff, + 0x05, 0xe0, 0x11, 0x6d, 0x02, 0xaa, 0x00, 0x24, + 0x01, 0xab, 0xfe, 0xf7, 0x01, 0xff, 0x0e, 0x49, + 0x08, 0x1c, 0x20, 0x30, 0x82, 0x79, 0x00, 0xab, + 0x1a, 0x70, 0xc0, 0x79, 0x58, 0x70, 0x30, 0x68, + 0x00, 0x28, 0x02, 0xd1, 0x02, 0x98, 0x30, 0x60, + 0x3c, 0x00, 0x70, 0x26, 0x00, 0x00, 0x02, 0xe0, + 0x02, 0x98, 0x72, 0x68, 0xd0, 0x60, 0x01, 0x98, + 0x00, 0xab, 0x70, 0x60, 0x18, 0x88, 0xc8, 0x84, + 0xf0, 0x68, 0xc0, 0x6c, 0xf0, 0x60, 0x20, 0x1c, + 0xfe, 0xbd, 0x24, 0x7e, 0x01, 0x00, 0x00, 0x10, + 0x07, 0x00, 0xf8, 0xb5, 0x04, 0x1c, 0x54, 0x27, + 0x1d, 0x4e, 0x00, 0x20, 0x30, 0x60, 0x70, 0x60, + 0x67, 0x43, 0x38, 0x04, 0x15, 0x1c, 0x00, 0x0c, + 0xb1, 0x82, 0x3c, 0x00, 0xac, 0x26, 0x00, 0x00, + 0xff, 0xf7, 0x96, 0xf8, 0x08, 0x21, 0x30, 0x61, + 0x00, 0x26, 0x17, 0x4a, 0x14, 0xe0, 0x03, 0x1c, + 0x24, 0x33, 0x42, 0x61, 0x03, 0x61, 0xc6, 0x61, + 0x01, 0x83, 0x08, 0x33, 0x03, 0x60, 0xb1, 0x23, + 0x43, 0x60, 0x03, 0x1c, 0x64, 0x33, 0xc3, 0x60, + 0x0c, 0x23, 0x03, 0x81, 0x03, 0x1c, 0x54, 0x33, + 0x4c, 0x30, 0x28, 0xc0, 0x01, 0x3c, 0x18, 0x1c, + 0x00, 0x2c, 0xe8, 0xd1, 0x3c, 0x00, 0xe8, 0x26, + 0x00, 0x00, 0x09, 0x4e, 0x07, 0x22, 0x30, 0x69, + 0xd2, 0x43, 0xc1, 0x19, 0x50, 0x50, 0x02, 0x1c, + 0x10, 0x32, 0x80, 0x39, 0x8a, 0x63, 0xf0, 0x60, + 0xb0, 0x60, 0x00, 0x21, 0x00, 0x20, 0xff, 0xf7, + 0x88, 0xff, 0x30, 0x69, 0xf0, 0x60, 0xb0, 0x60, + 0xf8, 0xbd, 0x24, 0x7e, 0x01, 0x00, 0x91, 0x00, + 0x05, 0x00, 0x01, 0x48, 0x40, 0x6a, 0x70, 0x47, + 0x00, 0x00, 0xe8, 0x7d, 0x01, 0x00, 0x3c, 0x00, + 0x24, 0x27, 0x00, 0x00, 0x01, 0x48, 0x00, 0x88, + 0x70, 0x47, 0x00, 0x00, 0xfc, 0x6b, 0x01, 0x00, + 0x06, 0x49, 0x80, 0xb5, 0x08, 0x88, 0x01, 0x30, + 0x08, 0x80, 0x05, 0x49, 0x08, 0x20, 0x08, 0x60, + 0x04, 0x49, 0x88, 0x69, 0x88, 0x61, 0x00, 0xf0, + 0x21, 0xf8, 0x80, 0xbd, 0xfc, 0x6b, 0x01, 0x00, + 0x00, 0x10, 0x07, 0x00, 0x00, 0x30, 0x07, 0x00, + 0x03, 0x4a, 0x01, 0x20, 0x12, 0x1d, 0x06, 0xca, + 0x3c, 0x00, 0x60, 0x27, 0x00, 0x00, 0x91, 0x42, + 0x00, 0xd1, 0x00, 0x20, 0x70, 0x47, 0xe8, 0x7d, + 0x01, 0x00, 0x06, 0x48, 0x00, 0xb5, 0xc0, 0x7c, + 0x00, 0x28, 0x03, 0xd1, 0xff, 0xf7, 0xef, 0xff, + 0x00, 0x28, 0x01, 0xd0, 0x01, 0x20, 0x00, 0xbd, + 0x00, 0x20, 0x00, 0xbd, 0x00, 0x00, 0xa0, 0x80, + 0x07, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x80, 0x07, + 0x02, 0xd5, 0x06, 0xf0, 0x3e, 0xfd, 0x03, 0xe0, + 0xe0, 0x07, 0x3c, 0x00, 0x9c, 0x27, 0x00, 0x00, + 0x01, 0xd5, 0x06, 0xf0, 0xe3, 0xfd, 0x60, 0x07, + 0x01, 0xd5, 0xfe, 0xf7, 0xab, 0xfd, 0x10, 0xbd, + 0x02, 0x4a, 0x01, 0x1c, 0x10, 0x68, 0x11, 0x60, + 0x70, 0x47, 0x00, 0x00, 0xe8, 0x7d, 0x01, 0x00, + 0x38, 0xb5, 0x20, 0x4d, 0x2c, 0x1c, 0x20, 0x34, + 0xa0, 0x79, 0x00, 0xab, 0x18, 0x70, 0xe0, 0x79, + 0x58, 0x70, 0xfe, 0xf7, 0x27, 0xfa, 0x00, 0xab, + 0x18, 0x88, 0xe8, 0x84, 0x3c, 0x00, 0xd8, 0x27, + 0x00, 0x00, 0x1a, 0x48, 0x81, 0x78, 0x08, 0x22, + 0x91, 0x43, 0x81, 0x70, 0x81, 0x78, 0x11, 0x43, + 0x81, 0x70, 0x17, 0x48, 0x41, 0x68, 0x80, 0x22, + 0x91, 0x43, 0x41, 0x60, 0x01, 0x68, 0x11, 0x43, + 0x01, 0x60, 0x00, 0x20, 0x01, 0x30, 0x64, 0x28, + 0xfc, 0xd3, 0xa0, 0x79, 0x0f, 0x4d, 0x00, 0xab, + 0x18, 0x70, 0xe0, 0x79, 0x10, 0x4c, 0x58, 0x70, + 0x20, 0x1c, 0x10, 0x30, 0x00, 0xf0, 0x3c, 0x00, + 0x14, 0x28, 0x00, 0x00, 0xdf, 0xfb, 0x00, 0x20, + 0xc0, 0x43, 0xa0, 0x61, 0xff, 0xf7, 0x9c, 0xff, + 0x00, 0x28, 0x09, 0xd0, 0x0a, 0x49, 0x08, 0x69, + 0x01, 0x30, 0x08, 0x61, 0x00, 0x20, 0x3c, 0x31, + 0x89, 0x68, 0x48, 0x63, 0x06, 0xf0, 0xee, 0xfc, + 0x00, 0xab, 0x18, 0x88, 0xe8, 0x84, 0x38, 0xbd, + 0x00, 0x10, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, + 0xf4, 0x00, 0x07, 0x00, 0x00, 0x30, 0x07, 0x00, + 0x3c, 0x00, 0x50, 0x28, 0x00, 0x00, 0xe8, 0x7d, + 0x01, 0x00, 0x0a, 0x48, 0x80, 0xb5, 0x00, 0x6a, + 0x00, 0x28, 0x01, 0xd0, 0xfe, 0xf7, 0xc1, 0xf9, + 0x07, 0x48, 0x07, 0x49, 0x3c, 0x30, 0x80, 0x68, + 0x10, 0x30, 0x48, 0x61, 0x01, 0x20, 0x08, 0x61, + 0x05, 0x49, 0x08, 0x68, 0x80, 0x22, 0x90, 0x43, + 0x08, 0x60, 0x80, 0xbd, 0x00, 0x00, 0xe8, 0x7d, + 0x01, 0x00, 0x00, 0x30, 0x07, 0x00, 0xf4, 0x00, + 0x07, 0x00, 0x3c, 0x00, 0x8c, 0x28, 0x00, 0x00, + 0x80, 0xb5, 0x0c, 0xf0, 0xcb, 0xfe, 0x06, 0xf0, + 0xbf, 0xfc, 0x80, 0xbd, 0x01, 0x49, 0xc8, 0x62, + 0x70, 0x47, 0x00, 0x00, 0xe8, 0x7d, 0x01, 0x00, + 0x02, 0x4a, 0x91, 0x6a, 0x08, 0x43, 0x90, 0x62, + 0x70, 0x47, 0x00, 0x00, 0xe8, 0x7d, 0x01, 0x00, + 0x18, 0x23, 0x06, 0x49, 0x58, 0x43, 0x40, 0x18, + 0x00, 0x21, 0x02, 0x79, 0x03, 0x68, 0x1a, 0x70, + 0x01, 0x31, 0x08, 0x30, 0x3c, 0x00, 0xc8, 0x28, + 0x00, 0x00, 0x03, 0x29, 0xf8, 0xd3, 0x70, 0x47, + 0x00, 0x00, 0x28, 0x52, 0x01, 0x00, 0x03, 0x49, + 0x00, 0x28, 0x00, 0xd0, 0x01, 0x1c, 0x02, 0x48, + 0x81, 0x62, 0x70, 0x47, 0x00, 0x00, 0x85, 0x75, + 0x00, 0x00, 0x04, 0x6c, 0x01, 0x00, 0xf8, 0xb5, + 0xff, 0xf7, 0x33, 0xff, 0x28, 0x4f, 0x00, 0x28, + 0x04, 0xd0, 0xff, 0xf7, 0xc8, 0xff, 0x38, 0x6a, + 0x01, 0x30, 0x38, 0x62, 0xf8, 0x6a, 0x3c, 0x00, + 0x04, 0x29, 0x00, 0x00, 0x00, 0x28, 0x02, 0xd0, + 0x01, 0x89, 0x04, 0x39, 0x01, 0x81, 0x38, 0x6b, + 0x00, 0x25, 0x00, 0x28, 0x08, 0xd0, 0x0b, 0x20, + 0x3d, 0x63, 0x10, 0xf0, 0xe5, 0xfa, 0x1e, 0x49, + 0x08, 0x68, 0x21, 0x22, 0x90, 0x43, 0x08, 0x60, + 0x38, 0x78, 0x3c, 0x21, 0x1b, 0x4a, 0x41, 0x43, + 0x8c, 0x18, 0xff, 0x22, 0x79, 0x6a, 0x3a, 0x70, + 0x00, 0x29, 0x0c, 0xd0, 0xb9, 0x69, 0x01, 0x31, + 0x3c, 0x00, 0x40, 0x29, 0x00, 0x00, 0xb9, 0x61, + 0x7d, 0x62, 0xbd, 0x68, 0x00, 0x2d, 0x04, 0xd0, + 0x63, 0x6b, 0x7a, 0x6b, 0x00, 0x21, 0xfd, 0xf7, + 0x47, 0xfd, 0xf8, 0xbd, 0x04, 0x28, 0x03, 0xd3, + 0x01, 0x21, 0x84, 0x20, 0xfe, 0xf7, 0xa1, 0xfc, + 0x38, 0x69, 0x26, 0x1c, 0x01, 0x30, 0x38, 0x61, + 0x20, 0x36, 0x30, 0x78, 0x02, 0x28, 0x03, 0xd0, + 0x0c, 0x21, 0x84, 0x20, 0xfe, 0xf7, 0x95, 0xfc, + 0x35, 0x70, 0x3c, 0x00, 0x7c, 0x29, 0x00, 0x00, + 0xa1, 0x69, 0x00, 0x29, 0xe8, 0xd0, 0x63, 0x6b, + 0x30, 0x34, 0x20, 0x78, 0x0c, 0x1c, 0x00, 0x21, + 0x7a, 0x6b, 0xfd, 0xf7, 0x27, 0xfd, 0xdf, 0xe7, + 0x04, 0x6c, 0x01, 0x00, 0xf4, 0x00, 0x07, 0x00, + 0x18, 0xdb, 0x01, 0x00, 0x10, 0xb5, 0x0b, 0x4c, + 0x60, 0x6a, 0x00, 0x28, 0x0e, 0xd0, 0x0a, 0x48, + 0x00, 0xf0, 0x12, 0xfb, 0x00, 0x20, 0x60, 0x62, + 0xa4, 0x68, 0x00, 0x2c, 0x3c, 0x00, 0xb8, 0x29, + 0x00, 0x00, 0x05, 0xd0, 0x7e, 0x23, 0xdb, 0x43, + 0x00, 0x22, 0x01, 0x21, 0xfd, 0xf7, 0x0d, 0xfd, + 0x10, 0xbd, 0xe0, 0x69, 0x01, 0x30, 0xe0, 0x61, + 0x10, 0xbd, 0x04, 0x6c, 0x01, 0x00, 0x00, 0x30, + 0x07, 0x00, 0x09, 0x48, 0x41, 0x68, 0x3f, 0x22, + 0x12, 0x04, 0x91, 0x43, 0x0d, 0x22, 0x12, 0x04, + 0x89, 0x18, 0x41, 0x60, 0x41, 0x68, 0x01, 0x22, + 0x52, 0x02, 0x91, 0x43, 0x41, 0x60, 0x3c, 0x00, + 0xf4, 0x29, 0x00, 0x00, 0x03, 0x48, 0x81, 0x78, + 0x81, 0x70, 0x81, 0x78, 0x81, 0x70, 0x70, 0x47, + 0x80, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, + 0xf0, 0xb5, 0x01, 0x25, 0x08, 0x24, 0x00, 0x20, + 0x0e, 0x4a, 0x0f, 0x49, 0x00, 0x26, 0x3c, 0x23, + 0x43, 0x43, 0xd1, 0x52, 0x9b, 0x18, 0x5d, 0x71, + 0x9b, 0x60, 0x5e, 0x61, 0x1c, 0x82, 0xc0, 0x27, + 0xdf, 0x60, 0x20, 0x27, 0xfe, 0x54, 0x9e, 0x61, + 0x3c, 0x00, 0x30, 0x2a, 0x00, 0x00, 0x30, 0x27, + 0xfe, 0x54, 0x07, 0x4f, 0x3f, 0x18, 0x20, 0x37, + 0x01, 0x30, 0x05, 0x28, 0x9f, 0x63, 0xe9, 0xd3, + 0x05, 0x48, 0xff, 0x32, 0x01, 0x32, 0x90, 0x62, + 0xf0, 0xbd, 0x18, 0xdb, 0x01, 0x00, 0xbe, 0xba, + 0x00, 0x00, 0x30, 0x80, 0x07, 0x00, 0x06, 0x6c, + 0x01, 0x00, 0x01, 0x49, 0x48, 0x60, 0x70, 0x47, + 0x00, 0x00, 0x04, 0x6c, 0x01, 0x00, 0x05, 0x49, + 0x08, 0x5c, 0x3c, 0x00, 0x6c, 0x2a, 0x00, 0x00, + 0x05, 0x49, 0x49, 0x68, 0x40, 0x18, 0xc0, 0x06, + 0xc0, 0x0e, 0x04, 0x49, 0x20, 0x30, 0x48, 0x72, + 0x70, 0x47, 0x00, 0x00, 0xa0, 0x57, 0x01, 0x00, + 0x04, 0x6c, 0x01, 0x00, 0x00, 0x80, 0x07, 0x00, + 0x80, 0xb5, 0x15, 0x21, 0x84, 0x20, 0xfe, 0xf7, + 0x07, 0xfc, 0x80, 0xbd, 0xf8, 0xb5, 0x43, 0x48, + 0x84, 0x68, 0x03, 0x34, 0x42, 0x4d, 0x04, 0xe0, + 0x20, 0x1c, 0x10, 0xf0, 0x3c, 0x00, 0xa8, 0x2a, + 0x00, 0x00, 0xb9, 0xf8, 0x00, 0x28, 0x71, 0xd1, + 0x28, 0x69, 0xc0, 0x07, 0xf7, 0xd5, 0x3e, 0x48, + 0x28, 0x60, 0x3e, 0x4a, 0x14, 0x1c, 0x20, 0x34, + 0x20, 0x79, 0x00, 0x90, 0x3c, 0x23, 0x3c, 0x49, + 0x58, 0x43, 0x45, 0x18, 0x28, 0x79, 0xff, 0xf7, + 0xcc, 0xff, 0x28, 0x1c, 0x3a, 0x49, 0x08, 0x30, + 0x48, 0x60, 0x01, 0x26, 0x08, 0x1c, 0x06, 0x60, + 0x68, 0x6a, 0x00, 0x28, 0x0d, 0xd0, 0x3c, 0x00, + 0xe4, 0x2a, 0x00, 0x00, 0xa9, 0x6a, 0x92, 0x6a, + 0x35, 0x4b, 0x9f, 0x68, 0xd7, 0x1b, 0x1a, 0x68, + 0x51, 0x18, 0x79, 0x18, 0x8a, 0x42, 0x5a, 0x68, + 0x00, 0xd8, 0x00, 0xe0, 0x01, 0x32, 0x06, 0xc0, + 0xe8, 0x6a, 0xfe, 0xf7, 0x87, 0xff, 0x2d, 0x49, + 0xe8, 0x6a, 0x48, 0x60, 0x30, 0x1c, 0x0e, 0x60, + 0x66, 0x79, 0x1f, 0xe0, 0x2b, 0x48, 0x46, 0x61, + 0x04, 0x7f, 0x29, 0x49, 0x20, 0x1c, 0x50, 0x39, + 0x3c, 0x00, 0x20, 0x2b, 0x00, 0x00, 0x89, 0x6a, + 0xfd, 0xf7, 0x5a, 0xfc, 0x00, 0x98, 0x84, 0x42, + 0x10, 0xd0, 0x3c, 0x20, 0x22, 0x49, 0x60, 0x43, + 0x40, 0x18, 0x87, 0x69, 0x00, 0x2f, 0x09, 0xd0, + 0x00, 0x21, 0x20, 0x30, 0x01, 0x70, 0x7e, 0x23, + 0xdb, 0x43, 0x02, 0x21, 0x00, 0x22, 0x20, 0x1c, + 0xfd, 0xf7, 0x4c, 0xfc, 0x01, 0x20, 0xa0, 0x40, + 0x86, 0x43, 0x00, 0x2e, 0xdd, 0xd1, 0xe9, 0x69, + 0x00, 0x29, 0x3c, 0x00, 0x5c, 0x2b, 0x00, 0x00, + 0x03, 0xd0, 0x30, 0x20, 0x40, 0x5d, 0xfd, 0xf7, + 0x3a, 0xfc, 0x16, 0x4c, 0x50, 0x3c, 0x60, 0x6a, + 0x00, 0x28, 0x03, 0xd0, 0x0a, 0x21, 0x84, 0x20, + 0xfe, 0xf7, 0x96, 0xfb, 0x20, 0x35, 0x28, 0x78, + 0x01, 0x28, 0x03, 0xd0, 0x0b, 0x21, 0x84, 0x20, + 0xfe, 0xf7, 0x8e, 0xfb, 0x02, 0x20, 0x28, 0x70, + 0xe0, 0x68, 0x01, 0x30, 0x00, 0xe0, 0x07, 0xe0, + 0xe0, 0x60, 0x00, 0x98, 0x3c, 0x00, 0x98, 0x2b, + 0x00, 0x00, 0x20, 0x70, 0x00, 0x98, 0x60, 0x70, + 0x0a, 0x48, 0x00, 0x68, 0x60, 0x63, 0xf8, 0xbd, + 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x40, + 0x07, 0x00, 0x01, 0x00, 0x00, 0x01, 0x30, 0x80, + 0x07, 0x00, 0x18, 0xdb, 0x01, 0x00, 0x00, 0x30, + 0x07, 0x00, 0x54, 0x6c, 0x01, 0x00, 0x00, 0xa0, + 0x07, 0x00, 0x78, 0x6e, 0x01, 0x00, 0x3c, 0x22, + 0x3c, 0x23, 0x4a, 0x43, 0x09, 0x49, 0x3c, 0x00, + 0xd4, 0x2b, 0x00, 0x00, 0xb0, 0xb5, 0x54, 0x18, + 0x58, 0x43, 0x45, 0x18, 0x21, 0x1c, 0x38, 0x22, + 0x28, 0x1c, 0xfd, 0xf7, 0xe5, 0xfc, 0xa0, 0x6b, + 0x00, 0x78, 0xa9, 0x6b, 0x08, 0x70, 0x00, 0x20, + 0x20, 0x34, 0x20, 0x70, 0xb0, 0xbd, 0x00, 0x00, + 0x18, 0xdb, 0x01, 0x00, 0x3c, 0x23, 0x07, 0x49, + 0x58, 0x43, 0x10, 0xb5, 0x44, 0x18, 0x20, 0x34, + 0x20, 0x78, 0x02, 0x28, 0x03, 0xd1, 0x0d, 0x21, + 0x3c, 0x00, 0x10, 0x2c, 0x00, 0x00, 0x84, 0x20, + 0xfe, 0xf7, 0x47, 0xfb, 0x00, 0x20, 0x20, 0x70, + 0x10, 0xbd, 0x18, 0xdb, 0x01, 0x00, 0xff, 0xb5, + 0x3c, 0x20, 0x48, 0x43, 0x1a, 0x49, 0x81, 0xb0, + 0x44, 0x18, 0x26, 0x1c, 0x20, 0x36, 0x30, 0x78, + 0x15, 0x1c, 0x0f, 0x9f, 0x02, 0x28, 0x03, 0xd1, + 0x04, 0x21, 0x84, 0x20, 0xfe, 0xf7, 0x31, 0xfb, + 0x01, 0x20, 0x30, 0x70, 0x25, 0x71, 0x0b, 0x99, + 0x30, 0x22, 0x3c, 0x00, 0x4c, 0x2c, 0x00, 0x00, + 0x61, 0x80, 0x0a, 0x99, 0xe1, 0x62, 0x0d, 0x99, + 0xa1, 0x61, 0x0c, 0x99, 0xe1, 0x61, 0x0e, 0x99, + 0x61, 0x62, 0xa7, 0x62, 0x01, 0x99, 0x11, 0x55, + 0x7e, 0x21, 0xc9, 0x43, 0x61, 0x63, 0x04, 0x99, + 0x00, 0x29, 0x00, 0xd1, 0x00, 0x20, 0x06, 0x1c, + 0x28, 0x1c, 0x08, 0xf0, 0x8b, 0xf8, 0x00, 0x28, + 0x01, 0xd0, 0x02, 0x20, 0x00, 0xe0, 0x00, 0x20, + 0xa1, 0x6b, 0x30, 0x43, 0x3c, 0x00, 0x88, 0x2c, + 0x00, 0x00, 0x08, 0x70, 0x05, 0xb0, 0xf0, 0xbd, + 0x00, 0x00, 0x18, 0xdb, 0x01, 0x00, 0x80, 0xb5, + 0x14, 0x21, 0x84, 0x20, 0xfe, 0xf7, 0x03, 0xfb, + 0x80, 0xbd, 0x01, 0x48, 0x40, 0x78, 0x70, 0x47, + 0x00, 0x00, 0x04, 0x6c, 0x01, 0x00, 0x02, 0x48, + 0x00, 0x69, 0xc0, 0x07, 0xc0, 0x0f, 0x70, 0x47, + 0x00, 0x00, 0x00, 0x40, 0x07, 0x00, 0x01, 0x1c, + 0x3c, 0x23, 0x04, 0x4a, 0x59, 0x43, 0x3c, 0x00, + 0xc4, 0x2c, 0x00, 0x00, 0x89, 0x18, 0x20, 0x31, + 0x09, 0x78, 0x01, 0x20, 0x00, 0x29, 0x00, 0xd0, + 0x00, 0x20, 0x70, 0x47, 0x18, 0xdb, 0x01, 0x00, + 0x08, 0x48, 0x40, 0x6a, 0x00, 0x28, 0x0a, 0xd1, + 0x07, 0x4a, 0x00, 0x21, 0x20, 0x23, 0x9b, 0x5c, + 0x02, 0x2b, 0x04, 0xd0, 0x01, 0x31, 0x3c, 0x32, + 0x05, 0x29, 0xf7, 0xd3, 0x70, 0x47, 0x01, 0x20, + 0x70, 0x47, 0x00, 0x00, 0x04, 0x6c, 0x01, 0x00, + 0x3c, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x18, 0xdb, + 0x01, 0x00, 0xf8, 0xb5, 0x0e, 0x1c, 0x04, 0x1c, + 0x17, 0x1c, 0xfe, 0xf7, 0x82, 0xfe, 0x20, 0x1c, + 0x11, 0x4c, 0x60, 0x60, 0x01, 0x20, 0x20, 0x60, + 0x10, 0x4d, 0x68, 0x69, 0x01, 0x30, 0x68, 0x61, + 0x68, 0x6a, 0x00, 0x28, 0x03, 0xd0, 0x07, 0x21, + 0x84, 0x20, 0xfe, 0xf7, 0xba, 0xfa, 0xa0, 0x68, + 0x40, 0x07, 0x03, 0xd5, 0x06, 0x21, 0x84, 0x20, + 0xfe, 0xf7, 0x3c, 0x00, 0x3c, 0x2d, 0x00, 0x00, + 0xb3, 0xfa, 0x08, 0x48, 0x00, 0x69, 0x00, 0x28, + 0x03, 0xda, 0xaa, 0x21, 0x84, 0x20, 0xfe, 0xf7, + 0xab, 0xfa, 0x02, 0x20, 0x68, 0x62, 0xae, 0x60, + 0x2f, 0x70, 0xf8, 0xbd, 0x00, 0x30, 0x07, 0x00, + 0x04, 0x6c, 0x01, 0x00, 0x00, 0x40, 0x07, 0x00, + 0x04, 0x4a, 0x51, 0x80, 0x10, 0x71, 0x03, 0x48, + 0x03, 0x49, 0x08, 0x30, 0x48, 0x60, 0x01, 0x20, + 0x08, 0x60, 0x70, 0x47, 0x3c, 0x00, 0x78, 0x2d, + 0x00, 0x00, 0x3c, 0x6c, 0x01, 0x00, 0x00, 0x30, + 0x07, 0x00, 0x00, 0x21, 0x00, 0x23, 0x05, 0xe0, + 0x02, 0x89, 0x43, 0x60, 0xc0, 0x68, 0x51, 0x18, + 0x09, 0x04, 0x09, 0x0c, 0x00, 0x28, 0xf7, 0xd1, + 0x04, 0x31, 0x08, 0x04, 0x00, 0x0c, 0x70, 0x47, + 0x00, 0x00, 0x02, 0x4a, 0x51, 0x6b, 0x08, 0x43, + 0x50, 0x63, 0x70, 0x47, 0x00, 0x00, 0x04, 0x6c, + 0x01, 0x00, 0x38, 0xb5, 0x0a, 0x4c, 0x3c, 0x00, + 0xb4, 0x2d, 0x00, 0x00, 0x22, 0x1c, 0x20, 0x32, + 0x95, 0x79, 0x00, 0xab, 0x1d, 0x70, 0xd2, 0x79, + 0x5a, 0x70, 0x03, 0x68, 0x40, 0x68, 0x06, 0x4a, + 0x50, 0x65, 0x05, 0x48, 0x13, 0x65, 0x50, 0x30, + 0x81, 0x60, 0x00, 0xab, 0x18, 0x88, 0xe0, 0x84, + 0x38, 0xbd, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, + 0x04, 0x6c, 0x01, 0x00, 0x98, 0xb5, 0x0d, 0x4c, + 0x20, 0x1c, 0x20, 0x30, 0x81, 0x79, 0x00, 0xab, + 0x3c, 0x00, 0xf0, 0x2d, 0x00, 0x00, 0x19, 0x70, + 0xc0, 0x79, 0x58, 0x70, 0x0a, 0x48, 0x00, 0xf0, + 0xec, 0xf8, 0x09, 0x49, 0x00, 0x20, 0x48, 0x62, + 0xff, 0xf7, 0x69, 0xff, 0x00, 0x28, 0x03, 0xd0, + 0x12, 0x21, 0x84, 0x20, 0xfe, 0xf7, 0x49, 0xfa, + 0x00, 0xab, 0x18, 0x88, 0xe0, 0x84, 0x98, 0xbd, + 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x00, 0x30, + 0x07, 0x00, 0x04, 0x6c, 0x01, 0x00, 0x03, 0x48, + 0x01, 0x7a, 0x3c, 0x00, 0x2c, 0x2e, 0x00, 0x00, + 0xfe, 0x22, 0x91, 0x43, 0x0a, 0x31, 0x01, 0x72, + 0x70, 0x47, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, + 0x90, 0xb5, 0x0e, 0x4c, 0x85, 0xb0, 0xa0, 0x78, + 0x02, 0x28, 0x14, 0xd1, 0x03, 0x20, 0xa0, 0x70, + 0x0b, 0x49, 0x00, 0x20, 0x00, 0x22, 0x04, 0x92, + 0x02, 0x90, 0x03, 0x91, 0xe1, 0x88, 0x01, 0x22, + 0x01, 0x92, 0x00, 0x91, 0x61, 0x78, 0x20, 0x78, + 0x22, 0x69, 0xe3, 0x68, 0x3c, 0x00, 0x68, 0x2e, + 0x00, 0x00, 0x08, 0xf0, 0x94, 0xfd, 0x04, 0x48, + 0x09, 0xf0, 0x7f, 0xf9, 0x05, 0xb0, 0x90, 0xbd, + 0x00, 0x00, 0xb4, 0x79, 0x01, 0x00, 0xad, 0xb6, + 0x00, 0x00, 0x71, 0xb6, 0x00, 0x00, 0xb0, 0xb5, + 0x0c, 0x4d, 0xac, 0x79, 0x0c, 0x49, 0x09, 0x78, + 0x00, 0x29, 0x03, 0xd0, 0x01, 0x29, 0x0e, 0xd0, + 0x02, 0x29, 0x08, 0xd1, 0xc2, 0x88, 0x00, 0x2a, + 0x09, 0xd0, 0x01, 0x23, 0x81, 0x68, 0x3c, 0x00, + 0xa4, 0x2e, 0x00, 0x00, 0x02, 0x20, 0x0f, 0xf0, + 0xc1, 0xf8, 0x03, 0xe0, 0x02, 0x21, 0x86, 0x20, + 0xfe, 0xf7, 0xf8, 0xf9, 0xac, 0x71, 0xb0, 0xbd, + 0x20, 0x10, 0x07, 0x00, 0xa0, 0x79, 0x01, 0x00, + 0x80, 0xb5, 0x02, 0x68, 0x07, 0x49, 0x4a, 0x60, + 0x03, 0x79, 0xca, 0x78, 0xcb, 0x70, 0x00, 0x79, + 0x90, 0x42, 0x06, 0xd0, 0x03, 0x48, 0x14, 0x30, + 0x00, 0x89, 0x07, 0xf0, 0x27, 0xfe, 0x06, 0xf0, + 0x3c, 0x00, 0xe0, 0x2e, 0x00, 0x00, 0xab, 0xfa, + 0x80, 0xbd, 0x84, 0x66, 0x01, 0x00, 0x70, 0xb5, + 0x16, 0x4c, 0x15, 0x4d, 0xa0, 0x78, 0x00, 0x26, + 0x98, 0x3d, 0x01, 0x28, 0x03, 0xd1, 0x28, 0x69, + 0x08, 0xf0, 0xfb, 0xfc, 0xa6, 0x70, 0x60, 0x68, + 0x01, 0x28, 0x03, 0xd0, 0x00, 0x21, 0x28, 0x69, + 0x00, 0xf0, 0xff, 0xfb, 0x0e, 0x48, 0x29, 0x69, + 0x0c, 0xf0, 0x31, 0xfa, 0x01, 0x20, 0x0c, 0xf0, + 0xe4, 0xf8, 0x3c, 0x00, 0x1c, 0x2f, 0x00, 0x00, + 0xe0, 0x78, 0x01, 0x28, 0x02, 0xd0, 0x01, 0x20, + 0x60, 0x70, 0x00, 0xe0, 0x66, 0x70, 0x06, 0x48, + 0x14, 0x30, 0x41, 0x68, 0x01, 0x29, 0x06, 0xd1, + 0x06, 0x60, 0x41, 0x6f, 0x00, 0x29, 0x02, 0xd0, + 0x00, 0x20, 0xfd, 0xf7, 0x4c, 0xfa, 0x70, 0xbd, + 0x84, 0x66, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, + 0x30, 0xb5, 0x00, 0x22, 0x00, 0x23, 0x01, 0x25, + 0x2c, 0x1c, 0x94, 0x40, 0x3c, 0x00, 0x58, 0x2f, + 0x00, 0x00, 0x04, 0x40, 0x01, 0xd0, 0xca, 0x54, + 0x01, 0x33, 0x01, 0x32, 0x0e, 0x2a, 0xf6, 0xdb, + 0x18, 0x1c, 0x30, 0xbd, 0x00, 0x00, 0xff, 0xb5, + 0x01, 0x27, 0x00, 0x26, 0x05, 0x1c, 0x02, 0x20, + 0x81, 0xb0, 0x00, 0x90, 0x00, 0x2d, 0x18, 0xd0, + 0x28, 0x78, 0xff, 0x28, 0x15, 0xd0, 0x00, 0x24, + 0x10, 0xe0, 0x28, 0x19, 0x80, 0x78, 0x0a, 0x99, + 0x00, 0x29, 0x01, 0xd0, 0x01, 0x06, 0x3c, 0x00, + 0x94, 0x2f, 0x00, 0x00, 0x08, 0xd5, 0x07, 0xf0, + 0xe9, 0xfe, 0x0e, 0x28, 0x03, 0xd0, 0x01, 0x21, + 0x81, 0x40, 0x0e, 0x43, 0x00, 0xe0, 0x00, 0x27, + 0x01, 0x34, 0x68, 0x78, 0xa0, 0x42, 0xeb, 0xdc, + 0x00, 0x98, 0x02, 0x9d, 0x01, 0x38, 0x00, 0x90, + 0xdf, 0xd1, 0x03, 0x98, 0x31, 0x1c, 0x81, 0x43, + 0x02, 0xd0, 0x03, 0x98, 0x06, 0x40, 0x00, 0x27, + 0x04, 0x98, 0x06, 0x60, 0x05, 0xb0, 0x38, 0x1c, + 0x3c, 0x00, 0xd0, 0x2f, 0x00, 0x00, 0xf0, 0xbd, + 0x00, 0x00, 0x02, 0x21, 0x01, 0x60, 0x64, 0x21, + 0x01, 0xe0, 0x01, 0x39, 0x02, 0xd0, 0x02, 0x68, + 0x92, 0x07, 0xfa, 0xd4, 0x01, 0x20, 0x00, 0x29, + 0x00, 0xd1, 0x00, 0x20, 0x70, 0x47, 0x10, 0xb5, + 0x00, 0x20, 0xc4, 0x43, 0x05, 0x4b, 0x02, 0x22, + 0x01, 0x01, 0x5a, 0x50, 0xc9, 0x18, 0x8c, 0x60, + 0x01, 0x30, 0x08, 0x28, 0xf8, 0xdb, 0x10, 0xbd, + 0x00, 0x00, 0x3c, 0x00, 0x0c, 0x30, 0x00, 0x00, + 0x00, 0x30, 0x07, 0x00, 0xf0, 0xb5, 0x05, 0x1c, + 0x60, 0x35, 0xc7, 0x6a, 0x04, 0x1c, 0x28, 0x7b, + 0x00, 0x2f, 0x8b, 0xb0, 0x15, 0xd0, 0x08, 0x28, + 0x15, 0xd2, 0x02, 0xa3, 0x1b, 0x5c, 0x5b, 0x00, + 0x9f, 0x44, 0x00, 0x00, 0x07, 0x04, 0x04, 0x07, + 0x09, 0x09, 0x0c, 0x0c, 0x01, 0x26, 0x00, 0x21, + 0x09, 0xe0, 0x00, 0x26, 0x06, 0xe0, 0x02, 0x26, + 0x02, 0x21, 0x04, 0xe0, 0x3c, 0x00, 0x48, 0x30, + 0x00, 0x00, 0x03, 0x26, 0x03, 0x21, 0x01, 0xe0, + 0x04, 0x26, 0x01, 0x21, 0x8c, 0x22, 0x12, 0x59, + 0x07, 0x91, 0x26, 0x49, 0x06, 0x90, 0x04, 0x91, + 0x00, 0x20, 0x03, 0x90, 0x05, 0x97, 0x08, 0x92, + 0xe0, 0x69, 0x22, 0x69, 0x21, 0x1c, 0x70, 0x31, + 0x01, 0x91, 0x21, 0x49, 0x00, 0x90, 0x70, 0x00, + 0x40, 0x18, 0x60, 0x30, 0x02, 0x92, 0x03, 0x88, + 0x59, 0x1c, 0x01, 0x80, 0x1e, 0x48, 0x3c, 0x00, + 0x84, 0x30, 0x00, 0x00, 0x02, 0x88, 0xa1, 0x68, + 0x0a, 0xa8, 0x09, 0xf0, 0xe1, 0xff, 0x60, 0x60, + 0xe8, 0x7a, 0xa1, 0x6a, 0xc9, 0x07, 0x00, 0x07, + 0x00, 0x0e, 0xc9, 0x0d, 0x08, 0x43, 0x61, 0x6a, + 0x22, 0x69, 0xc9, 0x07, 0x89, 0x0d, 0x01, 0x43, + 0x01, 0x20, 0x00, 0x2a, 0x00, 0xd1, 0x00, 0x20, + 0x80, 0x03, 0x08, 0x43, 0x21, 0x6a, 0xc9, 0x03, + 0x08, 0x43, 0x08, 0x21, 0x08, 0x43, 0x0a, 0x99, + 0x3c, 0x00, 0xc0, 0x30, 0x00, 0x00, 0x08, 0x80, + 0x20, 0x1c, 0xfe, 0xf7, 0x98, 0xfe, 0x20, 0x69, + 0x00, 0x28, 0x04, 0xd1, 0x20, 0x1c, 0x0a, 0xf0, + 0x82, 0xf9, 0x0b, 0xb0, 0xf0, 0xbd, 0x80, 0x79, + 0x06, 0x28, 0x01, 0xd9, 0xfe, 0xf7, 0x0f, 0xf9, + 0x20, 0x69, 0x06, 0x49, 0x80, 0x79, 0x80, 0x00, + 0x09, 0x58, 0x20, 0x1c, 0xfd, 0xf7, 0x74, 0xf9, + 0xef, 0xe7, 0x79, 0x2f, 0x01, 0x00, 0xc4, 0x69, + 0x01, 0x00, 0x3c, 0x00, 0xfc, 0x30, 0x00, 0x00, + 0x08, 0x61, 0x01, 0x00, 0x74, 0x57, 0x01, 0x00, + 0x10, 0xb5, 0x04, 0x1c, 0x58, 0x30, 0x8a, 0xb0, + 0x0e, 0xf0, 0x7c, 0xfe, 0x22, 0x1c, 0x80, 0x32, + 0x51, 0x68, 0x00, 0x29, 0x01, 0xd0, 0x11, 0x7a, + 0x07, 0xe0, 0x00, 0x28, 0x04, 0xd0, 0x80, 0x69, + 0x80, 0x07, 0x01, 0xd5, 0x03, 0x21, 0x00, 0xe0, + 0x01, 0x21, 0xd2, 0x68, 0x07, 0x91, 0x22, 0x49, + 0x00, 0x20, 0x08, 0x92, 0x3c, 0x00, 0x38, 0x31, + 0x00, 0x00, 0x04, 0x91, 0x00, 0x22, 0x05, 0x92, + 0x06, 0x90, 0x03, 0x90, 0xe0, 0x69, 0x22, 0x69, + 0x00, 0x90, 0x21, 0x1c, 0x70, 0x31, 0x1c, 0x48, + 0x01, 0x91, 0x02, 0x92, 0x03, 0x89, 0x59, 0x1c, + 0x01, 0x81, 0x1a, 0x48, 0x02, 0x88, 0xa1, 0x68, + 0x09, 0xa8, 0x09, 0xf0, 0x76, 0xff, 0x60, 0x60, + 0x6b, 0x20, 0x00, 0x5d, 0xa1, 0x6a, 0x22, 0x69, + 0xc9, 0x07, 0x00, 0x07, 0x00, 0x0e, 0x3c, 0x00, + 0x74, 0x31, 0x00, 0x00, 0xc9, 0x0d, 0x01, 0x43, + 0x01, 0x20, 0x00, 0x2a, 0x00, 0xd1, 0x00, 0x20, + 0x80, 0x03, 0x08, 0x43, 0x09, 0x99, 0x08, 0x80, + 0x20, 0x1c, 0xfe, 0xf7, 0x35, 0xfe, 0x20, 0x69, + 0x00, 0x28, 0x04, 0xd1, 0x20, 0x1c, 0x0a, 0xf0, + 0x1f, 0xf9, 0x0a, 0xb0, 0x10, 0xbd, 0x80, 0x79, + 0x06, 0x28, 0x01, 0xd9, 0xfe, 0xf7, 0xac, 0xf8, + 0x20, 0x69, 0x07, 0x49, 0x80, 0x79, 0x80, 0x00, + 0x3c, 0x00, 0xb0, 0x31, 0x00, 0x00, 0x09, 0x58, + 0x20, 0x1c, 0xfd, 0xf7, 0x11, 0xf9, 0xef, 0xe7, + 0x00, 0x00, 0xbd, 0x2f, 0x01, 0x00, 0x24, 0x6a, + 0x01, 0x00, 0x08, 0x61, 0x01, 0x00, 0x74, 0x57, + 0x01, 0x00, 0x3e, 0xb5, 0x05, 0x1c, 0x00, 0x69, + 0x04, 0x21, 0x07, 0xf0, 0xd2, 0xfa, 0x00, 0x28, + 0x09, 0xd0, 0x42, 0x78, 0x02, 0x32, 0x01, 0x1c, + 0x68, 0x46, 0xfd, 0xf7, 0x88, 0xf9, 0xe8, 0x6a, + 0x6c, 0x46, 0x3c, 0x00, 0xec, 0x31, 0x00, 0x00, + 0x02, 0x90, 0x00, 0xe0, 0x00, 0x24, 0x28, 0x1c, + 0x14, 0x30, 0x02, 0xf0, 0x03, 0xfb, 0x00, 0x28, + 0x04, 0xd0, 0x21, 0x1c, 0x28, 0x1c, 0x05, 0xf0, + 0xa5, 0xfe, 0x3e, 0xbd, 0x00, 0x2c, 0xfc, 0xd0, + 0x02, 0x49, 0x20, 0x1c, 0x49, 0x69, 0xfd, 0xf7, + 0xe2, 0xf8, 0xf6, 0xe7, 0x44, 0x7d, 0x01, 0x00, + 0x70, 0xb5, 0x1e, 0x1c, 0x18, 0x23, 0x58, 0x43, + 0x06, 0x4b, 0x04, 0x9d, 0x3c, 0x00, 0x28, 0x32, + 0x00, 0x00, 0x19, 0x50, 0xc4, 0x18, 0x00, 0x20, + 0x60, 0x61, 0x62, 0x60, 0xa6, 0x60, 0xe5, 0x60, + 0x0f, 0xf0, 0xb9, 0xfd, 0x20, 0x61, 0x70, 0xbd, + 0x00, 0x00, 0xb8, 0x7d, 0x01, 0x00, 0x02, 0x4a, + 0x01, 0x1c, 0x90, 0x69, 0x91, 0x61, 0x70, 0x47, + 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x01, 0x48, + 0x40, 0x6b, 0x70, 0x47, 0x00, 0x00, 0x44, 0x7d, + 0x01, 0x00, 0x04, 0x49, 0x04, 0x4b, 0x3c, 0x00, + 0x64, 0x32, 0x00, 0x00, 0xca, 0x68, 0x09, 0x69, + 0x5c, 0x3b, 0x5b, 0x68, 0xc9, 0x1a, 0x41, 0x43, + 0x50, 0x18, 0x70, 0x47, 0xa0, 0x7d, 0x01, 0x00, + 0x01, 0x48, 0x00, 0x78, 0x70, 0x47, 0x00, 0x00, + 0x78, 0x69, 0x01, 0x00, 0x80, 0xb5, 0x06, 0x22, + 0x01, 0x49, 0xfd, 0xf7, 0x35, 0xf9, 0x80, 0xbd, + 0xfe, 0x67, 0x01, 0x00, 0xf0, 0xb5, 0x89, 0xb0, + 0x00, 0x93, 0x16, 0x4f, 0x13, 0x1c, 0x0e, 0x1c, + 0x3c, 0x00, 0xa0, 0x32, 0x00, 0x00, 0x04, 0x1c, + 0x3a, 0x1c, 0x01, 0xf0, 0x62, 0xff, 0x01, 0xa9, + 0x06, 0xa8, 0xa2, 0x68, 0x02, 0xf0, 0x0b, 0xf9, + 0x01, 0xaa, 0x06, 0xa9, 0x38, 0x1c, 0x63, 0x6a, + 0x02, 0xf0, 0x81, 0xfc, 0x05, 0x1c, 0x01, 0x28, + 0x14, 0xd1, 0x0c, 0x48, 0xfc, 0x21, 0xc8, 0x51, + 0x38, 0x1c, 0x02, 0xf0, 0x0c, 0xf8, 0x03, 0x21, + 0x30, 0x1c, 0x07, 0xf0, 0x52, 0xfa, 0x00, 0x28, + 0x07, 0xd0, 0x3c, 0x00, 0xdc, 0x32, 0x00, 0x00, + 0x80, 0x78, 0x00, 0xf0, 0x33, 0xfc, 0x20, 0x1c, + 0x10, 0x30, 0x0e, 0xf0, 0x47, 0xfd, 0x00, 0xe0, + 0x00, 0x25, 0x28, 0x1c, 0x09, 0xb0, 0xf0, 0xbd, + 0xf4, 0x67, 0x01, 0x00, 0xc1, 0x38, 0x00, 0x00, + 0x10, 0xb5, 0x07, 0x4c, 0x06, 0x48, 0x06, 0x22, + 0x21, 0x1d, 0x08, 0x38, 0xfd, 0xf7, 0xf6, 0xf8, + 0x01, 0xf0, 0xfc, 0xff, 0x00, 0xf0, 0x42, 0xfc, + 0x20, 0x1c, 0x02, 0xf0, 0x3c, 0x00, 0x18, 0x33, + 0x00, 0x00, 0x27, 0xfc, 0x10, 0xbd, 0xf4, 0x67, + 0x01, 0x00, 0x08, 0x49, 0xc9, 0x68, 0x00, 0x29, + 0x0a, 0xd0, 0x06, 0x4a, 0x01, 0x32, 0x51, 0x78, + 0x12, 0x78, 0x48, 0x43, 0x00, 0x2a, 0x01, 0xd1, + 0x08, 0x18, 0x70, 0x47, 0x10, 0x18, 0x70, 0x47, + 0x01, 0x30, 0x70, 0x47, 0x00, 0x00, 0x44, 0x7d, + 0x01, 0x00, 0x04, 0x4b, 0x05, 0x49, 0x00, 0x28, + 0x5a, 0x69, 0x00, 0xd0, 0x01, 0x1c, 0x3c, 0x00, + 0x54, 0x33, 0x00, 0x00, 0x10, 0x1c, 0x59, 0x61, + 0x70, 0x47, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, + 0xb9, 0x75, 0x00, 0x00, 0x07, 0x49, 0x00, 0x20, + 0x0a, 0x78, 0x02, 0x2a, 0x09, 0xd1, 0x0a, 0x7c, + 0x00, 0x2a, 0x05, 0xd1, 0xca, 0x68, 0x00, 0x2a, + 0x03, 0xd0, 0x49, 0x69, 0x00, 0x29, 0x00, 0xd0, + 0x01, 0x20, 0x70, 0x47, 0x78, 0x69, 0x01, 0x00, + 0x0c, 0x4a, 0x80, 0xb5, 0x01, 0x21, 0x51, 0x60, + 0x3c, 0x00, 0x90, 0x33, 0x00, 0x00, 0x09, 0xf0, + 0x6a, 0xf8, 0x09, 0x48, 0x1c, 0x30, 0x81, 0x69, + 0x00, 0x29, 0x07, 0xd0, 0x00, 0x23, 0x83, 0x61, + 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, 0x00, 0xf0, + 0xd2, 0xf8, 0x80, 0xbd, 0x00, 0x22, 0x00, 0x21, + 0x03, 0x48, 0x00, 0xf0, 0x5c, 0xf9, 0x80, 0xbd, + 0x00, 0x00, 0x5c, 0x69, 0x01, 0x00, 0x51, 0x35, + 0x00, 0x00, 0xb0, 0xb5, 0x0c, 0x1c, 0x01, 0x28, + 0x16, 0xd1, 0x3c, 0x00, 0xcc, 0x33, 0x00, 0x00, + 0x0e, 0x4d, 0x02, 0x2c, 0x09, 0xd1, 0x00, 0xf0, + 0x2b, 0xfa, 0x00, 0x28, 0x0e, 0xd0, 0x68, 0x69, + 0x00, 0x28, 0x0b, 0xd1, 0x21, 0x1c, 0x13, 0x20, + 0x0c, 0xe0, 0x03, 0x2c, 0xfa, 0xd1, 0x00, 0xf0, + 0xf9, 0xf9, 0x00, 0x28, 0x02, 0xd0, 0x28, 0x7c, + 0x00, 0x28, 0xf3, 0xd0, 0xb0, 0xbd, 0x21, 0x1c, + 0x00, 0x06, 0x00, 0x0e, 0x04, 0xf0, 0x62, 0xfc, + 0xb0, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x08, 0x34, + 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0xb0, 0xb5, + 0x0c, 0x4c, 0x00, 0x25, 0x25, 0x74, 0x65, 0x61, + 0xe5, 0x60, 0x00, 0xf0, 0x3c, 0xfa, 0x00, 0xf0, + 0x34, 0xfa, 0x07, 0x48, 0x1c, 0x38, 0x05, 0x61, + 0x09, 0xf0, 0x33, 0xff, 0x20, 0x78, 0x00, 0x28, + 0x02, 0xd1, 0x04, 0xf0, 0x6e, 0xfa, 0xb0, 0xbd, + 0x02, 0x28, 0xfc, 0xd1, 0x04, 0xf0, 0xa5, 0xfb, + 0xb0, 0xbd, 0x78, 0x69, 0x01, 0x00, 0x3c, 0x00, + 0x44, 0x34, 0x00, 0x00, 0x0c, 0x48, 0x80, 0xb5, + 0x01, 0x78, 0x00, 0x29, 0x12, 0xd0, 0xc0, 0x68, + 0x00, 0x28, 0x0f, 0xd1, 0x08, 0x48, 0x1c, 0x38, + 0x40, 0x69, 0x00, 0x28, 0x0a, 0xd1, 0x07, 0x48, + 0x00, 0x68, 0x00, 0x28, 0x06, 0xd0, 0x00, 0x22, + 0x07, 0x21, 0x10, 0x20, 0x10, 0xf0, 0xa0, 0xf9, + 0x02, 0xf0, 0x2c, 0xfc, 0x80, 0xbd, 0x00, 0x00, + 0x78, 0x69, 0x01, 0x00, 0xd4, 0x67, 0x01, 0x00, + 0x3c, 0x00, 0x80, 0x34, 0x00, 0x00, 0xf8, 0xb5, + 0x1d, 0x4e, 0x1c, 0x4d, 0x04, 0x1c, 0xf0, 0x68, + 0x02, 0x27, 0x1c, 0x3d, 0x00, 0x28, 0x07, 0xd0, + 0xe8, 0x68, 0x00, 0x28, 0x04, 0xd0, 0xfd, 0xf7, + 0xc2, 0xfe, 0x00, 0x28, 0x00, 0xd0, 0xbc, 0x43, + 0x00, 0x2c, 0x14, 0xd0, 0x37, 0x70, 0xf0, 0x68, + 0x14, 0x4f, 0x00, 0x28, 0x10, 0xd0, 0xe0, 0x07, + 0x17, 0xd4, 0xfd, 0xf7, 0xb4, 0xfe, 0x00, 0x28, + 0x13, 0xd0, 0x3c, 0x00, 0xbc, 0x34, 0x00, 0x00, + 0x70, 0x69, 0x00, 0x28, 0x06, 0xd1, 0xe8, 0x68, + 0x00, 0x28, 0x01, 0xd0, 0xfd, 0xf7, 0x1a, 0xff, + 0x0d, 0xf0, 0x0a, 0xfa, 0xf8, 0xbd, 0x68, 0x69, + 0x00, 0x28, 0x05, 0xd1, 0x09, 0x48, 0x00, 0x68, + 0x00, 0x28, 0x01, 0xd0, 0x01, 0x2c, 0x04, 0xd1, + 0x39, 0x1c, 0x20, 0x1c, 0x0e, 0xf0, 0x52, 0xfd, + 0xf0, 0xe7, 0x04, 0xf0, 0x1d, 0xfb, 0x02, 0xf0, + 0xeb, 0xfb, 0xeb, 0xe7, 0x3c, 0x00, 0xf8, 0x34, + 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x50, 0xc3, + 0x00, 0x00, 0xd4, 0x67, 0x01, 0x00, 0x05, 0x48, + 0x41, 0x69, 0x00, 0x29, 0x04, 0xd0, 0x40, 0x6a, + 0x00, 0x28, 0x01, 0xd0, 0x01, 0x20, 0x70, 0x47, + 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x78, 0x69, + 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x06, 0x49, + 0x00, 0x20, 0x48, 0x60, 0x08, 0x60, 0x88, 0x60, + 0x08, 0xf0, 0x9b, 0xff, 0x07, 0x21, 0x3c, 0x00, + 0x34, 0x35, 0x00, 0x00, 0x12, 0x20, 0x22, 0x79, + 0x10, 0xf0, 0x3a, 0xf9, 0x10, 0xbd, 0x00, 0x00, + 0x5c, 0x69, 0x01, 0x00, 0x01, 0x49, 0x01, 0x20, + 0x08, 0x60, 0x70, 0x47, 0xe8, 0x67, 0x01, 0x00, + 0xf8, 0xb5, 0x07, 0x1c, 0x0e, 0x1c, 0x08, 0xf0, + 0xa3, 0xfa, 0x13, 0x4d, 0x04, 0x1c, 0x68, 0x68, + 0x00, 0x28, 0x17, 0xd0, 0x00, 0x2f, 0x02, 0xd0, + 0xa8, 0x68, 0x03, 0x28, 0x13, 0xd3, 0x00, 0x20, + 0x3c, 0x00, 0x70, 0x35, 0x00, 0x00, 0xa8, 0x60, + 0x68, 0x60, 0x21, 0x1c, 0x0f, 0x20, 0x0e, 0xf0, + 0xf0, 0xfe, 0x28, 0x68, 0x00, 0x28, 0x03, 0xd0, + 0x00, 0x2c, 0x06, 0xd1, 0x01, 0x20, 0x02, 0xe0, + 0x01, 0x2c, 0x02, 0xd1, 0x00, 0x20, 0xff, 0xf7, + 0xfa, 0xfe, 0xf8, 0xbd, 0x72, 0x1c, 0x00, 0x21, + 0x04, 0x48, 0x00, 0xf0, 0x68, 0xf8, 0xa8, 0x68, + 0x01, 0x30, 0xa8, 0x60, 0xf5, 0xe7, 0x5c, 0x69, + 0x01, 0x00, 0x3c, 0x00, 0xac, 0x35, 0x00, 0x00, + 0x51, 0x35, 0x00, 0x00, 0x0a, 0x49, 0x80, 0xb5, + 0xca, 0x68, 0x00, 0x2a, 0x0b, 0xd0, 0x42, 0x68, + 0x00, 0x2a, 0x09, 0xd0, 0x00, 0x22, 0x4a, 0x62, + 0x02, 0x68, 0x0a, 0x62, 0x02, 0x68, 0x07, 0x21, + 0x17, 0x20, 0x10, 0xf0, 0xef, 0xf8, 0x80, 0xbd, + 0x01, 0x20, 0x48, 0x62, 0x80, 0xbd, 0x00, 0x00, + 0x78, 0x69, 0x01, 0x00, 0x70, 0xb5, 0x14, 0x4d, + 0x84, 0x6c, 0xe9, 0x68, 0x3c, 0x00, 0xe8, 0x35, + 0x00, 0x00, 0x00, 0x29, 0x17, 0xd0, 0x40, 0x30, + 0xec, 0x61, 0x40, 0x78, 0x00, 0x28, 0x01, 0xd1, + 0x01, 0x20, 0x68, 0x62, 0x28, 0x6a, 0x0e, 0x4e, + 0x00, 0x1b, 0xb0, 0x42, 0x0c, 0xd2, 0x08, 0xf0, + 0x3a, 0xfe, 0x29, 0x6a, 0x40, 0x1a, 0xb0, 0x42, + 0x03, 0xd2, 0x02, 0x22, 0x07, 0x21, 0x13, 0x20, + 0x09, 0xe0, 0x04, 0xf0, 0xb6, 0xfa, 0x70, 0xbd, + 0x07, 0x48, 0xa9, 0x68, 0x0b, 0xf0, 0x3c, 0x00, + 0x24, 0x36, 0x00, 0x00, 0xbd, 0xfe, 0x22, 0x1c, + 0x07, 0x21, 0x16, 0x20, 0x10, 0xf0, 0xc0, 0xf8, + 0x70, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, + 0xa0, 0x86, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, + 0x0a, 0x49, 0x80, 0xb5, 0x00, 0x20, 0x88, 0x61, + 0x08, 0x69, 0x00, 0x28, 0x0c, 0xd0, 0x07, 0x48, + 0x1c, 0x30, 0x00, 0x78, 0x00, 0x28, 0x07, 0xd0, + 0x01, 0xf0, 0xd2, 0xff, 0x02, 0x28, 0x03, 0xd1, + 0x3c, 0x00, 0x60, 0x36, 0x00, 0x00, 0x00, 0xf0, + 0x12, 0xf9, 0x00, 0xf0, 0xbc, 0xf8, 0x80, 0xbd, + 0x00, 0x00, 0x5c, 0x69, 0x01, 0x00, 0xf0, 0xb5, + 0x06, 0x1c, 0x0c, 0x1c, 0x15, 0x1c, 0x91, 0xb0, + 0x01, 0xa8, 0x40, 0x21, 0xfc, 0xf7, 0x0d, 0xff, + 0x00, 0x21, 0x68, 0x46, 0xfd, 0xf7, 0xa7, 0xff, + 0x04, 0x90, 0x01, 0xa8, 0x06, 0x22, 0x08, 0x49, + 0xfc, 0xf7, 0x31, 0xff, 0x06, 0x22, 0x02, 0xa8, + 0x02, 0x30, 0x3c, 0x00, 0x9c, 0x36, 0x00, 0x00, + 0x06, 0x49, 0xfc, 0xf7, 0x2b, 0xff, 0x00, 0xab, + 0xdc, 0x76, 0x0c, 0x95, 0x31, 0x1c, 0x01, 0xa8, + 0x07, 0xf0, 0x4e, 0xf8, 0x11, 0xb0, 0xf0, 0xbd, + 0x12, 0x61, 0x01, 0x00, 0xf8, 0x67, 0x01, 0x00, + 0x03, 0x1c, 0x08, 0x1c, 0x19, 0x1c, 0x11, 0x4b, + 0x80, 0xb5, 0x06, 0xd0, 0x04, 0x21, 0x11, 0x80, + 0x04, 0x22, 0x19, 0x1c, 0xfc, 0xf7, 0x12, 0xff, + 0x16, 0xe0, 0x04, 0x22, 0x3c, 0x00, 0xd8, 0x36, + 0x00, 0x00, 0x01, 0x1c, 0x18, 0x1c, 0xfc, 0xf7, + 0x0c, 0xff, 0x09, 0x48, 0x10, 0x38, 0x00, 0x69, + 0x00, 0x28, 0x0c, 0xd0, 0x07, 0x48, 0x0c, 0x30, + 0x00, 0x78, 0x00, 0x28, 0x07, 0xd0, 0x01, 0xf0, + 0x84, 0xff, 0x02, 0x28, 0x03, 0xd1, 0x00, 0xf0, + 0xc4, 0xf8, 0x00, 0xf0, 0x6e, 0xf8, 0x01, 0x20, + 0x80, 0xbd, 0x6c, 0x69, 0x01, 0x00, 0xf8, 0xb5, + 0x04, 0x1c, 0x0f, 0x1c, 0x00, 0x25, 0x3c, 0x00, + 0x14, 0x37, 0x00, 0x00, 0x00, 0x26, 0x01, 0xf0, + 0x73, 0xff, 0x02, 0x28, 0x2f, 0xd1, 0x19, 0x49, + 0x01, 0x2f, 0x08, 0x68, 0x07, 0xd1, 0x02, 0x1c, + 0x22, 0x40, 0x0a, 0xd1, 0x20, 0x43, 0x08, 0x60, + 0xa0, 0x42, 0x06, 0xd1, 0x04, 0xe0, 0x00, 0x28, + 0x03, 0xd0, 0xa0, 0x43, 0x08, 0x60, 0x00, 0xd1, + 0x01, 0x25, 0x48, 0x68, 0x00, 0x28, 0x1a, 0xd1, + 0x00, 0x2d, 0x17, 0xd0, 0x01, 0x20, 0x48, 0x60, + 0x3c, 0x00, 0x50, 0x37, 0x00, 0x00, 0x38, 0x1c, + 0x08, 0xf0, 0x89, 0xfe, 0x0b, 0x48, 0x1c, 0x30, + 0x81, 0x69, 0x00, 0x29, 0x07, 0xd0, 0x00, 0x23, + 0x83, 0x61, 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, + 0xff, 0xf7, 0xf1, 0xfe, 0x06, 0xe0, 0x00, 0x22, + 0x00, 0x21, 0x04, 0x48, 0xff, 0xf7, 0x7b, 0xff, + 0x00, 0xe0, 0x01, 0x26, 0x30, 0x1c, 0xf8, 0xbd, + 0x00, 0x00, 0x5c, 0x69, 0x01, 0x00, 0x51, 0x35, + 0x00, 0x00, 0x3c, 0x00, 0x8c, 0x37, 0x00, 0x00, + 0x03, 0x1c, 0x08, 0x1c, 0x19, 0x1c, 0x12, 0x4b, + 0x80, 0xb5, 0x06, 0xd0, 0x04, 0x21, 0x11, 0x80, + 0x04, 0x22, 0x19, 0x1c, 0xfc, 0xf7, 0xaa, 0xfe, + 0x18, 0xe0, 0x04, 0x22, 0x01, 0x1c, 0x18, 0x1c, + 0xfc, 0xf7, 0xa4, 0xfe, 0x0a, 0x48, 0x10, 0x30, + 0xc1, 0x68, 0x00, 0x29, 0x0e, 0xd0, 0x00, 0x78, + 0x00, 0x28, 0x0b, 0xd0, 0x01, 0xf0, 0x1e, 0xff, + 0x02, 0x28, 0x07, 0xd1, 0x3c, 0x00, 0xc8, 0x37, + 0x00, 0x00, 0x00, 0xf0, 0x64, 0xf8, 0x00, 0xf0, + 0x2e, 0xf8, 0x00, 0x28, 0x01, 0xd1, 0x09, 0xf0, + 0x7a, 0xfd, 0x01, 0x20, 0x80, 0xbd, 0x68, 0x69, + 0x01, 0x00, 0x10, 0xb5, 0x0a, 0x4c, 0x20, 0x69, + 0x00, 0x28, 0x09, 0xd0, 0xa1, 0x69, 0x00, 0x29, + 0x06, 0xd1, 0x7d, 0x21, 0xc9, 0x00, 0x41, 0x43, + 0x03, 0x22, 0x07, 0x20, 0x0f, 0xf0, 0xe1, 0xfe, + 0x21, 0x69, 0x01, 0x20, 0x00, 0x29, 0x3c, 0x00, + 0x04, 0x38, 0x00, 0x00, 0x00, 0xd1, 0x00, 0x20, + 0x10, 0xbd, 0x00, 0x00, 0x5c, 0x69, 0x01, 0x00, + 0x10, 0xb5, 0x05, 0x4c, 0x00, 0x28, 0x03, 0xd0, + 0xfd, 0xf7, 0x9a, 0xfc, 0xe0, 0x60, 0x10, 0xbd, + 0x01, 0x20, 0x00, 0x21, 0xe1, 0x60, 0x10, 0xbd, + 0x78, 0x69, 0x01, 0x00, 0x0a, 0x48, 0x0a, 0x49, + 0x10, 0xb5, 0xc0, 0x68, 0x1c, 0x39, 0xc9, 0x68, + 0x00, 0x28, 0x03, 0xd0, 0x00, 0x29, 0x01, 0xd0, + 0x3c, 0x00, 0x40, 0x38, 0x00, 0x00, 0x01, 0x24, + 0x00, 0xe0, 0x00, 0x24, 0x00, 0x2c, 0x03, 0xd0, + 0x02, 0x22, 0x07, 0x20, 0x0f, 0xf0, 0xb7, 0xfe, + 0x20, 0x1c, 0x10, 0xbd, 0x00, 0x00, 0x78, 0x69, + 0x01, 0x00, 0x10, 0xb5, 0x09, 0x4c, 0x00, 0x20, + 0x21, 0x69, 0x00, 0x29, 0x0c, 0xd0, 0x06, 0x49, + 0x1c, 0x31, 0x09, 0x78, 0x00, 0x29, 0x07, 0xd0, + 0x00, 0xf0, 0x09, 0xf8, 0x01, 0x20, 0xa0, 0x61, + 0x20, 0x69, 0x3c, 0x00, 0x7c, 0x38, 0x00, 0x00, + 0x7d, 0x23, 0xdb, 0x00, 0x58, 0x43, 0x10, 0xbd, + 0x5c, 0x69, 0x01, 0x00, 0x80, 0xb5, 0x03, 0x21, + 0x07, 0x20, 0x0f, 0xf0, 0xd1, 0xfe, 0x80, 0xbd, + 0x80, 0xb5, 0x02, 0x21, 0x07, 0x20, 0x0f, 0xf0, + 0xcb, 0xfe, 0x80, 0xbd, 0x06, 0x48, 0x80, 0xb5, + 0x00, 0x78, 0x00, 0x28, 0x01, 0xd0, 0xfd, 0xf7, + 0x29, 0xfd, 0x00, 0x22, 0x07, 0x21, 0x11, 0x20, + 0x0f, 0xf0, 0x7c, 0xff, 0x3c, 0x00, 0xb8, 0x38, + 0x00, 0x00, 0x80, 0xbd, 0x00, 0x00, 0x78, 0x69, + 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x10, 0x1c, + 0x06, 0x4a, 0x51, 0x61, 0x00, 0xf0, 0xa3, 0xf8, + 0x10, 0x20, 0x00, 0x2c, 0x00, 0xd1, 0x11, 0x20, + 0x00, 0x22, 0x07, 0x21, 0x0f, 0xf0, 0x69, 0xff, + 0x10, 0xbd, 0x5c, 0x69, 0x01, 0x00, 0x01, 0x49, + 0x48, 0x62, 0x70, 0x47, 0x00, 0x00, 0x44, 0x7d, + 0x01, 0x00, 0x10, 0xb5, 0x09, 0x4c, 0x3c, 0x00, + 0xf4, 0x38, 0x00, 0x00, 0xe0, 0x69, 0x00, 0x28, + 0x0c, 0xd1, 0xe0, 0x62, 0x01, 0x20, 0xe0, 0x61, + 0x0b, 0xf0, 0x08, 0xfd, 0x0b, 0xf0, 0x74, 0xfe, + 0x01, 0x20, 0x00, 0xf0, 0xb5, 0xf8, 0x0f, 0xf0, + 0x4d, 0xfa, 0x60, 0x63, 0x10, 0xbd, 0x00, 0x00, + 0x44, 0x7d, 0x01, 0x00, 0x05, 0x49, 0x80, 0xb5, + 0x00, 0x20, 0xc8, 0x61, 0x88, 0x63, 0x00, 0xf0, + 0x89, 0xf8, 0x00, 0xf0, 0x01, 0xf9, 0x02, 0xf0, + 0x3c, 0x00, 0x30, 0x39, 0x00, 0x00, 0x91, 0xfb, + 0x80, 0xbd, 0x44, 0x7d, 0x01, 0x00, 0x10, 0xb5, + 0x01, 0x28, 0x38, 0xd1, 0x08, 0x06, 0x00, 0x0e, + 0x05, 0x28, 0x32, 0xd1, 0x1d, 0x4c, 0x20, 0x78, + 0x01, 0x28, 0x09, 0xd0, 0x02, 0x28, 0x1b, 0xd0, + 0x03, 0x28, 0x2a, 0xd1, 0x02, 0xf0, 0x7d, 0xfb, + 0x00, 0xf0, 0x6f, 0xf8, 0x01, 0x20, 0x10, 0xe0, + 0x17, 0x48, 0x21, 0x6b, 0x0b, 0xf0, 0x1b, 0xfd, + 0x0b, 0xf0, 0x3c, 0x00, 0x6c, 0x39, 0x00, 0x00, + 0x41, 0xfe, 0x15, 0x48, 0x00, 0x69, 0x03, 0x28, + 0x01, 0xd3, 0xc0, 0x07, 0x03, 0xd5, 0x01, 0x21, + 0x20, 0x6b, 0x07, 0xf0, 0x19, 0xff, 0x02, 0x20, + 0x00, 0xf0, 0x78, 0xf8, 0x10, 0xbd, 0x0f, 0x48, + 0x00, 0x68, 0x20, 0x64, 0x0a, 0x48, 0x5c, 0x30, + 0xc1, 0x68, 0x02, 0x69, 0x89, 0x18, 0xc1, 0x60, + 0x03, 0xf0, 0xcc, 0xfc, 0x03, 0x20, 0x00, 0xf0, + 0x69, 0xf8, 0x01, 0x20, 0x3c, 0x00, 0xa8, 0x39, + 0x00, 0x00, 0xe0, 0x62, 0x10, 0xbd, 0x09, 0x21, + 0x00, 0xe0, 0x08, 0x21, 0x09, 0x20, 0xfd, 0xf7, + 0x76, 0xfc, 0x10, 0xbd, 0x00, 0x00, 0x44, 0x7d, + 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0xf4, 0x68, + 0x01, 0x00, 0x78, 0x6e, 0x01, 0x00, 0xb0, 0xb5, + 0x0f, 0x4c, 0x20, 0x78, 0x65, 0x1e, 0x01, 0x28, + 0x0f, 0xd1, 0x00, 0x20, 0xff, 0xf7, 0xa1, 0xfc, + 0x0c, 0x49, 0x09, 0x88, 0x49, 0x08, 0x3c, 0x00, + 0xe4, 0x39, 0x00, 0x00, 0x40, 0x1a, 0x0f, 0xf0, + 0x19, 0xf9, 0x00, 0x28, 0x04, 0xd0, 0x28, 0x78, + 0x01, 0x28, 0x07, 0xd0, 0x02, 0x28, 0x05, 0xd0, + 0x20, 0x78, 0x00, 0x28, 0x04, 0xd1, 0x28, 0x78, + 0x03, 0x28, 0x01, 0xd1, 0x01, 0x20, 0xb0, 0xbd, + 0x00, 0x20, 0xb0, 0xbd, 0x45, 0x7d, 0x01, 0x00, + 0xf4, 0x67, 0x01, 0x00, 0x01, 0x49, 0xc8, 0x64, + 0x70, 0x47, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, + 0x3c, 0x00, 0x20, 0x3a, 0x00, 0x00, 0x04, 0x49, + 0x05, 0x4a, 0x89, 0x68, 0x12, 0x6d, 0x01, 0x20, + 0x91, 0x42, 0x00, 0xd3, 0x00, 0x20, 0x70, 0x47, + 0x00, 0x00, 0xf4, 0x68, 0x01, 0x00, 0x44, 0x7d, + 0x01, 0x00, 0x10, 0xb5, 0x06, 0x4c, 0x20, 0x6b, + 0x07, 0xf0, 0xf9, 0xfe, 0xa0, 0x6b, 0x00, 0x28, + 0x03, 0xd1, 0x03, 0x48, 0x21, 0x6b, 0x0b, 0xf0, + 0x92, 0xfc, 0x10, 0xbd, 0x00, 0x00, 0x44, 0x7d, + 0x01, 0x00, 0x3c, 0x00, 0x5c, 0x3a, 0x00, 0x00, + 0x34, 0x63, 0x01, 0x00, 0x04, 0x48, 0x00, 0x78, + 0x02, 0x28, 0x01, 0xd0, 0x03, 0x28, 0x01, 0xd1, + 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, + 0x44, 0x7d, 0x01, 0x00, 0xf8, 0xb5, 0x07, 0x1c, + 0xff, 0xf7, 0xd0, 0xff, 0x06, 0x1c, 0x01, 0x2f, + 0x26, 0x4d, 0x1f, 0xd0, 0x02, 0x2f, 0x45, 0xd0, + 0x03, 0x2f, 0x12, 0xd1, 0x24, 0x48, 0x25, 0x4b, + 0x00, 0x69, 0x6a, 0x69, 0x3c, 0x00, 0x98, 0x3a, + 0x00, 0x00, 0x41, 0x08, 0x5a, 0x43, 0x23, 0x4b, + 0xd4, 0x18, 0x8c, 0x42, 0x00, 0xd9, 0x0c, 0x1c, + 0x00, 0x2e, 0x05, 0xd0, 0x1e, 0x49, 0x5b, 0x39, + 0x09, 0x78, 0x00, 0x29, 0x00, 0xd1, 0x04, 0x1c, + 0x05, 0x22, 0x21, 0x1c, 0x09, 0x20, 0x0f, 0xf0, + 0x80, 0xfd, 0x18, 0x4a, 0x5c, 0x3a, 0x17, 0x70, + 0xf8, 0xbd, 0xff, 0xf7, 0xd6, 0xfb, 0x00, 0x28, + 0x02, 0xd0, 0x28, 0x69, 0x00, 0x28, 0x3c, 0x00, + 0xd4, 0x3a, 0x00, 0x00, 0x0e, 0xd0, 0x04, 0xf0, + 0xcf, 0xfb, 0x13, 0x4b, 0x69, 0x69, 0x11, 0x4a, + 0x59, 0x43, 0x5c, 0x3a, 0xd2, 0x6b, 0x89, 0x18, + 0x88, 0x42, 0x01, 0xd9, 0x44, 0x1a, 0x04, 0xe0, + 0x00, 0x24, 0x02, 0xe0, 0x04, 0xf0, 0xae, 0xfd, + 0x04, 0x1c, 0x00, 0x2e, 0xdb, 0xd0, 0x09, 0x48, + 0x5b, 0x38, 0x00, 0x78, 0x01, 0x28, 0xd6, 0xd1, + 0x08, 0x4b, 0x9c, 0x42, 0x02, 0xd9, 0x58, 0x42, + 0x3c, 0x00, 0x10, 0x3b, 0x00, 0x00, 0x24, 0x18, + 0xd0, 0xe7, 0x00, 0x24, 0xce, 0xe7, 0x04, 0xf0, + 0xae, 0xfb, 0xca, 0xe7, 0x00, 0x00, 0xf4, 0x68, + 0x01, 0x00, 0xa0, 0x7d, 0x01, 0x00, 0x98, 0x3a, + 0x00, 0x00, 0x88, 0x13, 0x00, 0x00, 0x80, 0xb5, + 0x05, 0x21, 0x09, 0x20, 0x0f, 0xf0, 0x7d, 0xfd, + 0x02, 0x49, 0x00, 0x20, 0x08, 0x70, 0x80, 0xbd, + 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x70, 0xb5, + 0x06, 0x1c, 0x3c, 0x00, 0x4c, 0x3b, 0x00, 0x00, + 0x0d, 0xf0, 0xbc, 0xfa, 0xff, 0xf7, 0xce, 0xfe, + 0x09, 0x4c, 0x0a, 0x48, 0x21, 0x6b, 0x0b, 0xf0, + 0x21, 0xfc, 0x01, 0x25, 0x01, 0x21, 0x30, 0x06, + 0x00, 0x0e, 0xa5, 0x63, 0x07, 0xf0, 0x3a, 0xfe, + 0x05, 0x48, 0x29, 0x02, 0x09, 0x58, 0x00, 0x29, + 0x00, 0xd1, 0x05, 0x61, 0x70, 0xbd, 0x00, 0x00, + 0x44, 0x7d, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, + 0xf4, 0x67, 0x01, 0x00, 0x3c, 0x00, 0x88, 0x3b, + 0x00, 0x00, 0x02, 0x4a, 0x11, 0x6c, 0x08, 0x43, + 0x10, 0x64, 0x70, 0x47, 0x00, 0x00, 0x44, 0x7d, + 0x01, 0x00, 0x80, 0xb5, 0xff, 0xf7, 0xbf, 0xfe, + 0x0b, 0xf0, 0xa1, 0xfb, 0x80, 0xbd, 0x02, 0x4a, + 0x01, 0x1c, 0x10, 0x69, 0x11, 0x61, 0x70, 0x47, + 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0xf3, 0xb5, + 0x06, 0x1c, 0x00, 0x20, 0x89, 0xb0, 0xf8, 0x4c, + 0x08, 0x90, 0xe2, 0x69, 0x08, 0x25, 0x3c, 0x00, + 0xc4, 0x3b, 0x00, 0x00, 0x00, 0x2a, 0x03, 0xd0, + 0x06, 0xa9, 0x07, 0xa8, 0xfc, 0xf7, 0x06, 0xfc, + 0x30, 0x1c, 0xf3, 0x4e, 0x00, 0x27, 0x20, 0x36, + 0x82, 0x28, 0x6f, 0xd0, 0x15, 0xdc, 0x01, 0x28, + 0x18, 0xd0, 0x80, 0x28, 0x6b, 0xd1, 0xee, 0x4d, + 0x80, 0x3d, 0xa8, 0x68, 0x01, 0x28, 0x67, 0xd1, + 0x68, 0x68, 0x0f, 0xf0, 0x1b, 0xf8, 0x00, 0x28, + 0x63, 0xd1, 0x01, 0x21, 0x01, 0x20, 0x0d, 0xf0, + 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x9d, 0xf8, + 0x08, 0xf0, 0xdb, 0xfd, 0x0b, 0xb0, 0xf0, 0xbd, + 0x83, 0x28, 0x6d, 0xd0, 0x84, 0x28, 0x55, 0xd1, + 0xe7, 0xe0, 0x0a, 0x98, 0x0a, 0x28, 0x04, 0xd2, + 0x03, 0xa3, 0x1b, 0x18, 0x1b, 0x5a, 0x5b, 0x00, + 0x9f, 0x44, 0xf6, 0xe0, 0x00, 0x00, 0xee, 0x00, + 0x0b, 0x00, 0xf7, 0x00, 0xf7, 0x00, 0xf7, 0x00, + 0xf7, 0x00, 0x2f, 0x00, 0x88, 0x00, 0x8b, 0x00, + 0xad, 0x00, 0x3c, 0x00, 0x3c, 0x3c, 0x00, 0x00, + 0x00, 0xf0, 0x56, 0xfe, 0x00, 0x28, 0x17, 0xd0, + 0xd6, 0x4a, 0x80, 0x3a, 0xd1, 0x6a, 0x06, 0x98, + 0x81, 0x42, 0x16, 0xd0, 0x06, 0x21, 0x00, 0x28, + 0x00, 0xd1, 0x07, 0x21, 0x0d, 0x06, 0x2d, 0x0e, + 0x00, 0x28, 0x0e, 0xd0, 0xcf, 0x4a, 0x01, 0x20, + 0x80, 0x3a, 0x50, 0x65, 0x0f, 0xf0, 0xa0, 0xf8, + 0xcc, 0x4a, 0x80, 0x3a, 0x50, 0x66, 0x04, 0xe0, + 0x00, 0x21, 0x16, 0x20, 0x3c, 0x00, 0x78, 0x3c, + 0x00, 0x00, 0x0f, 0xf0, 0xdc, 0xfc, 0x01, 0x25, + 0x02, 0x20, 0x05, 0x90, 0x2e, 0xe2, 0xc6, 0x48, + 0x80, 0x38, 0x40, 0x6d, 0x00, 0x28, 0x2e, 0xd0, + 0xc6, 0x49, 0x20, 0x69, 0xc4, 0x4d, 0x40, 0x18, + 0x0e, 0xf0, 0xc1, 0xff, 0x00, 0x28, 0x12, 0xd0, + 0x0f, 0xf0, 0x85, 0xf8, 0xc1, 0x49, 0x49, 0x42, + 0x40, 0x18, 0xbd, 0x49, 0x20, 0x61, 0x80, 0x39, + 0x48, 0x6e, 0x40, 0x19, 0x0e, 0xf0, 0x3c, 0x00, + 0xb4, 0x3c, 0x00, 0x00, 0xbb, 0xff, 0x00, 0x28, + 0x11, 0xd0, 0x0a, 0xe0, 0xf7, 0xe0, 0x17, 0xe2, + 0xb2, 0xe0, 0xb0, 0xe0, 0xb6, 0x49, 0x20, 0x69, + 0x80, 0x39, 0x49, 0x6e, 0x40, 0x1a, 0xa8, 0x42, + 0x05, 0xdb, 0xb3, 0x49, 0xb5, 0x4d, 0x80, 0x39, + 0x4f, 0x65, 0x03, 0xf0, 0x27, 0xfb, 0x06, 0x22, + 0x29, 0x1c, 0x16, 0x20, 0x0f, 0xf0, 0x72, 0xfc, + 0x47, 0xe0, 0x95, 0xe0, 0x00, 0xf0, 0xfe, 0xfd, + 0x3c, 0x00, 0xf0, 0x3c, 0x00, 0x00, 0x00, 0x28, + 0x42, 0xd1, 0xaa, 0x4d, 0xc4, 0x3d, 0xef, 0x60, + 0x08, 0xf0, 0x19, 0xfd, 0x03, 0xf0, 0x15, 0xfb, + 0xa8, 0x6a, 0x00, 0x28, 0x02, 0xd0, 0xff, 0xf7, + 0x4c, 0xff, 0xaf, 0x62, 0xa4, 0x48, 0x80, 0x38, + 0x00, 0x68, 0x00, 0x21, 0xff, 0xf7, 0xf9, 0xfc, + 0x08, 0xf0, 0x3f, 0xf9, 0x09, 0x21, 0x16, 0x20, + 0x0f, 0xf0, 0x87, 0xfc, 0x00, 0x22, 0x16, 0x21, + 0x83, 0x20, 0x3c, 0x00, 0x2c, 0x3d, 0x00, 0x00, + 0x0f, 0xf0, 0x40, 0xfd, 0xff, 0xf7, 0x86, 0xfc, + 0x21, 0xe0, 0x00, 0xf0, 0x1b, 0xfe, 0x1e, 0xe0, + 0x06, 0xf0, 0x54, 0xfa, 0x97, 0x4d, 0x80, 0x3d, + 0xa9, 0x6f, 0x40, 0x1a, 0x04, 0x90, 0x06, 0x98, + 0x00, 0x28, 0x01, 0xd0, 0xaf, 0x65, 0x02, 0xe0, + 0xa8, 0x6d, 0x00, 0x28, 0x08, 0xd1, 0x91, 0x48, + 0xc4, 0x38, 0x00, 0x78, 0x80, 0x07, 0x03, 0xd5, + 0x92, 0x48, 0x47, 0x60, 0x3c, 0x00, 0x68, 0x3d, + 0x00, 0x00, 0x00, 0xf0, 0x02, 0xfe, 0x04, 0x98, + 0xff, 0x38, 0x23, 0x38, 0x14, 0x28, 0x02, 0xd2, + 0x01, 0x20, 0xe8, 0x63, 0x53, 0xe0, 0xef, 0x63, + 0x51, 0xe0, 0x87, 0x4a, 0xb5, 0x7a, 0x80, 0x3a, + 0x00, 0x2d, 0x4c, 0xd0, 0x0d, 0xf0, 0x71, 0xff, + 0x00, 0xf0, 0xad, 0xfd, 0x07, 0x1c, 0x82, 0x48, + 0x80, 0x38, 0x40, 0x6f, 0xff, 0x30, 0x5f, 0x30, + 0x0e, 0xf0, 0x3d, 0xff, 0x02, 0x1c, 0x3c, 0x00, + 0xa4, 0x3d, 0x00, 0x00, 0x7e, 0x48, 0x80, 0x38, + 0x40, 0x6d, 0x00, 0x28, 0x1a, 0xd1, 0x00, 0xf0, + 0xf1, 0xfd, 0x00, 0x28, 0x16, 0xd1, 0x04, 0x2d, + 0x02, 0xd1, 0x00, 0x2f, 0x12, 0xd1, 0x1b, 0xe0, + 0x00, 0x2f, 0x06, 0xd0, 0x02, 0x2d, 0x14, 0xd0, + 0x79, 0x48, 0x40, 0x68, 0x00, 0x28, 0x09, 0xd0, + 0x12, 0xe0, 0x00, 0x2a, 0x10, 0xd1, 0x4b, 0x21, + 0xc9, 0x00, 0x01, 0x23, 0x09, 0x22, 0x16, 0x20, + 0x3c, 0x00, 0xe0, 0x3d, 0x00, 0x00, 0x0f, 0xf0, + 0xd6, 0xfc, 0x6e, 0x4a, 0x73, 0x48, 0x80, 0x3a, + 0x11, 0x68, 0x0b, 0xf0, 0xd8, 0xfa, 0x18, 0xe0, + 0x01, 0x21, 0x00, 0x20, 0x01, 0xe0, 0x01, 0x21, + 0x01, 0x20, 0x00, 0xf0, 0x2a, 0xfe, 0x10, 0xe0, + 0x67, 0x4a, 0x6c, 0x49, 0x80, 0x3a, 0x90, 0x6e, + 0x40, 0x18, 0x90, 0x66, 0x01, 0x25, 0x08, 0x95, + 0x8b, 0xe1, 0x04, 0x21, 0x6c, 0xe1, 0x61, 0x4a, + 0x66, 0x48, 0x3c, 0x00, 0x1c, 0x3e, 0x00, 0x00, + 0x80, 0x3a, 0x11, 0x68, 0x0b, 0xf0, 0xaa, 0xfa, + 0x88, 0xe1, 0xaf, 0x60, 0xa8, 0x6f, 0xe8, 0x67, + 0x63, 0x48, 0x01, 0x6d, 0xa9, 0x67, 0x07, 0x9a, + 0x14, 0x20, 0x00, 0x2a, 0x00, 0xd1, 0x00, 0x20, + 0x08, 0x18, 0x12, 0x30, 0xa8, 0x66, 0x70, 0x78, + 0xb0, 0x70, 0x30, 0x78, 0x70, 0x70, 0x02, 0x20, + 0x30, 0x70, 0xa0, 0x69, 0xfc, 0xf7, 0xc2, 0xfa, + 0xef, 0x64, 0xa8, 0x6f, 0x3c, 0x00, 0x58, 0x3e, + 0x00, 0x00, 0xe9, 0x6f, 0x59, 0x4b, 0x40, 0x1a, + 0x98, 0x42, 0x12, 0xd2, 0x68, 0x6d, 0x06, 0x99, + 0x88, 0x42, 0x0e, 0xd0, 0x30, 0x78, 0x02, 0x28, + 0x0b, 0xd8, 0x0e, 0xf0, 0x9c, 0xff, 0xa9, 0x6f, + 0x08, 0x22, 0x40, 0x1a, 0x52, 0x49, 0x09, 0x1a, + 0x3b, 0x1c, 0x16, 0x20, 0x0f, 0xf0, 0x85, 0xfc, + 0x00, 0xe0, 0xaf, 0x65, 0x01, 0x20, 0x05, 0x90, + 0x08, 0x90, 0x43, 0x48, 0x02, 0x25, 0x3c, 0x00, + 0x94, 0x3e, 0x00, 0x00, 0xc4, 0x38, 0xc1, 0x68, + 0x00, 0x29, 0x72, 0xd1, 0x01, 0x21, 0xc1, 0x60, + 0x49, 0x48, 0x00, 0x6b, 0x00, 0x28, 0x6c, 0xd0, + 0x08, 0xf0, 0x66, 0xfc, 0x69, 0xe0, 0x3c, 0x48, + 0x00, 0x22, 0x01, 0x92, 0x80, 0x38, 0x80, 0x68, + 0x01, 0x28, 0x04, 0xd1, 0x38, 0x48, 0x80, 0x38, + 0x87, 0x60, 0x01, 0x20, 0x48, 0xe1, 0x3a, 0x48, + 0x01, 0x23, 0x43, 0x60, 0x34, 0x48, 0xc4, 0x38, + 0x3c, 0x00, 0xd0, 0x3e, 0x00, 0x00, 0x00, 0x78, + 0x00, 0x28, 0x0a, 0xd1, 0x00, 0xf0, 0x25, 0xfe, + 0x00, 0x28, 0x06, 0xd0, 0xff, 0x21, 0x91, 0x31, + 0x01, 0x23, 0x09, 0x22, 0x16, 0x20, 0x0f, 0xf0, + 0x52, 0xfc, 0x2c, 0x49, 0x80, 0x39, 0x48, 0x6f, + 0x89, 0x6f, 0x42, 0x1a, 0x03, 0x92, 0x06, 0xf0, + 0x76, 0xf9, 0x28, 0x49, 0x80, 0x39, 0x89, 0x6f, + 0x03, 0x9a, 0x40, 0x1a, 0x02, 0x90, 0x37, 0x20, + 0x00, 0x01, 0x3c, 0x00, 0x0c, 0x3f, 0x00, 0x00, + 0x10, 0x1a, 0x50, 0x28, 0x0d, 0xd2, 0x23, 0x48, + 0x80, 0x38, 0x40, 0x6d, 0x00, 0x28, 0x04, 0xd1, + 0x02, 0x98, 0xff, 0x38, 0x55, 0x38, 0x14, 0x28, + 0x01, 0xd2, 0x01, 0x22, 0x00, 0xe0, 0x00, 0x22, + 0x01, 0x92, 0x03, 0x9a, 0x01, 0x20, 0xff, 0x3a, + 0x0b, 0x3a, 0x50, 0x2a, 0x00, 0xd3, 0x00, 0x20, + 0x04, 0x90, 0x00, 0x28, 0x0a, 0xd0, 0x17, 0x48, + 0x80, 0x38, 0xc0, 0x6f, 0x3c, 0x00, 0x48, 0x3f, + 0x00, 0x00, 0x08, 0x1a, 0x9b, 0x21, 0xc9, 0x00, + 0x40, 0x1a, 0x14, 0x28, 0x01, 0xd2, 0x01, 0x22, + 0x00, 0xe0, 0x00, 0x22, 0x00, 0x92, 0x00, 0x2a, + 0x11, 0xd0, 0x0f, 0x4d, 0x01, 0x20, 0x80, 0x3d, + 0x68, 0x65, 0x0e, 0xf0, 0x20, 0xff, 0x68, 0x66, + 0x01, 0x25, 0x01, 0x21, 0x16, 0x20, 0x0f, 0xf0, + 0x5e, 0xfb, 0x00, 0x21, 0x16, 0x20, 0x0f, 0xf0, + 0x5a, 0xfb, 0x00, 0xe0, 0xba, 0xe0, 0x3c, 0x00, + 0x84, 0x3f, 0x00, 0x00, 0xf0, 0x79, 0x02, 0x28, + 0x3c, 0xd8, 0x05, 0x4a, 0x80, 0x3a, 0x51, 0x6c, + 0x00, 0x29, 0x37, 0xd1, 0x13, 0x6c, 0x11, 0x1c, + 0x00, 0x2b, 0x33, 0xd1, 0x16, 0xe0, 0x00, 0x00, + 0x24, 0x6d, 0x01, 0x00, 0x50, 0xc3, 0x00, 0x00, + 0xc0, 0x5c, 0x15, 0x00, 0x70, 0x99, 0x14, 0x00, + 0xb0, 0x57, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, + 0xe2, 0x04, 0x00, 0x00, 0x00, 0x90, 0x07, 0x00, + 0x3c, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x53, 0x07, + 0x00, 0x00, 0x1e, 0x02, 0x00, 0x00, 0xc8, 0x57, + 0x01, 0x00, 0x4a, 0x6d, 0x00, 0x2a, 0x02, 0xd0, + 0xb2, 0x7a, 0x02, 0x2a, 0x15, 0xd1, 0x00, 0x9a, + 0x00, 0x2a, 0x03, 0xd0, 0xca, 0x6d, 0x01, 0x32, + 0xca, 0x65, 0x00, 0xe0, 0xcf, 0x65, 0x01, 0x9a, + 0x00, 0x2a, 0x0b, 0xd0, 0x8a, 0x6f, 0xcb, 0x6f, + 0xd2, 0x1a, 0x5a, 0x4b, 0x9a, 0x42, 0x02, 0xd2, + 0x8a, 0x6d, 0x3c, 0x00, 0xfc, 0x3f, 0x00, 0x00, + 0x01, 0x32, 0x00, 0xe0, 0x01, 0x22, 0x8a, 0x65, + 0x00, 0xe0, 0x8f, 0x65, 0x04, 0x99, 0x00, 0x29, + 0x01, 0xd1, 0x02, 0x28, 0x0b, 0xd9, 0x54, 0x4a, + 0x02, 0x28, 0x1e, 0xd9, 0xd0, 0x6f, 0x61, 0x68, + 0x88, 0x42, 0x1a, 0xd1, 0x91, 0x6f, 0x08, 0x1a, + 0x50, 0x49, 0x88, 0x42, 0x15, 0xdd, 0x4e, 0x4b, + 0x98, 0x6f, 0xe1, 0x68, 0x40, 0x1a, 0x7d, 0x21, + 0xc9, 0x00, 0x88, 0x42, 0x3c, 0x00, 0x38, 0x40, + 0x00, 0x00, 0x0b, 0xdd, 0x61, 0x69, 0x40, 0x1a, + 0x00, 0x28, 0x04, 0xdd, 0x02, 0x11, 0x40, 0x11, + 0x10, 0x18, 0x40, 0x18, 0x01, 0xe0, 0x80, 0x10, + 0x08, 0x18, 0x60, 0x61, 0x58, 0x6f, 0xe0, 0x60, + 0x03, 0x98, 0xff, 0x38, 0x23, 0x38, 0x14, 0x28, + 0x09, 0xd2, 0x02, 0x98, 0xff, 0x38, 0x23, 0x38, + 0x14, 0x28, 0x04, 0xd2, 0x3e, 0x4a, 0x90, 0x6f, + 0x50, 0x64, 0x90, 0x6a, 0x90, 0x64, 0x3c, 0x00, + 0x74, 0x40, 0x00, 0x00, 0x0e, 0xf0, 0x9a, 0xfe, + 0x3a, 0x49, 0x49, 0x6c, 0x40, 0x1a, 0x3b, 0x49, + 0x88, 0x42, 0x01, 0xd9, 0x37, 0x49, 0x4f, 0x64, + 0x39, 0x49, 0x03, 0x98, 0x40, 0x18, 0x14, 0x28, + 0x07, 0xd2, 0x34, 0x49, 0xc8, 0x6b, 0x00, 0x28, + 0x03, 0xd0, 0x88, 0x6f, 0x08, 0x64, 0x88, 0x6a, + 0x88, 0x64, 0x0e, 0xf0, 0x83, 0xfe, 0x2f, 0x49, + 0x09, 0x6c, 0x40, 0x1a, 0x31, 0x49, 0x88, 0x42, + 0x3c, 0x00, 0xb0, 0x40, 0x00, 0x00, 0x01, 0xd9, + 0x2c, 0x48, 0x07, 0x64, 0x04, 0x20, 0x05, 0x90, + 0x08, 0x21, 0x16, 0x20, 0x0f, 0xf0, 0xb9, 0xfa, + 0x28, 0x48, 0x40, 0x6d, 0x00, 0x28, 0x02, 0xd0, + 0x04, 0x99, 0x00, 0x29, 0x08, 0xd0, 0x29, 0x49, + 0x00, 0x28, 0x00, 0xd1, 0x29, 0x49, 0x3b, 0x1c, + 0x06, 0x22, 0x16, 0x20, 0x0f, 0xf0, 0x57, 0xfb, + 0x02, 0x2d, 0x09, 0xd0, 0x06, 0x2d, 0x0a, 0xd0, + 0x07, 0x2d, 0x3c, 0x00, 0xec, 0x40, 0x00, 0x00, + 0x13, 0xd1, 0x07, 0xe0, 0x01, 0x21, 0x16, 0x20, + 0xfd, 0xf7, 0xd6, 0xf8, 0x1e, 0xe0, 0x1a, 0x4a, + 0x57, 0x63, 0x97, 0x63, 0x18, 0x4a, 0x06, 0x98, + 0xd0, 0x62, 0x07, 0x99, 0x11, 0x63, 0x53, 0x6b, + 0x18, 0x43, 0x50, 0x63, 0x90, 0x6b, 0x08, 0x43, + 0x90, 0x63, 0x05, 0x98, 0x00, 0x28, 0x05, 0xd0, + 0x05, 0x98, 0x0c, 0xf0, 0x5f, 0xfa, 0x05, 0x98, + 0x0c, 0xf0, 0xd2, 0xf9, 0x3c, 0x00, 0x28, 0x41, + 0x00, 0x00, 0x08, 0x2d, 0x05, 0xd0, 0x0d, 0x48, + 0x44, 0x38, 0x85, 0x70, 0x28, 0x1c, 0x03, 0xf0, + 0xdc, 0xfd, 0x11, 0x49, 0xe0, 0x69, 0x88, 0x42, + 0x00, 0xd1, 0x61, 0xe5, 0x08, 0x98, 0x00, 0x28, + 0xfb, 0xd0, 0xb0, 0x7a, 0x02, 0x28, 0xf8, 0xd1, + 0x01, 0x21, 0x16, 0x20, 0x0f, 0xf0, 0x6f, 0xfa, + 0x02, 0x20, 0x0d, 0xf0, 0xe8, 0xfe, 0x53, 0xe5, + 0x00, 0x00, 0x53, 0x07, 0x00, 0x00, 0x3c, 0x00, + 0x64, 0x41, 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, + 0x20, 0xa1, 0x07, 0x00, 0x20, 0x4e, 0x00, 0x00, + 0x3f, 0xfb, 0xff, 0xff, 0xa0, 0x86, 0x01, 0x00, + 0x50, 0xc3, 0x00, 0x00, 0xc0, 0x5c, 0x15, 0x00, + 0xf1, 0x1d, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x70, 0x47, 0x00, 0x00, 0xf8, 0xb5, 0x21, 0x48, + 0x00, 0x68, 0x21, 0x4d, 0x69, 0x69, 0x08, 0x40, + 0x01, 0xd1, 0x01, 0x27, 0x00, 0xe0, 0x00, 0x27, + 0x3c, 0x00, 0xa0, 0x41, 0x00, 0x00, 0x1d, 0x4d, + 0x01, 0x26, 0x69, 0x6a, 0x00, 0x29, 0x00, 0xd0, + 0x00, 0x26, 0x1b, 0x4d, 0x1a, 0x48, 0x2c, 0x1c, + 0xa0, 0x30, 0x02, 0x7a, 0x28, 0x1c, 0x40, 0x30, + 0x80, 0x34, 0x10, 0x23, 0xb7, 0x42, 0x10, 0xd1, + 0x01, 0x25, 0xc5, 0x80, 0x00, 0x29, 0x00, 0xd0, + 0x00, 0x23, 0x1a, 0x43, 0x11, 0x1c, 0x01, 0x73, + 0x01, 0x20, 0x0e, 0xf0, 0x88, 0xfe, 0x08, 0x20, + 0x20, 0x70, 0x3c, 0x00, 0xdc, 0x41, 0x00, 0x00, + 0x00, 0x22, 0x16, 0x21, 0x80, 0x20, 0x13, 0xe0, + 0x11, 0x27, 0xc7, 0x80, 0x2e, 0x1c, 0x0b, 0x4d, + 0x00, 0x29, 0x00, 0xd1, 0x00, 0x23, 0x1a, 0x43, + 0x11, 0x1c, 0x01, 0x73, 0x01, 0x20, 0x0e, 0xf0, + 0x75, 0xfe, 0x08, 0x20, 0x20, 0x70, 0x30, 0x6d, + 0x00, 0x22, 0x16, 0x21, 0x68, 0x67, 0x82, 0x20, + 0x0f, 0xf0, 0xd0, 0xfa, 0xf8, 0xbd, 0x00, 0x00, + 0x10, 0x00, 0x07, 0x00, 0x3c, 0x00, 0x18, 0x42, + 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x00, 0x90, + 0x07, 0x00, 0xb0, 0xb5, 0x0f, 0x4d, 0x04, 0x1c, + 0xaa, 0x7a, 0x01, 0x21, 0x08, 0x1c, 0x00, 0x2a, + 0x00, 0xd0, 0x00, 0x20, 0x00, 0x2c, 0x00, 0xd0, + 0x00, 0x21, 0x88, 0x42, 0x0a, 0xd0, 0x00, 0x2c, + 0x04, 0xd1, 0x00, 0xf0, 0x42, 0xfb, 0x00, 0xf0, + 0xd6, 0xfa, 0x03, 0xe0, 0x00, 0xf0, 0xd9, 0xfa, + 0x00, 0xf0, 0x09, 0xf8, 0xa8, 0x7a, 0x3c, 0x00, + 0x54, 0x42, 0x00, 0x00, 0x02, 0x49, 0xe4, 0x39, + 0x48, 0x71, 0xac, 0x72, 0xb0, 0xbd, 0x00, 0x00, + 0x44, 0x6d, 0x01, 0x00, 0x80, 0xb5, 0x3e, 0xf0, + 0x55, 0xf8, 0x02, 0x49, 0x01, 0x20, 0x08, 0x70, + 0x80, 0xbd, 0x00, 0x00, 0x68, 0x7e, 0x01, 0x00, + 0xf3, 0xb5, 0x01, 0x20, 0x8d, 0xb0, 0x0f, 0x1c, + 0x01, 0x24, 0x08, 0x90, 0x0e, 0xf0, 0x92, 0xfd, + 0x06, 0x1c, 0x00, 0xf0, 0xb5, 0xfa, 0x09, 0x90, + 0x3c, 0x00, 0x90, 0x42, 0x00, 0x00, 0x00, 0xf0, + 0x80, 0xfb, 0x07, 0x90, 0xfe, 0xf7, 0x3f, 0xfa, + 0x05, 0x1c, 0x00, 0x21, 0x0c, 0x91, 0x08, 0xf0, + 0xf0, 0xfb, 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, + 0x00, 0xe0, 0x00, 0x20, 0x0a, 0x90, 0xfe, 0xf7, + 0x12, 0xfd, 0x05, 0xf0, 0xe0, 0xfe, 0x0b, 0x90, + 0x00, 0x2d, 0x23, 0xd0, 0x28, 0x88, 0x41, 0x07, + 0x20, 0xd4, 0x29, 0x1d, 0x04, 0x91, 0x0a, 0x35, + 0x00, 0x06, 0x3c, 0x00, 0xcc, 0x42, 0x00, 0x00, + 0x80, 0x0e, 0x01, 0x21, 0x20, 0x28, 0x03, 0x95, + 0x00, 0xd0, 0x00, 0x21, 0x0d, 0x1c, 0x04, 0x98, + 0x06, 0xf0, 0x38, 0xfd, 0x0c, 0x90, 0x04, 0x98, + 0x06, 0xf0, 0x10, 0xfd, 0x00, 0x28, 0x08, 0xd0, + 0x03, 0x98, 0x01, 0xf0, 0x87, 0xfa, 0x00, 0x28, + 0x03, 0xd0, 0x00, 0x2d, 0x01, 0xd1, 0x01, 0x20, + 0x00, 0xe0, 0x00, 0x20, 0x0c, 0x99, 0x01, 0x43, + 0x0c, 0x91, 0xfc, 0xf7, 0x3c, 0x00, 0x08, 0x43, + 0x00, 0x00, 0x23, 0xff, 0x00, 0x28, 0x2f, 0xd0, + 0x07, 0xf0, 0x99, 0xff, 0x05, 0x1c, 0x07, 0xf0, + 0xb2, 0xff, 0x04, 0x90, 0xff, 0xf7, 0xf3, 0xf8, + 0x0c, 0x99, 0x01, 0x43, 0x00, 0x2d, 0x06, 0xd0, + 0x04, 0x98, 0xf0, 0x4a, 0x30, 0x1a, 0x90, 0x42, + 0x01, 0xd2, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, + 0x08, 0x43, 0x0c, 0x90, 0x0b, 0x98, 0x0a, 0x9b, + 0x18, 0x43, 0x01, 0x1c, 0x0b, 0x91, 0x3c, 0x00, + 0x44, 0x43, 0x00, 0x00, 0x05, 0xf0, 0xce, 0xfe, + 0x00, 0x28, 0x1a, 0xd1, 0x00, 0x2d, 0x06, 0xd0, + 0x04, 0x98, 0xe7, 0x49, 0x30, 0x1a, 0x88, 0x42, + 0x01, 0xd2, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, + 0x0c, 0x99, 0x08, 0x43, 0x05, 0x1c, 0x00, 0xf0, + 0x1f, 0xfb, 0x28, 0x43, 0x03, 0xe0, 0x00, 0xf0, + 0x1b, 0xfb, 0x0c, 0x99, 0x08, 0x43, 0x0c, 0x90, + 0x00, 0xf0, 0xd4, 0xfb, 0x0b, 0x99, 0x01, 0x43, + 0x3c, 0x00, 0x80, 0x43, 0x00, 0x00, 0x0b, 0x91, + 0xdc, 0x49, 0xc8, 0x68, 0x00, 0x28, 0x01, 0xd0, + 0x01, 0x38, 0xc8, 0x60, 0x08, 0xf0, 0xe7, 0xfb, + 0x06, 0x90, 0x08, 0xf0, 0x90, 0xfd, 0x31, 0x1a, + 0x05, 0x91, 0x06, 0x99, 0xd6, 0x48, 0x81, 0x42, + 0x08, 0xd8, 0x00, 0x2f, 0x08, 0xd1, 0x05, 0x99, + 0x40, 0x08, 0x81, 0x42, 0x04, 0xd9, 0x06, 0x99, + 0x81, 0x42, 0x01, 0xd9, 0x00, 0x24, 0x8b, 0xe0, + 0xd0, 0x48, 0x3c, 0x00, 0xbc, 0x43, 0x00, 0x00, + 0x05, 0x99, 0xd0, 0x4d, 0x81, 0x42, 0x26, 0xd2, + 0xe8, 0x79, 0x10, 0x28, 0x06, 0xd2, 0x00, 0x2f, + 0x21, 0xd1, 0xcc, 0x48, 0xa0, 0x38, 0x80, 0x6a, + 0x00, 0x28, 0x1c, 0xd1, 0x09, 0xf0, 0x62, 0xff, + 0x04, 0x90, 0x00, 0x28, 0x02, 0xd1, 0x00, 0x20, + 0xc3, 0x49, 0x13, 0xe0, 0x09, 0xf0, 0x10, 0xfe, + 0x00, 0x28, 0x03, 0xd0, 0xc4, 0x48, 0xc0, 0x69, + 0x00, 0x28, 0xf4, 0xd0, 0x3c, 0x00, 0xf8, 0x43, + 0x00, 0x00, 0x04, 0x98, 0x05, 0x28, 0x03, 0xd0, + 0xc1, 0x48, 0x00, 0x6a, 0x00, 0x28, 0x65, 0xd1, + 0xbb, 0x49, 0x48, 0x6a, 0x00, 0x28, 0x23, 0xd0, + 0x01, 0x38, 0x48, 0x62, 0x00, 0xf0, 0x87, 0xff, + 0x00, 0x28, 0x11, 0xd0, 0xbb, 0x48, 0x05, 0x99, + 0x81, 0x42, 0x0d, 0xd2, 0x01, 0xf0, 0x9b, 0xf8, + 0x04, 0x30, 0x0d, 0xf0, 0xee, 0xfc, 0x40, 0x30, + 0xc1, 0x7a, 0x01, 0x29, 0x4e, 0xd0, 0x3c, 0x00, + 0x34, 0x44, 0x00, 0x00, 0x80, 0x7a, 0x00, 0x28, + 0x01, 0xd0, 0x05, 0x28, 0x49, 0xd3, 0x01, 0xf0, + 0xdf, 0xf8, 0x02, 0x28, 0x10, 0xd0, 0x00, 0x2f, + 0x02, 0xd1, 0x06, 0x98, 0x00, 0x28, 0x40, 0xd1, + 0x00, 0x20, 0x08, 0x90, 0x82, 0xe1, 0xaa, 0x48, + 0xa0, 0x38, 0xc0, 0x68, 0x00, 0x28, 0x38, 0xd0, + 0xa8, 0x48, 0x80, 0x69, 0x48, 0x62, 0x34, 0xe0, + 0x0a, 0xa9, 0x03, 0xc9, 0x08, 0x43, 0x45, 0xd0, + 0x3c, 0x00, 0x70, 0x44, 0x00, 0x00, 0xa3, 0x48, + 0x29, 0x78, 0xa0, 0x38, 0x02, 0x29, 0x40, 0xd8, + 0x40, 0x6d, 0x00, 0x28, 0x0a, 0xd0, 0x9f, 0x48, + 0xa2, 0x49, 0x20, 0x38, 0xc0, 0x68, 0x40, 0x18, + 0x0e, 0xf0, 0xc7, 0xfb, 0x00, 0x28, 0x01, 0xd0, + 0x01, 0x21, 0x00, 0xe0, 0x00, 0x21, 0x96, 0x4a, + 0x90, 0x6a, 0x00, 0x28, 0x02, 0xda, 0x64, 0x08, + 0x64, 0x00, 0x2a, 0xe0, 0x00, 0x29, 0x09, 0xd1, + 0x95, 0x4b, 0x3c, 0x00, 0xac, 0x44, 0x00, 0x00, + 0xa0, 0x3b, 0x5b, 0x6d, 0x00, 0x2b, 0x02, 0xd0, + 0x05, 0x28, 0x0d, 0xdb, 0x01, 0xe0, 0x07, 0x28, + 0x0a, 0xdb, 0x01, 0x20, 0xc0, 0x43, 0x90, 0x62, + 0x64, 0x08, 0x8e, 0x49, 0x64, 0x00, 0x00, 0x20, + 0xa0, 0x39, 0x88, 0x65, 0x14, 0xe0, 0xd1, 0xe0, + 0x39, 0x43, 0x11, 0xd1, 0x89, 0x49, 0xa0, 0x39, + 0xcb, 0x6d, 0x00, 0x2b, 0x02, 0xd1, 0x89, 0x6d, + 0x01, 0x29, 0x09, 0xd9, 0x3c, 0x00, 0xe8, 0x44, + 0x00, 0x00, 0x07, 0x9b, 0x00, 0x2b, 0x01, 0xd1, + 0x07, 0x28, 0x01, 0xdb, 0x64, 0x08, 0x64, 0x00, + 0x01, 0x30, 0x90, 0x62, 0xbd, 0xe0, 0x7d, 0x49, + 0x88, 0x69, 0x04, 0x90, 0x00, 0x20, 0x88, 0x61, + 0x0c, 0x98, 0x00, 0x28, 0x2c, 0xd0, 0x07, 0xf0, + 0x66, 0xfc, 0x00, 0x28, 0x02, 0xd0, 0x02, 0x20, + 0x04, 0x43, 0x25, 0xe0, 0x7a, 0x48, 0xc0, 0x6a, + 0x00, 0x28, 0x04, 0xd1, 0x77, 0x48, 0x3c, 0x00, + 0x24, 0x45, 0x00, 0x00, 0xa0, 0x38, 0xc0, 0x68, + 0x00, 0x28, 0x1c, 0xd1, 0x04, 0x98, 0x00, 0x28, + 0x0d, 0xd1, 0x28, 0x78, 0x10, 0x28, 0x02, 0xd3, + 0xe8, 0x78, 0x02, 0x28, 0x02, 0xd9, 0x28, 0x79, + 0x10, 0x28, 0x04, 0xd3, 0x04, 0x24, 0x6b, 0x49, + 0x01, 0x22, 0x8a, 0x61, 0x94, 0xe0, 0x6c, 0x48, + 0xa0, 0x38, 0x40, 0x6d, 0x00, 0x28, 0x71, 0xd0, + 0x05, 0xf0, 0xa2, 0xfd, 0x00, 0x28, 0x6d, 0xd0, + 0x3c, 0x00, 0x60, 0x45, 0x00, 0x00, 0x64, 0x08, + 0x64, 0x00, 0x88, 0xe0, 0xff, 0xf7, 0x5b, 0xfa, + 0x00, 0x28, 0x1a, 0xd0, 0x68, 0x48, 0x00, 0x78, + 0x02, 0x28, 0x01, 0xd1, 0x00, 0x2f, 0x14, 0xd1, + 0x00, 0x20, 0xfe, 0xf7, 0x70, 0xfe, 0x30, 0x1a, + 0x04, 0x90, 0xff, 0xf7, 0x6c, 0xfa, 0x00, 0x28, + 0x07, 0xd0, 0xff, 0xf7, 0x1e, 0xfa, 0x00, 0x28, + 0x03, 0xd0, 0x5d, 0x49, 0x04, 0x98, 0x88, 0x42, + 0x4f, 0xd3, 0x3c, 0x00, 0x9c, 0x45, 0x00, 0x00, + 0x05, 0xf0, 0x6c, 0xfd, 0x00, 0x28, 0x4b, 0xd1, + 0x53, 0x49, 0x08, 0x78, 0x03, 0x28, 0x08, 0xd1, + 0x88, 0x68, 0x01, 0x22, 0xd2, 0x07, 0x30, 0x1a, + 0x90, 0x42, 0x41, 0xd2, 0x01, 0x22, 0x0a, 0x70, + 0x57, 0xe0, 0x54, 0x48, 0x00, 0x78, 0x02, 0x28, + 0x01, 0xd1, 0x00, 0x2f, 0x51, 0xd1, 0x4a, 0x49, + 0x88, 0x68, 0x51, 0x49, 0x80, 0x1b, 0x88, 0x42, + 0x07, 0xd9, 0x01, 0x20, 0x3c, 0x00, 0xd8, 0x45, + 0x00, 0x00, 0xfe, 0xf7, 0x42, 0xfe, 0x7d, 0x21, + 0x09, 0x01, 0x40, 0x18, 0x44, 0x49, 0x88, 0x60, + 0x4a, 0x48, 0x00, 0x78, 0x02, 0x28, 0x04, 0xd1, + 0x07, 0x9b, 0x00, 0x2b, 0x01, 0xd1, 0x01, 0x20, + 0x00, 0xe0, 0x00, 0x20, 0x47, 0x4b, 0x47, 0x49, + 0x58, 0x43, 0x40, 0x18, 0x3c, 0x49, 0x89, 0x68, + 0x89, 0x1b, 0x88, 0x42, 0x30, 0xd9, 0x07, 0x9b, + 0x00, 0x20, 0x03, 0x93, 0x00, 0xf0, 0x3c, 0x00, + 0x14, 0x46, 0x00, 0x00, 0x79, 0xff, 0x02, 0x90, + 0xff, 0xf7, 0xd8, 0xf9, 0x04, 0x90, 0x01, 0xf0, + 0x57, 0xf8, 0x04, 0x99, 0x02, 0x9a, 0x51, 0x43, + 0x48, 0x43, 0x01, 0x90, 0x00, 0xf0, 0xdc, 0xff, + 0x41, 0x1c, 0x01, 0x98, 0x01, 0x22, 0x48, 0x43, + 0x11, 0x1c, 0x00, 0xe0, 0x1b, 0xe0, 0x31, 0x4b, + 0x5b, 0x6a, 0x83, 0x42, 0x00, 0xd3, 0x00, 0x21, + 0x03, 0x9b, 0x01, 0x22, 0x00, 0x2b, 0x00, 0xd0, + 0x3c, 0x00, 0x50, 0x46, 0x00, 0x00, 0x00, 0x22, + 0x2c, 0x4b, 0x51, 0x43, 0x9b, 0x6a, 0x01, 0x22, + 0x83, 0x42, 0x00, 0xd3, 0x00, 0x22, 0x50, 0x00, + 0x08, 0x18, 0x03, 0xd0, 0x23, 0x49, 0x03, 0x20, + 0x08, 0x70, 0x03, 0xe0, 0x09, 0x98, 0xc0, 0x68, + 0x06, 0x28, 0x08, 0xd9, 0x02, 0x24, 0x08, 0x98, + 0x00, 0x28, 0x6e, 0xd0, 0x1d, 0x49, 0x00, 0x20, + 0xc8, 0x61, 0x48, 0x61, 0xa5, 0xe0, 0x1a, 0x49, + 0x48, 0x69, 0x3c, 0x00, 0x8c, 0x46, 0x00, 0x00, + 0x00, 0x28, 0x0a, 0xd1, 0x00, 0x2f, 0x05, 0xd0, + 0x01, 0x22, 0x4a, 0x61, 0xc8, 0x69, 0x80, 0x18, + 0xc8, 0x61, 0x0a, 0xe0, 0x00, 0x20, 0xc8, 0x61, + 0x03, 0xe0, 0x00, 0x2f, 0x05, 0xd1, 0x00, 0x20, + 0x48, 0x61, 0x0d, 0x98, 0x00, 0x28, 0x00, 0xd1, + 0xc8, 0x68, 0x00, 0x20, 0x08, 0x90, 0x08, 0x78, + 0x01, 0x28, 0x2f, 0xd0, 0x02, 0x28, 0x4b, 0xd1, + 0x00, 0x2f, 0x08, 0xd1, 0x3c, 0x00, 0xc8, 0x46, + 0x00, 0x00, 0xe8, 0x78, 0x00, 0x28, 0x02, 0xd1, + 0x28, 0x78, 0x10, 0x28, 0x43, 0xd2, 0x28, 0x79, + 0x10, 0x28, 0x40, 0xd2, 0x48, 0x68, 0x0a, 0x69, + 0x30, 0x1a, 0x90, 0x42, 0x67, 0xd3, 0x01, 0x22, + 0x0a, 0x70, 0x38, 0xe0, 0x00, 0x00, 0xe2, 0x04, + 0x00, 0x00, 0x10, 0x27, 0x00, 0x00, 0x68, 0x7e, + 0x01, 0x00, 0xa0, 0x86, 0x01, 0x00, 0x88, 0x13, + 0x00, 0x00, 0x44, 0x6d, 0x01, 0x00, 0x3c, 0x00, + 0x04, 0x47, 0x00, 0x00, 0xc8, 0x57, 0x01, 0x00, + 0x50, 0xc3, 0x00, 0x00, 0x98, 0x3a, 0x00, 0x00, + 0xc0, 0x57, 0x01, 0x00, 0x40, 0x0d, 0x03, 0x00, + 0xc4, 0x09, 0x00, 0x00, 0xb2, 0x0c, 0x00, 0x00, + 0x00, 0x20, 0x0b, 0x9a, 0x0a, 0x9b, 0xc0, 0x43, + 0x1a, 0x43, 0x37, 0xd0, 0x00, 0x2f, 0x35, 0xd1, + 0x07, 0x9b, 0x00, 0x2b, 0x08, 0xd0, 0x6a, 0x78, + 0x02, 0x2a, 0x2f, 0xd9, 0x2a, 0x78, 0x10, 0x2a, + 0x3c, 0x00, 0x40, 0x47, 0x00, 0x00, 0x2c, 0xd2, + 0x2a, 0x79, 0x10, 0x2a, 0x29, 0xd2, 0x25, 0x4b, + 0x1a, 0x6c, 0x00, 0x2a, 0x06, 0xd0, 0x9a, 0x6a, + 0x9f, 0x6c, 0xba, 0x42, 0x02, 0xd1, 0x1f, 0x20, + 0x1f, 0xe0, 0x2e, 0xe0, 0x20, 0x4b, 0x5a, 0x6c, + 0x00, 0x2a, 0x03, 0xd0, 0x1f, 0x4f, 0xb3, 0x1a, + 0xbb, 0x42, 0x16, 0xd3, 0x1c, 0x4b, 0x00, 0x2a, + 0x05, 0xd0, 0x9a, 0x6a, 0x9f, 0x6c, 0xba, 0x42, + 0x01, 0xd1, 0x3c, 0x00, 0x7c, 0x47, 0x00, 0x00, + 0x0f, 0x20, 0x0d, 0xe0, 0x07, 0x9a, 0x00, 0x2a, + 0x04, 0xd0, 0xea, 0x79, 0x20, 0x2a, 0x01, 0xd1, + 0x00, 0x20, 0x05, 0xe0, 0xea, 0x79, 0x10, 0x2a, + 0x01, 0xd3, 0x03, 0x20, 0x00, 0xe0, 0x9a, 0x6a, + 0x12, 0x4a, 0x12, 0x68, 0x02, 0x40, 0x0b, 0xd1, + 0x01, 0x20, 0x08, 0x90, 0x02, 0x20, 0x08, 0x70, + 0x0f, 0x48, 0x08, 0x61, 0x4e, 0x60, 0x64, 0xe7, + 0xff, 0xe7, 0x01, 0x20, 0x3c, 0x00, 0xb8, 0x47, + 0x00, 0x00, 0x08, 0x90, 0x60, 0xe7, 0x0c, 0x49, + 0x88, 0x6a, 0x00, 0x28, 0x01, 0xda, 0x01, 0x30, + 0x02, 0xe0, 0x00, 0x28, 0x01, 0xdd, 0x00, 0x20, + 0x88, 0x62, 0x00, 0x20, 0x08, 0x62, 0x08, 0x99, + 0x20, 0x04, 0x08, 0x43, 0x0f, 0xb0, 0xf0, 0xbd, + 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x71, 0x02, + 0x00, 0x00, 0x08, 0x20, 0x07, 0x00, 0x53, 0x07, + 0x00, 0x00, 0x68, 0x7e, 0x01, 0x00, 0x3c, 0x00, + 0xf4, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x00, 0x48, 0x70, 0x47, 0x50, 0x7e, 0x01, 0x00, + 0x80, 0xb5, 0x3d, 0xf0, 0x7f, 0xfd, 0x02, 0x49, + 0x01, 0x20, 0x08, 0x70, 0x80, 0xbd, 0x00, 0x00, + 0x3c, 0x7e, 0x01, 0x00, 0xf8, 0xb5, 0x0d, 0x1c, + 0x0e, 0xf0, 0xc8, 0xfa, 0x26, 0x49, 0x04, 0x1c, + 0x88, 0x6a, 0x26, 0x4e, 0x00, 0x28, 0x01, 0xd0, + 0x04, 0x20, 0x03, 0xe0, 0x70, 0x6a, 0x00, 0x28, + 0x3c, 0x00, 0x30, 0x48, 0x00, 0x00, 0x01, 0xd0, + 0x01, 0x38, 0x70, 0x62, 0x00, 0x27, 0x00, 0x2d, + 0x02, 0xd0, 0xb7, 0x61, 0xf7, 0x61, 0x0a, 0xe0, + 0xb0, 0x69, 0x1c, 0x49, 0x01, 0x30, 0xb0, 0x61, + 0x49, 0x6d, 0x00, 0x29, 0x03, 0xd0, 0x03, 0x28, + 0x01, 0xd9, 0x01, 0x20, 0xf0, 0x61, 0xb4, 0x60, + 0xf1, 0x68, 0x00, 0x91, 0x08, 0xf0, 0xf7, 0xfc, + 0xf0, 0x60, 0x00, 0x99, 0x88, 0x42, 0x02, 0xd0, + 0x30, 0x62, 0x3c, 0x00, 0x6c, 0x48, 0x00, 0x00, + 0x34, 0x61, 0x0b, 0xe0, 0x00, 0xf0, 0x90, 0xf8, + 0x00, 0x28, 0x01, 0xd0, 0x11, 0x48, 0x00, 0xe0, + 0x11, 0x48, 0x31, 0x69, 0x61, 0x1a, 0x81, 0x42, + 0x00, 0xd9, 0x37, 0x62, 0x0b, 0x4a, 0x0c, 0x48, + 0xd1, 0x6c, 0x20, 0x30, 0x00, 0x29, 0x01, 0xd0, + 0x0a, 0x21, 0x03, 0xe0, 0x01, 0x7a, 0x00, 0x29, + 0x01, 0xd0, 0xff, 0x31, 0x01, 0x72, 0x00, 0x2d, + 0x03, 0xd1, 0x01, 0x7a, 0x3c, 0x00, 0xa8, 0x48, + 0x00, 0x00, 0x00, 0x29, 0x00, 0xd0, 0x91, 0x6a, + 0x00, 0x7a, 0x00, 0x28, 0x00, 0xd1, 0x17, 0x65, + 0xf8, 0xbd, 0xa4, 0x6c, 0x01, 0x00, 0x3c, 0x7e, + 0x01, 0x00, 0xa6, 0x0e, 0x00, 0x00, 0xa8, 0x61, + 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x06, 0x49, + 0x80, 0xb5, 0x89, 0x68, 0x00, 0x29, 0x07, 0xd0, + 0x05, 0x21, 0x00, 0x28, 0x00, 0xd1, 0x04, 0x21, + 0x08, 0x06, 0x00, 0x0e, 0x03, 0xf0, 0x3c, 0x00, + 0xe4, 0x48, 0x00, 0x00, 0x05, 0xfa, 0x80, 0xbd, + 0x60, 0x6c, 0x01, 0x00, 0x07, 0x48, 0x00, 0x68, + 0x07, 0x49, 0x4a, 0x69, 0x10, 0x40, 0x01, 0xd0, + 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x49, 0x6a, + 0x88, 0x42, 0x01, 0xd1, 0x01, 0x20, 0x70, 0x47, + 0x00, 0x20, 0x70, 0x47, 0x10, 0x00, 0x07, 0x00, + 0xa4, 0x6c, 0x01, 0x00, 0x70, 0xb5, 0x0e, 0xf0, + 0x49, 0xfa, 0x02, 0x1c, 0x00, 0xf0, 0x3a, 0xf8, + 0x3c, 0x00, 0x20, 0x49, 0x00, 0x00, 0x10, 0x49, + 0x00, 0x28, 0x0e, 0xd0, 0x08, 0x1c, 0xa0, 0x31, + 0x0e, 0x78, 0x0e, 0x4b, 0x10, 0x2e, 0x01, 0xd3, + 0x80, 0x6f, 0x03, 0xe0, 0x49, 0x78, 0x10, 0x29, + 0x0e, 0xd3, 0xc0, 0x6f, 0xc0, 0x18, 0x84, 0x1a, + 0x0a, 0xe0, 0x08, 0x1c, 0x80, 0x30, 0x45, 0x69, + 0x08, 0x49, 0x8d, 0x42, 0x01, 0xd9, 0x0c, 0x1c, + 0x05, 0xe0, 0xc0, 0x68, 0x10, 0x1a, 0x2c, 0x1a, + 0x00, 0x2c, 0x3c, 0x00, 0x5c, 0x49, 0x00, 0x00, + 0x00, 0xda, 0x64, 0x19, 0x20, 0x1c, 0x70, 0xbd, + 0xa4, 0x6c, 0x01, 0x00, 0xa6, 0x0e, 0x00, 0x00, + 0x50, 0xc3, 0x00, 0x00, 0x80, 0xb5, 0x05, 0xf0, + 0xb7, 0xfb, 0x00, 0x28, 0x02, 0xd0, 0x07, 0xf0, + 0x1f, 0xff, 0x80, 0xbd, 0x03, 0x48, 0x00, 0x78, + 0x00, 0x28, 0xfa, 0xd0, 0x07, 0xf0, 0x70, 0xfb, + 0x80, 0xbd, 0x00, 0x00, 0x60, 0x6c, 0x01, 0x00, + 0x03, 0x49, 0x01, 0x20, 0x3c, 0x00, 0x98, 0x49, + 0x00, 0x00, 0x49, 0x69, 0x03, 0x29, 0x00, 0xd8, + 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x60, 0x6c, + 0x01, 0x00, 0xb0, 0xb5, 0x0a, 0x4d, 0x00, 0x24, + 0x28, 0x78, 0x01, 0x28, 0x03, 0xd0, 0x05, 0xf0, + 0x6a, 0xfb, 0x04, 0x06, 0x24, 0x0e, 0xfe, 0xf7, + 0xd2, 0xfc, 0x00, 0x02, 0x20, 0x43, 0x02, 0xd1, + 0x68, 0x6a, 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, + 0xb0, 0xbd, 0x00, 0x20, 0xb0, 0xbd, 0x3c, 0x00, + 0xd4, 0x49, 0x00, 0x00, 0x60, 0x6c, 0x01, 0x00, + 0x01, 0x21, 0x01, 0x28, 0x00, 0xd0, 0x00, 0x21, + 0x01, 0x48, 0x41, 0x62, 0x70, 0x47, 0x00, 0x00, + 0x60, 0x6c, 0x01, 0x00, 0x15, 0x48, 0x10, 0xb5, + 0x04, 0x68, 0x15, 0x48, 0x00, 0x6a, 0x00, 0x28, + 0x14, 0xd0, 0xff, 0xf7, 0xcb, 0xff, 0x00, 0x28, + 0x0e, 0xd1, 0x11, 0x48, 0x11, 0x49, 0xc4, 0x30, + 0x40, 0x69, 0x88, 0x42, 0x08, 0xd2, 0xcc, 0x08, + 0x3c, 0x00, 0x10, 0x4a, 0x00, 0x00, 0xa0, 0x42, + 0x05, 0xd3, 0xff, 0xf7, 0x7e, 0xff, 0xa0, 0x42, + 0x01, 0xda, 0x0c, 0x4c, 0x01, 0xe0, 0xff, 0x24, + 0x91, 0x34, 0x7d, 0x20, 0x00, 0x01, 0x84, 0x42, + 0x04, 0xd9, 0x00, 0x22, 0x16, 0x21, 0x83, 0x20, + 0x0e, 0xf0, 0xbd, 0xfe, 0x01, 0x23, 0x09, 0x22, + 0x21, 0x1c, 0x16, 0x20, 0x0e, 0xf0, 0xa7, 0xfe, + 0x10, 0xbd, 0xb0, 0x57, 0x01, 0x00, 0x60, 0x6c, + 0x01, 0x00, 0x3c, 0x00, 0x4c, 0x4a, 0x00, 0x00, + 0xc0, 0x5d, 0x00, 0x00, 0x10, 0x27, 0x00, 0x00, + 0x70, 0xb5, 0x05, 0x1c, 0x0e, 0x1c, 0x00, 0xf0, + 0x43, 0xf8, 0x00, 0x28, 0x0f, 0xd0, 0x08, 0x4c, + 0x20, 0x78, 0xc0, 0x07, 0x03, 0xd4, 0x05, 0xf0, + 0xab, 0xf9, 0x09, 0xf0, 0x31, 0xfe, 0x00, 0x2d, + 0x05, 0xd0, 0x20, 0x78, 0x80, 0x07, 0x02, 0xd4, + 0x30, 0x1c, 0x02, 0xf0, 0xfd, 0xfe, 0x70, 0xbd, + 0x60, 0x6c, 0x01, 0x00, 0x3c, 0x00, 0x88, 0x4a, + 0x00, 0x00, 0xb0, 0xb5, 0x00, 0x28, 0x18, 0xd0, + 0x11, 0x48, 0x81, 0x42, 0x15, 0xd2, 0x10, 0x48, + 0x0c, 0x1c, 0x0d, 0x18, 0x07, 0xf0, 0xdf, 0xfa, + 0x81, 0x00, 0x09, 0x18, 0xa1, 0x42, 0x01, 0xd2, + 0x40, 0x00, 0x03, 0xe0, 0x41, 0x00, 0x09, 0x18, + 0xa1, 0x42, 0x01, 0xd2, 0x24, 0x1a, 0x06, 0xe0, + 0x41, 0x00, 0xa1, 0x42, 0x03, 0xd2, 0x40, 0x08, + 0xf8, 0xe7, 0x06, 0x4d, 0x07, 0x4c, 0x3c, 0x00, + 0xc4, 0x4a, 0x00, 0x00, 0x0e, 0xf0, 0x72, 0xf9, + 0x00, 0x19, 0x29, 0x1c, 0x07, 0xf0, 0xdc, 0xfa, + 0xb0, 0xbd, 0x00, 0x00, 0x80, 0xb9, 0x2a, 0x00, + 0x53, 0x07, 0x00, 0x00, 0x4c, 0x1d, 0x00, 0x00, + 0x88, 0x13, 0x00, 0x00, 0xb0, 0xb5, 0x05, 0xf0, + 0xfd, 0xfa, 0x00, 0x28, 0x13, 0xd1, 0xfe, 0xf7, + 0xb5, 0xfe, 0x0a, 0x4c, 0x0a, 0x4d, 0x00, 0x28, + 0x60, 0x63, 0x00, 0xd0, 0x28, 0x60, 0x0e, 0xf0, + 0x3c, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x55, 0xf9, + 0x21, 0x6a, 0x00, 0x29, 0x04, 0xd1, 0xe1, 0x69, + 0x40, 0x1a, 0x29, 0x68, 0x88, 0x42, 0x01, 0xd9, + 0x01, 0x20, 0xb0, 0xbd, 0x00, 0x20, 0xb0, 0xbd, + 0x00, 0x00, 0x60, 0x6c, 0x01, 0x00, 0xb0, 0x57, + 0x01, 0x00, 0x80, 0xb5, 0xff, 0xf7, 0xdd, 0xff, + 0x00, 0x28, 0x05, 0xd0, 0x05, 0xf0, 0xb7, 0xfa, + 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, 0x80, 0xbd, + 0x00, 0x20, 0x3c, 0x00, 0x3c, 0x4b, 0x00, 0x00, + 0x80, 0xbd, 0x00, 0x00, 0x10, 0xb5, 0x0a, 0x4c, + 0x00, 0x21, 0xa2, 0x68, 0x00, 0x2a, 0x03, 0xd0, + 0xa1, 0x60, 0x02, 0xf0, 0x83, 0xf9, 0x10, 0xbd, + 0x61, 0x60, 0x01, 0x1c, 0x00, 0x22, 0x04, 0x20, + 0x0e, 0xf0, 0x36, 0xfd, 0x03, 0x48, 0x21, 0x68, + 0x0a, 0xf0, 0x08, 0xfc, 0x10, 0xbd, 0x00, 0x00, + 0xbc, 0x74, 0x01, 0x00, 0xc4, 0x60, 0x01, 0x00, + 0x70, 0xb5, 0x05, 0x1c, 0x3c, 0x00, 0x78, 0x4b, + 0x00, 0x00, 0x01, 0xd1, 0xfc, 0xf7, 0xc1, 0xfb, + 0x20, 0x4c, 0xe0, 0x6a, 0x00, 0x28, 0x15, 0xd0, + 0x1f, 0x4b, 0xa0, 0x69, 0x58, 0x43, 0xc6, 0x0b, + 0x20, 0x88, 0x46, 0x43, 0xf0, 0x00, 0x80, 0x19, + 0xe6, 0x60, 0xfb, 0xf7, 0x1c, 0xfe, 0xa8, 0x42, + 0x05, 0xd8, 0x30, 0x1c, 0xfb, 0xf7, 0x17, 0xfe, + 0x80, 0x19, 0xa8, 0x42, 0x02, 0xd2, 0x00, 0x20, + 0xe0, 0x60, 0x20, 0xe0, 0xe5, 0x60, 0x3c, 0x00, + 0xb4, 0x4b, 0x00, 0x00, 0x00, 0x2d, 0x1d, 0xd0, + 0x26, 0x88, 0xa0, 0x69, 0x70, 0x43, 0xc1, 0x03, + 0x28, 0x1c, 0xfb, 0xf7, 0xa5, 0xfd, 0x60, 0x61, + 0x0d, 0x48, 0x32, 0x1c, 0x29, 0x1c, 0x30, 0x30, + 0xfb, 0xf7, 0x0a, 0xfc, 0x0c, 0x4b, 0x60, 0x69, + 0x58, 0x43, 0xc0, 0x0b, 0x60, 0x62, 0x01, 0xf0, + 0xb7, 0xfd, 0xa0, 0x62, 0xe0, 0x68, 0x00, 0x28, + 0x04, 0xd0, 0x20, 0x69, 0xa1, 0x68, 0xfb, 0xf7, + 0x3c, 0x00, 0xf0, 0x4b, 0x00, 0x00, 0xf4, 0xfb, + 0x70, 0xbd, 0x05, 0x48, 0xa1, 0x68, 0xfb, 0xf7, + 0xef, 0xfb, 0x70, 0xbd, 0x00, 0x00, 0xc8, 0x74, + 0x01, 0x00, 0x40, 0x42, 0x0f, 0x00, 0xc0, 0xc6, + 0x2d, 0x00, 0x88, 0x13, 0x00, 0x00, 0xf1, 0xb5, + 0x3e, 0x48, 0x00, 0xab, 0x81, 0x78, 0xc0, 0x78, + 0x3e, 0x4f, 0x0a, 0x07, 0x04, 0x07, 0x58, 0x78, + 0x3b, 0x49, 0x12, 0x0f, 0x08, 0x5c, 0x14, 0x39, + 0x24, 0x0f, 0x3c, 0x00, 0x2c, 0x4c, 0x00, 0x00, + 0x80, 0x18, 0x78, 0x60, 0x01, 0x30, 0xb8, 0x60, + 0x18, 0x78, 0x35, 0x4d, 0x08, 0x5c, 0x00, 0x19, + 0xb8, 0x61, 0x01, 0x30, 0xf8, 0x61, 0xeb, 0x78, + 0x33, 0x48, 0x1e, 0x09, 0x33, 0x4b, 0x18, 0x38, + 0x81, 0x78, 0x5e, 0x43, 0xab, 0x78, 0x1d, 0x09, + 0xc8, 0x23, 0x6b, 0x43, 0x00, 0x29, 0x08, 0xd1, + 0x2b, 0x4d, 0x2d, 0x78, 0x3d, 0x60, 0xc5, 0x60, + 0x7d, 0x25, 0xed, 0x00, 0x3c, 0x00, 0x68, 0x4c, + 0x00, 0x00, 0x5d, 0x1b, 0x2c, 0x4b, 0x07, 0xe0, + 0x27, 0x4d, 0x6d, 0x78, 0x3d, 0x60, 0xc5, 0x60, + 0x4b, 0x25, 0x2d, 0x01, 0x5d, 0x1b, 0x28, 0x4b, + 0xf6, 0x18, 0x02, 0x20, 0x00, 0xf0, 0x57, 0xf8, + 0x28, 0x1a, 0xf8, 0x60, 0x22, 0x48, 0x22, 0x1c, + 0x18, 0x38, 0x81, 0x78, 0x03, 0x20, 0x00, 0xf0, + 0x4e, 0xf8, 0x30, 0x1a, 0x38, 0x62, 0x39, 0x68, + 0x00, 0xab, 0x79, 0x61, 0x5a, 0x78, 0x3c, 0x00, + 0xa4, 0x4c, 0x00, 0x00, 0x56, 0x23, 0xf9, 0x68, + 0x5a, 0x43, 0x89, 0x1a, 0xf9, 0x60, 0xc8, 0x31, + 0x39, 0x61, 0x18, 0x49, 0x18, 0x39, 0x89, 0x78, + 0x00, 0x29, 0xb9, 0x69, 0x11, 0xd1, 0x00, 0xab, + 0x1a, 0x78, 0x13, 0x4b, 0x14, 0x3b, 0x9a, 0x5c, + 0x53, 0x1c, 0x59, 0x43, 0x0a, 0x23, 0x59, 0x43, + 0x14, 0x4b, 0x59, 0x1a, 0x51, 0x43, 0x0a, 0x23, + 0x59, 0x43, 0x40, 0x1a, 0x38, 0x62, 0x12, 0x49, + 0x3c, 0x00, 0xe0, 0x4c, 0x00, 0x00, 0x10, 0xe0, + 0x00, 0xab, 0x1a, 0x78, 0x0a, 0x4b, 0x14, 0x3b, + 0x9a, 0x5c, 0x53, 0x1c, 0x59, 0x43, 0x0a, 0x23, + 0x59, 0x43, 0x0d, 0x4b, 0x59, 0x1a, 0x51, 0x43, + 0x0a, 0x23, 0x59, 0x43, 0x40, 0x1a, 0x0b, 0x49, + 0x38, 0x62, 0x40, 0x18, 0x78, 0x62, 0xf8, 0xbd, + 0x00, 0x00, 0x0c, 0x5a, 0x01, 0x00, 0x66, 0x5a, + 0x01, 0x00, 0x94, 0x78, 0x01, 0x00, 0xa0, 0x86, + 0x01, 0x00, 0x3c, 0x00, 0x1c, 0x4d, 0x00, 0x00, + 0x00, 0x48, 0x71, 0x00, 0xb0, 0xd6, 0x8c, 0x00, + 0x88, 0x10, 0x00, 0x00, 0x80, 0x38, 0x01, 0x00, + 0x58, 0x12, 0x00, 0x00, 0x70, 0x11, 0x01, 0x00, + 0x30, 0xb5, 0x19, 0x4b, 0x02, 0x28, 0xdd, 0x68, + 0x06, 0xd1, 0x00, 0x29, 0x04, 0xd1, 0x2b, 0x1c, + 0x0c, 0x33, 0x9c, 0x1a, 0x64, 0x23, 0x5c, 0x43, + 0x02, 0x28, 0x09, 0xd1, 0x01, 0x29, 0x07, 0xd1, + 0x64, 0x23, 0x7d, 0x24, 0x3c, 0x00, 0x58, 0x4d, + 0x00, 0x00, 0xe4, 0x00, 0x6b, 0x43, 0x1c, 0x19, + 0xa0, 0x23, 0x53, 0x43, 0xe4, 0x1a, 0x0a, 0x23, + 0x5a, 0x43, 0x03, 0x28, 0x09, 0xd1, 0x00, 0x29, + 0x07, 0xd1, 0x13, 0x23, 0xff, 0x24, 0xe4, 0x00, + 0x6b, 0x43, 0x1b, 0x19, 0x9b, 0x1a, 0x1c, 0x1c, + 0x5c, 0x43, 0x03, 0x28, 0x08, 0xd1, 0x01, 0x29, + 0x06, 0xd1, 0x0e, 0x20, 0x05, 0x49, 0x68, 0x43, + 0x40, 0x18, 0x80, 0x1a, 0x04, 0x1c, 0x3c, 0x00, + 0x94, 0x4d, 0x00, 0x00, 0x44, 0x43, 0x20, 0x1c, + 0x30, 0xbd, 0x00, 0x00, 0x7c, 0x78, 0x01, 0x00, + 0x84, 0x08, 0x00, 0x00, 0x10, 0xb5, 0x07, 0x4c, + 0x0c, 0x23, 0x60, 0x78, 0x05, 0x49, 0x14, 0x31, + 0x58, 0x43, 0x40, 0x18, 0x40, 0x68, 0x01, 0xf0, + 0x4f, 0xfc, 0x00, 0x21, 0x60, 0x78, 0x02, 0xf0, + 0x4b, 0xff, 0x10, 0xbd, 0x4c, 0x7b, 0x01, 0x00, + 0x0c, 0x48, 0xf8, 0xb5, 0x40, 0x78, 0x0c, 0x23, + 0x3c, 0x00, 0xd0, 0x4d, 0x00, 0x00, 0x0a, 0x49, + 0x58, 0x43, 0x14, 0x31, 0x44, 0x18, 0x26, 0x1d, + 0x60, 0xce, 0x30, 0x1c, 0x0b, 0xf0, 0x0b, 0xfd, + 0x00, 0x27, 0x41, 0x20, 0x47, 0x55, 0x05, 0x48, + 0x29, 0x1c, 0x02, 0xf0, 0xf0, 0xfe, 0x28, 0x1c, + 0x01, 0xf0, 0x31, 0xfc, 0x04, 0x34, 0xc0, 0xc4, + 0xf8, 0xbd, 0x4c, 0x7b, 0x01, 0x00, 0x55, 0x80, + 0x00, 0x00, 0xb0, 0xb5, 0x0a, 0x4d, 0x4c, 0x21, + 0x28, 0x78, 0x3c, 0x00, 0x0c, 0x4e, 0x00, 0x00, + 0x09, 0x4a, 0x41, 0x43, 0x8c, 0x18, 0x22, 0x68, + 0x01, 0x21, 0xfb, 0xf7, 0xe1, 0xfa, 0x28, 0x78, + 0x01, 0xf0, 0xfa, 0xfb, 0x3c, 0x23, 0xe0, 0x56, + 0x41, 0x1e, 0x01, 0x20, 0x07, 0xf0, 0x34, 0xfb, + 0xb0, 0xbd, 0x00, 0x00, 0x3c, 0x7c, 0x01, 0x00, + 0x58, 0xe3, 0x01, 0x00, 0x0c, 0x23, 0x07, 0x49, + 0x58, 0x43, 0x40, 0x18, 0x80, 0xb5, 0x40, 0x68, + 0x41, 0x6b, 0x00, 0x29, 0x3c, 0x00, 0x48, 0x4e, + 0x00, 0x00, 0x02, 0xd0, 0x0b, 0xf0, 0xfb, 0xfd, + 0x80, 0xbd, 0x0b, 0xf0, 0x2c, 0xfd, 0x80, 0xbd, + 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, 0x38, 0x22, + 0x0a, 0x4b, 0x42, 0x43, 0xd2, 0x18, 0x00, 0x29, + 0x80, 0xb5, 0x04, 0xd0, 0x02, 0x29, 0x07, 0xd1, + 0x0b, 0xf0, 0xfb, 0xfc, 0x80, 0xbd, 0xd2, 0x6a, + 0x01, 0x21, 0xfb, 0xf7, 0xb0, 0xfa, 0x80, 0xbd, + 0x03, 0x21, 0x86, 0x20, 0xfc, 0xf7, 0x3c, 0x00, + 0x84, 0x4e, 0x00, 0x00, 0x0f, 0xfa, 0x80, 0xbd, + 0xd4, 0xe4, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x06, + 0x24, 0x0e, 0x0c, 0x20, 0x0e, 0x49, 0x60, 0x43, + 0x40, 0x18, 0x45, 0x68, 0xa8, 0x6b, 0x00, 0x28, + 0x03, 0xd1, 0x00, 0x21, 0x20, 0x1c, 0xfd, 0xf7, + 0xe1, 0xfa, 0x20, 0x1c, 0x07, 0xf0, 0xf2, 0xff, + 0x00, 0x28, 0x08, 0xd0, 0x28, 0x1c, 0x60, 0x30, + 0xc1, 0x79, 0x01, 0x29, 0x03, 0xd9, 0xff, 0x31, + 0x3c, 0x00, 0xc0, 0x4e, 0x00, 0x00, 0xc1, 0x71, + 0xff, 0x31, 0x81, 0x71, 0x01, 0x21, 0x20, 0x1c, + 0x02, 0xf0, 0xc5, 0xfe, 0xb0, 0xbd, 0x60, 0x7b, + 0x01, 0x00, 0x70, 0xb5, 0x00, 0x06, 0x00, 0x0e, + 0x05, 0x1c, 0x4c, 0x23, 0x0a, 0x49, 0x58, 0x43, + 0x44, 0x18, 0x3c, 0x20, 0x00, 0x5d, 0xff, 0x30, + 0x06, 0x06, 0x36, 0x16, 0x28, 0x1c, 0x01, 0xf0, + 0x90, 0xfb, 0x00, 0x21, 0x28, 0x1c, 0x22, 0x68, + 0xfb, 0xf7, 0x3c, 0x00, 0xfc, 0x4e, 0x00, 0x00, + 0x6f, 0xfa, 0x31, 0x1c, 0x00, 0x20, 0x07, 0xf0, + 0xc7, 0xfa, 0x70, 0xbd, 0x58, 0xe3, 0x01, 0x00, + 0x0c, 0x22, 0x0f, 0x4b, 0x42, 0x43, 0xd2, 0x18, + 0x10, 0xb5, 0x54, 0x68, 0x00, 0x29, 0x0d, 0xd0, + 0x02, 0x29, 0x0f, 0xd1, 0x2c, 0x20, 0x00, 0x5d, + 0x00, 0x28, 0x03, 0xd0, 0x07, 0x21, 0x0c, 0x20, + 0xfc, 0xf7, 0xba, 0xf9, 0x20, 0x1c, 0x0b, 0xf0, + 0xbb, 0xfc, 0x10, 0xbd, 0x3c, 0x00, 0x38, 0x4f, + 0x00, 0x00, 0x00, 0x21, 0x02, 0xf0, 0x8d, 0xfe, + 0x10, 0xbd, 0x04, 0x21, 0x0c, 0x20, 0xfc, 0xf7, + 0xae, 0xf9, 0x10, 0xbd, 0x00, 0x00, 0x60, 0x7b, + 0x01, 0x00, 0x80, 0xb5, 0x00, 0x29, 0x07, 0xd0, + 0x0c, 0x23, 0x05, 0x49, 0x58, 0x43, 0x40, 0x18, + 0x40, 0x68, 0x0b, 0xf0, 0x4a, 0xfc, 0x80, 0xbd, + 0x01, 0x21, 0x02, 0xf0, 0x76, 0xfe, 0x80, 0xbd, + 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, 0x3c, 0x00, + 0x74, 0x4f, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x1c, + 0x00, 0x29, 0x05, 0xd0, 0x02, 0x29, 0x1a, 0xd1, + 0x20, 0x1c, 0x0b, 0xf0, 0xeb, 0xfc, 0x10, 0xbd, + 0x0d, 0x48, 0x04, 0x70, 0x0d, 0x48, 0x07, 0xf0, + 0x07, 0xf9, 0x0d, 0x48, 0x01, 0x88, 0x01, 0x22, + 0x12, 0x03, 0x11, 0x43, 0x01, 0x80, 0x4c, 0x20, + 0x0a, 0x49, 0x60, 0x43, 0x40, 0x18, 0x40, 0x30, + 0x00, 0x78, 0xfd, 0xf7, 0x5d, 0xfd, 0x20, 0x1c, + 0x3c, 0x00, 0xb0, 0x4f, 0x00, 0x00, 0x0a, 0xf0, + 0xd4, 0xf8, 0x10, 0xbd, 0x03, 0x21, 0x86, 0x20, + 0xfc, 0xf7, 0x73, 0xf9, 0x10, 0xbd, 0x3c, 0x7c, + 0x01, 0x00, 0x05, 0x4e, 0x00, 0x00, 0x32, 0x80, + 0x07, 0x00, 0x58, 0xe3, 0x01, 0x00, 0xff, 0xb5, + 0x05, 0x1c, 0x01, 0x20, 0x83, 0xb0, 0x01, 0x90, + 0x0c, 0x20, 0x5d, 0x4a, 0x68, 0x43, 0x86, 0x18, + 0x01, 0x27, 0x00, 0x29, 0x74, 0x68, 0x0e, 0xd0, + 0x02, 0x29, 0x3c, 0x00, 0xec, 0x4f, 0x00, 0x00, + 0x6a, 0xd1, 0x2c, 0x20, 0x00, 0x5d, 0x00, 0x28, + 0x03, 0xd0, 0x06, 0x21, 0x0c, 0x20, 0xfc, 0xf7, + 0x53, 0xf9, 0x20, 0x1c, 0x0b, 0xf0, 0x20, 0xfd, + 0x07, 0xb0, 0xf0, 0xbd, 0x52, 0x48, 0x14, 0x38, + 0x45, 0x70, 0xa0, 0x6b, 0x00, 0x28, 0x07, 0xd0, + 0x50, 0x48, 0x07, 0xf0, 0x7f, 0xf8, 0x01, 0x21, + 0x28, 0x1c, 0xfd, 0xf7, 0x25, 0xfa, 0x1c, 0xe0, + 0x4d, 0x48, 0x07, 0xf0, 0x3c, 0x00, 0x28, 0x50, + 0x00, 0x00, 0x77, 0xf8, 0x4a, 0x48, 0x14, 0x38, + 0x05, 0x70, 0x4b, 0x48, 0x01, 0x88, 0x01, 0x22, + 0x52, 0x03, 0x11, 0x43, 0x01, 0x80, 0x40, 0x20, + 0x00, 0x5d, 0xfd, 0xf7, 0x12, 0xfd, 0xb0, 0x68, + 0x00, 0x28, 0x09, 0xd1, 0x28, 0x1c, 0x07, 0xf0, + 0x64, 0xff, 0xb0, 0x60, 0x00, 0x28, 0x03, 0xd1, + 0x09, 0x21, 0x0c, 0x20, 0xfc, 0xf7, 0x23, 0xf9, + 0x05, 0x98, 0x00, 0x28, 0x03, 0xd0, 0x3c, 0x00, + 0x64, 0x50, 0x00, 0x00, 0xe0, 0x6c, 0x01, 0x30, + 0xe0, 0x64, 0x0e, 0xe0, 0x67, 0x20, 0x00, 0x5d, + 0x00, 0x28, 0x07, 0xd1, 0xe0, 0x6c, 0x00, 0x28, + 0x04, 0xd1, 0x39, 0x48, 0x02, 0x38, 0xc0, 0x6a, + 0xa0, 0x64, 0x09, 0xe0, 0x20, 0x6d, 0x00, 0x28, + 0x01, 0xd0, 0x00, 0x27, 0x04, 0xe0, 0x28, 0x1c, + 0x07, 0xf0, 0x00, 0xff, 0x00, 0x28, 0xe5, 0xd1, + 0x05, 0x98, 0x20, 0x65, 0x20, 0x1c, 0x20, 0x30, + 0x3c, 0x00, 0xa0, 0x50, 0x00, 0x00, 0x62, 0x6a, + 0x02, 0x90, 0x81, 0x7b, 0x28, 0x1c, 0x07, 0xf0, + 0x78, 0xff, 0x00, 0x2f, 0x19, 0xd0, 0x20, 0x1c, + 0x60, 0x30, 0xc1, 0x79, 0x4a, 0x1c, 0xc2, 0x71, + 0x80, 0x79, 0x81, 0x42, 0x02, 0xd2, 0x01, 0x20, + 0x01, 0xe0, 0x40, 0xe0, 0x00, 0x20, 0x01, 0x90, + 0x00, 0x28, 0x0a, 0xd0, 0x25, 0x48, 0x00, 0x78, + 0x80, 0x07, 0x06, 0xd5, 0x00, 0xf0, 0x0d, 0xfb, + 0x01, 0x1c, 0x3c, 0x00, 0xdc, 0x50, 0x00, 0x00, + 0x20, 0x1c, 0x0b, 0xf0, 0x15, 0xfd, 0x01, 0x90, + 0x01, 0x98, 0x00, 0x28, 0x0f, 0xd0, 0x02, 0x98, + 0x00, 0x7b, 0x02, 0x28, 0x03, 0xd1, 0x20, 0x1c, + 0x04, 0xf0, 0xd0, 0xfe, 0x84, 0xe7, 0x01, 0x28, + 0x00, 0xd0, 0x7e, 0xe7, 0x21, 0x1c, 0x30, 0x1c, + 0x04, 0xf0, 0xe2, 0xfe, 0x7c, 0xe7, 0x25, 0x1c, + 0x60, 0x35, 0xe8, 0x79, 0xff, 0x30, 0xa8, 0x71, + 0x68, 0x7a, 0x06, 0xf0, 0x3c, 0x00, 0x18, 0x51, + 0x00, 0x00, 0x9d, 0xfc, 0x0d, 0xf0, 0x47, 0xfe, + 0x07, 0x1c, 0x05, 0xf0, 0x12, 0xff, 0x3f, 0x18, + 0x02, 0x98, 0x81, 0x7b, 0x20, 0x69, 0x04, 0x30, + 0x00, 0xf0, 0x35, 0xfa, 0x61, 0x6a, 0x05, 0xf0, + 0xea, 0xfe, 0x39, 0x18, 0x6b, 0x7a, 0x30, 0x88, + 0x80, 0x31, 0x09, 0x4a, 0x0d, 0xf0, 0x91, 0xfe, + 0x5d, 0xe7, 0x03, 0x21, 0x0c, 0x20, 0xfc, 0xf7, + 0xaa, 0xf8, 0x58, 0xe7, 0x00, 0x00, 0x3c, 0x00, + 0x54, 0x51, 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, + 0xa5, 0x4d, 0x00, 0x00, 0xc9, 0x4d, 0x00, 0x00, + 0x32, 0x80, 0x07, 0x00, 0x1d, 0x75, 0x01, 0x00, + 0x8d, 0x4e, 0x00, 0x00, 0xff, 0xb5, 0x81, 0xb0, + 0x1f, 0x1c, 0x05, 0x1c, 0x14, 0x1c, 0x10, 0x1c, + 0x0a, 0x9e, 0x00, 0xf0, 0xf5, 0xfc, 0x29, 0x1c, + 0x10, 0x31, 0x20, 0x1d, 0x06, 0x22, 0xfb, 0xf7, + 0xb7, 0xf9, 0xa8, 0x8e, 0x20, 0x80, 0xe8, 0x8e, + 0x3c, 0x00, 0x90, 0x51, 0x00, 0x00, 0x60, 0x80, + 0x02, 0x99, 0x20, 0x1c, 0x00, 0xf0, 0x07, 0xf9, + 0xff, 0x34, 0x01, 0x34, 0x66, 0x60, 0x27, 0x60, + 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xf8, 0xb5, + 0x0f, 0x1c, 0x1e, 0x1c, 0x05, 0x1c, 0x14, 0x1c, + 0x10, 0x1c, 0x00, 0xf0, 0xd8, 0xfc, 0xa8, 0x88, + 0x39, 0x1c, 0x20, 0x80, 0x28, 0x89, 0x60, 0x80, + 0x20, 0x1c, 0x00, 0xf0, 0xf0, 0xf8, 0xff, 0x34, + 0x01, 0x34, 0x3c, 0x00, 0xcc, 0x51, 0x00, 0x00, + 0x66, 0x60, 0xf8, 0xbd, 0x70, 0xb5, 0x04, 0x1c, + 0xc0, 0x68, 0x05, 0x68, 0x20, 0x1c, 0x14, 0x30, + 0x06, 0x1c, 0x00, 0xf0, 0x0f, 0xfb, 0x00, 0x28, + 0x16, 0xd0, 0x01, 0x22, 0x02, 0x21, 0x20, 0x69, + 0x05, 0xf0, 0xf8, 0xfa, 0x00, 0x28, 0x01, 0xd0, + 0xfb, 0xf7, 0x24, 0xff, 0x00, 0x22, 0x02, 0x21, + 0x20, 0x69, 0x05, 0xf0, 0xef, 0xfa, 0x00, 0x28, + 0x06, 0xd0, 0xfb, 0xf7, 0x3c, 0x00, 0x08, 0x52, + 0x00, 0x00, 0x01, 0xff, 0x00, 0x28, 0x02, 0xd0, + 0x30, 0x1c, 0x0b, 0xf0, 0x7c, 0xfb, 0x68, 0x89, + 0x80, 0x07, 0xc0, 0x0f, 0x03, 0xf0, 0xa7, 0xf8, + 0x18, 0x23, 0x04, 0x49, 0x58, 0x43, 0x40, 0x18, + 0xc1, 0x68, 0x00, 0x29, 0x02, 0xd0, 0x20, 0x1c, + 0xfb, 0xf7, 0xd4, 0xf8, 0x70, 0xbd, 0x94, 0x67, + 0x01, 0x00, 0xf8, 0xb5, 0x04, 0x1c, 0x10, 0x1c, + 0x0d, 0x1c, 0x19, 0x1c, 0xff, 0x22, 0x3c, 0x00, + 0x44, 0x52, 0x00, 0x00, 0x00, 0x27, 0xff, 0x2d, + 0x25, 0xd0, 0x00, 0x29, 0x05, 0xd0, 0x4b, 0x88, + 0x00, 0x2b, 0x02, 0xd0, 0x00, 0xf0, 0x50, 0xfc, + 0x15, 0xe0, 0x00, 0x21, 0x10, 0x4e, 0x4b, 0x00, + 0x9e, 0x19, 0x02, 0x23, 0xf6, 0x5e, 0x86, 0x42, + 0x01, 0xdd, 0x0a, 0x1c, 0x04, 0xe0, 0x01, 0x31, + 0x09, 0x06, 0x09, 0x0e, 0x26, 0x29, 0xf1, 0xd3, + 0x09, 0x4e, 0x50, 0x00, 0x80, 0x19, 0x4e, 0x23, + 0x3c, 0x00, 0x80, 0x52, 0x00, 0x00, 0xc0, 0x5e, + 0x27, 0x2a, 0x07, 0xd2, 0x06, 0x49, 0x20, 0x39, + 0x49, 0x57, 0x47, 0x31, 0x40, 0x1a, 0x20, 0x60, + 0x01, 0x27, 0x02, 0xe0, 0x7e, 0x20, 0xc0, 0x43, + 0x20, 0x60, 0x38, 0x1c, 0xf8, 0xbd, 0xfa, 0x47, + 0x01, 0x00, 0xb0, 0xb5, 0x0c, 0x1c, 0x7e, 0x21, + 0x05, 0x1c, 0x00, 0x20, 0xc9, 0x43, 0x00, 0x2c, + 0x0f, 0xd0, 0x10, 0x1c, 0x05, 0xf0, 0x6b, 0xfd, + 0x00, 0x28, 0x3c, 0x00, 0xbc, 0x52, 0x00, 0x00, + 0x02, 0xd0, 0x21, 0x1c, 0xc9, 0x39, 0x01, 0xe0, + 0x21, 0x1c, 0x86, 0x39, 0x02, 0x20, 0xc0, 0x43, + 0xfb, 0xf7, 0xb4, 0xf9, 0x01, 0x1c, 0x01, 0x20, + 0x29, 0x60, 0xb0, 0xbd, 0x98, 0xb5, 0x14, 0x1c, + 0x00, 0x22, 0x00, 0x92, 0x22, 0x1c, 0xfd, 0xf7, + 0x43, 0xfe, 0x98, 0xbd, 0x05, 0x49, 0x80, 0xb5, + 0x08, 0x60, 0x05, 0x49, 0x01, 0x20, 0xc8, 0x61, + 0x01, 0x21, 0x00, 0x20, 0x3c, 0x00, 0xf8, 0x52, + 0x00, 0x00, 0x03, 0xf0, 0x1c, 0xfe, 0x80, 0xbd, + 0x00, 0x00, 0x20, 0x67, 0x01, 0x00, 0xac, 0x7c, + 0x01, 0x00, 0x80, 0xb5, 0x00, 0x21, 0x00, 0x20, + 0x03, 0xf0, 0x11, 0xfe, 0x06, 0xf0, 0x0d, 0xfb, + 0x02, 0x49, 0x00, 0x20, 0x08, 0x60, 0x80, 0xbd, + 0x00, 0x00, 0x20, 0x67, 0x01, 0x00, 0x03, 0x49, + 0x01, 0x20, 0x09, 0x69, 0x00, 0x29, 0x00, 0xd1, + 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, + 0x34, 0x53, 0x00, 0x00, 0x10, 0x67, 0x01, 0x00, + 0x03, 0x48, 0x00, 0x69, 0x00, 0x28, 0x01, 0xd0, + 0x40, 0x69, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, + 0x10, 0x67, 0x01, 0x00, 0x70, 0xb5, 0x16, 0x1c, + 0x0d, 0x1c, 0x04, 0x1c, 0x00, 0x28, 0x01, 0xd0, + 0x01, 0x2c, 0x07, 0xd1, 0x00, 0xf0, 0x36, 0xfa, + 0x00, 0x28, 0x05, 0xd0, 0x13, 0xf0, 0xca, 0xf9, + 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, 0x70, 0xbd, + 0x3c, 0x00, 0x70, 0x53, 0x00, 0x00, 0x01, 0x20, + 0x00, 0x2c, 0x00, 0xd0, 0x00, 0x20, 0x0a, 0x4c, + 0x04, 0x34, 0x61, 0xc4, 0x10, 0x3c, 0x00, 0xf0, + 0x24, 0xfa, 0x00, 0x28, 0x02, 0xd0, 0x00, 0xf0, + 0xc6, 0xf9, 0x01, 0xe0, 0x00, 0xf0, 0xe5, 0xf8, + 0xc0, 0x30, 0xc3, 0x6b, 0x22, 0x1d, 0x07, 0xca, + 0xfb, 0xf7, 0x20, 0xf8, 0x00, 0x20, 0x70, 0xbd, + 0x00, 0x00, 0xd4, 0x67, 0x01, 0x00, 0xf8, 0xb5, + 0x0d, 0x1c, 0x3c, 0x00, 0xac, 0x53, 0x00, 0x00, + 0x00, 0x21, 0x04, 0x1c, 0x28, 0x1c, 0x05, 0xf0, + 0xe3, 0xf9, 0x23, 0x1c, 0xff, 0x33, 0x21, 0x33, + 0xff, 0x27, 0x00, 0x28, 0x05, 0xd0, 0x22, 0x22, + 0x01, 0x1c, 0x18, 0x1c, 0xfb, 0xf7, 0x96, 0xf8, + 0x00, 0xe0, 0x1f, 0x70, 0x03, 0x21, 0x28, 0x1c, + 0x05, 0xf0, 0xd2, 0xf9, 0x26, 0x1c, 0xff, 0x36, + 0x41, 0x36, 0x00, 0x28, 0x05, 0xd0, 0x03, 0x22, + 0x01, 0x1c, 0xb0, 0x1c, 0x3c, 0x00, 0xe8, 0x53, + 0x00, 0x00, 0xfb, 0xf7, 0x86, 0xf8, 0x00, 0xe0, + 0xb7, 0x70, 0x01, 0x21, 0x28, 0x1c, 0x05, 0xf0, + 0xc2, 0xf9, 0x00, 0x28, 0x07, 0xd0, 0x01, 0x1c, + 0x20, 0x1c, 0xff, 0x30, 0x0a, 0x22, 0x46, 0x30, + 0xfb, 0xf7, 0x77, 0xf8, 0x00, 0xe0, 0x77, 0x71, + 0x32, 0x21, 0x28, 0x1c, 0x05, 0xf0, 0xb3, 0xf9, + 0x00, 0x28, 0x07, 0xd0, 0x01, 0x1c, 0x20, 0x1c, + 0xff, 0x30, 0x12, 0x22, 0x50, 0x30, 0x3c, 0x00, + 0x24, 0x54, 0x00, 0x00, 0xfb, 0xf7, 0x68, 0xf8, + 0x00, 0xe0, 0xf7, 0x73, 0x06, 0x21, 0x28, 0x1c, + 0x05, 0xf0, 0xa4, 0xf9, 0x00, 0x28, 0x07, 0xd0, + 0x01, 0x1c, 0x20, 0x1c, 0xff, 0x30, 0x04, 0x22, + 0x63, 0x30, 0xfb, 0xf7, 0x59, 0xf8, 0xf8, 0xbd, + 0xff, 0x34, 0x61, 0x34, 0xa7, 0x70, 0xfa, 0xe7, + 0x08, 0x49, 0x80, 0xb5, 0x09, 0x68, 0x00, 0x28, + 0x01, 0xd1, 0x07, 0x48, 0x01, 0x68, 0x08, 0x1c, + 0x3c, 0x00, 0x60, 0x54, 0x00, 0x00, 0x05, 0xd1, + 0x03, 0x21, 0x90, 0x20, 0xfb, 0xf7, 0x1d, 0xff, + 0x00, 0x20, 0x80, 0xbd, 0x01, 0xf0, 0xd7, 0xfb, + 0x80, 0xbd, 0x1c, 0x67, 0x01, 0x00, 0x20, 0x67, + 0x01, 0x00, 0x80, 0xb5, 0xff, 0xf7, 0xe7, 0xff, + 0x80, 0xbd, 0xf0, 0xb5, 0x00, 0x24, 0x84, 0x46, + 0x00, 0x20, 0x0b, 0xe0, 0x87, 0x40, 0x17, 0x40, + 0x07, 0xd0, 0x14, 0x23, 0x0b, 0x4d, 0x43, 0x43, + 0x5b, 0x19, 0x3c, 0x00, 0x9c, 0x54, 0x00, 0x00, + 0x1b, 0x7c, 0x65, 0x46, 0x2b, 0x55, 0x01, 0x34, + 0x01, 0x30, 0x01, 0x27, 0x3b, 0x1c, 0x0e, 0x28, + 0x00, 0xd3, 0x00, 0x23, 0x0e, 0x88, 0x3d, 0x1c, + 0xa6, 0x42, 0x00, 0xdc, 0x00, 0x25, 0x2b, 0x40, + 0xe7, 0xd1, 0x0c, 0x80, 0xf0, 0xbd, 0x00, 0x00, + 0x74, 0x40, 0x01, 0x00, 0x78, 0xb5, 0x04, 0x1c, + 0x01, 0x20, 0x20, 0x70, 0x08, 0x20, 0x00, 0xab, + 0x0d, 0x1c, 0x18, 0x80, 0x3c, 0x00, 0xd8, 0x54, + 0x00, 0x00, 0x16, 0x1c, 0xa0, 0x1c, 0x69, 0x46, + 0xff, 0xf7, 0xd1, 0xff, 0x00, 0xab, 0x00, 0x22, + 0xd2, 0x43, 0x19, 0x88, 0x82, 0x40, 0x61, 0x70, + 0x32, 0x20, 0x28, 0x70, 0x10, 0x20, 0x18, 0x80, + 0x32, 0x40, 0xa8, 0x1c, 0x69, 0x46, 0xff, 0xf7, + 0xc2, 0xff, 0x00, 0xab, 0x18, 0x88, 0x68, 0x70, + 0x78, 0xbd, 0x80, 0xb5, 0x02, 0xf0, 0x35, 0xff, + 0x00, 0x21, 0x00, 0x28, 0x00, 0xd0, 0x3c, 0x00, + 0x14, 0x55, 0x00, 0x00, 0x01, 0x69, 0x08, 0x1c, + 0x80, 0xbd, 0x00, 0x00, 0x05, 0x49, 0x00, 0x28, + 0x01, 0xd0, 0xc8, 0x68, 0x00, 0xe0, 0x08, 0x69, + 0x00, 0x28, 0x01, 0xd0, 0x04, 0x30, 0x70, 0x47, + 0x00, 0x20, 0x70, 0x47, 0x10, 0x67, 0x01, 0x00, + 0x03, 0x48, 0x00, 0x69, 0x00, 0x28, 0x01, 0xd0, + 0x04, 0x30, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, + 0x10, 0x67, 0x01, 0x00, 0x02, 0x48, 0x00, 0x69, + 0x3c, 0x00, 0x50, 0x55, 0x00, 0x00, 0x00, 0x28, + 0xff, 0xd1, 0x70, 0x47, 0x00, 0x00, 0x10, 0x67, + 0x01, 0x00, 0x10, 0xb5, 0x05, 0x4c, 0x20, 0x69, + 0x00, 0x28, 0x03, 0xd1, 0x04, 0x21, 0x90, 0x20, + 0xfb, 0xf7, 0x9b, 0xfe, 0x20, 0x69, 0x10, 0xbd, + 0x00, 0x00, 0x10, 0x67, 0x01, 0x00, 0x10, 0xb5, + 0x04, 0x1c, 0x00, 0xf0, 0x40, 0xf9, 0x00, 0x28, + 0x01, 0xd0, 0x00, 0x20, 0x10, 0xbd, 0x20, 0x1c, + 0x00, 0xf0, 0x3c, 0x00, 0x8c, 0x55, 0x00, 0x00, + 0x57, 0xf9, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x20, + 0x10, 0xbd, 0x02, 0x20, 0x10, 0xbd, 0x00, 0x00, + 0x70, 0xb5, 0x0f, 0x4e, 0x04, 0x1c, 0x30, 0x68, + 0x0d, 0x1c, 0x00, 0x28, 0x07, 0xd0, 0x21, 0x1c, + 0x04, 0x30, 0x05, 0xf0, 0xc1, 0xfb, 0x00, 0x28, + 0x01, 0xd0, 0x30, 0x68, 0x0b, 0xe0, 0x09, 0x4a, + 0x10, 0x68, 0x00, 0x28, 0x09, 0xd0, 0x21, 0x1c, + 0x14, 0x1c, 0x04, 0x30, 0x3c, 0x00, 0xc8, 0x55, + 0x00, 0x00, 0x05, 0xf0, 0xb4, 0xfb, 0x00, 0x28, + 0x02, 0xd0, 0x20, 0x68, 0x9c, 0x30, 0x00, 0xe0, + 0x03, 0x48, 0x40, 0x5d, 0x70, 0xbd, 0x20, 0x67, + 0x01, 0x00, 0x1c, 0x67, 0x01, 0x00, 0xcc, 0x47, + 0x01, 0x00, 0x04, 0x49, 0x00, 0x20, 0x09, 0x69, + 0x00, 0x29, 0x02, 0xd0, 0xff, 0x31, 0x01, 0x31, + 0x88, 0x69, 0x70, 0x47, 0x00, 0x00, 0x10, 0x67, + 0x01, 0x00, 0x01, 0x48, 0x00, 0x7a, 0x3c, 0x00, + 0x04, 0x56, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, + 0xac, 0x7c, 0x01, 0x00, 0xfe, 0xb5, 0x06, 0x1c, + 0x00, 0x20, 0x1f, 0x1c, 0x14, 0x1c, 0x00, 0x29, + 0x02, 0x90, 0x19, 0xd0, 0x01, 0x29, 0x26, 0xd0, + 0x02, 0x29, 0x47, 0xd1, 0x26, 0x48, 0x00, 0x78, + 0x05, 0xf0, 0xa0, 0xfb, 0xa0, 0x72, 0x0a, 0xf0, + 0x4f, 0xfc, 0x0e, 0x28, 0x09, 0xd1, 0xa0, 0x7a, + 0x05, 0xf0, 0xaa, 0xfb, 0x00, 0x28, 0x04, 0xd0, + 0x3c, 0x00, 0x40, 0x56, 0x00, 0x00, 0x20, 0x48, + 0x00, 0x78, 0x05, 0xf0, 0x92, 0xfb, 0xa0, 0x72, + 0x00, 0x20, 0x20, 0x72, 0x2f, 0xe0, 0x1d, 0x4d, + 0x28, 0x68, 0x00, 0x28, 0x01, 0xd1, 0xfb, 0xf7, + 0x52, 0xfe, 0x00, 0x97, 0x2a, 0x68, 0x23, 0x1c, + 0x18, 0x32, 0x11, 0x1c, 0x30, 0x1c, 0xfc, 0xf7, + 0xde, 0xfb, 0x26, 0xe0, 0x30, 0x1c, 0x0c, 0xf0, + 0xca, 0xfb, 0x05, 0x1c, 0x02, 0xd0, 0xa8, 0x68, + 0x00, 0x28, 0x3c, 0x00, 0x7c, 0x56, 0x00, 0x00, + 0x08, 0xd1, 0x13, 0x48, 0x00, 0x68, 0x00, 0x28, + 0x01, 0xd1, 0xfb, 0xf7, 0x3b, 0xfe, 0x10, 0x48, + 0x00, 0x68, 0x18, 0x30, 0x02, 0x1c, 0x0e, 0x48, + 0x00, 0x97, 0x01, 0x68, 0x23, 0x1c, 0x18, 0x31, + 0x30, 0x1c, 0xfc, 0xf7, 0xc3, 0xfb, 0x00, 0x2d, + 0x0a, 0xd0, 0x40, 0x35, 0x28, 0x88, 0x80, 0x06, + 0x06, 0xd4, 0x00, 0x20, 0x20, 0x60, 0x03, 0xe0, + 0x01, 0x21, 0x90, 0x20, 0x3c, 0x00, 0xb8, 0x56, + 0x00, 0x00, 0xfb, 0xf7, 0xf4, 0xfd, 0x02, 0x98, + 0xfe, 0xbd, 0xb0, 0x69, 0x01, 0x00, 0x90, 0x57, + 0x01, 0x00, 0x20, 0x67, 0x01, 0x00, 0x1c, 0x67, + 0x01, 0x00, 0x80, 0xb5, 0x00, 0x20, 0x02, 0xf0, + 0x4a, 0xfe, 0x18, 0x23, 0x05, 0x4a, 0x58, 0x43, + 0x80, 0x18, 0x40, 0x69, 0x01, 0x21, 0x00, 0x28, + 0x00, 0xd0, 0x41, 0x78, 0x08, 0x1c, 0x80, 0xbd, + 0x00, 0x00, 0x94, 0x67, 0x01, 0x00, 0x3c, 0x00, + 0xf4, 0x56, 0x00, 0x00, 0x02, 0x49, 0x08, 0x69, + 0x00, 0x28, 0x00, 0xd1, 0xc8, 0x68, 0x70, 0x47, + 0x10, 0x67, 0x01, 0x00, 0x03, 0x48, 0xc0, 0x68, + 0x00, 0x28, 0x01, 0xd0, 0x04, 0x30, 0x70, 0x47, + 0x00, 0x20, 0x70, 0x47, 0x10, 0x67, 0x01, 0x00, + 0x10, 0xb5, 0x05, 0x4c, 0xe0, 0x68, 0x00, 0x28, + 0x03, 0xd1, 0x05, 0x21, 0x90, 0x20, 0xfb, 0xf7, + 0xbd, 0xfd, 0xe0, 0x68, 0x10, 0xbd, 0x00, 0x00, + 0x3c, 0x00, 0x30, 0x57, 0x00, 0x00, 0x10, 0x67, + 0x01, 0x00, 0xf8, 0xb5, 0x0d, 0x1c, 0x00, 0x2a, + 0x03, 0xd0, 0x11, 0x49, 0x12, 0x4f, 0x0e, 0x78, + 0x01, 0xe0, 0x11, 0x4f, 0x0c, 0x26, 0x08, 0x2e, + 0x01, 0xd2, 0x34, 0x1c, 0x00, 0xe0, 0x08, 0x24, + 0x01, 0x21, 0x01, 0x70, 0x44, 0x70, 0x39, 0x1c, + 0x22, 0x1c, 0x02, 0x30, 0xfa, 0xf7, 0xcb, 0xfe, + 0x32, 0x1b, 0x00, 0x2a, 0x07, 0xdd, 0x32, 0x20, + 0x28, 0x70, 0x3c, 0x00, 0x6c, 0x57, 0x00, 0x00, + 0x39, 0x19, 0xa8, 0x1c, 0x6a, 0x70, 0xfa, 0xf7, + 0xc1, 0xfe, 0xf8, 0xbd, 0xff, 0x20, 0x28, 0x70, + 0x00, 0x20, 0x68, 0x70, 0xf9, 0xe7, 0x00, 0x00, + 0xa4, 0x69, 0x01, 0x00, 0xb0, 0x69, 0x01, 0x00, + 0x90, 0x57, 0x01, 0x00, 0x01, 0x49, 0x48, 0x62, + 0x70, 0x47, 0x00, 0x00, 0x94, 0x67, 0x01, 0x00, + 0x03, 0x49, 0x80, 0xb5, 0x08, 0x60, 0x01, 0x21, + 0x01, 0x20, 0x03, 0xf0, 0x3c, 0x00, 0xa8, 0x57, + 0x00, 0x00, 0xc5, 0xfb, 0x80, 0xbd, 0x1c, 0x67, + 0x01, 0x00, 0x80, 0xb5, 0x00, 0x21, 0x01, 0x20, + 0x03, 0xf0, 0xbd, 0xfb, 0x06, 0xf0, 0xb9, 0xf8, + 0x02, 0x49, 0x00, 0x20, 0x08, 0x60, 0x80, 0xbd, + 0x00, 0x00, 0x1c, 0x67, 0x01, 0x00, 0x03, 0x49, + 0x01, 0x20, 0xc9, 0x68, 0x00, 0x29, 0x00, 0xd1, + 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x10, 0x67, + 0x01, 0x00, 0x03, 0x48, 0xc0, 0x68, 0x3c, 0x00, + 0xe4, 0x57, 0x00, 0x00, 0x00, 0x28, 0x01, 0xd0, + 0x40, 0x69, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, + 0x10, 0x67, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, + 0x01, 0x20, 0x03, 0xf0, 0x9b, 0xfb, 0x80, 0xbd, + 0x05, 0x4a, 0x80, 0xb5, 0x12, 0x69, 0x00, 0x21, + 0x00, 0x2a, 0x03, 0xd0, 0x11, 0x1d, 0x05, 0xf0, + 0x91, 0xfa, 0x01, 0x1c, 0x08, 0x1c, 0x80, 0xbd, + 0x10, 0x67, 0x01, 0x00, 0x06, 0x4a, 0x80, 0xb5, + 0x3c, 0x00, 0x20, 0x58, 0x00, 0x00, 0x12, 0x69, + 0x00, 0x21, 0x00, 0x2a, 0x05, 0xd0, 0x11, 0x1c, + 0xff, 0x31, 0x21, 0x31, 0x05, 0xf0, 0x8b, 0xfa, + 0x01, 0x1c, 0x08, 0x1c, 0x80, 0xbd, 0x10, 0x67, + 0x01, 0x00, 0x05, 0x4a, 0x80, 0xb5, 0xd2, 0x68, + 0x00, 0x21, 0x00, 0x2a, 0x03, 0xd0, 0x11, 0x1d, + 0x05, 0xf0, 0x73, 0xfa, 0x01, 0x1c, 0x08, 0x1c, + 0x80, 0xbd, 0x10, 0x67, 0x01, 0x00, 0x06, 0x4a, + 0x80, 0xb5, 0x3c, 0x00, 0x5c, 0x58, 0x00, 0x00, + 0xd2, 0x68, 0x00, 0x21, 0x00, 0x2a, 0x05, 0xd0, + 0x11, 0x1c, 0xff, 0x31, 0x21, 0x31, 0x05, 0xf0, + 0x6d, 0xfa, 0x01, 0x1c, 0x08, 0x1c, 0x80, 0xbd, + 0x10, 0x67, 0x01, 0x00, 0xff, 0xb5, 0x0d, 0x1c, + 0x1f, 0x1c, 0x87, 0xb0, 0x10, 0x9e, 0x00, 0x24, + 0x02, 0xf0, 0x72, 0xfd, 0x18, 0x23, 0x13, 0x49, + 0x58, 0x43, 0x08, 0x58, 0x00, 0x28, 0x19, 0xd0, + 0x04, 0x1c, 0x33, 0x1c, 0x3c, 0x00, 0x98, 0x58, + 0x00, 0x00, 0x3a, 0x1c, 0x28, 0x1c, 0x09, 0x99, + 0xfa, 0xf7, 0x9f, 0xfd, 0x04, 0x1c, 0x14, 0xd0, + 0x18, 0x20, 0x00, 0xab, 0x18, 0x80, 0xaa, 0x68, + 0x01, 0xa8, 0x69, 0x46, 0xff, 0xf7, 0xe7, 0xfd, + 0x6a, 0x46, 0x01, 0xa9, 0x00, 0x20, 0x07, 0xf0, + 0x44, 0xfe, 0x00, 0x28, 0x05, 0xd1, 0x0a, 0x21, + 0x00, 0xe0, 0x0f, 0x21, 0x90, 0x20, 0xfb, 0xf7, + 0xea, 0xfc, 0x20, 0x1c, 0x0b, 0xb0, 0x3c, 0x00, + 0xd4, 0x58, 0x00, 0x00, 0xf0, 0xbd, 0x00, 0x00, + 0x94, 0x67, 0x01, 0x00, 0x10, 0xb5, 0x00, 0x24, + 0x02, 0xf0, 0x44, 0xfd, 0x18, 0x23, 0x05, 0x49, + 0x58, 0x43, 0x40, 0x18, 0x80, 0x68, 0x00, 0x28, + 0x02, 0xd0, 0xfa, 0xf7, 0x71, 0xfd, 0x01, 0x24, + 0x20, 0x1c, 0x10, 0xbd, 0x94, 0x67, 0x01, 0x00, + 0x80, 0xb5, 0x02, 0x4b, 0x00, 0xf0, 0x4e, 0xf8, + 0x80, 0xbd, 0x00, 0x00, 0x10, 0x67, 0x01, 0x00, + 0x3c, 0x00, 0x10, 0x59, 0x00, 0x00, 0x80, 0xb5, + 0x02, 0x4b, 0x00, 0xf0, 0x46, 0xf8, 0x80, 0xbd, + 0x00, 0x00, 0x11, 0x67, 0x01, 0x00, 0xf8, 0xb5, + 0x0e, 0x1c, 0x15, 0x1c, 0x00, 0x28, 0x1c, 0x49, + 0x10, 0xd0, 0x48, 0x68, 0x1c, 0x4a, 0x28, 0x80, + 0x00, 0x20, 0x07, 0xe0, 0x0b, 0x18, 0x1c, 0x7a, + 0x14, 0x23, 0x63, 0x43, 0x9b, 0x18, 0x1b, 0x7c, + 0x33, 0x54, 0x01, 0x30, 0x2b, 0x88, 0x83, 0x42, + 0xf4, 0xdc, 0x3c, 0x00, 0x4c, 0x59, 0x00, 0x00, + 0x24, 0xe0, 0x00, 0x20, 0x0f, 0x1c, 0x00, 0x24, + 0x08, 0x60, 0x0f, 0xe0, 0x30, 0x5d, 0x05, 0xf0, + 0x07, 0xfa, 0x0e, 0x28, 0x01, 0xd1, 0x00, 0x20, + 0xf8, 0xbd, 0x39, 0x19, 0x08, 0x72, 0x01, 0x22, + 0x39, 0x68, 0x82, 0x40, 0x11, 0x43, 0x08, 0x1c, + 0x38, 0x60, 0x01, 0x34, 0x28, 0x88, 0xa0, 0x42, + 0xec, 0xdc, 0x28, 0x88, 0x78, 0x60, 0xff, 0xf7, + 0xb7, 0xfe, 0x00, 0x28, 0x3c, 0x00, 0x88, 0x59, + 0x00, 0x00, 0x06, 0xd0, 0x01, 0x69, 0x00, 0x29, + 0x03, 0xd0, 0x7f, 0x21, 0xc9, 0x43, 0x0b, 0xf0, + 0x52, 0xfb, 0x01, 0x20, 0xe3, 0xe7, 0x2c, 0x7d, + 0x01, 0x00, 0x74, 0x40, 0x01, 0x00, 0x10, 0xb5, + 0x1c, 0x1c, 0x00, 0x28, 0x0b, 0xd0, 0x20, 0x78, + 0x0e, 0x28, 0x05, 0xd2, 0x14, 0x23, 0x0c, 0x4a, + 0x58, 0x43, 0x80, 0x18, 0x00, 0x7c, 0x00, 0xe0, + 0x00, 0x20, 0x08, 0x70, 0x0e, 0xe0, 0x3c, 0x00, + 0xc4, 0x59, 0x00, 0x00, 0x08, 0x78, 0x05, 0xf0, + 0xd1, 0xf9, 0x20, 0x70, 0xff, 0xf7, 0x92, 0xfe, + 0x00, 0x28, 0x06, 0xd0, 0x01, 0x69, 0x00, 0x29, + 0x03, 0xd0, 0x7f, 0x21, 0xc9, 0x43, 0x0b, 0xf0, + 0x2d, 0xfb, 0x01, 0x20, 0x10, 0xbd, 0x00, 0x00, + 0x74, 0x40, 0x01, 0x00, 0x80, 0xb5, 0x27, 0x20, + 0xc0, 0x43, 0x09, 0xf0, 0x31, 0xfc, 0x80, 0xbd, + 0x80, 0xb5, 0x27, 0x20, 0xc0, 0x43, 0x09, 0xf0, + 0x3c, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x39, 0xfc, + 0x80, 0xbd, 0x80, 0xb5, 0x28, 0x20, 0x09, 0xf0, + 0x42, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, + 0x28, 0x20, 0x09, 0xf0, 0x4a, 0xfc, 0x80, 0xbd, + 0x00, 0x00, 0xb0, 0xb5, 0x01, 0x28, 0x28, 0xd1, + 0x01, 0x29, 0x01, 0xd0, 0xfb, 0xf7, 0x6b, 0xfc, + 0xff, 0xf7, 0xe9, 0xfd, 0x02, 0x28, 0x1a, 0xd1, + 0x07, 0xf0, 0x13, 0xfc, 0x12, 0x4c, 0x21, 0x69, + 0x88, 0x42, 0x3c, 0x00, 0x3c, 0x5a, 0x00, 0x00, + 0x15, 0xd0, 0x07, 0xf0, 0x0d, 0xfc, 0x20, 0x61, + 0x20, 0x68, 0x7d, 0x24, 0xe4, 0x00, 0x44, 0x43, + 0x0d, 0xf0, 0xae, 0xf9, 0x05, 0x1c, 0x07, 0xf0, + 0x0b, 0xfc, 0x28, 0x1a, 0x84, 0x42, 0x00, 0xd9, + 0x24, 0x1a, 0x01, 0x22, 0x21, 0x1c, 0x0a, 0x20, + 0x0d, 0xf0, 0xb2, 0xfd, 0xb0, 0xbd, 0x00, 0x21, + 0x09, 0x20, 0x0c, 0xf0, 0x75, 0xfc, 0xb0, 0xbd, + 0x07, 0x21, 0x0a, 0x20, 0x3c, 0x00, 0x78, 0x5a, + 0x00, 0x00, 0xfb, 0xf7, 0x14, 0xfc, 0xb0, 0xbd, + 0x00, 0x00, 0xd4, 0x67, 0x01, 0x00, 0x7d, 0x20, + 0x02, 0x49, 0x00, 0x01, 0x08, 0x60, 0x70, 0x47, + 0x00, 0x00, 0xd4, 0x67, 0x01, 0x00, 0x10, 0xb5, + 0x81, 0x6d, 0x04, 0x1c, 0xff, 0x30, 0x46, 0x30, + 0x0c, 0xf0, 0xd1, 0xfc, 0x20, 0x1c, 0xff, 0x30, + 0x50, 0x30, 0xa1, 0x6d, 0x0c, 0xf0, 0xcb, 0xfc, + 0x10, 0xbd, 0xb0, 0xb5, 0x04, 0x1c, 0x3c, 0x00, + 0xb4, 0x5a, 0x00, 0x00, 0x0d, 0x1c, 0x02, 0xf0, + 0x59, 0xfc, 0x20, 0x1c, 0x02, 0xf0, 0x56, 0xfc, + 0x18, 0x23, 0x04, 0x49, 0x58, 0x43, 0x40, 0x18, + 0x18, 0x22, 0x29, 0x1c, 0xfa, 0xf7, 0x70, 0xfd, + 0xb0, 0xbd, 0x00, 0x00, 0x94, 0x67, 0x01, 0x00, + 0x10, 0xb5, 0x04, 0x1c, 0x09, 0xf0, 0xbc, 0xfb, + 0x20, 0x1c, 0x09, 0xf0, 0xc7, 0xfb, 0x10, 0xbd, + 0x10, 0xb5, 0x04, 0x1c, 0x09, 0xf0, 0xd0, 0xfb, + 0x3c, 0x00, 0xf0, 0x5a, 0x00, 0x00, 0x20, 0x1c, + 0x09, 0xf0, 0xdb, 0xfb, 0x10, 0xbd, 0x70, 0xb5, + 0x0c, 0x78, 0x06, 0x1c, 0x48, 0x88, 0x4d, 0x78, + 0xe2, 0x00, 0x80, 0x1a, 0xe9, 0x00, 0x40, 0x1a, + 0x01, 0x1c, 0x41, 0x43, 0x12, 0x31, 0x24, 0x20, + 0xfa, 0xf7, 0x91, 0xfd, 0x21, 0x1c, 0x61, 0x43, + 0xc9, 0x00, 0x40, 0x18, 0x29, 0x1c, 0x69, 0x43, + 0xc9, 0x00, 0x42, 0x18, 0x0c, 0x49, 0x88, 0x79, + 0x0c, 0x4b, 0x3c, 0x00, 0x2c, 0x5b, 0x00, 0x00, + 0x53, 0x43, 0x0c, 0x4a, 0x13, 0x60, 0x53, 0x7b, + 0x34, 0x02, 0x14, 0x60, 0x52, 0x7b, 0x88, 0x71, + 0x01, 0x33, 0x58, 0x10, 0x08, 0x4b, 0x80, 0x1a, + 0x01, 0x21, 0x49, 0x02, 0x58, 0x43, 0x00, 0x28, + 0x00, 0xda, 0x49, 0x42, 0x08, 0x18, 0x80, 0x12, + 0x21, 0x38, 0x70, 0xbd, 0x20, 0x10, 0x07, 0x00, + 0xec, 0x04, 0x00, 0x00, 0x00, 0xa0, 0x07, 0x00, + 0x03, 0x03, 0x00, 0x00, 0x3c, 0x00, 0x68, 0x5b, + 0x00, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x06, 0x21, + 0x04, 0x30, 0xfa, 0xf7, 0x70, 0xfc, 0xff, 0x20, + 0x21, 0x30, 0xff, 0x21, 0x01, 0x55, 0x20, 0x1c, + 0xff, 0x30, 0x41, 0x30, 0x81, 0x70, 0x41, 0x71, + 0xc1, 0x73, 0xff, 0x20, 0x63, 0x30, 0x01, 0x55, + 0x00, 0x20, 0x20, 0x61, 0x60, 0x61, 0xff, 0x34, + 0x01, 0x34, 0xa0, 0x60, 0xe0, 0x60, 0x10, 0xbd, + 0x00, 0x00, 0x70, 0xb5, 0x06, 0x1c, 0x3c, 0x00, + 0xa4, 0x5b, 0x00, 0x00, 0x08, 0x1c, 0x58, 0x60, + 0x9a, 0x60, 0x1c, 0x1c, 0x1e, 0x60, 0x15, 0x1c, + 0x9b, 0x8a, 0xe2, 0x8a, 0x31, 0x1c, 0x02, 0xf0, + 0xa1, 0xfc, 0x28, 0x1a, 0xe0, 0x60, 0x70, 0xbd, + 0x70, 0xb5, 0x04, 0x1c, 0x08, 0x1c, 0x11, 0x1c, + 0x1e, 0x1c, 0x00, 0x25, 0xeb, 0x43, 0x22, 0x1c, + 0x18, 0x32, 0x0b, 0xf0, 0xf7, 0xfb, 0x22, 0x1c, + 0xff, 0x32, 0x50, 0x32, 0x11, 0x1c, 0x0a, 0x39, + 0x3c, 0x00, 0xe0, 0x5b, 0x00, 0x00, 0x01, 0x23, + 0x20, 0x1c, 0x00, 0xf0, 0xc6, 0xf8, 0x0c, 0x28, + 0x10, 0xd0, 0x01, 0x25, 0x20, 0x1c, 0x0b, 0xf0, + 0xac, 0xfa, 0x20, 0x1c, 0x00, 0xf0, 0x19, 0xf8, + 0x20, 0x1c, 0x00, 0xf0, 0x0a, 0xf8, 0x20, 0x1c, + 0x00, 0xf0, 0x29, 0xf8, 0x31, 0x1c, 0x20, 0x1c, + 0x0b, 0xf0, 0x17, 0xfa, 0x28, 0x1c, 0x70, 0xbd, + 0x00, 0x00, 0xff, 0x21, 0x1d, 0x31, 0x09, 0x58, + 0x80, 0x30, 0x3c, 0x00, 0x1c, 0x5c, 0x00, 0x00, + 0x89, 0x07, 0x00, 0x29, 0x01, 0xda, 0x01, 0x21, + 0x00, 0xe0, 0x00, 0x21, 0xc1, 0x62, 0x70, 0x47, + 0x01, 0x1c, 0x80, 0x31, 0x00, 0x22, 0x0a, 0x63, + 0x07, 0x4a, 0x12, 0x68, 0x00, 0x2a, 0x09, 0xd0, + 0x42, 0x88, 0x92, 0x06, 0x06, 0xd5, 0xff, 0x30, + 0x01, 0x30, 0xc0, 0x69, 0x40, 0x07, 0x01, 0xd4, + 0x01, 0x20, 0x08, 0x63, 0x70, 0x47, 0x00, 0x00, + 0xac, 0x69, 0x01, 0x00, 0x3c, 0x00, 0x58, 0x5c, + 0x00, 0x00, 0x80, 0xb5, 0x01, 0x1c, 0x4a, 0x88, + 0x00, 0x20, 0x52, 0x05, 0x05, 0xd5, 0xff, 0x31, + 0x01, 0x31, 0xc9, 0x69, 0x49, 0x07, 0x00, 0xd4, + 0x01, 0x20, 0x06, 0xf0, 0xec, 0xfb, 0x80, 0xbd, + 0x00, 0x00, 0xf8, 0xb5, 0x05, 0x1c, 0x98, 0x68, + 0x17, 0x1c, 0x0e, 0x1c, 0x1c, 0x1c, 0x00, 0x28, + 0x02, 0xd1, 0x20, 0x1c, 0x0c, 0xf0, 0x31, 0xf8, + 0xab, 0x69, 0x39, 0x1c, 0x30, 0x1c, 0x3c, 0x00, + 0x94, 0x5c, 0x00, 0x00, 0xa2, 0x68, 0x0b, 0xf0, + 0x95, 0xfb, 0xf8, 0xbd, 0xf8, 0xb5, 0x16, 0x1c, + 0x0d, 0x1c, 0x1f, 0x1c, 0x00, 0x24, 0x02, 0xf0, + 0x61, 0xfb, 0x18, 0x23, 0x06, 0x49, 0x58, 0x43, + 0x40, 0x18, 0x43, 0x68, 0x00, 0x2b, 0x05, 0xd0, + 0x3a, 0x1c, 0x31, 0x1c, 0x28, 0x1c, 0xfa, 0xf7, + 0x8e, 0xfb, 0x01, 0x24, 0x20, 0x1c, 0xf8, 0xbd, + 0x94, 0x67, 0x01, 0x00, 0x80, 0xb5, 0x07, 0xf0, + 0x3c, 0x00, 0xd0, 0x5c, 0x00, 0x00, 0xc5, 0xfa, + 0x09, 0x49, 0x08, 0x61, 0x08, 0x68, 0x00, 0x28, + 0x02, 0xd1, 0x7d, 0x20, 0x00, 0x01, 0x08, 0x60, + 0x08, 0x68, 0x7d, 0x21, 0xc9, 0x00, 0x41, 0x43, + 0x00, 0x23, 0x01, 0x22, 0x0a, 0x20, 0x0d, 0xf0, + 0x4e, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0xd4, 0x67, + 0x01, 0x00, 0x80, 0xb5, 0x01, 0x21, 0x0a, 0x20, + 0x0d, 0xf0, 0x97, 0xfc, 0x80, 0xbd, 0xf8, 0xb5, + 0x0e, 0x1c, 0x3c, 0x00, 0x0c, 0x5d, 0x00, 0x00, + 0x51, 0x68, 0x14, 0x1c, 0x12, 0x68, 0xa5, 0x68, + 0x0b, 0x1c, 0x75, 0x1b, 0x57, 0x19, 0x97, 0x42, + 0x00, 0xd2, 0x01, 0x31, 0x42, 0x68, 0x00, 0x25, + 0x8a, 0x42, 0x02, 0xdd, 0x01, 0x25, 0x62, 0x60, + 0x05, 0xe0, 0x9a, 0x42, 0x03, 0xd1, 0x01, 0x68, + 0xb9, 0x42, 0x00, 0xd9, 0x01, 0x25, 0x00, 0x2d, + 0x09, 0xd0, 0x01, 0x68, 0x21, 0x60, 0xa6, 0x60, + 0xa3, 0x8a, 0xe2, 0x8a, 0x3c, 0x00, 0x48, 0x5d, + 0x00, 0x00, 0x60, 0x68, 0x02, 0xf0, 0xd7, 0xfb, + 0x30, 0x1a, 0xe0, 0x60, 0x28, 0x1c, 0xf8, 0xbd, + 0x00, 0x00, 0x80, 0xb5, 0x02, 0xf0, 0x07, 0xfb, + 0x18, 0x23, 0x03, 0x49, 0x58, 0x43, 0x40, 0x18, + 0x18, 0x21, 0xfa, 0xf7, 0x98, 0xfb, 0x80, 0xbd, + 0x00, 0x00, 0x94, 0x67, 0x01, 0x00, 0xfe, 0xb5, + 0x04, 0x1c, 0x08, 0x1c, 0x11, 0x1c, 0x1e, 0x1c, + 0x0c, 0x25, 0x01, 0x22, 0x00, 0x92, 0x3c, 0x00, + 0x84, 0x5d, 0x00, 0x00, 0xa2, 0x69, 0x02, 0xab, + 0xfd, 0xf7, 0xf0, 0xf8, 0x00, 0x28, 0x45, 0xd0, + 0x02, 0x98, 0x27, 0x21, 0x02, 0x1c, 0x0a, 0x40, + 0x01, 0xd1, 0x08, 0x43, 0x02, 0x90, 0x21, 0x49, + 0xa0, 0x69, 0x08, 0x40, 0x06, 0xd0, 0x02, 0x98, + 0x01, 0x40, 0x03, 0xd1, 0x49, 0x21, 0xc9, 0x00, + 0x08, 0x43, 0x02, 0x90, 0xa0, 0x6d, 0x02, 0x99, + 0x88, 0x42, 0x30, 0xd0, 0x00, 0x2e, 0x2d, 0xd0, + 0x3c, 0x00, 0xc0, 0x5d, 0x00, 0x00, 0x40, 0x21, + 0x20, 0x1c, 0x58, 0x30, 0xfa, 0xf7, 0x69, 0xfb, + 0x02, 0x98, 0x00, 0x25, 0x00, 0x26, 0x37, 0x1c, + 0xa0, 0x65, 0x19, 0xe0, 0xc0, 0x07, 0x11, 0xd5, + 0xf0, 0x19, 0x00, 0x19, 0x70, 0x30, 0x05, 0x71, + 0x28, 0x1c, 0x04, 0xf0, 0xd4, 0xff, 0x00, 0x28, + 0x04, 0xd0, 0xa0, 0x19, 0x80, 0x30, 0x05, 0x72, + 0x01, 0x36, 0x03, 0xe0, 0xe0, 0x19, 0x60, 0x30, + 0x05, 0x70, 0x3c, 0x00, 0xfc, 0x5d, 0x00, 0x00, + 0x01, 0x37, 0x01, 0x35, 0x2d, 0x06, 0x02, 0x98, + 0x2d, 0x0e, 0x40, 0x08, 0x02, 0x90, 0x02, 0x98, + 0x00, 0x28, 0xe2, 0xd1, 0x84, 0x20, 0x06, 0x51, + 0xf0, 0x19, 0x20, 0x67, 0xe7, 0x65, 0x00, 0x25, + 0x00, 0xe0, 0x0b, 0x25, 0x28, 0x1c, 0xfe, 0xbd, + 0xd8, 0x3a, 0x00, 0x00, 0x38, 0xb5, 0x05, 0x1c, + 0x08, 0x1c, 0x11, 0x1c, 0x00, 0x24, 0xe2, 0x43, + 0x6b, 0x46, 0xff, 0xf7, 0x3c, 0x00, 0x38, 0x5e, + 0x00, 0x00, 0x4f, 0xfa, 0x00, 0x28, 0x05, 0xd0, + 0xa8, 0x69, 0x00, 0x99, 0x01, 0x40, 0x81, 0x42, + 0x00, 0xd1, 0x01, 0x24, 0x20, 0x1c, 0x38, 0xbd, + 0x00, 0x00, 0x7c, 0xb5, 0x05, 0x6a, 0x86, 0x69, + 0x04, 0x1c, 0xc0, 0x68, 0xfb, 0xf7, 0xb7, 0xfb, + 0xe1, 0x69, 0xfb, 0xf7, 0xda, 0xfa, 0x20, 0x1c, + 0xe2, 0x69, 0x40, 0x30, 0xc1, 0x8b, 0x12, 0x89, + 0x89, 0x18, 0xc1, 0x83, 0x06, 0x49, 0x3c, 0x00, + 0x74, 0x5e, 0x00, 0x00, 0x01, 0x94, 0x00, 0x91, + 0x28, 0x69, 0x33, 0x1c, 0x82, 0x88, 0x01, 0x68, + 0xe0, 0x68, 0xc0, 0x68, 0x00, 0xf0, 0xf2, 0xf9, + 0x7c, 0xbd, 0x00, 0x00, 0x91, 0x5e, 0x00, 0x00, + 0xb0, 0xb5, 0xd1, 0x68, 0x55, 0x69, 0xc8, 0x68, + 0x14, 0x1c, 0x14, 0x4b, 0x0c, 0xe0, 0x02, 0x68, + 0x9a, 0x42, 0x07, 0xd1, 0xc2, 0x68, 0xca, 0x60, + 0x00, 0x21, 0xc1, 0x60, 0x01, 0x60, 0xfb, 0xf7, + 0x3c, 0x00, 0xb0, 0x5e, 0x00, 0x00, 0x73, 0xfb, + 0x03, 0xe0, 0x01, 0x1c, 0xc0, 0x68, 0x00, 0x28, + 0xf0, 0xd1, 0xe0, 0x68, 0xc0, 0x68, 0xe8, 0x60, + 0xe0, 0x68, 0xc5, 0x60, 0x20, 0x1c, 0x40, 0x30, + 0xc1, 0x8b, 0x2a, 0x89, 0x89, 0x18, 0xc1, 0x83, + 0x20, 0x68, 0x00, 0x28, 0x02, 0xd0, 0xff, 0xf7, + 0xba, 0xff, 0xb0, 0xbd, 0x04, 0x48, 0x04, 0xf0, + 0x4e, 0xf9, 0x00, 0x6a, 0x07, 0xf0, 0x77, 0xfa, + 0xb0, 0xbd, 0x3c, 0x00, 0xec, 0x5e, 0x00, 0x00, + 0xa0, 0x7e, 0x01, 0x00, 0xa0, 0x6a, 0x01, 0x00, + 0xf1, 0xb5, 0x82, 0xb0, 0x02, 0x98, 0x06, 0x69, + 0x01, 0x1c, 0x08, 0x36, 0x60, 0x31, 0x45, 0x68, + 0x01, 0x91, 0x82, 0xe0, 0x10, 0x21, 0x00, 0x20, + 0x2f, 0x69, 0xfb, 0xf7, 0x63, 0xfb, 0x68, 0x61, + 0x01, 0x89, 0x08, 0x39, 0x09, 0x04, 0x09, 0x0c, + 0x01, 0x81, 0x68, 0x69, 0x00, 0x68, 0x40, 0x18, + 0x08, 0x21, 0xfb, 0xf7, 0x3c, 0x00, 0x28, 0x5f, + 0x00, 0x00, 0x57, 0xfb, 0xe8, 0x61, 0x68, 0x69, + 0x71, 0x88, 0x00, 0x68, 0x20, 0x22, 0x01, 0x80, + 0x71, 0x68, 0x41, 0x60, 0x01, 0x99, 0x49, 0x7b, + 0x89, 0x01, 0x11, 0x43, 0xc1, 0x70, 0x00, 0x21, + 0x81, 0x70, 0x28, 0x20, 0xfb, 0xf7, 0x75, 0xfc, + 0x39, 0x88, 0x04, 0x1c, 0xc1, 0x81, 0xa8, 0x6b, + 0x00, 0x28, 0x03, 0xd1, 0x01, 0x20, 0x80, 0x02, + 0x08, 0x43, 0xe0, 0x81, 0x06, 0x22, 0x3c, 0x00, + 0x64, 0x5f, 0x00, 0x00, 0x39, 0x1d, 0x20, 0x1c, + 0x10, 0x30, 0xfa, 0xf7, 0xc5, 0xfa, 0x39, 0x1c, + 0x0a, 0x31, 0x06, 0x22, 0x20, 0x1c, 0x16, 0x30, + 0x00, 0x90, 0xfa, 0xf7, 0xbd, 0xfa, 0x39, 0x1c, + 0x10, 0x31, 0x06, 0x22, 0x20, 0x1c, 0x1c, 0x30, + 0xfa, 0xf7, 0xb6, 0xfa, 0xe1, 0x89, 0x25, 0x4a, + 0x5c, 0x20, 0x11, 0x40, 0x01, 0x22, 0x92, 0x03, + 0x11, 0x43, 0x40, 0x5b, 0xe1, 0x81, 0x0f, 0x21, + 0x3c, 0x00, 0xa0, 0x5f, 0x00, 0x00, 0x08, 0x40, + 0x60, 0x84, 0x20, 0x1c, 0x20, 0x30, 0x16, 0x21, + 0x81, 0x71, 0x00, 0x21, 0x21, 0x70, 0xe9, 0x6b, + 0x00, 0x29, 0x07, 0xd0, 0x29, 0x69, 0x09, 0x8b, + 0x09, 0x07, 0x09, 0x0f, 0x21, 0x70, 0xa1, 0x84, + 0x18, 0x21, 0x81, 0x71, 0x06, 0x22, 0x60, 0x1c, + 0x00, 0x99, 0xfa, 0xf7, 0x94, 0xfa, 0x70, 0x68, + 0x00, 0x0e, 0xe0, 0x71, 0x70, 0x68, 0x00, 0x02, + 0x00, 0x0e, 0x3c, 0x00, 0xdc, 0x5f, 0x00, 0x00, + 0x20, 0x72, 0x70, 0x68, 0x00, 0x04, 0x00, 0x0e, + 0x60, 0x72, 0x70, 0x68, 0xa0, 0x72, 0x70, 0x88, + 0x00, 0x0a, 0xe0, 0x72, 0x70, 0x88, 0x20, 0x73, + 0x70, 0x88, 0x01, 0x30, 0x00, 0x04, 0x00, 0x0c, + 0x70, 0x80, 0x02, 0xd1, 0x70, 0x68, 0x01, 0x30, + 0x70, 0x60, 0xac, 0x61, 0x02, 0x98, 0x28, 0x62, + 0x2d, 0x68, 0x00, 0x2d, 0x00, 0xd0, 0x79, 0xe7, + 0x02, 0x98, 0x04, 0x49, 0x3c, 0x00, 0x18, 0x60, + 0x00, 0x00, 0x42, 0x68, 0x04, 0x48, 0x04, 0xf0, + 0x74, 0xf8, 0xfe, 0xbd, 0x00, 0x00, 0x8f, 0xc7, + 0xff, 0xff, 0x3d, 0xda, 0x00, 0x00, 0xa0, 0x6a, + 0x01, 0x00, 0xb0, 0xb5, 0x07, 0x4d, 0x28, 0x78, + 0x03, 0x28, 0x08, 0xd0, 0x00, 0x24, 0x2c, 0x70, + 0x69, 0x68, 0x00, 0x29, 0x03, 0xd0, 0x01, 0x20, + 0xfa, 0xf7, 0xc8, 0xf9, 0x6c, 0x60, 0xb0, 0xbd, + 0x00, 0x00, 0x9c, 0x73, 0x01, 0x00, 0x3c, 0x00, + 0x54, 0x60, 0x00, 0x00, 0xf8, 0xb5, 0x2b, 0x4b, + 0xd8, 0x6a, 0x00, 0x28, 0x50, 0xd0, 0x2a, 0x48, + 0x01, 0x1c, 0xff, 0x31, 0x01, 0x31, 0xca, 0x68, + 0x01, 0x32, 0xca, 0x60, 0x1a, 0x6c, 0x00, 0x2a, + 0x02, 0xd1, 0x4a, 0x69, 0x01, 0x32, 0x4a, 0x61, + 0x0a, 0x69, 0x01, 0x32, 0x0a, 0x61, 0xda, 0x68, + 0x00, 0x2a, 0x04, 0xd0, 0x1f, 0x4a, 0x01, 0x32, + 0x12, 0x78, 0x00, 0x2a, 0x02, 0xd1, 0x8a, 0x69, + 0x3c, 0x00, 0x90, 0x60, 0x00, 0x00, 0x01, 0x32, + 0x8a, 0x61, 0x00, 0x25, 0x07, 0x1d, 0x18, 0x26, + 0x1a, 0x4a, 0x6e, 0x43, 0x74, 0x32, 0x90, 0x59, + 0x00, 0x28, 0x29, 0xd0, 0xb4, 0x18, 0x60, 0x69, + 0x00, 0x28, 0x25, 0xd1, 0x60, 0x68, 0x00, 0x28, + 0x02, 0xd0, 0x01, 0x68, 0x00, 0x29, 0x05, 0xd1, + 0xa1, 0x68, 0x00, 0x29, 0x1c, 0xd0, 0x09, 0x68, + 0x00, 0x29, 0x19, 0xd0, 0x00, 0x28, 0x05, 0xd0, + 0xe1, 0x68, 0x3c, 0x00, 0xcc, 0x60, 0x00, 0x00, + 0x01, 0x31, 0xe1, 0x60, 0x00, 0x68, 0x81, 0x42, + 0x11, 0xd3, 0xa0, 0x68, 0x00, 0x28, 0x06, 0xd0, + 0x21, 0x69, 0x00, 0x68, 0x08, 0x18, 0x0c, 0xf0, + 0xa3, 0xfd, 0x00, 0x28, 0x07, 0xd0, 0x06, 0x4a, + 0x01, 0x20, 0x60, 0x61, 0x74, 0x32, 0x91, 0x59, + 0x38, 0x1c, 0xfa, 0xf7, 0x70, 0xf9, 0x01, 0x35, + 0x02, 0x2d, 0xcb, 0xdb, 0xf8, 0xbd, 0x00, 0x00, + 0x44, 0x7d, 0x01, 0x00, 0x3c, 0x00, 0x08, 0x61, + 0x00, 0x00, 0xf4, 0x67, 0x01, 0x00, 0xf8, 0xb5, + 0x0f, 0x1c, 0x00, 0x25, 0x04, 0x1c, 0x00, 0x28, + 0x25, 0xd0, 0x20, 0x1c, 0x04, 0xf0, 0x03, 0xfe, + 0x00, 0x28, 0x06, 0xd0, 0xff, 0xf7, 0xff, 0xf8, + 0x04, 0x1c, 0xff, 0xf7, 0x50, 0xfb, 0x06, 0x1c, + 0x07, 0xe0, 0x20, 0x1c, 0xff, 0xf7, 0x91, 0xfb, + 0x06, 0x1c, 0x20, 0x1c, 0xff, 0xf7, 0x6f, 0xfb, + 0x04, 0x1c, 0x00, 0x2e, 0x06, 0xd0, 0x3c, 0x00, + 0x44, 0x61, 0x00, 0x00, 0xff, 0xf7, 0x4c, 0xfb, + 0x00, 0x28, 0x02, 0xd0, 0x01, 0x25, 0x01, 0x20, + 0x07, 0xe0, 0x00, 0x2c, 0x06, 0xd0, 0xff, 0xf7, + 0xef, 0xf8, 0x00, 0x28, 0x02, 0xd0, 0x01, 0x25, + 0x00, 0x20, 0x38, 0x60, 0x28, 0x1c, 0xf8, 0xbd, + 0xb0, 0xb5, 0xc5, 0x68, 0x04, 0x1c, 0x0d, 0xf0, + 0x8f, 0xfc, 0x20, 0x7e, 0xc1, 0x07, 0x08, 0xd5, + 0xe1, 0x68, 0xa9, 0x42, 0x05, 0xd9, 0x22, 0x69, + 0x3c, 0x00, 0x80, 0x61, 0x00, 0x00, 0x91, 0x42, + 0x02, 0xd3, 0xe1, 0x8a, 0x01, 0x31, 0xe1, 0x82, + 0x81, 0x07, 0x08, 0xd5, 0xe1, 0x68, 0xa9, 0x42, + 0x05, 0xd2, 0x22, 0x69, 0x91, 0x42, 0x02, 0xd8, + 0xe1, 0x8a, 0x01, 0x31, 0xe1, 0x82, 0x40, 0x07, + 0x06, 0xd5, 0xe0, 0x68, 0x21, 0x69, 0x88, 0x42, + 0x02, 0xd1, 0xe0, 0x8a, 0x01, 0x30, 0xe0, 0x82, + 0xe0, 0x8a, 0xa1, 0x8a, 0x88, 0x42, 0x0d, 0xd3, + 0x60, 0x7e, 0x3c, 0x00, 0xbc, 0x61, 0x00, 0x00, + 0x02, 0x28, 0x0b, 0xd0, 0x20, 0x68, 0xe1, 0x68, + 0x04, 0x22, 0x07, 0xf0, 0x65, 0xfb, 0x60, 0x7e, + 0x00, 0x28, 0x03, 0xd1, 0x20, 0x68, 0x08, 0xf0, + 0xab, 0xff, 0xb0, 0xbd, 0x00, 0x20, 0xe0, 0x82, + 0xb0, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x06, 0x1c, + 0x0c, 0x23, 0x20, 0x49, 0x58, 0x43, 0x45, 0x18, + 0x00, 0x20, 0xa8, 0x60, 0x30, 0x1c, 0x06, 0xf0, + 0x91, 0xfe, 0x04, 0x1c, 0x3c, 0x00, 0xf8, 0x61, + 0x00, 0x00, 0x68, 0x60, 0x33, 0xd0, 0x01, 0x20, + 0xa8, 0x70, 0x2c, 0x20, 0x00, 0x5d, 0x02, 0x28, + 0x03, 0xd1, 0x20, 0x1c, 0x03, 0xf0, 0x45, 0xfe, + 0x10, 0xe0, 0x61, 0x6b, 0x00, 0x29, 0x0a, 0xd0, + 0x01, 0x28, 0x04, 0xd1, 0x21, 0x1c, 0x28, 0x1c, + 0x03, 0xf0, 0x55, 0xfe, 0x06, 0xe0, 0x20, 0x1c, + 0x0a, 0xf0, 0x0d, 0xfc, 0x02, 0xe0, 0x20, 0x1c, + 0x0a, 0xf0, 0x3d, 0xfb, 0x0d, 0x48, 0x3c, 0x00, + 0x34, 0x62, 0x00, 0x00, 0x14, 0x38, 0x41, 0x68, + 0x00, 0x29, 0x10, 0xd0, 0x20, 0x1c, 0x40, 0x30, + 0x02, 0x8b, 0x12, 0x07, 0x92, 0x0f, 0x01, 0x2a, + 0x09, 0xd0, 0x80, 0x8b, 0x32, 0x02, 0x00, 0x09, + 0x00, 0x04, 0x10, 0x43, 0x81, 0x22, 0x02, 0x43, + 0x0c, 0x20, 0x0d, 0xf0, 0xb7, 0xf9, 0x0c, 0xf0, + 0xa5, 0xfd, 0x60, 0x64, 0x70, 0xbd, 0x00, 0x00, + 0x60, 0x7b, 0x01, 0x00, 0xff, 0xb5, 0x08, 0x1c, + 0x3c, 0x00, 0x70, 0x62, 0x00, 0x00, 0x11, 0x1c, + 0x0c, 0x32, 0x20, 0x24, 0x14, 0x43, 0x0c, 0x4a, + 0x83, 0xb0, 0x0c, 0xae, 0x52, 0x68, 0x60, 0xce, + 0x94, 0x70, 0x00, 0x24, 0xd4, 0x70, 0x93, 0x63, + 0x0d, 0x23, 0x40, 0x27, 0xbb, 0x52, 0x94, 0x61, + 0x14, 0x84, 0x01, 0x22, 0x02, 0x92, 0x32, 0x1c, + 0x00, 0x90, 0x01, 0x91, 0x23, 0x1c, 0x29, 0x1c, + 0x03, 0x98, 0x00, 0xf0, 0x66, 0xf9, 0x07, 0xb0, + 0xf0, 0xbd, 0x3c, 0x00, 0xac, 0x62, 0x00, 0x00, + 0xa0, 0x7e, 0x01, 0x00, 0xf8, 0xb5, 0x04, 0x1c, + 0x00, 0x27, 0x11, 0x4e, 0x1d, 0xe0, 0xe0, 0x68, + 0x00, 0x28, 0x70, 0x68, 0x0c, 0xd1, 0x80, 0x88, + 0x00, 0x07, 0x0d, 0xd1, 0x01, 0x21, 0x0c, 0x48, + 0xfb, 0xf7, 0x84, 0xf9, 0xc4, 0x60, 0xe8, 0x60, + 0x70, 0x68, 0x81, 0x88, 0x01, 0x31, 0x02, 0xe0, + 0x81, 0x88, 0x22, 0x89, 0x89, 0x18, 0x81, 0x80, + 0xe0, 0x68, 0x39, 0x1c, 0x3c, 0x00, 0xe8, 0x62, + 0x00, 0x00, 0x00, 0x28, 0x01, 0xd1, 0x71, 0x68, + 0xc9, 0x6d, 0x25, 0x1c, 0x61, 0x60, 0x04, 0x1c, + 0x00, 0x2c, 0xdf, 0xd1, 0xf8, 0xbd, 0xa0, 0x7e, + 0x01, 0x00, 0x06, 0x49, 0x10, 0xb5, 0x49, 0x68, + 0x00, 0x23, 0x05, 0xe0, 0x8a, 0x88, 0x04, 0x89, + 0x12, 0x19, 0x8a, 0x80, 0x43, 0x60, 0xc0, 0x68, + 0x00, 0x28, 0xf7, 0xd1, 0x10, 0xbd, 0xa0, 0x7e, + 0x01, 0x00, 0x10, 0xb5, 0x09, 0x49, 0x3c, 0x00, + 0x24, 0x63, 0x00, 0x00, 0x00, 0x24, 0x49, 0x68, + 0x0a, 0xe0, 0x8a, 0x88, 0x03, 0x89, 0xd2, 0x18, + 0x8a, 0x80, 0xc3, 0x68, 0x22, 0x1c, 0x00, 0x2b, + 0x00, 0xd1, 0xca, 0x6d, 0x42, 0x60, 0x18, 0x1c, + 0x00, 0x28, 0xf2, 0xd1, 0x10, 0xbd, 0x00, 0x00, + 0xa0, 0x7e, 0x01, 0x00, 0x01, 0x1c, 0x13, 0x48, + 0x10, 0xb5, 0x40, 0x68, 0x00, 0x23, 0x09, 0xe0, + 0x82, 0x88, 0x0c, 0x89, 0x12, 0x19, 0x82, 0x80, + 0x3c, 0x00, 0x60, 0x63, 0x00, 0x00, 0x4b, 0x60, + 0xca, 0x68, 0x00, 0x2a, 0x00, 0xd1, 0x41, 0x66, + 0xc9, 0x68, 0x00, 0x29, 0xf3, 0xd1, 0x01, 0x1c, + 0x68, 0x31, 0x81, 0x64, 0xc3, 0x64, 0x43, 0x65, + 0x82, 0x88, 0x08, 0x23, 0x11, 0x1c, 0x08, 0x31, + 0x89, 0x07, 0x89, 0x0f, 0x59, 0x1a, 0x50, 0x23, + 0x19, 0x52, 0x51, 0x18, 0x81, 0x80, 0x01, 0x1c, + 0x40, 0x6e, 0x48, 0x31, 0xc1, 0x60, 0x10, 0xbd, + 0x00, 0x00, 0x3c, 0x00, 0x9c, 0x63, 0x00, 0x00, + 0xa0, 0x7e, 0x01, 0x00, 0x10, 0xb5, 0x07, 0x49, + 0x00, 0x24, 0x4b, 0x68, 0x06, 0xe0, 0xc2, 0x68, + 0x21, 0x1c, 0x00, 0x2a, 0x00, 0xd1, 0xd9, 0x6d, + 0x41, 0x60, 0x10, 0x1c, 0x00, 0x28, 0xf6, 0xd1, + 0x10, 0xbd, 0x00, 0x00, 0xa0, 0x7e, 0x01, 0x00, + 0x70, 0x47, 0x00, 0x00, 0xfe, 0xb5, 0x06, 0x1c, + 0x0c, 0x48, 0x0c, 0x1c, 0x40, 0x68, 0x80, 0x21, + 0x81, 0x70, 0x00, 0x21, 0x3c, 0x00, 0xd8, 0x63, + 0x00, 0x00, 0xc1, 0x70, 0x15, 0x1c, 0x40, 0x22, + 0x81, 0x63, 0x11, 0x52, 0x81, 0x61, 0x01, 0x84, + 0x00, 0x20, 0x04, 0x22, 0x02, 0x92, 0x00, 0x90, + 0x01, 0x91, 0x29, 0x1c, 0x20, 0x1c, 0x1a, 0x1c, + 0x33, 0x1c, 0x00, 0xf0, 0xbc, 0xf8, 0xfe, 0xbd, + 0x00, 0x00, 0xa0, 0x7e, 0x01, 0x00, 0x70, 0xb5, + 0x06, 0x1c, 0x17, 0x48, 0x80, 0x78, 0x02, 0x21, + 0x16, 0x4a, 0x88, 0x43, 0x90, 0x70, 0x3c, 0x00, + 0x14, 0x64, 0x00, 0x00, 0x10, 0x1c, 0x80, 0x78, + 0x08, 0x43, 0x11, 0x1c, 0x88, 0x70, 0x13, 0x48, + 0x00, 0x24, 0xc4, 0x70, 0x70, 0x20, 0xfb, 0xf7, + 0xd9, 0xf9, 0x11, 0x4d, 0x70, 0x21, 0x68, 0x60, + 0xfa, 0xf7, 0x34, 0xf8, 0x30, 0x07, 0x00, 0x0f, + 0x69, 0x68, 0x90, 0x30, 0xc8, 0x65, 0x0d, 0x48, + 0x68, 0x22, 0x08, 0x80, 0x08, 0x1c, 0x28, 0x30, + 0x89, 0x60, 0x48, 0x61, 0x08, 0x20, 0x08, 0x82, + 0x3c, 0x00, 0x50, 0x64, 0x00, 0x00, 0x08, 0x1c, + 0x38, 0x30, 0x48, 0x63, 0x20, 0x38, 0x48, 0x64, + 0x5a, 0x20, 0x50, 0x54, 0x06, 0x48, 0x08, 0x31, + 0x41, 0x64, 0x44, 0x65, 0x70, 0xbd, 0x00, 0x00, + 0x07, 0x00, 0x58, 0x00, 0x07, 0x00, 0xa0, 0x7e, + 0x01, 0x00, 0xde, 0xc0, 0x00, 0x00, 0x00, 0x30, + 0x07, 0x00, 0x0a, 0x4b, 0x10, 0xb5, 0x58, 0x6d, + 0x0a, 0x49, 0x00, 0x22, 0x49, 0x68, 0x00, 0x24, + 0x4a, 0x62, 0x3c, 0x00, 0x8c, 0x64, 0x00, 0x00, + 0x5c, 0x65, 0x4b, 0x6e, 0x00, 0x2b, 0x01, 0xd0, + 0xda, 0x60, 0x4a, 0x66, 0x8b, 0x6d, 0x00, 0x2b, + 0x03, 0xd0, 0x0a, 0x6e, 0x00, 0x21, 0xf9, 0xf7, + 0x9c, 0xff, 0x10, 0xbd, 0x00, 0x30, 0x07, 0x00, + 0xa0, 0x7e, 0x01, 0x00, 0x09, 0x49, 0x10, 0xb5, + 0x08, 0x88, 0x01, 0x30, 0x08, 0x80, 0x01, 0x20, + 0x07, 0x49, 0x80, 0x02, 0x08, 0x60, 0x07, 0x4c, + 0xa2, 0x6d, 0x00, 0x2a, 0x3c, 0x00, 0xc8, 0x64, + 0x00, 0x00, 0x05, 0xd0, 0x05, 0x21, 0xd1, 0x20, + 0x0d, 0xf0, 0x6f, 0xf9, 0x01, 0x20, 0xa0, 0x65, + 0x10, 0xbd, 0xb0, 0x74, 0x01, 0x00, 0x00, 0x10, + 0x07, 0x00, 0x00, 0x30, 0x07, 0x00, 0xff, 0xb5, + 0x83, 0xb0, 0x0c, 0xae, 0x86, 0x46, 0x8c, 0x46, + 0x0e, 0x4a, 0x43, 0xce, 0x0f, 0xad, 0x0f, 0x1c, + 0x52, 0x68, 0x0c, 0x37, 0x30, 0xcd, 0x97, 0x70, + 0xd3, 0x70, 0x96, 0x63, 0x0d, 0x26, 0x3c, 0x00, + 0x04, 0x65, 0x00, 0x00, 0x40, 0x27, 0xbe, 0x52, + 0x05, 0x9e, 0x96, 0x61, 0x13, 0x84, 0x00, 0x22, + 0x02, 0x92, 0x2a, 0x1c, 0x00, 0x90, 0x01, 0x91, + 0x21, 0x1c, 0x60, 0x46, 0x73, 0x46, 0x00, 0xf0, + 0x29, 0xf8, 0x07, 0xb0, 0xf0, 0xbd, 0x00, 0x00, + 0xa0, 0x7e, 0x01, 0x00, 0xff, 0xb5, 0x10, 0x1c, + 0x1a, 0x1c, 0x0c, 0x1c, 0x19, 0x1c, 0x60, 0x23, + 0xff, 0x32, 0x13, 0x43, 0x0c, 0x4a, 0x83, 0xb0, + 0x3c, 0x00, 0x40, 0x65, 0x00, 0x00, 0x0c, 0xae, + 0x52, 0x68, 0x60, 0xce, 0x93, 0x70, 0x00, 0x23, + 0xd3, 0x70, 0x93, 0x63, 0x40, 0x27, 0xbb, 0x52, + 0x93, 0x61, 0x13, 0x84, 0x03, 0x22, 0x02, 0x92, + 0x01, 0x91, 0x29, 0x1c, 0x32, 0x1c, 0x00, 0x90, + 0x20, 0x1c, 0x03, 0x9b, 0x00, 0xf0, 0x05, 0xf8, + 0x07, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xa0, 0x7e, + 0x01, 0x00, 0xf8, 0xb5, 0x05, 0x1c, 0x11, 0x48, + 0x1c, 0x1c, 0x3c, 0x00, 0x7c, 0x65, 0x00, 0x00, + 0x08, 0x9b, 0x07, 0x9f, 0x40, 0x68, 0xde, 0x00, + 0x81, 0x65, 0x02, 0x66, 0x00, 0x21, 0x81, 0x80, + 0x0d, 0x48, 0x81, 0x59, 0x20, 0x1c, 0xf9, 0xf7, + 0x22, 0xff, 0x0b, 0x48, 0x30, 0x18, 0x41, 0x68, + 0x28, 0x1c, 0xf9, 0xf7, 0x1c, 0xff, 0x07, 0x49, + 0x06, 0x98, 0x49, 0x68, 0x00, 0x2c, 0x88, 0x62, + 0x0f, 0x86, 0x00, 0xd1, 0x2c, 0x1c, 0x05, 0x48, + 0x4c, 0x62, 0x45, 0x65, 0x3c, 0x00, 0xb8, 0x65, + 0x00, 0x00, 0x01, 0x21, 0x01, 0x65, 0x01, 0x64, + 0xf8, 0xbd, 0xa0, 0x7e, 0x01, 0x00, 0x90, 0x52, + 0x01, 0x00, 0x00, 0x30, 0x07, 0x00, 0xff, 0xb5, + 0x83, 0xb0, 0x0d, 0xae, 0x60, 0xce, 0x0c, 0x9f, + 0x08, 0x1c, 0x11, 0x1c, 0xd2, 0x19, 0xff, 0x32, + 0x40, 0x24, 0x14, 0x43, 0x0b, 0x4a, 0x52, 0x68, + 0x94, 0x70, 0x00, 0x24, 0xd4, 0x70, 0x93, 0x63, + 0x40, 0x23, 0x9f, 0x52, 0x94, 0x61, 0x3c, 0x00, + 0xf4, 0x65, 0x00, 0x00, 0x14, 0x84, 0x02, 0x22, + 0x02, 0x92, 0x32, 0x1c, 0x00, 0x90, 0x01, 0x91, + 0x23, 0x1c, 0x29, 0x1c, 0x03, 0x98, 0xff, 0xf7, + 0xb5, 0xff, 0x07, 0xb0, 0xf0, 0xbd, 0x00, 0x00, + 0xa0, 0x7e, 0x01, 0x00, 0x4c, 0x21, 0x0d, 0x4a, + 0x41, 0x43, 0x10, 0xb5, 0x8c, 0x18, 0x0c, 0x49, + 0x09, 0x78, 0x88, 0x42, 0x07, 0xd1, 0x05, 0xf0, + 0xc7, 0xfd, 0x0a, 0x48, 0x01, 0x88, 0x01, 0x22, + 0x3c, 0x00, 0x30, 0x66, 0x00, 0x00, 0x12, 0x03, + 0x91, 0x43, 0x01, 0x80, 0x20, 0x1c, 0x30, 0x30, + 0x0c, 0x23, 0xc1, 0x56, 0x40, 0x7b, 0x81, 0x42, + 0x02, 0xdd, 0x20, 0x8d, 0x0c, 0xf0, 0xe5, 0xfb, + 0x10, 0xbd, 0x58, 0xe3, 0x01, 0x00, 0x3c, 0x7c, + 0x01, 0x00, 0x32, 0x80, 0x07, 0x00, 0x01, 0x1c, + 0x60, 0x31, 0x80, 0xb5, 0xca, 0x79, 0x8b, 0x79, + 0x9a, 0x42, 0x07, 0xd9, 0x48, 0x7a, 0x0c, 0x23, + 0x07, 0x49, 0x3c, 0x00, 0x6c, 0x66, 0x00, 0x00, + 0x58, 0x43, 0x08, 0x5a, 0x0c, 0xf0, 0xd0, 0xfb, + 0x80, 0xbd, 0x20, 0x30, 0x00, 0x7b, 0x01, 0x28, + 0xfa, 0xd1, 0x48, 0x7a, 0x05, 0xf0, 0x40, 0xfd, + 0x80, 0xbd, 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, + 0x10, 0xb5, 0x04, 0x1c, 0x1c, 0x21, 0xf9, 0xf7, + 0x03, 0xff, 0x03, 0x48, 0xa0, 0x80, 0xe0, 0x80, + 0x20, 0x81, 0x60, 0x81, 0xa0, 0x81, 0x10, 0xbd, + 0xff, 0xff, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0x66, + 0x00, 0x00, 0xff, 0xb5, 0x04, 0x1c, 0x00, 0x20, + 0x83, 0xb0, 0x0d, 0x1c, 0x06, 0x2c, 0x02, 0x90, + 0x38, 0xd2, 0x1f, 0x4a, 0xff, 0x26, 0xc1, 0x00, + 0x89, 0x18, 0x89, 0x78, 0xa1, 0x42, 0x03, 0xd1, + 0xc0, 0x00, 0x80, 0x18, 0x46, 0x78, 0x04, 0xe0, + 0x01, 0x30, 0x00, 0x06, 0x00, 0x16, 0x06, 0x28, + 0xf1, 0xdb, 0xff, 0x2e, 0x24, 0xd0, 0x01, 0x93, + 0x20, 0x1c, 0x0d, 0xf0, 0xe8, 0xf9, 0x3c, 0x00, + 0xe4, 0x66, 0x00, 0x00, 0x00, 0x28, 0x05, 0xd0, + 0x24, 0x21, 0x28, 0x1c, 0x01, 0xab, 0x02, 0xaa, + 0xfa, 0xf7, 0x30, 0xfe, 0x10, 0x49, 0xf0, 0x00, + 0x30, 0x39, 0x0f, 0x58, 0x31, 0x06, 0x09, 0x16, + 0x28, 0x1c, 0x05, 0x9a, 0x01, 0x9b, 0xf9, 0xf7, + 0x6e, 0xfe, 0x06, 0x1c, 0x10, 0xd1, 0x20, 0x1c, + 0x0d, 0xf0, 0xd0, 0xf9, 0x00, 0x28, 0x0b, 0xd0, + 0x28, 0x1c, 0x69, 0x69, 0xfa, 0xf7, 0x12, 0xfe, + 0x3c, 0x00, 0x20, 0x67, 0x00, 0x00, 0x02, 0x98, + 0x68, 0x61, 0x04, 0xe0, 0x06, 0x2c, 0x01, 0xd3, + 0x07, 0x26, 0x00, 0xe0, 0x08, 0x26, 0x30, 0x1c, + 0x07, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xcc, 0x5a, + 0x01, 0x00, 0x10, 0xb5, 0x0c, 0x1c, 0x09, 0xf0, + 0x86, 0xf8, 0x00, 0x28, 0x02, 0xd0, 0x20, 0x1c, + 0x09, 0xf0, 0xb5, 0xf8, 0x10, 0xbd, 0xfe, 0xb5, + 0x13, 0x4d, 0x04, 0x1c, 0xae, 0x69, 0x00, 0x2e, + 0x1c, 0xd0, 0x3c, 0x00, 0x5c, 0x67, 0x00, 0x00, + 0x10, 0x4f, 0x30, 0x37, 0x78, 0x68, 0x60, 0x43, + 0x01, 0x1c, 0x28, 0x88, 0xf9, 0xf7, 0xd2, 0xff, + 0x39, 0x68, 0x61, 0x43, 0x41, 0x18, 0x01, 0xa8, + 0x32, 0x1c, 0xf9, 0xf7, 0x37, 0xfe, 0x02, 0x98, + 0x29, 0x6a, 0x40, 0x18, 0x28, 0x62, 0x0b, 0xd4, + 0xe9, 0x69, 0x88, 0x42, 0x08, 0xd9, 0xa9, 0x69, + 0x40, 0x1a, 0x28, 0x62, 0x01, 0x98, 0x01, 0x30, + 0x01, 0xe0, 0x00, 0x20, 0x3c, 0x00, 0x98, 0x67, + 0x00, 0x00, 0x02, 0x90, 0x01, 0x90, 0x01, 0x98, + 0xfe, 0xbd, 0xc8, 0x74, 0x01, 0x00, 0xf8, 0xb5, + 0x00, 0x28, 0x28, 0xd0, 0x00, 0x24, 0x14, 0x4d, + 0x00, 0xe0, 0x01, 0x34, 0x61, 0x00, 0x09, 0x19, + 0x49, 0x19, 0x49, 0x78, 0x00, 0x29, 0xf8, 0xd1, + 0x63, 0x00, 0x1b, 0x19, 0x03, 0x33, 0x07, 0x22, + 0x69, 0x46, 0x03, 0xf0, 0xd4, 0xfb, 0x00, 0x2c, + 0x0f, 0xd0, 0x00, 0x20, 0x00, 0x99, 0x3c, 0x00, + 0xd4, 0x67, 0x00, 0x00, 0x0a, 0xe0, 0x42, 0x00, + 0x12, 0x18, 0xae, 0x5c, 0x53, 0x18, 0x52, 0x19, + 0x5e, 0x71, 0x56, 0x78, 0x01, 0x30, 0x9e, 0x71, + 0x92, 0x78, 0xda, 0x71, 0xa0, 0x42, 0xf2, 0xdb, + 0x00, 0x98, 0x03, 0x22, 0x02, 0x30, 0x03, 0x49, + 0xf9, 0xf7, 0x7e, 0xfe, 0xf8, 0xbd, 0x00, 0x00, + 0xeb, 0x62, 0x01, 0x00, 0xe8, 0x62, 0x01, 0x00, + 0xb0, 0xb5, 0x05, 0x1c, 0x08, 0x1c, 0xfa, 0xf7, + 0x3c, 0x00, 0x10, 0x68, 0x00, 0x00, 0x9d, 0xff, + 0x04, 0x1c, 0x28, 0x1c, 0xfa, 0xf7, 0xd9, 0xfe, + 0x21, 0x1c, 0xfa, 0xf7, 0xfc, 0xfd, 0x20, 0x1c, + 0xb0, 0xbd, 0xf3, 0xb5, 0x44, 0x48, 0x0c, 0x1c, + 0x00, 0x78, 0x81, 0xb0, 0x01, 0x28, 0x72, 0xd1, + 0xfa, 0xf7, 0x82, 0xf8, 0x41, 0x4d, 0xe8, 0x6a, + 0x41, 0x49, 0x08, 0x60, 0xe8, 0x6b, 0x48, 0x60, + 0x40, 0x48, 0xfa, 0xf7, 0xa6, 0xf9, 0xe8, 0x6a, + 0x00, 0x28, 0x3c, 0x00, 0x4c, 0x68, 0x00, 0x00, + 0xfc, 0xda, 0x22, 0x1c, 0x0f, 0x20, 0x01, 0x99, + 0x0a, 0xf0, 0xa4, 0xf8, 0x38, 0x4d, 0x02, 0x27, + 0x2f, 0x63, 0x38, 0x4a, 0x64, 0x26, 0x00, 0x20, + 0xaa, 0x21, 0x08, 0x32, 0x13, 0x18, 0x01, 0x30, + 0x00, 0x04, 0x00, 0x0c, 0x64, 0x28, 0x19, 0x74, + 0xf8, 0xd3, 0x16, 0x81, 0x00, 0x20, 0x50, 0x60, + 0x10, 0x1c, 0x10, 0x30, 0x10, 0x60, 0x00, 0x25, + 0x17, 0x1c, 0xd2, 0x60, 0x3c, 0x00, 0x88, 0x68, + 0x00, 0x00, 0x08, 0xe0, 0x28, 0x1c, 0xf9, 0xf7, + 0xa2, 0xff, 0x41, 0x31, 0x78, 0x19, 0x01, 0x35, + 0x2d, 0x04, 0x2d, 0x0c, 0x01, 0x74, 0xb5, 0x42, + 0xf4, 0xd3, 0x26, 0x4d, 0x6f, 0x63, 0x01, 0x20, + 0x28, 0x63, 0x24, 0x4d, 0xe8, 0x6a, 0x00, 0x28, + 0xfb, 0xda, 0x0b, 0x22, 0x3b, 0x1c, 0x24, 0x4e, + 0x03, 0xe0, 0x01, 0x32, 0x64, 0x2a, 0x00, 0xd1, + 0x00, 0x22, 0x10, 0x1c, 0x0c, 0x21, 0x3c, 0x00, + 0xc4, 0x68, 0x00, 0x00, 0x01, 0x39, 0x75, 0x5c, + 0x1f, 0x18, 0x3f, 0x7c, 0xbd, 0x42, 0xf3, 0xd1, + 0x01, 0x38, 0x00, 0xd5, 0x63, 0x20, 0x00, 0x29, + 0xf4, 0xd1, 0x18, 0x4e, 0x50, 0x1c, 0xf1, 0x6b, + 0x1a, 0x4a, 0x10, 0x1c, 0x01, 0x38, 0xfd, 0xd1, + 0xf0, 0x6b, 0x88, 0x42, 0x01, 0xd0, 0x01, 0x1c, + 0xf7, 0xe7, 0x02, 0x27, 0x37, 0x63, 0x16, 0x4d, + 0x90, 0x21, 0x28, 0x1c, 0xf9, 0xf7, 0xce, 0xfd, + 0x3c, 0x00, 0x00, 0x69, 0x00, 0x00, 0x28, 0x1c, + 0x28, 0x30, 0x28, 0x60, 0x28, 0x1c, 0x10, 0x30, + 0x2f, 0x81, 0xe8, 0x60, 0x28, 0x1c, 0x20, 0x30, + 0x28, 0x61, 0x04, 0x21, 0x00, 0xe0, 0x0c, 0xe0, + 0x29, 0x83, 0xe8, 0x61, 0xed, 0x62, 0x75, 0x63, + 0x01, 0x20, 0x30, 0x63, 0x22, 0x1c, 0x89, 0x20, + 0x01, 0x99, 0x0a, 0xf0, 0x38, 0xf8, 0x00, 0x20, + 0x28, 0x63, 0xfe, 0xbd, 0x00, 0x00, 0x08, 0x57, + 0x01, 0x00, 0x3c, 0x00, 0x3c, 0x69, 0x00, 0x00, + 0x00, 0x30, 0x07, 0x00, 0x10, 0x8e, 0x01, 0x00, + 0x74, 0xff, 0x01, 0x00, 0x09, 0x57, 0x01, 0x00, + 0x20, 0x4e, 0x00, 0x00, 0xe4, 0xfe, 0x01, 0x00, + 0x80, 0xb5, 0x13, 0x28, 0x1e, 0xd0, 0xf0, 0x28, + 0x16, 0xd1, 0x09, 0xf0, 0xb5, 0xf9, 0x00, 0x28, + 0x13, 0xd1, 0x0d, 0xf0, 0xbf, 0xfa, 0x11, 0xf0, + 0x0d, 0xfc, 0x00, 0x22, 0x04, 0x21, 0xc4, 0x20, + 0x0c, 0xf0, 0x1c, 0xff, 0x3c, 0x00, 0x78, 0x69, + 0x00, 0x00, 0x09, 0x48, 0x00, 0x21, 0x00, 0x78, + 0x05, 0xf0, 0x3f, 0xfd, 0x05, 0xf0, 0x93, 0xf8, + 0x07, 0x49, 0x01, 0x20, 0x08, 0x60, 0x80, 0xbd, + 0x01, 0x1c, 0x01, 0x20, 0xfa, 0xf7, 0x87, 0xfc, + 0x80, 0xbd, 0x00, 0xf0, 0x32, 0xf8, 0x80, 0xbd, + 0x00, 0x00, 0x6a, 0x57, 0x01, 0x00, 0x3c, 0xd9, + 0x01, 0x00, 0xb0, 0xb5, 0x0c, 0xf0, 0xff, 0xf9, + 0x0b, 0x49, 0x02, 0x24, 0x48, 0x60, 0x3c, 0x00, + 0xb4, 0x69, 0x00, 0x00, 0x0a, 0x48, 0x04, 0x61, + 0x01, 0x20, 0x77, 0x21, 0x09, 0x03, 0x08, 0x61, + 0x08, 0x4d, 0x68, 0x68, 0x80, 0x07, 0x02, 0xd4, + 0x68, 0x68, 0x20, 0x43, 0x68, 0x60, 0x09, 0xf0, + 0xc7, 0xf9, 0x68, 0x68, 0xa0, 0x43, 0x68, 0x60, + 0x00, 0x20, 0xb0, 0xbd, 0xe0, 0x60, 0x01, 0x00, + 0x00, 0x30, 0x07, 0x00, 0x00, 0x01, 0x07, 0x00, + 0x80, 0xb5, 0x01, 0x23, 0x03, 0x22, 0x00, 0x21, + 0x3c, 0x00, 0xf0, 0x69, 0x00, 0x00, 0x02, 0x20, + 0x3c, 0xf0, 0xf1, 0xfa, 0x00, 0x28, 0x01, 0xd0, + 0xfa, 0xf7, 0x81, 0xfc, 0x80, 0xbd, 0x1c, 0xb5, + 0xfc, 0xf7, 0xf5, 0xfa, 0xfa, 0xf7, 0x19, 0xfe, + 0x01, 0xf0, 0x03, 0xf9, 0x00, 0x24, 0x21, 0x1c, + 0x68, 0x46, 0x01, 0xf0, 0xe2, 0xfb, 0x00, 0xab, + 0x18, 0x78, 0x01, 0x28, 0x03, 0xd0, 0x02, 0x28, + 0x01, 0xd0, 0x03, 0x28, 0x01, 0xd1, 0x0c, 0xf0, + 0xb2, 0xfc, 0x3c, 0x00, 0x2c, 0x6a, 0x00, 0x00, + 0x01, 0x34, 0x24, 0x06, 0x24, 0x16, 0x06, 0x2c, + 0xec, 0xdb, 0xfa, 0xf7, 0x09, 0xf9, 0xfa, 0xf7, + 0xe7, 0xfc, 0xfa, 0xf7, 0x33, 0xfa, 0xfa, 0xf7, + 0x6d, 0xfa, 0xfb, 0xf7, 0xdf, 0xff, 0x05, 0xf0, + 0x4d, 0xfb, 0x06, 0xf0, 0x81, 0xfc, 0x0b, 0xf0, + 0x7d, 0xf9, 0x07, 0xf0, 0x29, 0xfc, 0x11, 0x48, + 0x10, 0x21, 0x01, 0x60, 0x09, 0x01, 0x01, 0x60, + 0xc9, 0x02, 0x01, 0x60, 0x3c, 0x00, 0x68, 0x6a, + 0x00, 0x00, 0x89, 0x00, 0x01, 0x60, 0x20, 0x21, + 0x01, 0x60, 0x04, 0x21, 0x01, 0x60, 0x08, 0x21, + 0x01, 0x60, 0x40, 0x21, 0x01, 0x60, 0x80, 0x21, + 0x01, 0x60, 0x89, 0x00, 0x01, 0x60, 0x49, 0x00, + 0x01, 0x60, 0x49, 0x00, 0x01, 0x60, 0x49, 0x00, + 0x01, 0x60, 0xc9, 0x03, 0x01, 0x60, 0x89, 0x0b, + 0x01, 0x60, 0xf9, 0xf7, 0x41, 0xff, 0x1c, 0xbd, + 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x3c, 0x00, + 0xa4, 0x6a, 0x00, 0x00, 0x80, 0xb5, 0x3b, 0xf0, + 0x4f, 0xf8, 0x3b, 0xf0, 0x7d, 0xf9, 0xfa, 0xf7, + 0x4b, 0xf9, 0x80, 0xbd, 0xf8, 0xb5, 0x00, 0x25, + 0x00, 0x24, 0x00, 0x22, 0x00, 0x28, 0x71, 0xd0, + 0x43, 0x4f, 0xb9, 0x68, 0x0b, 0x1a, 0xbb, 0x60, + 0xf8, 0x68, 0x39, 0x1c, 0x01, 0x30, 0xf8, 0x60, + 0x89, 0x6a, 0x00, 0x2b, 0x1e, 0xdc, 0x02, 0x24, + 0x00, 0x29, 0x06, 0xda, 0xfb, 0x69, 0x98, 0x42, + 0x3c, 0x00, 0xe0, 0x6a, 0x00, 0x00, 0x06, 0xdd, + 0x3b, 0x69, 0x98, 0x42, 0x09, 0xdd, 0x07, 0xe0, + 0xbb, 0x69, 0x98, 0x42, 0x01, 0xdc, 0x01, 0x24, + 0x03, 0xe0, 0x7b, 0x69, 0x98, 0x42, 0x00, 0xdd, + 0x03, 0x24, 0x78, 0x6a, 0x00, 0x28, 0x08, 0xd0, + 0x00, 0x20, 0x78, 0x62, 0x03, 0x2c, 0x01, 0xd1, + 0x02, 0x24, 0x02, 0xe0, 0x02, 0x2c, 0x00, 0xd1, + 0x01, 0x24, 0x2e, 0x48, 0x01, 0x2c, 0x00, 0x79, + 0x18, 0xd1, 0x3c, 0x00, 0x1c, 0x6b, 0x00, 0x00, + 0xbb, 0x78, 0x99, 0x42, 0x15, 0xda, 0x3b, 0x78, + 0x7b, 0x70, 0x39, 0x70, 0x01, 0x31, 0xb9, 0x62, + 0x01, 0xd5, 0x01, 0x31, 0xb9, 0x62, 0xb9, 0x6a, + 0x01, 0x25, 0x99, 0x42, 0x03, 0xd1, 0x04, 0x28, + 0x04, 0xd2, 0x01, 0x30, 0x00, 0xe0, 0x00, 0x20, + 0x38, 0x71, 0x01, 0x22, 0x00, 0x29, 0x33, 0xda, + 0x27, 0xe0, 0x03, 0x2c, 0x35, 0xd1, 0x00, 0x26, + 0x00, 0x28, 0x07, 0xd0, 0x3c, 0x00, 0x58, 0x6b, + 0x00, 0x00, 0x1e, 0x49, 0x81, 0x40, 0x38, 0x6a, + 0x08, 0x18, 0x0c, 0xf0, 0x5c, 0xf8, 0x00, 0x28, + 0x2c, 0xd0, 0x1b, 0x48, 0x00, 0x78, 0x40, 0x07, + 0x05, 0xd5, 0xf8, 0x68, 0x39, 0x69, 0x88, 0x42, + 0x01, 0xdb, 0x03, 0x23, 0xfe, 0x56, 0xb8, 0x6a, + 0xb0, 0x42, 0x12, 0xdd, 0x01, 0x21, 0x79, 0x62, + 0x39, 0x78, 0x01, 0x25, 0x79, 0x70, 0x38, 0x70, + 0x01, 0x38, 0xb8, 0x62, 0x88, 0x42, 0x3c, 0x00, + 0x94, 0x6b, 0x00, 0x00, 0x01, 0xd0, 0x00, 0x21, + 0x39, 0x71, 0x00, 0x28, 0x0c, 0xda, 0x07, 0x20, + 0x38, 0x71, 0x00, 0xe0, 0x12, 0xe0, 0x07, 0xe0, + 0x38, 0x79, 0x00, 0x28, 0x09, 0xd0, 0xff, 0x30, + 0x38, 0x71, 0x06, 0xe0, 0x00, 0x2a, 0x02, 0xd0, + 0x0c, 0xf0, 0xf8, 0xf8, 0x38, 0x62, 0x00, 0x2c, + 0x04, 0xd0, 0xfe, 0xf7, 0x97, 0xfd, 0x29, 0x1c, + 0x08, 0xf0, 0xfc, 0xfb, 0xf8, 0xbd, 0x00, 0x00, + 0x3c, 0x00, 0xd0, 0x6b, 0x00, 0x00, 0xac, 0x7e, + 0x01, 0x00, 0x50, 0xc3, 0x00, 0x00, 0x1d, 0x75, + 0x01, 0x00, 0x80, 0xb5, 0x10, 0x68, 0x00, 0x28, + 0x02, 0xd0, 0x00, 0xf0, 0x0a, 0xf8, 0x80, 0xbd, + 0x03, 0x48, 0xc0, 0x69, 0x80, 0x68, 0x08, 0xf0, + 0xb2, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x84, 0x6a, + 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0xc0, 0x68, + 0xc0, 0x68, 0x00, 0x28, 0x01, 0xd1, 0xfa, 0xf7, + 0x7a, 0xfb, 0x3c, 0x00, 0x0c, 0x6c, 0x00, 0x00, + 0xe0, 0x68, 0xe1, 0x69, 0xc0, 0x68, 0x23, 0x1c, + 0x01, 0x4a, 0xff, 0xf7, 0xd7, 0xfb, 0x10, 0xbd, + 0xdd, 0x6b, 0x00, 0x00, 0xb0, 0xb5, 0x05, 0x1c, + 0x0c, 0x21, 0x00, 0x20, 0xfa, 0xf7, 0xd6, 0xfc, + 0x04, 0x1c, 0x00, 0x68, 0x00, 0x21, 0x41, 0x60, + 0x01, 0x60, 0x29, 0x88, 0x01, 0x81, 0x69, 0x88, + 0x41, 0x81, 0x29, 0x1c, 0xff, 0x31, 0x21, 0x31, + 0x20, 0x1c, 0x03, 0xf0, 0x3c, 0x00, 0x48, 0x6c, + 0x00, 0x00, 0x77, 0xf9, 0x29, 0x1c, 0xff, 0x31, + 0x46, 0x31, 0x20, 0x1c, 0x03, 0xf0, 0x71, 0xf9, + 0x29, 0x1c, 0xff, 0x31, 0x50, 0x31, 0x20, 0x1c, + 0x03, 0xf0, 0x6b, 0xf9, 0x29, 0x1c, 0xff, 0x31, + 0x43, 0x31, 0x20, 0x1c, 0x03, 0xf0, 0x65, 0xf9, + 0x29, 0x1c, 0xff, 0x31, 0x63, 0x31, 0x20, 0x1c, + 0x03, 0xf0, 0x5f, 0xf9, 0x04, 0x48, 0x00, 0x68, + 0x00, 0x28, 0x02, 0xd0, 0x20, 0x1c, 0x3c, 0x00, + 0x84, 0x6c, 0x00, 0x00, 0xff, 0xf7, 0x8e, 0xfd, + 0x20, 0x1c, 0xb0, 0xbd, 0xe4, 0x62, 0x01, 0x00, + 0xf8, 0xb5, 0x05, 0x1c, 0x0c, 0x1c, 0x04, 0xd1, + 0x05, 0x21, 0x18, 0x20, 0xfa, 0xf7, 0x02, 0xfb, + 0x4d, 0xe0, 0x29, 0x1c, 0x12, 0x31, 0x06, 0x22, + 0x60, 0x1c, 0xf9, 0xf7, 0x25, 0xfc, 0x22, 0x1c, + 0x30, 0x32, 0x00, 0x26, 0x00, 0x21, 0x00, 0x20, + 0x16, 0x70, 0x34, 0x4b, 0x1b, 0x5c, 0x2f, 0x8a, + 0x3c, 0x00, 0xc0, 0x6c, 0x00, 0x00, 0xdf, 0x40, + 0xff, 0x07, 0x07, 0xd5, 0x17, 0x78, 0x01, 0x33, + 0x01, 0x37, 0x17, 0x70, 0x67, 0x18, 0x30, 0x37, + 0x7b, 0x70, 0x01, 0x31, 0x01, 0x30, 0x0e, 0x28, + 0xee, 0xdb, 0xa8, 0x7b, 0x60, 0x72, 0x10, 0x78, + 0x00, 0x28, 0x2b, 0xd0, 0x2a, 0x48, 0x1e, 0x21, + 0x09, 0x5c, 0x27, 0x1c, 0x10, 0x37, 0x21, 0x72, + 0x01, 0x68, 0x61, 0x81, 0xc1, 0x89, 0x21, 0x77, + 0x81, 0x89, 0x3c, 0x00, 0xfc, 0x6c, 0x00, 0x00, + 0x79, 0x73, 0xc1, 0x8a, 0xa1, 0x81, 0x01, 0x8b, + 0xe1, 0x81, 0x42, 0x8a, 0x21, 0x1c, 0x60, 0x31, + 0x4a, 0x80, 0x82, 0x8a, 0x8a, 0x80, 0x1f, 0x49, + 0x2c, 0x31, 0x09, 0x7a, 0x00, 0x29, 0x09, 0xd0, + 0x02, 0x29, 0x0a, 0xd1, 0x01, 0x22, 0x62, 0x62, + 0x62, 0x72, 0x42, 0x8b, 0xa2, 0x81, 0x80, 0x8b, + 0xe0, 0x81, 0x03, 0xe0, 0x01, 0x21, 0x66, 0x62, + 0x00, 0xe0, 0x00, 0x21, 0x3c, 0x00, 0x38, 0x6d, + 0x00, 0x00, 0xe8, 0x7b, 0x08, 0x40, 0x01, 0xd1, + 0x00, 0x20, 0xf8, 0xbd, 0xa8, 0x68, 0x43, 0x1c, + 0x09, 0xd0, 0x22, 0x1c, 0x12, 0x32, 0x00, 0x92, + 0x93, 0x1d, 0x02, 0x32, 0x21, 0x1c, 0x01, 0xf0, + 0x9c, 0xfa, 0xa0, 0x62, 0x00, 0xe0, 0xa6, 0x62, + 0x68, 0x7b, 0x29, 0x1c, 0x1d, 0x31, 0x20, 0x74, + 0x0b, 0x48, 0x20, 0x22, 0x20, 0x62, 0x20, 0x1c, + 0x42, 0x30, 0xbe, 0x73, 0xf9, 0xf7, 0x3c, 0x00, + 0x74, 0x6d, 0x00, 0x00, 0xc1, 0xfb, 0x40, 0x34, + 0x26, 0x70, 0x68, 0x7e, 0x04, 0x49, 0x60, 0x70, + 0x68, 0x68, 0x2c, 0x31, 0x48, 0x60, 0x01, 0x20, + 0xda, 0xe7, 0x00, 0x00, 0x90, 0x58, 0x01, 0x00, + 0xc8, 0x6e, 0x01, 0x00, 0x91, 0x02, 0x01, 0x00, + 0x70, 0xb5, 0x16, 0x1c, 0x0d, 0x1c, 0x04, 0x1c, + 0x00, 0x28, 0x06, 0xd0, 0x0c, 0x20, 0xfa, 0xf7, + 0x47, 0xfd, 0x30, 0xc0, 0x08, 0x38, 0x06, 0x72, + 0x3c, 0x00, 0xb0, 0x6d, 0x00, 0x00, 0x70, 0xbd, + 0x00, 0x20, 0x70, 0xbd, 0x00, 0x00, 0x01, 0x1c, + 0x05, 0x48, 0x80, 0xb5, 0x00, 0x68, 0x01, 0xd0, + 0x01, 0x21, 0x00, 0xe0, 0x00, 0x21, 0xfc, 0xf7, + 0xa0, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x0c, 0x79, + 0x01, 0x00, 0x70, 0xb5, 0x0e, 0x1c, 0x04, 0x1c, + 0x00, 0x28, 0x01, 0xd1, 0xfa, 0xf7, 0x8f, 0xfa, + 0x06, 0x4d, 0x28, 0x68, 0x00, 0x28, 0x01, 0xd0, + 0xfa, 0xf7, 0x3c, 0x00, 0xec, 0x6d, 0x00, 0x00, + 0x89, 0xfa, 0x04, 0x48, 0x2e, 0x60, 0xc4, 0x60, + 0x01, 0x21, 0x01, 0x70, 0x70, 0xbd, 0x00, 0x00, + 0xa8, 0x7e, 0x01, 0x00, 0x30, 0x00, 0x07, 0x00, + 0x10, 0xb5, 0x07, 0x4c, 0x20, 0x68, 0x00, 0x28, + 0x01, 0xd1, 0xfa, 0xf7, 0x77, 0xfa, 0x05, 0x48, + 0x00, 0x69, 0x21, 0x68, 0xf9, 0xf7, 0xdf, 0xfa, + 0x00, 0x20, 0x20, 0x60, 0x10, 0xbd, 0x00, 0x00, + 0xa8, 0x7e, 0x01, 0x00, 0x3c, 0x00, 0x28, 0x6e, + 0x00, 0x00, 0x30, 0x00, 0x07, 0x00, 0x01, 0x20, + 0x05, 0x49, 0xc0, 0x06, 0x80, 0xb5, 0x08, 0x60, + 0x00, 0x22, 0x03, 0x21, 0x54, 0x20, 0x0c, 0xf0, + 0xb8, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x10, + 0x07, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x04, 0x21, + 0xc4, 0x20, 0x0c, 0xf0, 0xae, 0xfc, 0x80, 0xbd, + 0x00, 0x00, 0x04, 0x48, 0x80, 0xb5, 0x00, 0x88, + 0x02, 0x49, 0xff, 0xf7, 0xb8, 0xff, 0x3c, 0x00, + 0x64, 0x6e, 0x00, 0x00, 0x80, 0xbd, 0x00, 0x00, + 0x75, 0x4b, 0x00, 0x00, 0xc8, 0x74, 0x01, 0x00, + 0xf8, 0xb5, 0x06, 0x1c, 0x31, 0x48, 0x00, 0x25, + 0xc0, 0x68, 0x0c, 0x1c, 0x00, 0x28, 0x30, 0xd0, + 0x2e, 0x48, 0x2f, 0x4f, 0x04, 0x30, 0x00, 0x78, + 0x38, 0x76, 0x2c, 0x48, 0x04, 0x30, 0x40, 0x78, + 0x38, 0x81, 0x00, 0x2a, 0x0b, 0xd0, 0xf9, 0xf7, + 0xa5, 0xfa, 0x1f, 0x20, 0xb8, 0x76, 0x20, 0x1c, + 0x3c, 0x00, 0xa0, 0x6e, 0x00, 0x00, 0xf9, 0xf7, + 0xf6, 0xf9, 0x25, 0x48, 0x04, 0x30, 0x80, 0x78, + 0xb8, 0x76, 0x43, 0xe0, 0x25, 0x48, 0x22, 0x49, + 0x84, 0x42, 0x4d, 0x69, 0x02, 0xd2, 0x6c, 0x43, + 0xe4, 0x0b, 0x0f, 0xe0, 0x1f, 0x48, 0x21, 0x1c, + 0x80, 0x6a, 0x00, 0x90, 0xf9, 0xf7, 0x23, 0xfc, + 0x00, 0x99, 0x02, 0x1c, 0x4a, 0x43, 0xa1, 0x1a, + 0x1a, 0x4a, 0x69, 0x43, 0x52, 0x6a, 0xc9, 0x0b, + 0x50, 0x43, 0x3c, 0x00, 0xdc, 0x6e, 0x00, 0x00, + 0x44, 0x18, 0x02, 0x2c, 0x01, 0xd8, 0x00, 0x20, + 0xf8, 0xbd, 0xf9, 0xf7, 0x7d, 0xfa, 0x1f, 0x20, + 0xb8, 0x76, 0x20, 0x1c, 0xf9, 0xf7, 0xae, 0xf9, + 0x04, 0x1c, 0x11, 0x48, 0x04, 0x30, 0x80, 0x78, + 0xb8, 0x76, 0x0f, 0x4f, 0x7d, 0x6a, 0xac, 0x42, + 0x04, 0xd2, 0x20, 0x1c, 0xff, 0xf7, 0x22, 0xfc, + 0x05, 0x1c, 0x12, 0xe0, 0x21, 0x1c, 0x28, 0x1c, + 0xf9, 0xf7, 0xfc, 0xfb, 0x3c, 0x00, 0x18, 0x6f, + 0x00, 0x00, 0x06, 0x1c, 0x68, 0x43, 0x20, 0x1a, + 0xff, 0xf7, 0x17, 0xfc, 0x05, 0x1c, 0x00, 0x24, + 0x04, 0xe0, 0x78, 0x6a, 0xff, 0xf7, 0x11, 0xfc, + 0x45, 0x19, 0x01, 0x34, 0xb4, 0x42, 0xf8, 0xd3, + 0x28, 0x1c, 0xd4, 0xe7, 0x00, 0x00, 0xc8, 0x74, + 0x01, 0x00, 0x30, 0x00, 0x07, 0x00, 0xc0, 0xc6, + 0x2d, 0x00, 0x01, 0x1c, 0x7d, 0x20, 0x80, 0xb5, + 0xc0, 0x00, 0xf9, 0xf7, 0x72, 0xfb, 0x3c, 0x00, + 0x54, 0x6f, 0x00, 0x00, 0x02, 0x49, 0x88, 0x61, + 0x40, 0x08, 0xc8, 0x61, 0x80, 0xbd, 0x00, 0x00, + 0xc8, 0x74, 0x01, 0x00, 0x10, 0xb5, 0x06, 0x4c, + 0x21, 0x1c, 0x00, 0x20, 0x0b, 0xf0, 0x42, 0xfa, + 0x21, 0x1c, 0x00, 0x20, 0x0b, 0xf0, 0x0a, 0xfa, + 0x00, 0xf0, 0x68, 0xfe, 0x10, 0xbd, 0x00, 0x00, + 0x85, 0x6f, 0x00, 0x00, 0x30, 0xb5, 0x0f, 0x4d, + 0x2a, 0x78, 0x04, 0x2a, 0x19, 0xd8, 0x00, 0x2a, + 0x3c, 0x00, 0x90, 0x6f, 0x00, 0x00, 0x17, 0xd0, + 0x00, 0x21, 0x07, 0xe0, 0x4b, 0x00, 0x5b, 0x18, + 0x5c, 0x19, 0x01, 0x23, 0xe4, 0x56, 0x84, 0x42, + 0x02, 0xda, 0x01, 0x31, 0x8a, 0x42, 0xf5, 0xdc, + 0x8a, 0x42, 0x00, 0xd1, 0x01, 0x39, 0x48, 0x00, + 0x40, 0x18, 0x40, 0x19, 0x81, 0x78, 0x02, 0x4a, + 0x34, 0x3a, 0x11, 0x70, 0xc0, 0x78, 0x50, 0x70, + 0x30, 0xbd, 0x00, 0x75, 0x01, 0x00, 0x30, 0xb5, + 0x11, 0x1c, 0x3c, 0x00, 0xcc, 0x6f, 0x00, 0x00, + 0x38, 0x31, 0x85, 0xb0, 0x91, 0x62, 0x08, 0x21, + 0x11, 0x86, 0x00, 0x23, 0x14, 0x1c, 0x01, 0x1c, + 0x53, 0x63, 0xc0, 0x68, 0x15, 0x4d, 0x0b, 0xe0, + 0x02, 0x68, 0xaa, 0x42, 0x06, 0xd1, 0xc2, 0x68, + 0xca, 0x60, 0xc3, 0x60, 0x03, 0x60, 0xfa, 0xf7, + 0xd1, 0xfa, 0x03, 0xe0, 0x01, 0x1c, 0xc0, 0x68, + 0x00, 0x28, 0xf1, 0xd1, 0x22, 0x1c, 0x40, 0x32, + 0x08, 0x21, 0x20, 0x68, 0x3c, 0x00, 0x08, 0x70, + 0x00, 0x00, 0xfa, 0xf7, 0x64, 0xfb, 0x0b, 0x49, + 0x20, 0x1c, 0x48, 0x30, 0x02, 0x90, 0x04, 0x94, + 0x03, 0x91, 0xe0, 0x69, 0x82, 0x88, 0x01, 0x68, + 0x6e, 0x20, 0x01, 0x92, 0x00, 0x91, 0x22, 0x1c, + 0x56, 0x32, 0x03, 0x5d, 0x21, 0x1c, 0x28, 0x31, + 0x20, 0x68, 0xff, 0xf7, 0x58, 0xfa, 0x05, 0xb0, + 0x30, 0xbd, 0xa0, 0x7e, 0x01, 0x00, 0xd5, 0x70, + 0x00, 0x00, 0x1c, 0xb5, 0x07, 0x49, 0x3c, 0x00, + 0x44, 0x70, 0x00, 0x00, 0x02, 0x1c, 0x01, 0x90, + 0x00, 0x91, 0xc0, 0x69, 0x13, 0x1c, 0x84, 0x88, + 0x01, 0x68, 0x10, 0x68, 0x48, 0x33, 0x22, 0x1c, + 0xff, 0xf7, 0x08, 0xf9, 0x1c, 0xbd, 0x00, 0x00, + 0xc9, 0x6f, 0x00, 0x00, 0x10, 0xb5, 0x14, 0x1c, + 0x18, 0x48, 0x03, 0xf0, 0x89, 0xf8, 0xa0, 0x42, + 0x01, 0xd0, 0xfa, 0xf7, 0x45, 0xf9, 0x04, 0x22, + 0x20, 0x1c, 0x40, 0x30, 0xa1, 0x6a, 0xf9, 0xf7, + 0x3c, 0x00, 0x80, 0x70, 0x00, 0x00, 0xbd, 0xf9, + 0x00, 0x28, 0x02, 0xd1, 0x01, 0x20, 0x20, 0x62, + 0x05, 0xe0, 0x00, 0x20, 0x20, 0x62, 0x84, 0x20, + 0x00, 0x5d, 0x00, 0x28, 0x03, 0xd1, 0x20, 0x1c, + 0x09, 0xf0, 0x23, 0xfb, 0x05, 0xe0, 0x20, 0x68, + 0xfa, 0xf7, 0x79, 0xfa, 0x20, 0x1c, 0xfa, 0xf7, + 0xa4, 0xfb, 0xe0, 0x69, 0x80, 0x79, 0x06, 0x28, + 0x06, 0xd1, 0x20, 0x6a, 0x06, 0x49, 0x00, 0x28, + 0x03, 0xd0, 0x3c, 0x00, 0xbc, 0x70, 0x00, 0x00, + 0x08, 0x69, 0x01, 0x30, 0x08, 0x61, 0x10, 0xbd, + 0x48, 0x69, 0x01, 0x30, 0x48, 0x61, 0x10, 0xbd, + 0xa0, 0x6a, 0x01, 0x00, 0x28, 0x61, 0x01, 0x00, + 0x1c, 0xb5, 0x14, 0x1c, 0x15, 0x48, 0x03, 0xf0, + 0x51, 0xf8, 0xa0, 0x42, 0x01, 0xd0, 0xfa, 0xf7, + 0x0d, 0xf9, 0x20, 0x1c, 0x4f, 0x30, 0x02, 0x79, + 0x41, 0x79, 0x00, 0xab, 0x12, 0x02, 0x11, 0x43, + 0xc2, 0x78, 0x12, 0x04, 0x3c, 0x00, 0xf8, 0x70, + 0x00, 0x00, 0x11, 0x43, 0x82, 0x78, 0x12, 0x06, + 0x11, 0x43, 0x00, 0x91, 0x01, 0x78, 0x40, 0x78, + 0x09, 0x02, 0x08, 0x43, 0x98, 0x80, 0x20, 0x1c, + 0x69, 0x46, 0x06, 0xf0, 0x3c, 0xf9, 0x00, 0x28, + 0x03, 0xd1, 0x20, 0x1c, 0x09, 0xf0, 0xe3, 0xfa, + 0x1c, 0xbd, 0x20, 0x68, 0xfa, 0xf7, 0x39, 0xfa, + 0x20, 0x1c, 0xfa, 0xf7, 0x64, 0xfb, 0xf7, 0xe7, + 0x00, 0x00, 0xa0, 0x6a, 0x01, 0x00, 0x3c, 0x00, + 0x34, 0x71, 0x00, 0x00, 0xbc, 0xb5, 0x1f, 0x4d, + 0x14, 0x1c, 0x28, 0x1c, 0xdc, 0x30, 0x03, 0xf0, + 0x1f, 0xf8, 0xa0, 0x42, 0x01, 0xd0, 0xfa, 0xf7, + 0xdb, 0xf8, 0xa0, 0x6c, 0x00, 0xab, 0x02, 0x78, + 0x81, 0x78, 0x12, 0x02, 0x11, 0x43, 0x02, 0x79, + 0x12, 0x04, 0x11, 0x43, 0x42, 0x79, 0x12, 0x06, + 0x11, 0x43, 0x00, 0x91, 0x81, 0x79, 0xc0, 0x79, + 0x00, 0x02, 0x08, 0x43, 0x98, 0x80, 0x20, 0x1c, + 0x3c, 0x00, 0x70, 0x71, 0x00, 0x00, 0x69, 0x46, + 0x06, 0xf0, 0x0b, 0xf9, 0x00, 0x28, 0x17, 0xd0, + 0x01, 0x28, 0x0e, 0xd1, 0xed, 0x6c, 0x00, 0x2d, + 0x0b, 0xd0, 0x80, 0x20, 0x02, 0x5d, 0xe0, 0x6c, + 0x01, 0x21, 0x00, 0x28, 0x00, 0xd1, 0x00, 0x21, + 0x60, 0x68, 0x6b, 0x46, 0x0a, 0x30, 0xf9, 0xf7, + 0x23, 0xf9, 0x20, 0x68, 0xfa, 0xf7, 0xfb, 0xf9, + 0x20, 0x1c, 0xfa, 0xf7, 0x26, 0xfb, 0xbc, 0xbd, + 0x20, 0x1c, 0x3c, 0x00, 0xac, 0x71, 0x00, 0x00, + 0x00, 0xf0, 0x8e, 0xfe, 0xfa, 0xe7, 0x00, 0x00, + 0xc4, 0x69, 0x01, 0x00, 0xbc, 0xb5, 0x04, 0x1c, + 0x40, 0x6a, 0x00, 0x25, 0x00, 0x28, 0x03, 0xd0, + 0x60, 0x68, 0x00, 0x8b, 0x05, 0x07, 0x2d, 0x0f, + 0x22, 0x1c, 0x40, 0x32, 0x08, 0x21, 0x20, 0x68, + 0xfa, 0xf7, 0x7e, 0xfa, 0xa1, 0x68, 0x01, 0x95, + 0x00, 0x91, 0x21, 0x1c, 0x22, 0x1c, 0x60, 0x32, + 0x20, 0x68, 0x50, 0x31, 0x3c, 0x00, 0xe8, 0x71, + 0x00, 0x00, 0x0d, 0x1c, 0xe3, 0x68, 0x09, 0xf0, + 0xe2, 0xff, 0xe0, 0x69, 0x80, 0x6b, 0x00, 0x28, + 0x03, 0xd1, 0xfe, 0xf7, 0xe8, 0xfa, 0x00, 0x28, + 0x01, 0xd0, 0x18, 0x20, 0x00, 0xe0, 0x10, 0x20, + 0x06, 0x49, 0x01, 0x94, 0x00, 0x91, 0xe1, 0x69, + 0x08, 0x23, 0x09, 0x68, 0x0a, 0x18, 0x21, 0x1c, + 0x28, 0x31, 0x28, 0x1c, 0xff, 0xf7, 0x87, 0xf9, + 0xbc, 0xbd, 0x35, 0x71, 0x00, 0x00, 0x3c, 0x00, + 0x24, 0x72, 0x00, 0x00, 0x10, 0xb5, 0x10, 0x1c, + 0x38, 0x30, 0x90, 0x62, 0x04, 0x20, 0x10, 0x86, + 0x00, 0x20, 0x50, 0x63, 0x10, 0x68, 0x14, 0x1c, + 0x40, 0x32, 0x04, 0x21, 0xfa, 0xf7, 0x4a, 0xfa, + 0x23, 0x1c, 0x21, 0x1c, 0x28, 0x31, 0x02, 0x4a, + 0x20, 0x68, 0xff, 0xf7, 0xbd, 0xf8, 0x10, 0xbd, + 0x65, 0x70, 0x00, 0x00, 0x0e, 0xb5, 0xc3, 0x69, + 0x02, 0x1c, 0x98, 0x88, 0x05, 0x49, 0x02, 0x92, + 0x3c, 0x00, 0x60, 0x72, 0x00, 0x00, 0x01, 0x91, + 0x00, 0x90, 0x1b, 0x68, 0x10, 0x68, 0x91, 0x69, + 0x03, 0x22, 0xff, 0xf7, 0xae, 0xf9, 0x0e, 0xbd, + 0x00, 0x00, 0x25, 0x72, 0x00, 0x00, 0x0e, 0xb5, + 0x02, 0x1c, 0x06, 0x49, 0x10, 0x20, 0x00, 0x90, + 0x02, 0x92, 0x13, 0x1c, 0x01, 0x91, 0x10, 0x68, + 0x00, 0x22, 0x70, 0x33, 0x00, 0x21, 0xff, 0xf7, + 0x9c, 0xf9, 0x0e, 0xbd, 0x00, 0x00, 0x25, 0x72, + 0x00, 0x00, 0x3c, 0x00, 0x9c, 0x72, 0x00, 0x00, + 0x10, 0xb5, 0x03, 0x1c, 0x00, 0x21, 0x00, 0x20, + 0x08, 0x4c, 0x00, 0xe0, 0x01, 0x31, 0xca, 0x00, + 0xa2, 0x58, 0x9a, 0x42, 0x02, 0xd0, 0x0b, 0x29, + 0xf8, 0xd3, 0x10, 0xbd, 0x0b, 0x29, 0xfc, 0xd2, + 0xc9, 0x00, 0x09, 0x19, 0x00, 0x20, 0x08, 0x71, + 0x01, 0x20, 0x10, 0xbd, 0x38, 0x58, 0x01, 0x00, + 0x8c, 0xb5, 0x00, 0xab, 0x86, 0x21, 0x19, 0x80, + 0x01, 0x1c, 0x04, 0x48, 0x3c, 0x00, 0xd8, 0x72, + 0x00, 0x00, 0x06, 0xf0, 0xee, 0xfe, 0x01, 0x90, + 0x68, 0x46, 0x06, 0xf0, 0xfa, 0xf8, 0x8c, 0xbd, + 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0x10, 0xb5, + 0x04, 0x1c, 0x0d, 0x48, 0x0d, 0x49, 0x94, 0xb0, + 0x04, 0x80, 0x06, 0x22, 0x18, 0x31, 0x0c, 0x30, + 0xf9, 0xf7, 0xfb, 0xf8, 0x01, 0xa8, 0x07, 0xf0, + 0xa2, 0xf8, 0x0c, 0x20, 0x09, 0xa9, 0x48, 0x72, + 0x00, 0xab, 0x1c, 0x80, 0x02, 0x21, 0x3c, 0x00, + 0x14, 0x73, 0x00, 0x00, 0x68, 0x46, 0x03, 0xf0, + 0xdb, 0xff, 0x04, 0x90, 0x01, 0xa8, 0x06, 0xf0, + 0xd1, 0xf8, 0x14, 0xb0, 0x10, 0xbd, 0x00, 0x00, + 0x58, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x04, 0xf0, + 0x45, 0xfe, 0x05, 0xf0, 0x53, 0xfa, 0x80, 0xbd, + 0x10, 0xb5, 0x19, 0x4c, 0xe0, 0x68, 0x00, 0x28, + 0x06, 0xd0, 0x61, 0x1c, 0x08, 0x78, 0x00, 0x28, + 0x03, 0xd1, 0x48, 0x78, 0xff, 0x30, 0x08, 0x70, + 0x3c, 0x00, 0x50, 0x73, 0x00, 0x00, 0x10, 0xbd, + 0xff, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x08, 0x70, + 0xa1, 0x68, 0x00, 0x29, 0xf7, 0xd0, 0x00, 0x28, + 0xf5, 0xd1, 0x0e, 0x48, 0x54, 0x30, 0x81, 0x78, + 0x00, 0x29, 0x03, 0xd1, 0xc1, 0x78, 0xff, 0x31, + 0x81, 0x70, 0x10, 0xbd, 0xff, 0x31, 0x09, 0x06, + 0x09, 0x0e, 0x81, 0x70, 0xf9, 0xd1, 0xa1, 0x69, + 0x00, 0x29, 0xf6, 0xd0, 0x80, 0x88, 0x03, 0xf0, + 0xd0, 0xfb, 0x3c, 0x00, 0x8c, 0x73, 0x00, 0x00, + 0x04, 0x4a, 0x01, 0x1c, 0x5c, 0x32, 0x0c, 0x32, + 0x05, 0xca, 0x80, 0x1a, 0xa2, 0x69, 0xf9, 0xf7, + 0x1f, 0xf8, 0x10, 0xbd, 0x44, 0x7d, 0x01, 0x00, + 0xf0, 0xb5, 0x04, 0x1c, 0x40, 0x68, 0x00, 0x25, + 0x01, 0x79, 0x00, 0x22, 0x85, 0xb0, 0xc9, 0x07, + 0xcb, 0x17, 0x69, 0x49, 0x01, 0x33, 0x89, 0x6a, + 0x10, 0x29, 0x05, 0xd3, 0x66, 0x49, 0xc0, 0x39, + 0x08, 0x6b, 0x01, 0x30, 0x3c, 0x00, 0xc8, 0x73, + 0x00, 0x00, 0x08, 0x63, 0x8e, 0xe0, 0x21, 0x68, + 0x0e, 0x68, 0xf6, 0x78, 0xb7, 0x06, 0xff, 0x0f, + 0xb6, 0x09, 0x00, 0x2b, 0x04, 0x97, 0x06, 0xd0, + 0x63, 0x69, 0x1f, 0x1c, 0x1b, 0x6a, 0x50, 0x37, + 0x9f, 0x42, 0x00, 0xd1, 0x01, 0x25, 0x00, 0x2d, + 0x02, 0xd0, 0x63, 0x69, 0x1b, 0x6a, 0x04, 0xe0, + 0x3c, 0x23, 0x59, 0x4f, 0x73, 0x43, 0xdb, 0x19, + 0x04, 0x33, 0xe3, 0x61, 0x9f, 0x88, 0x3c, 0x00, + 0x04, 0x74, 0x00, 0x00, 0x00, 0x2f, 0x70, 0xd0, + 0x9b, 0x79, 0x02, 0x2b, 0x6e, 0xd0, 0x04, 0x2b, + 0x17, 0xd0, 0x06, 0x2b, 0x69, 0xd1, 0x08, 0x68, + 0xa0, 0x61, 0x08, 0x89, 0x04, 0x38, 0x08, 0x81, + 0x20, 0x68, 0x01, 0x68, 0x04, 0x31, 0x01, 0x60, + 0x4e, 0x49, 0x00, 0x29, 0x5d, 0xd0, 0x04, 0x9f, + 0xba, 0x42, 0x5a, 0xd1, 0x49, 0x48, 0x22, 0x1c, + 0x1c, 0x30, 0x02, 0xf0, 0x65, 0xfe, 0x05, 0xb0, + 0x3c, 0x00, 0x40, 0x74, 0x00, 0x00, 0xf0, 0xbd, + 0x09, 0x68, 0x25, 0x1c, 0xca, 0x79, 0x40, 0x35, + 0x26, 0x1c, 0xea, 0x73, 0x8b, 0x79, 0x22, 0x1c, + 0x50, 0x32, 0x13, 0x70, 0x4b, 0x79, 0x60, 0x36, + 0x53, 0x70, 0x0b, 0x79, 0x93, 0x70, 0x4b, 0x78, + 0xd3, 0x70, 0x09, 0x78, 0x11, 0x71, 0x00, 0x21, + 0x29, 0x72, 0x16, 0x21, 0xb1, 0x73, 0x61, 0x6a, + 0x00, 0x29, 0x06, 0xd0, 0x01, 0x8b, 0x09, 0x07, + 0x09, 0x0f, 0x3c, 0x00, 0x7c, 0x74, 0x00, 0x00, + 0x29, 0x72, 0xb1, 0x81, 0x18, 0x21, 0xb1, 0x73, + 0x01, 0x1c, 0x0a, 0x31, 0x20, 0x1c, 0x06, 0x22, + 0x49, 0x30, 0xf9, 0xf7, 0x33, 0xf8, 0x60, 0x68, + 0x14, 0x22, 0x01, 0x88, 0xe9, 0x82, 0x01, 0x1d, + 0x20, 0x1c, 0x58, 0x30, 0xf9, 0xf7, 0x2a, 0xf8, + 0xe8, 0x8a, 0x30, 0x49, 0x08, 0x40, 0x01, 0x21, + 0x89, 0x03, 0x08, 0x43, 0xe8, 0x82, 0x70, 0x89, + 0x0f, 0x21, 0x08, 0x40, 0x3c, 0x00, 0xb8, 0x74, + 0x00, 0x00, 0x70, 0x81, 0x20, 0x68, 0x01, 0x89, + 0x08, 0x39, 0x01, 0x81, 0x20, 0x68, 0x01, 0x68, + 0x08, 0x31, 0x01, 0x60, 0x08, 0x21, 0x00, 0x20, + 0xfa, 0xf7, 0x83, 0xf8, 0x05, 0x1c, 0x02, 0x68, + 0x20, 0x68, 0x08, 0x21, 0xfa, 0xf7, 0xfb, 0xf8, + 0x20, 0x68, 0xfa, 0xf7, 0x74, 0xf8, 0x21, 0x49, + 0xc5, 0x60, 0x2f, 0xe0, 0x30, 0xe0, 0xff, 0xe7, + 0x21, 0x68, 0x60, 0x68, 0x0a, 0x68, 0x3c, 0x00, + 0xf4, 0x74, 0x00, 0x00, 0x80, 0x23, 0xa2, 0x64, + 0x1e, 0x55, 0xe5, 0x64, 0x55, 0x79, 0x13, 0x79, + 0x2d, 0x02, 0x5b, 0x19, 0x95, 0x79, 0x2d, 0x04, + 0x5b, 0x19, 0xd5, 0x79, 0x2d, 0x06, 0x5b, 0x19, + 0x95, 0x78, 0x12, 0x78, 0x12, 0x02, 0xaa, 0x18, + 0x15, 0x04, 0x0a, 0x89, 0x2d, 0x0c, 0x08, 0x3a, + 0x0a, 0x81, 0x21, 0x68, 0x0a, 0x68, 0x08, 0x32, + 0x0a, 0x60, 0xe1, 0x69, 0x02, 0x1c, 0x0a, 0x32, + 0x3c, 0x00, 0x30, 0x75, 0x00, 0x00, 0x01, 0xa8, + 0x09, 0x68, 0x0b, 0xf0, 0x3e, 0xf9, 0xe0, 0x69, + 0x2b, 0x1c, 0x01, 0x68, 0x20, 0x1c, 0x70, 0x30, + 0x01, 0xaa, 0x0b, 0xf0, 0x86, 0xf9, 0x09, 0x49, + 0x01, 0x22, 0x6d, 0xe7, 0x20, 0x68, 0xfa, 0xf7, + 0x22, 0xf8, 0x20, 0x1c, 0xfa, 0xf7, 0x4d, 0xf9, + 0x70, 0xe7, 0x84, 0x6a, 0x01, 0x00, 0x68, 0x61, + 0x01, 0x00, 0x55, 0x72, 0x00, 0x00, 0x8f, 0xc7, + 0xff, 0xff, 0x3c, 0x00, 0x6c, 0x75, 0x00, 0x00, + 0x41, 0x70, 0x00, 0x00, 0x79, 0x72, 0x00, 0x00, + 0x80, 0xb5, 0x02, 0x21, 0x82, 0x20, 0xf9, 0xf7, + 0x93, 0xfe, 0x80, 0xbd, 0x70, 0x47, 0x00, 0x00, + 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x80, 0xb5, 0xc0, 0x68, 0xf9, 0xf7, 0xfa, 0xff, + 0x01, 0x20, 0x80, 0xbd, 0x3c, 0x00, 0xa8, 0x75, + 0x00, 0x00, 0x80, 0xb5, 0x00, 0x21, 0xff, 0x20, + 0xf9, 0xf7, 0x79, 0xfe, 0x80, 0xbd, 0x70, 0x47, + 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x01, 0x20, + 0x70, 0x47, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, + 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, + 0x00, 0x00, 0x80, 0xb5, 0x06, 0x21, 0x99, 0x20, + 0xf9, 0xf7, 0x65, 0xfe, 0x80, 0xbd, 0xb0, 0xb5, + 0x00, 0x25, 0x01, 0x29, 0x12, 0x4c, 0x3c, 0x00, + 0xe4, 0x75, 0x00, 0x00, 0x0f, 0xd1, 0x0a, 0xf0, + 0x0f, 0xfc, 0x00, 0x28, 0x1d, 0xd0, 0x61, 0x78, + 0x3c, 0x23, 0x59, 0x43, 0x09, 0x19, 0x04, 0x31, + 0x01, 0x62, 0x61, 0x1c, 0x41, 0x62, 0x84, 0x62, + 0x04, 0x1c, 0x50, 0x34, 0x06, 0xe0, 0x00, 0x29, + 0x0f, 0xd1, 0x3c, 0x20, 0x50, 0x43, 0x25, 0x70, + 0x04, 0x19, 0x04, 0x34, 0x00, 0x2c, 0x08, 0xd0, + 0x20, 0x68, 0x00, 0x28, 0x02, 0xd0, 0x20, 0x21, + 0x3c, 0x00, 0x20, 0x76, 0x00, 0x00, 0xf8, 0xf7, + 0x18, 0xff, 0xa5, 0x80, 0x07, 0x20, 0xa0, 0x71, + 0xb0, 0xbd, 0x68, 0x61, 0x01, 0x00, 0x70, 0xb5, + 0x04, 0x1c, 0x00, 0x21, 0x01, 0xf0, 0x41, 0xfc, + 0x60, 0x68, 0x00, 0x28, 0x01, 0xd0, 0x21, 0x68, + 0x01, 0x60, 0x20, 0x68, 0x00, 0x28, 0x01, 0xd0, + 0x61, 0x68, 0x41, 0x60, 0x12, 0x4e, 0x70, 0x68, + 0xa0, 0x42, 0x01, 0xd1, 0x60, 0x68, 0x70, 0x60, + 0xe0, 0x68, 0x3c, 0x00, 0x5c, 0x76, 0x00, 0x00, + 0x00, 0x28, 0x0b, 0xd0, 0x00, 0x25, 0x06, 0xe0, + 0xe0, 0x68, 0xe9, 0x00, 0x41, 0x18, 0x14, 0x20, + 0x0b, 0xf0, 0xe2, 0xff, 0x01, 0x35, 0x30, 0x88, + 0x85, 0x42, 0xf5, 0xdb, 0x06, 0x21, 0x20, 0x1c, + 0x44, 0x30, 0xf8, 0xf7, 0xe9, 0xfe, 0x20, 0x6b, + 0x00, 0x28, 0x01, 0xd0, 0xf9, 0xf7, 0x86, 0xff, + 0xe0, 0x69, 0x00, 0x28, 0x01, 0xd0, 0xfa, 0xf7, + 0xaf, 0xf8, 0x70, 0xbd, 0x3c, 0x00, 0x98, 0x76, + 0x00, 0x00, 0x58, 0x75, 0x01, 0x00, 0xf0, 0xb5, + 0x1d, 0x4f, 0x05, 0x9d, 0x3f, 0x68, 0x01, 0x26, + 0x1c, 0x1c, 0x33, 0x1c, 0x00, 0x2f, 0x00, 0xd0, + 0x2b, 0x1c, 0x1d, 0x06, 0x2d, 0x0e, 0x00, 0x29, + 0x06, 0xd0, 0x11, 0x78, 0x0e, 0x23, 0x16, 0x4f, + 0x09, 0x18, 0x09, 0x7a, 0x6b, 0x43, 0x10, 0xe0, + 0x21, 0x78, 0x00, 0x29, 0x13, 0xd0, 0xff, 0x31, + 0x0d, 0xe0, 0x01, 0x29, 0x01, 0xd9, 0x3c, 0x00, + 0xd4, 0x76, 0x00, 0x00, 0x01, 0x31, 0x11, 0x70, + 0x11, 0x78, 0x0e, 0x23, 0x0f, 0x4f, 0x49, 0x08, + 0x11, 0x70, 0x09, 0x18, 0x09, 0x7a, 0x6b, 0x43, + 0xdb, 0x19, 0x59, 0x5c, 0x21, 0x70, 0x21, 0x78, + 0x00, 0x29, 0x02, 0xd1, 0x11, 0x78, 0x00, 0x29, + 0xea, 0xd1, 0x09, 0x48, 0xc0, 0x68, 0x00, 0x28, + 0x05, 0xd0, 0x21, 0x78, 0x30, 0x1c, 0x00, 0x29, + 0x00, 0xd1, 0x00, 0x20, 0xf0, 0xbd, 0x01, 0x20, + 0x3c, 0x00, 0x10, 0x77, 0x00, 0x00, 0xf0, 0xbd, + 0x00, 0x00, 0x18, 0x67, 0x01, 0x00, 0x24, 0x67, + 0x01, 0x00, 0x5c, 0x67, 0x01, 0x00, 0xac, 0x7c, + 0x01, 0x00, 0x84, 0x46, 0x00, 0x20, 0xf0, 0xb5, + 0x00, 0x29, 0x09, 0xd0, 0x11, 0x78, 0x1a, 0x4e, + 0xb1, 0x70, 0x19, 0x4e, 0xb1, 0x78, 0x71, 0x70, + 0x31, 0x70, 0x01, 0x21, 0x31, 0x61, 0x27, 0xe0, + 0x16, 0x4e, 0x01, 0x23, 0xf1, 0x56, 0x63, 0x46, + 0x5f, 0x68, 0x3c, 0x00, 0x4c, 0x77, 0x00, 0x00, + 0x00, 0x23, 0xf6, 0x56, 0x01, 0x25, 0xcc, 0x0f, + 0xb7, 0x42, 0x00, 0xd9, 0x00, 0x25, 0x00, 0x2c, + 0x01, 0xd0, 0x00, 0x2d, 0xe8, 0xd1, 0x0e, 0x4f, + 0x3b, 0x69, 0x00, 0x2b, 0x03, 0xd0, 0x00, 0x2d, + 0x01, 0xd1, 0x16, 0x70, 0x02, 0xe0, 0x1c, 0x43, + 0x01, 0xd1, 0x11, 0x70, 0x01, 0x20, 0x01, 0x24, + 0x00, 0x2b, 0x00, 0xd0, 0x00, 0x24, 0x3c, 0x61, + 0x00, 0x2c, 0x02, 0xd0, 0x3c, 0x00, 0x88, 0x77, + 0x00, 0x00, 0x71, 0x1c, 0x39, 0x70, 0x01, 0xe0, + 0xff, 0x31, 0x79, 0x70, 0x00, 0x28, 0xd5, 0xd0, + 0x01, 0x20, 0xf0, 0xbd, 0x00, 0x00, 0xac, 0x7c, + 0x01, 0x00, 0x90, 0xb5, 0x0a, 0x4c, 0x00, 0x20, + 0x93, 0xb0, 0x20, 0x61, 0x03, 0x90, 0x68, 0x46, + 0x00, 0x21, 0x08, 0xf0, 0x84, 0xfd, 0x20, 0x7a, + 0x02, 0x28, 0x01, 0xd1, 0xe0, 0x6b, 0x00, 0xe0, + 0x20, 0x6c, 0xe0, 0x61, 0x01, 0x20, 0x3c, 0x00, + 0xc4, 0x77, 0x00, 0x00, 0x08, 0xf0, 0x8a, 0xfd, + 0x13, 0xb0, 0x90, 0xbd, 0xf4, 0x6e, 0x01, 0x00, + 0xf7, 0xb5, 0x05, 0x1c, 0x88, 0x88, 0x0c, 0x1c, + 0x82, 0xb0, 0x1f, 0x4f, 0x00, 0x28, 0x00, 0xd1, + 0x00, 0x27, 0x04, 0x98, 0x00, 0x28, 0x01, 0xd1, + 0xf9, 0xf7, 0x8a, 0xfd, 0x1b, 0x48, 0x3b, 0x1c, + 0x00, 0x68, 0x21, 0x1c, 0x02, 0x68, 0x28, 0x1c, + 0x00, 0x92, 0x04, 0x9a, 0xfe, 0xf7, 0x3c, 0xf8, + 0x3c, 0x00, 0x00, 0x78, 0x00, 0x00, 0x06, 0x1c, + 0x22, 0xd0, 0x03, 0x21, 0x04, 0x98, 0x02, 0xf0, + 0xb8, 0xff, 0x00, 0x28, 0x1b, 0xd0, 0x80, 0x78, + 0x01, 0x21, 0x03, 0xf0, 0xe4, 0xff, 0xa0, 0x88, + 0xa1, 0x8e, 0x48, 0x43, 0x00, 0x04, 0x0f, 0x49, + 0x00, 0x0c, 0x08, 0x80, 0x03, 0xf0, 0x81, 0xf9, + 0x01, 0x22, 0x00, 0x2d, 0x00, 0xd1, 0x00, 0x22, + 0x01, 0x1c, 0x0e, 0x20, 0x0b, 0xf0, 0xc9, 0xfe, + 0x00, 0x2f, 0x3c, 0x00, 0x3c, 0x78, 0x00, 0x00, + 0x08, 0xd1, 0x00, 0x21, 0x28, 0x1c, 0x02, 0xf0, + 0xbd, 0xfc, 0x03, 0xe0, 0x00, 0x26, 0x28, 0x1c, + 0x00, 0xf0, 0x0a, 0xf8, 0x30, 0x1c, 0x05, 0xb0, + 0xf0, 0xbd, 0x00, 0x00, 0xc1, 0xa1, 0x00, 0x00, + 0xe4, 0x65, 0x01, 0x00, 0xa8, 0x7c, 0x01, 0x00, + 0x10, 0xb5, 0x04, 0x1c, 0xfe, 0xf7, 0x38, 0xf8, + 0x01, 0x21, 0x00, 0x2c, 0x00, 0xd1, 0x00, 0x21, + 0x0e, 0x20, 0x0b, 0xf0, 0x3c, 0x00, 0x78, 0x78, + 0x00, 0x00, 0xdd, 0xfe, 0x10, 0xbd, 0xf8, 0xb5, + 0x07, 0x1c, 0x0b, 0xf0, 0x94, 0xfa, 0xfd, 0xf7, + 0xbc, 0xfe, 0x00, 0x26, 0x02, 0x28, 0x1e, 0x4d, + 0x01, 0xd0, 0x2e, 0x70, 0xf8, 0xbd, 0xfd, 0xf7, + 0x3e, 0xf8, 0x04, 0x1c, 0xf9, 0xf7, 0x59, 0xfc, + 0x00, 0x28, 0x14, 0xd0, 0xfd, 0xf7, 0x77, 0xf8, + 0x00, 0x28, 0x10, 0xd0, 0x02, 0xf0, 0xf9, 0xfb, + 0x00, 0x28, 0x01, 0xd0, 0x00, 0x24, 0x3c, 0x00, + 0xb4, 0x78, 0x00, 0x00, 0x00, 0xe0, 0x15, 0x4c, + 0x33, 0x1c, 0x21, 0x1c, 0x07, 0x22, 0x16, 0x20, + 0x0b, 0xf0, 0x66, 0xff, 0x68, 0x78, 0x80, 0x21, + 0x08, 0x43, 0x68, 0x70, 0x02, 0xf0, 0x0a, 0xfc, + 0x00, 0x28, 0xde, 0xd1, 0x28, 0x78, 0x80, 0x07, + 0xdb, 0xd4, 0xfd, 0xf7, 0x23, 0xf9, 0x00, 0x28, + 0x05, 0xd1, 0x28, 0x78, 0xc0, 0x07, 0x02, 0xd5, + 0xfd, 0xf7, 0x42, 0xf8, 0xd1, 0xe7, 0x02, 0xf0, + 0x3c, 0x00, 0xf0, 0x78, 0x00, 0x00, 0xcd, 0xfb, + 0x00, 0x28, 0xcd, 0xd0, 0x28, 0x78, 0x02, 0x21, + 0x08, 0x43, 0x28, 0x70, 0x21, 0x1c, 0x38, 0x1c, + 0xfd, 0xf7, 0xc1, 0xf8, 0xc4, 0xe7, 0x60, 0x6c, + 0x01, 0x00, 0x71, 0x02, 0x00, 0x00, 0x10, 0xb5, + 0x12, 0x4c, 0x01, 0x20, 0x20, 0x70, 0xfe, 0xf7, + 0xf0, 0xf9, 0x01, 0x21, 0xa0, 0x68, 0xfb, 0xf7, + 0xf4, 0xfe, 0xa0, 0x68, 0x03, 0xf0, 0x87, 0xff, + 0x0d, 0x48, 0x3c, 0x00, 0x2c, 0x79, 0x00, 0x00, + 0xa1, 0x68, 0x07, 0xf0, 0x23, 0xfd, 0xfb, 0xf7, + 0x55, 0xff, 0xe0, 0x68, 0x00, 0x28, 0x0d, 0xd0, + 0x09, 0x49, 0x06, 0x20, 0x0a, 0xf0, 0x24, 0xfd, + 0x08, 0x49, 0x05, 0x20, 0x0a, 0xf0, 0x20, 0xfd, + 0xfb, 0xf7, 0x6e, 0xff, 0x00, 0x28, 0x01, 0xd0, + 0x05, 0xf0, 0xf8, 0xfc, 0x10, 0xbd, 0x00, 0x00, + 0x78, 0x69, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, + 0xe1, 0x35, 0x00, 0x00, 0x3c, 0x00, 0x68, 0x79, + 0x00, 0x00, 0xb1, 0x35, 0x00, 0x00, 0xf0, 0xb5, + 0x24, 0x4d, 0x23, 0x4c, 0x68, 0x7c, 0x20, 0x3c, + 0x9b, 0xb0, 0x00, 0x28, 0x08, 0xd0, 0x02, 0x28, + 0x03, 0xd8, 0x20, 0x89, 0x01, 0x38, 0x20, 0x81, + 0x37, 0xe0, 0x00, 0x27, 0x6f, 0x74, 0x34, 0xe0, + 0x1c, 0x4e, 0x68, 0x22, 0x14, 0x36, 0x31, 0x1c, + 0x0c, 0x31, 0x01, 0xa8, 0xf8, 0xf7, 0x09, 0xfe, + 0x18, 0x48, 0x33, 0x89, 0x01, 0x21, 0x3c, 0x00, + 0xa4, 0x79, 0x00, 0x00, 0x44, 0x30, 0x0a, 0x1c, + 0x00, 0x2b, 0x00, 0x7b, 0x00, 0xd1, 0x02, 0x1c, + 0x12, 0x06, 0x12, 0x0e, 0x0d, 0xaf, 0x3a, 0x70, + 0x94, 0x46, 0xaa, 0x7b, 0x93, 0x19, 0x30, 0x33, + 0x5b, 0x7b, 0x7b, 0x70, 0xea, 0x73, 0x01, 0x32, + 0x12, 0x06, 0x12, 0x0e, 0x00, 0x27, 0x82, 0x42, + 0xaa, 0x73, 0x01, 0xd3, 0xaf, 0x73, 0x04, 0xe0, + 0x62, 0x46, 0x01, 0x2a, 0x01, 0xd1, 0x77, 0x60, + 0x3c, 0x00, 0xe0, 0x79, 0x00, 0x00, 0x00, 0xe0, + 0x71, 0x60, 0x06, 0x48, 0x07, 0x4a, 0x80, 0x38, + 0x81, 0x67, 0x42, 0x67, 0x68, 0x22, 0x01, 0xa9, + 0xf8, 0xf7, 0xdd, 0xfd, 0x27, 0x81, 0x08, 0xf0, + 0x12, 0xfd, 0x1b, 0xb0, 0xf0, 0xbd, 0x84, 0x66, + 0x01, 0x00, 0xe9, 0x2e, 0x00, 0x00, 0xf1, 0xb5, + 0x86, 0xb0, 0x06, 0x99, 0x00, 0x20, 0x88, 0x61, + 0x06, 0x98, 0x84, 0x68, 0x80, 0x8d, 0x65, 0x68, + 0x01, 0x28, 0x3c, 0x00, 0x1c, 0x7a, 0x00, 0x00, + 0x4c, 0xd9, 0x35, 0x49, 0x49, 0x68, 0x05, 0x91, + 0x00, 0x29, 0x47, 0xd0, 0x00, 0x22, 0x00, 0x21, + 0x00, 0x23, 0x03, 0x90, 0x28, 0x1c, 0x96, 0x46, + 0x94, 0x46, 0x06, 0x68, 0x04, 0x96, 0xf2, 0x78, + 0x80, 0x26, 0xb2, 0x43, 0x3f, 0x2a, 0x2e, 0xd8, + 0xd7, 0x06, 0xff, 0x0e, 0x01, 0x26, 0xbe, 0x40, + 0x37, 0x1c, 0x04, 0x9e, 0x52, 0x09, 0xb6, 0x78, + 0x76, 0x00, 0xb2, 0x18, 0x3c, 0x00, 0x58, 0x7a, + 0x00, 0x00, 0x26, 0x4e, 0x92, 0x00, 0x1c, 0x36, + 0xb2, 0x58, 0x3a, 0x40, 0x1e, 0xd0, 0x03, 0xe0, + 0x02, 0x90, 0x02, 0x89, 0xc0, 0x68, 0x51, 0x18, + 0x00, 0x28, 0xf9, 0xd1, 0x05, 0x98, 0x81, 0x42, + 0x14, 0xd8, 0x70, 0x46, 0x01, 0x30, 0x86, 0x46, + 0x00, 0x2b, 0x04, 0xd0, 0x60, 0x46, 0xd8, 0x60, + 0x01, 0x98, 0x62, 0x46, 0xd0, 0x60, 0x03, 0x98, + 0x01, 0x38, 0x03, 0x90, 0x06, 0xd0, 0x3c, 0x00, + 0x94, 0x7a, 0x00, 0x00, 0x23, 0x1c, 0x24, 0x68, + 0x60, 0x68, 0x02, 0x9a, 0x01, 0x90, 0x94, 0x46, + 0xc9, 0xe7, 0x70, 0x46, 0x01, 0x28, 0x07, 0xd9, + 0x2a, 0x1c, 0x00, 0x21, 0x3f, 0x20, 0x01, 0xf0, + 0x51, 0xff, 0x05, 0x1c, 0x06, 0x98, 0x85, 0x61, + 0x28, 0x1c, 0x01, 0xf0, 0xb3, 0xff, 0x0e, 0x48, + 0x00, 0x68, 0x00, 0x28, 0x07, 0xd0, 0x28, 0x68, + 0x01, 0x88, 0x40, 0x79, 0x02, 0x31, 0x09, 0x1a, + 0x3c, 0x00, 0xd0, 0x7a, 0x00, 0x00, 0x28, 0x1c, + 0x01, 0xf0, 0xe5, 0xfc, 0xa2, 0x68, 0x06, 0x98, + 0xc0, 0x68, 0x06, 0x99, 0x0b, 0x69, 0x29, 0x1c, + 0xf8, 0xf7, 0x7c, 0xfc, 0x03, 0x49, 0x08, 0x69, + 0x01, 0x30, 0x08, 0x61, 0x07, 0xb0, 0xf0, 0xbd, + 0x00, 0x00, 0xfc, 0x5a, 0x01, 0x00, 0xcc, 0x5c, + 0x01, 0x00, 0x10, 0xb5, 0x09, 0x4a, 0x80, 0x00, + 0x12, 0x58, 0xd0, 0x06, 0xc0, 0x0e, 0x01, 0x30, + 0x07, 0x4b, 0x3c, 0x00, 0x0c, 0x7b, 0x00, 0x00, + 0x1c, 0x68, 0x00, 0x2c, 0xfc, 0xdb, 0x5a, 0x60, + 0x20, 0x22, 0x12, 0x1a, 0x91, 0x40, 0x19, 0x60, + 0x19, 0x68, 0x00, 0x29, 0xfc, 0xdb, 0x10, 0xbd, + 0xe8, 0x60, 0x01, 0x00, 0x30, 0x20, 0x07, 0x00, + 0xb0, 0xb5, 0x12, 0x4c, 0x00, 0x25, 0x25, 0x70, + 0xa1, 0x68, 0x11, 0x48, 0x07, 0xf0, 0x32, 0xfc, + 0x65, 0x61, 0xfb, 0xf7, 0xa3, 0xfe, 0xe0, 0x68, + 0x00, 0x28, 0x0d, 0xd0, 0x3c, 0x00, 0x48, 0x7b, + 0x00, 0x00, 0xfb, 0xf7, 0xa4, 0xfe, 0x01, 0x21, + 0x07, 0x20, 0x0b, 0xf0, 0x70, 0xfd, 0x0a, 0x49, + 0x06, 0x20, 0x0a, 0xf0, 0x4c, 0xfc, 0x09, 0x49, + 0x05, 0x20, 0x0a, 0xf0, 0x48, 0xfc, 0xa0, 0x68, + 0x03, 0xf0, 0x67, 0xfe, 0x00, 0x21, 0xa0, 0x68, + 0xfb, 0xf7, 0xcd, 0xfd, 0x05, 0xf0, 0xab, 0xfb, + 0xb0, 0xbd, 0x78, 0x69, 0x01, 0x00, 0x34, 0x63, + 0x01, 0x00, 0xe1, 0x35, 0x00, 0x00, 0x3c, 0x00, + 0x84, 0x7b, 0x00, 0x00, 0xb1, 0x35, 0x00, 0x00, + 0x10, 0xb5, 0x0f, 0x4c, 0x20, 0x7c, 0x00, 0x28, + 0x19, 0xd1, 0x60, 0x69, 0x00, 0x28, 0x16, 0xd1, + 0xe0, 0x68, 0x00, 0x28, 0x06, 0xd0, 0x0a, 0x48, + 0x1c, 0x38, 0xc0, 0x68, 0x00, 0x28, 0x01, 0xd0, + 0x05, 0xf0, 0xce, 0xfb, 0x01, 0x21, 0x07, 0x20, + 0x0b, 0xf0, 0x40, 0xfd, 0xa0, 0x68, 0x03, 0xf0, + 0x3f, 0xfe, 0x04, 0x48, 0xa1, 0x68, 0x07, 0xf0, + 0x3c, 0x00, 0xc0, 0x7b, 0x00, 0x00, 0xdb, 0xfb, + 0x01, 0x20, 0x20, 0x70, 0x10, 0xbd, 0x78, 0x69, + 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x70, 0xb5, + 0x0e, 0x4c, 0x01, 0x22, 0xa3, 0x68, 0xe5, 0x68, + 0x26, 0x8a, 0x5d, 0x1b, 0xb5, 0x42, 0x01, 0xd1, + 0x00, 0x22, 0x06, 0xe0, 0x25, 0x68, 0x01, 0x33, + 0x2e, 0x68, 0xa3, 0x60, 0x26, 0x60, 0x04, 0x35, + 0x03, 0xc5, 0x00, 0x2a, 0x04, 0xd1, 0x01, 0x21, + 0x9d, 0x20, 0x3c, 0x00, 0xfc, 0x7b, 0x00, 0x00, + 0xf9, 0xf7, 0x52, 0xfb, 0x70, 0xbd, 0x03, 0x49, + 0x02, 0x20, 0x08, 0x60, 0x70, 0xbd, 0x00, 0x00, + 0x44, 0xe3, 0x01, 0x00, 0x40, 0x20, 0x07, 0x00, + 0x80, 0xb5, 0x02, 0xf0, 0xb9, 0xf8, 0x80, 0xbd, + 0x80, 0xb5, 0x02, 0x21, 0x2d, 0x20, 0xf9, 0xf7, + 0x3f, 0xfb, 0x00, 0x20, 0x80, 0xbd, 0x00, 0x00, + 0x80, 0xb5, 0x02, 0x21, 0x2a, 0x20, 0xf9, 0xf7, + 0x37, 0xfb, 0x00, 0x20, 0x3c, 0x00, 0x38, 0x7c, + 0x00, 0x00, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, + 0x01, 0x21, 0x2b, 0x20, 0xf9, 0xf7, 0x2f, 0xfb, + 0x02, 0x20, 0x80, 0xbd, 0x00, 0x00, 0x01, 0x49, + 0x01, 0x20, 0x08, 0x61, 0x70, 0x47, 0x7c, 0x78, + 0x01, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x0c, 0x23, + 0x0f, 0x1c, 0x17, 0x49, 0x58, 0x43, 0x45, 0x18, + 0x6c, 0x68, 0x30, 0x1c, 0x0b, 0xf0, 0x3f, 0xfe, + 0x00, 0x2f, 0x09, 0xd1, 0x30, 0x1c, 0x3c, 0x00, + 0x74, 0x7c, 0x00, 0x00, 0x03, 0xf0, 0xee, 0xfe, + 0x41, 0x20, 0x07, 0x55, 0x11, 0x48, 0x21, 0x1c, + 0xff, 0xf7, 0xa6, 0xff, 0xf8, 0xbd, 0x41, 0x20, + 0x07, 0x55, 0xa0, 0x6b, 0x00, 0x28, 0x03, 0xd0, + 0x20, 0x1c, 0x00, 0xf0, 0xdf, 0xf9, 0xf5, 0xe7, + 0x20, 0x1c, 0x00, 0xf0, 0xdb, 0xf9, 0xac, 0x68, + 0x00, 0x2c, 0x02, 0xd0, 0x00, 0x20, 0xa8, 0x60, + 0xed, 0xe7, 0x30, 0x1c, 0x05, 0xf0, 0x34, 0xf9, + 0x3c, 0x00, 0xb0, 0x7c, 0x00, 0x00, 0x04, 0x1c, + 0xe8, 0xd1, 0x08, 0x21, 0x0c, 0x20, 0xf9, 0xf7, + 0xf4, 0xfa, 0xe3, 0xe7, 0x00, 0x00, 0x60, 0x7b, + 0x01, 0x00, 0x55, 0x80, 0x00, 0x00, 0x07, 0x4a, + 0x80, 0xb5, 0x50, 0x70, 0x51, 0x60, 0x12, 0x78, + 0x06, 0x4b, 0x80, 0x00, 0x52, 0x01, 0xd2, 0x18, + 0x10, 0x18, 0x40, 0x38, 0x02, 0x68, 0x08, 0x1c, + 0xf8, 0xf7, 0x7b, 0xfb, 0x80, 0xbd, 0x78, 0x69, + 0x01, 0x00, 0x3c, 0x00, 0xec, 0x7c, 0x00, 0x00, + 0xfc, 0x42, 0x01, 0x00, 0xb0, 0xb5, 0x0a, 0x49, + 0x04, 0x1c, 0xc8, 0x70, 0x08, 0x4d, 0xe4, 0x35, + 0xa8, 0x7a, 0x08, 0x71, 0x08, 0x2c, 0x01, 0xd3, + 0xf9, 0xf7, 0xfc, 0xfa, 0xa8, 0x7a, 0x05, 0x49, + 0x40, 0x01, 0x40, 0x18, 0xa1, 0x00, 0x40, 0x58, + 0xf8, 0xf7, 0x60, 0xfb, 0xb0, 0xbd, 0x00, 0x00, + 0x60, 0x6c, 0x01, 0x00, 0x80, 0x43, 0x01, 0x00, + 0x80, 0xb5, 0x00, 0x28, 0x3c, 0x00, 0x28, 0x7d, + 0x00, 0x00, 0x01, 0xd0, 0x09, 0xf0, 0x1d, 0xf9, + 0x80, 0xbd, 0xb0, 0xb5, 0x05, 0x1c, 0x0c, 0x1c, + 0x00, 0x20, 0x08, 0x60, 0x68, 0x68, 0x09, 0xf0, + 0x36, 0xfb, 0x6c, 0x60, 0xb0, 0xbd, 0x10, 0xb5, + 0x04, 0x1c, 0x09, 0xf0, 0x34, 0xfb, 0x21, 0x68, + 0x00, 0x29, 0x00, 0xd1, 0x64, 0x60, 0x10, 0xbd, + 0x00, 0x00, 0x00, 0x21, 0x01, 0x60, 0x40, 0x60, + 0x70, 0x47, 0xf8, 0xb5, 0x46, 0x68, 0x3c, 0x00, + 0x64, 0x7d, 0x00, 0x00, 0x04, 0x1c, 0x40, 0x6a, + 0x35, 0x1c, 0x0a, 0x35, 0x00, 0x28, 0x04, 0xd0, + 0x20, 0x1c, 0xf9, 0xf7, 0x89, 0xfd, 0x07, 0x1c, + 0x00, 0xe0, 0x04, 0x27, 0x29, 0x1c, 0x60, 0x69, + 0x00, 0xf0, 0xf6, 0xfc, 0x79, 0x00, 0x0f, 0x18, + 0xba, 0x88, 0xf1, 0x8a, 0x05, 0x1c, 0x8a, 0x42, + 0x05, 0xd1, 0x30, 0x88, 0x00, 0x05, 0x02, 0xd5, + 0x04, 0xf0, 0xbe, 0xfb, 0x3c, 0xe0, 0x28, 0x68, + 0x3c, 0x00, 0xa0, 0x7d, 0x00, 0x00, 0x00, 0x28, + 0x0f, 0xd0, 0x01, 0x32, 0x8a, 0x42, 0x04, 0xd1, + 0xf9, 0xf7, 0x0f, 0xfc, 0x21, 0x68, 0xc1, 0x60, + 0x0b, 0xe0, 0xf9, 0xf7, 0xf0, 0xfb, 0xf0, 0x8a, + 0x00, 0x07, 0x04, 0xd0, 0x00, 0x21, 0x29, 0x60, + 0x29, 0xe0, 0x08, 0x07, 0x27, 0xd1, 0x20, 0x68, + 0x28, 0x60, 0xf0, 0x8a, 0xb8, 0x80, 0x13, 0x48, + 0x01, 0x68, 0x01, 0x31, 0x01, 0x60, 0x31, 0x88, + 0x49, 0x05, 0x3c, 0x00, 0xdc, 0x7d, 0x00, 0x00, + 0x18, 0xd4, 0x29, 0x68, 0x21, 0x60, 0x00, 0x21, + 0x29, 0x60, 0xe1, 0x69, 0x00, 0x29, 0x0d, 0xd0, + 0x89, 0x79, 0x02, 0x29, 0x0a, 0xd1, 0x08, 0x21, + 0x21, 0x86, 0x21, 0x1c, 0x38, 0x31, 0xa1, 0x62, + 0x22, 0x1c, 0xdc, 0x30, 0x08, 0x49, 0x02, 0xf0, + 0x81, 0xf9, 0xf8, 0xbd, 0x20, 0x1c, 0x00, 0xf0, + 0x5f, 0xf8, 0xfa, 0xe7, 0x20, 0x1c, 0xf9, 0xf7, + 0xef, 0xfc, 0xf6, 0xe7, 0x3c, 0x00, 0x18, 0x7e, + 0x00, 0x00, 0x20, 0x68, 0xf9, 0xf7, 0xbd, 0xfb, + 0xf7, 0xe7, 0xc4, 0x69, 0x01, 0x00, 0xb9, 0x71, + 0x00, 0x00, 0xf8, 0xb5, 0x0f, 0x1c, 0x09, 0x78, + 0x01, 0x24, 0xc9, 0x07, 0x21, 0xd5, 0x02, 0xf0, + 0x8c, 0xff, 0x00, 0x28, 0x01, 0xd0, 0x00, 0x24, + 0x1b, 0xe0, 0x0e, 0x4e, 0x75, 0x6e, 0x00, 0x2d, + 0x17, 0xd0, 0x34, 0x6e, 0x06, 0x22, 0x31, 0x1c, + 0x38, 0x1c, 0xf8, 0xf7, 0xd4, 0xfa, 0x3c, 0x00, + 0x54, 0x7e, 0x00, 0x00, 0x00, 0x28, 0x05, 0xd1, + 0x01, 0x20, 0x00, 0x2c, 0x00, 0xd0, 0x00, 0x20, + 0x04, 0x1c, 0x03, 0xe0, 0x01, 0x3d, 0x06, 0x36, + 0x00, 0x2d, 0xee, 0xd1, 0x00, 0x2c, 0x03, 0xd1, + 0x02, 0x4e, 0xb0, 0x6e, 0x01, 0x30, 0xb0, 0x66, + 0x20, 0x1c, 0xf8, 0xbd, 0x10, 0x79, 0x01, 0x00, + 0x30, 0xb5, 0x05, 0x1c, 0x00, 0x20, 0x06, 0x49, + 0x00, 0x22, 0x1c, 0x23, 0xcc, 0x56, 0xac, 0x42, + 0x3c, 0x00, 0x90, 0x7e, 0x00, 0x00, 0x01, 0xd1, + 0x08, 0x1c, 0x30, 0xbd, 0x01, 0x32, 0x48, 0x31, + 0x01, 0x2a, 0xf5, 0xd3, 0x30, 0xbd, 0xcc, 0x6d, + 0x01, 0x00, 0x10, 0xb5, 0x08, 0x4c, 0x00, 0x22, + 0x1c, 0x23, 0x53, 0x43, 0xe3, 0x58, 0x83, 0x42, + 0x04, 0xd1, 0x1c, 0x20, 0x50, 0x43, 0x00, 0x19, + 0x0a, 0x60, 0x10, 0xbd, 0x01, 0x32, 0x0e, 0x2a, + 0xf2, 0xd3, 0x00, 0x20, 0x10, 0xbd, 0xdc, 0x71, + 0x01, 0x00, 0x3c, 0x00, 0xcc, 0x7e, 0x00, 0x00, + 0xf0, 0xb5, 0x41, 0x68, 0x95, 0xb0, 0x07, 0x1c, + 0x90, 0x37, 0x13, 0x91, 0x04, 0x1c, 0xf8, 0x78, + 0x25, 0x1c, 0x80, 0x35, 0xc6, 0x07, 0x28, 0x79, + 0xf6, 0x0f, 0x4a, 0x49, 0x02, 0x28, 0x4d, 0xd1, + 0x0a, 0x6d, 0x00, 0x2a, 0x4a, 0xd0, 0x48, 0x68, + 0x01, 0x30, 0x48, 0x60, 0x0a, 0xf0, 0x58, 0xff, + 0x44, 0x49, 0x08, 0x61, 0x48, 0x61, 0x13, 0x99, + 0x09, 0x79, 0xc9, 0x07, 0x3c, 0x00, 0x08, 0x7f, + 0x00, 0x00, 0x01, 0xd4, 0x41, 0x49, 0x88, 0x61, + 0x20, 0x68, 0x06, 0x22, 0x06, 0x90, 0xa1, 0x68, + 0x03, 0xa8, 0xf8, 0xf7, 0xee, 0xfa, 0x06, 0x22, + 0x04, 0xa8, 0x02, 0x30, 0xe1, 0x68, 0xf8, 0xf7, + 0xe8, 0xfa, 0x07, 0xa8, 0x06, 0x22, 0x21, 0x69, + 0xf8, 0xf7, 0xe3, 0xfa, 0xb8, 0x78, 0x08, 0xab, + 0x00, 0x21, 0x98, 0x70, 0x0c, 0x96, 0x63, 0x6a, + 0x20, 0x1c, 0xa0, 0x30, 0x0a, 0x1c, 0x3c, 0x00, + 0x44, 0x7f, 0x00, 0x00, 0x00, 0x2b, 0x02, 0xd0, + 0x02, 0x8a, 0x52, 0x07, 0x52, 0x0f, 0x08, 0xab, + 0xda, 0x70, 0x00, 0xab, 0x99, 0x84, 0x13, 0x99, + 0x09, 0x88, 0xc9, 0x0b, 0xd9, 0x84, 0x69, 0x6b, + 0x10, 0xab, 0x10, 0x91, 0xa9, 0x6b, 0x11, 0x91, + 0x80, 0x8b, 0x29, 0x49, 0x18, 0x81, 0x09, 0x6d, + 0x03, 0xa8, 0xf8, 0xf7, 0x32, 0xfa, 0x29, 0x79, + 0x68, 0x6b, 0x0b, 0xf0, 0x4d, 0xfd, 0x29, 0x79, + 0x3c, 0x00, 0x80, 0x7f, 0x00, 0x00, 0xa8, 0x6b, + 0x0b, 0xf0, 0x67, 0xfd, 0x3d, 0xe0, 0x00, 0x28, + 0x38, 0xd1, 0x48, 0x6d, 0x14, 0x90, 0x00, 0x28, + 0x34, 0xd0, 0x20, 0x68, 0x06, 0x22, 0x03, 0x90, + 0xa1, 0x68, 0x68, 0x46, 0xf8, 0xf7, 0xab, 0xfa, + 0x06, 0x22, 0x68, 0x46, 0x80, 0x18, 0xe1, 0x68, + 0xf8, 0xf7, 0xa5, 0xfa, 0x05, 0xa8, 0x06, 0x22, + 0x21, 0x69, 0xf8, 0xf7, 0xa0, 0xfa, 0x00, 0x21, + 0x04, 0x91, 0x3c, 0x00, 0xbc, 0x7f, 0x00, 0x00, + 0xb9, 0x78, 0x08, 0xa8, 0x10, 0xab, 0x01, 0x72, + 0x08, 0x96, 0xe9, 0x68, 0x0b, 0x91, 0x69, 0x79, + 0x41, 0x72, 0x68, 0x6b, 0x0e, 0x90, 0xa8, 0x6b, + 0x10, 0x90, 0x28, 0x8d, 0xd8, 0x80, 0x68, 0x8d, + 0x18, 0x81, 0xe1, 0x69, 0x0c, 0xa8, 0x00, 0x29, + 0x04, 0xd0, 0x89, 0x79, 0x01, 0x70, 0x20, 0x6a, + 0x0d, 0x90, 0x01, 0xe0, 0x07, 0x21, 0x01, 0x70, + 0x68, 0x46, 0x14, 0x99, 0x3c, 0x00, 0xf8, 0x7f, + 0x00, 0x00, 0xf8, 0xf7, 0xef, 0xf9, 0x02, 0xe0, + 0x20, 0x68, 0xf9, 0xf7, 0xca, 0xfa, 0x20, 0x1c, + 0xf9, 0xf7, 0xf5, 0xfb, 0x15, 0xb0, 0xf0, 0xbd, + 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0xb0, 0xb5, + 0x04, 0x1c, 0xc0, 0x68, 0x06, 0x22, 0x01, 0x89, + 0x0c, 0x31, 0x01, 0x81, 0x05, 0x68, 0x21, 0x1c, + 0x0c, 0x3d, 0x05, 0x60, 0xa8, 0x18, 0xf8, 0xf7, + 0x64, 0xfa, 0x06, 0x22, 0xa1, 0x18, 0x3c, 0x00, + 0x34, 0x80, 0x00, 0x00, 0x28, 0x1c, 0xf8, 0xf7, + 0x5f, 0xfa, 0xa0, 0x8f, 0x00, 0x09, 0xe0, 0x62, + 0x20, 0x63, 0x03, 0x48, 0x01, 0x69, 0x20, 0x1c, + 0xf8, 0xf7, 0xc7, 0xf9, 0xb0, 0xbd, 0x00, 0x00, + 0x7c, 0x79, 0x01, 0x00, 0xf8, 0xb5, 0x06, 0x1c, + 0x60, 0x36, 0x05, 0x1c, 0x70, 0x7a, 0x0c, 0x23, + 0x25, 0x49, 0x58, 0x43, 0x44, 0x18, 0xa8, 0x6b, + 0x00, 0x27, 0x00, 0x28, 0x06, 0xd0, 0xa0, 0x78, + 0x3c, 0x00, 0x70, 0x80, 0x00, 0x00, 0x01, 0x28, + 0x03, 0xd1, 0xa7, 0x70, 0x70, 0x7a, 0x0a, 0xf0, + 0xb6, 0xfd, 0x2a, 0x1c, 0x0c, 0x21, 0x80, 0x20, + 0x0b, 0xf0, 0x95, 0xfb, 0xa8, 0x6b, 0x00, 0x28, + 0x33, 0xd0, 0xa0, 0x78, 0x02, 0x28, 0x0b, 0xd0, + 0x04, 0x28, 0x22, 0xd1, 0xa7, 0x70, 0x2f, 0x1c, + 0x40, 0x37, 0x78, 0x78, 0x02, 0x28, 0x0c, 0xd1, + 0x70, 0x7a, 0x0a, 0xf0, 0xa0, 0xfd, 0x18, 0xe0, + 0x03, 0x20, 0x3c, 0x00, 0xac, 0x80, 0x00, 0x00, + 0xa0, 0x70, 0x12, 0x49, 0x00, 0x20, 0x14, 0x39, + 0x09, 0x69, 0xf8, 0xf7, 0x90, 0xf9, 0x0f, 0xe0, + 0x2c, 0x1c, 0x07, 0xe0, 0x78, 0x78, 0x41, 0x21, + 0x22, 0x1c, 0x08, 0x55, 0x0c, 0x21, 0x80, 0x20, + 0x0b, 0xf0, 0x70, 0xfb, 0x60, 0x34, 0x60, 0x7a, + 0x04, 0xf0, 0x20, 0xff, 0x04, 0x1c, 0xf1, 0xd1, + 0x70, 0x7a, 0x40, 0x35, 0xa9, 0x8b, 0x00, 0x02, + 0x09, 0x09, 0x09, 0x04, 0x3c, 0x00, 0xe8, 0x80, + 0x00, 0x00, 0x08, 0x43, 0x81, 0x21, 0x01, 0x43, + 0x0c, 0x20, 0x0b, 0xf0, 0xa0, 0xfa, 0xf8, 0xbd, + 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, 0xf8, 0xb5, + 0x1c, 0x49, 0x05, 0x1c, 0x88, 0x6a, 0x01, 0x30, + 0x88, 0x62, 0x28, 0x1c, 0x0b, 0xf0, 0x7d, 0xfd, + 0x04, 0x1c, 0x11, 0xd0, 0x2b, 0x1c, 0x20, 0x33, + 0x1e, 0x1c, 0x5a, 0x79, 0x20, 0x1c, 0xb4, 0x30, + 0x19, 0x79, 0x14, 0x4f, 0xfd, 0xf7, 0x3c, 0x00, + 0x24, 0x81, 0x00, 0x00, 0x89, 0xf8, 0xaa, 0x7a, + 0x20, 0x1c, 0xb8, 0x30, 0xb1, 0x79, 0xfd, 0xf7, + 0xb9, 0xf8, 0x00, 0x2f, 0x04, 0xd1, 0x01, 0x21, + 0x28, 0x68, 0xfa, 0xf7, 0x6d, 0xfa, 0xf8, 0xbd, + 0x60, 0x68, 0xbc, 0x21, 0xc0, 0x8a, 0x08, 0x53, + 0x28, 0x68, 0x00, 0x21, 0xfa, 0xf7, 0x64, 0xfa, + 0x00, 0x28, 0x09, 0xd0, 0x06, 0x49, 0xc8, 0x6a, + 0x01, 0x30, 0xc8, 0x62, 0x00, 0x2c, 0xee, 0xd0, + 0x3c, 0x00, 0x60, 0x81, 0x00, 0x00, 0x20, 0x1c, + 0xf9, 0xf7, 0x47, 0xfb, 0xea, 0xe7, 0x20, 0x1c, + 0xf8, 0xf7, 0x3c, 0xf9, 0xe6, 0xe7, 0xc4, 0x69, + 0x01, 0x00, 0xa1, 0xff, 0x00, 0x00, 0xf8, 0xb5, + 0x16, 0x4c, 0x05, 0x1f, 0x00, 0x22, 0x21, 0x1c, + 0xa0, 0x31, 0x03, 0xe0, 0x28, 0x68, 0xa0, 0x42, + 0x09, 0xd0, 0x20, 0x34, 0xa1, 0x42, 0xf9, 0xd1, + 0x00, 0x2a, 0x04, 0xd1, 0x02, 0x21, 0x8e, 0x20, + 0xf9, 0xf7, 0x3c, 0x00, 0x9c, 0x81, 0x00, 0x00, + 0x83, 0xf8, 0xf8, 0xbd, 0x0d, 0x4f, 0xbe, 0x79, + 0x60, 0x69, 0x01, 0x30, 0x60, 0x61, 0xf8, 0xf7, + 0x97, 0xfd, 0xa8, 0x42, 0x07, 0xd1, 0xa0, 0x88, + 0x04, 0x30, 0xf8, 0xf7, 0x97, 0xfd, 0xe0, 0x69, + 0x01, 0x30, 0xe0, 0x61, 0x05, 0xe0, 0x20, 0x68, + 0x28, 0x60, 0x25, 0x60, 0xa0, 0x69, 0x01, 0x30, + 0xa0, 0x61, 0xbe, 0x71, 0xe5, 0xe7, 0x00, 0x00, + 0xd0, 0x5c, 0x01, 0x00, 0x3c, 0x00, 0xd8, 0x81, + 0x00, 0x00, 0x20, 0x10, 0x07, 0x00, 0x00, 0x29, + 0x01, 0xdb, 0x06, 0x29, 0x01, 0xdb, 0x02, 0x20, + 0x70, 0x47, 0x06, 0x4b, 0xc9, 0x00, 0x5a, 0x5c, + 0xc9, 0x18, 0x02, 0x70, 0x4a, 0x78, 0x42, 0x70, + 0x8a, 0x78, 0x82, 0x70, 0x49, 0x68, 0x41, 0x60, + 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0xcc, 0x5a, + 0x01, 0x00, 0xb0, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, + 0x05, 0x28, 0x01, 0xd3, 0xf9, 0xf7, 0x3c, 0x00, + 0x14, 0x82, 0x00, 0x00, 0x75, 0xf8, 0x10, 0x48, + 0x40, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x03, 0x24, + 0x10, 0x2d, 0x00, 0xd3, 0x0f, 0x25, 0x06, 0x20, + 0x0b, 0x49, 0x60, 0x43, 0x12, 0x31, 0x40, 0x18, + 0x41, 0x78, 0x80, 0x78, 0x49, 0x19, 0x09, 0x06, + 0x09, 0x0e, 0x88, 0x42, 0x00, 0xd2, 0x01, 0x1c, + 0x01, 0x20, 0x88, 0x40, 0x05, 0x49, 0x01, 0x38, + 0x09, 0x68, 0x08, 0x40, 0x00, 0x04, 0x00, 0x0c, + 0x3c, 0x00, 0x50, 0x82, 0x00, 0x00, 0x02, 0xf0, + 0x44, 0xfe, 0xb0, 0xbd, 0x00, 0x00, 0xd4, 0x7a, + 0x01, 0x00, 0x08, 0x20, 0x07, 0x00, 0xb0, 0xb5, + 0x04, 0x1c, 0x0d, 0x1c, 0x09, 0xf0, 0xcf, 0xfd, + 0x00, 0x28, 0x03, 0xd1, 0x20, 0x1c, 0x09, 0xf0, + 0x82, 0xfd, 0x05, 0x61, 0xb0, 0xbd, 0x80, 0xb5, + 0x0a, 0xf0, 0x97, 0xfd, 0x03, 0x4a, 0x0c, 0x32, + 0x06, 0xca, 0x89, 0x18, 0x08, 0x1a, 0x80, 0xbd, + 0x00, 0x00, 0x3c, 0x00, 0x8c, 0x82, 0x00, 0x00, + 0xa0, 0x7d, 0x01, 0x00, 0x70, 0xb5, 0x0b, 0x4c, + 0x04, 0x9e, 0x64, 0x68, 0x0d, 0xe0, 0x65, 0x68, + 0x85, 0x42, 0x09, 0xd1, 0x20, 0x7a, 0x08, 0x70, + 0xe0, 0x68, 0x10, 0x60, 0x20, 0x69, 0x18, 0x60, + 0x20, 0x7d, 0x30, 0x80, 0x01, 0x20, 0x70, 0xbd, + 0x24, 0x68, 0x00, 0x2c, 0xef, 0xd1, 0x00, 0x20, + 0x70, 0xbd, 0x00, 0x00, 0xa4, 0x6e, 0x01, 0x00, + 0x10, 0xb5, 0x04, 0x1c, 0x3c, 0x00, 0xc8, 0x82, + 0x00, 0x00, 0x20, 0x30, 0x81, 0x7b, 0x20, 0x69, + 0x04, 0x30, 0xfd, 0xf7, 0x64, 0xf9, 0x01, 0x1c, + 0x62, 0x20, 0x02, 0x5b, 0x63, 0x6a, 0x40, 0x34, + 0x20, 0x78, 0x02, 0xf0, 0xce, 0xfd, 0x10, 0xbd, + 0x00, 0x00, 0x0b, 0x49, 0x10, 0xb5, 0x08, 0x88, + 0x8a, 0x69, 0x0a, 0x23, 0x50, 0x43, 0x58, 0x43, + 0x0e, 0xd0, 0x08, 0x4a, 0x53, 0x89, 0x94, 0x88, + 0xd2, 0x88, 0x1b, 0x19, 0x52, 0x04, 0x3c, 0x00, + 0x04, 0x83, 0x00, 0x00, 0x52, 0x0c, 0x9a, 0x18, + 0xc9, 0x68, 0x06, 0x32, 0x4a, 0x43, 0x0a, 0x21, + 0x51, 0x43, 0xf8, 0xf7, 0xfd, 0xf9, 0x10, 0xbd, + 0xc8, 0x74, 0x01, 0x00, 0x30, 0x00, 0x07, 0x00, + 0x10, 0xb5, 0x43, 0x1c, 0x01, 0xd1, 0x10, 0x48, + 0x10, 0xbd, 0x0f, 0x4a, 0x0e, 0x4b, 0x94, 0x3a, + 0x12, 0x68, 0x44, 0x3b, 0x1b, 0x7a, 0x10, 0xe0, + 0x54, 0x68, 0x84, 0x42, 0x0c, 0xd1, 0x00, 0x29, + 0x3c, 0x00, 0x40, 0x83, 0x00, 0x00, 0x0f, 0xd1, + 0x02, 0x2b, 0x03, 0xd1, 0xd4, 0x7b, 0x02, 0x2c, + 0x0a, 0xd2, 0x04, 0xe0, 0x00, 0x2b, 0x05, 0xd1, + 0xd4, 0x7b, 0xe4, 0x07, 0x04, 0xd4, 0x12, 0x68, + 0x00, 0x2a, 0xec, 0xd1, 0x00, 0x20, 0x10, 0xbd, + 0x10, 0x1c, 0x10, 0xbd, 0x00, 0x00, 0x38, 0x6f, + 0x01, 0x00, 0x01, 0x1c, 0x01, 0x20, 0x01, 0x29, + 0x00, 0xd0, 0x00, 0x20, 0x70, 0x47, 0x00, 0xb5, + 0x02, 0x1c, 0x3c, 0x00, 0x7c, 0x83, 0x00, 0x00, + 0xfd, 0xf7, 0xce, 0xf8, 0x00, 0x28, 0x08, 0xd0, + 0x10, 0x1c, 0xff, 0xf7, 0xf1, 0xff, 0x18, 0x23, + 0x03, 0x49, 0x58, 0x43, 0x40, 0x18, 0x00, 0x69, + 0x00, 0xbd, 0x00, 0x20, 0x00, 0xbd, 0x00, 0x00, + 0x94, 0x67, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x28, + 0x00, 0xd1, 0x08, 0x48, 0x07, 0x49, 0x00, 0x68, + 0x50, 0x31, 0x09, 0x7a, 0x00, 0x29, 0x02, 0xd0, + 0x02, 0x29, 0x04, 0xd1, 0x3c, 0x00, 0xb8, 0x83, + 0x00, 0x00, 0x00, 0xe0, 0x01, 0x21, 0x00, 0xf0, + 0x06, 0xf8, 0x80, 0xbd, 0x00, 0x20, 0x80, 0xbd, + 0x00, 0x00, 0xa4, 0x6e, 0x01, 0x00, 0x12, 0x4a, + 0x12, 0x4b, 0x12, 0x7a, 0x2c, 0x3b, 0x00, 0x2a, + 0x03, 0xd1, 0x5a, 0x68, 0x00, 0x2a, 0x18, 0xd1, + 0x04, 0xe0, 0x02, 0x2a, 0x02, 0xd1, 0x9a, 0x68, + 0x00, 0x2a, 0x12, 0xd1, 0x00, 0x20, 0x70, 0x47, + 0xc2, 0x7b, 0x8a, 0x42, 0x01, 0xd0, 0x3c, 0x00, + 0xf4, 0x83, 0x00, 0x00, 0x03, 0x2a, 0x0a, 0xd1, + 0x82, 0x7e, 0x01, 0x2a, 0x07, 0xd1, 0x02, 0x7f, + 0x01, 0x32, 0x12, 0x06, 0x12, 0x0e, 0x02, 0x77, + 0xc3, 0x7e, 0x9a, 0x42, 0xee, 0xd2, 0x00, 0x68, + 0x00, 0x28, 0xec, 0xd1, 0x70, 0x47, 0x00, 0x00, + 0xf4, 0x6e, 0x01, 0x00, 0xf7, 0xb5, 0x84, 0x46, + 0x00, 0x20, 0x01, 0x27, 0x00, 0x24, 0x00, 0x25, + 0x88, 0xb0, 0x07, 0xe0, 0x62, 0x46, 0x52, 0x5d, + 0x3c, 0x00, 0x30, 0x84, 0x00, 0x00, 0x00, 0x2a, + 0x05, 0xd0, 0xab, 0x00, 0x6e, 0x46, 0xf2, 0x50, + 0x01, 0x35, 0x8d, 0x42, 0xf5, 0xd3, 0x00, 0x2d, + 0x00, 0xd0, 0x01, 0x20, 0x00, 0x28, 0x28, 0xd0, + 0x00, 0x27, 0x16, 0x4c, 0x6e, 0x46, 0x22, 0xe0, + 0x20, 0x1c, 0x00, 0xf0, 0x30, 0xf8, 0x01, 0x28, + 0x01, 0xd0, 0x07, 0x28, 0x06, 0xd1, 0x00, 0x21, + 0x20, 0x1c, 0x00, 0xf0, 0x34, 0xf8, 0x31, 0x68, + 0x88, 0x42, 0x3c, 0x00, 0x6c, 0x84, 0x00, 0x00, + 0x01, 0xd2, 0x02, 0x27, 0x14, 0xe0, 0x20, 0x68, + 0xc9, 0x00, 0x0c, 0x18, 0x08, 0x3c, 0x20, 0x1c, + 0x00, 0xf0, 0x1c, 0xf8, 0x07, 0x28, 0x07, 0xd1, + 0x01, 0x20, 0x01, 0x2d, 0x00, 0xd0, 0x00, 0x20, + 0x24, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x08, 0x34, + 0x01, 0x3d, 0x04, 0x36, 0x00, 0x2d, 0xda, 0xd1, + 0x0a, 0x98, 0x04, 0x60, 0x0b, 0xb0, 0x38, 0x1c, + 0xf0, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0x84, + 0x00, 0x00, 0x20, 0x52, 0x01, 0x00, 0x00, 0x68, + 0x00, 0x29, 0x01, 0xd0, 0x80, 0x02, 0x80, 0x0a, + 0x70, 0x47, 0x10, 0xb5, 0x40, 0x68, 0x80, 0x00, + 0x44, 0x0f, 0x08, 0x2c, 0x03, 0xd3, 0x02, 0x21, + 0x87, 0x20, 0xf8, 0xf7, 0xec, 0xfe, 0x20, 0x1c, + 0x10, 0xbd, 0x00, 0x29, 0x02, 0xd0, 0x00, 0x68, + 0x80, 0x0d, 0x70, 0x47, 0x40, 0x68, 0x80, 0x05, + 0x80, 0x0d, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, + 0xe4, 0x84, 0x00, 0x00, 0x10, 0xb5, 0x40, 0x68, + 0x40, 0x01, 0x44, 0x0f, 0x05, 0x2c, 0x03, 0xd3, + 0x05, 0x21, 0x87, 0x20, 0xf8, 0xf7, 0xd6, 0xfe, + 0x20, 0x1c, 0x10, 0xbd, 0xf8, 0xb5, 0x05, 0x1c, + 0x88, 0x0a, 0x00, 0x90, 0x1c, 0x48, 0x8e, 0x05, + 0xc0, 0x69, 0xb6, 0x0d, 0x17, 0x1c, 0x1c, 0x1c, + 0x00, 0x28, 0x05, 0xd1, 0x18, 0x48, 0x81, 0x69, + 0x8d, 0x42, 0x1d, 0xd0, 0x85, 0x61, 0x11, 0xe0, + 0x3c, 0x00, 0x20, 0x85, 0x00, 0x00, 0xfd, 0xf7, + 0xe8, 0xf8, 0x15, 0x49, 0x09, 0x78, 0x0e, 0x29, + 0x07, 0xd1, 0x00, 0x28, 0x05, 0xd0, 0x11, 0x49, + 0x50, 0x31, 0x06, 0x23, 0xc9, 0x56, 0xf9, 0xf7, + 0x06, 0xfa, 0x0e, 0x49, 0x00, 0x20, 0xc8, 0x61, + 0x8d, 0x61, 0x29, 0x1c, 0x20, 0x1c, 0xf8, 0xf7, + 0xe2, 0xf8, 0x79, 0x43, 0x20, 0x1c, 0xf8, 0xf7, + 0xde, 0xf8, 0x08, 0x48, 0x41, 0x61, 0x20, 0x1c, + 0x00, 0x99, 0x3c, 0x00, 0x5c, 0x85, 0x00, 0x00, + 0xf8, 0xf7, 0xd8, 0xf8, 0x05, 0x48, 0x40, 0x69, + 0x0a, 0x18, 0xa2, 0x42, 0x01, 0xd2, 0x40, 0x18, + 0x01, 0xe0, 0x40, 0x18, 0x00, 0x1b, 0x80, 0x02, + 0x80, 0x19, 0xf8, 0xbd, 0xac, 0x7c, 0x01, 0x00, + 0x11, 0x67, 0x01, 0x00, 0xf8, 0xb5, 0x0f, 0x1c, + 0x06, 0x1c, 0x14, 0x1c, 0x1d, 0x1c, 0x07, 0xf0, + 0xa1, 0xfc, 0x0e, 0x28, 0x09, 0xd1, 0x20, 0x1c, + 0x02, 0xf0, 0xfc, 0xfb, 0x3c, 0x00, 0x98, 0x85, + 0x00, 0x00, 0x00, 0x28, 0x04, 0xd0, 0x08, 0x48, + 0x00, 0x78, 0x02, 0xf0, 0xe4, 0xfb, 0x04, 0x1c, + 0x01, 0x21, 0x00, 0x2e, 0xac, 0x72, 0x00, 0xd0, + 0x39, 0x1c, 0x20, 0x1c, 0x02, 0xf0, 0x07, 0xfc, + 0x28, 0x60, 0x00, 0x20, 0x28, 0x72, 0x6c, 0x72, + 0xf8, 0xbd, 0x90, 0x57, 0x01, 0x00, 0x03, 0x1c, + 0x0a, 0x48, 0x10, 0xb5, 0x00, 0x24, 0x02, 0x1c, + 0xa0, 0x32, 0x03, 0xe0, 0x81, 0x88, 0x3c, 0x00, + 0xd4, 0x85, 0x00, 0x00, 0x99, 0x42, 0x09, 0xd2, + 0x20, 0x30, 0x82, 0x42, 0xf9, 0xd1, 0x00, 0x2c, + 0x04, 0xd1, 0x02, 0x21, 0x8e, 0x20, 0xf8, 0xf7, + 0x5d, 0xfe, 0x00, 0x20, 0x10, 0xbd, 0x00, 0x00, + 0xd0, 0x5c, 0x01, 0x00, 0xff, 0xb5, 0x06, 0x1c, + 0x00, 0x20, 0x81, 0xb0, 0x10, 0x60, 0x1f, 0x1c, + 0x01, 0x25, 0x14, 0x1c, 0x30, 0x1c, 0xff, 0xf7, + 0x6d, 0xff, 0x05, 0x28, 0x12, 0xd2, 0x02, 0xa3, + 0x3c, 0x00, 0x10, 0x86, 0x00, 0x00, 0x1b, 0x5c, + 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x00, 0x03, 0x03, + 0x03, 0x03, 0x08, 0x00, 0x39, 0x1c, 0x30, 0x1c, + 0xff, 0xf7, 0x55, 0xff, 0x03, 0xe0, 0x02, 0x98, + 0xf8, 0xf7, 0xeb, 0xf8, 0x01, 0x30, 0x20, 0x60, + 0x04, 0xe0, 0x05, 0x21, 0x87, 0x20, 0xf8, 0xf7, + 0x34, 0xfe, 0x00, 0x25, 0x20, 0x68, 0x80, 0x28, + 0x04, 0xd9, 0x06, 0x21, 0x87, 0x20, 0xf8, 0xf7, + 0x2c, 0xfe, 0x3c, 0x00, 0x4c, 0x86, 0x00, 0x00, + 0x00, 0x25, 0x28, 0x1c, 0x05, 0xb0, 0xf0, 0xbd, + 0x70, 0xb5, 0x17, 0x4c, 0x60, 0x6c, 0x00, 0x28, + 0x01, 0xd0, 0x01, 0x20, 0x1d, 0xe0, 0x16, 0x4e, + 0x14, 0x4d, 0x31, 0x88, 0xa0, 0x6c, 0x00, 0x28, + 0x08, 0xd0, 0x28, 0x78, 0x81, 0x42, 0x05, 0xd9, + 0xf8, 0xf7, 0x4c, 0xf8, 0x01, 0x38, 0xfa, 0xf7, + 0x51, 0xfe, 0x0e, 0xe0, 0xe0, 0x6c, 0x00, 0x28, + 0x0a, 0xd0, 0x00, 0x20, 0x3c, 0x00, 0x88, 0x86, + 0x00, 0x00, 0xfa, 0xf7, 0x4a, 0xfe, 0x29, 0x78, + 0x32, 0x88, 0x91, 0x42, 0x04, 0xd9, 0x90, 0x42, + 0x02, 0xd9, 0x10, 0x1c, 0x00, 0xe0, 0x08, 0x1c, + 0xfa, 0xf7, 0xdf, 0xfd, 0xe1, 0x6b, 0x44, 0x1a, + 0x0a, 0xf0, 0x81, 0xfb, 0x20, 0x1a, 0x00, 0xd5, + 0x00, 0x20, 0x70, 0xbd, 0x00, 0x00, 0x44, 0x7d, + 0x01, 0x00, 0xf8, 0x60, 0x01, 0x00, 0xfc, 0x60, + 0x01, 0x00, 0xff, 0xb5, 0x27, 0x4e, 0x3c, 0x00, + 0xc4, 0x86, 0x00, 0x00, 0x04, 0x1c, 0xb0, 0x79, + 0x0f, 0x1c, 0x15, 0x1c, 0x81, 0xb0, 0x00, 0x90, + 0x0a, 0xf0, 0x6c, 0xfb, 0xc1, 0x19, 0x23, 0x48, + 0x07, 0x68, 0x00, 0x2f, 0x05, 0xd1, 0x0a, 0x21, + 0x80, 0x20, 0xf8, 0xf7, 0xdf, 0xfd, 0x05, 0xb0, + 0xf0, 0xbd, 0x1e, 0x48, 0x40, 0x68, 0x84, 0x46, + 0x00, 0x28, 0x01, 0xd1, 0x00, 0x22, 0x0e, 0xe0, + 0x82, 0x68, 0x03, 0x68, 0xab, 0x42, 0x07, 0xd1, + 0x3c, 0x00, 0x00, 0x87, 0x00, 0x00, 0x03, 0x79, + 0xa3, 0x42, 0x04, 0xd1, 0x0b, 0x21, 0x80, 0x20, + 0xf8, 0xf7, 0xcb, 0xfd, 0x23, 0xe0, 0xc0, 0x68, + 0x00, 0x28, 0xf1, 0xd1, 0x13, 0x4b, 0xf8, 0x68, + 0x18, 0x60, 0x3d, 0x60, 0x3c, 0x71, 0xb9, 0x60, + 0x04, 0x98, 0x8d, 0x1a, 0x38, 0x61, 0x60, 0x46, + 0x00, 0x23, 0x05, 0xe0, 0x84, 0x68, 0xa4, 0x1a, + 0xac, 0x42, 0x03, 0xda, 0x03, 0x1c, 0xc0, 0x68, + 0x00, 0x28, 0x3c, 0x00, 0x3c, 0x87, 0x00, 0x00, + 0xf7, 0xd1, 0xf8, 0x60, 0x00, 0x2b, 0x08, 0xd1, + 0x07, 0x48, 0x3b, 0x1c, 0x47, 0x60, 0x08, 0x48, + 0x06, 0x4a, 0x00, 0x88, 0x0a, 0xf0, 0x8a, 0xfb, + 0x00, 0xe0, 0xdf, 0x60, 0x00, 0x98, 0xb0, 0x71, + 0xc3, 0xe7, 0x00, 0x00, 0x20, 0x10, 0x07, 0x00, + 0x7c, 0x5d, 0x01, 0x00, 0x21, 0x38, 0x01, 0x00, + 0x2c, 0x74, 0x01, 0x00, 0xf3, 0xb5, 0x83, 0xb0, + 0x04, 0x1c, 0x09, 0xd0, 0x3c, 0x00, 0x78, 0x87, + 0x00, 0x00, 0x20, 0x1c, 0x04, 0x99, 0x09, 0xf0, + 0x8e, 0xfb, 0x00, 0x28, 0x03, 0xd0, 0x20, 0x1c, + 0x30, 0x30, 0x05, 0xb0, 0xf0, 0xbd, 0x0a, 0xf0, + 0x0e, 0xfb, 0x1e, 0x4a, 0x00, 0x26, 0x04, 0x9f, + 0x01, 0x96, 0x00, 0x90, 0x02, 0x92, 0x02, 0x9c, + 0x00, 0x25, 0x39, 0x1c, 0x20, 0x1c, 0x14, 0x30, + 0x02, 0xf0, 0xc5, 0xfa, 0x00, 0x28, 0x01, 0xd0, + 0x26, 0x1c, 0x03, 0xe0, 0x01, 0x35, 0x3c, 0x00, + 0xb4, 0x87, 0x00, 0x00, 0x1c, 0x34, 0x04, 0x2d, + 0xf2, 0xd3, 0x00, 0x2e, 0x22, 0xd1, 0x01, 0x98, + 0x13, 0x4f, 0x01, 0x30, 0x01, 0x90, 0x02, 0x28, + 0xe8, 0xd3, 0x01, 0x21, 0xc9, 0x06, 0x02, 0x9a, + 0x00, 0x20, 0x13, 0x69, 0x00, 0x9c, 0xe3, 0x1a, + 0x8b, 0x42, 0x01, 0xdd, 0x19, 0x1c, 0x16, 0x1c, + 0x01, 0x30, 0x1c, 0x32, 0x04, 0x28, 0xf4, 0xd3, + 0x30, 0x68, 0x00, 0x28, 0x01, 0xd0, 0xf8, 0xf7, + 0x3c, 0x00, 0xf0, 0x87, 0x00, 0x00, 0xd3, 0xfe, + 0x30, 0x1c, 0xfd, 0xf7, 0x4a, 0xff, 0x30, 0x1c, + 0x14, 0x30, 0x06, 0x22, 0x04, 0x99, 0xf7, 0xf7, + 0x7a, 0xfe, 0x00, 0x9c, 0x30, 0x1c, 0x34, 0x61, + 0xbd, 0xe7, 0x30, 0x6a, 0x01, 0x00, 0x34, 0x42, + 0x01, 0x00, 0x09, 0x49, 0x10, 0xb5, 0x4c, 0x69, + 0x03, 0xe0, 0xe1, 0x68, 0x81, 0x42, 0x03, 0xd0, + 0x24, 0x68, 0x00, 0x2c, 0xf9, 0xd1, 0x01, 0xe0, + 0x00, 0x2c, 0x3c, 0x00, 0x2c, 0x88, 0x00, 0x00, + 0x03, 0xd1, 0x02, 0x21, 0x02, 0x20, 0xf8, 0xf7, + 0x37, 0xfd, 0x20, 0x1c, 0x10, 0xbd, 0x00, 0x00, + 0xfc, 0x5a, 0x01, 0x00, 0x10, 0xb5, 0xc3, 0x07, + 0x06, 0xd5, 0x08, 0x4b, 0x5c, 0x69, 0x0c, 0x43, + 0x5c, 0x61, 0x1c, 0x7e, 0x14, 0x43, 0x1c, 0x76, + 0x80, 0x07, 0x06, 0xd5, 0x04, 0x48, 0x43, 0x69, + 0x19, 0x43, 0x41, 0x61, 0x01, 0x7e, 0x11, 0x43, + 0x01, 0x76, 0x10, 0xbd, 0x3c, 0x00, 0x68, 0x88, + 0x00, 0x00, 0xfc, 0x57, 0x01, 0x00, 0x18, 0x58, + 0x01, 0x00, 0x70, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, + 0x16, 0x1c, 0x00, 0xf0, 0x08, 0xf8, 0xa0, 0x07, + 0xc0, 0x17, 0x01, 0x30, 0x32, 0x1c, 0x29, 0x1c, + 0x00, 0xf0, 0x21, 0xf8, 0x70, 0xbd, 0x10, 0xb5, + 0xc3, 0x07, 0x06, 0xd5, 0x08, 0x4b, 0x5c, 0x69, + 0x8c, 0x43, 0x5c, 0x61, 0x1c, 0x7e, 0x94, 0x43, + 0x1c, 0x76, 0x80, 0x07, 0x06, 0xd5, 0x3c, 0x00, + 0xa4, 0x88, 0x00, 0x00, 0x04, 0x48, 0x43, 0x69, + 0x8b, 0x43, 0x43, 0x61, 0x01, 0x7e, 0x91, 0x43, + 0x01, 0x76, 0x10, 0xbd, 0xfc, 0x57, 0x01, 0x00, + 0x18, 0x58, 0x01, 0x00, 0x03, 0x22, 0x11, 0x1f, + 0x80, 0xb5, 0x01, 0x20, 0x00, 0xf0, 0x02, 0xf8, + 0x80, 0xbd, 0x00, 0x00, 0x30, 0xb5, 0x15, 0x1c, + 0x0c, 0x1c, 0x00, 0x28, 0x87, 0xb0, 0x02, 0xd0, + 0x1c, 0x22, 0x22, 0x49, 0x01, 0xe0, 0x22, 0x49, + 0x3c, 0x00, 0xe0, 0x88, 0x00, 0x00, 0x1c, 0x22, + 0x68, 0x46, 0xf7, 0xf7, 0x64, 0xfe, 0x05, 0x99, + 0x00, 0xab, 0x1a, 0x7e, 0x8c, 0x43, 0x20, 0x1c, + 0x95, 0x43, 0x02, 0x9a, 0x29, 0x1c, 0x02, 0x40, + 0x02, 0x92, 0x01, 0x9a, 0x02, 0x40, 0x01, 0x92, + 0x00, 0x9a, 0x02, 0x40, 0x00, 0x92, 0x03, 0x9a, + 0x02, 0x40, 0x03, 0x92, 0x98, 0x7c, 0x08, 0x40, + 0x98, 0x74, 0x58, 0x7c, 0x08, 0x40, 0x58, 0x74, + 0x18, 0x7c, 0x3c, 0x00, 0x1c, 0x89, 0x00, 0x00, + 0x08, 0x40, 0x18, 0x74, 0xd8, 0x7c, 0x08, 0x40, + 0xd8, 0x74, 0x02, 0x99, 0x10, 0x48, 0x41, 0x61, + 0x01, 0xaa, 0x06, 0xca, 0x91, 0x43, 0x81, 0x61, + 0x81, 0x68, 0x01, 0x9a, 0x11, 0x43, 0x81, 0x60, + 0x81, 0x68, 0x00, 0x9a, 0x91, 0x43, 0x81, 0x60, + 0x00, 0xaa, 0x06, 0xca, 0x11, 0x43, 0x42, 0x68, + 0x11, 0x43, 0x41, 0x60, 0x41, 0x68, 0x03, 0x9a, + 0x91, 0x43, 0x41, 0x60, 0x3c, 0x00, 0x58, 0x89, + 0x00, 0x00, 0x04, 0xa8, 0x0b, 0xf0, 0x01, 0xf8, + 0x07, 0xb0, 0x30, 0xbd, 0x00, 0x00, 0xfc, 0x57, + 0x01, 0x00, 0x18, 0x58, 0x01, 0x00, 0x10, 0x00, + 0x07, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x01, 0x1c, + 0x01, 0x20, 0x08, 0xf0, 0xe0, 0xf9, 0x00, 0x2c, + 0x02, 0xd0, 0x03, 0xf0, 0x1c, 0xff, 0x10, 0xbd, + 0xfe, 0xf7, 0xd1, 0xfc, 0x10, 0xbd, 0xf0, 0xb5, + 0x0c, 0x1c, 0x01, 0x0e, 0x01, 0x23, 0x3c, 0x00, + 0x94, 0x89, 0x00, 0x00, 0x1b, 0x06, 0x09, 0x06, + 0x99, 0x42, 0x9f, 0xb0, 0x28, 0xd1, 0x17, 0x49, + 0x08, 0x40, 0x00, 0x21, 0x1a, 0x28, 0x00, 0xd3, + 0x02, 0x21, 0x00, 0x29, 0x19, 0xd1, 0xc5, 0x00, + 0x13, 0x4f, 0x10, 0xa8, 0xee, 0x19, 0xb2, 0x88, + 0x21, 0x68, 0xf7, 0xf7, 0x9d, 0xfd, 0x20, 0x1c, + 0xf8, 0xf7, 0xea, 0xfd, 0x7a, 0x59, 0x01, 0xa9, + 0x10, 0xa8, 0xf7, 0xf7, 0x07, 0xfd, 0x00, 0x28, + 0x3c, 0x00, 0xd0, 0x89, 0x00, 0x00, 0x05, 0xd0, + 0x10, 0x98, 0x01, 0xa9, 0x01, 0x90, 0xb0, 0x79, + 0x00, 0xf0, 0x9d, 0xf8, 0x1f, 0xb0, 0xf0, 0xbd, + 0x2a, 0x20, 0xf8, 0xf7, 0x5e, 0xfc, 0x20, 0x1c, + 0xf8, 0xf7, 0xd5, 0xfd, 0xf6, 0xe7, 0x03, 0x21, + 0x2a, 0x20, 0xf8, 0xf7, 0x56, 0xfc, 0xf1, 0xe7, + 0x00, 0x00, 0x7f, 0xff, 0xff, 0x00, 0x24, 0x45, + 0x01, 0x00, 0x10, 0xb5, 0x0c, 0x1c, 0x80, 0x28, + 0x02, 0xd0, 0x3c, 0x00, 0x0c, 0x8a, 0x00, 0x00, + 0x81, 0x28, 0x08, 0xd1, 0x03, 0xe0, 0x20, 0x1c, + 0x00, 0xf0, 0x06, 0xf9, 0x10, 0xbd, 0x20, 0x1c, + 0xf8, 0xf7, 0xbc, 0xfd, 0x10, 0xbd, 0x03, 0x21, + 0x2c, 0x20, 0xf8, 0xf7, 0x3d, 0xfc, 0xf6, 0xe7, + 0xf0, 0xb5, 0x0c, 0x1c, 0x00, 0x21, 0x8b, 0xb0, + 0x0a, 0x91, 0x01, 0x0e, 0x01, 0x23, 0x1b, 0x06, + 0x09, 0x06, 0x99, 0x42, 0x2a, 0xd1, 0x18, 0x49, + 0x08, 0x40, 0x06, 0x1c, 0x3c, 0x00, 0x48, 0x8a, + 0x00, 0x00, 0x06, 0x2e, 0x01, 0xd3, 0x07, 0x21, + 0x24, 0xe0, 0x20, 0x89, 0xf8, 0xf7, 0xf1, 0xfe, + 0x22, 0x89, 0x21, 0x68, 0x05, 0x1c, 0xf7, 0xf7, + 0x4c, 0xfd, 0x20, 0x1c, 0xf8, 0xf7, 0x99, 0xfd, + 0xf4, 0x00, 0x0f, 0x4e, 0x28, 0x1c, 0x0a, 0xaa, + 0x69, 0x46, 0x33, 0x59, 0xf7, 0xf7, 0xb4, 0xfc, + 0x00, 0x28, 0x01, 0xd0, 0x01, 0x28, 0x07, 0xd1, + 0x28, 0x68, 0x69, 0x46, 0x00, 0x90, 0x3c, 0x00, + 0x84, 0x8a, 0x00, 0x00, 0xa0, 0x19, 0x00, 0x79, + 0x0a, 0x9a, 0x00, 0xf0, 0x09, 0xf9, 0x28, 0x1c, + 0xf8, 0xf7, 0xb0, 0xfe, 0x0b, 0xb0, 0xf0, 0xbd, + 0x01, 0x21, 0x2b, 0x20, 0xf8, 0xf7, 0x02, 0xfc, + 0xf8, 0xe7, 0x00, 0x00, 0x7f, 0xff, 0xff, 0x00, + 0x28, 0x46, 0x01, 0x00, 0x0a, 0x1c, 0x01, 0x0e, + 0x01, 0x23, 0x1b, 0x06, 0x09, 0x06, 0x99, 0x42, + 0x80, 0xb5, 0x08, 0xd0, 0x5b, 0x00, 0x99, 0x42, + 0x3c, 0x00, 0xc0, 0x8a, 0x00, 0x00, 0x0b, 0xd1, + 0x00, 0x06, 0x00, 0x0e, 0x11, 0x1c, 0x00, 0xf0, + 0x0e, 0xf9, 0x80, 0xbd, 0x05, 0x49, 0x01, 0x40, + 0x10, 0x1c, 0x05, 0xf0, 0xa2, 0xf9, 0x80, 0xbd, + 0x01, 0x21, 0x2d, 0x20, 0xf8, 0xf7, 0xe1, 0xfb, + 0x80, 0xbd, 0x7f, 0xff, 0xff, 0x00, 0x80, 0xb5, + 0x01, 0x1c, 0x0f, 0x20, 0x00, 0xf0, 0x13, 0xf8, + 0x80, 0xbd, 0x80, 0xb5, 0x01, 0x1c, 0x04, 0x20, + 0x00, 0xf0, 0x3c, 0x00, 0xfc, 0x8a, 0x00, 0x00, + 0x0d, 0xf8, 0x80, 0xbd, 0x80, 0xb5, 0x01, 0x1c, + 0x17, 0x20, 0x00, 0xf0, 0x07, 0xf8, 0x80, 0xbd, + 0x80, 0xb5, 0x01, 0x1c, 0x01, 0x20, 0x00, 0xf0, + 0x01, 0xf8, 0x80, 0xbd, 0xf8, 0xb5, 0x04, 0x1c, + 0x06, 0x1c, 0x80, 0x20, 0x84, 0x43, 0x0f, 0x1c, + 0x19, 0x2c, 0x01, 0xd3, 0xf8, 0xf7, 0xea, 0xfb, + 0x08, 0x48, 0x04, 0x5d, 0x21, 0x1c, 0x00, 0x20, + 0xf8, 0xf7, 0x50, 0xfd, 0x3c, 0x00, 0x38, 0x8b, + 0x00, 0x00, 0x05, 0x1c, 0x22, 0x1c, 0x39, 0x1c, + 0x00, 0x68, 0xf7, 0xf7, 0xda, 0xfc, 0x2a, 0x1c, + 0x31, 0x1c, 0x07, 0x20, 0xf8, 0xf7, 0x11, 0xf9, + 0xf8, 0xbd, 0xf4, 0x45, 0x01, 0x00, 0xf8, 0xb5, + 0x0d, 0x1c, 0x16, 0x1c, 0x04, 0x1c, 0x1f, 0x1c, + 0x08, 0x21, 0x00, 0x20, 0xf8, 0xf7, 0x39, 0xfd, + 0x14, 0x22, 0x01, 0x68, 0x0e, 0x4b, 0x72, 0x43, + 0xd2, 0x18, 0x0c, 0x71, 0x12, 0x7c, 0x3c, 0x00, + 0x74, 0x8b, 0x00, 0x00, 0x4a, 0x71, 0x0d, 0x60, + 0x0b, 0x4a, 0x8f, 0x71, 0x12, 0x68, 0x7f, 0x2a, + 0x03, 0xd9, 0x52, 0x05, 0x52, 0x0e, 0x80, 0x23, + 0x1a, 0x43, 0xca, 0x71, 0x07, 0x4a, 0x00, 0x23, + 0x51, 0x68, 0x01, 0x31, 0x51, 0x60, 0x02, 0x1c, + 0x81, 0x21, 0x00, 0x20, 0xf8, 0xf7, 0x08, 0xf9, + 0xf8, 0xbd, 0x00, 0x00, 0x74, 0x40, 0x01, 0x00, + 0xfc, 0x5a, 0x01, 0x00, 0x80, 0x6e, 0x01, 0x00, + 0x3c, 0x00, 0xb0, 0x8b, 0x00, 0x00, 0xb0, 0xb5, + 0x04, 0x1c, 0x08, 0x21, 0x00, 0x20, 0xf8, 0xf7, + 0x0e, 0xfd, 0x21, 0x8b, 0xe2, 0x7d, 0x05, 0x1c, + 0x09, 0x05, 0x52, 0x07, 0x52, 0x0f, 0x49, 0x0c, + 0x00, 0x68, 0x11, 0x43, 0x81, 0x80, 0xa1, 0x7d, + 0x14, 0x23, 0x0e, 0x4a, 0x59, 0x43, 0x89, 0x18, + 0x09, 0x7c, 0xc1, 0x71, 0xe1, 0x6a, 0x01, 0x60, + 0xe1, 0x68, 0x28, 0x1c, 0xf8, 0xf7, 0x17, 0xfc, + 0x0a, 0x48, 0x3c, 0x00, 0xec, 0x8b, 0x00, 0x00, + 0x00, 0x68, 0x00, 0x28, 0x01, 0xd0, 0xf7, 0xf7, + 0xf1, 0xfb, 0x07, 0x49, 0x04, 0x31, 0x88, 0x68, + 0x01, 0x30, 0x88, 0x60, 0x00, 0x21, 0x2a, 0x1c, + 0x00, 0x20, 0x23, 0x6b, 0xf8, 0xf7, 0xd2, 0xf8, + 0x01, 0x20, 0xb0, 0xbd, 0x74, 0x40, 0x01, 0x00, + 0x7c, 0x6e, 0x01, 0x00, 0x01, 0x48, 0x80, 0x68, + 0x70, 0x47, 0x00, 0x00, 0x80, 0x6e, 0x01, 0x00, + 0x10, 0xb5, 0x04, 0x1c, 0x3c, 0x00, 0x28, 0x8c, + 0x00, 0x00, 0x92, 0xb0, 0x01, 0x68, 0x68, 0x46, + 0x08, 0x22, 0xf7, 0xf7, 0x62, 0xfc, 0x00, 0xab, + 0x98, 0x88, 0x40, 0x07, 0x40, 0x0f, 0xd8, 0x77, + 0x98, 0x88, 0x40, 0x04, 0x00, 0x0d, 0x18, 0x84, + 0xd8, 0x88, 0x58, 0x84, 0x00, 0x98, 0x0d, 0x90, + 0x05, 0x94, 0x20, 0x89, 0x08, 0x38, 0x20, 0x81, + 0x05, 0x98, 0x01, 0x68, 0x08, 0x31, 0x01, 0x60, + 0x00, 0x20, 0x0a, 0x90, 0x0c, 0x90, 0x3c, 0x00, + 0x64, 0x8c, 0x00, 0x00, 0x00, 0x21, 0x11, 0x20, + 0x09, 0xf0, 0x78, 0xfb, 0x05, 0x49, 0x06, 0x4a, + 0x08, 0x68, 0x01, 0x30, 0x08, 0x60, 0x02, 0x21, + 0x02, 0xa8, 0x01, 0xf0, 0xcd, 0xfc, 0x12, 0xb0, + 0x10, 0xbd, 0x00, 0x00, 0x80, 0x6e, 0x01, 0x00, + 0x55, 0x8b, 0x00, 0x00, 0x02, 0x1c, 0x01, 0x20, + 0x00, 0x06, 0x08, 0x43, 0x80, 0xb5, 0x2b, 0x21, + 0x0a, 0xf0, 0x8a, 0xfd, 0x80, 0xbd, 0x00, 0x00, + 0x3c, 0x00, 0xa0, 0x8c, 0x00, 0x00, 0xf7, 0xb5, + 0x04, 0x1c, 0x06, 0x1c, 0x80, 0x20, 0x84, 0x43, + 0x17, 0x1c, 0x06, 0x2c, 0x01, 0xd3, 0xf8, 0xf7, + 0x26, 0xfb, 0x0b, 0x48, 0x05, 0x5d, 0x29, 0x1c, + 0x00, 0x20, 0xf8, 0xf7, 0x8c, 0xfc, 0x04, 0x1c, + 0x00, 0x68, 0x01, 0x99, 0x2a, 0x1c, 0xf7, 0xf7, + 0x16, 0xfc, 0x39, 0x1c, 0x20, 0x1c, 0xf8, 0xf7, + 0xa2, 0xfb, 0x22, 0x1c, 0x31, 0x1c, 0x00, 0x23, + 0x02, 0x20, 0x3c, 0x00, 0xdc, 0x8c, 0x00, 0x00, + 0xf8, 0xf7, 0x68, 0xf8, 0xfe, 0xbd, 0x00, 0x00, + 0x20, 0x46, 0x01, 0x00, 0x0a, 0x1c, 0x01, 0x1c, + 0x80, 0xb5, 0x00, 0x23, 0x01, 0x20, 0xf8, 0xf7, + 0x5d, 0xf8, 0x80, 0xbd, 0xff, 0xb5, 0x9f, 0xb0, + 0x1f, 0x1c, 0x05, 0x1c, 0x0a, 0x30, 0x1e, 0x90, + 0x1c, 0xaa, 0x1d, 0xa9, 0x0a, 0xf0, 0x00, 0xff, + 0x00, 0x28, 0x71, 0xd0, 0x00, 0x2f, 0x09, 0xd0, + 0x0a, 0x21, 0x00, 0x20, 0x3c, 0x00, 0x18, 0x8d, + 0x00, 0x00, 0xf8, 0xf7, 0x5e, 0xfc, 0x06, 0x68, + 0x04, 0x1c, 0x30, 0x1d, 0xfa, 0xf7, 0xaf, 0xfa, + 0x05, 0xe0, 0x04, 0x21, 0x00, 0x20, 0xf8, 0xf7, + 0x54, 0xfc, 0x06, 0x68, 0x04, 0x1c, 0x28, 0x89, + 0x36, 0x49, 0x01, 0x22, 0x08, 0x80, 0x70, 0x80, + 0xe8, 0x88, 0x14, 0xa9, 0x30, 0x80, 0x19, 0xa8, + 0xfc, 0xf7, 0xf5, 0xfc, 0xfc, 0xf7, 0xff, 0xfb, + 0x01, 0x1c, 0xff, 0x31, 0x21, 0x31, 0x3c, 0x00, + 0x54, 0x8d, 0x00, 0x00, 0x20, 0x1c, 0x01, 0xf0, + 0xef, 0xf8, 0x19, 0xa9, 0x20, 0x1c, 0x01, 0xf0, + 0xeb, 0xf8, 0x14, 0xa9, 0x20, 0x1c, 0x01, 0xf0, + 0xe7, 0xf8, 0x20, 0x1c, 0x20, 0x99, 0xfd, 0xf7, + 0x4b, 0xfd, 0x00, 0x22, 0x02, 0x21, 0x01, 0xf0, + 0x33, 0xfd, 0x06, 0x1c, 0x1c, 0x99, 0x00, 0x20, + 0x88, 0x61, 0x30, 0x1c, 0xf8, 0xf7, 0x1c, 0xfa, + 0x00, 0x2e, 0x0b, 0xd0, 0x30, 0x7a, 0x00, 0x28, + 0x3c, 0x00, 0x90, 0x8d, 0x00, 0x00, 0x02, 0xd0, + 0x40, 0x21, 0x08, 0x43, 0x30, 0x72, 0x1c, 0x98, + 0x02, 0x22, 0x81, 0x69, 0x11, 0x43, 0x81, 0x61, + 0x04, 0xe0, 0x1c, 0x99, 0x02, 0x22, 0x88, 0x69, + 0x90, 0x43, 0x88, 0x61, 0x1d, 0xaa, 0x06, 0xca, + 0x01, 0xa8, 0x05, 0xf0, 0x58, 0xfb, 0x09, 0xa8, + 0x00, 0x2f, 0x02, 0xd0, 0x02, 0x22, 0x42, 0x72, + 0x01, 0xe0, 0x00, 0x21, 0x41, 0x72, 0x04, 0x94, + 0x01, 0xa8, 0x3c, 0x00, 0xcc, 0x8d, 0x00, 0x00, + 0x04, 0xf0, 0x7a, 0xfb, 0x01, 0x21, 0x1c, 0x98, + 0x08, 0xf0, 0xc8, 0xff, 0x00, 0x2f, 0x04, 0xd0, + 0x1c, 0x98, 0x01, 0x22, 0x81, 0x69, 0x11, 0x43, + 0x81, 0x61, 0xa8, 0x88, 0x1c, 0x9c, 0x01, 0xf0, + 0x9f, 0xfe, 0x02, 0x1c, 0x21, 0x1c, 0x00, 0xe0, + 0x04, 0xe0, 0x07, 0x48, 0x40, 0x88, 0x09, 0xf0, + 0x1f, 0xf8, 0x04, 0xe0, 0x3a, 0x1c, 0x00, 0x21, + 0x05, 0x20, 0xf9, 0xf7, 0x3c, 0x00, 0x08, 0x8e, + 0x00, 0x00, 0x9b, 0xf8, 0x00, 0x20, 0x23, 0xb0, + 0xf0, 0xbd, 0xfc, 0x60, 0x01, 0x00, 0x98, 0x7c, + 0x01, 0x00, 0xf8, 0xb5, 0x04, 0x1c, 0xc0, 0x68, + 0x05, 0x68, 0xa0, 0x1d, 0x01, 0xf0, 0x95, 0xff, + 0x00, 0x28, 0x45, 0xd0, 0x21, 0x1c, 0x14, 0x31, + 0x20, 0x1c, 0x6a, 0x46, 0x0a, 0xf0, 0x55, 0xfe, + 0x00, 0x28, 0x3d, 0xd0, 0xfc, 0xf7, 0x7d, 0xfa, + 0x00, 0x28, 0x39, 0xd1, 0x00, 0x98, 0x3c, 0x00, + 0x44, 0x8e, 0x00, 0x00, 0x4b, 0x21, 0x09, 0x5c, + 0x01, 0x29, 0x34, 0xd1, 0x04, 0x26, 0x09, 0xf0, + 0x19, 0xf9, 0x68, 0x88, 0x00, 0x28, 0x1b, 0xd1, + 0xa8, 0x88, 0x03, 0x21, 0x89, 0x03, 0x88, 0x43, + 0x15, 0x49, 0x00, 0x26, 0x08, 0x80, 0x01, 0x22, + 0x02, 0x21, 0x20, 0x69, 0x01, 0xf0, 0xb8, 0xfc, + 0x04, 0x1c, 0x14, 0xd0, 0x00, 0x98, 0x80, 0x69, + 0x80, 0x07, 0x10, 0xd5, 0xf8, 0xf7, 0x9a, 0xf9, + 0x3c, 0x00, 0x80, 0x8e, 0x00, 0x00, 0x20, 0x1c, + 0xf8, 0xf7, 0xdd, 0xf8, 0x00, 0x28, 0x09, 0xd1, + 0xf8, 0xf7, 0x7f, 0xf9, 0x01, 0x26, 0x00, 0x98, + 0x02, 0x22, 0x81, 0x69, 0x91, 0x43, 0x81, 0x61, + 0x00, 0x21, 0x01, 0xe0, 0x00, 0x98, 0x02, 0x21, + 0x08, 0xf0, 0x61, 0xff, 0x00, 0x98, 0x80, 0x69, + 0xa9, 0x88, 0xc2, 0x07, 0xd2, 0x0f, 0x30, 0x1c, + 0xf9, 0xf7, 0x45, 0xf8, 0xf8, 0xbd, 0xfa, 0x60, + 0x01, 0x00, 0x3c, 0x00, 0xbc, 0x8e, 0x00, 0x00, + 0x1c, 0xb5, 0x04, 0x69, 0x00, 0x23, 0x00, 0x22, + 0x00, 0x2c, 0x13, 0xd1, 0x4b, 0x24, 0x24, 0x5c, + 0x02, 0x2c, 0x03, 0xd1, 0x02, 0x29, 0x05, 0xd0, + 0x01, 0x22, 0x03, 0xe0, 0x02, 0x29, 0x01, 0xd1, + 0x01, 0x22, 0x01, 0x23, 0x00, 0x2a, 0x05, 0xd0, + 0x00, 0x90, 0x04, 0x20, 0x01, 0x93, 0x69, 0x46, + 0x09, 0xf0, 0x36, 0xfa, 0x1c, 0xbd, 0x00, 0x00, + 0xb0, 0xb5, 0x04, 0x1c, 0x3c, 0x00, 0xf8, 0x8e, + 0x00, 0x00, 0xf2, 0x21, 0x0f, 0x20, 0x0c, 0x4d, + 0x0a, 0xf0, 0x99, 0xfb, 0x28, 0x78, 0x08, 0x28, + 0x0b, 0xd2, 0x01, 0xa3, 0x1b, 0x5c, 0x5b, 0x00, + 0x9f, 0x44, 0x07, 0x03, 0x03, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x00, 0x2c, 0x01, 0xd1, 0x05, 0xf0, + 0xbc, 0xfb, 0xb0, 0xbd, 0x01, 0x2c, 0xfc, 0xd1, + 0xff, 0x20, 0x07, 0xf0, 0x38, 0xfa, 0xb0, 0xbd, + 0x00, 0x00, 0x74, 0x66, 0x01, 0x00, 0x3c, 0x00, + 0x34, 0x8f, 0x00, 0x00, 0x8c, 0xb5, 0x05, 0x4a, + 0x00, 0xab, 0x11, 0x72, 0x00, 0x90, 0x19, 0x71, + 0x69, 0x46, 0x08, 0x20, 0x09, 0xf0, 0x0a, 0xfa, + 0x8c, 0xbd, 0x00, 0x00, 0xac, 0x7c, 0x01, 0x00, + 0xf3, 0xb5, 0x04, 0x1c, 0xc0, 0x68, 0x06, 0x27, + 0x85, 0xb0, 0x06, 0x68, 0x09, 0xf0, 0x26, 0xff, + 0x98, 0x49, 0x48, 0x63, 0x20, 0x69, 0x03, 0x21, + 0x01, 0xf0, 0x08, 0xfc, 0x96, 0x4d, 0x00, 0x28, + 0x3c, 0x00, 0x70, 0x8f, 0x00, 0x00, 0x4d, 0xd0, + 0x95, 0x49, 0x40, 0x31, 0x09, 0x79, 0x80, 0x78, + 0x81, 0x42, 0x47, 0xd1, 0x01, 0x21, 0x20, 0x69, + 0x01, 0xf0, 0xfb, 0xfb, 0x02, 0x90, 0x20, 0x69, + 0x32, 0x21, 0x01, 0xf0, 0xf6, 0xfb, 0x01, 0x90, + 0x02, 0x1c, 0x8d, 0x48, 0x02, 0x99, 0xfc, 0xf7, + 0x46, 0xff, 0x00, 0x28, 0x36, 0xd0, 0x00, 0x23, + 0x8a, 0x48, 0x02, 0x99, 0x01, 0x9a, 0xfc, 0xf7, + 0xe4, 0xfe, 0x3c, 0x00, 0xac, 0x8f, 0x00, 0x00, + 0x0b, 0x28, 0x2e, 0xd1, 0x86, 0x4a, 0x51, 0x88, + 0x70, 0x89, 0x41, 0x40, 0x03, 0x91, 0x0b, 0x1c, + 0x84, 0x49, 0x0b, 0x40, 0x25, 0xd1, 0x50, 0x80, + 0x03, 0x99, 0x17, 0x1c, 0x00, 0x29, 0x0b, 0xd0, + 0x03, 0x99, 0x48, 0x05, 0x02, 0xd5, 0x38, 0x1c, + 0xfc, 0xf7, 0x40, 0xfe, 0x03, 0x99, 0x88, 0x06, + 0x02, 0xd5, 0x38, 0x1c, 0xfc, 0xf7, 0x24, 0xfe, + 0x2a, 0x21, 0x20, 0x69, 0x3c, 0x00, 0xe8, 0x8f, + 0x00, 0x00, 0x01, 0xf0, 0xc8, 0xfb, 0x00, 0x28, + 0x0d, 0xd0, 0x80, 0x78, 0xe9, 0x69, 0x81, 0x42, + 0x09, 0xd0, 0xe8, 0x61, 0x38, 0x1c, 0xfc, 0xf7, + 0x16, 0xfe, 0x38, 0x1c, 0xfc, 0xf7, 0x07, 0xfe, + 0x38, 0x1c, 0xfc, 0xf7, 0x26, 0xfe, 0x00, 0x27, + 0x20, 0x1c, 0x20, 0x30, 0x04, 0x90, 0x40, 0x7a, + 0x08, 0x28, 0x71, 0xd1, 0x0a, 0xf0, 0xd1, 0xfc, + 0x00, 0x20, 0x68, 0x61, 0x00, 0x23, 0x3c, 0x00, + 0x24, 0x90, 0x00, 0x00, 0x2b, 0x61, 0xa8, 0x68, + 0x66, 0x49, 0x01, 0x30, 0xa8, 0x60, 0x30, 0x89, + 0x5c, 0x31, 0x88, 0x82, 0x01, 0xf0, 0x7a, 0xfd, + 0x62, 0x49, 0x5c, 0x31, 0x08, 0x61, 0x22, 0x6a, + 0x04, 0x98, 0x18, 0x21, 0x00, 0x7a, 0x01, 0xf0, + 0x33, 0xfe, 0xe1, 0x6a, 0x40, 0x18, 0x03, 0x90, + 0x5c, 0x48, 0x00, 0x6a, 0x00, 0x28, 0x0d, 0xd0, + 0x00, 0x2f, 0x0b, 0xd1, 0x59, 0x48, 0x01, 0x23, + 0x3c, 0x00, 0x60, 0x90, 0x00, 0x00, 0x5c, 0x30, + 0x01, 0x68, 0x1b, 0x07, 0x00, 0x22, 0x30, 0x68, + 0x09, 0xf0, 0x49, 0xff, 0x00, 0x28, 0x00, 0xd1, + 0x05, 0x27, 0x00, 0x21, 0xa0, 0x6b, 0x0a, 0xf0, + 0xce, 0xfc, 0x00, 0x21, 0x20, 0x6c, 0x0a, 0xf0, + 0xe8, 0xfc, 0x4f, 0x4b, 0x03, 0xce, 0x03, 0x9a, + 0x5c, 0x33, 0xfc, 0xf7, 0x88, 0xfd, 0x00, 0x20, + 0x4c, 0x4e, 0x05, 0x21, 0xb0, 0x63, 0x20, 0x69, + 0x01, 0xf0, 0x3c, 0x00, 0x9c, 0x90, 0x00, 0x00, + 0x6f, 0xfb, 0x01, 0x1c, 0x01, 0xd1, 0xf0, 0x60, + 0x1c, 0xe0, 0x01, 0x20, 0xf0, 0x60, 0x88, 0x78, + 0x45, 0x4a, 0x01, 0x32, 0x10, 0x70, 0xc8, 0x78, + 0x50, 0x70, 0x47, 0x4a, 0x10, 0x70, 0x30, 0x69, + 0x00, 0x28, 0x0a, 0xd0, 0x4a, 0x78, 0x08, 0x79, + 0x05, 0x31, 0x09, 0xf0, 0xdd, 0xfa, 0x31, 0x69, + 0xf7, 0xf7, 0x85, 0xf9, 0xf0, 0x68, 0x00, 0x28, + 0x04, 0xd0, 0x3b, 0x4a, 0x3c, 0x00, 0xd8, 0x90, + 0x00, 0x00, 0x01, 0x32, 0x10, 0x78, 0x00, 0x28, + 0x08, 0xd1, 0x00, 0x20, 0xa8, 0x61, 0x71, 0x6a, + 0x00, 0x29, 0x03, 0xd0, 0x20, 0x1c, 0x14, 0x30, + 0xf7, 0xf7, 0x74, 0xf9, 0x34, 0x4a, 0x5c, 0x32, + 0x10, 0x69, 0x31, 0x6a, 0x41, 0x18, 0x00, 0xe0, + 0x20, 0xe0, 0x0a, 0x23, 0xd0, 0x68, 0x0a, 0x22, + 0x09, 0xf0, 0xfb, 0xfe, 0x00, 0x28, 0x07, 0xd0, + 0x2d, 0x4a, 0x31, 0x6a, 0x5c, 0x32, 0x3c, 0x00, + 0x14, 0x91, 0x00, 0x00, 0xd0, 0x68, 0x40, 0x1a, + 0x11, 0x69, 0x40, 0x1a, 0x70, 0x60, 0x29, 0x4a, + 0x5c, 0x32, 0xd0, 0x68, 0x30, 0x62, 0xf0, 0x69, + 0x00, 0x28, 0x04, 0xd0, 0xfa, 0xf7, 0x00, 0xfd, + 0x01, 0x20, 0xfa, 0xf7, 0xa1, 0xfc, 0xfa, 0xf7, + 0x81, 0xfc, 0x27, 0x48, 0x00, 0x68, 0x03, 0xf0, + 0x07, 0xf9, 0x06, 0x98, 0x00, 0x28, 0x03, 0xd1, + 0x1e, 0x4e, 0x00, 0x23, 0xb3, 0x60, 0x16, 0xe0, + 0x3c, 0x00, 0x50, 0x91, 0x00, 0x00, 0x1c, 0x4e, + 0x01, 0x20, 0xb0, 0x60, 0x06, 0x98, 0x01, 0x68, + 0x40, 0x68, 0xb0, 0x65, 0x19, 0x48, 0x71, 0x65, + 0x54, 0x30, 0xc0, 0x88, 0x00, 0x28, 0x09, 0xd0, + 0xb1, 0x69, 0x00, 0x29, 0x06, 0xd0, 0x01, 0xf0, + 0xdc, 0xfc, 0x01, 0x1c, 0xe0, 0x6a, 0xb2, 0x69, + 0xf7, 0xf7, 0x2f, 0xf9, 0x00, 0x2f, 0x15, 0xd1, + 0x12, 0x48, 0x01, 0x69, 0x00, 0x29, 0x08, 0xd1, + 0x01, 0x21, 0x3c, 0x00, 0x8c, 0x91, 0x00, 0x00, + 0x01, 0x61, 0x2a, 0x68, 0x00, 0x2a, 0x03, 0xd0, + 0x00, 0x21, 0x00, 0x20, 0xf7, 0xf7, 0x20, 0xf9, + 0x09, 0x49, 0x00, 0x23, 0xcb, 0x62, 0x2b, 0x61, + 0x6b, 0x61, 0x06, 0xf0, 0xb5, 0xf8, 0x07, 0xb0, + 0xf0, 0xbd, 0x6b, 0x68, 0x06, 0x48, 0x00, 0x2b, + 0xf9, 0xd0, 0x02, 0x1d, 0x11, 0x1c, 0x38, 0x1c, + 0xf7, 0xf7, 0x0f, 0xf9, 0xf3, 0xe7, 0x00, 0x00, + 0x44, 0x7d, 0x01, 0x00, 0x3c, 0x00, 0xc8, 0x91, + 0x00, 0x00, 0xf4, 0x68, 0x01, 0x00, 0xf4, 0x67, + 0x01, 0x00, 0x03, 0x08, 0x00, 0x00, 0xf8, 0x60, + 0x01, 0x00, 0xc4, 0x67, 0x01, 0x00, 0x08, 0xb5, + 0xf8, 0xf7, 0x2f, 0xfd, 0x00, 0x90, 0x00, 0xab, + 0x18, 0x88, 0x00, 0x28, 0x0c, 0xd0, 0x05, 0xf0, + 0x50, 0xff, 0x00, 0xab, 0x59, 0x88, 0x18, 0x88, + 0x05, 0xf0, 0x6d, 0xf9, 0xfe, 0xf7, 0x97, 0xf8, + 0x03, 0x20, 0xfb, 0xf7, 0x0e, 0xf8, 0x3c, 0x00, + 0x04, 0x92, 0x00, 0x00, 0x08, 0xbd, 0x01, 0x20, + 0xff, 0xf7, 0xb2, 0xfb, 0x00, 0x20, 0x08, 0xf0, + 0x8d, 0xfe, 0xf7, 0xe7, 0xf8, 0xb5, 0x4f, 0x49, + 0x8c, 0x68, 0x20, 0x6a, 0x00, 0x68, 0x05, 0x78, + 0xfc, 0xf7, 0x68, 0xfa, 0x00, 0x28, 0x12, 0xd0, + 0x2a, 0x07, 0x92, 0x0f, 0x01, 0x21, 0x01, 0x2a, + 0x00, 0xd0, 0x00, 0x21, 0x00, 0x29, 0x03, 0xd0, + 0x29, 0x06, 0x09, 0x0f, 0x0b, 0x29, 0x06, 0xd1, + 0x3c, 0x00, 0x40, 0x92, 0x00, 0x00, 0x2a, 0x21, + 0x09, 0x5d, 0x08, 0x18, 0x90, 0x30, 0x00, 0x7b, + 0xf9, 0xf7, 0x0d, 0xfc, 0x41, 0x4f, 0x3c, 0x3f, + 0xb8, 0x6b, 0x79, 0x6b, 0xf7, 0xf7, 0xc0, 0xf8, + 0xa0, 0x6c, 0x00, 0x26, 0xc6, 0x60, 0x60, 0x6b, + 0x80, 0x08, 0x04, 0xd0, 0xb8, 0x69, 0x01, 0x30, + 0xb8, 0x61, 0x06, 0xf0, 0xdc, 0xf9, 0x39, 0x4d, + 0x28, 0x69, 0x80, 0x05, 0x80, 0x0f, 0x08, 0xd1, + 0x78, 0x69, 0x3c, 0x00, 0x7c, 0x92, 0x00, 0x00, + 0x04, 0x21, 0x01, 0x30, 0x78, 0x61, 0x60, 0x6b, + 0x40, 0x08, 0x40, 0x00, 0x08, 0x43, 0x60, 0x63, + 0xb8, 0x6a, 0x00, 0x28, 0x03, 0xd0, 0x60, 0x6b, + 0x08, 0x21, 0x08, 0x43, 0x60, 0x63, 0x20, 0x1c, + 0x20, 0x30, 0x00, 0x90, 0x39, 0x68, 0xf7, 0xf7, + 0x9a, 0xf8, 0x03, 0x20, 0x00, 0x02, 0x28, 0x60, + 0x2b, 0x49, 0x88, 0x68, 0xa0, 0x63, 0xc8, 0x68, + 0xe0, 0x63, 0x08, 0x79, 0x3c, 0x00, 0xb8, 0x92, + 0x00, 0x00, 0xc0, 0x06, 0xc0, 0x0e, 0x25, 0x1c, + 0x40, 0x35, 0x28, 0x71, 0x48, 0x79, 0x68, 0x71, + 0x23, 0x48, 0x3c, 0x38, 0x46, 0x62, 0x00, 0x98, + 0x80, 0x7a, 0x01, 0xf0, 0x5e, 0xfd, 0x00, 0x21, + 0x00, 0x28, 0x21, 0x4a, 0x01, 0xd0, 0x11, 0x78, + 0x03, 0xe0, 0x93, 0x78, 0xdb, 0x07, 0x00, 0xd5, + 0x51, 0x78, 0xa9, 0x71, 0x00, 0x28, 0x04, 0xd0, + 0x1b, 0x49, 0x14, 0x31, 0x08, 0x68, 0x3c, 0x00, + 0xf4, 0x92, 0x00, 0x00, 0x20, 0x64, 0x00, 0xe0, + 0x6e, 0x80, 0xb8, 0x6a, 0xc0, 0x07, 0x02, 0xd5, + 0xff, 0x20, 0x28, 0x71, 0xae, 0x71, 0xe6, 0x61, + 0xb8, 0x68, 0x01, 0x30, 0xb8, 0x60, 0x79, 0x68, + 0x88, 0x42, 0x03, 0xd0, 0x0b, 0x21, 0x85, 0x20, + 0xf7, 0xf7, 0xc4, 0xff, 0x0d, 0x49, 0x88, 0x68, + 0xc0, 0x6c, 0x88, 0x60, 0xfb, 0x6a, 0x00, 0x2b, + 0x0c, 0xd0, 0x0e, 0x4a, 0xd4, 0x7b, 0x00, 0x2b, + 0x3c, 0x00, 0x30, 0x93, 0x00, 0x00, 0x02, 0xdd, + 0x7f, 0x2c, 0x05, 0xd2, 0x01, 0xe0, 0x00, 0x2c, + 0x02, 0xd0, 0xd4, 0x7b, 0xe3, 0x18, 0xd3, 0x73, + 0xfe, 0x62, 0xc9, 0x68, 0x88, 0x42, 0x03, 0xd1, + 0x05, 0x21, 0x85, 0x20, 0xf7, 0xf7, 0xa9, 0xff, + 0xf8, 0xbd, 0x24, 0x7e, 0x01, 0x00, 0x00, 0x40, + 0x07, 0x00, 0xa0, 0x80, 0x07, 0x00, 0xe8, 0x80, + 0x07, 0x00, 0x40, 0x00, 0x07, 0x00, 0xfe, 0xb5, + 0x30, 0x4c, 0x3c, 0x00, 0x6c, 0x93, 0x00, 0x00, + 0xa0, 0x6b, 0x21, 0x6b, 0xf7, 0xf7, 0x33, 0xf8, + 0x2d, 0x49, 0x3c, 0x31, 0x8e, 0x68, 0x70, 0x8b, + 0x06, 0x28, 0x04, 0xd2, 0xe0, 0x69, 0x01, 0x30, + 0xe0, 0x61, 0x0e, 0x20, 0x30, 0x85, 0x28, 0x49, + 0x3c, 0x31, 0x0d, 0x68, 0x00, 0x2d, 0x03, 0xd1, + 0x03, 0x21, 0x85, 0x20, 0xf7, 0xf7, 0x84, 0xff, + 0x24, 0x48, 0x45, 0x61, 0x35, 0x62, 0x31, 0x8d, + 0xef, 0x68, 0x04, 0x39, 0x3c, 0x00, 0xa8, 0x93, + 0x00, 0x00, 0x0c, 0x04, 0x01, 0x21, 0x02, 0x91, + 0x24, 0x0c, 0x00, 0x21, 0x01, 0x91, 0x1d, 0x48, + 0x3c, 0x30, 0x80, 0x8a, 0xa0, 0x42, 0x03, 0xd3, + 0x2c, 0x81, 0xee, 0x60, 0x00, 0x24, 0x0b, 0xe0, + 0x00, 0x2f, 0x04, 0xd1, 0x03, 0x21, 0x85, 0x20, + 0xf7, 0xf7, 0x69, 0xff, 0x04, 0xe0, 0x3d, 0x1c, + 0x20, 0x1a, 0x04, 0x04, 0xff, 0x68, 0x24, 0x0c, + 0x02, 0x98, 0x00, 0x28, 0x04, 0xd0, 0x3c, 0x00, + 0xe4, 0x93, 0x00, 0x00, 0x12, 0x49, 0x01, 0x20, + 0x08, 0x61, 0x00, 0x20, 0x02, 0x90, 0x01, 0x98, + 0x01, 0x30, 0x01, 0x90, 0x00, 0x2c, 0xdd, 0xd1, + 0x0c, 0x48, 0x0c, 0x4c, 0x3c, 0x30, 0x07, 0x60, + 0x01, 0x98, 0x30, 0x65, 0xb5, 0x64, 0x30, 0x6a, + 0x00, 0x68, 0x60, 0x62, 0x60, 0x68, 0x01, 0x30, + 0x60, 0x60, 0xa1, 0x68, 0x01, 0x31, 0x88, 0x42, + 0x03, 0xd0, 0x0a, 0x21, 0x85, 0x20, 0xf7, 0xf7, + 0x3c, 0x00, 0x20, 0x94, 0x00, 0x00, 0x41, 0xff, + 0x04, 0x48, 0x00, 0x68, 0xa0, 0x62, 0xfe, 0xbd, + 0x00, 0x00, 0xe8, 0x7d, 0x01, 0x00, 0x00, 0x30, + 0x07, 0x00, 0x78, 0x6e, 0x01, 0x00, 0xb0, 0xb5, + 0x05, 0x1c, 0x01, 0x21, 0x0f, 0x20, 0x0a, 0xf0, + 0xf8, 0xf8, 0xf2, 0x21, 0x0f, 0x20, 0x0a, 0xf0, + 0xf4, 0xf8, 0x0c, 0x48, 0x0c, 0x4c, 0x00, 0x68, + 0x14, 0x3c, 0x00, 0x28, 0x0c, 0xd0, 0xe0, 0x78, + 0x01, 0x28, 0x3c, 0x00, 0x5c, 0x94, 0x00, 0x00, + 0x09, 0xd0, 0x01, 0x22, 0x29, 0x1c, 0x0f, 0x20, + 0x0a, 0xf0, 0xac, 0xf8, 0x60, 0x78, 0x02, 0x28, + 0x06, 0xd0, 0x01, 0x20, 0x03, 0xe0, 0x60, 0x78, + 0x02, 0x28, 0x01, 0xd0, 0x00, 0x20, 0x60, 0x70, + 0xb0, 0xbd, 0x00, 0x00, 0x98, 0x66, 0x01, 0x00, + 0x02, 0x22, 0x00, 0x28, 0x80, 0xb5, 0x00, 0xd1, + 0x03, 0x22, 0x03, 0x49, 0x0e, 0x20, 0x0a, 0xf0, + 0x9b, 0xf8, 0x00, 0x20, 0x3c, 0x00, 0x98, 0x94, + 0x00, 0x00, 0x80, 0xbd, 0x00, 0x00, 0x50, 0xc3, + 0x00, 0x00, 0xf8, 0xb5, 0x00, 0x23, 0x00, 0x22, + 0x00, 0x28, 0x2e, 0xd0, 0x06, 0x89, 0x04, 0x68, + 0x75, 0x1e, 0x2d, 0x04, 0xb6, 0x1a, 0xf6, 0x07, + 0x2d, 0x0c, 0xf6, 0x0f, 0xb4, 0x46, 0x0e, 0xe0, + 0xa7, 0x5c, 0xa6, 0x18, 0x02, 0x33, 0x00, 0x97, + 0x77, 0x78, 0xa7, 0x54, 0x02, 0x32, 0x12, 0x04, + 0x00, 0x9f, 0x12, 0x0c, 0x00, 0x29, 0x3c, 0x00, + 0xd4, 0x94, 0x00, 0x00, 0x77, 0x70, 0x01, 0xdd, + 0x8b, 0x42, 0x15, 0xda, 0xaa, 0x42, 0xee, 0xd3, + 0xc0, 0x68, 0x00, 0x28, 0x10, 0xd0, 0x02, 0x89, + 0x00, 0x2a, 0xf9, 0xd0, 0x62, 0x46, 0x00, 0x2a, + 0x0b, 0xd0, 0x02, 0x68, 0x66, 0x5d, 0x17, 0x78, + 0x02, 0x33, 0x67, 0x55, 0x16, 0x70, 0x01, 0x22, + 0x00, 0x29, 0xd2, 0xdd, 0x8b, 0x42, 0xd0, 0xdb, + 0xf8, 0xbd, 0x00, 0x22, 0xcd, 0xe7, 0x00, 0x00, + 0x3c, 0x00, 0x10, 0x95, 0x00, 0x00, 0xb0, 0xb5, + 0x04, 0x1c, 0x0d, 0x1c, 0x01, 0x20, 0xf8, 0xf7, + 0x5e, 0xfb, 0x0d, 0x49, 0x00, 0x28, 0xc8, 0x61, + 0x14, 0xd0, 0x62, 0x68, 0x42, 0x60, 0xa2, 0x7c, + 0x02, 0x72, 0xa2, 0x68, 0xc2, 0x60, 0xe2, 0x68, + 0x02, 0x61, 0x22, 0x8a, 0x02, 0x75, 0x0a, 0x1d, + 0x0a, 0x62, 0x12, 0x68, 0x00, 0x2a, 0xff, 0xd1, + 0x02, 0x60, 0x48, 0x60, 0x00, 0x20, 0xa8, 0x60, + 0x01, 0x20, 0x3c, 0x00, 0x4c, 0x95, 0x00, 0x00, + 0xb0, 0xbd, 0x01, 0x20, 0xfa, 0xe7, 0x00, 0x00, + 0xa4, 0x6e, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, + 0x40, 0x68, 0x0d, 0x1c, 0x43, 0x1c, 0x02, 0xd1, + 0x21, 0x1c, 0x09, 0x48, 0x08, 0xe0, 0x00, 0x20, + 0xf8, 0xf7, 0x34, 0xfb, 0x06, 0x49, 0x94, 0x39, + 0x08, 0x61, 0x00, 0x28, 0x03, 0xd0, 0x21, 0x1c, + 0x00, 0xf0, 0x48, 0xfe, 0x00, 0xe0, 0x01, 0x20, + 0xa8, 0x60, 0x01, 0x20, 0x3c, 0x00, 0x88, 0x95, + 0x00, 0x00, 0xb0, 0xbd, 0x00, 0x00, 0x38, 0x6f, + 0x01, 0x00, 0x80, 0xb5, 0x01, 0x21, 0x97, 0x20, + 0xf7, 0xf7, 0x85, 0xfe, 0x00, 0x20, 0x80, 0xbd, + 0x00, 0x00, 0x38, 0xb5, 0x0a, 0x1c, 0x14, 0x32, + 0x00, 0x92, 0x13, 0x1f, 0x05, 0x1c, 0x08, 0x3a, + 0x0c, 0x1c, 0x16, 0x31, 0x40, 0x68, 0xfe, 0xf7, + 0x6c, 0xfe, 0x00, 0x28, 0x01, 0xd0, 0x00, 0x20, + 0x00, 0xe0, 0x01, 0x20, 0x69, 0x68, 0x3c, 0x00, + 0xc4, 0x95, 0x00, 0x00, 0xa0, 0x60, 0x61, 0x60, + 0x01, 0x20, 0x38, 0xbd, 0x10, 0xb5, 0x0c, 0x1c, + 0x01, 0x7a, 0x00, 0x29, 0x0f, 0xd0, 0x01, 0x29, + 0x09, 0xd0, 0x02, 0x29, 0x03, 0xd1, 0x00, 0x21, + 0x00, 0x20, 0x0a, 0xf0, 0x73, 0xfc, 0x00, 0x20, + 0x20, 0x71, 0x01, 0x20, 0x10, 0xbd, 0x41, 0x68, + 0x01, 0x20, 0x0a, 0xf0, 0x6b, 0xfc, 0x00, 0xf0, + 0x0d, 0xf9, 0xf4, 0xe7, 0x80, 0xb5, 0x04, 0x49, + 0x3c, 0x00, 0x00, 0x96, 0x00, 0x00, 0x48, 0x68, + 0x01, 0x38, 0x48, 0x60, 0x01, 0xd1, 0x07, 0xf0, + 0x6e, 0xfb, 0x00, 0x20, 0x80, 0xbd, 0xac, 0x79, + 0x01, 0x00, 0xb0, 0xb5, 0x05, 0x1c, 0x0c, 0x1c, + 0x00, 0xf0, 0x4f, 0xfe, 0xa0, 0x60, 0x68, 0x68, + 0x60, 0x60, 0x01, 0x20, 0xb0, 0xbd, 0xb0, 0xb5, + 0x05, 0x1c, 0x0c, 0x1c, 0x00, 0xf0, 0x6f, 0xfe, + 0xa0, 0x60, 0x68, 0x68, 0x60, 0x60, 0x01, 0x20, + 0xb0, 0xbd, 0x3c, 0x00, 0x3c, 0x96, 0x00, 0x00, + 0x08, 0x1c, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, + 0x0e, 0xc0, 0x08, 0xc0, 0x01, 0x20, 0x70, 0x47, + 0xf8, 0xb5, 0x0f, 0x1c, 0x04, 0x1c, 0x20, 0x79, + 0x20, 0x28, 0x01, 0xd2, 0x20, 0x20, 0x20, 0x71, + 0x66, 0x79, 0x00, 0x2e, 0x02, 0xd1, 0x25, 0x79, + 0x00, 0x22, 0x0d, 0xe0, 0x25, 0x79, 0x29, 0x1c, + 0x30, 0x1c, 0xf7, 0xf7, 0x4f, 0xf8, 0x00, 0x29, + 0x01, 0xd1, 0x32, 0x1c, 0x3c, 0x00, 0x78, 0x96, + 0x00, 0x00, 0x04, 0xe0, 0x70, 0x43, 0x80, 0x19, + 0x05, 0x06, 0x2d, 0x0e, 0x32, 0x1c, 0xe0, 0x79, + 0x29, 0x1c, 0x00, 0xf0, 0xf2, 0xf9, 0x20, 0x7a, + 0x2f, 0x49, 0xc0, 0x07, 0xc0, 0x0f, 0x08, 0x60, + 0x2e, 0x48, 0x00, 0x78, 0xc0, 0x07, 0x43, 0xd5, + 0xa1, 0x79, 0x2c, 0x4a, 0xc8, 0x07, 0x48, 0xd4, + 0x2c, 0x4e, 0x16, 0x60, 0x8b, 0x07, 0x2b, 0x48, + 0x08, 0xd5, 0xcc, 0x08, 0x01, 0x23, 0x3c, 0x00, + 0xb4, 0x96, 0x00, 0x00, 0xa3, 0x40, 0x03, 0x60, + 0x49, 0x07, 0x04, 0xd5, 0x28, 0x49, 0x11, 0x60, + 0x01, 0xe0, 0x40, 0x21, 0x01, 0x60, 0x13, 0x68, + 0x26, 0x4a, 0xb3, 0x42, 0x10, 0xd1, 0x54, 0x68, + 0x01, 0x68, 0x0c, 0x43, 0x54, 0x60, 0x14, 0x68, + 0x0c, 0x40, 0x01, 0xd0, 0x51, 0x61, 0x00, 0xe0, + 0x91, 0x61, 0x54, 0x68, 0x0c, 0x43, 0x54, 0x60, + 0x94, 0x68, 0x21, 0x43, 0x91, 0x60, 0x13, 0xe0, + 0x3c, 0x00, 0xf0, 0x96, 0x00, 0x00, 0x54, 0x7c, + 0x01, 0x68, 0x0c, 0x43, 0x54, 0x74, 0x14, 0x7c, + 0x0c, 0x40, 0x03, 0xd0, 0x14, 0x7c, 0x0c, 0x43, + 0x14, 0x74, 0x02, 0xe0, 0x14, 0x7c, 0x8c, 0x43, + 0x14, 0x74, 0x54, 0x7c, 0x0c, 0x43, 0x54, 0x74, + 0x94, 0x7c, 0x21, 0x43, 0x91, 0x74, 0xb3, 0x42, + 0x05, 0xd1, 0x00, 0x22, 0x01, 0x68, 0x03, 0x20, + 0xff, 0xf7, 0x8d, 0xf8, 0x09, 0xe0, 0x00, 0x68, + 0x00, 0x21, 0x3c, 0x00, 0x2c, 0x97, 0x00, 0x00, + 0x02, 0x06, 0x12, 0x0e, 0x03, 0x20, 0xff, 0xf7, + 0x85, 0xf8, 0x01, 0xe0, 0x0b, 0x48, 0x10, 0x60, + 0x00, 0x20, 0x38, 0x71, 0x7d, 0x71, 0xf7, 0xf7, + 0xe9, 0xfd, 0x01, 0x20, 0xf8, 0xbd, 0x00, 0x00, + 0xcc, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x07, 0x00, + 0x5c, 0x5b, 0x01, 0x00, 0xb9, 0x9b, 0x00, 0x00, + 0x58, 0x5b, 0x01, 0x00, 0x95, 0x9b, 0x00, 0x00, + 0x10, 0x00, 0x07, 0x00, 0x3c, 0x00, 0x68, 0x97, + 0x00, 0x00, 0x55, 0x9b, 0x00, 0x00, 0xb0, 0xb5, + 0x0d, 0x1c, 0x04, 0x30, 0x00, 0x24, 0xfe, 0xf7, + 0xd6, 0xfa, 0x01, 0x20, 0x6c, 0x60, 0xb0, 0xbd, + 0x00, 0x00, 0xf0, 0xb5, 0x07, 0x7a, 0x43, 0x68, + 0x04, 0x1c, 0x0e, 0x48, 0x0e, 0x1c, 0x00, 0x68, + 0x01, 0x25, 0x01, 0x1c, 0x9b, 0xb0, 0x06, 0xe0, + 0x4a, 0x68, 0x9a, 0x42, 0x02, 0xd1, 0x8f, 0x76, + 0x00, 0x25, 0x02, 0xe0, 0x09, 0x68, 0x3c, 0x00, + 0xa4, 0x97, 0x00, 0x00, 0x00, 0x29, 0xf6, 0xd1, + 0x00, 0x2d, 0x05, 0xd1, 0x21, 0x7a, 0x01, 0x29, + 0x02, 0xd1, 0x01, 0xa9, 0xf8, 0xf7, 0xa8, 0xf8, + 0x60, 0x68, 0x04, 0x36, 0x21, 0xc6, 0x1b, 0xb0, + 0x01, 0x20, 0xf0, 0xbd, 0xa4, 0x6e, 0x01, 0x00, + 0x10, 0xb5, 0x0c, 0x1c, 0x08, 0xf0, 0xae, 0xfc, + 0x60, 0x60, 0x01, 0x20, 0x10, 0xbd, 0x00, 0x00, + 0x10, 0xb5, 0x0c, 0x1c, 0x07, 0xf0, 0x84, 0xfa, + 0x3c, 0x00, 0xe0, 0x97, 0x00, 0x00, 0x04, 0xf0, + 0x54, 0xff, 0x00, 0x20, 0x60, 0x60, 0x01, 0x20, + 0x10, 0xbd, 0x00, 0x20, 0xc0, 0x43, 0x48, 0x60, + 0x01, 0x20, 0x70, 0x47, 0x00, 0x00, 0x10, 0xb5, + 0x0c, 0x1c, 0x00, 0x79, 0xfa, 0xf7, 0x07, 0xf8, + 0x00, 0x28, 0x01, 0xd0, 0x00, 0x20, 0x00, 0xe0, + 0x02, 0x20, 0x60, 0x60, 0x01, 0x20, 0x10, 0xbd, + 0x00, 0x00, 0x1c, 0xb5, 0x06, 0x4c, 0x20, 0x68, + 0x00, 0x28, 0x3c, 0x00, 0x1c, 0x98, 0x00, 0x00, + 0x07, 0xd0, 0x09, 0xf0, 0xc5, 0xfa, 0x01, 0x90, + 0x20, 0x68, 0x41, 0x68, 0x68, 0x46, 0xf6, 0xf7, + 0xd6, 0xfd, 0x1c, 0xbd, 0xac, 0x79, 0x01, 0x00, + 0x01, 0x49, 0x08, 0x60, 0x70, 0x47, 0x00, 0x00, + 0xac, 0x79, 0x01, 0x00, 0x0e, 0xb5, 0x06, 0x4b, + 0x1b, 0x68, 0x00, 0x2b, 0x06, 0xd0, 0x02, 0x90, + 0x00, 0x91, 0x01, 0x92, 0x68, 0x46, 0xd9, 0x68, + 0xf6, 0xf7, 0xc1, 0xfd, 0x3c, 0x00, 0x58, 0x98, + 0x00, 0x00, 0x0e, 0xbd, 0x00, 0x00, 0xac, 0x79, + 0x01, 0x00, 0x1c, 0xb5, 0x04, 0x1c, 0x07, 0xf0, + 0x4c, 0xfa, 0x06, 0x48, 0x41, 0x68, 0x01, 0x31, + 0x41, 0x60, 0x00, 0x94, 0x00, 0x21, 0x01, 0x91, + 0x00, 0x68, 0x01, 0x68, 0x68, 0x46, 0xf6, 0xf7, + 0xad, 0xfd, 0x1c, 0xbd, 0x00, 0x00, 0xac, 0x79, + 0x01, 0x00, 0x80, 0xb5, 0xf8, 0xf7, 0xa3, 0xf8, + 0x80, 0xbd, 0x80, 0xb5, 0x02, 0x1c, 0x3c, 0x00, + 0x94, 0x98, 0x00, 0x00, 0x80, 0x21, 0x03, 0x20, + 0x00, 0xf0, 0x5c, 0xf8, 0x01, 0x1c, 0x03, 0x48, + 0x00, 0x22, 0x43, 0x69, 0xf6, 0xf7, 0x9b, 0xfd, + 0x80, 0xbd, 0x00, 0x00, 0xa4, 0x6d, 0x01, 0x00, + 0xf8, 0xb5, 0x0c, 0x1c, 0x13, 0x49, 0x05, 0x1c, + 0x08, 0x68, 0x16, 0x1c, 0x01, 0x30, 0x08, 0x60, + 0x00, 0x20, 0x20, 0x61, 0x22, 0x1c, 0x10, 0x32, + 0x28, 0x1d, 0x00, 0x21, 0x07, 0x1c, 0x00, 0x92, + 0x3c, 0x00, 0xd0, 0x98, 0x00, 0x00, 0x03, 0xf0, + 0xde, 0xfe, 0x20, 0x71, 0x20, 0x69, 0x00, 0x28, + 0x10, 0xd0, 0x01, 0x04, 0x09, 0x0c, 0x00, 0x20, + 0xf7, 0xf7, 0x79, 0xfe, 0x30, 0x60, 0x29, 0x1d, + 0x03, 0xc9, 0xa0, 0x60, 0xe1, 0x60, 0x30, 0x68, + 0x01, 0x68, 0x00, 0x9a, 0x38, 0x1c, 0x03, 0xf0, + 0xca, 0xfe, 0x20, 0x71, 0x01, 0x20, 0xf8, 0xbd, + 0x00, 0x00, 0x10, 0x75, 0x01, 0x00, 0x80, 0xb5, + 0x02, 0x1c, 0x3c, 0x00, 0x0c, 0x99, 0x00, 0x00, + 0x08, 0x21, 0x04, 0x20, 0x09, 0xf0, 0x4e, 0xff, + 0x03, 0x20, 0x80, 0xbd, 0x10, 0xb5, 0x07, 0x4a, + 0x0c, 0x1c, 0x51, 0x68, 0x01, 0x31, 0x51, 0x60, + 0x01, 0x1c, 0x10, 0x31, 0xc2, 0x68, 0x04, 0x30, + 0x03, 0xf0, 0xf0, 0xfe, 0x20, 0x71, 0x00, 0x20, + 0x10, 0xbd, 0x00, 0x00, 0x10, 0x75, 0x01, 0x00, + 0x04, 0x49, 0x80, 0xb5, 0x81, 0x61, 0x08, 0x21, + 0x02, 0x1c, 0x03, 0x20, 0x3c, 0x00, 0x48, 0x99, + 0x00, 0x00, 0x09, 0xf0, 0x32, 0xff, 0x03, 0x20, + 0x80, 0xbd, 0x95, 0xd8, 0x00, 0x00, 0xf7, 0xb5, + 0x07, 0x1c, 0x16, 0x1c, 0x06, 0x21, 0x00, 0x20, + 0x82, 0xb0, 0xf7, 0xf7, 0x3a, 0xfe, 0x05, 0x1c, + 0x20, 0x48, 0x00, 0x78, 0x06, 0x28, 0x00, 0xd9, + 0x28, 0x81, 0x2c, 0x68, 0x00, 0x20, 0xa7, 0x70, + 0x03, 0x99, 0xe1, 0x70, 0x31, 0x1c, 0x03, 0xe0, + 0x0a, 0x89, 0x10, 0x18, 0x0f, 0x1c, 0x3c, 0x00, + 0x84, 0x99, 0x00, 0x00, 0xc9, 0x68, 0x00, 0x29, + 0xf9, 0xd1, 0x6b, 0x46, 0x01, 0xaa, 0x21, 0x1d, + 0x00, 0xf0, 0x34, 0xf8, 0x00, 0xab, 0x18, 0x78, + 0x60, 0x71, 0x18, 0x78, 0x00, 0x28, 0x17, 0xd0, + 0x11, 0x48, 0x40, 0x68, 0x00, 0x28, 0x08, 0xd0, + 0x19, 0x78, 0x00, 0x20, 0xf7, 0xf7, 0x14, 0xfe, + 0x01, 0x1c, 0x38, 0x1c, 0xf7, 0xf7, 0x30, 0xfd, + 0x0a, 0xe0, 0x38, 0x68, 0x00, 0x28, 0x02, 0xd1, + 0x3c, 0x00, 0xc0, 0x99, 0x00, 0x00, 0x3f, 0x60, + 0x01, 0x20, 0xb8, 0x61, 0x00, 0xab, 0x19, 0x78, + 0x38, 0x89, 0x40, 0x18, 0x38, 0x81, 0x00, 0xab, + 0x98, 0x88, 0x31, 0x1c, 0x02, 0x38, 0x20, 0x80, + 0x28, 0x1c, 0xf7, 0xf7, 0x1c, 0xfd, 0x28, 0x1c, + 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xc8, 0x5c, + 0x01, 0x00, 0x01, 0x79, 0x42, 0x79, 0x00, 0x88, + 0x89, 0x18, 0x02, 0x39, 0x40, 0x1a, 0x70, 0x47, + 0x00, 0x00, 0x3c, 0x00, 0xfc, 0x99, 0x00, 0x00, + 0x70, 0xb5, 0x08, 0x4d, 0x2c, 0x78, 0xad, 0x78, + 0x20, 0x18, 0x06, 0x1c, 0x00, 0x2d, 0x03, 0xd0, + 0x70, 0x19, 0x01, 0x38, 0x01, 0x3d, 0xa8, 0x43, + 0x10, 0x80, 0x80, 0x1b, 0x18, 0x70, 0x0c, 0x70, + 0x70, 0xbd, 0x00, 0x00, 0xc8, 0x5c, 0x01, 0x00, + 0xb0, 0xb5, 0x04, 0x68, 0x0c, 0x4a, 0x21, 0x88, + 0x52, 0x78, 0x02, 0x31, 0x91, 0x42, 0x11, 0xd2, + 0x55, 0x1a, 0xf7, 0xf7, 0x3c, 0x00, 0x38, 0x9a, + 0x00, 0x00, 0xc9, 0xfd, 0x01, 0x68, 0x00, 0x29, + 0x02, 0xd1, 0x00, 0x60, 0x01, 0x21, 0x81, 0x61, + 0x01, 0x89, 0x49, 0x19, 0x01, 0x81, 0x20, 0x88, + 0x40, 0x19, 0x20, 0x80, 0x60, 0x79, 0x40, 0x19, + 0x60, 0x71, 0xb0, 0xbd, 0x00, 0x00, 0xc8, 0x5c, + 0x01, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x06, 0x21, + 0xf1, 0x20, 0x09, 0xf0, 0xa2, 0xfe, 0x80, 0xbd, + 0x00, 0x00, 0x03, 0x1c, 0x02, 0x48, 0x3c, 0x00, + 0x74, 0x9a, 0x00, 0x00, 0x03, 0x70, 0x41, 0x70, + 0x82, 0x70, 0x70, 0x47, 0xc8, 0x5c, 0x01, 0x00, + 0xb0, 0xb5, 0x08, 0x1c, 0x09, 0x68, 0x15, 0x1c, + 0x8c, 0x78, 0xf7, 0xf7, 0x85, 0xfd, 0x04, 0x49, + 0xa0, 0x00, 0x09, 0x58, 0x00, 0x29, 0x02, 0xd0, + 0x28, 0x1c, 0xf6, 0xf7, 0x9e, 0xfc, 0xb0, 0xbd, + 0x84, 0x6d, 0x01, 0x00, 0xfe, 0xb5, 0x04, 0x1c, + 0xc0, 0x7a, 0xa1, 0x7a, 0xc6, 0x07, 0xf6, 0x0f, + 0x3c, 0x00, 0xb0, 0x9a, 0x00, 0x00, 0x32, 0x1c, + 0x20, 0x1d, 0x01, 0xf0, 0x3c, 0xf8, 0x60, 0x69, + 0x25, 0x4f, 0xc1, 0x07, 0x37, 0xd5, 0xb8, 0x69, + 0x00, 0x28, 0x01, 0xd0, 0xf6, 0xf7, 0x87, 0xfc, + 0x20, 0x68, 0x05, 0x68, 0x28, 0x88, 0x80, 0x07, + 0x34, 0xd1, 0x01, 0xaa, 0x02, 0xa9, 0x28, 0x1c, + 0x01, 0xf0, 0x0b, 0xfc, 0x28, 0x1c, 0x01, 0xf0, + 0x12, 0xfc, 0x00, 0x78, 0xc0, 0x07, 0x0a, 0xd4, + 0x60, 0x69, 0x3c, 0x00, 0xec, 0x9a, 0x00, 0x00, + 0x80, 0x07, 0x26, 0xd4, 0x33, 0x1c, 0x29, 0x1c, + 0xa2, 0x7a, 0x20, 0x69, 0x7d, 0x69, 0xf6, 0xf7, + 0x72, 0xfc, 0x1e, 0xe0, 0x00, 0xab, 0x18, 0x7a, + 0x00, 0x28, 0x03, 0xd0, 0x01, 0x28, 0x06, 0xd0, + 0x02, 0x28, 0x16, 0xd1, 0x28, 0x1c, 0x79, 0x6a, + 0xf6, 0xf7, 0x61, 0xfc, 0x11, 0xe0, 0x00, 0xab, + 0x18, 0x79, 0x0e, 0x28, 0x01, 0xd0, 0x0f, 0x28, + 0x0b, 0xd1, 0x28, 0x1c, 0x3c, 0x00, 0x28, 0x9b, + 0x00, 0x00, 0x39, 0x6a, 0xf6, 0xf7, 0x56, 0xfc, + 0x06, 0xe0, 0x00, 0x07, 0x80, 0x0f, 0x03, 0xd1, + 0x20, 0x69, 0xf9, 0x69, 0xf6, 0xf7, 0x4e, 0xfc, + 0x78, 0x6b, 0x21, 0x21, 0x01, 0x30, 0x78, 0x63, + 0x22, 0x1c, 0x80, 0x20, 0x09, 0xf0, 0x31, 0xfe, + 0xfe, 0xbd, 0x28, 0x7a, 0x01, 0x00, 0x0b, 0x49, + 0x18, 0xb5, 0x08, 0x78, 0xc0, 0x07, 0x11, 0xd5, + 0x0a, 0x4a, 0x10, 0x1c, 0x20, 0x30, 0x3c, 0x00, + 0x64, 0x9b, 0x00, 0x00, 0x84, 0x79, 0x00, 0xab, + 0x1c, 0x70, 0xc0, 0x79, 0x58, 0x70, 0x08, 0x78, + 0x40, 0x23, 0x18, 0x43, 0x08, 0x70, 0x05, 0x48, + 0x00, 0x78, 0x08, 0x70, 0x00, 0xab, 0x18, 0x88, + 0xd0, 0x84, 0x18, 0xbd, 0x04, 0x00, 0x07, 0x00, + 0x00, 0x10, 0x07, 0x00, 0xe0, 0x60, 0x01, 0x00, + 0x70, 0x47, 0x00, 0x00, 0x05, 0x49, 0x10, 0xb5, + 0x88, 0x79, 0x05, 0x4b, 0x1a, 0x7c, 0x05, 0x4c, + 0x3c, 0x00, 0xa0, 0x9b, 0x00, 0x00, 0x24, 0x68, + 0x62, 0x40, 0x1a, 0x74, 0x88, 0x71, 0x10, 0xbd, + 0x00, 0x00, 0x20, 0x10, 0x07, 0x00, 0x10, 0x00, + 0x07, 0x00, 0x58, 0x5b, 0x01, 0x00, 0x04, 0x49, + 0x0a, 0x68, 0x04, 0x48, 0x00, 0x68, 0x02, 0x40, + 0x01, 0xd0, 0x88, 0x61, 0x70, 0x47, 0x48, 0x61, + 0x70, 0x47, 0x10, 0x00, 0x07, 0x00, 0x58, 0x5b, + 0x01, 0x00, 0x02, 0x1c, 0x01, 0x20, 0x00, 0x06, + 0x08, 0x43, 0x3c, 0x00, 0xdc, 0x9b, 0x00, 0x00, + 0x80, 0xb5, 0x2a, 0x21, 0x09, 0xf0, 0xe6, 0xfd, + 0x80, 0xbd, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x1c, + 0x00, 0x29, 0x03, 0xd0, 0x81, 0x29, 0x07, 0xd1, + 0x81, 0x20, 0x00, 0xe0, 0x80, 0x20, 0x22, 0x1c, + 0x2c, 0x21, 0x09, 0xf0, 0xd7, 0xfd, 0x10, 0xbd, + 0x02, 0x21, 0x2c, 0x20, 0xf7, 0xf7, 0x4c, 0xfb, + 0x20, 0x1c, 0xf7, 0xf7, 0xc3, 0xfc, 0x10, 0xbd, + 0x80, 0xb5, 0xb4, 0xb0, 0x3c, 0x00, 0x18, 0x9c, + 0x00, 0x00, 0x01, 0x28, 0x06, 0xd0, 0x82, 0x28, + 0x1c, 0xd1, 0x1a, 0xa8, 0x07, 0xf0, 0x35, 0xfc, + 0x34, 0xb0, 0x80, 0xbd, 0x81, 0x29, 0x13, 0xd1, + 0x0d, 0x48, 0x0c, 0x4a, 0x81, 0x69, 0x00, 0x68, + 0x50, 0x32, 0x81, 0x42, 0x02, 0xd0, 0xd1, 0x6a, + 0x01, 0x29, 0x02, 0xd0, 0x11, 0x78, 0x02, 0x29, + 0x02, 0xd1, 0x07, 0xf0, 0x0a, 0xf9, 0xeb, 0xe7, + 0x69, 0x46, 0xf7, 0xf7, 0x5a, 0xfe, 0x3c, 0x00, + 0x54, 0x9c, 0x00, 0x00, 0xe7, 0xe7, 0x01, 0x21, + 0x00, 0xe0, 0x02, 0x21, 0x18, 0x20, 0xf7, 0xf7, + 0x21, 0xfb, 0xe0, 0xe7, 0xa4, 0x6e, 0x01, 0x00, + 0xb0, 0xb5, 0x04, 0x1c, 0x00, 0x68, 0x17, 0x4d, + 0x9a, 0xb0, 0x68, 0x63, 0x08, 0xf0, 0x3e, 0xfa, + 0x20, 0x79, 0x14, 0x49, 0x13, 0x4a, 0x50, 0x39, + 0x2c, 0x3a, 0x02, 0x28, 0x0a, 0xd1, 0x90, 0x68, + 0x80, 0x02, 0xa8, 0x61, 0xc8, 0x68, 0xe8, 0x61, + 0x3c, 0x00, 0x90, 0x9c, 0x00, 0x00, 0x02, 0x20, + 0x28, 0x72, 0x07, 0xf0, 0xe4, 0xf8, 0x1a, 0xb0, + 0xb0, 0xbd, 0x03, 0x1c, 0x00, 0x20, 0x00, 0x2b, + 0x0b, 0xd1, 0x52, 0x68, 0x92, 0x02, 0xaa, 0x61, + 0x0a, 0x1c, 0x89, 0x68, 0xe9, 0x61, 0x28, 0x72, + 0x10, 0x68, 0x69, 0x46, 0xf7, 0xf7, 0x27, 0xfe, + 0xed, 0xe7, 0xa8, 0x61, 0x01, 0x20, 0x28, 0x72, + 0x28, 0x70, 0x00, 0x20, 0x06, 0xf0, 0x7d, 0xfa, + 0xe5, 0xe7, 0x3c, 0x00, 0xcc, 0x9c, 0x00, 0x00, + 0xf4, 0x6e, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0x01, 0x21, + 0x07, 0x20, 0xf7, 0xf7, 0xe1, 0xfa, 0x80, 0xbd, + 0x70, 0x47, 0x00, 0x00, 0xf8, 0xb5, 0x00, 0x24, + 0x19, 0x4a, 0x00, 0x26, 0xd5, 0x68, 0x11, 0x68, + 0x04, 0x35, 0x08, 0x1c, 0x91, 0x60, 0x02, 0xe0, + 0x01, 0x1c, 0x40, 0x19, 0x08, 0x60, 0x53, 0x68, + 0x83, 0x42, 0xf9, 0xd8, 0x3c, 0x00, 0x08, 0x9d, + 0x00, 0x00, 0x01, 0x34, 0x10, 0x32, 0x03, 0x2c, + 0x0e, 0x60, 0xee, 0xd3, 0xf6, 0xf7, 0xf1, 0xff, + 0x10, 0x48, 0x10, 0x49, 0x12, 0x4c, 0x08, 0x60, + 0x10, 0x49, 0x00, 0x20, 0x01, 0x22, 0x19, 0x23, + 0x5b, 0x01, 0x0c, 0x25, 0x43, 0x43, 0x1b, 0x19, + 0x45, 0x43, 0x4a, 0x51, 0x1f, 0x1c, 0x6d, 0x18, + 0xab, 0x60, 0x6b, 0x60, 0x00, 0x25, 0x1e, 0x1c, + 0x14, 0x36, 0x9e, 0x60, 0x33, 0x1c, 0x3c, 0x00, + 0x44, 0x9d, 0x00, 0x00, 0x01, 0x35, 0x27, 0x2d, + 0xf8, 0xdb, 0x01, 0x30, 0x03, 0x28, 0x9f, 0x60, + 0xe8, 0xdb, 0xf8, 0xbd, 0x20, 0x57, 0x01, 0x00, + 0x14, 0xc8, 0x01, 0x00, 0xb4, 0xcf, 0x01, 0x00, + 0x18, 0xd9, 0x01, 0x00, 0xb8, 0xcf, 0x01, 0x00, + 0xb0, 0xb5, 0x07, 0x4c, 0x25, 0x1c, 0xc0, 0x35, + 0x28, 0x6b, 0x1e, 0x21, 0x00, 0xf0, 0xf2, 0xf9, + 0xa2, 0x6b, 0x20, 0x1c, 0xdc, 0x30, 0x29, 0x6b, + 0x3c, 0x00, 0x80, 0x9d, 0x00, 0x00, 0x00, 0xf0, + 0xb6, 0xf9, 0xb0, 0xbd, 0x00, 0x00, 0xc4, 0x69, + 0x01, 0x00, 0x00, 0x20, 0x10, 0x22, 0x10, 0xb5, + 0x0a, 0x49, 0x05, 0xe0, 0x0c, 0x23, 0x43, 0x43, + 0x5c, 0x18, 0x0c, 0x34, 0xcc, 0x50, 0x01, 0x30, + 0x0f, 0x28, 0xf7, 0xd3, 0x0c, 0x23, 0x58, 0x43, + 0x09, 0x50, 0x04, 0x48, 0x41, 0x60, 0x01, 0x60, + 0x02, 0x82, 0x00, 0x21, 0x81, 0x60, 0xc1, 0x60, + 0x10, 0xbd, 0x3c, 0x00, 0xbc, 0x9d, 0x00, 0x00, + 0x84, 0xe2, 0x01, 0x00, 0x44, 0xe3, 0x01, 0x00, + 0x10, 0xb5, 0x08, 0x4c, 0xa0, 0x6a, 0x00, 0x28, + 0x03, 0xd1, 0x07, 0x48, 0xf9, 0xf7, 0xe8, 0xfe, + 0xa0, 0x62, 0x04, 0x48, 0x44, 0x30, 0x00, 0x68, + 0x01, 0x21, 0xf9, 0xf7, 0x95, 0xfc, 0x60, 0x62, + 0x10, 0xbd, 0x00, 0x00, 0x60, 0x6c, 0x01, 0x00, + 0xcd, 0x26, 0x01, 0x00, 0xff, 0xb5, 0x0d, 0x1c, + 0x04, 0x1c, 0x1e, 0x1c, 0x3c, 0x00, 0xf8, 0x9d, + 0x00, 0x00, 0x81, 0xb0, 0x0a, 0x9f, 0x1c, 0x21, + 0xf6, 0xf7, 0x4d, 0xfb, 0x03, 0x98, 0xa0, 0x61, + 0x25, 0x60, 0x25, 0x61, 0x26, 0x81, 0xa6, 0x82, + 0xe7, 0x60, 0x05, 0xb0, 0xf0, 0xbd, 0x70, 0xb5, + 0x0d, 0x1c, 0xa4, 0x21, 0x04, 0x1c, 0x08, 0x30, + 0xf6, 0xf7, 0x3d, 0xfb, 0x20, 0x1c, 0x44, 0x30, + 0x06, 0x22, 0x29, 0x1c, 0xf6, 0xf7, 0x65, 0xfb, + 0x18, 0x48, 0x3c, 0x23, 0x41, 0x1c, 0x3c, 0x00, + 0x34, 0x9e, 0x00, 0x00, 0x61, 0x62, 0x41, 0x78, + 0x59, 0x43, 0x09, 0x18, 0x89, 0x7a, 0x06, 0x29, + 0x01, 0xd1, 0xa0, 0x62, 0x02, 0xe0, 0x21, 0x1c, + 0x4d, 0x31, 0xa1, 0x62, 0x41, 0x78, 0x3c, 0x23, + 0x59, 0x43, 0x08, 0x18, 0x04, 0x30, 0x0f, 0x49, + 0x20, 0x62, 0x0b, 0x88, 0x00, 0x2b, 0x15, 0xd0, + 0xac, 0x20, 0x00, 0x5d, 0x0b, 0x4a, 0x18, 0x32, + 0x00, 0x02, 0x80, 0x18, 0xb0, 0x30, 0xe0, 0x60, + 0x3c, 0x00, 0x70, 0x9e, 0x00, 0x00, 0x8d, 0x68, + 0x00, 0x20, 0x08, 0xe0, 0xe2, 0x68, 0xc1, 0x00, + 0x54, 0x50, 0xe6, 0x68, 0x82, 0x00, 0x52, 0x19, + 0x71, 0x18, 0x4a, 0x60, 0x01, 0x30, 0x98, 0x42, + 0xf4, 0xdb, 0x70, 0xbd, 0x00, 0x00, 0x68, 0x61, + 0x01, 0x00, 0x58, 0x75, 0x01, 0x00, 0x1f, 0xb5, + 0x04, 0x1c, 0x60, 0x34, 0x61, 0x7a, 0x03, 0x1c, + 0x80, 0x6a, 0x08, 0x4a, 0x02, 0x91, 0x01, 0x90, + 0x03, 0x92, 0x3c, 0x00, 0xac, 0x9e, 0x00, 0x00, + 0xe2, 0x79, 0x18, 0x1c, 0x20, 0x30, 0x00, 0x92, + 0x44, 0x7b, 0x82, 0x7b, 0x5e, 0x20, 0xc1, 0x5a, + 0x18, 0x69, 0x04, 0x30, 0x23, 0x1c, 0x02, 0xf0, + 0x7f, 0xfe, 0x1f, 0xbd, 0x39, 0x4e, 0x00, 0x00, + 0xb0, 0xb5, 0x0b, 0x1c, 0x01, 0x88, 0x69, 0x20, + 0xc0, 0x5c, 0x86, 0xb0, 0x0e, 0x4a, 0x04, 0x91, + 0x03, 0x90, 0x05, 0x92, 0x0d, 0x4d, 0x59, 0x6a, + 0x9a, 0x6a, 0x2d, 0x68, 0x3c, 0x00, 0xe8, 0x9e, + 0x00, 0x00, 0x01, 0x24, 0x00, 0x2d, 0x00, 0xd0, + 0x04, 0x1c, 0x0a, 0x48, 0x00, 0x5d, 0x01, 0x91, + 0x02, 0x92, 0x00, 0x90, 0x18, 0x1c, 0x20, 0x30, + 0x44, 0x7b, 0x82, 0x7b, 0x5e, 0x20, 0xc1, 0x5a, + 0x18, 0x69, 0x04, 0x30, 0x23, 0x1c, 0x02, 0xf0, + 0xa4, 0xfe, 0x06, 0xb0, 0xb0, 0xbd, 0x51, 0x4f, + 0x00, 0x00, 0x18, 0x67, 0x01, 0x00, 0x0a, 0x61, + 0x01, 0x00, 0x01, 0x89, 0x8a, 0x1c, 0x3c, 0x00, + 0x24, 0x9f, 0x00, 0x00, 0x02, 0x81, 0x02, 0x68, + 0x02, 0x3a, 0x02, 0x60, 0x08, 0x0a, 0x09, 0x02, + 0x08, 0x43, 0x10, 0x80, 0x70, 0x47, 0x00, 0x00, + 0x70, 0xb5, 0x05, 0x1c, 0x08, 0x78, 0x0e, 0x1c, + 0xff, 0x28, 0x14, 0xd0, 0x71, 0x78, 0x02, 0x31, + 0x00, 0x20, 0xf7, 0xf7, 0x45, 0xfb, 0x04, 0x1c, + 0x02, 0x89, 0x00, 0x68, 0x31, 0x1c, 0xf6, 0xf7, + 0xcf, 0xfa, 0x00, 0x2d, 0x06, 0xd0, 0x28, 0x1c, + 0x3c, 0x00, 0x60, 0x9f, 0x00, 0x00, 0xf7, 0xf7, + 0x34, 0xfb, 0x21, 0x1c, 0xf7, 0xf7, 0x57, 0xfa, + 0x00, 0xe0, 0x25, 0x1c, 0x28, 0x1c, 0x70, 0xbd, + 0x00, 0x00, 0xff, 0xb5, 0x0f, 0x1c, 0x1e, 0x1c, + 0x04, 0x1c, 0x98, 0x1c, 0x01, 0x04, 0x09, 0x0c, + 0x00, 0x20, 0x81, 0xb0, 0xf7, 0xf7, 0x27, 0xfb, + 0x05, 0x1c, 0x00, 0x68, 0x00, 0x2c, 0x38, 0x60, + 0x03, 0x99, 0x01, 0x70, 0x38, 0x68, 0x46, 0x70, + 0x06, 0xd0, 0x3c, 0x00, 0x9c, 0x9f, 0x00, 0x00, + 0x20, 0x1c, 0xf7, 0xf7, 0x15, 0xfb, 0x29, 0x1c, + 0xf7, 0xf7, 0x38, 0xfa, 0x00, 0xe0, 0x2c, 0x1c, + 0x20, 0x1c, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, + 0x70, 0xb5, 0x10, 0x48, 0x04, 0x68, 0x04, 0x60, + 0x0f, 0x49, 0x20, 0x20, 0x08, 0x60, 0xa0, 0x05, + 0x0e, 0x4e, 0x02, 0xd5, 0x70, 0x6a, 0xf6, 0xf7, + 0x05, 0xfa, 0xe0, 0x01, 0x02, 0xd5, 0x30, 0x6e, + 0xf6, 0xf7, 0x00, 0xfa, 0x3c, 0x00, 0xd8, 0x9f, + 0x00, 0x00, 0x0a, 0x48, 0x04, 0x40, 0x00, 0x25, + 0x07, 0xe0, 0xe0, 0x07, 0x03, 0xd5, 0xa8, 0x00, + 0x30, 0x58, 0xf6, 0xf7, 0xf6, 0xf9, 0x01, 0x35, + 0x64, 0x08, 0x00, 0x2c, 0xf5, 0xd1, 0x70, 0xbd, + 0x00, 0x00, 0x00, 0x40, 0x07, 0x00, 0x00, 0x10, + 0x07, 0x00, 0x30, 0x74, 0x01, 0x00, 0xff, 0xfd, + 0xff, 0xfe, 0x80, 0xb5, 0x07, 0x21, 0x80, 0x20, + 0xf7, 0xf7, 0x49, 0xf9, 0x80, 0xbd, 0x3c, 0x00, + 0x14, 0xa0, 0x00, 0x00, 0xf8, 0xb5, 0x14, 0x4b, + 0x82, 0x00, 0x9c, 0x58, 0xca, 0x06, 0x01, 0x27, + 0x39, 0x1c, 0xd2, 0x0e, 0x91, 0x40, 0x11, 0x4a, + 0x11, 0x60, 0x11, 0x4e, 0x40, 0x00, 0x85, 0x19, + 0x15, 0xe0, 0x60, 0x60, 0x20, 0x7b, 0xc1, 0x00, + 0x89, 0x19, 0x10, 0x31, 0x0a, 0x78, 0x0d, 0x23, + 0x9a, 0x43, 0x0a, 0x70, 0x39, 0x1c, 0x81, 0x40, + 0x31, 0x73, 0x07, 0x49, 0x00, 0x01, 0x08, 0x31, + 0x3c, 0x00, 0x50, 0xa0, 0x00, 0x00, 0x40, 0x18, + 0x08, 0x4a, 0x41, 0x68, 0x42, 0x60, 0x80, 0x68, + 0xf6, 0xf7, 0xbe, 0xf9, 0x28, 0x7b, 0x00, 0x28, + 0xe6, 0xd1, 0xf8, 0xbd, 0x00, 0x00, 0xa4, 0x73, + 0x01, 0x00, 0x00, 0x10, 0x07, 0x00, 0x00, 0x60, + 0x07, 0x00, 0xd1, 0x75, 0x00, 0x00, 0x03, 0x49, + 0x01, 0x20, 0x09, 0x7a, 0x00, 0x29, 0x00, 0xd1, + 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x04, 0x7a, + 0x01, 0x00, 0x3c, 0x00, 0x8c, 0xa0, 0x00, 0x00, + 0x03, 0x49, 0x01, 0x20, 0x89, 0x7a, 0x00, 0x29, + 0x00, 0xd1, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, + 0x14, 0x7a, 0x01, 0x00, 0xb0, 0xb5, 0x00, 0x24, + 0xfa, 0xf7, 0x76, 0xfc, 0x00, 0x28, 0x14, 0xd0, + 0x01, 0x24, 0x08, 0xf0, 0x7d, 0xfe, 0x0a, 0x4d, + 0x0a, 0x4b, 0x00, 0x21, 0x5a, 0x18, 0xa0, 0x32, + 0x12, 0x78, 0x10, 0x2a, 0x06, 0xd3, 0x8a, 0x00, + 0xd2, 0x18, 0x92, 0x6f, 0x3c, 0x00, 0xc8, 0xa0, + 0x00, 0x00, 0x82, 0x1a, 0xaa, 0x42, 0x00, 0xd2, + 0x00, 0x24, 0x01, 0x31, 0x03, 0x29, 0xf0, 0xd3, + 0x20, 0x1c, 0xb0, 0xbd, 0x00, 0x00, 0x8b, 0x08, + 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x01, 0x48, + 0xc0, 0x68, 0x70, 0x47, 0x00, 0x00, 0x78, 0x69, + 0x01, 0x00, 0x70, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, + 0x16, 0x1c, 0xfd, 0xf7, 0x2e, 0xfe, 0x00, 0x20, + 0xe0, 0x60, 0x26, 0x61, 0xa5, 0x60, 0x3c, 0x00, + 0x04, 0xa1, 0x00, 0x00, 0x70, 0xbd, 0x00, 0x00, + 0xf8, 0xb5, 0x17, 0x1c, 0x0e, 0x1c, 0x04, 0x1c, + 0x00, 0x28, 0x01, 0xd0, 0x00, 0x2e, 0x01, 0xd1, + 0xf7, 0xf7, 0xf2, 0xf8, 0xa0, 0x68, 0x07, 0xf0, + 0x49, 0xf9, 0x05, 0x1c, 0x01, 0xd1, 0xf7, 0xf7, + 0xeb, 0xf8, 0x29, 0x1c, 0x6e, 0x60, 0xaf, 0x60, + 0x20, 0x1c, 0xfd, 0xf7, 0xfd, 0xfd, 0xe0, 0x68, + 0x41, 0x1c, 0xe1, 0x60, 0x00, 0x28, 0x03, 0xd1, + 0x3c, 0x00, 0x40, 0xa1, 0x00, 0x00, 0x05, 0x48, + 0x21, 0x69, 0x05, 0xf0, 0x2c, 0xf9, 0x20, 0x68, + 0xa8, 0x42, 0x02, 0xd1, 0x38, 0x1c, 0xf6, 0xf7, + 0x48, 0xf9, 0xf8, 0xbd, 0x00, 0x00, 0xc4, 0x60, + 0x01, 0x00, 0x00, 0x22, 0x01, 0x39, 0x10, 0xb5, + 0x05, 0xe0, 0x0c, 0x23, 0x53, 0x43, 0x1c, 0x18, + 0x0c, 0x34, 0xc4, 0x50, 0x01, 0x32, 0x8a, 0x42, + 0xf7, 0xd3, 0x00, 0x21, 0x0c, 0x23, 0x5a, 0x43, + 0x81, 0x50, 0x3c, 0x00, 0x7c, 0xa1, 0x00, 0x00, + 0x10, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, + 0x01, 0xd1, 0xf7, 0xf7, 0xbb, 0xf8, 0x20, 0x1c, + 0xfd, 0xf7, 0xda, 0xfd, 0x01, 0x1c, 0x85, 0x68, + 0xa0, 0x68, 0x07, 0xf0, 0x09, 0xf9, 0xe0, 0x68, + 0x01, 0x38, 0xe0, 0x60, 0x03, 0xd1, 0x06, 0x48, + 0x21, 0x69, 0x05, 0xf0, 0xe7, 0xf8, 0x21, 0x68, + 0x00, 0x29, 0x03, 0xd0, 0x88, 0x68, 0x49, 0x68, + 0xf6, 0xf7, 0x11, 0xf9, 0x3c, 0x00, 0xb8, 0xa1, + 0x00, 0x00, 0x28, 0x1c, 0xb0, 0xbd, 0xc4, 0x60, + 0x01, 0x00, 0x01, 0x21, 0x00, 0x28, 0x8c, 0xb5, + 0x00, 0xd1, 0x00, 0x21, 0x0e, 0x20, 0x09, 0xf0, + 0x32, 0xfa, 0x83, 0x20, 0x00, 0xab, 0x18, 0x80, + 0x00, 0x20, 0x04, 0xf0, 0x0c, 0xf8, 0x01, 0x90, + 0x68, 0x46, 0x03, 0xf0, 0x7a, 0xf9, 0x8c, 0xbd, + 0x00, 0x00, 0x80, 0xb5, 0x08, 0xf0, 0xdf, 0xfd, + 0x06, 0x49, 0x0a, 0x89, 0x06, 0x49, 0x3c, 0x00, + 0xf4, 0xa1, 0x00, 0x00, 0x09, 0x6e, 0x41, 0x1a, + 0x0b, 0x0c, 0x59, 0x18, 0x89, 0x1a, 0x09, 0x04, + 0x09, 0x0c, 0x40, 0x1a, 0x80, 0xbd, 0x00, 0x00, + 0x00, 0x90, 0x07, 0x00, 0xa4, 0x6c, 0x01, 0x00, + 0x70, 0xb5, 0x04, 0x1c, 0x88, 0x7e, 0x0d, 0x1c, + 0x20, 0x28, 0x03, 0xd9, 0x03, 0x21, 0x18, 0x20, + 0xf7, 0xf7, 0x40, 0xf8, 0x00, 0x26, 0x26, 0x76, + 0xa8, 0x7e, 0x29, 0x1c, 0x1b, 0x31, 0x60, 0x76, + 0x3c, 0x00, 0x30, 0xa2, 0x00, 0x00, 0x20, 0x1c, + 0x1d, 0x30, 0xaa, 0x7e, 0xf6, 0xf7, 0x5f, 0xf9, + 0x68, 0x68, 0x29, 0x1c, 0x60, 0x60, 0xa8, 0x68, + 0x13, 0x31, 0xa0, 0x60, 0xa8, 0x7b, 0x06, 0x22, + 0x20, 0x73, 0xe8, 0x7b, 0x60, 0x73, 0x28, 0x7c, + 0xa0, 0x73, 0x68, 0x7c, 0xe0, 0x73, 0xa8, 0x89, + 0x20, 0x82, 0xa8, 0x7c, 0xe0, 0x76, 0x26, 0x77, + 0x20, 0x1c, 0x12, 0x30, 0xa6, 0x76, 0xf6, 0xf7, + 0x46, 0xf9, 0x3c, 0x00, 0x6c, 0xa2, 0x00, 0x00, + 0x60, 0x68, 0x43, 0x1c, 0x1d, 0xd0, 0x11, 0x4d, + 0x6d, 0x61, 0x28, 0x68, 0x00, 0x28, 0x1a, 0xd0, + 0x22, 0x7b, 0x01, 0x1c, 0x0b, 0x7b, 0x9a, 0x42, + 0x01, 0xd3, 0x20, 0x60, 0x14, 0xe0, 0x0b, 0x1c, + 0x09, 0x68, 0x00, 0x29, 0x0b, 0xd0, 0x0e, 0x7b, + 0xb2, 0x42, 0x08, 0xd2, 0x0b, 0x68, 0x00, 0x2b, + 0xf0, 0xd0, 0x1e, 0x7b, 0xb2, 0x42, 0xed, 0xd3, + 0x23, 0x60, 0x0c, 0x60, 0x3c, 0x00, 0xa8, 0xa2, + 0x00, 0x00, 0x01, 0xe0, 0x21, 0x60, 0x1c, 0x60, + 0x00, 0x20, 0x70, 0xbd, 0x26, 0x60, 0x2c, 0x60, + 0xfa, 0xe7, 0xa4, 0x6e, 0x01, 0x00, 0x13, 0x4a, + 0xb0, 0xb5, 0x51, 0x68, 0x01, 0x24, 0x00, 0x29, + 0x1e, 0xd0, 0x13, 0x1d, 0xd1, 0x61, 0x13, 0x62, + 0x43, 0x68, 0x04, 0xe0, 0x10, 0x62, 0x00, 0x68, + 0xd0, 0x61, 0x00, 0x28, 0x14, 0xd0, 0xd0, 0x69, + 0x45, 0x68, 0x9d, 0x42, 0xf6, 0xd1, 0x3c, 0x00, + 0xe4, 0xa2, 0x00, 0x00, 0x10, 0x6a, 0x81, 0x42, + 0x04, 0xd1, 0x51, 0x60, 0xd0, 0x69, 0x00, 0x68, + 0x08, 0x60, 0x02, 0xe0, 0xd1, 0x69, 0x09, 0x68, + 0x01, 0x60, 0xd0, 0x69, 0xfc, 0xf7, 0xce, 0xff, + 0x00, 0x28, 0x00, 0xd0, 0x00, 0x24, 0x20, 0x1c, + 0xb0, 0xbd, 0x00, 0x00, 0xa4, 0x6e, 0x01, 0x00, + 0xb0, 0xb5, 0x17, 0x4d, 0x01, 0x24, 0x29, 0x68, + 0x00, 0x29, 0x27, 0xd0, 0x6d, 0x61, 0x29, 0x61, + 0x3c, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x43, 0x68, + 0x04, 0xe0, 0x68, 0x61, 0x00, 0x68, 0x28, 0x61, + 0x00, 0x28, 0x1d, 0xd0, 0x28, 0x69, 0x42, 0x68, + 0x9a, 0x42, 0xf6, 0xd1, 0xaa, 0x69, 0x2b, 0x69, + 0x9a, 0x42, 0x00, 0xd1, 0xa9, 0x61, 0x6a, 0x69, + 0x91, 0x42, 0x03, 0xd1, 0x29, 0x60, 0x00, 0x68, + 0x08, 0x60, 0x06, 0xe0, 0x00, 0x68, 0x10, 0x60, + 0x28, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x07, 0xf0, + 0xcc, 0xfe, 0x3c, 0x00, 0x5c, 0xa3, 0x00, 0x00, + 0x28, 0x69, 0xfc, 0xf7, 0x9d, 0xff, 0x00, 0x28, + 0x02, 0xd0, 0x00, 0x24, 0x00, 0xe0, 0x01, 0x24, + 0x20, 0x1c, 0xb0, 0xbd, 0xa4, 0x6e, 0x01, 0x00, + 0xb0, 0xb5, 0x05, 0x1c, 0x07, 0x48, 0x44, 0x68, + 0x07, 0xe0, 0x21, 0x1c, 0x44, 0x31, 0x28, 0x1c, + 0x00, 0xf0, 0xd6, 0xfc, 0x00, 0x28, 0x02, 0xd1, + 0x64, 0x68, 0x00, 0x2c, 0xf5, 0xd1, 0x20, 0x1c, + 0xb0, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xa3, + 0x00, 0x00, 0x58, 0x75, 0x01, 0x00, 0x70, 0xb5, + 0x0d, 0x1c, 0x14, 0x1c, 0x00, 0x28, 0x0b, 0x4e, + 0x08, 0xd0, 0x70, 0x6e, 0x06, 0x23, 0x58, 0x43, + 0x02, 0x04, 0x12, 0x0c, 0x31, 0x1c, 0x28, 0x1c, + 0x22, 0x80, 0x07, 0xe0, 0x21, 0x88, 0x06, 0x20, + 0xf6, 0xf7, 0xa7, 0xf9, 0x70, 0x66, 0x22, 0x88, + 0x29, 0x1c, 0x30, 0x1c, 0xf6, 0xf7, 0x95, 0xf8, + 0x01, 0x20, 0x70, 0xbd, 0x00, 0x00, 0x3c, 0x00, + 0xd4, 0xa3, 0x00, 0x00, 0x10, 0x79, 0x01, 0x00, + 0x80, 0xb5, 0x03, 0x28, 0x03, 0xd8, 0x04, 0x4a, + 0xc0, 0x00, 0x11, 0x50, 0x80, 0xbd, 0x01, 0x21, + 0x26, 0x20, 0xf6, 0xf7, 0x5b, 0xff, 0x80, 0xbd, + 0x7c, 0x79, 0x01, 0x00, 0xb0, 0xb5, 0x05, 0x1c, + 0xc0, 0x68, 0x01, 0x89, 0x39, 0x29, 0x39, 0xd3, + 0x04, 0x68, 0xa0, 0x79, 0x88, 0x28, 0x35, 0xd1, + 0xe0, 0x79, 0x8e, 0x28, 0x32, 0xd1, 0x20, 0x7a, + 0x3c, 0x00, 0x10, 0xa4, 0x00, 0x00, 0x01, 0x28, + 0x2f, 0xd1, 0x60, 0x7a, 0x03, 0x28, 0x2c, 0xd1, + 0x20, 0x7b, 0x02, 0x28, 0x01, 0xd0, 0xfe, 0x28, + 0x27, 0xd1, 0x60, 0x7b, 0x1d, 0x21, 0x08, 0x40, + 0x01, 0x28, 0x22, 0xd1, 0xa0, 0x7b, 0xc8, 0x21, + 0x08, 0x40, 0x08, 0x28, 0x1d, 0xd1, 0xa8, 0x1d, + 0xfb, 0xf7, 0xe1, 0xf9, 0x00, 0x28, 0x18, 0xd0, + 0x19, 0x20, 0x21, 0x5c, 0x00, 0x29, 0x14, 0xd1, + 0x01, 0x30, 0x3c, 0x00, 0x4c, 0xa4, 0x00, 0x00, + 0x39, 0x28, 0xf9, 0xdb, 0x68, 0x8b, 0x04, 0x21, + 0x08, 0x43, 0x68, 0x83, 0x03, 0xf0, 0xd6, 0xfe, + 0x00, 0x28, 0x09, 0xd1, 0x00, 0x23, 0x00, 0x22, + 0x26, 0x20, 0x04, 0x49, 0x09, 0xf0, 0x92, 0xf9, + 0x03, 0x48, 0x00, 0x68, 0x01, 0xf0, 0x84, 0xf9, + 0xb0, 0xbd, 0x00, 0x00, 0x50, 0xc3, 0x00, 0x00, + 0x0c, 0x79, 0x01, 0x00, 0xb0, 0xb5, 0x08, 0x4c, + 0xa3, 0x68, 0x01, 0x33, 0x3c, 0x00, 0x88, 0xa4, + 0x00, 0x00, 0xa3, 0x60, 0x0c, 0x1c, 0x09, 0xd0, + 0x25, 0x68, 0x00, 0x2d, 0x03, 0xd0, 0x23, 0x7a, + 0x61, 0x68, 0xf5, 0xf7, 0xa3, 0xff, 0x20, 0x1c, + 0xf7, 0xf7, 0xa9, 0xf9, 0xb0, 0xbd, 0x94, 0x79, + 0x01, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0xc0, 0x68, + 0x01, 0x89, 0x05, 0x68, 0x08, 0x29, 0x53, 0xd3, + 0x06, 0x22, 0x28, 0x1c, 0x55, 0x49, 0xf5, 0xf7, + 0x9e, 0xff, 0x00, 0x28, 0x37, 0xd1, 0x3c, 0x00, + 0xc4, 0xa4, 0x00, 0x00, 0xe9, 0x88, 0x52, 0x4e, + 0x04, 0x3e, 0x81, 0x29, 0x24, 0xd1, 0xe5, 0x68, + 0x29, 0x68, 0x08, 0x7a, 0x4a, 0x7a, 0x00, 0x02, + 0x80, 0x18, 0x00, 0x04, 0x00, 0x0c, 0x42, 0x0b, + 0x00, 0x05, 0x00, 0x0d, 0xe2, 0x75, 0x20, 0x83, + 0x4b, 0x89, 0x00, 0x20, 0x42, 0x00, 0xb2, 0x5a, + 0x9a, 0x42, 0x06, 0xd1, 0x28, 0x89, 0x0c, 0x38, + 0x02, 0x0a, 0x00, 0x02, 0x10, 0x43, 0x48, 0x81, + 0x3c, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x02, 0xe0, + 0x01, 0x30, 0x02, 0x28, 0xf1, 0xd3, 0xe0, 0x68, + 0x01, 0x89, 0x0a, 0x39, 0x01, 0x81, 0xe0, 0x68, + 0x01, 0x68, 0x0a, 0x31, 0x1c, 0xe0, 0x00, 0x22, + 0x00, 0x20, 0x43, 0x00, 0xf3, 0x5a, 0x8b, 0x42, + 0x01, 0xd1, 0x01, 0x22, 0x02, 0xe0, 0x01, 0x30, + 0x02, 0x28, 0xf6, 0xd3, 0x00, 0x2a, 0x11, 0xd1, + 0x07, 0xe0, 0x36, 0x49, 0x06, 0x22, 0x06, 0x31, + 0x28, 0x1c, 0x3c, 0x00, 0x3c, 0xa5, 0x00, 0x00, + 0xf5, 0xf7, 0x5e, 0xff, 0x00, 0x28, 0x08, 0xd1, + 0xe0, 0x68, 0x01, 0x89, 0x06, 0x39, 0x01, 0x81, + 0xe0, 0x68, 0x01, 0x68, 0x06, 0x31, 0x01, 0x60, + 0x10, 0xe0, 0xe0, 0x68, 0xff, 0xf7, 0xe2, 0xfc, + 0x0c, 0xe0, 0x02, 0x31, 0x01, 0x81, 0xe0, 0x68, + 0x01, 0x68, 0x02, 0x39, 0x01, 0x60, 0xe0, 0x68, + 0x00, 0x89, 0x02, 0x38, 0x02, 0x0a, 0x00, 0x02, + 0x10, 0x43, 0x08, 0x80, 0x3c, 0x00, 0x78, 0xa5, + 0x00, 0x00, 0xe0, 0x68, 0x03, 0x25, 0x02, 0x89, + 0x01, 0x68, 0x24, 0x4e, 0x02, 0x2a, 0x10, 0xd9, + 0x09, 0x88, 0x08, 0x29, 0x05, 0xd0, 0xc1, 0x23, + 0xdb, 0x00, 0x99, 0x42, 0x03, 0xd1, 0x01, 0x25, + 0x02, 0xe0, 0x00, 0x25, 0x00, 0xe0, 0x02, 0x25, + 0xe9, 0x00, 0x71, 0x58, 0x00, 0x29, 0x00, 0xd1, + 0x02, 0x25, 0xf7, 0xf7, 0x04, 0xf8, 0xe9, 0x00, + 0x89, 0x19, 0x89, 0x88, 0x88, 0x42, 0x3c, 0x00, + 0xb4, 0xa5, 0x00, 0x00, 0x00, 0xd9, 0x03, 0x25, + 0xa1, 0x1d, 0x20, 0x1c, 0xfd, 0xf7, 0x34, 0xfc, + 0x00, 0x28, 0x00, 0xd1, 0x03, 0x25, 0x02, 0x2d, + 0x05, 0xd0, 0x03, 0x2d, 0x07, 0xd1, 0xe0, 0x68, + 0xf6, 0xf7, 0xe2, 0xff, 0x70, 0xbd, 0x20, 0x1c, + 0xfd, 0xf7, 0x1c, 0xfd, 0x70, 0xbd, 0xe0, 0x68, + 0x01, 0x89, 0x02, 0x39, 0x01, 0x81, 0xe0, 0x68, + 0x01, 0x68, 0x02, 0x31, 0x01, 0x60, 0xe8, 0x00, + 0x3c, 0x00, 0xf0, 0xa5, 0x00, 0x00, 0x31, 0x58, + 0x20, 0x1c, 0xf5, 0xf7, 0xf1, 0xfe, 0x00, 0x28, + 0xef, 0xd1, 0xe0, 0x68, 0x01, 0x89, 0x02, 0x31, + 0x01, 0x81, 0xe0, 0x68, 0x01, 0x68, 0x02, 0x39, + 0x01, 0x60, 0xe3, 0xe7, 0x00, 0x00, 0x6a, 0x46, + 0x01, 0x00, 0x7c, 0x79, 0x01, 0x00, 0x70, 0xb5, + 0x0e, 0x1c, 0x04, 0x1c, 0x15, 0x1c, 0xf7, 0xf7, + 0x8c, 0xfb, 0x00, 0x28, 0x2a, 0xd0, 0x1b, 0x49, + 0x08, 0x68, 0x3c, 0x00, 0x2c, 0xa6, 0x00, 0x00, + 0x01, 0x30, 0x08, 0x60, 0x00, 0x2e, 0x0a, 0xd0, + 0x01, 0x2e, 0x0b, 0xd0, 0x02, 0x2e, 0x0f, 0xd1, + 0x20, 0x1c, 0x04, 0xf0, 0xcd, 0xf8, 0x20, 0x1c, + 0xff, 0xf7, 0xd6, 0xfe, 0x0c, 0xe0, 0x08, 0x21, + 0xe0, 0x68, 0x02, 0xe0, 0xc1, 0x21, 0xe0, 0x68, + 0xc9, 0x00, 0x04, 0xf0, 0x35, 0xf9, 0x03, 0xe0, + 0x02, 0x21, 0x26, 0x20, 0xf6, 0xf7, 0x20, 0xfe, + 0xe2, 0x7d, 0xe1, 0x6a, 0x3c, 0x00, 0x68, 0xa6, + 0x00, 0x00, 0x28, 0x1c, 0xfc, 0xf7, 0x95, 0xfb, + 0x20, 0x63, 0x00, 0x20, 0x20, 0x62, 0xa0, 0x62, + 0x20, 0x1c, 0x00, 0xf0, 0x6c, 0xfe, 0x70, 0xbd, + 0xe0, 0x68, 0xf6, 0xf7, 0x8a, 0xff, 0x00, 0x2d, + 0xf9, 0xd0, 0xe3, 0x7d, 0x00, 0x22, 0x01, 0x20, + 0xe1, 0x6a, 0xf5, 0xf7, 0xa7, 0xfe, 0x70, 0xbd, + 0x00, 0x00, 0x94, 0x79, 0x01, 0x00, 0x80, 0xb5, + 0x01, 0x28, 0x04, 0xd1, 0x05, 0x48, 0x3c, 0x00, + 0xa4, 0xa6, 0x00, 0x00, 0x00, 0x68, 0x01, 0xf0, + 0x09, 0xf9, 0x80, 0xbd, 0x03, 0x21, 0x26, 0x20, + 0xf6, 0xf7, 0xf8, 0xfd, 0x80, 0xbd, 0x00, 0x00, + 0x0c, 0x79, 0x01, 0x00, 0xf8, 0xb5, 0x06, 0x1c, + 0x80, 0x79, 0x00, 0x24, 0xc0, 0x07, 0x2d, 0xd5, + 0xf0, 0x68, 0x00, 0x68, 0x41, 0x7a, 0x11, 0x29, + 0x28, 0xd1, 0xc1, 0x88, 0x0a, 0x0a, 0x09, 0x02, + 0x11, 0x43, 0xc9, 0x04, 0x22, 0xd1, 0x01, 0x78, + 0x3c, 0x00, 0xe0, 0xa6, 0x00, 0x00, 0x11, 0x4f, + 0x09, 0x07, 0x89, 0x0e, 0x08, 0x18, 0x41, 0x88, + 0x0a, 0x0a, 0x09, 0x02, 0x11, 0x43, 0x0d, 0x04, + 0x2d, 0x0c, 0x43, 0x2d, 0x39, 0x68, 0x01, 0xd1, + 0xca, 0x07, 0x0e, 0xd4, 0x44, 0x2d, 0x06, 0xd1, + 0xc9, 0x07, 0x04, 0xd5, 0x24, 0x30, 0x00, 0xf0, + 0x22, 0xfb, 0x00, 0x28, 0x05, 0xd0, 0x06, 0x48, + 0x85, 0x42, 0x06, 0xd1, 0x38, 0x68, 0x80, 0x07, + 0x03, 0xd5, 0x3c, 0x00, 0x1c, 0xa7, 0x00, 0x00, + 0x01, 0x24, 0xf0, 0x68, 0xf6, 0xf7, 0x3a, 0xff, + 0x20, 0x1c, 0xf8, 0xbd, 0x7c, 0x5a, 0x01, 0x00, + 0x6c, 0x07, 0x00, 0x00, 0x80, 0xb5, 0x00, 0x28, + 0x07, 0xd0, 0x00, 0x21, 0x26, 0x20, 0x08, 0xf0, + 0x7b, 0xff, 0x02, 0x48, 0x00, 0x68, 0x01, 0xf0, + 0xbb, 0xf8, 0x80, 0xbd, 0x0c, 0x79, 0x01, 0x00, + 0x10, 0xb5, 0x04, 0x1c, 0x09, 0x4a, 0x08, 0x1c, + 0x51, 0x68, 0x01, 0x31, 0x3c, 0x00, 0x58, 0xa7, + 0x00, 0x00, 0x51, 0x60, 0x00, 0x21, 0x21, 0x62, + 0xa1, 0x62, 0xe2, 0x7d, 0xe1, 0x6a, 0xfc, 0xf7, + 0x18, 0xfb, 0x20, 0x63, 0x20, 0x1c, 0xf7, 0xf7, + 0xe6, 0xfa, 0x20, 0x1c, 0x00, 0xf0, 0xef, 0xfd, + 0x10, 0xbd, 0x94, 0x79, 0x01, 0x00, 0x0c, 0xb5, + 0x02, 0x1c, 0x08, 0x1c, 0x00, 0x21, 0x01, 0x91, + 0x00, 0x92, 0x6a, 0x46, 0x01, 0xa9, 0x00, 0xf0, + 0x02, 0xf8, 0x0c, 0xbd, 0x00, 0x00, 0x3c, 0x00, + 0x94, 0xa7, 0x00, 0x00, 0x70, 0xb5, 0x13, 0x68, + 0x00, 0x2b, 0x1e, 0xd0, 0x00, 0x26, 0x0b, 0x68, + 0x00, 0x2b, 0x02, 0xd1, 0x13, 0x68, 0x1b, 0x68, + 0x0b, 0x60, 0x13, 0x68, 0x1c, 0x68, 0x1b, 0x89, + 0xe5, 0x18, 0x08, 0xe0, 0x5c, 0x78, 0x1c, 0x19, + 0x02, 0x34, 0x0c, 0x60, 0x1c, 0x78, 0x84, 0x42, + 0x01, 0xd1, 0x18, 0x1c, 0x70, 0xbd, 0x0b, 0x68, + 0xab, 0x42, 0xf3, 0xd3, 0x13, 0x68, 0xdb, 0x68, + 0x3c, 0x00, 0xd0, 0xa7, 0x00, 0x00, 0x13, 0x60, + 0x0e, 0x60, 0x13, 0x68, 0x00, 0x2b, 0xe1, 0xd1, + 0x00, 0x20, 0x70, 0xbd, 0x00, 0x00, 0x70, 0xb5, + 0x03, 0x1c, 0x20, 0xd0, 0x18, 0x68, 0x1e, 0x89, + 0x05, 0x1c, 0x16, 0xe0, 0x04, 0x78, 0xdd, 0x2c, + 0x10, 0xd1, 0x84, 0x78, 0x00, 0x2c, 0x0d, 0xd1, + 0xc4, 0x78, 0x50, 0x2c, 0x0a, 0xd1, 0x04, 0x79, + 0xf2, 0x2c, 0x07, 0xd1, 0x44, 0x79, 0x8c, 0x42, + 0x04, 0xd1, 0x3c, 0x00, 0x0c, 0xa8, 0x00, 0x00, + 0x02, 0x29, 0x0c, 0xd1, 0x84, 0x79, 0x94, 0x42, + 0x09, 0xd0, 0x44, 0x78, 0x20, 0x18, 0x02, 0x30, + 0x44, 0x1b, 0xb4, 0x42, 0xe5, 0xdb, 0xdb, 0x68, + 0x00, 0x2b, 0xde, 0xd1, 0x00, 0x20, 0x70, 0xbd, + 0x04, 0x49, 0x80, 0xb5, 0x0a, 0x78, 0x0a, 0x20, + 0x00, 0x2a, 0x00, 0xd0, 0x48, 0x6a, 0x00, 0xf0, + 0xd1, 0xf8, 0x80, 0xbd, 0x1c, 0x75, 0x01, 0x00, + 0xb0, 0xb5, 0x17, 0x4c, 0x3c, 0x00, 0x48, 0xa8, + 0x00, 0x00, 0x20, 0x68, 0x00, 0x28, 0x29, 0xd0, + 0x16, 0x4d, 0xe8, 0x69, 0x00, 0x28, 0x25, 0xd1, + 0x01, 0xf0, 0x3f, 0xfa, 0x00, 0x28, 0x21, 0xd1, + 0xff, 0xf7, 0x41, 0xfc, 0x00, 0x28, 0x1d, 0xd1, + 0x20, 0x68, 0xa9, 0x69, 0x40, 0x18, 0x08, 0xf0, + 0xd6, 0xf9, 0x00, 0x28, 0x16, 0xd0, 0x02, 0xf0, + 0x06, 0xfd, 0x21, 0x68, 0x40, 0x18, 0x08, 0xf0, + 0xce, 0xf9, 0x00, 0x28, 0x0e, 0xd0, 0x3c, 0x00, + 0x84, 0xa8, 0x00, 0x00, 0x01, 0x20, 0xe8, 0x61, + 0x00, 0x22, 0x25, 0x21, 0x80, 0x20, 0x08, 0xf0, + 0x8f, 0xff, 0x06, 0x48, 0x29, 0x6a, 0x04, 0xf0, + 0x83, 0xfd, 0x01, 0x21, 0x28, 0x6a, 0x00, 0xf0, + 0x89, 0xff, 0xb0, 0xbd, 0xe8, 0x59, 0x01, 0x00, + 0x1c, 0x75, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, + 0x70, 0xb5, 0x05, 0x1c, 0x00, 0x24, 0xfa, 0xf7, + 0x0b, 0xff, 0x18, 0x4e, 0x71, 0x6a, 0x40, 0x18, + 0x3c, 0x00, 0xc0, 0xa8, 0x00, 0x00, 0x00, 0xf0, + 0x8e, 0xf8, 0x00, 0x28, 0x0b, 0xd1, 0x04, 0xf0, + 0xfe, 0xfb, 0x00, 0x21, 0x25, 0x20, 0x08, 0xf0, + 0xb0, 0xfe, 0x03, 0x22, 0x29, 0x1c, 0x28, 0x1c, + 0x00, 0xf0, 0xaf, 0xf8, 0x18, 0xe0, 0x70, 0x6a, + 0x44, 0x1e, 0x00, 0xf0, 0x7c, 0xf8, 0x00, 0x28, + 0x12, 0xd1, 0x0c, 0x48, 0x31, 0x6a, 0x04, 0xf0, + 0x56, 0xfd, 0x01, 0x21, 0x30, 0x6a, 0x00, 0xf0, + 0x5c, 0xff, 0x3c, 0x00, 0xfc, 0xa8, 0x00, 0x00, + 0x00, 0x20, 0xfa, 0xf7, 0x0d, 0xfe, 0x06, 0xf0, + 0x03, 0xf8, 0x00, 0x23, 0x00, 0x22, 0x25, 0x20, + 0x05, 0x49, 0x08, 0xf0, 0x3f, 0xff, 0x20, 0x1c, + 0x07, 0xf0, 0xfc, 0xfa, 0x70, 0xbd, 0x00, 0x00, + 0x1c, 0x75, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, + 0x10, 0x27, 0x00, 0x00, 0x80, 0xb5, 0x01, 0x28, + 0x07, 0xd0, 0x80, 0x28, 0x0d, 0xd1, 0x00, 0x22, + 0x00, 0x21, 0x08, 0x48, 0x3c, 0x00, 0x38, 0xa9, + 0x00, 0x00, 0xf8, 0xf7, 0x9a, 0xfe, 0x80, 0xbd, + 0x01, 0x29, 0x02, 0xd1, 0x06, 0x49, 0x00, 0x20, + 0xc8, 0x61, 0x04, 0xf0, 0xbe, 0xfb, 0x80, 0xbd, + 0x05, 0x21, 0x25, 0x20, 0xf6, 0xf7, 0xa7, 0xfc, + 0x80, 0xbd, 0x61, 0xa9, 0x00, 0x00, 0x1c, 0x75, + 0x01, 0x00, 0x00, 0x21, 0x00, 0x28, 0x80, 0xb5, + 0x01, 0xd1, 0x03, 0x48, 0x41, 0x68, 0x01, 0x22, + 0x25, 0x20, 0x08, 0xf0, 0x2c, 0xfe, 0x3c, 0x00, + 0x74, 0xa9, 0x00, 0x00, 0x80, 0xbd, 0x00, 0x00, + 0xe8, 0x59, 0x01, 0x00, 0x02, 0x49, 0xc8, 0x68, + 0x01, 0x38, 0x48, 0x62, 0x70, 0x47, 0x00, 0x00, + 0x1c, 0x75, 0x01, 0x00, 0x38, 0xb5, 0x03, 0x1c, + 0x08, 0x1c, 0x19, 0x1c, 0x11, 0x4b, 0x06, 0xd0, + 0x01, 0x21, 0x11, 0x80, 0x0a, 0x1c, 0x19, 0x1c, + 0xf5, 0xf7, 0xaa, 0xfd, 0x17, 0xe0, 0x0d, 0x4d, + 0x01, 0x1c, 0x2c, 0x78, 0x12, 0x88, 0x18, 0x1c, + 0x3c, 0x00, 0xb0, 0xa9, 0x00, 0x00, 0xf5, 0xf7, + 0xa2, 0xfd, 0x28, 0x78, 0x84, 0x42, 0x0d, 0xd0, + 0x00, 0x23, 0x6b, 0x61, 0x00, 0x28, 0x03, 0xd0, + 0x00, 0x20, 0x07, 0xf0, 0xa4, 0xfa, 0x05, 0xe0, + 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, 0x00, 0x92, + 0xf8, 0xf7, 0x23, 0xfc, 0x01, 0x20, 0x38, 0xbd, + 0x00, 0x00, 0x1c, 0x75, 0x01, 0x00, 0x70, 0xb5, + 0x04, 0x1c, 0x01, 0x26, 0x08, 0xf0, 0xe1, 0xf9, + 0x05, 0x1c, 0x3c, 0x00, 0xec, 0xa9, 0x00, 0x00, + 0x00, 0x20, 0xfa, 0xf7, 0x8b, 0xfd, 0x44, 0x43, + 0x02, 0xf0, 0x40, 0xfc, 0x02, 0xf0, 0x3e, 0xfc, + 0x01, 0x1c, 0x23, 0x1c, 0x00, 0x22, 0x28, 0x1c, + 0x08, 0xf0, 0x7c, 0xfa, 0x00, 0x28, 0x13, 0xd1, + 0x0a, 0x48, 0x23, 0x1c, 0x00, 0x22, 0x81, 0x69, + 0x28, 0x1c, 0x08, 0xf0, 0x73, 0xfa, 0x00, 0x28, + 0x0a, 0xd1, 0xf8, 0xf7, 0x19, 0xfc, 0x01, 0x1c, + 0x23, 0x1c, 0x00, 0x22, 0x3c, 0x00, 0x28, 0xaa, + 0x00, 0x00, 0x28, 0x1c, 0x08, 0xf0, 0x69, 0xfa, + 0x00, 0x28, 0x00, 0xd1, 0x00, 0x26, 0x30, 0x1c, + 0x70, 0xbd, 0x1c, 0x75, 0x01, 0x00, 0x70, 0xb5, + 0x0d, 0x1c, 0x04, 0x1c, 0x16, 0x1c, 0x07, 0xf0, + 0x76, 0xf9, 0x00, 0x28, 0x0d, 0xd0, 0xfa, 0xf7, + 0x52, 0xfe, 0x00, 0x28, 0x09, 0xd0, 0xff, 0x30, + 0x01, 0x30, 0x43, 0x68, 0x00, 0x2b, 0x04, 0xd0, + 0x22, 0x1c, 0x29, 0x1c, 0x30, 0x1c, 0x3c, 0x00, + 0x64, 0xaa, 0x00, 0x00, 0xf5, 0xf7, 0xbb, 0xfc, + 0x70, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x01, 0x21, + 0x1d, 0x20, 0x08, 0xf0, 0xdf, 0xfd, 0x07, 0x4a, + 0x07, 0x48, 0x11, 0x69, 0x01, 0x60, 0x51, 0x69, + 0x41, 0x60, 0x06, 0x49, 0x49, 0x68, 0x81, 0x60, + 0x00, 0x21, 0xc1, 0x60, 0x03, 0xf0, 0x74, 0xfc, + 0x80, 0xbd, 0x00, 0x00, 0x28, 0x61, 0x01, 0x00, + 0x48, 0x75, 0x01, 0x00, 0x90, 0x5c, 0x01, 0x00, + 0x3c, 0x00, 0xa0, 0xaa, 0x00, 0x00, 0x70, 0xb5, + 0x04, 0x1c, 0x40, 0x6b, 0x00, 0x28, 0x35, 0xd0, + 0x1d, 0x4d, 0x00, 0x26, 0x28, 0x78, 0x00, 0x28, + 0x24, 0xd0, 0x41, 0x20, 0x00, 0x5d, 0x00, 0x28, + 0x03, 0xd1, 0x08, 0xf0, 0x76, 0xf9, 0xa8, 0x61, + 0x1b, 0xe0, 0x69, 0x69, 0x01, 0x31, 0x69, 0x61, + 0xa8, 0x68, 0x00, 0x28, 0x08, 0xd0, 0x81, 0x42, + 0x06, 0xd1, 0x20, 0x69, 0x01, 0x1c, 0x10, 0x31, + 0x04, 0x30, 0x3c, 0x00, 0xdc, 0xaa, 0x00, 0x00, + 0x82, 0x22, 0xff, 0xf7, 0xad, 0xff, 0x68, 0x68, + 0x00, 0x28, 0x0a, 0xd0, 0x69, 0x69, 0x81, 0x42, + 0x07, 0xd1, 0x20, 0x69, 0x01, 0x1c, 0x10, 0x31, + 0x04, 0x30, 0x02, 0x22, 0xff, 0xf7, 0xa0, 0xff, + 0x6e, 0x61, 0x68, 0x78, 0x05, 0x21, 0x08, 0x40, + 0x08, 0xd0, 0x07, 0x48, 0x00, 0x78, 0x0e, 0x28, + 0x03, 0xd3, 0x60, 0x34, 0xe0, 0x79, 0xfb, 0xf7, + 0xcf, 0xff, 0x70, 0xbd, 0x3c, 0x00, 0x18, 0xab, + 0x00, 0x00, 0x03, 0x48, 0x06, 0x60, 0x70, 0xbd, + 0x00, 0x00, 0x1c, 0x75, 0x01, 0x00, 0x10, 0x67, + 0x01, 0x00, 0xd4, 0x7e, 0x01, 0x00, 0x80, 0x02, + 0x70, 0x47, 0x14, 0x23, 0x30, 0xb5, 0x09, 0x4d, + 0x4b, 0x43, 0x5b, 0x19, 0x5b, 0x68, 0x08, 0x24, + 0x00, 0x2b, 0x00, 0xd1, 0x02, 0x24, 0x38, 0x23, + 0x5a, 0x43, 0x05, 0x4b, 0x89, 0x00, 0xd2, 0x18, + 0x51, 0x5a, 0x02, 0x68, 0x09, 0x19, 0x3c, 0x00, + 0x54, 0xab, 0x00, 0x00, 0x51, 0x1a, 0x01, 0x60, + 0x30, 0xbd, 0x00, 0x00, 0x74, 0x40, 0x01, 0x00, + 0x8c, 0x41, 0x01, 0x00, 0xf8, 0xb5, 0x07, 0x1c, + 0x2c, 0x48, 0x14, 0x1c, 0x2c, 0x4a, 0x48, 0x43, + 0x86, 0x46, 0x80, 0x18, 0x80, 0x0d, 0x84, 0x46, + 0x2b, 0x48, 0x2a, 0x4a, 0x06, 0x26, 0x1d, 0x1c, + 0x48, 0x43, 0x4a, 0x43, 0x0e, 0x2f, 0x40, 0xd2, + 0x01, 0xa3, 0xdb, 0x5d, 0x5b, 0x00, 0x9f, 0x44, + 0x3c, 0x00, 0x90, 0xab, 0x00, 0x00, 0x06, 0x08, + 0x0a, 0x0f, 0x14, 0x18, 0x1d, 0x20, 0x27, 0x24, + 0x27, 0x2b, 0x2f, 0x31, 0xc8, 0x00, 0x1f, 0xe0, + 0x88, 0x00, 0x1d, 0xe0, 0x21, 0x49, 0x70, 0x46, + 0x40, 0x18, 0x00, 0x0d, 0x18, 0xe0, 0x1f, 0x4a, + 0x80, 0x18, 0x80, 0x0d, 0x40, 0x18, 0x21, 0xe0, + 0x1e, 0x48, 0x10, 0x18, 0x00, 0x0d, 0x1d, 0xe0, + 0x1d, 0x49, 0x70, 0x46, 0x40, 0x18, 0x40, 0x0d, + 0x0a, 0xe0, 0x3c, 0x00, 0xcc, 0xab, 0x00, 0x00, + 0x1b, 0x49, 0x40, 0x18, 0x01, 0xe0, 0x1b, 0x48, + 0x10, 0x18, 0x40, 0x0d, 0x11, 0xe0, 0x1a, 0x49, + 0x40, 0x18, 0x05, 0xe0, 0x60, 0x46, 0x20, 0x80, + 0x00, 0x20, 0x16, 0xe0, 0x17, 0x48, 0x10, 0x18, + 0x80, 0x0d, 0x06, 0xe0, 0x16, 0x49, 0x02, 0xe0, + 0x16, 0x48, 0x48, 0x43, 0x16, 0x49, 0x40, 0x18, + 0xc0, 0x0d, 0x03, 0x30, 0x80, 0x08, 0x80, 0x00, + 0x20, 0x80, 0x2e, 0x80, 0x3c, 0x00, 0x08, 0xac, + 0x00, 0x00, 0xf8, 0xbd, 0xff, 0x21, 0xff, 0x20, + 0xf6, 0xf7, 0x49, 0xfb, 0x00, 0x20, 0x20, 0x80, + 0x28, 0x80, 0xf6, 0xe7, 0x00, 0x00, 0xd1, 0x45, + 0x17, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xe3, 0x38, + 0x0e, 0x00, 0x55, 0x55, 0x15, 0x00, 0xff, 0xff, + 0x0f, 0x00, 0xa9, 0xaa, 0x2a, 0x01, 0x70, 0x1c, + 0x37, 0x00, 0xff, 0xff, 0x1f, 0x00, 0xcb, 0xcc, + 0x4c, 0x00, 0x70, 0x1c, 0x47, 0x00, 0x3c, 0x00, + 0x44, 0xac, 0x00, 0x00, 0xa9, 0xaa, 0x7a, 0x00, + 0x70, 0x1c, 0x67, 0x00, 0xa9, 0xaa, 0xba, 0x00, + 0x84, 0xf6, 0x12, 0x00, 0xec, 0x25, 0xb4, 0x00, + 0x04, 0x49, 0x00, 0x28, 0x01, 0xd0, 0x09, 0x22, + 0x00, 0xe0, 0x14, 0x22, 0x4a, 0x80, 0x48, 0x60, + 0x70, 0x47, 0x00, 0x00, 0xa4, 0x69, 0x01, 0x00, + 0x80, 0xb5, 0x06, 0x22, 0xf5, 0xf7, 0x40, 0xfc, + 0x80, 0xbd, 0x00, 0x00, 0xbc, 0xb5, 0x15, 0x1c, + 0x3c, 0x00, 0x80, 0xac, 0x00, 0x00, 0x04, 0x1c, + 0x04, 0x31, 0x09, 0x04, 0x09, 0x0c, 0x01, 0xaa, + 0x6b, 0x46, 0xff, 0xf7, 0x6a, 0xff, 0x38, 0x20, + 0x06, 0x49, 0x68, 0x43, 0x40, 0x18, 0xa1, 0x00, + 0x40, 0x5a, 0x00, 0xab, 0x99, 0x88, 0x40, 0x18, + 0x19, 0x88, 0x40, 0x18, 0x00, 0x04, 0x00, 0x0c, + 0xbc, 0xbd, 0x8c, 0x41, 0x01, 0x00, 0xbc, 0xb5, + 0x04, 0x1c, 0x15, 0x1c, 0x01, 0xaa, 0x6b, 0x46, + 0xff, 0xf7, 0x3c, 0x00, 0xbc, 0xac, 0x00, 0x00, + 0x53, 0xff, 0x38, 0x20, 0x05, 0x49, 0x68, 0x43, + 0x40, 0x18, 0xa1, 0x00, 0x40, 0x5a, 0x00, 0xab, + 0x99, 0x88, 0x40, 0x18, 0x00, 0x04, 0x00, 0x0c, + 0xbc, 0xbd, 0x00, 0x00, 0x8c, 0x41, 0x01, 0x00, + 0x80, 0xb5, 0x00, 0x28, 0x0f, 0xd0, 0x00, 0x29, + 0x0d, 0xd0, 0x02, 0x78, 0x0b, 0x78, 0x9a, 0x42, + 0x09, 0xd1, 0xff, 0x2a, 0x05, 0xd0, 0x42, 0x78, + 0x02, 0x32, 0xf5, 0xf7, 0x3c, 0x00, 0xf8, 0xac, + 0x00, 0x00, 0x81, 0xfb, 0x00, 0x28, 0x01, 0xd1, + 0x01, 0x20, 0x80, 0xbd, 0x00, 0x20, 0x80, 0xbd, + 0x00, 0x00, 0x80, 0xb5, 0x06, 0x22, 0x04, 0x49, + 0xf5, 0xf7, 0x75, 0xfb, 0x00, 0x28, 0x01, 0xd1, + 0x01, 0x20, 0x80, 0xbd, 0x00, 0x20, 0x80, 0xbd, + 0x00, 0x00, 0x5e, 0x40, 0x01, 0x00, 0x01, 0x1c, + 0x49, 0x78, 0x01, 0x20, 0x00, 0x29, 0x00, 0xd0, + 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, + 0x34, 0xad, 0x00, 0x00, 0x80, 0xb5, 0x06, 0x22, + 0xf5, 0xf7, 0x60, 0xfb, 0x00, 0x28, 0x01, 0xd1, + 0x01, 0x20, 0x80, 0xbd, 0x00, 0x20, 0x80, 0xbd, + 0x80, 0xb5, 0xff, 0xf7, 0xc7, 0xff, 0x80, 0xbd, + 0x80, 0xb5, 0x06, 0x22, 0x04, 0x49, 0xf5, 0xf7, + 0x51, 0xfb, 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, + 0x80, 0xbd, 0x00, 0x20, 0x80, 0xbd, 0x00, 0x00, + 0x12, 0x61, 0x01, 0x00, 0x01, 0x1c, 0x80, 0x20, + 0x3c, 0x00, 0x70, 0xad, 0x00, 0x00, 0x81, 0x43, + 0x8a, 0x08, 0x0e, 0x20, 0x1c, 0x2a, 0x10, 0xb5, + 0x06, 0xd2, 0x03, 0x4c, 0x52, 0x00, 0xa3, 0x5c, + 0x8b, 0x42, 0x01, 0xd1, 0x10, 0x19, 0x40, 0x78, + 0x10, 0xbd, 0xfc, 0x41, 0x01, 0x00, 0x14, 0x23, + 0x02, 0x49, 0x58, 0x43, 0x40, 0x18, 0x40, 0x68, + 0x70, 0x47, 0x74, 0x40, 0x01, 0x00, 0x20, 0x22, + 0x01, 0x1c, 0x80, 0xb5, 0x02, 0x48, 0xf5, 0xf7, + 0x52, 0xfd, 0x3c, 0x00, 0xac, 0xad, 0x00, 0x00, + 0x80, 0xbd, 0x00, 0x00, 0x48, 0x61, 0x01, 0x00, + 0x08, 0x06, 0x00, 0x0e, 0x02, 0x28, 0x01, 0xd1, + 0x00, 0x20, 0x70, 0x47, 0x01, 0x20, 0x70, 0x47, + 0x00, 0x29, 0x0c, 0xd0, 0x07, 0x49, 0x09, 0x68, + 0x00, 0x29, 0x08, 0xd0, 0x14, 0x23, 0x06, 0x49, + 0x58, 0x43, 0x40, 0x18, 0xc0, 0x68, 0x00, 0x28, + 0x01, 0xd0, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, + 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0xad, + 0x00, 0x00, 0xac, 0x69, 0x01, 0x00, 0x74, 0x40, + 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x06, 0x22, + 0x01, 0x1c, 0x04, 0x48, 0xf5, 0xf7, 0x7d, 0xfb, + 0x06, 0x22, 0x21, 0x1c, 0x03, 0x48, 0xf5, 0xf7, + 0x78, 0xfb, 0x10, 0xbd, 0x00, 0x00, 0x12, 0x61, + 0x01, 0x00, 0x40, 0x80, 0x07, 0x00, 0x00, 0x29, + 0x01, 0xd1, 0x00, 0x20, 0x70, 0x47, 0x38, 0x23, + 0x5a, 0x43, 0x07, 0x4b, 0xd2, 0x18, 0x3c, 0x00, + 0x24, 0xae, 0x00, 0x00, 0x83, 0x00, 0xd2, 0x5a, + 0x14, 0x23, 0x58, 0x43, 0x05, 0x4b, 0xc0, 0x18, + 0x40, 0x88, 0x10, 0x18, 0x08, 0x1a, 0x0a, 0x38, + 0x00, 0x04, 0x00, 0x0c, 0x70, 0x47, 0x00, 0x00, + 0x8c, 0x41, 0x01, 0x00, 0x74, 0x40, 0x01, 0x00, + 0xf8, 0xb5, 0x07, 0x1c, 0x08, 0x1c, 0x16, 0x1c, + 0x1c, 0x1c, 0x19, 0x1c, 0x00, 0xf0, 0x5a, 0xf8, + 0x05, 0x1c, 0x14, 0x35, 0x22, 0x1c, 0x31, 0x1c, + 0x3c, 0x00, 0x60, 0xae, 0x00, 0x00, 0x38, 0x1c, + 0xff, 0xf7, 0x0b, 0xff, 0x28, 0x18, 0x00, 0x04, + 0x00, 0x0c, 0xf8, 0xbd, 0x00, 0x00, 0x00, 0xb5, + 0x00, 0xf0, 0x4b, 0xf8, 0x0a, 0x30, 0x00, 0x04, + 0x00, 0x0c, 0x00, 0xbd, 0x00, 0x00, 0xf8, 0xb5, + 0x07, 0x1c, 0x08, 0x1c, 0x16, 0x1c, 0x1c, 0x1c, + 0x19, 0x1c, 0x00, 0xf0, 0x3e, 0xf8, 0x45, 0x00, + 0x1e, 0x35, 0x22, 0x1c, 0x31, 0x1c, 0x38, 0x1c, + 0xff, 0xf7, 0x3c, 0x00, 0x9c, 0xae, 0x00, 0x00, + 0xef, 0xfe, 0x28, 0x18, 0x00, 0x04, 0x00, 0x0c, + 0xf8, 0xbd, 0x00, 0x00, 0xff, 0xb5, 0x0f, 0x1c, + 0x81, 0xb0, 0x0a, 0xa9, 0x14, 0x1c, 0x1e, 0x1c, + 0x03, 0xc9, 0x00, 0xf0, 0x29, 0xf8, 0x05, 0x1c, + 0x1e, 0x35, 0x21, 0x1c, 0x30, 0x1c, 0x00, 0xf0, + 0x23, 0xf8, 0x2d, 0x18, 0x22, 0x1c, 0x39, 0x1c, + 0x01, 0x98, 0xff, 0xf7, 0xd5, 0xfe, 0x28, 0x18, + 0x00, 0x04, 0x00, 0x0c, 0x3c, 0x00, 0xd8, 0xae, + 0x00, 0x00, 0x05, 0xb0, 0xf0, 0xbd, 0x0a, 0x49, + 0x80, 0xb5, 0x09, 0x88, 0x09, 0x29, 0x04, 0xd0, + 0x14, 0x29, 0x07, 0xd1, 0x01, 0x01, 0x80, 0x00, + 0x00, 0xe0, 0xc1, 0x00, 0x08, 0x18, 0x00, 0x04, + 0x00, 0x0c, 0x80, 0xbd, 0xff, 0x21, 0xff, 0x20, + 0xf6, 0xf7, 0xd1, 0xf9, 0x00, 0x20, 0x80, 0xbd, + 0x00, 0x00, 0xa6, 0x69, 0x01, 0x00, 0x38, 0x23, + 0x59, 0x43, 0x06, 0x4a, 0x14, 0x23, 0x3c, 0x00, + 0x14, 0xaf, 0x00, 0x00, 0x89, 0x18, 0x82, 0x00, + 0x89, 0x5a, 0x05, 0x4a, 0x58, 0x43, 0x80, 0x18, + 0x40, 0x88, 0x08, 0x18, 0x00, 0x04, 0x00, 0x0c, + 0x70, 0x47, 0x00, 0x00, 0x8c, 0x41, 0x01, 0x00, + 0x74, 0x40, 0x01, 0x00, 0x02, 0x48, 0x03, 0x49, + 0x00, 0x68, 0x40, 0x00, 0x08, 0x5a, 0x70, 0x47, + 0xa8, 0x69, 0x01, 0x00, 0x54, 0x40, 0x01, 0x00, + 0x0a, 0x20, 0x70, 0x47, 0x10, 0xb5, 0x04, 0x1c, + 0x3c, 0x00, 0x50, 0xaf, 0x00, 0x00, 0xfd, 0xf7, + 0x62, 0xff, 0x20, 0x1c, 0x10, 0xbd, 0xb0, 0xb5, + 0x04, 0x1c, 0xc0, 0x68, 0x05, 0x68, 0xa0, 0x1d, + 0xff, 0xf7, 0xf5, 0xfe, 0x00, 0x28, 0x18, 0xd0, + 0x21, 0x1c, 0x14, 0x31, 0x20, 0x1c, 0x08, 0xf0, + 0xe2, 0xfd, 0x00, 0x28, 0x11, 0xd0, 0x29, 0x88, + 0x09, 0x48, 0x20, 0x22, 0x81, 0x82, 0x69, 0x88, + 0x01, 0x83, 0xa9, 0x88, 0x06, 0x35, 0x41, 0x83, + 0xc5, 0x61, 0x3c, 0x00, 0x8c, 0xaf, 0x00, 0x00, + 0x30, 0x21, 0x09, 0x5d, 0x11, 0x54, 0x61, 0x6b, + 0x41, 0x62, 0x01, 0x20, 0xf7, 0xf7, 0x28, 0xf8, + 0x20, 0x1c, 0xb0, 0xbd, 0x70, 0x7c, 0x01, 0x00, + 0x70, 0xb5, 0x04, 0x1c, 0xc0, 0x68, 0x21, 0x1c, + 0x14, 0x31, 0x05, 0x68, 0x20, 0x1c, 0x08, 0xf0, + 0xc1, 0xfd, 0x00, 0x28, 0x08, 0xd0, 0x05, 0x4e, + 0xf0, 0x68, 0x02, 0xf0, 0xcf, 0xfd, 0x28, 0x88, + 0xf0, 0x82, 0x03, 0x20, 0x3c, 0x00, 0xc8, 0xaf, + 0x00, 0x00, 0xf7, 0xf7, 0x10, 0xf8, 0x20, 0x1c, + 0x70, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x3e, 0xb5, + 0x04, 0x1c, 0xc0, 0x68, 0x05, 0x68, 0xa0, 0x1d, + 0xff, 0xf7, 0xb7, 0xfe, 0x00, 0x28, 0x21, 0xd0, + 0x21, 0x1c, 0x14, 0x31, 0x20, 0x1c, 0x02, 0xaa, + 0x08, 0xf0, 0x77, 0xfd, 0x00, 0x28, 0x19, 0xd0, + 0x02, 0x98, 0x4b, 0x21, 0x09, 0x5c, 0x00, 0x29, + 0x10, 0xd0, 0x01, 0x29, 0x14, 0xd0, 0x3c, 0x00, + 0x04, 0xb0, 0x00, 0x00, 0x02, 0x29, 0x0c, 0xd1, + 0x29, 0x88, 0x0d, 0x20, 0x00, 0xab, 0x18, 0x80, + 0x20, 0x1c, 0x03, 0xf0, 0x51, 0xf8, 0x01, 0x90, + 0x68, 0x46, 0x02, 0xf0, 0x5d, 0xfa, 0xf6, 0xf7, + 0xb5, 0xf8, 0x00, 0x21, 0x02, 0x98, 0x06, 0xf0, + 0x9f, 0xfe, 0x20, 0x1c, 0x3e, 0xbd, 0x07, 0xf0, + 0x29, 0xf8, 0x02, 0x98, 0x00, 0x21, 0x80, 0x69, + 0xc2, 0x07, 0xd2, 0x0f, 0x04, 0x20, 0xf6, 0xf7, + 0x3c, 0x00, 0x40, 0xb0, 0x00, 0x00, 0x7f, 0xff, + 0xee, 0xe7, 0x10, 0xb5, 0x04, 0x1c, 0xfd, 0xf7, + 0xe6, 0xfe, 0x20, 0x1c, 0x10, 0xbd, 0x3e, 0xb5, + 0x05, 0x1c, 0x00, 0xf0, 0x40, 0xfe, 0x00, 0x28, + 0x15, 0xd1, 0x28, 0x1c, 0x14, 0x30, 0xfa, 0xf7, + 0xce, 0xfb, 0x00, 0x28, 0x0f, 0xd0, 0x05, 0x21, + 0x28, 0x69, 0xff, 0xf7, 0x86, 0xfb, 0x04, 0x1c, + 0x09, 0xd0, 0x05, 0x22, 0x21, 0x1c, 0x68, 0x46, + 0xf5, 0xf7, 0x3c, 0x00, 0x7c, 0xb0, 0x00, 0x00, + 0x3d, 0xfa, 0x05, 0x34, 0x02, 0x94, 0x68, 0x46, + 0x03, 0xf0, 0x1a, 0xfb, 0x2a, 0x1c, 0x0d, 0x21, + 0x8f, 0x20, 0x08, 0xf0, 0x8f, 0xfb, 0x00, 0x20, + 0x3e, 0xbd, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x1c, + 0xfa, 0xf7, 0x98, 0xf8, 0x20, 0x1c, 0x05, 0xf0, + 0xe5, 0xf8, 0x20, 0x1c, 0x10, 0xbd, 0x00, 0x00, + 0xb0, 0xb5, 0x04, 0x1c, 0x00, 0x69, 0x00, 0x21, + 0x94, 0xb0, 0xff, 0xf7, 0x3c, 0x00, 0xb8, 0xb0, + 0x00, 0x00, 0x61, 0xfb, 0x69, 0x46, 0xfb, 0xf7, + 0x26, 0xf8, 0x00, 0x28, 0x1e, 0xd0, 0x00, 0x98, + 0xfa, 0xf7, 0x29, 0xfa, 0x01, 0x1c, 0x01, 0xa8, + 0x02, 0xf0, 0xd7, 0xf9, 0x00, 0x98, 0xfa, 0xf7, + 0xd2, 0xf9, 0x04, 0x90, 0x05, 0x20, 0x09, 0xad, + 0x68, 0x72, 0x02, 0xa8, 0x21, 0x1c, 0x06, 0x22, + 0x02, 0x30, 0xf5, 0xf7, 0x06, 0xfa, 0x01, 0x20, + 0x08, 0x90, 0x21, 0x6a, 0x0a, 0x90, 0x3c, 0x00, + 0xf4, 0xb0, 0x00, 0x00, 0x28, 0x20, 0x09, 0x91, + 0x00, 0x5d, 0x28, 0x72, 0x01, 0xa8, 0x00, 0xf0, + 0x69, 0xf8, 0x20, 0x1c, 0x14, 0xb0, 0xb0, 0xbd, + 0xff, 0xb5, 0x16, 0x1c, 0x1f, 0x1c, 0x81, 0xb0, + 0x0a, 0x9d, 0x4c, 0x20, 0xf6, 0xf7, 0x90, 0xfb, + 0x04, 0x1c, 0x14, 0x30, 0x06, 0x22, 0x02, 0x99, + 0xf5, 0xf7, 0xea, 0xf9, 0x20, 0x1c, 0x06, 0x22, + 0x01, 0x99, 0xf5, 0xf7, 0xe5, 0xf9, 0x28, 0x20, + 0x3c, 0x00, 0x30, 0xb1, 0x00, 0x00, 0x00, 0x21, + 0x06, 0x55, 0xe1, 0x60, 0x27, 0x62, 0x00, 0x2d, + 0x01, 0xd0, 0x8e, 0x20, 0x00, 0xe0, 0x8d, 0x20, + 0x22, 0x1c, 0x0d, 0x21, 0x08, 0xf0, 0x33, 0xfb, + 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xb0, 0xb5, + 0x05, 0x1c, 0x4c, 0x20, 0xf6, 0xf7, 0x6f, 0xfb, + 0x04, 0x1c, 0x4c, 0x22, 0x29, 0x1c, 0xf5, 0xf7, + 0x26, 0xfa, 0x29, 0x20, 0x40, 0x5d, 0x0d, 0x28, + 0x2c, 0xd2, 0x3c, 0x00, 0x6c, 0xb1, 0x00, 0x00, + 0x01, 0xa3, 0x1b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, + 0x28, 0x1a, 0x28, 0x1e, 0x06, 0x0a, 0x28, 0x28, + 0x0e, 0x28, 0x22, 0x12, 0x16, 0x00, 0x22, 0x1c, + 0x0d, 0x21, 0x8c, 0x20, 0x1a, 0xe0, 0x22, 0x1c, + 0x0d, 0x21, 0x83, 0x20, 0x16, 0xe0, 0x22, 0x1c, + 0x0d, 0x21, 0x84, 0x20, 0x12, 0xe0, 0x22, 0x1c, + 0x0d, 0x21, 0x85, 0x20, 0x0e, 0xe0, 0x22, 0x1c, + 0x0d, 0x21, 0x86, 0x20, 0x3c, 0x00, 0xa8, 0xb1, + 0x00, 0x00, 0x0a, 0xe0, 0x22, 0x1c, 0x0d, 0x21, + 0x87, 0x20, 0x06, 0xe0, 0x22, 0x1c, 0x0d, 0x21, + 0x89, 0x20, 0x02, 0xe0, 0x22, 0x1c, 0x0d, 0x21, + 0x8b, 0x20, 0x08, 0xf0, 0xf6, 0xfa, 0xb0, 0xbd, + 0xe8, 0x68, 0xf6, 0xf7, 0xe6, 0xf9, 0x20, 0x1c, + 0xf6, 0xf7, 0x11, 0xfb, 0xb0, 0xbd, 0xfe, 0xb5, + 0x05, 0x1c, 0x90, 0x20, 0xf6, 0xf7, 0x2d, 0xfb, + 0x04, 0x1c, 0x90, 0x21, 0xf5, 0xf7, 0x3c, 0x00, + 0xe4, 0xb1, 0x00, 0x00, 0x5b, 0xf9, 0x37, 0x4e, + 0x01, 0x27, 0xf0, 0x69, 0x04, 0x28, 0x03, 0xd9, + 0x70, 0x6b, 0x01, 0x30, 0x70, 0x63, 0x4d, 0xe0, + 0x33, 0x48, 0xb1, 0x6b, 0x04, 0xf0, 0xd0, 0xf8, + 0x01, 0x20, 0x20, 0x62, 0xa8, 0x7e, 0x21, 0x1c, + 0x80, 0x31, 0x02, 0x91, 0x08, 0x70, 0x22, 0x1c, + 0x60, 0x32, 0x01, 0x92, 0x00, 0x20, 0x2f, 0x1c, + 0x20, 0x37, 0x90, 0x72, 0x78, 0x7a, 0x2b, 0x1c, + 0x3c, 0x00, 0x20, 0xb2, 0x00, 0x00, 0x14, 0x33, + 0xd0, 0x72, 0xe8, 0x68, 0xaa, 0x1d, 0xa0, 0x60, + 0xe8, 0x6b, 0x48, 0x60, 0x44, 0x20, 0x40, 0x5d, + 0x08, 0x72, 0x29, 0x1c, 0x20, 0x1c, 0x05, 0xf0, + 0xaa, 0xfc, 0x68, 0x6a, 0x00, 0x28, 0x0a, 0xd1, + 0x01, 0x9a, 0x20, 0x1c, 0x93, 0x7a, 0x02, 0x99, + 0x22, 0x1c, 0x70, 0x32, 0x58, 0x30, 0x09, 0x78, + 0xfa, 0xf7, 0xdb, 0xf9, 0x06, 0xe0, 0x3a, 0x7a, + 0x23, 0x1c, 0x3c, 0x00, 0x5c, 0xb2, 0x00, 0x00, + 0xe8, 0x69, 0x29, 0x6a, 0x70, 0x33, 0xfd, 0xf7, + 0x8d, 0xf9, 0x30, 0x20, 0x40, 0x5d, 0x18, 0x49, + 0x07, 0x28, 0x0b, 0xd1, 0x58, 0x20, 0x00, 0x5d, + 0xc0, 0x07, 0xc0, 0x17, 0x01, 0x30, 0xe0, 0x61, + 0x00, 0x20, 0x20, 0x61, 0x20, 0x1c, 0xf7, 0xf7, + 0x3f, 0xff, 0x18, 0xe0, 0x01, 0x22, 0x20, 0x1c, + 0x05, 0xf0, 0xac, 0xff, 0x07, 0x1c, 0x12, 0xd0, + 0x03, 0xf0, 0x06, 0xff, 0x3c, 0x00, 0x98, 0xb2, + 0x00, 0x00, 0xf3, 0x6d, 0x00, 0x2b, 0x06, 0xd0, + 0x60, 0x68, 0x20, 0x30, 0x82, 0x7b, 0x61, 0x6b, + 0x38, 0x1c, 0xf5, 0xf7, 0x99, 0xf8, 0xe8, 0x68, + 0xf6, 0xf7, 0x73, 0xf9, 0x20, 0x1c, 0xf6, 0xf7, + 0x9e, 0xfa, 0xfe, 0xbd, 0xf0, 0x69, 0x01, 0x30, + 0xf0, 0x61, 0xfa, 0xe7, 0x00, 0x00, 0xc4, 0x69, + 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x05, 0x31, + 0x00, 0x00, 0x70, 0xb5, 0x06, 0x1c, 0x3c, 0x00, + 0xd4, 0xb2, 0x00, 0x00, 0x0d, 0x1c, 0x09, 0x04, + 0x09, 0x0c, 0x00, 0x20, 0xf6, 0xf7, 0x7c, 0xf9, + 0x04, 0x1c, 0x2a, 0x1c, 0x31, 0x1c, 0x00, 0x68, + 0xf5, 0xf7, 0x06, 0xf9, 0x20, 0x1c, 0x70, 0xbd, + 0x40, 0x88, 0x70, 0x47, 0x03, 0x78, 0x1b, 0x07, + 0x9b, 0x0f, 0x0b, 0x70, 0x00, 0x78, 0x00, 0x09, + 0x10, 0x70, 0x70, 0x47, 0x04, 0x30, 0x70, 0x47, + 0x04, 0x30, 0x70, 0x47, 0xd4, 0x21, 0x01, 0x70, + 0x3c, 0x00, 0x10, 0xb3, 0x00, 0x00, 0x00, 0x21, + 0x41, 0x70, 0x70, 0x47, 0x00, 0x00, 0xc4, 0x21, + 0x01, 0x70, 0x00, 0x21, 0x41, 0x70, 0x70, 0x47, + 0x00, 0x00, 0xb4, 0x21, 0x01, 0x70, 0x00, 0x21, + 0x41, 0x70, 0x70, 0x47, 0x00, 0x00, 0x01, 0x49, + 0x48, 0x65, 0x70, 0x47, 0x00, 0x00, 0xc4, 0x69, + 0x01, 0x00, 0x01, 0x49, 0x08, 0x65, 0x70, 0x47, + 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x01, 0x49, + 0x88, 0x65, 0x3c, 0x00, 0x4c, 0xb3, 0x00, 0x00, + 0x70, 0x47, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, + 0xf8, 0xb5, 0x5f, 0x4f, 0x05, 0x1c, 0xb8, 0x68, + 0x01, 0x30, 0xb8, 0x60, 0x07, 0xf0, 0x24, 0xfd, + 0x38, 0x61, 0x90, 0x20, 0xf6, 0xf7, 0x66, 0xfa, + 0x04, 0x1c, 0x90, 0x21, 0xf5, 0xf7, 0x94, 0xf8, + 0x28, 0x6b, 0x27, 0x1c, 0x60, 0x63, 0x68, 0x8b, + 0x80, 0x37, 0x26, 0x1c, 0xc0, 0x07, 0xc0, 0x0f, + 0x20, 0x62, 0x68, 0x8b, 0x3c, 0x00, 0x88, 0xb3, + 0x00, 0x00, 0x60, 0x36, 0x02, 0x21, 0x40, 0x07, + 0xc0, 0x0f, 0x20, 0x63, 0x68, 0x8b, 0x80, 0x07, + 0xc0, 0x0f, 0xf8, 0x60, 0x28, 0x7f, 0x38, 0x70, + 0xb1, 0x72, 0x00, 0x28, 0x08, 0xd1, 0xf9, 0xf7, + 0xc8, 0xff, 0x00, 0x28, 0x02, 0xd0, 0x01, 0x20, + 0x60, 0x62, 0x01, 0xe0, 0x01, 0x20, 0xa0, 0x62, + 0xf8, 0x68, 0x00, 0x28, 0x03, 0xd0, 0x00, 0x21, + 0x02, 0x20, 0x06, 0xf0, 0xcc, 0xff, 0x3c, 0x00, + 0xc4, 0xb3, 0x00, 0x00, 0x2b, 0x1c, 0x10, 0x33, + 0xaa, 0x1d, 0x29, 0x1c, 0x20, 0x1c, 0x05, 0xf0, + 0xdf, 0xfb, 0xa8, 0x6a, 0x00, 0x28, 0x0c, 0xd1, + 0x39, 0x78, 0x02, 0x29, 0x07, 0xd0, 0x22, 0x1c, + 0x70, 0x32, 0x20, 0x1c, 0x58, 0x30, 0xb3, 0x7a, + 0xfa, 0xf7, 0x10, 0xf9, 0x08, 0xe0, 0x01, 0x26, + 0x5e, 0xe0, 0xaa, 0x7d, 0x23, 0x1c, 0x28, 0x6a, + 0x69, 0x6a, 0x70, 0x33, 0xfd, 0xf7, 0xc0, 0xf8, + 0x3c, 0x00, 0x00, 0xb4, 0x00, 0x00, 0xe9, 0x68, + 0x00, 0x20, 0x09, 0x89, 0x00, 0x29, 0x00, 0xd1, + 0x04, 0x20, 0xf0, 0x72, 0x38, 0x78, 0x01, 0x28, + 0x14, 0xd1, 0x00, 0x27, 0x00, 0x90, 0x00, 0x20, + 0x06, 0xe0, 0x29, 0x69, 0x01, 0x29, 0x03, 0xd1, + 0xa9, 0x69, 0x01, 0x27, 0x89, 0x07, 0x1a, 0xd5, + 0x06, 0xf0, 0x79, 0xfc, 0x00, 0x28, 0xf4, 0xd1, + 0x01, 0x2f, 0x14, 0xd1, 0x00, 0x98, 0x01, 0x28, + 0x11, 0xd1, 0x3c, 0x00, 0x3c, 0xb4, 0x00, 0x00, + 0x08, 0xe0, 0x20, 0x1c, 0x58, 0x30, 0x06, 0xf0, + 0xe1, 0xfc, 0x00, 0x28, 0x0a, 0xd0, 0x80, 0x69, + 0x80, 0x07, 0x07, 0xd5, 0xf0, 0x7a, 0x08, 0x21, + 0x08, 0x43, 0xf0, 0x72, 0x01, 0x20, 0xe0, 0x62, + 0xe8, 0x7d, 0x30, 0x73, 0xe8, 0x68, 0xa0, 0x60, + 0xe0, 0x6a, 0x00, 0x28, 0x12, 0xd0, 0x1a, 0x4f, + 0xf8, 0x6b, 0x00, 0x28, 0x0e, 0xd0, 0x30, 0x7b, + 0xf5, 0xf7, 0xde, 0xfe, 0x3c, 0x00, 0x78, 0xb4, + 0x00, 0x00, 0x00, 0x28, 0x09, 0xd0, 0x21, 0x1c, + 0x38, 0x1c, 0x40, 0x30, 0xfc, 0xf7, 0x55, 0xfc, + 0x14, 0x48, 0xb9, 0x6b, 0x03, 0xf0, 0x89, 0xff, + 0xf8, 0xbd, 0x10, 0x4f, 0x12, 0x48, 0xb9, 0x6b, + 0x03, 0xf0, 0x83, 0xff, 0x00, 0x22, 0x20, 0x1c, + 0x10, 0x49, 0x05, 0xf0, 0xa2, 0xfe, 0x06, 0x1c, + 0x03, 0xd1, 0x38, 0x6a, 0x01, 0x30, 0x38, 0x62, + 0xee, 0xe7, 0x20, 0x1c, 0xf6, 0xf7, 0x3c, 0x00, + 0xb4, 0xb4, 0x00, 0x00, 0x9f, 0xf9, 0xe8, 0x68, + 0xf6, 0xf7, 0x6e, 0xf8, 0x03, 0xf0, 0xf2, 0xfd, + 0x04, 0x48, 0x83, 0x6d, 0x00, 0x2b, 0xe2, 0xd0, + 0x00, 0x22, 0x30, 0x1c, 0x29, 0x6b, 0xf4, 0xf7, + 0x86, 0xff, 0xdc, 0xe7, 0xc4, 0x69, 0x01, 0x00, + 0xc4, 0x60, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, + 0x11, 0x30, 0x00, 0x00, 0x10, 0xb5, 0x0a, 0x20, + 0x07, 0xf0, 0xfe, 0xfc, 0x07, 0xf0, 0x5e, 0xfc, + 0x3c, 0x00, 0xf0, 0xb4, 0x00, 0x00, 0x0b, 0x49, + 0x44, 0x18, 0x0c, 0xe0, 0x20, 0x1c, 0x07, 0xf0, + 0x90, 0xfb, 0x00, 0x28, 0x07, 0xd0, 0xf7, 0xf7, + 0x34, 0xf9, 0x00, 0x28, 0x03, 0xd0, 0x12, 0x21, + 0x86, 0x20, 0xf5, 0xf7, 0xca, 0xfe, 0xf7, 0xf7, + 0x2c, 0xf9, 0x00, 0x28, 0xee, 0xd1, 0x01, 0xf0, + 0x80, 0xfd, 0x10, 0xbd, 0x00, 0x00, 0x40, 0x9c, + 0x00, 0x00, 0x10, 0xb5, 0x0c, 0x1c, 0x01, 0x1c, + 0x17, 0x4a, 0x3c, 0x00, 0x2c, 0xb5, 0x00, 0x00, + 0x01, 0x29, 0x50, 0x69, 0x04, 0xd0, 0x80, 0x29, + 0x1d, 0xd0, 0x81, 0x29, 0x21, 0xd1, 0x1c, 0xe0, + 0x91, 0x78, 0x01, 0x29, 0x15, 0xd1, 0x02, 0x21, + 0x91, 0x70, 0x14, 0x1c, 0x01, 0x1c, 0x10, 0x48, + 0x03, 0xf0, 0x28, 0xff, 0x01, 0x21, 0x60, 0x69, + 0x00, 0xf0, 0x2e, 0xf9, 0x60, 0x69, 0x01, 0xf0, + 0x5f, 0xfc, 0x20, 0x70, 0xa0, 0x88, 0xa1, 0x69, + 0x00, 0x23, 0x0a, 0x4a, 0x3c, 0x00, 0x68, 0xb5, + 0x00, 0x00, 0x07, 0xf0, 0x7e, 0xfc, 0x10, 0xbd, + 0x22, 0x21, 0x06, 0xe0, 0x01, 0xf0, 0x1d, 0xfc, + 0x20, 0x1c, 0x00, 0xf0, 0x4a, 0xf8, 0x10, 0xbd, + 0x1c, 0x21, 0x20, 0x20, 0xf5, 0xf7, 0x8f, 0xfe, + 0x10, 0xbd, 0xb4, 0x79, 0x01, 0x00, 0x34, 0x63, + 0x01, 0x00, 0x3d, 0x2e, 0x00, 0x00, 0x70, 0xb5, + 0x1c, 0x4c, 0xa0, 0x78, 0x00, 0x28, 0x32, 0xd0, + 0x05, 0x28, 0x30, 0xd0, 0x60, 0x69, 0x3c, 0x00, + 0xa4, 0xb5, 0x00, 0x00, 0x00, 0xf0, 0xea, 0xf8, + 0x18, 0x4e, 0xb5, 0x79, 0xa0, 0x78, 0x01, 0x28, + 0x0b, 0xd0, 0x02, 0x28, 0x0e, 0xd0, 0x03, 0x28, + 0x10, 0xd0, 0x04, 0x28, 0x17, 0xd1, 0x42, 0x1f, + 0x80, 0x21, 0x20, 0x20, 0x08, 0xf0, 0x08, 0xf8, + 0x0e, 0xe0, 0x00, 0x21, 0x20, 0x20, 0x08, 0xf0, + 0x31, 0xf8, 0x0c, 0xe0, 0xa0, 0x88, 0x07, 0xf0, + 0x1d, 0xfc, 0x05, 0xe0, 0x20, 0x78, 0x00, 0xf0, + 0x3c, 0x00, 0xe0, 0xb5, 0x00, 0x00, 0x39, 0xfa, + 0x00, 0x20, 0x00, 0xf0, 0xc4, 0xfd, 0x60, 0x69, + 0x01, 0xf0, 0xe1, 0xfb, 0x05, 0x20, 0xa0, 0x70, + 0xb5, 0x71, 0x60, 0x69, 0x00, 0xf0, 0x61, 0xf9, + 0x00, 0x22, 0x20, 0x21, 0x81, 0x20, 0x08, 0xf0, + 0xd6, 0xf8, 0x70, 0xbd, 0x00, 0x00, 0xb4, 0x79, + 0x01, 0x00, 0x20, 0x10, 0x07, 0x00, 0xb0, 0xb5, + 0x0d, 0x4d, 0x04, 0x1c, 0xa8, 0x78, 0x00, 0x28, + 0x14, 0xd0, 0x3c, 0x00, 0x1c, 0xb6, 0x00, 0x00, + 0x68, 0x69, 0x00, 0xf0, 0x0b, 0xf9, 0x0a, 0x48, + 0x69, 0x69, 0x03, 0xf0, 0xa7, 0xfe, 0xa8, 0x88, + 0x07, 0xf0, 0x9e, 0xfb, 0x00, 0x2c, 0x02, 0xd0, + 0x68, 0x78, 0x00, 0xf0, 0x79, 0xff, 0x00, 0x20, + 0xa8, 0x70, 0xa9, 0x68, 0x20, 0x1c, 0xf4, 0xf7, + 0xca, 0xfe, 0xb0, 0xbd, 0xb4, 0x79, 0x01, 0x00, + 0x34, 0x63, 0x01, 0x00, 0x06, 0x4b, 0x80, 0xb5, + 0x99, 0x78, 0x03, 0x29, 0x3c, 0x00, 0x58, 0xb6, + 0x00, 0x00, 0x06, 0xd1, 0x04, 0x21, 0x99, 0x70, + 0x20, 0x21, 0x02, 0x1c, 0x80, 0x20, 0x08, 0xf0, + 0xa4, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0xb4, 0x79, + 0x01, 0x00, 0x10, 0xb5, 0x0c, 0x4c, 0xa1, 0x78, + 0x03, 0x29, 0x0f, 0xd1, 0x10, 0x30, 0xfa, 0xf7, + 0xde, 0xf8, 0x00, 0x28, 0x09, 0xd0, 0x20, 0x78, + 0x00, 0xf0, 0xe5, 0xf9, 0x00, 0x20, 0x00, 0xf0, + 0x70, 0xfd, 0x00, 0x21, 0x05, 0x48, 0x3c, 0x00, + 0x94, 0xb6, 0x00, 0x00, 0xfc, 0xf7, 0x9c, 0xfa, + 0x10, 0xbd, 0x1b, 0x21, 0x20, 0x20, 0xf5, 0xf7, + 0x01, 0xfe, 0x10, 0xbd, 0xb4, 0x79, 0x01, 0x00, + 0x51, 0xb6, 0x00, 0x00, 0x09, 0x49, 0x80, 0xb5, + 0x89, 0x78, 0x03, 0x29, 0x09, 0xd1, 0x00, 0xf0, + 0xcd, 0xf9, 0x00, 0x20, 0x00, 0xf0, 0x58, 0xfd, + 0x01, 0x21, 0x05, 0x48, 0xfc, 0xf7, 0x84, 0xfa, + 0x80, 0xbd, 0x17, 0x21, 0x20, 0x20, 0xf5, 0xf7, + 0x3c, 0x00, 0xd0, 0xb6, 0x00, 0x00, 0xe9, 0xfd, + 0x80, 0xbd, 0xb4, 0x79, 0x01, 0x00, 0x51, 0xb6, + 0x00, 0x00, 0x70, 0xb5, 0x10, 0x4c, 0x1d, 0x1c, + 0xa3, 0x78, 0x06, 0x1c, 0x04, 0x98, 0x00, 0x2b, + 0x18, 0xd1, 0x01, 0x23, 0xa3, 0x70, 0x22, 0x61, + 0xe6, 0x60, 0x61, 0x70, 0xa0, 0x60, 0xa5, 0x61, + 0x00, 0x20, 0x07, 0xf0, 0xac, 0xfa, 0xa0, 0x80, + 0x30, 0x1c, 0xf7, 0xf7, 0x3c, 0xfb, 0xe0, 0x80, + 0x07, 0xf0, 0x3c, 0x00, 0x0c, 0xb7, 0x00, 0x00, + 0x4f, 0xfb, 0xc7, 0x21, 0xc9, 0x00, 0x28, 0x1a, + 0x41, 0x1a, 0x00, 0x22, 0x20, 0x20, 0x07, 0xf0, + 0x57, 0xff, 0x70, 0xbd, 0xb4, 0x79, 0x01, 0x00, + 0xb0, 0xb5, 0x04, 0x1c, 0x0d, 0x1c, 0x00, 0xf0, + 0x09, 0xf8, 0x20, 0x1c, 0x00, 0xf0, 0x24, 0xf8, + 0x00, 0x2d, 0x01, 0xd0, 0xff, 0xf7, 0xd4, 0xfe, + 0xb0, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x0c, 0x4c, + 0x05, 0x1c, 0xa0, 0x68, 0x3c, 0x00, 0x48, 0xb7, + 0x00, 0x00, 0x00, 0x28, 0x0f, 0xd1, 0x0a, 0x48, + 0x01, 0x7e, 0x02, 0x22, 0x11, 0x40, 0x61, 0x60, + 0x01, 0x7e, 0x11, 0x43, 0x01, 0x76, 0x07, 0x20, + 0x03, 0xf0, 0x49, 0xfc, 0x20, 0x60, 0x03, 0xf0, + 0x98, 0xff, 0x03, 0xf0, 0xee, 0xff, 0xa0, 0x68, + 0x28, 0x43, 0xa0, 0x60, 0xb0, 0xbd, 0x40, 0x7c, + 0x01, 0x00, 0x0c, 0x80, 0x07, 0x00, 0x0a, 0x49, + 0x38, 0xb5, 0x0a, 0x1c, 0x20, 0x32, 0x3c, 0x00, + 0x84, 0xb7, 0x00, 0x00, 0x94, 0x79, 0x00, 0xab, + 0x1c, 0x70, 0xd2, 0x79, 0x07, 0x4c, 0x5a, 0x70, + 0xe2, 0x68, 0x00, 0x2a, 0x02, 0xd1, 0x06, 0x4d, + 0x01, 0x23, 0x6b, 0x70, 0x10, 0x43, 0xe0, 0x60, + 0x00, 0xab, 0x18, 0x88, 0xc8, 0x84, 0x38, 0xbd, + 0x00, 0x10, 0x07, 0x00, 0x40, 0x7c, 0x01, 0x00, + 0x00, 0x50, 0x07, 0x00, 0xb0, 0xb5, 0x05, 0x1c, + 0x00, 0x29, 0x01, 0xd0, 0x00, 0xf0, 0x28, 0xf8, + 0x3c, 0x00, 0xc0, 0xb7, 0x00, 0x00, 0x06, 0x4c, + 0x60, 0x78, 0x21, 0x69, 0x08, 0x43, 0x03, 0xd1, + 0x01, 0x21, 0x0e, 0x20, 0x06, 0xf0, 0xc5, 0xfd, + 0x20, 0x69, 0x28, 0x43, 0x20, 0x61, 0xb0, 0xbd, + 0x00, 0x00, 0x18, 0x63, 0x01, 0x00, 0xb0, 0xb5, + 0x0a, 0x4c, 0x05, 0x1c, 0x22, 0x69, 0x00, 0x20, + 0x00, 0x2a, 0x0c, 0xd1, 0x00, 0x29, 0x00, 0xd0, + 0x04, 0xe0, 0x60, 0x78, 0x00, 0x28, 0x02, 0xd1, + 0x04, 0xf0, 0x3c, 0x00, 0xfc, 0xb7, 0x00, 0x00, + 0x69, 0xfb, 0x60, 0x70, 0x28, 0x1c, 0x06, 0xf0, + 0xef, 0xfc, 0x01, 0x20, 0xb0, 0xbd, 0x00, 0x00, + 0x18, 0x63, 0x01, 0x00, 0x10, 0xb5, 0x08, 0x4c, + 0x60, 0x78, 0x00, 0x28, 0x0a, 0xd0, 0x06, 0xf0, + 0xe3, 0xfc, 0x00, 0x20, 0x60, 0x70, 0x20, 0x69, + 0x00, 0x28, 0x03, 0xd0, 0x01, 0x21, 0x0e, 0x20, + 0x06, 0xf0, 0x96, 0xfd, 0x10, 0xbd, 0x00, 0x00, + 0x18, 0x63, 0x01, 0x00, 0x3c, 0x00, 0x38, 0xb8, + 0x00, 0x00, 0x09, 0x49, 0x80, 0xb5, 0x0b, 0x69, + 0x83, 0x42, 0x04, 0xd1, 0x4a, 0x78, 0x00, 0x2a, + 0x01, 0xd1, 0x01, 0x22, 0x00, 0xe0, 0x00, 0x22, + 0x83, 0x43, 0x0b, 0x61, 0x00, 0x2a, 0x03, 0xd0, + 0x00, 0x21, 0x0e, 0x20, 0x06, 0xf0, 0x7f, 0xfd, + 0x80, 0xbd, 0x18, 0x63, 0x01, 0x00, 0x80, 0xb5, + 0x01, 0x20, 0xf6, 0xf7, 0x56, 0xfe, 0x80, 0xbd, + 0x00, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x3c, 0x00, + 0x74, 0xb8, 0x00, 0x00, 0x00, 0xf0, 0x04, 0xf8, + 0x20, 0x1c, 0x00, 0xf0, 0x1f, 0xf8, 0x10, 0xbd, + 0xb0, 0xb5, 0x0c, 0x4d, 0x04, 0x1c, 0xa8, 0x68, + 0xa0, 0x42, 0x0f, 0xd1, 0x07, 0x20, 0x29, 0x68, + 0x08, 0xf0, 0x8c, 0xfb, 0x68, 0x68, 0x02, 0x22, + 0x07, 0x49, 0x00, 0x28, 0x08, 0x7e, 0x01, 0xd0, + 0x10, 0x43, 0x00, 0xe0, 0x90, 0x43, 0x08, 0x76, + 0x04, 0xf0, 0xc4, 0xf8, 0xa8, 0x68, 0xa0, 0x43, + 0x3c, 0x00, 0xb0, 0xb8, 0x00, 0x00, 0xa8, 0x60, + 0xb0, 0xbd, 0x40, 0x7c, 0x01, 0x00, 0x0c, 0x80, + 0x07, 0x00, 0x0a, 0x49, 0x38, 0xb5, 0x0a, 0x1c, + 0x20, 0x32, 0x94, 0x79, 0x00, 0xab, 0x1c, 0x70, + 0xd2, 0x79, 0x07, 0x4c, 0x5a, 0x70, 0xe2, 0x68, + 0x82, 0x42, 0x02, 0xd1, 0x06, 0x4d, 0x00, 0x23, + 0x6b, 0x70, 0x82, 0x43, 0xe2, 0x60, 0x00, 0xab, + 0x18, 0x88, 0xc8, 0x84, 0x38, 0xbd, 0x00, 0x10, + 0x07, 0x00, 0x3c, 0x00, 0xec, 0xb8, 0x00, 0x00, + 0x40, 0x7c, 0x01, 0x00, 0x00, 0x50, 0x07, 0x00, + 0xb0, 0xb5, 0x05, 0x1c, 0x0a, 0x4c, 0x00, 0x21, + 0x60, 0x69, 0xff, 0xf7, 0x11, 0xff, 0x04, 0x20, + 0x01, 0xf0, 0x46, 0xf9, 0x01, 0xf0, 0x88, 0xfb, + 0x00, 0x22, 0x04, 0x21, 0x04, 0x20, 0x01, 0xf0, + 0x8b, 0xf8, 0x28, 0x1c, 0x01, 0xf0, 0x4a, 0xfa, + 0x60, 0x69, 0xff, 0xf7, 0xa7, 0xff, 0xb0, 0xbd, + 0x40, 0x7c, 0x01, 0x00, 0x3c, 0x00, 0x28, 0xb9, + 0x00, 0x00, 0x80, 0xb5, 0x01, 0xf0, 0x77, 0xfa, + 0x80, 0xbd, 0xb0, 0xb5, 0x0d, 0x4d, 0x01, 0x21, + 0x28, 0x69, 0xff, 0xf7, 0xf4, 0xfe, 0xff, 0xf7, + 0x2a, 0xfe, 0x00, 0xf0, 0x2c, 0xfb, 0x00, 0xf0, + 0x84, 0xfa, 0x00, 0x24, 0x00, 0x22, 0x04, 0x21, + 0x20, 0x1c, 0x01, 0xf0, 0x6c, 0xf8, 0x01, 0x34, + 0x24, 0x06, 0x24, 0x0e, 0x04, 0x2c, 0xf5, 0xd3, + 0x28, 0x69, 0xff, 0xf7, 0x86, 0xff, 0x3c, 0x00, + 0x64, 0xb9, 0x00, 0x00, 0xb0, 0xbd, 0x00, 0x00, + 0x40, 0x7c, 0x01, 0x00, 0xf8, 0xb5, 0x05, 0x1c, + 0x0e, 0x1c, 0x07, 0x4c, 0x17, 0x1c, 0x01, 0x21, + 0x20, 0x69, 0xff, 0xf7, 0xd3, 0xfe, 0x3a, 0x1c, + 0x31, 0x1c, 0x28, 0x1c, 0x01, 0xf0, 0x52, 0xf8, + 0x20, 0x69, 0xff, 0xf7, 0x71, 0xff, 0xf8, 0xbd, + 0x40, 0x7c, 0x01, 0x00, 0xff, 0xb5, 0x89, 0xb0, + 0x06, 0x1c, 0x16, 0x98, 0x1d, 0x1c, 0x00, 0x28, + 0x3c, 0x00, 0xa0, 0xb9, 0x00, 0x00, 0x01, 0xd0, + 0x29, 0x48, 0x14, 0x90, 0x28, 0x68, 0x00, 0x88, + 0x00, 0x06, 0x80, 0x0e, 0x20, 0x28, 0x01, 0xd0, + 0x14, 0x28, 0x17, 0xd1, 0x0a, 0xaa, 0x18, 0x24, + 0x18, 0x21, 0x05, 0xca, 0xff, 0xf7, 0x77, 0xf9, + 0x07, 0x1c, 0x28, 0x1c, 0x01, 0x89, 0xa1, 0x42, + 0x02, 0xdd, 0x00, 0x68, 0x01, 0x19, 0x0b, 0xe0, + 0xc0, 0x68, 0x64, 0x1a, 0x00, 0x28, 0xf5, 0xd1, + 0x0f, 0x21, 0x3c, 0x00, 0xdc, 0xb9, 0x00, 0x00, + 0x86, 0x20, 0xf5, 0xf7, 0x61, 0xfc, 0x00, 0x21, + 0x01, 0xe0, 0x00, 0x21, 0x00, 0x27, 0x18, 0x48, + 0x08, 0x90, 0x80, 0x79, 0x07, 0x90, 0x0c, 0x20, + 0x16, 0x4a, 0x70, 0x43, 0x80, 0x18, 0x04, 0x79, + 0x04, 0x91, 0x12, 0x99, 0x15, 0x98, 0x14, 0x9a, + 0x01, 0x91, 0x03, 0x90, 0x05, 0x97, 0x00, 0x95, + 0x0a, 0xab, 0x02, 0x92, 0x21, 0x1c, 0x30, 0x1c, + 0x0c, 0xcb, 0xf7, 0xf7, 0x3c, 0x00, 0x18, 0xba, + 0x00, 0x00, 0x03, 0xf9, 0x01, 0x25, 0xb5, 0x40, + 0x0c, 0x4e, 0x08, 0x3e, 0x30, 0x78, 0x28, 0x40, + 0x06, 0xd0, 0x20, 0x1c, 0x00, 0xf0, 0xc9, 0xfd, + 0x30, 0x78, 0xa8, 0x43, 0x30, 0x70, 0x03, 0xe0, + 0x20, 0x1c, 0x13, 0x99, 0x00, 0xf0, 0x43, 0xff, + 0x07, 0xa9, 0x03, 0xc9, 0x88, 0x71, 0x0d, 0xb0, + 0xf0, 0xbd, 0x95, 0x24, 0x00, 0x00, 0x20, 0x10, + 0x07, 0x00, 0x74, 0x7a, 0x01, 0x00, 0x3c, 0x00, + 0x54, 0xba, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, + 0x0c, 0x23, 0x09, 0x49, 0x58, 0x43, 0x40, 0x18, + 0x00, 0x79, 0x05, 0x1c, 0x00, 0xf0, 0x92, 0xfe, + 0x28, 0x1c, 0xf7, 0xf7, 0xc7, 0xf8, 0x01, 0x20, + 0x03, 0x4a, 0xa0, 0x40, 0x08, 0x3a, 0x11, 0x78, + 0x81, 0x43, 0x11, 0x70, 0xb0, 0xbd, 0x00, 0x00, + 0x74, 0x7a, 0x01, 0x00, 0x10, 0xb5, 0x05, 0x4c, + 0x20, 0x78, 0x00, 0x28, 0x03, 0xd1, 0x1a, 0x21, + 0x3c, 0x00, 0x90, 0xba, 0x00, 0x00, 0x86, 0x20, + 0xf5, 0xf7, 0x07, 0xfc, 0x20, 0x78, 0x10, 0xbd, + 0x00, 0x00, 0x18, 0x63, 0x01, 0x00, 0x01, 0x48, + 0x40, 0x78, 0x70, 0x47, 0x00, 0x00, 0x2c, 0x63, + 0x01, 0x00, 0x80, 0xb5, 0xf6, 0xf7, 0xd1, 0xfe, + 0x00, 0xf0, 0x1b, 0xf9, 0x80, 0xbd, 0xfe, 0xb5, + 0x01, 0x68, 0x05, 0x1c, 0x0c, 0x68, 0x0e, 0x1c, + 0x21, 0x78, 0x88, 0x07, 0x71, 0xd1, 0x68, 0x69, + 0xc2, 0x07, 0x3c, 0x00, 0xcc, 0xba, 0x00, 0x00, + 0x6e, 0xd5, 0x80, 0x07, 0x6d, 0xd5, 0xe8, 0x7a, + 0xc2, 0x07, 0x08, 0x07, 0x09, 0x09, 0x02, 0x91, + 0x45, 0x49, 0x80, 0x0f, 0xd2, 0x0f, 0x00, 0x28, + 0x4f, 0x68, 0x05, 0xd0, 0x01, 0x28, 0x09, 0xd0, + 0x02, 0x28, 0x21, 0xd0, 0x03, 0x28, 0x5b, 0xd1, + 0xff, 0x23, 0x20, 0x1c, 0xa9, 0x7a, 0xf4, 0xf7, + 0x74, 0xfc, 0x55, 0xe0, 0x02, 0x98, 0x0b, 0x28, + 0x0a, 0xd0, 0x0c, 0x28, 0x3c, 0x00, 0x08, 0xbb, + 0x00, 0x00, 0x0f, 0xd0, 0x0d, 0x28, 0x4e, 0xd1, + 0x39, 0x4f, 0xf8, 0x68, 0xf4, 0xf7, 0x61, 0xfc, + 0x00, 0x20, 0xc0, 0x43, 0x5a, 0xe0, 0x35, 0x4f, + 0xa9, 0x7a, 0xbb, 0x68, 0x20, 0x1c, 0xf4, 0xf7, + 0x5b, 0xfc, 0x40, 0xe0, 0x32, 0x4f, 0x38, 0x69, + 0xf4, 0xf7, 0x53, 0xfc, 0x3b, 0xe0, 0x00, 0x21, + 0x01, 0x91, 0x02, 0x99, 0x00, 0x20, 0xff, 0x23, + 0x09, 0x07, 0x01, 0xd4, 0x01, 0x20, 0x3c, 0x00, + 0x44, 0xbb, 0x00, 0x00, 0x13, 0xe0, 0x31, 0x89, + 0x19, 0x29, 0x01, 0xd3, 0x26, 0x7e, 0x07, 0xe0, + 0x15, 0x29, 0x04, 0xd3, 0x18, 0x26, 0x71, 0x1a, + 0x49, 0x19, 0x0e, 0x7b, 0x00, 0xe0, 0x00, 0x26, + 0xb1, 0x06, 0x02, 0xd4, 0x01, 0x20, 0x73, 0x07, + 0x5b, 0x0f, 0x01, 0x21, 0x01, 0x91, 0x00, 0x28, + 0x03, 0xd0, 0xa9, 0x7a, 0x20, 0x1c, 0xf4, 0xf7, + 0x36, 0xfc, 0x01, 0x99, 0x01, 0x29, 0x15, 0xd1, + 0x3c, 0x00, 0x80, 0xbb, 0x00, 0x00, 0xf0, 0x06, + 0xc6, 0x0f, 0x20, 0x88, 0x1b, 0x4f, 0xe4, 0x8a, + 0xf9, 0x6b, 0x00, 0x05, 0xc0, 0x0f, 0x00, 0x29, + 0x1a, 0xd0, 0x4b, 0x1c, 0x18, 0xd0, 0x00, 0x2e, + 0x0a, 0xd0, 0x00, 0x28, 0x08, 0xd0, 0x38, 0x88, + 0x84, 0x42, 0x13, 0xd0, 0x02, 0x98, 0x0c, 0x28, + 0x01, 0xe0, 0x1d, 0xe0, 0x12, 0xe0, 0x0d, 0xd0, + 0x08, 0x1c, 0x01, 0xf0, 0x76, 0xf9, 0x00, 0x28, + 0x03, 0xd1, 0x3c, 0x00, 0xbc, 0xbb, 0x00, 0x00, + 0x00, 0xf0, 0xa6, 0xfa, 0xf4, 0xf7, 0x0a, 0xfc, + 0x00, 0x20, 0xc0, 0x43, 0xf8, 0x63, 0x00, 0x2e, + 0x0d, 0xd0, 0x3c, 0x80, 0x00, 0x20, 0xf8, 0x63, + 0x09, 0xe0, 0x20, 0x88, 0x00, 0x06, 0x80, 0x0e, + 0x20, 0x28, 0x04, 0xd1, 0x04, 0x4f, 0x20, 0x1c, + 0xb9, 0x6a, 0xf4, 0xf7, 0xf8, 0xfb, 0x29, 0x1c, + 0x02, 0x48, 0xfb, 0xf7, 0xef, 0xff, 0xfe, 0xbd, + 0x28, 0x7a, 0x01, 0x00, 0x3c, 0x00, 0xf8, 0xbb, + 0x00, 0x00, 0xa5, 0x9a, 0x00, 0x00, 0x03, 0x48, + 0x80, 0xb5, 0x00, 0x78, 0x00, 0x21, 0x00, 0xf0, + 0xfc, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x18, 0x63, + 0x01, 0x00, 0x04, 0x4b, 0x05, 0x49, 0x00, 0x28, + 0x1a, 0x68, 0x00, 0xd0, 0x01, 0x1c, 0x10, 0x1c, + 0x19, 0x60, 0x70, 0x47, 0x00, 0x00, 0xd4, 0x79, + 0x01, 0x00, 0x95, 0x75, 0x00, 0x00, 0x05, 0x48, + 0x80, 0xb5, 0x00, 0x7f, 0x24, 0x23, 0x3c, 0x00, + 0x34, 0xbc, 0x00, 0x00, 0x04, 0x49, 0x58, 0x43, + 0x40, 0x18, 0xc0, 0x69, 0xf4, 0xf7, 0xcc, 0xfb, + 0x80, 0xbd, 0x00, 0x00, 0xd4, 0x79, 0x01, 0x00, + 0x94, 0x46, 0x01, 0x00, 0x02, 0x1c, 0x06, 0x48, + 0x80, 0xb5, 0x81, 0x62, 0x82, 0x60, 0x00, 0x7f, + 0x24, 0x23, 0x04, 0x49, 0x58, 0x43, 0x40, 0x18, + 0x80, 0x69, 0xf4, 0xf7, 0xb9, 0xfb, 0x80, 0xbd, + 0xd4, 0x79, 0x01, 0x00, 0x94, 0x46, 0x01, 0x00, + 0x3c, 0x00, 0x70, 0xbc, 0x00, 0x00, 0x80, 0xb5, + 0x00, 0x20, 0x00, 0xf0, 0x3c, 0xfb, 0x00, 0x20, + 0x00, 0xf0, 0x6d, 0xfa, 0x00, 0xf0, 0x65, 0xfa, + 0x04, 0x49, 0xc8, 0x6a, 0x01, 0x30, 0xc8, 0x62, + 0x08, 0x1f, 0x00, 0x88, 0x07, 0xf0, 0xc1, 0xf8, + 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x06, 0x48, + 0x80, 0xb5, 0x00, 0x21, 0x01, 0x77, 0xc1, 0x6a, + 0x01, 0x31, 0xc1, 0x62, 0x04, 0x38, 0x00, 0x88, + 0x07, 0xf0, 0x3c, 0x00, 0xac, 0xbc, 0x00, 0x00, + 0xb3, 0xf8, 0x03, 0xf0, 0xd1, 0xf9, 0x80, 0xbd, + 0xd4, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x05, 0xf0, + 0xe9, 0xfa, 0x80, 0xbd, 0x80, 0xb5, 0x00, 0x28, + 0x03, 0xd1, 0x01, 0x20, 0x04, 0xf0, 0x22, 0xfa, + 0x80, 0xbd, 0x01, 0x20, 0x03, 0xf0, 0xe6, 0xfb, + 0x80, 0xbd, 0x00, 0x00, 0x03, 0x49, 0x01, 0x20, + 0x49, 0x78, 0x00, 0x29, 0x00, 0xd0, 0x00, 0x20, + 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0xbc, + 0x00, 0x00, 0x2c, 0x63, 0x01, 0x00, 0x70, 0xb5, + 0x13, 0x4d, 0x28, 0x78, 0x00, 0x28, 0x20, 0xd1, + 0x01, 0x21, 0x2e, 0x1c, 0x70, 0x68, 0xff, 0xf7, + 0x12, 0xfd, 0x00, 0x21, 0x07, 0x20, 0x06, 0xf0, + 0x2a, 0xfb, 0x0d, 0x48, 0x00, 0x24, 0x04, 0x71, + 0x04, 0xf0, 0xed, 0xf8, 0x06, 0xf0, 0xd5, 0xf9, + 0x01, 0x20, 0x28, 0x70, 0x0a, 0x48, 0x04, 0x60, + 0x44, 0x60, 0xf6, 0xf7, 0x4c, 0xfd, 0x3c, 0x00, + 0x24, 0xbd, 0x00, 0x00, 0xf7, 0xf7, 0x5e, 0xf8, + 0xff, 0xf7, 0xa2, 0xff, 0x00, 0xf0, 0xa8, 0xfd, + 0x05, 0x48, 0x71, 0x68, 0x03, 0xf0, 0x20, 0xfb, + 0x01, 0x20, 0x70, 0xbd, 0x2c, 0x63, 0x01, 0x00, + 0x50, 0x00, 0x07, 0x00, 0x80, 0x00, 0x07, 0x00, + 0xc4, 0x60, 0x01, 0x00, 0xb0, 0xb5, 0x1e, 0x4c, + 0x20, 0x78, 0x01, 0x28, 0x35, 0xd1, 0x25, 0x1c, + 0x69, 0x68, 0x1c, 0x48, 0x03, 0xf0, 0x20, 0xfb, + 0x3c, 0x00, 0x60, 0xbd, 0x00, 0x00, 0x04, 0xf0, + 0xf0, 0xf8, 0x1a, 0x48, 0x01, 0x68, 0x49, 0x08, + 0x49, 0x00, 0x01, 0x60, 0x01, 0x68, 0x01, 0x22, + 0x11, 0x43, 0x01, 0x60, 0x00, 0xf0, 0x2b, 0xfe, + 0x00, 0xf0, 0x1b, 0xfc, 0x06, 0xf0, 0x99, 0xf8, + 0xf6, 0xf7, 0x29, 0xfe, 0xf6, 0xf7, 0x2d, 0xfc, + 0x00, 0x20, 0x20, 0x70, 0xff, 0xf7, 0x83, 0xff, + 0x00, 0xf0, 0x8b, 0xfd, 0x0f, 0x48, 0x81, 0x78, + 0x08, 0x22, 0x3c, 0x00, 0x9c, 0xbd, 0x00, 0x00, + 0x91, 0x43, 0x81, 0x70, 0x81, 0x78, 0x11, 0x43, + 0x81, 0x70, 0x0c, 0x49, 0x10, 0x20, 0x08, 0x71, + 0x68, 0x68, 0xff, 0xf7, 0x5f, 0xfd, 0xf7, 0xf7, + 0x39, 0xf8, 0xf6, 0xf7, 0x4d, 0xfd, 0x01, 0x21, + 0x07, 0x20, 0x06, 0xf0, 0xcd, 0xfa, 0x01, 0x20, + 0xb0, 0xbd, 0x00, 0x00, 0x2c, 0x63, 0x01, 0x00, + 0xc4, 0x60, 0x01, 0x00, 0xf0, 0x00, 0x07, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x3c, 0x00, 0xd8, 0xbd, + 0x00, 0x00, 0x50, 0x00, 0x07, 0x00, 0x03, 0x49, + 0x01, 0x20, 0x89, 0x7a, 0x01, 0x29, 0x00, 0xd0, + 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x14, 0x7a, + 0x01, 0x00, 0xb0, 0xb5, 0x15, 0x4d, 0x04, 0x1c, + 0x28, 0x7a, 0x00, 0x28, 0x20, 0xd1, 0xf9, 0xf7, + 0x00, 0xfc, 0x02, 0x28, 0x1c, 0xd1, 0x01, 0x20, + 0x28, 0x72, 0xe8, 0x68, 0x00, 0x28, 0x10, 0xd0, + 0x20, 0x68, 0x29, 0x68, 0x08, 0x60, 0x3c, 0x00, + 0x14, 0xbe, 0x00, 0x00, 0x69, 0x68, 0x0d, 0x48, + 0x03, 0xf0, 0xc2, 0xfa, 0x01, 0x21, 0x68, 0x68, + 0xff, 0xf7, 0xc8, 0xfc, 0x00, 0x22, 0x24, 0x20, + 0x61, 0x68, 0x07, 0xf0, 0xcf, 0xfb, 0xb0, 0xbd, + 0x00, 0x20, 0x28, 0x72, 0x21, 0x68, 0x01, 0x20, + 0xf4, 0xf7, 0xcf, 0xfa, 0xb0, 0xbd, 0x00, 0x20, + 0x21, 0x68, 0xf4, 0xf7, 0xca, 0xfa, 0xb0, 0xbd, + 0x04, 0x7a, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, + 0x3c, 0x00, 0x50, 0xbe, 0x00, 0x00, 0x04, 0x48, + 0x80, 0xb5, 0x00, 0x7a, 0x01, 0x28, 0x02, 0xd1, + 0x00, 0x20, 0x02, 0xf0, 0xf0, 0xfe, 0x80, 0xbd, + 0x00, 0x00, 0x04, 0x7a, 0x01, 0x00, 0x80, 0xb5, + 0x01, 0x28, 0x07, 0xd0, 0x80, 0x28, 0x09, 0xd1, + 0x07, 0x48, 0x00, 0x7a, 0x00, 0x28, 0x04, 0xd0, + 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x02, 0xf0, + 0xde, 0xfe, 0x80, 0xbd, 0x0e, 0x21, 0x24, 0x20, + 0xf5, 0xf7, 0x3c, 0x00, 0x8c, 0xbe, 0x00, 0x00, + 0x0b, 0xfa, 0x80, 0xbd, 0x04, 0x7a, 0x01, 0x00, + 0xf8, 0xb5, 0x3a, 0x4e, 0x05, 0x1c, 0xb0, 0x7a, + 0x00, 0x28, 0x69, 0xd1, 0xf9, 0xf7, 0xae, 0xfb, + 0x02, 0x28, 0x65, 0xd1, 0x36, 0x48, 0x00, 0x68, + 0x00, 0x28, 0x61, 0xd0, 0x35, 0x48, 0x71, 0x68, + 0x03, 0xf0, 0x74, 0xfa, 0x01, 0x21, 0x70, 0x68, + 0xff, 0xf7, 0x7a, 0xfc, 0x6c, 0x20, 0xf5, 0xf7, + 0xb9, 0xfc, 0x04, 0x1c, 0x3c, 0x00, 0xc8, 0xbe, + 0x00, 0x00, 0x6c, 0x21, 0xf4, 0xf7, 0xe7, 0xfa, + 0x30, 0x68, 0x2c, 0x22, 0x04, 0x60, 0x29, 0x68, + 0x81, 0x60, 0x69, 0x68, 0xc1, 0x60, 0x00, 0x21, + 0x11, 0x54, 0x81, 0x62, 0xa9, 0x68, 0x00, 0x29, + 0x02, 0xd0, 0xe9, 0x68, 0x01, 0x61, 0x05, 0xe0, + 0x06, 0xf0, 0x5d, 0xff, 0x69, 0x68, 0x40, 0x18, + 0x31, 0x68, 0x08, 0x61, 0x70, 0x68, 0xff, 0xf7, + 0x14, 0xfd, 0x69, 0x21, 0x08, 0x55, 0x3c, 0x00, + 0x04, 0xbf, 0x00, 0x00, 0x00, 0x20, 0xf9, 0xf7, + 0x09, 0xfb, 0x01, 0x27, 0x3b, 0x1c, 0x06, 0x1c, + 0x22, 0x1c, 0x24, 0x32, 0x00, 0x21, 0xf9, 0xf7, + 0x79, 0xfb, 0x1c, 0x48, 0x03, 0x21, 0x00, 0x88, + 0x89, 0x03, 0x08, 0x43, 0x21, 0x1c, 0x40, 0x31, + 0x00, 0x91, 0x48, 0x83, 0x18, 0x48, 0x10, 0x21, + 0x60, 0x60, 0x18, 0x48, 0xa0, 0x60, 0xa7, 0x63, + 0x67, 0x63, 0x00, 0x20, 0xf5, 0xf7, 0x4c, 0xfb, + 0x3c, 0x00, 0x40, 0xbf, 0x00, 0x00, 0xe0, 0x60, + 0x02, 0x89, 0x00, 0x99, 0xca, 0x83, 0x07, 0x68, + 0x31, 0x1c, 0x38, 0x1d, 0x27, 0x61, 0xfe, 0xf7, + 0x8e, 0xfe, 0x38, 0x1c, 0x0a, 0x30, 0x0f, 0x49, + 0xfe, 0xf7, 0x89, 0xfe, 0xa4, 0x20, 0x38, 0x80, + 0x00, 0x20, 0x04, 0xf0, 0xde, 0xfb, 0x00, 0x22, + 0x1f, 0x20, 0x69, 0x68, 0x07, 0xf0, 0x2d, 0xfb, + 0xf8, 0xbd, 0xff, 0xe7, 0x00, 0x20, 0x29, 0x68, + 0xf4, 0xf7, 0x3c, 0x00, 0x7c, 0xbf, 0x00, 0x00, + 0x2e, 0xfa, 0xf8, 0xe7, 0x14, 0x7a, 0x01, 0x00, + 0x80, 0x5a, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, + 0xfa, 0x60, 0x01, 0x00, 0x99, 0xec, 0x00, 0x00, + 0x15, 0xed, 0x00, 0x00, 0x12, 0x61, 0x01, 0x00, + 0x06, 0x48, 0x80, 0xb5, 0x81, 0x7a, 0x00, 0x29, + 0x07, 0xd0, 0x00, 0x68, 0x04, 0x22, 0x20, 0x30, + 0x01, 0x7b, 0x11, 0x43, 0x01, 0x73, 0x02, 0xf0, + 0x6b, 0xfd, 0x80, 0xbd, 0x3c, 0x00, 0xb8, 0xbf, + 0x00, 0x00, 0x14, 0x7a, 0x01, 0x00, 0x10, 0xb5, + 0x04, 0x4c, 0xa0, 0x7a, 0x01, 0x28, 0x03, 0xd1, + 0x06, 0xf0, 0xf1, 0xfe, 0x21, 0x68, 0x88, 0x61, + 0x10, 0xbd, 0x14, 0x7a, 0x01, 0x00, 0x03, 0x1c, + 0x08, 0x1c, 0x1f, 0x49, 0x70, 0xb5, 0x0a, 0x68, + 0x01, 0x2b, 0x1c, 0xd0, 0x80, 0x2b, 0x05, 0xd0, + 0x83, 0x2b, 0x30, 0xd1, 0x88, 0x7a, 0x00, 0x28, + 0x14, 0xd0, 0x29, 0xe0, 0x53, 0x69, 0x3c, 0x00, + 0xf4, 0xbf, 0x00, 0x00, 0x00, 0x2b, 0x0e, 0xd0, + 0x94, 0x69, 0xd5, 0x69, 0x2e, 0x1b, 0x0c, 0x69, + 0x5d, 0x1b, 0x36, 0x1b, 0xb6, 0x10, 0xa4, 0x19, + 0x0c, 0x61, 0xcc, 0x68, 0x2d, 0x1b, 0xad, 0x10, + 0x64, 0x19, 0xcc, 0x60, 0x93, 0x61, 0x02, 0xf0, + 0x81, 0xfd, 0x70, 0xbd, 0x02, 0x28, 0x12, 0xd1, + 0x90, 0x6a, 0x0c, 0x1c, 0x00, 0x28, 0xf8, 0xd0, + 0x07, 0xf0, 0x0e, 0xfa, 0xa0, 0x7a, 0x01, 0x28, + 0x3c, 0x00, 0x30, 0xc0, 0x00, 0x00, 0xf3, 0xd1, + 0x20, 0x68, 0x81, 0x6a, 0x00, 0x29, 0xef, 0xd1, + 0x20, 0x30, 0x01, 0x7b, 0x08, 0x22, 0x11, 0x43, + 0x01, 0x73, 0x70, 0xbd, 0x02, 0xf0, 0x21, 0xfd, + 0x70, 0xbd, 0x0e, 0x21, 0x1f, 0x20, 0xf5, 0xf7, + 0x28, 0xf9, 0x70, 0xbd, 0x00, 0x00, 0x14, 0x7a, + 0x01, 0x00, 0x02, 0x49, 0x0c, 0x31, 0x03, 0xc9, + 0x40, 0x18, 0x70, 0x47, 0x00, 0x00, 0x14, 0x7a, + 0x01, 0x00, 0x3c, 0x00, 0x6c, 0xc0, 0x00, 0x00, + 0x05, 0x48, 0x80, 0xb5, 0x00, 0x68, 0x04, 0x22, + 0x20, 0x30, 0x01, 0x7b, 0x11, 0x43, 0x01, 0x73, + 0x07, 0xf0, 0xe4, 0xf9, 0x80, 0xbd, 0x00, 0x00, + 0x14, 0x7a, 0x01, 0x00, 0x70, 0xb5, 0x16, 0x4c, + 0x0e, 0x1c, 0xa1, 0x7a, 0x00, 0x29, 0x1c, 0xd0, + 0x21, 0x68, 0x08, 0x61, 0x07, 0xf0, 0x32, 0xfa, + 0x00, 0x28, 0x17, 0xd0, 0x20, 0x68, 0x00, 0x25, + 0x05, 0x62, 0x00, 0x22, 0x3c, 0x00, 0xa8, 0xc0, + 0x00, 0x00, 0x83, 0x21, 0x1f, 0x20, 0x07, 0xf0, + 0x94, 0xfa, 0x60, 0x68, 0xff, 0xf7, 0x03, 0xfc, + 0x21, 0x68, 0x04, 0x22, 0x20, 0x31, 0x08, 0x7b, + 0x2b, 0x1c, 0x90, 0x43, 0x08, 0x73, 0x31, 0x1c, + 0x00, 0x22, 0x1f, 0x20, 0x07, 0xf0, 0x61, 0xfb, + 0x70, 0xbd, 0x20, 0x68, 0x08, 0x22, 0x20, 0x30, + 0x01, 0x7b, 0x11, 0x43, 0x01, 0x73, 0x02, 0xf0, + 0xd6, 0xfc, 0x70, 0xbd, 0x00, 0x00, 0x3c, 0x00, + 0xe4, 0xc0, 0x00, 0x00, 0x14, 0x7a, 0x01, 0x00, + 0x80, 0xb5, 0x00, 0xf0, 0x77, 0xfc, 0x00, 0xf0, + 0x6f, 0xfc, 0x00, 0xf0, 0x29, 0xff, 0x00, 0xf0, + 0x5d, 0xfa, 0x00, 0xf0, 0xc5, 0xf8, 0x00, 0xf0, + 0x85, 0xff, 0x80, 0xbd, 0x80, 0xb5, 0xfa, 0xf7, + 0x85, 0xfa, 0x80, 0xbd, 0x01, 0x48, 0xc0, 0x68, + 0x70, 0x47, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, + 0x03, 0x49, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x1c, + 0x3c, 0x00, 0x20, 0xc1, 0x00, 0x00, 0x02, 0x48, + 0xc1, 0x60, 0x70, 0x47, 0x00, 0x00, 0x81, 0x75, + 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x01, 0x48, + 0x02, 0x49, 0xc8, 0x60, 0x70, 0x47, 0x81, 0x75, + 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x01, 0x49, + 0x88, 0x61, 0x70, 0x47, 0x00, 0x00, 0x28, 0x7a, + 0x01, 0x00, 0x01, 0x49, 0x00, 0x20, 0x88, 0x61, + 0x70, 0x47, 0x28, 0x7a, 0x01, 0x00, 0x03, 0x49, + 0x00, 0x28, 0x3c, 0x00, 0x5c, 0xc1, 0x00, 0x00, + 0x00, 0xd0, 0x01, 0x1c, 0x02, 0x48, 0xc1, 0x61, + 0x70, 0x47, 0x00, 0x00, 0x89, 0x75, 0x00, 0x00, + 0x28, 0x7a, 0x01, 0x00, 0x03, 0x49, 0x00, 0x28, + 0x00, 0xd0, 0x01, 0x1c, 0x02, 0x48, 0x81, 0x62, + 0x70, 0x47, 0x00, 0x00, 0x8d, 0x75, 0x00, 0x00, + 0x28, 0x7a, 0x01, 0x00, 0x03, 0x49, 0x00, 0x28, + 0x00, 0xd0, 0x01, 0x1c, 0x02, 0x48, 0x01, 0x62, + 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xc1, + 0x00, 0x00, 0x91, 0x75, 0x00, 0x00, 0x28, 0x7a, + 0x01, 0x00, 0x03, 0x49, 0x00, 0x28, 0x00, 0xd0, + 0x01, 0x1c, 0x02, 0x48, 0x01, 0x61, 0x70, 0x47, + 0x00, 0x00, 0x99, 0x75, 0x00, 0x00, 0x28, 0x7a, + 0x01, 0x00, 0x01, 0x48, 0x02, 0x49, 0x08, 0x61, + 0x70, 0x47, 0x81, 0x75, 0x00, 0x00, 0x28, 0x7a, + 0x01, 0x00, 0x02, 0x1c, 0x08, 0x1c, 0x80, 0x2a, + 0x80, 0xb5, 0x02, 0xd1, 0x00, 0xf0, 0x3c, 0x00, + 0xd4, 0xc1, 0x00, 0x00, 0x07, 0xf8, 0x80, 0xbd, + 0x1e, 0x21, 0x21, 0x20, 0xf5, 0xf7, 0x62, 0xf8, + 0x80, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x10, 0x4d, + 0x04, 0x1c, 0xa8, 0x6b, 0x01, 0x30, 0xa8, 0x63, + 0x69, 0x6b, 0x09, 0x1a, 0x28, 0x1c, 0x00, 0x6b, + 0x0c, 0x29, 0x03, 0xd9, 0x00, 0x21, 0xff, 0xf7, + 0x91, 0xfa, 0x03, 0xe0, 0x08, 0x29, 0x01, 0xd1, + 0xff, 0xf7, 0x32, 0xfb, 0x20, 0x1c, 0x00, 0xf0, + 0x3c, 0x00, 0x10, 0xc2, 0x00, 0x00, 0x4d, 0xf9, + 0x60, 0x69, 0x40, 0x07, 0x01, 0xd5, 0x03, 0xf0, + 0x0c, 0xfc, 0x20, 0x1c, 0xe9, 0x6a, 0xf4, 0xf7, + 0xdb, 0xf8, 0xb0, 0xbd, 0x00, 0x00, 0x28, 0x7a, + 0x01, 0x00, 0x03, 0x49, 0x00, 0x28, 0x00, 0xd0, + 0x01, 0x1c, 0x02, 0x48, 0x41, 0x62, 0x70, 0x47, + 0x00, 0x00, 0xb5, 0x75, 0x00, 0x00, 0x28, 0x7a, + 0x01, 0x00, 0x03, 0x49, 0x01, 0x20, 0x09, 0x6c, + 0x00, 0x29, 0x3c, 0x00, 0x4c, 0xc2, 0x00, 0x00, + 0x00, 0xd1, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, + 0x28, 0x7a, 0x01, 0x00, 0x10, 0xb5, 0x07, 0x4c, + 0xe1, 0x6b, 0x00, 0x29, 0x01, 0xd1, 0xe0, 0x63, + 0x04, 0xe0, 0x81, 0x42, 0x02, 0xd0, 0x00, 0x20, + 0xc0, 0x43, 0xf8, 0xe7, 0x06, 0xf0, 0x9c, 0xfd, + 0x20, 0x64, 0x10, 0xbd, 0x28, 0x7a, 0x01, 0x00, + 0x01, 0x48, 0x00, 0x6c, 0x70, 0x47, 0x00, 0x00, + 0x28, 0x7a, 0x01, 0x00, 0x3c, 0x00, 0x88, 0xc2, + 0x00, 0x00, 0x05, 0x49, 0x80, 0xb5, 0x00, 0x20, + 0x48, 0x63, 0x88, 0x63, 0xff, 0x21, 0x09, 0x31, + 0x15, 0x22, 0x10, 0x20, 0xf6, 0xf7, 0xfb, 0xf9, + 0x80, 0xbd, 0x28, 0x7a, 0x01, 0x00, 0x03, 0x49, + 0x00, 0x28, 0x00, 0xd0, 0x01, 0x1c, 0x02, 0x48, + 0x81, 0x60, 0x70, 0x47, 0x00, 0x00, 0xc1, 0x75, + 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x03, 0x49, + 0x00, 0x28, 0x00, 0xd0, 0x01, 0x1c, 0x3c, 0x00, + 0xc4, 0xc2, 0x00, 0x00, 0x02, 0x48, 0xc1, 0x62, + 0x70, 0x47, 0x00, 0x00, 0xc5, 0x75, 0x00, 0x00, + 0x28, 0x7a, 0x01, 0x00, 0x04, 0x4b, 0x05, 0x49, + 0x00, 0x28, 0x5a, 0x68, 0x00, 0xd0, 0x01, 0x1c, + 0x10, 0x1c, 0x59, 0x60, 0x70, 0x47, 0x00, 0x00, + 0x28, 0x7a, 0x01, 0x00, 0xc9, 0x75, 0x00, 0x00, + 0x03, 0x49, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x1c, + 0x02, 0x48, 0x41, 0x61, 0x70, 0x47, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0xc3, 0x00, 0x00, 0xcd, 0x75, + 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x0f, 0x4b, + 0x10, 0xb5, 0xd9, 0x68, 0x00, 0x29, 0x19, 0xd0, + 0x0e, 0x4c, 0x00, 0x21, 0xca, 0x00, 0x12, 0x19, + 0x40, 0x3a, 0xd2, 0x6b, 0x82, 0x42, 0x02, 0xda, + 0x01, 0x31, 0x03, 0x29, 0xf6, 0xd3, 0x48, 0x1c, + 0x1a, 0x78, 0x00, 0x06, 0x00, 0x0e, 0x90, 0x42, + 0x08, 0xd0, 0x18, 0x70, 0x08, 0x06, 0x00, 0x0e, + 0x04, 0x1c, 0x3c, 0x00, 0x3c, 0xc3, 0x00, 0x00, + 0xf6, 0xf7, 0xba, 0xfa, 0x20, 0x1c, 0x03, 0xf0, + 0x1b, 0xfd, 0x10, 0xbd, 0x18, 0x63, 0x01, 0x00, + 0x3c, 0x42, 0x01, 0x00, 0x10, 0xb5, 0x14, 0x4c, + 0xe1, 0x68, 0x00, 0x29, 0x22, 0xd0, 0x21, 0x78, + 0x12, 0x4b, 0xca, 0x00, 0xd2, 0x18, 0x40, 0x3a, + 0xd3, 0x6b, 0x83, 0x42, 0x02, 0xda, 0x48, 0x1c, + 0x20, 0x70, 0x0b, 0xe0, 0x92, 0x6b, 0x82, 0x42, + 0x14, 0xdd, 0xff, 0x31, 0x3c, 0x00, 0x78, 0xc3, + 0x00, 0x00, 0x08, 0x06, 0x00, 0x0e, 0x20, 0x70, + 0x03, 0xd1, 0x19, 0x21, 0x86, 0x20, 0xf4, 0xf7, + 0x8e, 0xff, 0x20, 0x78, 0xff, 0x30, 0x00, 0x06, + 0x00, 0x0e, 0xf6, 0xf7, 0x90, 0xfa, 0x20, 0x78, + 0xff, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x03, 0xf0, + 0xee, 0xfc, 0x10, 0xbd, 0x00, 0x00, 0x18, 0x63, + 0x01, 0x00, 0x3c, 0x42, 0x01, 0x00, 0x09, 0x48, + 0x00, 0x21, 0x01, 0x81, 0x41, 0x81, 0x3c, 0x00, + 0xb4, 0xc3, 0x00, 0x00, 0x81, 0x81, 0xc1, 0x81, + 0x07, 0x4a, 0x02, 0x80, 0x01, 0x23, 0xdb, 0x02, + 0x43, 0x80, 0x82, 0x80, 0xc2, 0x80, 0x41, 0x76, + 0x31, 0x21, 0x81, 0x76, 0x01, 0x21, 0x01, 0x76, + 0x70, 0x47, 0x00, 0x00, 0x30, 0x80, 0x07, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x80, 0xb5, 0x01, 0x20, + 0xf6, 0xf7, 0xf8, 0xf8, 0x01, 0x20, 0xf6, 0xf7, + 0xdb, 0xfc, 0x01, 0x20, 0xf6, 0xf7, 0x5a, 0xfa, + 0x3c, 0x00, 0xf0, 0xc3, 0x00, 0x00, 0x01, 0x20, + 0x00, 0xf0, 0xf1, 0xfd, 0x01, 0x20, 0xf7, 0xf7, + 0xc6, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x10, 0xb5, + 0x11, 0x4c, 0x00, 0x29, 0x07, 0xd1, 0x00, 0x28, + 0x02, 0xd1, 0x01, 0x20, 0xe0, 0x60, 0x06, 0xe0, + 0x00, 0x21, 0xe1, 0x60, 0x03, 0xe0, 0x01, 0x29, + 0x07, 0xd1, 0x00, 0x28, 0x01, 0xd0, 0x20, 0x70, + 0x03, 0xe0, 0x18, 0x21, 0x86, 0x20, 0xf4, 0xf7, + 0x3c, 0xff, 0x3c, 0x00, 0x2c, 0xc4, 0x00, 0x00, + 0x20, 0x78, 0xff, 0x30, 0x00, 0x06, 0x00, 0x0e, + 0xf6, 0xf7, 0x3e, 0xfa, 0x20, 0x78, 0xff, 0x30, + 0x00, 0x06, 0x00, 0x0e, 0x03, 0xf0, 0x9c, 0xfc, + 0x10, 0xbd, 0x00, 0x00, 0x18, 0x63, 0x01, 0x00, + 0x05, 0x49, 0x80, 0xb5, 0x09, 0x68, 0x88, 0x42, + 0x05, 0xd0, 0xfe, 0xf7, 0xff, 0xfb, 0x00, 0xf0, + 0x87, 0xfa, 0xff, 0xf7, 0x2b, 0xfc, 0x80, 0xbd, + 0xa8, 0x69, 0x01, 0x00, 0x3c, 0x00, 0x68, 0xc4, + 0x00, 0x00, 0x01, 0x49, 0x48, 0x70, 0x70, 0x47, + 0x00, 0x00, 0x2c, 0x63, 0x01, 0x00, 0x01, 0x49, + 0xc8, 0x60, 0x70, 0x47, 0x00, 0x00, 0x4c, 0x7b, + 0x01, 0x00, 0x03, 0x49, 0x01, 0x20, 0x09, 0x78, + 0x00, 0x29, 0x00, 0xd0, 0x00, 0x20, 0x70, 0x47, + 0x00, 0x00, 0x2c, 0x63, 0x01, 0x00, 0x04, 0x4a, + 0x00, 0x28, 0x02, 0xd0, 0x90, 0x69, 0x01, 0x30, + 0x90, 0x61, 0xd0, 0x69, 0x40, 0x18, 0x3c, 0x00, + 0xa4, 0xc4, 0x00, 0x00, 0xd0, 0x61, 0x70, 0x47, + 0x90, 0x5c, 0x01, 0x00, 0xfe, 0xb5, 0x04, 0x1c, + 0x00, 0x68, 0x05, 0x68, 0x28, 0x1c, 0xfe, 0xf7, + 0x27, 0xff, 0x07, 0x1c, 0x60, 0x69, 0x15, 0x4e, + 0xc0, 0x07, 0xc0, 0x0f, 0x21, 0xd0, 0x01, 0xaa, + 0x02, 0xa9, 0x28, 0x1c, 0xfe, 0xf7, 0x12, 0xff, + 0x38, 0x78, 0xc0, 0x07, 0x0c, 0xd4, 0x60, 0x69, + 0x80, 0x07, 0x08, 0xd5, 0x00, 0xab, 0x18, 0x7a, + 0x3c, 0x00, 0xe0, 0xc4, 0x00, 0x00, 0x00, 0x28, + 0x01, 0xd0, 0x02, 0x28, 0x02, 0xd1, 0x70, 0x6a, + 0x01, 0x30, 0x70, 0x62, 0xfe, 0xbd, 0x00, 0xab, + 0x18, 0x7a, 0x00, 0x28, 0x01, 0xd0, 0x02, 0x28, + 0xf8, 0xd1, 0x70, 0x6a, 0x01, 0x30, 0x70, 0x62, + 0xb0, 0x6a, 0x01, 0x30, 0xb0, 0x62, 0xf1, 0xe7, + 0xf0, 0x6a, 0x01, 0x30, 0xf0, 0x62, 0xed, 0xe7, + 0x00, 0x00, 0x90, 0x5c, 0x01, 0x00, 0x02, 0x49, + 0x48, 0x69, 0x3c, 0x00, 0x1c, 0xc5, 0x00, 0x00, + 0x01, 0x30, 0x48, 0x61, 0x70, 0x47, 0x00, 0x00, + 0x90, 0x5c, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x70, 0x47, 0x00, 0x00, 0x01, 0x1c, 0x40, 0x31, + 0x10, 0xb5, 0x0a, 0x8b, 0x12, 0x07, 0x92, 0x0f, + 0x01, 0x2a, 0x33, 0xd0, 0x4a, 0x78, 0x1a, 0x49, + 0x04, 0x1c, 0x60, 0x34, 0x00, 0x2a, 0x0b, 0x6a, + 0x22, 0xd1, 0xe2, 0x79, 0x01, 0x2a, 0x02, 0xd9, + 0xcc, 0x68, 0x01, 0x34, 0x3c, 0x00, 0x58, 0xc5, + 0x00, 0x00, 0xcc, 0x60, 0x02, 0x2a, 0x02, 0xd9, + 0x0c, 0x69, 0x01, 0x34, 0x0c, 0x61, 0x0c, 0x68, + 0x01, 0x34, 0x0c, 0x60, 0x44, 0x6b, 0x00, 0x2c, + 0x03, 0xd0, 0x04, 0x69, 0x24, 0x7c, 0xe4, 0x07, + 0x02, 0xd5, 0x4c, 0x68, 0x01, 0x34, 0x4c, 0x60, + 0x80, 0x6b, 0x00, 0x28, 0x02, 0xd0, 0x08, 0x6b, + 0x01, 0x30, 0x08, 0x63, 0x00, 0x2a, 0x0c, 0xd0, + 0x98, 0x18, 0x01, 0x38, 0x08, 0xe0, 0x3c, 0x00, + 0x94, 0xc5, 0x00, 0x00, 0x01, 0x2a, 0x01, 0xd0, + 0x02, 0x2a, 0x02, 0xd1, 0x88, 0x68, 0x01, 0x30, + 0x88, 0x60, 0xe0, 0x79, 0x18, 0x18, 0x08, 0x62, + 0x10, 0xbd, 0x00, 0x00, 0x90, 0x5c, 0x01, 0x00, + 0x70, 0x47, 0x00, 0x00, 0x01, 0x49, 0x0a, 0x20, + 0x08, 0x81, 0x70, 0x47, 0xc4, 0x7a, 0x01, 0x00, + 0xf0, 0xb5, 0x32, 0x4f, 0x04, 0x1c, 0x78, 0x78, + 0x85, 0xb0, 0xc0, 0x07, 0xc0, 0x0f, 0x03, 0x90, + 0x3c, 0x00, 0xd0, 0xc5, 0x00, 0x00, 0xb8, 0x78, + 0x02, 0x90, 0x01, 0x20, 0xa0, 0x40, 0x04, 0x90, + 0x39, 0x1c, 0x88, 0x70, 0x2c, 0x48, 0x00, 0x88, + 0x06, 0xf0, 0x0b, 0xfc, 0x01, 0x90, 0xfe, 0xf7, + 0xae, 0xfc, 0x04, 0x30, 0x29, 0x4e, 0xa5, 0x00, + 0x71, 0x59, 0x09, 0x79, 0x88, 0x42, 0x06, 0xd0, + 0xfe, 0xf7, 0xa5, 0xfc, 0x71, 0x59, 0x04, 0x30, + 0x08, 0x71, 0x01, 0x20, 0x78, 0x70, 0x00, 0x20, + 0x78, 0x70, 0x3c, 0x00, 0x0c, 0xc6, 0x00, 0x00, + 0x21, 0x48, 0x01, 0x21, 0x20, 0x4e, 0x30, 0x38, + 0x01, 0x55, 0x71, 0x59, 0x03, 0x20, 0x08, 0x70, + 0x06, 0xf0, 0xc6, 0xfb, 0x06, 0x1c, 0xfe, 0xf7, + 0x91, 0xfc, 0x36, 0x18, 0x0e, 0x36, 0x09, 0xe0, + 0x30, 0x1c, 0x06, 0xf0, 0xf5, 0xfa, 0x00, 0x28, + 0x04, 0xd0, 0x23, 0x21, 0x86, 0x20, 0xf4, 0xf7, + 0x33, 0xfe, 0x03, 0xe0, 0xf6, 0xf7, 0x34, 0xfb, + 0x00, 0x28, 0xf1, 0xd0, 0x3c, 0x00, 0x48, 0xc6, + 0x00, 0x00, 0x12, 0x48, 0x13, 0x49, 0x3c, 0x38, + 0x00, 0x78, 0x08, 0x72, 0x20, 0x1c, 0xf4, 0xf7, + 0xa2, 0xfa, 0x0e, 0x4e, 0x71, 0x59, 0x08, 0x71, + 0x03, 0x98, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x21, + 0x79, 0x70, 0x09, 0x48, 0x00, 0x88, 0x01, 0x99, + 0x06, 0xf0, 0xbd, 0xfb, 0x02, 0x98, 0xb8, 0x70, + 0x09, 0x49, 0x49, 0x79, 0x04, 0x98, 0x88, 0x42, + 0x03, 0xd0, 0x24, 0x21, 0x86, 0x20, 0x3c, 0x00, + 0x84, 0xc6, 0x00, 0x00, 0xf4, 0xf7, 0x0e, 0xfe, + 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x50, 0x07, 0x00, + 0xd0, 0x79, 0x01, 0x00, 0x10, 0x7b, 0x01, 0x00, + 0x80, 0x80, 0x07, 0x00, 0x50, 0x80, 0x07, 0x00, + 0xb0, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, 0x05, 0x28, + 0x01, 0xd3, 0xf4, 0xf7, 0x29, 0xfe, 0x05, 0x2d, + 0x01, 0xd3, 0xf4, 0xf7, 0x25, 0xfe, 0x0b, 0x4a, + 0xa8, 0x00, 0x11, 0x58, 0xa0, 0x00, 0x10, 0x58, + 0x3c, 0x00, 0xc0, 0xc6, 0x00, 0x00, 0x0e, 0xc9, + 0x0e, 0xc0, 0x06, 0x21, 0x06, 0x22, 0x06, 0x48, + 0x69, 0x43, 0x2a, 0x38, 0x09, 0x18, 0x62, 0x43, + 0x10, 0x18, 0x06, 0x22, 0xf3, 0xf7, 0x0f, 0xff, + 0x02, 0x48, 0x30, 0x38, 0x41, 0x5d, 0x01, 0x55, + 0xb0, 0xbd, 0x10, 0x7b, 0x01, 0x00, 0xb0, 0xb5, + 0x04, 0x1c, 0x0e, 0x48, 0x0d, 0x1c, 0x80, 0x78, + 0x01, 0x21, 0xa1, 0x40, 0x08, 0x40, 0x03, 0xd0, + 0x01, 0x21, 0x3c, 0x00, 0xfc, 0xc6, 0x00, 0x00, + 0x86, 0x20, 0xf4, 0xf7, 0xd1, 0xfd, 0x06, 0x21, + 0x06, 0x22, 0x09, 0x48, 0x69, 0x43, 0x09, 0x18, + 0x62, 0x43, 0x10, 0x18, 0x06, 0x22, 0xf3, 0xf7, + 0xf1, 0xfe, 0x20, 0x1c, 0xf4, 0xf7, 0x40, 0xfa, + 0x03, 0x4a, 0xa1, 0x00, 0x2a, 0x32, 0x51, 0x58, + 0x08, 0x71, 0xb0, 0xbd, 0x00, 0x50, 0x07, 0x00, + 0xe6, 0x7a, 0x01, 0x00, 0x03, 0x49, 0x80, 0xb5, + 0x00, 0x20, 0x48, 0x60, 0x3c, 0x00, 0x38, 0xc7, + 0x00, 0x00, 0x07, 0xf0, 0x32, 0xf9, 0x80, 0xbd, + 0x00, 0x00, 0xd4, 0x7a, 0x01, 0x00, 0x10, 0xb5, + 0x04, 0x1c, 0x05, 0x28, 0x01, 0xd3, 0xf4, 0xf7, + 0xd8, 0xfd, 0x07, 0x49, 0x08, 0x7a, 0x07, 0x4a, + 0x10, 0x70, 0x01, 0x20, 0x08, 0x72, 0xfe, 0xf7, + 0xf4, 0xfb, 0x04, 0x4a, 0x04, 0x30, 0xa1, 0x00, + 0x3c, 0x32, 0x51, 0x58, 0x08, 0x71, 0x10, 0xbd, + 0x00, 0x00, 0x80, 0x80, 0x07, 0x00, 0x3c, 0x00, + 0x74, 0xc7, 0x00, 0x00, 0xd4, 0x7a, 0x01, 0x00, + 0x03, 0x49, 0x80, 0xb5, 0x01, 0x20, 0x48, 0x60, + 0x07, 0xf0, 0x0e, 0xf9, 0x80, 0xbd, 0x00, 0x00, + 0xd4, 0x7a, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, + 0x05, 0x28, 0x01, 0xd3, 0xf4, 0xf7, 0xb4, 0xfd, + 0x20, 0x1c, 0xf5, 0xf7, 0x8f, 0xfe, 0x00, 0x21, + 0x20, 0x1c, 0xfb, 0xf7, 0x31, 0xfd, 0x01, 0x21, + 0x00, 0x28, 0x00, 0xd0, 0x01, 0x1c, 0x09, 0x04, + 0x3c, 0x00, 0xb0, 0xc7, 0x00, 0x00, 0x09, 0x0c, + 0x20, 0x1c, 0x04, 0xf0, 0x22, 0xfa, 0x10, 0xbd, + 0x00, 0x00, 0x06, 0x49, 0x01, 0x20, 0x05, 0x4b, + 0x88, 0x60, 0x00, 0x20, 0x3c, 0x33, 0x00, 0x21, + 0x82, 0x00, 0x9a, 0x58, 0x11, 0x70, 0x01, 0x30, + 0x05, 0x28, 0xf9, 0xdb, 0x70, 0x47, 0xd4, 0x7a, + 0x01, 0x00, 0x0f, 0x49, 0x38, 0xb5, 0x00, 0x20, + 0x88, 0x60, 0x0e, 0x48, 0x01, 0x1c, 0x20, 0x31, + 0x8a, 0x79, 0x3c, 0x00, 0xec, 0xc7, 0x00, 0x00, + 0x00, 0xab, 0x1a, 0x70, 0xc9, 0x79, 0x0a, 0x4c, + 0x09, 0x4d, 0x59, 0x70, 0x0c, 0x34, 0x3c, 0x35, + 0x00, 0x21, 0x03, 0x22, 0x63, 0x5c, 0x00, 0x2b, + 0x02, 0xd0, 0x8b, 0x00, 0xeb, 0x58, 0x1a, 0x70, + 0x01, 0x31, 0x05, 0x29, 0xf6, 0xdb, 0x00, 0xab, + 0x19, 0x88, 0xc1, 0x84, 0x38, 0xbd, 0x00, 0x00, + 0xd4, 0x7a, 0x01, 0x00, 0x00, 0x10, 0x07, 0x00, + 0xff, 0xb5, 0x14, 0x4f, 0x3c, 0x00, 0x28, 0xc8, + 0x00, 0x00, 0x04, 0x1c, 0xbe, 0x79, 0x0d, 0x1c, + 0x81, 0xb0, 0x0f, 0x20, 0x00, 0xf0, 0xb9, 0xf8, + 0x2a, 0x1c, 0x10, 0x4d, 0x00, 0x90, 0x21, 0x1c, + 0x28, 0x1c, 0xf4, 0xf7, 0xde, 0xfc, 0x21, 0x1c, + 0xa8, 0x1d, 0x03, 0x9a, 0xf4, 0xf7, 0xd9, 0xfc, + 0x21, 0x1c, 0x28, 0x1c, 0x0c, 0x30, 0x04, 0x9a, + 0xf4, 0xf7, 0xd3, 0xfc, 0x21, 0x1c, 0x28, 0x1c, + 0x12, 0x30, 0x0a, 0x9a, 0xf4, 0xf7, 0x3c, 0x00, + 0x64, 0xc8, 0x00, 0x00, 0xcd, 0xfc, 0x07, 0xf0, + 0x9b, 0xf8, 0x00, 0x98, 0x00, 0xf0, 0x76, 0xf8, + 0xbe, 0x71, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, + 0x20, 0x10, 0x07, 0x00, 0xe6, 0x7a, 0x01, 0x00, + 0x10, 0xb5, 0x00, 0x20, 0xf6, 0xf7, 0x26, 0xf8, + 0x07, 0x49, 0x88, 0x78, 0x00, 0x09, 0x00, 0x01, + 0x88, 0x70, 0x00, 0x24, 0x20, 0x1c, 0xf5, 0xf7, + 0x11, 0xfe, 0x01, 0x34, 0x24, 0x06, 0x24, 0x0e, + 0x3c, 0x00, 0xa0, 0xc8, 0x00, 0x00, 0x04, 0x2c, + 0xf7, 0xd3, 0x10, 0xbd, 0x00, 0x00, 0x00, 0x50, + 0x07, 0x00, 0x80, 0xb5, 0x02, 0xf0, 0xe3, 0xfb, + 0x03, 0x48, 0x81, 0x78, 0x0f, 0x22, 0x11, 0x43, + 0x81, 0x70, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x50, + 0x07, 0x00, 0xf8, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, + 0x05, 0x28, 0x01, 0xd3, 0xf4, 0xf7, 0x17, 0xfd, + 0xa6, 0x00, 0x00, 0x2d, 0x11, 0x4f, 0x07, 0xd1, + 0xb8, 0x59, 0x3c, 0x00, 0xdc, 0xc8, 0x00, 0x00, + 0x81, 0x68, 0x00, 0x29, 0x0e, 0xd1, 0x40, 0x78, + 0x00, 0x28, 0x0b, 0xd0, 0x02, 0xe0, 0xff, 0x35, + 0x2d, 0x06, 0x2d, 0x0e, 0x29, 0x1c, 0x20, 0x1c, + 0xfb, 0xf7, 0x88, 0xfc, 0x01, 0x1c, 0x20, 0x1c, + 0x04, 0xf0, 0x7e, 0xf9, 0x06, 0x49, 0x01, 0x20, + 0x30, 0x39, 0x08, 0x55, 0x04, 0x48, 0x3c, 0x38, + 0x80, 0x68, 0x00, 0x28, 0x02, 0xd1, 0xb9, 0x59, + 0x03, 0x20, 0x08, 0x70, 0x3c, 0x00, 0x18, 0xc9, + 0x00, 0x00, 0xf8, 0xbd, 0x00, 0x00, 0x10, 0x7b, + 0x01, 0x00, 0x80, 0xb5, 0x04, 0xf0, 0xcd, 0xf9, + 0x80, 0xbd, 0x10, 0xb5, 0x04, 0x1c, 0x05, 0x28, + 0x01, 0xd3, 0xf4, 0xf7, 0xe6, 0xfc, 0x20, 0x1c, + 0xf5, 0xf7, 0xc1, 0xfd, 0x00, 0x20, 0x05, 0x4a, + 0xa1, 0x00, 0x51, 0x58, 0x88, 0x60, 0x04, 0x49, + 0x88, 0x78, 0x01, 0x22, 0xa2, 0x40, 0x10, 0x43, + 0x88, 0x70, 0x10, 0xbd, 0x00, 0x00, 0x3c, 0x00, + 0x54, 0xc9, 0x00, 0x00, 0x10, 0x7b, 0x01, 0x00, + 0x00, 0x50, 0x07, 0x00, 0x02, 0x4a, 0x91, 0x78, + 0x08, 0x43, 0x90, 0x70, 0x70, 0x47, 0x00, 0x00, + 0x00, 0x50, 0x07, 0x00, 0xf8, 0xb5, 0x0c, 0x4f, + 0xbe, 0x79, 0x0f, 0x20, 0x00, 0xf0, 0x18, 0xf8, + 0x05, 0x1c, 0x00, 0x24, 0x20, 0x1c, 0xf4, 0xf7, + 0x0d, 0xf9, 0x08, 0x4a, 0xa1, 0x00, 0x51, 0x58, + 0x08, 0x71, 0x01, 0x34, 0x24, 0x06, 0x24, 0x0e, + 0x3c, 0x00, 0x90, 0xc9, 0x00, 0x00, 0x04, 0x2c, + 0xf3, 0xd3, 0x28, 0x1c, 0xff, 0xf7, 0xe1, 0xff, + 0xbe, 0x71, 0xf8, 0xbd, 0x00, 0x00, 0x20, 0x10, + 0x07, 0x00, 0x10, 0x7b, 0x01, 0x00, 0xb0, 0xb5, + 0x08, 0x49, 0x8d, 0x78, 0x8a, 0x78, 0x05, 0x40, + 0x82, 0x43, 0x8a, 0x70, 0x06, 0xf0, 0xf9, 0xf9, + 0x04, 0x1c, 0x0a, 0x34, 0x20, 0x1c, 0x06, 0xf0, + 0x34, 0xf9, 0x00, 0x28, 0xfa, 0xd0, 0x28, 0x1c, + 0xb0, 0xbd, 0x3c, 0x00, 0xcc, 0xc9, 0x00, 0x00, + 0x00, 0x50, 0x07, 0x00, 0x01, 0x49, 0x0a, 0x20, + 0x08, 0x81, 0x70, 0x47, 0x38, 0x7b, 0x01, 0x00, + 0xf8, 0xb5, 0x10, 0x48, 0x04, 0x26, 0x04, 0x1c, + 0xe0, 0x34, 0x05, 0x1c, 0x38, 0x3d, 0x00, 0x27, + 0x20, 0x1c, 0x1c, 0x30, 0xe4, 0x60, 0xa0, 0x61, + 0x27, 0x61, 0x0b, 0x48, 0xa6, 0x82, 0xe0, 0x61, + 0x27, 0x62, 0xa7, 0x62, 0x06, 0x20, 0xa0, 0x84, + 0x20, 0x1c, 0xfe, 0xf7, 0x3c, 0x00, 0x08, 0xca, + 0x00, 0x00, 0x87, 0xfc, 0x20, 0x1c, 0x0c, 0x30, + 0xf6, 0xf7, 0xb7, 0xf9, 0x05, 0x49, 0x38, 0x3c, + 0xac, 0x42, 0x08, 0x80, 0xe7, 0xd1, 0xf8, 0xbd, + 0x00, 0x00, 0xd4, 0xe4, 0x01, 0x00, 0x12, 0x61, + 0x01, 0x00, 0x48, 0x7b, 0x01, 0x00, 0xf7, 0xb5, + 0x05, 0x1c, 0x0c, 0x23, 0x0f, 0x1c, 0x12, 0x49, + 0x58, 0x43, 0x44, 0x18, 0x20, 0x88, 0x06, 0xf0, + 0xea, 0xf9, 0xa0, 0x78, 0x01, 0x28, 0x3c, 0x00, + 0x44, 0xca, 0x00, 0x00, 0x1a, 0xd1, 0x66, 0x68, + 0x02, 0x2f, 0x05, 0xd1, 0x5c, 0x20, 0x80, 0x5b, + 0x02, 0x99, 0x00, 0x09, 0x88, 0x42, 0x11, 0xd1, + 0x28, 0x1c, 0xfe, 0xf7, 0xfb, 0xff, 0x30, 0x1c, + 0xf9, 0xf7, 0xfa, 0xfd, 0x04, 0x20, 0xa0, 0x70, + 0x39, 0x1c, 0x28, 0x1c, 0xfb, 0xf7, 0xf4, 0xf8, + 0x03, 0x4a, 0xe8, 0x00, 0x3c, 0x32, 0x11, 0x58, + 0x01, 0x31, 0x11, 0x50, 0xfe, 0xbd, 0x00, 0x00, + 0x3c, 0x00, 0x80, 0xca, 0x00, 0x00, 0x60, 0x7b, + 0x01, 0x00, 0x01, 0x20, 0x06, 0x4a, 0x00, 0x21, + 0x0c, 0x23, 0x4b, 0x43, 0x9b, 0x18, 0x9b, 0x78, + 0x00, 0x2b, 0x00, 0xd0, 0x00, 0x20, 0x01, 0x31, + 0x04, 0x29, 0xf5, 0xdb, 0x70, 0x47, 0x60, 0x7b, + 0x01, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0xff, 0xf7, + 0xea, 0xfc, 0x00, 0x28, 0x03, 0xd1, 0x20, 0x21, + 0x0c, 0x20, 0xf4, 0xf7, 0xf6, 0xfb, 0x26, 0x1c, + 0x60, 0x36, 0x3c, 0x00, 0xbc, 0xca, 0x00, 0x00, + 0x00, 0x21, 0xf1, 0x71, 0xe1, 0x64, 0x60, 0x6b, + 0x25, 0x1c, 0x40, 0x35, 0x00, 0x28, 0x31, 0xd0, + 0xff, 0xf7, 0x04, 0xf9, 0x01, 0x22, 0x12, 0x03, + 0x00, 0x28, 0x20, 0x69, 0x01, 0x88, 0x01, 0xd0, + 0x91, 0x43, 0x00, 0xe0, 0x11, 0x43, 0x01, 0x80, + 0x20, 0x69, 0x01, 0x22, 0x00, 0x88, 0xd2, 0x02, + 0x28, 0x83, 0x20, 0x1c, 0x58, 0x30, 0x01, 0x88, + 0x91, 0x43, 0x01, 0x80, 0x3c, 0x00, 0xf8, 0xca, + 0x00, 0x00, 0xa3, 0x6b, 0x52, 0x08, 0x00, 0x2b, + 0x10, 0xd0, 0x91, 0x43, 0x01, 0x80, 0x28, 0x8b, + 0x00, 0x07, 0x80, 0x0f, 0x01, 0x28, 0x15, 0xd0, + 0x2e, 0x20, 0x01, 0x5d, 0x20, 0x69, 0x04, 0x30, + 0xf8, 0xf7, 0x41, 0xfd, 0x61, 0x6a, 0xfe, 0xf7, + 0xa8, 0xf9, 0x04, 0xe0, 0x11, 0x43, 0x01, 0x80, + 0x20, 0x1c, 0xfb, 0xf7, 0xcc, 0xfb, 0x68, 0x83, + 0x04, 0xe0, 0x20, 0x69, 0x41, 0x80, 0x3c, 0x00, + 0x34, 0xcb, 0x00, 0x00, 0xa8, 0x8b, 0x21, 0x69, + 0xc8, 0x82, 0xe0, 0x68, 0xf6, 0xf7, 0x20, 0xf9, + 0x30, 0x80, 0x60, 0x6d, 0x00, 0x28, 0x04, 0xd0, + 0x00, 0x22, 0x03, 0x21, 0x70, 0x7a, 0xfe, 0xf7, + 0x0d, 0xff, 0x20, 0x1c, 0x00, 0xf0, 0xb6, 0xf9, + 0x70, 0x7a, 0x06, 0xf0, 0x45, 0xf8, 0x70, 0xbd, + 0xb0, 0xb5, 0x00, 0x24, 0x06, 0xf0, 0x22, 0xf9, + 0x09, 0x4a, 0x00, 0x21, 0x0c, 0x23, 0x4b, 0x43, + 0x3c, 0x00, 0x70, 0xcb, 0x00, 0x00, 0x9d, 0x18, + 0x6b, 0x68, 0x5b, 0x6c, 0xad, 0x78, 0xc3, 0x1a, + 0x01, 0x2d, 0x02, 0xd1, 0xa3, 0x42, 0x00, 0xdd, + 0x1c, 0x1c, 0x01, 0x31, 0x05, 0x29, 0xf0, 0xd3, + 0x20, 0x1c, 0xb0, 0xbd, 0x00, 0x00, 0x60, 0x7b, + 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x06, 0xf0, + 0xa8, 0xfe, 0x0c, 0x20, 0x08, 0x49, 0x60, 0x43, + 0x45, 0x18, 0x28, 0x88, 0x06, 0xf0, 0x35, 0xf9, + 0x68, 0x68, 0x3c, 0x00, 0xac, 0xcb, 0x00, 0x00, + 0x00, 0x28, 0x06, 0xd0, 0x20, 0x30, 0x00, 0x7b, + 0x01, 0x28, 0x02, 0xd1, 0x20, 0x1c, 0xff, 0xf7, + 0xa3, 0xfa, 0xb0, 0xbd, 0x60, 0x7b, 0x01, 0x00, + 0xff, 0xb5, 0x85, 0xb0, 0x0f, 0xae, 0x60, 0xce, + 0x38, 0x20, 0x1e, 0x49, 0x70, 0x43, 0x17, 0x1c, + 0x44, 0x18, 0xff, 0xf7, 0x7f, 0xf8, 0x01, 0x22, + 0x12, 0x03, 0x00, 0x28, 0x03, 0xd0, 0x20, 0x88, + 0x90, 0x43, 0x20, 0x80, 0x3c, 0x00, 0xe8, 0xcb, + 0x00, 0x00, 0x02, 0xe0, 0x21, 0x88, 0x11, 0x43, + 0x21, 0x80, 0x11, 0x98, 0x39, 0x1c, 0xe0, 0x62, + 0x05, 0x98, 0xf8, 0xf7, 0xd0, 0xfc, 0x01, 0x1c, + 0x2b, 0x1c, 0x38, 0x1c, 0x06, 0x9a, 0xfe, 0xf7, + 0x20, 0xf9, 0x60, 0x80, 0x06, 0x22, 0x20, 0x1d, + 0x0f, 0x49, 0xf3, 0xf7, 0x72, 0xfc, 0x23, 0x1c, + 0x08, 0x98, 0x30, 0x33, 0x18, 0x70, 0x0e, 0x98, + 0x0c, 0x49, 0x58, 0x70, 0x65, 0x63, 0x3c, 0x00, + 0x24, 0xcc, 0x00, 0x00, 0x00, 0x20, 0x02, 0x90, + 0x01, 0x22, 0x04, 0x92, 0x09, 0x48, 0x03, 0x91, + 0x5a, 0x78, 0x01, 0x88, 0x01, 0x92, 0x00, 0x91, + 0x19, 0x78, 0x24, 0x3b, 0x30, 0x1c, 0x62, 0x6b, + 0xfe, 0xf7, 0xa8, 0xfe, 0x09, 0xb0, 0xf0, 0xbd, + 0xd4, 0xe4, 0x01, 0x00, 0x12, 0x61, 0x01, 0x00, + 0x5d, 0x4e, 0x00, 0x00, 0x48, 0x7b, 0x01, 0x00, + 0xff, 0xb5, 0x87, 0xb0, 0x10, 0x98, 0x12, 0xaf, + 0x3c, 0x00, 0x60, 0xcc, 0x00, 0x00, 0x8c, 0x46, + 0xa2, 0xcf, 0x4c, 0x23, 0x30, 0x4c, 0x6b, 0x43, + 0x1c, 0x19, 0x16, 0x1c, 0x15, 0x9a, 0x27, 0x85, + 0x27, 0x1c, 0x30, 0x37, 0x06, 0x97, 0x05, 0x97, + 0x00, 0x23, 0x3b, 0x73, 0x05, 0x9f, 0x78, 0x73, + 0x11, 0x98, 0x27, 0x1c, 0x60, 0x64, 0x61, 0x60, + 0x22, 0x60, 0x40, 0x37, 0x3e, 0x70, 0x61, 0x46, + 0x61, 0x87, 0x07, 0x98, 0x31, 0x1c, 0xf8, 0xf7, + 0x80, 0xfc, 0x3c, 0x00, 0x9c, 0xcc, 0x00, 0x00, + 0x05, 0x99, 0xc8, 0x73, 0x0a, 0x98, 0x78, 0x70, + 0x30, 0x1c, 0xfe, 0xf7, 0x73, 0xf8, 0x00, 0x28, + 0x01, 0xd0, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, + 0x41, 0x00, 0x02, 0x20, 0x01, 0x40, 0x11, 0x9a, + 0x01, 0x20, 0x00, 0x2a, 0x00, 0xd1, 0x00, 0x20, + 0x08, 0x43, 0x38, 0x72, 0x20, 0x1c, 0x2e, 0x30, + 0x07, 0x99, 0xfd, 0xf7, 0xcf, 0xff, 0x28, 0x1c, + 0x04, 0xf0, 0xae, 0xf8, 0x3c, 0x00, 0xd8, 0xcc, + 0x00, 0x00, 0xfe, 0xf7, 0xfe, 0xff, 0x4c, 0x22, + 0x12, 0x4b, 0x6a, 0x43, 0xd2, 0x18, 0x01, 0x21, + 0x09, 0x03, 0x2a, 0x32, 0x00, 0x28, 0x04, 0xd0, + 0x10, 0x1c, 0x12, 0x88, 0x8a, 0x43, 0x02, 0x80, + 0x02, 0xe0, 0x10, 0x88, 0x08, 0x43, 0x10, 0x80, + 0x0b, 0x49, 0x00, 0x20, 0x03, 0x91, 0x06, 0x99, + 0x02, 0x90, 0x00, 0x22, 0x04, 0x92, 0x08, 0x48, + 0x0a, 0x7b, 0x41, 0x88, 0x23, 0x1c, 0x3c, 0x00, + 0x14, 0xcd, 0x00, 0x00, 0x01, 0x92, 0x00, 0x91, + 0x79, 0x78, 0x08, 0x33, 0x28, 0x1c, 0x62, 0x68, + 0xfe, 0xf7, 0x38, 0xfe, 0x0b, 0xb0, 0xf0, 0xbd, + 0x58, 0xe3, 0x01, 0x00, 0x75, 0x4f, 0x00, 0x00, + 0x3c, 0x7c, 0x01, 0x00, 0xb0, 0xb5, 0x0c, 0x1c, + 0x01, 0x28, 0x27, 0xd0, 0x80, 0x28, 0x30, 0xd1, + 0xe0, 0x6c, 0x00, 0x28, 0x08, 0xd0, 0x69, 0x20, + 0x00, 0x5d, 0x18, 0x49, 0xc0, 0x00, 0x40, 0x18, + 0x3c, 0x00, 0x50, 0xcd, 0x00, 0x00, 0x04, 0x30, + 0x01, 0x68, 0x01, 0x31, 0x01, 0x60, 0x20, 0x1c, + 0xff, 0xf7, 0xe9, 0xfb, 0x13, 0x4d, 0x50, 0x3d, + 0xe8, 0x68, 0x00, 0x28, 0x05, 0xd0, 0x2e, 0x20, + 0x00, 0x5d, 0xfe, 0xf7, 0x10, 0xf8, 0x02, 0xf0, + 0x42, 0xfe, 0x20, 0x1c, 0x61, 0x68, 0xf3, 0xf7, + 0x2f, 0xfb, 0x40, 0x34, 0x60, 0x78, 0x00, 0x28, + 0x02, 0xd1, 0x06, 0xf0, 0x12, 0xf8, 0xa8, 0x60, + 0xb0, 0xbd, 0x3c, 0x00, 0x8c, 0xcd, 0x00, 0x00, + 0x20, 0x06, 0x00, 0x0e, 0x81, 0x28, 0xfa, 0xd1, + 0x22, 0x0c, 0x20, 0x04, 0x00, 0x0e, 0x02, 0x21, + 0xfe, 0xf7, 0xe6, 0xfd, 0xb0, 0xbd, 0x0a, 0x21, + 0x0c, 0x20, 0xf4, 0xf7, 0x7d, 0xfa, 0xb0, 0xbd, + 0x9c, 0x7b, 0x01, 0x00, 0xf8, 0xb5, 0x18, 0x4e, + 0x18, 0x4f, 0x05, 0x1c, 0x34, 0x79, 0xb8, 0x79, + 0x00, 0x90, 0x20, 0x1c, 0xf5, 0xf7, 0x7c, 0xff, + 0x00, 0x28, 0x06, 0xd0, 0x3c, 0x00, 0xc8, 0xcd, + 0x00, 0x00, 0x12, 0x48, 0x38, 0x38, 0x40, 0x68, + 0x85, 0x42, 0x01, 0xd1, 0x00, 0x2d, 0x03, 0xd1, + 0x10, 0x21, 0x86, 0x20, 0xf4, 0xf7, 0x63, 0xfa, + 0x0d, 0x49, 0x00, 0x20, 0x38, 0x39, 0x48, 0x60, + 0x04, 0x21, 0x20, 0x1c, 0xff, 0xf7, 0x59, 0xfc, + 0x04, 0x21, 0x20, 0x1c, 0xf5, 0xf7, 0xeb, 0xfe, + 0x0c, 0x21, 0x06, 0x4a, 0x61, 0x43, 0x30, 0x3a, + 0x89, 0x18, 0x0c, 0x71, 0x04, 0x20, 0x3c, 0x00, + 0x04, 0xce, 0x00, 0x00, 0x30, 0x71, 0x00, 0x98, + 0xb8, 0x71, 0x0f, 0x20, 0xff, 0xf7, 0xa6, 0xfd, + 0xf8, 0xbd, 0x00, 0x00, 0xa4, 0x7a, 0x01, 0x00, + 0x20, 0x10, 0x07, 0x00, 0xf8, 0xb5, 0x04, 0x1c, + 0x0f, 0x20, 0xff, 0xf7, 0xc1, 0xfd, 0xf5, 0xf7, + 0x3b, 0xff, 0x01, 0x25, 0x00, 0x28, 0x00, 0xd0, + 0x00, 0x25, 0x16, 0x4e, 0xb0, 0x79, 0x16, 0x4f, + 0x00, 0x90, 0x38, 0x79, 0x04, 0x28, 0x01, 0xd1, + 0x3c, 0x00, 0x40, 0xce, 0x00, 0x00, 0x00, 0x2c, + 0x03, 0xd1, 0x11, 0x21, 0x86, 0x20, 0xf4, 0xf7, + 0x2c, 0xfa, 0x10, 0x48, 0x29, 0x06, 0x38, 0x38, + 0x44, 0x60, 0x09, 0x0e, 0x0c, 0x1c, 0x04, 0x20, + 0xff, 0xf7, 0x21, 0xfc, 0x03, 0x21, 0x20, 0x1c, + 0xff, 0xf7, 0x41, 0xfc, 0x21, 0x1c, 0x04, 0x20, + 0xf5, 0xf7, 0xaf, 0xfe, 0x0c, 0x21, 0x07, 0x4a, + 0x69, 0x43, 0x04, 0x20, 0x30, 0x3a, 0x89, 0x18, + 0x08, 0x71, 0x3c, 0x00, 0x7c, 0xce, 0x00, 0x00, + 0x3c, 0x71, 0x00, 0x98, 0xb0, 0x71, 0x20, 0x1c, + 0xff, 0xf7, 0x50, 0xfd, 0x04, 0x20, 0xf8, 0xbd, + 0x20, 0x10, 0x07, 0x00, 0xa4, 0x7a, 0x01, 0x00, + 0x0c, 0x23, 0x02, 0x49, 0x58, 0x43, 0x40, 0x18, + 0x80, 0x68, 0x70, 0x47, 0x74, 0x7a, 0x01, 0x00, + 0x60, 0x30, 0xc1, 0x79, 0x80, 0x79, 0x81, 0x42, + 0x01, 0xd9, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, + 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xce, + 0x00, 0x00, 0x01, 0x48, 0x80, 0x68, 0x70, 0x47, + 0x00, 0x00, 0x4c, 0x7b, 0x01, 0x00, 0x38, 0xb5, + 0x69, 0x21, 0x09, 0x5c, 0x18, 0x23, 0x10, 0x4a, + 0x59, 0x43, 0x89, 0x18, 0x8a, 0x68, 0x01, 0x32, + 0x8a, 0x60, 0x4b, 0x69, 0xd2, 0x1a, 0xcb, 0x68, + 0x93, 0x42, 0x00, 0xd2, 0xca, 0x60, 0x00, 0x22, + 0x0b, 0x4c, 0x02, 0x60, 0x22, 0x1c, 0x20, 0x32, + 0x95, 0x79, 0x00, 0xab, 0x1d, 0x70, 0x3c, 0x00, + 0xf4, 0xce, 0x00, 0x00, 0xd2, 0x79, 0x5a, 0x70, + 0x0a, 0x68, 0x00, 0x2a, 0x01, 0xd1, 0x48, 0x60, + 0x00, 0xe0, 0x10, 0x60, 0x00, 0xab, 0x08, 0x60, + 0x18, 0x88, 0xe0, 0x84, 0x38, 0xbd, 0x00, 0x00, + 0xc4, 0x7b, 0x01, 0x00, 0x00, 0x10, 0x07, 0x00, + 0x18, 0x23, 0x0a, 0x49, 0x58, 0x43, 0x41, 0x18, + 0x08, 0x69, 0x01, 0x30, 0x08, 0x61, 0x48, 0x68, + 0x00, 0x28, 0x09, 0xd0, 0x48, 0x69, 0x01, 0x30, + 0x3c, 0x00, 0x30, 0xcf, 0x00, 0x00, 0x48, 0x61, + 0x48, 0x68, 0x02, 0x68, 0x4a, 0x60, 0x00, 0x2a, + 0x00, 0xd1, 0x0a, 0x60, 0x70, 0x47, 0x00, 0x20, + 0x70, 0x47, 0xc4, 0x7b, 0x01, 0x00, 0xf8, 0xb5, + 0x12, 0x4e, 0x10, 0x4d, 0x0f, 0x4c, 0x0a, 0x27, + 0x21, 0x1c, 0x00, 0x20, 0xe0, 0x60, 0x2a, 0x31, + 0x22, 0x1c, 0x18, 0x32, 0xa1, 0x60, 0x62, 0x61, + 0x27, 0x82, 0x0c, 0x4a, 0xe0, 0x61, 0xa2, 0x61, + 0x60, 0x62, 0x3c, 0x00, 0x6c, 0xcf, 0x00, 0x00, + 0x06, 0x20, 0x20, 0x84, 0x08, 0x1c, 0xfe, 0xf7, + 0xd7, 0xf9, 0x20, 0x1c, 0x08, 0x30, 0xf5, 0xf7, + 0x01, 0xff, 0x4c, 0x3c, 0xac, 0x42, 0x70, 0x80, + 0xe5, 0xd1, 0xff, 0x20, 0x30, 0x70, 0xf8, 0xbd, + 0x88, 0xe4, 0x01, 0x00, 0x0c, 0xe3, 0x01, 0x00, + 0x3c, 0x7c, 0x01, 0x00, 0x12, 0x61, 0x01, 0x00, + 0xf8, 0xb5, 0x04, 0x1c, 0x0b, 0x48, 0x0e, 0x1c, + 0x17, 0x1c, 0x44, 0x70, 0x3c, 0x00, 0xa8, 0xcf, + 0x00, 0x00, 0x05, 0xf0, 0x00, 0xff, 0x05, 0x1c, + 0x39, 0x1c, 0x30, 0x1c, 0xfd, 0xf7, 0xab, 0xff, + 0x0c, 0x21, 0x05, 0x4a, 0x28, 0x18, 0x0a, 0x30, + 0x61, 0x43, 0x08, 0x32, 0x50, 0x50, 0x03, 0x48, + 0x89, 0x18, 0x00, 0x68, 0x88, 0x60, 0xf8, 0xbd, + 0x00, 0x00, 0x6c, 0x7a, 0x01, 0x00, 0x78, 0x6e, + 0x01, 0x00, 0x70, 0xb5, 0x0b, 0x4e, 0x05, 0x1c, + 0x70, 0x78, 0xff, 0x28, 0x0f, 0xd0, 0x3c, 0x00, + 0xe4, 0xcf, 0x00, 0x00, 0x0c, 0x23, 0x08, 0x4c, + 0x58, 0x43, 0x08, 0x34, 0x20, 0x58, 0x05, 0xf0, + 0x1d, 0xfe, 0x00, 0x28, 0x06, 0xd1, 0x70, 0x78, + 0x0c, 0x23, 0x58, 0x43, 0x00, 0x19, 0x81, 0x68, + 0x29, 0x43, 0x81, 0x60, 0x70, 0xbd, 0x00, 0x00, + 0x6c, 0x7a, 0x01, 0x00, 0x80, 0xb5, 0x30, 0x21, + 0x01, 0x48, 0xf3, 0xf7, 0x43, 0xfa, 0x80, 0xbd, + 0xec, 0xe5, 0x01, 0x00, 0x10, 0xb5, 0x05, 0xf0, + 0x3c, 0x00, 0x20, 0xd0, 0x00, 0x00, 0xc5, 0xfe, + 0x0a, 0x49, 0x44, 0x18, 0x0c, 0xe0, 0x20, 0x1c, + 0x05, 0xf0, 0xf7, 0xfd, 0x00, 0x28, 0x07, 0xd0, + 0xf5, 0xf7, 0x51, 0xfe, 0x00, 0x28, 0x03, 0xd0, + 0x13, 0x21, 0x86, 0x20, 0xf4, 0xf7, 0x31, 0xf9, + 0xf5, 0xf7, 0x49, 0xfe, 0x00, 0x28, 0xee, 0xd1, + 0x10, 0xbd, 0xb0, 0x36, 0x00, 0x00, 0xff, 0xb5, + 0x8b, 0xb0, 0x19, 0x9b, 0x0d, 0x1c, 0x04, 0x1c, + 0x1a, 0x20, 0x3c, 0x00, 0x5c, 0xd0, 0x00, 0x00, + 0x00, 0x2b, 0x16, 0x99, 0x00, 0xd1, 0x18, 0x20, + 0x01, 0x90, 0x14, 0x98, 0x00, 0x28, 0x27, 0xd0, + 0xff, 0x20, 0x19, 0x9b, 0x01, 0x30, 0x00, 0x2b, + 0x01, 0xd1, 0x18, 0x23, 0x00, 0xe0, 0x1a, 0x23, + 0x04, 0x33, 0x82, 0x42, 0x04, 0xd3, 0xd0, 0x1a, + 0x40, 0x08, 0x40, 0x00, 0x00, 0x04, 0x00, 0x0c, + 0x0d, 0x90, 0x6a, 0x48, 0x00, 0x88, 0xc2, 0x1a, + 0x12, 0x04, 0x12, 0x0c, 0x3c, 0x00, 0x98, 0xd0, + 0x00, 0x00, 0x04, 0x92, 0x00, 0x29, 0x08, 0xd0, + 0x89, 0x79, 0x66, 0x4a, 0x49, 0x00, 0x51, 0x5a, + 0x04, 0x9a, 0x51, 0x1a, 0x0a, 0x04, 0x12, 0x0c, + 0x04, 0x92, 0x04, 0x9a, 0x82, 0x42, 0x05, 0xd9, + 0x00, 0x20, 0x04, 0x90, 0x02, 0xe0, 0x60, 0x48, + 0x04, 0x90, 0x0d, 0x90, 0x01, 0x98, 0x01, 0x04, + 0x09, 0x0c, 0x0a, 0x91, 0x00, 0x20, 0xf4, 0xf7, + 0x84, 0xfa, 0x00, 0x90, 0x00, 0x68, 0x3c, 0x00, + 0xd4, 0xd0, 0x00, 0x00, 0x00, 0x26, 0x06, 0x90, + 0x20, 0x60, 0x00, 0x20, 0x05, 0x90, 0x0e, 0x98, + 0x00, 0x24, 0x00, 0x05, 0x00, 0x0c, 0x09, 0x90, + 0x1a, 0x98, 0x0d, 0x9f, 0x40, 0x07, 0x40, 0x0f, + 0x08, 0x90, 0x07, 0x94, 0x03, 0x95, 0x00, 0x2d, + 0x0d, 0xd0, 0x28, 0x89, 0xb8, 0x42, 0x04, 0xd8, + 0x36, 0x18, 0x3f, 0x1a, 0x07, 0xd0, 0xed, 0x68, + 0xf5, 0xe7, 0x39, 0x04, 0x09, 0x0c, 0x28, 0x1c, + 0x3c, 0x00, 0x10, 0xd1, 0x00, 0x00, 0xf4, 0xf7, + 0x38, 0xfb, 0xef, 0xe7, 0x00, 0x2e, 0x02, 0xd1, + 0x07, 0x99, 0x00, 0x29, 0x71, 0xd1, 0x27, 0x1c, + 0x6c, 0x20, 0xf4, 0xf7, 0x88, 0xfb, 0x07, 0x99, + 0x04, 0x1c, 0x00, 0x29, 0x20, 0xd1, 0x07, 0x94, + 0x00, 0x20, 0xa0, 0x61, 0x18, 0x98, 0x27, 0x1c, + 0x60, 0x60, 0x17, 0x98, 0x24, 0x37, 0xa0, 0x60, + 0x06, 0x98, 0x20, 0x61, 0x15, 0x98, 0x0f, 0xc8, + 0x0f, 0xc7, 0x3c, 0x00, 0x4c, 0xd1, 0x00, 0x00, + 0x14, 0x98, 0x5c, 0x21, 0x60, 0x63, 0x09, 0x98, + 0x08, 0x53, 0x19, 0x98, 0x69, 0x21, 0xe0, 0x63, + 0x1b, 0x98, 0x08, 0x55, 0x1c, 0x98, 0x60, 0x65, + 0x19, 0x98, 0x00, 0x28, 0x23, 0xd0, 0x08, 0x98, + 0x06, 0x99, 0x08, 0x83, 0x1f, 0xe0, 0x6c, 0x22, + 0x20, 0x1c, 0x07, 0x99, 0xf3, 0xf7, 0x1a, 0xfa, + 0x3c, 0x60, 0x01, 0x98, 0x62, 0x21, 0x30, 0x18, + 0xc8, 0x53, 0x15, 0x98, 0x3c, 0x00, 0x88, 0xd1, + 0x00, 0x00, 0x40, 0x21, 0x80, 0x7a, 0xc8, 0x55, + 0x00, 0x20, 0xb8, 0x63, 0x06, 0x98, 0x0a, 0x99, + 0xf4, 0xf7, 0x1f, 0xfa, 0xf8, 0x60, 0x02, 0x99, + 0xf4, 0xf7, 0x3b, 0xf9, 0x20, 0x1c, 0x40, 0x30, + 0x81, 0x8b, 0x05, 0x9a, 0x12, 0x07, 0x12, 0x0f, + 0x11, 0x43, 0x81, 0x83, 0x03, 0x98, 0x5e, 0x21, + 0x02, 0x90, 0x01, 0x98, 0x22, 0x4a, 0x30, 0x18, + 0x08, 0x53, 0x12, 0x68, 0x01, 0x21, 0x3c, 0x00, + 0xc4, 0xd1, 0x00, 0x00, 0x08, 0x1c, 0x00, 0x2a, + 0x00, 0xd0, 0x1b, 0x98, 0x00, 0x06, 0x04, 0x9a, + 0x00, 0x0e, 0x96, 0x42, 0x03, 0xd9, 0x2c, 0x22, + 0x11, 0x55, 0x1b, 0x49, 0x04, 0xe0, 0x15, 0x99, + 0x2c, 0x22, 0x09, 0x7a, 0x11, 0x55, 0x19, 0x49, + 0x08, 0x5c, 0x66, 0x21, 0x08, 0x55, 0x1c, 0x98, + 0x00, 0x28, 0x01, 0xd0, 0x1f, 0x20, 0x08, 0x55, + 0x00, 0x2d, 0x03, 0xd0, 0xe8, 0x68, 0x03, 0x90, + 0x3c, 0x00, 0x00, 0xd2, 0x00, 0x00, 0x00, 0x20, + 0x00, 0xe0, 0x09, 0xe0, 0xe8, 0x60, 0x05, 0x98, + 0x00, 0x26, 0x01, 0x30, 0x00, 0x04, 0x00, 0x0c, + 0x0d, 0x9f, 0x05, 0x90, 0x03, 0x9d, 0x6d, 0xe7, + 0x00, 0x98, 0xe0, 0x60, 0x02, 0x99, 0xf4, 0xf7, + 0xfa, 0xf8, 0x00, 0x20, 0x20, 0x60, 0x01, 0x21, + 0xa1, 0x63, 0x60, 0x34, 0x60, 0x80, 0x07, 0x98, + 0x0f, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0x06, 0x61, + 0x01, 0x00, 0x3c, 0x00, 0x3c, 0xd2, 0x00, 0x00, + 0x5c, 0x43, 0x01, 0x00, 0x38, 0x09, 0x00, 0x00, + 0x18, 0x67, 0x01, 0x00, 0x0e, 0x61, 0x01, 0x00, + 0x0a, 0x61, 0x01, 0x00, 0x01, 0x48, 0x00, 0x68, + 0x70, 0x47, 0x00, 0x00, 0xc4, 0x6a, 0x01, 0x00, + 0x02, 0x49, 0x09, 0x1d, 0x03, 0xc9, 0x40, 0x18, + 0x70, 0x47, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, + 0x01, 0x48, 0x00, 0x69, 0x70, 0x47, 0x00, 0x00, + 0xc4, 0x69, 0x01, 0x00, 0x3c, 0x00, 0x78, 0xd2, + 0x00, 0x00, 0x01, 0x48, 0x40, 0x69, 0x70, 0x47, + 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x01, 0x48, + 0x80, 0x69, 0x70, 0x47, 0x00, 0x00, 0xc4, 0x69, + 0x01, 0x00, 0x70, 0xb5, 0x0d, 0x4e, 0x00, 0x20, + 0x35, 0x1c, 0x40, 0x35, 0xf0, 0x63, 0x0d, 0xe0, + 0xa0, 0x68, 0xf4, 0xf7, 0x7a, 0xf9, 0xb3, 0x6d, + 0x00, 0x2b, 0x04, 0xd0, 0x00, 0x22, 0x01, 0x20, + 0x61, 0x6b, 0xf3, 0xf7, 0x95, 0xf8, 0x3c, 0x00, + 0xb4, 0xd2, 0x00, 0x00, 0x20, 0x1c, 0xf4, 0xf7, + 0x9d, 0xfa, 0x28, 0x1c, 0xfa, 0xf7, 0x42, 0xfd, + 0x04, 0x1c, 0xec, 0xd1, 0x70, 0xbd, 0x00, 0x00, + 0xc4, 0x69, 0x01, 0x00, 0xf8, 0xb5, 0x1a, 0x4f, + 0x00, 0x26, 0xf8, 0x6b, 0x00, 0x28, 0x2c, 0xd0, + 0x38, 0x1c, 0x40, 0x30, 0x00, 0x90, 0x1d, 0xe0, + 0x16, 0x48, 0xb9, 0x6b, 0x02, 0xf0, 0x5c, 0xf8, + 0x00, 0x22, 0x20, 0x1c, 0x14, 0x49, 0x03, 0xf0, + 0x3c, 0x00, 0xf0, 0xd2, 0x00, 0x00, 0x7b, 0xff, + 0x05, 0x1c, 0x04, 0xd1, 0x38, 0x6a, 0x01, 0x30, + 0x38, 0x62, 0x01, 0x36, 0x0d, 0xe0, 0xa0, 0x68, + 0xf4, 0xf7, 0x49, 0xf9, 0xbb, 0x6d, 0x00, 0x2b, + 0x04, 0xd0, 0x00, 0x22, 0x28, 0x1c, 0x61, 0x6b, + 0xf3, 0xf7, 0x64, 0xf8, 0x20, 0x1c, 0xf4, 0xf7, + 0x6c, 0xfa, 0x00, 0x98, 0xfa, 0xf7, 0x11, 0xfd, + 0x04, 0x1c, 0xdc, 0xd1, 0x07, 0x48, 0xb9, 0x6b, + 0x02, 0xf0, 0x3c, 0x00, 0x2c, 0xd3, 0x00, 0x00, + 0x25, 0xf8, 0x00, 0x20, 0xf8, 0x63, 0x30, 0x1c, + 0xf8, 0xbd, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, + 0x34, 0x63, 0x01, 0x00, 0x11, 0x30, 0x00, 0x00, + 0xc4, 0x60, 0x01, 0x00, 0x01, 0x49, 0x01, 0x20, + 0xc8, 0x63, 0x70, 0x47, 0xc4, 0x69, 0x01, 0x00, + 0x80, 0xb5, 0x00, 0x20, 0x05, 0x4a, 0x00, 0x21, + 0x1c, 0x23, 0x43, 0x43, 0x9b, 0x18, 0x01, 0x30, + 0x04, 0x28, 0xd9, 0x66, 0x3c, 0x00, 0x68, 0xd3, + 0x00, 0x00, 0xf8, 0xdb, 0xfc, 0xf7, 0xfd, 0xfc, + 0x80, 0xbd, 0xc4, 0x69, 0x01, 0x00, 0x01, 0x49, + 0xc8, 0x64, 0x70, 0x47, 0x00, 0x00, 0xc4, 0x69, + 0x01, 0x00, 0x01, 0x49, 0x88, 0x64, 0x70, 0x47, + 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0xb0, 0xb5, + 0x04, 0x1c, 0x0d, 0x1c, 0x21, 0x1c, 0x02, 0x8e, + 0x80, 0x6a, 0x40, 0x31, 0xf3, 0xf7, 0x2f, 0xf8, + 0x00, 0x28, 0x16, 0xd1, 0x02, 0x21, 0x3c, 0x00, + 0xa4, 0xd3, 0x00, 0x00, 0x20, 0x1c, 0xf4, 0xf7, + 0x6f, 0xfa, 0xe2, 0x69, 0xc0, 0x00, 0x10, 0x18, + 0x82, 0x8b, 0xab, 0x88, 0x9a, 0x42, 0x04, 0xd1, + 0x82, 0x69, 0x2b, 0x68, 0x9a, 0x42, 0x08, 0xd2, + 0x01, 0xe0, 0x9a, 0x42, 0x05, 0xd2, 0x00, 0x21, + 0x18, 0x30, 0x0c, 0xcd, 0x0c, 0xc0, 0x00, 0xe0, + 0x01, 0x21, 0x08, 0x1c, 0xb0, 0xbd, 0x00, 0x00, + 0xf8, 0xb5, 0x06, 0x1c, 0x00, 0x27, 0x44, 0x68, + 0x3c, 0x00, 0xe0, 0xd3, 0x00, 0x00, 0x0f, 0xe0, + 0x09, 0x49, 0x48, 0x6a, 0x01, 0x30, 0x48, 0x62, + 0xa0, 0x69, 0x00, 0x28, 0x02, 0xd0, 0xf4, 0xf7, + 0x00, 0xfa, 0xa7, 0x61, 0x26, 0x62, 0x25, 0x68, + 0x20, 0x1c, 0xff, 0xf7, 0x52, 0xfb, 0x2c, 0x1c, + 0x00, 0x2c, 0xed, 0xd1, 0xf8, 0xbd, 0xc4, 0x69, + 0x01, 0x00, 0x03, 0x30, 0x07, 0x4a, 0x81, 0x08, + 0x13, 0x68, 0x50, 0x68, 0x1b, 0x68, 0x89, 0x00, + 0x09, 0x18, 0x3c, 0x00, 0x1c, 0xd4, 0x00, 0x00, + 0x8b, 0x42, 0x01, 0xd3, 0x51, 0x60, 0x00, 0xe0, + 0x00, 0x20, 0x90, 0x60, 0x70, 0x47, 0x00, 0x00, + 0x8c, 0x6e, 0x01, 0x00, 0x70, 0xb5, 0x12, 0x4e, + 0x80, 0x38, 0xc5, 0x00, 0x70, 0x59, 0x0c, 0x1c, + 0x00, 0x28, 0x04, 0xd1, 0x01, 0x21, 0x0d, 0x20, + 0xf3, 0xf7, 0x2e, 0xff, 0x0d, 0xe0, 0x20, 0x69, + 0x00, 0x28, 0x05, 0xd1, 0xa8, 0x19, 0x81, 0x88, + 0xe0, 0x68, 0x01, 0xf0, 0x3c, 0x00, 0x58, 0xd4, + 0x00, 0x00, 0x47, 0xfa, 0x20, 0x61, 0x71, 0x59, + 0x20, 0x1c, 0xf2, 0xf7, 0xbb, 0xff, 0x04, 0x1c, + 0x00, 0x2c, 0x07, 0xd0, 0xe0, 0x68, 0x00, 0x28, + 0x01, 0xd0, 0xf4, 0xf7, 0x92, 0xf8, 0x20, 0x1c, + 0xf4, 0xf7, 0xbd, 0xf9, 0x70, 0xbd, 0x54, 0x42, + 0x01, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0x0d, 0x1c, + 0x0e, 0x49, 0x06, 0x22, 0xf3, 0xf7, 0x35, 0xf8, + 0x00, 0x26, 0xe6, 0x61, 0x66, 0x62, 0x3c, 0x00, + 0x94, 0xd4, 0x00, 0x00, 0x07, 0x20, 0x30, 0x21, + 0x08, 0x55, 0xe6, 0x63, 0x28, 0x1c, 0xf8, 0xf7, + 0x6b, 0xf8, 0xa0, 0x76, 0x20, 0x1c, 0x14, 0x30, + 0x06, 0x22, 0x29, 0x1c, 0xf3, 0xf7, 0x24, 0xf8, + 0x06, 0x22, 0x29, 0x1c, 0xa0, 0x18, 0xf3, 0xf7, + 0x1f, 0xf8, 0x26, 0x61, 0x70, 0xbd, 0x00, 0x00, + 0x12, 0x61, 0x01, 0x00, 0x80, 0xb5, 0xfd, 0xf7, + 0x85, 0xfe, 0x80, 0xbd, 0x01, 0x49, 0x48, 0x60, + 0x3c, 0x00, 0xd0, 0xd4, 0x00, 0x00, 0x70, 0x47, + 0x00, 0x00, 0xe4, 0x65, 0x01, 0x00, 0x02, 0x49, + 0x80, 0xb5, 0x49, 0x68, 0xf2, 0xf7, 0x7c, 0xff, + 0x80, 0xbd, 0xe4, 0x65, 0x01, 0x00, 0x80, 0xb5, + 0xf4, 0xf7, 0xe5, 0xf9, 0x07, 0x49, 0x07, 0x48, + 0x0e, 0xc9, 0x0e, 0xc0, 0x18, 0x38, 0x00, 0x68, + 0x00, 0x28, 0x02, 0xd0, 0x02, 0xf0, 0xb7, 0xfa, + 0x80, 0xbd, 0x02, 0xf0, 0x9e, 0xfa, 0x80, 0xbd, + 0x00, 0x00, 0x3c, 0x00, 0x0c, 0xd5, 0x00, 0x00, + 0xb0, 0x58, 0x01, 0x00, 0x90, 0x73, 0x01, 0x00, + 0x05, 0x49, 0x80, 0xb5, 0x89, 0x68, 0x00, 0x20, + 0x00, 0x29, 0x00, 0xd1, 0x03, 0x20, 0x00, 0x06, + 0x00, 0x0e, 0xfa, 0xf7, 0xe3, 0xfb, 0x80, 0xbd, + 0x60, 0x6c, 0x01, 0x00, 0x80, 0xb5, 0x03, 0x48, + 0x06, 0x22, 0x03, 0x49, 0xf2, 0xf7, 0xde, 0xff, + 0x80, 0xbd, 0x00, 0x00, 0x40, 0x80, 0x07, 0x00, + 0x12, 0x61, 0x01, 0x00, 0x3c, 0x00, 0x48, 0xd5, + 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x0c, 0x4d, + 0x0b, 0x1c, 0x21, 0x1c, 0x00, 0x20, 0x0c, 0x3d, + 0x00, 0x29, 0x09, 0x4c, 0x05, 0xd0, 0x28, 0x78, + 0x21, 0x1c, 0x10, 0x80, 0x02, 0x1c, 0x18, 0x1c, + 0x07, 0xe0, 0x11, 0x88, 0x0e, 0x29, 0x07, 0xd8, + 0x0a, 0x06, 0x12, 0x0e, 0x19, 0x1c, 0x20, 0x1c, + 0x2a, 0x70, 0xf2, 0xf7, 0xbe, 0xff, 0x01, 0x20, + 0xb0, 0xbd, 0xb0, 0x69, 0x01, 0x00, 0x3c, 0x00, + 0x84, 0xd5, 0x00, 0x00, 0x10, 0xb5, 0x00, 0x20, + 0x0a, 0x4a, 0x01, 0x21, 0x11, 0x60, 0x0a, 0x4c, + 0x0a, 0xe0, 0x02, 0x1c, 0x01, 0x6a, 0x50, 0x32, + 0x91, 0x42, 0x05, 0xd0, 0x61, 0x78, 0x3c, 0x23, + 0x59, 0x43, 0x09, 0x19, 0x04, 0x31, 0x01, 0x62, + 0x04, 0xf0, 0xba, 0xfb, 0x00, 0x28, 0xf0, 0xd1, + 0x10, 0xbd, 0x00, 0x00, 0xdc, 0x62, 0x01, 0x00, + 0x68, 0x61, 0x01, 0x00, 0x04, 0x48, 0x80, 0xb5, + 0x3c, 0x00, 0xc0, 0xd5, 0x00, 0x00, 0x00, 0x68, + 0x00, 0x28, 0x03, 0xd0, 0x01, 0x1c, 0x10, 0x20, + 0x04, 0xf0, 0xc7, 0xfe, 0x80, 0xbd, 0x28, 0x61, + 0x01, 0x00, 0x03, 0x22, 0x11, 0x1f, 0x80, 0xb5, + 0x00, 0x20, 0xfb, 0xf7, 0x76, 0xf9, 0x80, 0xbd, + 0x00, 0x00, 0x80, 0xb5, 0x0b, 0xf0, 0xb9, 0xfa, + 0x80, 0xbd, 0xff, 0xb5, 0x83, 0xb0, 0x16, 0x1c, + 0x00, 0x21, 0x01, 0x91, 0x1f, 0x1c, 0x08, 0x21, + 0x02, 0xaa, 0x3c, 0x00, 0xfc, 0xd5, 0x00, 0x00, + 0xfa, 0xf7, 0x0e, 0xff, 0x04, 0x1c, 0x2a, 0xd1, + 0x02, 0x98, 0x41, 0x68, 0x49, 0x00, 0x01, 0xd4, + 0x09, 0x24, 0x24, 0xe0, 0xfa, 0xf7, 0x52, 0xff, + 0x38, 0x60, 0x02, 0x98, 0x41, 0x68, 0x49, 0x02, + 0xcd, 0x0f, 0x29, 0x1c, 0xfa, 0xf7, 0x44, 0xff, + 0x01, 0x1c, 0x30, 0x60, 0x38, 0x68, 0x00, 0x06, + 0x00, 0x0e, 0x00, 0xf0, 0x1b, 0xf8, 0x00, 0x28, + 0x01, 0xd1, 0x0a, 0x24, 0x3c, 0x00, 0x38, 0xd6, + 0x00, 0x00, 0x0f, 0xe0, 0x31, 0x68, 0x02, 0x98, + 0x2b, 0x1c, 0x01, 0xaa, 0xfa, 0xf7, 0xd7, 0xff, + 0x00, 0x28, 0x06, 0xd0, 0x01, 0x98, 0x00, 0x28, + 0x04, 0xd0, 0x04, 0x99, 0x09, 0x68, 0x81, 0x42, + 0x00, 0xd2, 0x03, 0x24, 0x01, 0x98, 0x04, 0x99, + 0x08, 0x60, 0x07, 0xb0, 0x20, 0x1c, 0xf0, 0xbd, + 0x00, 0x00, 0x70, 0xb5, 0x05, 0x1c, 0x0e, 0x1c, + 0x01, 0x24, 0x00, 0xf0, 0x84, 0xff, 0x3c, 0x00, + 0x74, 0xd6, 0x00, 0x00, 0x00, 0x28, 0x08, 0xd0, + 0x03, 0x2d, 0x01, 0xd0, 0x04, 0x2d, 0x04, 0xd1, + 0x03, 0x20, 0xc0, 0x03, 0x86, 0x42, 0x00, 0xd3, + 0x00, 0x24, 0x20, 0x1c, 0x70, 0xbd, 0x00, 0x00, + 0x7c, 0xb5, 0x15, 0x1c, 0x06, 0x1c, 0x0c, 0x1c, + 0x29, 0x1c, 0x6a, 0x46, 0x01, 0xab, 0xff, 0xf7, + 0xa5, 0xff, 0x00, 0x28, 0x02, 0xd1, 0x00, 0x2c, + 0x01, 0xd1, 0x03, 0x20, 0x7c, 0xbd, 0x17, 0x48, + 0x3c, 0x00, 0xb0, 0xd6, 0x00, 0x00, 0x00, 0xab, + 0x06, 0x60, 0x18, 0x79, 0x07, 0x28, 0x21, 0xd2, + 0x02, 0xa3, 0x1b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, + 0x00, 0x00, 0x1d, 0x04, 0x04, 0x06, 0x10, 0x17, + 0x13, 0x00, 0x04, 0x20, 0xed, 0xe7, 0x2a, 0x1c, + 0x21, 0x1c, 0x01, 0x20, 0x00, 0x9b, 0xf2, 0xf7, + 0x81, 0xfe, 0x00, 0x28, 0x12, 0xd1, 0x06, 0x20, + 0xe3, 0xe7, 0x2a, 0x68, 0x00, 0x99, 0x05, 0xe0, + 0x00, 0x98, 0x3c, 0x00, 0xec, 0xd6, 0x00, 0x00, + 0x42, 0x78, 0x81, 0x1c, 0x01, 0xe0, 0x2a, 0x68, + 0x69, 0x46, 0x20, 0x1c, 0xf2, 0xf7, 0xfe, 0xfe, + 0x03, 0xe0, 0x04, 0x21, 0x87, 0x20, 0xf3, 0xf7, + 0xcf, 0xfd, 0x00, 0x20, 0xd0, 0xe7, 0x00, 0x00, + 0xf8, 0x6b, 0x01, 0x00, 0xf7, 0xb5, 0x86, 0xb0, + 0x0e, 0x1c, 0x08, 0x21, 0x05, 0xaa, 0x06, 0x98, + 0xfa, 0xf7, 0x7e, 0xfe, 0x04, 0x1c, 0x45, 0xd1, + 0x05, 0x98, 0x41, 0x68, 0x3c, 0x00, 0x28, 0xd7, + 0x00, 0x00, 0x02, 0x90, 0x49, 0x02, 0xc9, 0x0f, + 0x00, 0x25, 0x04, 0x95, 0x03, 0x91, 0x08, 0x9f, + 0xfa, 0xf7, 0xd5, 0xfe, 0x01, 0x90, 0x02, 0xa9, + 0x03, 0xc9, 0xfa, 0xf7, 0xc6, 0xfe, 0x01, 0x99, + 0x05, 0x29, 0x14, 0xd2, 0x02, 0xa3, 0x5b, 0x5c, + 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x00, 0x0e, 0x03, + 0x06, 0x0c, 0x03, 0x00, 0x87, 0x42, 0x0e, 0xd8, + 0x07, 0xe0, 0x87, 0x42, 0x0b, 0xd8, 0x3c, 0x00, + 0x64, 0xd7, 0x00, 0x00, 0x01, 0x25, 0xc0, 0x1b, + 0x04, 0x90, 0x07, 0xe0, 0x87, 0x42, 0x05, 0xd1, + 0x01, 0x25, 0x03, 0xe0, 0x05, 0x21, 0x87, 0x20, + 0xf3, 0xf7, 0x94, 0xfd, 0x00, 0x2d, 0x01, 0xd1, + 0x03, 0x24, 0x15, 0xe0, 0x05, 0x98, 0x41, 0x68, + 0x00, 0x29, 0x69, 0xda, 0x3a, 0x4a, 0x06, 0x99, + 0x11, 0x60, 0xfa, 0xf7, 0x91, 0xfe, 0x07, 0x1c, + 0x05, 0x98, 0x03, 0x99, 0xfa, 0xf7, 0x86, 0xfe, + 0x3c, 0x00, 0xa0, 0xd7, 0x00, 0x00, 0x05, 0x1c, + 0x01, 0x1c, 0x38, 0x1c, 0xff, 0xf7, 0x5f, 0xff, + 0x00, 0x28, 0x01, 0xd1, 0x0a, 0x24, 0x5e, 0xe0, + 0x07, 0x2f, 0x57, 0xd2, 0x02, 0xa3, 0xdb, 0x5d, + 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x00, 0x53, 0x04, + 0x04, 0x06, 0x2e, 0x50, 0x48, 0x00, 0x04, 0x24, + 0x51, 0xe0, 0x04, 0x98, 0x00, 0x28, 0x01, 0xd1, + 0x00, 0x27, 0x14, 0xe0, 0x08, 0x99, 0x08, 0x18, + 0x00, 0x04, 0x3c, 0x00, 0xdc, 0xd7, 0x00, 0x00, + 0x00, 0x0c, 0xf4, 0xf7, 0x2b, 0xf8, 0x07, 0x1c, + 0x31, 0x1c, 0x08, 0x9a, 0xf2, 0xf7, 0x86, 0xfe, + 0x08, 0x98, 0x04, 0x99, 0x38, 0x18, 0xf2, 0xf7, + 0x2f, 0xfe, 0x08, 0x98, 0x04, 0x99, 0x3e, 0x1c, + 0x40, 0x18, 0x08, 0x90, 0x31, 0x1c, 0x00, 0x20, + 0x08, 0xaa, 0xf2, 0xf7, 0xec, 0xfd, 0x00, 0x28, + 0x00, 0xd1, 0x05, 0x24, 0x00, 0x2f, 0x2d, 0xd0, + 0x38, 0x1c, 0xf3, 0xf7, 0x3c, 0x00, 0x18, 0xd8, + 0x00, 0x00, 0xed, 0xff, 0x29, 0xe0, 0x03, 0x99, + 0x00, 0x29, 0x04, 0xd0, 0x05, 0x98, 0x40, 0x68, + 0x87, 0x02, 0xbf, 0x0a, 0x00, 0xe0, 0x00, 0x27, + 0x31, 0x1c, 0x28, 0x1c, 0x08, 0x9a, 0xf2, 0xf7, + 0x60, 0xfe, 0x04, 0x99, 0x00, 0x29, 0x03, 0xd0, + 0x08, 0x98, 0x28, 0x18, 0xf2, 0xf7, 0x07, 0xfe, + 0x00, 0x2f, 0x12, 0xd0, 0xf2, 0xf7, 0xcc, 0xfd, + 0x0f, 0xe0, 0x31, 0x1c, 0xa8, 0x1c, 0x3c, 0x00, + 0x54, 0xd8, 0x00, 0x00, 0x08, 0x9a, 0xf2, 0xf7, + 0x4f, 0xfe, 0x08, 0x98, 0x68, 0x70, 0x07, 0xe0, + 0xff, 0xe7, 0x07, 0x24, 0x04, 0xe0, 0x08, 0x24, + 0x03, 0x21, 0x87, 0x20, 0xf3, 0xf7, 0x1a, 0xfd, + 0x20, 0x1c, 0x09, 0xb0, 0xf0, 0xbd, 0x00, 0x00, + 0xf8, 0x6b, 0x01, 0x00, 0x9e, 0xb5, 0x1c, 0x1c, + 0x00, 0xab, 0x19, 0x72, 0x00, 0x92, 0x00, 0x22, + 0x01, 0x94, 0x69, 0x46, 0xfb, 0xf7, 0x08, 0xfa, + 0x3c, 0x00, 0x90, 0xd8, 0x00, 0x00, 0x9e, 0xbd, + 0x00, 0x00, 0x8f, 0xb5, 0x02, 0x92, 0x00, 0x22, + 0x00, 0x90, 0x01, 0x90, 0x03, 0x91, 0x69, 0x46, + 0x04, 0x20, 0xfb, 0xf7, 0xfc, 0xf9, 0x8f, 0xbd, + 0x00, 0x00, 0xb0, 0xb5, 0x0c, 0x1c, 0x01, 0x28, + 0x0a, 0xd0, 0x03, 0x28, 0x19, 0xd0, 0x04, 0x28, + 0x2c, 0xd1, 0x60, 0x68, 0x01, 0xf0, 0x35, 0xfc, + 0x01, 0x1c, 0x83, 0x20, 0x0c, 0xcc, 0x22, 0xe0, + 0x1c, 0x20, 0x3c, 0x00, 0xcc, 0xd8, 0x00, 0x00, + 0x14, 0x49, 0x60, 0x43, 0x40, 0x18, 0x14, 0x49, + 0x45, 0x18, 0x28, 0x1c, 0xf8, 0xf7, 0x46, 0xfc, + 0xa9, 0x68, 0x00, 0x29, 0x03, 0xd0, 0x22, 0x1c, + 0x08, 0x20, 0x05, 0xf0, 0x71, 0xfe, 0xb0, 0xbd, + 0x20, 0x8c, 0xc8, 0x28, 0x01, 0xd3, 0x04, 0x20, + 0x04, 0xe0, 0x65, 0x28, 0x01, 0xd3, 0x02, 0x20, + 0x00, 0xe0, 0x01, 0x20, 0x20, 0x84, 0x20, 0x1c, + 0x03, 0xf0, 0xdc, 0xfa, 0x3c, 0x00, 0x08, 0xd9, + 0x00, 0x00, 0x22, 0x68, 0xe3, 0x68, 0x01, 0x1c, + 0x82, 0x20, 0xff, 0xf7, 0xb4, 0xff, 0xb0, 0xbd, + 0xa0, 0x21, 0x08, 0x20, 0xf3, 0xf7, 0xc3, 0xfc, + 0xb0, 0xbd, 0xdc, 0x71, 0x01, 0x00, 0x64, 0xee, + 0xff, 0xff, 0x03, 0x48, 0x04, 0x4a, 0x81, 0x68, + 0x51, 0x61, 0xc0, 0x68, 0x90, 0x61, 0x70, 0x47, + 0x00, 0x00, 0xf4, 0x68, 0x01, 0x00, 0xc0, 0x71, + 0x01, 0x00, 0x03, 0x49, 0x04, 0x4a, 0x3c, 0x00, + 0x44, 0xd9, 0x00, 0x00, 0x08, 0x6b, 0x90, 0x60, + 0x88, 0x68, 0xd0, 0x60, 0x70, 0x47, 0x00, 0x00, + 0x90, 0x5c, 0x01, 0x00, 0xc0, 0x71, 0x01, 0x00, + 0x00, 0xb5, 0xff, 0xf7, 0xf1, 0xff, 0xff, 0xf7, + 0xe3, 0xff, 0x00, 0xbd, 0xb0, 0xb5, 0x0d, 0x1c, + 0x00, 0x28, 0x14, 0xd0, 0x0b, 0x49, 0x0c, 0x4c, + 0x88, 0x68, 0x62, 0x69, 0xc9, 0x68, 0x80, 0x1a, + 0xa2, 0x69, 0x89, 0x1a, 0x40, 0x18, 0x04, 0xd0, + 0x3c, 0x00, 0x80, 0xd9, 0x00, 0x00, 0x64, 0x23, + 0x59, 0x43, 0xf2, 0xf7, 0xc4, 0xfe, 0x20, 0x61, + 0xff, 0xf7, 0xcd, 0xff, 0x20, 0x69, 0x28, 0x60, + 0x01, 0x20, 0xb0, 0xbd, 0x00, 0x20, 0xb0, 0xbd, + 0x00, 0x00, 0xf4, 0x68, 0x01, 0x00, 0xc0, 0x71, + 0x01, 0x00, 0xb0, 0xb5, 0x0d, 0x1c, 0x00, 0x28, + 0x17, 0xd0, 0x0c, 0x49, 0x0d, 0x4c, 0x08, 0x6b, + 0xa2, 0x68, 0x89, 0x68, 0x80, 0x1a, 0xe2, 0x68, + 0x89, 0x1a, 0x3c, 0x00, 0xbc, 0xd9, 0x00, 0x00, + 0x40, 0x18, 0x07, 0xd0, 0x22, 0x88, 0x90, 0x42, + 0x04, 0xd9, 0x64, 0x23, 0x59, 0x43, 0xf2, 0xf7, + 0xa1, 0xfe, 0x60, 0x60, 0xff, 0xf7, 0xb6, 0xff, + 0x60, 0x68, 0x28, 0x60, 0x01, 0x20, 0xb0, 0xbd, + 0x00, 0x20, 0xb0, 0xbd, 0x90, 0x5c, 0x01, 0x00, + 0xc0, 0x71, 0x01, 0x00, 0x7c, 0xb5, 0x10, 0x68, + 0x00, 0x28, 0x02, 0xd0, 0x00, 0xf0, 0x24, 0xf8, + 0x7c, 0xbd, 0x0f, 0x48, 0x3c, 0x00, 0xf8, 0xd9, + 0x00, 0x00, 0xc0, 0x69, 0x84, 0x68, 0xe0, 0x68, + 0x25, 0x6a, 0xa6, 0x69, 0xf3, 0xf7, 0xe3, 0xfd, + 0xe1, 0x69, 0xf3, 0xf7, 0x06, 0xfd, 0x20, 0x1c, + 0xe2, 0x69, 0x40, 0x30, 0xc1, 0x8b, 0x12, 0x89, + 0x89, 0x18, 0xc1, 0x83, 0x07, 0x49, 0x01, 0x94, + 0x00, 0x91, 0x28, 0x69, 0x33, 0x1c, 0x82, 0x88, + 0x01, 0x68, 0xe0, 0x68, 0xc0, 0x68, 0xf8, 0xf7, + 0x1e, 0xfc, 0xe0, 0xe7, 0x00, 0x00, 0x3c, 0x00, + 0x34, 0xda, 0x00, 0x00, 0x84, 0x6a, 0x01, 0x00, + 0x91, 0x5e, 0x00, 0x00, 0xf0, 0xb5, 0x85, 0x69, + 0x06, 0x6a, 0x04, 0x1c, 0xc0, 0x68, 0x85, 0xb0, + 0xc0, 0x68, 0x00, 0x28, 0x01, 0xd1, 0xf3, 0xf7, + 0x57, 0xfc, 0x0a, 0x49, 0x02, 0x95, 0x04, 0x94, + 0x03, 0x91, 0x30, 0x69, 0x82, 0x88, 0x01, 0x68, + 0x26, 0x20, 0x01, 0x92, 0x00, 0x91, 0x43, 0x5d, + 0xe0, 0x68, 0xe1, 0x69, 0x2a, 0x1c, 0x0e, 0x32, + 0x3c, 0x00, 0x70, 0xda, 0x00, 0x00, 0xc0, 0x68, + 0xf8, 0xf7, 0x37, 0xfd, 0x05, 0xb0, 0xf0, 0xbd, + 0x00, 0x00, 0xe9, 0xd9, 0x00, 0x00, 0x10, 0xb5, + 0x14, 0x1c, 0x05, 0x48, 0xfc, 0xf7, 0x7b, 0xfb, + 0xa0, 0x68, 0xf3, 0xf7, 0x9e, 0xfd, 0xe1, 0x68, + 0xc1, 0x60, 0x20, 0x1c, 0xf5, 0xf7, 0xbb, 0xfa, + 0x10, 0xbd, 0xa0, 0x6a, 0x01, 0x00, 0x7c, 0xb5, + 0x04, 0x1c, 0x60, 0x30, 0x02, 0x7b, 0xa1, 0x69, + 0x00, 0x91, 0x3c, 0x00, 0xac, 0xda, 0x00, 0x00, + 0x01, 0x92, 0x22, 0x1c, 0x21, 0x1c, 0x38, 0x31, + 0xa0, 0x68, 0x48, 0x32, 0x0d, 0x1c, 0x63, 0x69, + 0x03, 0xf0, 0x7a, 0xfb, 0x08, 0x21, 0x00, 0x20, + 0xf3, 0xf7, 0x88, 0xfd, 0xe0, 0x60, 0x26, 0x69, + 0xb1, 0x6b, 0x00, 0x29, 0x01, 0xd0, 0x10, 0x23, + 0x00, 0xe0, 0x18, 0x23, 0x05, 0x49, 0x01, 0x94, + 0x00, 0x91, 0x31, 0x68, 0xca, 0x18, 0x08, 0x23, + 0x01, 0x1c, 0x28, 0x1c, 0x3c, 0x00, 0xe8, 0xda, + 0x00, 0x00, 0xf8, 0xf7, 0x20, 0xfd, 0x7c, 0xbd, + 0x00, 0x00, 0x81, 0xda, 0x00, 0x00, 0xf0, 0xb5, + 0x46, 0x68, 0x17, 0x1c, 0x04, 0x1c, 0x01, 0x21, + 0x30, 0x1c, 0x9b, 0xb0, 0xfa, 0xf7, 0x0d, 0xfc, + 0x00, 0x25, 0x00, 0x28, 0x03, 0xd0, 0x13, 0x49, + 0x0a, 0x7a, 0x01, 0x2a, 0x01, 0xd1, 0x01, 0x25, + 0x1c, 0xe0, 0x88, 0x62, 0x4e, 0x61, 0x20, 0x89, + 0xc8, 0x61, 0x60, 0x89, 0x00, 0x28, 0x3c, 0x00, + 0x24, 0xdb, 0x00, 0x00, 0x03, 0xd0, 0x00, 0x20, + 0x08, 0x84, 0x48, 0x84, 0x04, 0xe0, 0xe0, 0x68, + 0x08, 0x84, 0x20, 0x8a, 0x48, 0x84, 0x60, 0x8a, + 0x88, 0x84, 0x08, 0x6b, 0x00, 0x28, 0x03, 0xd1, + 0x01, 0xa8, 0x03, 0xf0, 0x77, 0xfc, 0x04, 0xe0, + 0x01, 0x20, 0x08, 0x61, 0x00, 0x20, 0x02, 0xf0, + 0x39, 0xfb, 0x3d, 0x71, 0x1b, 0xb0, 0x01, 0x20, + 0xf0, 0xbd, 0x00, 0x00, 0xf4, 0x6e, 0x01, 0x00, + 0x3c, 0x00, 0x60, 0xdb, 0x00, 0x00, 0x10, 0xb5, + 0x04, 0x1c, 0xf7, 0xf7, 0xe8, 0xfb, 0x00, 0x28, + 0x11, 0xd1, 0x4b, 0x20, 0x00, 0x5d, 0x01, 0x28, + 0x0d, 0xd1, 0x20, 0x1c, 0x04, 0xf0, 0x85, 0xfa, + 0x00, 0x21, 0x20, 0x1c, 0x04, 0xf0, 0xf3, 0xf8, + 0xa0, 0x69, 0x00, 0x21, 0xc2, 0x07, 0xd2, 0x0f, + 0x04, 0x20, 0xf4, 0xf7, 0xd8, 0xf9, 0x10, 0xbd, + 0x00, 0x00, 0x38, 0xb5, 0x04, 0x1c, 0x04, 0xf0, + 0x36, 0xf9, 0x3c, 0x00, 0x9c, 0xdb, 0x00, 0x00, + 0x00, 0x28, 0x03, 0xd0, 0x40, 0x30, 0x80, 0x7a, + 0x00, 0x28, 0x25, 0xd1, 0x0c, 0x20, 0x29, 0x21, + 0x08, 0x55, 0x21, 0x1c, 0x06, 0x22, 0xa0, 0x18, + 0xf2, 0xf7, 0xa0, 0xfc, 0x20, 0x1c, 0x06, 0x22, + 0x0e, 0x49, 0xf2, 0xf7, 0x9b, 0xfc, 0x01, 0x20, + 0xe0, 0x61, 0x60, 0x62, 0x07, 0x20, 0x30, 0x21, + 0x08, 0x55, 0x00, 0x25, 0xe5, 0x63, 0x06, 0x20, + 0x00, 0xab, 0x18, 0x80, 0x3c, 0x00, 0xd8, 0xdb, + 0x00, 0x00, 0xe0, 0x68, 0x00, 0x28, 0x01, 0xd0, + 0xf3, 0xf7, 0xdb, 0xfc, 0x02, 0x21, 0x68, 0x46, + 0xfd, 0xf7, 0x73, 0xfb, 0xe0, 0x60, 0x20, 0x1c, + 0xff, 0xf7, 0x69, 0xfc, 0xe5, 0x60, 0x20, 0x1c, + 0x38, 0xbd, 0x12, 0x61, 0x01, 0x00, 0xfe, 0xb5, + 0x05, 0x1c, 0x0e, 0x1c, 0x15, 0x20, 0x00, 0xab, + 0x98, 0x80, 0x14, 0x21, 0x17, 0x1c, 0x00, 0x20, + 0xf3, 0xf7, 0xe3, 0xfc, 0x02, 0x90, 0x3c, 0x00, + 0x14, 0xdc, 0x00, 0x00, 0x04, 0x68, 0x06, 0x22, + 0x31, 0x1c, 0x60, 0x1d, 0x25, 0x71, 0xf2, 0xf7, + 0x6b, 0xfc, 0x06, 0x22, 0x39, 0x1c, 0x20, 0x1c, + 0x0b, 0x30, 0xf2, 0xf7, 0x65, 0xfc, 0x01, 0xa8, + 0xff, 0xf7, 0x52, 0xfc, 0xfe, 0xbd, 0x00, 0x00, + 0x80, 0xb5, 0x00, 0x23, 0xfb, 0xf7, 0x5c, 0xf8, + 0x80, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x05, 0x1c, + 0x08, 0x35, 0x0f, 0x4e, 0x29, 0x1c, 0x04, 0x1c, + 0x3c, 0x00, 0x50, 0xdc, 0x00, 0x00, 0x06, 0x22, + 0x30, 0x1c, 0xf2, 0xf7, 0x50, 0xfc, 0xa0, 0x88, + 0xb0, 0x82, 0x28, 0x1c, 0x05, 0xf0, 0xa1, 0xff, + 0x00, 0x28, 0x0b, 0xd0, 0xe0, 0x88, 0x30, 0x61, + 0x28, 0x1c, 0x04, 0xf0, 0xcc, 0xf8, 0xa1, 0x88, + 0x40, 0x30, 0x41, 0x80, 0x00, 0x20, 0xf4, 0xf7, + 0xb8, 0xf9, 0x02, 0xe0, 0x04, 0x20, 0xf4, 0xf7, + 0xa0, 0xf9, 0x00, 0x20, 0x70, 0xbd, 0x70, 0x7c, + 0x01, 0x00, 0x3c, 0x00, 0x8c, 0xdc, 0x00, 0x00, + 0x80, 0xb5, 0x00, 0x20, 0xfb, 0xf7, 0xf8, 0xfb, + 0x80, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x04, 0x1c, + 0x04, 0x30, 0x05, 0x1c, 0xfd, 0xf7, 0x32, 0xf8, + 0x00, 0x28, 0x09, 0xd0, 0x00, 0x20, 0xf7, 0xf7, + 0x37, 0xfc, 0x00, 0x28, 0x04, 0xd0, 0x06, 0x22, + 0x01, 0x1c, 0x28, 0x1c, 0xf2, 0xf7, 0x1e, 0xfc, + 0x0a, 0x4e, 0x06, 0x22, 0x29, 0x1c, 0x30, 0x1c, + 0xf2, 0xf7, 0x18, 0xfc, 0x3c, 0x00, 0xc8, 0xdc, + 0x00, 0x00, 0x60, 0x89, 0xf0, 0x82, 0x28, 0x1c, + 0x05, 0xf0, 0x69, 0xff, 0x00, 0x28, 0x03, 0xd0, + 0x02, 0x20, 0xf4, 0xf7, 0x88, 0xf9, 0x02, 0xe0, + 0x05, 0x20, 0xf9, 0xf7, 0xf4, 0xfa, 0x00, 0x20, + 0x70, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x10, 0xb5, + 0x04, 0x1c, 0x00, 0x79, 0x04, 0x28, 0x1c, 0xd2, + 0x60, 0x79, 0x01, 0x28, 0x01, 0xd0, 0x03, 0x28, + 0x04, 0xd1, 0x00, 0x22, 0x01, 0x21, 0x3c, 0x00, + 0x04, 0xdd, 0x00, 0x00, 0xa0, 0x1d, 0xf9, 0xf7, + 0x69, 0xfc, 0x60, 0x79, 0x00, 0x28, 0x04, 0xd1, + 0x22, 0x79, 0x00, 0x21, 0xf9, 0xf7, 0x62, 0xfc, + 0x0a, 0xe0, 0x03, 0x28, 0x08, 0xd1, 0x00, 0x24, + 0x22, 0x1c, 0x00, 0x21, 0x00, 0x20, 0xf9, 0xf7, + 0x59, 0xfc, 0x01, 0x34, 0x04, 0x2c, 0xf7, 0xdb, + 0x01, 0x20, 0x10, 0xbd, 0xf0, 0xb5, 0x97, 0xb0, + 0x17, 0x1c, 0x05, 0x1c, 0x04, 0x30, 0x04, 0x1c, + 0x3c, 0x00, 0x40, 0xdd, 0x00, 0x00, 0x15, 0xaa, + 0x16, 0xa9, 0x05, 0xf0, 0xe2, 0xfe, 0x00, 0x28, + 0x2e, 0xd0, 0x15, 0x98, 0x4b, 0x21, 0x09, 0x5c, + 0x00, 0x29, 0x23, 0xd0, 0x01, 0x29, 0x02, 0xd0, + 0x02, 0x29, 0x1f, 0xd1, 0x01, 0xe0, 0x04, 0xf0, + 0x90, 0xf9, 0xad, 0x7a, 0x13, 0x48, 0x16, 0x9e, + 0x05, 0x80, 0x06, 0x22, 0x21, 0x1c, 0x08, 0x30, + 0xf2, 0xf7, 0xc1, 0xfb, 0x22, 0x1c, 0x31, 0x1c, + 0x02, 0xa8, 0x3c, 0x00, 0x7c, 0xdd, 0x00, 0x00, + 0x00, 0xf0, 0x74, 0xfb, 0x0a, 0x20, 0x0a, 0xa9, + 0x48, 0x72, 0x00, 0xab, 0x9d, 0x80, 0x02, 0x21, + 0x01, 0xa8, 0xfd, 0xf7, 0x9f, 0xfa, 0x05, 0x90, + 0x02, 0xa8, 0xff, 0xf7, 0x95, 0xfb, 0xf3, 0xf7, + 0xf7, 0xf9, 0x00, 0x21, 0x15, 0x98, 0x03, 0xf0, + 0xe1, 0xff, 0x00, 0x20, 0x00, 0xe0, 0x01, 0x20, + 0x38, 0x71, 0x17, 0xb0, 0x01, 0x20, 0xf0, 0xbd, + 0x98, 0x7c, 0x01, 0x00, 0x3c, 0x00, 0xb8, 0xdd, + 0x00, 0x00, 0x80, 0xb5, 0x01, 0x20, 0xfb, 0xf7, + 0x62, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0xb0, 0xb5, + 0x04, 0x1c, 0x80, 0x7d, 0x15, 0x1c, 0x0a, 0x1c, + 0xc0, 0x07, 0xc0, 0x17, 0x01, 0x30, 0x21, 0x1c, + 0xf9, 0xf7, 0xfb, 0xfc, 0x00, 0x28, 0x03, 0xd1, + 0x04, 0x20, 0x28, 0x71, 0x01, 0x20, 0xb0, 0xbd, + 0x20, 0x6a, 0xf7, 0xf7, 0x76, 0xfe, 0x60, 0x6a, + 0xf7, 0xf7, 0x7b, 0xfe, 0x20, 0x6a, 0x3c, 0x00, + 0xf4, 0xdd, 0x00, 0x00, 0xfe, 0xf7, 0x88, 0xfa, + 0x00, 0x20, 0xb0, 0xbd, 0x10, 0xb5, 0x14, 0x1c, + 0xc2, 0x79, 0x81, 0x79, 0x80, 0x88, 0xf7, 0xf7, + 0xa1, 0xfa, 0x20, 0x71, 0x01, 0x20, 0x10, 0xbd, + 0x80, 0xb5, 0x01, 0x23, 0xfa, 0xf7, 0x70, 0xff, + 0x80, 0xbd, 0x00, 0x00, 0xf0, 0xb5, 0x04, 0x1c, + 0x08, 0x1c, 0x00, 0x21, 0x0f, 0x28, 0x91, 0xb0, + 0x00, 0xd3, 0x02, 0x21, 0x00, 0x29, 0x41, 0xd1, + 0x3c, 0x00, 0x30, 0xde, 0x00, 0x00, 0xc0, 0x00, + 0x24, 0x4f, 0x10, 0x90, 0xc6, 0x19, 0xb2, 0x88, + 0x21, 0x68, 0x02, 0xa8, 0xf2, 0xf7, 0x5b, 0xfb, + 0x21, 0x89, 0xb0, 0x88, 0x09, 0x1a, 0x00, 0x29, + 0x07, 0xdd, 0x09, 0x04, 0x22, 0x68, 0x09, 0x0c, + 0x10, 0x18, 0xf3, 0xf7, 0xc0, 0xfb, 0x05, 0x1c, + 0x00, 0xe0, 0x00, 0x25, 0xb0, 0x79, 0x80, 0x21, + 0x88, 0x43, 0x17, 0x49, 0x78, 0x31, 0x09, 0x5c, + 0x00, 0x20, 0x3c, 0x00, 0x6c, 0xde, 0x00, 0x00, + 0xf3, 0xf7, 0xb4, 0xfb, 0x07, 0x1c, 0x00, 0x68, + 0x13, 0x49, 0x01, 0x90, 0x10, 0x98, 0x0b, 0x58, + 0x01, 0x9a, 0x29, 0x1c, 0x02, 0xa8, 0xf2, 0xf7, + 0xac, 0xfa, 0x00, 0x90, 0x28, 0x1c, 0xf3, 0xf7, + 0x73, 0xfb, 0x20, 0x1c, 0xf3, 0xf7, 0x82, 0xfb, + 0x00, 0x98, 0x00, 0x28, 0x08, 0xd0, 0x02, 0x98, + 0x01, 0x99, 0x08, 0x60, 0xb0, 0x79, 0x39, 0x1c, + 0xfa, 0xf7, 0x20, 0xff, 0x3c, 0x00, 0xa8, 0xde, + 0x00, 0x00, 0x11, 0xb0, 0xf0, 0xbd, 0x38, 0x1c, + 0xf3, 0xf7, 0x61, 0xfb, 0xf9, 0xe7, 0x2d, 0x20, + 0xf3, 0xf7, 0xf5, 0xf9, 0x20, 0x1c, 0xf3, 0xf7, + 0x6c, 0xfb, 0xf2, 0xe7, 0x00, 0x00, 0x24, 0x44, + 0x01, 0x00, 0x70, 0xb5, 0x05, 0x1c, 0x20, 0x35, + 0x06, 0x1c, 0xa8, 0x79, 0x04, 0x28, 0x48, 0xd2, + 0xe9, 0x79, 0x01, 0x29, 0x13, 0xd1, 0x30, 0x1c, + 0x28, 0x30, 0x03, 0xf0, 0x92, 0xff, 0x3c, 0x00, + 0xe4, 0xde, 0x00, 0x00, 0x00, 0x28, 0x3f, 0xd0, + 0x01, 0x1c, 0x8c, 0x31, 0x01, 0x65, 0xa9, 0x79, + 0x4c, 0x22, 0x04, 0x1c, 0x11, 0x54, 0x81, 0x18, + 0x41, 0x62, 0x50, 0x34, 0x04, 0x62, 0xe1, 0x1e, + 0x81, 0x62, 0x0b, 0xe0, 0x00, 0x29, 0x2f, 0xd1, + 0x3c, 0x22, 0x18, 0x49, 0x42, 0x43, 0x54, 0x18, + 0x17, 0x4a, 0x04, 0x34, 0x12, 0x68, 0x00, 0x2a, + 0x00, 0xd1, 0x48, 0x70, 0x00, 0x2c, 0x23, 0xd0, + 0x3c, 0x00, 0x20, 0xdf, 0x00, 0x00, 0x35, 0x1c, + 0x30, 0x35, 0xe8, 0x79, 0x01, 0x28, 0x01, 0xd0, + 0x05, 0x28, 0x01, 0xd1, 0x06, 0x20, 0xe8, 0x71, + 0x20, 0x22, 0x31, 0x1d, 0x20, 0x68, 0xf2, 0xf7, + 0xde, 0xfa, 0xb0, 0x8c, 0xa0, 0x80, 0xe8, 0x79, + 0xa0, 0x71, 0xa8, 0x79, 0x00, 0x25, 0xa0, 0x63, + 0x01, 0x20, 0x60, 0x81, 0x00, 0x20, 0xe0, 0x60, + 0x2e, 0x36, 0xe8, 0x00, 0x00, 0x19, 0x18, 0x30, + 0x08, 0x22, 0x3c, 0x00, 0x5c, 0xdf, 0x00, 0x00, + 0x31, 0x1c, 0xf2, 0xf7, 0xcb, 0xfa, 0x01, 0x35, + 0x04, 0x2d, 0xf5, 0xd3, 0x01, 0x20, 0x70, 0xbd, + 0x68, 0x61, 0x01, 0x00, 0xdc, 0x62, 0x01, 0x00, + 0x10, 0xb5, 0x04, 0x1c, 0xc0, 0x7a, 0x01, 0x28, + 0x01, 0xd0, 0x03, 0x28, 0x07, 0xd1, 0x20, 0x1d, + 0x03, 0xf0, 0x40, 0xff, 0x00, 0x28, 0x02, 0xd0, + 0xa1, 0x7a, 0x40, 0x30, 0x41, 0x73, 0xe0, 0x7a, + 0x00, 0x28, 0x01, 0xd0, 0x3c, 0x00, 0x98, 0xdf, + 0x00, 0x00, 0x03, 0x28, 0x02, 0xd1, 0xa0, 0x7a, + 0x02, 0x49, 0x08, 0x70, 0x01, 0x20, 0x10, 0xbd, + 0x00, 0x00, 0x68, 0x61, 0x01, 0x00, 0x70, 0xb5, + 0x0e, 0x1c, 0x03, 0x21, 0x04, 0x1c, 0x30, 0x1c, + 0xfc, 0xf7, 0xe1, 0xfb, 0x00, 0x28, 0x01, 0xd0, + 0x85, 0x78, 0x00, 0xe0, 0x00, 0x25, 0x0b, 0x48, + 0x32, 0x1c, 0x00, 0x68, 0x03, 0x68, 0x20, 0x7c, + 0x80, 0x07, 0xc0, 0x0f, 0x21, 0x1c, 0x3c, 0x00, + 0xd4, 0xdf, 0x00, 0x00, 0xf7, 0xf7, 0x62, 0xfe, + 0x00, 0x28, 0x05, 0xd0, 0x01, 0x21, 0x28, 0x1c, + 0xfd, 0xf7, 0xfe, 0xfb, 0x00, 0x20, 0x00, 0xe0, + 0x08, 0x20, 0x03, 0xf0, 0xc5, 0xff, 0x00, 0x20, + 0x70, 0xbd, 0x00, 0x00, 0xe4, 0x65, 0x01, 0x00, + 0x80, 0xb5, 0x42, 0x68, 0x00, 0x88, 0x01, 0x21, + 0x49, 0x06, 0x08, 0x43, 0x2d, 0x21, 0x05, 0xf0, + 0xd3, 0xfb, 0x80, 0xbd, 0x03, 0x49, 0x01, 0x20, + 0x3c, 0x00, 0x10, 0xe0, 0x00, 0x00, 0x49, 0x78, + 0x02, 0x29, 0x00, 0xd0, 0x00, 0x20, 0x70, 0x47, + 0x00, 0x00, 0x84, 0x66, 0x01, 0x00, 0x8c, 0xb5, + 0x01, 0x28, 0x1f, 0xd1, 0x00, 0x29, 0x0d, 0xd0, + 0x01, 0x29, 0x0b, 0xd0, 0x02, 0x29, 0x01, 0xd0, + 0x03, 0x29, 0x16, 0xd1, 0x00, 0x20, 0xf9, 0xf7, + 0x14, 0xfc, 0x93, 0x20, 0x00, 0xab, 0x18, 0x80, + 0x00, 0x20, 0x08, 0xe0, 0x01, 0x29, 0x00, 0xd0, + 0x00, 0x20, 0x3c, 0x00, 0x4c, 0xe0, 0x00, 0x00, + 0xf9, 0xf7, 0x0a, 0xfc, 0x83, 0x20, 0x00, 0xab, + 0x18, 0x80, 0x02, 0x20, 0x00, 0xf0, 0xcc, 0xf8, + 0x01, 0x90, 0x68, 0x46, 0xff, 0xf7, 0x3a, 0xfa, + 0x8c, 0xbd, 0x01, 0x21, 0x0e, 0x20, 0xf3, 0xf7, + 0x1b, 0xf9, 0xf9, 0xe7, 0xff, 0xb5, 0x17, 0x1c, + 0x1e, 0x1c, 0x14, 0x21, 0x00, 0x20, 0x83, 0xb0, + 0xf3, 0xf7, 0xac, 0xfa, 0x05, 0x1c, 0x04, 0x68, + 0x12, 0x20, 0x00, 0xab, 0x3c, 0x00, 0x88, 0xe0, + 0x00, 0x00, 0x98, 0x80, 0x06, 0x22, 0x60, 0x1d, + 0x03, 0x99, 0xf2, 0xf7, 0x32, 0xfa, 0x00, 0x20, + 0x20, 0x71, 0x27, 0x73, 0x04, 0x99, 0x20, 0x1c, + 0xe1, 0x72, 0x31, 0x1c, 0x06, 0x22, 0x0d, 0x30, + 0xf2, 0xf7, 0x27, 0xfa, 0x02, 0x95, 0x01, 0xa8, + 0xff, 0xf7, 0x13, 0xfa, 0x07, 0xb0, 0xf0, 0xbd, + 0x00, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x0f, 0x1c, + 0x0c, 0x21, 0x00, 0x20, 0xf3, 0xf7, 0x3c, 0x00, + 0xc4, 0xe0, 0x00, 0x00, 0x89, 0xfa, 0x05, 0x68, + 0x04, 0x1c, 0x28, 0x1d, 0x06, 0x22, 0x31, 0x1c, + 0xf2, 0xf7, 0x12, 0xfa, 0x6f, 0x81, 0x20, 0x1c, + 0xf8, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, + 0x0d, 0x1c, 0x08, 0x21, 0x00, 0x20, 0xf3, 0xf7, + 0x77, 0xfa, 0x01, 0x68, 0x8c, 0x71, 0x8d, 0x80, + 0xb0, 0xbd, 0x00, 0x00, 0xf7, 0xb5, 0x0e, 0x1c, + 0x10, 0x21, 0x17, 0x1c, 0x00, 0x20, 0xf3, 0xf7, + 0x3c, 0x00, 0x00, 0xe1, 0x00, 0x00, 0x6b, 0xfa, + 0x04, 0x68, 0x05, 0x1c, 0x20, 0x1d, 0x06, 0x22, + 0x00, 0x99, 0xf2, 0xf7, 0xf4, 0xf9, 0x66, 0x81, + 0xa7, 0x81, 0x28, 0x1c, 0xfe, 0xbd, 0xf3, 0xb5, + 0x0c, 0x1c, 0x08, 0x21, 0x00, 0x20, 0x85, 0xb0, + 0xf3, 0xf7, 0x59, 0xfa, 0x06, 0x1c, 0x07, 0x68, + 0xe0, 0x68, 0x00, 0x28, 0x02, 0xd0, 0x05, 0x99, + 0x01, 0x29, 0x04, 0xd1, 0x05, 0x98, 0x38, 0x71, + 0x00, 0x20, 0x3c, 0x00, 0x3c, 0xe1, 0x00, 0x00, + 0x78, 0x71, 0x56, 0xe0, 0x03, 0x68, 0x01, 0x21, + 0x03, 0x93, 0x20, 0x69, 0x02, 0x90, 0xfc, 0xf7, + 0x17, 0xfb, 0x05, 0x1c, 0x02, 0x98, 0x32, 0x21, + 0xfc, 0xf7, 0x12, 0xfb, 0x00, 0x22, 0xd2, 0x43, + 0x01, 0x1c, 0x28, 0x1c, 0x04, 0xab, 0xf7, 0xf7, + 0xb9, 0xf8, 0x00, 0x28, 0x04, 0xd1, 0x30, 0x1c, + 0xf3, 0xf7, 0x02, 0xfa, 0x00, 0x26, 0x3c, 0xe0, + 0x00, 0x2d, 0x05, 0xd0, 0x3c, 0x00, 0x78, 0xe1, + 0x00, 0x00, 0x68, 0x78, 0x09, 0x38, 0x07, 0x28, + 0x01, 0xd8, 0x32, 0x20, 0x28, 0x70, 0x1c, 0x21, + 0x00, 0x20, 0xf3, 0xf7, 0x26, 0xfa, 0x01, 0x90, + 0x05, 0x68, 0x01, 0x1c, 0x30, 0x1c, 0xf3, 0xf7, + 0x40, 0xf9, 0xe0, 0x68, 0xf3, 0xf7, 0x0b, 0xfa, + 0xa8, 0x61, 0xe1, 0x68, 0x01, 0x98, 0xf3, 0xf7, + 0x38, 0xf9, 0x00, 0x20, 0xe0, 0x60, 0x05, 0x98, + 0x80, 0x21, 0x08, 0x43, 0x38, 0x71, 0x3c, 0x00, + 0xb4, 0xe1, 0x00, 0x00, 0x01, 0x20, 0x21, 0x1c, + 0x14, 0x31, 0x78, 0x71, 0x28, 0x1c, 0x06, 0x22, + 0xf2, 0xf7, 0x9a, 0xf9, 0x02, 0x9a, 0x29, 0x20, + 0x00, 0x92, 0x00, 0x5d, 0x01, 0x21, 0xe2, 0x6a, + 0x08, 0x28, 0x00, 0xd0, 0x00, 0x21, 0x28, 0x1c, + 0x03, 0x9b, 0x02, 0xf0, 0x9d, 0xff, 0xa0, 0x6b, + 0x28, 0x61, 0x20, 0x6c, 0x68, 0x61, 0x7f, 0x30, + 0x01, 0xd1, 0x0f, 0x20, 0x68, 0x61, 0x30, 0x1c, + 0x3c, 0x00, 0xf0, 0xe1, 0x00, 0x00, 0x07, 0xb0, + 0xf0, 0xbd, 0x10, 0xb5, 0x04, 0x1c, 0x08, 0x21, + 0x00, 0x20, 0xf3, 0xf7, 0xec, 0xf9, 0x01, 0x68, + 0x0c, 0x71, 0x10, 0xbd, 0x00, 0x00, 0x01, 0x48, + 0x00, 0x68, 0x70, 0x47, 0x00, 0x00, 0x28, 0x61, + 0x01, 0x00, 0x01, 0x49, 0x08, 0x60, 0x70, 0x47, + 0x00, 0x00, 0xe4, 0x65, 0x01, 0x00, 0x02, 0x1c, + 0x01, 0x20, 0x00, 0x06, 0x08, 0x43, 0x80, 0xb5, + 0x2d, 0x21, 0x3c, 0x00, 0x2c, 0xe2, 0x00, 0x00, + 0x05, 0xf0, 0xc0, 0xfa, 0x80, 0xbd, 0x00, 0x00, + 0x80, 0xb5, 0x01, 0x28, 0x07, 0xd0, 0xf1, 0x28, + 0x25, 0xd0, 0xf3, 0x28, 0x27, 0xd1, 0x02, 0x20, + 0x02, 0xf0, 0xbc, 0xf9, 0x80, 0xbd, 0x00, 0x29, + 0x1a, 0xd0, 0x01, 0x29, 0x03, 0xd0, 0xf2, 0x29, + 0xf8, 0xd1, 0x88, 0x21, 0x1c, 0xe0, 0x10, 0x48, + 0x01, 0x78, 0x00, 0x29, 0x05, 0xd1, 0x40, 0x78, + 0x01, 0x28, 0xef, 0xd1, 0x3c, 0x00, 0x68, 0xe2, + 0x00, 0x00, 0x00, 0xf0, 0x16, 0xfa, 0x80, 0xbd, + 0x0b, 0x48, 0x14, 0x30, 0x00, 0x89, 0xfc, 0xf7, + 0x5a, 0xfc, 0x01, 0x1c, 0x01, 0x22, 0x0f, 0x20, + 0x05, 0xf0, 0x9f, 0xf9, 0x80, 0xbd, 0x04, 0xf0, + 0x52, 0xfa, 0x80, 0xbd, 0x00, 0x20, 0xfa, 0xf7, + 0x32, 0xfe, 0x80, 0xbd, 0x02, 0x21, 0x0f, 0x20, + 0xf3, 0xf7, 0x05, 0xf8, 0x80, 0xbd, 0x84, 0x66, + 0x01, 0x00, 0x01, 0x48, 0x00, 0x78, 0x3c, 0x00, + 0xa4, 0xe2, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x74, 0x66, 0x01, 0x00, 0x01, 0x49, 0x00, 0x20, + 0x48, 0x60, 0x70, 0x47, 0xec, 0x65, 0x01, 0x00, + 0xf8, 0xb5, 0x0e, 0x1c, 0x13, 0x4d, 0x01, 0x1c, + 0x14, 0x1c, 0x68, 0x22, 0x28, 0x1c, 0x1f, 0x1c, + 0x0c, 0x30, 0xf2, 0xf7, 0x71, 0xf9, 0x0f, 0x49, + 0x00, 0x20, 0xac, 0x39, 0x48, 0x60, 0x01, 0x21, + 0x29, 0x60, 0x19, 0x21, 0x19, 0x2c, 0x6e, 0x67, + 0x3c, 0x00, 0xe0, 0xe2, 0x00, 0x00, 0x00, 0xd3, + 0x21, 0x1c, 0x29, 0x81, 0x09, 0x49, 0x14, 0x39, + 0x88, 0x73, 0x8f, 0x74, 0xc8, 0x78, 0x01, 0x28, + 0x08, 0xd0, 0x01, 0x21, 0x0f, 0x20, 0x05, 0xf0, + 0x9c, 0xf9, 0x19, 0x20, 0xfc, 0xf7, 0x15, 0xfc, + 0xfb, 0xf7, 0x99, 0xf8, 0x01, 0x20, 0xf8, 0xbd, + 0x00, 0x00, 0x98, 0x66, 0x01, 0x00, 0x80, 0xb5, + 0x01, 0x28, 0x02, 0xd1, 0x00, 0xf0, 0x2f, 0xf8, + 0x80, 0xbd, 0x3c, 0x00, 0x1c, 0xe3, 0x00, 0x00, + 0x01, 0x21, 0x1d, 0x20, 0xf2, 0xf7, 0xc0, 0xff, + 0x80, 0xbd, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x01, 0x20, 0x07, 0x49, 0x00, 0x05, 0x80, 0xb5, + 0x88, 0x60, 0x00, 0x22, 0x80, 0x21, 0x16, 0x20, + 0x05, 0xf0, 0x4c, 0xf9, 0x04, 0xf0, 0x34, 0xfd, + 0x02, 0x49, 0x08, 0x61, 0x80, 0xbd, 0x00, 0x00, + 0x00, 0x10, 0x07, 0x00, 0x24, 0x6d, 0x01, 0x00, + 0x06, 0x4a, 0x80, 0xb5, 0x3c, 0x00, 0x58, 0xe3, + 0x00, 0x00, 0xd1, 0x6a, 0x81, 0x42, 0x07, 0xd1, + 0x10, 0x7f, 0x24, 0x23, 0x04, 0x49, 0x58, 0x43, + 0x40, 0x18, 0xc0, 0x68, 0xf2, 0xf7, 0x35, 0xf8, + 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x94, 0x46, + 0x01, 0x00, 0x1d, 0x48, 0x1c, 0xb5, 0x00, 0x78, + 0x00, 0x28, 0x2d, 0xd0, 0x1c, 0x48, 0x00, 0x68, + 0x00, 0x28, 0x29, 0xd0, 0x1a, 0x4a, 0x1a, 0x4b, + 0x04, 0x32, 0x11, 0x68, 0x1c, 0x69, 0x3c, 0x00, + 0x94, 0xe3, 0x00, 0x00, 0xa1, 0x42, 0x22, 0xd1, + 0x51, 0x68, 0x5b, 0x69, 0x99, 0x42, 0x1f, 0xd1, + 0x16, 0x49, 0x49, 0x68, 0x93, 0x68, 0xc9, 0x1a, + 0x81, 0x42, 0x19, 0xd2, 0xd0, 0x68, 0x14, 0x49, + 0x01, 0x30, 0xd0, 0x60, 0x09, 0x68, 0x88, 0x42, + 0x0c, 0xd9, 0x06, 0x22, 0xff, 0x21, 0x68, 0x46, + 0xf2, 0xf7, 0x2e, 0xf9, 0xf3, 0xf7, 0xac, 0xfc, + 0x01, 0x1c, 0x00, 0x23, 0x00, 0x22, 0x68, 0x46, + 0x3c, 0x00, 0xd0, 0xe3, 0x00, 0x00, 0x02, 0xf0, + 0xce, 0xf9, 0x01, 0x22, 0x1d, 0x20, 0x0a, 0x49, + 0x05, 0xf0, 0xf7, 0xf8, 0x1c, 0xbd, 0xf7, 0xf7, + 0x88, 0xf9, 0x04, 0x22, 0x81, 0x18, 0x08, 0x1c, + 0xfc, 0xf7, 0x27, 0xfb, 0xf6, 0xe7, 0x1c, 0x75, + 0x01, 0x00, 0x44, 0x75, 0x01, 0x00, 0x28, 0x61, + 0x01, 0x00, 0x90, 0x5c, 0x01, 0x00, 0xf0, 0x59, + 0x01, 0x00, 0xa0, 0x86, 0x01, 0x00, 0x80, 0xb5, + 0x01, 0x68, 0x3c, 0x00, 0x0c, 0xe4, 0x00, 0x00, + 0x00, 0x29, 0x15, 0xd1, 0x00, 0x79, 0x02, 0x28, + 0x12, 0xd1, 0x08, 0x1c, 0xf7, 0xf7, 0x80, 0xf8, + 0x00, 0x28, 0x0d, 0xd0, 0x03, 0xf0, 0xf2, 0xfc, + 0x08, 0x30, 0x41, 0x8f, 0x00, 0x29, 0x07, 0xd1, + 0x80, 0x69, 0x00, 0x28, 0x04, 0xd0, 0x80, 0x79, + 0x06, 0x28, 0x01, 0xd1, 0xfc, 0xf7, 0x18, 0xfb, + 0x80, 0xbd, 0x00, 0x00, 0x01, 0x49, 0x00, 0x20, + 0x88, 0x62, 0x70, 0x47, 0x3c, 0x00, 0x48, 0xe4, + 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0xb0, 0xb5, + 0x05, 0x4d, 0x04, 0x1c, 0xa9, 0x1d, 0xff, 0xf7, + 0x14, 0xf8, 0x06, 0x22, 0x29, 0x1c, 0xa0, 0x18, + 0xf2, 0xf7, 0x4b, 0xf8, 0xb0, 0xbd, 0x70, 0x7c, + 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x15, 0x1c, + 0xff, 0xf7, 0x07, 0xf8, 0x06, 0x22, 0x29, 0x1c, + 0xa0, 0x18, 0xf2, 0xf7, 0x3e, 0xf8, 0xb0, 0xbd, + 0x00, 0x00, 0x80, 0xb5, 0x0a, 0x30, 0x3c, 0x00, + 0x84, 0xe4, 0x00, 0x00, 0xf7, 0xf7, 0xbc, 0xf9, + 0x01, 0x23, 0x00, 0x28, 0x03, 0xd0, 0x05, 0x48, + 0x00, 0x78, 0x01, 0x28, 0x04, 0xd1, 0x00, 0x22, + 0x00, 0x21, 0x00, 0x20, 0x03, 0xf0, 0xc6, 0xfd, + 0x80, 0xbd, 0x00, 0x00, 0xa0, 0x79, 0x01, 0x00, + 0x80, 0xb5, 0x00, 0x23, 0x00, 0x22, 0x00, 0x21, + 0x00, 0x20, 0x03, 0xf0, 0xbb, 0xfd, 0x80, 0xbd, + 0xb0, 0xb5, 0x05, 0x4d, 0xac, 0x79, 0x0a, 0x1c, + 0x3c, 0x00, 0xc0, 0xe4, 0x00, 0x00, 0x01, 0x1c, + 0x01, 0x23, 0x01, 0x20, 0x03, 0xf0, 0xb1, 0xfd, + 0xac, 0x71, 0xb0, 0xbd, 0x00, 0x00, 0x20, 0x10, + 0x07, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x0c, 0x1c, + 0x88, 0x07, 0x02, 0xd5, 0xf6, 0xf7, 0x47, 0xfa, + 0x10, 0xe0, 0x60, 0x07, 0x0e, 0xd5, 0x17, 0x4f, + 0xa3, 0x20, 0xc0, 0x5d, 0x15, 0x4d, 0x10, 0x28, + 0x00, 0xd3, 0x15, 0x4d, 0x04, 0xf0, 0x59, 0xfc, + 0xb9, 0x6f, 0x3c, 0x00, 0xfc, 0xe4, 0x00, 0x00, + 0x40, 0x1a, 0x29, 0x1a, 0x01, 0x20, 0xf6, 0xf7, + 0xc1, 0xfa, 0xe0, 0x07, 0x11, 0x49, 0xc0, 0x0f, + 0x48, 0x60, 0x0c, 0xd0, 0x0d, 0x4c, 0x44, 0x3c, + 0x20, 0x78, 0x03, 0x28, 0x0f, 0xd1, 0x00, 0x2e, + 0x06, 0xd0, 0xf6, 0xf7, 0xf9, 0xf9, 0x01, 0x1c, + 0x01, 0x20, 0xf6, 0xf7, 0xaf, 0xfa, 0xf8, 0xbd, + 0x09, 0x49, 0x01, 0x20, 0xf6, 0xf7, 0xaa, 0xfa, + 0x01, 0x20, 0x20, 0x70, 0x3c, 0x00, 0x38, 0xe5, + 0x00, 0x00, 0xf7, 0xe7, 0x01, 0x21, 0x30, 0x1c, + 0xf6, 0xf7, 0x89, 0xfa, 0xf2, 0xe7, 0xa6, 0x0e, + 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0xc4, 0x09, + 0x00, 0x00, 0xb0, 0x57, 0x01, 0x00, 0x40, 0x42, + 0x0f, 0x00, 0x80, 0xb5, 0x06, 0x28, 0x04, 0xdb, + 0x05, 0x21, 0xff, 0x20, 0xf2, 0xf7, 0x9f, 0xfe, + 0x80, 0xbd, 0x03, 0x4a, 0xc0, 0x00, 0x11, 0x50, + 0x01, 0x21, 0x80, 0x18, 0x01, 0x71, 0x3c, 0x00, + 0x74, 0xe5, 0x00, 0x00, 0x80, 0xbd, 0x00, 0x00, + 0x9c, 0x5a, 0x01, 0x00, 0x01, 0x48, 0x80, 0x68, + 0x70, 0x47, 0x00, 0x00, 0xd0, 0x60, 0x01, 0x00, + 0xb0, 0xb5, 0x08, 0x4c, 0x25, 0x1d, 0x28, 0x1c, + 0x21, 0x68, 0x00, 0xf0, 0xf1, 0xfe, 0x00, 0x28, + 0x03, 0xd1, 0x01, 0x21, 0x04, 0x48, 0xf2, 0xf7, + 0xcf, 0xfa, 0x28, 0x1c, 0x21, 0x68, 0x00, 0xf0, + 0xfb, 0xfe, 0xb0, 0xbd, 0xc0, 0x60, 0x01, 0x00, + 0x3c, 0x00, 0xb0, 0xe5, 0x00, 0x00, 0x2c, 0x10, + 0x07, 0x00, 0xb0, 0xb5, 0x10, 0x4d, 0x0c, 0x1c, + 0xa8, 0x68, 0x00, 0x28, 0x02, 0xd1, 0x04, 0xf0, + 0xf4, 0xfb, 0x28, 0x60, 0x20, 0x1c, 0x04, 0xf0, + 0x38, 0xfb, 0x01, 0x21, 0x03, 0x20, 0x03, 0xf0, + 0xc4, 0xfe, 0x04, 0xf0, 0xf0, 0xfb, 0xa8, 0x68, + 0x00, 0x28, 0x0b, 0xd1, 0x04, 0xf0, 0xe5, 0xfb, + 0x29, 0x68, 0x00, 0x1b, 0x40, 0x1a, 0x69, 0x68, + 0x40, 0x18, 0x3c, 0x00, 0xec, 0xe5, 0x00, 0x00, + 0x41, 0x08, 0x40, 0x18, 0x28, 0x60, 0x01, 0x20, + 0xa8, 0x60, 0xb0, 0xbd, 0xd0, 0x60, 0x01, 0x00, + 0xf8, 0xb5, 0x1f, 0x4e, 0x00, 0x24, 0xb0, 0x68, + 0x00, 0x28, 0x02, 0xd1, 0x04, 0xf0, 0xd0, 0xfb, + 0x70, 0x60, 0x05, 0xf0, 0x61, 0xf8, 0x04, 0xf0, + 0x8f, 0xfb, 0x05, 0x1c, 0xf9, 0xf7, 0x66, 0xfe, + 0x31, 0x68, 0x18, 0x4a, 0x41, 0x18, 0x12, 0x68, + 0xe8, 0x0b, 0x00, 0x2a, 0x3c, 0x00, 0x28, 0xe6, + 0x00, 0x00, 0x00, 0xd1, 0xa8, 0x0a, 0x40, 0x18, + 0x85, 0x42, 0x1f, 0xd9, 0x14, 0x4f, 0x2d, 0x1a, + 0x38, 0x1c, 0x20, 0x30, 0x81, 0x79, 0x00, 0xab, + 0x19, 0x70, 0xc0, 0x79, 0x58, 0x70, 0x05, 0xf0, + 0x6e, 0xf8, 0x00, 0x28, 0x03, 0xd1, 0x02, 0x21, + 0x8f, 0x20, 0xf2, 0xf7, 0x28, 0xfe, 0x29, 0x1c, + 0x0c, 0x48, 0xf2, 0x68, 0xf8, 0xf7, 0x09, 0xfc, + 0x00, 0x28, 0x04, 0xd0, 0x01, 0x1c, 0x3c, 0x00, + 0x64, 0xe6, 0x00, 0x00, 0x28, 0x1c, 0xff, 0xf7, + 0xa5, 0xff, 0x01, 0x24, 0x00, 0xab, 0x18, 0x88, + 0xf8, 0x84, 0x05, 0xf0, 0x47, 0xf8, 0x20, 0x1c, + 0xf8, 0xbd, 0x00, 0x00, 0xd0, 0x60, 0x01, 0x00, + 0xf4, 0x74, 0x01, 0x00, 0x00, 0x10, 0x07, 0x00, + 0x89, 0x13, 0x01, 0x00, 0x01, 0x49, 0x01, 0x20, + 0xc8, 0x60, 0x70, 0x47, 0xd0, 0x60, 0x01, 0x00, + 0x06, 0x48, 0x80, 0xb5, 0x00, 0x68, 0x01, 0x28, + 0x3c, 0x00, 0xa0, 0xe6, 0x00, 0x00, 0x07, 0xd1, + 0x04, 0x48, 0xac, 0x38, 0x01, 0x69, 0x03, 0x48, + 0x00, 0xf0, 0x79, 0xfe, 0xf3, 0xf7, 0x2b, 0xfa, + 0x80, 0xbd, 0x98, 0x66, 0x01, 0x00, 0x34, 0x63, + 0x01, 0x00, 0x80, 0xb5, 0x42, 0x78, 0x81, 0x68, + 0x00, 0x79, 0x03, 0xf0, 0xde, 0xff, 0x00, 0x28, + 0x01, 0xd1, 0xf5, 0xf7, 0xb6, 0xf9, 0x80, 0xbd, + 0x00, 0x00, 0x1f, 0xb5, 0x04, 0xf0, 0x69, 0xfb, + 0xf6, 0xf7, 0x3c, 0x00, 0xdc, 0xe6, 0x00, 0x00, + 0x91, 0xff, 0x16, 0x4c, 0x02, 0x28, 0x03, 0xd1, + 0xff, 0xf7, 0xdc, 0xfd, 0x04, 0x28, 0x02, 0xd3, + 0x00, 0x20, 0x20, 0x70, 0x1f, 0xbd, 0xfb, 0xf7, + 0xf7, 0xfc, 0x00, 0x28, 0xfa, 0xd1, 0x60, 0x6a, + 0x00, 0x28, 0xf7, 0xd0, 0x20, 0x78, 0x80, 0x07, + 0xf4, 0xd4, 0x09, 0x21, 0x16, 0x20, 0x04, 0xf0, + 0x93, 0xff, 0x01, 0x20, 0x20, 0x70, 0x0b, 0x4c, + 0x09, 0x49, 0x02, 0x90, 0x3c, 0x00, 0x18, 0xe7, + 0x00, 0x00, 0x01, 0x94, 0x00, 0x91, 0x04, 0xf0, + 0x46, 0xfb, 0x00, 0x19, 0x03, 0x90, 0x68, 0x46, + 0xfd, 0xf7, 0xb5, 0xfb, 0x00, 0x22, 0x16, 0x21, + 0x84, 0x20, 0x05, 0xf0, 0x3e, 0xf8, 0xdc, 0xe7, + 0x00, 0x00, 0x60, 0x6c, 0x01, 0x00, 0x61, 0xed, + 0x00, 0x00, 0x40, 0x42, 0x0f, 0x00, 0x23, 0x48, + 0x70, 0xb5, 0x80, 0x78, 0x9c, 0xb0, 0x01, 0x28, + 0x3e, 0xd1, 0x20, 0x4c, 0x09, 0xa8, 0x3c, 0x00, + 0x54, 0xe7, 0x00, 0x00, 0x80, 0x3c, 0x61, 0x1c, + 0xfe, 0xf7, 0x92, 0xfe, 0x04, 0x20, 0x11, 0xad, + 0x68, 0x72, 0xa0, 0x6f, 0x19, 0xa9, 0x18, 0x90, + 0x7c, 0x20, 0x00, 0x5d, 0x01, 0x26, 0x08, 0x71, + 0x1d, 0x20, 0x00, 0x5d, 0x00, 0x28, 0x06, 0xd0, + 0x10, 0x96, 0x12, 0x96, 0xfc, 0xf7, 0xf6, 0xfa, + 0x28, 0x72, 0x20, 0x7a, 0x11, 0x90, 0xf3, 0xf7, + 0xcd, 0xff, 0x6a, 0x21, 0x08, 0x53, 0x40, 0x34, + 0x3c, 0x00, 0x90, 0xe7, 0x00, 0x00, 0x00, 0x22, + 0x01, 0xa9, 0x06, 0xa8, 0xf6, 0xf7, 0xcd, 0xff, + 0x21, 0x1c, 0x00, 0x20, 0xfb, 0xf7, 0xcb, 0xfb, + 0x06, 0xa9, 0xfb, 0xf7, 0xc8, 0xfb, 0x01, 0xa9, + 0xfb, 0xf7, 0xc5, 0xfb, 0x0a, 0x49, 0x09, 0x68, + 0x00, 0x29, 0x07, 0xd0, 0x33, 0x1c, 0x0a, 0x22, + 0x69, 0x46, 0xfb, 0xf7, 0xda, 0xfb, 0x00, 0x9a, + 0x07, 0x21, 0x91, 0x70, 0x0c, 0x90, 0x09, 0xa8, + 0xfe, 0xf7, 0x3c, 0x00, 0xcc, 0xe7, 0x00, 0x00, + 0x7b, 0xfe, 0x1c, 0xb0, 0x70, 0xbd, 0x00, 0x00, + 0x84, 0x66, 0x01, 0x00, 0xe4, 0x62, 0x01, 0x00, + 0xf8, 0xb5, 0x04, 0x1c, 0xc0, 0x68, 0xff, 0x22, + 0x01, 0x68, 0x12, 0x02, 0x0e, 0x1c, 0x08, 0x7b, + 0x49, 0x7b, 0x09, 0x02, 0x11, 0x40, 0x08, 0x43, + 0x05, 0x1c, 0x31, 0x1c, 0x06, 0x22, 0xa0, 0x18, + 0xf1, 0xf7, 0x7c, 0xfe, 0x06, 0x22, 0xb1, 0x18, + 0x20, 0x1c, 0xf1, 0xf7, 0x3c, 0x00, 0x08, 0xe8, + 0x00, 0x00, 0x77, 0xfe, 0x28, 0x0a, 0x29, 0x02, + 0x08, 0x43, 0x00, 0x04, 0x03, 0x21, 0x49, 0x02, + 0x00, 0x0c, 0x88, 0x42, 0x08, 0xd2, 0xe0, 0x68, + 0x01, 0x89, 0x0e, 0x39, 0x01, 0x81, 0xe0, 0x68, + 0x01, 0x68, 0x0e, 0x31, 0x01, 0x60, 0xf8, 0xbd, + 0x00, 0x26, 0x20, 0x1c, 0x10, 0x30, 0x03, 0xf0, + 0xe8, 0xfa, 0x21, 0x8b, 0x00, 0x29, 0x05, 0xd1, + 0xe1, 0x7d, 0x00, 0x29, 0x0b, 0xd0, 0x3c, 0x00, + 0x44, 0xe8, 0x00, 0x00, 0x80, 0x69, 0x80, 0x07, + 0x08, 0xd4, 0xe0, 0x68, 0x01, 0x26, 0x01, 0x89, + 0x02, 0x39, 0x01, 0x81, 0xe0, 0x68, 0x01, 0x68, + 0x02, 0x31, 0x06, 0xe0, 0xe0, 0x68, 0x01, 0x89, + 0x06, 0x39, 0x01, 0x81, 0xe0, 0x68, 0x01, 0x68, + 0x06, 0x31, 0x01, 0x60, 0x14, 0x49, 0x00, 0x20, + 0x0b, 0x1f, 0x42, 0x00, 0x9a, 0x5a, 0xaa, 0x42, + 0x02, 0xd1, 0x11, 0x49, 0x06, 0x31, 0x02, 0xe0, + 0x3c, 0x00, 0x80, 0xe8, 0x00, 0x00, 0x01, 0x30, + 0x02, 0x28, 0xf5, 0xd3, 0xe0, 0x68, 0x06, 0x22, + 0x00, 0x68, 0xf1, 0xf7, 0x34, 0xfe, 0x01, 0x2e, + 0xcb, 0xd1, 0x81, 0x20, 0x00, 0xab, 0x18, 0x80, + 0xe1, 0x7d, 0x20, 0x8b, 0x49, 0x03, 0x08, 0x43, + 0x31, 0x03, 0x08, 0x43, 0x00, 0x04, 0x00, 0x0c, + 0x01, 0x0a, 0x00, 0x02, 0x08, 0x43, 0x58, 0x80, + 0xe0, 0x68, 0x19, 0x88, 0x00, 0x68, 0xc1, 0x80, + 0x59, 0x88, 0x3c, 0x00, 0xbc, 0xe8, 0x00, 0x00, + 0x01, 0x81, 0xb5, 0xe7, 0x6a, 0x46, 0x01, 0x00, + 0xb0, 0xb5, 0x0d, 0x1c, 0x01, 0x89, 0x06, 0x22, + 0x08, 0x31, 0x01, 0x81, 0x04, 0x68, 0x04, 0x49, + 0x08, 0x3c, 0x04, 0x60, 0x20, 0x1c, 0xf1, 0xf7, + 0x0d, 0xfe, 0xe5, 0x80, 0xb0, 0xbd, 0x00, 0x00, + 0x6a, 0x46, 0x01, 0x00, 0xf8, 0xb5, 0x00, 0x29, + 0x01, 0xd0, 0x00, 0x28, 0x01, 0xd1, 0x00, 0x20, + 0xf8, 0xbd, 0x09, 0x04, 0x3c, 0x00, 0xf8, 0xe8, + 0x00, 0x00, 0x09, 0x0c, 0xf2, 0xf7, 0x43, 0xff, + 0x06, 0x1c, 0x05, 0x1c, 0x00, 0x27, 0x20, 0xe0, + 0x2c, 0x89, 0x29, 0x68, 0x02, 0x2c, 0x01, 0xd2, + 0x02, 0x20, 0x01, 0xe0, 0x48, 0x78, 0x02, 0x30, + 0x84, 0x42, 0x02, 0xdd, 0x24, 0x1a, 0x09, 0x18, + 0xf4, 0xe7, 0x84, 0x42, 0x10, 0xd0, 0x01, 0x1b, + 0x0a, 0x04, 0x01, 0x04, 0x09, 0x0c, 0x12, 0x0c, + 0x28, 0x1c, 0xf2, 0xf7, 0x9e, 0xfe, 0x3c, 0x00, + 0x34, 0xe9, 0x00, 0x00, 0x00, 0x28, 0x06, 0xd1, + 0xe8, 0x68, 0xf2, 0xf7, 0x2d, 0xfe, 0xef, 0x60, + 0x28, 0x89, 0x00, 0x1b, 0x28, 0x81, 0xed, 0x68, + 0x00, 0x2d, 0xdc, 0xd1, 0x30, 0x1c, 0xd1, 0xe7, + 0xf8, 0xb5, 0x85, 0x68, 0x04, 0x1c, 0x80, 0x69, + 0x2e, 0x1c, 0x00, 0x28, 0x0d, 0xd0, 0x71, 0x68, + 0xf2, 0xf7, 0xf6, 0xfd, 0xa0, 0x69, 0xf2, 0xf7, + 0x17, 0xfe, 0x06, 0xe0, 0x00, 0x21, 0xc1, 0x60, + 0x3c, 0x00, 0x70, 0xe9, 0x00, 0x00, 0xf1, 0x60, + 0xa0, 0x8d, 0x36, 0x68, 0x01, 0x38, 0xa0, 0x85, + 0xf0, 0x68, 0x00, 0x28, 0xf5, 0xd1, 0x30, 0x68, + 0xa0, 0x60, 0xa0, 0x8d, 0x01, 0x38, 0x00, 0x04, + 0x00, 0x0c, 0xa0, 0x85, 0x02, 0xd0, 0x20, 0x1c, + 0xf9, 0xf7, 0x39, 0xf8, 0x2a, 0x4f, 0x2a, 0x48, + 0x00, 0x68, 0x00, 0x28, 0x03, 0xd0, 0x06, 0x21, + 0x68, 0x68, 0xfa, 0xf7, 0x7c, 0xfd, 0x68, 0x68, + 0x00, 0x68, 0x3c, 0x00, 0xac, 0xe9, 0x00, 0x00, + 0x81, 0x78, 0x00, 0x29, 0x2b, 0xd1, 0xc1, 0x78, + 0x00, 0x29, 0x30, 0xd1, 0x21, 0x8e, 0x01, 0x39, + 0x21, 0x86, 0xfb, 0xf7, 0x15, 0xf8, 0xa1, 0x6a, + 0x08, 0x1a, 0xa0, 0x62, 0xe1, 0x69, 0x88, 0x42, + 0x03, 0xd9, 0x04, 0x21, 0x02, 0x20, 0xf2, 0xf7, + 0x67, 0xfc, 0xb8, 0x68, 0x00, 0x28, 0x1e, 0xd0, + 0x1a, 0x49, 0x20, 0x8e, 0x49, 0x68, 0x0c, 0x22, + 0x52, 0x1a, 0x90, 0x42, 0x3c, 0x00, 0xe8, 0xe9, + 0x00, 0x00, 0x08, 0xd3, 0x19, 0x23, 0x9b, 0x01, + 0xaf, 0x22, 0x92, 0x01, 0x59, 0x43, 0xa0, 0x6a, + 0x51, 0x1a, 0x88, 0x42, 0x0e, 0xd2, 0x00, 0x21, + 0x0c, 0x20, 0x03, 0xf0, 0xac, 0xfc, 0x00, 0x20, + 0xb8, 0x60, 0x07, 0xe0, 0x01, 0x29, 0x05, 0xd1, + 0xc0, 0x78, 0x17, 0x28, 0x02, 0xd1, 0xa0, 0x8e, + 0x01, 0x38, 0xa0, 0x86, 0x2a, 0x1d, 0x06, 0xca, + 0xe0, 0x68, 0x63, 0x69, 0xf1, 0xf7, 0x3c, 0x00, + 0x24, 0xea, 0x00, 0x00, 0xdc, 0xfc, 0xb5, 0x42, + 0x01, 0xd0, 0x2d, 0x68, 0xb4, 0xe7, 0xa0, 0x8d, + 0x00, 0x28, 0x03, 0xd1, 0x05, 0x48, 0xb9, 0x69, + 0x00, 0xf0, 0x9e, 0xfc, 0xf8, 0xbd, 0x00, 0x00, + 0xfc, 0x5a, 0x01, 0x00, 0xcc, 0x5c, 0x01, 0x00, + 0x18, 0x57, 0x01, 0x00, 0xc4, 0x60, 0x01, 0x00, + 0x89, 0x07, 0x07, 0x4b, 0xca, 0x0f, 0x80, 0xb5, + 0x19, 0x7c, 0x00, 0x29, 0x06, 0xd0, 0x81, 0x43, + 0x3c, 0x00, 0x60, 0xea, 0x00, 0x00, 0x19, 0x74, + 0x03, 0xd1, 0x07, 0x21, 0x15, 0x20, 0x04, 0xf0, + 0xa2, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x78, 0x69, + 0x01, 0x00, 0x80, 0xb5, 0x01, 0x1c, 0x01, 0x20, + 0xff, 0xf7, 0xe9, 0xff, 0x80, 0xbd, 0x80, 0xb5, + 0x01, 0x1c, 0x02, 0x20, 0xff, 0xf7, 0xe3, 0xff, + 0x80, 0xbd, 0xb0, 0xb5, 0x1b, 0x4c, 0x60, 0x68, + 0xfc, 0xf7, 0x2f, 0xff, 0x20, 0x68, 0x00, 0x25, + 0x40, 0x68, 0x3c, 0x00, 0x9c, 0xea, 0x00, 0x00, + 0x00, 0x28, 0x03, 0xd0, 0xfd, 0xf7, 0x18, 0xfc, + 0x20, 0x68, 0x45, 0x60, 0x60, 0x68, 0xfc, 0xf7, + 0xc5, 0xfe, 0x14, 0x48, 0x61, 0x68, 0x00, 0xf0, + 0x61, 0xfc, 0xa0, 0x7a, 0x01, 0x28, 0x05, 0xd0, + 0x02, 0x28, 0x03, 0xd0, 0x20, 0x68, 0x00, 0x68, + 0x00, 0xf0, 0xde, 0xf8, 0x01, 0x21, 0x1f, 0x20, + 0x04, 0xf0, 0xb2, 0xfd, 0x00, 0x21, 0x1f, 0x20, + 0x04, 0xf0, 0xae, 0xfd, 0x3c, 0x00, 0xd8, 0xea, + 0x00, 0x00, 0x02, 0x21, 0x1f, 0x20, 0x04, 0xf0, + 0xaa, 0xfd, 0xa5, 0x72, 0x21, 0x68, 0x2c, 0x20, + 0x40, 0x5c, 0x89, 0x68, 0xf1, 0xf7, 0x76, 0xfc, + 0x60, 0x68, 0xfc, 0xf7, 0xe4, 0xfe, 0x20, 0x68, + 0x05, 0x62, 0xb0, 0xbd, 0x00, 0x00, 0x14, 0x7a, + 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x04, 0x49, + 0x0a, 0x68, 0xc8, 0x68, 0x92, 0x6a, 0x00, 0x2a, + 0x01, 0xd0, 0x09, 0x69, 0x08, 0x18, 0x3c, 0x00, + 0x14, 0xeb, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x14, 0x7a, 0x01, 0x00, 0xb0, 0xb5, 0x13, 0x4c, + 0x05, 0x1c, 0xa0, 0x7a, 0x01, 0x38, 0x02, 0x28, + 0x19, 0xd8, 0x01, 0x21, 0x1f, 0x20, 0x04, 0xf0, + 0x81, 0xfd, 0x20, 0x68, 0xfc, 0x23, 0x01, 0x1c, + 0x20, 0x30, 0x02, 0x7b, 0x1a, 0x40, 0x02, 0x73, + 0x00, 0x2d, 0x0f, 0xd0, 0x01, 0x23, 0x1a, 0x43, + 0x02, 0x73, 0xa0, 0x7a, 0x03, 0x28, 0x07, 0xd1, + 0x3c, 0x00, 0x50, 0xeb, 0x00, 0x00, 0x01, 0x20, + 0x01, 0xf0, 0xe7, 0xfd, 0x00, 0x28, 0x01, 0xd1, + 0xff, 0xf7, 0x97, 0xff, 0xb0, 0xbd, 0x4b, 0x62, + 0xb0, 0xbd, 0x02, 0x21, 0x11, 0x43, 0x01, 0x73, + 0xf6, 0xe7, 0x14, 0x7a, 0x01, 0x00, 0x10, 0xb5, + 0x04, 0x1c, 0x0a, 0x30, 0xf6, 0xf7, 0x43, 0xfe, + 0x00, 0x28, 0x0c, 0xd0, 0x22, 0x88, 0x0a, 0x49, + 0x0b, 0x7a, 0x90, 0x04, 0xc0, 0x0f, 0x00, 0x2b, + 0x06, 0xd1, 0x3c, 0x00, 0x8c, 0xeb, 0x00, 0x00, + 0x12, 0x06, 0x92, 0x0e, 0x20, 0x2a, 0x00, 0xd1, + 0x01, 0x20, 0xc8, 0x60, 0x10, 0xbd, 0x00, 0x28, + 0xfc, 0xd1, 0x00, 0x22, 0x24, 0x21, 0x80, 0x20, + 0x04, 0xf0, 0x04, 0xfe, 0x10, 0xbd, 0x00, 0x00, + 0x04, 0x7a, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x1c, + 0x1f, 0x21, 0x80, 0x20, 0x04, 0xf0, 0xfa, 0xfd, + 0x80, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x1d, 0x4e, + 0x04, 0x1c, 0x30, 0x68, 0x3c, 0x00, 0xc8, 0xeb, + 0x00, 0x00, 0x1d, 0x1c, 0x47, 0x68, 0x20, 0x1c, + 0xf1, 0xf7, 0x0a, 0xfc, 0xfb, 0xf7, 0x87, 0xfa, + 0x00, 0x28, 0x04, 0xd0, 0x28, 0x1c, 0xf2, 0xf7, + 0x2a, 0xfb, 0x00, 0x28, 0x28, 0xd1, 0x20, 0x88, + 0x40, 0x05, 0x25, 0xd4, 0x30, 0x68, 0x00, 0x68, + 0xfe, 0xf7, 0x59, 0xf9, 0x00, 0x28, 0x03, 0xd1, + 0xfd, 0xf7, 0x89, 0xfa, 0xf1, 0xf7, 0xed, 0xfb, + 0x30, 0x68, 0x00, 0x25, 0x40, 0x68, 0x3c, 0x00, + 0x04, 0xec, 0x00, 0x00, 0x00, 0x28, 0x03, 0xd0, + 0xfd, 0xf7, 0x64, 0xfb, 0x30, 0x68, 0x45, 0x60, + 0x20, 0x88, 0x00, 0x09, 0x00, 0x07, 0x03, 0xd1, + 0x04, 0xf0, 0xc8, 0xf8, 0x61, 0x88, 0x45, 0x18, + 0x30, 0x68, 0x45, 0x61, 0x81, 0x6a, 0x01, 0x31, + 0x81, 0x62, 0x20, 0x88, 0x80, 0x04, 0xc1, 0x0f, + 0x02, 0x48, 0xf8, 0xf7, 0xcd, 0xff, 0xf8, 0xbd, + 0x14, 0x7a, 0x01, 0x00, 0xb1, 0xeb, 0x00, 0x00, + 0x3c, 0x00, 0x40, 0xec, 0x00, 0x00, 0xb0, 0xb5, + 0x0e, 0x4c, 0x05, 0x1c, 0x60, 0x68, 0xfc, 0xf7, + 0xf6, 0xfd, 0x0c, 0x48, 0x61, 0x68, 0x00, 0xf0, + 0x92, 0xfb, 0x00, 0x21, 0x24, 0x20, 0x04, 0xf0, + 0xec, 0xfc, 0x00, 0x22, 0xd2, 0x43, 0x80, 0x21, + 0x24, 0x20, 0x04, 0xf0, 0xb8, 0xfc, 0x00, 0x20, + 0xe0, 0x60, 0x20, 0x72, 0x20, 0x68, 0x01, 0x68, + 0x28, 0x06, 0x00, 0x0e, 0xf1, 0xf7, 0xb0, 0xfb, + 0xb0, 0xbd, 0x3c, 0x00, 0x7c, 0xec, 0x00, 0x00, + 0x04, 0x7a, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, + 0x10, 0xb5, 0x04, 0x1c, 0xc0, 0x68, 0xf2, 0xf7, + 0x85, 0xfc, 0x20, 0x1c, 0xf2, 0xf7, 0xb0, 0xfd, + 0x10, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x1c, 0x4e, + 0x05, 0x1c, 0xb0, 0x7a, 0x2c, 0x1c, 0x40, 0x34, + 0x02, 0x28, 0x26, 0xd1, 0xa0, 0x8b, 0x31, 0x89, + 0x88, 0x42, 0x22, 0xd1, 0x30, 0x68, 0x41, 0x6a, + 0x00, 0x29, 0x08, 0xd0, 0x3c, 0x00, 0xb8, 0xec, + 0x00, 0x00, 0x20, 0x30, 0x00, 0x7b, 0xc0, 0x07, + 0x04, 0xd5, 0x01, 0x20, 0x01, 0xf0, 0x2f, 0xfd, + 0x00, 0x28, 0x18, 0xd1, 0x60, 0x78, 0x00, 0x28, + 0x09, 0xd1, 0x30, 0x68, 0x02, 0x23, 0x20, 0x30, + 0x02, 0x7b, 0x0d, 0x49, 0x52, 0x08, 0x52, 0x00, + 0x1a, 0x43, 0x02, 0x73, 0x01, 0xe0, 0xff, 0x21, + 0xf5, 0x31, 0x01, 0x22, 0x1f, 0x20, 0x04, 0xf0, + 0x6e, 0xfc, 0x03, 0x20, 0xb0, 0x72, 0x3c, 0x00, + 0xf4, 0xec, 0x00, 0x00, 0x02, 0xe0, 0x28, 0x1c, + 0xff, 0xf7, 0xc4, 0xff, 0x60, 0x78, 0x00, 0x28, + 0x03, 0xd1, 0x29, 0x1c, 0x01, 0x20, 0x03, 0xf0, + 0x29, 0xfb, 0x70, 0xbd, 0x14, 0x7a, 0x01, 0x00, + 0x50, 0xc3, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, + 0x60, 0x34, 0xe0, 0x79, 0x0e, 0x4d, 0x00, 0x28, + 0x0a, 0xd1, 0x02, 0x20, 0xa8, 0x72, 0x28, 0x68, + 0x40, 0x68, 0x00, 0x28, 0x04, 0xd1, 0x0b, 0x48, + 0x3c, 0x00, 0x30, 0xed, 0x00, 0x00, 0xfd, 0xf7, + 0xd0, 0xfa, 0x29, 0x68, 0x48, 0x60, 0x04, 0xf0, + 0x38, 0xf8, 0x29, 0x68, 0xc8, 0x61, 0xff, 0xf7, + 0xe0, 0xfe, 0x29, 0x68, 0x09, 0x69, 0x08, 0x1a, + 0x03, 0xf0, 0x6f, 0xff, 0x00, 0x28, 0x01, 0xd0, + 0xe0, 0x79, 0xa0, 0x71, 0xb0, 0xbd, 0x14, 0x7a, + 0x01, 0x00, 0xc1, 0xeb, 0x00, 0x00, 0xf8, 0xb5, + 0x04, 0x1c, 0x00, 0x26, 0x04, 0xf0, 0x21, 0xf8, + 0x05, 0x1c, 0x3c, 0x00, 0x6c, 0xed, 0x00, 0x00, + 0x22, 0x48, 0x00, 0x27, 0x07, 0x70, 0xa1, 0x07, + 0x04, 0xd0, 0xe1, 0x07, 0xc9, 0x0f, 0x01, 0x62, + 0xc5, 0x61, 0x01, 0x26, 0x41, 0x6b, 0x00, 0x29, + 0x34, 0xd1, 0x00, 0x2e, 0x32, 0xd0, 0x06, 0x1c, + 0xf9, 0xf7, 0x44, 0xff, 0x31, 0x6b, 0x1a, 0x4b, + 0x41, 0x1a, 0xa2, 0x07, 0x12, 0xd5, 0xda, 0x68, + 0x00, 0x2a, 0x08, 0xdd, 0x91, 0x42, 0x1a, 0x68, + 0x02, 0xda, 0x14, 0x09, 0x3c, 0x00, 0xa8, 0xed, + 0x00, 0x00, 0xa2, 0x18, 0x06, 0xe0, 0x14, 0x09, + 0x12, 0x1b, 0x03, 0xe0, 0x0a, 0x43, 0x02, 0xd1, + 0x1a, 0x68, 0x52, 0x00, 0x1a, 0x60, 0xb7, 0x63, + 0x0a, 0xe0, 0xb2, 0x6b, 0x01, 0x32, 0xb2, 0x63, + 0x02, 0x2a, 0x1a, 0x68, 0x01, 0xdd, 0x94, 0x08, + 0x00, 0xe0, 0x14, 0x09, 0x12, 0x1b, 0x1a, 0x60, + 0xd9, 0x60, 0x30, 0x63, 0xf5, 0x62, 0x18, 0x68, + 0x08, 0x49, 0x88, 0x42, 0x01, 0xd9, 0x3c, 0x00, + 0xe4, 0xed, 0x00, 0x00, 0x19, 0x60, 0x03, 0xe0, + 0x64, 0x28, 0x01, 0xd2, 0x64, 0x20, 0x18, 0x60, + 0xf5, 0xf7, 0xfc, 0xfd, 0xf8, 0xbd, 0x00, 0x00, + 0x60, 0x6c, 0x01, 0x00, 0xb0, 0x57, 0x01, 0x00, + 0x20, 0xa1, 0x07, 0x00, 0xfe, 0xb5, 0x04, 0x1c, + 0x00, 0x20, 0x50, 0x4d, 0x00, 0x21, 0x68, 0x61, + 0x20, 0x69, 0xfb, 0xf7, 0xb3, 0xfc, 0x07, 0x1c, + 0x20, 0x69, 0x03, 0x21, 0xfb, 0xf7, 0xae, 0xfc, + 0x3c, 0x00, 0x20, 0xee, 0x00, 0x00, 0x00, 0x28, + 0x03, 0xd0, 0x80, 0x78, 0x29, 0x78, 0x88, 0x42, + 0x63, 0xd1, 0x47, 0x4d, 0x20, 0x1c, 0x14, 0x30, + 0x39, 0x1c, 0x06, 0x1c, 0x2a, 0x78, 0x02, 0xf0, + 0x5a, 0xfa, 0x00, 0x28, 0x59, 0xd1, 0xe0, 0x68, + 0x05, 0x68, 0x41, 0x48, 0x01, 0x95, 0x58, 0x30, + 0x02, 0x90, 0xfb, 0xf7, 0x6a, 0xff, 0x3e, 0x4d, + 0x19, 0x35, 0x00, 0x28, 0x0b, 0xd0, 0x28, 0x1c, + 0xfb, 0xf7, 0x3c, 0x00, 0x5c, 0xee, 0x00, 0x00, + 0x55, 0xff, 0x00, 0x28, 0x1e, 0xd1, 0x31, 0x1c, + 0x28, 0x1c, 0xfb, 0xf7, 0x65, 0xff, 0x00, 0x28, + 0x42, 0xd0, 0x17, 0xe0, 0x28, 0x1c, 0xfb, 0xf7, + 0x49, 0xff, 0x00, 0x28, 0x06, 0xd0, 0x39, 0x1c, + 0x02, 0x98, 0xfb, 0xf7, 0x63, 0xff, 0x00, 0x28, + 0x36, 0xd0, 0x0b, 0xe0, 0x39, 0x1c, 0x02, 0x98, + 0xfb, 0xf7, 0x5c, 0xff, 0x00, 0x28, 0x2f, 0xd0, + 0x31, 0x1c, 0x28, 0x1c, 0x3c, 0x00, 0x98, 0xee, + 0x00, 0x00, 0xfb, 0xf7, 0x4c, 0xff, 0x00, 0x28, + 0x29, 0xd0, 0x30, 0x1c, 0xf6, 0xf7, 0xad, 0xfc, + 0x29, 0x4a, 0x18, 0x32, 0x11, 0x7c, 0x00, 0x29, + 0x04, 0xd0, 0x51, 0x6a, 0x00, 0x29, 0x01, 0xd0, + 0x00, 0x28, 0x1c, 0xd1, 0x90, 0x6a, 0x00, 0x28, + 0x3b, 0xd0, 0x13, 0x78, 0x01, 0x9d, 0x01, 0x21, + 0x6d, 0x89, 0x01, 0x20, 0x2b, 0x40, 0x9b, 0x07, + 0x11, 0xd0, 0xa3, 0x6b, 0x1e, 0x4e, 0x3c, 0x00, + 0xd4, 0xee, 0x00, 0x00, 0x1d, 0x1c, 0x7f, 0x35, + 0x98, 0x36, 0x00, 0x2d, 0x14, 0xd0, 0x55, 0x8a, + 0x00, 0x2d, 0x08, 0xd1, 0x55, 0x69, 0xab, 0x42, + 0x0f, 0xda, 0x00, 0x20, 0x17, 0x4d, 0x01, 0x23, + 0x6b, 0x61, 0x0a, 0xe0, 0x29, 0xe0, 0xf5, 0x78, + 0x02, 0x2d, 0x06, 0xd1, 0x14, 0x4f, 0x55, 0x69, + 0x3f, 0x68, 0xed, 0x19, 0xab, 0x42, 0x00, 0xda, + 0x00, 0x20, 0x23, 0x6c, 0x1d, 0x1c, 0x7f, 0x35, + 0x3c, 0x00, 0x10, 0xef, 0x00, 0x00, 0x10, 0xd0, + 0x55, 0x8a, 0x00, 0x2d, 0x03, 0xd1, 0x95, 0x69, + 0xab, 0x42, 0x0a, 0xd2, 0x08, 0xe0, 0xf5, 0x78, + 0x02, 0x2d, 0x06, 0xd1, 0x0b, 0x4e, 0x95, 0x69, + 0x36, 0x68, 0xad, 0x19, 0xab, 0x42, 0x00, 0xd2, + 0x00, 0x21, 0x08, 0x43, 0x08, 0xd0, 0x10, 0x6a, + 0x00, 0x28, 0x01, 0xd0, 0xf1, 0xf7, 0x4b, 0xfa, + 0x00, 0x21, 0x20, 0x1c, 0x01, 0xf0, 0xb9, 0xf9, + 0xfe, 0xbd, 0x3c, 0x00, 0x4c, 0xef, 0x00, 0x00, + 0xec, 0x65, 0x01, 0x00, 0xc4, 0x67, 0x01, 0x00, + 0xcc, 0x67, 0x01, 0x00, 0x3e, 0xb5, 0x05, 0x6a, + 0x04, 0x1c, 0xc0, 0x68, 0xf2, 0xf7, 0x34, 0xfb, + 0xe1, 0x69, 0xf2, 0xf7, 0x57, 0xfa, 0x20, 0x1c, + 0x40, 0x30, 0xc1, 0x8b, 0x04, 0x31, 0xc1, 0x83, + 0x2b, 0x69, 0x10, 0x49, 0x98, 0x79, 0x06, 0x28, + 0x0a, 0xd1, 0x98, 0x88, 0x01, 0x91, 0x02, 0x94, + 0x00, 0x90, 0x60, 0x69, 0x3c, 0x00, 0x88, 0xef, + 0x00, 0x00, 0x1b, 0x68, 0x01, 0x68, 0xe0, 0x68, + 0x03, 0x22, 0xc0, 0x68, 0x0a, 0xe0, 0x02, 0x28, + 0x0b, 0xd1, 0x10, 0x20, 0x00, 0x90, 0x01, 0x91, + 0x02, 0x94, 0xe0, 0x68, 0xa3, 0x69, 0xc0, 0x68, + 0x00, 0x22, 0x00, 0x21, 0xf7, 0xf7, 0x0f, 0xfb, + 0x3e, 0xbd, 0xf2, 0xf7, 0xa6, 0xf9, 0xfb, 0xe7, + 0x00, 0x00, 0xbd, 0xef, 0x00, 0x00, 0x80, 0xb5, + 0xd1, 0x68, 0x50, 0x69, 0xc9, 0x68, 0x3c, 0x00, + 0xc4, 0xef, 0x00, 0x00, 0xc1, 0x60, 0xd1, 0x68, + 0xc8, 0x60, 0x11, 0x1c, 0x40, 0x31, 0xcb, 0x8b, + 0x00, 0x89, 0x18, 0x18, 0xc8, 0x83, 0x10, 0x68, + 0x00, 0x28, 0x02, 0xd0, 0xff, 0xf7, 0xbc, 0xff, + 0x80, 0xbd, 0x03, 0x48, 0xfb, 0xf7, 0xcc, 0xf8, + 0x00, 0x6a, 0xfe, 0xf7, 0xf5, 0xf9, 0x80, 0xbd, + 0xa0, 0x6a, 0x01, 0x00, 0xf8, 0xb5, 0x06, 0x1c, + 0x0a, 0x24, 0x30, 0x07, 0x01, 0x09, 0xa0, 0x07, + 0x3c, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x43, + 0x0f, 0x1c, 0x0a, 0x4d, 0x2f, 0x60, 0x04, 0xf0, + 0xfa, 0xfe, 0xad, 0x68, 0x28, 0x01, 0x00, 0x0f, + 0xb0, 0x42, 0x05, 0xd0, 0x01, 0x3c, 0xf4, 0xd2, + 0x01, 0x21, 0x9b, 0x20, 0xf2, 0xf7, 0x41, 0xf9, + 0x28, 0x02, 0x00, 0x0a, 0x08, 0x2e, 0x01, 0xd1, + 0x31, 0x05, 0x08, 0x43, 0xf8, 0xbd, 0x60, 0x00, + 0x07, 0x00, 0x01, 0x22, 0xd2, 0x05, 0x80, 0xb5, + 0x00, 0x21, 0x3c, 0x00, 0x3c, 0xf0, 0x00, 0x00, + 0x04, 0x20, 0x04, 0xf0, 0xdd, 0xfc, 0x0f, 0x20, + 0xff, 0xf7, 0xd6, 0xff, 0x0f, 0x21, 0x09, 0x04, + 0x08, 0x40, 0x00, 0x0c, 0x80, 0xbd, 0x00, 0x00, + 0x80, 0xb5, 0x05, 0x48, 0xfd, 0xf7, 0x4a, 0xf9, + 0x04, 0x48, 0xfd, 0xf7, 0x7b, 0xf8, 0x04, 0x48, + 0xfd, 0xf7, 0x6c, 0xf8, 0x80, 0xbd, 0x00, 0x00, + 0x89, 0x34, 0x01, 0x00, 0xed, 0x24, 0x00, 0x00, + 0x11, 0x1c, 0x00, 0x00, 0x3c, 0x00, 0x78, 0xf0, + 0x00, 0x00, 0x80, 0xb5, 0x02, 0x48, 0xf3, 0xf7, + 0x2a, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0xd1, 0x24, + 0x00, 0x00, 0x80, 0xb5, 0xf2, 0xf7, 0x53, 0xf9, + 0x80, 0xbd, 0x80, 0xb5, 0x00, 0x21, 0x00, 0x20, + 0x01, 0xf0, 0x51, 0xfe, 0x03, 0x20, 0x02, 0xf0, + 0x46, 0xff, 0x80, 0xbd, 0x00, 0x00, 0x06, 0x48, + 0x80, 0xb5, 0xc1, 0x69, 0x00, 0x29, 0x06, 0xd1, + 0x01, 0x6a, 0x00, 0x29, 0x03, 0xd1, 0x3c, 0x00, + 0xb4, 0xf0, 0x00, 0x00, 0x81, 0x6b, 0x03, 0x48, + 0x00, 0xf0, 0x5e, 0xf9, 0x80, 0xbd, 0x00, 0x00, + 0xc4, 0x69, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, + 0x10, 0xb5, 0x04, 0x4c, 0x20, 0x6a, 0xfc, 0xf7, + 0xb3, 0xfb, 0x03, 0x48, 0x21, 0x6a, 0x00, 0xf0, + 0x4f, 0xf9, 0x10, 0xbd, 0x1c, 0x75, 0x01, 0x00, + 0x34, 0x63, 0x01, 0x00, 0xb0, 0xb5, 0x0d, 0x4c, + 0x20, 0x7c, 0x00, 0x28, 0x02, 0xd0, 0x01, 0x21, + 0x3c, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xfd, 0xf7, + 0x86, 0xf9, 0x00, 0x25, 0x25, 0x70, 0xa0, 0x68, + 0x01, 0x28, 0x03, 0xd1, 0x00, 0x20, 0xa5, 0x60, + 0x01, 0xf0, 0x8f, 0xf8, 0xa0, 0x78, 0x01, 0x28, + 0x05, 0xd1, 0x03, 0x48, 0x98, 0x38, 0x00, 0x69, + 0xfc, 0xf7, 0xef, 0xfb, 0xa5, 0x70, 0xb0, 0xbd, + 0x00, 0x00, 0x84, 0x66, 0x01, 0x00, 0x80, 0xb5, + 0x00, 0x21, 0x01, 0x20, 0x01, 0xf0, 0x09, 0xfe, + 0x80, 0xbd, 0x3c, 0x00, 0x2c, 0xf1, 0x00, 0x00, + 0x38, 0xb5, 0x69, 0x46, 0x00, 0x25, 0xf8, 0xf7, + 0xb7, 0xfe, 0x04, 0x1c, 0x01, 0xd1, 0x01, 0x20, + 0x38, 0xbd, 0xa0, 0x68, 0x00, 0x28, 0x04, 0xd0, + 0x00, 0x99, 0xa1, 0x31, 0x08, 0x20, 0x04, 0xf0, + 0x73, 0xfa, 0x1c, 0x21, 0x20, 0x1c, 0xf1, 0xf7, + 0xa3, 0xf9, 0x28, 0x1c, 0xf0, 0xe7, 0x00, 0x00, + 0xfe, 0xb5, 0x07, 0x1c, 0x4c, 0x23, 0x39, 0x49, + 0x58, 0x43, 0x44, 0x18, 0x3c, 0x00, 0x68, 0xf1, + 0x00, 0x00, 0x25, 0x1c, 0x40, 0x35, 0x28, 0x7a, + 0x37, 0x49, 0x48, 0x76, 0x21, 0x1c, 0x30, 0x31, + 0x02, 0x91, 0x0c, 0x23, 0xc8, 0x56, 0x42, 0x1c, + 0x0a, 0x73, 0x49, 0x7b, 0x88, 0x42, 0x46, 0xda, + 0x32, 0x48, 0x00, 0x78, 0x80, 0x07, 0x3e, 0xd5, + 0x00, 0x20, 0x01, 0x90, 0xf6, 0xf7, 0xaf, 0xfa, + 0x00, 0x28, 0x2e, 0xd0, 0xac, 0x21, 0x09, 0x58, + 0x00, 0x29, 0x01, 0xd0, 0xe4, 0x30, 0x3c, 0x00, + 0xa4, 0xf1, 0x00, 0x00, 0x00, 0xe0, 0xcc, 0x30, + 0x06, 0x1c, 0x40, 0x68, 0x00, 0x28, 0x25, 0xd0, + 0x02, 0x99, 0x08, 0x7b, 0x01, 0x28, 0x11, 0xd1, + 0x20, 0x1c, 0x2e, 0x30, 0x29, 0x78, 0xf6, 0xf7, + 0xed, 0xf9, 0x71, 0x68, 0x03, 0xe0, 0x72, 0x18, + 0x12, 0x7a, 0x82, 0x42, 0x03, 0xd9, 0xff, 0x31, + 0x09, 0x06, 0x09, 0x0e, 0xf7, 0xd1, 0xa9, 0x70, + 0x01, 0x20, 0x01, 0x90, 0x23, 0x1c, 0x3e, 0x33, + 0x3c, 0x00, 0xe0, 0xf1, 0x00, 0x00, 0x1a, 0x1d, + 0x30, 0x1c, 0x00, 0x97, 0x01, 0x99, 0xf8, 0xf7, + 0x58, 0xfa, 0x00, 0x28, 0x11, 0xd0, 0xa8, 0x78, + 0x80, 0x19, 0x00, 0x7a, 0x00, 0xe0, 0x00, 0x20, + 0x68, 0x70, 0x68, 0x78, 0x01, 0x21, 0xfb, 0xf7, + 0xe0, 0xfd, 0x60, 0x60, 0x38, 0x1c, 0x01, 0xf0, + 0x14, 0xfe, 0x38, 0x1c, 0x01, 0xf0, 0xa5, 0xfb, + 0xfe, 0xbd, 0x02, 0x99, 0x08, 0x7b, 0xff, 0x30, + 0x48, 0x73, 0x3c, 0x00, 0x1c, 0xf2, 0x00, 0x00, + 0x38, 0x1c, 0xfc, 0xf7, 0x19, 0xfc, 0x03, 0xf0, + 0xc3, 0xfd, 0x06, 0x1c, 0xfb, 0xf7, 0x8e, 0xfe, + 0x41, 0x00, 0x76, 0x18, 0x68, 0x78, 0x61, 0x68, + 0xfb, 0xf7, 0x6a, 0xfe, 0x31, 0x18, 0x20, 0x8d, + 0x3b, 0x1c, 0x05, 0x4a, 0x03, 0xf0, 0x12, 0xfe, + 0xe5, 0xe7, 0x00, 0x00, 0x58, 0xe3, 0x01, 0x00, + 0x30, 0x80, 0x07, 0x00, 0x1d, 0x75, 0x01, 0x00, + 0xd5, 0x4e, 0x00, 0x00, 0x3c, 0x00, 0x58, 0xf2, + 0x00, 0x00, 0x03, 0x1c, 0x04, 0x48, 0x80, 0xb5, + 0x02, 0x79, 0x20, 0x30, 0x03, 0x49, 0x00, 0xf0, + 0x30, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0xac, 0x7c, + 0x01, 0x00, 0xc4, 0x67, 0x01, 0x00, 0x03, 0x1c, + 0x04, 0x48, 0x80, 0xb5, 0xc2, 0x78, 0x38, 0x30, + 0x03, 0x49, 0x00, 0xf0, 0x22, 0xf8, 0x80, 0xbd, + 0x00, 0x00, 0xac, 0x7c, 0x01, 0x00, 0xc8, 0x67, + 0x01, 0x00, 0x03, 0x1c, 0x04, 0x48, 0x3c, 0x00, + 0x94, 0xf2, 0x00, 0x00, 0x80, 0xb5, 0x82, 0x79, + 0x50, 0x30, 0x03, 0x49, 0x00, 0xf0, 0x14, 0xf8, + 0x80, 0xbd, 0x00, 0x00, 0xac, 0x7c, 0x01, 0x00, + 0xcc, 0x67, 0x01, 0x00, 0x03, 0x1c, 0x04, 0x48, + 0x80, 0xb5, 0x42, 0x79, 0x68, 0x30, 0x03, 0x49, + 0x00, 0xf0, 0x06, 0xf8, 0x80, 0xbd, 0x00, 0x00, + 0xac, 0x7c, 0x01, 0x00, 0xd0, 0x67, 0x01, 0x00, + 0x10, 0xb5, 0x00, 0x24, 0x84, 0x80, 0x0b, 0x60, + 0x3c, 0x00, 0xd0, 0xf2, 0x00, 0x00, 0x19, 0x1c, + 0x51, 0x43, 0x01, 0x60, 0x19, 0x06, 0x09, 0x16, + 0x10, 0x22, 0x06, 0x30, 0xf1, 0xf7, 0x9f, 0xf9, + 0x10, 0xbd, 0xb0, 0xb5, 0x06, 0x4d, 0x00, 0x24, + 0xac, 0x60, 0xec, 0x60, 0xec, 0x61, 0x2c, 0x62, + 0x02, 0xf0, 0xf1, 0xfc, 0x00, 0xf0, 0x0d, 0xf8, + 0xec, 0x62, 0x2c, 0x70, 0xb0, 0xbd, 0x44, 0x7d, + 0x01, 0x00, 0x80, 0xb5, 0x80, 0x21, 0x01, 0x48, + 0xf1, 0xf7, 0x3c, 0x00, 0x0c, 0xf3, 0x00, 0x00, + 0xc7, 0xf8, 0x80, 0xbd, 0x04, 0x66, 0x01, 0x00, + 0xf8, 0xb5, 0x07, 0x4f, 0x00, 0x24, 0x00, 0x26, + 0x18, 0x20, 0x60, 0x43, 0xc5, 0x19, 0xee, 0x60, + 0x03, 0xf0, 0x42, 0xfd, 0x10, 0x35, 0x01, 0x34, + 0x02, 0x2c, 0x41, 0xc5, 0xf4, 0xdb, 0xf8, 0xbd, + 0xb8, 0x7d, 0x01, 0x00, 0x00, 0x23, 0x03, 0x60, + 0x04, 0x4b, 0x00, 0x29, 0x00, 0xd1, 0x19, 0x1c, + 0x41, 0x60, 0x00, 0x2a, 0x3c, 0x00, 0x48, 0xf3, + 0x00, 0x00, 0x00, 0xd1, 0x1a, 0x1c, 0x82, 0x60, + 0x70, 0x47, 0xbd, 0x75, 0x00, 0x00, 0x10, 0xb5, + 0x07, 0x4c, 0x20, 0x68, 0x01, 0x30, 0x20, 0x60, + 0x20, 0x28, 0x03, 0xd9, 0x58, 0x21, 0x58, 0x20, + 0xf1, 0xf7, 0x9d, 0xff, 0x21, 0x68, 0x01, 0x20, + 0x01, 0x39, 0x88, 0x40, 0x10, 0xbd, 0x60, 0x5b, + 0x01, 0x00, 0xb0, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, + 0x21, 0x68, 0x00, 0x20, 0x00, 0x29, 0x3c, 0x00, + 0x84, 0xf3, 0x00, 0x00, 0x0a, 0xd0, 0xa9, 0x43, + 0x21, 0x60, 0x07, 0xd1, 0xa0, 0x68, 0xf1, 0xf7, + 0x23, 0xf8, 0x00, 0x28, 0x02, 0xd1, 0x21, 0x68, + 0x29, 0x43, 0x21, 0x60, 0xb0, 0xbd, 0x00, 0x00, + 0xb0, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, 0x21, 0x68, + 0x00, 0x20, 0x29, 0x43, 0x21, 0x60, 0xa9, 0x42, + 0x07, 0xd1, 0x60, 0x68, 0xf1, 0xf7, 0x10, 0xf8, + 0x00, 0x28, 0x02, 0xd1, 0x21, 0x68, 0xa9, 0x43, + 0x3c, 0x00, 0xc0, 0xf3, 0x00, 0x00, 0x21, 0x60, + 0xb0, 0xbd, 0x1a, 0x4b, 0xb0, 0xb5, 0x9a, 0x6a, + 0x00, 0x28, 0x0b, 0xd0, 0x00, 0x2a, 0x07, 0xdb, + 0xb8, 0x24, 0x24, 0x58, 0x01, 0x3c, 0xa4, 0x1a, + 0x00, 0x19, 0xb0, 0x30, 0x00, 0x7b, 0x02, 0xe0, + 0x0e, 0x20, 0x00, 0xe0, 0x0d, 0x20, 0x5d, 0x6a, + 0x12, 0x4c, 0x00, 0x2d, 0x01, 0xd0, 0x20, 0x78, + 0x00, 0xe0, 0x20, 0x5c, 0xff, 0x24, 0xa8, 0x34, + 0xc4, 0x40, 0x3c, 0x00, 0xfc, 0xf3, 0x00, 0x00, + 0x9c, 0x60, 0xf5, 0x24, 0xc4, 0x40, 0x9c, 0x61, + 0xfd, 0x24, 0xc4, 0x40, 0xdc, 0x61, 0xff, 0x24, + 0x29, 0x34, 0xc4, 0x40, 0x5c, 0x61, 0xff, 0x24, + 0x53, 0x34, 0xc4, 0x40, 0x00, 0x20, 0x0c, 0x33, + 0x11, 0xc3, 0x00, 0x29, 0x05, 0xd0, 0x00, 0x2a, + 0x03, 0xdc, 0x02, 0x21, 0x50, 0x42, 0x00, 0xf0, + 0x65, 0xfb, 0xb0, 0xbd, 0xac, 0x7e, 0x01, 0x00, + 0xb8, 0x52, 0x01, 0x00, 0x3c, 0x00, 0x38, 0xf4, + 0x00, 0x00, 0x10, 0xb5, 0x13, 0x4c, 0x13, 0x48, + 0x21, 0x1c, 0xff, 0x31, 0x69, 0x31, 0x0e, 0xc9, + 0x0e, 0xc0, 0x21, 0x1c, 0xff, 0x31, 0x24, 0x22, + 0x75, 0x31, 0x0f, 0x48, 0xf1, 0xf7, 0x51, 0xf8, + 0x21, 0x1c, 0xff, 0x31, 0x3c, 0x22, 0x99, 0x31, + 0x0d, 0x48, 0xf1, 0xf7, 0xa6, 0xf8, 0xfc, 0xf7, + 0xa2, 0xff, 0x21, 0x1c, 0xff, 0x31, 0x10, 0x22, + 0xd5, 0x31, 0x09, 0x48, 0xf1, 0xf7, 0x3c, 0x00, + 0x74, 0xf4, 0x00, 0x00, 0x41, 0xf8, 0x21, 0x1c, + 0xff, 0x31, 0x28, 0x22, 0xe5, 0x31, 0x07, 0x48, + 0xf1, 0xf7, 0x96, 0xf8, 0x10, 0xbd, 0x00, 0x00, + 0x40, 0x63, 0x01, 0x00, 0x00, 0x80, 0x07, 0x00, + 0x0c, 0x80, 0x07, 0x00, 0x30, 0x80, 0x07, 0x00, + 0x80, 0x80, 0x07, 0x00, 0xa0, 0x80, 0x07, 0x00, + 0xf8, 0xb5, 0x00, 0x28, 0x59, 0xd0, 0x04, 0xf0, + 0x4b, 0xf9, 0xf8, 0xf7, 0xb3, 0xfb, 0x00, 0x22, + 0x3c, 0x00, 0xb0, 0xf4, 0x00, 0x00, 0x01, 0x21, + 0x13, 0x20, 0x04, 0xf0, 0x7c, 0xf9, 0x2a, 0x49, + 0x29, 0x48, 0x49, 0x6c, 0x01, 0x60, 0x00, 0x21, + 0x29, 0x48, 0xc9, 0x43, 0x41, 0x60, 0x26, 0x4c, + 0x14, 0x34, 0x61, 0x6c, 0x81, 0x60, 0xa1, 0x6c, + 0xc1, 0x60, 0x00, 0x20, 0x25, 0x4d, 0x02, 0x26, + 0x01, 0x01, 0x6e, 0x50, 0x0a, 0x19, 0x4f, 0x19, + 0x50, 0x32, 0x04, 0x37, 0x0e, 0xca, 0x01, 0x30, + 0x08, 0x28, 0x3c, 0x00, 0xec, 0xf4, 0x00, 0x00, + 0x0e, 0xc7, 0xf4, 0xdb, 0x14, 0x22, 0x21, 0x1c, + 0xcc, 0x31, 0x1e, 0x48, 0xf1, 0xf7, 0x5a, 0xf8, + 0x1d, 0x48, 0x81, 0x78, 0x09, 0x09, 0x09, 0x01, + 0x81, 0x70, 0x00, 0x21, 0xc1, 0x70, 0x41, 0x70, + 0x21, 0x1c, 0xe0, 0x31, 0x0a, 0x78, 0x02, 0x70, + 0x49, 0x78, 0x41, 0x70, 0x21, 0x1c, 0xe8, 0x31, + 0x30, 0x22, 0x08, 0x30, 0xf1, 0xf7, 0x46, 0xf8, + 0x21, 0x1c, 0xff, 0x31, 0x3c, 0x00, 0x28, 0xf5, + 0x00, 0x00, 0x50, 0x22, 0x19, 0x31, 0x12, 0x48, + 0xf1, 0xf7, 0x3f, 0xf8, 0x83, 0x20, 0x80, 0x00, + 0x14, 0x22, 0x21, 0x18, 0x10, 0x48, 0xf1, 0xf7, + 0x38, 0xf8, 0x11, 0x20, 0x40, 0x01, 0x84, 0x22, + 0x21, 0x18, 0x0d, 0x48, 0xf1, 0xf7, 0x31, 0xf8, + 0xff, 0xf7, 0x73, 0xff, 0x20, 0x1c, 0xf1, 0xf7, + 0x28, 0xfd, 0xf8, 0xbd, 0xff, 0xf7, 0x6d, 0xff, + 0xfb, 0xe7, 0x08, 0x20, 0x07, 0x00, 0x3c, 0x00, + 0x64, 0xf5, 0x00, 0x00, 0x2c, 0x63, 0x01, 0x00, + 0x40, 0x20, 0x07, 0x00, 0x00, 0x30, 0x07, 0x00, + 0x00, 0x40, 0x07, 0x00, 0x00, 0x50, 0x07, 0x00, + 0x00, 0x60, 0x07, 0x00, 0x10, 0x00, 0x07, 0x00, + 0x00, 0x90, 0x07, 0x00, 0xf8, 0xb5, 0x05, 0x1c, + 0x18, 0x48, 0xc0, 0x68, 0x00, 0x28, 0x25, 0xd0, + 0x16, 0x4e, 0x01, 0x36, 0x74, 0x78, 0x30, 0x78, + 0x27, 0x1a, 0x79, 0x19, 0x20, 0x1c, 0xf1, 0xf7, + 0x3c, 0x00, 0xa0, 0xf5, 0x00, 0x00, 0x4b, 0xf8, + 0x00, 0x90, 0x29, 0x1c, 0x20, 0x1c, 0xf1, 0xf7, + 0xb2, 0xf8, 0xc1, 0x19, 0x20, 0x1c, 0xf1, 0xf7, + 0x42, 0xf8, 0x60, 0x1a, 0x30, 0x70, 0x70, 0x1e, + 0x80, 0x68, 0x00, 0x28, 0x0d, 0xd0, 0x53, 0x36, + 0xf4, 0x78, 0x00, 0x99, 0x20, 0x1c, 0xf1, 0xf7, + 0xa2, 0xf8, 0xb1, 0x78, 0x61, 0x1a, 0x41, 0x18, + 0x20, 0x1c, 0xf1, 0xf7, 0x9c, 0xf8, 0x60, 0x1a, + 0xb0, 0x70, 0x3c, 0x00, 0xdc, 0xf5, 0x00, 0x00, + 0x03, 0x48, 0x5c, 0x30, 0x01, 0x69, 0xc2, 0x68, + 0x69, 0x43, 0x51, 0x18, 0xc1, 0x60, 0xf8, 0xbd, + 0x44, 0x7d, 0x01, 0x00, 0xb0, 0xb5, 0x0c, 0x4d, + 0xe8, 0x68, 0x29, 0x69, 0x40, 0x18, 0x7d, 0x21, + 0x09, 0x01, 0x44, 0x18, 0x20, 0x1c, 0x03, 0xf0, + 0x0b, 0xfb, 0x00, 0x28, 0x0a, 0xd0, 0x03, 0xf0, + 0xcf, 0xfb, 0x01, 0x1b, 0x28, 0x69, 0xf1, 0xf7, + 0x7d, 0xf8, 0x01, 0x30, 0x3c, 0x00, 0x18, 0xf6, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x0c, 0xff, 0xf7, + 0xb2, 0xff, 0xb0, 0xbd, 0x00, 0x00, 0xa0, 0x7d, + 0x01, 0x00, 0x70, 0xb5, 0x10, 0x4c, 0x60, 0x68, + 0x80, 0x25, 0xa8, 0x43, 0x60, 0x60, 0x20, 0x68, + 0x28, 0x43, 0x20, 0x60, 0x0d, 0x4e, 0x30, 0x1c, + 0x10, 0x30, 0xf3, 0xf7, 0xc8, 0xfc, 0x00, 0x28, + 0x03, 0xd1, 0x07, 0x21, 0x85, 0x20, 0xf1, 0xf7, + 0x2a, 0xfe, 0x08, 0x48, 0x00, 0x21, 0x3c, 0x00, + 0x54, 0xf6, 0x00, 0x00, 0x80, 0x68, 0x41, 0x63, + 0xc0, 0x6c, 0x10, 0x30, 0x70, 0x61, 0x01, 0x20, + 0x30, 0x61, 0x20, 0x68, 0xa8, 0x43, 0x20, 0x60, + 0x70, 0xbd, 0x00, 0x00, 0xf4, 0x00, 0x07, 0x00, + 0x00, 0x30, 0x07, 0x00, 0x24, 0x7e, 0x01, 0x00, + 0x01, 0x1c, 0x00, 0x20, 0x05, 0x29, 0x80, 0xb5, + 0x09, 0xd2, 0x02, 0xa3, 0x5b, 0x5c, 0x5b, 0x00, + 0x9f, 0x44, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, + 0x3c, 0x00, 0x90, 0xf6, 0x00, 0x00, 0x03, 0x00, + 0xff, 0xf7, 0xcf, 0xfc, 0x80, 0xbd, 0x01, 0x22, + 0x92, 0x02, 0x80, 0xb5, 0x00, 0x21, 0x07, 0x20, + 0x04, 0xf0, 0xab, 0xf9, 0x80, 0xbd, 0x80, 0xb5, + 0x40, 0x22, 0x00, 0x21, 0x00, 0x20, 0x04, 0xf0, + 0xa4, 0xf9, 0x03, 0x22, 0x00, 0x21, 0x00, 0x20, + 0x04, 0xf0, 0x9f, 0xf9, 0x80, 0xbd, 0x70, 0xb5, + 0x0e, 0x1c, 0x05, 0x1c, 0x14, 0x1c, 0x08, 0x28, + 0x0e, 0xd1, 0x3c, 0x00, 0xcc, 0xf6, 0x00, 0x00, + 0x00, 0xf0, 0x00, 0xfc, 0x0e, 0x28, 0x01, 0xd1, + 0x14, 0x20, 0x00, 0xe0, 0x10, 0x20, 0xe1, 0x03, + 0x00, 0xd5, 0x01, 0x38, 0xc0, 0x06, 0x0a, 0x49, + 0xc0, 0x0e, 0x88, 0x71, 0x08, 0xe0, 0x09, 0x2d, + 0x06, 0xd1, 0xa0, 0x04, 0x01, 0xd5, 0x00, 0x20, + 0x00, 0xe0, 0x01, 0x20, 0xf3, 0xf7, 0xb0, 0xf9, + 0x34, 0x40, 0x21, 0x1c, 0x32, 0x1c, 0x28, 0x1c, + 0x04, 0xf0, 0x7a, 0xf9, 0x3c, 0x00, 0x08, 0xf7, + 0x00, 0x00, 0x70, 0xbd, 0x00, 0x00, 0x00, 0x80, + 0x07, 0x00, 0x70, 0xb5, 0x00, 0x24, 0x13, 0x29, + 0x11, 0xd8, 0x00, 0x28, 0x01, 0xd1, 0x08, 0x4e, + 0x08, 0x25, 0x01, 0x28, 0x01, 0xd1, 0x07, 0x4e, + 0x09, 0x25, 0x00, 0xf0, 0x78, 0xfa, 0x00, 0x28, + 0x05, 0xd0, 0x02, 0x1c, 0x31, 0x1c, 0x28, 0x1c, + 0xff, 0xf7, 0xc3, 0xff, 0x01, 0x24, 0x20, 0x1c, + 0x70, 0xbd, 0xf8, 0xff, 0x07, 0x00, 0x3c, 0x00, + 0x44, 0xf7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x01, 0x22, 0xd2, 0x02, 0x80, 0xb5, 0x00, 0x21, + 0x07, 0x20, 0x04, 0xf0, 0x53, 0xf9, 0x80, 0xbd, + 0x0f, 0x22, 0x12, 0x04, 0x07, 0x21, 0x49, 0x04, + 0x80, 0xb5, 0x09, 0x20, 0x04, 0xf0, 0x4a, 0xf9, + 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x00, 0x21, + 0x04, 0x20, 0x04, 0xf0, 0x1b, 0xfc, 0x40, 0x21, + 0x00, 0x20, 0x04, 0xf0, 0x17, 0xfc, 0x04, 0x49, + 0x3c, 0x00, 0x80, 0xf7, 0x00, 0x00, 0x00, 0x20, + 0x88, 0x60, 0x02, 0x48, 0x09, 0x69, 0x20, 0x30, + 0xff, 0xf7, 0x09, 0xfe, 0x80, 0xbd, 0x64, 0x73, + 0x01, 0x00, 0xb0, 0xb5, 0x60, 0x21, 0x00, 0x20, + 0x04, 0xf0, 0x07, 0xfc, 0x11, 0x4d, 0x00, 0x24, + 0x00, 0x22, 0x04, 0x20, 0x29, 0x5d, 0x04, 0xf0, + 0x28, 0xf9, 0x0c, 0x20, 0x03, 0xf0, 0x9b, 0xfb, + 0x01, 0x34, 0x24, 0x06, 0x24, 0x0e, 0x05, 0x2c, + 0xf2, 0xd3, 0x3c, 0x00, 0xbc, 0xf7, 0x00, 0x00, + 0x0f, 0x22, 0x00, 0x21, 0x0a, 0x20, 0x04, 0xf0, + 0x1b, 0xf9, 0x61, 0x21, 0x00, 0x20, 0x04, 0xf0, + 0xef, 0xfb, 0x06, 0x49, 0x01, 0x20, 0x88, 0x60, + 0x04, 0x48, 0x09, 0x69, 0x20, 0x30, 0xff, 0xf7, + 0xcd, 0xfd, 0xff, 0x20, 0x2d, 0x30, 0xb0, 0xbd, + 0xa8, 0x58, 0x01, 0x00, 0x64, 0x73, 0x01, 0x00, + 0xf8, 0xb5, 0x06, 0x1c, 0x12, 0x48, 0xc6, 0x70, + 0x01, 0x20, 0xff, 0xf7, 0x3c, 0x00, 0xf8, 0xf7, + 0x00, 0x00, 0xfd, 0xfb, 0x01, 0x27, 0xbf, 0x02, + 0x04, 0x1c, 0xb8, 0x43, 0x01, 0x1c, 0x01, 0x20, + 0x04, 0xf0, 0xd1, 0xfb, 0x03, 0x20, 0xff, 0xf7, + 0xf2, 0xfb, 0x05, 0x1c, 0xb8, 0x43, 0x01, 0x1c, + 0x03, 0x20, 0x04, 0xf0, 0xc8, 0xfb, 0x30, 0x1c, + 0x00, 0xf0, 0x9f, 0xf9, 0x00, 0xf0, 0x57, 0xf8, + 0x21, 0x1c, 0x01, 0x20, 0x04, 0xf0, 0xbf, 0xfb, + 0x29, 0x1c, 0x03, 0x20, 0x04, 0xf0, 0x3c, 0x00, + 0x34, 0xf8, 0x00, 0x00, 0xbb, 0xfb, 0x00, 0x20, + 0xf8, 0xbd, 0x00, 0x00, 0x64, 0x73, 0x01, 0x00, + 0x80, 0xb5, 0x00, 0x22, 0x40, 0x21, 0x00, 0x20, + 0x04, 0xf0, 0xd8, 0xf8, 0x80, 0xbd, 0x00, 0x00, + 0x70, 0xb5, 0x05, 0x1c, 0x01, 0x24, 0x09, 0x20, + 0xff, 0xf7, 0xcc, 0xfb, 0x0f, 0x21, 0x09, 0x04, + 0x88, 0x43, 0x03, 0x21, 0x89, 0x04, 0xe2, 0x04, + 0x05, 0x2d, 0x12, 0x4e, 0x20, 0xd2, 0x02, 0xa3, + 0x3c, 0x00, 0x70, 0xf8, 0x00, 0x00, 0x5b, 0x5d, + 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x00, 0x06, 0x09, + 0x0c, 0x10, 0x03, 0x00, 0x03, 0x21, 0x09, 0x04, + 0x0c, 0xe0, 0x01, 0x21, 0x09, 0x04, 0x09, 0xe0, + 0x01, 0x21, 0x49, 0x04, 0x06, 0xe0, 0xf3, 0x68, + 0x04, 0x2b, 0x05, 0xd9, 0x02, 0xe0, 0xf3, 0x68, + 0x04, 0x2b, 0x01, 0xd8, 0x01, 0x43, 0x01, 0xe0, + 0x10, 0x43, 0x01, 0x1c, 0x09, 0x20, 0x04, 0xf0, + 0x80, 0xfb, 0x3c, 0x00, 0xac, 0xf8, 0x00, 0x00, + 0x20, 0x1c, 0x70, 0xbd, 0x00, 0x24, 0xfb, 0xe7, + 0x64, 0x73, 0x01, 0x00, 0x01, 0x21, 0xc9, 0x05, + 0x00, 0x28, 0x80, 0xb5, 0x02, 0xd0, 0x0a, 0x1c, + 0x00, 0x21, 0x00, 0xe0, 0x00, 0x22, 0x04, 0x20, + 0x04, 0xf0, 0x96, 0xf8, 0x80, 0xbd, 0x00, 0x00, + 0xf0, 0xb5, 0x91, 0xb0, 0x00, 0x26, 0x40, 0x21, + 0x01, 0xa8, 0xf0, 0xf7, 0xdd, 0xfd, 0x2a, 0x4f, + 0xb8, 0x79, 0x01, 0x22, 0x3c, 0x00, 0xe8, 0xf8, + 0x00, 0x00, 0x52, 0x03, 0x00, 0x90, 0x00, 0x21, + 0x06, 0x20, 0x04, 0xf0, 0x84, 0xf8, 0x60, 0x21, + 0x00, 0x20, 0x04, 0xf0, 0x58, 0xfb, 0x61, 0x21, + 0x00, 0x20, 0x04, 0xf0, 0x54, 0xfb, 0x08, 0x20, + 0x03, 0xf0, 0xef, 0xfa, 0x00, 0x24, 0x0f, 0x20, + 0xff, 0xf7, 0x71, 0xfb, 0x40, 0x05, 0x05, 0x0f, + 0xa8, 0x00, 0x01, 0xa9, 0x09, 0x58, 0x01, 0xaa, + 0x01, 0x31, 0x01, 0x34, 0x0c, 0x2c, 0x3c, 0x00, + 0x24, 0xf9, 0x00, 0x00, 0x11, 0x50, 0xf1, 0xd3, + 0x00, 0x20, 0x81, 0x00, 0x01, 0xaa, 0x51, 0x58, + 0xb1, 0x42, 0x01, 0xd9, 0x0e, 0x1c, 0x05, 0x1c, + 0x01, 0x30, 0x10, 0x28, 0xf5, 0xd3, 0x06, 0x20, + 0xff, 0xf7, 0x58, 0xfb, 0x0f, 0x21, 0x49, 0x02, + 0x88, 0x43, 0x69, 0x02, 0x08, 0x43, 0x01, 0x21, + 0x49, 0x03, 0x01, 0x43, 0x06, 0x20, 0x04, 0xf0, + 0x29, 0xfb, 0x0d, 0x48, 0x84, 0x68, 0x64, 0x34, + 0x3c, 0x00, 0x60, 0xf9, 0x00, 0x00, 0x08, 0xe0, + 0x20, 0x1c, 0x03, 0xf0, 0x5a, 0xf9, 0x00, 0x28, + 0x03, 0xd0, 0x01, 0x21, 0x95, 0x20, 0xf1, 0xf7, + 0x98, 0xfc, 0x0f, 0x20, 0xff, 0xf7, 0x3d, 0xfb, + 0x00, 0x04, 0xf1, 0xd5, 0x87, 0x20, 0x03, 0xf0, + 0xb2, 0xfa, 0x00, 0x98, 0xb8, 0x71, 0x11, 0xb0, + 0xf0, 0xbd, 0x20, 0x10, 0x07, 0x00, 0x00, 0x01, + 0x07, 0x00, 0x10, 0xb5, 0x17, 0x4c, 0x61, 0x69, + 0x00, 0x29, 0x3c, 0x00, 0x9c, 0xf9, 0x00, 0x00, + 0x04, 0xd0, 0x0a, 0x21, 0x13, 0x20, 0x03, 0xf0, + 0x47, 0xfe, 0x10, 0xbd, 0x01, 0x1c, 0x12, 0x48, + 0x01, 0x29, 0x00, 0x78, 0x0c, 0xd0, 0x11, 0x29, + 0xf7, 0xd1, 0x05, 0x28, 0x03, 0xd1, 0x01, 0x21, + 0x13, 0x20, 0xf1, 0xf7, 0x71, 0xfc, 0x20, 0x78, + 0x07, 0x28, 0xee, 0xd1, 0x02, 0x21, 0x0a, 0xe0, + 0x05, 0x28, 0x07, 0xd0, 0x06, 0x28, 0x0a, 0xd0, + 0x07, 0x28, 0xf7, 0xd0, 0x3c, 0x00, 0xd8, 0xf9, + 0x00, 0x00, 0x08, 0x28, 0xe4, 0xd1, 0x00, 0x20, + 0x05, 0xe0, 0x01, 0x21, 0x13, 0x20, 0xf1, 0xf7, + 0x5e, 0xfc, 0x10, 0xbd, 0x01, 0x20, 0x02, 0xf0, + 0x6c, 0xfd, 0x10, 0xbd, 0x00, 0x00, 0x7c, 0x78, + 0x01, 0x00, 0x0d, 0x49, 0x80, 0xb5, 0x09, 0x78, + 0x03, 0x29, 0x01, 0xd1, 0x00, 0x28, 0x0b, 0xd0, + 0x07, 0x29, 0x01, 0xd1, 0x00, 0x28, 0x07, 0xd0, + 0x02, 0x29, 0x01, 0xd1, 0x00, 0x28, 0x3c, 0x00, + 0x14, 0xfa, 0x00, 0x00, 0x03, 0xd1, 0x05, 0x29, + 0x09, 0xd1, 0x00, 0x28, 0x07, 0xd0, 0x00, 0x20, + 0xfc, 0xf7, 0x28, 0xfd, 0x00, 0x22, 0x13, 0x21, + 0x11, 0x20, 0x03, 0xf0, 0xc1, 0xfe, 0x80, 0xbd, + 0x7c, 0x78, 0x01, 0x00, 0x80, 0xb5, 0x06, 0x22, + 0x08, 0x21, 0x00, 0x20, 0x03, 0xf0, 0xde, 0xff, + 0x80, 0xbd, 0x00, 0x00, 0x07, 0x48, 0x80, 0xb5, + 0x40, 0x69, 0x00, 0x28, 0x01, 0xd1, 0xf1, 0xf7, + 0x3c, 0x00, 0x50, 0xfa, 0x00, 0x00, 0x33, 0xff, + 0x05, 0x49, 0x05, 0x4a, 0x08, 0x68, 0x50, 0x61, + 0x48, 0x68, 0x90, 0x61, 0x01, 0x20, 0x80, 0xbd, + 0x00, 0x00, 0x64, 0x73, 0x01, 0x00, 0xb0, 0x58, + 0x01, 0x00, 0x10, 0x00, 0x07, 0x00, 0x07, 0x48, + 0x80, 0xb5, 0x40, 0x69, 0x00, 0x28, 0x01, 0xd1, + 0xf1, 0xf7, 0x1d, 0xff, 0x05, 0x49, 0x05, 0x4a, + 0x08, 0x68, 0x90, 0x61, 0x48, 0x68, 0x50, 0x61, + 0x01, 0x20, 0x3c, 0x00, 0x8c, 0xfa, 0x00, 0x00, + 0x80, 0xbd, 0x00, 0x00, 0x64, 0x73, 0x01, 0x00, + 0xb0, 0x58, 0x01, 0x00, 0x10, 0x00, 0x07, 0x00, + 0x11, 0xb5, 0x00, 0xab, 0x59, 0x78, 0x14, 0x48, + 0x01, 0x23, 0xc0, 0x56, 0x00, 0x22, 0x09, 0x18, + 0x0b, 0x06, 0x1b, 0x16, 0x13, 0x21, 0x13, 0x2b, + 0x02, 0xdd, 0x00, 0xab, 0x59, 0x70, 0x07, 0xe0, + 0x00, 0x2b, 0x02, 0xda, 0x00, 0xab, 0x5a, 0x70, + 0x02, 0xe0, 0x1c, 0x1c, 0x3c, 0x00, 0xc8, 0xfa, + 0x00, 0x00, 0x00, 0xab, 0x5c, 0x70, 0x00, 0xab, + 0x1b, 0x78, 0x18, 0x18, 0x00, 0x06, 0x00, 0x16, + 0x13, 0x28, 0x02, 0xdd, 0x00, 0xab, 0x19, 0x70, + 0x06, 0xe0, 0x00, 0x28, 0x02, 0xda, 0x00, 0xab, + 0x1a, 0x70, 0x01, 0xe0, 0x00, 0xab, 0x18, 0x70, + 0x00, 0x98, 0x18, 0xbd, 0x00, 0x00, 0x64, 0x73, + 0x01, 0x00, 0x38, 0xb5, 0x0c, 0x1c, 0x15, 0x49, + 0x00, 0xab, 0x49, 0x68, 0x13, 0x25, 0x3c, 0x00, + 0x04, 0xfb, 0x00, 0x00, 0x00, 0x91, 0x59, 0x78, + 0x09, 0x18, 0x59, 0x70, 0x19, 0x78, 0x08, 0x18, + 0x18, 0x70, 0x19, 0x88, 0x10, 0x48, 0x02, 0x2c, + 0xc1, 0x80, 0x01, 0xd0, 0x00, 0x2c, 0x0b, 0xd1, + 0x00, 0xab, 0x18, 0x78, 0x13, 0x28, 0x00, 0xd9, + 0x1d, 0x70, 0x00, 0xab, 0x19, 0x78, 0x00, 0x20, + 0xff, 0xf7, 0xee, 0xfd, 0x02, 0x2c, 0x01, 0xd0, + 0x01, 0x2c, 0x09, 0xd1, 0x00, 0xab, 0x58, 0x78, + 0x3c, 0x00, 0x40, 0xfb, 0x00, 0x00, 0x13, 0x28, + 0x00, 0xd9, 0x5d, 0x70, 0x00, 0xab, 0x59, 0x78, + 0x01, 0x20, 0xff, 0xf7, 0xe0, 0xfd, 0x38, 0xbd, + 0x00, 0x00, 0x64, 0x73, 0x01, 0x00, 0xa0, 0x58, + 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0xb0, 0xb5, + 0x04, 0x1c, 0x0e, 0x28, 0x13, 0x4d, 0x04, 0xd0, + 0x12, 0x49, 0xa0, 0x00, 0x00, 0x19, 0x4d, 0x39, + 0x45, 0x18, 0x06, 0x20, 0xff, 0xf7, 0x3d, 0xfa, + 0x0f, 0x49, 0x3c, 0x00, 0x7c, 0xfb, 0x00, 0x00, + 0xe0, 0x22, 0x09, 0x19, 0x10, 0x39, 0xc9, 0x7b, + 0x90, 0x43, 0x49, 0x01, 0x11, 0x40, 0x01, 0x43, + 0x06, 0x20, 0x04, 0xf0, 0x0d, 0xfa, 0x29, 0x1c, + 0x05, 0x20, 0x09, 0x4a, 0x03, 0xf0, 0x30, 0xff, + 0x08, 0x48, 0x1f, 0x22, 0x00, 0x19, 0x10, 0x38, + 0xc0, 0x7b, 0xc1, 0x04, 0xd2, 0x04, 0x08, 0x20, + 0x03, 0xf0, 0x26, 0xff, 0xb0, 0xbd, 0x00, 0x00, + 0xb4, 0x09, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xfb, + 0x00, 0x00, 0x14, 0x45, 0x01, 0x00, 0xff, 0x0f, + 0x00, 0x00, 0xc0, 0x58, 0x01, 0x00, 0x70, 0x47, + 0x00, 0x00, 0x80, 0xb5, 0x06, 0x49, 0x00, 0x28, + 0x01, 0xd1, 0x08, 0x68, 0x80, 0xbd, 0x01, 0x28, + 0x01, 0xd1, 0x48, 0x68, 0x80, 0xbd, 0xf1, 0xf7, + 0x90, 0xfb, 0x00, 0x20, 0x80, 0xbd, 0x7c, 0x73, + 0x01, 0x00, 0x01, 0x48, 0x40, 0x68, 0x70, 0x47, + 0x00, 0x00, 0xa0, 0x58, 0x01, 0x00, 0x3c, 0x00, + 0xf4, 0xfb, 0x00, 0x00, 0x04, 0x48, 0x01, 0x23, + 0x04, 0x49, 0xc0, 0x56, 0xc9, 0x56, 0x40, 0x18, + 0x00, 0x04, 0x00, 0x0c, 0x70, 0x47, 0x00, 0x00, + 0xa0, 0x58, 0x01, 0x00, 0xa2, 0x58, 0x01, 0x00, + 0x01, 0x48, 0x40, 0x68, 0x70, 0x47, 0x00, 0x00, + 0x64, 0x73, 0x01, 0x00, 0xf8, 0xb5, 0x05, 0x1c, + 0x0e, 0x1c, 0x00, 0xf0, 0x55, 0xf9, 0x04, 0x1c, + 0x00, 0xf0, 0x58, 0xf9, 0x00, 0x28, 0x2c, 0xd0, + 0x3c, 0x00, 0x30, 0xfc, 0x00, 0x00, 0xb3, 0x00, + 0x60, 0x1e, 0x00, 0x2d, 0x1c, 0x4e, 0x19, 0x49, + 0x1a, 0x4a, 0x06, 0xd1, 0x0b, 0x25, 0x0e, 0x2c, + 0x00, 0xd1, 0x19, 0x4a, 0xd2, 0x58, 0x08, 0x56, + 0x08, 0xe0, 0x01, 0x2d, 0x1c, 0xd1, 0x9a, 0x18, + 0x04, 0x36, 0x08, 0x18, 0x08, 0x25, 0x0e, 0x23, + 0x12, 0x6d, 0xc0, 0x56, 0x07, 0x1c, 0x47, 0x43, + 0xfb, 0x00, 0xdf, 0x19, 0x12, 0x4b, 0x3f, 0x21, + 0x58, 0x43, 0x3c, 0x00, 0x6c, 0xfc, 0x00, 0x00, + 0x11, 0x4b, 0xa9, 0x40, 0x0c, 0x1c, 0x38, 0x18, + 0xc0, 0x18, 0x14, 0x40, 0xec, 0x40, 0xc0, 0x11, + 0x60, 0x43, 0x1b, 0x0a, 0xc0, 0x18, 0x80, 0x12, + 0x03, 0xd1, 0x01, 0x20, 0x04, 0xe0, 0x00, 0x20, + 0xf8, 0xbd, 0x3f, 0x28, 0x00, 0xdd, 0x3f, 0x20, + 0x30, 0x60, 0xa8, 0x40, 0x08, 0x40, 0x8a, 0x43, + 0x10, 0x43, 0xf5, 0xe7, 0xcc, 0x59, 0x01, 0x00, + 0xdc, 0x58, 0x01, 0x00, 0x3c, 0x00, 0xa8, 0xfc, + 0x00, 0x00, 0x7c, 0x73, 0x01, 0x00, 0x7c, 0x59, + 0x01, 0x00, 0x06, 0x06, 0x00, 0x00, 0x26, 0x00, + 0x02, 0x00, 0x03, 0x48, 0x08, 0xb5, 0xc0, 0x88, + 0x00, 0xab, 0x18, 0x80, 0x00, 0x98, 0x08, 0xbd, + 0x00, 0x00, 0xa0, 0x58, 0x01, 0x00, 0xb0, 0xb5, + 0x0b, 0x4d, 0x09, 0x4c, 0x0e, 0x20, 0x6c, 0x60, + 0xff, 0xf7, 0x8d, 0xf9, 0x09, 0x49, 0x02, 0x1c, + 0xc8, 0x60, 0x01, 0x06, 0x09, 0x0e, 0x3c, 0x00, + 0xe4, 0xfc, 0x00, 0x00, 0x13, 0x3a, 0x02, 0x2a, + 0x02, 0xd9, 0x17, 0x38, 0x04, 0x28, 0x00, 0xd8, + 0x00, 0x21, 0x08, 0x1c, 0x6c, 0x60, 0xb0, 0xbd, + 0x04, 0x18, 0x02, 0x00, 0x60, 0x00, 0x07, 0x00, + 0x64, 0x73, 0x01, 0x00, 0x0a, 0x48, 0x98, 0xb5, + 0x02, 0x78, 0x13, 0x21, 0x14, 0x2a, 0x00, 0xd3, + 0x01, 0x70, 0x42, 0x78, 0x14, 0x2a, 0x00, 0xd3, + 0x41, 0x70, 0x06, 0x4c, 0x60, 0x68, 0xff, 0xf7, + 0x3c, 0x00, 0x20, 0xfd, 0x00, 0x00, 0xbd, 0xfe, + 0x00, 0x90, 0x00, 0xab, 0x18, 0x88, 0xe0, 0x80, + 0x00, 0xf0, 0x75, 0xff, 0x98, 0xbd, 0xa4, 0x58, + 0x01, 0x00, 0xa0, 0x58, 0x01, 0x00, 0x03, 0x48, + 0x80, 0xb5, 0x41, 0x78, 0x01, 0x20, 0xff, 0xf7, + 0xe6, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0xa6, 0x58, + 0x01, 0x00, 0x03, 0x48, 0x80, 0xb5, 0x01, 0x78, + 0x00, 0x20, 0xff, 0xf7, 0xdc, 0xfc, 0x80, 0xbd, + 0x00, 0x00, 0x3c, 0x00, 0x5c, 0xfd, 0x00, 0x00, + 0xa6, 0x58, 0x01, 0x00, 0xb0, 0xb5, 0x05, 0x4d, + 0x00, 0x24, 0x20, 0x1c, 0xff, 0xf7, 0x44, 0xf9, + 0x01, 0x34, 0x10, 0x2c, 0x01, 0xc5, 0xf8, 0xd3, + 0xb0, 0xbd, 0x00, 0x00, 0xd4, 0x44, 0x01, 0x00, + 0x04, 0x49, 0x80, 0xb5, 0x88, 0x70, 0x04, 0x49, + 0x80, 0x00, 0x09, 0x58, 0x07, 0x20, 0x04, 0xf0, + 0x0f, 0xf9, 0x80, 0xbd, 0x64, 0x73, 0x01, 0x00, + 0xd0, 0x58, 0x01, 0x00, 0x3c, 0x00, 0x98, 0xfd, + 0x00, 0x00, 0xb0, 0xb5, 0x3f, 0x24, 0x02, 0x1c, + 0x00, 0x2a, 0x01, 0xd1, 0x08, 0x20, 0x0b, 0x23, + 0x01, 0x2a, 0x01, 0xd1, 0x09, 0x20, 0x08, 0x23, + 0x25, 0x1c, 0x9d, 0x40, 0x00, 0x29, 0x00, 0xd1, + 0x01, 0x21, 0x3f, 0x29, 0x00, 0xd9, 0x21, 0x1c, + 0x99, 0x40, 0x0a, 0x1c, 0x29, 0x1c, 0xff, 0xf7, + 0x7c, 0xfc, 0xb0, 0xbd, 0x00, 0x00, 0x91, 0xb5, + 0x12, 0x49, 0x00, 0xab, 0x1a, 0x78, 0x3c, 0x00, + 0xd4, 0xfd, 0x00, 0x00, 0x08, 0x78, 0x11, 0x4c, + 0x80, 0x18, 0x00, 0x06, 0x00, 0x0e, 0x20, 0x70, + 0x49, 0x78, 0x5a, 0x78, 0x89, 0x18, 0x09, 0x06, + 0x09, 0x0e, 0x13, 0x22, 0x13, 0x28, 0x61, 0x70, + 0x00, 0xd9, 0x22, 0x70, 0x13, 0x29, 0x00, 0xd9, + 0x62, 0x70, 0x08, 0x49, 0x08, 0x48, 0x06, 0x39, + 0xc9, 0x88, 0x81, 0x80, 0x21, 0x78, 0x00, 0x20, + 0xff, 0xf7, 0x82, 0xfc, 0x61, 0x78, 0x01, 0x20, + 0x3c, 0x00, 0x10, 0xfe, 0x00, 0x00, 0xff, 0xf7, + 0x7e, 0xfc, 0x98, 0xbd, 0x00, 0x00, 0xa4, 0x58, + 0x01, 0x00, 0xa6, 0x58, 0x01, 0x00, 0x64, 0x73, + 0x01, 0x00, 0x70, 0xb5, 0x1d, 0x4d, 0x04, 0x1c, + 0x28, 0x78, 0x0e, 0x1c, 0x03, 0x28, 0x03, 0xd1, + 0x02, 0x21, 0x11, 0x20, 0xf1, 0xf7, 0x35, 0xfa, + 0x20, 0x1c, 0x00, 0xf0, 0x4e, 0xf8, 0x00, 0x28, + 0x25, 0xd0, 0x28, 0x78, 0x01, 0x28, 0x0a, 0xd1, + 0x68, 0x68, 0x3c, 0x00, 0x4c, 0xfe, 0x00, 0x00, + 0x00, 0x28, 0x07, 0xd0, 0x01, 0x21, 0x11, 0x20, + 0x03, 0xf0, 0xee, 0xfb, 0x01, 0x20, 0x69, 0x68, + 0xf0, 0xf7, 0xbd, 0xfa, 0x6c, 0x70, 0x6e, 0x60, + 0x20, 0x1c, 0xff, 0xf7, 0xc1, 0xfc, 0x04, 0x1c, + 0x00, 0xf0, 0xd4, 0xfe, 0x00, 0x2c, 0x02, 0xd0, + 0x68, 0x68, 0x00, 0x28, 0x02, 0xd1, 0xf6, 0xf7, + 0xd9, 0xf8, 0x70, 0xbd, 0x01, 0x20, 0x28, 0x70, + 0x01, 0x22, 0x21, 0x1c, 0x3c, 0x00, 0x88, 0xfe, + 0x00, 0x00, 0x11, 0x20, 0x03, 0xf0, 0x9f, 0xfb, + 0x70, 0xbd, 0x02, 0x21, 0x11, 0x20, 0xf1, 0xf7, + 0x06, 0xfa, 0x70, 0xbd, 0x00, 0x00, 0x9c, 0x73, + 0x01, 0x00, 0x80, 0xb5, 0x01, 0x28, 0x05, 0xd1, + 0x00, 0x29, 0x04, 0xd0, 0x01, 0x29, 0x01, 0xd1, + 0xf6, 0xf7, 0xbf, 0xf8, 0x80, 0xbd, 0x05, 0x49, + 0x08, 0x78, 0x03, 0x28, 0x02, 0xd0, 0x00, 0x20, + 0x08, 0x70, 0x80, 0xbd, 0x03, 0x21, 0x3c, 0x00, + 0xc4, 0xfe, 0x00, 0x00, 0x11, 0x20, 0xf1, 0xf7, + 0xed, 0xf9, 0x80, 0xbd, 0x9c, 0x73, 0x01, 0x00, + 0x01, 0x48, 0x40, 0x78, 0x70, 0x47, 0x00, 0x00, + 0x9c, 0x73, 0x01, 0x00, 0x01, 0x1c, 0x01, 0x39, + 0x01, 0x20, 0x0e, 0x29, 0x00, 0xd3, 0x00, 0x20, + 0x70, 0x47, 0x00, 0x00, 0x10, 0xb5, 0x13, 0x4c, + 0x20, 0x78, 0x01, 0x28, 0x0e, 0xd1, 0x60, 0x68, + 0x00, 0x28, 0x0d, 0xd0, 0x01, 0x21, 0x11, 0x20, + 0x3c, 0x00, 0x00, 0xff, 0x00, 0x00, 0x03, 0xf0, + 0x98, 0xfb, 0x01, 0x20, 0x61, 0x68, 0xf0, 0xf7, + 0x67, 0xfa, 0x00, 0x20, 0x60, 0x60, 0x20, 0x70, + 0x01, 0xe0, 0x03, 0x28, 0x0e, 0xd0, 0x00, 0x21, + 0x11, 0x20, 0x03, 0xf0, 0x8a, 0xfb, 0xff, 0xf7, + 0x24, 0xfc, 0xff, 0xf7, 0xc0, 0xfb, 0x05, 0x49, + 0x08, 0x7b, 0x40, 0x08, 0x40, 0x00, 0x08, 0x73, + 0x03, 0x20, 0x20, 0x70, 0x01, 0x20, 0x10, 0xbd, + 0x00, 0x00, 0x3c, 0x00, 0x3c, 0xff, 0x00, 0x00, + 0x9c, 0x73, 0x01, 0x00, 0x88, 0x00, 0x07, 0x00, + 0x10, 0xb5, 0x0d, 0x4c, 0x20, 0x78, 0x03, 0x28, + 0x13, 0xd1, 0x00, 0x20, 0x20, 0x70, 0x0b, 0x48, + 0x01, 0x7b, 0x01, 0x22, 0x11, 0x43, 0x01, 0x73, + 0xff, 0xf7, 0x70, 0xfc, 0xff, 0xf7, 0x18, 0xfc, + 0x00, 0x28, 0x06, 0xd0, 0x02, 0x21, 0x21, 0x70, + 0x01, 0x1c, 0x00, 0x22, 0x11, 0x20, 0x03, 0xf0, + 0x2b, 0xfb, 0x01, 0x20, 0x3c, 0x00, 0x78, 0xff, + 0x00, 0x00, 0x10, 0xbd, 0x00, 0x00, 0x9c, 0x73, + 0x01, 0x00, 0x88, 0x00, 0x07, 0x00, 0x80, 0xb5, + 0x05, 0x49, 0x00, 0x28, 0x04, 0xd0, 0x00, 0x20, + 0x08, 0x60, 0x03, 0xf0, 0x5a, 0xfa, 0x80, 0xbd, + 0x01, 0x20, 0x08, 0x60, 0x80, 0xbd, 0x80, 0x5a, + 0x01, 0x00, 0xfe, 0xb5, 0x05, 0x1c, 0x80, 0x35, + 0x04, 0x1c, 0xa8, 0x68, 0x29, 0x79, 0x06, 0x68, + 0x20, 0x1c, 0xa0, 0x30, 0x02, 0x29, 0x3c, 0x00, + 0xb4, 0xff, 0x00, 0x00, 0x1c, 0xd1, 0x69, 0x79, + 0x08, 0x29, 0x01, 0xd0, 0x0c, 0x29, 0x17, 0xd1, + 0x01, 0x21, 0x61, 0x62, 0xa9, 0x68, 0x09, 0x68, + 0x09, 0x8b, 0x01, 0x82, 0xa9, 0x69, 0x01, 0x91, + 0x00, 0x8a, 0xc0, 0x06, 0x05, 0xd5, 0x60, 0x68, + 0x00, 0x88, 0x40, 0x05, 0x01, 0xd4, 0x01, 0x20, + 0x00, 0xe0, 0x00, 0x20, 0x02, 0x90, 0x05, 0x20, + 0x01, 0xa9, 0x02, 0xf0, 0xb7, 0xf9, 0x02, 0xe0, + 0x3c, 0x00, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x21, + 0x61, 0x62, 0x01, 0x82, 0xa9, 0x68, 0x1a, 0x23, + 0x0a, 0x89, 0x67, 0x6a, 0x18, 0x1c, 0x00, 0x2f, + 0x00, 0xd1, 0x18, 0x20, 0x10, 0x1a, 0x08, 0x81, + 0xa8, 0x68, 0x01, 0x68, 0x62, 0x6a, 0x00, 0x2a, + 0x00, 0xd1, 0x18, 0x23, 0xc9, 0x18, 0x01, 0x60, + 0xa8, 0x68, 0x41, 0xc4, 0x30, 0x88, 0x08, 0x3c, + 0x40, 0x04, 0x03, 0xd5, 0x20, 0x1c, 0xf7, 0xf7, + 0xbc, 0xf9, 0x3c, 0x00, 0x2c, 0x00, 0x01, 0x00, + 0xfe, 0xbd, 0x00, 0x21, 0xe1, 0x61, 0x30, 0x79, + 0xc0, 0x07, 0x03, 0xd4, 0x20, 0x1c, 0xf7, 0xf7, + 0x91, 0xfe, 0xf5, 0xe7, 0x20, 0x1c, 0xf7, 0xf7, + 0x43, 0xff, 0xf1, 0xe7, 0xf7, 0xb5, 0x05, 0x1c, + 0x0a, 0x30, 0x06, 0x1c, 0xf5, 0xf7, 0xa4, 0xfa, + 0x14, 0x4f, 0x04, 0x1c, 0x39, 0x88, 0xf2, 0xf7, + 0x83, 0xfe, 0x32, 0x88, 0x78, 0x68, 0x02, 0x80, + 0x72, 0x88, 0x02, 0x30, 0x3c, 0x00, 0x68, 0x00, + 0x01, 0x00, 0x02, 0x80, 0xb1, 0x88, 0x41, 0x80, + 0x69, 0x88, 0x02, 0x9a, 0x20, 0x1c, 0xfa, 0xf7, + 0xce, 0xfe, 0x0b, 0x4d, 0x08, 0x35, 0x68, 0x80, + 0xfb, 0xf7, 0x2b, 0xfe, 0x01, 0x21, 0x09, 0x03, + 0x00, 0x28, 0x28, 0x88, 0x01, 0xd0, 0x88, 0x43, + 0x00, 0xe0, 0x08, 0x43, 0x28, 0x80, 0x04, 0x48, + 0x00, 0x22, 0x00, 0x21, 0x14, 0x30, 0xf2, 0xf7, + 0x32, 0xfe, 0x20, 0x1c, 0xfc, 0xf7, 0x3c, 0x00, + 0xa4, 0x00, 0x01, 0x00, 0x85, 0xfa, 0xfe, 0xbd, + 0x24, 0x7b, 0x01, 0x00, 0x10, 0xb5, 0x13, 0x4c, + 0x11, 0x49, 0x20, 0x1c, 0xff, 0x30, 0x69, 0x30, + 0x0e, 0xc9, 0x0e, 0xc0, 0x20, 0x1c, 0xff, 0x30, + 0x24, 0x22, 0x75, 0x30, 0x0e, 0x49, 0xf0, 0xf7, + 0x17, 0xfa, 0x20, 0x1c, 0xff, 0x30, 0x3c, 0x22, + 0x99, 0x30, 0x0c, 0x49, 0xf0, 0xf7, 0x6c, 0xfa, + 0x20, 0x1c, 0xff, 0x30, 0x10, 0x22, 0xd5, 0x30, + 0x3c, 0x00, 0xe0, 0x00, 0x01, 0x00, 0x09, 0x49, + 0xf0, 0xf7, 0x09, 0xfa, 0x20, 0x1c, 0xff, 0x30, + 0x28, 0x22, 0xe5, 0x30, 0x07, 0x49, 0xf0, 0xf7, + 0x5e, 0xfa, 0x10, 0xbd, 0x00, 0x00, 0x00, 0x80, + 0x07, 0x00, 0x40, 0x63, 0x01, 0x00, 0x0c, 0x80, + 0x07, 0x00, 0x30, 0x80, 0x07, 0x00, 0x80, 0x80, + 0x07, 0x00, 0xa0, 0x80, 0x07, 0x00, 0xb0, 0xb5, + 0x00, 0x28, 0x3f, 0xd0, 0x21, 0x48, 0x41, 0x68, + 0x21, 0x4c, 0x3c, 0x00, 0x1c, 0x01, 0x01, 0x00, + 0x61, 0x60, 0xc1, 0x68, 0xe1, 0x60, 0x01, 0x69, + 0x21, 0x61, 0x80, 0x6a, 0xa0, 0x62, 0x1e, 0x49, + 0x1c, 0x48, 0x09, 0x68, 0x14, 0x38, 0x41, 0x64, + 0x1c, 0x48, 0x25, 0x1c, 0x3c, 0x35, 0x0f, 0xc8, + 0x0f, 0xc5, 0x20, 0x1c, 0x80, 0x22, 0x4c, 0x30, + 0x19, 0x49, 0xf0, 0xf7, 0x33, 0xfa, 0x14, 0x22, + 0x20, 0x1c, 0xcc, 0x30, 0x17, 0x49, 0xf0, 0xf7, + 0x2d, 0xfa, 0x38, 0x22, 0x3c, 0x00, 0x58, 0x01, + 0x01, 0x00, 0x20, 0x1c, 0xe0, 0x30, 0x15, 0x49, + 0xf0, 0xf7, 0x27, 0xfa, 0x20, 0x1c, 0xff, 0x30, + 0x50, 0x22, 0x19, 0x30, 0x13, 0x49, 0xf0, 0xf7, + 0x20, 0xfa, 0x83, 0x20, 0x80, 0x00, 0x14, 0x22, + 0x20, 0x18, 0x10, 0x49, 0xf0, 0xf7, 0x19, 0xfa, + 0x11, 0x20, 0x40, 0x01, 0x84, 0x22, 0x20, 0x18, + 0x0e, 0x49, 0xf0, 0xf7, 0x12, 0xfa, 0xff, 0xf7, + 0x8e, 0xff, 0xf8, 0xf7, 0x94, 0xfb, 0x3c, 0x00, + 0x94, 0x01, 0x01, 0x00, 0xb0, 0xbd, 0xff, 0xf7, + 0x89, 0xff, 0xb0, 0xbd, 0x00, 0x10, 0x07, 0x00, + 0x40, 0x63, 0x01, 0x00, 0x08, 0x20, 0x07, 0x00, + 0x40, 0x20, 0x07, 0x00, 0x00, 0x30, 0x07, 0x00, + 0x00, 0x40, 0x07, 0x00, 0x00, 0x50, 0x07, 0x00, + 0x00, 0x60, 0x07, 0x00, 0x10, 0x00, 0x07, 0x00, + 0x00, 0x90, 0x07, 0x00, 0x0c, 0x49, 0x80, 0xb5, + 0x01, 0x20, 0x48, 0x60, 0x0a, 0x48, 0x14, 0x38, + 0x3c, 0x00, 0xd0, 0x01, 0x01, 0x00, 0x00, 0x78, + 0x01, 0x28, 0x04, 0xd0, 0x08, 0x48, 0x94, 0x38, + 0x40, 0x6f, 0x00, 0x28, 0x03, 0xd0, 0x00, 0x20, + 0x00, 0xf0, 0x1f, 0xf8, 0x80, 0xbd, 0x08, 0x68, + 0x00, 0x28, 0xfb, 0xd0, 0x03, 0x48, 0xf2, 0xf7, + 0x7a, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x98, 0x66, + 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0x80, 0xb5, + 0x00, 0x28, 0x09, 0xd1, 0xf2, 0x21, 0x0f, 0x20, + 0x03, 0xf0, 0x3c, 0x00, 0x0c, 0x02, 0x01, 0x00, + 0x13, 0xfa, 0x00, 0x22, 0x0f, 0x21, 0xf1, 0x20, + 0x03, 0xf0, 0xcc, 0xfa, 0x80, 0xbd, 0x01, 0x20, + 0xf8, 0xf7, 0x6a, 0xfe, 0x80, 0xbd, 0x00, 0x00, + 0x10, 0xb5, 0x04, 0x1c, 0x03, 0x20, 0x00, 0xf0, + 0xc9, 0xf9, 0x00, 0x21, 0x0f, 0x20, 0x03, 0xf0, + 0xff, 0xf9, 0xff, 0xf7, 0x65, 0xf8, 0x0b, 0x49, + 0x00, 0x20, 0x48, 0x74, 0xfb, 0xf7, 0xe6, 0xfa, + 0x09, 0x48, 0x00, 0x68, 0x3c, 0x00, 0x48, 0x02, + 0x01, 0x00, 0x00, 0x28, 0x03, 0xdc, 0x02, 0x21, + 0x40, 0x42, 0xff, 0xf7, 0x52, 0xfc, 0x04, 0x48, + 0x14, 0x30, 0x00, 0x68, 0x00, 0x28, 0x02, 0xd0, + 0x20, 0x1c, 0xf2, 0xf7, 0x42, 0xfe, 0x10, 0xbd, + 0x00, 0x00, 0x84, 0x66, 0x01, 0x00, 0xd4, 0x7e, + 0x01, 0x00, 0x06, 0x49, 0x80, 0xb5, 0x09, 0x78, + 0x04, 0x29, 0x05, 0xd0, 0x05, 0x29, 0x03, 0xd0, + 0x06, 0x29, 0x01, 0xd0, 0x07, 0x29, 0x3c, 0x00, + 0x84, 0x02, 0x01, 0x00, 0x01, 0xd1, 0xfe, 0xf7, + 0xbd, 0xfd, 0x80, 0xbd, 0x74, 0x66, 0x01, 0x00, + 0x10, 0xb5, 0x09, 0x4c, 0xe0, 0x68, 0x00, 0x28, + 0x0b, 0xd1, 0x07, 0x48, 0x2c, 0x38, 0x00, 0x8a, + 0xc0, 0x07, 0x04, 0xd5, 0x00, 0x21, 0x01, 0x20, + 0x62, 0x68, 0xf9, 0xf7, 0xc9, 0xfa, 0x01, 0x20, + 0xe0, 0x60, 0x01, 0x20, 0x10, 0xbd, 0x00, 0x00, + 0xf4, 0x6e, 0x01, 0x00, 0x8c, 0xb5, 0x02, 0x1c, + 0x3c, 0x00, 0xc0, 0x02, 0x01, 0x00, 0x08, 0x1c, + 0x11, 0x1c, 0xfd, 0xf7, 0x28, 0xff, 0x01, 0x90, + 0x00, 0x28, 0x05, 0xd0, 0x17, 0x20, 0x00, 0xab, + 0x18, 0x80, 0x68, 0x46, 0xfd, 0xf7, 0xff, 0xf8, + 0x8c, 0xbd, 0xf1, 0xb5, 0x2e, 0x4c, 0xae, 0xb0, + 0x00, 0x25, 0x25, 0x63, 0x20, 0x69, 0x01, 0x28, + 0x03, 0xd1, 0x01, 0xa8, 0x01, 0xf0, 0xa1, 0xf8, + 0x4e, 0xe0, 0x01, 0x26, 0x28, 0x4f, 0x26, 0x70, + 0x50, 0x3f, 0x3c, 0x00, 0xfc, 0x02, 0x01, 0x00, + 0xb8, 0x69, 0xf8, 0xf7, 0x4f, 0xf8, 0x25, 0x49, + 0x2c, 0x39, 0x00, 0x28, 0x1d, 0xd0, 0xe0, 0x6a, + 0x01, 0x28, 0x1a, 0xd1, 0x08, 0x8a, 0x0f, 0x1c, + 0x80, 0x07, 0x04, 0xd5, 0x00, 0x21, 0x02, 0x20, + 0x62, 0x68, 0xf9, 0xf7, 0x8f, 0xfa, 0x38, 0x8a, + 0x00, 0x07, 0x07, 0xd5, 0xe0, 0x68, 0x01, 0x28, + 0x04, 0xd1, 0x00, 0x21, 0x08, 0x20, 0x62, 0x68, + 0xf9, 0xf7, 0x84, 0xfa, 0x3c, 0x00, 0x38, 0x03, + 0x01, 0x00, 0x00, 0x22, 0x18, 0x21, 0x82, 0x20, + 0x26, 0x63, 0x03, 0xf0, 0x36, 0xfa, 0x25, 0xe0, + 0x08, 0x8a, 0x0e, 0x1c, 0x80, 0x07, 0x04, 0xd5, + 0x00, 0x21, 0x02, 0x20, 0x62, 0x68, 0xf9, 0xf7, + 0x74, 0xfa, 0x30, 0x8a, 0x00, 0x07, 0x07, 0xd5, + 0xe0, 0x68, 0x01, 0x28, 0x04, 0xd1, 0x00, 0x21, + 0x08, 0x20, 0x62, 0x68, 0xf9, 0xf7, 0x69, 0xfa, + 0x30, 0x8a, 0x40, 0x07, 0x04, 0xd5, 0x3c, 0x00, + 0x74, 0x03, 0x01, 0x00, 0x00, 0x22, 0x00, 0x21, + 0x04, 0x20, 0xf9, 0xf7, 0x61, 0xfa, 0x2e, 0x98, + 0x01, 0x28, 0x04, 0xd0, 0x1e, 0x95, 0x09, 0x21, + 0x1b, 0xa8, 0xff, 0xf7, 0x97, 0xff, 0xe5, 0x62, + 0xbd, 0x61, 0xe5, 0x60, 0x2f, 0xb0, 0xf0, 0xbd, + 0xf4, 0x6e, 0x01, 0x00, 0x80, 0xb5, 0x07, 0x20, + 0xfe, 0xf7, 0xa0, 0xfe, 0x00, 0x21, 0x0f, 0x20, + 0x03, 0xf0, 0x44, 0xf9, 0x0c, 0x48, 0x01, 0x78, + 0x3c, 0x00, 0xb0, 0x03, 0x01, 0x00, 0x00, 0x29, + 0x0f, 0xd0, 0x02, 0x21, 0x01, 0x70, 0x88, 0x38, + 0x00, 0x78, 0x00, 0x28, 0x04, 0xd0, 0x07, 0x49, + 0x10, 0x31, 0x48, 0x7c, 0x01, 0x30, 0x48, 0x74, + 0xf2, 0x22, 0x0f, 0x20, 0x05, 0x49, 0x03, 0xf0, + 0xfc, 0xf8, 0x00, 0x22, 0x0f, 0x21, 0xf3, 0x20, + 0x03, 0xf0, 0xe9, 0xf9, 0x80, 0xbd, 0x74, 0x66, + 0x01, 0x00, 0x80, 0x84, 0x1e, 0x00, 0x10, 0xb5, + 0x04, 0x1c, 0x3c, 0x00, 0xec, 0x03, 0x01, 0x00, + 0xf2, 0x21, 0x0f, 0x20, 0x03, 0xf0, 0x20, 0xf9, + 0x01, 0x2c, 0x0a, 0xd1, 0x08, 0x48, 0x08, 0x49, + 0x00, 0x68, 0x14, 0x39, 0x00, 0x28, 0x05, 0xd0, + 0xc8, 0x78, 0x02, 0x28, 0x02, 0xd1, 0xf7, 0xf7, + 0xaf, 0xfa, 0x10, 0xbd, 0x00, 0x20, 0x48, 0x70, + 0x05, 0x20, 0xfe, 0xf7, 0x65, 0xfe, 0x10, 0xbd, + 0x98, 0x66, 0x01, 0x00, 0xf8, 0xb5, 0x28, 0x4e, + 0x30, 0x21, 0x35, 0x1c, 0x3c, 0x00, 0x28, 0x04, + 0x01, 0x00, 0x60, 0x35, 0x28, 0x89, 0x89, 0x5d, + 0x88, 0x42, 0x03, 0xd1, 0x00, 0x20, 0xff, 0xf7, + 0xf6, 0xfe, 0xf8, 0xbd, 0x34, 0x1c, 0x70, 0x34, + 0x01, 0x21, 0x21, 0x70, 0x41, 0x18, 0x80, 0x19, + 0x30, 0x30, 0x29, 0x81, 0x40, 0x78, 0x1d, 0x4f, + 0x18, 0x3f, 0x38, 0x70, 0x00, 0x28, 0x08, 0xd0, + 0x00, 0x21, 0xfb, 0xf7, 0xc2, 0xf9, 0x00, 0x28, + 0x07, 0xd1, 0x20, 0x78, 0xff, 0xf7, 0x3c, 0x00, + 0x64, 0x04, 0x01, 0x00, 0x9b, 0xff, 0xe7, 0xe7, + 0x01, 0x21, 0x0f, 0x20, 0xf0, 0xf7, 0x1a, 0xff, + 0x14, 0x48, 0x01, 0x21, 0x80, 0x30, 0x81, 0x70, + 0x38, 0x69, 0xfb, 0xf7, 0x55, 0xfa, 0x20, 0x73, + 0x00, 0x21, 0x0f, 0x20, 0x03, 0xf0, 0xd6, 0xf8, + 0x70, 0x7a, 0x01, 0x28, 0x0e, 0xd1, 0x0e, 0x48, + 0x00, 0x68, 0x00, 0x28, 0x04, 0xd0, 0x38, 0x78, + 0x02, 0xf0, 0xda, 0xfa, 0x00, 0x28, 0x05, 0xd0, + 0x3c, 0x00, 0xa0, 0x04, 0x01, 0x00, 0x30, 0x7f, + 0x60, 0x73, 0x03, 0x20, 0x20, 0x70, 0x71, 0x89, + 0x05, 0xe0, 0x05, 0x20, 0x20, 0x70, 0xa8, 0x88, + 0xfa, 0xf7, 0x3b, 0xfb, 0x01, 0x1c, 0x00, 0x22, + 0x0f, 0x20, 0x03, 0xf0, 0x86, 0xf8, 0xba, 0xe7, + 0x00, 0x00, 0x04, 0x66, 0x01, 0x00, 0xe4, 0x62, + 0x01, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0x02, 0xf0, + 0x6c, 0xfc, 0x36, 0x4b, 0x19, 0x1c, 0xa0, 0x31, + 0x0a, 0x78, 0x3c, 0x00, 0xdc, 0x04, 0x01, 0x00, + 0x10, 0x2a, 0x02, 0xd2, 0x0a, 0x79, 0x10, 0x2a, + 0x01, 0xd3, 0x01, 0x25, 0x00, 0xe0, 0x00, 0x25, + 0x30, 0x4e, 0xca, 0x79, 0x80, 0x36, 0x01, 0x2c, + 0x12, 0xd0, 0x00, 0x25, 0x02, 0x2c, 0x2e, 0xd0, + 0x04, 0x2c, 0x3c, 0xd1, 0x5c, 0x6b, 0x00, 0x2c, + 0x39, 0xd1, 0x9c, 0x6f, 0x00, 0x1b, 0x2a, 0x4c, + 0xa0, 0x42, 0x34, 0xd9, 0xb2, 0x68, 0x98, 0x6a, + 0x82, 0x42, 0x31, 0xd0, 0x3c, 0x00, 0x18, 0x05, + 0x01, 0x00, 0x4d, 0x72, 0x34, 0xe0, 0xb0, 0x68, + 0x9c, 0x6a, 0x02, 0x22, 0xa0, 0x42, 0x21, 0xd1, + 0x58, 0x6b, 0x00, 0x28, 0x1e, 0xd1, 0x00, 0x2d, + 0x1c, 0xd1, 0x48, 0x7a, 0x19, 0x28, 0x20, 0xd0, + 0x34, 0x68, 0x98, 0x6f, 0x64, 0x00, 0x00, 0x1b, + 0x74, 0x68, 0x00, 0x19, 0xff, 0x30, 0x1c, 0x4c, + 0x39, 0x30, 0xa0, 0x42, 0x16, 0xd2, 0x48, 0x79, + 0x8c, 0x79, 0x00, 0x19, 0x30, 0x28, 0x3c, 0x00, + 0x54, 0x05, 0x01, 0x00, 0x11, 0xd3, 0x10, 0x22, + 0x0f, 0xe0, 0x5c, 0x6b, 0x01, 0x2c, 0x06, 0xd1, + 0xb0, 0x68, 0x9a, 0x6a, 0x90, 0x42, 0x00, 0xd1, + 0x4d, 0x72, 0x00, 0x22, 0x05, 0xe0, 0x9c, 0x6f, + 0x00, 0x1b, 0x12, 0x4c, 0xa0, 0x42, 0x00, 0xd3, + 0x20, 0x22, 0x06, 0xe0, 0x4a, 0x7a, 0x19, 0x2a, + 0x01, 0xd2, 0x01, 0x32, 0x4a, 0x72, 0x20, 0x22, + 0xb0, 0x60, 0x30, 0x68, 0x9b, 0x6f, 0x98, 0x42, + 0x3c, 0x00, 0x90, 0x05, 0x01, 0x00, 0x04, 0xd1, + 0x00, 0x2a, 0x00, 0xd1, 0x48, 0x79, 0x4a, 0x71, + 0x06, 0xe0, 0x10, 0x2a, 0x04, 0xd3, 0x70, 0x60, + 0x33, 0x60, 0x48, 0x79, 0x88, 0x71, 0xf6, 0xe7, + 0xca, 0x71, 0x70, 0xbd, 0x00, 0x00, 0xa4, 0x6c, + 0x01, 0x00, 0xa3, 0x04, 0x00, 0x00, 0x71, 0x02, + 0x00, 0x00, 0x35, 0x0c, 0x00, 0x00, 0x05, 0x48, + 0x80, 0xb5, 0x81, 0x7b, 0x00, 0x29, 0x05, 0xd0, + 0x00, 0x21, 0x3c, 0x00, 0xcc, 0x05, 0x01, 0x00, + 0x81, 0x73, 0x03, 0x49, 0x0f, 0x20, 0x01, 0xf0, + 0x0f, 0xff, 0x80, 0xbd, 0x74, 0x66, 0x01, 0x00, + 0xe9, 0x03, 0x01, 0x00, 0xf8, 0xb5, 0x04, 0x1c, + 0x02, 0xf0, 0xe2, 0xfb, 0x05, 0x1c, 0x38, 0x4e, + 0x20, 0x1c, 0x37, 0x49, 0x34, 0x1c, 0xa0, 0x34, + 0x10, 0x22, 0x44, 0x39, 0x01, 0x28, 0x2c, 0xd0, + 0x04, 0x28, 0x4e, 0xd1, 0x37, 0x1c, 0x74, 0x36, + 0x09, 0xce, 0x26, 0x78, 0x3c, 0x00, 0x08, 0x06, + 0x01, 0x00, 0xc0, 0x1a, 0x20, 0x2e, 0x04, 0xd1, + 0x30, 0x4e, 0xb0, 0x42, 0x01, 0xd9, 0x00, 0x26, + 0x4e, 0x61, 0x3e, 0x1c, 0x3f, 0x6c, 0x00, 0x2f, + 0x48, 0xd1, 0x77, 0x6c, 0x00, 0x2f, 0x45, 0xd1, + 0xb7, 0x6a, 0x00, 0x2f, 0x3d, 0xd0, 0x77, 0x6b, + 0x00, 0x2f, 0x3a, 0xd0, 0x27, 0x4f, 0xb8, 0x42, + 0x37, 0xd2, 0x60, 0x78, 0x10, 0x28, 0x06, 0xd3, + 0xf0, 0x6f, 0x18, 0x1a, 0x24, 0x4b, 0x3c, 0x00, + 0x44, 0x06, 0x01, 0x00, 0x98, 0x42, 0x01, 0xd2, + 0xe2, 0x70, 0xf5, 0x66, 0x48, 0x69, 0x06, 0x28, + 0x2f, 0xd2, 0x01, 0x30, 0x2c, 0xe0, 0x20, 0x78, + 0x20, 0x28, 0x01, 0xd1, 0x06, 0x23, 0x4b, 0x61, + 0x02, 0x23, 0x23, 0x71, 0xb3, 0x6a, 0x00, 0x2b, + 0x19, 0xd0, 0x49, 0x69, 0x03, 0x29, 0x16, 0xd9, + 0x71, 0x6b, 0x73, 0x6d, 0x59, 0x40, 0x12, 0xd0, + 0xe1, 0x78, 0x10, 0x29, 0x10, 0xd3, 0x61, 0x78, + 0x3c, 0x00, 0x80, 0x06, 0x01, 0x00, 0x33, 0x1c, + 0x10, 0x29, 0x0c, 0xd3, 0xd9, 0x6f, 0x69, 0x1a, + 0x13, 0x4d, 0xa9, 0x42, 0x07, 0xd2, 0x58, 0x6c, + 0x00, 0x28, 0x02, 0xd0, 0x98, 0x6c, 0x00, 0x28, + 0x00, 0xd1, 0x22, 0x71, 0xf8, 0xbd, 0x02, 0x28, + 0xfc, 0xd1, 0x22, 0x70, 0xfa, 0xe7, 0x48, 0x69, + 0x00, 0x28, 0x01, 0xd0, 0x01, 0x38, 0x48, 0x61, + 0x0a, 0x49, 0xf0, 0x6e, 0x40, 0x18, 0x02, 0xf0, + 0xb0, 0xfa, 0x3c, 0x00, 0xbc, 0x06, 0x01, 0x00, + 0x00, 0x28, 0xee, 0xd0, 0x01, 0x20, 0xe0, 0x70, + 0x06, 0x48, 0x28, 0x18, 0xf0, 0x66, 0xe8, 0xe7, + 0xa4, 0x6c, 0x01, 0x00, 0xe2, 0x04, 0x00, 0x00, + 0x1a, 0x06, 0x00, 0x00, 0x53, 0x07, 0x00, 0x00, + 0x00, 0x2d, 0x31, 0x01, 0x00, 0x5a, 0x62, 0x02, + 0x80, 0xb5, 0x41, 0x68, 0x09, 0x79, 0xc9, 0x07, + 0x13, 0xd5, 0xc1, 0x69, 0x00, 0x29, 0x0d, 0xd0, + 0x89, 0x79, 0x02, 0x29, 0x3c, 0x00, 0xf8, 0x06, + 0x01, 0x00, 0x0a, 0xd1, 0x08, 0x21, 0x01, 0x86, + 0x01, 0x1c, 0x38, 0x31, 0x81, 0x62, 0x02, 0x1c, + 0x06, 0x48, 0x04, 0x49, 0xf9, 0xf7, 0xfd, 0xfc, + 0x80, 0xbd, 0xf7, 0xf7, 0xdc, 0xfb, 0x80, 0xbd, + 0xf7, 0xf7, 0x23, 0xfb, 0x80, 0xbd, 0xb9, 0x71, + 0x00, 0x00, 0xa0, 0x6a, 0x01, 0x00, 0x10, 0xb5, + 0x00, 0x24, 0x00, 0x28, 0x03, 0xd0, 0x02, 0xf0, + 0xe8, 0xfe, 0x00, 0x28, 0x17, 0xd0, 0x3c, 0x00, + 0x34, 0x07, 0x01, 0x00, 0x0c, 0x4c, 0x01, 0x20, + 0xa0, 0x72, 0x20, 0x68, 0x00, 0x21, 0x41, 0x62, + 0x0a, 0x49, 0x02, 0x68, 0xc9, 0x78, 0x60, 0x32, + 0x91, 0x71, 0x21, 0x89, 0x01, 0x31, 0x21, 0x81, + 0x00, 0x68, 0x40, 0x30, 0x81, 0x83, 0xfb, 0xf7, + 0x31, 0xfc, 0x20, 0x68, 0x00, 0x68, 0xfc, 0xf7, + 0xa1, 0xf9, 0x01, 0x24, 0x20, 0x1c, 0x10, 0xbd, + 0x14, 0x7a, 0x01, 0x00, 0x0e, 0x61, 0x01, 0x00, + 0x3c, 0x00, 0x70, 0x07, 0x01, 0x00, 0x7f, 0xb5, + 0x06, 0x1c, 0x1e, 0x48, 0x1d, 0x1c, 0x43, 0x88, + 0x02, 0x88, 0x1c, 0x21, 0x00, 0x20, 0x90, 0xb0, + 0xf0, 0xf7, 0x45, 0xff, 0x03, 0x90, 0x04, 0x68, + 0xff, 0x21, 0x01, 0x31, 0x21, 0x80, 0x08, 0x20, + 0x60, 0x80, 0x06, 0x20, 0x20, 0x71, 0x04, 0x20, + 0x60, 0x71, 0xc0, 0x01, 0x00, 0x2d, 0x00, 0xd1, + 0x08, 0x1c, 0xe0, 0x80, 0x01, 0xa8, 0x02, 0x30, + 0x31, 0x1c, 0x3c, 0x00, 0xac, 0x07, 0x01, 0x00, + 0x05, 0x1c, 0xfa, 0xf7, 0x5f, 0xfa, 0x10, 0x49, + 0x68, 0x46, 0xfa, 0xf7, 0x5b, 0xfa, 0x20, 0x1c, + 0x08, 0x30, 0x69, 0x46, 0xfa, 0xf7, 0x56, 0xfa, + 0x29, 0x1c, 0x20, 0x1c, 0x12, 0x30, 0xfa, 0xf7, + 0x51, 0xfa, 0x10, 0xab, 0x98, 0x88, 0x00, 0x22, + 0x01, 0x21, 0x20, 0x83, 0xd8, 0x88, 0x60, 0x83, + 0x18, 0x89, 0xe0, 0x81, 0x58, 0x89, 0x20, 0x82, + 0x68, 0x46, 0xf9, 0xf7, 0x3c, 0x00, 0xe8, 0x07, + 0x01, 0x00, 0x17, 0xff, 0x14, 0xb0, 0x70, 0xbd, + 0x00, 0x00, 0x14, 0x6e, 0x01, 0x00, 0x12, 0x61, + 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x18, 0x48, + 0x25, 0x1c, 0x00, 0x78, 0x60, 0x35, 0x80, 0x07, + 0x00, 0x28, 0x08, 0xda, 0xe8, 0x79, 0x00, 0x28, + 0x05, 0xd0, 0xf4, 0xf7, 0x70, 0xff, 0x01, 0x1c, + 0x20, 0x1c, 0x00, 0xf0, 0x78, 0xf9, 0x29, 0x88, + 0x2e, 0x20, 0x00, 0x5d, 0xf2, 0xf7, 0x3c, 0x00, + 0x24, 0x08, 0x01, 0x00, 0x9f, 0xfa, 0xe8, 0x79, + 0x00, 0x28, 0x0b, 0xd1, 0x20, 0x1c, 0x40, 0x30, + 0x01, 0x8b, 0x22, 0x69, 0x11, 0x80, 0x41, 0x8b, + 0x22, 0x69, 0x51, 0x80, 0x80, 0x8b, 0x21, 0x69, + 0xc8, 0x82, 0x07, 0xe0, 0x01, 0x28, 0x05, 0xd1, + 0x20, 0x69, 0x01, 0x22, 0x01, 0x88, 0xd2, 0x02, + 0x11, 0x43, 0x01, 0x80, 0x6a, 0x7a, 0xe0, 0x68, + 0x02, 0x49, 0xf2, 0xf7, 0x53, 0xfa, 0xb0, 0xbd, + 0x3c, 0x00, 0x60, 0x08, 0x01, 0x00, 0x1d, 0x75, + 0x01, 0x00, 0xd1, 0x4f, 0x00, 0x00, 0x90, 0xb5, + 0x04, 0x1c, 0x38, 0x23, 0x0c, 0x49, 0x58, 0x43, + 0x43, 0x18, 0x85, 0xb0, 0x00, 0x20, 0x0a, 0x49, + 0x02, 0x90, 0x18, 0x1c, 0x01, 0x22, 0x03, 0x91, + 0x09, 0x49, 0x04, 0x92, 0x30, 0x30, 0x42, 0x78, + 0x09, 0x88, 0x01, 0x92, 0x00, 0x91, 0x01, 0x78, + 0x5a, 0x6b, 0x0c, 0x33, 0x20, 0x1c, 0xfb, 0xf7, + 0x7c, 0xf8, 0x3c, 0x00, 0x9c, 0x08, 0x01, 0x00, + 0x05, 0xb0, 0x90, 0xbd, 0xd4, 0xe4, 0x01, 0x00, + 0x5d, 0x4e, 0x00, 0x00, 0x48, 0x7b, 0x01, 0x00, + 0x90, 0xb5, 0x85, 0xb0, 0x03, 0x1c, 0x00, 0x20, + 0x02, 0x90, 0x0a, 0x49, 0x18, 0x1c, 0x00, 0x22, + 0x04, 0x92, 0x60, 0x30, 0x03, 0x91, 0xc2, 0x79, + 0x01, 0x88, 0x01, 0x92, 0x00, 0x91, 0x5a, 0x6a, + 0xdc, 0x68, 0x20, 0x33, 0x99, 0x7b, 0x40, 0x7a, + 0x23, 0x1c, 0xfb, 0xf7, 0x3c, 0x00, 0xd8, 0x08, + 0x01, 0x00, 0x5d, 0xf8, 0x05, 0xb0, 0x90, 0xbd, + 0x00, 0x00, 0x0d, 0x4f, 0x00, 0x00, 0x07, 0x49, + 0x80, 0xb5, 0x88, 0x6a, 0x00, 0x28, 0x08, 0xd1, + 0x01, 0x20, 0x88, 0x62, 0xf0, 0xf7, 0xaf, 0xfc, + 0x01, 0x1c, 0x03, 0x48, 0x00, 0x22, 0xf2, 0xf7, + 0xb8, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x78, 0x69, + 0x01, 0x00, 0x41, 0xe4, 0x00, 0x00, 0xf0, 0xb5, + 0x9b, 0xb0, 0x00, 0x28, 0x20, 0xd0, 0x3c, 0x00, + 0x14, 0x09, 0x01, 0x00, 0x01, 0x1c, 0x08, 0xa8, + 0xfc, 0xf7, 0xb2, 0xfd, 0x01, 0x20, 0x11, 0x90, + 0x03, 0x20, 0x10, 0xad, 0x28, 0x72, 0x04, 0x20, + 0x68, 0x72, 0x05, 0xa8, 0x00, 0x22, 0x69, 0x46, + 0xf4, 0xf7, 0x00, 0xff, 0x00, 0x24, 0x00, 0x26, + 0x05, 0xa9, 0x00, 0x20, 0xf9, 0xf7, 0xfc, 0xfa, + 0x69, 0x46, 0xf9, 0xf7, 0xf9, 0xfa, 0x0b, 0x90, + 0x08, 0xa8, 0xfc, 0xf7, 0xbb, 0xfd, 0x01, 0x34, + 0x3c, 0x00, 0x50, 0x09, 0x01, 0x00, 0x02, 0x2c, + 0x2e, 0x72, 0xf0, 0xdb, 0x1b, 0xb0, 0xf0, 0xbd, + 0x00, 0x00, 0x90, 0xb5, 0x04, 0x1c, 0x4c, 0x23, + 0x0c, 0x49, 0x58, 0x43, 0x43, 0x18, 0x85, 0xb0, + 0x00, 0x20, 0x0a, 0x49, 0x02, 0x90, 0x00, 0x22, + 0x04, 0x92, 0x3c, 0x20, 0x03, 0x91, 0xc2, 0x5c, + 0x08, 0x48, 0x41, 0x88, 0x01, 0x92, 0x41, 0x20, + 0x00, 0x91, 0xc1, 0x5c, 0x5a, 0x68, 0x08, 0x33, + 0x20, 0x1c, 0x3c, 0x00, 0x8c, 0x09, 0x01, 0x00, + 0xfb, 0xf7, 0x02, 0xf8, 0x05, 0xb0, 0x90, 0xbd, + 0x58, 0xe3, 0x01, 0x00, 0x75, 0x4f, 0x00, 0x00, + 0x3c, 0x7c, 0x01, 0x00, 0xf8, 0xb5, 0x0e, 0x1c, + 0x22, 0x4c, 0x38, 0x21, 0x17, 0x1c, 0x05, 0x1c, + 0x20, 0x1c, 0xef, 0xf7, 0x75, 0xfd, 0x23, 0x1c, + 0x25, 0x33, 0x21, 0x1c, 0x24, 0x31, 0x10, 0x20, + 0x6a, 0x46, 0xf9, 0xf7, 0x1d, 0xf8, 0x00, 0xab, + 0x18, 0x88, 0x07, 0x21, 0x3c, 0x00, 0xc8, 0x09, + 0x01, 0x00, 0x1a, 0x4a, 0x02, 0x38, 0x20, 0x84, + 0x20, 0x1c, 0x20, 0x30, 0x81, 0x70, 0xc5, 0x70, + 0x11, 0x1c, 0x06, 0x73, 0x47, 0x73, 0x34, 0x31, + 0x21, 0x63, 0x30, 0x32, 0x62, 0x63, 0x01, 0x79, + 0x25, 0x1c, 0x10, 0x35, 0x21, 0x81, 0x20, 0x60, + 0xe5, 0x60, 0x18, 0x88, 0x40, 0x1a, 0x20, 0x83, + 0x20, 0x1c, 0x28, 0x30, 0x20, 0x61, 0x20, 0x1c, + 0xf9, 0xf7, 0x11, 0xf8, 0x0d, 0x48, 0x3c, 0x00, + 0x04, 0x0a, 0x01, 0x00, 0x00, 0x68, 0x00, 0x28, + 0x07, 0xd0, 0x06, 0x21, 0x20, 0x1c, 0xf8, 0xf7, + 0x47, 0xfd, 0x10, 0x21, 0x28, 0x1c, 0xf8, 0xf7, + 0x43, 0xfd, 0x08, 0x48, 0x02, 0x21, 0x01, 0x62, + 0x44, 0x62, 0x01, 0x21, 0x01, 0x62, 0x06, 0x48, + 0x00, 0x68, 0xef, 0xf7, 0xd5, 0xfc, 0xf8, 0xbd, + 0x8c, 0x8e, 0x01, 0x00, 0xe4, 0xfe, 0x01, 0x00, + 0xcc, 0x5c, 0x01, 0x00, 0x00, 0x30, 0x07, 0x00, + 0x3c, 0x00, 0x40, 0x0a, 0x01, 0x00, 0x5c, 0x5b, + 0x01, 0x00, 0xf0, 0xb5, 0x06, 0x1c, 0x40, 0x36, + 0x31, 0x8b, 0x04, 0x1c, 0x25, 0x1c, 0x08, 0x07, + 0x80, 0x0f, 0x60, 0x35, 0x01, 0x28, 0x85, 0xb0, + 0x3b, 0xd0, 0xe8, 0x79, 0x00, 0x28, 0x05, 0xd1, + 0x20, 0x69, 0x01, 0x80, 0xb0, 0x8b, 0x21, 0x69, + 0xc8, 0x82, 0x07, 0xe0, 0x01, 0x28, 0x05, 0xd1, + 0x20, 0x69, 0x01, 0x22, 0x01, 0x88, 0xd2, 0x02, + 0x11, 0x43, 0x3c, 0x00, 0x7c, 0x0a, 0x01, 0x00, + 0x01, 0x80, 0x20, 0x48, 0x00, 0x78, 0x80, 0x07, + 0x26, 0xd5, 0xe8, 0x79, 0x00, 0x28, 0x23, 0xd0, + 0xa0, 0x6b, 0x00, 0x28, 0x1c, 0xd0, 0xf4, 0xf7, + 0x2f, 0xfe, 0x00, 0x28, 0x09, 0xd0, 0xb8, 0x21, + 0x09, 0x58, 0x00, 0x29, 0x05, 0xd0, 0x30, 0x21, + 0x09, 0x5d, 0xb4, 0x30, 0x08, 0x18, 0x07, 0x7a, + 0x00, 0xe0, 0x00, 0x27, 0x01, 0x21, 0x38, 0x1c, + 0xfa, 0xf7, 0x86, 0xf9, 0x3c, 0x00, 0xb8, 0x0a, + 0x01, 0x00, 0x04, 0x90, 0x20, 0x69, 0x04, 0x30, + 0x39, 0x1c, 0xf4, 0xf7, 0x6c, 0xfd, 0x04, 0x99, + 0xfa, 0xf7, 0xd3, 0xf9, 0x02, 0xe0, 0x20, 0x1c, + 0xf7, 0xf7, 0xf9, 0xfb, 0x70, 0x83, 0x70, 0x8b, + 0x21, 0x69, 0x00, 0x22, 0x48, 0x80, 0x09, 0x49, + 0x0a, 0x48, 0x04, 0x92, 0x03, 0x91, 0x02, 0x90, + 0xea, 0x79, 0x29, 0x88, 0x01, 0x92, 0x00, 0x91, + 0x62, 0x6a, 0xe3, 0x68, 0x20, 0x34, 0x3c, 0x00, + 0xf4, 0x0a, 0x01, 0x00, 0xa1, 0x7b, 0x68, 0x7a, + 0xfa, 0xf7, 0x4c, 0xff, 0x05, 0xb0, 0xf0, 0xbd, + 0x1d, 0x75, 0x01, 0x00, 0xd1, 0x4f, 0x00, 0x00, + 0xdd, 0x2f, 0x01, 0x00, 0xfe, 0xb5, 0x04, 0x1c, + 0x26, 0x1c, 0x01, 0x20, 0x20, 0x36, 0x00, 0x29, + 0x02, 0x90, 0x2e, 0xd0, 0x58, 0x20, 0x00, 0x5b, + 0x00, 0x07, 0x80, 0x0f, 0x01, 0x28, 0x01, 0xd1, + 0xcc, 0x31, 0x00, 0xe0, 0xb4, 0x31, 0x48, 0x68, + 0x3c, 0x00, 0x30, 0x0b, 0x01, 0x00, 0x0d, 0x1c, + 0x00, 0x28, 0x24, 0xd0, 0x20, 0x1c, 0x60, 0x30, + 0xc2, 0x79, 0x01, 0x21, 0x01, 0x2a, 0x00, 0xd0, + 0x00, 0x21, 0x27, 0x1c, 0x62, 0x6d, 0x30, 0x37, + 0x00, 0x2a, 0x04, 0xd0, 0x3a, 0x1c, 0x28, 0x1c, + 0xf6, 0xf7, 0xe7, 0xfd, 0x07, 0xe0, 0x42, 0x7a, + 0x23, 0x1c, 0x68, 0x33, 0x00, 0x92, 0x3a, 0x1c, + 0x28, 0x1c, 0xf6, 0xf7, 0x9a, 0xfd, 0x02, 0x90, + 0x38, 0x78, 0x3c, 0x00, 0x6c, 0x0b, 0x01, 0x00, + 0x40, 0x19, 0x00, 0x7a, 0x01, 0x21, 0xb0, 0x73, + 0xfa, 0xf7, 0x26, 0xf9, 0x01, 0xe0, 0x00, 0x20, + 0xb0, 0x73, 0x60, 0x62, 0xb0, 0x7b, 0x0d, 0x28, + 0x01, 0xd9, 0xf0, 0xf7, 0xbb, 0xfb, 0x02, 0x98, + 0xfe, 0xbd, 0x00, 0x00, 0xff, 0xb5, 0x04, 0x1c, + 0x80, 0x30, 0x25, 0x1c, 0x5e, 0x35, 0x00, 0x78, + 0xae, 0x1d, 0xaf, 0x1f, 0x00, 0x28, 0x83, 0xb0, + 0x12, 0xd1, 0xf4, 0xf7, 0x3c, 0x00, 0xa8, 0x0b, + 0x01, 0x00, 0xc7, 0xfb, 0x00, 0x28, 0x07, 0xd0, + 0x06, 0x98, 0x05, 0x99, 0x02, 0x90, 0x04, 0x98, + 0x01, 0x90, 0xa6, 0x61, 0x67, 0x61, 0x0d, 0xe0, + 0x04, 0x98, 0x06, 0x99, 0x02, 0x90, 0x05, 0x98, + 0x01, 0x90, 0x66, 0x61, 0x05, 0xe0, 0x04, 0xa9, + 0x03, 0xc9, 0x02, 0x90, 0x06, 0x98, 0x01, 0x90, + 0x67, 0x61, 0xa5, 0x61, 0x06, 0x22, 0x38, 0x1c, + 0xef, 0xf7, 0x8b, 0xfc, 0x06, 0x22, 0x3c, 0x00, + 0xe4, 0x0b, 0x01, 0x00, 0x28, 0x1c, 0x02, 0x99, + 0xef, 0xf7, 0x86, 0xfc, 0x06, 0x22, 0x30, 0x1c, + 0x01, 0x99, 0xef, 0xf7, 0x81, 0xfc, 0x07, 0xb0, + 0xf0, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x0d, 0x1c, + 0x04, 0x1c, 0x05, 0x28, 0x01, 0xd3, 0xf0, 0xf7, + 0x7b, 0xfb, 0x02, 0x49, 0xa0, 0x00, 0x08, 0x58, + 0x85, 0x60, 0xb0, 0xbd, 0x10, 0x7b, 0x01, 0x00, + 0xf8, 0xb5, 0xff, 0xf7, 0x59, 0xf9, 0x05, 0x1c, + 0x3c, 0x00, 0x20, 0x0c, 0x01, 0x00, 0xfe, 0xf7, + 0xe8, 0xff, 0x04, 0x1c, 0x28, 0x1c, 0xff, 0xf7, + 0x58, 0xf9, 0x00, 0x28, 0x42, 0xd0, 0x69, 0x1e, + 0x21, 0x4d, 0x4a, 0x00, 0x20, 0x4b, 0x1c, 0x3d, + 0xae, 0x5c, 0x98, 0x5c, 0x30, 0x40, 0xd6, 0x18, + 0x01, 0x23, 0xf6, 0x56, 0x52, 0x19, 0xd2, 0x56, + 0x96, 0x42, 0x01, 0xdd, 0x15, 0x1c, 0x00, 0xe0, + 0x35, 0x1c, 0x18, 0x4b, 0x2a, 0x3b, 0x59, 0x56, + 0x51, 0x18, 0x3c, 0x00, 0x5c, 0x0c, 0x01, 0x00, + 0xb1, 0x42, 0x00, 0xdb, 0x31, 0x1c, 0x0e, 0x1c, + 0x00, 0x28, 0x26, 0xd0, 0xfe, 0xf7, 0xbe, 0xff, + 0x00, 0x90, 0x00, 0xab, 0x18, 0x78, 0x12, 0x49, + 0x00, 0x23, 0xc9, 0x56, 0x00, 0xab, 0x15, 0x22, + 0x10, 0x1a, 0x5b, 0x78, 0x00, 0x1b, 0x40, 0x18, + 0xd2, 0x1a, 0x12, 0x1b, 0x51, 0x18, 0x00, 0x22, + 0x85, 0x42, 0x02, 0xdb, 0x00, 0xab, 0x1a, 0x70, + 0x02, 0xe0, 0x40, 0x1b, 0x3c, 0x00, 0x98, 0x0c, + 0x01, 0x00, 0x00, 0xab, 0x18, 0x70, 0x8e, 0x42, + 0x02, 0xdb, 0x00, 0xab, 0x5a, 0x70, 0x02, 0xe0, + 0x88, 0x1b, 0x00, 0xab, 0x58, 0x70, 0x00, 0x98, + 0xff, 0xf7, 0x8d, 0xf8, 0x01, 0xf0, 0xff, 0xf8, + 0xf8, 0xbd, 0xe6, 0x78, 0x01, 0x00, 0x65, 0x73, + 0x01, 0x00, 0x70, 0xb5, 0x08, 0x4e, 0x06, 0x4d, + 0x00, 0x24, 0x06, 0x20, 0x60, 0x43, 0x80, 0x19, + 0x06, 0x22, 0x29, 0x1c, 0xef, 0xf7, 0x3c, 0x00, + 0xd4, 0x0c, 0x01, 0x00, 0x11, 0xfc, 0x01, 0x34, + 0x05, 0x2c, 0xf5, 0xdb, 0x70, 0xbd, 0x00, 0x00, + 0x4e, 0x47, 0x01, 0x00, 0xe6, 0x7a, 0x01, 0x00, + 0x03, 0x48, 0x80, 0xb5, 0x01, 0x68, 0x03, 0x48, + 0xfe, 0xf7, 0x42, 0xfb, 0x80, 0xbd, 0x00, 0x00, + 0xa8, 0x79, 0x01, 0x00, 0xc4, 0x60, 0x01, 0x00, + 0x03, 0x48, 0x80, 0xb5, 0x01, 0x68, 0x03, 0x48, + 0xfe, 0xf7, 0x4a, 0xfb, 0x80, 0xbd, 0x00, 0x00, + 0x3c, 0x00, 0x10, 0x0d, 0x01, 0x00, 0xa8, 0x79, + 0x01, 0x00, 0xc4, 0x60, 0x01, 0x00, 0x10, 0xb5, + 0x00, 0x28, 0x0a, 0xd0, 0x06, 0x4c, 0xa1, 0x69, + 0x00, 0x29, 0x01, 0xd1, 0x00, 0x20, 0x00, 0xe0, + 0x09, 0x68, 0xf7, 0xf7, 0x38, 0xfb, 0xa0, 0x61, + 0x10, 0xbd, 0x00, 0x20, 0x10, 0xbd, 0xa4, 0x6e, + 0x01, 0x00, 0xf3, 0xb5, 0x37, 0x48, 0x83, 0xb0, + 0x02, 0x90, 0x80, 0x79, 0x0e, 0x1c, 0x00, 0x27, + 0x01, 0x90, 0x3c, 0x00, 0x4c, 0x0d, 0x01, 0x00, + 0x34, 0x48, 0x35, 0x4a, 0x01, 0x6a, 0x03, 0x9c, + 0x03, 0x1c, 0x1b, 0x69, 0xa1, 0x42, 0x01, 0xd0, + 0x93, 0x61, 0x00, 0xe0, 0x53, 0x61, 0x31, 0x49, + 0x8a, 0x68, 0x96, 0x42, 0x3f, 0xd0, 0x2d, 0x48, + 0x8e, 0x60, 0xc1, 0x68, 0x00, 0x24, 0x25, 0x1c, + 0x00, 0x29, 0x2d, 0x48, 0x09, 0xd0, 0x00, 0x2e, + 0x0b, 0xd0, 0x28, 0x48, 0x01, 0x24, 0xc0, 0x6a, + 0x24, 0x03, 0x00, 0x28, 0x3c, 0x00, 0x88, 0x0d, + 0x01, 0x00, 0x06, 0xd0, 0x01, 0x27, 0x04, 0xe0, + 0x00, 0x2e, 0x01, 0xd0, 0x05, 0x1c, 0xf9, 0xe7, + 0x04, 0x1c, 0x00, 0x2f, 0x06, 0xd0, 0xfb, 0xf7, + 0x1e, 0xfb, 0x1f, 0x48, 0x01, 0x68, 0x22, 0x48, + 0xfe, 0xf7, 0xfb, 0xfa, 0x20, 0x1c, 0x28, 0x43, + 0x0e, 0xd0, 0x2a, 0x1c, 0x21, 0x1c, 0x01, 0x20, + 0x02, 0xf0, 0x21, 0xfe, 0x2a, 0x1c, 0x21, 0x1c, + 0x02, 0x20, 0x02, 0xf0, 0x1c, 0xfe, 0x3c, 0x00, + 0xc4, 0x0d, 0x01, 0x00, 0x2a, 0x1c, 0x21, 0x1c, + 0x03, 0x20, 0x02, 0xf0, 0x17, 0xfe, 0x00, 0x2f, + 0x06, 0xd1, 0x13, 0x48, 0x01, 0x68, 0x16, 0x48, + 0xfe, 0xf7, 0xce, 0xfa, 0xfa, 0xf7, 0x42, 0xfd, + 0x03, 0x9c, 0x00, 0x2c, 0x01, 0xd1, 0x01, 0xf0, + 0xe1, 0xff, 0x01, 0xa9, 0x03, 0xc9, 0x88, 0x71, + 0x01, 0xf0, 0xdc, 0xff, 0x0a, 0x4c, 0x0a, 0x4b, + 0x44, 0x3c, 0xa1, 0x69, 0x22, 0x69, 0x08, 0x3b, + 0x3c, 0x00, 0x00, 0x0e, 0x01, 0x00, 0x41, 0x1a, + 0x00, 0x2a, 0x03, 0xd0, 0x1a, 0x68, 0x51, 0x18, + 0x19, 0x60, 0x02, 0xe0, 0x5a, 0x68, 0x51, 0x18, + 0x59, 0x60, 0xa0, 0x61, 0x26, 0x61, 0x05, 0xb0, + 0xf0, 0xbd, 0x20, 0x10, 0x07, 0x00, 0xa4, 0x6c, + 0x01, 0x00, 0x10, 0x00, 0x07, 0x00, 0xb0, 0x57, + 0x01, 0x00, 0x00, 0x10, 0x60, 0x00, 0x84, 0x73, + 0x01, 0x00, 0x1c, 0xb5, 0x4c, 0x23, 0x08, 0x49, + 0x58, 0x43, 0x3c, 0x00, 0x3c, 0x0e, 0x01, 0x00, + 0x44, 0x18, 0x20, 0x1c, 0x40, 0x30, 0x41, 0x78, + 0x62, 0x68, 0x00, 0x91, 0x01, 0x92, 0x3f, 0x21, + 0x0b, 0x5d, 0x61, 0x8f, 0x00, 0x78, 0x62, 0x6c, + 0xfa, 0xf7, 0x28, 0xf8, 0xa0, 0x85, 0x1c, 0xbd, + 0x58, 0xe3, 0x01, 0x00, 0xb0, 0xb5, 0x16, 0x4d, + 0xa9, 0x69, 0x00, 0x29, 0x25, 0xd0, 0x2c, 0x1c, + 0x30, 0x34, 0x20, 0x7a, 0x00, 0x28, 0x20, 0xd0, + 0x00, 0x23, 0x81, 0x22, 0x3c, 0x00, 0x78, 0x0e, + 0x01, 0x00, 0x18, 0x20, 0x02, 0xf0, 0x89, 0xfc, + 0x20, 0x7a, 0xff, 0x30, 0x00, 0x06, 0x00, 0x0e, + 0x20, 0x72, 0x12, 0xd1, 0x0c, 0x48, 0x28, 0x21, + 0x2c, 0x38, 0x09, 0x5c, 0x21, 0x72, 0x29, 0x7a, + 0x00, 0x29, 0x01, 0xd1, 0x00, 0x6a, 0x00, 0xe0, + 0x40, 0x6a, 0xa9, 0x69, 0x80, 0x02, 0x81, 0x42, + 0x03, 0xd2, 0x49, 0x00, 0x81, 0x42, 0x01, 0xd2, + 0xa9, 0x61, 0xb0, 0xbd, 0xa8, 0x61, 0x3c, 0x00, + 0xb4, 0x0e, 0x01, 0x00, 0xb0, 0xbd, 0x01, 0xf0, + 0x1d, 0xf9, 0xb0, 0xbd, 0xf4, 0x6e, 0x01, 0x00, + 0x7f, 0xb5, 0x05, 0x1c, 0x04, 0x20, 0x6b, 0x46, + 0x1b, 0x18, 0x02, 0x90, 0x00, 0x26, 0x28, 0x18, + 0x6a, 0x46, 0x02, 0xa9, 0xfc, 0xf7, 0x8a, 0xfb, + 0x00, 0x28, 0x06, 0xd1, 0x00, 0xab, 0x18, 0x79, + 0x04, 0x28, 0x08, 0xd0, 0x18, 0x79, 0x03, 0x28, + 0x05, 0xd0, 0x00, 0xab, 0x18, 0x79, 0x10, 0x21, + 0x3c, 0x00, 0xf0, 0x0e, 0x01, 0x00, 0x08, 0x43, + 0x04, 0xb0, 0x70, 0xbd, 0x03, 0xa9, 0xe8, 0x68, + 0xf6, 0xf7, 0xd3, 0xff, 0x00, 0x28, 0x05, 0xd0, + 0x03, 0x98, 0x20, 0x21, 0x08, 0x43, 0x00, 0x06, + 0x00, 0x0e, 0xf1, 0xe7, 0x03, 0xa9, 0x00, 0x20, + 0xf6, 0xf7, 0xc7, 0xff, 0x04, 0x1c, 0x01, 0xd1, + 0x02, 0x20, 0xe9, 0xe7, 0xe8, 0x68, 0x00, 0xab, + 0x20, 0x60, 0x00, 0x98, 0x60, 0x60, 0x18, 0x79, + 0xa0, 0x76, 0x3c, 0x00, 0x2c, 0x0f, 0x01, 0x00, + 0xa8, 0x8c, 0x60, 0x76, 0xe8, 0x69, 0x20, 0x61, + 0x68, 0x8c, 0xa0, 0x82, 0x28, 0x8c, 0x20, 0x76, + 0x69, 0x69, 0x09, 0x48, 0x81, 0x42, 0x00, 0xd9, + 0x08, 0x1c, 0xa0, 0x60, 0x20, 0x1c, 0x02, 0xf0, + 0xa1, 0xfd, 0xa1, 0x68, 0x00, 0x29, 0x04, 0xd0, + 0x03, 0x9a, 0xa1, 0x32, 0x08, 0x20, 0x02, 0xf0, + 0x37, 0xfb, 0x30, 0x1c, 0xc7, 0xe7, 0x00, 0x00, + 0xa0, 0x86, 0x01, 0x00, 0x3c, 0x00, 0x68, 0x0f, + 0x01, 0x00, 0xfe, 0xb5, 0x06, 0x1c, 0x40, 0x78, + 0x01, 0x24, 0x06, 0x28, 0x50, 0xd3, 0xc1, 0x1e, + 0x03, 0x20, 0xef, 0xf7, 0x5e, 0xfb, 0x00, 0x90, + 0x0e, 0x28, 0x49, 0xd8, 0x00, 0x20, 0x0a, 0xe0, + 0x41, 0x00, 0x09, 0x18, 0x89, 0x19, 0x4a, 0x79, + 0x89, 0x79, 0x51, 0x18, 0x01, 0x39, 0x0e, 0x29, + 0x00, 0xd9, 0x00, 0x24, 0x01, 0x30, 0x00, 0x99, + 0x88, 0x42, 0xf1, 0xdb, 0x00, 0x2c, 0x3c, 0x00, + 0xa4, 0x0f, 0x01, 0x00, 0x37, 0xd0, 0x03, 0x22, + 0xb1, 0x1c, 0x1b, 0x48, 0xef, 0xf7, 0xa4, 0xfa, + 0x1a, 0x4c, 0x1c, 0x21, 0x20, 0x1c, 0xef, 0xf7, + 0x4d, 0xfa, 0x00, 0x25, 0x28, 0xe0, 0x69, 0x00, + 0x49, 0x19, 0x02, 0x91, 0x8a, 0x19, 0x53, 0x79, + 0x15, 0x48, 0x43, 0x54, 0x93, 0x79, 0x0f, 0x18, + 0x7b, 0x70, 0xd3, 0x79, 0xbb, 0x70, 0x07, 0x23, + 0xd2, 0x56, 0x01, 0x92, 0x44, 0x5c, 0x0f, 0xe0, + 0x3c, 0x00, 0xe0, 0x0f, 0x01, 0x00, 0x20, 0x1c, + 0xfe, 0xf7, 0x7b, 0xff, 0x00, 0x28, 0x07, 0xd0, + 0x0c, 0x4a, 0x60, 0x00, 0x80, 0x18, 0x01, 0x21, + 0x10, 0x38, 0x81, 0x73, 0x01, 0x99, 0xc1, 0x73, + 0x01, 0x34, 0x24, 0x06, 0x24, 0x0e, 0x07, 0x48, + 0x02, 0x99, 0x40, 0x5c, 0x79, 0x78, 0x40, 0x18, + 0xa0, 0x42, 0xe8, 0xd8, 0x01, 0x35, 0x00, 0x98, + 0x85, 0x42, 0xd3, 0xdb, 0xfe, 0xbd, 0xe8, 0x62, + 0x01, 0x00, 0x3c, 0x00, 0x1c, 0x10, 0x01, 0x00, + 0xe6, 0x78, 0x01, 0x00, 0xeb, 0x62, 0x01, 0x00, + 0x01, 0x68, 0x0f, 0x29, 0x01, 0xdd, 0x0f, 0x21, + 0x01, 0x60, 0x01, 0x68, 0x00, 0x29, 0x01, 0xda, + 0x00, 0x21, 0x01, 0x60, 0x70, 0x47, 0x00, 0x00, + 0xf8, 0xb5, 0x04, 0x1c, 0x1e, 0x48, 0x22, 0x1d, + 0x05, 0x68, 0x00, 0x92, 0x16, 0x1c, 0x23, 0x1c, + 0x0f, 0x1c, 0xcc, 0x33, 0x2a, 0x1c, 0x20, 0x1c, + 0x70, 0x30, 0xa1, 0x6d, 0x3c, 0x00, 0x58, 0x10, + 0x01, 0x00, 0x00, 0xf0, 0x3e, 0xf9, 0x00, 0x96, + 0xa1, 0x6d, 0x27, 0x20, 0x01, 0x40, 0x23, 0x1c, + 0xe4, 0x33, 0x20, 0x1c, 0x2a, 0x1c, 0x5c, 0x30, + 0x00, 0xf0, 0x33, 0xf9, 0x13, 0x48, 0x00, 0x78, + 0x0e, 0x28, 0x01, 0xd2, 0x01, 0x25, 0x85, 0x40, + 0x11, 0x48, 0xa1, 0x69, 0x00, 0x78, 0x29, 0x40, + 0x00, 0x07, 0x0b, 0xd4, 0x48, 0x07, 0x03, 0xd5, + 0x08, 0x07, 0x01, 0xd5, 0x04, 0x20, 0x3c, 0x00, + 0x94, 0x10, 0x01, 0x00, 0x81, 0x43, 0x88, 0x06, + 0x03, 0xd5, 0x48, 0x06, 0x01, 0xd5, 0x20, 0x20, + 0x81, 0x43, 0x23, 0x1c, 0xb4, 0x33, 0x2a, 0x1c, + 0x20, 0x1c, 0x30, 0x30, 0x00, 0x96, 0x00, 0xf0, + 0x13, 0xf9, 0x39, 0x1c, 0x20, 0x1c, 0xf0, 0xf7, + 0x47, 0xfc, 0xf8, 0xbd, 0x2c, 0x7d, 0x01, 0x00, + 0x10, 0x67, 0x01, 0x00, 0x1d, 0x75, 0x01, 0x00, + 0xb0, 0xb5, 0xf2, 0xf7, 0x27, 0xfc, 0xfe, 0xf7, + 0x3c, 0x00, 0xd0, 0x10, 0x01, 0x00, 0x09, 0xf9, + 0x0f, 0x48, 0x00, 0x25, 0x45, 0x70, 0x0e, 0x48, + 0x0d, 0x4c, 0x00, 0x88, 0x5b, 0x34, 0xa0, 0x82, + 0xf9, 0xf7, 0x23, 0xfd, 0x20, 0x61, 0xa0, 0x8a, + 0x00, 0x28, 0x04, 0xd0, 0x01, 0x21, 0x89, 0x05, + 0xef, 0xf7, 0x0d, 0xfb, 0xe1, 0x82, 0x05, 0x48, + 0x01, 0x38, 0x45, 0x60, 0x01, 0xf0, 0x55, 0xfe, + 0x02, 0x1c, 0x23, 0x1c, 0x00, 0x21, 0x00, 0x20, + 0xf4, 0xf7, 0x3c, 0x00, 0x0c, 0x11, 0x01, 0x00, + 0x49, 0xfd, 0xb0, 0xbd, 0x45, 0x7d, 0x01, 0x00, + 0xf4, 0x67, 0x01, 0x00, 0x70, 0xb5, 0x16, 0x1c, + 0x5a, 0x89, 0x04, 0x1c, 0x04, 0x98, 0x92, 0x07, + 0x92, 0x0f, 0x00, 0x25, 0x00, 0x29, 0xa2, 0x71, + 0x09, 0xd0, 0x05, 0x21, 0xf9, 0xf7, 0x24, 0xfb, + 0x00, 0x28, 0x01, 0xd0, 0xc0, 0x78, 0x00, 0xe0, + 0x01, 0x20, 0xe0, 0x71, 0x00, 0xe0, 0xe5, 0x71, + 0xe5, 0x60, 0xa6, 0x60, 0x3c, 0x00, 0x48, 0x11, + 0x01, 0x00, 0x70, 0xbd, 0x00, 0x00, 0xfe, 0xb5, + 0x05, 0x1c, 0x0e, 0x22, 0x9c, 0x30, 0x16, 0x49, + 0xef, 0xf7, 0xcf, 0xf9, 0x29, 0x1c, 0x28, 0x1c, + 0x80, 0x30, 0x88, 0x31, 0x00, 0x24, 0x2f, 0x1c, + 0x60, 0x37, 0x02, 0x91, 0x01, 0x90, 0x20, 0x06, + 0x00, 0x0e, 0x06, 0x1c, 0xf9, 0xf7, 0x0d, 0xfe, + 0x00, 0x28, 0x03, 0xd0, 0x01, 0x98, 0x42, 0x68, + 0x02, 0x99, 0x01, 0xe0, 0xea, 0x6d, 0x3c, 0x00, + 0x84, 0x11, 0x01, 0x00, 0x39, 0x1c, 0x00, 0x2a, + 0x0d, 0xd0, 0x00, 0x20, 0x03, 0xe0, 0x0b, 0x5c, + 0xb3, 0x42, 0x02, 0xd8, 0x01, 0x30, 0x90, 0x42, + 0xf9, 0xdb, 0x08, 0x18, 0x10, 0x38, 0xc0, 0x7b, + 0x29, 0x19, 0x90, 0x31, 0x08, 0x73, 0x01, 0x34, + 0x0e, 0x2c, 0xdf, 0xd3, 0xfe, 0xbd, 0x00, 0x00, + 0xcc, 0x47, 0x01, 0x00, 0xff, 0xb5, 0x81, 0xb0, + 0x14, 0x1c, 0x10, 0x1c, 0x06, 0x22, 0x0d, 0x1c, + 0x3c, 0x00, 0xc0, 0x11, 0x01, 0x00, 0x19, 0x1c, + 0x0b, 0x9e, 0x0a, 0x9f, 0xef, 0xf7, 0x97, 0xf9, + 0x06, 0x22, 0x39, 0x1c, 0xa0, 0x18, 0xef, 0xf7, + 0x92, 0xf9, 0xe6, 0x60, 0x2c, 0x60, 0x10, 0x20, + 0x28, 0x81, 0x6e, 0x60, 0x01, 0x98, 0xe8, 0x60, + 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0x70, 0xb5, + 0x04, 0x1c, 0x00, 0x20, 0x20, 0x61, 0x58, 0x20, + 0x00, 0x5d, 0x0e, 0x1c, 0x15, 0x1c, 0xc0, 0x07, + 0xc0, 0x17, 0x3c, 0x00, 0xfc, 0x11, 0x01, 0x00, + 0x01, 0x30, 0xe0, 0x61, 0x21, 0x6b, 0x00, 0x29, + 0x36, 0xd1, 0x1e, 0x49, 0x09, 0x68, 0x29, 0x43, + 0x32, 0xd0, 0xa1, 0x68, 0x89, 0x8a, 0x00, 0x29, + 0x2e, 0xd0, 0x00, 0x28, 0x0b, 0xd0, 0x20, 0x1c, + 0x58, 0x30, 0x00, 0xf0, 0xf3, 0xfd, 0x00, 0x28, + 0x1b, 0xd0, 0x81, 0x6a, 0x02, 0x6a, 0x40, 0x6a, + 0x09, 0x78, 0x00, 0x78, 0x06, 0xe0, 0x14, 0x4a, + 0x3c, 0x23, 0x11, 0x78, 0x3c, 0x00, 0x38, 0x12, + 0x01, 0x00, 0x50, 0x78, 0x43, 0x43, 0x9a, 0x18, + 0x04, 0x32, 0x00, 0x2d, 0x03, 0xd1, 0x02, 0x29, + 0x01, 0xd0, 0x03, 0x29, 0x02, 0xd1, 0x6d, 0x21, + 0x22, 0x61, 0x08, 0x55, 0x20, 0x69, 0x00, 0x28, + 0x0d, 0xd0, 0x81, 0x88, 0x00, 0x29, 0x01, 0xd1, + 0x01, 0x20, 0x70, 0xbd, 0x80, 0x79, 0x02, 0x28, + 0x05, 0xd1, 0x22, 0x1c, 0x07, 0x49, 0x07, 0x48, + 0xf8, 0xf7, 0x4b, 0xff, 0x02, 0xe0, 0x3c, 0x00, + 0x74, 0x12, 0x01, 0x00, 0x20, 0x1c, 0xef, 0xf7, + 0xb5, 0xf8, 0x00, 0x20, 0x70, 0xbd, 0x00, 0x00, + 0x28, 0x61, 0x01, 0x00, 0x68, 0x61, 0x01, 0x00, + 0xa1, 0xda, 0x00, 0x00, 0xa0, 0x6a, 0x01, 0x00, + 0x10, 0xb5, 0x00, 0x21, 0x00, 0x20, 0xf9, 0xf7, + 0x39, 0xfe, 0xc4, 0x00, 0xf9, 0xf7, 0x54, 0xfe, + 0x24, 0x18, 0xf9, 0xf7, 0x47, 0xfe, 0x08, 0x49, + 0x20, 0x18, 0x09, 0x88, 0x08, 0x4c, 0x40, 0x18, + 0x3c, 0x00, 0xb0, 0x12, 0x01, 0x00, 0x06, 0x49, + 0x09, 0x88, 0x40, 0x18, 0x60, 0x61, 0xf9, 0xf7, + 0x46, 0xfe, 0x05, 0x49, 0x09, 0x88, 0x40, 0x18, + 0x40, 0x00, 0xa0, 0x61, 0x10, 0xbd, 0x02, 0x61, + 0x01, 0x00, 0x04, 0x61, 0x01, 0x00, 0xd4, 0x79, + 0x01, 0x00, 0xa6, 0x69, 0x01, 0x00, 0x11, 0x40, + 0x08, 0x1c, 0x10, 0xb5, 0x1c, 0x1c, 0x19, 0x1c, + 0x08, 0x31, 0x18, 0x60, 0xf1, 0xf7, 0x31, 0xfe, + 0x60, 0x60, 0x3c, 0x00, 0xec, 0x12, 0x01, 0x00, + 0x10, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x06, 0x1c, + 0x22, 0x48, 0x0f, 0x1c, 0x41, 0x68, 0x91, 0x42, + 0x03, 0xd0, 0x00, 0x21, 0x81, 0x60, 0xc1, 0x60, + 0x42, 0x60, 0xc4, 0x68, 0x15, 0xe0, 0x28, 0x20, + 0x1d, 0x49, 0x60, 0x43, 0x40, 0x18, 0x05, 0x1c, + 0x06, 0x22, 0x31, 0x1c, 0xef, 0xf7, 0x70, 0xf8, + 0x00, 0x28, 0x07, 0xd1, 0xa8, 0x1d, 0x39, 0x1c, + 0xf9, 0xf7, 0x10, 0xfd, 0x3c, 0x00, 0x28, 0x13, + 0x01, 0x00, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x20, + 0xf8, 0xbd, 0x01, 0x34, 0x24, 0x07, 0x24, 0x0f, + 0x12, 0x48, 0x80, 0x68, 0x84, 0x42, 0xe5, 0xd1, + 0x10, 0x4c, 0x28, 0x23, 0xa0, 0x68, 0x0f, 0x4d, + 0x58, 0x43, 0x40, 0x19, 0x06, 0x22, 0x31, 0x1c, + 0xef, 0xf7, 0xd3, 0xf8, 0xa0, 0x68, 0x28, 0x23, + 0x58, 0x43, 0x40, 0x19, 0x06, 0x30, 0x22, 0x22, + 0x39, 0x1c, 0xef, 0xf7, 0xca, 0xf8, 0x3c, 0x00, + 0x64, 0x13, 0x01, 0x00, 0xa0, 0x68, 0x01, 0x30, + 0x00, 0x07, 0x00, 0x0f, 0xa0, 0x60, 0xe1, 0x68, + 0x81, 0x42, 0x03, 0xd1, 0x01, 0x31, 0x08, 0x07, + 0x00, 0x0f, 0xe0, 0x60, 0x00, 0x20, 0xd6, 0xe7, + 0xec, 0x65, 0x01, 0x00, 0xa0, 0xf4, 0x01, 0x00, + 0x10, 0xb5, 0x00, 0x21, 0x03, 0x20, 0x00, 0xf0, + 0xe5, 0xff, 0x05, 0x4c, 0xa0, 0x68, 0x00, 0x28, + 0x04, 0xd1, 0x01, 0xf0, 0x07, 0xfd, 0x61, 0x68, + 0x3c, 0x00, 0xa0, 0x13, 0x01, 0x00, 0x40, 0x1a, + 0x60, 0x60, 0x10, 0xbd, 0x00, 0x00, 0xd0, 0x60, + 0x01, 0x00, 0x02, 0x68, 0x0a, 0x60, 0x01, 0x60, + 0x70, 0x47, 0x01, 0x1c, 0x00, 0x68, 0x00, 0x28, + 0x01, 0xd0, 0x02, 0x68, 0x0a, 0x60, 0x70, 0x47, + 0x00, 0x00, 0xfe, 0xb5, 0x14, 0x1c, 0x1d, 0x1c, + 0x00, 0x22, 0xd2, 0x43, 0x01, 0xab, 0xf3, 0xf7, + 0x82, 0xff, 0x01, 0x98, 0x00, 0x26, 0x28, 0x40, + 0x01, 0x90, 0x3c, 0x00, 0xdc, 0x13, 0x01, 0x00, + 0x00, 0x25, 0x00, 0x27, 0x20, 0x60, 0x1e, 0xe0, + 0x01, 0x21, 0xb9, 0x40, 0x0a, 0x1c, 0x02, 0x40, + 0x18, 0xd0, 0x88, 0x43, 0x01, 0x90, 0x39, 0x06, + 0x09, 0x0e, 0x70, 0x19, 0x00, 0x19, 0x02, 0x91, + 0x01, 0x77, 0x08, 0x1c, 0xf9, 0xf7, 0xc6, 0xfc, + 0x00, 0x28, 0x06, 0xd0, 0x30, 0x1c, 0x00, 0x19, + 0x01, 0x36, 0x02, 0x99, 0x30, 0x30, 0x01, 0x70, + 0x04, 0xe0, 0x28, 0x1c, 0x3c, 0x00, 0x18, 0x14, + 0x01, 0x00, 0x01, 0x35, 0x02, 0x99, 0x00, 0x19, + 0x01, 0x72, 0x01, 0x37, 0x01, 0x98, 0x00, 0x28, + 0xdd, 0xd1, 0x70, 0x19, 0xa0, 0x61, 0x65, 0x60, + 0xe6, 0x62, 0xfe, 0xbd, 0x00, 0x00, 0xb0, 0xb5, + 0x14, 0x4d, 0x04, 0x1c, 0x28, 0x7a, 0x01, 0x28, + 0x02, 0xd1, 0x04, 0x20, 0xf6, 0xf7, 0xad, 0xf9, + 0x21, 0x1c, 0xa8, 0x6a, 0xf5, 0xf7, 0x21, 0xfc, + 0x00, 0x28, 0x03, 0xd1, 0x04, 0x20, 0x3c, 0x00, + 0x54, 0x14, 0x01, 0x00, 0xf6, 0xf7, 0xa4, 0xf9, + 0xb0, 0xbd, 0x02, 0x20, 0x28, 0x70, 0x28, 0x8c, + 0x00, 0x28, 0x00, 0xd0, 0x60, 0x81, 0x68, 0x8c, + 0x00, 0x28, 0x00, 0xd0, 0xa0, 0x81, 0xa8, 0x8c, + 0x00, 0x28, 0x00, 0xd0, 0xe0, 0x81, 0xe8, 0x69, + 0x01, 0x23, 0x02, 0x04, 0x12, 0x0c, 0x20, 0x1c, + 0x02, 0x49, 0xfc, 0xf7, 0x19, 0xff, 0xb0, 0xbd, + 0xf4, 0x6e, 0x01, 0x00, 0xa1, 0x77, 0x00, 0x00, + 0x3c, 0x00, 0x90, 0x14, 0x01, 0x00, 0xf8, 0xb5, + 0x19, 0x4e, 0x05, 0x1c, 0xb0, 0x69, 0x00, 0x28, + 0x00, 0xd1, 0x30, 0x68, 0xff, 0xf7, 0x3b, 0xfc, + 0x15, 0x4f, 0x04, 0x1c, 0x50, 0x37, 0x00, 0x28, + 0x0b, 0xd0, 0x60, 0x68, 0x29, 0x1c, 0x78, 0x60, + 0x01, 0x20, 0x38, 0x63, 0x20, 0x1c, 0xf5, 0xf7, + 0xea, 0xfb, 0x00, 0x28, 0x04, 0xd1, 0x00, 0x20, + 0xf8, 0xbd, 0x00, 0x23, 0xfb, 0x62, 0xfa, 0xe7, + 0x00, 0x23, 0x3c, 0x00, 0xcc, 0x14, 0x01, 0x00, + 0x23, 0x77, 0xf8, 0x6a, 0x00, 0x28, 0x01, 0xd1, + 0x01, 0x20, 0xf8, 0x62, 0x38, 0x7a, 0x01, 0x28, + 0x07, 0xd0, 0xf8, 0x69, 0x06, 0x49, 0x02, 0x04, + 0x12, 0x0c, 0x28, 0x1c, 0xfc, 0xf7, 0xe6, 0xfe, + 0x01, 0xe0, 0xfb, 0x62, 0xb3, 0x61, 0x01, 0x20, + 0xe5, 0xe7, 0x00, 0x00, 0xa4, 0x6e, 0x01, 0x00, + 0xdd, 0x02, 0x01, 0x00, 0x70, 0xb5, 0x0d, 0x1c, + 0x04, 0x1c, 0x16, 0x1c, 0x3c, 0x00, 0x08, 0x15, + 0x01, 0x00, 0x04, 0x2c, 0x1b, 0xd2, 0x10, 0x48, + 0x83, 0x42, 0x07, 0xd2, 0x58, 0x00, 0x0f, 0x49, + 0xef, 0xf7, 0xfb, 0xf8, 0xff, 0x30, 0x00, 0x0a, + 0x01, 0x38, 0x00, 0xe0, 0x00, 0x20, 0x1f, 0x35, + 0xea, 0x06, 0x61, 0x07, 0x09, 0x0e, 0xd2, 0x0e, + 0x11, 0x43, 0x72, 0x07, 0x52, 0x0d, 0x11, 0x43, + 0x00, 0x06, 0x00, 0x0a, 0x08, 0x43, 0x06, 0x4a, + 0xa1, 0x00, 0x50, 0x50, 0x70, 0xbd, 0x3c, 0x00, + 0x44, 0x15, 0x01, 0x00, 0x01, 0x21, 0x8d, 0x20, + 0xef, 0xf7, 0xac, 0xfe, 0x70, 0xbd, 0x00, 0x00, + 0x40, 0x9c, 0x00, 0x00, 0x00, 0x80, 0x38, 0x01, + 0xe8, 0x60, 0x01, 0x00, 0x09, 0x4a, 0x80, 0x00, + 0x10, 0x58, 0x40, 0x09, 0x40, 0x01, 0x07, 0x22, + 0x02, 0x43, 0x07, 0x48, 0x03, 0x68, 0x00, 0x2b, + 0xfc, 0xdb, 0x42, 0x60, 0x09, 0x06, 0x01, 0x60, + 0x01, 0x68, 0x00, 0x29, 0xfc, 0xdb, 0x08, 0x20, + 0x3c, 0x00, 0x80, 0x15, 0x01, 0x00, 0x70, 0x47, + 0x00, 0x00, 0xe8, 0x60, 0x01, 0x00, 0x30, 0x20, + 0x07, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x0d, 0x1c, + 0x07, 0x49, 0xa0, 0x00, 0x08, 0x58, 0x00, 0x28, + 0x03, 0xd1, 0x02, 0x21, 0x8d, 0x20, 0xef, 0xf7, + 0x80, 0xfe, 0x29, 0x1c, 0x20, 0x1c, 0xf6, 0xf7, + 0xa8, 0xfa, 0xb0, 0xbd, 0x00, 0x00, 0xe8, 0x60, + 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x0d, 0x1c, + 0x07, 0x49, 0x3c, 0x00, 0xbc, 0x15, 0x01, 0x00, + 0xa0, 0x00, 0x08, 0x58, 0x00, 0x28, 0x03, 0xd1, + 0x02, 0x21, 0x8d, 0x20, 0xef, 0xf7, 0x6c, 0xfe, + 0x29, 0x1c, 0x20, 0x1c, 0xff, 0xf7, 0xc4, 0xff, + 0xb0, 0xbd, 0x00, 0x00, 0xe8, 0x60, 0x01, 0x00, + 0xf8, 0xb5, 0x0d, 0x1c, 0x16, 0x1c, 0xf7, 0xf7, + 0x17, 0xf9, 0x04, 0x1c, 0x28, 0x68, 0x40, 0x4f, + 0x81, 0x78, 0x00, 0x29, 0x3b, 0xd1, 0xc1, 0x78, + 0x00, 0x29, 0x58, 0xd1, 0x3c, 0x00, 0xf8, 0x15, + 0x01, 0x00, 0xf8, 0xf7, 0xf8, 0xf9, 0x22, 0x8e, + 0x61, 0x8e, 0x8a, 0x42, 0x04, 0xd0, 0xa1, 0x6a, + 0x09, 0x18, 0xe0, 0x69, 0x81, 0x42, 0x10, 0xd9, + 0x38, 0x49, 0x32, 0x1c, 0x48, 0x6b, 0x01, 0x30, + 0x48, 0x63, 0x20, 0x6a, 0x01, 0x30, 0x20, 0x62, + 0x38, 0x68, 0x01, 0x30, 0x38, 0x60, 0xe0, 0x68, + 0x63, 0x69, 0x29, 0x1c, 0xee, 0xf7, 0xd8, 0xfe, + 0xf8, 0xbd, 0x01, 0x32, 0x12, 0x04, 0x3c, 0x00, + 0x34, 0x16, 0x01, 0x00, 0x12, 0x0c, 0x22, 0x86, + 0xa1, 0x62, 0xb8, 0x68, 0x00, 0x28, 0x34, 0xd1, + 0x2c, 0x48, 0x0c, 0x23, 0x00, 0x68, 0x1b, 0x1a, + 0x9a, 0x42, 0x07, 0xd2, 0x19, 0x23, 0x9b, 0x01, + 0xaf, 0x22, 0x92, 0x01, 0x58, 0x43, 0x10, 0x1a, + 0x81, 0x42, 0x26, 0xd3, 0x01, 0x20, 0xb8, 0x60, + 0x01, 0x21, 0x0c, 0x20, 0x00, 0xf0, 0x7a, 0xfe, + 0x1f, 0xe0, 0x01, 0x29, 0x1d, 0xd1, 0xc0, 0x78, + 0x3c, 0x00, 0x70, 0x16, 0x01, 0x00, 0x17, 0x28, + 0x1a, 0xd1, 0xa0, 0x8e, 0xe1, 0x8e, 0x88, 0x42, + 0x14, 0xd3, 0xe9, 0x68, 0x09, 0x68, 0x09, 0x79, + 0x09, 0x06, 0x0f, 0xd5, 0x60, 0x6a, 0x32, 0x1c, + 0x01, 0x30, 0x60, 0x62, 0xe0, 0x68, 0x63, 0x69, + 0x29, 0x1c, 0xee, 0xf7, 0xa3, 0xfe, 0xe8, 0x68, + 0x01, 0x68, 0x08, 0x31, 0x0b, 0x20, 0x00, 0xf0, + 0x5c, 0xfe, 0xc3, 0xe7, 0x01, 0x30, 0xa0, 0x86, + 0xa0, 0x8d, 0x3c, 0x00, 0xac, 0x16, 0x01, 0x00, + 0xe1, 0x8d, 0x88, 0x42, 0x04, 0xd1, 0x03, 0x21, + 0x02, 0x20, 0xef, 0xf7, 0xf5, 0xfd, 0xb8, 0xe7, + 0x60, 0x68, 0x45, 0x60, 0x86, 0x60, 0x00, 0x68, + 0x60, 0x60, 0xf8, 0x68, 0x01, 0x30, 0xf8, 0x60, + 0xa0, 0x8d, 0x41, 0x1c, 0xa1, 0x85, 0x00, 0x28, + 0xab, 0xd1, 0x08, 0x48, 0xb9, 0x69, 0xfd, 0xf7, + 0x61, 0xfe, 0x22, 0x1c, 0x02, 0x21, 0xf1, 0x20, + 0x02, 0xf0, 0x64, 0xf8, 0x3c, 0x00, 0xe8, 0x16, + 0x01, 0x00, 0xa1, 0xe7, 0x00, 0x00, 0xfc, 0x5a, + 0x01, 0x00, 0x90, 0x5c, 0x01, 0x00, 0x18, 0x57, + 0x01, 0x00, 0xc4, 0x60, 0x01, 0x00, 0x80, 0xb5, + 0x02, 0x1c, 0x02, 0x21, 0xf0, 0x20, 0x02, 0xf0, + 0x54, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x28, + 0x03, 0xd1, 0x02, 0x48, 0x41, 0x78, 0xc9, 0x07, + 0xfc, 0xd5, 0x70, 0x47, 0x00, 0x00, 0x04, 0x00, + 0x07, 0x00, 0x80, 0xb5, 0x00, 0x06, 0x3c, 0x00, + 0x24, 0x17, 0x01, 0x00, 0x01, 0xd1, 0xf1, 0xf7, + 0x71, 0xfe, 0x80, 0xbd, 0x80, 0xb5, 0xf4, 0xf7, + 0xe5, 0xfa, 0x80, 0xbd, 0x80, 0xb5, 0xf6, 0xf7, + 0xeb, 0xf8, 0x80, 0xbd, 0x01, 0x49, 0x00, 0x20, + 0x08, 0x74, 0x70, 0x47, 0x78, 0x69, 0x01, 0x00, + 0x80, 0xb5, 0xc0, 0x07, 0x03, 0xd5, 0x02, 0x49, + 0x01, 0x20, 0x00, 0xf0, 0x1d, 0xfc, 0x80, 0xbd, + 0x50, 0xc3, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0e, + 0x3c, 0x00, 0x60, 0x17, 0x01, 0x00, 0x01, 0x28, + 0x80, 0xb5, 0x02, 0xd1, 0xf6, 0xf7, 0xe1, 0xf9, + 0x80, 0xbd, 0x00, 0x28, 0xfc, 0xd1, 0xf1, 0xf7, + 0x4c, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, + 0xf6, 0xf7, 0xd7, 0xf9, 0x80, 0xbd, 0x03, 0x49, + 0x80, 0xb5, 0x00, 0x20, 0x08, 0x74, 0xf6, 0xf7, + 0xfe, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x78, 0x69, + 0x01, 0x00, 0x80, 0xb5, 0x00, 0x06, 0x00, 0x0e, + 0xf1, 0xf7, 0x3c, 0x00, 0x9c, 0x17, 0x01, 0x00, + 0x71, 0xfe, 0x80, 0xbd, 0x10, 0xb5, 0x01, 0x28, + 0x08, 0xd0, 0x02, 0x28, 0x03, 0xd0, 0x03, 0x28, + 0x01, 0xd0, 0xef, 0xf7, 0xa7, 0xfd, 0xf6, 0xf7, + 0xe9, 0xf9, 0x10, 0xbd, 0x01, 0xf0, 0xf8, 0xfa, + 0x04, 0x1c, 0xfa, 0xf7, 0x5d, 0xfd, 0x24, 0x1a, + 0xfa, 0xf7, 0x3e, 0xfd, 0x08, 0x49, 0x00, 0x28, + 0x0b, 0xd0, 0x48, 0x6a, 0x00, 0x28, 0x08, 0xd0, + 0x06, 0x48, 0x84, 0x42, 0x3c, 0x00, 0xd8, 0x17, + 0x01, 0x00, 0x05, 0xd2, 0x01, 0x1b, 0x01, 0x22, + 0x07, 0x20, 0x01, 0xf0, 0xf4, 0xfe, 0xe5, 0xe7, + 0x00, 0x20, 0x48, 0x61, 0xe2, 0xe7, 0x78, 0x69, + 0x01, 0x00, 0x50, 0xc3, 0x00, 0x00, 0x09, 0x49, + 0x80, 0xb5, 0x48, 0x69, 0x00, 0x28, 0x0c, 0xd0, + 0x08, 0x6a, 0xca, 0x69, 0x80, 0x1a, 0x00, 0x28, + 0x07, 0xdd, 0x00, 0x20, 0x48, 0x61, 0x01, 0x21, + 0x07, 0x20, 0x01, 0xf0, 0x10, 0xff, 0x3c, 0x00, + 0x14, 0x18, 0x01, 0x00, 0xf6, 0xf7, 0xb8, 0xf9, + 0x80, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, + 0x80, 0xb5, 0x00, 0xf0, 0xe7, 0xfb, 0x80, 0xbd, + 0x80, 0xb5, 0x00, 0xf0, 0x3f, 0xfc, 0x00, 0x20, + 0xf7, 0xf7, 0xd4, 0xfc, 0x80, 0xbd, 0x00, 0x00, + 0x80, 0xb5, 0x00, 0xf0, 0x37, 0xfc, 0xfd, 0xf7, + 0x6f, 0xfc, 0xf5, 0xf7, 0x73, 0xfd, 0x30, 0xf0, + 0x47, 0xfb, 0x80, 0xbd, 0x04, 0x48, 0x80, 0xb5, + 0x3c, 0x00, 0x50, 0x18, 0x01, 0x00, 0xc1, 0x6a, + 0x00, 0x6b, 0xf2, 0xf7, 0xde, 0xff, 0x01, 0x20, + 0xf7, 0xf7, 0x89, 0xf8, 0x80, 0xbd, 0xa4, 0x6c, + 0x01, 0x00, 0x10, 0xb5, 0xf3, 0xf7, 0x41, 0xf8, + 0x0d, 0x4c, 0x00, 0x28, 0x04, 0xd0, 0x01, 0x20, + 0xe0, 0x64, 0xf7, 0xf7, 0xb2, 0xfc, 0x10, 0xbd, + 0x01, 0x21, 0x01, 0x20, 0xf3, 0xf7, 0xe9, 0xf8, + 0xfd, 0xf7, 0x4d, 0xfc, 0x60, 0x6d, 0x00, 0x28, + 0x03, 0xd0, 0x3c, 0x00, 0x8c, 0x18, 0x01, 0x00, + 0xf3, 0xf7, 0x82, 0xf8, 0x00, 0x28, 0x01, 0xd0, + 0xf5, 0xf7, 0x4a, 0xfd, 0x01, 0x20, 0xf2, 0xf7, + 0xc1, 0xfc, 0x10, 0xbd, 0xa4, 0x6c, 0x01, 0x00, + 0x04, 0x48, 0x80, 0xb5, 0xc1, 0x6a, 0x00, 0x6b, + 0xf2, 0xf7, 0xb2, 0xff, 0x01, 0x20, 0xf7, 0xf7, + 0x5d, 0xf8, 0x80, 0xbd, 0xa4, 0x6c, 0x01, 0x00, + 0x80, 0xb5, 0x00, 0xf0, 0xf5, 0xfb, 0xf5, 0xf7, + 0x33, 0xfd, 0xfc, 0xf7, 0x3c, 0x00, 0xc8, 0x18, + 0x01, 0x00, 0x31, 0xfd, 0xf9, 0xf7, 0xcb, 0xff, + 0x04, 0x20, 0xf2, 0xf7, 0xa6, 0xfc, 0x80, 0xbd, + 0x00, 0x00, 0x03, 0x48, 0x80, 0xb5, 0xc1, 0x6a, + 0x00, 0x6b, 0xf2, 0xf7, 0x98, 0xff, 0x80, 0xbd, + 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x80, 0xb5, + 0x00, 0xf0, 0xdd, 0xfb, 0x00, 0x20, 0xf7, 0xf7, + 0x3c, 0xf8, 0x30, 0xf0, 0xee, 0xfa, 0x80, 0xbd, + 0x00, 0x00, 0x80, 0xb5, 0x00, 0x21, 0x3c, 0x00, + 0x04, 0x19, 0x01, 0x00, 0x01, 0x20, 0xff, 0xf7, + 0x19, 0xfa, 0x01, 0x20, 0xf2, 0xf7, 0x88, 0xfc, + 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x00, 0xf0, + 0xc9, 0xfb, 0xfc, 0xf7, 0x07, 0xfd, 0x01, 0x21, + 0x01, 0x20, 0xff, 0xf7, 0x0b, 0xfa, 0x04, 0x20, + 0xf2, 0xf7, 0x7a, 0xfc, 0x80, 0xbd, 0x00, 0x00, + 0x80, 0xb5, 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, + 0x00, 0xf0, 0x8a, 0xfb, 0x80, 0xbd, 0x00, 0x00, + 0x3c, 0x00, 0x40, 0x19, 0x01, 0x00, 0x03, 0x48, + 0x80, 0xb5, 0x82, 0x6a, 0x01, 0x21, 0x04, 0x20, + 0x00, 0xf0, 0x81, 0xfb, 0x80, 0xbd, 0xd4, 0x79, + 0x01, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x00, 0x21, + 0x03, 0x20, 0x00, 0xf0, 0x78, 0xfb, 0x80, 0xbd, + 0x00, 0x00, 0x03, 0x48, 0x80, 0xb5, 0x82, 0x6a, + 0x01, 0x21, 0x04, 0x20, 0x00, 0xf0, 0x6f, 0xfb, + 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x80, 0xb5, + 0x00, 0x22, 0x3c, 0x00, 0x7c, 0x19, 0x01, 0x00, + 0x00, 0x21, 0x03, 0x20, 0x00, 0xf0, 0x66, 0xfb, + 0x80, 0xbd, 0x00, 0x00, 0x06, 0x48, 0x80, 0xb5, + 0x81, 0x68, 0x42, 0x69, 0x00, 0x69, 0x51, 0x18, + 0x81, 0x42, 0x03, 0xd9, 0x01, 0x21, 0x01, 0x20, + 0x00, 0xf0, 0x58, 0xfb, 0x80, 0xbd, 0x00, 0x00, + 0xd4, 0x79, 0x01, 0x00, 0x06, 0x48, 0x80, 0xb5, + 0x82, 0x88, 0x81, 0x68, 0x00, 0x69, 0x51, 0x18, + 0x81, 0x42, 0x03, 0xd9, 0x3c, 0x00, 0xb8, 0x19, + 0x01, 0x00, 0x01, 0x21, 0x02, 0x20, 0x00, 0xf0, + 0x48, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0xd4, 0x79, + 0x01, 0x00, 0x10, 0xb5, 0x08, 0x4c, 0x20, 0x7b, + 0x21, 0x6a, 0xf9, 0xf7, 0x9c, 0xfa, 0xa1, 0x69, + 0x42, 0x18, 0xa0, 0x68, 0x21, 0x69, 0x80, 0x18, + 0x88, 0x42, 0x03, 0xd9, 0x01, 0x21, 0x02, 0x20, + 0x00, 0xf0, 0x33, 0xfb, 0x10, 0xbd, 0xd4, 0x79, + 0x01, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x3c, 0x00, + 0xf4, 0x19, 0x01, 0x00, 0x00, 0x21, 0x00, 0x20, + 0x00, 0xf0, 0x2a, 0xfb, 0x80, 0xbd, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x0e, 0x01, 0x28, 0x80, 0xb5, + 0x02, 0xd1, 0xf6, 0xf7, 0x8f, 0xf8, 0x80, 0xbd, + 0x00, 0x28, 0xfc, 0xd1, 0xf1, 0xf7, 0xfa, 0xfc, + 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0xf6, 0xf7, + 0x85, 0xf8, 0x80, 0xbd, 0x80, 0xb5, 0x00, 0x06, + 0x00, 0x0e, 0xf1, 0xf7, 0x29, 0xfd, 0x80, 0xbd, + 0x3c, 0x00, 0x30, 0x1a, 0x01, 0x00, 0xb0, 0xb5, + 0x02, 0x25, 0x02, 0x28, 0x10, 0x4c, 0x0b, 0xd1, + 0xfb, 0xf7, 0x47, 0xfc, 0x00, 0x28, 0x01, 0xd1, + 0xfe, 0xf7, 0x4f, 0xff, 0x25, 0x70, 0xa1, 0x68, + 0x0c, 0x48, 0xfd, 0xf7, 0xa8, 0xfc, 0xb0, 0xbd, + 0x03, 0x28, 0x0d, 0xd1, 0x08, 0x48, 0x7d, 0x23, + 0x1c, 0x38, 0x00, 0x69, 0xdb, 0x00, 0x58, 0x43, + 0x19, 0x1c, 0x40, 0x18, 0x41, 0x08, 0x02, 0x20, + 0x00, 0xf0, 0x3c, 0x00, 0x6c, 0x1a, 0x01, 0x00, + 0x91, 0xfa, 0x25, 0x70, 0xb0, 0xbd, 0xf8, 0xf7, + 0x31, 0xf9, 0xb0, 0xbd, 0x78, 0x69, 0x01, 0x00, + 0x34, 0x63, 0x01, 0x00, 0x10, 0xb5, 0x05, 0x4c, + 0xe0, 0x68, 0x00, 0x28, 0x01, 0xd1, 0xef, 0xf7, + 0x39, 0xfc, 0x02, 0x20, 0x20, 0x70, 0x00, 0xf0, + 0xaf, 0xfa, 0x10, 0xbd, 0x78, 0x69, 0x01, 0x00, + 0x03, 0x48, 0x80, 0xb5, 0x82, 0x6a, 0x01, 0x21, + 0x04, 0x20, 0x00, 0xf0, 0x3c, 0x00, 0xa8, 0x1a, + 0x01, 0x00, 0xd3, 0xfa, 0x80, 0xbd, 0xd4, 0x79, + 0x01, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x00, 0x21, + 0x03, 0x20, 0x00, 0xf0, 0xca, 0xfa, 0x80, 0xbd, + 0x00, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x00, 0x21, + 0x00, 0x20, 0x00, 0xf0, 0xc2, 0xfa, 0x80, 0xbd, + 0x00, 0x00, 0x03, 0x48, 0x80, 0xb5, 0x42, 0x69, + 0x01, 0x21, 0x01, 0x20, 0x00, 0xf0, 0xb9, 0xfa, + 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x3c, 0x00, + 0xe4, 0x1a, 0x01, 0x00, 0x06, 0x48, 0x80, 0xb5, + 0x82, 0x88, 0x00, 0x2a, 0x02, 0xd0, 0x01, 0x21, + 0x02, 0x20, 0x02, 0xe0, 0x00, 0x22, 0x00, 0x21, + 0x00, 0x20, 0x00, 0xf0, 0xa9, 0xfa, 0x80, 0xbd, + 0xd4, 0x79, 0x01, 0x00, 0x10, 0xb5, 0x06, 0x4c, + 0x20, 0x7b, 0x21, 0x6a, 0xf9, 0xf7, 0xfe, 0xf9, + 0xa1, 0x69, 0x42, 0x18, 0x01, 0x21, 0x02, 0x20, + 0x00, 0xf0, 0x9a, 0xfa, 0x10, 0xbd, 0x00, 0x00, + 0x3c, 0x00, 0x20, 0x1b, 0x01, 0x00, 0xd4, 0x79, + 0x01, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x00, 0x21, + 0x00, 0x20, 0x00, 0xf0, 0x90, 0xfa, 0x80, 0xbd, + 0x00, 0x00, 0x38, 0xb5, 0xfa, 0xf7, 0x41, 0xfe, + 0x00, 0x20, 0xf0, 0xf7, 0x80, 0xf8, 0x00, 0x90, + 0x00, 0xab, 0x1c, 0x88, 0x5d, 0x88, 0xf8, 0xf7, + 0x3c, 0xf9, 0x00, 0x2c, 0x02, 0xd0, 0xfd, 0xf7, + 0x9e, 0xfa, 0x02, 0xe0, 0x01, 0x20, 0xf6, 0xf7, + 0x0a, 0xff, 0x3c, 0x00, 0x5c, 0x1b, 0x01, 0x00, + 0x29, 0x1c, 0x20, 0x1c, 0xfc, 0xf7, 0xb8, 0xfc, + 0x00, 0x2c, 0x02, 0xd0, 0xf5, 0xf7, 0xe0, 0xfb, + 0x02, 0xe0, 0x00, 0x20, 0x00, 0xf0, 0xdc, 0xf9, + 0x03, 0x20, 0x00, 0x2c, 0x00, 0xd1, 0x02, 0x20, + 0x00, 0x06, 0x00, 0x0e, 0xf2, 0xf7, 0x4e, 0xfb, + 0x38, 0xbd, 0x00, 0x00, 0x03, 0x48, 0x80, 0xb5, + 0x82, 0x6a, 0x01, 0x21, 0x04, 0x20, 0x00, 0xf0, + 0x5d, 0xfa, 0x80, 0xbd, 0x3c, 0x00, 0x98, 0x1b, + 0x01, 0x00, 0xd4, 0x79, 0x01, 0x00, 0x80, 0xb5, + 0x30, 0xf0, 0x9b, 0xf9, 0x80, 0xbd, 0x80, 0xb5, + 0x00, 0x22, 0x00, 0x21, 0x03, 0x20, 0x00, 0xf0, + 0x50, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x03, 0x48, + 0x80, 0xb5, 0x42, 0x69, 0x01, 0x21, 0x01, 0x20, + 0x00, 0xf0, 0x47, 0xfa, 0x80, 0xbd, 0xd4, 0x79, + 0x01, 0x00, 0x04, 0x48, 0x80, 0xb5, 0x82, 0x88, + 0x00, 0x2a, 0x03, 0xd0, 0x01, 0x21, 0x3c, 0x00, + 0xd4, 0x1b, 0x01, 0x00, 0x02, 0x20, 0x00, 0xf0, + 0x3b, 0xfa, 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, + 0x10, 0xb5, 0x06, 0x4c, 0x20, 0x7b, 0x21, 0x6a, + 0xf9, 0xf7, 0x90, 0xf9, 0xa1, 0x69, 0x42, 0x18, + 0x01, 0x21, 0x02, 0x20, 0x00, 0xf0, 0x2c, 0xfa, + 0x10, 0xbd, 0x00, 0x00, 0xd4, 0x79, 0x01, 0x00, + 0x80, 0xb5, 0xfc, 0xf7, 0x93, 0xfb, 0x01, 0x21, + 0x01, 0x20, 0xff, 0xf7, 0x97, 0xf8, 0x04, 0x20, + 0x3c, 0x00, 0x10, 0x1c, 0x01, 0x00, 0xf2, 0xf7, + 0x06, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, + 0x2f, 0xf0, 0x6b, 0xfb, 0x00, 0x28, 0x0a, 0xd0, + 0x01, 0x20, 0xf2, 0xf7, 0xfc, 0xfa, 0xfa, 0xf7, + 0x2a, 0xfc, 0x00, 0x28, 0x02, 0xd1, 0x04, 0x20, + 0xf6, 0xf7, 0x5d, 0xf8, 0x80, 0xbd, 0x03, 0x21, + 0x16, 0x20, 0xef, 0xf7, 0x32, 0xfb, 0x80, 0xbd, + 0x00, 0x00, 0x02, 0x48, 0x80, 0xb5, 0x00, 0x68, + 0xee, 0xf7, 0x3c, 0x00, 0x4c, 0x1c, 0x01, 0x00, + 0xc5, 0xfb, 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, + 0x03, 0x48, 0x80, 0xb5, 0x42, 0x69, 0x01, 0x21, + 0x01, 0x20, 0x00, 0xf0, 0xf7, 0xf9, 0x80, 0xbd, + 0xd4, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x30, 0xf0, + 0x35, 0xf9, 0x80, 0xbd, 0xb0, 0xb5, 0x18, 0x4c, + 0xaa, 0x20, 0x00, 0x5d, 0x04, 0x28, 0x19, 0xd1, + 0x01, 0x25, 0xe5, 0x62, 0x25, 0x63, 0x01, 0xf0, + 0x93, 0xf8, 0xa0, 0x66, 0x3c, 0x00, 0x88, 0x1c, + 0x01, 0x00, 0x01, 0xf0, 0xfc, 0xfd, 0xf2, 0xf7, + 0x2e, 0xfe, 0x00, 0x28, 0x0e, 0xd0, 0x02, 0x20, + 0xf2, 0xf7, 0xc3, 0xfa, 0xa5, 0x60, 0x01, 0xf0, + 0x86, 0xf8, 0x64, 0x30, 0x60, 0x60, 0xfa, 0xf7, + 0x8a, 0xfd, 0x01, 0x21, 0x01, 0x20, 0xff, 0xf7, + 0x46, 0xf8, 0xb0, 0xbd, 0x01, 0x20, 0xf2, 0xf7, + 0xb4, 0xfa, 0x00, 0x20, 0xa0, 0x60, 0x00, 0x21, + 0x01, 0x20, 0xff, 0xf7, 0x3c, 0xf8, 0x3c, 0x00, + 0xc4, 0x1c, 0x01, 0x00, 0xf2, 0xf7, 0x66, 0xfe, + 0x00, 0x28, 0xf1, 0xd0, 0xfa, 0xf7, 0x76, 0xfd, + 0xb0, 0xbd, 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, + 0x80, 0xb5, 0x00, 0x20, 0xef, 0xf7, 0xd6, 0xfe, + 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x01, 0x20, + 0xef, 0xf7, 0xd0, 0xfe, 0x80, 0xbd, 0x00, 0x00, + 0xac, 0x21, 0x09, 0x5c, 0x02, 0x4a, 0x09, 0x02, + 0x89, 0x18, 0xc0, 0x31, 0x81, 0x60, 0x70, 0x47, + 0x3c, 0x00, 0x00, 0x1d, 0x01, 0x00, 0x70, 0x75, + 0x01, 0x00, 0x80, 0xb5, 0x01, 0x28, 0x04, 0xd1, + 0x03, 0xc9, 0x09, 0x68, 0xee, 0xf7, 0x64, 0xfb, + 0x80, 0xbd, 0x01, 0x21, 0x14, 0x20, 0xef, 0xf7, + 0xc4, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x28, + 0x02, 0xd1, 0x02, 0x48, 0x40, 0x68, 0x70, 0x47, + 0x40, 0x68, 0x70, 0x47, 0x00, 0x00, 0x58, 0x75, + 0x01, 0x00, 0x10, 0xb5, 0x00, 0x24, 0xf8, 0xf7, + 0x1c, 0xfb, 0x3c, 0x00, 0x3c, 0x1d, 0x01, 0x00, + 0x00, 0x28, 0x04, 0xd0, 0x40, 0x30, 0x80, 0x7a, + 0x05, 0x28, 0x00, 0xd1, 0x01, 0x24, 0x20, 0x1c, + 0x10, 0xbd, 0x00, 0x00, 0x04, 0x48, 0x00, 0x21, + 0x40, 0x68, 0x01, 0xe0, 0x01, 0x63, 0x40, 0x68, + 0x00, 0x28, 0xfb, 0xd1, 0x70, 0x47, 0x00, 0x00, + 0x58, 0x75, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, + 0x0d, 0x1c, 0xf7, 0xf7, 0xa5, 0xf8, 0x40, 0x34, + 0xe5, 0x72, 0xb0, 0xbd, 0x3c, 0x00, 0x78, 0x1d, + 0x01, 0x00, 0xf8, 0xb5, 0x07, 0x1c, 0xf8, 0xf7, + 0xfa, 0xfa, 0x04, 0x1c, 0x04, 0xd0, 0x05, 0x21, + 0x14, 0x20, 0xef, 0xf7, 0x8c, 0xfa, 0x28, 0xe0, + 0x00, 0x25, 0x14, 0x49, 0x28, 0x02, 0x46, 0x18, + 0x30, 0x1c, 0x44, 0x30, 0x06, 0x22, 0x12, 0x49, + 0xee, 0xf7, 0x2d, 0xfb, 0x00, 0x28, 0x02, 0xd1, + 0xac, 0x20, 0x85, 0x55, 0x34, 0x1c, 0x01, 0x35, + 0x03, 0x2d, 0xee, 0xd3, 0x00, 0x2c, 0x3c, 0x00, + 0xb4, 0x1d, 0x01, 0x00, 0x14, 0xd0, 0x39, 0x1c, + 0x20, 0x1c, 0xf8, 0xf7, 0x2b, 0xf8, 0x09, 0x49, + 0x00, 0x20, 0x20, 0x60, 0x18, 0x39, 0x48, 0x68, + 0x60, 0x60, 0x00, 0x28, 0x00, 0xd0, 0x04, 0x60, + 0x4c, 0x60, 0xca, 0x68, 0x00, 0x2a, 0x03, 0xd0, + 0x01, 0x21, 0x20, 0x1c, 0xee, 0xf7, 0xfe, 0xfa, + 0x20, 0x1c, 0xf8, 0xbd, 0x70, 0x75, 0x01, 0x00, + 0x58, 0x46, 0x01, 0x00, 0x80, 0xb5, 0xf8, 0xf7, + 0x3c, 0x00, 0xf0, 0x1d, 0x01, 0x00, 0xc1, 0xfa, + 0x00, 0x28, 0x04, 0xd1, 0x06, 0x21, 0x14, 0x20, + 0xef, 0xf7, 0x53, 0xfa, 0x80, 0xbd, 0xf5, 0xf7, + 0x16, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, + 0xf8, 0xf7, 0xb3, 0xfa, 0x80, 0xbd, 0x10, 0xb5, + 0x09, 0x4c, 0x21, 0x88, 0x02, 0x29, 0x03, 0xd1, + 0x14, 0x20, 0xef, 0xf7, 0x42, 0xfa, 0x04, 0xe0, + 0xa3, 0x68, 0x8a, 0x00, 0x98, 0x50, 0x48, 0x1c, + 0x20, 0x80, 0x3c, 0x00, 0x2c, 0x1e, 0x01, 0x00, + 0x20, 0x88, 0x01, 0x38, 0x00, 0x04, 0x00, 0x0c, + 0x10, 0xbd, 0x00, 0x00, 0x58, 0x75, 0x01, 0x00, + 0x0b, 0x1c, 0x11, 0x1c, 0x08, 0x4a, 0x80, 0xb5, + 0x12, 0x88, 0x90, 0x42, 0x06, 0xd2, 0xda, 0x68, + 0xc0, 0x00, 0x12, 0x18, 0x14, 0x20, 0x01, 0xf0, + 0xbb, 0xfb, 0x80, 0xbd, 0x03, 0x21, 0x14, 0x20, + 0xef, 0xf7, 0x22, 0xfa, 0x80, 0xbd, 0x00, 0x00, + 0x58, 0x75, 0x01, 0x00, 0x3c, 0x00, 0x68, 0x1e, + 0x01, 0x00, 0x08, 0x4a, 0x80, 0xb5, 0x12, 0x88, + 0x90, 0x42, 0x06, 0xd2, 0xc9, 0x68, 0xc0, 0x00, + 0x09, 0x18, 0x14, 0x20, 0x01, 0xf0, 0xdb, 0xfb, + 0x80, 0xbd, 0x04, 0x21, 0x14, 0x20, 0xef, 0xf7, + 0x0e, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x58, 0x75, + 0x01, 0x00, 0x01, 0x49, 0xc8, 0x60, 0x70, 0x47, + 0x00, 0x00, 0x58, 0x75, 0x01, 0x00, 0x80, 0xb5, + 0x06, 0x22, 0x44, 0x30, 0xee, 0xf7, 0x3c, 0x00, + 0xa4, 0x1e, 0x01, 0x00, 0xab, 0xfa, 0x00, 0x28, + 0x01, 0xd1, 0x01, 0x20, 0x80, 0xbd, 0x00, 0x20, + 0x80, 0xbd, 0x00, 0x00, 0x1c, 0xb5, 0x14, 0x4c, + 0x20, 0x69, 0x00, 0x28, 0x23, 0xd0, 0x20, 0x78, + 0x0a, 0x28, 0x01, 0xd0, 0x00, 0xf0, 0xfc, 0xf8, + 0x00, 0x20, 0x60, 0x61, 0x0f, 0x48, 0x40, 0x79, + 0xa0, 0x70, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x28, + 0x15, 0xd1, 0xfd, 0xf7, 0xed, 0xfe, 0x01, 0x90, + 0x3c, 0x00, 0xe0, 0x1e, 0x01, 0x00, 0xfd, 0xf7, + 0x82, 0xfe, 0x00, 0x90, 0x00, 0xab, 0x18, 0x79, + 0x19, 0x78, 0x40, 0x1a, 0x18, 0x71, 0x58, 0x79, + 0x59, 0x78, 0x40, 0x1a, 0x58, 0x71, 0x01, 0x98, + 0xf2, 0xf7, 0x89, 0xfe, 0x05, 0x20, 0x20, 0x70, + 0x00, 0xf0, 0xbf, 0xf9, 0x1c, 0xbd, 0x7c, 0x78, + 0x01, 0x00, 0x0c, 0x5a, 0x01, 0x00, 0x08, 0xb5, + 0x04, 0x4a, 0x00, 0x90, 0x14, 0x32, 0x00, 0x20, + 0x02, 0x4b, 0x3c, 0x00, 0x1c, 0x1f, 0x01, 0x00, + 0x02, 0x49, 0xf1, 0xf7, 0x7d, 0xf9, 0x08, 0xbd, + 0x2c, 0x75, 0x01, 0x00, 0xb1, 0xa8, 0x00, 0x00, + 0xb0, 0xb5, 0x00, 0x28, 0x06, 0xd0, 0x01, 0x28, + 0x06, 0xd0, 0x02, 0x28, 0x07, 0xd1, 0x0c, 0x4c, + 0x01, 0x25, 0x07, 0xe0, 0x0b, 0x4c, 0x04, 0xe0, + 0x0a, 0x4c, 0x2a, 0x3c, 0x01, 0xe0, 0x08, 0x4c, + 0xb6, 0x34, 0x00, 0x25, 0x00, 0xf0, 0x2c, 0xff, + 0x07, 0x49, 0x89, 0x6e, 0x3c, 0x00, 0x58, 0x1f, + 0x01, 0x00, 0x09, 0x19, 0x09, 0x1a, 0xa1, 0x42, + 0x00, 0xd9, 0x00, 0x21, 0x2a, 0x1c, 0x16, 0x20, + 0x01, 0xf0, 0x31, 0xfb, 0xb0, 0xbd, 0x71, 0x02, + 0x00, 0x00, 0x0c, 0x05, 0x00, 0x00, 0xa4, 0x6c, + 0x01, 0x00, 0x8c, 0xb5, 0x00, 0xab, 0x8e, 0x21, + 0x19, 0x80, 0xfc, 0xf7, 0x38, 0xf9, 0x01, 0x90, + 0x68, 0x46, 0xfb, 0xf7, 0xa6, 0xfa, 0x8c, 0xbd, + 0x00, 0x00, 0xbf, 0xb5, 0x13, 0x4a, 0x3c, 0x00, + 0x94, 0x1f, 0x01, 0x00, 0x01, 0x91, 0x0d, 0x1c, + 0x11, 0x7c, 0x88, 0x43, 0x04, 0x1c, 0x21, 0x43, + 0x08, 0x1c, 0x10, 0x74, 0xa0, 0x07, 0x0b, 0xd5, + 0x0e, 0x48, 0x00, 0x90, 0x01, 0x20, 0x02, 0x90, + 0x00, 0xf0, 0xfc, 0xfe, 0x0c, 0x49, 0x40, 0x18, + 0x03, 0x90, 0x68, 0x46, 0xf9, 0xf7, 0x6a, 0xff, + 0xe0, 0x07, 0x0c, 0xd5, 0xf1, 0xf7, 0x2c, 0xfd, + 0x00, 0x28, 0x03, 0xd0, 0x07, 0x48, 0x85, 0x42, + 0x3c, 0x00, 0xd0, 0x1f, 0x01, 0x00, 0x00, 0xd2, + 0x01, 0x90, 0x06, 0x48, 0x00, 0x90, 0x68, 0x46, + 0xf9, 0xf7, 0x09, 0xff, 0xbf, 0xbd, 0x78, 0x69, + 0x01, 0x00, 0x81, 0xea, 0x00, 0x00, 0x10, 0x27, + 0x00, 0x00, 0xa0, 0x86, 0x01, 0x00, 0x75, 0xea, + 0x00, 0x00, 0x10, 0xb5, 0x0a, 0x4c, 0x60, 0x69, + 0x00, 0x28, 0x0e, 0xd1, 0x01, 0x20, 0x60, 0x61, + 0xa1, 0x68, 0x07, 0x48, 0xfd, 0xf7, 0xcb, 0xf9, + 0x00, 0x21, 0x3c, 0x00, 0x0c, 0x20, 0x01, 0x00, + 0xa0, 0x68, 0xf9, 0xf7, 0xd1, 0xfb, 0x01, 0x22, + 0x07, 0x20, 0x04, 0x49, 0x01, 0xf0, 0xd8, 0xfa, + 0x10, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, + 0x34, 0x63, 0x01, 0x00, 0x98, 0x3a, 0x00, 0x00, + 0x10, 0xb5, 0x0c, 0x1c, 0x11, 0x1c, 0x06, 0x4a, + 0x00, 0x2b, 0x10, 0x70, 0x03, 0xd0, 0x00, 0x28, + 0x02, 0xd1, 0xf9, 0xf7, 0xf5, 0xfd, 0x10, 0xbd, + 0x20, 0x1c, 0xf9, 0xf7, 0x3c, 0x00, 0x48, 0x20, + 0x01, 0x00, 0x01, 0xfe, 0x10, 0xbd, 0xa0, 0x79, + 0x01, 0x00, 0xb0, 0xb5, 0x0a, 0x4c, 0x05, 0x1c, + 0xe3, 0x6a, 0x20, 0x1f, 0x01, 0x33, 0xe3, 0x62, + 0x00, 0x88, 0x00, 0x29, 0x06, 0xd0, 0xa1, 0x68, + 0x89, 0x18, 0x21, 0x61, 0x05, 0x4a, 0x00, 0xf0, + 0xfc, 0xfe, 0x01, 0xe0, 0x00, 0xf0, 0xcf, 0xfe, + 0x25, 0x77, 0xb0, 0xbd, 0x00, 0x00, 0xd4, 0x79, + 0x01, 0x00, 0x55, 0xe3, 0x00, 0x00, 0x3c, 0x00, + 0x84, 0x20, 0x01, 0x00, 0x01, 0x1c, 0x03, 0x48, + 0x80, 0xb5, 0x40, 0x88, 0xff, 0xf7, 0xec, 0xfe, + 0x80, 0xbd, 0x00, 0x00, 0x98, 0x7c, 0x01, 0x00, + 0x03, 0x48, 0x80, 0xb5, 0xc1, 0x68, 0x18, 0x38, + 0x80, 0x88, 0xff, 0xf7, 0xe1, 0xfe, 0x80, 0xbd, + 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x21, + 0x16, 0x20, 0x01, 0xf0, 0xbf, 0xfa, 0x01, 0x21, + 0x16, 0x20, 0x01, 0xf0, 0xbb, 0xfa, 0x80, 0xbd, + 0x3c, 0x00, 0xc0, 0x20, 0x01, 0x00, 0x10, 0xb5, + 0x0b, 0x4c, 0x20, 0x78, 0x0a, 0x28, 0x10, 0xd0, + 0x01, 0x20, 0x60, 0x61, 0x0a, 0x21, 0x13, 0x20, + 0x01, 0xf0, 0xaf, 0xfa, 0x0a, 0x20, 0x60, 0x70, + 0x20, 0x70, 0xfd, 0xf7, 0x3c, 0xfb, 0x01, 0x20, + 0xfd, 0xf7, 0xe9, 0xfb, 0x00, 0x20, 0xfa, 0xf7, + 0xc4, 0xf9, 0x10, 0xbd, 0x00, 0x00, 0x7c, 0x78, + 0x01, 0x00, 0x10, 0xb5, 0x0c, 0x4c, 0x00, 0x20, + 0x0b, 0x49, 0x3c, 0x00, 0xfc, 0x20, 0x01, 0x00, + 0x20, 0x63, 0xe0, 0x62, 0x50, 0x39, 0x88, 0x61, + 0x20, 0x70, 0x08, 0x48, 0x38, 0x21, 0x0c, 0x38, + 0x00, 0x7a, 0x08, 0x55, 0x81, 0x21, 0x18, 0x20, + 0x01, 0xf0, 0x8e, 0xfa, 0x20, 0x69, 0x01, 0x28, + 0x02, 0xd1, 0x00, 0x20, 0xf5, 0xf7, 0x3e, 0xfb, + 0x10, 0xbd, 0x00, 0x00, 0xf4, 0x6e, 0x01, 0x00, + 0xb0, 0xb5, 0x1c, 0x4c, 0x00, 0x25, 0x2c, 0x22, + 0x01, 0x1d, 0x20, 0x1c, 0x3c, 0x00, 0x38, 0x21, + 0x01, 0x00, 0x9a, 0xb0, 0xee, 0xf7, 0x39, 0xfa, + 0x18, 0x49, 0x2c, 0x31, 0x08, 0x1c, 0x00, 0x7a, + 0x8a, 0x69, 0x00, 0x2a, 0x13, 0xd1, 0x02, 0x28, + 0x03, 0xd1, 0xa0, 0x68, 0x00, 0x28, 0x20, 0xd0, + 0x04, 0xe0, 0x00, 0x28, 0x1d, 0xd1, 0x60, 0x68, + 0x00, 0x28, 0x1a, 0xd0, 0x80, 0x02, 0x88, 0x61, + 0x0e, 0x48, 0x69, 0x46, 0x24, 0x38, 0x00, 0x68, + 0xef, 0xf7, 0xcb, 0xfb, 0x11, 0xe0, 0x3c, 0x00, + 0x74, 0x21, 0x01, 0x00, 0x00, 0x22, 0x02, 0x28, + 0x03, 0xd1, 0xa0, 0x68, 0x00, 0x28, 0x09, 0xd1, + 0x04, 0xe0, 0x00, 0x28, 0x08, 0xd1, 0x60, 0x68, + 0x00, 0x28, 0x03, 0xd1, 0x8a, 0x61, 0xff, 0xf7, + 0xb1, 0xff, 0x01, 0xe0, 0x80, 0x02, 0x88, 0x61, + 0x28, 0x1c, 0x1a, 0xb0, 0xb0, 0xbd, 0x00, 0x00, + 0xc8, 0x6e, 0x01, 0x00, 0xf8, 0xb5, 0x0c, 0x49, + 0x02, 0x20, 0x48, 0x60, 0x0b, 0x49, 0x00, 0x05, + 0x3c, 0x00, 0xb0, 0x21, 0x01, 0x00, 0x08, 0x60, + 0x0b, 0x4f, 0xb8, 0x68, 0xf9, 0x68, 0x7c, 0x68, + 0x45, 0x1a, 0x2e, 0x1c, 0x04, 0xe0, 0xa0, 0x68, + 0x61, 0x68, 0xee, 0xf7, 0x09, 0xf9, 0x24, 0x68, + 0x01, 0x3d, 0xf8, 0xd2, 0x7c, 0x60, 0xf8, 0x68, + 0x80, 0x19, 0xf8, 0x60, 0xf8, 0xbd, 0x40, 0x20, + 0x07, 0x00, 0x00, 0x10, 0x07, 0x00, 0x44, 0xe3, + 0x01, 0x00, 0xf8, 0xb5, 0x1f, 0x4e, 0x04, 0x1c, + 0x30, 0x69, 0x3c, 0x00, 0xec, 0x21, 0x01, 0x00, + 0x01, 0x21, 0xf9, 0xf7, 0x99, 0xfa, 0x1d, 0x49, + 0x60, 0x00, 0x40, 0x18, 0x10, 0x38, 0x81, 0x7b, + 0x1b, 0x4a, 0x51, 0x72, 0xc0, 0x7b, 0x10, 0x74, + 0x1a, 0x4f, 0x1b, 0x4d, 0x0e, 0x2c, 0x0a, 0xd1, + 0x01, 0x22, 0x02, 0x21, 0x08, 0x20, 0x01, 0xf0, + 0xf3, 0xfb, 0x03, 0x20, 0xff, 0x21, 0x41, 0x31, + 0x39, 0x86, 0x14, 0x21, 0x08, 0xe0, 0x02, 0x22, + 0x01, 0x21, 0x08, 0x20, 0x3c, 0x00, 0x28, 0x22, + 0x01, 0x00, 0x01, 0xf0, 0xe8, 0xfb, 0x12, 0x49, + 0x02, 0x20, 0x39, 0x86, 0x10, 0x21, 0xa9, 0x71, + 0xe8, 0x71, 0x10, 0x48, 0x11, 0x4a, 0x00, 0x19, + 0x10, 0x38, 0xc0, 0x7b, 0x00, 0x28, 0x03, 0xd0, + 0x01, 0x21, 0x51, 0x73, 0x10, 0x73, 0x01, 0xe0, + 0x00, 0x20, 0x50, 0x73, 0x00, 0x21, 0x20, 0x1c, + 0xfd, 0xf7, 0xe5, 0xfd, 0x30, 0x69, 0xf9, 0xf7, + 0x08, 0xfb, 0xf8, 0xbd, 0x00, 0x00, 0x3c, 0x00, + 0x64, 0x22, 0x01, 0x00, 0x40, 0x7c, 0x01, 0x00, + 0x76, 0x46, 0x01, 0x00, 0x0c, 0x80, 0x07, 0x00, + 0x30, 0x80, 0x07, 0x00, 0x00, 0x80, 0x07, 0x00, + 0xff, 0x01, 0x00, 0x00, 0x5c, 0x57, 0x01, 0x00, + 0xd0, 0x80, 0x07, 0x00, 0x10, 0xb5, 0x15, 0x4c, + 0x14, 0x4a, 0x21, 0x78, 0x00, 0x20, 0x18, 0x32, + 0x05, 0x29, 0x1d, 0xd0, 0x06, 0x29, 0x1b, 0xd0, + 0x07, 0x29, 0x01, 0xd0, 0x08, 0x29, 0x06, 0xd1, + 0x3c, 0x00, 0xa0, 0x22, 0x01, 0x00, 0x91, 0x68, + 0x05, 0x20, 0x10, 0x29, 0x00, 0xdb, 0x06, 0x20, + 0x20, 0x70, 0x01, 0x20, 0xa1, 0x78, 0x00, 0x28, + 0x61, 0x70, 0x0b, 0xd0, 0x00, 0x20, 0xfa, 0xf7, + 0xdc, 0xf8, 0x00, 0x21, 0x60, 0x78, 0xf4, 0xf7, + 0x3c, 0xfa, 0x0a, 0x22, 0x1e, 0x21, 0x13, 0x20, + 0x01, 0xf0, 0x7f, 0xf9, 0x10, 0xbd, 0xd1, 0x69, + 0x07, 0x20, 0x10, 0x29, 0xe8, 0xdb, 0x08, 0x20, + 0xe6, 0xe7, 0x3c, 0x00, 0xdc, 0x22, 0x01, 0x00, + 0x7c, 0x78, 0x01, 0x00, 0xb0, 0xb5, 0x0d, 0x1c, + 0x01, 0x1c, 0x04, 0x1c, 0x44, 0x31, 0x00, 0x20, + 0xf6, 0xf7, 0x40, 0xfa, 0x30, 0x34, 0x00, 0x2d, + 0x07, 0xd0, 0x0e, 0xc8, 0x0e, 0xc4, 0x08, 0xc8, + 0x10, 0x38, 0x08, 0xc4, 0xf4, 0xf7, 0xc4, 0xf9, + 0xb0, 0xbd, 0x1e, 0xcc, 0x1e, 0xc0, 0xb0, 0xbd, + 0xf8, 0xb5, 0x08, 0x1c, 0x11, 0x1c, 0xf4, 0xf7, + 0x87, 0xfa, 0x08, 0x4c, 0x3c, 0x00, 0x18, 0x23, + 0x01, 0x00, 0x00, 0x25, 0x08, 0x4e, 0x08, 0x4f, + 0x06, 0xe0, 0x30, 0x6b, 0x00, 0x28, 0x03, 0xd0, + 0x35, 0x63, 0x20, 0x68, 0xee, 0xf7, 0x55, 0xf8, + 0x38, 0x68, 0x00, 0x28, 0xf5, 0xd0, 0xf8, 0xbd, + 0x00, 0x00, 0x5c, 0x5b, 0x01, 0x00, 0xe4, 0xfe, + 0x01, 0x00, 0x84, 0x5a, 0x01, 0x00, 0x80, 0xb5, + 0x00, 0x06, 0x00, 0x0e, 0x00, 0xf0, 0x07, 0xf8, + 0x80, 0xbd, 0x80, 0xb5, 0x0a, 0x1c, 0x3c, 0x00, + 0x54, 0x23, 0x01, 0x00, 0x23, 0x21, 0x01, 0xf0, + 0x2b, 0xfa, 0x80, 0xbd, 0xb0, 0xb5, 0x0d, 0x1c, + 0x04, 0x1c, 0x12, 0x28, 0x03, 0xd3, 0x01, 0x21, + 0x23, 0x20, 0xee, 0xf7, 0x9b, 0xff, 0x06, 0x49, + 0xa0, 0x00, 0x08, 0x58, 0x04, 0xe0, 0x12, 0xc8, + 0x28, 0x1c, 0xee, 0xf7, 0x2e, 0xf8, 0x20, 0x1c, + 0x00, 0x28, 0xf8, 0xd1, 0xb0, 0xbd, 0x00, 0x00, + 0x68, 0x5b, 0x01, 0x00, 0xf8, 0xb5, 0x0e, 0x1c, + 0x3c, 0x00, 0x90, 0x23, 0x01, 0x00, 0x00, 0x25, + 0x04, 0x1c, 0x12, 0x28, 0x03, 0xd3, 0x01, 0x21, + 0x23, 0x20, 0xee, 0xf7, 0x82, 0xff, 0x13, 0x48, + 0xa7, 0x00, 0xc4, 0x59, 0x08, 0xe0, 0x20, 0x68, + 0xb0, 0x42, 0x03, 0xd1, 0x03, 0x21, 0x23, 0x20, + 0xee, 0xf7, 0x77, 0xff, 0x25, 0x1c, 0x64, 0x68, + 0x00, 0x2c, 0xf4, 0xd1, 0x0c, 0x4a, 0x04, 0x3a, + 0x10, 0x68, 0x00, 0x28, 0x01, 0xd0, 0x41, 0x68, + 0x11, 0x60, 0x3c, 0x00, 0xcc, 0x23, 0x01, 0x00, + 0x00, 0x28, 0x04, 0xd1, 0x02, 0x21, 0x23, 0x20, + 0xee, 0xf7, 0x66, 0xff, 0xf8, 0xbd, 0x00, 0x21, + 0x41, 0x60, 0x06, 0x60, 0x00, 0x2d, 0x01, 0xd0, + 0x68, 0x60, 0xf7, 0xe7, 0x01, 0x49, 0xc8, 0x51, + 0xf4, 0xe7, 0x00, 0x00, 0x68, 0x5b, 0x01, 0x00, + 0x70, 0xb5, 0x0e, 0x1c, 0x05, 0x1c, 0x00, 0x24, + 0x12, 0x28, 0x03, 0xd3, 0x01, 0x21, 0x23, 0x20, + 0xee, 0xf7, 0x4e, 0xff, 0x3c, 0x00, 0x08, 0x24, + 0x01, 0x00, 0x0d, 0x4b, 0xaa, 0x00, 0x98, 0x58, + 0x04, 0xe0, 0x01, 0x68, 0xb1, 0x42, 0x04, 0xd0, + 0x04, 0x1c, 0x40, 0x68, 0x00, 0x28, 0xf8, 0xd1, + 0x70, 0xbd, 0x00, 0x28, 0xfc, 0xd0, 0x00, 0x2c, + 0x41, 0x68, 0x01, 0xd1, 0x99, 0x50, 0x00, 0xe0, + 0x61, 0x60, 0x00, 0x21, 0x03, 0x4a, 0x01, 0x60, + 0x04, 0x3a, 0x11, 0x68, 0x41, 0x60, 0x10, 0x60, + 0x70, 0xbd, 0x68, 0x5b, 0x01, 0x00, 0x3c, 0x00, + 0x44, 0x24, 0x01, 0x00, 0xf3, 0xb5, 0x81, 0xb0, + 0x00, 0x28, 0x17, 0xd0, 0x01, 0x78, 0xff, 0x29, + 0x14, 0xd0, 0x45, 0x78, 0x44, 0x19, 0x02, 0x34, + 0x80, 0x27, 0x01, 0x3c, 0x26, 0x78, 0x01, 0x3d, + 0xbe, 0x43, 0x30, 0x1c, 0xf8, 0xf7, 0x82, 0xfc, + 0x01, 0x21, 0x81, 0x40, 0x02, 0x98, 0x01, 0x40, + 0x02, 0xd0, 0x3e, 0x43, 0x30, 0x1c, 0x20, 0x70, + 0x00, 0x2d, 0xee, 0xd1, 0xfe, 0xbd, 0x00, 0x00, + 0x3c, 0x00, 0x80, 0x24, 0x01, 0x00, 0x10, 0x4b, + 0x10, 0xb5, 0x59, 0x68, 0x41, 0x1a, 0x0f, 0x29, + 0x0d, 0xdc, 0x0e, 0x22, 0xd2, 0x43, 0x91, 0x42, + 0x09, 0xdb, 0x1a, 0x1c, 0x92, 0x68, 0x00, 0x29, + 0x01, 0xdd, 0x00, 0x2a, 0x03, 0xda, 0x00, 0x29, + 0x0d, 0xda, 0x00, 0x2a, 0x0b, 0xdc, 0x04, 0x33, + 0x03, 0xc3, 0xfd, 0xf7, 0x10, 0xfd, 0x04, 0x1c, + 0xfd, 0xf7, 0x13, 0xfd, 0x00, 0x28, 0x02, 0xd0, + 0x20, 0x1c, 0x3c, 0x00, 0xbc, 0x24, 0x01, 0x00, + 0xff, 0xf7, 0x92, 0xfe, 0x10, 0xbd, 0x00, 0x00, + 0x18, 0x63, 0x01, 0x00, 0xf8, 0xb5, 0x64, 0x4c, + 0x07, 0x1c, 0x60, 0x78, 0xa1, 0x78, 0x88, 0x42, + 0x0f, 0xd1, 0x08, 0x1c, 0xfd, 0xf7, 0xce, 0xf8, + 0xe0, 0x60, 0x04, 0x20, 0x60, 0x70, 0x0a, 0x22, + 0x1e, 0x21, 0x13, 0x20, 0x01, 0xf0, 0x70, 0xf8, + 0x00, 0x21, 0x60, 0x78, 0xf4, 0xf7, 0x24, 0xf9, + 0xf8, 0xbd, 0x04, 0x28, 0x3c, 0x00, 0xf8, 0x24, + 0x01, 0x00, 0x6e, 0xd1, 0x58, 0x4e, 0xfd, 0xf7, + 0xbc, 0xf8, 0x00, 0x90, 0x71, 0x78, 0x04, 0x1c, + 0x00, 0x20, 0x05, 0x29, 0x21, 0xd2, 0x01, 0xa3, + 0x5b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x0b, 0x0f, + 0x14, 0x1a, 0x02, 0x00, 0x51, 0x48, 0x51, 0x49, + 0x60, 0x43, 0x41, 0x18, 0x7d, 0x20, 0xc0, 0x00, + 0xee, 0xf7, 0x87, 0xf8, 0x11, 0xe0, 0x87, 0x20, + 0x60, 0x43, 0x4d, 0x49, 0x02, 0xe0, 0x3c, 0x00, + 0x34, 0x25, 0x01, 0x00, 0x45, 0x20, 0x4d, 0x49, + 0x60, 0x43, 0x40, 0x18, 0x08, 0xe0, 0x4c, 0x48, + 0xcd, 0x21, 0x09, 0x01, 0x60, 0x43, 0x40, 0x1a, + 0x02, 0xe0, 0x46, 0x20, 0x60, 0x43, 0x82, 0x38, + 0x06, 0x06, 0x48, 0x48, 0x07, 0x21, 0x00, 0x79, + 0x36, 0x16, 0x08, 0x1a, 0x00, 0x19, 0x00, 0x90, + 0x68, 0x46, 0xfe, 0xf7, 0x5f, 0xfd, 0x38, 0x1c, + 0xfd, 0xf7, 0x2e, 0xfb, 0x00, 0x99, 0x42, 0x4a, + 0x3c, 0x00, 0x70, 0x25, 0x01, 0x00, 0x49, 0x00, + 0x51, 0x5a, 0x48, 0x43, 0x39, 0x49, 0x04, 0x1c, + 0x88, 0x78, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x28, + 0x1e, 0xd1, 0x35, 0x49, 0x00, 0x28, 0x03, 0xd1, + 0x3a, 0x48, 0x05, 0x78, 0x04, 0x20, 0x02, 0xe0, + 0x38, 0x48, 0x45, 0x78, 0x0c, 0x20, 0x30, 0x49, + 0xc9, 0x68, 0x49, 0x1b, 0x08, 0x18, 0x00, 0x90, + 0x68, 0x46, 0xfe, 0xf7, 0x3e, 0xfd, 0x00, 0x98, + 0x33, 0x49, 0x3c, 0x00, 0xac, 0x25, 0x01, 0x00, + 0x40, 0x00, 0x20, 0x31, 0x08, 0x5a, 0x2a, 0x49, + 0x44, 0x43, 0xc8, 0x68, 0xa8, 0x42, 0x01, 0xd9, + 0x01, 0x25, 0x00, 0xe0, 0x00, 0x25, 0x2e, 0x48, + 0x21, 0x18, 0x40, 0x00, 0xee, 0xf7, 0xa2, 0xf8, + 0x04, 0x1c, 0x00, 0x2d, 0x03, 0xd0, 0xfd, 0xf7, + 0xc3, 0xfa, 0x02, 0xe0, 0x3d, 0xe0, 0xfd, 0xf7, + 0xf3, 0xfa, 0x00, 0x2f, 0x02, 0xd1, 0x25, 0x48, + 0x0e, 0x38, 0x01, 0xe0, 0x3c, 0x00, 0xe8, 0x25, + 0x01, 0x00, 0x23, 0x48, 0x0a, 0x38, 0x01, 0x68, + 0x61, 0x1a, 0xcb, 0x1c, 0x01, 0xdb, 0x03, 0x29, + 0x00, 0xdd, 0x04, 0x60, 0x01, 0x68, 0xa1, 0x42, + 0x01, 0xd2, 0x01, 0x31, 0x04, 0xe0, 0xa1, 0x42, + 0x03, 0xd9, 0x00, 0x29, 0x01, 0xd0, 0x01, 0x39, + 0x01, 0x60, 0x01, 0x68, 0x38, 0x1c, 0xfd, 0xf7, + 0xc0, 0xfb, 0x10, 0x4c, 0x0a, 0x20, 0x60, 0x70, + 0x0a, 0x22, 0x13, 0x20, 0xa1, 0x68, 0x3c, 0x00, + 0x24, 0x26, 0x01, 0x00, 0x00, 0xf0, 0xd2, 0xff, + 0x60, 0x68, 0x00, 0xf0, 0xf7, 0xfa, 0x00, 0x28, + 0x00, 0xd1, 0x5f, 0xe7, 0x00, 0xf0, 0xba, 0xfb, + 0x11, 0x49, 0x00, 0x23, 0x40, 0x18, 0x0e, 0x49, + 0x60, 0x60, 0x1e, 0x39, 0xc8, 0x56, 0xb0, 0x42, + 0xf3, 0xd0, 0x0e, 0x70, 0x31, 0x1c, 0x00, 0x20, + 0xff, 0xf7, 0x84, 0xfe, 0x4e, 0xe7, 0xff, 0xf7, + 0x15, 0xfe, 0x4b, 0xe7, 0x7c, 0x78, 0x01, 0x00, + 0x3c, 0x00, 0x60, 0x26, 0x01, 0x00, 0x60, 0xd7, + 0xff, 0xff, 0x60, 0x8f, 0x01, 0x00, 0x54, 0x0b, + 0x00, 0x00, 0xc9, 0x09, 0x00, 0x00, 0x8e, 0xfe, + 0xff, 0xff, 0x0c, 0x5a, 0x01, 0x00, 0x12, 0x5a, + 0x01, 0x00, 0x20, 0xa1, 0x07, 0x00, 0x40, 0x42, + 0x0f, 0x00, 0x30, 0xb5, 0x0c, 0x4b, 0xfe, 0x24, + 0x1b, 0x88, 0x04, 0x40, 0xc0, 0x07, 0x5d, 0x07, + 0x6d, 0x0f, 0xdb, 0x08, 0xc0, 0x0f, 0x9c, 0x42, + 0x0b, 0xd8, 0x3c, 0x00, 0x9c, 0x26, 0x01, 0x00, + 0xa2, 0x18, 0x04, 0x3a, 0x9a, 0x42, 0x07, 0xd3, + 0x1a, 0x1b, 0x89, 0x5c, 0x01, 0x22, 0xaa, 0x40, + 0x11, 0x40, 0x01, 0xd0, 0x02, 0x21, 0x08, 0x43, + 0x30, 0xbd, 0x00, 0x00, 0xfa, 0x60, 0x01, 0x00, + 0x80, 0xb5, 0x00, 0x28, 0x03, 0xd0, 0x01, 0x1c, + 0x14, 0x20, 0xf5, 0xf7, 0xff, 0xfa, 0x80, 0xbd, + 0xb0, 0xb5, 0x04, 0x1c, 0xf7, 0xf7, 0x08, 0xfd, + 0x13, 0x4d, 0x00, 0x28, 0x3c, 0x00, 0xd8, 0x26, + 0x01, 0x00, 0x1d, 0xd1, 0xa0, 0x07, 0x16, 0xd5, + 0x02, 0x20, 0x84, 0x43, 0x11, 0x48, 0x01, 0x22, + 0x2a, 0x62, 0x40, 0x68, 0x00, 0x28, 0x13, 0xd0, + 0xf2, 0xf7, 0x51, 0xf9, 0x00, 0x28, 0x0f, 0xd1, + 0x0b, 0x48, 0xe4, 0x30, 0x80, 0x7a, 0x01, 0x28, + 0x00, 0xd0, 0x00, 0x22, 0x11, 0x1c, 0x01, 0x20, + 0xf2, 0xf7, 0xa5, 0xf9, 0x04, 0xe0, 0x00, 0xf0, + 0x4e, 0xfb, 0xe8, 0x61, 0xf2, 0xf7, 0x3c, 0x00, + 0x14, 0x27, 0x01, 0x00, 0x6b, 0xf9, 0xa9, 0x6a, + 0x00, 0x29, 0x02, 0xd0, 0x20, 0x1c, 0xed, 0xf7, + 0x5c, 0xfe, 0xb0, 0xbd, 0x60, 0x6c, 0x01, 0x00, + 0xb0, 0x57, 0x01, 0x00, 0x20, 0x48, 0xb0, 0xb5, + 0x81, 0x68, 0x01, 0x29, 0x04, 0xd1, 0x00, 0x78, + 0x00, 0x28, 0x01, 0xd1, 0xfd, 0xf7, 0x72, 0xfd, + 0x1b, 0x4d, 0x80, 0x3d, 0x2c, 0x1c, 0x70, 0x34, + 0x20, 0x78, 0x03, 0x38, 0x05, 0x28, 0x18, 0xd2, + 0x3c, 0x00, 0x50, 0x27, 0x01, 0x00, 0x01, 0xa3, + 0x1b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x04, 0x15, + 0x27, 0x27, 0x27, 0x00, 0xfb, 0xf7, 0xf1, 0xff, + 0x60, 0x7b, 0x01, 0x1c, 0xff, 0x31, 0x61, 0x73, + 0x00, 0x28, 0xf7, 0xd1, 0x04, 0x20, 0x20, 0x70, + 0xa8, 0x89, 0xf8, 0xf7, 0xda, 0xf9, 0x01, 0x1c, + 0x00, 0x22, 0x0f, 0x20, 0x00, 0xf0, 0x25, 0xff, + 0xb0, 0xbd, 0xef, 0xf7, 0xce, 0xff, 0x6a, 0x21, + 0x49, 0x5b, 0x3c, 0x00, 0x8c, 0x27, 0x01, 0x00, + 0x88, 0x42, 0x0b, 0xd0, 0xe8, 0x89, 0xf8, 0xf7, + 0xcb, 0xf9, 0x01, 0x1c, 0x00, 0x23, 0x00, 0x22, + 0x0f, 0x20, 0x00, 0xf0, 0xf7, 0xff, 0x07, 0x20, + 0x20, 0x70, 0xb0, 0xbd, 0xfd, 0xf7, 0x3a, 0xfe, + 0xb0, 0xbd, 0x00, 0x00, 0x84, 0x66, 0x01, 0x00, + 0xf0, 0xb5, 0x85, 0xb0, 0x04, 0x1c, 0x03, 0x80, + 0x18, 0x0c, 0x60, 0x80, 0x0d, 0x1c, 0x51, 0x78, + 0x10, 0x78, 0x09, 0x02, 0x3c, 0x00, 0xc8, 0x27, + 0x01, 0x00, 0x48, 0x40, 0xa0, 0x80, 0xd1, 0x78, + 0x90, 0x78, 0x09, 0x02, 0x48, 0x40, 0xe0, 0x80, + 0x51, 0x79, 0x10, 0x79, 0x09, 0x02, 0x48, 0x40, + 0x20, 0x81, 0x68, 0x46, 0x1a, 0x49, 0x14, 0x22, + 0xed, 0xf7, 0xe3, 0xfe, 0x00, 0x23, 0x00, 0x20, + 0xd9, 0x07, 0xc9, 0x0f, 0x8c, 0x46, 0x42, 0x00, + 0x56, 0x07, 0x76, 0x0f, 0x61, 0x46, 0x89, 0x19, + 0x49, 0x00, 0x6e, 0x5c, 0x49, 0x19, 0x3c, 0x00, + 0x04, 0x28, 0x01, 0x00, 0x49, 0x78, 0x6f, 0x46, + 0x09, 0x02, 0x4e, 0x40, 0x81, 0x00, 0x79, 0x58, + 0x0f, 0x4f, 0x49, 0x00, 0x61, 0x5a, 0x01, 0x30, + 0x4e, 0x40, 0x31, 0x06, 0x36, 0x0a, 0x76, 0x00, + 0xc9, 0x0d, 0x79, 0x5a, 0xf6, 0x19, 0x01, 0x27, + 0x7f, 0x02, 0xf6, 0x19, 0x36, 0x88, 0x71, 0x40, + 0xa6, 0x5a, 0x89, 0x19, 0xa1, 0x52, 0x05, 0x28, + 0xdc, 0xdb, 0x20, 0x89, 0xc0, 0x18, 0x01, 0x33, + 0x3c, 0x00, 0x40, 0x28, 0x01, 0x00, 0x08, 0x2b, + 0x20, 0x81, 0xd2, 0xdb, 0x05, 0xb0, 0xf0, 0xbd, + 0x00, 0x00, 0xd8, 0x56, 0x01, 0x00, 0xd8, 0x52, + 0x01, 0x00, 0xf0, 0xb5, 0x05, 0x1c, 0x0c, 0x1c, + 0x1e, 0x1c, 0x00, 0x20, 0x89, 0xb0, 0x41, 0x00, + 0x53, 0x5a, 0x01, 0x30, 0x06, 0xaf, 0x7b, 0x52, + 0x05, 0x28, 0xf8, 0xdb, 0x10, 0x89, 0x00, 0xab, + 0x3a, 0x49, 0x80, 0x19, 0x58, 0x84, 0x68, 0x46, + 0x18, 0x22, 0x3c, 0x00, 0x7c, 0x28, 0x01, 0x00, + 0xed, 0xf7, 0x98, 0xfe, 0x00, 0x20, 0x41, 0x00, + 0x0a, 0x19, 0x52, 0x78, 0x63, 0x5c, 0x6f, 0x46, + 0x12, 0x02, 0x53, 0x40, 0x82, 0x00, 0xba, 0x58, + 0x06, 0xaf, 0x52, 0x00, 0xba, 0x5a, 0x31, 0x4f, + 0x01, 0x30, 0x53, 0x40, 0x1a, 0x06, 0x1b, 0x0a, + 0x5b, 0x00, 0xd2, 0x0d, 0xba, 0x5a, 0xdb, 0x19, + 0x01, 0x27, 0x7f, 0x02, 0xdb, 0x19, 0x1b, 0x88, + 0x5a, 0x40, 0x06, 0xab, 0x3c, 0x00, 0xb8, 0x28, + 0x01, 0x00, 0x5b, 0x5a, 0xd2, 0x18, 0x06, 0xab, + 0x5a, 0x52, 0x06, 0x28, 0xde, 0xdb, 0x61, 0x7b, + 0x20, 0x7b, 0x00, 0xab, 0x09, 0x02, 0x48, 0x40, + 0x59, 0x8c, 0x48, 0x40, 0x41, 0x08, 0xc0, 0x03, + 0x48, 0x40, 0x19, 0x8b, 0x40, 0x18, 0x18, 0x83, + 0xe1, 0x7b, 0xa0, 0x7b, 0x09, 0x02, 0x48, 0x40, + 0x19, 0x8b, 0x48, 0x40, 0x41, 0x08, 0xc0, 0x03, + 0x48, 0x40, 0x59, 0x8b, 0x40, 0x18, 0x3c, 0x00, + 0xf4, 0x28, 0x01, 0x00, 0x58, 0x83, 0x02, 0x20, + 0x41, 0x00, 0x06, 0xaa, 0x8a, 0x18, 0x20, 0x3a, + 0xd2, 0x8b, 0x01, 0x30, 0x53, 0x08, 0xd2, 0x03, + 0x5a, 0x40, 0x06, 0xab, 0x5b, 0x5a, 0xd2, 0x18, + 0x06, 0xab, 0x5a, 0x52, 0x06, 0x28, 0xef, 0xdb, + 0x30, 0x0a, 0x28, 0x70, 0x70, 0x04, 0x40, 0x0e, + 0x20, 0x21, 0x08, 0x43, 0x68, 0x70, 0xae, 0x70, + 0x61, 0x78, 0x20, 0x78, 0x00, 0xab, 0x09, 0x02, + 0x3c, 0x00, 0x30, 0x29, 0x01, 0x00, 0x48, 0x40, + 0x59, 0x8c, 0x48, 0x40, 0xc0, 0x05, 0x00, 0x0e, + 0xe8, 0x70, 0x00, 0x20, 0x41, 0x00, 0x06, 0xaa, + 0x53, 0x5a, 0x4a, 0x19, 0x01, 0x30, 0x13, 0x71, + 0x06, 0xab, 0x59, 0x5a, 0x09, 0x0a, 0x51, 0x71, + 0x06, 0x28, 0xf3, 0xdb, 0x09, 0xb0, 0xf0, 0xbd, + 0x00, 0x00, 0xec, 0x56, 0x01, 0x00, 0xd8, 0x52, + 0x01, 0x00, 0xf0, 0xb5, 0x46, 0x68, 0x05, 0x1c, + 0x60, 0x30, 0x3c, 0x00, 0x6c, 0x29, 0x01, 0x00, + 0x85, 0xb0, 0x04, 0x90, 0x60, 0xe0, 0x68, 0x68, + 0x0c, 0x21, 0x07, 0x69, 0x00, 0x20, 0xee, 0xf7, + 0x2d, 0xfe, 0x70, 0x61, 0x01, 0x89, 0x04, 0x39, + 0x09, 0x04, 0x09, 0x0c, 0x01, 0x81, 0x70, 0x69, + 0x00, 0x68, 0x40, 0x18, 0x04, 0x21, 0xee, 0xf7, + 0x21, 0xfe, 0xf0, 0x61, 0x70, 0x69, 0x20, 0x21, + 0x04, 0x68, 0x04, 0x98, 0x04, 0x22, 0x40, 0x7b, + 0x80, 0x01, 0x08, 0x43, 0x3c, 0x00, 0xa8, 0x29, + 0x01, 0x00, 0xe0, 0x70, 0x28, 0x69, 0x40, 0x89, + 0xa0, 0x70, 0x28, 0x69, 0x40, 0x89, 0x00, 0x0a, + 0x20, 0x70, 0x29, 0x69, 0x0c, 0x31, 0xa0, 0x18, + 0xed, 0xf7, 0x9b, 0xfd, 0x20, 0x78, 0x20, 0x21, + 0x40, 0x06, 0x40, 0x0e, 0x08, 0x43, 0x60, 0x70, + 0x28, 0x69, 0x0a, 0x30, 0x01, 0x88, 0x01, 0x31, + 0x09, 0x04, 0x09, 0x0c, 0x01, 0x80, 0x04, 0xd1, + 0x28, 0x69, 0x0c, 0x30, 0x01, 0x68, 0x3c, 0x00, + 0xe4, 0x29, 0x01, 0x00, 0x01, 0x31, 0x01, 0x60, + 0x35, 0x62, 0x61, 0x79, 0x20, 0x79, 0x09, 0x02, + 0x40, 0x18, 0xa1, 0x79, 0x09, 0x04, 0x40, 0x18, + 0xe1, 0x79, 0x09, 0x06, 0x43, 0x18, 0x00, 0x93, + 0xa0, 0x78, 0x21, 0x78, 0x09, 0x02, 0x40, 0x18, + 0x04, 0x04, 0x24, 0x0c, 0x10, 0x20, 0xee, 0xf7, + 0x13, 0xff, 0xb0, 0x61, 0x28, 0x69, 0x3a, 0x1c, + 0x01, 0x68, 0x00, 0x9b, 0x01, 0xa8, 0x0a, 0x32, + 0x3c, 0x00, 0x20, 0x2a, 0x01, 0x00, 0xff, 0xf7, + 0xc8, 0xfe, 0x28, 0x69, 0x23, 0x1c, 0x01, 0x68, + 0xb0, 0x69, 0x01, 0xaa, 0xff, 0xf7, 0x11, 0xff, + 0x36, 0x68, 0x00, 0x2e, 0x9c, 0xd1, 0x03, 0x49, + 0x04, 0x48, 0x6a, 0x68, 0xf7, 0xf7, 0x63, 0xfb, + 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xfd, 0x6b, + 0x00, 0x00, 0xa0, 0x6a, 0x01, 0x00, 0x01, 0x38, + 0x07, 0x49, 0x40, 0x00, 0x09, 0x5c, 0x00, 0x29, + 0x06, 0xd0, 0x3c, 0x00, 0x5c, 0x2a, 0x01, 0x00, + 0x04, 0x49, 0x1c, 0x39, 0x08, 0x5c, 0x00, 0x28, + 0x01, 0xd0, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, + 0x70, 0x47, 0x00, 0x00, 0xe6, 0x78, 0x01, 0x00, + 0xfe, 0xb5, 0x05, 0x1c, 0x00, 0x20, 0x02, 0x90, + 0x13, 0x48, 0x17, 0x1c, 0x00, 0x68, 0x0c, 0x1c, + 0x86, 0x78, 0x30, 0x1c, 0xfd, 0xf7, 0x28, 0xfa, + 0x00, 0x28, 0x01, 0xd1, 0x02, 0x98, 0xfe, 0xbd, + 0x00, 0x2d, 0x08, 0xd1, 0x3c, 0x00, 0x98, 0x2a, + 0x01, 0x00, 0x20, 0x68, 0x00, 0xab, 0x18, 0x71, + 0x60, 0x68, 0x58, 0x71, 0xa0, 0x68, 0x98, 0x71, + 0x03, 0x20, 0x38, 0x80, 0x29, 0x1c, 0x30, 0x1c, + 0x01, 0xaa, 0x00, 0xf0, 0x0e, 0xf8, 0x00, 0x2d, + 0xec, 0xd0, 0x00, 0xab, 0x19, 0x79, 0x21, 0x60, + 0x59, 0x79, 0x61, 0x60, 0x99, 0x79, 0xa1, 0x60, + 0x0c, 0x21, 0x39, 0x80, 0xe2, 0xe7, 0xf8, 0x6b, + 0x01, 0x00, 0xf8, 0xb5, 0x15, 0x1c, 0x3c, 0x00, + 0xd4, 0x2a, 0x01, 0x00, 0x42, 0x1e, 0x01, 0x38, + 0x47, 0x00, 0x3f, 0x18, 0x1f, 0x48, 0x3e, 0x18, + 0x00, 0x29, 0x06, 0xd0, 0x01, 0x24, 0x03, 0x22, + 0x31, 0x1c, 0x28, 0x1c, 0xed, 0xf7, 0x04, 0xfd, + 0x32, 0xe0, 0x68, 0x78, 0x01, 0x24, 0x00, 0x28, + 0x05, 0xd0, 0x29, 0x78, 0x08, 0x18, 0x01, 0x38, + 0x0e, 0x28, 0x00, 0xd9, 0x00, 0x24, 0x00, 0x2c, + 0x26, 0xd0, 0x00, 0x2a, 0x07, 0xd1, 0x2a, 0x21, + 0x3c, 0x00, 0x10, 0x2b, 0x01, 0x00, 0x12, 0x48, + 0xed, 0xf7, 0x9f, 0xfc, 0x1c, 0x21, 0x11, 0x48, + 0xed, 0xf7, 0x9b, 0xfc, 0x0f, 0x48, 0x03, 0x22, + 0x29, 0x1c, 0x30, 0x1c, 0xed, 0xf7, 0xe7, 0xfc, + 0x0c, 0x48, 0x71, 0x78, 0xc0, 0x5d, 0xb2, 0x78, + 0x00, 0x29, 0x0e, 0xd0, 0x00, 0x2a, 0x0c, 0xd0, + 0x01, 0x22, 0x43, 0x18, 0x08, 0x4d, 0x06, 0xe0, + 0x41, 0x00, 0x49, 0x19, 0x10, 0x39, 0x8a, 0x73, + 0xb7, 0x78, 0x3c, 0x00, 0x4c, 0x2b, 0x01, 0x00, + 0x01, 0x30, 0xcf, 0x73, 0x83, 0x42, 0xf6, 0xd8, + 0xfe, 0xf7, 0x60, 0xf8, 0x20, 0x1c, 0xf8, 0xbd, + 0xeb, 0x62, 0x01, 0x00, 0xca, 0x78, 0x01, 0x00, + 0x70, 0xb5, 0x05, 0x1c, 0x1c, 0x48, 0x00, 0x23, + 0xc0, 0x56, 0x43, 0x1c, 0x32, 0xd1, 0xa8, 0x7a, + 0xf8, 0xf7, 0x0c, 0xf9, 0x00, 0x26, 0x00, 0x28, + 0x18, 0x4c, 0x08, 0xd0, 0xe8, 0x69, 0xe1, 0x6b, + 0x00, 0x29, 0x0b, 0xd1, 0x3c, 0x00, 0x88, 0x2b, + 0x01, 0x00, 0x66, 0x63, 0x01, 0x21, 0xe1, 0x63, + 0xa6, 0x63, 0x06, 0xe0, 0xa8, 0x69, 0xe1, 0x6b, + 0x00, 0x29, 0x02, 0xd0, 0x66, 0x63, 0xa6, 0x63, + 0xe6, 0x63, 0xa1, 0x6b, 0x01, 0x31, 0xa1, 0x63, + 0x82, 0x03, 0x01, 0xd5, 0x0e, 0x4a, 0x10, 0x43, + 0xe2, 0x6b, 0x00, 0x2a, 0x00, 0xd0, 0x40, 0x42, + 0x62, 0x6b, 0x10, 0x18, 0x60, 0x63, 0x08, 0x29, + 0x0b, 0xd1, 0x00, 0x28, 0x01, 0xdd, 0x3c, 0x00, + 0xc4, 0x2b, 0x01, 0x00, 0x01, 0x20, 0x03, 0xe0, + 0x00, 0x28, 0x03, 0xda, 0x00, 0x20, 0xc0, 0x43, + 0xef, 0xf7, 0x62, 0xfe, 0x66, 0x63, 0xa6, 0x63, + 0x70, 0xbd, 0x00, 0x00, 0xf4, 0x6b, 0x01, 0x00, + 0x84, 0x6a, 0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, + 0x0c, 0x21, 0x05, 0x4a, 0x41, 0x43, 0x89, 0x18, + 0x80, 0xb5, 0x89, 0x78, 0x00, 0x29, 0x01, 0xd1, + 0xf3, 0xf7, 0xf2, 0xfa, 0x80, 0xbd, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x60, 0x7b, + 0x01, 0x00, 0x80, 0xb5, 0x01, 0x1c, 0x00, 0x20, + 0xf7, 0xf7, 0x03, 0xfa, 0x80, 0xbd, 0x80, 0xb5, + 0x01, 0x1c, 0x01, 0x20, 0xf7, 0xf7, 0xfd, 0xf9, + 0x80, 0xbd, 0x02, 0x49, 0x89, 0x68, 0x40, 0x1a, + 0xc0, 0x0f, 0x70, 0x47, 0x00, 0x00, 0x00, 0x01, + 0x07, 0x00, 0x02, 0x49, 0x89, 0x68, 0x08, 0x1a, + 0xc0, 0x17, 0x01, 0x30, 0x70, 0x47, 0x00, 0x01, + 0x07, 0x00, 0x3c, 0x00, 0x3c, 0x2c, 0x01, 0x00, + 0x05, 0x49, 0x4a, 0x68, 0x01, 0x23, 0x1a, 0x43, + 0x4a, 0x60, 0x8a, 0x68, 0x10, 0x18, 0x88, 0x60, + 0x48, 0x68, 0x98, 0x43, 0x48, 0x60, 0x70, 0x47, + 0x00, 0x01, 0x07, 0x00, 0x10, 0xb5, 0x15, 0x4b, + 0x00, 0x21, 0x0a, 0x01, 0x9a, 0x58, 0x00, 0x2a, + 0x17, 0xd1, 0x01, 0x24, 0x0a, 0x01, 0x9c, 0x50, + 0xd2, 0x18, 0x10, 0x73, 0x00, 0x23, 0x53, 0x73, + 0x02, 0x23, 0x01, 0x28, 0x3c, 0x00, 0x78, 0x2c, + 0x01, 0x00, 0x0e, 0x4a, 0x05, 0xd1, 0xc8, 0x00, + 0x80, 0x18, 0x10, 0x30, 0x02, 0x78, 0x9a, 0x43, + 0x04, 0xe0, 0xc8, 0x00, 0x80, 0x18, 0x10, 0x30, + 0x02, 0x78, 0x1a, 0x43, 0x02, 0x70, 0x02, 0xe0, + 0x01, 0x31, 0x08, 0x29, 0xe0, 0xdb, 0x08, 0x29, + 0x04, 0xd1, 0x01, 0x21, 0x99, 0x20, 0xee, 0xf7, + 0xfe, 0xfa, 0x03, 0x49, 0x08, 0x04, 0x00, 0x0c, + 0x10, 0xbd, 0xac, 0x73, 0x01, 0x00, 0x3c, 0x00, + 0xb4, 0x2c, 0x01, 0x00, 0x00, 0x60, 0x07, 0x00, + 0xff, 0xff, 0x00, 0x00, 0xf7, 0xb5, 0x19, 0x4f, + 0x19, 0x4e, 0x0c, 0x1c, 0xc1, 0x00, 0xc9, 0x19, + 0xb2, 0x68, 0x10, 0x31, 0x81, 0xb0, 0x01, 0x3a, + 0x4a, 0x60, 0x0b, 0x78, 0x1d, 0x1c, 0x0d, 0x22, + 0x93, 0x43, 0x0b, 0x70, 0x01, 0x22, 0x82, 0x40, + 0x3a, 0x73, 0x12, 0x4b, 0x00, 0x01, 0x03, 0x9a, + 0xc0, 0x18, 0x82, 0x60, 0x10, 0x4a, 0x10, 0x1c, + 0x3c, 0x00, 0xf0, 0x2c, 0x01, 0x00, 0x20, 0x30, + 0x87, 0x79, 0x00, 0xab, 0x1f, 0x70, 0xc0, 0x79, + 0x58, 0x70, 0xb0, 0x68, 0x03, 0x30, 0x00, 0x23, + 0x26, 0x1a, 0x01, 0xd5, 0x04, 0x1c, 0x01, 0x23, + 0x4c, 0x60, 0x0d, 0x70, 0x00, 0x2b, 0x04, 0xd0, + 0x20, 0x1c, 0xff, 0xf7, 0x8a, 0xff, 0x00, 0x28, + 0xfa, 0xd0, 0x00, 0xab, 0x18, 0x88, 0xd0, 0x84, + 0xff, 0xbd, 0x00, 0x60, 0x07, 0x00, 0x00, 0x01, + 0x07, 0x00, 0x3c, 0x00, 0x2c, 0x2d, 0x01, 0x00, + 0xac, 0x73, 0x01, 0x00, 0x00, 0x10, 0x07, 0x00, + 0x30, 0xb5, 0x00, 0x20, 0xc0, 0x43, 0x0b, 0x4c, + 0x09, 0x4b, 0x00, 0x22, 0xd1, 0x00, 0x09, 0x19, + 0x0d, 0x7c, 0xed, 0x07, 0x07, 0xd5, 0x49, 0x69, + 0x9d, 0x68, 0x49, 0x1b, 0x00, 0xd5, 0x00, 0x21, + 0x81, 0x42, 0x00, 0xd2, 0x08, 0x1c, 0x01, 0x32, + 0x08, 0x2a, 0xef, 0xdb, 0x30, 0xbd, 0x00, 0x00, + 0x00, 0x01, 0x07, 0x00, 0x3c, 0x00, 0x68, 0x2d, + 0x01, 0x00, 0x00, 0x60, 0x07, 0x00, 0xb0, 0xb5, + 0x08, 0x28, 0x0b, 0xd2, 0x08, 0x4d, 0x04, 0x01, + 0x29, 0x59, 0x00, 0x29, 0x04, 0xd0, 0x00, 0xf0, + 0x4a, 0xf8, 0x00, 0x20, 0x28, 0x51, 0xb0, 0xbd, + 0x02, 0x21, 0x00, 0xe0, 0x03, 0x21, 0x99, 0x20, + 0xee, 0xf7, 0x89, 0xfa, 0xb0, 0xbd, 0xac, 0x73, + 0x01, 0x00, 0x03, 0x49, 0x00, 0x01, 0x40, 0x18, + 0x41, 0x7b, 0x08, 0x22, 0x11, 0x43, 0x3c, 0x00, + 0xa4, 0x2d, 0x01, 0x00, 0x41, 0x73, 0x70, 0x47, + 0xac, 0x73, 0x01, 0x00, 0x01, 0x48, 0x80, 0x68, + 0x70, 0x47, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, + 0x70, 0xb5, 0x0b, 0x4e, 0x09, 0x4d, 0x00, 0x22, + 0xd0, 0x00, 0x84, 0x19, 0x20, 0x7c, 0xc0, 0x07, + 0x07, 0xd5, 0x60, 0x69, 0xff, 0xf7, 0x26, 0xff, + 0x00, 0x28, 0x02, 0xd0, 0xa8, 0x68, 0x32, 0x30, + 0x60, 0x61, 0x01, 0x32, 0x08, 0x2a, 0xef, 0xdb, + 0x3c, 0x00, 0xe0, 0x2d, 0x01, 0x00, 0x70, 0xbd, + 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x60, + 0x07, 0x00, 0x02, 0x4a, 0xc0, 0x00, 0x80, 0x18, + 0x01, 0x74, 0x70, 0x47, 0x00, 0x00, 0x00, 0x60, + 0x07, 0x00, 0x04, 0x49, 0xc0, 0x00, 0x41, 0x18, + 0x08, 0x7c, 0x08, 0x23, 0x02, 0x1c, 0x9a, 0x43, + 0x0a, 0x74, 0x70, 0x47, 0x00, 0x00, 0x00, 0x60, + 0x07, 0x00, 0x70, 0xb5, 0x08, 0x28, 0x17, 0xd2, + 0x0e, 0x49, 0x3c, 0x00, 0x1c, 0x2e, 0x01, 0x00, + 0x8a, 0x68, 0x0e, 0x4d, 0x01, 0x3a, 0xc1, 0x00, + 0x49, 0x19, 0x4a, 0x61, 0x0c, 0x4b, 0x9a, 0x79, + 0x10, 0x31, 0x0c, 0x78, 0x0d, 0x26, 0xb4, 0x43, + 0x0c, 0x70, 0x01, 0x21, 0x81, 0x40, 0x29, 0x73, + 0x9a, 0x71, 0x09, 0x4a, 0x07, 0x49, 0x00, 0x01, + 0x80, 0x18, 0x41, 0x60, 0x70, 0xbd, 0x05, 0x21, + 0x99, 0x20, 0xee, 0xf7, 0x29, 0xfa, 0x70, 0xbd, + 0x00, 0x01, 0x07, 0x00, 0x3c, 0x00, 0x58, 0x2e, + 0x01, 0x00, 0x00, 0x60, 0x07, 0x00, 0x20, 0x10, + 0x07, 0x00, 0xd1, 0x75, 0x00, 0x00, 0xac, 0x73, + 0x01, 0x00, 0xf8, 0xb5, 0x9e, 0x46, 0x1a, 0x4b, + 0x94, 0x46, 0x9b, 0x68, 0x1a, 0x4c, 0xc2, 0x00, + 0x12, 0x19, 0x01, 0x3b, 0x53, 0x61, 0x15, 0x1c, + 0x18, 0x4c, 0xa6, 0x79, 0x2a, 0x1c, 0x10, 0x32, + 0x13, 0x78, 0x0d, 0x27, 0xbb, 0x43, 0x13, 0x70, + 0x01, 0x27, 0x12, 0x4b, 0x87, 0x40, 0x3c, 0x00, + 0x94, 0x2e, 0x01, 0x00, 0x1f, 0x73, 0xa6, 0x71, + 0x12, 0x4e, 0x00, 0x01, 0x80, 0x19, 0x63, 0x46, + 0x43, 0x60, 0x73, 0x46, 0x83, 0x60, 0x13, 0x78, + 0x40, 0x7b, 0xa6, 0x79, 0x01, 0x27, 0x18, 0x43, + 0x38, 0x43, 0x14, 0x35, 0x00, 0xab, 0x1e, 0x70, + 0xe4, 0x79, 0x5c, 0x70, 0x06, 0x4b, 0x9b, 0x68, + 0x03, 0x33, 0xcc, 0x1a, 0x00, 0xd5, 0x19, 0x1c, + 0x29, 0x60, 0x10, 0x70, 0x00, 0xab, 0x18, 0x88, + 0x3c, 0x00, 0xd0, 0x2e, 0x01, 0x00, 0x03, 0x4c, + 0x20, 0x3c, 0xe0, 0x84, 0xf8, 0xbd, 0x00, 0x01, + 0x07, 0x00, 0x00, 0x60, 0x07, 0x00, 0x20, 0x10, + 0x07, 0x00, 0xac, 0x73, 0x01, 0x00, 0x00, 0xb5, + 0x01, 0x1c, 0xff, 0xf7, 0x5e, 0xff, 0x42, 0x18, + 0x10, 0x1c, 0xff, 0xf7, 0x92, 0xfe, 0x00, 0x28, + 0xfa, 0xd0, 0x00, 0xbd, 0x00, 0x00, 0x89, 0x1a, + 0x40, 0x1a, 0x99, 0x18, 0x88, 0x42, 0x01, 0xd8, + 0x01, 0x20, 0x3c, 0x00, 0x0c, 0x2f, 0x01, 0x00, + 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, + 0xf8, 0xb5, 0x0f, 0x1c, 0x04, 0x1c, 0x00, 0x28, + 0x01, 0xd1, 0xee, 0xf7, 0xef, 0xf9, 0x21, 0x1c, + 0x01, 0x20, 0xff, 0xf7, 0x19, 0xfa, 0x41, 0x20, + 0x00, 0x5d, 0x00, 0x28, 0x01, 0xd1, 0x00, 0x25, + 0x04, 0xe0, 0x02, 0x28, 0x01, 0xd1, 0x05, 0x25, + 0x00, 0xe0, 0x01, 0x25, 0xe0, 0x68, 0xee, 0xf7, + 0x29, 0xfb, 0xa6, 0x6b, 0x3c, 0x00, 0x48, 0x2f, + 0x01, 0x00, 0x00, 0x2e, 0x10, 0xd0, 0x00, 0x2f, + 0x06, 0xd0, 0x2f, 0x20, 0x02, 0x5d, 0x20, 0x6a, + 0x41, 0x6b, 0x28, 0x1c, 0xed, 0xf7, 0x44, 0xfa, + 0xa0, 0x69, 0x00, 0x28, 0x01, 0xd0, 0xee, 0xf7, + 0x46, 0xfc, 0x20, 0x6a, 0xee, 0xf7, 0x43, 0xfc, + 0x20, 0x1c, 0xee, 0xf7, 0x40, 0xfc, 0x30, 0x1c, + 0xf8, 0xbd, 0xb0, 0xb5, 0x04, 0x1c, 0xc0, 0x6b, + 0x00, 0x28, 0x09, 0xd0, 0x20, 0x69, 0x3c, 0x00, + 0x84, 0x2f, 0x01, 0x00, 0x00, 0x8b, 0xee, 0xf7, + 0x55, 0xf9, 0x00, 0x28, 0x03, 0xd0, 0x21, 0x1c, + 0x06, 0x20, 0xff, 0xf7, 0xe3, 0xf9, 0x08, 0x4d, + 0x20, 0x1c, 0xa9, 0x6d, 0xff, 0xf7, 0xba, 0xff, + 0x00, 0x28, 0x07, 0xd0, 0xe8, 0x68, 0x01, 0x30, + 0xe8, 0x60, 0x28, 0x6a, 0x01, 0x38, 0x28, 0x62, + 0xfc, 0xf7, 0x78, 0xf8, 0xb0, 0xbd, 0x00, 0x00, + 0xc4, 0x69, 0x01, 0x00, 0x10, 0xb5, 0x06, 0x4c, + 0x3c, 0x00, 0xc0, 0x2f, 0x01, 0x00, 0xe1, 0x6d, + 0xff, 0xf7, 0xa7, 0xff, 0x00, 0x28, 0x04, 0xd0, + 0xe0, 0x69, 0x01, 0x38, 0xe0, 0x61, 0xfc, 0xf7, + 0x68, 0xf8, 0x10, 0xbd, 0x00, 0x00, 0xc4, 0x69, + 0x01, 0x00, 0x0c, 0x23, 0x0c, 0x49, 0x58, 0x43, + 0x40, 0x18, 0x10, 0xb5, 0x44, 0x68, 0xa1, 0x68, + 0x00, 0x29, 0x02, 0xd0, 0x20, 0x1c, 0xed, 0xf7, + 0xf3, 0xf9, 0xe0, 0x6b, 0x00, 0x28, 0x08, 0xd0, + 0x20, 0x69, 0x3c, 0x00, 0xfc, 0x2f, 0x01, 0x00, + 0x00, 0x8b, 0xee, 0xf7, 0x19, 0xf9, 0x00, 0x28, + 0x02, 0xd0, 0x20, 0x1c, 0xf9, 0xf7, 0x26, 0xf9, + 0x10, 0xbd, 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, + 0xf8, 0xb5, 0x22, 0x49, 0x48, 0x68, 0x80, 0x00, + 0x06, 0xd4, 0x01, 0x20, 0x40, 0x07, 0x08, 0x60, + 0x4a, 0x69, 0x92, 0x00, 0x00, 0xd4, 0x48, 0x60, + 0x1d, 0x4f, 0x78, 0x7e, 0xc3, 0x06, 0x01, 0x20, + 0x02, 0x1c, 0xdb, 0x0e, 0x3c, 0x00, 0x38, 0x30, + 0x01, 0x00, 0x9a, 0x40, 0x0a, 0x60, 0x79, 0x69, + 0x8c, 0x68, 0x8c, 0x60, 0x21, 0x07, 0x89, 0x0f, + 0x09, 0xd0, 0x21, 0x07, 0x04, 0xd5, 0x0b, 0x21, + 0x9e, 0x20, 0xee, 0xf7, 0x28, 0xf9, 0x00, 0xe0, + 0x78, 0x64, 0x0c, 0x20, 0x84, 0x43, 0x12, 0x48, + 0x3d, 0x68, 0x06, 0x5d, 0x6c, 0x68, 0x2c, 0x34, + 0x06, 0xe0, 0xa0, 0x68, 0x00, 0x68, 0xa0, 0x60, + 0xe9, 0x68, 0x28, 0x1c, 0xed, 0xf7, 0x3c, 0x00, + 0x74, 0x30, 0x01, 0x00, 0xb2, 0xf9, 0x01, 0x3e, + 0xf6, 0xd2, 0xa0, 0x68, 0x80, 0x68, 0x00, 0x28, + 0x0d, 0xd0, 0x40, 0x89, 0x00, 0x28, 0x0a, 0xd0, + 0x78, 0x6c, 0x00, 0x28, 0x07, 0xd1, 0x78, 0x69, + 0x80, 0x68, 0x80, 0x07, 0x03, 0xd1, 0x0c, 0x21, + 0x9e, 0x20, 0xee, 0xf7, 0x03, 0xf9, 0xf8, 0xbd, + 0x00, 0x10, 0x07, 0x00, 0xcc, 0x6d, 0x01, 0x00, + 0xb4, 0x44, 0x01, 0x00, 0x09, 0x49, 0x80, 0xb5, + 0x3c, 0x00, 0xb0, 0x30, 0x01, 0x00, 0x08, 0x7e, + 0xc2, 0x06, 0xd2, 0x0e, 0x01, 0x20, 0x90, 0x40, + 0x07, 0x4a, 0x10, 0x60, 0x00, 0x20, 0x0a, 0x69, + 0xc0, 0x43, 0x90, 0x60, 0x08, 0x68, 0x24, 0x31, + 0x06, 0xc9, 0x03, 0x69, 0xed, 0xf7, 0x86, 0xf9, + 0x80, 0xbd, 0xcc, 0x6d, 0x01, 0x00, 0x00, 0x10, + 0x07, 0x00, 0xf8, 0xb5, 0x44, 0x68, 0x06, 0x1c, + 0x2c, 0x34, 0x20, 0x68, 0x0d, 0x1c, 0x80, 0x68, + 0x00, 0x90, 0x3c, 0x00, 0xec, 0x30, 0x01, 0x00, + 0x00, 0x28, 0x00, 0xd0, 0xc5, 0x60, 0x20, 0x68, + 0x00, 0x68, 0x20, 0x60, 0x40, 0x68, 0x00, 0x28, + 0x03, 0xd0, 0x0a, 0x21, 0x9e, 0x20, 0xee, 0xf7, + 0xcf, 0xf8, 0x20, 0x68, 0x45, 0x60, 0x28, 0x1c, + 0x02, 0xe0, 0x00, 0x22, 0x42, 0x60, 0x08, 0x1c, + 0xc1, 0x68, 0x00, 0x29, 0xf9, 0xd1, 0x71, 0x68, + 0x60, 0x27, 0x0b, 0x1c, 0x40, 0x33, 0x9c, 0x46, + 0x9b, 0x78, 0xca, 0x7e, 0x3c, 0x00, 0x28, 0x31, + 0x01, 0x00, 0x5b, 0x01, 0x12, 0x07, 0x12, 0x0f, + 0x3b, 0x40, 0x1a, 0x43, 0x8b, 0x8f, 0xff, 0x27, + 0x3f, 0x04, 0x1b, 0x04, 0x3b, 0x40, 0x1a, 0x43, + 0x90, 0x23, 0x1a, 0x43, 0x42, 0x60, 0x63, 0x46, + 0x9a, 0x78, 0x01, 0x32, 0xd2, 0x07, 0xd2, 0x0f, + 0x9a, 0x70, 0x89, 0x6b, 0xc1, 0x60, 0x21, 0x68, + 0x88, 0x60, 0x00, 0x98, 0x00, 0x28, 0x01, 0xd0, + 0x00, 0x98, 0xc5, 0x60, 0x0a, 0x4f, 0x3c, 0x00, + 0x64, 0x31, 0x01, 0x00, 0xbd, 0x79, 0xa0, 0x69, + 0x00, 0x28, 0x0c, 0xd0, 0x00, 0x22, 0xa2, 0x61, + 0x74, 0x68, 0x60, 0x69, 0xef, 0xf7, 0x2e, 0xff, + 0xe0, 0x6a, 0x61, 0x69, 0x40, 0x68, 0x48, 0x60, + 0x61, 0x69, 0x01, 0x20, 0x08, 0x60, 0xbd, 0x71, + 0xf8, 0xbd, 0x00, 0x00, 0x20, 0x10, 0x07, 0x00, + 0xfe, 0xb5, 0x44, 0x68, 0x0f, 0x1c, 0x01, 0x94, + 0x2c, 0x34, 0x20, 0x1c, 0x12, 0x30, 0x02, 0x90, + 0x3c, 0x00, 0xa0, 0x31, 0x01, 0x00, 0x2c, 0xe0, + 0x0c, 0x20, 0xee, 0xf7, 0x00, 0xfb, 0x05, 0x1c, + 0x60, 0x68, 0x00, 0x28, 0x1d, 0xd1, 0x02, 0x98, + 0x00, 0x21, 0x00, 0x90, 0x00, 0x20, 0xee, 0xf7, + 0x0e, 0xfa, 0x06, 0x1c, 0x00, 0x98, 0x04, 0x21, + 0xee, 0xf7, 0x09, 0xfa, 0x01, 0x1c, 0x01, 0x98, + 0xc0, 0x7e, 0x00, 0x07, 0x00, 0x0f, 0xd0, 0x30, + 0x70, 0x60, 0x01, 0x98, 0xc0, 0x7e, 0x00, 0x07, + 0x00, 0x0f, 0x3c, 0x00, 0xdc, 0x31, 0x01, 0x00, + 0xf0, 0x30, 0x48, 0x60, 0x30, 0x1c, 0xee, 0xf7, + 0x19, 0xf9, 0x65, 0x60, 0xe6, 0x60, 0x01, 0xe0, + 0x20, 0x68, 0x05, 0x60, 0x60, 0x68, 0x28, 0x60, + 0x25, 0x60, 0x00, 0x20, 0x68, 0x60, 0xa8, 0x60, + 0x38, 0x1c, 0xff, 0x30, 0x00, 0x06, 0x00, 0x0e, + 0x39, 0x1c, 0x07, 0x1c, 0x00, 0x29, 0xca, 0xd1, + 0x60, 0x68, 0xa0, 0x60, 0xfe, 0xbd, 0x00, 0x00, + 0xff, 0xb5, 0x05, 0x1c, 0x3c, 0x00, 0x18, 0x32, + 0x01, 0x00, 0x08, 0x1c, 0x00, 0x26, 0x81, 0xb0, + 0xf4, 0xf7, 0x2f, 0xfe, 0x04, 0x1c, 0x02, 0xd0, + 0x60, 0x68, 0xff, 0x28, 0x01, 0xd1, 0x06, 0x26, + 0x28, 0xe0, 0x21, 0x1c, 0x20, 0x31, 0x0a, 0x78, + 0x01, 0x2a, 0x01, 0xd1, 0x03, 0x26, 0x21, 0xe0, + 0x01, 0x27, 0x25, 0x60, 0x0f, 0x70, 0x11, 0xc5, + 0x1d, 0x48, 0x08, 0x3d, 0x68, 0x61, 0x03, 0x98, + 0x6a, 0x46, 0xe8, 0x60, 0x04, 0x98, 0x3c, 0x00, + 0x54, 0x32, 0x01, 0x00, 0x28, 0x61, 0x1a, 0x48, + 0xa8, 0x61, 0x1a, 0x48, 0xe8, 0x61, 0x1a, 0x48, + 0x28, 0x62, 0x1a, 0x48, 0x68, 0x62, 0x20, 0x7e, + 0xa1, 0x68, 0xed, 0xf7, 0xb3, 0xfe, 0x00, 0x28, + 0x06, 0xd1, 0x60, 0x7e, 0xe1, 0x68, 0x6a, 0x46, + 0xed, 0xf7, 0xac, 0xfe, 0x00, 0x28, 0x07, 0xd0, + 0x04, 0x26, 0x31, 0x1c, 0x9e, 0x20, 0xee, 0xf7, + 0x0d, 0xf8, 0x30, 0x1c, 0x05, 0xb0, 0xf0, 0xbd, + 0x3c, 0x00, 0x90, 0x32, 0x01, 0x00, 0x6a, 0x46, + 0x0f, 0x49, 0x1d, 0x20, 0xed, 0xf7, 0x9d, 0xfe, + 0x01, 0x21, 0x0d, 0x48, 0x49, 0x07, 0x01, 0x60, + 0x22, 0x7e, 0x3b, 0x1c, 0xd2, 0x06, 0xd2, 0x0e, + 0x93, 0x40, 0x43, 0x60, 0x62, 0x7e, 0xd2, 0x06, + 0xd2, 0x0e, 0x97, 0x40, 0x47, 0x60, 0x41, 0x60, + 0xe6, 0xe7, 0x31, 0x33, 0x01, 0x00, 0xd9, 0x32, + 0x01, 0x00, 0x91, 0x31, 0x01, 0x00, 0xdd, 0x30, + 0x01, 0x00, 0x3c, 0x00, 0xcc, 0x32, 0x01, 0x00, + 0xfd, 0x32, 0x01, 0x00, 0x71, 0x33, 0x01, 0x00, + 0x00, 0x10, 0x07, 0x00, 0x42, 0x68, 0x2c, 0x32, + 0x50, 0x68, 0x43, 0x68, 0x0b, 0x60, 0x81, 0x68, + 0x4b, 0x89, 0x0b, 0x81, 0x83, 0x68, 0x00, 0x21, + 0xd9, 0x60, 0x41, 0x60, 0x81, 0x60, 0x00, 0x68, + 0x50, 0x60, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, + 0x70, 0xb5, 0x42, 0x68, 0xff, 0x26, 0x91, 0x87, + 0x10, 0x6b, 0x0c, 0x04, 0x3c, 0x00, 0x08, 0x33, + 0x01, 0x00, 0x05, 0x1c, 0x36, 0x04, 0x34, 0x40, + 0x43, 0x68, 0x59, 0x68, 0xb1, 0x43, 0x21, 0x43, + 0x59, 0x60, 0x00, 0x68, 0xa8, 0x42, 0xf7, 0xd1, + 0x10, 0x6b, 0x51, 0x69, 0x40, 0x68, 0x48, 0x60, + 0x51, 0x69, 0x01, 0x20, 0x08, 0x60, 0x70, 0xbd, + 0x00, 0x00, 0xb0, 0xb5, 0x43, 0x68, 0x08, 0x1c, + 0x59, 0x62, 0x9a, 0x62, 0x00, 0x25, 0x0a, 0xe0, + 0x45, 0x81, 0xc4, 0x68, 0x2a, 0x1c, 0x3c, 0x00, + 0x44, 0x33, 0x01, 0x00, 0x00, 0x2c, 0x03, 0xd1, + 0x9a, 0x7e, 0x12, 0x07, 0x12, 0x0f, 0x10, 0x32, + 0x42, 0x60, 0x20, 0x1c, 0x00, 0x28, 0xf2, 0xd1, + 0x18, 0x69, 0x41, 0x60, 0x19, 0x69, 0x01, 0x20, + 0x08, 0x60, 0x02, 0x48, 0x00, 0x68, 0xed, 0xf7, + 0x37, 0xf8, 0xb0, 0xbd, 0x5c, 0x5b, 0x01, 0x00, + 0x01, 0x20, 0x05, 0x49, 0x40, 0x07, 0x80, 0xb5, + 0x88, 0x60, 0x04, 0x48, 0x01, 0x68, 0x0d, 0x20, + 0x3c, 0x00, 0x80, 0x33, 0x01, 0x00, 0xfe, 0xf7, + 0xe6, 0xff, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x10, + 0x07, 0x00, 0xc4, 0x60, 0x01, 0x00, 0xf8, 0xb5, + 0x0e, 0x4f, 0x0c, 0x4e, 0x00, 0x24, 0x48, 0x20, + 0x60, 0x43, 0xc5, 0x19, 0x48, 0x21, 0x28, 0x1c, + 0xed, 0xf7, 0x7b, 0xf8, 0x1c, 0x20, 0x60, 0x43, + 0x81, 0x19, 0x28, 0x1d, 0x1c, 0x22, 0xed, 0xf7, + 0xfe, 0xf8, 0x1c, 0x23, 0xe8, 0x56, 0x05, 0x49, + 0xfb, 0xf7, 0x3c, 0x00, 0xbc, 0x33, 0x01, 0x00, + 0xcd, 0xf8, 0x01, 0x34, 0x01, 0x2c, 0xe9, 0xd3, + 0xf8, 0xbd, 0x00, 0x00, 0xb8, 0x44, 0x01, 0x00, + 0xcc, 0x6d, 0x01, 0x00, 0x15, 0x32, 0x01, 0x00, + 0xff, 0xb5, 0x05, 0x1c, 0x0a, 0x30, 0x06, 0x1c, + 0x81, 0xb0, 0xf2, 0xf7, 0xdd, 0xf8, 0x18, 0x4f, + 0x04, 0x1c, 0x39, 0x88, 0xef, 0xf7, 0xbc, 0xfc, + 0x32, 0x88, 0x78, 0x68, 0x02, 0x80, 0x72, 0x88, + 0x02, 0x30, 0x02, 0x80, 0x3c, 0x00, 0xf8, 0x33, + 0x01, 0x00, 0xb1, 0x88, 0x12, 0x4e, 0x41, 0x80, + 0x28, 0x88, 0x08, 0x36, 0x40, 0x05, 0x00, 0x28, + 0x05, 0xda, 0x69, 0x88, 0x03, 0x9a, 0x20, 0x1c, + 0xf7, 0xf7, 0x01, 0xfd, 0x00, 0xe0, 0x00, 0x20, + 0x70, 0x80, 0xf8, 0xf7, 0x5e, 0xfc, 0x01, 0x21, + 0x09, 0x03, 0x00, 0x28, 0x30, 0x88, 0x01, 0xd0, + 0x88, 0x43, 0x00, 0xe0, 0x08, 0x43, 0x30, 0x80, + 0x05, 0x48, 0x00, 0x22, 0x00, 0x21, 0x3c, 0x00, + 0x34, 0x34, 0x01, 0x00, 0x14, 0x30, 0xef, 0xf7, + 0x65, 0xfc, 0x20, 0x1c, 0xf9, 0xf7, 0x74, 0xf8, + 0x05, 0xb0, 0xf0, 0xbd, 0xb0, 0x7a, 0x01, 0x00, + 0x10, 0xb5, 0x0e, 0x4c, 0x60, 0x68, 0xf8, 0xf7, + 0x95, 0xf9, 0x20, 0x68, 0x00, 0x6a, 0x00, 0x28, + 0x13, 0xd1, 0xf8, 0xf7, 0xbf, 0xfc, 0x00, 0x28, + 0x08, 0xd0, 0x21, 0x68, 0x01, 0x20, 0x08, 0x62, + 0x1f, 0x21, 0x00, 0x22, 0x83, 0x20, 0x00, 0xf0, + 0x3c, 0x00, 0x70, 0x34, 0x01, 0x00, 0x9f, 0xf9, + 0x02, 0xe0, 0x60, 0x68, 0xf8, 0xf7, 0x21, 0xfa, + 0xff, 0xf7, 0x97, 0xfc, 0x21, 0x68, 0x08, 0x61, + 0x10, 0xbd, 0x14, 0x7a, 0x01, 0x00, 0xfe, 0xb5, + 0x1b, 0x4e, 0x0f, 0x1c, 0x1d, 0x1c, 0x14, 0x1c, + 0xb0, 0x60, 0x08, 0x1c, 0xf7, 0xf7, 0x2b, 0xff, + 0xb0, 0x80, 0x34, 0x73, 0x35, 0x62, 0x38, 0x1c, + 0x01, 0xaa, 0x02, 0xa9, 0xf7, 0xf7, 0x25, 0xff, + 0x00, 0xab, 0x3c, 0x00, 0xac, 0x34, 0x01, 0x00, + 0x18, 0x7a, 0x01, 0x28, 0x18, 0xd1, 0x18, 0x79, + 0x0b, 0x28, 0x08, 0xd1, 0x30, 0x7f, 0x24, 0x23, + 0x0f, 0x49, 0x58, 0x43, 0x40, 0x18, 0x80, 0x68, + 0xec, 0xf7, 0x88, 0xff, 0xfe, 0xbd, 0x00, 0xab, + 0x18, 0x79, 0x0a, 0x28, 0x08, 0xd1, 0xf7, 0xf7, + 0x39, 0xfd, 0x07, 0x1c, 0x29, 0x1c, 0x20, 0x1c, + 0xf7, 0xf7, 0x16, 0xfd, 0x38, 0x18, 0xb0, 0x80, + 0x30, 0x7f, 0x24, 0x23, 0x3c, 0x00, 0xe8, 0x34, + 0x01, 0x00, 0x04, 0x49, 0x58, 0x43, 0x40, 0x18, + 0x40, 0x68, 0xec, 0xf7, 0x72, 0xff, 0xe8, 0xe7, + 0x00, 0x00, 0xd4, 0x79, 0x01, 0x00, 0x94, 0x46, + 0x01, 0x00, 0xb0, 0xb5, 0xff, 0xf7, 0x53, 0xfc, + 0x04, 0x1c, 0xfb, 0xf7, 0xfc, 0xfa, 0x0c, 0x4d, + 0x29, 0x68, 0x09, 0x69, 0x09, 0x1b, 0x0c, 0x1a, + 0x02, 0x21, 0x1f, 0x20, 0x00, 0xf0, 0x8b, 0xf8, + 0x14, 0x2c, 0x06, 0xdd, 0x02, 0x22, 0x3c, 0x00, + 0x24, 0x35, 0x01, 0x00, 0x21, 0x1c, 0x1f, 0x20, + 0x00, 0xf0, 0x50, 0xf8, 0x01, 0x20, 0xb0, 0xbd, + 0x29, 0x68, 0x01, 0x20, 0x89, 0x6a, 0x00, 0x29, + 0xf9, 0xd0, 0x00, 0x20, 0xb0, 0xbd, 0x00, 0x00, + 0x14, 0x7a, 0x01, 0x00, 0xf8, 0xb5, 0x1a, 0x4d, + 0x07, 0x1c, 0xae, 0x79, 0x01, 0x21, 0x19, 0x4c, + 0x00, 0x20, 0x22, 0x68, 0x00, 0x2a, 0x14, 0xd1, + 0xae, 0x71, 0xa2, 0x68, 0xd0, 0x68, 0x06, 0xca, + 0x3c, 0x00, 0x60, 0x35, 0x01, 0x00, 0xec, 0xf7, + 0x3c, 0xff, 0xae, 0x79, 0x00, 0x21, 0x13, 0x4a, + 0x50, 0x69, 0x01, 0x30, 0x50, 0x61, 0xa0, 0x68, + 0x80, 0x68, 0xa0, 0x60, 0x62, 0x68, 0x90, 0x42, + 0x06, 0xd1, 0x01, 0x20, 0x20, 0x60, 0x03, 0xe0, + 0x01, 0x30, 0x0c, 0x34, 0x03, 0x28, 0xe3, 0xdb, + 0x00, 0x2f, 0x08, 0xd1, 0x00, 0x29, 0x0a, 0xd0, + 0x0a, 0x48, 0x40, 0x68, 0x00, 0x28, 0x06, 0xd0, + 0xfa, 0xf7, 0x3c, 0x00, 0x9c, 0x35, 0x01, 0x00, + 0xf5, 0xff, 0x03, 0xe0, 0x01, 0x2f, 0x03, 0xd0, + 0x00, 0x29, 0x01, 0xd1, 0xae, 0x71, 0xce, 0xe7, + 0xae, 0x71, 0xf8, 0xbd, 0x20, 0x10, 0x07, 0x00, + 0x18, 0xd9, 0x01, 0x00, 0xa8, 0x60, 0x01, 0x00, + 0x70, 0x5d, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x23, + 0xf5, 0xf7, 0x7c, 0xf8, 0x80, 0xbd, 0x00, 0x00, + 0x80, 0xb5, 0x00, 0x23, 0xf5, 0xf7, 0x76, 0xf8, + 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0x35, + 0x01, 0x00, 0xf8, 0xb5, 0x13, 0x4b, 0x00, 0x24, + 0x1b, 0x88, 0x98, 0x42, 0x1b, 0xd2, 0x11, 0x4b, + 0xc0, 0x00, 0xc0, 0x18, 0x45, 0x68, 0x06, 0x68, + 0x28, 0x68, 0x00, 0x28, 0x17, 0xd1, 0x0e, 0x4f, + 0xa8, 0x68, 0x43, 0x68, 0xb3, 0x42, 0x09, 0xd1, + 0xc3, 0x68, 0x8b, 0x42, 0x06, 0xd1, 0x03, 0x68, + 0x93, 0x42, 0x01, 0xd0, 0x53, 0x1c, 0x01, 0xd1, + 0x01, 0x24, 0x47, 0x60, 0x80, 0x68, 0x3c, 0x00, + 0x14, 0x36, 0x01, 0x00, 0x6b, 0x68, 0x83, 0x42, + 0xee, 0xd1, 0x03, 0xe0, 0x01, 0x21, 0x80, 0x20, + 0xed, 0xf7, 0x40, 0xfe, 0x20, 0x1c, 0xf8, 0xbd, + 0x56, 0x57, 0x01, 0x00, 0x84, 0x5d, 0x01, 0x00, + 0x29, 0xe3, 0x00, 0x00, 0xf8, 0xb5, 0x17, 0x4f, + 0x0a, 0x1c, 0xbe, 0x79, 0x16, 0x4d, 0x00, 0x23, + 0x6c, 0x68, 0x07, 0xe0, 0x21, 0x68, 0x91, 0x42, + 0x02, 0xd1, 0x21, 0x79, 0x81, 0x42, 0x04, 0xd0, + 0x3c, 0x00, 0x50, 0x36, 0x01, 0x00, 0x23, 0x1c, + 0xe4, 0x68, 0x00, 0x2c, 0xf5, 0xd1, 0x17, 0xe0, + 0x00, 0x2c, 0x15, 0xd0, 0x00, 0x2b, 0x0d, 0xd1, + 0xe3, 0x68, 0x0d, 0x48, 0x6b, 0x60, 0x00, 0x88, + 0x00, 0x2b, 0x02, 0xd1, 0xff, 0xf7, 0xd1, 0xfb, + 0x06, 0xe0, 0x0a, 0x4a, 0x99, 0x68, 0xff, 0xf7, + 0xf6, 0xfb, 0x01, 0xe0, 0xe0, 0x68, 0xd8, 0x60, + 0x28, 0x68, 0xe0, 0x60, 0x2c, 0x60, 0x02, 0xe0, + 0x01, 0x21, 0x3c, 0x00, 0x8c, 0x36, 0x01, 0x00, + 0xff, 0xf7, 0xa4, 0xff, 0xbe, 0x71, 0xf8, 0xbd, + 0x20, 0x10, 0x07, 0x00, 0x7c, 0x5d, 0x01, 0x00, + 0x2c, 0x74, 0x01, 0x00, 0x21, 0x38, 0x01, 0x00, + 0x70, 0xb5, 0x09, 0x4e, 0xb5, 0x79, 0xf9, 0xf7, + 0xaf, 0xfe, 0x04, 0x1c, 0x09, 0xd0, 0x20, 0x1c, + 0xed, 0xf7, 0x0c, 0xfb, 0x05, 0x49, 0x8a, 0x68, + 0x80, 0x18, 0x88, 0x60, 0x08, 0x68, 0x01, 0x30, + 0x08, 0x60, 0xb5, 0x71, 0x3c, 0x00, 0xc8, 0x36, + 0x01, 0x00, 0x20, 0x1c, 0x70, 0xbd, 0x20, 0x10, + 0x07, 0x00, 0xa8, 0x60, 0x01, 0x00, 0x09, 0x48, + 0x80, 0xb5, 0x40, 0x68, 0x02, 0x1c, 0x0b, 0xe0, + 0x01, 0x69, 0x00, 0x29, 0x07, 0xd0, 0x82, 0x42, + 0x04, 0xd0, 0x81, 0x68, 0x05, 0x48, 0x00, 0x88, + 0xff, 0xf7, 0xe5, 0xfa, 0x80, 0xbd, 0xc0, 0x68, + 0x00, 0x28, 0xf1, 0xd1, 0x80, 0xbd, 0x7c, 0x5d, + 0x01, 0x00, 0x2c, 0x74, 0x01, 0x00, 0x3c, 0x00, + 0x04, 0x37, 0x01, 0x00, 0x05, 0x48, 0x80, 0xb5, + 0x42, 0x68, 0x00, 0x2a, 0x04, 0xd0, 0x04, 0x48, + 0x00, 0x88, 0x91, 0x68, 0xff, 0xf7, 0xd2, 0xfa, + 0x80, 0xbd, 0x00, 0x00, 0x7c, 0x5d, 0x01, 0x00, + 0x2c, 0x74, 0x01, 0x00, 0x05, 0x48, 0x01, 0x68, + 0x00, 0x29, 0x04, 0xd0, 0xc0, 0x68, 0x00, 0x28, + 0x01, 0xd0, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, + 0x70, 0x47, 0x00, 0x00, 0x18, 0xd9, 0x01, 0x00, + 0x3c, 0x00, 0x40, 0x37, 0x01, 0x00, 0x80, 0xb5, + 0xf6, 0xf7, 0xd1, 0xfa, 0x80, 0xbd, 0x13, 0x1c, + 0x0d, 0x4a, 0xb0, 0xb5, 0x12, 0x88, 0x90, 0x42, + 0x0f, 0xd2, 0x03, 0x29, 0x0d, 0xd2, 0x0a, 0x4a, + 0xc0, 0x00, 0x14, 0x58, 0x0a, 0x4d, 0xac, 0x42, + 0x07, 0xd1, 0x13, 0x50, 0x0c, 0x23, 0x59, 0x43, + 0x08, 0x4b, 0xc9, 0x18, 0x80, 0x18, 0x41, 0x60, + 0xb0, 0xbd, 0x02, 0x21, 0x80, 0x20, 0xed, 0xf7, + 0x94, 0xfd, 0x3c, 0x00, 0x7c, 0x37, 0x01, 0x00, + 0xb0, 0xbd, 0x00, 0x00, 0x56, 0x57, 0x01, 0x00, + 0x84, 0x5d, 0x01, 0x00, 0x09, 0xa0, 0x00, 0x00, + 0x18, 0xd9, 0x01, 0x00, 0xf8, 0xb5, 0x0f, 0x1c, + 0x1e, 0x1c, 0x15, 0x1c, 0x04, 0x1c, 0x11, 0x1c, + 0xff, 0xf7, 0x4a, 0xff, 0x33, 0x1c, 0x2a, 0x1c, + 0x39, 0x1c, 0x20, 0x1c, 0xf4, 0xf7, 0x8a, 0xff, + 0xf8, 0xbd, 0x00, 0x00, 0xf7, 0xb5, 0x94, 0x46, + 0xff, 0x29, 0x21, 0xd0, 0x3c, 0x00, 0xb8, 0x37, + 0x01, 0x00, 0x15, 0x48, 0x00, 0x88, 0x81, 0x42, + 0x21, 0xd2, 0x14, 0x4a, 0x15, 0x4e, 0xc8, 0x00, + 0x85, 0x18, 0xb4, 0x79, 0x68, 0x68, 0x02, 0x68, + 0x00, 0x2a, 0x03, 0xd1, 0x03, 0x1d, 0x0c, 0xcb, + 0x9a, 0x42, 0x11, 0xd0, 0x43, 0x68, 0x9a, 0x68, + 0x42, 0x60, 0x0e, 0x4a, 0x17, 0x69, 0x01, 0x37, + 0x17, 0x61, 0xb4, 0x71, 0x00, 0x22, 0x02, 0x60, + 0x00, 0x98, 0xd8, 0x60, 0x60, 0x46, 0x3c, 0x00, + 0xf4, 0x37, 0x01, 0x00, 0x18, 0x60, 0x19, 0x74, + 0x28, 0x68, 0x58, 0x60, 0xfe, 0xbd, 0xb4, 0x71, + 0x06, 0x21, 0x00, 0xe0, 0x07, 0x21, 0x80, 0x20, + 0xed, 0xf7, 0x4c, 0xfd, 0xf6, 0xe7, 0x00, 0x00, + 0x56, 0x57, 0x01, 0x00, 0x84, 0x5d, 0x01, 0x00, + 0x20, 0x10, 0x07, 0x00, 0xa8, 0x60, 0x01, 0x00, + 0xb0, 0xb5, 0x14, 0x4d, 0x6c, 0x68, 0x00, 0x2c, + 0x01, 0xd0, 0x84, 0x42, 0x04, 0xd0, 0x0c, 0x21, + 0x3c, 0x00, 0x30, 0x38, 0x01, 0x00, 0x80, 0x20, + 0xed, 0xf7, 0x37, 0xfd, 0xb0, 0xbd, 0xff, 0xf7, + 0xb8, 0xfa, 0xa1, 0x68, 0x40, 0x1a, 0x0d, 0x49, + 0x88, 0x42, 0x03, 0xda, 0x10, 0x21, 0x80, 0x20, + 0xed, 0xf7, 0x2b, 0xfd, 0x21, 0x79, 0x22, 0x68, + 0x01, 0x20, 0xff, 0xf7, 0xac, 0xff, 0xe3, 0x68, + 0x6b, 0x60, 0x00, 0x2b, 0x05, 0xd0, 0x07, 0x48, + 0x06, 0x4a, 0x00, 0x88, 0x99, 0x68, 0xff, 0xf7, + 0xfe, 0xfa, 0x3c, 0x00, 0x6c, 0x38, 0x01, 0x00, + 0x28, 0x68, 0xe0, 0x60, 0x2c, 0x60, 0xb0, 0xbd, + 0x7c, 0x5d, 0x01, 0x00, 0x18, 0xfc, 0xff, 0xff, + 0x21, 0x38, 0x01, 0x00, 0x2c, 0x74, 0x01, 0x00, + 0xb0, 0xb5, 0x15, 0x4c, 0x08, 0x20, 0x21, 0x1c, + 0x80, 0x31, 0x08, 0x70, 0x13, 0x4a, 0x41, 0x04, + 0x11, 0x60, 0x13, 0x48, 0x00, 0x68, 0x13, 0x4d, + 0x6b, 0x69, 0x18, 0x40, 0x01, 0xd1, 0x10, 0x20, + 0x00, 0xe0, 0x00, 0x20, 0x3c, 0x00, 0xa8, 0x38, + 0x01, 0x00, 0xa8, 0x23, 0x5b, 0x5d, 0x18, 0x43, + 0x23, 0x1c, 0x40, 0x33, 0x18, 0x73, 0x51, 0x60, + 0x20, 0x78, 0x80, 0x08, 0x80, 0x00, 0x20, 0x70, + 0x00, 0x20, 0xff, 0xf7, 0x12, 0xfb, 0xff, 0xf7, + 0x72, 0xfa, 0x64, 0x30, 0x28, 0x66, 0x01, 0x38, + 0xa0, 0x61, 0x20, 0x78, 0x03, 0x21, 0x08, 0x43, + 0x20, 0x70, 0xb0, 0xbd, 0x00, 0x00, 0x00, 0x90, + 0x07, 0x00, 0x00, 0x10, 0x07, 0x00, 0x3c, 0x00, + 0xe4, 0x38, 0x01, 0x00, 0x10, 0x00, 0x07, 0x00, + 0xa4, 0x6c, 0x01, 0x00, 0x38, 0xb5, 0x0a, 0x4c, + 0x21, 0x1c, 0x20, 0x31, 0x8a, 0x79, 0x00, 0xab, + 0x1a, 0x70, 0xc9, 0x79, 0x07, 0x4d, 0x59, 0x70, + 0x69, 0x78, 0x88, 0x42, 0x03, 0xd1, 0xf8, 0xf7, + 0x13, 0xfc, 0xff, 0x20, 0x68, 0x70, 0x00, 0xab, + 0x18, 0x88, 0xe0, 0x84, 0x38, 0xbd, 0x00, 0x00, + 0x00, 0x10, 0x07, 0x00, 0x4c, 0x7b, 0x01, 0x00, + 0x3c, 0x00, 0x20, 0x39, 0x01, 0x00, 0xf8, 0xb5, + 0x0b, 0x1c, 0x06, 0x1c, 0x04, 0x1d, 0x7f, 0x33, + 0x14, 0xd0, 0x33, 0x68, 0x5d, 0x18, 0x35, 0x60, + 0x23, 0x88, 0x1f, 0x18, 0x06, 0x23, 0xff, 0x56, + 0xeb, 0x1b, 0x33, 0x60, 0x23, 0x88, 0x18, 0x18, + 0x81, 0x71, 0x20, 0x88, 0x01, 0x30, 0x00, 0x04, + 0x00, 0x0c, 0x20, 0x80, 0x90, 0x42, 0x01, 0xd3, + 0x00, 0x20, 0x20, 0x80, 0x10, 0x1c, 0x31, 0x68, + 0xec, 0xf7, 0x3c, 0x00, 0x5c, 0x39, 0x01, 0x00, + 0x6d, 0xfe, 0xf8, 0xbd, 0x0e, 0x49, 0x0a, 0x7c, + 0x83, 0x78, 0x1a, 0x43, 0x0a, 0x74, 0x42, 0x78, + 0x83, 0x78, 0x9a, 0x43, 0x0b, 0x7c, 0x93, 0x43, + 0x0b, 0x74, 0x8a, 0x7c, 0x43, 0x78, 0x1a, 0x43, + 0x8a, 0x74, 0x8a, 0x7c, 0x03, 0x78, 0x9a, 0x43, + 0x8a, 0x74, 0x02, 0x78, 0x43, 0x78, 0x1a, 0x43, + 0x4b, 0x7c, 0x1a, 0x43, 0x4a, 0x74, 0x4a, 0x7c, + 0xc0, 0x78, 0x82, 0x43, 0x3c, 0x00, 0x98, 0x39, + 0x01, 0x00, 0x4a, 0x74, 0x70, 0x47, 0x10, 0x00, + 0x07, 0x00, 0xb0, 0xb5, 0x06, 0x4d, 0x00, 0x24, + 0x20, 0x06, 0x00, 0x0e, 0xed, 0xf7, 0xf7, 0xf8, + 0xa1, 0x00, 0x69, 0x58, 0x08, 0x71, 0x01, 0x34, + 0x04, 0x2c, 0xf5, 0xdb, 0xb0, 0xbd, 0x10, 0x7b, + 0x01, 0x00, 0x0b, 0x48, 0x0c, 0x49, 0x7d, 0x23, + 0x42, 0x69, 0xdb, 0x00, 0x00, 0x2a, 0xc8, 0x6b, + 0x07, 0xd0, 0xc0, 0x18, 0x1a, 0x01, 0x3c, 0x00, + 0xd4, 0x39, 0x01, 0x00, 0x90, 0x42, 0xc8, 0x63, + 0x01, 0xd9, 0x07, 0x48, 0xc8, 0x63, 0x70, 0x47, + 0xff, 0x38, 0xf5, 0x38, 0xc8, 0x63, 0x98, 0x42, + 0xf9, 0xd2, 0xcb, 0x63, 0x70, 0x47, 0x00, 0x00, + 0xf4, 0x68, 0x01, 0x00, 0x44, 0x7d, 0x01, 0x00, + 0x70, 0x17, 0x00, 0x00, 0x70, 0xb5, 0x0d, 0x1c, + 0x04, 0x1c, 0x16, 0x1c, 0xfb, 0xf7, 0xf6, 0xfa, + 0xb0, 0x43, 0x28, 0x43, 0x01, 0x1c, 0x20, 0x1c, + 0x3c, 0x00, 0x10, 0x3a, 0x01, 0x00, 0x00, 0xf0, + 0xcc, 0xfa, 0x70, 0xbd, 0x00, 0x00, 0x80, 0xb5, + 0x0b, 0x4a, 0x00, 0x29, 0x09, 0xd0, 0x02, 0x29, + 0x0f, 0xd1, 0x01, 0x1c, 0x08, 0x48, 0xd2, 0x78, + 0x38, 0x30, 0xff, 0xf7, 0x78, 0xff, 0x06, 0x49, + 0x06, 0xe0, 0x01, 0x1c, 0x04, 0x48, 0x12, 0x79, + 0x20, 0x30, 0xff, 0xf7, 0x70, 0xff, 0x03, 0x49, + 0x08, 0x60, 0x80, 0xbd, 0x00, 0x00, 0xac, 0x7c, + 0x01, 0x00, 0x3c, 0x00, 0x4c, 0x3a, 0x01, 0x00, + 0xc8, 0x67, 0x01, 0x00, 0xc4, 0x67, 0x01, 0x00, + 0x80, 0xb5, 0x0b, 0x4a, 0x00, 0x29, 0x09, 0xd0, + 0x02, 0x29, 0x0f, 0xd1, 0x01, 0x1c, 0x08, 0x48, + 0x52, 0x79, 0x68, 0x30, 0xff, 0xf7, 0x5a, 0xff, + 0x06, 0x49, 0x06, 0xe0, 0x01, 0x1c, 0x04, 0x48, + 0x92, 0x79, 0x50, 0x30, 0xff, 0xf7, 0x52, 0xff, + 0x03, 0x49, 0x08, 0x60, 0x80, 0xbd, 0x00, 0x00, + 0xac, 0x7c, 0x01, 0x00, 0x3c, 0x00, 0x88, 0x3a, + 0x01, 0x00, 0xd0, 0x67, 0x01, 0x00, 0xcc, 0x67, + 0x01, 0x00, 0x08, 0xb5, 0x04, 0x21, 0x00, 0x91, + 0x81, 0x7e, 0x43, 0x68, 0x03, 0x29, 0x06, 0xd1, + 0x01, 0x1c, 0x0c, 0x31, 0x01, 0x20, 0x6a, 0x46, + 0xec, 0xf7, 0x9a, 0xfc, 0x08, 0xbd, 0x19, 0x68, + 0xc1, 0x60, 0xfb, 0xe7, 0x00, 0x00, 0x10, 0xb5, + 0x03, 0x1c, 0x00, 0x20, 0x08, 0x4c, 0x00, 0x21, + 0xca, 0x00, 0x12, 0x19, 0x92, 0x78, 0x3c, 0x00, + 0xc4, 0x3a, 0x01, 0x00, 0x9a, 0x42, 0x03, 0xd1, + 0xc8, 0x00, 0x00, 0x19, 0x40, 0x68, 0x10, 0xbd, + 0x01, 0x31, 0x09, 0x06, 0x09, 0x16, 0x06, 0x29, + 0xf1, 0xdb, 0x10, 0xbd, 0xcc, 0x5a, 0x01, 0x00, + 0xf8, 0xb5, 0x0f, 0x1c, 0x16, 0x1c, 0x00, 0x25, + 0xfe, 0xf7, 0x8e, 0xf9, 0x04, 0x1c, 0x0a, 0xd0, + 0x4a, 0x20, 0x00, 0x5d, 0x05, 0x28, 0x06, 0xd1, + 0x38, 0x1c, 0xf1, 0xf7, 0x81, 0xfe, 0x00, 0x28, + 0x3c, 0x00, 0x00, 0x3b, 0x01, 0x00, 0x01, 0xd0, + 0x01, 0x25, 0x34, 0x60, 0x28, 0x1c, 0xf8, 0xbd, + 0x00, 0x00, 0x70, 0xb5, 0x0d, 0x1c, 0x16, 0x1c, + 0x00, 0x24, 0xfe, 0xf7, 0x78, 0xf9, 0x00, 0x28, + 0x0b, 0xd0, 0x4a, 0x21, 0x09, 0x5c, 0x05, 0x29, + 0x07, 0xd1, 0x01, 0x69, 0x00, 0x29, 0x04, 0xd1, + 0x30, 0x60, 0xf1, 0xf7, 0x04, 0xfd, 0x01, 0x24, + 0x28, 0x60, 0x20, 0x1c, 0x70, 0xbd, 0xf8, 0xb5, + 0x06, 0x1c, 0x3c, 0x00, 0x3c, 0x3b, 0x01, 0x00, + 0x00, 0x25, 0x0c, 0x1c, 0x08, 0x1c, 0xf1, 0xf7, + 0x5d, 0xfe, 0x00, 0x28, 0x01, 0xd0, 0x00, 0x21, + 0x05, 0xe0, 0x20, 0x1c, 0xf1, 0xf7, 0x74, 0xfe, + 0x00, 0x28, 0x14, 0xd0, 0x01, 0x21, 0x30, 0x1c, + 0xf4, 0xf7, 0x80, 0xfb, 0x00, 0x90, 0x00, 0x28, + 0x0d, 0xd0, 0x08, 0x4f, 0x01, 0x25, 0x06, 0x22, + 0x31, 0x1c, 0x38, 0x1c, 0xec, 0xf7, 0xc2, 0xfc, + 0x06, 0x22, 0x21, 0x1c, 0x3c, 0x00, 0x78, 0x3b, + 0x01, 0x00, 0xb8, 0x18, 0xec, 0xf7, 0xbd, 0xfc, + 0x00, 0x98, 0xf8, 0x60, 0x28, 0x1c, 0xf8, 0xbd, + 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0x00, 0x21, + 0x00, 0x28, 0x06, 0xd0, 0x42, 0x78, 0x07, 0x2a, + 0x03, 0xd1, 0xc0, 0x79, 0x01, 0x28, 0x00, 0xd1, + 0x01, 0x21, 0x08, 0x1c, 0x70, 0x47, 0xf8, 0xb5, + 0x05, 0x1c, 0x00, 0x27, 0x16, 0x4e, 0xf1, 0xf7, + 0x28, 0xfe, 0x00, 0x28, 0x07, 0xd0, 0x3c, 0x00, + 0xb4, 0x3b, 0x01, 0x00, 0xf1, 0xf7, 0xc0, 0xfb, + 0x00, 0x28, 0x10, 0xd1, 0x00, 0x24, 0xf1, 0xf7, + 0xbb, 0xfc, 0x06, 0xe0, 0xf1, 0xf7, 0x02, 0xfe, + 0x00, 0x28, 0x08, 0xd0, 0x01, 0x24, 0xf1, 0xf7, + 0x99, 0xfd, 0x01, 0x1c, 0x06, 0x22, 0x30, 0x1c, + 0xec, 0xf7, 0x8e, 0xfc, 0x01, 0x27, 0x00, 0x2f, + 0x0d, 0xd0, 0x21, 0x1c, 0x28, 0x1c, 0xf4, 0xf7, + 0x3b, 0xfb, 0x01, 0x1c, 0x05, 0x48, 0x06, 0x22, + 0x3c, 0x00, 0xf0, 0x3b, 0x01, 0x00, 0x06, 0x38, + 0xc1, 0x60, 0x29, 0x1c, 0xec, 0xf7, 0x7f, 0xfc, + 0x01, 0x20, 0xf8, 0xbd, 0x00, 0x20, 0xfc, 0xe7, + 0x00, 0x00, 0x76, 0x7c, 0x01, 0x00, 0xf0, 0xb5, + 0x07, 0x1c, 0x00, 0x68, 0x02, 0x21, 0x04, 0x68, + 0x78, 0x69, 0x87, 0xb0, 0x01, 0x40, 0x00, 0x25, + 0x00, 0x29, 0x05, 0x91, 0x74, 0x4e, 0x12, 0xd0, + 0x22, 0x88, 0x01, 0x21, 0x13, 0x05, 0x02, 0xd4, + 0xc0, 0x07, 0x3c, 0x00, 0x2c, 0x3c, 0x01, 0x00, + 0xc1, 0x17, 0x01, 0x31, 0x6f, 0x48, 0x00, 0x29, + 0x00, 0x68, 0x01, 0xd0, 0x01, 0x30, 0x04, 0xe0, + 0x11, 0x06, 0x89, 0x0e, 0x2d, 0x29, 0x01, 0xd1, + 0x03, 0x30, 0x30, 0x60, 0x20, 0x88, 0x80, 0x07, + 0x67, 0xd1, 0x78, 0x69, 0xc0, 0x07, 0x64, 0xd5, + 0x03, 0xaa, 0x04, 0xa9, 0x20, 0x1c, 0xf7, 0xf7, + 0x4b, 0xfb, 0x00, 0xab, 0x18, 0x7c, 0x00, 0x28, + 0x07, 0xd0, 0x18, 0x7c, 0x3c, 0x00, 0x68, 0x3c, + 0x01, 0x00, 0x02, 0x28, 0x58, 0xd1, 0x18, 0x7b, + 0x40, 0x07, 0x40, 0x0f, 0x04, 0x28, 0x53, 0xd8, + 0x20, 0x79, 0x05, 0x99, 0xc0, 0x07, 0xc0, 0x17, + 0x01, 0x30, 0x02, 0x90, 0x00, 0x29, 0x02, 0xd1, + 0x02, 0x98, 0x00, 0x28, 0x48, 0xd1, 0x05, 0x99, + 0x00, 0x29, 0x04, 0xd0, 0x20, 0x88, 0x00, 0x05, + 0x01, 0xd4, 0x00, 0x20, 0x30, 0x60, 0xc0, 0x20, + 0xed, 0xf7, 0xcb, 0xfd, 0x05, 0x1c, 0x3c, 0x00, + 0xa4, 0x3c, 0x01, 0x00, 0x20, 0x1c, 0x0a, 0x30, + 0x06, 0x90, 0xfe, 0xf7, 0xad, 0xf8, 0x06, 0x1c, + 0x28, 0x1c, 0x08, 0x30, 0x23, 0x88, 0x02, 0x1d, + 0x11, 0x1d, 0xdb, 0x05, 0x06, 0xd5, 0x06, 0x9b, + 0x03, 0x60, 0x20, 0x1c, 0x10, 0x30, 0x10, 0x60, + 0x20, 0x1d, 0x0e, 0xe0, 0x23, 0x1d, 0x13, 0x60, + 0x22, 0x88, 0x92, 0x05, 0x05, 0xd5, 0x22, 0x1c, + 0x10, 0x32, 0x02, 0x60, 0x06, 0x9b, 0x0b, 0x60, + 0x3c, 0x00, 0xe0, 0x3c, 0x01, 0x00, 0x04, 0xe0, + 0x06, 0x9b, 0x03, 0x60, 0x20, 0x1c, 0x10, 0x30, + 0x08, 0x60, 0x28, 0x69, 0xf1, 0xf7, 0x43, 0xfc, + 0x00, 0x28, 0x08, 0xd0, 0x01, 0x28, 0x12, 0xd0, + 0x02, 0x28, 0x58, 0xd1, 0x00, 0xab, 0x18, 0x7c, + 0x00, 0x28, 0x54, 0xd1, 0x12, 0xe0, 0x00, 0xab, + 0x18, 0x7c, 0x02, 0x28, 0x0b, 0xd1, 0x00, 0x2e, + 0x4d, 0xd0, 0x4b, 0x20, 0x80, 0x5d, 0x02, 0x28, + 0x49, 0xd1, 0x3c, 0x00, 0x1c, 0x3d, 0x01, 0x00, + 0x07, 0xe0, 0x63, 0xe0, 0x00, 0xab, 0x18, 0x7c, + 0x00, 0x28, 0x02, 0xd1, 0x38, 0x1c, 0xfe, 0xf7, + 0x1b, 0xff, 0x20, 0x88, 0x41, 0x04, 0x30, 0x48, + 0x11, 0xd5, 0x00, 0x2e, 0x52, 0xd0, 0x00, 0xab, + 0x19, 0x7c, 0x00, 0x29, 0x26, 0xd0, 0x02, 0x99, + 0x00, 0x29, 0x02, 0xd0, 0xb0, 0x6a, 0x00, 0x78, + 0x00, 0xe0, 0x00, 0x78, 0x01, 0x28, 0x1d, 0xd0, + 0x03, 0x28, 0x43, 0xd1, 0x3c, 0x00, 0x58, 0x3d, + 0x01, 0x00, 0x1a, 0xe0, 0x00, 0xab, 0x19, 0x7c, + 0x02, 0x29, 0x16, 0xd1, 0x19, 0x7b, 0x04, 0x29, + 0x13, 0xd0, 0x19, 0x7b, 0x0c, 0x29, 0x10, 0xd0, + 0x22, 0x49, 0x09, 0x68, 0x00, 0x29, 0x0c, 0xd0, + 0x00, 0x2e, 0x0a, 0xd0, 0x02, 0x99, 0x00, 0x29, + 0x02, 0xd0, 0xb0, 0x6a, 0x00, 0x78, 0x00, 0xe0, + 0x00, 0x78, 0x01, 0x28, 0x29, 0xd0, 0x03, 0x28, + 0x27, 0xd0, 0x28, 0x22, 0x39, 0x1c, 0x3c, 0x00, + 0x94, 0x3d, 0x01, 0x00, 0x28, 0x1c, 0x88, 0x30, + 0xec, 0xf7, 0x0a, 0xfc, 0x00, 0xab, 0x19, 0x7c, + 0x28, 0x1c, 0x80, 0x30, 0x01, 0x71, 0x19, 0x7b, + 0x41, 0x71, 0x6c, 0x60, 0x6e, 0x61, 0x1b, 0xe0, + 0x05, 0x99, 0x00, 0x29, 0x14, 0xd0, 0x11, 0x48, + 0x84, 0x6c, 0x00, 0x2c, 0x10, 0xd0, 0x00, 0x22, + 0x00, 0x2e, 0x04, 0xd0, 0x40, 0x36, 0xb0, 0x7a, + 0x05, 0x28, 0x00, 0xd1, 0x01, 0x22, 0x00, 0x92, + 0x3c, 0x00, 0xd0, 0x3d, 0x01, 0x00, 0xf8, 0x7a, + 0xba, 0x7a, 0x29, 0x69, 0xc3, 0x07, 0xdb, 0x0f, + 0x06, 0x98, 0xec, 0xf7, 0x00, 0xfb, 0x28, 0x1c, + 0xed, 0xf7, 0x07, 0xfd, 0x00, 0x25, 0x28, 0x1c, + 0x07, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xc4, 0x6a, + 0x01, 0x00, 0x68, 0x61, 0x01, 0x00, 0x28, 0x61, + 0x01, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x80, 0xb5, + 0x02, 0x20, 0xff, 0xf7, 0x70, 0xf8, 0x80, 0xbd, + 0x00, 0x00, 0x3c, 0x00, 0x0c, 0x3e, 0x01, 0x00, + 0xb0, 0xb5, 0x1d, 0x4d, 0x01, 0x28, 0x17, 0xd0, + 0xa2, 0x28, 0x06, 0xd0, 0xa3, 0x28, 0x03, 0xd1, + 0x01, 0x21, 0x15, 0x20, 0xff, 0xf7, 0x08, 0xfc, + 0xb0, 0xbd, 0x00, 0x29, 0x01, 0xd1, 0x17, 0x48, + 0x02, 0xe0, 0x7d, 0x20, 0xc0, 0x00, 0x48, 0x43, + 0x00, 0x23, 0x01, 0x22, 0x01, 0x1c, 0x28, 0x60, + 0x15, 0x20, 0xff, 0xf7, 0xa7, 0xfc, 0xb0, 0xbd, + 0x01, 0x29, 0x04, 0xd0, 0x3c, 0x00, 0x48, 0x3e, + 0x01, 0x00, 0x02, 0x29, 0xfa, 0xd1, 0x00, 0xf0, + 0x2a, 0xf8, 0xb0, 0xbd, 0x6c, 0x68, 0xf5, 0xf7, + 0xde, 0xfc, 0xfe, 0xf7, 0xa8, 0xff, 0x68, 0x60, + 0x00, 0x2c, 0x09, 0xd0, 0x29, 0x68, 0x0a, 0x23, + 0x59, 0x43, 0x00, 0x1b, 0x88, 0x42, 0x03, 0xd9, + 0x01, 0x21, 0x15, 0x20, 0xed, 0xf7, 0x17, 0xfa, + 0x01, 0x22, 0x15, 0x20, 0x29, 0x68, 0xff, 0xf7, + 0xa6, 0xfb, 0xb0, 0xbd, 0x00, 0x00, 0x3c, 0x00, + 0x84, 0x3e, 0x01, 0x00, 0x04, 0x79, 0x01, 0x00, + 0x00, 0x87, 0x93, 0x03, 0x01, 0x20, 0x04, 0x49, + 0x40, 0x03, 0x80, 0xb5, 0x08, 0x60, 0x03, 0x21, + 0x15, 0x20, 0xed, 0xf7, 0x03, 0xfa, 0x80, 0xbd, + 0x00, 0x10, 0x07, 0x00, 0x07, 0x48, 0x80, 0xb5, + 0xbe, 0x21, 0x01, 0x73, 0x01, 0x7a, 0x10, 0x22, + 0x11, 0x43, 0x01, 0x72, 0x00, 0x23, 0x02, 0x22, + 0x15, 0x20, 0x03, 0x49, 0xff, 0xf7, 0x68, 0xfc, + 0x3c, 0x00, 0xc0, 0x3e, 0x01, 0x00, 0x80, 0xbd, + 0x00, 0x00, 0x00, 0x03, 0x07, 0x00, 0x80, 0x9f, + 0xd5, 0x00, 0x80, 0xb5, 0x00, 0x28, 0x03, 0xd0, + 0x0a, 0x1c, 0x15, 0x21, 0xa2, 0x20, 0x02, 0xe0, + 0x00, 0x22, 0x15, 0x21, 0xa3, 0x20, 0xff, 0xf7, + 0x66, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x10, 0xb5, + 0x00, 0xf0, 0x19, 0xf8, 0x0a, 0x48, 0xbe, 0x21, + 0x01, 0x73, 0x03, 0x7a, 0x10, 0x22, 0x93, 0x43, + 0x01, 0x24, 0x3c, 0x00, 0xfc, 0x3e, 0x01, 0x00, + 0x23, 0x43, 0x03, 0x72, 0x01, 0x73, 0x01, 0x7a, + 0x91, 0x43, 0x20, 0x22, 0x11, 0x43, 0x01, 0x72, + 0x02, 0x22, 0x15, 0x20, 0x02, 0x49, 0xff, 0xf7, + 0x5b, 0xfb, 0x10, 0xbd, 0x00, 0x03, 0x07, 0x00, + 0x80, 0x9f, 0xd5, 0x00, 0x80, 0xb5, 0x02, 0x21, + 0x15, 0x20, 0xff, 0xf7, 0x85, 0xfb, 0x04, 0x48, + 0xbe, 0x21, 0x01, 0x73, 0x01, 0x7a, 0x11, 0x22, + 0x91, 0x43, 0x01, 0x72, 0x3c, 0x00, 0x38, 0x3f, + 0x01, 0x00, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x03, + 0x07, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x05, 0x1c, + 0x60, 0x36, 0x00, 0x27, 0x44, 0x68, 0x22, 0xe0, + 0x08, 0x21, 0x00, 0x20, 0xed, 0xf7, 0x41, 0xfb, + 0x60, 0x61, 0x01, 0x89, 0x04, 0x39, 0x09, 0x04, + 0x09, 0x0c, 0x01, 0x81, 0x60, 0x69, 0x00, 0x68, + 0x40, 0x18, 0x04, 0x21, 0xed, 0xf7, 0x35, 0xfb, + 0xe0, 0x61, 0x60, 0x69, 0x71, 0x7b, 0x3c, 0x00, + 0x74, 0x3f, 0x01, 0x00, 0x00, 0x68, 0x89, 0x01, + 0xc1, 0x70, 0x29, 0x69, 0x0c, 0x31, 0x03, 0x22, + 0xec, 0xf7, 0xba, 0xfa, 0x28, 0x69, 0x0c, 0x30, + 0x01, 0x68, 0x01, 0x31, 0x01, 0x60, 0x25, 0x62, + 0xa7, 0x61, 0x24, 0x68, 0x00, 0x2c, 0xda, 0xd1, + 0x02, 0x49, 0x03, 0x48, 0x6a, 0x68, 0xf6, 0xf7, + 0xb3, 0xf8, 0xf8, 0xbd, 0xfd, 0x6b, 0x00, 0x00, + 0xa0, 0x6a, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x07, + 0x3c, 0x00, 0xb0, 0x3f, 0x01, 0x00, 0x00, 0x09, + 0x09, 0x02, 0x09, 0x0a, 0x08, 0x43, 0x02, 0x49, + 0x08, 0x60, 0xff, 0xf7, 0x20, 0xff, 0x80, 0xbd, + 0x00, 0x00, 0x60, 0x00, 0x07, 0x00, 0x08, 0x00, + 0x14, 0x00, 0xc8, 0x00, 0x00, 0x00, 0xe8, 0x03, + 0x00, 0x00, 0x10, 0x00, 0x14, 0x00, 0xc8, 0x00, + 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, 0x1c, 0x00, + 0x14, 0x00, 0xc8, 0x00, 0x00, 0x00, 0xe8, 0x03, + 0x00, 0x00, 0x3c, 0x00, 0xec, 0x3f, 0x01, 0x00, + 0x24, 0x01, 0x07, 0x00, 0x32, 0x00, 0x00, 0x00, + 0xe8, 0x03, 0x00, 0x00, 0x40, 0x06, 0x01, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x41, 0x6e, 0x62, 0x69, 0x7e, 0x64, 0x61, 0x6f, + 0x6f, 0x00, 0x00, 0x00, 0x52, 0x65, 0x6c, 0x65, + 0x61, 0x73, 0x65, 0x20, 0x36, 0x5f, 0x37, 0x5f, + 0x31, 0x35, 0x20, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x20, 0x32, 0x3a, 0x35, 0x3c, 0x00, 0x28, 0x40, + 0x01, 0x00, 0x32, 0x39, 0x38, 0x20, 0x53, 0x65, + 0x70, 0x20, 0x30, 0x34, 0x20, 0x32, 0x30, 0x30, + 0x39, 0x20, 0x31, 0x37, 0x3a, 0x31, 0x33, 0x3a, + 0x32, 0x30, 0x20, 0x28, 0x48, 0x57, 0x3d, 0x34, + 0x3a, 0x33, 0x2c, 0x42, 0x54, 0x43, 0x4f, 0x45, + 0x58, 0x29, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, + 0x1c, 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3c, 0x00, + 0x64, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe8, 0x03, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0xd0, 0x07, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x7c, 0x15, 0x15, 0x00, + 0x3c, 0x00, 0xa0, 0x40, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x70, 0x17, + 0x1e, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x28, 0x23, 0x16, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xf8, 0x2a, + 0x0b, 0x00, 0x3c, 0x00, 0xdc, 0x40, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, + 0xe0, 0x2e, 0x12, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x50, 0x46, 0x0e, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0xf0, 0x55, 0x08, 0x00, 0x3c, 0x00, 0x18, 0x41, + 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2c, 0x00, + 0x00, 0x00, 0xc0, 0x5d, 0x0e, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xe8, 0x80, + 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x42, 0x00, + 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x3c, 0x00, + 0x54, 0x41, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x00, 0x00, 0x80, 0xbb, 0x0a, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0xf0, 0xd2, 0x0a, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6c, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x90, 0x00, + 0x3c, 0x00, 0x90, 0x41, 0x01, 0x00, 0xc0, 0x00, + 0x90, 0x00, 0xc0, 0x00, 0x90, 0x00, 0x14, 0x00, + 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0xc0, 0x00, + 0x90, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, + 0x10, 0x00, 0xc0, 0x00, 0x90, 0x00, 0x14, 0x00, + 0x10, 0x00, 0xc0, 0x00, 0x90, 0x00, 0x14, 0x00, + 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, + 0x10, 0x00, 0xc0, 0x00, 0x90, 0x00, 0x60, 0x00, + 0x48, 0x00, 0x3c, 0x00, 0xcc, 0x41, 0x01, 0x00, + 0x60, 0x00, 0x48, 0x00, 0x14, 0x00, 0x10, 0x00, + 0x14, 0x00, 0x10, 0x00, 0x60, 0x00, 0x48, 0x00, + 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, + 0x60, 0x00, 0x48, 0x00, 0x14, 0x00, 0x10, 0x00, + 0x60, 0x00, 0x48, 0x00, 0x14, 0x00, 0x10, 0x00, + 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, + 0x02, 0x00, 0x04, 0x01, 0x0b, 0x02, 0x0c, 0x03, + 0x12, 0x04, 0x16, 0x05, 0x3c, 0x00, 0x08, 0x42, + 0x01, 0x00, 0x18, 0x06, 0x00, 0x0e, 0x00, 0x0e, + 0x24, 0x07, 0x00, 0x0e, 0x2c, 0x08, 0x30, 0x09, + 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x42, 0x0a, + 0x00, 0x0e, 0x48, 0x0b, 0x00, 0x0e, 0x00, 0x0e, + 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x60, 0x0c, + 0x00, 0x0e, 0x00, 0x0e, 0x6c, 0x0d, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xc0, 0xff, 0xff, 0xff, 0x3c, 0x00, + 0x44, 0x42, 0x01, 0x00, 0xb6, 0xff, 0xff, 0xff, + 0xd3, 0xff, 0xff, 0xff, 0xc9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x51, 0xb0, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x51, 0xb0, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x59, 0xaf, 0x00, 0x00, + 0x3c, 0x00, 0x80, 0x42, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xa5, 0xaf, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0xaf, 0x00, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x45, 0xb0, 0x00, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xd5, 0xaf, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xad, 0xb0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xbc, 0x42, 0x01, 0x00, + 0x95, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x95, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x99, 0xb0, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0x42, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x17, + 0x01, 0x00, 0x35, 0x17, 0x01, 0x00, 0x21, 0x17, + 0x01, 0x00, 0xd9, 0x9c, 0x00, 0x00, 0x49, 0x17, + 0x01, 0x00, 0x3d, 0x17, 0x01, 0x00, 0xd1, 0x9c, + 0x00, 0x00, 0xd1, 0x9c, 0x00, 0x00, 0x1d, 0x1a, + 0x01, 0x00, 0xd1, 0x9c, 0x00, 0x00, 0x01, 0x1a, + 0x01, 0x00, 0x31, 0x1a, 0x01, 0x00, 0x25, 0x1a, + 0x01, 0x00, 0x3d, 0x17, 0x01, 0x00, 0x3c, 0x00, + 0x34, 0x43, 0x01, 0x00, 0x81, 0x1a, 0x01, 0x00, + 0xd1, 0x9c, 0x00, 0x00, 0x79, 0x17, 0x01, 0x00, + 0xd9, 0x9c, 0x00, 0x00, 0x5d, 0x17, 0x01, 0x00, + 0xa1, 0x17, 0x01, 0x00, 0x95, 0x17, 0x01, 0x00, + 0x81, 0x17, 0x01, 0x00, 0x21, 0x18, 0x01, 0x00, + 0xf5, 0x17, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x70, 0x43, 0x01, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x19, 0x1c, + 0x01, 0x00, 0x89, 0x41, 0x00, 0x00, 0x89, 0x41, + 0x00, 0x00, 0x85, 0x41, 0x00, 0x00, 0x85, 0x41, + 0x00, 0x00, 0x85, 0x41, 0x00, 0x00, 0x85, 0x41, + 0x00, 0x00, 0x89, 0x41, 0x00, 0x00, 0x85, 0x41, + 0x00, 0x00, 0x85, 0x41, 0x00, 0x00, 0x35, 0x1b, + 0x01, 0x00, 0x3c, 0x00, 0xac, 0x43, 0x01, 0x00, + 0x9d, 0x1b, 0x01, 0x00, 0x01, 0x1c, 0x01, 0x00, + 0x89, 0x41, 0x00, 0x00, 0x89, 0x41, 0x00, 0x00, + 0x89, 0x41, 0x00, 0x00, 0x85, 0x41, 0x00, 0x00, + 0x65, 0x18, 0x01, 0x00, 0x29, 0x18, 0x01, 0x00, + 0x39, 0x18, 0x01, 0x00, 0xbd, 0x18, 0x01, 0x00, + 0x89, 0x41, 0x00, 0x00, 0x4d, 0x18, 0x01, 0x00, + 0xa5, 0x18, 0x01, 0x00, 0x85, 0x41, 0x00, 0x00, + 0x01, 0x19, 0x01, 0x00, 0x3c, 0x00, 0xe8, 0x43, + 0x01, 0x00, 0xd9, 0x18, 0x01, 0x00, 0xed, 0x18, + 0x01, 0x00, 0x15, 0x19, 0x01, 0x00, 0x89, 0x41, + 0x00, 0x00, 0x89, 0x41, 0x00, 0x00, 0x89, 0x41, + 0x00, 0x00, 0x85, 0x41, 0x00, 0x00, 0x89, 0x41, + 0x00, 0x00, 0x89, 0x41, 0x00, 0x00, 0x69, 0x1c, + 0x01, 0x00, 0x89, 0x41, 0x00, 0x00, 0x71, 0x1c, + 0x01, 0x00, 0x89, 0x41, 0x00, 0x00, 0x89, 0x41, + 0x00, 0x00, 0xfd, 0xdb, 0x00, 0x00, 0x3c, 0x00, + 0x24, 0x44, 0x01, 0x00, 0x1d, 0x7c, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x00, 0xf5, 0xda, 0x00, 0x00, + 0x14, 0x00, 0x81, 0x00, 0xfd, 0xdd, 0x00, 0x00, + 0x08, 0x00, 0x82, 0x00, 0xc5, 0xdd, 0x00, 0x00, + 0x38, 0x00, 0x83, 0x00, 0x45, 0xdc, 0x00, 0x00, + 0x10, 0x00, 0x84, 0x00, 0x99, 0xdc, 0x00, 0x00, + 0x0c, 0x00, 0x86, 0x00, 0x39, 0xdc, 0x00, 0x00, + 0x10, 0x00, 0x88, 0x00, 0x11, 0xde, 0x00, 0x00, + 0x3c, 0x00, 0x60, 0x44, 0x01, 0x00, 0x10, 0x00, + 0x8a, 0x00, 0x35, 0xdd, 0x00, 0x00, 0x0c, 0x00, + 0x8c, 0x00, 0xad, 0xdf, 0x00, 0x00, 0x1c, 0x00, + 0x8e, 0x00, 0xc9, 0xde, 0x00, 0x00, 0x38, 0x00, + 0x8f, 0x00, 0xed, 0xdc, 0x00, 0x00, 0x38, 0x00, + 0x90, 0x00, 0x75, 0xdf, 0x00, 0x00, 0x0c, 0x00, + 0x91, 0x00, 0x8d, 0xdc, 0x00, 0x00, 0x0c, 0x00, + 0x93, 0x00, 0xb9, 0xdd, 0x00, 0x00, 0x0c, 0x00, + 0x94, 0x00, 0x3c, 0x00, 0x9c, 0x44, 0x01, 0x00, + 0x00, 0x08, 0x08, 0x08, 0x10, 0x0c, 0x0c, 0x0c, + 0x08, 0x0c, 0x08, 0x0c, 0x08, 0x0c, 0x08, 0x08, + 0x08, 0x08, 0x14, 0x08, 0x08, 0x14, 0x00, 0x30, + 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, + 0xad, 0x30, 0x01, 0x00, 0x15, 0x30, 0x01, 0x00, + 0x20, 0x30, 0x07, 0x00, 0x30, 0x30, 0x07, 0x00, + 0x06, 0x07, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0x44, + 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0xc9, 0x02, 0x00, 0x94, 0x3f, + 0x03, 0x00, 0xe0, 0x8b, 0x5a, 0x00, 0x05, 0x3a, + 0x85, 0x00, 0xc8, 0xf2, 0x06, 0x00, 0xf8, 0x4c, + 0x56, 0x00, 0x20, 0xa7, 0x3d, 0x00, 0xb7, 0x4a, + 0x00, 0x00, 0xb7, 0x4a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x14, 0x45, 0x01, 0x00, 0x01, 0x01, 0x01, 0x02, + 0x02, 0x02, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, + 0x05, 0x06, 0x00, 0x00, 0x2d, 0x7c, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x00, 0xfd, 0x95, 0x00, 0x00, + 0x08, 0x00, 0xff, 0x00, 0xed, 0x97, 0x00, 0x00, + 0x08, 0x00, 0x82, 0x00, 0xcd, 0x95, 0x00, 0x00, + 0x0c, 0x00, 0x83, 0x00, 0x4d, 0x96, 0x00, 0x00, + 0x0c, 0x00, 0x85, 0x00, 0x2d, 0x7c, 0x00, 0x00, + 0x3c, 0x00, 0x50, 0x45, 0x01, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x2d, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x2d, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x3d, 0x96, 0x00, 0x00, 0x0c, 0x00, + 0x89, 0x00, 0xd9, 0x97, 0x00, 0x00, 0x08, 0x00, + 0x8a, 0x00, 0x91, 0x95, 0x00, 0x00, 0x08, 0x00, + 0xff, 0x00, 0x2d, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x2d, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x3c, 0x00, 0x8c, 0x45, 0x01, 0x00, + 0xf9, 0x97, 0x00, 0x00, 0x08, 0x00, 0x8d, 0x00, + 0x2d, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x2d, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, + 0xc9, 0x97, 0x00, 0x00, 0x30, 0x00, 0x90, 0x00, + 0x11, 0x95, 0x00, 0x00, 0x18, 0x00, 0x91, 0x00, + 0x15, 0x96, 0x00, 0x00, 0x08, 0x00, 0x92, 0x00, + 0x59, 0x95, 0x00, 0x00, 0x3c, 0x00, 0x93, 0x00, + 0x29, 0x96, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0x45, + 0x01, 0x00, 0x08, 0x00, 0x94, 0x00, 0xa1, 0x95, + 0x00, 0x00, 0x08, 0x00, 0x95, 0x00, 0x81, 0x97, + 0x00, 0x00, 0x0c, 0x00, 0x96, 0x00, 0x6d, 0x97, + 0x00, 0x00, 0x10, 0x00, 0x98, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x10, + 0x08, 0x00, 0x00, 0x08, 0x00, 0x10, 0x3c, 0x00, + 0x04, 0x46, 0x01, 0x00, 0x08, 0x0c, 0x0c, 0x0c, + 0x0c, 0x1c, 0x0c, 0x0c, 0x08, 0x00, 0x00, 0x00, + 0x0d, 0x8b, 0x00, 0x00, 0xf5, 0x8a, 0x00, 0x00, + 0xe9, 0x8a, 0x00, 0x00, 0x01, 0x8b, 0x00, 0x00, + 0x14, 0x08, 0x0c, 0x0c, 0x10, 0x0c, 0x00, 0x00, + 0xb1, 0x98, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x19, 0x99, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, + 0x3d, 0x7c, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x40, 0x46, 0x01, 0x00, 0x3d, 0x99, + 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x09, 0x99, + 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x3d, 0x7c, + 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x01, + 0x04, 0x04, 0x08, 0x08, 0x81, 0x37, 0x80, 0xf3, + 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00, 0xaa, 0xaa, + 0x03, 0x00, 0x00, 0xf8, 0x6d, 0xa9, 0x6d, 0xa9, + 0x6e, 0xa9, 0x3c, 0x00, 0x7c, 0x46, 0x01, 0x00, + 0x6e, 0xa8, 0x6e, 0xa8, 0x6e, 0xa8, 0x6f, 0xa7, + 0x6f, 0xa7, 0x6f, 0xa7, 0x6f, 0xa6, 0x6f, 0xa6, + 0x70, 0xa6, 0x70, 0xa5, 0x70, 0xa4, 0x00, 0x00, + 0xb5, 0x1b, 0x01, 0x00, 0xc9, 0x1b, 0x01, 0x00, + 0xe1, 0x1b, 0x01, 0x00, 0xe5, 0x9c, 0x00, 0x00, + 0xa5, 0x1b, 0x01, 0x00, 0xe5, 0x9c, 0x00, 0x00, + 0x89, 0x1b, 0x01, 0x00, 0xd5, 0x9c, 0x00, 0x00, + 0xd5, 0x9c, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0x46, + 0x01, 0x00, 0xd1, 0x1a, 0x01, 0x00, 0xe5, 0x1a, + 0x01, 0x00, 0x05, 0x1b, 0x01, 0x00, 0x25, 0x1b, + 0x01, 0x00, 0xb1, 0x1a, 0x01, 0x00, 0xe5, 0x9c, + 0x00, 0x00, 0x9d, 0x1a, 0x01, 0x00, 0xd5, 0x9c, + 0x00, 0x00, 0xc1, 0x1a, 0x01, 0x00, 0x89, 0x19, + 0x01, 0x00, 0xa9, 0x19, 0x01, 0x00, 0xc9, 0x19, + 0x01, 0x00, 0xf1, 0x19, 0x01, 0x00, 0x79, 0x19, + 0x01, 0x00, 0xe5, 0x9c, 0x00, 0x00, 0x3c, 0x00, + 0xf4, 0x46, 0x01, 0x00, 0x65, 0x19, 0x01, 0x00, + 0xd5, 0x9c, 0x00, 0x00, 0xd5, 0x9c, 0x00, 0x00, + 0xd5, 0x9c, 0x00, 0x00, 0xd5, 0x9c, 0x00, 0x00, + 0xd5, 0x9c, 0x00, 0x00, 0xd5, 0x9c, 0x00, 0x00, + 0xd5, 0x9c, 0x00, 0x00, 0x55, 0x1c, 0x01, 0x00, + 0x45, 0x1c, 0x01, 0x00, 0x45, 0x1c, 0x01, 0x00, + 0xd5, 0x9c, 0x00, 0x00, 0xd5, 0x9c, 0x00, 0x00, + 0xd5, 0x9c, 0x00, 0x00, 0xd5, 0x9c, 0x00, 0x00, + 0x3c, 0x00, 0x30, 0x47, 0x01, 0x00, 0xd5, 0x9c, + 0x00, 0x00, 0x55, 0x19, 0x01, 0x00, 0xe5, 0x9c, + 0x00, 0x00, 0x41, 0x19, 0x01, 0x00, 0x31, 0x19, + 0x01, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0x02, 0x05, + 0x0a, 0x00, 0x00, 0x00, 0x02, 0x04, 0x0a, 0x00, + 0x00, 0x00, 0xc5, 0x20, 0x00, 0x00, 0x21, 0x21, + 0x00, 0x00, 0x25, 0x21, 0x00, 0x00, 0x39, 0x21, + 0x00, 0x00, 0x49, 0x21, 0x00, 0x00, 0x55, 0x21, + 0x00, 0x00, 0x3c, 0x00, 0x6c, 0x47, 0x01, 0x00, + 0x61, 0x21, 0x00, 0x00, 0xed, 0x21, 0x00, 0x00, + 0x0d, 0x22, 0x00, 0x00, 0x21, 0x22, 0x00, 0x00, + 0x3d, 0x22, 0x00, 0x00, 0x49, 0x22, 0x00, 0x00, + 0xc5, 0x22, 0x00, 0x00, 0xe1, 0x22, 0x00, 0x00, + 0xf5, 0x22, 0x00, 0x00, 0xe9, 0x1f, 0x00, 0x00, + 0xe9, 0x1f, 0x00, 0x00, 0xe9, 0x1f, 0x00, 0x00, + 0xe9, 0x1f, 0x00, 0x00, 0xe9, 0x1f, 0x00, 0x00, + 0x11, 0x23, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0x47, + 0x01, 0x00, 0x1d, 0x23, 0x00, 0x00, 0x89, 0x23, + 0x00, 0x00, 0xa5, 0x23, 0x00, 0x00, 0xb9, 0x23, + 0x00, 0x00, 0x11, 0x20, 0x00, 0x00, 0x1d, 0x20, + 0x00, 0x00, 0x6d, 0x20, 0x00, 0x00, 0x8d, 0x20, + 0x00, 0x00, 0xb9, 0x20, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x03, 0x03, 0x05, 0x06, 0x06, 0x08, 0x09, + 0x08, 0x09, 0x09, 0x09, 0xc4, 0x80, 0xca, 0x80, + 0x80, 0x80, 0x80, 0x80, 0xd0, 0x80, 0x3c, 0x00, + 0xe4, 0x47, 0x01, 0x00, 0xd6, 0xd9, 0xdc, 0xdf, + 0xe2, 0x80, 0x80, 0x80, 0xe5, 0xe8, 0x80, 0x80, + 0x80, 0x80, 0xeb, 0xee, 0xf1, 0xf4, 0xf7, 0xfa, + 0xfd, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, + 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, + 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, + 0x0c, 0x00, 0x0e, 0x00, 0x10, 0x00, 0x11, 0x00, + 0x13, 0x00, 0x16, 0x00, 0x18, 0x00, 0x1b, 0x00, + 0x3c, 0x00, 0x20, 0x48, 0x01, 0x00, 0x1e, 0x00, + 0x22, 0x00, 0x26, 0x00, 0x2b, 0x00, 0x30, 0x00, + 0x36, 0x00, 0x3c, 0x00, 0x44, 0x00, 0x4c, 0x00, + 0x55, 0x00, 0x5f, 0x00, 0x6b, 0x00, 0x78, 0x00, + 0x86, 0x00, 0x97, 0x00, 0xa9, 0x00, 0xbe, 0x00, + 0xd5, 0x00, 0xef, 0x00, 0xff, 0x7f, 0x0c, 0x00, + 0x06, 0x00, 0x02, 0x00, 0x00, 0x00, 0xfe, 0xff, + 0xfc, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xf9, 0xff, + 0xf8, 0xff, 0x3c, 0x00, 0x5c, 0x48, 0x01, 0x00, + 0xf7, 0xff, 0xf6, 0xff, 0xf5, 0xff, 0xf4, 0xff, + 0xf3, 0xff, 0xf2, 0xff, 0xf1, 0xff, 0xf0, 0xff, + 0xef, 0xff, 0xee, 0xff, 0xed, 0xff, 0xec, 0xff, + 0xeb, 0xff, 0xea, 0xff, 0xe9, 0xff, 0xe8, 0xff, + 0xe7, 0xff, 0xe6, 0xff, 0xe5, 0xff, 0xe4, 0xff, + 0xe3, 0xff, 0xe2, 0xff, 0xe1, 0xff, 0xe0, 0xff, + 0xdf, 0xff, 0xde, 0xff, 0xdd, 0xff, 0xdc, 0xff, + 0xdc, 0xff, 0x00, 0x00, 0x3c, 0x00, 0x98, 0x48, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xb1, 0x7c, 0x41, 0x00, 0x11, 0x5a, + 0x40, 0xe2, 0xb2, 0x7c, 0x41, 0x00, 0x05, 0x5a, + 0x40, 0xe2, 0xaf, 0x7c, 0x41, 0x00, 0xf9, 0x59, + 0x40, 0xe2, 0xb0, 0x7c, 0x41, 0x00, 0xed, 0x59, + 0x40, 0xe2, 0x24, 0x67, 0x01, 0x00, 0x0e, 0x00, + 0x00, 0xe3, 0x5c, 0x67, 0x01, 0x00, 0x0e, 0x00, + 0x00, 0xe3, 0x0a, 0x61, 0x01, 0x00, 0x3c, 0x00, + 0xd4, 0x48, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, + 0x0e, 0x61, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, + 0x32, 0x67, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, + 0x6a, 0x67, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, + 0x0b, 0x61, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, + 0x0f, 0x61, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, + 0x40, 0x67, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, + 0x78, 0x67, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, + 0x3c, 0x00, 0x10, 0x49, 0x01, 0x00, 0x0c, 0x61, + 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, 0x10, 0x61, + 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, 0x4e, 0x67, + 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0x86, 0x67, + 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0x0d, 0x61, + 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, 0x11, 0x61, + 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, 0xc0, 0x48, + 0x01, 0x00, 0x04, 0x00, 0x00, 0x0a, 0xe0, 0x48, + 0x01, 0x00, 0x3c, 0x00, 0x4c, 0x49, 0x01, 0x00, + 0x04, 0x00, 0x00, 0x0a, 0x00, 0x49, 0x01, 0x00, + 0x04, 0x00, 0x00, 0x0a, 0x20, 0x49, 0x01, 0x00, + 0x04, 0x00, 0x00, 0x0a, 0x18, 0x67, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x28, 0x75, 0x01, 0x01, + 0x7d, 0xa9, 0x40, 0xe2, 0x2c, 0x75, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x20, 0x75, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x44, 0x75, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x3c, 0x00, 0x88, 0x49, + 0x01, 0x00, 0xf0, 0x59, 0x01, 0x00, 0x04, 0x00, + 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x24, 0x75, 0x01, 0x00, 0x04, 0x00, + 0x00, 0xe2, 0xb8, 0x7c, 0x01, 0x00, 0x04, 0x00, + 0x00, 0xe2, 0x8d, 0xa9, 0x00, 0x00, 0x01, 0x00, + 0x00, 0xda, 0x1d, 0x75, 0x01, 0x00, 0x01, 0x00, + 0x00, 0xe2, 0xc4, 0x67, 0x01, 0x00, 0x3c, 0x00, + 0xc4, 0x49, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x21, 0x59, 0x00, 0x00, 0x0e, 0x00, 0x00, 0xd9, + 0xc8, 0x67, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0xcc, 0x67, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0xd0, 0x67, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0x65, 0xd9, 0x00, 0x00, 0x04, 0x00, 0x00, 0xda, + 0xa5, 0xd9, 0x00, 0x00, 0x04, 0x00, 0x00, 0xda, + 0x3c, 0x00, 0x00, 0x4a, 0x01, 0x00, 0x01, 0x59, + 0x00, 0x00, 0x01, 0x00, 0x00, 0xda, 0x32, 0x67, + 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0x6a, 0x67, + 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0x11, 0x59, + 0x00, 0x00, 0x01, 0x00, 0x00, 0xda, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x48, + 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0xa0, 0x48, + 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x40, 0x49, + 0x01, 0x00, 0x3c, 0x00, 0x3c, 0x4a, 0x01, 0x00, + 0x05, 0x00, 0x00, 0x0a, 0x68, 0x49, 0x01, 0x00, + 0x09, 0x00, 0x00, 0x0a, 0x6c, 0x57, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x38, 0x61, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xac, 0x6e, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0xb0, 0x6e, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x70, 0x57, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x3c, 0x00, 0x78, 0x4a, + 0x01, 0x00, 0xe8, 0x59, 0x01, 0x00, 0x08, 0x00, + 0x00, 0xe3, 0xdc, 0x58, 0x01, 0x14, 0x4d, 0xfd, + 0x40, 0xe3, 0x2c, 0x59, 0x01, 0x14, 0x39, 0xfd, + 0x40, 0xe3, 0xc0, 0x58, 0x01, 0x00, 0x0e, 0x00, + 0x00, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x64, 0x73, 0x41, 0x00, 0x3d, 0x2e, + 0x44, 0xe2, 0x7c, 0x59, 0x01, 0x14, 0x3c, 0x00, + 0xb4, 0x4a, 0x01, 0x00, 0x9d, 0x2f, 0x44, 0xe3, + 0x5c, 0x57, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe2, + 0x79, 0x2e, 0x04, 0x00, 0x01, 0x00, 0x00, 0xdb, + 0xa0, 0x58, 0x01, 0x00, 0x02, 0x00, 0x00, 0xe3, + 0xa2, 0x58, 0x01, 0x00, 0x02, 0x00, 0x00, 0xe3, + 0xa0, 0x57, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, + 0xd1, 0x88, 0x01, 0x00, 0x01, 0x00, 0x00, 0xda, + 0x1d, 0x89, 0x01, 0x00, 0x04, 0x00, 0x00, 0xda, + 0x3c, 0x00, 0xf0, 0x4a, 0x01, 0x00, 0x95, 0x88, + 0x01, 0x00, 0x04, 0x00, 0x00, 0xdb, 0x31, 0x2f, + 0x04, 0x00, 0x0e, 0x00, 0x00, 0xd9, 0xc5, 0x2e, + 0x04, 0x00, 0x0e, 0x00, 0x00, 0xd9, 0x68, 0x6c, + 0x01, 0x01, 0x15, 0xd5, 0x40, 0xe2, 0xc0, 0x57, + 0x01, 0x00, 0x08, 0x00, 0x00, 0xe3, 0xc8, 0x57, + 0x01, 0x00, 0x34, 0x00, 0x00, 0xe3, 0x9c, 0x6c, + 0x01, 0x00, 0x08, 0x00, 0x00, 0xe3, 0xb0, 0x58, + 0x01, 0x03, 0x3c, 0x00, 0x2c, 0x4b, 0x01, 0x00, + 0xe9, 0xd4, 0x40, 0xe2, 0xbc, 0x58, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x9d, 0xa3, 0x00, 0x00, + 0x60, 0x00, 0x00, 0xd9, 0x70, 0x79, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x78, 0x79, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x7c, 0x5a, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x5d, 0x1c, 0x00, 0x00, + 0x11, 0x00, 0x00, 0xd9, 0x24, 0x6e, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x3c, 0x00, 0x68, 0x4b, + 0x01, 0x00, 0x18, 0x58, 0x01, 0x05, 0xd5, 0xd5, + 0x40, 0xe3, 0xfc, 0x57, 0x01, 0x00, 0x14, 0x00, + 0x00, 0xe3, 0x04, 0x8e, 0x01, 0x03, 0xe5, 0xd5, + 0x40, 0xe3, 0x00, 0x5b, 0x01, 0x00, 0x04, 0x00, + 0x00, 0xe2, 0x18, 0x5b, 0x01, 0x00, 0x40, 0x00, + 0x00, 0xe2, 0xd4, 0x67, 0x01, 0x00, 0x04, 0x00, + 0x00, 0xe2, 0x8d, 0x37, 0x00, 0x00, 0x04, 0x00, + 0x00, 0xdb, 0xbd, 0x36, 0x00, 0x00, 0x3c, 0x00, + 0xa4, 0x4b, 0x01, 0x00, 0x04, 0x00, 0x00, 0xdb, + 0xfc, 0x60, 0x01, 0x00, 0x02, 0x00, 0x00, 0xe2, + 0x90, 0x7d, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0x70, 0x69, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb0, 0x49, 0x01, 0x00, 0x1a, 0x00, 0x00, 0x0a, + 0x90, 0x4b, 0x01, 0x00, 0x06, 0x00, 0x00, 0x0a, + 0xa4, 0x58, 0x81, 0x00, 0x05, 0xfd, 0x40, 0xe3, + 0x3c, 0x00, 0xe0, 0x4b, 0x01, 0x00, 0x80, 0x4a, + 0x01, 0x00, 0x0c, 0x00, 0x00, 0x0a, 0x0c, 0x5a, + 0x81, 0x01, 0x25, 0x2d, 0x44, 0xe3, 0xe0, 0x4a, + 0x01, 0x00, 0x03, 0x00, 0x00, 0x0a, 0x18, 0x63, + 0x41, 0x00, 0xfd, 0xbb, 0x40, 0xe2, 0x08, 0x57, + 0x01, 0x00, 0x01, 0x00, 0x00, 0xe2, 0x9c, 0x48, + 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x4a, + 0x01, 0x00, 0x3c, 0x00, 0x1c, 0x4c, 0x01, 0x00, + 0x02, 0x00, 0x00, 0x0a, 0xcc, 0x74, 0x01, 0x00, + 0x03, 0x00, 0x00, 0xe3, 0x65, 0x73, 0x41, 0x00, + 0xa9, 0x2e, 0x44, 0xe2, 0xf6, 0x59, 0x01, 0x01, + 0xd1, 0x2c, 0x44, 0xe3, 0x08, 0x4b, 0x01, 0x00, + 0x04, 0x00, 0x00, 0x0a, 0x07, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x6a, 0x28, 0x4b, 0x01, 0x00, + 0x02, 0x00, 0x00, 0x0a, 0x88, 0x7d, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x3c, 0x00, 0x58, 0x4c, + 0x01, 0x00, 0x00, 0x75, 0x01, 0x04, 0x65, 0x6f, + 0x40, 0xe3, 0xbc, 0x78, 0x01, 0x00, 0x0e, 0x00, + 0x00, 0xe3, 0x38, 0x4b, 0x01, 0x00, 0x04, 0x00, + 0x00, 0x0a, 0x04, 0x57, 0x01, 0x00, 0x04, 0x00, + 0x00, 0x62, 0x58, 0x4b, 0x01, 0x00, 0x02, 0x00, + 0x00, 0x0a, 0x80, 0x4b, 0x01, 0x00, 0x02, 0x00, + 0x00, 0x0a, 0x68, 0x4b, 0x01, 0x00, 0x03, 0x00, + 0x00, 0x0a, 0x8c, 0x7d, 0x01, 0x00, 0x3c, 0x00, + 0x94, 0x4c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0x39, 0x2d, 0x04, 0x00, 0x04, 0x00, 0x00, 0xdb, + 0x94, 0x7d, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x64, + 0xa8, 0x4c, 0x01, 0x00, 0x04, 0x00, 0x00, 0x0a, + 0x3c, 0x00, 0xd0, 0x4c, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x4c, + 0x01, 0x00, 0x01, 0x00, 0x00, 0x0a, 0xd0, 0x4c, + 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x7a, + 0x01, 0x00, 0x01, 0x00, 0x00, 0xe2, 0xe8, 0x7a, + 0x01, 0x00, 0x01, 0x00, 0x00, 0xe2, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x7a, + 0x01, 0x00, 0x3c, 0x00, 0x0c, 0x4d, 0x01, 0x00, + 0x01, 0x00, 0x00, 0xe2, 0xee, 0x7a, 0x01, 0x00, + 0x01, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf3, 0x7a, 0x01, 0x00, + 0x01, 0x00, 0x00, 0xe2, 0xf4, 0x7a, 0x01, 0x00, + 0x01, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf9, 0x7a, 0x01, 0x00, + 0x01, 0x00, 0x00, 0xe2, 0xfa, 0x7a, 0x01, 0x00, + 0x01, 0x00, 0x00, 0xe2, 0x3c, 0x00, 0x48, 0x4d, + 0x01, 0x00, 0xe8, 0x4c, 0x01, 0x00, 0x03, 0x00, + 0x00, 0x0a, 0x00, 0x4d, 0x01, 0x00, 0x03, 0x00, + 0x00, 0x0a, 0x18, 0x4d, 0x01, 0x00, 0x03, 0x00, + 0x00, 0x0a, 0x30, 0x4d, 0x01, 0x00, 0x03, 0x00, + 0x00, 0x0a, 0x90, 0x5c, 0x01, 0x00, 0x04, 0x00, + 0x00, 0xe2, 0x94, 0x5c, 0x01, 0x00, 0x04, 0x00, + 0x00, 0xe2, 0x98, 0x5c, 0x01, 0x00, 0x04, 0x00, + 0x00, 0xe2, 0x9c, 0x5c, 0x01, 0x00, 0x3c, 0x00, + 0x84, 0x4d, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0xa0, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0xa4, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0xa8, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0xac, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0xb0, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0xb4, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0xb8, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0x3c, 0x00, 0xc0, 0x4d, 0x01, 0x00, 0xbc, 0x5c, + 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xc0, 0x5c, + 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xc4, 0x5c, + 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x90, 0x5c, + 0x01, 0x00, 0x38, 0x00, 0x00, 0xe3, 0x68, 0x4d, + 0x01, 0x00, 0x0e, 0x00, 0x00, 0x0a, 0xd8, 0x4d, + 0x01, 0x00, 0x02, 0x00, 0x00, 0xfa, 0x12, 0x61, + 0x81, 0x01, 0x31, 0xd5, 0x40, 0xe3, 0x06, 0x61, + 0x01, 0x00, 0x3c, 0x00, 0xfc, 0x4d, 0x01, 0x00, + 0x02, 0x00, 0x00, 0xe2, 0x0b, 0x61, 0x01, 0x00, + 0x01, 0x00, 0x00, 0xe3, 0x0f, 0x61, 0x01, 0x00, + 0x01, 0x00, 0x00, 0xe3, 0x08, 0x61, 0x01, 0x00, + 0x02, 0x00, 0x00, 0xe2, 0x50, 0x7b, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x4e, 0x01, 0x00, + 0x0e, 0x00, 0x00, 0x64, 0x9c, 0x57, 0x01, 0x01, + 0x91, 0x88, 0x41, 0xe3, 0x3c, 0x00, 0x38, 0x4e, + 0x01, 0x00, 0x6e, 0x41, 0x67, 0x6f, 0xe2, 0x65, + 0x60, 0x69, 0x6f, 0x20, 0x41, 0x42, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x4d, 0x01, 0x00, 0x09, 0x00, + 0x00, 0x0a, 0x48, 0x4e, 0x01, 0x00, 0x01, 0x00, + 0x00, 0x0a, 0xe8, 0x4d, 0x01, 0x00, 0x01, 0x00, + 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x4d, 0x01, 0x00, 0x04, 0x00, + 0x00, 0x0a, 0x28, 0x61, 0x01, 0x01, 0x3c, 0x00, + 0x74, 0x4e, 0x01, 0x00, 0xbd, 0xd5, 0x40, 0xe2, + 0x69, 0x61, 0x41, 0x00, 0x85, 0xd5, 0x40, 0xe2, + 0x30, 0x61, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0x34, 0x61, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0x3c, 0x61, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0x34, 0x61, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0x44, 0x61, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, + 0x3c, 0x00, 0xb0, 0x4e, 0x01, 0x00, 0x70, 0x4e, + 0x01, 0x00, 0x08, 0x00, 0x00, 0x0a, 0x18, 0x61, + 0x01, 0x00, 0x02, 0x00, 0x00, 0xe2, 0x1c, 0x61, + 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x20, 0x61, + 0x01, 0x00, 0x02, 0x00, 0x00, 0xe2, 0x24, 0x61, + 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xb8, 0x4e, + 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0xc8, 0x4e, + 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0xd8, 0x4e, + 0x01, 0x00, 0x3c, 0x00, 0xec, 0x4e, 0x01, 0x00, + 0x02, 0x00, 0x00, 0x0a, 0x96, 0x48, 0x01, 0x00, + 0x06, 0x00, 0x00, 0xe3, 0xe0, 0x62, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x6a, 0x9b, 0x7d, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x62, 0x9c, 0x7d, 0x01, 0x00, + 0x02, 0x00, 0x00, 0x62, 0x60, 0x7c, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x6a, 0x3c, 0x00, 0x28, 0x4f, + 0x01, 0x00, 0x2d, 0x63, 0x01, 0x00, 0x01, 0x00, + 0x00, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x49, 0xd5, 0x00, 0x00, 0x0e, 0x00, + 0x00, 0xd9, 0xf4, 0x67, 0x01, 0x00, 0x02, 0x00, + 0x00, 0x62, 0x46, 0x7d, 0x01, 0x00, 0x01, 0x00, + 0x00, 0x62, 0x9c, 0x7c, 0x01, 0x00, 0x04, 0x00, + 0x00, 0xe2, 0x98, 0x7c, 0x01, 0x00, 0x3c, 0x00, + 0x64, 0x4f, 0x01, 0x00, 0x02, 0x00, 0x00, 0x62, + 0xa0, 0x7c, 0x01, 0x00, 0x06, 0x00, 0x00, 0x62, + 0x58, 0x7c, 0x01, 0x00, 0x02, 0x00, 0x00, 0x62, + 0x64, 0x7c, 0x01, 0x00, 0x06, 0x00, 0x00, 0x62, + 0x5a, 0x7c, 0x01, 0x00, 0x02, 0x00, 0x00, 0x62, + 0x6a, 0x7c, 0x01, 0x00, 0x06, 0x00, 0x00, 0x62, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, + 0xe4, 0x62, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0x3c, 0x00, 0xa0, 0x4f, 0x01, 0x00, 0xe8, 0x62, + 0x01, 0x00, 0x03, 0x00, 0x00, 0xe2, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xdc, 0x4f, 0x01, 0x00, + 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x6a, 0x3c, 0x00, 0x18, 0x50, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x6a, 0xf0, 0x4e, 0x01, 0x00, 0x2a, 0x00, + 0x00, 0x0a, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, 0x3c, 0x00, + 0x54, 0x50, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, + 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, + 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, + 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, + 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, + 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, + 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, + 0x3c, 0x00, 0x90, 0x50, 0x01, 0x00, 0x75, 0x2a, + 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x06, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, + 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x07, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, + 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x08, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, + 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x09, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xcc, 0x50, 0x01, 0x00, + 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, + 0x0c, 0x00, 0x00, 0xdb, 0x0a, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, + 0x0c, 0x00, 0x00, 0xdb, 0x0b, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, + 0x0c, 0x00, 0x00, 0xdb, 0x0c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, + 0x0c, 0x00, 0x00, 0xdb, 0x3c, 0x00, 0x08, 0x51, + 0x01, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, + 0x00, 0xdb, 0x0e, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, + 0x00, 0xdb, 0x48, 0x50, 0x01, 0x00, 0x02, 0x00, + 0x00, 0x0a, 0x58, 0x50, 0x01, 0x00, 0x02, 0x00, + 0x00, 0x0a, 0x68, 0x50, 0x01, 0x00, 0x02, 0x00, + 0x00, 0x0a, 0x78, 0x50, 0x01, 0x00, 0x3c, 0x00, + 0x44, 0x51, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, + 0x88, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, + 0x98, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, + 0xa8, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, + 0xb8, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, + 0xc8, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, + 0xd8, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, + 0xe8, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, + 0x3c, 0x00, 0x80, 0x51, 0x01, 0x00, 0xf8, 0x50, + 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x08, 0x51, + 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x18, 0x51, + 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x40, 0x50, + 0x01, 0x00, 0x01, 0x00, 0x00, 0x0a, 0xe8, 0x4e, + 0x01, 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x4e, + 0x01, 0x00, 0x3c, 0x00, 0xbc, 0x51, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x51, 0x01, 0x00, + 0x0e, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0x51, + 0x01, 0x00, 0x98, 0x51, 0x01, 0x00, 0x0c, 0x00, + 0x00, 0x0a, 0x50, 0x4e, 0x01, 0x00, 0x04, 0x00, + 0x00, 0x0a, 0xe0, 0x4c, 0x01, 0x00, 0x01, 0x00, + 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x4b, 0x01, 0x00, 0x1d, 0x00, + 0x00, 0x0a, 0xf8, 0x51, 0x01, 0x00, 0x05, 0x00, + 0x00, 0x0a, 0x24, 0x80, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1d, 0x80, 0x07, 0x00, 0x3c, 0x00, + 0x34, 0x52, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x2a, 0x80, 0x07, 0x00, 0x5c, 0x00, 0x00, 0x00, + 0x24, 0x80, 0x07, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x1d, 0x80, 0x07, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x2a, 0x80, 0x07, 0x00, 0x6a, 0x00, 0x00, 0x00, + 0x24, 0x80, 0x07, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x1d, 0x80, 0x07, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x2a, 0x80, 0x07, 0x00, 0x6a, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x70, 0x52, 0x01, 0x00, 0x00, 0x01, + 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, + 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, + 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, + 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x01, 0x63, + 0x00, 0x00, 0xa1, 0x63, 0x00, 0x00, 0xc5, 0x63, + 0x00, 0x00, 0xb1, 0x62, 0x00, 0x00, 0xc5, 0x63, + 0x00, 0x00, 0x21, 0x63, 0x00, 0x00, 0x4d, 0x63, + 0x00, 0x00, 0x3c, 0x00, 0xac, 0x52, 0x01, 0x00, + 0xa1, 0x63, 0x00, 0x00, 0x01, 0x63, 0x00, 0x00, + 0xa1, 0x63, 0x00, 0x00, 0x06, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x03, 0x05, 0x06, 0x07, 0x08, 0x09, + 0x0a, 0x0a, 0x0c, 0x0d, 0x0e, 0x0f, 0x0f, 0x10, + 0x11, 0x00, 0x00, 0x00, 0xa5, 0xc6, 0x84, 0xf8, + 0x99, 0xee, 0x8d, 0xf6, 0x0d, 0xff, 0xbd, 0xd6, + 0xb1, 0xde, 0x54, 0x91, 0x3c, 0x00, 0xe8, 0x52, + 0x01, 0x00, 0x50, 0x60, 0x03, 0x02, 0xa9, 0xce, + 0x7d, 0x56, 0x19, 0xe7, 0x62, 0xb5, 0xe6, 0x4d, + 0x9a, 0xec, 0x45, 0x8f, 0x9d, 0x1f, 0x40, 0x89, + 0x87, 0xfa, 0x15, 0xef, 0xeb, 0xb2, 0xc9, 0x8e, + 0x0b, 0xfb, 0xec, 0x41, 0x67, 0xb3, 0xfd, 0x5f, + 0xea, 0x45, 0xbf, 0x23, 0xf7, 0x53, 0x96, 0xe4, + 0x5b, 0x9b, 0xc2, 0x75, 0x1c, 0xe1, 0xae, 0x3d, + 0x6a, 0x4c, 0x5a, 0x6c, 0x41, 0x7e, 0x3c, 0x00, + 0x24, 0x53, 0x01, 0x00, 0x02, 0xf5, 0x4f, 0x83, + 0x5c, 0x68, 0xf4, 0x51, 0x34, 0xd1, 0x08, 0xf9, + 0x93, 0xe2, 0x73, 0xab, 0x53, 0x62, 0x3f, 0x2a, + 0x0c, 0x08, 0x52, 0x95, 0x65, 0x46, 0x5e, 0x9d, + 0x28, 0x30, 0xa1, 0x37, 0x0f, 0x0a, 0xb5, 0x2f, + 0x09, 0x0e, 0x36, 0x24, 0x9b, 0x1b, 0x3d, 0xdf, + 0x26, 0xcd, 0x69, 0x4e, 0xcd, 0x7f, 0x9f, 0xea, + 0x1b, 0x12, 0x9e, 0x1d, 0x74, 0x58, 0x2e, 0x34, + 0x3c, 0x00, 0x60, 0x53, 0x01, 0x00, 0x2d, 0x36, + 0xb2, 0xdc, 0xee, 0xb4, 0xfb, 0x5b, 0xf6, 0xa4, + 0x4d, 0x76, 0x61, 0xb7, 0xce, 0x7d, 0x7b, 0x52, + 0x3e, 0xdd, 0x71, 0x5e, 0x97, 0x13, 0xf5, 0xa6, + 0x68, 0xb9, 0x00, 0x00, 0x2c, 0xc1, 0x60, 0x40, + 0x1f, 0xe3, 0xc8, 0x79, 0xed, 0xb6, 0xbe, 0xd4, + 0x46, 0x8d, 0xd9, 0x67, 0x4b, 0x72, 0xde, 0x94, + 0xd4, 0x98, 0xe8, 0xb0, 0x4a, 0x85, 0x6b, 0xbb, + 0x2a, 0xc5, 0x3c, 0x00, 0x9c, 0x53, 0x01, 0x00, + 0xe5, 0x4f, 0x16, 0xed, 0xc5, 0x86, 0xd7, 0x9a, + 0x55, 0x66, 0x94, 0x11, 0xcf, 0x8a, 0x10, 0xe9, + 0x06, 0x04, 0x81, 0xfe, 0xf0, 0xa0, 0x44, 0x78, + 0xba, 0x25, 0xe3, 0x4b, 0xf3, 0xa2, 0xfe, 0x5d, + 0xc0, 0x80, 0x8a, 0x05, 0xad, 0x3f, 0xbc, 0x21, + 0x48, 0x70, 0x04, 0xf1, 0xdf, 0x63, 0xc1, 0x77, + 0x75, 0xaf, 0x63, 0x42, 0x30, 0x20, 0x1a, 0xe5, + 0x0e, 0xfd, 0x6d, 0xbf, 0x3c, 0x00, 0xd8, 0x53, + 0x01, 0x00, 0x4c, 0x81, 0x14, 0x18, 0x35, 0x26, + 0x2f, 0xc3, 0xe1, 0xbe, 0xa2, 0x35, 0xcc, 0x88, + 0x39, 0x2e, 0x57, 0x93, 0xf2, 0x55, 0x82, 0xfc, + 0x47, 0x7a, 0xac, 0xc8, 0xe7, 0xba, 0x2b, 0x32, + 0x95, 0xe6, 0xa0, 0xc0, 0x98, 0x19, 0xd1, 0x9e, + 0x7f, 0xa3, 0x66, 0x44, 0x7e, 0x54, 0xab, 0x3b, + 0x83, 0x0b, 0xca, 0x8c, 0x29, 0xc7, 0xd3, 0x6b, + 0x3c, 0x28, 0x79, 0xa7, 0xe2, 0xbc, 0x3c, 0x00, + 0x14, 0x54, 0x01, 0x00, 0x1d, 0x16, 0x76, 0xad, + 0x3b, 0xdb, 0x56, 0x64, 0x4e, 0x74, 0x1e, 0x14, + 0xdb, 0x92, 0x0a, 0x0c, 0x6c, 0x48, 0xe4, 0xb8, + 0x5d, 0x9f, 0x6e, 0xbd, 0xef, 0x43, 0xa6, 0xc4, + 0xa8, 0x39, 0xa4, 0x31, 0x37, 0xd3, 0x8b, 0xf2, + 0x32, 0xd5, 0x43, 0x8b, 0x59, 0x6e, 0xb7, 0xda, + 0x8c, 0x01, 0x64, 0xb1, 0xd2, 0x9c, 0xe0, 0x49, + 0xb4, 0xd8, 0xfa, 0xac, 0x07, 0xf3, 0x25, 0xcf, + 0x3c, 0x00, 0x50, 0x54, 0x01, 0x00, 0xaf, 0xca, + 0x8e, 0xf4, 0xe9, 0x47, 0x18, 0x10, 0xd5, 0x6f, + 0x88, 0xf0, 0x6f, 0x4a, 0x72, 0x5c, 0x24, 0x38, + 0xf1, 0x57, 0xc7, 0x73, 0x51, 0x97, 0x23, 0xcb, + 0x7c, 0xa1, 0x9c, 0xe8, 0x21, 0x3e, 0xdd, 0x96, + 0xdc, 0x61, 0x86, 0x0d, 0x85, 0x0f, 0x90, 0xe0, + 0x42, 0x7c, 0xc4, 0x71, 0xaa, 0xcc, 0xd8, 0x90, + 0x05, 0x06, 0x01, 0xf7, 0x12, 0x1c, 0xa3, 0xc2, + 0x5f, 0x6a, 0x3c, 0x00, 0x8c, 0x54, 0x01, 0x00, + 0xf9, 0xae, 0xd0, 0x69, 0x91, 0x17, 0x58, 0x99, + 0x27, 0x3a, 0xb9, 0x27, 0x38, 0xd9, 0x13, 0xeb, + 0xb3, 0x2b, 0x33, 0x22, 0xbb, 0xd2, 0x70, 0xa9, + 0x89, 0x07, 0xa7, 0x33, 0xb6, 0x2d, 0x22, 0x3c, + 0x92, 0x15, 0x20, 0xc9, 0x49, 0x87, 0xff, 0xaa, + 0x78, 0x50, 0x7a, 0xa5, 0x8f, 0x03, 0xf8, 0x59, + 0x80, 0x09, 0x17, 0x1a, 0xda, 0x65, 0x31, 0xd7, + 0xc6, 0x84, 0xb8, 0xd0, 0x3c, 0x00, 0xc8, 0x54, + 0x01, 0x00, 0xc3, 0x82, 0xb0, 0x29, 0x77, 0x5a, + 0x11, 0x1e, 0xcb, 0x7b, 0xfc, 0xa8, 0xd6, 0x6d, + 0x3a, 0x2c, 0xc6, 0xa5, 0xf8, 0x84, 0xee, 0x99, + 0xf6, 0x8d, 0xff, 0x0d, 0xd6, 0xbd, 0xde, 0xb1, + 0x91, 0x54, 0x60, 0x50, 0x02, 0x03, 0xce, 0xa9, + 0x56, 0x7d, 0xe7, 0x19, 0xb5, 0x62, 0x4d, 0xe6, + 0xec, 0x9a, 0x8f, 0x45, 0x1f, 0x9d, 0x89, 0x40, + 0xfa, 0x87, 0xef, 0x15, 0xb2, 0xeb, 0x3c, 0x00, + 0x04, 0x55, 0x01, 0x00, 0x8e, 0xc9, 0xfb, 0x0b, + 0x41, 0xec, 0xb3, 0x67, 0x5f, 0xfd, 0x45, 0xea, + 0x23, 0xbf, 0x53, 0xf7, 0xe4, 0x96, 0x9b, 0x5b, + 0x75, 0xc2, 0xe1, 0x1c, 0x3d, 0xae, 0x4c, 0x6a, + 0x6c, 0x5a, 0x7e, 0x41, 0xf5, 0x02, 0x83, 0x4f, + 0x68, 0x5c, 0x51, 0xf4, 0xd1, 0x34, 0xf9, 0x08, + 0xe2, 0x93, 0xab, 0x73, 0x62, 0x53, 0x2a, 0x3f, + 0x08, 0x0c, 0x95, 0x52, 0x46, 0x65, 0x9d, 0x5e, + 0x3c, 0x00, 0x40, 0x55, 0x01, 0x00, 0x30, 0x28, + 0x37, 0xa1, 0x0a, 0x0f, 0x2f, 0xb5, 0x0e, 0x09, + 0x24, 0x36, 0x1b, 0x9b, 0xdf, 0x3d, 0xcd, 0x26, + 0x4e, 0x69, 0x7f, 0xcd, 0xea, 0x9f, 0x12, 0x1b, + 0x1d, 0x9e, 0x58, 0x74, 0x34, 0x2e, 0x36, 0x2d, + 0xdc, 0xb2, 0xb4, 0xee, 0x5b, 0xfb, 0xa4, 0xf6, + 0x76, 0x4d, 0xb7, 0x61, 0x7d, 0xce, 0x52, 0x7b, + 0xdd, 0x3e, 0x5e, 0x71, 0x13, 0x97, 0xa6, 0xf5, + 0xb9, 0x68, 0x3c, 0x00, 0x7c, 0x55, 0x01, 0x00, + 0x00, 0x00, 0xc1, 0x2c, 0x40, 0x60, 0xe3, 0x1f, + 0x79, 0xc8, 0xb6, 0xed, 0xd4, 0xbe, 0x8d, 0x46, + 0x67, 0xd9, 0x72, 0x4b, 0x94, 0xde, 0x98, 0xd4, + 0xb0, 0xe8, 0x85, 0x4a, 0xbb, 0x6b, 0xc5, 0x2a, + 0x4f, 0xe5, 0xed, 0x16, 0x86, 0xc5, 0x9a, 0xd7, + 0x66, 0x55, 0x11, 0x94, 0x8a, 0xcf, 0xe9, 0x10, + 0x04, 0x06, 0xfe, 0x81, 0xa0, 0xf0, 0x78, 0x44, + 0x25, 0xba, 0x4b, 0xe3, 0x3c, 0x00, 0xb8, 0x55, + 0x01, 0x00, 0xa2, 0xf3, 0x5d, 0xfe, 0x80, 0xc0, + 0x05, 0x8a, 0x3f, 0xad, 0x21, 0xbc, 0x70, 0x48, + 0xf1, 0x04, 0x63, 0xdf, 0x77, 0xc1, 0xaf, 0x75, + 0x42, 0x63, 0x20, 0x30, 0xe5, 0x1a, 0xfd, 0x0e, + 0xbf, 0x6d, 0x81, 0x4c, 0x18, 0x14, 0x26, 0x35, + 0xc3, 0x2f, 0xbe, 0xe1, 0x35, 0xa2, 0x88, 0xcc, + 0x2e, 0x39, 0x93, 0x57, 0x55, 0xf2, 0xfc, 0x82, + 0x7a, 0x47, 0xc8, 0xac, 0xba, 0xe7, 0x3c, 0x00, + 0xf4, 0x55, 0x01, 0x00, 0x32, 0x2b, 0xe6, 0x95, + 0xc0, 0xa0, 0x19, 0x98, 0x9e, 0xd1, 0xa3, 0x7f, + 0x44, 0x66, 0x54, 0x7e, 0x3b, 0xab, 0x0b, 0x83, + 0x8c, 0xca, 0xc7, 0x29, 0x6b, 0xd3, 0x28, 0x3c, + 0xa7, 0x79, 0xbc, 0xe2, 0x16, 0x1d, 0xad, 0x76, + 0xdb, 0x3b, 0x64, 0x56, 0x74, 0x4e, 0x14, 0x1e, + 0x92, 0xdb, 0x0c, 0x0a, 0x48, 0x6c, 0xb8, 0xe4, + 0x9f, 0x5d, 0xbd, 0x6e, 0x43, 0xef, 0xc4, 0xa6, + 0x3c, 0x00, 0x30, 0x56, 0x01, 0x00, 0x39, 0xa8, + 0x31, 0xa4, 0xd3, 0x37, 0xf2, 0x8b, 0xd5, 0x32, + 0x8b, 0x43, 0x6e, 0x59, 0xda, 0xb7, 0x01, 0x8c, + 0xb1, 0x64, 0x9c, 0xd2, 0x49, 0xe0, 0xd8, 0xb4, + 0xac, 0xfa, 0xf3, 0x07, 0xcf, 0x25, 0xca, 0xaf, + 0xf4, 0x8e, 0x47, 0xe9, 0x10, 0x18, 0x6f, 0xd5, + 0xf0, 0x88, 0x4a, 0x6f, 0x5c, 0x72, 0x38, 0x24, + 0x57, 0xf1, 0x73, 0xc7, 0x97, 0x51, 0xcb, 0x23, + 0xa1, 0x7c, 0x3c, 0x00, 0x6c, 0x56, 0x01, 0x00, + 0xe8, 0x9c, 0x3e, 0x21, 0x96, 0xdd, 0x61, 0xdc, + 0x0d, 0x86, 0x0f, 0x85, 0xe0, 0x90, 0x7c, 0x42, + 0x71, 0xc4, 0xcc, 0xaa, 0x90, 0xd8, 0x06, 0x05, + 0xf7, 0x01, 0x1c, 0x12, 0xc2, 0xa3, 0x6a, 0x5f, + 0xae, 0xf9, 0x69, 0xd0, 0x17, 0x91, 0x99, 0x58, + 0x3a, 0x27, 0x27, 0xb9, 0xd9, 0x38, 0xeb, 0x13, + 0x2b, 0xb3, 0x22, 0x33, 0xd2, 0xbb, 0xa9, 0x70, + 0x07, 0x89, 0x33, 0xa7, 0x3c, 0x00, 0xa8, 0x56, + 0x01, 0x00, 0x2d, 0xb6, 0x3c, 0x22, 0x15, 0x92, + 0xc9, 0x20, 0x87, 0x49, 0xaa, 0xff, 0x50, 0x78, + 0xa5, 0x7a, 0x03, 0x8f, 0x59, 0xf8, 0x09, 0x80, + 0x1a, 0x17, 0x65, 0xda, 0xd7, 0x31, 0x84, 0xc6, + 0xd0, 0xb8, 0x82, 0xc3, 0x29, 0xb0, 0x5a, 0x77, + 0x1e, 0x11, 0x7b, 0xcb, 0xa8, 0xfc, 0x6d, 0xd6, + 0x2c, 0x3a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xe4, 0x56, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x72, 0x65, 0x71, 0x45, 0x72, 0x72, 0x52, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x20, 0x57, 0x01, 0x00, 0xc4, 0x8e, + 0x01, 0x00, 0x24, 0x9a, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x24, 0x9a, + 0x01, 0x00, 0xa4, 0xb2, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0xa4, 0xb2, + 0x01, 0x00, 0x14, 0xc8, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x10, 0x20, + 0x30, 0x40, 0x50, 0xbb, 0x30, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x5c, 0x57, 0x01, 0x00, + 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e, 0x20, 0x22, + 0x24, 0x26, 0x28, 0x2a, 0x2b, 0x2c, 0x01, 0x00, + 0x70, 0x17, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0d, 0x25, 0x00, 0x00, 0x41, 0x3f, 0x01, 0x00, + 0x65, 0x29, 0x01, 0x00, 0x0d, 0x25, 0x00, 0x00, + 0xf5, 0x5e, 0x00, 0x00, 0x41, 0x3f, 0x01, 0x00, + 0x41, 0x3f, 0x01, 0x00, 0x02, 0x04, 0x0b, 0x0c, + 0x12, 0x16, 0x18, 0x24, 0x3c, 0x00, 0x98, 0x57, + 0x01, 0x00, 0x30, 0x48, 0x60, 0x6c, 0x01, 0x00, + 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x10, 0x12, 0x11, 0x00, + 0x00, 0x01, 0x18, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xd4, 0x57, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0x93, 0x04, 0x00, + 0x40, 0x42, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0xdf, 0x40, 0xcf, 0xfd, 0x00, 0x40, 0x83, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, + 0x3c, 0x00, 0x10, 0x58, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x80, 0x81, 0x00, 0x00, + 0x80, 0x00, 0xbf, 0xff, 0x7f, 0x7e, 0x01, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x78, 0x6f, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x6f, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x6f, + 0x01, 0x00, 0x3c, 0x00, 0x4c, 0x58, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x70, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x78, 0x70, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb8, 0x70, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf8, 0x70, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x71, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x78, 0x71, 0x01, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x90, 0x71, 0x01, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x3c, 0x00, 0x88, 0x58, + 0x01, 0x00, 0xa8, 0x71, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x05, 0x0a, 0x01, 0x06, 0x0b, + 0x02, 0x07, 0x0c, 0x03, 0x08, 0x0d, 0x04, 0x09, + 0x00, 0x00, 0x03, 0x03, 0x01, 0x01, 0x00, 0x04, + 0x00, 0x04, 0x04, 0x06, 0x16, 0x1e, 0x1f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, + 0xc4, 0x58, 0x01, 0x00, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, + 0x61, 0x8b, 0x4a, 0x00, 0x61, 0x8f, 0x4a, 0x00, + 0x61, 0x8b, 0x4a, 0x00, 0x05, 0xe3, 0xc0, 0x00, + 0x05, 0xcb, 0xc0, 0x00, 0x05, 0xbb, 0xc0, 0x00, + 0x85, 0xba, 0xc0, 0x00, 0x85, 0xa2, 0xc0, 0x00, + 0x85, 0x92, 0xc0, 0x00, 0x85, 0x8a, 0xc0, 0x00, + 0x85, 0x7a, 0xc0, 0x00, 0x45, 0x89, 0xc0, 0x00, + 0x3c, 0x00, 0x00, 0x59, 0x01, 0x00, 0x45, 0x71, + 0xc0, 0x00, 0x45, 0x69, 0xc0, 0x00, 0x45, 0x61, + 0xc0, 0x00, 0x45, 0x59, 0xc0, 0x00, 0x45, 0x51, + 0xc0, 0x00, 0x45, 0x49, 0xc0, 0x00, 0x45, 0x41, + 0xc0, 0x00, 0x45, 0x39, 0xc0, 0x00, 0x45, 0x31, + 0xc0, 0x00, 0x45, 0x29, 0xc0, 0x00, 0x45, 0x21, + 0xc0, 0x00, 0x60, 0x2d, 0x06, 0x00, 0x60, 0x2d, + 0x06, 0x00, 0x60, 0x2d, 0x06, 0x00, 0x60, 0x2d, + 0x06, 0x00, 0x3c, 0x00, 0x3c, 0x59, 0x01, 0x00, + 0x60, 0x2d, 0x06, 0x00, 0x60, 0x28, 0x06, 0x00, + 0x50, 0x26, 0x06, 0x00, 0x50, 0x21, 0x06, 0x00, + 0x50, 0x1f, 0x06, 0x00, 0x50, 0x1c, 0x06, 0x00, + 0x50, 0x1a, 0x06, 0x00, 0x50, 0x18, 0x06, 0x00, + 0x50, 0x16, 0x06, 0x00, 0x50, 0x14, 0x06, 0x00, + 0x50, 0x12, 0x06, 0x00, 0x50, 0x10, 0x06, 0x00, + 0x50, 0x0e, 0x06, 0x00, 0x50, 0x0c, 0x06, 0x00, + 0x50, 0x0a, 0x06, 0x00, 0x3c, 0x00, 0x78, 0x59, + 0x01, 0x00, 0x2b, 0x0b, 0x06, 0x00, 0x1d, 0x75, + 0xc0, 0x00, 0x1d, 0x75, 0xc0, 0x00, 0x1d, 0x75, + 0xc0, 0x00, 0x1d, 0x75, 0xc0, 0x00, 0x1d, 0x75, + 0xc0, 0x00, 0x1d, 0x75, 0xc0, 0x00, 0x1d, 0x6d, + 0xc0, 0x00, 0xdd, 0x5b, 0xc0, 0x00, 0xdd, 0x4b, + 0xc0, 0x00, 0xdd, 0x43, 0xc0, 0x00, 0xdd, 0x3b, + 0xc0, 0x00, 0xdd, 0x33, 0xc0, 0x00, 0xdd, 0x2b, + 0xc0, 0x00, 0xdd, 0x23, 0xc0, 0x00, 0x3c, 0x00, + 0xb4, 0x59, 0x01, 0x00, 0xdd, 0x1b, 0xc0, 0x00, + 0xdd, 0x13, 0xc0, 0x00, 0xdd, 0x13, 0xc0, 0x00, + 0xdd, 0x13, 0xc0, 0x00, 0xdd, 0x13, 0xc0, 0x00, + 0xdd, 0x13, 0xc0, 0x00, 0x05, 0x05, 0x05, 0x04, + 0x04, 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x05, 0x05, 0x05, 0x04, 0x04, 0x03, + 0x03, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x88, 0x13, 0x00, 0x00, + 0x3c, 0x00, 0xf0, 0x59, 0x01, 0x00, 0x07, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x5b, 0x00, 0x40, 0x02, + 0xe0, 0xfd, 0xf2, 0x00, 0xb8, 0xfc, 0xa4, 0x01, + 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, + 0x00, 0x00, 0x03, 0x0b, 0x9f, 0x5f, 0x07, 0x01, + 0x2a, 0x04, 0x21, 0x04, 0x17, 0x04, 0x0e, 0x04, + 0x04, 0x04, 0xfb, 0x03, 0xf1, 0x03, 0xe8, 0x03, + 0xc9, 0x03, 0xaa, 0x03, 0x8a, 0x03, 0x6b, 0x03, + 0x4c, 0x03, 0x3c, 0x00, 0x2c, 0x5a, 0x01, 0x00, + 0x2d, 0x03, 0x0e, 0x03, 0xee, 0x02, 0xec, 0x02, + 0x01, 0x03, 0x16, 0x03, 0x2b, 0x03, 0x40, 0x03, + 0x55, 0x03, 0x6a, 0x03, 0x7f, 0x03, 0x94, 0x03, + 0xa9, 0x03, 0xbe, 0x03, 0xd3, 0x03, 0xe8, 0x03, + 0xbe, 0x03, 0x94, 0x03, 0x6a, 0x03, 0x00, 0x02, + 0x04, 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x00, 0x03, 0x3c, 0x00, 0x68, 0x5a, + 0x01, 0x00, 0x05, 0x08, 0x0b, 0x0e, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xa4, 0x5a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xe0, 0x5a, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x1c, 0x5b, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0x5b, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x94, 0x5b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xd0, 0x5b, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x0c, 0x5c, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0x5c, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x84, 0x5c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xc0, 0x5c, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xfc, 0x5c, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0x5d, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x74, 0x5d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xb0, 0x5d, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xec, 0x5d, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0x5e, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x64, 0x5e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xa0, 0x5e, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xdc, 0x5e, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0x5f, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x54, 0x5f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x90, 0x5f, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xcc, 0x5f, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0x60, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x44, 0x60, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x80, 0x60, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xbc, 0x60, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0x60, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x34, 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x70, 0x61, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xac, 0x61, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0x61, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x24, 0x62, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x60, 0x62, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x9c, 0x62, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0x62, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x14, 0x63, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x50, 0x63, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x8c, 0x63, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0x63, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x04, 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x40, 0x64, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x7c, 0x64, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0x64, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xf4, 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x30, 0x65, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x6c, 0x65, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0x65, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xe4, 0x65, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x20, 0x66, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x5c, 0x66, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0x66, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xd4, 0x66, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x10, 0x67, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x4c, 0x67, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0x67, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xc4, 0x67, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x68, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x3c, 0x68, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0x68, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xb4, 0x68, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xf0, 0x68, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x2c, 0x69, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0x69, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xa4, 0x69, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xe0, 0x69, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x1c, 0x6a, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0x6a, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x94, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xd0, 0x6a, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x0c, 0x6b, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0x6b, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x84, 0x6b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xc0, 0x6b, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xfc, 0x6b, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0x6c, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x74, 0x6c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xb0, 0x6c, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xec, 0x6c, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0x6d, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x64, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xa0, 0x6d, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xdc, 0x6d, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0x6e, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x54, 0x6e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x90, 0x6e, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xcc, 0x6e, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0x6f, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x44, 0x6f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x80, 0x6f, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xbc, 0x6f, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0x6f, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x34, 0x70, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x70, 0x70, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xac, 0x70, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0x70, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x24, 0x71, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x60, 0x71, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x9c, 0x71, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0x71, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x14, 0x72, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x50, 0x72, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x8c, 0x72, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0x72, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x04, 0x73, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x40, 0x73, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x7c, 0x73, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0x73, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xf4, 0x73, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x30, 0x74, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x6c, 0x74, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0x74, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xe4, 0x74, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x20, 0x75, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x5c, 0x75, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0x75, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xd4, 0x75, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x10, 0x76, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x4c, 0x76, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0x76, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xc4, 0x76, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x77, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x3c, 0x77, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0x77, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xb4, 0x77, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xf0, 0x77, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x2c, 0x78, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0x78, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xa4, 0x78, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xe0, 0x78, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x1c, 0x79, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0x79, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x94, 0x79, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xd0, 0x79, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x0c, 0x7a, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0x7a, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x84, 0x7a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xc0, 0x7a, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xfc, 0x7a, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0x7b, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x74, 0x7b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xb0, 0x7b, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xec, 0x7b, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0x7c, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x64, 0x7c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xa0, 0x7c, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xdc, 0x7c, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0x7d, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x54, 0x7d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x90, 0x7d, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xcc, 0x7d, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0x7e, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x44, 0x7e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x80, 0x7e, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xbc, 0x7e, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0x7e, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x34, 0x7f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x70, 0x7f, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xac, 0x7f, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0x7f, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x70, 0xb5, 0x01, 0x25, 0x07, 0x4e, + 0xad, 0x03, 0x75, 0x61, 0x0a, 0x20, 0xfa, 0xf7, + 0x6c, 0xff, 0x30, 0x68, 0x80, 0x03, 0xc4, 0x0f, + 0xb5, 0x61, 0x0a, 0x20, 0xfa, 0xf7, 0x65, 0xff, + 0x20, 0x1c, 0x70, 0xbd, 0x00, 0x00, 0x3c, 0x00, + 0x24, 0x80, 0x01, 0x00, 0x10, 0x00, 0x07, 0x00, + 0x70, 0xb5, 0x01, 0x25, 0x6d, 0x04, 0x00, 0x28, + 0x10, 0x4c, 0x01, 0xd0, 0x65, 0x61, 0x00, 0xe0, + 0xa5, 0x61, 0x60, 0x68, 0x28, 0x43, 0x60, 0x60, + 0xa0, 0x68, 0x28, 0x43, 0xa0, 0x60, 0x0a, 0x20, + 0xfa, 0xf7, 0x4e, 0xff, 0x01, 0x26, 0xb6, 0x03, + 0x66, 0x61, 0x0a, 0x20, 0xfa, 0xf7, 0x48, 0xff, + 0xa6, 0x61, 0x01, 0x20, 0xfa, 0xf7, 0x44, 0xff, + 0x3c, 0x00, 0x60, 0x80, 0x01, 0x00, 0xa0, 0x68, + 0xa8, 0x43, 0xa0, 0x60, 0x60, 0x68, 0x28, 0x43, + 0x60, 0x60, 0x0a, 0x20, 0xfa, 0xf7, 0x3b, 0xff, + 0x70, 0xbd, 0x10, 0x00, 0x07, 0x00, 0x70, 0xb5, + 0x01, 0x25, 0x10, 0x4c, 0x6d, 0x04, 0x65, 0x61, + 0x60, 0x68, 0x28, 0x43, 0x60, 0x60, 0xa0, 0x68, + 0x28, 0x43, 0xa0, 0x60, 0xee, 0x08, 0xa6, 0x61, + 0x0a, 0x20, 0xfa, 0xf7, 0x28, 0xff, 0x66, 0x61, + 0x0a, 0x20, 0x3c, 0x00, 0x9c, 0x80, 0x01, 0x00, + 0xfa, 0xf7, 0x24, 0xff, 0xa5, 0x61, 0x0a, 0x20, + 0xfa, 0xf7, 0x20, 0xff, 0xa6, 0x61, 0x0a, 0x20, + 0xfa, 0xf7, 0x1c, 0xff, 0xa0, 0x68, 0xa8, 0x43, + 0xa0, 0x60, 0x60, 0x68, 0x28, 0x43, 0x60, 0x60, + 0x70, 0xbd, 0x00, 0x00, 0x10, 0x00, 0x07, 0x00, + 0x70, 0xb5, 0x01, 0x25, 0x0e, 0x4c, 0x6d, 0x04, + 0xa5, 0x61, 0x60, 0x68, 0x28, 0x43, 0x60, 0x60, + 0xa0, 0x68, 0x28, 0x43, 0x3c, 0x00, 0xd8, 0x80, + 0x01, 0x00, 0xa0, 0x60, 0xee, 0x08, 0x66, 0x61, + 0x0a, 0x20, 0xfa, 0xf7, 0x02, 0xff, 0x65, 0x61, + 0x0a, 0x20, 0xfa, 0xf7, 0xfe, 0xfe, 0xa6, 0x61, + 0x0a, 0x20, 0xfa, 0xf7, 0xfa, 0xfe, 0xa0, 0x68, + 0xa8, 0x43, 0xa0, 0x60, 0x60, 0x68, 0x28, 0x43, + 0x60, 0x60, 0x70, 0xbd, 0x00, 0x00, 0x10, 0x00, + 0x07, 0x00, 0x70, 0xb5, 0x05, 0x1c, 0x00, 0x24, + 0x80, 0x26, 0x28, 0x1c, 0x30, 0x40, 0x3c, 0x00, + 0x14, 0x81, 0x01, 0x00, 0xff, 0xf7, 0x88, 0xff, + 0x68, 0x06, 0x05, 0x0e, 0x01, 0x34, 0x08, 0x2c, + 0xf6, 0xdb, 0xff, 0xf7, 0x6d, 0xff, 0x70, 0xbd, + 0x80, 0xb5, 0x02, 0x1c, 0x0b, 0x21, 0x80, 0x20, + 0xfb, 0xf7, 0x3e, 0xfb, 0x80, 0xbd, 0x00, 0x00, + 0xf8, 0xb5, 0x12, 0x48, 0x00, 0x25, 0x07, 0x1c, + 0xff, 0x37, 0x06, 0x1d, 0x01, 0x37, 0x28, 0x1c, + 0xf9, 0xf7, 0xea, 0xfd, 0x04, 0x1c, 0x17, 0xd0, + 0x3c, 0x00, 0x50, 0x81, 0x01, 0x00, 0x20, 0x69, + 0x00, 0x28, 0x04, 0xd0, 0xe0, 0x6a, 0x00, 0x28, + 0x03, 0xd0, 0x00, 0x20, 0xe0, 0x62, 0x25, 0x1c, + 0xf0, 0xe7, 0x7b, 0x68, 0x00, 0x2b, 0x05, 0xd0, + 0x32, 0x1c, 0x21, 0x1c, 0x44, 0x31, 0x01, 0x20, + 0xe8, 0xf7, 0x34, 0xf9, 0x20, 0x1c, 0x44, 0x30, + 0xf9, 0xf7, 0x37, 0xfe, 0xe2, 0xe7, 0xf8, 0xbd, + 0x00, 0x00, 0x20, 0xf7, 0x01, 0x00, 0x11, 0x48, + 0x70, 0xb5, 0x3c, 0x00, 0x8c, 0x81, 0x01, 0x00, + 0x00, 0x68, 0xff, 0x28, 0x1d, 0xd1, 0xff, 0x20, + 0x32, 0x30, 0xfa, 0xf7, 0xa7, 0xfe, 0x0e, 0x4d, + 0x6c, 0x68, 0x0e, 0x48, 0xfa, 0xf7, 0xa2, 0xfe, + 0x68, 0x68, 0x24, 0x1a, 0x01, 0x20, 0x00, 0xf0, + 0x95, 0xfd, 0x6e, 0x68, 0x09, 0x48, 0xfa, 0xf7, + 0x99, 0xfe, 0x68, 0x68, 0x21, 0x1c, 0x0a, 0x39, + 0x30, 0x1a, 0x88, 0x42, 0x02, 0xd3, 0x0a, 0x34, + 0xa0, 0x42, 0x02, 0xd9, 0x3c, 0x00, 0xc8, 0x81, + 0x01, 0x00, 0x00, 0x20, 0x00, 0xf0, 0x85, 0xfd, + 0x70, 0xbd, 0xf4, 0x74, 0x01, 0x00, 0x00, 0x03, + 0x07, 0x00, 0x93, 0x03, 0x00, 0x00, 0x70, 0xb5, + 0x00, 0xf0, 0x4d, 0xf8, 0x01, 0x20, 0xed, 0xf7, + 0x34, 0xf9, 0x11, 0x4d, 0x18, 0x21, 0x68, 0x60, + 0x00, 0x20, 0xe9, 0xf7, 0xf2, 0xf9, 0x28, 0x60, + 0x04, 0x68, 0x80, 0x20, 0x20, 0x80, 0x00, 0x26, + 0x06, 0x22, 0xff, 0x21, 0x20, 0x1d, 0x3c, 0x00, + 0x04, 0x82, 0x01, 0x00, 0x66, 0x80, 0xe8, 0xf7, + 0x0b, 0xfa, 0x20, 0x1c, 0x0a, 0x30, 0x09, 0x49, + 0xf2, 0xf7, 0x2e, 0xfd, 0x20, 0x1c, 0x10, 0x30, + 0x07, 0x49, 0xf2, 0xf7, 0x29, 0xfd, 0xe6, 0x82, + 0x03, 0xcd, 0xe9, 0xf7, 0xf9, 0xf8, 0x02, 0x49, + 0x01, 0x20, 0x14, 0x39, 0x88, 0x60, 0x70, 0xbd, + 0x90, 0xd9, 0x01, 0x00, 0x12, 0x61, 0x01, 0x00, + 0x24, 0xf7, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x3c, 0x00, 0x40, 0x82, 0x01, 0x00, 0x10, 0xb5, + 0x06, 0x4c, 0x00, 0x22, 0x02, 0x20, 0xe1, 0x68, + 0xf0, 0xf7, 0x11, 0xfb, 0x60, 0x78, 0x02, 0x28, + 0x01, 0xd1, 0x00, 0xf0, 0x1a, 0xf9, 0x10, 0xbd, + 0x00, 0x00, 0x40, 0xd9, 0x01, 0x00, 0x80, 0xb5, + 0xa1, 0x20, 0xff, 0xf7, 0x50, 0xff, 0x80, 0xbd, + 0x00, 0x00, 0x40, 0x00, 0x0e, 0x21, 0x08, 0x40, + 0x80, 0xb5, 0xa0, 0x30, 0xff, 0xf7, 0x47, 0xff, + 0x80, 0xbd, 0x3c, 0x00, 0x7c, 0x82, 0x01, 0x00, + 0x10, 0xb5, 0x05, 0x4c, 0x20, 0x68, 0x00, 0x28, + 0x04, 0xd0, 0xe9, 0xf7, 0x87, 0xf9, 0x00, 0x20, + 0x20, 0x60, 0x60, 0x60, 0x10, 0xbd, 0x00, 0x00, + 0x90, 0xd9, 0x01, 0x00, 0x10, 0xb5, 0x07, 0x4c, + 0x01, 0x21, 0x07, 0x4a, 0x21, 0x61, 0x02, 0x20, + 0x10, 0x70, 0x61, 0x61, 0x00, 0xf0, 0xd6, 0xfc, + 0x00, 0xf0, 0xc8, 0xfb, 0x20, 0x1c, 0xed, 0xf7, + 0x9f, 0xfa, 0x10, 0xbd, 0x3c, 0x00, 0xb8, 0x82, + 0x01, 0x00, 0x20, 0xf7, 0x01, 0x00, 0x7c, 0xd9, + 0x01, 0x00, 0x70, 0xb5, 0x02, 0x1c, 0x08, 0x1c, + 0x02, 0x25, 0x00, 0x2a, 0x13, 0x4e, 0x14, 0xd0, + 0x00, 0xf0, 0x11, 0xfc, 0x30, 0x78, 0x01, 0x21, + 0x08, 0x43, 0x30, 0x70, 0x30, 0x78, 0x28, 0x43, + 0x30, 0x70, 0x00, 0x20, 0x7d, 0x21, 0x49, 0x01, + 0xb2, 0x79, 0x92, 0x07, 0x00, 0xd5, 0x01, 0x34, + 0x01, 0x30, 0x88, 0x42, 0xf8, 0xdb, 0x3c, 0x00, + 0xf4, 0x82, 0x01, 0x00, 0x20, 0x1c, 0x70, 0xbd, + 0x30, 0x78, 0xa8, 0x43, 0x30, 0x70, 0x30, 0x78, + 0x40, 0x08, 0x40, 0x00, 0x30, 0x70, 0x05, 0x49, + 0x48, 0x68, 0x01, 0x22, 0x12, 0x04, 0x90, 0x43, + 0x48, 0x60, 0x01, 0x20, 0x70, 0xbd, 0x00, 0x00, + 0x88, 0x00, 0x07, 0x00, 0x6c, 0x00, 0x07, 0x00, + 0xff, 0xb5, 0x09, 0xae, 0x00, 0x20, 0x60, 0xce, + 0x28, 0x60, 0x00, 0x23, 0x9c, 0x46, 0x30, 0x60, + 0x3c, 0x00, 0x30, 0x83, 0x01, 0x00, 0x69, 0x46, + 0x01, 0xaa, 0x17, 0xe0, 0xdb, 0x07, 0x0e, 0xd5, + 0x12, 0x4b, 0x1c, 0x56, 0x63, 0x1c, 0x0a, 0xd0, + 0x01, 0x27, 0x2b, 0x68, 0xa7, 0x40, 0x3b, 0x43, + 0x2b, 0x60, 0x13, 0x68, 0xdb, 0x07, 0x02, 0xd5, + 0x33, 0x68, 0x3b, 0x43, 0x33, 0x60, 0x0b, 0x68, + 0x5b, 0x08, 0x0b, 0x60, 0x13, 0x68, 0x5b, 0x08, + 0x13, 0x60, 0x01, 0x30, 0x0b, 0x68, 0x00, 0x2b, + 0x01, 0xd0, 0x3c, 0x00, 0x6c, 0x83, 0x01, 0x00, + 0x22, 0x28, 0xe2, 0xd3, 0x63, 0x46, 0x01, 0x33, + 0x20, 0x20, 0x02, 0x2b, 0x9c, 0x46, 0x02, 0xa9, + 0x03, 0xaa, 0xf2, 0xdb, 0xff, 0xbd, 0x00, 0x00, + 0xb4, 0x8d, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, + 0x0d, 0x1c, 0x1e, 0x21, 0x00, 0x22, 0x03, 0x20, + 0x05, 0x4b, 0xf9, 0xf7, 0xb3, 0xf8, 0x21, 0x1c, + 0x03, 0x20, 0xf9, 0xf7, 0xf5, 0xf8, 0x29, 0x1c, + 0x03, 0x20, 0xf9, 0xf7, 0x3c, 0x00, 0xa8, 0x83, + 0x01, 0x00, 0xf1, 0xf8, 0xb0, 0xbd, 0x80, 0x38, + 0x01, 0x00, 0xb0, 0xb5, 0x1c, 0x4c, 0x1c, 0x4d, + 0x21, 0x78, 0x02, 0x29, 0x09, 0xd0, 0x03, 0x29, + 0x19, 0xd0, 0x04, 0x29, 0x1f, 0xd0, 0x05, 0x29, + 0x23, 0xd1, 0x00, 0x20, 0x00, 0xf0, 0x17, 0xfb, + 0x23, 0xe0, 0x68, 0x61, 0x14, 0x48, 0x1c, 0x30, + 0xc1, 0x68, 0x02, 0x69, 0x89, 0x18, 0xc1, 0x60, + 0x00, 0xf0, 0x2f, 0xfb, 0xe0, 0x68, 0x3c, 0x00, + 0xe4, 0x83, 0x01, 0x00, 0x01, 0x38, 0xe0, 0x60, + 0x16, 0xd1, 0x32, 0x20, 0xe0, 0x60, 0xff, 0xf7, + 0xa3, 0xfe, 0x11, 0xe0, 0x00, 0x20, 0x00, 0xf0, + 0x01, 0xfb, 0x00, 0xf0, 0x2d, 0xfc, 0x01, 0x20, + 0x20, 0x70, 0x09, 0xe0, 0x00, 0x20, 0x00, 0xf0, + 0xf9, 0xfa, 0xff, 0xf7, 0x45, 0xff, 0x03, 0xe0, + 0x05, 0x21, 0x0b, 0x20, 0xe8, 0xf7, 0x46, 0xff, + 0x68, 0x69, 0x61, 0x68, 0xe7, 0xf7, 0xdd, 0xff, + 0x3c, 0x00, 0x20, 0x84, 0x01, 0x00, 0xb0, 0xbd, + 0x00, 0x00, 0x7c, 0xd9, 0x01, 0x00, 0x20, 0xf7, + 0x01, 0x00, 0xf7, 0xb5, 0x04, 0x1c, 0x17, 0x1c, + 0xff, 0xf7, 0x21, 0xfe, 0x20, 0x0a, 0xff, 0xf7, + 0x18, 0xff, 0x20, 0x06, 0x00, 0x0e, 0xff, 0xf7, + 0x62, 0xfe, 0xff, 0xf7, 0x18, 0xfe, 0xa1, 0x20, + 0xff, 0xf7, 0x5d, 0xfe, 0x00, 0x25, 0x16, 0xe0, + 0x00, 0x20, 0x00, 0x24, 0x40, 0x06, 0x06, 0x0e, + 0xff, 0xf7, 0x3c, 0x00, 0x5c, 0x84, 0x01, 0x00, + 0xd1, 0xfd, 0x00, 0x06, 0x00, 0x0e, 0x30, 0x43, + 0x01, 0x34, 0x08, 0x2c, 0xf5, 0xdb, 0x29, 0x1c, + 0x01, 0x9a, 0x01, 0x35, 0xbd, 0x42, 0x50, 0x54, + 0x01, 0xda, 0x00, 0x20, 0x00, 0xe0, 0x01, 0x20, + 0xff, 0xf7, 0xd4, 0xfd, 0xbd, 0x42, 0xe6, 0xdb, + 0xff, 0xf7, 0x1e, 0xfe, 0xfe, 0xbd, 0x00, 0x00, + 0x80, 0xb5, 0xff, 0xf7, 0x19, 0xfe, 0x09, 0x21, + 0x89, 0x03, 0x00, 0x22, 0x3c, 0x00, 0x98, 0x84, + 0x01, 0x00, 0x02, 0x20, 0xf0, 0xf7, 0xe9, 0xf9, + 0x80, 0xbd, 0x09, 0x21, 0x89, 0x03, 0x80, 0xb5, + 0x00, 0x22, 0x02, 0x20, 0xf0, 0xf7, 0xc9, 0xf9, + 0x01, 0x21, 0x09, 0x48, 0x89, 0x03, 0x81, 0x61, + 0x42, 0x68, 0x0a, 0x43, 0x42, 0x60, 0x82, 0x68, + 0x11, 0x43, 0x81, 0x60, 0x01, 0x21, 0x49, 0x04, + 0x81, 0x61, 0x82, 0x68, 0x8a, 0x43, 0x82, 0x60, + 0x42, 0x68, 0x11, 0x43, 0x41, 0x60, 0x3c, 0x00, + 0xd4, 0x84, 0x01, 0x00, 0x80, 0xbd, 0x00, 0x00, + 0x10, 0x00, 0x07, 0x00, 0xf0, 0xb5, 0x04, 0x1c, + 0xc0, 0x68, 0x7b, 0x4e, 0x05, 0x68, 0x30, 0x78, + 0x85, 0xb0, 0x01, 0x28, 0x01, 0xd0, 0x02, 0x28, + 0x72, 0xd1, 0x00, 0x21, 0x20, 0x69, 0xf2, 0xf7, + 0x41, 0xf9, 0x76, 0x49, 0xf2, 0xf7, 0x24, 0xfc, + 0x00, 0x28, 0x69, 0xd0, 0x20, 0x1c, 0x20, 0x30, + 0x41, 0x7a, 0x08, 0x29, 0x02, 0xd1, 0x72, 0x4a, + 0x3c, 0x00, 0x10, 0x85, 0x01, 0x00, 0x00, 0x21, + 0x51, 0x61, 0x00, 0x7a, 0x22, 0x6a, 0x18, 0x21, + 0xf2, 0xf7, 0xc9, 0xfb, 0xe1, 0x6a, 0x37, 0x1c, + 0x40, 0x18, 0x6c, 0x49, 0x02, 0x90, 0x30, 0x78, + 0x0e, 0x1c, 0xff, 0x36, 0x0a, 0x1d, 0x01, 0x36, + 0x01, 0x28, 0x04, 0x92, 0x07, 0xd0, 0x65, 0x4a, + 0x02, 0x99, 0x1c, 0x32, 0x28, 0x1c, 0xed, 0xf7, + 0xe2, 0xfb, 0x00, 0x28, 0x6b, 0xd0, 0x32, 0x21, + 0x20, 0x69, 0x3c, 0x00, 0x4c, 0x85, 0x01, 0x00, + 0xf2, 0xf7, 0x16, 0xf9, 0x01, 0x90, 0x20, 0x69, + 0x01, 0x21, 0xf2, 0xf7, 0x11, 0xf9, 0x01, 0x1c, + 0x5e, 0x48, 0x01, 0x23, 0x01, 0x9a, 0xed, 0xf7, + 0x07, 0xfc, 0x00, 0x28, 0x04, 0xd1, 0x5b, 0x48, + 0xed, 0xf7, 0x92, 0xfa, 0x00, 0x21, 0xb9, 0x60, + 0x56, 0x48, 0x1c, 0x30, 0x81, 0x68, 0xea, 0xf7, + 0x19, 0xfc, 0x20, 0x1c, 0x14, 0x30, 0x03, 0x90, + 0x04, 0x99, 0xf2, 0xf7, 0x3c, 0x00, 0x88, 0x85, + 0x01, 0x00, 0xd5, 0xfb, 0x00, 0x28, 0x05, 0xd1, + 0x00, 0x22, 0xba, 0x60, 0x04, 0x98, 0x03, 0x99, + 0xf2, 0xf7, 0x6b, 0xfb, 0x4f, 0x49, 0x28, 0x89, + 0x09, 0x88, 0x88, 0x42, 0x03, 0xd0, 0x00, 0x22, + 0x4c, 0x49, 0xba, 0x60, 0x08, 0x80, 0x03, 0x21, + 0x20, 0x69, 0xf2, 0xf7, 0xe4, 0xf8, 0x00, 0x28, + 0x10, 0xd0, 0x46, 0x49, 0x82, 0x78, 0x20, 0x31, + 0x0b, 0x79, 0x94, 0x46, 0x9a, 0x42, 0x3c, 0x00, + 0xc4, 0x85, 0x01, 0x00, 0x09, 0xd0, 0x00, 0x22, + 0xba, 0x60, 0x62, 0x46, 0x0a, 0x71, 0x80, 0x78, + 0x01, 0x21, 0xf3, 0xf7, 0x05, 0xf9, 0x00, 0xe0, + 0x77, 0xe0, 0x06, 0x21, 0x20, 0x69, 0xf2, 0xf7, + 0xcd, 0xf8, 0x00, 0x28, 0x08, 0xd0, 0x81, 0x78, + 0x3a, 0x48, 0x40, 0x30, 0x82, 0x88, 0x91, 0x42, + 0x02, 0xd0, 0x00, 0x22, 0xba, 0x60, 0x81, 0x80, + 0x2a, 0x21, 0x20, 0x69, 0xf2, 0xf7, 0xbe, 0xf8, + 0x3c, 0x00, 0x00, 0x86, 0x01, 0x00, 0x00, 0x28, + 0x0d, 0xd0, 0x80, 0x78, 0xf1, 0x69, 0x33, 0x4a, + 0x81, 0x42, 0x08, 0xd0, 0x00, 0x21, 0xb9, 0x60, + 0xf0, 0x61, 0x10, 0x1c, 0xed, 0xf7, 0x09, 0xfb, + 0x2f, 0x48, 0xed, 0xf7, 0xfa, 0xfa, 0x38, 0x78, + 0x3b, 0x1c, 0x01, 0x28, 0x17, 0xd1, 0x02, 0x20, + 0x18, 0x70, 0x2a, 0x4f, 0x01, 0x23, 0x3b, 0x61, + 0x27, 0x4b, 0x03, 0xcd, 0x1c, 0x33, 0x08, 0x3d, + 0x02, 0x9a, 0x3c, 0x00, 0x3c, 0x86, 0x01, 0x00, + 0xed, 0xf7, 0xb0, 0xfa, 0x38, 0x1c, 0xed, 0xf7, + 0xd7, 0xf8, 0x32, 0x68, 0x00, 0x2a, 0x03, 0xd0, + 0x00, 0x21, 0x01, 0x20, 0xe7, 0xf7, 0xc4, 0xfe, + 0x00, 0xf0, 0xf4, 0xf9, 0x20, 0x1c, 0xf9, 0xf7, + 0xd5, 0xfb, 0x07, 0x1c, 0x11, 0xd1, 0x20, 0x1c, + 0xf9, 0xf7, 0x88, 0xfb, 0x07, 0x1c, 0x2e, 0xd0, + 0x01, 0x23, 0x3b, 0x61, 0x68, 0x89, 0x40, 0x21, + 0xc8, 0x53, 0x73, 0x68, 0x3c, 0x00, 0x78, 0x86, + 0x01, 0x00, 0x00, 0x2b, 0x04, 0xd0, 0x21, 0x1c, + 0x00, 0x20, 0x04, 0x9a, 0xe7, 0xf7, 0xac, 0xfe, + 0x01, 0x23, 0xfb, 0x62, 0x20, 0x69, 0x32, 0x21, + 0xf2, 0xf7, 0x75, 0xf8, 0x05, 0x1c, 0x20, 0x69, + 0x01, 0x21, 0xf2, 0xf7, 0x70, 0xf8, 0x0e, 0x4e, + 0x01, 0x1c, 0x2a, 0x1c, 0x30, 0x1c, 0xed, 0xf7, + 0xc0, 0xfb, 0x00, 0x28, 0x0e, 0xd1, 0x32, 0x21, + 0x20, 0x69, 0xf2, 0xf7, 0x64, 0xf8, 0x3c, 0x00, + 0xb4, 0x86, 0x01, 0x00, 0x05, 0x1c, 0x20, 0x69, + 0x01, 0x21, 0xf2, 0xf7, 0x5f, 0xf8, 0x01, 0x1c, + 0x3b, 0x1c, 0x2a, 0x1c, 0x30, 0x1c, 0xed, 0xf7, + 0xd7, 0xfa, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, + 0x7c, 0xd9, 0x01, 0x00, 0x40, 0xf8, 0x01, 0x00, + 0x20, 0xf7, 0x01, 0x00, 0x02, 0x1c, 0x08, 0x1c, + 0x80, 0x2a, 0x80, 0xb5, 0x06, 0xd0, 0x81, 0x2a, + 0x03, 0xd0, 0x04, 0x21, 0x0b, 0x20, 0xe8, 0xf7, + 0x3c, 0x00, 0xf0, 0x86, 0x01, 0x00, 0xd9, 0xfd, + 0x80, 0xbd, 0xff, 0xf7, 0x5c, 0xfe, 0x80, 0xbd, + 0x00, 0x00, 0x03, 0x48, 0x81, 0x78, 0xff, 0x29, + 0x01, 0xd0, 0x00, 0x79, 0x70, 0x47, 0x00, 0x20, + 0x70, 0x47, 0x80, 0xf8, 0x01, 0x00, 0x30, 0xb5, + 0x89, 0xb0, 0x00, 0x93, 0x0e, 0x4d, 0x13, 0x1c, + 0x04, 0x1c, 0x2a, 0x1c, 0xec, 0xf7, 0x25, 0xfd, + 0x01, 0xa9, 0x06, 0xa8, 0xa2, 0x68, 0xec, 0xf7, + 0xce, 0xfe, 0x3c, 0x00, 0x2c, 0x87, 0x01, 0x00, + 0x01, 0xaa, 0x06, 0xa9, 0x28, 0x1c, 0x63, 0x6a, + 0xed, 0xf7, 0x44, 0xfa, 0x04, 0x1c, 0x01, 0x28, + 0x04, 0xd1, 0x28, 0x1c, 0xed, 0xf7, 0x2c, 0xf8, + 0x00, 0xf0, 0x4a, 0xf8, 0x20, 0x1c, 0x09, 0xb0, + 0x30, 0xbd, 0x00, 0x00, 0x20, 0xf7, 0x01, 0x00, + 0x80, 0xb5, 0xed, 0xf7, 0x2b, 0xf8, 0x00, 0xf0, + 0x7d, 0xf8, 0x02, 0x48, 0xed, 0xf7, 0x02, 0xfa, + 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x68, 0x87, + 0x01, 0x00, 0x20, 0xf7, 0x01, 0x00, 0x80, 0xb5, + 0x00, 0x28, 0x0b, 0xd1, 0x06, 0x48, 0xed, 0xf7, + 0xf8, 0xf9, 0x00, 0xf0, 0x6e, 0xf8, 0x01, 0x20, + 0xed, 0xf7, 0xeb, 0xfa, 0x03, 0x49, 0x03, 0x20, + 0xf9, 0xf7, 0x35, 0xfe, 0x80, 0xbd, 0x20, 0xf7, + 0x01, 0x00, 0x6d, 0x87, 0x01, 0x00, 0xb0, 0xb5, + 0x10, 0x4d, 0x04, 0x1c, 0x13, 0x1c, 0x2a, 0x1c, + 0x88, 0xb0, 0xec, 0xf7, 0x02, 0xfd, 0x3c, 0x00, + 0xa4, 0x87, 0x01, 0x00, 0x21, 0x1c, 0x0a, 0x31, + 0x06, 0x22, 0x28, 0x1d, 0xe7, 0xf7, 0xa4, 0xfe, + 0x69, 0x46, 0x05, 0xa8, 0x62, 0x69, 0xec, 0xf7, + 0x87, 0xfe, 0x28, 0x1c, 0xec, 0xf7, 0xee, 0xff, + 0x7f, 0x23, 0xdb, 0x43, 0x28, 0x1c, 0x6a, 0x46, + 0x05, 0xa9, 0xed, 0xf7, 0xf9, 0xf9, 0x00, 0xf0, + 0x1d, 0xf8, 0x08, 0xb0, 0xb0, 0xbd, 0x00, 0x00, + 0x20, 0xf7, 0x01, 0x00, 0x0a, 0x48, 0x80, 0xb5, + 0x3c, 0x00, 0xe0, 0x87, 0x01, 0x00, 0x01, 0x78, + 0x00, 0x29, 0x06, 0xd0, 0x02, 0x29, 0x01, 0xd0, + 0x05, 0x29, 0x07, 0xd1, 0x03, 0x21, 0x01, 0x70, + 0x80, 0xbd, 0x01, 0x21, 0x01, 0x70, 0x00, 0xf0, + 0x2e, 0xfa, 0x80, 0xbd, 0x03, 0x21, 0x0b, 0x20, + 0xe8, 0xf7, 0x4f, 0xfd, 0x80, 0xbd, 0x7c, 0xd9, + 0x01, 0x00, 0x09, 0x49, 0x80, 0xb5, 0x08, 0x78, + 0x00, 0x28, 0x06, 0xd0, 0x02, 0x28, 0x01, 0xd0, + 0x05, 0x28, 0x3c, 0x00, 0x1c, 0x88, 0x01, 0x00, + 0x05, 0xd1, 0x04, 0x20, 0x08, 0x70, 0x80, 0xbd, + 0xff, 0xf7, 0x38, 0xfd, 0x80, 0xbd, 0x02, 0x21, + 0x0b, 0x20, 0xe8, 0xf7, 0x39, 0xfd, 0x80, 0xbd, + 0x7c, 0xd9, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, + 0x0b, 0x20, 0x04, 0x4a, 0xfa, 0xf7, 0x82, 0xff, + 0xf6, 0xf7, 0x86, 0xfd, 0x02, 0x49, 0x08, 0x61, + 0x80, 0xbd, 0x00, 0x00, 0xdd, 0x86, 0x01, 0x00, + 0x7c, 0xd9, 0x01, 0x00, 0x3c, 0x00, 0x58, 0x88, + 0x01, 0x00, 0x0c, 0x48, 0x80, 0xb5, 0x01, 0x78, + 0x06, 0x29, 0x0e, 0xd2, 0x02, 0xa3, 0x5b, 0x5c, + 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x00, 0x06, 0x03, + 0x07, 0x07, 0x07, 0x06, 0x00, 0x20, 0x00, 0xf0, + 0xc2, 0xf8, 0x80, 0xbd, 0x05, 0x21, 0x01, 0x70, + 0x80, 0xbd, 0x04, 0x21, 0x0b, 0x20, 0xe8, 0xf7, + 0x0e, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0x7c, 0xd9, + 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, + 0x94, 0x88, 0x01, 0x00, 0x10, 0xb5, 0x0d, 0x4b, + 0x04, 0x1c, 0x18, 0x1c, 0x10, 0x30, 0x00, 0x2c, + 0x08, 0xd0, 0xdb, 0x88, 0x5b, 0x04, 0x5b, 0x0c, + 0x0b, 0x80, 0x80, 0x7b, 0x48, 0x80, 0x04, 0x20, + 0x10, 0x80, 0x08, 0xe0, 0xda, 0x88, 0x01, 0x24, + 0xe4, 0x03, 0x22, 0x40, 0x0c, 0x88, 0x22, 0x43, + 0xda, 0x80, 0x49, 0x88, 0x81, 0x73, 0x01, 0x20, + 0x10, 0xbd, 0x00, 0x00, 0x30, 0x00, 0x07, 0x00, + 0x3c, 0x00, 0xd0, 0x88, 0x01, 0x00, 0x70, 0xb5, + 0x10, 0x4e, 0x02, 0x1c, 0x00, 0x23, 0xf0, 0x56, + 0x00, 0x2a, 0x02, 0xd0, 0x08, 0x70, 0x01, 0x24, + 0x15, 0xe0, 0x00, 0x23, 0xcd, 0x56, 0x85, 0x42, + 0x01, 0xd1, 0x01, 0x20, 0x70, 0xbd, 0x28, 0x1c, + 0x00, 0xf0, 0x5f, 0xf9, 0x04, 0x1c, 0x0a, 0xd0, + 0x07, 0x48, 0x35, 0x70, 0x00, 0x68, 0x00, 0x28, + 0x03, 0xd0, 0x00, 0x21, 0x0a, 0x20, 0xf9, 0xf7, + 0x28, 0xfd, 0x3c, 0x00, 0x0c, 0x89, 0x01, 0x00, + 0x00, 0xf0, 0x16, 0xfa, 0x20, 0x1c, 0x70, 0xbd, + 0xf4, 0x6b, 0x01, 0x00, 0x3c, 0xd9, 0x01, 0x00, + 0x03, 0x1c, 0x08, 0x1c, 0x00, 0x2b, 0x80, 0xb5, + 0x06, 0xd0, 0x04, 0x21, 0x11, 0x80, 0x04, 0x22, + 0x04, 0x49, 0xe7, 0xf7, 0xe3, 0xfd, 0x02, 0xe0, + 0x00, 0x68, 0x00, 0xf0, 0xcf, 0xf9, 0x01, 0x20, + 0x80, 0xbd, 0x00, 0x00, 0xf4, 0x74, 0x01, 0x00, + 0x10, 0xb5, 0xff, 0xf7, 0x3c, 0x00, 0x48, 0x89, + 0x01, 0x00, 0x97, 0xfb, 0xff, 0xf7, 0x89, 0xfc, + 0x04, 0x1c, 0xff, 0xf7, 0xb8, 0xfb, 0xff, 0xf7, + 0x84, 0xfc, 0x00, 0x2c, 0x02, 0xd1, 0x01, 0x28, + 0x00, 0xd1, 0x10, 0xbd, 0x00, 0x20, 0x10, 0xbd, + 0x00, 0x00, 0xf8, 0xb5, 0x20, 0x4f, 0x04, 0x1c, + 0x78, 0x78, 0x0e, 0x1c, 0x02, 0x28, 0x2e, 0xd0, + 0x1e, 0x4a, 0xf9, 0x68, 0x91, 0x61, 0x14, 0x23, + 0x1d, 0x49, 0x58, 0x43, 0x40, 0x18, 0x3c, 0x00, + 0x84, 0x89, 0x01, 0x00, 0x41, 0x7b, 0xb8, 0x78, + 0xf8, 0xf7, 0x14, 0xfe, 0x00, 0xf0, 0x8a, 0xf9, + 0x00, 0x25, 0x04, 0xe0, 0x00, 0x21, 0xb8, 0x78, + 0xf8, 0xf7, 0x0c, 0xfe, 0x01, 0x35, 0x78, 0x78, + 0x14, 0x23, 0x14, 0x49, 0x58, 0x43, 0x40, 0x18, + 0x80, 0x7a, 0xa8, 0x42, 0xf2, 0xdc, 0x00, 0x25, + 0x08, 0xe0, 0x00, 0x21, 0xb8, 0x78, 0xf8, 0xf7, + 0xfd, 0xfd, 0x0f, 0x48, 0x00, 0x68, 0x20, 0x70, + 0x3c, 0x00, 0xc0, 0x89, 0x01, 0x00, 0x01, 0x34, + 0x01, 0x35, 0xb5, 0x42, 0xf4, 0xdb, 0x09, 0x4a, + 0xf8, 0x68, 0x50, 0x61, 0x78, 0x78, 0x02, 0x28, + 0x06, 0xd1, 0xb8, 0x68, 0x32, 0x1c, 0x21, 0x1c, + 0x00, 0x04, 0x00, 0x0c, 0xff, 0xf7, 0x25, 0xfd, + 0xb8, 0x68, 0x80, 0x19, 0xb8, 0x60, 0xf8, 0xbd, + 0x00, 0x00, 0x40, 0xd9, 0x01, 0x00, 0x10, 0x00, + 0x07, 0x00, 0x64, 0x8d, 0x01, 0x00, 0x30, 0x20, + 0x07, 0x00, 0x3c, 0x00, 0xfc, 0x89, 0x01, 0x00, + 0x70, 0xb5, 0x06, 0x1c, 0x0c, 0x4d, 0x00, 0x24, + 0x2c, 0x70, 0xff, 0xf7, 0x39, 0xfc, 0x0a, 0x48, + 0x18, 0x21, 0x1c, 0x30, 0xac, 0x60, 0xe7, 0xf7, + 0x43, 0xfd, 0x08, 0x48, 0x44, 0x61, 0xf9, 0xf7, + 0x63, 0xf9, 0x00, 0x2e, 0x06, 0xd1, 0x06, 0x48, + 0x29, 0x69, 0xf6, 0xf7, 0xa7, 0xfc, 0x00, 0x20, + 0xec, 0xf7, 0xb0, 0xfe, 0x70, 0xbd, 0x00, 0x00, + 0x7c, 0xd9, 0x01, 0x00, 0x3c, 0x00, 0x38, 0x8a, + 0x01, 0x00, 0x20, 0xf7, 0x01, 0x00, 0x34, 0x63, + 0x01, 0x00, 0x30, 0xb5, 0x12, 0x4c, 0x85, 0xb0, + 0x20, 0x68, 0x00, 0x28, 0x1c, 0xd0, 0x0f, 0x48, + 0x14, 0x38, 0x80, 0x68, 0x00, 0x28, 0x01, 0xd1, + 0xff, 0xf7, 0xc1, 0xfb, 0x20, 0x68, 0x00, 0x23, + 0x00, 0x68, 0x01, 0xaa, 0x04, 0x30, 0x01, 0x21, + 0xec, 0xf7, 0xd1, 0xfd, 0x08, 0x49, 0x08, 0x4a, + 0x08, 0x31, 0x0c, 0x31, 0x00, 0x92, 0x3c, 0x00, + 0x74, 0x8a, 0x01, 0x00, 0x03, 0xc9, 0x00, 0xab, + 0x45, 0x18, 0x99, 0x7b, 0x01, 0x9a, 0x20, 0x68, + 0x2b, 0x1c, 0xf2, 0xf7, 0x2b, 0xfe, 0x05, 0xb0, + 0x30, 0xbd, 0x00, 0x00, 0x90, 0xd9, 0x01, 0x00, + 0x29, 0x81, 0x01, 0x00, 0x10, 0xb5, 0x13, 0x4c, + 0x14, 0x23, 0x60, 0x70, 0x58, 0x43, 0x12, 0x4b, + 0xc1, 0x18, 0x8a, 0x88, 0xe2, 0x80, 0x18, 0x58, + 0xe0, 0x60, 0x08, 0x7a, 0xa0, 0x70, 0xff, 0x28, + 0x3c, 0x00, 0xb0, 0x8a, 0x01, 0x00, 0x12, 0xd0, + 0x00, 0x22, 0x08, 0x21, 0x0d, 0x4b, 0xf8, 0xf7, + 0x22, 0xfd, 0x00, 0x22, 0x02, 0x20, 0xe1, 0x68, + 0xef, 0xf7, 0xbd, 0xfe, 0x0a, 0x49, 0xe0, 0x68, + 0x48, 0x61, 0x4a, 0x68, 0x02, 0x43, 0x4a, 0x60, + 0x8a, 0x68, 0x10, 0x43, 0x88, 0x60, 0x60, 0x78, + 0x02, 0x28, 0x01, 0xd1, 0xff, 0xf7, 0xdf, 0xfc, + 0x10, 0xbd, 0x40, 0xd9, 0x01, 0x00, 0x64, 0x8d, + 0x01, 0x00, 0x3c, 0x00, 0xec, 0x8a, 0x01, 0x00, + 0xb8, 0x0b, 0x00, 0x00, 0x10, 0x00, 0x07, 0x00, + 0xfe, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x06, 0x21, + 0x15, 0x4b, 0x41, 0x43, 0x58, 0x5c, 0x82, 0x06, + 0x14, 0x48, 0x92, 0x0e, 0x42, 0x71, 0xc9, 0x18, + 0x4a, 0x78, 0xd2, 0x06, 0xd2, 0x0e, 0x02, 0x71, + 0x42, 0x78, 0x0c, 0x23, 0x1a, 0x43, 0x42, 0x70, + 0x42, 0x78, 0x8b, 0x78, 0x92, 0x08, 0x92, 0x00, + 0x9b, 0x07, 0x9b, 0x0f, 0x3c, 0x00, 0x28, 0x8b, + 0x01, 0x00, 0x1a, 0x43, 0x42, 0x70, 0x02, 0x78, + 0xc0, 0x23, 0x9a, 0x43, 0x40, 0x32, 0x02, 0x70, + 0x02, 0x78, 0x38, 0x23, 0x1a, 0x43, 0x02, 0x70, + 0x02, 0x78, 0xc9, 0x78, 0x04, 0x23, 0x9a, 0x43, + 0x89, 0x00, 0x19, 0x40, 0x11, 0x43, 0x01, 0x70, + 0x01, 0x20, 0x70, 0x47, 0x00, 0x00, 0xd8, 0x8d, + 0x01, 0x00, 0x88, 0x00, 0x07, 0x00, 0x8f, 0xb5, + 0x00, 0x20, 0x02, 0x90, 0x03, 0x90, 0x3c, 0x00, + 0x64, 0x8b, 0x01, 0x00, 0x07, 0x48, 0x02, 0xaa, + 0x03, 0xa9, 0x00, 0x91, 0x01, 0x92, 0x43, 0x89, + 0x02, 0x89, 0x03, 0xc8, 0xff, 0xf7, 0xd4, 0xfb, + 0x03, 0x98, 0x02, 0x99, 0xff, 0xf7, 0x04, 0xfc, + 0x8f, 0xbd, 0x00, 0x00, 0x04, 0x8e, 0x01, 0x00, + 0x08, 0x49, 0x4a, 0x78, 0x00, 0x2a, 0x03, 0xd1, + 0x88, 0x80, 0x00, 0x20, 0x88, 0x60, 0x70, 0x47, + 0x14, 0x23, 0x5a, 0x43, 0x04, 0x4b, 0xd2, 0x18, + 0x3c, 0x00, 0xa0, 0x8b, 0x01, 0x00, 0xd2, 0x88, + 0x42, 0x43, 0xc8, 0x88, 0x42, 0x43, 0x8a, 0x60, + 0x70, 0x47, 0x40, 0xd9, 0x01, 0x00, 0x64, 0x8d, + 0x01, 0x00, 0xf8, 0xb5, 0x25, 0x4e, 0x04, 0x1c, + 0x30, 0x7a, 0x40, 0x08, 0x40, 0x00, 0x30, 0x72, + 0xb0, 0x7a, 0x00, 0x20, 0xb0, 0x72, 0x01, 0x27, + 0x01, 0x2c, 0x20, 0x4d, 0x01, 0xd0, 0xfc, 0x42, + 0x13, 0xd1, 0x30, 0x7b, 0x38, 0x43, 0x30, 0x73, + 0x00, 0x22, 0x3c, 0x00, 0xdc, 0x8b, 0x01, 0x00, + 0x21, 0x1c, 0x00, 0x20, 0xff, 0xf7, 0x6e, 0xfb, + 0x63, 0x1c, 0x01, 0xd1, 0x3f, 0x21, 0xe9, 0x73, + 0xb1, 0x7a, 0xa0, 0x22, 0x11, 0x43, 0xb1, 0x72, + 0x31, 0x7a, 0x39, 0x43, 0x31, 0x72, 0xf8, 0xbd, + 0x30, 0x7b, 0x40, 0x08, 0x40, 0x00, 0x30, 0x73, + 0x01, 0x22, 0x21, 0x1c, 0x01, 0x20, 0xff, 0xf7, + 0x59, 0xfb, 0x01, 0x20, 0x00, 0x21, 0xe9, 0x73, + 0xb1, 0x7a, 0x02, 0x22, 0x3c, 0x00, 0x18, 0x8c, + 0x01, 0x00, 0x11, 0x43, 0xb1, 0x72, 0xb1, 0x7a, + 0x04, 0x22, 0x11, 0x43, 0xb1, 0x72, 0xb1, 0x7a, + 0x30, 0x22, 0x11, 0x43, 0xb1, 0x72, 0x31, 0x7a, + 0x39, 0x43, 0x31, 0x72, 0x08, 0x49, 0x4a, 0x68, + 0x80, 0x23, 0x9a, 0x43, 0x4a, 0x60, 0x0a, 0x68, + 0x1a, 0x43, 0x0a, 0x60, 0x31, 0x7b, 0x39, 0x43, + 0x31, 0x73, 0xd7, 0xe7, 0x00, 0x00, 0x88, 0x00, + 0x07, 0x00, 0x40, 0x00, 0x07, 0x00, 0x3c, 0x00, + 0x54, 0x8c, 0x01, 0x00, 0x6c, 0x00, 0x07, 0x00, + 0xb0, 0xb5, 0x0e, 0x4d, 0x0e, 0x48, 0x29, 0x69, + 0xf6, 0xf7, 0x9e, 0xfb, 0x0d, 0x48, 0xec, 0xf7, + 0x93, 0xfd, 0x0d, 0x48, 0x09, 0x4c, 0x00, 0x88, + 0x1c, 0x34, 0xa0, 0x82, 0xf1, 0xf7, 0x5a, 0xff, + 0x20, 0x61, 0xfa, 0xf7, 0x97, 0xf8, 0x02, 0x1c, + 0x23, 0x1c, 0x00, 0x21, 0x00, 0x20, 0xec, 0xf7, + 0x8b, 0xff, 0x32, 0x20, 0xe8, 0x60, 0xff, 0xf7, + 0x3c, 0x00, 0x90, 0x8c, 0x01, 0x00, 0xa5, 0xfa, + 0xb0, 0xbd, 0x7c, 0xd9, 0x01, 0x00, 0x34, 0x63, + 0x01, 0x00, 0xdd, 0x84, 0x01, 0x00, 0x20, 0xf7, + 0x01, 0x00, 0xb0, 0xb5, 0x0a, 0x4d, 0x68, 0x78, + 0x00, 0x28, 0x0e, 0xd0, 0x14, 0x23, 0x08, 0x49, + 0x58, 0x43, 0x40, 0x18, 0x44, 0x7a, 0x06, 0xe0, + 0xa8, 0x68, 0xe0, 0x40, 0x01, 0x06, 0x09, 0x0e, + 0xa8, 0x78, 0xf8, 0xf7, 0x76, 0xfc, 0x08, 0x3c, + 0xf6, 0xd5, 0x3c, 0x00, 0xcc, 0x8c, 0x01, 0x00, + 0xb0, 0xbd, 0x00, 0x00, 0x40, 0xd9, 0x01, 0x00, + 0x64, 0x8d, 0x01, 0x00, 0x01, 0x1c, 0x14, 0x48, + 0xb0, 0xb5, 0x01, 0x60, 0x13, 0x48, 0x02, 0x7f, + 0x02, 0x23, 0x9a, 0x43, 0x02, 0x77, 0x02, 0x7f, + 0x01, 0x24, 0x22, 0x43, 0x02, 0x77, 0x10, 0x4d, + 0x00, 0x29, 0x0c, 0xd0, 0x01, 0x22, 0x00, 0x21, + 0x03, 0x20, 0xef, 0xf7, 0x9f, 0xfd, 0x0d, 0x49, + 0x48, 0x7c, 0xa0, 0x43, 0x3c, 0x00, 0x08, 0x8d, + 0x01, 0x00, 0x48, 0x74, 0x68, 0x7a, 0x20, 0x43, + 0x68, 0x72, 0xb0, 0xbd, 0x01, 0x7f, 0x21, 0x43, + 0x01, 0x77, 0x68, 0x7a, 0x40, 0x08, 0x40, 0x00, + 0x68, 0x72, 0x01, 0x22, 0x00, 0x21, 0x03, 0x20, + 0xef, 0xf7, 0xb1, 0xfd, 0xb0, 0xbd, 0xf4, 0x74, + 0x01, 0x00, 0x30, 0x00, 0x07, 0x00, 0x88, 0x00, + 0x07, 0x00, 0x10, 0x00, 0x07, 0x00, 0x10, 0xb5, + 0x07, 0x4c, 0x21, 0x1c, 0x00, 0x20, 0x3c, 0x00, + 0x44, 0x8d, 0x01, 0x00, 0xf9, 0xf7, 0x56, 0xfb, + 0x05, 0x48, 0x00, 0x23, 0xc0, 0x56, 0x01, 0x28, + 0x03, 0xdd, 0x21, 0x1c, 0x00, 0x20, 0xf9, 0xf7, + 0x19, 0xfb, 0x10, 0xbd, 0x65, 0x1a, 0x00, 0x00, + 0xf4, 0x6b, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x08, 0x01, 0x01, 0x00, 0x02, 0x18, 0x04, 0xff, + 0x82, 0xe8, 0xd7, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, + 0x3c, 0x00, 0x80, 0x8d, 0x01, 0x00, 0x00, 0x18, + 0x00, 0x06, 0x02, 0x03, 0x05, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x01, 0x00, 0xff, 0x10, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x20, 0x00, 0x01, 0x00, 0x02, 0x10, + 0x00, 0x06, 0x02, 0x03, 0x05, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x05, 0x06, 0x07, 0x08, 0x0c, + 0x0d, 0x0e, 0x3c, 0x00, 0xbc, 0x8d, 0x01, 0x00, + 0xff, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1b, + 0x1c, 0x1d, 0xff, 0x1a, 0x11, 0x13, 0x12, 0x0f, + 0x10, 0xff, 0x02, 0x00, 0xff, 0x01, 0x03, 0x09, + 0x0a, 0x0b, 0x00, 0x00, 0x30, 0x0d, 0x02, 0x00, + 0x00, 0x00, 0x28, 0x0e, 0x03, 0x00, 0x00, 0x00, + 0x1e, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0d, + 0x02, 0x01, 0x00, 0x00, 0x1e, 0x0c, 0x00, 0x01, + 0x00, 0x00, 0x23, 0x0d, 0x3c, 0x00, 0xf8, 0x8d, + 0x01, 0x00, 0x02, 0x01, 0x00, 0x00, 0x1d, 0x0d, + 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, + 0xfb, 0x6d, 0x00, 0x00, 0x80, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x34, 0x8e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x70, 0x8e, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xac, 0x8e, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0x8e, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x24, 0x8f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x60, 0x8f, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x9c, 0x8f, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0x8f, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x14, 0x90, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x50, 0x90, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x8c, 0x90, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0x90, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x04, 0x91, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x40, 0x91, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x7c, 0x91, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0x91, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xf4, 0x91, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x30, 0x92, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x6c, 0x92, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0x92, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xe4, 0x92, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x20, 0x93, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x5c, 0x93, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0x93, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xd4, 0x93, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x10, 0x94, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x4c, 0x94, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0x94, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xc4, 0x94, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x95, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x3c, 0x95, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0x95, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xb4, 0x95, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xf0, 0x95, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x2c, 0x96, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0x96, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xa4, 0x96, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xe0, 0x96, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x1c, 0x97, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0x97, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x94, 0x97, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xd0, 0x97, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x0c, 0x98, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0x98, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x84, 0x98, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xc0, 0x98, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xfc, 0x98, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0x99, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x74, 0x99, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xb0, 0x99, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xec, 0x99, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0x9a, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x64, 0x9a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xa0, 0x9a, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xdc, 0x9a, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0x9b, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x54, 0x9b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x90, 0x9b, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xcc, 0x9b, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0x9c, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x44, 0x9c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x80, 0x9c, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xbc, 0x9c, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0x9c, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x34, 0x9d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x70, 0x9d, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xac, 0x9d, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0x9d, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x24, 0x9e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x60, 0x9e, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x9c, 0x9e, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0x9e, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x14, 0x9f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x50, 0x9f, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x8c, 0x9f, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0x9f, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x04, 0xa0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x40, 0xa0, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x7c, 0xa0, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xa0, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xf4, 0xa0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x30, 0xa1, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x6c, 0xa1, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0xa1, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xe4, 0xa1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x20, 0xa2, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x5c, 0xa2, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xa2, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xd4, 0xa2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x10, 0xa3, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x4c, 0xa3, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0xa3, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xc4, 0xa3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0xa4, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x3c, 0xa4, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0xa4, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xb4, 0xa4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xf0, 0xa4, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x2c, 0xa5, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0xa5, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xa4, 0xa5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xe0, 0xa5, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x1c, 0xa6, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0xa6, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x94, 0xa6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xd0, 0xa6, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x0c, 0xa7, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0xa7, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x84, 0xa7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xc0, 0xa7, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xfc, 0xa7, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0xa8, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x74, 0xa8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xb0, 0xa8, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xec, 0xa8, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0xa9, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x64, 0xa9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xa0, 0xa9, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xdc, 0xa9, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0xaa, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x54, 0xaa, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x90, 0xaa, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xcc, 0xaa, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0xab, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x44, 0xab, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x80, 0xab, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xbc, 0xab, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0xab, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x34, 0xac, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x70, 0xac, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xac, 0xac, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0xac, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x24, 0xad, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x60, 0xad, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x9c, 0xad, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0xad, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x14, 0xae, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x50, 0xae, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x8c, 0xae, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0xae, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x04, 0xaf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x40, 0xaf, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x7c, 0xaf, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xaf, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xf4, 0xaf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x30, 0xb0, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x6c, 0xb0, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0xb0, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xe4, 0xb0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x20, 0xb1, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x5c, 0xb1, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xb1, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xd4, 0xb1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x10, 0xb2, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x4c, 0xb2, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0xb2, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xc4, 0xb2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0xb3, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x3c, 0xb3, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0xb3, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xb4, 0xb3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xf0, 0xb3, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x2c, 0xb4, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0xb4, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xa4, 0xb4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xe0, 0xb4, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x1c, 0xb5, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0xb5, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x94, 0xb5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xd0, 0xb5, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x0c, 0xb6, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0xb6, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x84, 0xb6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xc0, 0xb6, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xfc, 0xb6, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0xb7, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x74, 0xb7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xb0, 0xb7, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xec, 0xb7, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0xb8, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x64, 0xb8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xa0, 0xb8, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xdc, 0xb8, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0xb9, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x54, 0xb9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x90, 0xb9, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xcc, 0xb9, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0xba, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x44, 0xba, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x80, 0xba, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xbc, 0xba, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0xba, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x34, 0xbb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x70, 0xbb, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xac, 0xbb, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0xbb, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x24, 0xbc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x60, 0xbc, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x9c, 0xbc, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0xbc, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x14, 0xbd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x50, 0xbd, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x8c, 0xbd, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0xbd, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x04, 0xbe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x40, 0xbe, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x7c, 0xbe, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xbe, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xf4, 0xbe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x30, 0xbf, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x6c, 0xbf, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0xbf, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xe4, 0xbf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x20, 0xc0, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x5c, 0xc0, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xc0, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xd4, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x10, 0xc1, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x4c, 0xc1, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0xc1, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xc4, 0xc1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0xc2, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x3c, 0xc2, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0xc2, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xb4, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xf0, 0xc2, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x2c, 0xc3, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0xc3, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xa4, 0xc3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xe0, 0xc3, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x1c, 0xc4, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0xc4, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x94, 0xc4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xd0, 0xc4, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x0c, 0xc5, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0xc5, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x84, 0xc5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xc0, 0xc5, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xfc, 0xc5, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0xc6, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x74, 0xc6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xb0, 0xc6, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xec, 0xc6, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0xc7, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x64, 0xc7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xa0, 0xc7, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xdc, 0xc7, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0xc8, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x54, 0xc8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x90, 0xc8, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xcc, 0xc8, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0xc9, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x44, 0xc9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x80, 0xc9, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xbc, 0xc9, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0xc9, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x34, 0xca, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x70, 0xca, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xac, 0xca, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0xca, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x24, 0xcb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x60, 0xcb, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x9c, 0xcb, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0xcb, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x14, 0xcc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x50, 0xcc, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x8c, 0xcc, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0xcc, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x04, 0xcd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x40, 0xcd, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x7c, 0xcd, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xcd, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xf4, 0xcd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x30, 0xce, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x6c, 0xce, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0xce, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xe4, 0xce, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x20, 0xcf, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x5c, 0xcf, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xcf, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xd4, 0xcf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x10, 0xd0, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x4c, 0xd0, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0xd0, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xc4, 0xd0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0xd1, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x3c, 0xd1, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0xd1, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xb4, 0xd1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xf0, 0xd1, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x2c, 0xd2, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0xd2, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xa4, 0xd2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xe0, 0xd2, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x1c, 0xd3, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0xd3, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x94, 0xd3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xd0, 0xd3, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x0c, 0xd4, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0xd4, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x84, 0xd4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xc0, 0xd4, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xfc, 0xd4, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0xd5, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x74, 0xd5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xb0, 0xd5, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xec, 0xd5, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0xd6, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x64, 0xd6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xa0, 0xd6, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xdc, 0xd6, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0xd7, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x54, 0xd7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x90, 0xd7, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xcc, 0xd7, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0xd8, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x44, 0xd8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x80, 0xd8, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xbc, 0xd8, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0xd8, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x34, 0xd9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x70, 0xd9, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xac, 0xd9, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0xd9, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x24, 0xda, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x60, 0xda, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x9c, 0xda, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0xda, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x14, 0xdb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x50, 0xdb, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x8c, 0xdb, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0xdb, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x04, 0xdc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x40, 0xdc, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x7c, 0xdc, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xdc, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xf4, 0xdc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x30, 0xdd, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x6c, 0xdd, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0xdd, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xe4, 0xdd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x20, 0xde, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x5c, 0xde, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xde, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xd4, 0xde, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x10, 0xdf, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x4c, 0xdf, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0xdf, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xc4, 0xdf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x3c, 0xe0, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0xe0, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xb4, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xf0, 0xe0, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x2c, 0xe1, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0xe1, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xa4, 0xe1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xe0, 0xe1, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x1c, 0xe2, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0xe2, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x94, 0xe2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xd0, 0xe2, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x0c, 0xe3, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0xe3, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x84, 0xe3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xc0, 0xe3, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xfc, 0xe3, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0xe4, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x74, 0xe4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xb0, 0xe4, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xec, 0xe4, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0xe5, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x64, 0xe5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xa0, 0xe5, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xdc, 0xe5, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0xe6, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x54, 0xe6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x90, 0xe6, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xcc, 0xe6, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0xe7, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x44, 0xe7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x80, 0xe7, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xbc, 0xe7, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0xe7, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x34, 0xe8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x70, 0xe8, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xac, 0xe8, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0xe8, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x24, 0xe9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x60, 0xe9, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x9c, 0xe9, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0xe9, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x14, 0xea, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x50, 0xea, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x8c, 0xea, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0xea, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x04, 0xeb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x40, 0xeb, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x7c, 0xeb, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xeb, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xf4, 0xeb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x30, 0xec, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x6c, 0xec, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0xec, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xe4, 0xec, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x20, 0xed, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x5c, 0xed, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xed, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xd4, 0xed, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x10, 0xee, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x4c, 0xee, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0xee, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xc4, 0xee, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0xef, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x3c, 0xef, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0xef, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xb4, 0xef, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xf0, 0xef, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x2c, 0xf0, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0xf0, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xa4, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xe0, 0xf0, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x1c, 0xf1, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0xf1, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x94, 0xf1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xd0, 0xf1, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x0c, 0xf2, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0xf2, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x84, 0xf2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xc0, 0xf2, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xfc, 0xf2, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0xf3, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x74, 0xf3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xb0, 0xf3, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xec, 0xf3, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0xf4, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x64, 0xf4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xa0, 0xf4, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xdc, 0xf4, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0xf5, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x54, 0xf5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x90, 0xf5, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xcc, 0xf5, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0xf6, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x44, 0xf6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x80, 0xf6, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xbc, 0xf6, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0xf6, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x34, 0xf7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x70, 0xf7, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xac, 0xf7, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0xf7, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x24, 0xf8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x60, 0xf8, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x9c, 0xf8, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0xf8, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x14, 0xf9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x50, 0xf9, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x8c, 0xf9, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0xf9, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x04, 0xfa, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x40, 0xfa, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x7c, 0xfa, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xfa, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xf4, 0xfa, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x30, 0xfb, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x6c, 0xfb, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0xfb, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xe4, 0xfb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x20, 0xfc, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x5c, 0xfc, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xfc, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xd4, 0xfc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x10, 0xfd, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x4c, 0xfd, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0xfd, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xc4, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0xfe, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x3c, 0xfe, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0xfe, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xb4, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xf0, 0xfe, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x2c, 0xff, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x68, 0xff, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x00, 0x10, 0x04, 0x00, 0x70, 0xb5, 0x2b, 0x48, + 0x06, 0x21, 0x81, 0x75, 0xc1, 0x75, 0x01, 0x7e, + 0x49, 0x08, 0x49, 0x00, 0x01, 0x76, 0x01, 0x7e, + 0x02, 0x22, 0x91, 0x43, 0x01, 0x76, 0x26, 0x49, + 0x0b, 0x78, 0x5b, 0x08, 0x5b, 0x00, 0x0b, 0x70, + 0x04, 0x23, 0x8b, 0x70, 0x0c, 0x23, 0x43, 0x76, + 0x20, 0x23, 0x03, 0x75, 0x1a, 0x24, 0x44, 0x75, + 0x24, 0x24, 0x84, 0x76, 0x10, 0x24, 0xc4, 0x76, + 0x3c, 0x00, 0x3c, 0x10, 0x04, 0x00, 0x2a, 0x25, + 0x4d, 0x70, 0x05, 0x7a, 0x30, 0x26, 0xb5, 0x43, + 0x20, 0x35, 0x05, 0x72, 0x85, 0x7a, 0x6d, 0x08, + 0x6d, 0x00, 0x85, 0x72, 0x85, 0x7a, 0x95, 0x43, + 0x85, 0x72, 0x85, 0x7a, 0x04, 0x26, 0x35, 0x43, + 0x85, 0x72, 0x85, 0x7a, 0x08, 0x26, 0x35, 0x43, + 0x85, 0x72, 0x85, 0x7a, 0xa5, 0x43, 0x85, 0x72, + 0x05, 0x7b, 0x2c, 0x43, 0x04, 0x73, 0x04, 0x7b, + 0x1c, 0x43, 0x3c, 0x00, 0x78, 0x10, 0x04, 0x00, + 0x04, 0x73, 0x04, 0x7b, 0x40, 0x25, 0x2c, 0x43, + 0x04, 0x73, 0x84, 0x7a, 0x23, 0x43, 0x83, 0x72, + 0x83, 0x7a, 0xab, 0x43, 0x83, 0x72, 0x03, 0x7b, + 0x80, 0x24, 0x23, 0x43, 0x03, 0x73, 0x08, 0x78, + 0x90, 0x43, 0x08, 0x70, 0x08, 0x78, 0x01, 0x22, + 0x10, 0x43, 0x08, 0x70, 0x08, 0x78, 0x04, 0x22, + 0x90, 0x43, 0x08, 0x70, 0x70, 0xbd, 0x00, 0x00, + 0x0c, 0x80, 0x07, 0x00, 0x3c, 0x00, 0xb4, 0x10, + 0x04, 0x00, 0x80, 0x80, 0x07, 0x00, 0x01, 0x49, + 0x04, 0x20, 0x48, 0x73, 0x70, 0x47, 0x40, 0x80, + 0x07, 0x00, 0x03, 0x49, 0x80, 0xb5, 0x00, 0x20, + 0x08, 0x80, 0x00, 0xf0, 0x0a, 0xfb, 0x80, 0xbd, + 0x00, 0x00, 0xfc, 0x6b, 0x01, 0x00, 0x70, 0x47, + 0x00, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x67, 0xfb, + 0x80, 0xbd, 0x80, 0xb5, 0x0a, 0x49, 0x18, 0x20, + 0xc1, 0xf7, 0x3b, 0xfa, 0x09, 0x49, 0x3c, 0x00, + 0xf0, 0x10, 0x04, 0x00, 0x02, 0x20, 0xc1, 0xf7, + 0x37, 0xfa, 0x08, 0x49, 0x1f, 0x20, 0xc1, 0xf7, + 0x33, 0xfa, 0x07, 0x49, 0x1c, 0x20, 0xc1, 0xf7, + 0x2f, 0xfa, 0x06, 0x49, 0x03, 0x20, 0xc1, 0xf7, + 0x2b, 0xfa, 0x80, 0xbd, 0x99, 0x2a, 0x00, 0x00, + 0x41, 0x25, 0x00, 0x00, 0x55, 0x25, 0x00, 0x00, + 0x5d, 0x25, 0x00, 0x00, 0x39, 0x25, 0x00, 0x00, + 0x80, 0xb5, 0xbf, 0xf7, 0x91, 0xfd, 0x80, 0xbd, + 0x3c, 0x00, 0x2c, 0x11, 0x04, 0x00, 0x80, 0xb5, + 0x05, 0x4a, 0x05, 0x49, 0x0a, 0x20, 0xbf, 0xf7, + 0x4e, 0xff, 0x01, 0x20, 0x04, 0x49, 0x80, 0x02, + 0x08, 0x60, 0x48, 0x60, 0x80, 0xbd, 0xb4, 0x74, + 0x01, 0x00, 0xb1, 0x64, 0x00, 0x00, 0x00, 0x10, + 0x07, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x91, 0xfe, + 0x80, 0xbd, 0x80, 0xb5, 0x05, 0x4a, 0x05, 0x49, + 0x1b, 0x20, 0xbf, 0xf7, 0x38, 0xff, 0x01, 0x20, + 0x04, 0x49, 0x3c, 0x00, 0x68, 0x11, 0x04, 0x00, + 0xc0, 0x06, 0x08, 0x60, 0x48, 0x60, 0x80, 0xbd, + 0xb8, 0x74, 0x01, 0x00, 0x2d, 0x6e, 0x00, 0x00, + 0x00, 0x10, 0x07, 0x00, 0x80, 0xb5, 0x04, 0x48, + 0x00, 0xf0, 0x80, 0xfe, 0x03, 0x49, 0x00, 0x20, + 0x48, 0x60, 0x88, 0x60, 0x80, 0xbd, 0x00, 0x00, + 0x41, 0x4b, 0x00, 0x00, 0xbc, 0x74, 0x01, 0x00, + 0x80, 0xb5, 0xc5, 0xf7, 0xd5, 0xfe, 0xce, 0xf7, + 0xd9, 0xf8, 0x03, 0x49, 0x3c, 0x00, 0xa4, 0x11, + 0x04, 0x00, 0x08, 0x60, 0x03, 0x49, 0x0a, 0x20, + 0xd1, 0xf7, 0xef, 0xf8, 0x80, 0xbd, 0xbc, 0x74, + 0x01, 0x00, 0x49, 0x6e, 0x00, 0x00, 0x80, 0xb5, + 0x01, 0x22, 0x20, 0x21, 0x06, 0x20, 0xc8, 0xf7, + 0x56, 0xfc, 0xbf, 0xf7, 0x70, 0xfe, 0x03, 0x49, + 0x00, 0x20, 0x08, 0x60, 0x20, 0x21, 0x02, 0x48, + 0xbf, 0xf7, 0x63, 0xf9, 0x80, 0xbd, 0xcc, 0x5c, + 0x01, 0x00, 0x64, 0x6d, 0x01, 0x00, 0x3c, 0x00, + 0xe0, 0x11, 0x04, 0x00, 0x08, 0x48, 0x80, 0xb5, + 0x00, 0x68, 0x00, 0x28, 0x05, 0xd0, 0x06, 0x48, + 0x54, 0x30, 0x42, 0x6a, 0x00, 0x21, 0xbf, 0xf7, + 0xf3, 0xf8, 0x04, 0x4a, 0x04, 0x49, 0x03, 0x20, + 0xbf, 0xf7, 0xac, 0xfd, 0x80, 0xbd, 0x00, 0x00, + 0x50, 0x6d, 0x01, 0x00, 0x89, 0x98, 0x00, 0x00, + 0x91, 0x98, 0x00, 0x00, 0x80, 0xb5, 0x00, 0xf0, + 0x03, 0xf8, 0x00, 0xf0, 0x19, 0xf8, 0x80, 0xbd, + 0x3c, 0x00, 0x1c, 0x12, 0x04, 0x00, 0x10, 0xb5, + 0x09, 0x4c, 0x60, 0x21, 0x20, 0x1c, 0xbf, 0xf7, + 0x3a, 0xf9, 0x00, 0x20, 0xc0, 0x43, 0xa0, 0x60, + 0x20, 0x60, 0xff, 0x20, 0x02, 0x30, 0xe0, 0x84, + 0x20, 0x22, 0x20, 0x1c, 0x40, 0x30, 0x02, 0x49, + 0xbf, 0xf7, 0x5b, 0xf9, 0x10, 0xbd, 0x00, 0x10, + 0x07, 0x00, 0x70, 0x52, 0x01, 0x00, 0x00, 0x20, + 0x0a, 0x49, 0xc0, 0x43, 0x88, 0x60, 0x09, 0x4b, + 0x0a, 0x49, 0x3c, 0x00, 0x58, 0x12, 0x04, 0x00, + 0x00, 0x20, 0x82, 0x00, 0x01, 0x30, 0x00, 0x06, + 0x00, 0x0e, 0x20, 0x28, 0x99, 0x50, 0xf8, 0xd3, + 0x06, 0x49, 0x04, 0x4a, 0x08, 0x1c, 0x10, 0x30, + 0x08, 0x3a, 0x03, 0xc2, 0x70, 0x47, 0x00, 0x00, + 0x00, 0x10, 0x07, 0x00, 0xe0, 0x7e, 0x01, 0x00, + 0x75, 0x75, 0x00, 0x00, 0x00, 0xa0, 0x07, 0x00, + 0x04, 0x48, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, + 0x0e, 0xc0, 0x0c, 0x38, 0x3c, 0x00, 0x94, 0x12, + 0x04, 0x00, 0x01, 0x21, 0x41, 0x60, 0x70, 0x47, + 0x00, 0x00, 0x70, 0x78, 0x01, 0x00, 0x70, 0x47, + 0x00, 0x00, 0x03, 0x48, 0x00, 0x21, 0x00, 0x22, + 0x00, 0x23, 0x0e, 0xc0, 0x08, 0xc0, 0x70, 0x47, + 0x00, 0x00, 0x88, 0x5a, 0x01, 0x00, 0x04, 0x49, + 0x80, 0xb5, 0x00, 0x20, 0x48, 0x61, 0x02, 0x48, + 0x40, 0x21, 0x1c, 0x30, 0xbf, 0xf7, 0xe9, 0xf8, + 0x80, 0xbd, 0xfc, 0x5a, 0x01, 0x00, 0x3c, 0x00, + 0xd0, 0x12, 0x04, 0x00, 0x80, 0xb5, 0xce, 0xf7, + 0x3f, 0xf8, 0x03, 0x49, 0x88, 0x61, 0x03, 0x49, + 0x03, 0x20, 0xd1, 0xf7, 0x55, 0xf8, 0x80, 0xbd, + 0xfc, 0x5a, 0x01, 0x00, 0x0d, 0x17, 0x01, 0x00, + 0x80, 0xb5, 0xc0, 0xf7, 0xa5, 0xf9, 0x80, 0xbd, + 0xfe, 0xb5, 0x6c, 0x49, 0x00, 0x20, 0x00, 0x90, + 0xc8, 0x78, 0x6b, 0x4c, 0x6b, 0x4f, 0x43, 0x07, + 0xc0, 0x06, 0xc0, 0x17, 0xdb, 0x0e, 0xe3, 0x58, + 0x3c, 0x00, 0x0c, 0x13, 0x04, 0x00, 0x01, 0x30, + 0x38, 0x62, 0x3b, 0x61, 0x08, 0x1c, 0x80, 0x78, + 0x66, 0x4e, 0x03, 0x22, 0x41, 0x07, 0xa0, 0x36, + 0x02, 0x96, 0x49, 0x0f, 0x31, 0x72, 0x89, 0x00, + 0x61, 0x58, 0x3c, 0x1c, 0x61, 0x61, 0x01, 0x91, + 0xc0, 0x06, 0xc0, 0x0f, 0x78, 0x62, 0x20, 0x1c, + 0x00, 0x27, 0x87, 0x61, 0x00, 0x20, 0x21, 0x1c, + 0xc8, 0x61, 0x59, 0x48, 0x59, 0x49, 0x00, 0x78, + 0x09, 0x79, 0x3c, 0x00, 0x48, 0x13, 0x04, 0x00, + 0x5a, 0x4c, 0x4e, 0x07, 0x76, 0x0f, 0x71, 0x1c, + 0x8c, 0x46, 0xb1, 0x00, 0x8e, 0x46, 0x56, 0x49, + 0x80, 0x31, 0x00, 0x28, 0x24, 0xd0, 0x52, 0x4f, + 0x01, 0x28, 0x7f, 0x78, 0x1a, 0xd0, 0x02, 0x28, + 0x71, 0xd1, 0x4f, 0x48, 0x00, 0x2f, 0x0c, 0xd0, + 0x01, 0x2f, 0x6c, 0xd1, 0x40, 0x79, 0x4d, 0x4d, + 0x40, 0x07, 0x40, 0x0f, 0x82, 0x00, 0xaa, 0x58, + 0x4b, 0x4d, 0x01, 0x30, 0x3c, 0x00, 0x84, 0x13, + 0x04, 0x00, 0xea, 0x61, 0xa0, 0x73, 0x04, 0x22, + 0x4b, 0x48, 0x48, 0x4d, 0xc8, 0x61, 0x4a, 0x48, + 0x00, 0x2f, 0x00, 0xd0, 0x4a, 0x48, 0x2f, 0x1c, + 0x11, 0xe0, 0x42, 0x48, 0x00, 0x2f, 0x55, 0xd1, + 0x07, 0x70, 0x02, 0x27, 0x47, 0x70, 0x3f, 0x48, + 0x40, 0x78, 0x00, 0x28, 0x10, 0xd0, 0x01, 0x28, + 0x01, 0xd0, 0x02, 0x28, 0x4a, 0xd1, 0x3f, 0x48, + 0x3d, 0x4f, 0xc8, 0x61, 0x3f, 0x48, 0x3c, 0x00, + 0xc0, 0x13, 0x04, 0x00, 0x88, 0x61, 0x3a, 0x49, + 0x70, 0x46, 0x08, 0x58, 0x35, 0x1c, 0xb8, 0x61, + 0x60, 0x46, 0x60, 0x73, 0x04, 0xe0, 0x3c, 0x48, + 0x02, 0x22, 0x88, 0x61, 0x3b, 0x48, 0xc8, 0x61, + 0x00, 0x20, 0x32, 0x49, 0x06, 0xe0, 0x0e, 0x18, + 0xb6, 0x78, 0x76, 0x07, 0x76, 0x0f, 0x04, 0x2e, + 0x2f, 0xd8, 0x01, 0x30, 0x90, 0x42, 0xf6, 0xd3, + 0xc8, 0x79, 0x2e, 0x4f, 0xc0, 0x07, 0xc0, 0x0f, + 0x3c, 0x00, 0xfc, 0x13, 0x04, 0x00, 0xf8, 0x60, + 0x33, 0x48, 0x41, 0x68, 0x19, 0x43, 0x41, 0x60, + 0x81, 0x68, 0x19, 0x43, 0x81, 0x60, 0x01, 0x9a, + 0xb9, 0x69, 0x8c, 0x46, 0x11, 0x43, 0xfa, 0x69, + 0x86, 0x68, 0x11, 0x43, 0x8e, 0x43, 0x86, 0x60, + 0x46, 0x68, 0x31, 0x43, 0x41, 0x60, 0x01, 0x99, + 0x0b, 0x43, 0x18, 0x1c, 0x61, 0x46, 0x08, 0x43, + 0x10, 0x43, 0x01, 0x1c, 0x00, 0x22, 0x02, 0x20, + 0xc7, 0xf7, 0x3c, 0x00, 0x38, 0x14, 0x04, 0x00, + 0x03, 0xfa, 0x1e, 0x4e, 0x40, 0x3e, 0x70, 0x78, + 0xc0, 0x08, 0xc0, 0x00, 0x28, 0x43, 0x70, 0x70, + 0x70, 0x1c, 0x01, 0x78, 0x00, 0xe0, 0x29, 0xe0, + 0x08, 0x25, 0xa9, 0x43, 0x01, 0x70, 0x01, 0x20, + 0xc0, 0x43, 0xb0, 0x80, 0x00, 0x21, 0x01, 0x20, + 0xcf, 0xf7, 0x6c, 0xfc, 0x30, 0x1c, 0x80, 0x30, + 0x81, 0x78, 0x09, 0x09, 0x09, 0x01, 0x81, 0x70, + 0x0f, 0x21, 0x01, 0x70, 0x3c, 0x00, 0x74, 0x14, + 0x04, 0x00, 0x16, 0x4a, 0x69, 0x04, 0x11, 0x60, + 0x51, 0x60, 0x02, 0x9e, 0x10, 0x21, 0x32, 0x7a, + 0x7b, 0x6a, 0x00, 0x2b, 0x00, 0xd1, 0x00, 0x21, + 0x11, 0x43, 0x21, 0x73, 0x81, 0x78, 0x29, 0x43, + 0x81, 0x70, 0xe0, 0x78, 0x01, 0x21, 0x08, 0x43, + 0xe0, 0x70, 0xd2, 0xf7, 0xf2, 0xf9, 0x01, 0x20, + 0x00, 0x90, 0x00, 0x98, 0xfe, 0xbd, 0xc0, 0x57, + 0x01, 0x00, 0x6c, 0x43, 0x01, 0x00, 0x3c, 0x00, + 0xb0, 0x14, 0x04, 0x00, 0xa4, 0x6c, 0x01, 0x00, + 0x40, 0x90, 0x07, 0x00, 0xc9, 0x1d, 0x00, 0x00, + 0x81, 0x1d, 0x00, 0x00, 0xa5, 0x1d, 0x00, 0x00, + 0x99, 0x1d, 0x00, 0x00, 0xf1, 0x1d, 0x00, 0x00, + 0x10, 0x00, 0x07, 0x00, 0x00, 0x10, 0x07, 0x00, + 0x03, 0x49, 0x00, 0x20, 0x88, 0x62, 0x08, 0x70, + 0x48, 0x70, 0x08, 0x71, 0x08, 0x62, 0x70, 0x47, + 0xac, 0x7e, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x21, + 0x3c, 0x00, 0xec, 0x14, 0x04, 0x00, 0x00, 0x20, + 0xcd, 0xf7, 0x69, 0xff, 0x80, 0xbd, 0xb0, 0xb5, + 0x0f, 0x48, 0xc0, 0xf7, 0x18, 0xfc, 0x0e, 0x4d, + 0x03, 0x20, 0x28, 0x70, 0x0d, 0x49, 0x0d, 0x48, + 0x0c, 0x39, 0x48, 0x60, 0x0d, 0x48, 0x0a, 0x4c, + 0x88, 0x60, 0x40, 0x21, 0x18, 0x34, 0x20, 0x1c, + 0xbe, 0xf7, 0xc1, 0xff, 0xff, 0x21, 0x68, 0x68, + 0x09, 0x06, 0x08, 0x43, 0x20, 0x60, 0xff, 0x21, + 0x06, 0x22, 0x3c, 0x00, 0x28, 0x15, 0x04, 0x00, + 0x20, 0x1d, 0xbf, 0xf7, 0x79, 0xf8, 0x01, 0x20, + 0xe0, 0x60, 0xb0, 0xbd, 0xc0, 0xa8, 0x13, 0x0a, + 0x20, 0x6e, 0x01, 0x00, 0xc0, 0xa8, 0x13, 0x01, + 0xff, 0xff, 0xff, 0x00, 0x80, 0xb5, 0x02, 0x49, + 0x01, 0x20, 0xc8, 0xf7, 0x45, 0xff, 0x80, 0xbd, + 0x9d, 0x1c, 0x00, 0x00, 0x98, 0xb5, 0x0c, 0x4c, + 0x00, 0x20, 0x60, 0x60, 0xe0, 0x60, 0x0b, 0x4b, + 0x0b, 0x49, 0x82, 0x00, 0x3c, 0x00, 0x64, 0x15, + 0x04, 0x00, 0x01, 0x30, 0x20, 0x28, 0x99, 0x50, + 0xfa, 0xdb, 0x6a, 0x46, 0x09, 0x49, 0x05, 0x20, + 0xbf, 0xf7, 0x2f, 0xfd, 0x00, 0x20, 0xc0, 0x43, + 0x20, 0x60, 0x06, 0x49, 0x20, 0x20, 0x08, 0x60, + 0x48, 0x60, 0x98, 0xbd, 0x00, 0x00, 0x00, 0x40, + 0x07, 0x00, 0x30, 0x74, 0x01, 0x00, 0xa9, 0x75, + 0x00, 0x00, 0xb5, 0x9f, 0x00, 0x00, 0x00, 0x10, + 0x07, 0x00, 0x05, 0x49, 0x00, 0x20, 0x3c, 0x00, + 0xa0, 0x15, 0x04, 0x00, 0x08, 0x60, 0x05, 0x48, + 0x81, 0x78, 0x28, 0x22, 0x91, 0x43, 0x81, 0x70, + 0x81, 0x78, 0x11, 0x43, 0x81, 0x70, 0x70, 0x47, + 0x78, 0x6e, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, + 0x70, 0x47, 0x00, 0x00, 0x41, 0x48, 0x10, 0xb5, + 0x00, 0x68, 0x02, 0x21, 0x88, 0x43, 0x3f, 0x49, + 0x08, 0x60, 0x08, 0x1c, 0x00, 0x68, 0x02, 0x21, + 0x08, 0x43, 0x3c, 0x49, 0x08, 0x60, 0x3c, 0x48, + 0x3c, 0x00, 0xdc, 0x15, 0x04, 0x00, 0x40, 0x68, + 0x80, 0x21, 0x88, 0x43, 0x3a, 0x49, 0x48, 0x60, + 0x08, 0x1c, 0x00, 0x68, 0x80, 0x21, 0x08, 0x43, + 0x37, 0x49, 0x08, 0x60, 0x37, 0x48, 0x01, 0x7a, + 0x01, 0x24, 0x21, 0x43, 0x01, 0x72, 0x01, 0x7a, + 0x02, 0x22, 0x11, 0x43, 0x01, 0x72, 0x01, 0x7a, + 0x04, 0x22, 0x91, 0x43, 0x01, 0x72, 0x01, 0x7a, + 0x08, 0x22, 0x11, 0x43, 0x01, 0x72, 0x01, 0x7b, + 0x21, 0x43, 0x3c, 0x00, 0x18, 0x16, 0x04, 0x00, + 0x01, 0x73, 0x01, 0x7b, 0x02, 0x22, 0x11, 0x43, + 0x01, 0x73, 0x01, 0x7b, 0x04, 0x22, 0x11, 0x43, + 0x01, 0x73, 0x01, 0x7b, 0x08, 0x22, 0x11, 0x43, + 0x01, 0x73, 0x2e, 0x21, 0x41, 0x73, 0x81, 0x7b, + 0x38, 0x22, 0x91, 0x43, 0x28, 0x31, 0x81, 0x73, + 0x20, 0x21, 0x41, 0x74, 0x81, 0x7b, 0xc9, 0x08, + 0xc9, 0x00, 0x03, 0x31, 0x81, 0x73, 0x22, 0x21, + 0xc1, 0x73, 0x20, 0x49, 0x3c, 0x00, 0x54, 0x16, + 0x04, 0x00, 0x09, 0x7a, 0x41, 0x72, 0x1e, 0x49, + 0x49, 0x7a, 0x01, 0x74, 0x3c, 0x22, 0x02, 0x77, + 0x01, 0x1c, 0x10, 0x31, 0x4a, 0x73, 0x50, 0x23, + 0x8b, 0x73, 0x5a, 0x23, 0xcb, 0x73, 0x0d, 0x23, + 0x01, 0x1c, 0x20, 0x31, 0x0b, 0x70, 0x17, 0x4b, + 0x43, 0x84, 0x0e, 0x23, 0x4b, 0x70, 0x00, 0x21, + 0x41, 0x82, 0x30, 0x21, 0x01, 0x70, 0x05, 0x21, + 0x41, 0x70, 0x04, 0x21, 0x41, 0x71, 0x3c, 0x00, + 0x90, 0x16, 0x04, 0x00, 0x84, 0x71, 0xc4, 0x71, + 0x0c, 0x21, 0x01, 0x71, 0xf8, 0x21, 0x41, 0x80, + 0x0f, 0x49, 0xca, 0x72, 0x8a, 0x72, 0x03, 0x22, + 0x0a, 0x72, 0x09, 0x22, 0x4a, 0x72, 0x08, 0x22, + 0x0a, 0x73, 0x02, 0x7a, 0x40, 0x23, 0x1a, 0x43, + 0x02, 0x72, 0x4c, 0x73, 0xff, 0xf7, 0xa2, 0xfc, + 0x08, 0x48, 0x01, 0x78, 0x21, 0x43, 0x01, 0x70, + 0x10, 0xbd, 0x00, 0x00, 0xf0, 0x00, 0x07, 0x00, + 0x3c, 0x00, 0xcc, 0x16, 0x04, 0x00, 0xf4, 0x00, + 0x07, 0x00, 0x0c, 0x80, 0x07, 0x00, 0x76, 0x46, + 0x01, 0x00, 0x24, 0x09, 0x00, 0x00, 0x80, 0x80, + 0x07, 0x00, 0xa0, 0x80, 0x07, 0x00, 0x80, 0xb5, + 0x18, 0x21, 0x09, 0x48, 0xbe, 0xf7, 0xd7, 0xfe, + 0x08, 0x48, 0x00, 0x21, 0x3c, 0x38, 0x41, 0x60, + 0x81, 0x60, 0xc1, 0x60, 0x01, 0x61, 0x41, 0x61, + 0x81, 0x61, 0x01, 0x21, 0x01, 0x62, 0xff, 0xf7, + 0x5c, 0xff, 0x3c, 0x00, 0x08, 0x17, 0x04, 0x00, + 0xc0, 0xf7, 0x6c, 0xff, 0x80, 0xbd, 0x00, 0x00, + 0x24, 0x7e, 0x01, 0x00, 0xb0, 0xb5, 0x21, 0x48, + 0x00, 0x68, 0x40, 0x08, 0x1f, 0x49, 0x40, 0x00, + 0x08, 0x60, 0x08, 0x1c, 0x00, 0x68, 0x01, 0x21, + 0x08, 0x43, 0x1c, 0x49, 0x08, 0x60, 0x1c, 0x4a, + 0x10, 0x79, 0x01, 0x21, 0x08, 0x43, 0x10, 0x71, + 0x10, 0x79, 0x02, 0x21, 0x88, 0x43, 0x10, 0x71, + 0x00, 0xf0, 0x6c, 0xf8, 0x3c, 0x00, 0x44, 0x17, + 0x04, 0x00, 0x10, 0x7a, 0x01, 0x21, 0x08, 0x43, + 0x10, 0x72, 0x10, 0x7a, 0xfe, 0x21, 0x88, 0x43, + 0x0a, 0x30, 0x10, 0x72, 0x28, 0x20, 0x90, 0x72, + 0x5a, 0x20, 0xd0, 0x72, 0x11, 0x4d, 0x14, 0x20, + 0x28, 0x77, 0x2c, 0x1c, 0x10, 0x34, 0xa0, 0x73, + 0x16, 0x20, 0xa8, 0x75, 0x18, 0x20, 0xe8, 0x75, + 0xff, 0xf7, 0xa1, 0xfc, 0x0c, 0x48, 0x68, 0x86, + 0xe0, 0x7b, 0x40, 0x06, 0x40, 0x0e, 0x3c, 0x00, + 0x80, 0x17, 0x04, 0x00, 0x0e, 0x21, 0x08, 0x43, + 0xe0, 0x73, 0xe0, 0x7b, 0x80, 0x21, 0x08, 0x43, + 0xe0, 0x73, 0x07, 0x48, 0x41, 0x79, 0x04, 0x22, + 0x11, 0x43, 0x41, 0x71, 0xb0, 0xbd, 0x00, 0x00, + 0xf0, 0x00, 0x07, 0x00, 0x00, 0x80, 0x07, 0x00, + 0x30, 0x80, 0x07, 0x00, 0xff, 0x01, 0x00, 0x00, + 0x50, 0x00, 0x07, 0x00, 0x80, 0xb5, 0xff, 0xf7, + 0xaf, 0xff, 0x00, 0x20, 0x14, 0x49, 0xc0, 0x43, + 0x3c, 0x00, 0xbc, 0x17, 0x04, 0x00, 0x88, 0x60, + 0xc1, 0xf7, 0x0b, 0xf9, 0x13, 0x49, 0x00, 0x20, + 0x48, 0x62, 0xc8, 0x60, 0x48, 0x61, 0x08, 0x61, + 0x88, 0x61, 0xc8, 0x61, 0x0f, 0x4b, 0x08, 0x62, + 0x0f, 0x4a, 0x08, 0x63, 0x38, 0x33, 0x1a, 0x80, + 0x01, 0x22, 0x5a, 0x71, 0x0b, 0x4a, 0x40, 0x32, + 0xd0, 0x60, 0x13, 0x60, 0x08, 0x23, 0x13, 0x81, + 0x50, 0x60, 0x09, 0x4a, 0x8a, 0x62, 0xff, 0x22, + 0x0a, 0x70, 0x3c, 0x00, 0xf8, 0x17, 0x04, 0x00, + 0x48, 0x70, 0x05, 0x48, 0x00, 0x21, 0x00, 0x22, + 0x50, 0x30, 0x00, 0x23, 0x0e, 0xc0, 0xc1, 0xf7, + 0xff, 0xf8, 0x80, 0xbd, 0x00, 0x30, 0x07, 0x00, + 0x04, 0x6c, 0x01, 0x00, 0xbe, 0xba, 0x00, 0x00, + 0x85, 0x75, 0x00, 0x00, 0x03, 0x48, 0x10, 0x21, + 0x81, 0x71, 0x02, 0x21, 0xc1, 0x71, 0x30, 0x21, + 0x41, 0x72, 0x70, 0x47, 0x00, 0x80, 0x07, 0x00, + 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0x34, 0x18, + 0x04, 0x00, 0x00, 0xb5, 0xc1, 0xf7, 0xdb, 0xfb, + 0x00, 0xbd, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, + 0xcd, 0xf7, 0x87, 0xfd, 0x01, 0x49, 0x88, 0x60, + 0x80, 0xbd, 0x50, 0xd9, 0x01, 0x00, 0x80, 0xb5, + 0x06, 0x21, 0x05, 0x48, 0xbe, 0xf7, 0xfd, 0xfd, + 0x04, 0x49, 0x00, 0x20, 0x04, 0x39, 0x08, 0x60, + 0x00, 0xf0, 0x67, 0xf8, 0x00, 0xf0, 0x03, 0xf8, + 0x80, 0xbd, 0xec, 0x67, 0x01, 0x00, 0x3c, 0x00, + 0x70, 0x18, 0x04, 0x00, 0x10, 0xb5, 0x07, 0x4c, + 0x2c, 0x21, 0x20, 0x1c, 0xbe, 0xf7, 0x10, 0xfe, + 0x01, 0x20, 0x20, 0x70, 0x03, 0x49, 0x00, 0x20, + 0x1c, 0x39, 0xc8, 0x60, 0x08, 0x61, 0x88, 0x61, + 0x10, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, + 0x80, 0xb5, 0xcd, 0xf7, 0x5d, 0xfd, 0x09, 0x49, + 0x88, 0x60, 0x09, 0x49, 0x08, 0x20, 0xd0, 0xf7, + 0x73, 0xfd, 0x08, 0x49, 0x09, 0x20, 0xd0, 0xf7, + 0x3c, 0x00, 0xac, 0x18, 0x04, 0x00, 0x6f, 0xfd, + 0x07, 0x49, 0x11, 0x20, 0xd0, 0xf7, 0x6b, 0xfd, + 0x06, 0x48, 0xc2, 0xf7, 0x74, 0xf9, 0x80, 0xbd, + 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x21, 0x35, + 0x00, 0x00, 0xa1, 0x38, 0x00, 0x00, 0x45, 0x34, + 0x00, 0x00, 0xbd, 0x26, 0x01, 0x00, 0x80, 0xb5, + 0x86, 0xb0, 0x0f, 0x48, 0xc4, 0xf7, 0x45, 0xf9, + 0x00, 0xf0, 0x45, 0xf8, 0xff, 0xf7, 0xd7, 0xff, + 0xff, 0xf7, 0x3c, 0x00, 0xe8, 0x18, 0x04, 0x00, + 0xab, 0xff, 0x0c, 0x49, 0x03, 0x20, 0xd0, 0xf7, + 0x4d, 0xfd, 0x0b, 0x48, 0x69, 0x46, 0x00, 0x90, + 0x00, 0x20, 0x01, 0x90, 0x09, 0x48, 0x04, 0x90, + 0x09, 0x48, 0x02, 0x90, 0x09, 0x48, 0x03, 0x90, + 0x09, 0x48, 0x05, 0x90, 0x00, 0x20, 0xc4, 0xf7, + 0xcf, 0xf8, 0x06, 0xb0, 0x80, 0xbd, 0x00, 0x00, + 0xf4, 0x67, 0x01, 0x00, 0x45, 0x35, 0x00, 0x00, + 0x95, 0x32, 0x00, 0x00, 0x3c, 0x00, 0x24, 0x19, + 0x04, 0x00, 0xa0, 0x7d, 0x01, 0x00, 0xfd, 0x32, + 0x00, 0x00, 0xcd, 0x31, 0x00, 0x00, 0x45, 0x7d, + 0x01, 0x00, 0x10, 0xb5, 0xcd, 0xf7, 0xd5, 0xfc, + 0x09, 0x48, 0x09, 0x4c, 0x30, 0x21, 0x60, 0x61, + 0x08, 0x48, 0x74, 0x30, 0xbe, 0xf7, 0xa9, 0xfd, + 0x00, 0x20, 0xa0, 0x62, 0x06, 0x49, 0x20, 0x61, + 0xe1, 0x63, 0x60, 0x64, 0xa0, 0x64, 0x14, 0x21, + 0x21, 0x65, 0x60, 0x62, 0x10, 0xbd, 0x3c, 0x00, + 0x60, 0x19, 0x04, 0x00, 0xb9, 0x75, 0x00, 0x00, + 0x44, 0x7d, 0x01, 0x00, 0x70, 0x17, 0x00, 0x00, + 0x80, 0xb5, 0x02, 0x21, 0x09, 0x20, 0x04, 0x4a, + 0xd1, 0xf7, 0xe8, 0xfe, 0xcd, 0xf7, 0xec, 0xfc, + 0x02, 0x49, 0x08, 0x63, 0x80, 0xbd, 0x00, 0x00, + 0x39, 0x39, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, + 0x80, 0xb5, 0xac, 0x21, 0x03, 0x48, 0xbe, 0xf7, + 0x83, 0xfd, 0x00, 0xf0, 0x51, 0xf8, 0x00, 0xf0, + 0x3c, 0x00, 0x9c, 0x19, 0x04, 0x00, 0x49, 0xf8, + 0x80, 0xbd, 0xa4, 0x6c, 0x01, 0x00, 0x08, 0xb5, + 0x00, 0xf0, 0x4d, 0xf8, 0x00, 0xf0, 0x45, 0xf8, + 0x00, 0x21, 0x16, 0x20, 0x18, 0x4a, 0xd1, 0xf7, + 0xc8, 0xfe, 0x17, 0x4a, 0x04, 0x21, 0x10, 0x1c, + 0x40, 0x30, 0x01, 0x70, 0x00, 0x21, 0x81, 0x70, + 0x11, 0x21, 0xc1, 0x80, 0x14, 0x49, 0x01, 0x81, + 0x10, 0x1c, 0x80, 0x30, 0xc1, 0x78, 0x08, 0x22, + 0x91, 0x43, 0x3c, 0x00, 0xd8, 0x19, 0x04, 0x00, + 0xc1, 0x70, 0xc1, 0x78, 0x11, 0x43, 0xc1, 0x70, + 0x6a, 0x46, 0x0f, 0x49, 0x14, 0x20, 0xbf, 0xf7, + 0xf5, 0xfa, 0x0e, 0x49, 0x07, 0x20, 0xd0, 0xf7, + 0xcd, 0xfc, 0x0d, 0x49, 0x0f, 0x20, 0xd0, 0xf7, + 0xc9, 0xfc, 0xcd, 0xf7, 0xab, 0xfc, 0x0b, 0x49, + 0x08, 0x60, 0x0a, 0x48, 0x44, 0x38, 0x80, 0x68, + 0x00, 0x28, 0x02, 0xd0, 0x00, 0x20, 0xc6, 0xf7, + 0x6f, 0xf9, 0x08, 0xbd, 0x3c, 0x00, 0x14, 0x1a, + 0x04, 0x00, 0xb5, 0x3b, 0x00, 0x00, 0x00, 0x90, + 0x07, 0x00, 0xe7, 0xfd, 0x00, 0x00, 0x8d, 0x41, + 0x00, 0x00, 0xcd, 0x48, 0x00, 0x00, 0xd9, 0x49, + 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x80, 0xb5, + 0x00, 0xf0, 0x6f, 0xfc, 0x80, 0xbd, 0x70, 0x47, + 0x00, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x61, 0xfc, + 0x80, 0xbd, 0x70, 0x47, 0x00, 0x00, 0xb0, 0xb5, + 0x30, 0x21, 0x0c, 0x48, 0xbe, 0xf7, 0x3c, 0x00, + 0x50, 0x1a, 0x04, 0x00, 0x25, 0xfd, 0x0b, 0x4c, + 0x00, 0x25, 0x0a, 0x48, 0x84, 0x3c, 0x38, 0x22, + 0x03, 0x21, 0x70, 0x38, 0x65, 0x60, 0xbe, 0xf7, + 0xdd, 0xfd, 0x06, 0x48, 0x38, 0x22, 0x01, 0x21, + 0x38, 0x38, 0xbe, 0xf7, 0xd7, 0xfd, 0x0e, 0x20, + 0xa5, 0x60, 0x60, 0x70, 0x20, 0x70, 0x00, 0xf0, + 0x1d, 0xf8, 0xb0, 0xbd, 0x94, 0x67, 0x01, 0x00, + 0x04, 0x49, 0x00, 0xb5, 0x01, 0x20, 0x48, 0x60, + 0x3c, 0x00, 0x8c, 0x1a, 0x04, 0x00, 0x88, 0x60, + 0xc8, 0x60, 0xc3, 0xf7, 0xf8, 0xff, 0x00, 0xbd, + 0x00, 0x00, 0xd4, 0x67, 0x01, 0x00, 0x80, 0xb5, + 0x02, 0x21, 0x0a, 0x20, 0x02, 0x4a, 0xd1, 0xf7, + 0x50, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x1d, 0x5a, + 0x00, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x05, 0xf8, + 0x80, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0xfd, 0xfb, + 0x80, 0xbd, 0x80, 0xb5, 0x02, 0x49, 0x04, 0x20, + 0xd0, 0xf7, 0x3c, 0x00, 0xc8, 0x1a, 0x04, 0x00, + 0x61, 0xfc, 0x80, 0xbd, 0x65, 0x1f, 0x00, 0x00, + 0x00, 0x21, 0x17, 0x48, 0xc9, 0x43, 0x80, 0xb5, + 0x16, 0x4b, 0x01, 0x70, 0x18, 0x1c, 0x10, 0x22, + 0x20, 0x30, 0x02, 0x71, 0x00, 0x22, 0x10, 0x33, + 0x9a, 0x73, 0x42, 0x79, 0x04, 0x23, 0x1a, 0x43, + 0x42, 0x71, 0x42, 0x79, 0x18, 0x23, 0x9a, 0x43, + 0x08, 0x32, 0x42, 0x71, 0x08, 0x1c, 0xd7, 0xf7, + 0x59, 0xf8, 0x00, 0x28, 0x3c, 0x00, 0x04, 0x1b, + 0x04, 0x00, 0x03, 0xd1, 0x01, 0x21, 0x9a, 0x20, + 0xbf, 0xf7, 0xcb, 0xfb, 0x50, 0x20, 0x09, 0x49, + 0x50, 0x22, 0x0a, 0x60, 0xc8, 0x60, 0x88, 0x60, + 0x48, 0x60, 0x08, 0x61, 0x01, 0x20, 0x48, 0x61, + 0x00, 0x20, 0xd7, 0xf7, 0xd8, 0xf8, 0x04, 0x49, + 0xff, 0x20, 0x08, 0x60, 0x80, 0xbd, 0xf4, 0x6b, + 0x01, 0x00, 0x30, 0x00, 0x07, 0x00, 0x04, 0x02, + 0x07, 0x00, 0xf4, 0x74, 0x01, 0x00, 0x3c, 0x00, + 0x40, 0x1b, 0x04, 0x00, 0x80, 0xb5, 0xd7, 0xf7, + 0xfb, 0xf8, 0x80, 0xbd, 0x10, 0xb5, 0xff, 0xf7, + 0xab, 0xfb, 0xbf, 0xf7, 0xdd, 0xfb, 0x81, 0x48, + 0xcd, 0xf7, 0x98, 0xfa, 0x00, 0x24, 0x23, 0x1c, + 0x04, 0x22, 0x04, 0x21, 0x00, 0x20, 0x01, 0xf0, + 0x39, 0xfa, 0x00, 0x28, 0x01, 0xd0, 0xbf, 0xf7, + 0xc9, 0xfb, 0x23, 0x1c, 0x00, 0x22, 0xff, 0x21, + 0x00, 0x20, 0x01, 0xf0, 0x2f, 0xfa, 0x00, 0x28, + 0x3c, 0x00, 0x7c, 0x1b, 0x04, 0x00, 0x01, 0xd0, + 0xbf, 0xf7, 0xbf, 0xfb, 0x23, 0x1c, 0x00, 0x22, + 0xff, 0x21, 0x00, 0x20, 0x01, 0xf0, 0x25, 0xfa, + 0x00, 0x28, 0x01, 0xd0, 0xbf, 0xf7, 0xb5, 0xfb, + 0xc4, 0xf7, 0x27, 0xff, 0x70, 0x48, 0x84, 0x70, + 0x6f, 0x49, 0x7f, 0x20, 0x88, 0x70, 0x6e, 0x49, + 0x0c, 0x60, 0x03, 0x20, 0x08, 0x60, 0x6b, 0x48, + 0x44, 0x70, 0x6c, 0x48, 0x04, 0x80, 0x69, 0x48, + 0xc0, 0x78, 0x3c, 0x00, 0xb8, 0x1b, 0x04, 0x00, + 0x08, 0x21, 0x08, 0x43, 0x67, 0x49, 0xc8, 0x70, + 0x08, 0x1c, 0xc0, 0x78, 0x04, 0x21, 0x08, 0x43, + 0x64, 0x49, 0xc8, 0x70, 0x01, 0xf0, 0x7e, 0xfa, + 0xff, 0xf7, 0x7e, 0xff, 0xff, 0xf7, 0x2c, 0xfe, + 0x01, 0xf0, 0x46, 0xfb, 0xff, 0xf7, 0x18, 0xfb, + 0x01, 0xf0, 0x52, 0xfa, 0xff, 0xf7, 0x82, 0xfb, + 0x5f, 0x48, 0xc1, 0x68, 0x10, 0x22, 0x91, 0x43, + 0xc1, 0x60, 0x01, 0x69, 0x3c, 0x00, 0xf4, 0x1b, + 0x04, 0x00, 0x5d, 0x4a, 0x11, 0x43, 0x01, 0x61, + 0x01, 0x69, 0xd2, 0x0a, 0x91, 0x43, 0x01, 0x61, + 0xc1, 0x68, 0x5a, 0x4a, 0x11, 0x43, 0xc1, 0x60, + 0x81, 0x6a, 0x59, 0x4a, 0x11, 0x43, 0x81, 0x62, + 0x00, 0xf0, 0x77, 0xf9, 0x01, 0xf0, 0x1f, 0xf8, + 0x00, 0xf0, 0x93, 0xfa, 0x01, 0xf0, 0x99, 0xfb, + 0x00, 0xf0, 0xf1, 0xff, 0x00, 0xf0, 0x99, 0xfc, + 0x00, 0xf0, 0xdd, 0xfc, 0x00, 0xf0, 0x3c, 0x00, + 0x30, 0x1c, 0x04, 0x00, 0x83, 0xfc, 0xff, 0xf7, + 0xb3, 0xfc, 0x01, 0xf0, 0x31, 0xfa, 0x01, 0xf0, + 0x71, 0xfa, 0xff, 0xf7, 0x87, 0xfa, 0xff, 0xf7, + 0x9b, 0xfa, 0x01, 0x21, 0x01, 0x20, 0x4b, 0x4a, + 0xd1, 0xf7, 0x7c, 0xfd, 0x01, 0x21, 0x02, 0x20, + 0x49, 0x4a, 0xd1, 0xf7, 0x77, 0xfd, 0x02, 0x21, + 0x03, 0x20, 0x48, 0x4a, 0xd1, 0xf7, 0x72, 0xfd, + 0x02, 0x21, 0x04, 0x20, 0x46, 0x4a, 0xd1, 0xf7, + 0x3c, 0x00, 0x6c, 0x1c, 0x04, 0x00, 0x6d, 0xfd, + 0x02, 0x21, 0x05, 0x20, 0x45, 0x4a, 0xd1, 0xf7, + 0x68, 0xfd, 0x02, 0x21, 0x06, 0x20, 0x43, 0x4a, + 0xd1, 0xf7, 0x63, 0xfd, 0x01, 0x21, 0x07, 0x20, + 0x42, 0x4a, 0xd1, 0xf7, 0x5e, 0xfd, 0x02, 0x21, + 0x17, 0x20, 0x40, 0x4a, 0xd1, 0xf7, 0x59, 0xfd, + 0x02, 0x21, 0x08, 0x20, 0x3f, 0x4a, 0xd1, 0xf7, + 0x54, 0xfd, 0xff, 0xf7, 0xc8, 0xfd, 0x3d, 0x48, + 0x04, 0x60, 0x3c, 0x00, 0xa8, 0x1c, 0x04, 0x00, + 0x44, 0x60, 0xff, 0xf7, 0x17, 0xfa, 0xff, 0xf7, + 0x09, 0xfa, 0xff, 0xf7, 0x4f, 0xfc, 0x00, 0xf0, + 0x43, 0xf9, 0xff, 0xf7, 0x33, 0xfa, 0xff, 0xf7, + 0xfb, 0xfa, 0x01, 0xf0, 0x85, 0xf8, 0x01, 0xf0, + 0xeb, 0xf9, 0x01, 0xf0, 0x23, 0xfa, 0x01, 0xf0, + 0x71, 0xf9, 0x00, 0xf0, 0xe3, 0xff, 0xff, 0xf7, + 0x6f, 0xfa, 0x00, 0xf0, 0xaf, 0xf9, 0x00, 0xf0, + 0xbd, 0xf9, 0x00, 0xf0, 0x3c, 0x00, 0xe4, 0x1c, + 0x04, 0x00, 0xad, 0xfc, 0x00, 0xf0, 0x9b, 0xfe, + 0xff, 0xf7, 0xcd, 0xfa, 0xff, 0xf7, 0xab, 0xfe, + 0x00, 0xf0, 0xc3, 0xf9, 0xff, 0xf7, 0xab, 0xfd, + 0x00, 0xf0, 0x8d, 0xff, 0x00, 0xf0, 0x21, 0xff, + 0x00, 0xf0, 0x65, 0xf9, 0x00, 0xf0, 0x97, 0xf9, + 0x00, 0xf0, 0xfd, 0xfe, 0x00, 0xf0, 0xe5, 0xfe, + 0x00, 0xf0, 0x3f, 0xf9, 0x00, 0xf0, 0x73, 0xf9, + 0xff, 0xf7, 0x37, 0xfe, 0x00, 0xf0, 0x3c, 0x00, + 0x20, 0x1d, 0x04, 0x00, 0x21, 0xf9, 0x00, 0xf0, + 0x73, 0xfb, 0xff, 0xf7, 0xe5, 0xfb, 0x00, 0xf0, + 0xd3, 0xfb, 0xff, 0xf7, 0xa9, 0xfe, 0x00, 0xf0, + 0xbb, 0xfb, 0x00, 0xf0, 0x09, 0xff, 0x00, 0xf0, + 0xdb, 0xf9, 0x18, 0x48, 0xc9, 0xf7, 0x56, 0xf8, + 0x17, 0x48, 0xc9, 0xf7, 0x2b, 0xf8, 0x00, 0x22, + 0x01, 0x21, 0xf0, 0x20, 0xd1, 0xf7, 0x2e, 0xfd, + 0x00, 0x20, 0x10, 0xbd, 0xa9, 0x69, 0x00, 0x00, + 0x3c, 0x00, 0x5c, 0x1d, 0x04, 0x00, 0x00, 0x00, + 0x07, 0x00, 0xf0, 0x00, 0x07, 0x00, 0x2c, 0x00, + 0x07, 0x00, 0x00, 0x10, 0x07, 0x00, 0x3c, 0x00, + 0x08, 0x00, 0xc0, 0x3f, 0x74, 0x38, 0xfc, 0xdf, + 0x7f, 0x38, 0x55, 0x69, 0x00, 0x00, 0xe5, 0x13, + 0x00, 0x00, 0x61, 0x0c, 0x00, 0x00, 0x6d, 0x0c, + 0x00, 0x00, 0x3d, 0x0c, 0x00, 0x00, 0xf1, 0x0d, + 0x00, 0x00, 0xc5, 0x33, 0x00, 0x00, 0x3d, 0x0f, + 0x00, 0x00, 0x3c, 0x00, 0x98, 0x1d, 0x04, 0x00, + 0xad, 0xd8, 0x00, 0x00, 0x80, 0x00, 0x07, 0x00, + 0x50, 0x57, 0x01, 0x00, 0x04, 0x40, 0x01, 0x00, + 0x80, 0xb5, 0x01, 0xf0, 0xa9, 0xf9, 0x00, 0xf0, + 0xc9, 0xf8, 0xff, 0xf7, 0xc5, 0xfe, 0x01, 0xf0, + 0x03, 0xfb, 0x01, 0xf0, 0x93, 0xfa, 0xff, 0xf7, + 0xcb, 0xf9, 0x2c, 0x48, 0xff, 0xf7, 0xe8, 0xf9, + 0x00, 0xf0, 0xaa, 0xf8, 0x00, 0xf0, 0x58, 0xff, + 0xff, 0xf7, 0x34, 0xfd, 0x3c, 0x00, 0xd4, 0x1d, + 0x04, 0x00, 0xff, 0xf7, 0xf2, 0xfb, 0xff, 0xf7, + 0x7a, 0xfa, 0xff, 0xf7, 0x00, 0xfa, 0x00, 0xf0, + 0x34, 0xf9, 0x00, 0xf0, 0x3c, 0xf9, 0x01, 0xf0, + 0xe2, 0xf8, 0xff, 0xf7, 0x7a, 0xf9, 0xff, 0xf7, + 0x72, 0xf9, 0xff, 0xf7, 0x9a, 0xf9, 0x01, 0xf0, + 0x66, 0xf9, 0x01, 0xf0, 0x8e, 0xf9, 0x01, 0xf0, + 0xe0, 0xf8, 0x00, 0xf0, 0x06, 0xff, 0x00, 0xf0, + 0xf0, 0xfb, 0x00, 0xf0, 0x46, 0xfb, 0x3c, 0x00, + 0x10, 0x1e, 0x04, 0x00, 0x00, 0xf0, 0xbc, 0xff, + 0x00, 0xf0, 0xe4, 0xfc, 0x00, 0xf0, 0x20, 0xfe, + 0xff, 0xf7, 0x40, 0xfa, 0xff, 0xf7, 0x46, 0xfe, + 0xff, 0xf7, 0x56, 0xfd, 0x00, 0xf0, 0x2c, 0xf9, + 0x00, 0xf0, 0xfa, 0xfe, 0x00, 0xf0, 0x8a, 0xfe, + 0x00, 0xf0, 0xd4, 0xf8, 0x00, 0xf0, 0xb4, 0xf8, + 0x00, 0xf0, 0x78, 0xfe, 0x00, 0xf0, 0x4e, 0xfe, + 0x00, 0xf0, 0xde, 0xf8, 0xff, 0xf7, 0xac, 0xfd, + 0x3c, 0x00, 0x4c, 0x1e, 0x04, 0x00, 0x00, 0xf0, + 0x8c, 0xf8, 0x00, 0xf0, 0xf8, 0xfa, 0xff, 0xf7, + 0x76, 0xfb, 0xff, 0xf7, 0x20, 0xfe, 0x01, 0xf0, + 0xa6, 0xfa, 0x00, 0xf0, 0x48, 0xfb, 0x00, 0xf0, + 0x7c, 0xfe, 0x00, 0xf0, 0x5c, 0xf9, 0xbe, 0xf7, + 0x57, 0xfd, 0x00, 0x20, 0x80, 0xbd, 0x80, 0x38, + 0x01, 0x00, 0x01, 0x49, 0x00, 0x20, 0x08, 0x60, + 0x70, 0x47, 0xa8, 0x7e, 0x01, 0x00, 0x10, 0xb5, + 0x04, 0x1c, 0x3c, 0x00, 0x88, 0x1e, 0x04, 0x00, + 0x01, 0xd1, 0xbf, 0xf7, 0x39, 0xfa, 0x0f, 0x48, + 0x7d, 0x21, 0xc9, 0x00, 0x84, 0x60, 0x01, 0x80, + 0x0d, 0x49, 0x01, 0x61, 0x80, 0x21, 0x41, 0x80, + 0x00, 0x21, 0xc1, 0x60, 0x01, 0x62, 0x0b, 0x48, + 0x41, 0x80, 0x14, 0x21, 0x81, 0x80, 0x07, 0x21, + 0x41, 0x81, 0x06, 0x4a, 0x46, 0x23, 0x04, 0x32, + 0x05, 0x24, 0x13, 0x70, 0x54, 0x70, 0x0a, 0x21, + 0x91, 0x70, 0x81, 0x76, 0x3c, 0x00, 0xc4, 0x1e, + 0x04, 0x00, 0x03, 0x76, 0x04, 0x81, 0x10, 0xbd, + 0x00, 0x00, 0xc8, 0x74, 0x01, 0x00, 0x00, 0x87, + 0x93, 0x03, 0x30, 0x00, 0x07, 0x00, 0x09, 0x48, + 0x80, 0xb5, 0x01, 0x69, 0x42, 0x69, 0x11, 0x43, + 0x82, 0x69, 0xc0, 0x69, 0x11, 0x43, 0x01, 0x43, + 0x00, 0x22, 0x03, 0x20, 0xc6, 0xf7, 0xbf, 0xfc, + 0xcc, 0xf7, 0x1b, 0xfa, 0x00, 0x20, 0xc2, 0xf7, + 0x92, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, + 0x00, 0x1f, 0x04, 0x00, 0xa4, 0x6c, 0x01, 0x00, + 0x05, 0x48, 0x80, 0xb5, 0x00, 0x21, 0x81, 0x60, + 0x02, 0x21, 0xc1, 0x60, 0x03, 0x39, 0x41, 0x60, + 0xc7, 0xf7, 0x3a, 0xff, 0x80, 0xbd, 0x00, 0x00, + 0x40, 0x20, 0x07, 0x00, 0x08, 0xb5, 0x6a, 0x46, + 0x04, 0x49, 0x15, 0x20, 0xbf, 0xf7, 0x54, 0xf8, + 0x01, 0x20, 0x03, 0x49, 0x40, 0x05, 0x08, 0x60, + 0x48, 0x60, 0x08, 0xbd, 0xa5, 0x21, 0x01, 0x00, + 0x3c, 0x00, 0x3c, 0x1f, 0x04, 0x00, 0x00, 0x10, + 0x07, 0x00, 0x70, 0x47, 0x00, 0x00, 0x06, 0x48, + 0x80, 0xb5, 0x80, 0x68, 0xc0, 0x01, 0x80, 0x0f, + 0x05, 0xd1, 0x03, 0x22, 0xc1, 0x43, 0xc6, 0xf7, + 0xba, 0xfc, 0xd6, 0xf7, 0x00, 0xfe, 0x80, 0xbd, + 0x00, 0x00, 0x10, 0x00, 0x07, 0x00, 0x70, 0x47, + 0x00, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x2a, 0x20, + 0x06, 0x4a, 0xd1, 0xf7, 0xea, 0xfb, 0x00, 0x22, + 0x07, 0x20, 0x3c, 0x00, 0x78, 0x1f, 0x04, 0x00, + 0x04, 0x49, 0xbe, 0xf7, 0xed, 0xfe, 0x04, 0x48, + 0xc7, 0xf7, 0x58, 0xfc, 0x80, 0xbd, 0x00, 0x00, + 0x8d, 0x89, 0x00, 0x00, 0xd5, 0x9b, 0x00, 0x00, + 0x10, 0x46, 0x01, 0x00, 0x02, 0x48, 0x00, 0x21, + 0x00, 0x22, 0x00, 0x23, 0x0e, 0xc0, 0x70, 0x47, + 0x80, 0x6e, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, + 0x2c, 0x20, 0x06, 0x4a, 0xd1, 0xf7, 0xcc, 0xfb, + 0x00, 0x22, 0x00, 0x20, 0x3c, 0x00, 0xb4, 0x1f, + 0x04, 0x00, 0x04, 0x49, 0xbe, 0xf7, 0xcf, 0xfe, + 0x04, 0x49, 0x02, 0x20, 0xc8, 0xf7, 0x0b, 0xfa, + 0x80, 0xbd, 0x05, 0x8a, 0x00, 0x00, 0xe9, 0x9b, + 0x00, 0x00, 0xb1, 0x8b, 0x00, 0x00, 0x02, 0x48, + 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x0e, 0xc0, + 0x70, 0x47, 0x10, 0x75, 0x01, 0x00, 0x80, 0xb5, + 0x02, 0x21, 0x2b, 0x20, 0x04, 0x4a, 0xd1, 0xf7, + 0xae, 0xfb, 0x00, 0x22, 0x02, 0x20, 0x3c, 0x00, + 0xf0, 0x1f, 0x04, 0x00, 0x02, 0x49, 0xbe, 0xf7, + 0xb1, 0xfe, 0x80, 0xbd, 0x2d, 0x8a, 0x00, 0x00, + 0x8d, 0x8c, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x80, 0xb5, 0x02, 0x21, 0x2d, 0x20, 0x07, 0x4a, + 0xd1, 0xf7, 0x9c, 0xfb, 0x00, 0x22, 0x01, 0x20, + 0x05, 0x49, 0xbe, 0xf7, 0x9f, 0xfe, 0x05, 0x48, + 0xcb, 0xf7, 0x56, 0xfa, 0x04, 0x48, 0xcc, 0xf7, + 0xf7, 0xf8, 0x80, 0xbd, 0xad, 0x8a, 0x00, 0x00, + 0x3c, 0x00, 0x2c, 0x20, 0x04, 0x00, 0x21, 0xe2, + 0x00, 0x00, 0xf9, 0xdf, 0x00, 0x00, 0x20, 0x44, + 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x02, 0x49, + 0x00, 0x20, 0x08, 0x60, 0x01, 0x20, 0x48, 0x60, + 0x70, 0x47, 0xac, 0x79, 0x01, 0x00, 0x80, 0xb5, + 0x02, 0x49, 0x0d, 0x20, 0xd0, 0xf7, 0x9b, 0xf9, + 0x80, 0xbd, 0x61, 0x98, 0x00, 0x00, 0x70, 0x47, + 0x00, 0x00, 0x80, 0xb5, 0xcd, 0xf7, 0x77, 0xf9, + 0x03, 0x49, 0x3c, 0x00, 0x68, 0x20, 0x04, 0x00, + 0x08, 0x60, 0x01, 0x1c, 0x02, 0x48, 0xcd, 0xf7, + 0x97, 0xf9, 0x80, 0xbd, 0xa8, 0x79, 0x01, 0x00, + 0xc4, 0x60, 0x01, 0x00, 0x80, 0xb5, 0x00, 0xf0, + 0x29, 0xf8, 0x80, 0xbd, 0x80, 0xb5, 0x86, 0xb0, + 0x0c, 0x48, 0xc3, 0xf7, 0x6d, 0xfd, 0xd6, 0xf7, + 0xd3, 0xfb, 0x0b, 0x48, 0x0d, 0x49, 0x00, 0x90, + 0x0a, 0x48, 0x04, 0x91, 0x01, 0x90, 0x0a, 0x48, + 0x69, 0x46, 0x02, 0x90, 0x3c, 0x00, 0xa4, 0x20, + 0x04, 0x00, 0x00, 0x20, 0x03, 0x90, 0x05, 0x90, + 0x01, 0x20, 0xc3, 0xf7, 0x00, 0xfd, 0x07, 0x49, + 0x03, 0x20, 0xd0, 0xf7, 0x6a, 0xf9, 0x06, 0xb0, + 0x80, 0xbd, 0x20, 0xf7, 0x01, 0x00, 0x11, 0x87, + 0x01, 0x00, 0x95, 0x87, 0x01, 0x00, 0x55, 0x87, + 0x01, 0x00, 0x98, 0xd9, 0x01, 0x00, 0x6d, 0x87, + 0x01, 0x00, 0x80, 0xb5, 0x01, 0x20, 0xd6, 0xf7, + 0x90, 0xfc, 0x03, 0x49, 0x00, 0x20, 0x3c, 0x00, + 0xe0, 0x20, 0x04, 0x00, 0x08, 0x60, 0x48, 0x60, + 0x02, 0x48, 0x14, 0x39, 0x48, 0x60, 0x80, 0xbd, + 0x90, 0xd9, 0x01, 0x00, 0x3d, 0x82, 0x01, 0x00, + 0x70, 0xb5, 0x00, 0x26, 0x09, 0x4c, 0x09, 0x4d, + 0x26, 0x60, 0x66, 0x60, 0x44, 0x21, 0x50, 0x35, + 0x28, 0x1c, 0xa6, 0x61, 0xbe, 0xf7, 0xc8, 0xf9, + 0x14, 0x20, 0xe0, 0x60, 0xe8, 0x63, 0x28, 0x20, + 0xe8, 0x61, 0xa0, 0x60, 0x28, 0x64, 0x2e, 0x70, + 0x3c, 0x00, 0x1c, 0x21, 0x04, 0x00, 0x70, 0xbd, + 0x00, 0x00, 0xa4, 0x6e, 0x01, 0x00, 0x80, 0xb5, + 0x02, 0x21, 0x18, 0x20, 0x04, 0x4a, 0xd1, 0xf7, + 0x0c, 0xfb, 0x03, 0x49, 0x08, 0x20, 0xd0, 0xf7, + 0x2a, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x15, 0x9c, + 0x00, 0x00, 0x69, 0x9c, 0x00, 0x00, 0xfe, 0xb5, + 0x26, 0x4d, 0x28, 0x78, 0xc0, 0x07, 0x0c, 0xd4, + 0x25, 0x49, 0x00, 0x20, 0x08, 0x70, 0x28, 0x70, + 0x24, 0x48, 0x3c, 0x00, 0x58, 0x21, 0x04, 0x00, + 0x81, 0x78, 0x49, 0x08, 0x49, 0x00, 0x81, 0x70, + 0x81, 0x78, 0x01, 0x22, 0x11, 0x43, 0x81, 0x70, + 0x00, 0x24, 0xff, 0x26, 0x1f, 0x4f, 0x01, 0x36, + 0x21, 0x1c, 0x01, 0xa8, 0xc6, 0xf7, 0x32, 0xf8, + 0x00, 0xab, 0x18, 0x79, 0x01, 0x28, 0x1f, 0xd0, + 0x02, 0x28, 0x19, 0xd0, 0x03, 0x28, 0x1e, 0xd1, + 0xb8, 0x68, 0x00, 0x21, 0xb0, 0x43, 0xb8, 0x60, + 0x78, 0x68, 0x30, 0x43, 0x3c, 0x00, 0x94, 0x21, + 0x04, 0x00, 0x78, 0x60, 0x3a, 0x68, 0x32, 0x40, + 0xa0, 0x20, 0x05, 0xe0, 0x3b, 0x68, 0x33, 0x40, + 0x93, 0x42, 0x01, 0xd0, 0x01, 0x21, 0x01, 0xe0, + 0x01, 0x38, 0xf7, 0xd2, 0x78, 0x68, 0xb0, 0x43, + 0x78, 0x60, 0x00, 0x29, 0x03, 0xd0, 0x01, 0xa8, + 0x00, 0xf0, 0x27, 0xff, 0x02, 0xe0, 0x01, 0xa8, + 0x00, 0xf0, 0x45, 0xff, 0x01, 0x34, 0x24, 0x06, + 0x24, 0x16, 0x06, 0x2c, 0xcf, 0xdb, 0x3c, 0x00, + 0xd0, 0x21, 0x04, 0x00, 0x04, 0x49, 0x02, 0x22, + 0x08, 0x78, 0x10, 0x43, 0x08, 0x70, 0x28, 0x70, + 0xfe, 0xbd, 0x00, 0x00, 0x04, 0x00, 0x07, 0x00, + 0xe0, 0x60, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, + 0x10, 0x00, 0x07, 0x00, 0xb0, 0xb5, 0x00, 0x20, + 0x15, 0x23, 0x14, 0x49, 0x01, 0x25, 0x42, 0x00, + 0x8d, 0x54, 0x52, 0x18, 0x01, 0x30, 0x0e, 0x28, + 0x53, 0x70, 0xf8, 0xd3, 0x0f, 0x48, 0x1c, 0x22, + 0x3c, 0x00, 0x0c, 0x22, 0x04, 0x00, 0x1c, 0x38, + 0xbe, 0xf7, 0x73, 0xf9, 0x0d, 0x48, 0x0e, 0x21, + 0x2a, 0x38, 0xbe, 0xf7, 0x1c, 0xf9, 0x0b, 0x49, + 0x00, 0x20, 0x08, 0x60, 0x0b, 0x4c, 0x2a, 0x21, + 0x20, 0x1c, 0xbe, 0xf7, 0x14, 0xf9, 0x25, 0x70, + 0x0e, 0x20, 0x60, 0x70, 0x17, 0x20, 0xa0, 0x70, + 0x07, 0x48, 0x53, 0x21, 0x01, 0x70, 0x45, 0x21, + 0x41, 0x70, 0x20, 0x21, 0x81, 0x70, 0xb0, 0xbd, + 0x00, 0x00, 0x3c, 0x00, 0x48, 0x22, 0x04, 0x00, + 0xe6, 0x78, 0x01, 0x00, 0xe4, 0x62, 0x01, 0x00, + 0xeb, 0x62, 0x01, 0x00, 0xe8, 0x62, 0x01, 0x00, + 0x0c, 0x49, 0x0d, 0x48, 0x00, 0x22, 0x41, 0x60, + 0x0c, 0x49, 0x81, 0x60, 0x0c, 0x49, 0xc1, 0x60, + 0x0c, 0x49, 0x01, 0x61, 0x0c, 0x49, 0x41, 0x61, + 0x0c, 0x49, 0x82, 0x61, 0xc1, 0x61, 0x0c, 0x49, + 0x01, 0x62, 0x0c, 0x49, 0x41, 0x62, 0x0c, 0x49, + 0x81, 0x62, 0x0c, 0x49, 0x3c, 0x00, 0x84, 0x22, + 0x04, 0x00, 0xc1, 0x62, 0xc2, 0x63, 0x70, 0x47, + 0x00, 0x00, 0xc9, 0x75, 0x00, 0x00, 0x28, 0x7a, + 0x01, 0x00, 0xc1, 0x75, 0x00, 0x00, 0x81, 0x75, + 0x00, 0x00, 0x99, 0x75, 0x00, 0x00, 0xcd, 0x75, + 0x00, 0x00, 0x89, 0x75, 0x00, 0x00, 0x91, 0x75, + 0x00, 0x00, 0xb5, 0x75, 0x00, 0x00, 0x8d, 0x75, + 0x00, 0x00, 0xc5, 0x75, 0x00, 0x00, 0xb0, 0xb5, + 0x0e, 0x48, 0x0e, 0x49, 0x08, 0x60, 0x3c, 0x00, + 0xc0, 0x22, 0x04, 0x00, 0x08, 0x31, 0xc0, 0xf7, + 0x43, 0xfe, 0x0c, 0x49, 0x00, 0x25, 0x48, 0x60, + 0x0b, 0x48, 0x0a, 0x4c, 0x05, 0x60, 0x0b, 0x48, + 0x80, 0x3c, 0x05, 0x60, 0x10, 0x20, 0x20, 0x71, + 0xe0, 0x70, 0xa0, 0x71, 0x60, 0x71, 0x27, 0x20, + 0xc0, 0x43, 0xc3, 0xf7, 0xf7, 0xfb, 0x28, 0x20, + 0xc3, 0xf7, 0xfc, 0xfb, 0x25, 0x72, 0xb0, 0xbd, + 0xff, 0x3f, 0x00, 0x00, 0x2c, 0x7d, 0x01, 0x00, + 0x3c, 0x00, 0xfc, 0x22, 0x04, 0x00, 0x1c, 0x67, + 0x01, 0x00, 0x20, 0x67, 0x01, 0x00, 0x80, 0xb5, + 0x2c, 0x21, 0x01, 0x48, 0xbe, 0xf7, 0xc7, 0xf8, + 0x80, 0xbd, 0x3c, 0x7e, 0x01, 0x00, 0x80, 0xb5, + 0x38, 0x21, 0x01, 0x48, 0xbe, 0xf7, 0xbf, 0xf8, + 0x80, 0xbd, 0x68, 0x7e, 0x01, 0x00, 0x80, 0xb5, + 0x02, 0x21, 0x0e, 0x20, 0x02, 0x4a, 0xd1, 0xf7, + 0x0c, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x21, 0xe0, + 0x00, 0x00, 0x3c, 0x00, 0x38, 0x23, 0x04, 0x00, + 0x70, 0x47, 0x00, 0x00, 0xf0, 0xb5, 0x85, 0xb0, + 0x00, 0x27, 0x00, 0xab, 0x2f, 0x4e, 0x1f, 0x81, + 0x00, 0x25, 0x00, 0x24, 0x28, 0x1c, 0xd6, 0xf7, + 0xa1, 0xfb, 0x02, 0x2d, 0x03, 0xd1, 0xd6, 0xf7, + 0xf5, 0xfa, 0x00, 0x28, 0x0c, 0xd0, 0x01, 0x24, + 0x01, 0x2d, 0x03, 0xd1, 0x07, 0x20, 0x00, 0xab, + 0x18, 0x71, 0x01, 0xe0, 0x00, 0xab, 0x1f, 0x71, + 0x00, 0xab, 0x18, 0x79, 0x3c, 0x00, 0x74, 0x23, + 0x04, 0x00, 0xd6, 0xf7, 0x08, 0xfc, 0x00, 0x2c, + 0x39, 0xd0, 0x08, 0x21, 0x03, 0xa8, 0xd6, 0xf7, + 0xf2, 0xfa, 0x00, 0xab, 0x18, 0x7b, 0xfe, 0x28, + 0x31, 0xd1, 0x58, 0x7b, 0x01, 0x28, 0x2a, 0xd1, + 0x02, 0x21, 0x02, 0xa8, 0xd6, 0xf7, 0xe7, 0xfa, + 0x00, 0xab, 0x18, 0x89, 0x00, 0x28, 0x26, 0xd0, + 0x18, 0x89, 0x18, 0x49, 0x88, 0x42, 0x22, 0xd0, + 0x19, 0x89, 0x00, 0x20, 0xbf, 0xf7, 0x3c, 0x00, + 0xb0, 0x23, 0x04, 0x00, 0x13, 0xf9, 0x04, 0x1c, + 0x00, 0x69, 0x00, 0xab, 0x19, 0x89, 0xd6, 0xf7, + 0xd5, 0xfa, 0x20, 0x68, 0x00, 0xab, 0x1a, 0x89, + 0x01, 0x1c, 0x08, 0x31, 0x08, 0x3a, 0xcb, 0xf7, + 0xa1, 0xf9, 0x00, 0x28, 0x06, 0xd0, 0x02, 0x28, + 0x04, 0xd0, 0x02, 0x21, 0x94, 0x20, 0x37, 0x60, + 0xbe, 0xf7, 0x62, 0xff, 0x20, 0x1c, 0xbf, 0xf7, + 0xc7, 0xf8, 0xd4, 0xe7, 0x01, 0x21, 0x94, 0x20, + 0x3c, 0x00, 0xec, 0x23, 0x04, 0x00, 0xbe, 0xf7, + 0x5a, 0xff, 0xd5, 0xf7, 0x26, 0xff, 0x01, 0x35, + 0x2d, 0x06, 0x2d, 0x0e, 0x04, 0x2d, 0xa5, 0xd3, + 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0x58, 0x57, + 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0x0a, 0x48, + 0x00, 0x21, 0x02, 0x1c, 0x18, 0x32, 0x80, 0xb5, + 0x09, 0x4b, 0x02, 0xe0, 0x01, 0x60, 0x83, 0x80, + 0x08, 0x30, 0x82, 0x42, 0xfa, 0xd1, 0x04, 0x48, + 0x6c, 0x21, 0x3c, 0x00, 0x28, 0x24, 0x04, 0x00, + 0x6c, 0x38, 0xbe, 0xf7, 0x37, 0xf8, 0x04, 0x49, + 0x02, 0x20, 0xc7, 0xf7, 0xd1, 0xff, 0x80, 0xbd, + 0x7c, 0x79, 0x01, 0x00, 0xfc, 0x05, 0x00, 0x00, + 0x9d, 0x75, 0x00, 0x00, 0x80, 0xb5, 0x02, 0x21, + 0x26, 0x20, 0x0d, 0x4a, 0xd1, 0xf7, 0x7c, 0xf9, + 0x0c, 0x48, 0xc8, 0xf7, 0x73, 0xff, 0x0c, 0x48, + 0xc8, 0xf7, 0x76, 0xff, 0x0b, 0x49, 0x10, 0x20, + 0xcf, 0xf7, 0x94, 0xff, 0x3c, 0x00, 0x64, 0x24, + 0x04, 0x00, 0x0a, 0x49, 0x0c, 0x20, 0xcf, 0xf7, + 0x90, 0xff, 0x09, 0x49, 0x00, 0x20, 0xc7, 0xf7, + 0xb2, 0xff, 0xcc, 0xf7, 0x6e, 0xff, 0x07, 0x49, + 0x08, 0x60, 0x80, 0xbd, 0x00, 0x00, 0x9d, 0xa6, + 0x00, 0x00, 0xa9, 0xa4, 0x00, 0x00, 0x81, 0xa4, + 0x00, 0x00, 0x31, 0xa7, 0x00, 0x00, 0xb9, 0x6d, + 0x00, 0x00, 0xbd, 0xa6, 0x00, 0x00, 0x0c, 0x79, + 0x01, 0x00, 0x02, 0x49, 0x08, 0x78, 0x3c, 0x00, + 0xa0, 0x24, 0x04, 0x00, 0x40, 0x08, 0x40, 0x00, + 0x08, 0x70, 0x70, 0x47, 0x58, 0x00, 0x07, 0x00, + 0x00, 0x21, 0x08, 0x48, 0x80, 0xb5, 0x41, 0x61, + 0x81, 0x61, 0x01, 0x70, 0x41, 0x70, 0x41, 0x60, + 0x81, 0x60, 0x14, 0x22, 0xc2, 0x60, 0x01, 0x61, + 0x42, 0x62, 0xc1, 0x61, 0xff, 0xf7, 0x04, 0xf8, + 0x80, 0xbd, 0x00, 0x00, 0x1c, 0x75, 0x01, 0x00, + 0x80, 0xb5, 0x02, 0x21, 0x1d, 0x20, 0x04, 0x4a, + 0x3c, 0x00, 0xdc, 0x24, 0x04, 0x00, 0xd1, 0xf7, + 0x34, 0xf9, 0x03, 0x49, 0x08, 0x20, 0xcf, 0xf7, + 0x52, 0xff, 0x80, 0xbd, 0x00, 0x00, 0x11, 0xe3, + 0x00, 0x00, 0x09, 0xe4, 0x00, 0x00, 0x80, 0xb5, + 0x01, 0x21, 0x25, 0x20, 0x0a, 0x4a, 0xd1, 0xf7, + 0x24, 0xf9, 0xcc, 0xf7, 0x28, 0xff, 0x08, 0x49, + 0x08, 0x62, 0x08, 0x49, 0x01, 0x20, 0xcf, 0xf7, + 0x3e, 0xff, 0x07, 0x49, 0x02, 0x20, 0xcf, 0xf7, + 0x3a, 0xff, 0x3c, 0x00, 0x18, 0x25, 0x04, 0x00, + 0xfe, 0xf7, 0xe6, 0xff, 0x05, 0x48, 0xc1, 0xf7, + 0xe1, 0xf9, 0x80, 0xbd, 0x29, 0xa9, 0x00, 0x00, + 0x1c, 0x75, 0x01, 0x00, 0xa1, 0xaa, 0x00, 0x00, + 0x2d, 0x19, 0x00, 0x00, 0x45, 0xa8, 0x00, 0x00, + 0x10, 0xb5, 0x06, 0x4c, 0x0c, 0x22, 0x22, 0x70, + 0xa0, 0x18, 0x05, 0x49, 0xbd, 0xf7, 0xd8, 0xff, + 0x00, 0x20, 0xc8, 0xf7, 0x85, 0xfb, 0x01, 0x20, + 0xa0, 0x60, 0x10, 0xbd, 0x3c, 0x00, 0x54, 0x25, + 0x04, 0x00, 0xa4, 0x69, 0x01, 0x00, 0x90, 0x57, + 0x01, 0x00, 0xb0, 0xb5, 0x1f, 0x4c, 0x00, 0x25, + 0x65, 0x80, 0x01, 0x20, 0x20, 0x70, 0x0a, 0x20, + 0xa0, 0x80, 0x90, 0x20, 0xe0, 0x80, 0x30, 0x20, + 0x20, 0x81, 0x90, 0x20, 0x60, 0x81, 0x30, 0x20, + 0xa0, 0x81, 0x17, 0x48, 0x04, 0x22, 0x07, 0x21, + 0x12, 0x30, 0xbe, 0xf7, 0x4c, 0xf8, 0x14, 0x48, + 0x04, 0x22, 0x05, 0x21, 0x16, 0x30, 0x3c, 0x00, + 0x90, 0x25, 0x04, 0x00, 0xbe, 0xf7, 0x46, 0xf8, + 0x12, 0x48, 0x11, 0x4a, 0xe0, 0x81, 0x20, 0x82, + 0x70, 0x32, 0x15, 0x70, 0x55, 0x70, 0x00, 0x20, + 0x3c, 0x23, 0x41, 0x01, 0x43, 0x43, 0x89, 0x18, + 0xf4, 0x31, 0x9b, 0x18, 0x01, 0x30, 0x04, 0x28, + 0x59, 0x60, 0xf5, 0xdb, 0x08, 0x48, 0x06, 0x22, + 0x1a, 0x30, 0x09, 0x49, 0xbd, 0xf7, 0x9a, 0xff, + 0x07, 0x48, 0x05, 0x4c, 0x0c, 0x30, 0x0f, 0xc8, + 0x3c, 0x00, 0xcc, 0x25, 0x04, 0x00, 0x20, 0x34, + 0x0f, 0xc4, 0x20, 0x21, 0x20, 0x1c, 0xbd, 0xf7, + 0x62, 0xff, 0xb0, 0xbd, 0x00, 0x00, 0xf8, 0x60, + 0x01, 0x00, 0x2c, 0x09, 0x00, 0x00, 0x58, 0x40, + 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x07, 0x48, + 0x10, 0xb5, 0x00, 0x68, 0x00, 0x28, 0x08, 0xd0, + 0x06, 0x48, 0xbe, 0xf7, 0x9c, 0xfe, 0x04, 0x1c, + 0xff, 0xf7, 0x9d, 0xfe, 0x20, 0x1c, 0xbe, 0xf7, + 0x96, 0xfe, 0x3c, 0x00, 0x08, 0x26, 0x04, 0x00, + 0x10, 0xbd, 0x00, 0x00, 0x58, 0x57, 0x01, 0x00, + 0xb5, 0xad, 0x00, 0x00, 0x04, 0x49, 0x80, 0xb5, + 0x00, 0x20, 0x88, 0x70, 0x02, 0x21, 0x20, 0x20, + 0x02, 0x4a, 0xd1, 0xf7, 0x91, 0xf8, 0x80, 0xbd, + 0xb4, 0x79, 0x01, 0x00, 0x25, 0xb5, 0x00, 0x00, + 0x80, 0xb5, 0xcc, 0xf7, 0x8f, 0xfe, 0x01, 0x49, + 0x48, 0x61, 0x80, 0xbd, 0xb4, 0x79, 0x01, 0x00, + 0x80, 0xb5, 0x18, 0x21, 0x3c, 0x00, 0x44, 0x26, + 0x04, 0x00, 0x14, 0x48, 0xbd, 0xf7, 0x29, 0xff, + 0x14, 0x48, 0x01, 0x21, 0x01, 0x70, 0x00, 0x21, + 0xc1, 0x60, 0x41, 0x70, 0x01, 0x61, 0x00, 0xf0, + 0x02, 0xf9, 0x00, 0xf0, 0xaa, 0xf8, 0x00, 0xf0, + 0x1e, 0xf8, 0x00, 0xf0, 0xba, 0xf9, 0x00, 0xf0, + 0xcc, 0xf9, 0x00, 0xf0, 0x20, 0xf9, 0x00, 0xf0, + 0x64, 0xf9, 0x00, 0xf0, 0xce, 0xf9, 0x00, 0xf0, + 0xfc, 0xf8, 0x00, 0xf0, 0x82, 0xf9, 0x3c, 0x00, + 0x80, 0x26, 0x04, 0x00, 0x00, 0xf0, 0x28, 0xf8, + 0x00, 0xf0, 0x6e, 0xf8, 0x00, 0xf0, 0x4a, 0xf8, + 0xff, 0xf7, 0xc2, 0xff, 0x00, 0xf0, 0x72, 0xf9, + 0x80, 0xbd, 0x00, 0x00, 0x40, 0x7c, 0x01, 0x00, + 0x18, 0x63, 0x01, 0x00, 0xb0, 0xb5, 0x08, 0x4c, + 0x00, 0x25, 0x08, 0x48, 0x25, 0x77, 0x20, 0x60, + 0xce, 0xf7, 0xf0, 0xfd, 0x00, 0x20, 0xe5, 0x62, + 0xd0, 0xf7, 0xd0, 0xfa, 0x21, 0x1f, 0x08, 0x80, + 0x3c, 0x00, 0xbc, 0x26, 0x04, 0x00, 0xd0, 0xf7, + 0x6c, 0xfb, 0xb0, 0xbd, 0x00, 0x00, 0xd4, 0x79, + 0x01, 0x00, 0x95, 0x75, 0x00, 0x00, 0x80, 0xb5, + 0xcc, 0xf7, 0xc1, 0xfc, 0x80, 0xbd, 0x05, 0x49, + 0x80, 0xb5, 0x00, 0x20, 0x08, 0x70, 0x48, 0x70, + 0x03, 0x48, 0x04, 0x49, 0x03, 0x4a, 0x08, 0x30, + 0xcc, 0xf7, 0x27, 0xfe, 0x80, 0xbd, 0x2c, 0x63, + 0x01, 0x00, 0xed, 0xbc, 0x00, 0x00, 0x4d, 0xbd, + 0x00, 0x00, 0x3c, 0x00, 0xf8, 0x26, 0x04, 0x00, + 0x80, 0xb5, 0xcc, 0xf7, 0x2b, 0xfe, 0x05, 0x49, + 0x48, 0x60, 0x01, 0x1c, 0x04, 0x48, 0xcc, 0xf7, + 0x4b, 0xfe, 0x04, 0x49, 0x03, 0x20, 0xcf, 0xf7, + 0x3d, 0xfe, 0x80, 0xbd, 0x2c, 0x63, 0x01, 0x00, + 0xc4, 0x60, 0x01, 0x00, 0xc1, 0xbc, 0x00, 0x00, + 0x04, 0x48, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, + 0x0e, 0xc0, 0x08, 0xc0, 0x02, 0x49, 0x10, 0x38, + 0x01, 0x60, 0x70, 0x47, 0x3c, 0x00, 0x34, 0x27, + 0x04, 0x00, 0x04, 0x7a, 0x01, 0x00, 0x1c, 0xe6, + 0x01, 0x00, 0x80, 0xb5, 0xcc, 0xf7, 0x09, 0xfe, + 0x05, 0x49, 0x05, 0x4a, 0x48, 0x60, 0x02, 0x21, + 0x24, 0x20, 0xd0, 0xf7, 0xfc, 0xff, 0x03, 0x48, + 0xc9, 0xf7, 0x6b, 0xfd, 0x80, 0xbd, 0x04, 0x7a, + 0x01, 0x00, 0x69, 0xbe, 0x00, 0x00, 0x71, 0xeb, + 0x00, 0x00, 0x10, 0xb5, 0x04, 0x4c, 0x14, 0x21, + 0x20, 0x1c, 0xbd, 0xf7, 0x96, 0xfe, 0x3c, 0x00, + 0x70, 0x27, 0x04, 0x00, 0x02, 0x48, 0x20, 0x60, + 0x10, 0xbd, 0x00, 0x00, 0x14, 0x7a, 0x01, 0x00, + 0xec, 0xe5, 0x01, 0x00, 0x80, 0xb5, 0xcc, 0xf7, + 0xe7, 0xfd, 0x07, 0x49, 0x07, 0x4a, 0x48, 0x60, + 0x02, 0x21, 0x1f, 0x20, 0xd0, 0xf7, 0xda, 0xff, + 0x05, 0x49, 0x01, 0x20, 0x08, 0x60, 0x05, 0x49, + 0x0c, 0x20, 0xcf, 0xf7, 0xf5, 0xfd, 0x80, 0xbd, + 0x14, 0x7a, 0x01, 0x00, 0xd5, 0xbf, 0x00, 0x00, + 0x3c, 0x00, 0xac, 0x27, 0x04, 0x00, 0x80, 0x5a, + 0x01, 0x00, 0x85, 0xff, 0x00, 0x00, 0x80, 0xb5, + 0xff, 0xf7, 0x4f, 0xfd, 0x01, 0x21, 0x21, 0x20, + 0x02, 0x4a, 0xd0, 0xf7, 0xc2, 0xff, 0x80, 0xbd, + 0x00, 0x00, 0xc9, 0xc1, 0x00, 0x00, 0x80, 0xb5, + 0xcc, 0xf7, 0xc1, 0xfd, 0x02, 0x49, 0x08, 0x63, + 0xc9, 0xf7, 0x57, 0xfd, 0x80, 0xbd, 0x28, 0x7a, + 0x01, 0x00, 0x10, 0xb5, 0xcc, 0xf7, 0xb7, 0xfd, + 0x16, 0x4c, 0x3c, 0x00, 0xe8, 0x27, 0x04, 0x00, + 0x20, 0x61, 0xcc, 0xf7, 0xb3, 0xfd, 0x60, 0x61, + 0x14, 0x48, 0x15, 0x49, 0x08, 0x60, 0x16, 0x49, + 0x14, 0x48, 0x08, 0x60, 0xcc, 0xf7, 0xaa, 0xfd, + 0x14, 0x49, 0x08, 0x60, 0x00, 0xf0, 0x34, 0xf8, + 0xff, 0xf7, 0xe0, 0xff, 0xff, 0xf7, 0x5e, 0xff, + 0x00, 0xf0, 0x04, 0xf9, 0x00, 0xf0, 0x8e, 0xf8, + 0xff, 0xf7, 0x6e, 0xff, 0xff, 0xf7, 0xb0, 0xff, + 0xff, 0xf7, 0x8c, 0xff, 0x3c, 0x00, 0x24, 0x28, + 0x04, 0x00, 0xff, 0xf7, 0x04, 0xff, 0x00, 0xf0, + 0xaa, 0xf8, 0x0a, 0x48, 0xbf, 0xf7, 0xbd, 0xff, + 0xc9, 0xf7, 0xbb, 0xfd, 0x09, 0x49, 0x00, 0x20, + 0xcf, 0xf7, 0xa7, 0xfd, 0x10, 0xbd, 0x40, 0x7c, + 0x01, 0x00, 0x7d, 0xb7, 0x00, 0x00, 0x18, 0x7e, + 0x01, 0x00, 0xbd, 0xb8, 0x00, 0x00, 0x1c, 0x7e, + 0x01, 0x00, 0x20, 0x7e, 0x01, 0x00, 0xb9, 0xba, + 0x00, 0x00, 0x81, 0x24, 0x01, 0x00, 0x3c, 0x00, + 0x60, 0x28, 0x04, 0x00, 0x80, 0xb5, 0x38, 0x21, + 0x01, 0x48, 0xbd, 0xf7, 0x19, 0xfe, 0x80, 0xbd, + 0x90, 0x5c, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, + 0xb0, 0xb5, 0x0c, 0x4c, 0x0b, 0x4d, 0x00, 0x20, + 0x0c, 0x34, 0x60, 0x60, 0x25, 0x60, 0xe0, 0x60, + 0x0a, 0x20, 0x20, 0x81, 0x28, 0x1c, 0xc8, 0xf7, + 0x3f, 0xfd, 0x28, 0x1c, 0xc8, 0xf7, 0x3a, 0xfd, + 0x08, 0x3d, 0x68, 0x60, 0x04, 0x48, 0xc9, 0xf7, + 0x3c, 0x00, 0x9c, 0x28, 0x04, 0x00, 0x1b, 0xfd, + 0x20, 0x1c, 0xc0, 0xf7, 0x6e, 0xfa, 0x28, 0x80, + 0xb0, 0xbd, 0xb8, 0x7a, 0x01, 0x00, 0xd5, 0x33, + 0x01, 0x00, 0xf8, 0xb5, 0x1f, 0x4e, 0x1d, 0x4c, + 0x00, 0x20, 0x0c, 0x21, 0x41, 0x43, 0x82, 0x00, + 0x01, 0x30, 0x09, 0x19, 0x08, 0x31, 0x00, 0x06, + 0x00, 0x0e, 0x04, 0x28, 0xb1, 0x50, 0xf4, 0xd3, + 0x18, 0x48, 0x0c, 0x38, 0x30, 0x61, 0xce, 0xf7, + 0xf4, 0xf9, 0x3c, 0x00, 0xd8, 0x28, 0x04, 0x00, + 0x14, 0x4c, 0xa0, 0x78, 0x00, 0x09, 0x00, 0x01, + 0xa0, 0x70, 0x00, 0x27, 0xe7, 0x70, 0x67, 0x70, + 0x00, 0x24, 0xa5, 0x00, 0x70, 0x59, 0x07, 0x70, + 0x20, 0x1c, 0xbe, 0xf7, 0x53, 0xf9, 0x71, 0x59, + 0x08, 0x71, 0x00, 0x21, 0x20, 0x1c, 0xce, 0xf7, + 0x7d, 0xf9, 0x01, 0x34, 0x24, 0x06, 0x24, 0x0e, + 0x04, 0x2c, 0xee, 0xd3, 0x07, 0x4c, 0x20, 0x78, + 0x00, 0x09, 0x00, 0x01, 0x3c, 0x00, 0x14, 0x29, + 0x04, 0x00, 0x0a, 0x30, 0x20, 0x70, 0x20, 0x78, + 0xf0, 0x21, 0x88, 0x43, 0x30, 0x30, 0x20, 0x70, + 0xa0, 0x78, 0x0f, 0x21, 0x08, 0x43, 0xa0, 0x70, + 0xf8, 0xbd, 0x00, 0x50, 0x07, 0x00, 0x10, 0x7b, + 0x01, 0x00, 0x80, 0xb5, 0xcc, 0xf7, 0x9f, 0xfb, + 0x80, 0xbd, 0xb0, 0xb5, 0x0c, 0x4c, 0x0b, 0x4d, + 0x00, 0x20, 0x0c, 0x34, 0x60, 0x60, 0x25, 0x60, + 0xe0, 0x60, 0x0a, 0x20, 0x20, 0x81, 0x3c, 0x00, + 0x50, 0x29, 0x04, 0x00, 0x28, 0x1c, 0xc8, 0xf7, + 0xe1, 0xfc, 0x28, 0x1c, 0xc8, 0xf7, 0xd4, 0xfc, + 0x08, 0x3d, 0x68, 0x60, 0x20, 0x1c, 0xc0, 0xf7, + 0x0d, 0xfa, 0x28, 0x80, 0x02, 0x48, 0xc9, 0xf7, + 0x9b, 0xfc, 0xb0, 0xbd, 0x2c, 0x7b, 0x01, 0x00, + 0x49, 0x00, 0x01, 0x00, 0x80, 0xb5, 0xca, 0xf7, + 0x2f, 0xf8, 0x80, 0xbd, 0x70, 0x47, 0x00, 0x00, + 0xb0, 0xb5, 0x12, 0x4d, 0x3c, 0x21, 0x28, 0x1c, + 0x3c, 0x00, 0x8c, 0x29, 0x04, 0x00, 0xbd, 0xf7, + 0x86, 0xfd, 0x0f, 0x48, 0x28, 0x21, 0x3c, 0x30, + 0xbd, 0xf7, 0x81, 0xfd, 0x0d, 0x48, 0x00, 0x21, + 0x14, 0x38, 0x01, 0x61, 0xc1, 0x60, 0xff, 0x21, + 0x01, 0x70, 0x41, 0x70, 0x0a, 0x49, 0x0a, 0x4a, + 0x41, 0x60, 0x01, 0x21, 0x0c, 0x20, 0xd0, 0xf7, + 0xc8, 0xfe, 0x2c, 0x1c, 0x30, 0x34, 0x0c, 0x3d, + 0x00, 0x20, 0xd0, 0xf7, 0x4a, 0xf9, 0x20, 0x80, + 0x0c, 0x3c, 0x3c, 0x00, 0xc8, 0x29, 0x04, 0x00, + 0xac, 0x42, 0xf8, 0xd1, 0xb0, 0xbd, 0x00, 0x00, + 0x60, 0x7b, 0x01, 0x00, 0x20, 0xa1, 0x07, 0x00, + 0x35, 0xcd, 0x00, 0x00, 0x08, 0x49, 0x00, 0x20, + 0x0c, 0x22, 0x42, 0x43, 0x52, 0x18, 0x10, 0x71, + 0x01, 0x30, 0x05, 0x28, 0xf8, 0xdb, 0x04, 0x48, + 0x00, 0x21, 0x08, 0x38, 0x01, 0x70, 0x41, 0x60, + 0xff, 0x21, 0x41, 0x70, 0x70, 0x47, 0x00, 0x00, + 0x74, 0x7a, 0x01, 0x00, 0x3c, 0x00, 0x04, 0x2a, + 0x04, 0x00, 0x80, 0xb5, 0x78, 0x21, 0x01, 0x48, + 0xbd, 0xf7, 0x47, 0xfd, 0x80, 0xbd, 0xc4, 0x7b, + 0x01, 0x00, 0x80, 0xb5, 0xca, 0xf7, 0x97, 0xfa, + 0x80, 0xbd, 0x70, 0x47, 0x00, 0x00, 0x10, 0xb5, + 0x0b, 0x4c, 0xff, 0x21, 0x05, 0x31, 0x20, 0x1c, + 0xbd, 0xf7, 0x37, 0xfd, 0x09, 0x48, 0xf0, 0x21, + 0x08, 0x51, 0x20, 0x1c, 0x40, 0x30, 0xc5, 0xf7, + 0x8e, 0xf9, 0x6c, 0x21, 0x06, 0x48, 0x3c, 0x00, + 0x40, 0x2a, 0x04, 0x00, 0xbd, 0xf7, 0x2c, 0xfd, + 0x04, 0x48, 0xc0, 0x21, 0x6c, 0x30, 0xbd, 0xf7, + 0x27, 0xfd, 0x10, 0xbd, 0xc4, 0x69, 0x01, 0x00, + 0xb0, 0xd9, 0x01, 0x00, 0xc8, 0x6a, 0x01, 0x00, + 0xb0, 0xb5, 0x0b, 0x4d, 0x00, 0x24, 0x1c, 0x20, + 0x60, 0x43, 0x40, 0x19, 0x6c, 0x30, 0xc3, 0xf7, + 0x0f, 0xfe, 0x01, 0x34, 0x04, 0x2c, 0xf6, 0xdb, + 0xcc, 0xf7, 0x6e, 0xfc, 0xa8, 0x63, 0xc7, 0xf7, + 0x3c, 0x00, 0x7c, 0x2a, 0x04, 0x00, 0x75, 0xf9, + 0x04, 0x48, 0xc9, 0xf7, 0x1c, 0xfc, 0x03, 0x48, + 0xcf, 0xf7, 0x03, 0xfa, 0xb0, 0xbd, 0xc4, 0x69, + 0x01, 0x00, 0xfd, 0x80, 0x00, 0x00, 0xe1, 0x22, + 0x01, 0x00, 0x10, 0xb5, 0x05, 0x4c, 0x00, 0x20, + 0x20, 0x80, 0x03, 0x48, 0x06, 0x21, 0x08, 0x30, + 0xbd, 0xf7, 0xd5, 0xfc, 0x14, 0x20, 0x60, 0x60, + 0x10, 0xbd, 0x98, 0x7c, 0x01, 0x00, 0x10, 0xb5, + 0x08, 0x4c, 0x3c, 0x00, 0xb8, 0x2a, 0x04, 0x00, + 0x00, 0x20, 0x20, 0x80, 0x60, 0x80, 0x06, 0x48, + 0x06, 0x21, 0x0c, 0x30, 0xbd, 0xf7, 0xc6, 0xfc, + 0x03, 0x48, 0x06, 0x21, 0x12, 0x30, 0xbd, 0xf7, + 0xc1, 0xfc, 0x14, 0x20, 0xa0, 0x60, 0x10, 0xbd, + 0x58, 0x7c, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x80, 0xb5, 0x02, 0x21, 0x0d, 0x20, 0x05, 0x4a, + 0xd0, 0xf7, 0x2e, 0xfe, 0x04, 0x48, 0xc8, 0xf7, + 0x1f, 0xfc, 0x04, 0x48, 0x3c, 0x00, 0xf4, 0x2a, + 0x04, 0x00, 0xca, 0xf7, 0x44, 0xfc, 0x80, 0xbd, + 0x00, 0x00, 0x31, 0xd4, 0x00, 0x00, 0x51, 0xb1, + 0x00, 0x00, 0x09, 0xb1, 0x00, 0x00, 0x08, 0x49, + 0x80, 0xb5, 0x00, 0x20, 0x08, 0x60, 0xff, 0xf7, + 0xd0, 0xff, 0xff, 0xf7, 0xc0, 0xff, 0xff, 0xf7, + 0x04, 0xfc, 0x00, 0xf0, 0x4a, 0xf8, 0xff, 0xf7, + 0x0a, 0xfc, 0x00, 0xf0, 0x3c, 0xf8, 0x80, 0xbd, + 0x00, 0x00, 0xe4, 0x65, 0x01, 0x00, 0x3c, 0x00, + 0x30, 0x2b, 0x04, 0x00, 0x80, 0xb5, 0x00, 0xf0, + 0x29, 0xf8, 0x00, 0xf0, 0x1b, 0xf8, 0x00, 0xf0, + 0x51, 0xf8, 0x00, 0xf0, 0x31, 0xf8, 0x80, 0xbd, + 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x80, 0xb5, 0xff, 0x21, 0x89, 0x31, 0x02, 0x48, + 0xbd, 0xf7, 0xa2, 0xfc, 0x80, 0xbd, 0x00, 0x00, + 0xdc, 0x71, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x49, + 0x08, 0x20, 0xcf, 0xf7, 0x11, 0xfc, 0x80, 0xbd, + 0x3c, 0x00, 0x6c, 0x2b, 0x04, 0x00, 0x59, 0xd9, + 0x00, 0x00, 0x80, 0xb5, 0x03, 0x48, 0xcf, 0xf7, + 0x4c, 0xf9, 0x02, 0x49, 0x48, 0x80, 0x80, 0xbd, + 0x00, 0x00, 0x8d, 0x1f, 0x00, 0x00, 0x98, 0x7c, + 0x01, 0x00, 0x80, 0xb5, 0x03, 0x48, 0xcf, 0xf7, + 0x40, 0xf9, 0x02, 0x49, 0x88, 0x80, 0x80, 0xbd, + 0x00, 0x00, 0xd5, 0x23, 0x00, 0x00, 0x58, 0x7c, + 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, + 0x02, 0x48, 0x3c, 0x00, 0xa8, 0x2b, 0x04, 0x00, + 0xca, 0xf7, 0xe4, 0xfb, 0x80, 0xbd, 0x00, 0x00, + 0x71, 0xe0, 0x00, 0x00, 0x80, 0xb5, 0xcc, 0xf7, + 0xa5, 0xfb, 0x02, 0x21, 0x0f, 0x20, 0x06, 0x4a, + 0xd0, 0xf7, 0xc2, 0xfd, 0x14, 0x21, 0x05, 0x48, + 0xbd, 0xf7, 0x68, 0xfc, 0x03, 0x48, 0x78, 0x21, + 0x14, 0x30, 0xbd, 0xf7, 0x63, 0xfc, 0x80, 0xbd, + 0x35, 0xe2, 0x00, 0x00, 0x84, 0x66, 0x01, 0x00, + 0x80, 0xb5, 0xcc, 0xf7, 0x3c, 0x00, 0xe4, 0x2b, + 0x04, 0x00, 0xb7, 0xfb, 0x05, 0x49, 0x08, 0x61, + 0x05, 0x49, 0x0e, 0x20, 0xcf, 0xf7, 0xcd, 0xfb, + 0x04, 0x49, 0x08, 0x20, 0xcf, 0xf7, 0xc9, 0xfb, + 0x80, 0xbd, 0xec, 0x65, 0x01, 0x00, 0x01, 0x02, + 0x01, 0x00, 0xc1, 0x2e, 0x00, 0x00, 0x01, 0x49, + 0x00, 0x20, 0x08, 0x70, 0x70, 0x47, 0x40, 0xd9, + 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x01, 0x49, + 0x00, 0x20, 0x08, 0x70, 0x70, 0x47, 0x3c, 0x00, + 0x20, 0x2c, 0x04, 0x00, 0xa0, 0x79, 0x01, 0x00, + 0x80, 0xb5, 0x07, 0x48, 0xc8, 0xf7, 0xf2, 0xff, + 0x06, 0x49, 0x48, 0x60, 0x06, 0x48, 0xc0, 0xf7, + 0x07, 0xfb, 0x06, 0x48, 0xc0, 0xf7, 0x86, 0xfb, + 0x05, 0x48, 0xc9, 0xf7, 0xa3, 0xfa, 0x80, 0xbd, + 0xa9, 0xe4, 0x00, 0x00, 0xa0, 0x79, 0x01, 0x00, + 0xb9, 0xe4, 0x00, 0x00, 0x85, 0x2e, 0x00, 0x00, + 0x81, 0xe4, 0x00, 0x00, 0x07, 0x48, 0x80, 0xb5, + 0x3c, 0x00, 0x5c, 0x2c, 0x04, 0x00, 0x00, 0x21, + 0x00, 0x22, 0x00, 0x23, 0x0e, 0xc0, 0x08, 0xc0, + 0x10, 0x38, 0xc8, 0x21, 0x01, 0x60, 0x00, 0x21, + 0x0c, 0x38, 0x02, 0x4a, 0xcc, 0xf7, 0x61, 0xfb, + 0x80, 0xbd, 0xd0, 0x60, 0x01, 0x00, 0xfd, 0xe5, + 0x00, 0x00, 0x80, 0xb5, 0xcc, 0xf7, 0x67, 0xfb, + 0x04, 0x49, 0x08, 0x60, 0x01, 0x1c, 0x02, 0x48, + 0x04, 0x30, 0xcc, 0xf7, 0x86, 0xfb, 0x80, 0xbd, + 0x00, 0x00, 0x3c, 0x00, 0x98, 0x2c, 0x04, 0x00, + 0xc0, 0x60, 0x01, 0x00, 0x09, 0x48, 0x80, 0xb5, + 0x0a, 0x21, 0x01, 0x70, 0x41, 0x70, 0x08, 0x49, + 0x08, 0x4a, 0x81, 0x60, 0x00, 0x21, 0xc1, 0x60, + 0x52, 0x79, 0x82, 0x70, 0x01, 0x61, 0x41, 0x61, + 0x28, 0x21, 0x18, 0x30, 0xbd, 0xf7, 0xee, 0xfb, + 0x80, 0xbd, 0x00, 0x00, 0x7c, 0x78, 0x01, 0x00, + 0xa0, 0x86, 0x01, 0x00, 0x0c, 0x5a, 0x01, 0x00, + 0xf8, 0xb5, 0x0f, 0x49, 0x3c, 0x00, 0xd4, 0x2c, + 0x04, 0x00, 0x0f, 0x48, 0x0d, 0x88, 0x4f, 0x88, + 0x06, 0x79, 0x00, 0x24, 0x30, 0x1b, 0x68, 0x43, + 0x68, 0x23, 0x0c, 0x49, 0x58, 0x43, 0x41, 0x18, + 0x7d, 0x20, 0xc0, 0x00, 0xbd, 0xf7, 0x0f, 0xfd, + 0x61, 0x00, 0x09, 0x4a, 0xa6, 0x42, 0x50, 0x52, + 0x00, 0xd1, 0x3d, 0x1c, 0x01, 0x34, 0x24, 0x06, + 0x24, 0x0e, 0x10, 0x2c, 0xea, 0xd3, 0x05, 0x49, + 0x01, 0x20, 0x08, 0x61, 0xf8, 0xbd, 0x3c, 0x00, + 0x10, 0x2d, 0x04, 0x00, 0xf6, 0x59, 0x01, 0x00, + 0x0c, 0x5a, 0x01, 0x00, 0x34, 0x44, 0x0f, 0x00, + 0x12, 0x5a, 0x01, 0x00, 0x7c, 0x78, 0x01, 0x00, + 0x80, 0xb5, 0x00, 0xf0, 0xe7, 0xfa, 0x02, 0x49, + 0x01, 0x20, 0x08, 0x61, 0x80, 0xbd, 0x00, 0x00, + 0x7c, 0x78, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, + 0x08, 0x1c, 0x0f, 0x49, 0x49, 0x79, 0x00, 0x29, + 0x01, 0xd1, 0x0e, 0x4b, 0x00, 0xe0, 0x0e, 0x4b, + 0x3c, 0x00, 0x4c, 0x2d, 0x04, 0x00, 0x00, 0x2c, + 0x07, 0xd0, 0x04, 0x21, 0x11, 0x80, 0x0a, 0x1c, + 0x01, 0x24, 0x19, 0x1c, 0xbd, 0xf7, 0xcd, 0xfb, + 0x0a, 0xe0, 0x01, 0x24, 0x01, 0x1c, 0x18, 0x1c, + 0x12, 0x88, 0xbd, 0xf7, 0xc6, 0xfb, 0x00, 0xf0, + 0xc4, 0xfa, 0x05, 0x49, 0x01, 0x20, 0x08, 0x61, + 0x20, 0x1c, 0x10, 0xbd, 0x00, 0x00, 0x0c, 0x5a, + 0x01, 0x00, 0xfe, 0x59, 0x01, 0x00, 0xfa, 0x59, + 0x01, 0x00, 0x3c, 0x00, 0x88, 0x2d, 0x04, 0x00, + 0x7c, 0x78, 0x01, 0x00, 0x0d, 0x48, 0x8c, 0xb5, + 0xc1, 0x88, 0x00, 0xab, 0x0c, 0x4a, 0x99, 0x80, + 0x01, 0x89, 0x04, 0x20, 0xd9, 0x80, 0x18, 0x80, + 0x02, 0x21, 0x13, 0x20, 0xd0, 0xf7, 0xd0, 0xfc, + 0x00, 0xf0, 0xa6, 0xfa, 0x07, 0x49, 0x01, 0x20, + 0x08, 0x61, 0xff, 0xf7, 0x8d, 0xff, 0x6a, 0x46, + 0x01, 0xa9, 0x00, 0x20, 0xff, 0xf7, 0xbc, 0xff, + 0x8c, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0xc4, 0x2d, + 0x04, 0x00, 0xf4, 0x59, 0x01, 0x00, 0x95, 0xf9, + 0x00, 0x00, 0x7c, 0x78, 0x01, 0x00, 0xf8, 0xb5, + 0x13, 0x4e, 0x01, 0x25, 0xb5, 0x70, 0x05, 0x20, + 0xf0, 0x70, 0x11, 0x49, 0x10, 0x48, 0x0e, 0xc9, + 0x2c, 0x30, 0x0e, 0xc0, 0x00, 0x20, 0x70, 0x61, + 0x0f, 0x48, 0x0f, 0x49, 0x10, 0x4f, 0x00, 0x24, + 0x48, 0x60, 0xa0, 0x00, 0x39, 0x58, 0x20, 0x1c, + 0xd1, 0xf7, 0xd7, 0xf8, 0x01, 0x34, 0x3c, 0x00, + 0x00, 0x2e, 0x04, 0x00, 0x10, 0x2c, 0xf7, 0xd3, + 0x06, 0x4c, 0x0b, 0x4a, 0x20, 0x34, 0x20, 0x1c, + 0x0a, 0x49, 0xb5, 0x60, 0xcc, 0xf7, 0x92, 0xfa, + 0xcc, 0xf7, 0x9e, 0xfa, 0x30, 0x61, 0x20, 0x60, + 0xf8, 0xbd, 0x00, 0x00, 0x64, 0x73, 0x01, 0x00, + 0xb0, 0x58, 0x01, 0x00, 0x04, 0x18, 0x02, 0x00, + 0x60, 0x00, 0x07, 0x00, 0xd4, 0x44, 0x01, 0x00, + 0x45, 0xfa, 0x00, 0x00, 0x71, 0xfa, 0x00, 0x00, + 0x3c, 0x00, 0x3c, 0x2e, 0x04, 0x00, 0x0c, 0x49, + 0x30, 0xb5, 0x00, 0x23, 0xcc, 0x56, 0x0b, 0x4b, + 0x00, 0x20, 0xf0, 0x25, 0x1a, 0x5c, 0x11, 0x07, + 0x09, 0x0f, 0x09, 0x19, 0x0f, 0x29, 0x01, 0xdd, + 0x0f, 0x21, 0x02, 0xe0, 0x00, 0x29, 0x00, 0xda, + 0x00, 0x21, 0x2a, 0x40, 0x51, 0x18, 0x19, 0x54, + 0x01, 0x30, 0x0e, 0x28, 0xee, 0xdb, 0x30, 0xbd, + 0x00, 0x00, 0x64, 0x73, 0x01, 0x00, 0xc0, 0x58, + 0x01, 0x00, 0x3c, 0x00, 0x78, 0x2e, 0x04, 0x00, + 0xb0, 0xb5, 0x0d, 0x1c, 0x00, 0x28, 0x08, 0xd0, + 0x01, 0x24, 0x14, 0x80, 0x05, 0x20, 0xcc, 0xf7, + 0xb5, 0xf8, 0x80, 0x03, 0xc0, 0x0f, 0x28, 0x70, + 0x07, 0xe0, 0x28, 0x78, 0x01, 0x22, 0x41, 0x04, + 0x52, 0x04, 0x05, 0x20, 0xd0, 0xf7, 0xae, 0xfd, + 0x01, 0x24, 0x20, 0x1c, 0xb0, 0xbd, 0x00, 0x00, + 0x98, 0xb5, 0x05, 0x4c, 0x60, 0x68, 0xcc, 0xf7, + 0xf5, 0xfd, 0x00, 0x90, 0x3c, 0x00, 0xb4, 0x2e, + 0x04, 0x00, 0x00, 0xab, 0x18, 0x88, 0xe0, 0x80, + 0xce, 0xf7, 0xfb, 0xff, 0x98, 0xbd, 0xa0, 0x58, + 0x01, 0x00, 0x38, 0xb5, 0x03, 0x1c, 0x08, 0x1c, + 0x00, 0x24, 0x00, 0x2b, 0x17, 0x4d, 0x07, 0xd0, + 0x0e, 0x21, 0x11, 0x80, 0x0a, 0x1c, 0x01, 0x24, + 0x29, 0x1c, 0xbd, 0xf7, 0x0c, 0xfb, 0x22, 0xe0, + 0x11, 0x88, 0x04, 0x29, 0x17, 0xd1, 0x01, 0x1c, + 0x68, 0x46, 0x12, 0x88, 0xbd, 0xf7, 0x3c, 0x00, + 0xf0, 0x2e, 0x04, 0x00, 0x03, 0xfb, 0x00, 0x98, + 0x00, 0x28, 0x01, 0xdb, 0x32, 0x30, 0x00, 0xe0, + 0x32, 0x38, 0x00, 0x90, 0x01, 0x1c, 0x64, 0x20, + 0xbd, 0xf7, 0x98, 0xfb, 0x01, 0x06, 0x09, 0x16, + 0x00, 0x90, 0x0e, 0x22, 0x28, 0x1c, 0xbd, 0xf7, + 0x85, 0xfb, 0x06, 0xe0, 0x0e, 0x29, 0x05, 0xd1, + 0x0a, 0x1c, 0x01, 0x1c, 0x28, 0x1c, 0xbd, 0xf7, + 0xe9, 0xfa, 0x01, 0x24, 0x20, 0x1c, 0x38, 0xbd, + 0x3c, 0x00, 0x2c, 0x2f, 0x04, 0x00, 0xda, 0x59, + 0x01, 0x00, 0x38, 0xb5, 0x03, 0x1c, 0x08, 0x1c, + 0x00, 0x24, 0x00, 0x2b, 0x17, 0x4d, 0x07, 0xd0, + 0x0e, 0x21, 0x11, 0x80, 0x0a, 0x1c, 0x01, 0x24, + 0x29, 0x1c, 0xbd, 0xf7, 0xd6, 0xfa, 0x22, 0xe0, + 0x11, 0x88, 0x04, 0x29, 0x17, 0xd1, 0x01, 0x1c, + 0x68, 0x46, 0x12, 0x88, 0xbd, 0xf7, 0xcd, 0xfa, + 0x00, 0x98, 0x00, 0x28, 0x01, 0xdb, 0x32, 0x30, + 0x00, 0xe0, 0x3c, 0x00, 0x68, 0x2f, 0x04, 0x00, + 0x32, 0x38, 0x00, 0x90, 0x01, 0x1c, 0x64, 0x20, + 0xbd, 0xf7, 0x62, 0xfb, 0x01, 0x06, 0x09, 0x16, + 0x00, 0x90, 0x0e, 0x22, 0x28, 0x1c, 0xbd, 0xf7, + 0x4f, 0xfb, 0x06, 0xe0, 0x0e, 0x29, 0x05, 0xd1, + 0x0a, 0x1c, 0x01, 0x1c, 0x28, 0x1c, 0xbd, 0xf7, + 0xb3, 0xfa, 0x01, 0x24, 0x20, 0x1c, 0x38, 0xbd, + 0xcc, 0x59, 0x01, 0x00, 0x03, 0x48, 0x80, 0xb5, + 0x01, 0x78, 0x00, 0x20, 0x3c, 0x00, 0xa4, 0x2f, + 0x04, 0x00, 0xcc, 0xf7, 0xb4, 0xfb, 0x80, 0xbd, + 0x00, 0x00, 0xa6, 0x58, 0x01, 0x00, 0x70, 0x47, + 0x00, 0x00, 0x02, 0x49, 0x03, 0x20, 0x08, 0x70, + 0x00, 0x20, 0x48, 0x70, 0x70, 0x47, 0x9c, 0x73, + 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x11, 0x20, + 0x02, 0x4a, 0xd0, 0xf7, 0xbc, 0xfb, 0x80, 0xbd, + 0x00, 0x00, 0xa1, 0xfe, 0x00, 0x00, 0xf0, 0xb5, + 0x0b, 0x4f, 0x1c, 0x1c, 0x00, 0x23, 0x3c, 0x00, + 0xe0, 0x2f, 0x04, 0x00, 0xfd, 0x56, 0x2b, 0x1c, + 0x06, 0x2d, 0x01, 0xd1, 0x01, 0x20, 0xf0, 0xbd, + 0x06, 0x4e, 0x05, 0x1c, 0xd8, 0x00, 0x34, 0x36, + 0x35, 0x54, 0x80, 0x19, 0x41, 0x70, 0x82, 0x70, + 0x44, 0x60, 0x58, 0x1c, 0x38, 0x70, 0x00, 0x20, + 0xf0, 0xbd, 0x00, 0x00, 0x98, 0x5a, 0x01, 0x00, + 0x10, 0xb5, 0x04, 0x1c, 0x0c, 0x48, 0x00, 0xf0, + 0x21, 0xf9, 0x60, 0x78, 0xff, 0x28, 0x04, 0xd0, + 0x3c, 0x00, 0x1c, 0x30, 0x04, 0x00, 0x01, 0x23, + 0xe0, 0x56, 0x06, 0x21, 0x00, 0xf0, 0xcd, 0xf8, + 0x08, 0x4a, 0x01, 0x21, 0x10, 0x78, 0x08, 0x43, + 0x07, 0x49, 0x08, 0x70, 0x20, 0x23, 0x18, 0x43, + 0x08, 0x70, 0x80, 0x23, 0x18, 0x43, 0x10, 0x70, + 0x08, 0x70, 0x10, 0xbd, 0x00, 0x00, 0x91, 0x9b, + 0x00, 0x00, 0xe0, 0x60, 0x01, 0x00, 0x04, 0x00, + 0x07, 0x00, 0x10, 0xb5, 0x0a, 0x49, 0x04, 0x1c, + 0x08, 0x78, 0x3c, 0x00, 0x58, 0x30, 0x04, 0x00, + 0x40, 0x08, 0x40, 0x00, 0x08, 0x70, 0x08, 0x49, + 0x08, 0x70, 0x08, 0x48, 0x00, 0xf0, 0xf8, 0xf8, + 0x60, 0x78, 0xff, 0x28, 0x04, 0xd0, 0x01, 0x23, + 0xe0, 0x56, 0x05, 0x21, 0x00, 0xf0, 0xa4, 0xf8, + 0x10, 0xbd, 0x00, 0x00, 0xe0, 0x60, 0x01, 0x00, + 0x04, 0x00, 0x07, 0x00, 0x91, 0x9b, 0x00, 0x00, + 0x03, 0x48, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, + 0x0e, 0xc0, 0x08, 0xc0, 0x3c, 0x00, 0x94, 0x30, + 0x04, 0x00, 0x70, 0x47, 0x00, 0x00, 0xe8, 0x60, + 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x10, 0xb5, + 0x07, 0x4c, 0x00, 0x20, 0x60, 0x60, 0x20, 0x80, + 0xe0, 0x60, 0x02, 0x21, 0x14, 0x20, 0x04, 0x4a, + 0xd0, 0xf7, 0x49, 0xfb, 0x02, 0x48, 0x10, 0x30, + 0xa0, 0x60, 0x10, 0xbd, 0x00, 0x00, 0x58, 0x75, + 0x01, 0x00, 0x05, 0x1d, 0x01, 0x00, 0x70, 0x47, + 0x00, 0x00, 0x10, 0xb5, 0x48, 0x21, 0x3c, 0x00, + 0xd0, 0x30, 0x04, 0x00, 0x0a, 0x48, 0xbd, 0xf7, + 0xe3, 0xf9, 0x09, 0x4c, 0xe0, 0x21, 0x48, 0x34, + 0x20, 0x1c, 0xbd, 0xf7, 0xdd, 0xf9, 0x00, 0x20, + 0xc1, 0x00, 0x09, 0x19, 0x0a, 0x1c, 0x08, 0x32, + 0x01, 0x30, 0x1b, 0x28, 0x4a, 0x60, 0xf7, 0xd3, + 0x01, 0x48, 0x04, 0x38, 0x04, 0x60, 0x10, 0xbd, + 0x68, 0x5b, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, + 0x23, 0x20, 0x02, 0x4a, 0xd0, 0xf7, 0x1e, 0xfb, + 0x3c, 0x00, 0x0c, 0x31, 0x04, 0x00, 0x80, 0xbd, + 0x00, 0x00, 0x45, 0x23, 0x01, 0x00, 0x80, 0xb5, + 0xff, 0xf7, 0x6b, 0xf8, 0x80, 0xbd, 0x70, 0x47, + 0x00, 0x00, 0xf8, 0xb5, 0x01, 0x20, 0x1d, 0x49, + 0xc0, 0x07, 0x48, 0x60, 0x1d, 0x49, 0xff, 0x20, + 0x08, 0x73, 0x1c, 0x4e, 0x10, 0x20, 0x30, 0x60, + 0x05, 0x01, 0x35, 0x60, 0x1b, 0x4c, 0x80, 0x21, + 0x20, 0x1c, 0xbd, 0xf7, 0xac, 0xf9, 0x00, 0x21, + 0x19, 0x4a, 0x3c, 0x00, 0x48, 0x31, 0x04, 0x00, + 0x15, 0x4f, 0x00, 0x20, 0x0b, 0x01, 0x1b, 0x19, + 0x5a, 0x60, 0xcb, 0x00, 0xdb, 0x19, 0x18, 0x74, + 0x01, 0x31, 0x08, 0x29, 0xf6, 0xdb, 0x0f, 0x4c, + 0xfa, 0x21, 0x21, 0x80, 0x12, 0x49, 0x61, 0x80, + 0xa0, 0x60, 0x6a, 0x46, 0x11, 0x49, 0x04, 0x20, + 0xbd, 0xf7, 0x30, 0xff, 0x6a, 0x46, 0x10, 0x49, + 0x08, 0x20, 0xbd, 0xf7, 0x2b, 0xff, 0x10, 0x20, + 0x70, 0x60, 0x75, 0x60, 0x3c, 0x00, 0x84, 0x31, + 0x04, 0x00, 0x60, 0x68, 0x02, 0x21, 0x08, 0x43, + 0x60, 0x60, 0x0b, 0x49, 0x06, 0x4a, 0x08, 0x1c, + 0x10, 0x30, 0x08, 0x3a, 0x03, 0xc2, 0xf8, 0xbd, + 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x60, + 0x07, 0x00, 0x00, 0x10, 0x07, 0x00, 0xac, 0x73, + 0x01, 0x00, 0xd1, 0x75, 0x00, 0x00, 0x20, 0x4e, + 0x00, 0x00, 0x05, 0x2c, 0x01, 0x00, 0x11, 0x2c, + 0x01, 0x00, 0x00, 0xa0, 0x07, 0x00, 0x3c, 0x00, + 0xc0, 0x31, 0x04, 0x00, 0x70, 0xb5, 0x0e, 0x1c, + 0x00, 0x24, 0xc4, 0xf7, 0x5b, 0xfe, 0x00, 0x28, + 0x3b, 0xd0, 0x45, 0x68, 0xff, 0x2d, 0x38, 0xd0, + 0x0c, 0x2e, 0x28, 0xd2, 0x01, 0xa3, 0x9b, 0x5d, + 0x5b, 0x00, 0x9f, 0x44, 0x05, 0x07, 0x09, 0x0b, + 0x0d, 0x10, 0x13, 0x16, 0x18, 0x1b, 0x1e, 0x21, + 0x18, 0x24, 0x20, 0xe0, 0x30, 0x24, 0x1e, 0xe0, + 0x60, 0x24, 0x1c, 0xe0, 0xc0, 0x24, 0x1a, 0xe0, + 0x3c, 0x00, 0xfc, 0x31, 0x04, 0x00, 0xff, 0x24, + 0x81, 0x34, 0x17, 0xe0, 0x09, 0x24, 0xa4, 0x01, + 0x14, 0xe0, 0x09, 0x24, 0xe4, 0x01, 0x11, 0xe0, + 0x0f, 0x4c, 0x0f, 0xe0, 0x09, 0x24, 0x24, 0x02, + 0x0c, 0xe0, 0x09, 0x24, 0x64, 0x02, 0x09, 0xe0, + 0x03, 0x24, 0xe4, 0x02, 0x06, 0xe0, 0x09, 0x24, + 0xa4, 0x02, 0x03, 0xe0, 0x09, 0x21, 0x9e, 0x20, + 0xbe, 0xf7, 0x39, 0xf8, 0x60, 0x00, 0x00, 0x19, + 0x40, 0x08, 0x3c, 0x00, 0x38, 0x32, 0x04, 0x00, + 0x05, 0x49, 0x80, 0x04, 0x40, 0x18, 0x05, 0x4a, + 0xa9, 0x00, 0x89, 0x18, 0x48, 0x60, 0x64, 0x20, + 0x60, 0x43, 0x70, 0xbd, 0xdc, 0x07, 0x00, 0x00, + 0x80, 0x38, 0x01, 0x00, 0x04, 0x00, 0x07, 0x00, + 0x02, 0x49, 0x80, 0xb5, 0x08, 0x60, 0xd0, 0xf7, + 0x97, 0xf8, 0x80, 0xbd, 0x5c, 0x5b, 0x01, 0x00, + 0xf8, 0xb5, 0x00, 0x26, 0x17, 0x4c, 0x17, 0x4b, + 0x19, 0x49, 0x26, 0x70, 0x3c, 0x00, 0x74, 0x32, + 0x04, 0x00, 0x00, 0x20, 0x14, 0x33, 0x0d, 0x88, + 0x15, 0x4e, 0x15, 0x4a, 0x04, 0xe0, 0xc1, 0x00, + 0xcf, 0x18, 0x7a, 0x60, 0x5e, 0x50, 0x01, 0x30, + 0xa8, 0x42, 0xf8, 0xdb, 0xc6, 0xf7, 0x2b, 0xfd, + 0xff, 0x21, 0x11, 0x4d, 0xa5, 0x31, 0x28, 0x1c, + 0xbd, 0xf7, 0xff, 0xf8, 0x00, 0x21, 0x28, 0x1c, + 0x02, 0x1c, 0x14, 0x32, 0xc2, 0x60, 0x10, 0x1c, + 0x01, 0x31, 0x14, 0x29, 0xf8, 0xdb, 0x3c, 0x00, + 0xb0, 0x32, 0x04, 0x00, 0x00, 0x26, 0xc6, 0x60, + 0x05, 0x48, 0x0c, 0x30, 0x60, 0xc0, 0x09, 0x48, + 0x18, 0x21, 0xbd, 0xf7, 0xed, 0xf8, 0x01, 0x20, + 0x04, 0x34, 0x41, 0xc4, 0x00, 0x20, 0xf8, 0xbd, + 0x70, 0x5d, 0x01, 0x00, 0x09, 0xa0, 0x00, 0x00, + 0x30, 0xd9, 0x01, 0x00, 0x56, 0x57, 0x01, 0x00, + 0x04, 0x5f, 0x01, 0x00, 0xa8, 0x60, 0x01, 0x00, + 0x80, 0xb5, 0x00, 0x20, 0xcf, 0xf7, 0xb6, 0xfc, + 0x3c, 0x00, 0xec, 0x32, 0x04, 0x00, 0x01, 0x49, + 0x08, 0x80, 0x80, 0xbd, 0x00, 0x00, 0x2c, 0x74, + 0x01, 0x00, 0x11, 0x48, 0xf8, 0xb5, 0x41, 0x79, + 0x00, 0x29, 0x02, 0xd1, 0x05, 0x78, 0x0f, 0x4e, + 0x01, 0xe0, 0x45, 0x78, 0x0f, 0x4e, 0x02, 0x23, + 0xf7, 0x5e, 0x00, 0x24, 0x60, 0x1b, 0x78, 0x43, + 0x64, 0x23, 0x0c, 0x49, 0x58, 0x43, 0x41, 0x18, + 0x7d, 0x20, 0xc0, 0x00, 0xbd, 0xf7, 0xf5, 0xf9, + 0x61, 0x00, 0x3c, 0x00, 0x28, 0x33, 0x04, 0x00, + 0x09, 0x4a, 0xac, 0x42, 0x50, 0x52, 0x01, 0xd1, + 0x00, 0x23, 0xf7, 0x5e, 0x01, 0x34, 0x24, 0x06, + 0x24, 0x0e, 0x10, 0x2c, 0xe9, 0xd3, 0xf8, 0xbd, + 0x0c, 0x5a, 0x01, 0x00, 0xfe, 0x59, 0x01, 0x00, + 0xfa, 0x59, 0x01, 0x00, 0x34, 0x44, 0x0f, 0x00, + 0x32, 0x5a, 0x01, 0x00, 0x38, 0xb5, 0x10, 0x4c, + 0xbe, 0x25, 0x25, 0x73, 0x20, 0x7a, 0x18, 0x21, + 0x88, 0x43, 0x20, 0x72, 0x3c, 0x00, 0x64, 0x33, + 0x04, 0x00, 0x6a, 0x46, 0x0d, 0x49, 0x0d, 0x20, + 0xbd, 0xf7, 0x33, 0xfe, 0x01, 0x20, 0x0b, 0x49, + 0x40, 0x03, 0x08, 0x60, 0x48, 0x60, 0x25, 0x73, + 0x2d, 0x20, 0xc0, 0x03, 0x20, 0x60, 0x25, 0x73, + 0x20, 0x7a, 0x10, 0x21, 0x08, 0x43, 0x20, 0x72, + 0x06, 0x48, 0x06, 0x49, 0x08, 0x60, 0x00, 0x20, + 0x48, 0x60, 0x38, 0xbd, 0x00, 0x00, 0x00, 0x03, + 0x07, 0x00, 0x8d, 0x3e, 0x01, 0x00, 0x24, 0x00, + 0xa0, 0x33, 0x04, 0x00, 0x00, 0x10, 0x07, 0x00, + 0x00, 0x87, 0x93, 0x03, 0x04, 0x79, 0x01, 0x00, + 0x80, 0xb5, 0x02, 0x21, 0x15, 0x20, 0x02, 0x4a, + 0xd0, 0xf7, 0xc8, 0xf9, 0x80, 0xbd, 0x00, 0x00, + 0x0d, 0x3e, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x60, 0x04, 0x00, 0x44, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x40, 0x20, 0x07, 0x00, + 0xff, 0xff, 0xff, 0xff, +}; +const uint32_t fw_len = sizeof(fw_buf) / sizeof(fw_buf[0]); diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wl_os.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wl_os.h new file mode 100644 index 0000000..1a3b75f --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wl_os.h @@ -0,0 +1,35 @@ +#ifndef WL_OS_H +#define WL_OS_H + +#include +#include + +void *owl_os_alloc(size_t size); +void *owl_os_realloc(void *ptr, size_t size); +void owl_os_free(void *p); +void *owl_os_memcpy(void *dst, const void *src, size_t n); +void *owl_os_memset(void *s, int c, size_t n); +void *owl_os_memmove(void *dst, const void *src, size_t n); +size_t owl_os_strlen(char *s); +char *owl_os_strncpy(char *dst, const char *src, size_t n); +int owl_os_strncmp(const char *s1, const char *s2, size_t n); +int owl_os_strcmp(const char *s1, const char *s2); +char *owl_os_strcpy(char *dst, const char *src); +char *owl_os_strdup(const char *s); +char *owl_os_strndup(const char *s, size_t n); +int owl_os_memcmp(const void *s1, const void *s2, size_t n); +long int owl_os_strtol(const char *nptr, char **endptr, int base); +char *owl_os_strchr(const char *s, int c); +char *owl_os_strrchr(const char *s, int c); +int owl_os_strcasecmp(const char *s1, const char *s2); +char *owl_os_strstr(const char *haystack, const char *needle); + +int owl_os_snprintf(char *str, size_t size, const char *format, ...) + __attribute__((format(printf, 3, 4))); + +int owl_os_vprintf(const char *format, va_list arg); /* debug only */ +int owl_os_printf(const char *format, ...) /* debug only */ + __attribute__((format(printf, 1, 2))); + +#endif /* WL_OS_H */ + diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wl_sdio.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wl_sdio.h new file mode 100644 index 0000000..ee08fad --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wl_sdio.h @@ -0,0 +1,172 @@ +/*! + * \file wl_sdio.h + * \brief SDIO interface for wl_api. + * Copyright (C) 2010 HD Wireless AB + * + * You should have received a copy of the license along with this library. + */ + +#ifndef WL_SDIO_H +#define WL_SDIO_H + +/** \defgroup wl_sdio SDIO Interface + * + * These functions implement the interface that the wl_api library + * needs to work with a SDIO transport layer. + * + * The functions prototyped here must be implemented when porting the + * wl_api library to a new platform with a different SDIO configuration + * + * On platforms supported by H&D Wireless these functions are + * implemented in the file avr32_sdio.c + * + * @{ + */ + +/** + * Maximum transfer size. This will set an upper limit on the len parameter + * passed to owl_sdio_tx() and owl_sdio_rx(). + * + */ +#define MAX_BLOCK_LEN 512 + + +/** + * This flag might be set when owl_sdio_cmd() is called in case the cmd will + * be followed by a data transfer. If the flag is set, the transfer direction is + * from the device to the host (read). Otherwise, the transfer direction is + * from the host to the device (write). + * + */ + #define CMD_FLAG_TO_HOST (1 << 0) + + +/** + * Indicates that the sdio driver needs to be polled in order to make + * forward progress, i.e. it does not support interrupts + * + * The actual polling will result in owl_sdio_cmd() being called to + * request status information from the device. + * + * To activate polling, this flag should be set in owl_sdio_init(). + */ +#define SDIO_FLAG_POLL (1 << 0) + +/** + * Indicates that the sdio driver only supports 1-bit mode. + * + * To set 1-bit mode, this flag should be set in owl_sdio_init(). + */ +#define SDIO_FLAG_1BIT_MODE (1 << 1) + +/** + * This function will be invoked when wlan initialization should be performed, + * this happens when the wl_fw_download() function in the transport group of + * wl_api is invoked. + * + * The wifi device supports sdio high speed mode and clock frequencies up to + * 50 MHz. + * + * The function is responsible for doing any necessary sdio initialization such + * as allocating gpio's, setting up the mci master, one time allocations of + * dma buffers etc. + * + * @param flags is an out parameter that should hold any sdio flags upon return. + * The avaible flags are prefixed with SDIO_FLAG_ + * + * + */ +void owl_sdio_init(uint8_t *flags); + + + +/** + * This function will be invoked when an sdio cmd should be sent to the + * device. + * + * @param idx is the sdio command number + * @param arg is the sdio command argument + * @param flags specifies other options, such as any transfer direction. + * @param rsp should hold the command response upon return. If null, the + * response can be ignored. + * @param data holds a pointer to any data that might follow the command. This + * allows the sdio driver to setup dma transfers while waiting for the + * command response. NULL if no data transfer will follow. Note that + * the same data pointer will be passed to owl_sdio_tx(), which should + * start the actual transfer. + * @param len is the length of the data buffer. + * + */ +void owl_sdio_cmd(uint8_t idx, uint32_t arg, uint8_t flags, uint32_t *rsp, + const uint8_t *data, uint16_t len); + + +/** + * This function will be invoked when data should be transmitted to the device. + * + * If wl_fw_downlad() was called with the size_align parameter set to non-zero, + * the pad parameter should be used. If the pad parameter is not 0, additional + * data must be transmitted after the data buffer has be sent. Depending on + * how the data buffer was first allocated (probably by an TCP/IP stack), it + * might be safe or unsafe to continue reading beyond the data buffer to + * transmit the additional padding bytes. + * + * @param data holds a pointer to the data to transmit, the pointer is the + * same as the one passed to wl_tx(). + * @param len is the number of bytes that should be transmitted, including + * padding. + * @param pad is the number of padding bytes to send. + * + */ +void owl_sdio_tx(const uint8_t *data, uint16_t len, uint8_t pad); + + +/** + * This function will be invoked when data should be received from the device. + * + * @param data should hold the read data upon return. + * @param len is the number of bytes to read. + * + */ +void owl_sdio_rx(uint8_t *data, uint16_t len); + + +/** + * Invoked when sdio rx interrupts from the device should be enabled or + * disabled. + * + * If SDIO_FLAG_POLL was set in wl_spi_init(), then this function can be + * left empty. + * + * @param enable specifies if interrupts should be enabled or disabled. + * + */ +void owl_sdio_irq(uint8_t enable); + + +/** + * Delay executiom for the specified number of ms. This function will be called + * with delays in the 10-20 ms range during fw download and startup of the + * Wi-Fi device. This function can be implemented with a simple for-loop if + * desired (beware of optimization). The timing does not have to be accurate as + * long as the actual delay becomes at least the specified number of ms. + * + * @param ms is the minimal amount of time to wait [ms]. + * + */ +void owl_sdio_mdelay(uint32_t ms); + + +/** + * This function should be called whenever an interrupt is detected. It can + * be called from an interrupt context. + * + * If SDIO_FLAG_POLL was set in owl_sdio_init(), then wl_sdio_irq() + * should never be called. + * + */ +extern void wl_sdio_irq(void); + +/*! @} */ + +#endif diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wl_spi.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wl_spi.h new file mode 100644 index 0000000..5d91374 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wl_spi.h @@ -0,0 +1,185 @@ +/*! + * \file wl_spi.h + * \brief SPI interface for wl_api. + * Copyright (C) 2010 HD Wireless AB + * + * You should have received a copy of the license along with this library. + */ + +#ifndef WL_SPI_H +#define WL_SPI_H + +#ifndef WITHOUT_STDINT +#include +#endif + +/** \defgroup wl_spi SPI Interface + * + * These functions implement the interface that the wl_api library + * needs to work with a SPI transport layer. + * + * The functions prototyped here must be implemented when porting the + * wl_api library to a new platform with a different SPI configuration + * + * On platforms supported by H&D Wireless these functions are + * implemented in the file avr32_spi.c + * + * @{ + */ + +/** + * Maximum transfer size. This will set an upper limit on the len parameter + * passed to owl_spi_txrx(). + * + * + */ +#define MAX_BLOCK_LEN 512 + + +/** + * Indicates that the spi driver needs to be polled in order to make + * forward progress, i.e. it does not support interrupts through SD pin 8. + * + * The actual polling will result in owl_spi_txrx() being call to + * request status information from the device. + * + * To activate polling, this flag should be set in owl_spi_init(). + * + * See wl_poll() and wl_register_rx_isr() for more information regarding + * polled and interrupt modes. + * + */ +#define SPI_FLAG_POLL (1 << 0) + + +/** + * This function will be invoked when wlan device initialization should be + * performed, this happens when the wl_fw_download() function in the transport + * group of wl_api is invoked. + * + * The wifi device requires spi mode 3, i.e. clock polarity high and sample + * on second phase. This corresponds to CPOL=1, CPHA=1. Maximum frequency on + * spi clock is 30 MHz. + * + * The function is also responsible for doing any necessary spi initialization + * such as allocating gpio's, setting up the SPI master, one time allocations of + * dma buffers etc. + * + * + * If the SPB105 device is used, two signals; POWER (pin 10 on SPB105) and + * SHUTDOWN (pin 4 on SPB105) might be connected to gpio's on the host. + * The GPIO_POWER_PIN is the main power supply to the device. The + * GPIO_SHUTDOWN_PIN (active low) should be defined as an input. + * + * After GPIO_POWER_PIN is pulled high by the host, the device will pull the + * GPIO_SHUTDOWN_PIN high once the device is properly powered. + * + * However, if pin 4 (GPIO_SHUTDOWN_PIN) is not connected to the host, a delay + * of up to 250 ms must be added after GPIO_POWER_PIN is pulled high to ensure + * that startup is completed. The actual time is usually much shorter, therefore + * one might try to reduce the delay for a particualar hardware design. + * + * On SPB104, the GPIO_POWER_PIN will be connected to VCC and GPIO_SHUTDOWN_PIN + * will be unconnected; hence we have to make sure that we have enough delay + * after powering on the host. Since the device power-on usually happens at the + * same time as the host power-on, the startup time of the host can be + * subtracted from any delay put into owl_spi_init(). + * + * @param flags is an out parameter that should hold any spi flags upon return. + * The avaible flags are prefixed with SPI_FLAG_ + * + * @return 0 on success + * -1 if any error occurs + * + */ +int owl_spi_init(uint8_t *flags); + + +/** + * Invoked when a spi transfer should be performed. + * + * All buffers that are allocated by the wl library will have a size that is + * aligned to 4. If size-unaligned data is passed to this function, it is + * always allocated by the ip stack. If 4-byte size alignment (e.g. for DMA) + * is required, 1-3 extra padding bytes can be transmitted after the in buffer. + * These bytes must be 0xff. + * + * Since size-unaligned data always comes from the ip stack, the out ptr is + * always NULL for such data. + * + * @param in points a buffer which holds the data to be transmitted. If NULL, + * then \a len bytes with the value 0xff should be transmitted on the + * bus. + * @param out points a buffer should hold the data received from the device. If + * NULL, any received data can be discarded. + * @param len is the length of the in and out buffers. + * + */ +void owl_spi_txrx(const uint8_t *in, uint8_t* out, uint16_t len); + + +/** + * Invoked when spi rx interrupts from the device should be enabled or disabled. + * Note that the spi interrupts are obtained from pin 8 on SPB104 or pin 3 from + * SPB105. This pin can be be connected to a gpio on the host. The irq line + * will signal an interrupt on both edges. + * + * In general, the wifi device will not issue a new interrupt unless the + * last interrupt has been handled. Also, during normal operation (i.e after + * the complete callback registered in wl_init() has been invoked), + * owl_spi_irq() will never be invoked so interrupts will be enabled all + * the time. For the SPI-mode, the purpose of owl_spi_irq() is basically to + * make sure that the first interrupt (coming after the reset performed in + * owl_spi_init()) is ignored. + * + * If SPI_FLAG_POLL was set in owl_spi_init(), then this function can be + * left empty and the wifi device will be used in polled mode. In polled mode, + * the interrupt line is not used. Regardless of polled or interrupt-mode, + * wl_poll() must be called to ensure progress of the driver. + * + * @param enable specifies if interrupts should be enabled or disabled. + * + */ +void owl_spi_irq(uint8_t enable); + + +/** + * Invoked when the spi cs for the wifi device should be enabled. Note that + * multiple calls to owl_spi_txrx() might be done during a 'single' chip + * select. + * + * @param enable specifies whether chip select should be asserted or deasserted, + * The chip select signal is active low, so if enable is '1' then the + * chip select connected to the wifi device should be set to '0'. + * + */ +void owl_spi_cs(uint8_t enable); + + +/** + * Delay executiom for the specified number of ms. This function will be called + * with delays in the 10-20 ms range during fw download and startup of the + * Wi-Fi device. This function can be implemented with a simple for-loop if + * desired (beware of optimization). The timing does not have to be accurate as + * long as the actual delay becomes at least the specified number of ms. + * + * @param ms is the minimal amount of time to wait [ms]. + * + */ +void owl_spi_mdelay(uint32_t ms); + + +/** + * This function should be called whenever an interrupt is detected. It can + * be called from an interrupt context. + * + * If SPI_FLAG_POLL was set in owl_spi_init(), then wl_spi_irq() + * should never be called. + * + */ +extern void wl_spi_irq(void); + + +/*! @} */ + +#endif diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wlap_api.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wlap_api.h new file mode 100644 index 0000000..9a4483a --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/wlap_api.h @@ -0,0 +1,154 @@ +/* + * Programming interface for wlap_api. + * Copyright (C) 2011 HD Wireless AB + * + * You should have received a copy of the license along with this library. + */ + +/*! \file wlap_api.h ************************************************************* + * + * \brief WiFi AP API + * + * This file provides the wlap_api interface. + * + * - Compiler: GNU GCC for AVR32 + * - Supported devices: + * \li SPB104 + EVK1100 + * \li SPB104 + EVK1101 + * \li SPB104 + EVK1104 + * \li SPB104 + EVK1105 (SPI) + * \li SPB104 + EVK1105 (SPI + irq) + * \li SPB105 + EVK1105 (SPI) + * - AppNote: + * + * \author H&D Wireless AB: \n + * + ***************************************************************************** + * + * \section intro Introduction + * This is the documentation for the WiFi AP Driver API \a wlap_api. + * + * \section files Main Files + * - wlap_api.h : WiFi driver interface. + * - libwlap_api_*.*.a - Driver library. + * + */ + +#ifndef WLAP_API_H +#define WLAP_API_H + +#define WLAP_API_RELEASE_NAME "unknown" + +#include + +/** \defgroup wl_softap Access Point Mode + * + * \brief Support the WiFi Access Point mode. + * + * @{ + */ +/* + * Station representation + * + */ +struct wl_sta_t +{ + struct wl_mac_addr_t bssid; /**< The BSSID of the network. */ + uint8_t queued_pkt_cnt; /**< Number of queueud packets for + this STA. */ + uint8_t in_ps; /**< Is the STA in power save mode. */ + uint8_t aid; /**< STA AID */ +}; + +/* Station list representation. Array of pointers to wl_sta_t entries. */ +struct wl_sta_list_t +{ + struct wl_sta_t **sta; /**< The list of pointers to stations */ + size_t cnt; /**< Number of stations */ +}; + +/*! \brief Get the list of currently associated stations (SoftAP). + * + * Retrieves the list of current stations from + * the driver. + * + * This function is not thread safe. It must be called in the + * same execution context as wl_poll(). + * + * @param network_list Output buffer. The API call returns + * a pointer to allocated memory containing the network list. + * @return + * - WL_SUCCESS + * - WL_FAILURE. + */ +wl_err_t wlap_get_sta_list(struct wl_sta_list_t **network_list); + + +/*! Callback used to read data from a TX packet. + * This function is supplied by the user of the API. + * + * @param dst Destination buffer. The data should be copied + * to this buffer. + * @param src_handle Handle to the source packet from where + * the data should be copied. This handle is the same one that + * is passed in parameter \a pkt_handle to \a wl_process_tx(). + * @param read_len Number of bytes to copy from \a src_handle + * to \a dst. + * @param offset The offset in bytes, counting from the + * beginning of the Ethernet header, from where to copy data. + * @return + * - The number of bytes copied. This number may be smaller + * than the length requested in \a read_len but it may not + * be shorter than the length of the packet counting from + * \a offset. In other words, if the caller of this function + * receives a return count that is shorter than \a read_len + * he will assume that all packet data has been read. + * - < 0 on error. + */ +typedef ssize_t (*wl_pkt_read_cb_t)(char *dst, + void *src_handle, + size_t read_len, + int offset); + +/*! \brief Register a data access function for TX packets (SoftAP). + * + * When a TX data packet has a different representation than a single + * contiguous buffer in memory then a packet read function must be + * implemented and registered with this call. Whenever the library + * needs to read packet data it will call this function to do it. + * + * This function can be ignored if the TX packet representation is + * a single contiguous buffer. This function is only needed in SoftAP + * mode. + * + * @param pkt_read_cb Read callback. + * @param ctx Context + */ +void wl_register_pkt_read_cb(wl_pkt_read_cb_t pkt_read_cb); + +/*! \brief Start a network using the SoftAP mode. + * + * This call will cause the WiFi chip to start sending beacons + * and accept associations from WiFi stations. + * + */ +wl_err_t wlap_start_ap(const char *ssid, + const size_t ssid_len, + const uint8_t channel, + const enum wl_auth_mode auth_mode, + const enum wl_enc_type enc_type); + +/*! \brief Disconnect a STA (SoftAP) + * + * @param bssid The BSSID of the station to disconnect. + * @return + * - WL_SUCCESS + * - WL_FAILURE. + */ +wl_err_t wlap_disconnect_sta(const struct wl_mac_addr_t bssid); + + +/*! @} */ /* End wl_softap group */ + + +#endif diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/CPU/CYCLE_COUNTER/cycle_counter.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/CPU/CYCLE_COUNTER/cycle_counter.h new file mode 100644 index 0000000..d0c51df --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/CPU/CYCLE_COUNTER/cycle_counter.h @@ -0,0 +1,309 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file has been prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Cycle counter driver. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32UC devices. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + *****************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _CYCLE_COUNTER_H_ +#define _CYCLE_COUNTER_H_ + +#include "compiler.h" + + +//! Structure holding private information, automatically initialized by the +//! cpu_set_timeout() function. +typedef struct +{ + //! The cycle count at the begining of the timeout. + unsigned long delay_start_cycle; + + //! The cycle count at the end of the timeout. + unsigned long delay_end_cycle; + + //! Enable/disable the timout detection + unsigned char timer_state; + #define CPU_TIMER_STATE_STARTED 0 + #define CPU_TIMER_STATE_REACHED 1 + #define CPU_TIMER_STATE_STOPPED 2 +} t_cpu_time; + + +/*! + * \brief Convert milli-seconds into CPU cycles. + * + * \param ms: Number of millisecond. + * \param fcpu_hz: CPU frequency in Hz. + * + * \return the converted number of CPU cycles. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ U32 cpu_ms_2_cy(unsigned long ms, unsigned long fcpu_hz) +{ + return ((unsigned long long)ms * fcpu_hz + 999) / 1000; +} + + +/*! + * \brief Convert micro-seconds into CPU cycles. + * + * \param us: Number of microsecond. + * \param fcpu_hz: CPU frequency in Hz. + * + * \return the converted number of CPU cycles. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ U32 cpu_us_2_cy(unsigned long us, unsigned long fcpu_hz) +{ + return ((unsigned long long)us * fcpu_hz + 999999) / 1000000; +} + + +/*! + * \brief Convert CPU cycles into milli-seconds. + * + * \param cy: Number of CPU cycles. + * \param fcpu_hz: CPU frequency in Hz. + * + * \return the converted number of milli-second. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ U32 cpu_cy_2_ms(unsigned long cy, unsigned long fcpu_hz) +{ + return ((unsigned long long)cy * 1000 + fcpu_hz-1) / fcpu_hz; +} + + +/*! + * \brief Convert CPU cycles into micro-seconds. + * + * \param cy: Number of CPU cycles. + * \param fcpu_hz: CPU frequency in Hz. + * + * \return the converted number of micro-second. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ U32 cpu_cy_2_us(unsigned long cy, unsigned long fcpu_hz) +{ + return ((unsigned long long)cy * 1000000 + fcpu_hz-1) / fcpu_hz; +} + + +/*! + * \brief Set a timer variable. + * + * Ex: t_cpu_time timer; + * cpu_set_timeout( cpu_ms_2_cy(10, FOSC0), &timer ); // timeout in 10 ms + * if( cpu_is_timeout(&timer) ) + * cpu_stop_timeout(&timer); + * ../.. + * + * \param delay: (input) delay in CPU cycles before timeout. + * \param cpu_time: (output) internal information used by the timer API. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void cpu_set_timeout(unsigned long delay, t_cpu_time *cpu_time) +{ + cpu_time->delay_start_cycle = Get_system_register(AVR32_COUNT); + cpu_time->delay_end_cycle = cpu_time->delay_start_cycle + delay; + cpu_time->timer_state = CPU_TIMER_STATE_STARTED; +} + + +/*! + * \brief Test if a timer variable reached its timeout. + * + * Once the timeout is reached, the function will always return TRUE, + * until the cpu_stop_timeout() function is called. + * + * Ex: t_cpu_time timer; + * cpu_set_timeout( 10, FOSC0, &timer ); // timeout in 10 ms + * if( cpu_is_timeout(&timer) ) + * cpu_stop_timeout(&timer); + * ../.. + * + * \param cpu_time: (input) internal information used by the timer API. + * + * \return TRUE if timeout occured, otherwise FALSE. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ unsigned long cpu_is_timeout(t_cpu_time *cpu_time) +{ + unsigned long current_cycle_count = Get_system_register(AVR32_COUNT); + + if( cpu_time->timer_state==CPU_TIMER_STATE_STOPPED ) + return FALSE; + + // Test if the timeout as already occured. + else if (cpu_time->timer_state == CPU_TIMER_STATE_REACHED) + return TRUE; + + // If the ending cycle count of this timeout is wrapped, ... + else if (cpu_time->delay_start_cycle > cpu_time->delay_end_cycle) + { + if (current_cycle_count < cpu_time->delay_start_cycle && current_cycle_count > cpu_time->delay_end_cycle) + { + cpu_time->timer_state = CPU_TIMER_STATE_REACHED; + return TRUE; + } + return FALSE; + } + else + { + if (current_cycle_count < cpu_time->delay_start_cycle || current_cycle_count > cpu_time->delay_end_cycle) + { + cpu_time->timer_state = CPU_TIMER_STATE_REACHED; + return TRUE; + } + return FALSE; + } +} + + +/*! + * \brief Stop a timeout detection. + * + * Ex: t_cpu_time timer; + * cpu_set_timeout( 10, FOSC0, &timer ); // timeout in 10 ms + * if( cpu_is_timeout(&timer) ) + * cpu_stop_timeout(&timer); + * ../.. + * + * \param cpu_time: (input) internal information used by the timer API. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void cpu_stop_timeout(t_cpu_time *cpu_time) +{ + cpu_time->timer_state = CPU_TIMER_STATE_STOPPED; +} + + +/*! + * \brief Test if a timer is stopped. + * + * \param cpu_time: (input) internal information used by the timer API. + * + * \return TRUE if timer is stopped, otherwise FALSE. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ unsigned long cpu_is_timer_stopped(t_cpu_time *cpu_time) +{ + + if( cpu_time->timer_state==CPU_TIMER_STATE_STOPPED ) + return TRUE; + else + return FALSE; +} + + +/*! + * \brief Waits during at least the specified delay (in millisecond) before returning. + * + * \param delay: Number of millisecond to wait. + * \param fcpu_hz: CPU frequency in Hz. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void cpu_delay_ms(unsigned long delay, unsigned long fcpu_hz) +{ + t_cpu_time timer; + cpu_set_timeout( cpu_ms_2_cy(delay, fcpu_hz), &timer); + while( !cpu_is_timeout(&timer) ); +} + +/*! + * \brief Waits during at least the specified delay (in microsecond) before returning. + * + * \param delay: Number of microsecond to wait. + * \param fcpu_hz: CPU frequency in Hz. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void cpu_delay_us(unsigned long delay, unsigned long fcpu_hz) +{ + t_cpu_time timer; + cpu_set_timeout( cpu_us_2_cy(delay, fcpu_hz), &timer); + while( !cpu_is_timeout(&timer) ); +} + +/*! + * \brief Waits during at least the specified delay (in CPU cycles) before returning. + * + * \param delay: Number of CPU cycles to wait. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void cpu_delay_cy(unsigned long delay) +{ + t_cpu_time timer; + cpu_set_timeout( delay, &timer); + while( !cpu_is_timeout(&timer) ); +} + + +#define Get_sys_count() ( Get_system_register(AVR32_COUNT) ) +#define Set_sys_count(x) ( Set_system_register(AVR32_COUNT, (x)) ) +#define Get_sys_compare() ( Get_system_register(AVR32_COMPARE) ) +#define Set_sys_compare(x) ( Set_system_register(AVR32_COMPARE, (x)) ) + + +#endif // _CYCLE_COUNTER_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC/smc.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC/smc.c new file mode 100644 index 0000000..543fed6 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC/smc.c @@ -0,0 +1,995 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief SMC on EBI driver for AVR32 UC3. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with a SMC module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#include "compiler.h" +#include "preprocessor.h" +#include "gpio.h" +#include "smc.h" + +// Configure the SM Controller with SM setup and timing information for all chip select +#define SMC_CS_SETUP(ncs) { \ + U32 nwe_setup = ((NWE_SETUP * hsb_mhz_up + 999) / 1000); \ + U32 ncs_wr_setup = ((NCS_WR_SETUP * hsb_mhz_up + 999) / 1000); \ + U32 nrd_setup = ((NRD_SETUP * hsb_mhz_up + 999) / 1000); \ + U32 ncs_rd_setup = ((NCS_RD_SETUP * hsb_mhz_up + 999) / 1000); \ + U32 nwe_pulse = ((NWE_PULSE * hsb_mhz_up + 999) / 1000); \ + U32 ncs_wr_pulse = ((NCS_WR_PULSE * hsb_mhz_up + 999) / 1000); \ + U32 nrd_pulse = ((NRD_PULSE * hsb_mhz_up + 999) / 1000); \ + U32 ncs_rd_pulse = ((NCS_RD_PULSE * hsb_mhz_up + 999) / 1000); \ + U32 nwe_cycle = ((NWE_CYCLE * hsb_mhz_up + 999) / 1000); \ + U32 nrd_cycle = ((NRD_CYCLE * hsb_mhz_up + 999) / 1000); \ + \ + /* Some coherence checks... */ \ + /* Ensures CS is active during Rd or Wr */ \ + if( ncs_rd_setup + ncs_rd_pulse < nrd_setup + nrd_pulse ) \ + ncs_rd_pulse = nrd_setup + nrd_pulse - ncs_rd_setup; \ + if( ncs_wr_setup + ncs_wr_pulse < nwe_setup + nwe_pulse ) \ + ncs_wr_pulse = nwe_setup + nwe_pulse - ncs_wr_setup; \ + \ + /* ncs_hold = n_cycle - ncs_setup - ncs_pulse */ \ + /* n_hold = n_cycle - n_setup - n_pulse */ \ + /* */ \ + /* All holds parameters must be positive or null, so: */ \ + /* nwe_cycle shall be >= ncs_wr_setup + ncs_wr_pulse */ \ + if( nwe_cycle < ncs_wr_setup + ncs_wr_pulse ) \ + nwe_cycle = ncs_wr_setup + ncs_wr_pulse; \ + \ + /* nwe_cycle shall be >= nwe_setup + nwe_pulse */ \ + if( nwe_cycle < nwe_setup + nwe_pulse ) \ + nwe_cycle = nwe_setup + nwe_pulse; \ + \ + /* nrd_cycle shall be >= ncs_rd_setup + ncs_rd_pulse */ \ + if( nrd_cycle < ncs_rd_setup + ncs_rd_pulse ) \ + nrd_cycle = ncs_rd_setup + ncs_rd_pulse; \ + \ + /* nrd_cycle shall be >= nrd_setup + nrd_pulse */ \ + if( nrd_cycle < nrd_setup + nrd_pulse ) \ + nrd_cycle = nrd_setup + nrd_pulse; \ + \ + AVR32_SMC.cs[ncs].setup = (nwe_setup << AVR32_SMC_SETUP0_NWE_SETUP_OFFSET) | \ + (ncs_wr_setup << AVR32_SMC_SETUP0_NCS_WR_SETUP_OFFSET) | \ + (nrd_setup << AVR32_SMC_SETUP0_NRD_SETUP_OFFSET) | \ + (ncs_rd_setup << AVR32_SMC_SETUP0_NCS_RD_SETUP_OFFSET); \ + AVR32_SMC.cs[ncs].pulse = (nwe_pulse << AVR32_SMC_PULSE0_NWE_PULSE_OFFSET) | \ + (ncs_wr_pulse << AVR32_SMC_PULSE0_NCS_WR_PULSE_OFFSET) | \ + (nrd_pulse << AVR32_SMC_PULSE0_NRD_PULSE_OFFSET) | \ + (ncs_rd_pulse << AVR32_SMC_PULSE0_NCS_RD_PULSE_OFFSET); \ + AVR32_SMC.cs[ncs].cycle = (nwe_cycle << AVR32_SMC_CYCLE0_NWE_CYCLE_OFFSET) | \ + (nrd_cycle << AVR32_SMC_CYCLE0_NRD_CYCLE_OFFSET); \ + AVR32_SMC.cs[ncs].mode = (((NCS_CONTROLLED_READ) ? AVR32_SMC_MODE0_READ_MODE_NCS_CONTROLLED : \ + AVR32_SMC_MODE0_READ_MODE_NRD_CONTROLLED) << AVR32_SMC_MODE0_READ_MODE_OFFSET) | \ + + (((NCS_CONTROLLED_WRITE) ? AVR32_SMC_MODE0_WRITE_MODE_NCS_CONTROLLED : \ + AVR32_SMC_MODE0_WRITE_MODE_NWE_CONTROLLED) << AVR32_SMC_MODE0_WRITE_MODE_OFFSET) | \ + (NWAIT_MODE << AVR32_SMC_MODE0_EXNW_MODE_OFFSET) | \ + (((SMC_8_BIT_CHIPS) ? AVR32_SMC_MODE0_BAT_BYTE_WRITE : \ + AVR32_SMC_MODE0_BAT_BYTE_SELECT) << AVR32_SMC_MODE0_BAT_OFFSET) | \ + (((SMC_DBW <= 8 ) ? AVR32_SMC_MODE0_DBW_8_BITS : \ + (SMC_DBW <= 16) ? AVR32_SMC_MODE0_DBW_16_BITS : \ + AVR32_SMC_MODE0_DBW_32_BITS) << AVR32_SMC_MODE0_DBW_OFFSET) | \ + (TDF_CYCLES << AVR32_SMC_MODE0_TDF_CYCLES_OFFSET) | \ + (TDF_OPTIM << AVR32_SMC_MODE0_TDF_MODE_OFFSET) | \ + (PAGE_MODE << AVR32_SMC_MODE0_PMEN_OFFSET) | \ + (PAGE_SIZE << AVR32_SMC_MODE0_PS_OFFSET); \ + smc_tab_cs_size[ncs] = (U8)EXT_SM_SIZE; \ + } + +static U8 smc_tab_cs_size[6]; + +static void smc_enable_muxed_pins(void); + + +void smc_init(unsigned long hsb_hz) +{ + unsigned long hsb_mhz_up = (hsb_hz + 999999) / 1000000; + +//! Whether to use the NCS0 pin +#ifdef SMC_USE_NCS0 + #include SMC_COMPONENT_CS0 + + // Setup SMC for NCS0 + SMC_CS_SETUP(0) + + #ifdef SMC_DBW_GLOBAL + #if (SMC_DBW_GLOBAL < SMC_DBW) + #undef SMC_DBW_GLOBAL + #if (SMC_DBW == 8) + #define SMC_DBW_GLOBAL 8 + #elif (SMC_DBW == 16) + #define SMC_DBW_GLOBAL 16 + #elif (SMC_DBW == 32) + #define SMC_DBW_GLOBAL 32 + #else + #error error in SMC_DBW size + #endif + #endif + #else + #if (SMC_DBW == 8) + #define SMC_DBW_GLOBAL 8 + #elif (SMC_DBW == 16) + #define SMC_DBW_GLOBAL 16 + #elif (SMC_DBW == 32) + #define SMC_DBW_GLOBAL 32 + #else + #error error in SMC_DBW size + #endif + #endif + + #ifdef SMC_8_BIT_CHIPS_GLOBAL + #if (SMC_8_BIT_CHIPS_GLOBAL < SMC_8_BIT) + #undef SMC_8_BIT_CHIPS_GLOBAL + #if (SMC_8_BIT_CHIPS == TRUE) + #define SMC_8_BIT_CHIPS_GLOBAL TRUE + #elif (SMC_8_BIT_CHIPS == FALSE) + #define SMC_8_BIT_CHIPS_GLOBAL FALSE + #else + #error error in SMC_8_BIT_CHIPS size + #endif + #endif + #else + #if (SMC_8_BIT_CHIPS == TRUE) + #define SMC_8_BIT_CHIPS_GLOBAL TRUE + #elif (SMC_8_BIT_CHIPS == FALSE) + #define SMC_8_BIT_CHIPS_GLOBAL FALSE + #else + #error error in SMC_8_BIT_CHIPS size + #endif + #endif + + #ifdef NWAIT_MODE_GLOBAL + #if (NWAIT_MODE_GLOBAL < NWAIT_MODE) + #undef NWAIT_MODE_GLOBAL + #if (NWAIT_MODE == AVR32_SMC_EXNW_MODE_DISABLED) + #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_DISABLED + #elif (NWAIT_MODE == AVR32_SMC_EXNW_MODE_FROZEN) + #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_FROZEN + #else + #error error in NWAIT_MODE size + #endif + #endif + #else + #if (NWAIT_MODE == AVR32_SMC_EXNW_MODE_DISABLED) + #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_DISABLED + #elif (NWAIT_MODE == AVR32_SMC_EXNW_MODE_FROZEN) + #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_FROZEN + #else + #error error in NWAIT_MODE size + #endif + #endif + + #undef EXT_SM_SIZE + #undef SMC_DBW + #undef SMC_8_BIT_CHIPS + #undef NWE_SETUP + #undef NCS_WR_SETUP + #undef NRD_SETUP + #undef NCS_RD_SETUP + #undef NCS_WR_PULSE + #undef NWE_PULSE + #undef NCS_RD_PULSE + #undef NRD_PULSE + #undef NCS_WR_HOLD + #undef NWE_HOLD + #undef NWE_CYCLE + #undef NCS_RD_HOLD + #undef NRD_CYCLE + #undef TDF_CYCLES + #undef TDF_OPTIM + #undef PAGE_MODE + #undef PAGE_SIZE + #undef NCS_CONTROLLED_READ + #undef NCS_CONTROLLED_WRITE + #undef NWAIT_MODE +#endif + + +//! Whether to use the NCS1 pin +#ifdef SMC_USE_NCS1 + #include SMC_COMPONENT_CS1 + + // Enable SM mode for CS1 if necessary. + AVR32_HMATRIX.sfr[AVR32_EBI_HMATRIX_NR] &= ~(1 << AVR32_EBI_SDRAM_CS); + AVR32_HMATRIX.sfr[AVR32_EBI_HMATRIX_NR]; + + // Setup SMC for NCS1 + SMC_CS_SETUP(1) + + #ifdef SMC_DBW_GLOBAL + #if (SMC_DBW_GLOBAL < SMC_DBW) + #undef SMC_DBW_GLOBAL + #if (SMC_DBW == 8) + #define SMC_DBW_GLOBAL 8 + #elif (SMC_DBW == 16) + #define SMC_DBW_GLOBAL 16 + #elif (SMC_DBW == 32) + #define SMC_DBW_GLOBAL 32 + #else + #error error in SMC_DBW size + #endif + #endif + #else + #if (SMC_DBW == 8) + #define SMC_DBW_GLOBAL 8 + #elif (SMC_DBW == 16) + #define SMC_DBW_GLOBAL 16 + #elif (SMC_DBW == 32) + #define SMC_DBW_GLOBAL 32 + #else + #error error in SMC_DBW size + #endif + #endif + + #ifdef SMC_8_BIT_CHIPS_GLOBAL + #if (SMC_8_BIT_CHIPS_GLOBAL < SMC_8_BIT) + #undef SMC_8_BIT_CHIPS_GLOBAL + #if (SMC_8_BIT_CHIPS == TRUE) + #define SMC_8_BIT_CHIPS_GLOBAL TRUE + #elif (SMC_8_BIT_CHIPS == FALSE) + #define SMC_8_BIT_CHIPS_GLOBAL FALSE + #else + #error error in SMC_8_BIT_CHIPS size + #endif + #endif + #else + #if (SMC_8_BIT_CHIPS == TRUE) + #define SMC_8_BIT_CHIPS_GLOBAL TRUE + #elif (SMC_8_BIT_CHIPS == FALSE) + #define SMC_8_BIT_CHIPS_GLOBAL FALSE + #else + #error error in SMC_8_BIT_CHIPS size + #endif + #endif + + #ifdef NWAIT_MODE_GLOBAL + #if (NWAIT_MODE_GLOBAL < NWAIT_MODE) + #undef NWAIT_MODE_GLOBAL + #if (NWAIT_MODE == AVR32_SMC_EXNW_MODE_DISABLED) + #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_DISABLED + #elif (NWAIT_MODE == AVR32_SMC_EXNW_MODE_FROZEN) + #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_FROZEN + #else + #error error in NWAIT_MODE size + #endif + #endif + #else + #if (NWAIT_MODE == AVR32_SMC_EXNW_MODE_DISABLED) + #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_DISABLED + #elif (NWAIT_MODE == AVR32_SMC_EXNW_MODE_FROZEN) + #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_FROZEN + #else + #error error in NWAIT_MODE size + #endif + #endif + + #undef EXT_SM_SIZE + #undef SMC_DBW + #undef SMC_8_BIT_CHIPS + #undef NWE_SETUP + #undef NCS_WR_SETUP + #undef NRD_SETUP + #undef NCS_RD_SETUP + #undef NCS_WR_PULSE + #undef NWE_PULSE + #undef NCS_RD_PULSE + #undef NRD_PULSE + #undef NCS_WR_HOLD + #undef NWE_HOLD + #undef NWE_CYCLE + #undef NCS_RD_HOLD + #undef NRD_CYCLE + #undef TDF_CYCLES + #undef TDF_OPTIM + #undef PAGE_MODE + #undef PAGE_SIZE + #undef NCS_CONTROLLED_READ + #undef NCS_CONTROLLED_WRITE + #undef NWAIT_MODE +#endif + +//! Whether to use the NCS2 pin +#ifdef SMC_USE_NCS2 + #include SMC_COMPONENT_CS2 + + // Setup SMC for NCS2 + SMC_CS_SETUP(2) + + #ifdef SMC_DBW_GLOBAL + #if (SMC_DBW_GLOBAL < SMC_DBW) + #undef SMC_DBW_GLOBAL + #if (SMC_DBW == 8) + #define SMC_DBW_GLOBAL 8 + #elif (SMC_DBW == 16) + #define SMC_DBW_GLOBAL 16 + #elif (SMC_DBW == 32) + #define SMC_DBW_GLOBAL 32 + #else + #error error in SMC_DBW size + #endif + #endif + #else + #if (SMC_DBW == 8) + #define SMC_DBW_GLOBAL 8 + #elif (SMC_DBW == 16) + #define SMC_DBW_GLOBAL 16 + #elif (SMC_DBW == 32) + #define SMC_DBW_GLOBAL 32 + #else + #error error in SMC_DBW size + #endif + #endif + + #ifdef SMC_8_BIT_CHIPS_GLOBAL + #if (SMC_8_BIT_CHIPS_GLOBAL < SMC_8_BIT) + #undef SMC_8_BIT_CHIPS_GLOBAL + #if (SMC_8_BIT_CHIPS == TRUE) + #define SMC_8_BIT_CHIPS_GLOBAL TRUE + #elif (SMC_8_BIT_CHIPS == FALSE) + #define SMC_8_BIT_CHIPS_GLOBAL FALSE + #else + #error error in SMC_8_BIT_CHIPS size + #endif + #endif + #else + #if (SMC_8_BIT_CHIPS == TRUE) + #define SMC_8_BIT_CHIPS_GLOBAL TRUE + #elif (SMC_8_BIT_CHIPS == FALSE) + #define SMC_8_BIT_CHIPS_GLOBAL FALSE + #else + #error error in SMC_8_BIT_CHIPS size + #endif + #endif + + #ifdef NWAIT_MODE_GLOBAL + #if (NWAIT_MODE_GLOBAL < NWAIT_MODE) + #undef NWAIT_MODE_GLOBAL + #if (NWAIT_MODE == AVR32_SMC_EXNW_MODE_DISABLED) + #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_DISABLED + #elif (NWAIT_MODE == AVR32_SMC_EXNW_MODE_FROZEN) + #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_FROZEN + #else + #error error in NWAIT_MODE size + #endif + #endif + #else + #if (NWAIT_MODE == AVR32_SMC_EXNW_MODE_DISABLED) + #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_DISABLED + #elif (NWAIT_MODE == AVR32_SMC_EXNW_MODE_FROZEN) + #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_FROZEN + #else + #error error in NWAIT_MODE size + #endif + #endif + + + #undef EXT_SM_SIZE + #undef SMC_DBW + #undef SMC_8_BIT_CHIPS + #undef NWE_SETUP + #undef NCS_WR_SETUP + #undef NRD_SETUP + #undef NCS_RD_SETUP + #undef NCS_WR_PULSE + #undef NWE_PULSE + #undef NCS_RD_PULSE + #undef NRD_PULSE + #undef NCS_WR_HOLD + #undef NWE_HOLD + #undef NWE_CYCLE + #undef NCS_RD_HOLD + #undef NRD_CYCLE + #undef TDF_CYCLES + #undef TDF_OPTIM + #undef PAGE_MODE + #undef PAGE_SIZE + #undef NCS_CONTROLLED_READ + #undef NCS_CONTROLLED_WRITE + #undef NWAIT_MODE +#endif + +//! Whether to use the NCS3 pin +#ifdef SMC_USE_NCS3 + #include SMC_COMPONENT_CS3 + + // Setup SMC for NCS3 + SMC_CS_SETUP(3) + + #ifdef SMC_DBW_GLOBAL + #if (SMC_DBW_GLOBAL < SMC_DBW) + #undef SMC_DBW_GLOBAL + #if (SMC_DBW == 8) + #define SMC_DBW_GLOBAL 8 + #elif (SMC_DBW == 16) + #define SMC_DBW_GLOBAL 16 + #elif (SMC_DBW == 32) + #define SMC_DBW_GLOBAL 32 + #else + #error error in SMC_DBW size + #endif + #endif + #else + #if (SMC_DBW == 8) + #define SMC_DBW_GLOBAL 8 + #elif (SMC_DBW == 16) + #define SMC_DBW_GLOBAL 16 + #elif (SMC_DBW == 32) + #define SMC_DBW_GLOBAL 32 + #else + #error error in SMC_DBW size + #endif + #endif + + #ifdef SMC_8_BIT_CHIPS_GLOBAL + #if (SMC_8_BIT_CHIPS_GLOBAL < SMC_8_BIT) + #undef SMC_8_BIT_CHIPS_GLOBAL + #if (SMC_8_BIT_CHIPS == TRUE) + #define SMC_8_BIT_CHIPS_GLOBAL TRUE + #elif (SMC_8_BIT_CHIPS == FALSE) + #define SMC_8_BIT_CHIPS_GLOBAL FALSE + #else + #error error in SMC_8_BIT_CHIPS size + #endif + #endif + #else + #if (SMC_8_BIT_CHIPS == TRUE) + #define SMC_8_BIT_CHIPS_GLOBAL TRUE + #elif (SMC_8_BIT_CHIPS == FALSE) + #define SMC_8_BIT_CHIPS_GLOBAL FALSE + #else + #error error in SMC_8_BIT_CHIPS size + #endif + #endif + + #ifdef NWAIT_MODE_GLOBAL + #if (NWAIT_MODE_GLOBAL < NWAIT_MODE) + #undef NWAIT_MODE_GLOBAL + #if (NWAIT_MODE == AVR32_SMC_EXNW_MODE_DISABLED) + #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_DISABLED + #elif (NWAIT_MODE == AVR32_SMC_EXNW_MODE_FROZEN) + #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_FROZEN + #else + #error error in NWAIT_MODE size + #endif + #endif + #else + #if (NWAIT_MODE == AVR32_SMC_EXNW_MODE_DISABLED) + #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_DISABLED + #elif (NWAIT_MODE == AVR32_SMC_EXNW_MODE_FROZEN) + #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_FROZEN + #else + #error error in NWAIT_MODE size + #endif + #endif + + + #undef EXT_SM_SIZE + #undef SMC_DBW + #undef SMC_8_BIT_CHIPS + #undef NWE_SETUP + #undef NCS_WR_SETUP + #undef NRD_SETUP + #undef NCS_RD_SETUP + #undef NCS_WR_PULSE + #undef NWE_PULSE + #undef NCS_RD_PULSE + #undef NRD_PULSE + #undef NCS_WR_HOLD + #undef NWE_HOLD + #undef NWE_CYCLE + #undef NCS_RD_HOLD + #undef NRD_CYCLE + #undef TDF_CYCLES + #undef TDF_OPTIM + #undef PAGE_MODE + #undef PAGE_SIZE + #undef NCS_CONTROLLED_READ + #undef NCS_CONTROLLED_WRITE + #undef NWAIT_MODE +#endif + +//! Whether to use the NCS4 pin +#ifdef SMC_USE_NCS4 + #include SMC_COMPONENT_CS4 + + // Setup SMC for NCS4 + SMC_CS_SETUP(4) + + #ifdef SMC_DBW_GLOBAL + #if (SMC_DBW_GLOBAL < SMC_DBW) + #undef SMC_DBW_GLOBAL + #if (SMC_DBW == 8) + #define SMC_DBW_GLOBAL 8 + #elif (SMC_DBW == 16) + #define SMC_DBW_GLOBAL 16 + #elif (SMC_DBW == 32) + #define SMC_DBW_GLOBAL 32 + #else + #error error in SMC_DBW size + #endif + #endif + #else + #if (SMC_DBW == 8) + #define SMC_DBW_GLOBAL 8 + #elif (SMC_DBW == 16) + #define SMC_DBW_GLOBAL 16 + #elif (SMC_DBW == 32) + #define SMC_DBW_GLOBAL 32 + #else + #error error in SMC_DBW size + #endif + #endif + + #ifdef SMC_8_BIT_CHIPS_GLOBAL + #if (SMC_8_BIT_CHIPS_GLOBAL < SMC_8_BIT) + #undef SMC_8_BIT_CHIPS_GLOBAL + #if (SMC_8_BIT_CHIPS == TRUE) + #define SMC_8_BIT_CHIPS_GLOBAL TRUE + #elif (SMC_8_BIT_CHIPS == FALSE) + #define SMC_8_BIT_CHIPS_GLOBAL FALSE + #else + #error error in SMC_8_BIT_CHIPS size + #endif + #endif + #else + #if (SMC_8_BIT_CHIPS == TRUE) + #define SMC_8_BIT_CHIPS_GLOBAL TRUE + #elif (SMC_8_BIT_CHIPS == FALSE) + #define SMC_8_BIT_CHIPS_GLOBAL FALSE + #else + #error error in SMC_8_BIT_CHIPS size + #endif + #endif + + #ifdef NWAIT_MODE_GLOBAL + #if (NWAIT_MODE_GLOBAL < NWAIT_MODE) + #undef NWAIT_MODE_GLOBAL + #if (NWAIT_MODE == AVR32_SMC_EXNW_MODE_DISABLED) + #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_DISABLED + #elif (NWAIT_MODE == AVR32_SMC_EXNW_MODE_FROZEN) + #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_FROZEN + #else + #error error in NWAIT_MODE size + #endif + #endif + #else + #if (NWAIT_MODE == AVR32_SMC_EXNW_MODE_DISABLED) + #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_DISABLED + #elif (NWAIT_MODE == AVR32_SMC_EXNW_MODE_FROZEN) + #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_FROZEN + #else + #error error in NWAIT_MODE size + #endif + #endif + + + #undef EXT_SM_SIZE + #undef SMC_DBW + #undef SMC_8_BIT_CHIPS + #undef NWE_SETUP + #undef NCS_WR_SETUP + #undef NRD_SETUP + #undef NCS_RD_SETUP + #undef NCS_WR_PULSE + #undef NWE_PULSE + #undef NCS_RD_PULSE + #undef NRD_PULSE + #undef NCS_WR_HOLD + #undef NWE_HOLD + #undef NWE_CYCLE + #undef NCS_RD_HOLD + #undef NRD_CYCLE + #undef TDF_CYCLES + #undef TDF_OPTIM + #undef PAGE_MODE + #undef PAGE_SIZE + #undef NCS_CONTROLLED_READ + #undef NCS_CONTROLLED_WRITE + #undef NWAIT_MODE +#endif + +//! Whether to use the NCS5 pin +#ifdef SMC_USE_NCS5 + #include SMC_COMPONENT_CS5 + + // Setup SMC for NCS5 + SMC_CS_SETUP(5) + + #ifdef SMC_DBW_GLOBAL + #if (SMC_DBW_GLOBAL < SMC_DBW) + #undef SMC_DBW_GLOBAL + #if (SMC_DBW == 8) + #define SMC_DBW_GLOBAL 8 + #elif (SMC_DBW == 16) + #define SMC_DBW_GLOBAL 16 + #elif (SMC_DBW == 32) + #define SMC_DBW_GLOBAL 32 + #else + #error error in SMC_DBW size + #endif + #endif + #else + #if (SMC_DBW == 8) + #define SMC_DBW_GLOBAL 8 + #elif (SMC_DBW == 16) + #define SMC_DBW_GLOBAL 16 + #elif (SMC_DBW == 32) + #define SMC_DBW_GLOBAL 32 + #else + #error error in SMC_DBW size + #endif + #endif + + #ifdef SMC_8_BIT_CHIPS_GLOBAL + #if (SMC_8_BIT_CHIPS_GLOBAL < SMC_8_BIT) + #undef SMC_8_BIT_CHIPS_GLOBAL + #if (SMC_8_BIT_CHIPS == TRUE) + #define SMC_8_BIT_CHIPS_GLOBAL TRUE + #elif (SMC_8_BIT_CHIPS == FALSE) + #define SMC_8_BIT_CHIPS_GLOBAL FALSE + #else + #error error in SMC_8_BIT_CHIPS size + #endif + #endif + #else + #if (SMC_8_BIT_CHIPS == TRUE) + #define SMC_8_BIT_CHIPS_GLOBAL TRUE + #elif (SMC_8_BIT_CHIPS == FALSE) + #define SMC_8_BIT_CHIPS_GLOBAL FALSE + #else + #error error in SMC_8_BIT_CHIPS size + #endif + #endif + + #ifdef NWAIT_MODE_GLOBAL + #if (NWAIT_MODE_GLOBAL < NWAIT_MODE) + #undef NWAIT_MODE_GLOBAL + #if (NWAIT_MODE == AVR32_SMC_EXNW_MODE_DISABLED) + #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_DISABLED + #elif (NWAIT_MODE == AVR32_SMC_EXNW_MODE_FROZEN) + #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_FROZEN + #else + #error error in NWAIT_MODE size + #endif + #endif + #else + #if (NWAIT_MODE == AVR32_SMC_EXNW_MODE_DISABLED) + #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_DISABLED + #elif (NWAIT_MODE == AVR32_SMC_EXNW_MODE_FROZEN) + #define NWAIT_MODE_GLOBAL AVR32_SMC_EXNW_MODE_FROZEN + #else + #error error in NWAIT_MODE size + #endif + #endif + + + #undef EXT_SM_SIZE + #undef SMC_DBW + #undef SMC_8_BIT_CHIPS + #undef NWE_SETUP + #undef NCS_WR_SETUP + #undef NRD_SETUP + #undef NCS_RD_SETUP + #undef NCS_WR_PULSE + #undef NWE_PULSE + #undef NCS_RD_PULSE + #undef NRD_PULSE + #undef NCS_WR_HOLD + #undef NWE_HOLD + #undef NWE_CYCLE + #undef NCS_RD_HOLD + #undef NRD_CYCLE + #undef TDF_CYCLES + #undef TDF_OPTIM + #undef PAGE_MODE + #undef PAGE_SIZE + #undef NCS_CONTROLLED_READ + #undef NCS_CONTROLLED_WRITE + #undef NWAIT_MODE +#endif + // Put the multiplexed MCU pins used for the SM under control of the SMC. + smc_enable_muxed_pins(); +} + +/*! \brief Puts the multiplexed MCU pins used for the SMC + * + */ +static void smc_enable_muxed_pins(void) +{ + static const gpio_map_t SMC_EBI_GPIO_MAP = + { + // Enable data pins. +#ifdef EBI_DATA_0 + {ATPASTE2(EBI_DATA_0,_PIN),ATPASTE2(EBI_DATA_0,_FUNCTION)}, +#endif +#ifdef EBI_DATA_1 + {ATPASTE2(EBI_DATA_1,_PIN),ATPASTE2(EBI_DATA_1,_FUNCTION)}, +#endif +#ifdef EBI_DATA_2 + {ATPASTE2(EBI_DATA_2,_PIN),ATPASTE2(EBI_DATA_2,_FUNCTION)}, +#endif +#ifdef EBI_DATA_3 + {ATPASTE2(EBI_DATA_3,_PIN),ATPASTE2(EBI_DATA_3,_FUNCTION)}, +#endif +#ifdef EBI_DATA_4 + {ATPASTE2(EBI_DATA_4,_PIN),ATPASTE2(EBI_DATA_4,_FUNCTION)}, +#endif +#ifdef EBI_DATA_5 + {ATPASTE2(EBI_DATA_5,_PIN),ATPASTE2(EBI_DATA_5,_FUNCTION)}, +#endif +#ifdef EBI_DATA_6 + {ATPASTE2(EBI_DATA_6,_PIN),ATPASTE2(EBI_DATA_6,_FUNCTION)}, +#endif +#ifdef EBI_DATA_7 + {ATPASTE2(EBI_DATA_7,_PIN),ATPASTE2(EBI_DATA_7,_FUNCTION)}, +#endif +#ifdef EBI_DATA_8 + {ATPASTE2(EBI_DATA_8,_PIN),ATPASTE2(EBI_DATA_8,_FUNCTION)}, +#endif +#ifdef EBI_DATA_9 + {ATPASTE2(EBI_DATA_9,_PIN),ATPASTE2(EBI_DATA_9,_FUNCTION)}, +#endif +#ifdef EBI_DATA_10 + {ATPASTE2(EBI_DATA_10,_PIN),ATPASTE2(EBI_DATA_10,_FUNCTION)}, +#endif +#ifdef EBI_DATA_11 + {ATPASTE2(EBI_DATA_11,_PIN),ATPASTE2(EBI_DATA_11,_FUNCTION)}, +#endif +#ifdef EBI_DATA_12 + {ATPASTE2(EBI_DATA_12,_PIN),ATPASTE2(EBI_DATA_12,_FUNCTION)}, +#endif +#ifdef EBI_DATA_13 + {ATPASTE2(EBI_DATA_13,_PIN),ATPASTE2(EBI_DATA_13,_FUNCTION)}, +#endif +#ifdef EBI_DATA_14 + {ATPASTE2(EBI_DATA_14,_PIN),ATPASTE2(EBI_DATA_14,_FUNCTION)}, +#endif +#ifdef EBI_DATA_15 + {ATPASTE2(EBI_DATA_15,_PIN),ATPASTE2(EBI_DATA_15,_FUNCTION)}, +#endif +#ifdef EBI_DATA_16 + {ATPASTE2(EBI_DATA_16,_PIN),ATPASTE2(EBI_DATA_16,_FUNCTION)}, +#endif +#ifdef EBI_DATA_17 + {ATPASTE2(EBI_DATA_17,_PIN),ATPASTE2(EBI_DATA_17,_FUNCTION)}, +#endif +#ifdef EBI_DATA_18 + {ATPASTE2(EBI_DATA_18,_PIN),ATPASTE2(EBI_DATA_18,_FUNCTION)}, +#endif +#ifdef EBI_DATA_19 + {ATPASTE2(EBI_DATA_19,_PIN),ATPASTE2(EBI_DATA_19,_FUNCTION)}, +#endif +#ifdef EBI_DATA_20 + {ATPASTE2(EBI_DATA_20,_PIN),ATPASTE2(EBI_DATA_20,_FUNCTION)}, +#endif +#ifdef EBI_DATA_21 + {ATPASTE2(EBI_DATA_21,_PIN),ATPASTE2(EBI_DATA_21,_FUNCTION)}, +#endif +#ifdef EBI_DATA_22 + {ATPASTE2(EBI_DATA_22,_PIN),ATPASTE2(EBI_DATA_22,_FUNCTION)}, +#endif +#ifdef EBI_DATA_23 + {ATPASTE2(EBI_DATA_23,_PIN),ATPASTE2(EBI_DATA_23,_FUNCTION)}, +#endif +#ifdef EBI_DATA_24 + {ATPASTE2(EBI_DATA_24,_PIN),ATPASTE2(EBI_DATA_24,_FUNCTION)}, +#endif +#ifdef EBI_DATA_25 + {ATPASTE2(EBI_DATA_25,_PIN),ATPASTE2(EBI_DATA_25,_FUNCTION)}, +#endif +#ifdef EBI_DATA_26 + {ATPASTE2(EBI_DATA_26,_PIN),ATPASTE2(EBI_DATA_26,_FUNCTION)}, +#endif +#ifdef EBI_DATA_27 + {ATPASTE2(EBI_DATA_27,_PIN),ATPASTE2(EBI_DATA_27,_FUNCTION)}, +#endif +#ifdef EBI_DATA_28 + {ATPASTE2(EBI_DATA_28,_PIN),ATPASTE2(EBI_DATA_28,_FUNCTION)}, +#endif +#ifdef EBI_DATA_29 + {ATPASTE2(EBI_DATA_29,_PIN),ATPASTE2(EBI_DATA_29,_FUNCTION)}, +#endif +#ifdef EBI_DATA_30 + {ATPASTE2(EBI_DATA_30,_PIN),ATPASTE2(EBI_DATA_30,_FUNCTION)}, +#endif +#ifdef EBI_DATA_31 + {ATPASTE2(EBI_DATA_31,_PIN),ATPASTE2(EBI_DATA_31,_FUNCTION)}, +#endif + + // Enable address pins. +#if SMC_DBW_GLOBAL <= 8 +#ifdef EBI_ADDR_0 + {ATPASTE2(EBI_ADDR_0,_PIN),ATPASTE2(EBI_ADDR_0,_FUNCTION)}, +#endif +#endif +#if SMC_DBW_GLOBAL <= 16 +#ifdef EBI_ADDR_1 + {ATPASTE2(EBI_ADDR_1,_PIN),ATPASTE2(EBI_ADDR_1,_FUNCTION)}, +#endif +#endif + +#ifdef EBI_ADDR_2 + {ATPASTE2(EBI_ADDR_2,_PIN),ATPASTE2(EBI_ADDR_2,_FUNCTION)}, +#endif +#ifdef EBI_ADDR_3 + {ATPASTE2(EBI_ADDR_3,_PIN),ATPASTE2(EBI_ADDR_3,_FUNCTION)}, +#endif +#ifdef EBI_ADDR_4 + {ATPASTE2(EBI_ADDR_4,_PIN),ATPASTE2(EBI_ADDR_4,_FUNCTION)}, +#endif +#ifdef EBI_ADDR_5 + {ATPASTE2(EBI_ADDR_5,_PIN),ATPASTE2(EBI_ADDR_5,_FUNCTION)}, +#endif +#ifdef EBI_ADDR_6 + {ATPASTE2(EBI_ADDR_6,_PIN),ATPASTE2(EBI_ADDR_6,_FUNCTION)}, +#endif +#ifdef EBI_ADDR_7 + {ATPASTE2(EBI_ADDR_7,_PIN),ATPASTE2(EBI_ADDR_7,_FUNCTION)}, +#endif +#ifdef EBI_ADDR_8 + {ATPASTE2(EBI_ADDR_8,_PIN),ATPASTE2(EBI_ADDR_8,_FUNCTION)}, +#endif +#ifdef EBI_ADDR_9 + {ATPASTE2(EBI_ADDR_9,_PIN),ATPASTE2(EBI_ADDR_9,_FUNCTION)}, +#endif +#ifdef EBI_ADDR_10 + {ATPASTE2(EBI_ADDR_10,_PIN),ATPASTE2(EBI_ADDR_10,_FUNCTION)}, +#endif +#ifdef EBI_ADDR_11 + {ATPASTE2(EBI_ADDR_11,_PIN),ATPASTE2(EBI_ADDR_11,_FUNCTION)}, +#endif +#ifdef EBI_ADDR_12 + {ATPASTE2(EBI_ADDR_12,_PIN),ATPASTE2(EBI_ADDR_12,_FUNCTION)}, +#endif +#ifdef EBI_ADDR_13 + {ATPASTE2(EBI_ADDR_13,_PIN),ATPASTE2(EBI_ADDR_13,_FUNCTION)}, +#endif +#ifdef EBI_ADDR_14 + {ATPASTE2(EBI_ADDR_14,_PIN),ATPASTE2(EBI_ADDR_14,_FUNCTION)}, +#endif +#ifdef EBI_ADDR_15 + {ATPASTE2(EBI_ADDR_15,_PIN),ATPASTE2(EBI_ADDR_15,_FUNCTION)}, +#endif +#ifdef EBI_ADDR_16 + {ATPASTE2(EBI_ADDR_16,_PIN),ATPASTE2(EBI_ADDR_16,_FUNCTION)}, +#endif +#ifdef EBI_ADDR_17 + {ATPASTE2(EBI_ADDR_17,_PIN),ATPASTE2(EBI_ADDR_17,_FUNCTION)}, +#endif +#ifdef EBI_ADDR_18 + {ATPASTE2(EBI_ADDR_18,_PIN),ATPASTE2(EBI_ADDR_18,_FUNCTION)}, +#endif +#ifdef EBI_ADDR_19 + {ATPASTE2(EBI_ADDR_19,_PIN),ATPASTE2(EBI_ADDR_19,_FUNCTION)}, +#endif +#ifdef EBI_ADDR_20 + {ATPASTE2(EBI_ADDR_20,_PIN),ATPASTE2(EBI_ADDR_20,_FUNCTION)}, +#endif +#ifdef EBI_ADDR_21 + {ATPASTE2(EBI_ADDR_21,_PIN),ATPASTE2(EBI_ADDR_21,_FUNCTION)}, +#endif +#ifdef EBI_ADDR_22 + {ATPASTE2(EBI_ADDR_22,_PIN),ATPASTE2(EBI_ADDR_22,_FUNCTION)}, +#endif +#ifdef EBI_ADDR_23 + {ATPASTE2(EBI_ADDR_23,_PIN),ATPASTE2(EBI_ADDR_23,_FUNCTION)}, +#endif + +#if SMC_DBW_GLOBAL <= 8 + #undef SMC_8_BIT_CHIPS + #define SMC_8_BIT_CHIPS TRUE +#endif + + // Enable data mask pins. +#if !SMC_8_BIT_CHIPS_GLOBAL +#ifdef EBI_ADDR_0 + {ATPASTE2(EBI_ADDR_0,_PIN),ATPASTE2(EBI_ADDR_0,_FUNCTION)}, +#endif +#endif +#ifdef EBI_NWE0 + {ATPASTE2(EBI_NWE0,_PIN),ATPASTE2(EBI_NWE0,_FUNCTION)}, +#endif + +#if SMC_DBW_GLOBAL >= 16 + #ifdef EBI_NWE1 + {ATPASTE2(EBI_NWE1,_PIN),ATPASTE2(EBI_NWE1,_FUNCTION)}, + #endif + #if SMC_DBW_GLOBAL >= 32 + #ifdef EBI_ADDR_1 + {ATPASTE2(EBI_ADDR_1,_PIN),ATPASTE2(EBI_ADDR_1,_FUNCTION)}, + #endif + #ifdef EBI_NWE3 + {ATPASTE2(EBI_NWE3,_PIN),ATPASTE2(EBI_NWE3,_FUNCTION)}, + #endif + #endif +#endif + #ifdef EBI_NRD + {ATPASTE2(EBI_NRD,_PIN),ATPASTE2(EBI_NRD,_FUNCTION)}, + #endif + + // Enable control pins. +#if NWAIT_MODE_GLOBAL != AVR32_SMC_EXNW_MODE_DISABLED + #ifdef EBI_NWAIT + {ATPASTE2(EBI_NWAIT,_PIN),ATPASTE2(EBI_NWAIT,_FUNCTION)}, + #endif +#endif +#ifdef SMC_USE_NCS0 + #ifdef EBI_NCS_0 + {ATPASTE2(EBI_NCS_0,_PIN),ATPASTE2(EBI_NCS_0,_FUNCTION)}, + #endif +#endif +#ifdef SMC_USE_NCS1 + #ifdef EBI_NCS_1 + {ATPASTE2(EBI_NCS_1,_PIN),ATPASTE2(EBI_NCS_1,_FUNCTION)}, + #endif +#endif +#ifdef SMC_USE_NCS2 + #ifdef EBI_NCS_2 + {ATPASTE2(EBI_NCS_2,_PIN),ATPASTE2(EBI_NCS_2,_FUNCTION)}, + #endif +#endif +#ifdef SMC_USE_NCS3 + #ifdef EBI_NCS_3 + {ATPASTE2(EBI_NCS_3,_PIN),ATPASTE2(EBI_NCS_3,_FUNCTION)}, + #endif +#endif +#ifdef SMC_USE_NCS4 + #ifdef EBI_NCS_4 + {ATPASTE2(EBI_NCS_4,_PIN),ATPASTE2(EBI_NCS_4,_FUNCTION)}, + #endif +#endif +#ifdef SMC_USE_NCS5 + #ifdef EBI_NCS_5 + {ATPASTE2(EBI_NCS_5,_PIN),ATPASTE2(EBI_NCS_5,_FUNCTION)}, + #endif +#endif + }; + + gpio_enable_module(SMC_EBI_GPIO_MAP, sizeof(SMC_EBI_GPIO_MAP) / sizeof(SMC_EBI_GPIO_MAP[0])); +} + +unsigned char smc_get_cs_size(unsigned char cs) +{ + return smc_tab_cs_size[cs]; +} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC/smc.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC/smc.h new file mode 100644 index 0000000..c3bdf43 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC/smc.h @@ -0,0 +1,68 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief SMC on EBI driver for AVR32 UC3. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with a SMC module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _SMC_H_ +#define _SMC_H_ + +#include + +#include "compiler.h" +#include "conf_ebi.h" + +/*! \brief Initializes the AVR32 SMC module and the connected SRAM(s). + * \param hsb_hz HSB frequency in Hz (the HSB frequency is applied to the SMC). + * \note Each access to the SMC address space validates the mode of the SMC + * and generates an operation corresponding to this mode. + */ +extern void smc_init(unsigned long hsb_hz); + +/*! \brief Return the size of the peripheral connected . + * \param cs The chip select value + */ +extern unsigned char smc_get_cs_size(unsigned char cs); + +#endif // _SMC_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/EIC/eic.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/EIC/eic.c new file mode 100644 index 0000000..1008c94 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/EIC/eic.c @@ -0,0 +1,183 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief EIC driver for AVR32 UC3. + * + * AVR32 External Interrupt Controller driver module. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with an EIC module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#include +#include "compiler.h" +#include "preprocessor.h" +#include "eic.h" + + + +void eic_init(volatile avr32_eic_t *eic, const eic_options_t *opt, unsigned int nb_lines) +{ + int i; + for (i = 0; i < nb_lines; i++) + { + // Set up mode level + eic->mode = (opt[i].eic_mode == 1) ? (eic->mode | (1 << opt[i].eic_line)) : (eic->mode & ~(1 << opt[i].eic_line)); + // Set up edge type + eic->edge = (opt[i].eic_edge == 1) ? (eic->edge | (1 << opt[i].eic_line)) : (eic->edge & ~(1 << opt[i].eic_line)); + // Set up level + eic->level = (opt[i].eic_level == 1) ? (eic->level | (1 << opt[i].eic_line)) : (eic->level & ~(1 << opt[i].eic_line)); + // Set up if filter is used + eic->filter = (opt[i].eic_filter == 1) ? (eic->filter | (1 << opt[i].eic_line)) : (eic->filter & ~(1 << opt[i].eic_line)); + // Set up which mode is used : asynchronous mode/ synchronous mode + eic->async = (opt[i].eic_async == 1) ? (eic->async | (1 << opt[i].eic_line)) : (eic->async & ~(1 << opt[i].eic_line)); + } +} + +void eic_enable_lines(volatile avr32_eic_t *eic, unsigned int mask_lines) +{ + eic->en = mask_lines; +} + +void eic_enable_line(volatile avr32_eic_t *eic, unsigned int line_number) +{ + // Enable line line_number + eic->en = 1 << line_number; +} + +void eic_disable_lines(volatile avr32_eic_t *eic, unsigned int mask_lines) +{ + eic->dis = mask_lines; +} + +void eic_disable_line(volatile avr32_eic_t *eic, unsigned int line_number) +{ + // Disable line line_number + eic->dis = 1 << line_number; +} + +Bool eic_is_line_enabled(volatile avr32_eic_t *eic, unsigned int line_number) +{ + return (eic->ctrl & (1 << line_number)) != 0; +} + +void eic_enable_interrupt_lines(volatile avr32_eic_t *eic, unsigned int mask_lines) +{ + eic->ier = mask_lines; +} + +void eic_enable_interrupt_line(volatile avr32_eic_t *eic, unsigned int line_number) +{ + // Enable line line_number + eic->ier = 1 << line_number; +} + +void eic_disable_interrupt_lines(volatile avr32_eic_t *eic, unsigned int mask_lines) +{ + Bool global_interrupt_enabled = Is_global_interrupt_enabled(); + + if (global_interrupt_enabled) Disable_global_interrupt(); + eic->idr = mask_lines; + eic->imr; + if (global_interrupt_enabled) Enable_global_interrupt(); +} + +void eic_disable_interrupt_line(volatile avr32_eic_t *eic, unsigned int line_number) +{ + Bool global_interrupt_enabled = Is_global_interrupt_enabled(); + + // Disable line line_number + if (global_interrupt_enabled) Disable_global_interrupt(); + eic->idr = 1 << line_number; + eic->imr; + if (global_interrupt_enabled) Enable_global_interrupt(); +} + +Bool eic_is_interrupt_line_enabled(volatile avr32_eic_t *eic, unsigned int line_number) +{ + return (eic->imr & (1 << line_number)) != 0; +} + +void eic_clear_interrupt_lines(volatile avr32_eic_t *eic, unsigned int mask_lines) +{ + Bool global_interrupt_enabled = Is_global_interrupt_enabled(); + + if (global_interrupt_enabled) Disable_global_interrupt(); + eic->icr = mask_lines; + eic->isr; + if (global_interrupt_enabled) Enable_global_interrupt(); +} + +void eic_clear_interrupt_line(volatile avr32_eic_t *eic, unsigned int line_number) +{ + Bool global_interrupt_enabled = Is_global_interrupt_enabled(); + + // Clear line line_number + if (global_interrupt_enabled) Disable_global_interrupt(); + eic->icr = 1 << line_number; + eic->isr; + if (global_interrupt_enabled) Enable_global_interrupt(); +} + +Bool eic_is_interrupt_line_pending(volatile avr32_eic_t *eic, unsigned int line_number) +{ + return (eic->isr & (1 << line_number)) != 0; +} + +#if !defined(AVR32_EIC_301_H_INCLUDED) +void eic_enable_interrupt_scan(volatile avr32_eic_t *eic,unsigned int presc) +{ + // Enable SCAN function with PRESC value + eic->scan |= (presc << AVR32_EIC_SCAN_PRESC_OFFSET) | (1 << AVR32_EIC_SCAN_EN_OFFSET); +} + +void eic_disable_interrupt_scan(volatile avr32_eic_t *eic) +{ + // Disable SCAN function + eic->scan = 0 << AVR32_EIC_SCAN_EN_OFFSET; +} + +unsigned long eic_get_interrupt_pad_scan(volatile avr32_eic_t *eic) +{ + // Return pad number that causes interrupt + return(eic->scan>>AVR32_EIC_SCAN_PIN_OFFSET); +} +#endif \ No newline at end of file diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/EIC/eic.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/EIC/eic.h new file mode 100644 index 0000000..32641b7 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/EIC/eic.h @@ -0,0 +1,275 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief EIC driver for AVR32 UC3. + * + * AVR32 External Interrupt Controller driver module. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with an EIC module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _EIC_H_ +#define _EIC_H_ + +#include "compiler.h" + +/*! \name External Interrupt lines + */ +//! @{ +#if (UC3A || UC3B) +#define EXT_INT0 AVR32_EIC_INT0 //!< Line 0 +#define EXT_INT1 AVR32_EIC_INT1 //!< Line 1 +#define EXT_INT2 AVR32_EIC_INT2 //!< Line 2 +#define EXT_INT3 AVR32_EIC_INT3 //!< Line 3 +#define EXT_INT4 AVR32_EIC_INT4 //!< Line 4 +#define EXT_INT5 AVR32_EIC_INT5 //!< Line 5 +#define EXT_INT6 AVR32_EIC_INT6 //!< Line 6 +#define EXT_INT7 AVR32_EIC_INT7 //!< Line 7 +#define EXT_NMI AVR32_EIC_NMI //!< Line 8 +#else +#define EXT_INT0 AVR32_EIC_INT1 //!< Line 0 +#define EXT_INT1 AVR32_EIC_INT2 //!< Line 1 +#define EXT_INT2 AVR32_EIC_INT3 //!< Line 2 +#define EXT_INT3 AVR32_EIC_INT4 //!< Line 3 +#define EXT_INT4 AVR32_EIC_INT5 //!< Line 4 +#define EXT_INT5 AVR32_EIC_INT6 //!< Line 5 +#define EXT_INT6 AVR32_EIC_INT7 //!< Line 6 +#define EXT_INT7 AVR32_EIC_INT8 //!< Line 7 +#define EXT_NMI AVR32_EIC_NMI //!< Line 8 + +#endif + +//! @} + +/*! \name Mode Trigger Options + */ +//! @{ +#define EIC_MODE_EDGE_TRIGGERED AVR32_EIC_EDGE_IRQ //!< +#define EIC_MODE_LEVEL_TRIGGERED AVR32_EIC_LEVEL_IRQ //!< +//! @} + +/*! \name Edge level Options + */ +//! @{ +#define EIC_EDGE_FALLING_EDGE AVR32_EIC_FALLING_EDGE //!< +#define EIC_EDGE_RISING_EDGE AVR32_EIC_RISING_EDGE //!< +//! @} + +/*! \name Level Options + */ +//! @{ +#define EIC_LEVEL_LOW_LEVEL AVR32_EIC_LOW_LEVEL //!< +#define EIC_LEVEL_HIGH_LEVEL AVR32_EIC_HIGH_LEVEL //!< +//! @} + +/*! \name Filter Options + */ +//! @{ +#define EIC_FILTER_ENABLED AVR32_EIC_FILTER_ON //!< +#define EIC_FILTER_DISABLED AVR32_EIC_FILTER_OFF //!< +//! @} + +/*! \name Synch Mode Options + */ +//! @{ +#define EIC_SYNCH_MODE AVR32_EIC_SYNC //!< +#define EIC_ASYNCH_MODE AVR32_EIC_USE_ASYNC //!< +//! @} + +//! Configuration parameters of the EIC module. +typedef struct +{ + //!Line + unsigned char eic_line; + + //! Mode : EDGE_LEVEL or TRIGGER_LEVEL + unsigned char eic_mode; + + //! Edge : FALLING_EDGE or RISING_EDGE + unsigned char eic_edge; + + //! Level : LOW_LEVEL or HIGH_LEVEL + unsigned char eic_level; + + //! Filter: NOT_FILTERED or FILTERED + unsigned char eic_filter; + + //! Async: SYNC mode or ASYNC + unsigned char eic_async; + +} eic_options_t; + + +/*! \brief Init the EIC driver. + * + * \param eic Base address of the EIC module + * \param opt Configuration parameters of the EIC module (see \ref eic_options_t) + * \param nb_lines Number of lines to consider, equal to size of opt buffer + */ +extern void eic_init(volatile avr32_eic_t *eic, const eic_options_t *opt, unsigned int nb_lines); + +/*! \brief Enable the EIC driver. + * + * \param eic Base address of the EIC module + * \param mask_lines Mask for current selected lines + */ +extern void eic_enable_lines(volatile avr32_eic_t *eic, unsigned int mask_lines); + +/*! \brief Enable the EIC driver. + * + * \param eic Base address of the EIC module + * \param line_number Line number to enable + */ +extern void eic_enable_line(volatile avr32_eic_t *eic, unsigned int line_number); + +/*! \brief Disable the EIC driver. + * + * \param eic Base address of the EIC module + * \param mask_lines Mask for current selected lines + */ +extern void eic_disable_lines(volatile avr32_eic_t *eic, unsigned int mask_lines); + +/*! \brief Disable the EIC driver. + * + * \param eic Base address of the EIC module + * \param line_number Line number to disable + */ +extern void eic_disable_line(volatile avr32_eic_t *eic, unsigned int line_number); + +/*! \brief Tells whether an EIC line is enabled. + * + * \param eic Base address of the EIC module + * \param line_number Line number to test + * + * \return Whether an EIC line is enabled. + */ +extern Bool eic_is_line_enabled(volatile avr32_eic_t *eic, unsigned int line_number); + +/*! \name Interrupt Control Functions + */ +//! @{ + +/*! \brief Enable the interrupt feature of the EIC. + * + * \param eic Base address of the EIC (i.e. &AVR32_EIC). + * \param mask_lines Mask for current selected lines + */ +extern void eic_enable_interrupt_lines(volatile avr32_eic_t *eic, unsigned int mask_lines); + +/*! \brief Enable the interrupt feature of the EIC. + * + * \param eic Base address of the EIC (i.e. &AVR32_EIC). + * \param line_number Line number to enable + */ +extern void eic_enable_interrupt_line(volatile avr32_eic_t *eic, unsigned int line_number); + +/*! \brief Disable the interrupt feature of the EIC. + * + * \param eic Base address of the EIC (i.e. &AVR32_EIC). + * \param mask_lines Mask for current selected lines + */ +extern void eic_disable_interrupt_lines(volatile avr32_eic_t *eic, unsigned int mask_lines); + +/*! \brief Disable the interrupt feature of the EIC. + * + * \param eic Base address of the EIC (i.e. &AVR32_EIC). + * \param line_number Line number to disable + */ +extern void eic_disable_interrupt_line(volatile avr32_eic_t *eic, unsigned int line_number); + +/*! \brief Tells whether an EIC interrupt line is enabled. + * + * \param eic Base address of the EIC module + * \param line_number Line number to test + * + * \return Whether an EIC interrupt line is enabled. + */ +extern Bool eic_is_interrupt_line_enabled(volatile avr32_eic_t *eic, unsigned int line_number); + +/*! \brief Clear the interrupt flag. + * Call this function once you've handled the interrupt. + * + * \param eic Base address of the EIC (i.e. &AVR32_EIC). + * \param mask_lines Mask for current selected lines + */ +extern void eic_clear_interrupt_lines(volatile avr32_eic_t *eic, unsigned int mask_lines); + +/*! \brief Clear the interrupt flag. + * Call this function once you've handled the interrupt. + * + * \param eic Base address of the EIC (i.e. &AVR32_EIC). + * \param line_number Line number to clear + */ +extern void eic_clear_interrupt_line(volatile avr32_eic_t *eic, unsigned int line_number); + +/*! \brief Tells whether an EIC interrupt line is pending. + * + * \param eic Base address of the EIC module + * \param line_number Line number to test + * + * \return Whether an EIC interrupt line is pending. + */ +extern Bool eic_is_interrupt_line_pending(volatile avr32_eic_t *eic, unsigned int line_number); + +/*! \brief Enable the interrupt scan feature of the EIC. + * + * \param eic Base address of the EIC (i.e. &AVR32_EIC). + * \param presc Prescale select for the keypad scan rate in the range [0,31]. + */ +extern void eic_enable_interrupt_scan(volatile avr32_eic_t *eic, unsigned int presc); + +/*! \brief Disable the interrupt scan feature of the EIC. + * + * \param eic Base address of the EIC (i.e. &AVR32_EIC). + */ +extern void eic_disable_interrupt_scan(volatile avr32_eic_t *eic); + +/*! \brief Return scan pad number that causes interrupt. + * + * \param eic Base address of the EIC (i.e. &AVR32_EIC). + */ +extern unsigned long eic_get_interrupt_pad_scan(volatile avr32_eic_t *eic); + +//! @} + + +#endif // _EIC_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC/flashc.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC/flashc.c new file mode 100644 index 0000000..2eee15c --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC/flashc.c @@ -0,0 +1,1117 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief FLASHC driver for AVR32 UC3. + * + * AVR32 Flash Controller driver module. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with a FLASHC module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#include +#include +#include "compiler.h" +#include "flashc.h" + + +/*! \name FLASHC Writable Bit-Field Registers + */ +//! @{ + +typedef union +{ + unsigned long fcr; + avr32_flashc_fcr_t FCR; +} u_avr32_flashc_fcr_t; + +typedef union +{ + unsigned long fcmd; + avr32_flashc_fcmd_t FCMD; +} u_avr32_flashc_fcmd_t; + +//! @} + + +/*! \name Flash Properties + */ +//! @{ + + +unsigned int flashc_get_flash_size(void) +{ +#if (defined AVR32_FLASHC_300_H_INCLUDED) + static const unsigned int FLASH_SIZE[1 << AVR32_FLASHC_PR_FSZ_SIZE] = + { + 32 << 10, + 64 << 10, + 128 << 10, + 256 << 10, + 384 << 10, + 512 << 10, + 768 << 10, + 1024 << 10 + }; + return FLASH_SIZE[(AVR32_FLASHC.pr & AVR32_FLASHC_PR_FSZ_MASK) >> AVR32_FLASHC_PR_FSZ_OFFSET]; +#else + static const unsigned int FLASH_SIZE[1 << AVR32_FLASHC_FSR_FSZ_SIZE] = + { + 32 << 10, + 64 << 10, + 128 << 10, + 256 << 10, + 384 << 10, + 512 << 10, + 768 << 10, + 1024 << 10 + }; + return FLASH_SIZE[(AVR32_FLASHC.fsr & AVR32_FLASHC_FSR_FSZ_MASK) >> AVR32_FLASHC_FSR_FSZ_OFFSET]; +#endif +} + + +unsigned int flashc_get_page_count(void) +{ + return flashc_get_flash_size() / AVR32_FLASHC_PAGE_SIZE; +} + + +unsigned int flashc_get_page_count_per_region(void) +{ + return flashc_get_page_count() / AVR32_FLASHC_REGIONS; +} + + +unsigned int flashc_get_page_region(int page_number) +{ + return ((page_number >= 0) ? page_number : flashc_get_page_number()) / flashc_get_page_count_per_region(); +} + + +unsigned int flashc_get_region_first_page_number(unsigned int region) +{ + return region * flashc_get_page_count_per_region(); +} + + +//! @} + + +/*! \name FLASHC Control + */ +//! @{ + + +unsigned int flashc_get_wait_state(void) +{ + return (AVR32_FLASHC.fcr & AVR32_FLASHC_FCR_FWS_MASK) >> AVR32_FLASHC_FCR_FWS_OFFSET; +} + + +void flashc_set_wait_state(unsigned int wait_state) +{ + u_avr32_flashc_fcr_t u_avr32_flashc_fcr = {AVR32_FLASHC.fcr}; + u_avr32_flashc_fcr.FCR.fws = wait_state; + AVR32_FLASHC.fcr = u_avr32_flashc_fcr.fcr; +} + + +Bool flashc_is_ready_int_enabled(void) +{ + return ((AVR32_FLASHC.fcr & AVR32_FLASHC_FCR_FRDY_MASK) != 0); +} + + +void flashc_enable_ready_int(Bool enable) +{ + u_avr32_flashc_fcr_t u_avr32_flashc_fcr = {AVR32_FLASHC.fcr}; + u_avr32_flashc_fcr.FCR.frdy = (enable != FALSE); + AVR32_FLASHC.fcr = u_avr32_flashc_fcr.fcr; +} + + +Bool flashc_is_lock_error_int_enabled(void) +{ + return ((AVR32_FLASHC.fcr & AVR32_FLASHC_FCR_LOCKE_MASK) != 0); +} + + +void flashc_enable_lock_error_int(Bool enable) +{ + u_avr32_flashc_fcr_t u_avr32_flashc_fcr = {AVR32_FLASHC.fcr}; + u_avr32_flashc_fcr.FCR.locke = (enable != FALSE); + AVR32_FLASHC.fcr = u_avr32_flashc_fcr.fcr; +} + + +Bool flashc_is_prog_error_int_enabled(void) +{ + return ((AVR32_FLASHC.fcr & AVR32_FLASHC_FCR_PROGE_MASK) != 0); +} + + +void flashc_enable_prog_error_int(Bool enable) +{ + u_avr32_flashc_fcr_t u_avr32_flashc_fcr = {AVR32_FLASHC.fcr}; + u_avr32_flashc_fcr.FCR.proge = (enable != FALSE); + AVR32_FLASHC.fcr = u_avr32_flashc_fcr.fcr; +} + + +//! @} + + +/*! \name FLASHC Status + */ +//! @{ + + +Bool flashc_is_ready(void) +{ + return ((AVR32_FLASHC.fsr & AVR32_FLASHC_FSR_FRDY_MASK) != 0); +} + + +void flashc_default_wait_until_ready(void) +{ + while (!flashc_is_ready()); +} + + +void (*volatile flashc_wait_until_ready)(void) = flashc_default_wait_until_ready; + + +/*! \brief Gets the error status of the FLASHC. + * + * \return The error status of the FLASHC built up from + * \c AVR32_FLASHC_FSR_LOCKE_MASK and \c AVR32_FLASHC_FSR_PROGE_MASK. + * + * \warning This hardware error status is cleared by all functions reading the + * Flash Status Register (FSR). This function is therefore not part of + * the driver's API which instead presents \ref flashc_is_lock_error + * and \ref flashc_is_programming_error. + */ +static unsigned int flashc_get_error_status(void) +{ + return AVR32_FLASHC.fsr & (AVR32_FLASHC_FSR_LOCKE_MASK | + AVR32_FLASHC_FSR_PROGE_MASK); +} + + +//! Sticky error status of the FLASHC. +//! This variable is updated by functions that issue FLASHC commands. It +//! contains the cumulated FLASHC error status of all the FLASHC commands issued +//! by a function. +static unsigned int flashc_error_status = 0; + + +Bool flashc_is_lock_error(void) +{ + return ((flashc_error_status & AVR32_FLASHC_FSR_LOCKE_MASK) != 0); +} + + +Bool flashc_is_programming_error(void) +{ + return ((flashc_error_status & AVR32_FLASHC_FSR_PROGE_MASK) != 0); +} + + +//! @} + + +/*! \name FLASHC Command Control + */ +//! @{ + + +unsigned int flashc_get_command(void) +{ + return (AVR32_FLASHC.fcmd & AVR32_FLASHC_FCMD_CMD_MASK) >> AVR32_FLASHC_FCMD_CMD_OFFSET; +} + + +unsigned int flashc_get_page_number(void) +{ + return (AVR32_FLASHC.fcmd & AVR32_FLASHC_FCMD_PAGEN_MASK) >> AVR32_FLASHC_FCMD_PAGEN_OFFSET; +} + + +void flashc_issue_command(unsigned int command, int page_number) +{ + u_avr32_flashc_fcmd_t u_avr32_flashc_fcmd; + flashc_wait_until_ready(); + u_avr32_flashc_fcmd.fcmd = AVR32_FLASHC.fcmd; + u_avr32_flashc_fcmd.FCMD.cmd = command; + if (page_number >= 0) u_avr32_flashc_fcmd.FCMD.pagen = page_number; + u_avr32_flashc_fcmd.FCMD.key = AVR32_FLASHC_FCMD_KEY_KEY; + AVR32_FLASHC.fcmd = u_avr32_flashc_fcmd.fcmd; + flashc_error_status = flashc_get_error_status(); + flashc_wait_until_ready(); +} + + +//! @} + + +/*! \name FLASHC Global Commands + */ +//! @{ + + +void flashc_no_operation(void) +{ + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_NOP, -1); +} + + +void flashc_erase_all(void) +{ + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_EA, -1); +} + + +//! @} + + +/*! \name FLASHC Protection Mechanisms + */ +//! @{ + + +Bool flashc_is_security_bit_active(void) +{ + return ((AVR32_FLASHC.fsr & AVR32_FLASHC_FSR_SECURITY_MASK) != 0); +} + + +void flashc_activate_security_bit(void) +{ + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_SSB, -1); +} + + +unsigned int flashc_get_bootloader_protected_size(void) +{ + unsigned int bootprot = (1 << AVR32_FLASHC_FGPFRLO_BOOTPROT_SIZE) - 1 - + flashc_read_gp_fuse_bitfield(AVR32_FLASHC_FGPFRLO_BOOTPROT_OFFSET, + AVR32_FLASHC_FGPFRLO_BOOTPROT_SIZE); + return (bootprot) ? AVR32_FLASHC_PAGE_SIZE << bootprot : 0; +} + + +unsigned int flashc_set_bootloader_protected_size(unsigned int bootprot_size) +{ + flashc_set_gp_fuse_bitfield(AVR32_FLASHC_FGPFRLO_BOOTPROT_OFFSET, + AVR32_FLASHC_FGPFRLO_BOOTPROT_SIZE, + (1 << AVR32_FLASHC_FGPFRLO_BOOTPROT_SIZE) - 1 - + ((bootprot_size) ? + 32 - clz((((min(max(bootprot_size, AVR32_FLASHC_PAGE_SIZE << 1), + AVR32_FLASHC_PAGE_SIZE << + ((1 << AVR32_FLASHC_FGPFRLO_BOOTPROT_SIZE) - 1)) + + AVR32_FLASHC_PAGE_SIZE - 1) / + AVR32_FLASHC_PAGE_SIZE) << 1) - 1) - 1 : + 0)); + return flashc_get_bootloader_protected_size(); +} + + +Bool flashc_is_external_privileged_fetch_locked(void) +{ + return (!flashc_read_gp_fuse_bit(AVR32_FLASHC_FGPFRLO_EPFL_OFFSET)); +} + + +void flashc_lock_external_privileged_fetch(Bool lock) +{ + flashc_set_gp_fuse_bit(AVR32_FLASHC_FGPFRLO_EPFL_OFFSET, !lock); +} + + +Bool flashc_is_page_region_locked(int page_number) +{ + return flashc_is_region_locked(flashc_get_page_region(page_number)); +} + + +Bool flashc_is_region_locked(unsigned int region) +{ + return ((AVR32_FLASHC.fsr & AVR32_FLASHC_FSR_LOCK0_MASK << (region & (AVR32_FLASHC_REGIONS - 1))) != 0); +} + + +void flashc_lock_page_region(int page_number, Bool lock) +{ + flashc_issue_command((lock) ? AVR32_FLASHC_FCMD_CMD_LP : AVR32_FLASHC_FCMD_CMD_UP, page_number); +} + + +void flashc_lock_region(unsigned int region, Bool lock) +{ + flashc_lock_page_region(flashc_get_region_first_page_number(region), lock); +} + + +void flashc_lock_all_regions(Bool lock) +{ + unsigned int error_status = 0; + unsigned int region = AVR32_FLASHC_REGIONS; + while (region) + { + flashc_lock_region(--region, lock); + error_status |= flashc_error_status; + } + flashc_error_status = error_status; +} + + +//! @} + + +/*! \name Access to General-Purpose Fuses + */ +//! @{ + + +Bool flashc_read_gp_fuse_bit(unsigned int gp_fuse_bit) +{ + return ((flashc_read_all_gp_fuses() & 1ULL << (gp_fuse_bit & 0x3F)) != 0); +} + + +U64 flashc_read_gp_fuse_bitfield(unsigned int pos, unsigned int width) +{ + return flashc_read_all_gp_fuses() >> (pos & 0x3F) & ((1ULL << min(width, 64)) - 1); +} + + +U8 flashc_read_gp_fuse_byte(unsigned int gp_fuse_byte) +{ + return flashc_read_all_gp_fuses() >> ((gp_fuse_byte & 0x07) << 3); +} + + +U64 flashc_read_all_gp_fuses(void) +{ + return AVR32_FLASHC.fgpfrlo | (U64)AVR32_FLASHC.fgpfrhi << 32; +} + + +Bool flashc_erase_gp_fuse_bit(unsigned int gp_fuse_bit, Bool check) +{ + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_EGPB, gp_fuse_bit & 0x3F); + return (check) ? flashc_read_gp_fuse_bit(gp_fuse_bit) : TRUE; +} + + +Bool flashc_erase_gp_fuse_bitfield(unsigned int pos, unsigned int width, Bool check) +{ + unsigned int error_status = 0; + unsigned int gp_fuse_bit; + pos &= 0x3F; + width = min(width, 64); + for (gp_fuse_bit = pos; gp_fuse_bit < pos + width; gp_fuse_bit++) + { + flashc_erase_gp_fuse_bit(gp_fuse_bit, FALSE); + error_status |= flashc_error_status; + } + flashc_error_status = error_status; + return (check) ? (flashc_read_gp_fuse_bitfield(pos, width) == (1ULL << width) - 1) : TRUE; +} + + +Bool flashc_erase_gp_fuse_byte(unsigned int gp_fuse_byte, Bool check) +{ + unsigned int error_status; + unsigned int current_gp_fuse_byte; + U64 value = flashc_read_all_gp_fuses(); + flashc_erase_all_gp_fuses(FALSE); + error_status = flashc_error_status; + for (current_gp_fuse_byte = 0; current_gp_fuse_byte < 8; current_gp_fuse_byte++, value >>= 8) + { + if (current_gp_fuse_byte != gp_fuse_byte) + { + flashc_write_gp_fuse_byte(current_gp_fuse_byte, value); + error_status |= flashc_error_status; + } + } + flashc_error_status = error_status; + return (check) ? (flashc_read_gp_fuse_byte(gp_fuse_byte) == 0xFF) : TRUE; +} + + +Bool flashc_erase_all_gp_fuses(Bool check) +{ + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_EAGPF, -1); + return (check) ? (flashc_read_all_gp_fuses() == 0xFFFFFFFFFFFFFFFFULL) : TRUE; +} + + +void flashc_write_gp_fuse_bit(unsigned int gp_fuse_bit, Bool value) +{ + if (!value) + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_WGPB, gp_fuse_bit & 0x3F); +} + + +void flashc_write_gp_fuse_bitfield(unsigned int pos, unsigned int width, U64 value) +{ + unsigned int error_status = 0; + unsigned int gp_fuse_bit; + pos &= 0x3F; + width = min(width, 64); + for (gp_fuse_bit = pos; gp_fuse_bit < pos + width; gp_fuse_bit++, value >>= 1) + { + flashc_write_gp_fuse_bit(gp_fuse_bit, value & 0x01); + error_status |= flashc_error_status; + } + flashc_error_status = error_status; +} + + +void flashc_write_gp_fuse_byte(unsigned int gp_fuse_byte, U8 value) +{ + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_PGPFB, (gp_fuse_byte & 0x07) | value << 3); +} + + +void flashc_write_all_gp_fuses(U64 value) +{ + unsigned int error_status = 0; + unsigned int gp_fuse_byte; + for (gp_fuse_byte = 0; gp_fuse_byte < 8; gp_fuse_byte++, value >>= 8) + { + flashc_write_gp_fuse_byte(gp_fuse_byte, value); + error_status |= flashc_error_status; + } + flashc_error_status = error_status; +} + + +void flashc_set_gp_fuse_bit(unsigned int gp_fuse_bit, Bool value) +{ + if (value) + flashc_erase_gp_fuse_bit(gp_fuse_bit, FALSE); + else + flashc_write_gp_fuse_bit(gp_fuse_bit, FALSE); +} + + +void flashc_set_gp_fuse_bitfield(unsigned int pos, unsigned int width, U64 value) +{ + unsigned int error_status = 0; + unsigned int gp_fuse_bit; + pos &= 0x3F; + width = min(width, 64); + for (gp_fuse_bit = pos; gp_fuse_bit < pos + width; gp_fuse_bit++, value >>= 1) + { + flashc_set_gp_fuse_bit(gp_fuse_bit, value & 0x01); + error_status |= flashc_error_status; + } + flashc_error_status = error_status; +} + + +void flashc_set_gp_fuse_byte(unsigned int gp_fuse_byte, U8 value) +{ + unsigned int error_status; + switch (value) + { + case 0xFF: + flashc_erase_gp_fuse_byte(gp_fuse_byte, FALSE); + break; + case 0x00: + flashc_write_gp_fuse_byte(gp_fuse_byte, 0x00); + break; + default: + flashc_erase_gp_fuse_byte(gp_fuse_byte, FALSE); + error_status = flashc_error_status; + flashc_write_gp_fuse_byte(gp_fuse_byte, value); + flashc_error_status |= error_status; + } +} + + +void flashc_set_all_gp_fuses(U64 value) +{ + unsigned int error_status; + switch (value) + { + case 0xFFFFFFFFFFFFFFFFULL: + flashc_erase_all_gp_fuses(FALSE); + break; + case 0x0000000000000000ULL: + flashc_write_all_gp_fuses(0x0000000000000000ULL); + break; + default: + flashc_erase_all_gp_fuses(FALSE); + error_status = flashc_error_status; + flashc_write_all_gp_fuses(value); + flashc_error_status |= error_status; + } +} + + +//! @} + + +/*! \name Access to Flash Pages + */ +//! @{ + + +void flashc_clear_page_buffer(void) +{ + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_CPB, -1); +} + + +Bool flashc_is_page_erased(void) +{ + return ((AVR32_FLASHC.fsr & AVR32_FLASHC_FSR_QPRR_MASK) != 0); +} + + +Bool flashc_quick_page_read(int page_number) +{ + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_QPR, page_number); + return flashc_is_page_erased(); +} + + +Bool flashc_erase_page(int page_number, Bool check) +{ + Bool page_erased = TRUE; + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_EP, page_number); + if (check) + { + unsigned int error_status = flashc_error_status; + page_erased = flashc_quick_page_read(-1); + flashc_error_status |= error_status; + } + return page_erased; +} + + +Bool flashc_erase_all_pages(Bool check) +{ + Bool all_pages_erased = TRUE; + unsigned int error_status = 0; + unsigned int page_number = flashc_get_page_count(); + while (page_number) + { + all_pages_erased &= flashc_erase_page(--page_number, check); + error_status |= flashc_error_status; + } + flashc_error_status = error_status; + return all_pages_erased; +} + + +void flashc_write_page(int page_number) +{ + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_WP, page_number); +} + + +Bool flashc_quick_user_page_read(void) +{ + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_QPRUP, -1); + return flashc_is_page_erased(); +} + + +Bool flashc_erase_user_page(Bool check) +{ + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_EUP, -1); + return (check) ? flashc_quick_user_page_read() : TRUE; +} + + +void flashc_write_user_page(void) +{ + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_WUP, -1); +} + + +volatile void *flashc_memset8(volatile void *dst, U8 src, size_t nbytes, Bool erase) +{ + return flashc_memset16(dst, src | (U16)src << 8, nbytes, erase); +} + + +volatile void *flashc_memset16(volatile void *dst, U16 src, size_t nbytes, Bool erase) +{ + return flashc_memset32(dst, src | (U32)src << 16, nbytes, erase); +} + + +volatile void *flashc_memset32(volatile void *dst, U32 src, size_t nbytes, Bool erase) +{ + return flashc_memset64(dst, src | (U64)src << 32, nbytes, erase); +} + + +volatile void *flashc_memset64(volatile void *dst, U64 src, size_t nbytes, Bool erase) +{ + // Use aggregated pointers to have several alignments available for a same address. + UnionCVPtr flash_array_end; + UnionVPtr dest; + Union64 source = {0}; + StructCVPtr dest_end; + UnionCVPtr flash_page_source_end; + Bool incomplete_flash_page_end; + Union64 flash_dword; + UnionVPtr tmp; + unsigned int error_status = 0; + unsigned int i; + + // Reformat arguments. + flash_array_end.u8ptr = AVR32_FLASH + flashc_get_flash_size(); + dest.u8ptr = dst; + for (i = (Get_align((U32)dest.u8ptr, sizeof(U64)) - 1) & (sizeof(U64) - 1); + src; i = (i - 1) & (sizeof(U64) - 1)) + { + source.u8[i] = src; + src >>= 8; + } + dest_end.u8ptr = dest.u8ptr + nbytes; + + // If destination is outside flash, go to next flash page if any. + if (dest.u8ptr < AVR32_FLASH) + { + dest.u8ptr = AVR32_FLASH; + } + else if (flash_array_end.u8ptr <= dest.u8ptr && dest.u8ptr < AVR32_FLASHC_USER_PAGE) + { + dest.u8ptr = AVR32_FLASHC_USER_PAGE; + } + + // If end of destination is outside flash, move it to the end of the previous flash page if any. + if (dest_end.u8ptr > AVR32_FLASHC_USER_PAGE + AVR32_FLASHC_USER_PAGE_SIZE) + { + dest_end.u8ptr = AVR32_FLASHC_USER_PAGE + AVR32_FLASHC_USER_PAGE_SIZE; + } + else if (AVR32_FLASHC_USER_PAGE >= dest_end.u8ptr && dest_end.u8ptr > flash_array_end.u8ptr) + { + dest_end.u8ptr = flash_array_end.u8ptr; + } + + // Align each end of destination pointer with its natural boundary. + dest_end.u16ptr = (U16 *)Align_down((U32)dest_end.u8ptr, sizeof(U16)); + dest_end.u32ptr = (U32 *)Align_down((U32)dest_end.u16ptr, sizeof(U32)); + dest_end.u64ptr = (U64 *)Align_down((U32)dest_end.u32ptr, sizeof(U64)); + + // While end of destination is not reached... + while (dest.u8ptr < dest_end.u8ptr) + { + // Clear the page buffer in order to prepare data for a flash page write. + flashc_clear_page_buffer(); + error_status |= flashc_error_status; + + // Determine where the source data will end in the current flash page. + flash_page_source_end.u64ptr = + (U64 *)min((U32)dest_end.u64ptr, + Align_down((U32)dest.u8ptr, AVR32_FLASHC_PAGE_SIZE) + AVR32_FLASHC_PAGE_SIZE); + + // Determine if the current destination page has an incomplete end. + incomplete_flash_page_end = (Align_down((U32)dest.u8ptr, AVR32_FLASHC_PAGE_SIZE) >= + Align_down((U32)dest_end.u8ptr, AVR32_FLASHC_PAGE_SIZE)); + + // Use a flash double-word buffer to manage unaligned accesses. + flash_dword.u64 = source.u64; + + // If destination does not point to the beginning of the current flash page... + if (!Test_align((U32)dest.u8ptr, AVR32_FLASHC_PAGE_SIZE)) + { + // Fill the beginning of the page buffer with the current flash page data. + // This is required by the hardware, even if page erase is not requested, + // in order to be able to write successfully to erased parts of flash + // pages that have already been written to. + for (tmp.u8ptr = (U8 *)Align_down((U32)dest.u8ptr, AVR32_FLASHC_PAGE_SIZE); + tmp.u64ptr < (U64 *)Align_down((U32)dest.u8ptr, sizeof(U64)); + tmp.u64ptr++) + *tmp.u64ptr = *tmp.u64ptr; + + // If destination is not 64-bit aligned... + if (!Test_align((U32)dest.u8ptr, sizeof(U64))) + { + // Fill the beginning of the flash double-word buffer with the current + // flash page data. + // This is required by the hardware, even if page erase is not + // requested, in order to be able to write successfully to erased parts + // of flash pages that have already been written to. + for (i = 0; i < Get_align((U32)dest.u8ptr, sizeof(U64)); i++) + flash_dword.u8[i] = *tmp.u8ptr++; + + // Align the destination pointer with its 64-bit boundary. + dest.u64ptr = (U64 *)Align_down((U32)dest.u8ptr, sizeof(U64)); + + // If the current destination double-word is not the last one... + if (dest.u64ptr < dest_end.u64ptr) + { + // Write the flash double-word buffer to the page buffer and reinitialize it. + *dest.u64ptr++ = flash_dword.u64; + flash_dword.u64 = source.u64; + } + } + } + + // Write the source data to the page buffer with 64-bit alignment. + for (i = flash_page_source_end.u64ptr - dest.u64ptr; i; i--) + *dest.u64ptr++ = source.u64; + + // If the current destination page has an incomplete end... + if (incomplete_flash_page_end) + { + // This is required by the hardware, even if page erase is not requested, + // in order to be able to write successfully to erased parts of flash + // pages that have already been written to. + { + tmp.u8ptr = (volatile U8 *)dest_end.u8ptr; + + // If end of destination is not 64-bit aligned... + if (!Test_align((U32)dest_end.u8ptr, sizeof(U64))) + { + // Fill the end of the flash double-word buffer with the current flash page data. + for (i = Get_align((U32)dest_end.u8ptr, sizeof(U64)); i < sizeof(U64); i++) + flash_dword.u8[i] = *tmp.u8ptr++; + + // Write the flash double-word buffer to the page buffer. + *dest.u64ptr++ = flash_dword.u64; + } + + // Fill the end of the page buffer with the current flash page data. + for (; !Test_align((U32)tmp.u64ptr, AVR32_FLASHC_PAGE_SIZE); tmp.u64ptr++) + *tmp.u64ptr = *tmp.u64ptr; + } + } + + // If the current flash page is in the flash array... + if (dest.u8ptr <= AVR32_FLASHC_USER_PAGE) + { + // Erase the current page if requested and write it from the page buffer. + if (erase) + { + flashc_erase_page(-1, FALSE); + error_status |= flashc_error_status; + } + flashc_write_page(-1); + error_status |= flashc_error_status; + + // If the end of the flash array is reached, go to the User page. + if (dest.u8ptr >= flash_array_end.u8ptr) + dest.u8ptr = AVR32_FLASHC_USER_PAGE; + } + // If the current flash page is the User page... + else + { + // Erase the User page if requested and write it from the page buffer. + if (erase) + { + flashc_erase_user_page(FALSE); + error_status |= flashc_error_status; + } + flashc_write_user_page(); + error_status |= flashc_error_status; + } + } + + // Update the FLASHC error status. + flashc_error_status = error_status; + + // Return the initial destination pointer as the standard memset function does. + return dst; +} + + +volatile void *flashc_memcpy(volatile void *dst, const void *src, size_t nbytes, Bool erase) +{ + // Use aggregated pointers to have several alignments available for a same address. + UnionCVPtr flash_array_end; + UnionVPtr dest; + UnionCPtr source; + StructCVPtr dest_end; + UnionCVPtr flash_page_source_end; + Bool incomplete_flash_page_end; + Union64 flash_dword; + Bool flash_dword_pending = FALSE; + UnionVPtr tmp; + unsigned int error_status = 0; + unsigned int i, j; + + // Reformat arguments. + flash_array_end.u8ptr = AVR32_FLASH + flashc_get_flash_size(); + dest.u8ptr = dst; + source.u8ptr = src; + dest_end.u8ptr = dest.u8ptr + nbytes; + + // If destination is outside flash, go to next flash page if any. + if (dest.u8ptr < AVR32_FLASH) + { + source.u8ptr += AVR32_FLASH - dest.u8ptr; + dest.u8ptr = AVR32_FLASH; + } + else if (flash_array_end.u8ptr <= dest.u8ptr && dest.u8ptr < AVR32_FLASHC_USER_PAGE) + { + source.u8ptr += AVR32_FLASHC_USER_PAGE - dest.u8ptr; + dest.u8ptr = AVR32_FLASHC_USER_PAGE; + } + + // If end of destination is outside flash, move it to the end of the previous flash page if any. + if (dest_end.u8ptr > AVR32_FLASHC_USER_PAGE + AVR32_FLASHC_USER_PAGE_SIZE) + { + dest_end.u8ptr = AVR32_FLASHC_USER_PAGE + AVR32_FLASHC_USER_PAGE_SIZE; + } + else if (AVR32_FLASHC_USER_PAGE >= dest_end.u8ptr && dest_end.u8ptr > flash_array_end.u8ptr) + { + dest_end.u8ptr = flash_array_end.u8ptr; + } + + // Align each end of destination pointer with its natural boundary. + dest_end.u16ptr = (U16 *)Align_down((U32)dest_end.u8ptr, sizeof(U16)); + dest_end.u32ptr = (U32 *)Align_down((U32)dest_end.u16ptr, sizeof(U32)); + dest_end.u64ptr = (U64 *)Align_down((U32)dest_end.u32ptr, sizeof(U64)); + + // While end of destination is not reached... + while (dest.u8ptr < dest_end.u8ptr) + { + // Clear the page buffer in order to prepare data for a flash page write. + flashc_clear_page_buffer(); + error_status |= flashc_error_status; + + // Determine where the source data will end in the current flash page. + flash_page_source_end.u64ptr = + (U64 *)min((U32)dest_end.u64ptr, + Align_down((U32)dest.u8ptr, AVR32_FLASHC_PAGE_SIZE) + AVR32_FLASHC_PAGE_SIZE); + + // Determine if the current destination page has an incomplete end. + incomplete_flash_page_end = (Align_down((U32)dest.u8ptr, AVR32_FLASHC_PAGE_SIZE) >= + Align_down((U32)dest_end.u8ptr, AVR32_FLASHC_PAGE_SIZE)); + + // If destination does not point to the beginning of the current flash page... + if (!Test_align((U32)dest.u8ptr, AVR32_FLASHC_PAGE_SIZE)) + { + // Fill the beginning of the page buffer with the current flash page data. + // This is required by the hardware, even if page erase is not requested, + // in order to be able to write successfully to erased parts of flash + // pages that have already been written to. + for (tmp.u8ptr = (U8 *)Align_down((U32)dest.u8ptr, AVR32_FLASHC_PAGE_SIZE); + tmp.u64ptr < (U64 *)Align_down((U32)dest.u8ptr, sizeof(U64)); + tmp.u64ptr++) + *tmp.u64ptr = *tmp.u64ptr; + + // If destination is not 64-bit aligned... + if (!Test_align((U32)dest.u8ptr, sizeof(U64))) + { + // Fill the beginning of the flash double-word buffer with the current + // flash page data. + // This is required by the hardware, even if page erase is not + // requested, in order to be able to write successfully to erased parts + // of flash pages that have already been written to. + for (i = 0; i < Get_align((U32)dest.u8ptr, sizeof(U64)); i++) + flash_dword.u8[i] = *tmp.u8ptr++; + + // Fill the end of the flash double-word buffer with the source data. + for (; i < sizeof(U64); i++) + flash_dword.u8[i] = *source.u8ptr++; + + // Align the destination pointer with its 64-bit boundary. + dest.u64ptr = (U64 *)Align_down((U32)dest.u8ptr, sizeof(U64)); + + // If the current destination double-word is not the last one... + if (dest.u64ptr < dest_end.u64ptr) + { + // Write the flash double-word buffer to the page buffer. + *dest.u64ptr++ = flash_dword.u64; + } + // If the current destination double-word is the last one, the flash + // double-word buffer must be kept for later. + else flash_dword_pending = TRUE; + } + } + + // Read the source data with the maximal possible alignment and write it to + // the page buffer with 64-bit alignment. + switch (Get_align((U32)source.u8ptr, sizeof(U32))) + { + case 0: + for (i = flash_page_source_end.u64ptr - dest.u64ptr; i; i--) + *dest.u64ptr++ = *source.u64ptr++; + break; + + case sizeof(U16): + for (i = flash_page_source_end.u64ptr - dest.u64ptr; i; i--) + { + for (j = 0; j < sizeof(U64) / sizeof(U16); j++) flash_dword.u16[j] = *source.u16ptr++; + *dest.u64ptr++ = flash_dword.u64; + } + break; + + default: + for (i = flash_page_source_end.u64ptr - dest.u64ptr; i; i--) + { + for (j = 0; j < sizeof(U64); j++) flash_dword.u8[j] = *source.u8ptr++; + *dest.u64ptr++ = flash_dword.u64; + } + } + + // If the current destination page has an incomplete end... + if (incomplete_flash_page_end) + { + // If the flash double-word buffer is in use, do not initialize it. + if (flash_dword_pending) i = Get_align((U32)dest_end.u8ptr, sizeof(U64)); + // If the flash double-word buffer is free... + else + { + // Fill the beginning of the flash double-word buffer with the source data. + for (i = 0; i < Get_align((U32)dest_end.u8ptr, sizeof(U64)); i++) + flash_dword.u8[i] = *source.u8ptr++; + } + + // This is required by the hardware, even if page erase is not requested, + // in order to be able to write successfully to erased parts of flash + // pages that have already been written to. + { + tmp.u8ptr = (volatile U8 *)dest_end.u8ptr; + + // If end of destination is not 64-bit aligned... + if (!Test_align((U32)dest_end.u8ptr, sizeof(U64))) + { + // Fill the end of the flash double-word buffer with the current flash page data. + for (; i < sizeof(U64); i++) + flash_dword.u8[i] = *tmp.u8ptr++; + + // Write the flash double-word buffer to the page buffer. + *dest.u64ptr++ = flash_dword.u64; + } + + // Fill the end of the page buffer with the current flash page data. + for (; !Test_align((U32)tmp.u64ptr, AVR32_FLASHC_PAGE_SIZE); tmp.u64ptr++) + *tmp.u64ptr = *tmp.u64ptr; + } + } + + // If the current flash page is in the flash array... + if (dest.u8ptr <= AVR32_FLASHC_USER_PAGE) + { + // Erase the current page if requested and write it from the page buffer. + if (erase) + { + flashc_erase_page(-1, FALSE); + error_status |= flashc_error_status; + } + flashc_write_page(-1); + error_status |= flashc_error_status; + + // If the end of the flash array is reached, go to the User page. + if (dest.u8ptr >= flash_array_end.u8ptr) + { + source.u8ptr += AVR32_FLASHC_USER_PAGE - dest.u8ptr; + dest.u8ptr = AVR32_FLASHC_USER_PAGE; + } + } + // If the current flash page is the User page... + else + { + // Erase the User page if requested and write it from the page buffer. + if (erase) + { + flashc_erase_user_page(FALSE); + error_status |= flashc_error_status; + } + flashc_write_user_page(); + error_status |= flashc_error_status; + } + } + + // Update the FLASHC error status. + flashc_error_status = error_status; + + // Return the initial destination pointer as the standard memcpy function does. + return dst; +} + + +#if UC3C +void flashc_set_flash_waitstate_and_readmode(unsigned long cpu_f_hz) +{ + //! Device-specific data + #undef AVR32_FLASHC_FWS_0_MAX_FREQ + #undef AVR32_FLASHC_FWS_1_MAX_FREQ + #undef AVR32_FLASHC_HSEN_FWS_0_MAX_FREQ + #undef AVR32_FLASHC_HSEN_FWS_1_MAX_FREQ + #define AVR32_FLASHC_FWS_0_MAX_FREQ 33000000 + #define AVR32_FLASHC_FWS_1_MAX_FREQ 66000000 + #define AVR32_FLASHC_HSEN_FWS_0_MAX_FREQ 33000000 + #define AVR32_FLASHC_HSEN_FWS_1_MAX_FREQ 72000000 + // These defines are missing from or wrong in the toolchain header files uc3cxxx.h + // Put a Bugzilla + + if(cpu_f_hz > AVR32_FLASHC_HSEN_FWS_0_MAX_FREQ) // > 33MHz + { + // Set a wait-state + flashc_set_wait_state(1); + if(cpu_f_hz <= AVR32_FLASHC_FWS_1_MAX_FREQ) // <= 66MHz and >33Mhz + { + // Disable the high-speed read mode. + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_HSDIS, -1); + } + else // > 66Mhz + { + // Enable the high-speed read mode. + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_HSEN, -1); + } + } + else // <= 33 MHz + { + // Disable wait-state + flashc_set_wait_state(0); + + // Disable the high-speed read mode. + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_HSDIS, -1); + + } +} +#endif // UC3C device-specific implementation + +//! @} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC/flashc.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC/flashc.h new file mode 100644 index 0000000..9f2547a --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC/flashc.h @@ -0,0 +1,1002 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief FLASHC driver for AVR32 UC3. + * + * AVR32 Flash Controller driver module. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with a FLASHC module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _FLASHC_H_ +#define _FLASHC_H_ + +#include +#include +#include "compiler.h" + +//! Number of flash regions defined by the FLASHC. +#define AVR32_FLASHC_REGIONS (AVR32_FLASHC_FLASH_SIZE /\ + (AVR32_FLASHC_PAGES_PR_REGION * AVR32_FLASHC_PAGE_SIZE)) + + +/*! \name Flash Properties + */ +//! @{ + +/*! \brief Gets the size of the whole flash array. + * + * \return The size of the whole flash array in bytes. + */ +extern unsigned int flashc_get_flash_size(void); + +/*! \brief Gets the total number of pages in the flash array. + * + * \return The total number of pages in the flash array. + */ +extern unsigned int flashc_get_page_count(void); + +/*! \brief Gets the number of pages in each flash region. + * + * \return The number of pages in each flash region. + */ +extern unsigned int flashc_get_page_count_per_region(void); + +/*! \brief Gets the region number of a page. + * + * \param page_number The page number: + * \arg \c 0 to (flashc_get_page_count() - 1): a page number within + * the flash array; + * \arg < 0: the current page number. + * + * \return The region number of the specified page. + */ +extern unsigned int flashc_get_page_region(int page_number); + +/*! \brief Gets the number of the first page of a region. + * + * \param region The region number: \c 0 to (AVR32_FLASHC_REGIONS - 1). + * + * \return The number of the first page of the specified region. + */ +extern unsigned int flashc_get_region_first_page_number(unsigned int region); + +//! @} + + +/*! \name FLASHC Control + */ +//! @{ + +/*! \brief Gets the number of wait states of flash read accesses. + * + * \return The number of wait states of flash read accesses. + */ +extern unsigned int flashc_get_wait_state(void); + +/*! \brief Sets the number of wait states of flash read accesses. + * + * \param wait_state The number of wait states of flash read accesses: \c 0 to + * \c 1. + */ +extern void flashc_set_wait_state(unsigned int wait_state); + +/*! \brief Tells whether the Flash Ready interrupt is enabled. + * + * \return Whether the Flash Ready interrupt is enabled. + */ +extern Bool flashc_is_ready_int_enabled(void); + +/*! \brief Enables or disables the Flash Ready interrupt. + * + * \param enable Whether to enable the Flash Ready interrupt: \c TRUE or + * \c FALSE. + */ +extern void flashc_enable_ready_int(Bool enable); + +/*! \brief Tells whether the Lock Error interrupt is enabled. + * + * \return Whether the Lock Error interrupt is enabled. + */ +extern Bool flashc_is_lock_error_int_enabled(void); + +/*! \brief Enables or disables the Lock Error interrupt. + * + * \param enable Whether to enable the Lock Error interrupt: \c TRUE or + * \c FALSE. + */ +extern void flashc_enable_lock_error_int(Bool enable); + +/*! \brief Tells whether the Programming Error interrupt is enabled. + * + * \return Whether the Programming Error interrupt is enabled. + */ +extern Bool flashc_is_prog_error_int_enabled(void); + +/*! \brief Enables or disables the Programming Error interrupt. + * + * \param enable Whether to enable the Programming Error interrupt: \c TRUE or + * \c FALSE. + */ +extern void flashc_enable_prog_error_int(Bool enable); + +//! @} + + +/*! \name FLASHC Status + */ +//! @{ + +/*! \brief Tells whether the FLASHC is ready to run a new command. + * + * \return Whether the FLASHC is ready to run a new command. + */ +extern Bool flashc_is_ready(void); + +/*! \brief Waits actively until the FLASHC is ready to run a new command. + * + * This is the default function assigned to \ref flashc_wait_until_ready. + */ +extern void flashc_default_wait_until_ready(void); + +//! Pointer to the function used by the driver when it needs to wait until the +//! FLASHC is ready to run a new command. +//! The default function is \ref flashc_default_wait_until_ready. +//! The user may change this pointer to use another implementation. +extern void (*volatile flashc_wait_until_ready)(void); + +/*! \brief Tells whether a Lock Error has occurred during the last function + * called that issued one or more FLASHC commands. + * + * \return Whether a Lock Error has occurred during the last function called + * that issued one or more FLASHC commands. + */ +extern Bool flashc_is_lock_error(void); + +/*! \brief Tells whether a Programming Error has occurred during the last + * function called that issued one or more FLASHC commands. + * + * \return Whether a Programming Error has occurred during the last function + * called that issued one or more FLASHC commands. + */ +extern Bool flashc_is_programming_error(void); + +//! @} + + +/*! \name FLASHC Command Control + */ +//! @{ + +/*! \brief Gets the last issued FLASHC command. + * + * \return The last issued FLASHC command. + */ +extern unsigned int flashc_get_command(void); + +/*! \brief Gets the current FLASHC page number. + * + * \return The current FLASHC page number. + */ +extern unsigned int flashc_get_page_number(void); + +/*! \brief Issues a FLASHC command. + * + * \param command The command: \c AVR32_FLASHC_FCMD_CMD_x. + * \param page_number The page number to apply the command to: + * \arg \c 0 to (flashc_get_page_count() - 1): a page number within + * the flash array; + * \arg < 0: use this to apply the command to the current page number + * or if the command does not apply to any page number; + * \arg this argument may have other meanings according to the command. See + * the FLASHC chapter of the MCU datasheet. + * + * \warning A Lock Error is issued if the command violates the protection + * mechanism. + * + * \warning A Programming Error is issued if the command is invalid. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +extern void flashc_issue_command(unsigned int command, int page_number); + +//! @} + + +/*! \name FLASHC Global Commands + */ +//! @{ + +/*! \brief Issues a No Operation command to the FLASHC. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +extern void flashc_no_operation(void); + +/*! \brief Issues an Erase All command to the FLASHC. + * + * This command erases all bits in the flash array, the general-purpose fuse + * bits and the Security bit. The User page is not erased. + * + * This command also ensures that all volatile memories, such as register file + * and RAMs, are erased before the Security bit is erased, i.e. deactivated. + * + * \warning A Lock Error is issued if at least one region is locked or the + * bootloader protection is active. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note An erase operation can only set bits. + */ +extern void flashc_erase_all(void); + +//! @} + + +/*! \name FLASHC Protection Mechanisms + */ +//! @{ + +/*! \brief Tells whether the Security bit is active. + * + * \return Whether the Security bit is active. + */ +extern Bool flashc_is_security_bit_active(void); + +/*! \brief Activates the Security bit. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +extern void flashc_activate_security_bit(void); + +/*! \brief Gets the bootloader protected size. + * + * \return The bootloader protected size in bytes. + */ +extern unsigned int flashc_get_bootloader_protected_size(void); + +/*! \brief Sets the bootloader protected size. + * + * \param bootprot_size The wanted bootloader protected size in bytes. If this + * size is not supported, the actual size will be the + * nearest greater available size or the maximal possible + * size if the requested size is too large. + * + * \return The actual bootloader protected size in bytes. + * + * \warning A Lock Error is issued if the Security bit is active. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +extern unsigned int flashc_set_bootloader_protected_size(unsigned int bootprot_size); + +/*! \brief Tells whether external privileged fetch is locked. + * + * \return Whether external privileged fetch is locked. + */ +extern Bool flashc_is_external_privileged_fetch_locked(void); + +/*! \brief Locks or unlocks external privileged fetch. + * + * \param lock Whether to lock external privileged fetch: \c TRUE or \c FALSE. + * + * \warning A Lock Error is issued if the Security bit is active. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +extern void flashc_lock_external_privileged_fetch(Bool lock); + +/*! \brief Tells whether the region of a page is locked. + * + * \param page_number The page number: + * \arg \c 0 to (flashc_get_page_count() - 1): a page number within + * the flash array; + * \arg < 0: the current page number. + * + * \return Whether the region of the specified page is locked. + */ +extern Bool flashc_is_page_region_locked(int page_number); + +/*! \brief Tells whether a region is locked. + * + * \param region The region number: \c 0 to (AVR32_FLASHC_REGIONS - 1). + * + * \return Whether the specified region is locked. + */ +extern Bool flashc_is_region_locked(unsigned int region); + +/*! \brief Locks or unlocks the region of a page. + * + * \param page_number The page number: + * \arg \c 0 to (flashc_get_page_count() - 1): a page number within + * the flash array; + * \arg < 0: the current page number. + * \param lock Whether to lock the region of the specified page: \c TRUE or + * \c FALSE. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +extern void flashc_lock_page_region(int page_number, Bool lock); + +/*! \brief Locks or unlocks a region. + * + * \param region The region number: \c 0 to (AVR32_FLASHC_REGIONS - 1). + * \param lock Whether to lock the specified region: \c TRUE or \c FALSE. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +extern void flashc_lock_region(unsigned int region, Bool lock); + +/*! \brief Locks or unlocks all regions. + * + * \param lock Whether to lock the regions: \c TRUE or \c FALSE. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +extern void flashc_lock_all_regions(Bool lock); + +//! @} + + +/*! \name Access to General-Purpose Fuses + */ +//! @{ + +/*! \brief Reads a general-purpose fuse bit. + * + * \param gp_fuse_bit The general-purpose fuse bit: \c 0 to \c 63. + * + * \return The value of the specified general-purpose fuse bit. + * + * \note The actual number of general-purpose fuse bits implemented by hardware + * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are + * fixed at 1 by hardware. + */ +extern Bool flashc_read_gp_fuse_bit(unsigned int gp_fuse_bit); + +/*! \brief Reads a general-purpose fuse bit-field. + * + * \param pos The bit-position of the general-purpose fuse bit-field: \c 0 to + * \c 63. + * \param width The bit-width of the general-purpose fuse bit-field: \c 0 to + * \c 64. + * + * \return The value of the specified general-purpose fuse bit-field. + * + * \note The actual number of general-purpose fuse bits implemented by hardware + * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are + * fixed at 1 by hardware. + */ +extern U64 flashc_read_gp_fuse_bitfield(unsigned int pos, unsigned int width); + +/*! \brief Reads a general-purpose fuse byte. + * + * \param gp_fuse_byte The general-purpose fuse byte: \c 0 to \c 7. + * + * \return The value of the specified general-purpose fuse byte. + * + * \note The actual number of general-purpose fuse bits implemented by hardware + * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are + * fixed at 1 by hardware. + */ +extern U8 flashc_read_gp_fuse_byte(unsigned int gp_fuse_byte); + +/*! \brief Reads all general-purpose fuses. + * + * \return The value of all general-purpose fuses as a word. + * + * \note The actual number of general-purpose fuse bits implemented by hardware + * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are + * fixed at 1 by hardware. + */ +extern U64 flashc_read_all_gp_fuses(void); + +/*! \brief Erases a general-purpose fuse bit. + * + * \param gp_fuse_bit The general-purpose fuse bit: \c 0 to \c 63. + * \param check Whether to check erase: \c TRUE or \c FALSE. + * + * \return Whether the erase succeeded or always \c TRUE if erase check was not + * requested. + * + * \warning A Lock Error is issued if the Security bit is active and the command + * is applied to BOOTPROT or EPFL fuses. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note An erase operation can only set bits. + * + * \note The actual number of general-purpose fuse bits implemented by hardware + * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are + * fixed at 1 by hardware. + */ +extern Bool flashc_erase_gp_fuse_bit(unsigned int gp_fuse_bit, Bool check); + +/*! \brief Erases a general-purpose fuse bit-field. + * + * \param pos The bit-position of the general-purpose fuse bit-field: \c 0 to + * \c 63. + * \param width The bit-width of the general-purpose fuse bit-field: \c 0 to + * \c 64. + * \param check Whether to check erase: \c TRUE or \c FALSE. + * + * \return Whether the erase succeeded or always \c TRUE if erase check was not + * requested. + * + * \warning A Lock Error is issued if the Security bit is active and the command + * is applied to BOOTPROT or EPFL fuses. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note An erase operation can only set bits. + * + * \note The actual number of general-purpose fuse bits implemented by hardware + * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are + * fixed at 1 by hardware. + */ +extern Bool flashc_erase_gp_fuse_bitfield(unsigned int pos, unsigned int width, Bool check); + +/*! \brief Erases a general-purpose fuse byte. + * + * \param gp_fuse_byte The general-purpose fuse byte: \c 0 to \c 7. + * \param check Whether to check erase: \c TRUE or \c FALSE. + * + * \return Whether the erase succeeded or always \c TRUE if erase check was not + * requested. + * + * \warning A Lock Error is issued if the Security bit is active. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note An erase operation can only set bits. + * + * \note The actual number of general-purpose fuse bits implemented by hardware + * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are + * fixed at 1 by hardware. + */ +extern Bool flashc_erase_gp_fuse_byte(unsigned int gp_fuse_byte, Bool check); + +/*! \brief Erases all general-purpose fuses. + * + * \param check Whether to check erase: \c TRUE or \c FALSE. + * + * \return Whether the erase succeeded or always \c TRUE if erase check was not + * requested. + * + * \warning A Lock Error is issued if the Security bit is active. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note An erase operation can only set bits. + * + * \note The actual number of general-purpose fuse bits implemented by hardware + * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are + * fixed at 1 by hardware. + */ +extern Bool flashc_erase_all_gp_fuses(Bool check); + +/*! \brief Writes a general-purpose fuse bit. + * + * \param gp_fuse_bit The general-purpose fuse bit: \c 0 to \c 63. + * \param value The value of the specified general-purpose fuse bit. + * + * \warning A Lock Error is issued if the Security bit is active and the command + * is applied to BOOTPROT or EPFL fuses. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note A write operation can only clear bits. + * + * \note The actual number of general-purpose fuse bits implemented by hardware + * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are + * fixed at 1 by hardware. + */ +extern void flashc_write_gp_fuse_bit(unsigned int gp_fuse_bit, Bool value); + +/*! \brief Writes a general-purpose fuse bit-field. + * + * \param pos The bit-position of the general-purpose fuse bit-field: \c 0 to + * \c 63. + * \param width The bit-width of the general-purpose fuse bit-field: \c 0 to + * \c 64. + * \param value The value of the specified general-purpose fuse bit-field. + * + * \warning A Lock Error is issued if the Security bit is active and the command + * is applied to BOOTPROT or EPFL fuses. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note A write operation can only clear bits. + * + * \note The actual number of general-purpose fuse bits implemented by hardware + * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are + * fixed at 1 by hardware. + */ +extern void flashc_write_gp_fuse_bitfield(unsigned int pos, unsigned int width, U64 value); + +/*! \brief Writes a general-purpose fuse byte. + * + * \param gp_fuse_byte The general-purpose fuse byte: \c 0 to \c 7. + * \param value The value of the specified general-purpose fuse byte. + * + * \warning A Lock Error is issued if the Security bit is active. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note A write operation can only clear bits. + * + * \note The actual number of general-purpose fuse bits implemented by hardware + * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are + * fixed at 1 by hardware. + */ +extern void flashc_write_gp_fuse_byte(unsigned int gp_fuse_byte, U8 value); + +/*! \brief Writes all general-purpose fuses. + * + * \param value The value of all general-purpose fuses as a word. + * + * \warning A Lock Error is issued if the Security bit is active. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note A write operation can only clear bits. + * + * \note The actual number of general-purpose fuse bits implemented by hardware + * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are + * fixed at 1 by hardware. + */ +extern void flashc_write_all_gp_fuses(U64 value); + +/*! \brief Sets a general-purpose fuse bit with the appropriate erase and write + * operations. + * + * \param gp_fuse_bit The general-purpose fuse bit: \c 0 to \c 63. + * \param value The value of the specified general-purpose fuse bit. + * + * \warning A Lock Error is issued if the Security bit is active and the command + * is applied to BOOTPROT or EPFL fuses. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note The actual number of general-purpose fuse bits implemented by hardware + * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are + * fixed at 1 by hardware. + */ +extern void flashc_set_gp_fuse_bit(unsigned int gp_fuse_bit, Bool value); + +/*! \brief Sets a general-purpose fuse bit-field with the appropriate erase and + * write operations. + * + * \param pos The bit-position of the general-purpose fuse bit-field: \c 0 to + * \c 63. + * \param width The bit-width of the general-purpose fuse bit-field: \c 0 to + * \c 64. + * \param value The value of the specified general-purpose fuse bit-field. + * + * \warning A Lock Error is issued if the Security bit is active and the command + * is applied to BOOTPROT or EPFL fuses. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note The actual number of general-purpose fuse bits implemented by hardware + * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are + * fixed at 1 by hardware. + */ +extern void flashc_set_gp_fuse_bitfield(unsigned int pos, unsigned int width, U64 value); + +/*! \brief Sets a general-purpose fuse byte with the appropriate erase and write + * operations. + * + * \param gp_fuse_byte The general-purpose fuse byte: \c 0 to \c 7. + * \param value The value of the specified general-purpose fuse byte. + * + * \warning A Lock Error is issued if the Security bit is active. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note The actual number of general-purpose fuse bits implemented by hardware + * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are + * fixed at 1 by hardware. + */ +extern void flashc_set_gp_fuse_byte(unsigned int gp_fuse_byte, U8 value); + +/*! \brief Sets all general-purpose fuses with the appropriate erase and write + * operations. + * + * \param value The value of all general-purpose fuses as a word. + * + * \warning A Lock Error is issued if the Security bit is active. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note The actual number of general-purpose fuse bits implemented by hardware + * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are + * fixed at 1 by hardware. + */ +extern void flashc_set_all_gp_fuses(U64 value); + +//! @} + + +/*! \name Access to Flash Pages + */ +//! @{ + +/*! \brief Clears the page buffer. + * + * This command resets all bits in the page buffer to one. Write accesses to the + * page buffer can only change page buffer bits from one to zero. + * + * \warning The page buffer is not automatically reset after a page write. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +extern void flashc_clear_page_buffer(void); + +/*! \brief Tells whether the page to which the last Quick Page Read or Quick + * Page Read User Page command was applied was erased. + * + * \return Whether the page to which the last Quick Page Read or Quick Page Read + * User Page command was applied was erased. + */ +extern Bool flashc_is_page_erased(void); + +/*! \brief Applies the Quick Page Read command to a page. + * + * \param page_number The page number: + * \arg \c 0 to (flashc_get_page_count() - 1): a page number within + * the flash array; + * \arg < 0: the current page number. + * + * \return Whether the specified page is erased. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +extern Bool flashc_quick_page_read(int page_number); + +/*! \brief Erases a page. + * + * \param page_number The page number: + * \arg \c 0 to (flashc_get_page_count() - 1): a page number within + * the flash array; + * \arg < 0: the current page number. + * \param check Whether to check erase: \c TRUE or \c FALSE. + * + * \return Whether the erase succeeded or always \c TRUE if erase check was not + * requested. + * + * \warning A Lock Error is issued if the command is applied to a page belonging + * to a locked region or to the bootloader protected area. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note An erase operation can only set bits. + */ +extern Bool flashc_erase_page(int page_number, Bool check); + +/*! \brief Erases all pages within the flash array. + * + * \param check Whether to check erase: \c TRUE or \c FALSE. + * + * \return Whether the erase succeeded or always \c TRUE if erase check was not + * requested. + * + * \warning A Lock Error is issued if at least one region is locked or the + * bootloader protection is active. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note An erase operation can only set bits. + */ +extern Bool flashc_erase_all_pages(Bool check); + +/*! \brief Writes a page from the page buffer. + * + * \param page_number The page number: + * \arg \c 0 to (flashc_get_page_count() - 1): a page number within + * the flash array; + * \arg < 0: the current page number. + * + * \warning A Lock Error is issued if the command is applied to a page belonging + * to a locked region or to the bootloader protected area. + * + * \warning The page buffer is not automatically reset after a page write. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note A write operation can only clear bits. + */ +extern void flashc_write_page(int page_number); + +/*! \brief Issues a Quick Page Read User Page command to the FLASHC. + * + * \return Whether the User page is erased. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +extern Bool flashc_quick_user_page_read(void); + +/*! \brief Erases the User page. + * + * \param check Whether to check erase: \c TRUE or \c FALSE. + * + * \return Whether the erase succeeded or always \c TRUE if erase check was not + * requested. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note An erase operation can only set bits. + */ +extern Bool flashc_erase_user_page(Bool check); + +/*! \brief Writes the User page from the page buffer. + * + * \warning The page buffer is not automatically reset after a page write. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note A write operation can only clear bits. + */ +extern void flashc_write_user_page(void); + +/*! \brief Copies \a nbytes bytes to the flash destination pointed to by \a dst + * from the repeated \a src source byte. + * + * The destination areas that are not within the flash array or the User page + * are ignored. + * + * All pointer and size alignments are supported. + * + * \param dst Pointer to flash destination. + * \param src Source byte. + * \param nbytes Number of bytes to set. + * \param erase Whether to erase before writing: \c TRUE or \c FALSE. + * + * \return The value of \a dst. + * + * \warning This function may be called with \a erase set to \c FALSE only if + * the destination consists only of erased words, i.e. this function + * can not be used to write only one bit of a previously written word. + * E.g., if \c 0x00000001 then \c 0xFFFFFFFE are written to a word, the + * resulting value in flash may be different from \c 0x00000000. + * + * \warning A Lock Error is issued if the command is applied to pages belonging + * to a locked region or to the bootloader protected area. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +extern volatile void *flashc_memset8(volatile void *dst, U8 src, size_t nbytes, Bool erase); + +/*! \brief Copies \a nbytes bytes to the flash destination pointed to by \a dst + * from the repeated \a src big-endian source half-word. + * + * The destination areas that are not within the flash array or the User page + * are ignored. + * + * All pointer and size alignments are supported. + * + * \param dst Pointer to flash destination. + * \param src Source half-word. + * \param nbytes Number of bytes to set. + * \param erase Whether to erase before writing: \c TRUE or \c FALSE. + * + * \return The value of \a dst. + * + * \warning This function may be called with \a erase set to \c FALSE only if + * the destination consists only of erased words, i.e. this function + * can not be used to write only one bit of a previously written word. + * E.g., if \c 0x00000001 then \c 0xFFFFFFFE are written to a word, the + * resulting value in flash may be different from \c 0x00000000. + * + * \warning A Lock Error is issued if the command is applied to pages belonging + * to a locked region or to the bootloader protected area. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +extern volatile void *flashc_memset16(volatile void *dst, U16 src, size_t nbytes, Bool erase); + +/*! \brief Copies \a nbytes bytes to the flash destination pointed to by \a dst + * from the repeated \a src big-endian source word. + * + * The destination areas that are not within the flash array or the User page + * are ignored. + * + * All pointer and size alignments are supported. + * + * \param dst Pointer to flash destination. + * \param src Source word. + * \param nbytes Number of bytes to set. + * \param erase Whether to erase before writing: \c TRUE or \c FALSE. + * + * \return The value of \a dst. + * + * \warning This function may be called with \a erase set to \c FALSE only if + * the destination consists only of erased words, i.e. this function + * can not be used to write only one bit of a previously written word. + * E.g., if \c 0x00000001 then \c 0xFFFFFFFE are written to a word, the + * resulting value in flash may be different from \c 0x00000000. + * + * \warning A Lock Error is issued if the command is applied to pages belonging + * to a locked region or to the bootloader protected area. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +extern volatile void *flashc_memset32(volatile void *dst, U32 src, size_t nbytes, Bool erase); + +/*! \brief Copies \a nbytes bytes to the flash destination pointed to by \a dst + * from the repeated \a src big-endian source double-word. + * + * The destination areas that are not within the flash array or the User page + * are ignored. + * + * All pointer and size alignments are supported. + * + * \param dst Pointer to flash destination. + * \param src Source double-word. + * \param nbytes Number of bytes to set. + * \param erase Whether to erase before writing: \c TRUE or \c FALSE. + * + * \return The value of \a dst. + * + * \warning This function may be called with \a erase set to \c FALSE only if + * the destination consists only of erased words, i.e. this function + * can not be used to write only one bit of a previously written word. + * E.g., if \c 0x00000001 then \c 0xFFFFFFFE are written to a word, the + * resulting value in flash may be different from \c 0x00000000. + * + * \warning A Lock Error is issued if the command is applied to pages belonging + * to a locked region or to the bootloader protected area. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +extern volatile void *flashc_memset64(volatile void *dst, U64 src, size_t nbytes, Bool erase); + +/*! \brief Copies \a nbytes bytes to the flash destination pointed to by \a dst + * from the repeated \a src big-endian source pattern. + * + * The destination areas that are not within the flash array or the User page + * are ignored. + * + * All pointer and size alignments are supported. + * + * \param dst Pointer to flash destination. + * \param src Source double-word. + * \param src_width \a src width in bits: 8, 16, 32 or 64. + * \param nbytes Number of bytes to set. + * \param erase Whether to erase before writing: \c TRUE or \c FALSE. + * + * \return The value of \a dst. + * + * \warning This function may be called with \a erase set to \c FALSE only if + * the destination consists only of erased words, i.e. this function + * can not be used to write only one bit of a previously written word. + * E.g., if \c 0x00000001 then \c 0xFFFFFFFE are written to a word, the + * resulting value in flash may be different from \c 0x00000000. + * + * \warning A Lock Error is issued if the command is applied to pages belonging + * to a locked region or to the bootloader protected area. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +#define flashc_memset(dst, src, src_width, nbytes, erase) \ + TPASTE2(flashc_memset, src_width)((dst), (src), (nbytes), (erase)) + +/*! \brief Copies \a nbytes bytes to the flash destination pointed to by \a dst + * from the source pointed to by \a src. + * + * The destination areas that are not within the flash array or the User page + * are ignored. + * + * All pointer and size alignments are supported. + * + * \param dst Pointer to flash destination. + * \param src Pointer to source data. + * \param nbytes Number of bytes to copy. + * \param erase Whether to erase before writing: \c TRUE or \c FALSE. + * + * \return The value of \a dst. + * + * \warning If copying takes place between areas that overlap, the behavior is + * undefined. + * + * \warning This function may be called with \a erase set to \c FALSE only if + * the destination consists only of erased words, i.e. this function + * can not be used to write only one bit of a previously written word. + * E.g., if \c 0x00000001 then \c 0xFFFFFFFE are written to a word, the + * resulting value in flash may be different from \c 0x00000000. + * + * \warning A Lock Error is issued if the command is applied to pages belonging + * to a locked region or to the bootloader protected area. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +extern volatile void *flashc_memcpy(volatile void *dst, const void *src, size_t nbytes, Bool erase); + +#if UC3C + +/*! \brief Depednding to the CPU frequency, set the wait states of flash read + * accesses and enable or disable the High speed read mode. + * + * \param cpu_f_hz The CPU frequency + */ +void flashc_set_flash_waitstate_and_readmode(unsigned long cpu_f_hz); +#endif // UC3C device-specific implementation + +//! @} + + +#endif // _FLASHC_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO/gpio.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO/gpio.c new file mode 100644 index 0000000..b6b83c7 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO/gpio.c @@ -0,0 +1,458 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file has been prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief GPIO driver for AVR32 UC3. + * + * This file defines a useful set of functions for the GPIO. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with a GPIO module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + *****************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#include "gpio.h" + +//! GPIO module instance. +#define GPIO AVR32_GPIO + + +/*! \name Peripheral Bus Interface + */ +//! @{ + + +int gpio_enable_module(const gpio_map_t gpiomap, unsigned int size) +{ + int status = GPIO_SUCCESS; + unsigned int i; + + for (i = 0; i < size; i++) + { + status |= gpio_enable_module_pin(gpiomap->pin, gpiomap->function); + gpiomap++; + } + + return status; +} + + +int gpio_enable_module_pin(unsigned int pin, unsigned int function) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + + // Enable the correct function. + switch (function) + { + case 0: // A function. + gpio_port->pmr0c = 1 << (pin & 0x1F); + gpio_port->pmr1c = 1 << (pin & 0x1F); +#if defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED) + gpio_port->pmr2c = 1 << (pin & 0x1F); +#endif + break; + + case 1: // B function. + gpio_port->pmr0s = 1 << (pin & 0x1F); + gpio_port->pmr1c = 1 << (pin & 0x1F); +#if defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED) + gpio_port->pmr2c = 1 << (pin & 0x1F); +#endif + break; + + case 2: // C function. + gpio_port->pmr0c = 1 << (pin & 0x1F); + gpio_port->pmr1s = 1 << (pin & 0x1F); +#if defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED) + gpio_port->pmr2c = 1 << (pin & 0x1F); +#endif + break; + + case 3: // D function. + gpio_port->pmr0s = 1 << (pin & 0x1F); + gpio_port->pmr1s = 1 << (pin & 0x1F); +#if defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED) + gpio_port->pmr2c = 1 << (pin & 0x1F); +#endif + break; + +#if defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED) + case 4: // E function. + gpio_port->pmr0c = 1 << (pin & 0x1F); + gpio_port->pmr1c = 1 << (pin & 0x1F); + gpio_port->pmr2s = 1 << (pin & 0x1F); + break; + + case 5: // F function. + gpio_port->pmr0s = 1 << (pin & 0x1F); + gpio_port->pmr1c = 1 << (pin & 0x1F); + gpio_port->pmr2s = 1 << (pin & 0x1F); + break; + + case 6: // G function. + gpio_port->pmr0c = 1 << (pin & 0x1F); + gpio_port->pmr1s = 1 << (pin & 0x1F); + gpio_port->pmr2s = 1 << (pin & 0x1F); + break; + + case 7: // H function. + gpio_port->pmr0s = 1 << (pin & 0x1F); + gpio_port->pmr1s = 1 << (pin & 0x1F); + gpio_port->pmr2s = 1 << (pin & 0x1F); + break; +#endif + + default: + return GPIO_INVALID_ARGUMENT; + } + + // Disable GPIO control. + gpio_port->gperc = 1 << (pin & 0x1F); + + return GPIO_SUCCESS; +} + + +void gpio_enable_gpio(const gpio_map_t gpiomap, unsigned int size) +{ + unsigned int i; + + for (i = 0; i < size; i++) + { + gpio_enable_gpio_pin(gpiomap->pin); + gpiomap++; + } +} + + +void gpio_enable_gpio_pin(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + gpio_port->oderc = 1 << (pin & 0x1F); + gpio_port->gpers = 1 << (pin & 0x1F); +} + + +// The open-drain mode is not synthesized on the current AVR32 products. +// If one day some AVR32 products have this feature, the corresponding part +// numbers should be listed in the #if below. +// Note that other functions are available in this driver to use pins with open +// drain in GPIO mode. The advantage of the open-drain mode functions over these +// other functions is that they can be used not only in GPIO mode but also in +// module mode. +#if 0 + + +void gpio_enable_pin_open_drain(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + gpio_port->odmers = 1 << (pin & 0x1F); +} + + +void gpio_disable_pin_open_drain(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + gpio_port->odmerc = 1 << (pin & 0x1F); +} + + +#endif + + +void gpio_enable_pin_pull_up(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + gpio_port->puers = 1 << (pin & 0x1F); +#if defined(AVR32_GPIO_200_H_INCLUDED) || defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED) + gpio_port->pderc = 1 << (pin & 0x1F); +#endif +} + + +void gpio_disable_pin_pull_up(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + gpio_port->puerc = 1 << (pin & 0x1F); +} + +#if defined(AVR32_GPIO_200_H_INCLUDED) || defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED) +// Added support of Pull-up Resistor, Pull-down Resistor and Buskeeper Control. + +/*! \brief Enables the pull-down resistor of a pin. + * + * \param pin The pin number. + */ +void gpio_enable_pin_pull_down(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + gpio_port->puerc = 1 << (pin & 0x1F); + gpio_port->pders = 1 << (pin & 0x1F); +} + +/*! \brief Disables the pull-down resistor of a pin. + * + * \param pin The pin number. + */ +void gpio_disable_pin_pull_down(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + gpio_port->pderc = 1 << (pin & 0x1F); +} + +/*! \brief Enables the buskeeper functionality on a pin. + * + * \param pin The pin number. + */ +void gpio_enable_pin_buskeeper(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + gpio_port->puers = 1 << (pin & 0x1F); + gpio_port->pders = 1 << (pin & 0x1F); +} + +/*! \brief Disables the buskeeper functionality on a pin. + * + * \param pin The pin number. + */ +void gpio_disable_pin_buskeeper(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + gpio_port->puerc = 1 << (pin & 0x1F); + gpio_port->pderc = 1 << (pin & 0x1F); +} + +#endif + +int gpio_get_pin_value(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + return (gpio_port->pvr >> (pin & 0x1F)) & 1; +} + + +int gpio_get_gpio_pin_output_value(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + return (gpio_port->ovr >> (pin & 0x1F)) & 1; +} + + +int gpio_get_gpio_open_drain_pin_output_value(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + return ((gpio_port->oder >> (pin & 0x1F)) & 1) ^ 1; +} + + +void gpio_set_gpio_pin(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + + gpio_port->ovrs = 1 << (pin & 0x1F); // Value to be driven on the I/O line: 1. + gpio_port->oders = 1 << (pin & 0x1F); // The GPIO output driver is enabled for that pin. + gpio_port->gpers = 1 << (pin & 0x1F); // The GPIO module controls that pin. +} + + +void gpio_clr_gpio_pin(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + + gpio_port->ovrc = 1 << (pin & 0x1F); // Value to be driven on the I/O line: 0. + gpio_port->oders = 1 << (pin & 0x1F); // The GPIO output driver is enabled for that pin. + gpio_port->gpers = 1 << (pin & 0x1F); // The GPIO module controls that pin. +} + + +void gpio_tgl_gpio_pin(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + + gpio_port->ovrt = 1 << (pin & 0x1F); // Toggle the I/O line. + gpio_port->oders = 1 << (pin & 0x1F); // The GPIO output driver is enabled for that pin. + gpio_port->gpers = 1 << (pin & 0x1F); // The GPIO module controls that pin. +} + + +void gpio_set_gpio_open_drain_pin(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + + gpio_port->oderc = 1 << (pin & 0x1F); // The GPIO output driver is disabled for that pin. + gpio_port->gpers = 1 << (pin & 0x1F); // The GPIO module controls that pin. +} + + +void gpio_clr_gpio_open_drain_pin(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + + gpio_port->ovrc = 1 << (pin & 0x1F); // Value to be driven on the I/O line: 0. + gpio_port->oders = 1 << (pin & 0x1F); // The GPIO output driver is enabled for that pin. + gpio_port->gpers = 1 << (pin & 0x1F); // The GPIO module controls that pin. +} + + +void gpio_tgl_gpio_open_drain_pin(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + + gpio_port->ovrc = 1 << (pin & 0x1F); // Value to be driven on the I/O line if the GPIO output driver is enabled: 0. + gpio_port->odert = 1 << (pin & 0x1F); // The GPIO output driver is toggled for that pin. + gpio_port->gpers = 1 << (pin & 0x1F); // The GPIO module controls that pin. +} + + +void gpio_enable_pin_glitch_filter(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + gpio_port->gfers = 1 << (pin & 0x1F); +} + + +void gpio_disable_pin_glitch_filter(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + gpio_port->gferc = 1 << (pin & 0x1F); +} + +/*! \brief Configure the edge detector of an input pin + * + * \param pin The pin number. + * \param mode The edge detection mode (\ref GPIO_PIN_CHANGE, \ref GPIO_RISING_EDGE + * or \ref GPIO_FALLING_EDGE). + * + * \return \ref GPIO_SUCCESS or \ref GPIO_INVALID_ARGUMENT. + */ +static int gpio_configure_edge_detector(unsigned int pin, unsigned int mode) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + + // Configure the edge detector. + switch (mode) + { + case GPIO_PIN_CHANGE: + gpio_port->imr0c = 1 << (pin & 0x1F); + gpio_port->imr1c = 1 << (pin & 0x1F); + break; + + case GPIO_RISING_EDGE: + gpio_port->imr0s = 1 << (pin & 0x1F); + gpio_port->imr1c = 1 << (pin & 0x1F); + break; + + case GPIO_FALLING_EDGE: + gpio_port->imr0c = 1 << (pin & 0x1F); + gpio_port->imr1s = 1 << (pin & 0x1F); + break; + + default: + return GPIO_INVALID_ARGUMENT; + } + + return GPIO_SUCCESS; +} + + +int gpio_enable_pin_interrupt(unsigned int pin, unsigned int mode) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + + // Enable the glitch filter. + gpio_port->gfers = 1 << (pin & 0x1F); + + // Configure the edge detector. + if(GPIO_INVALID_ARGUMENT == gpio_configure_edge_detector(pin, mode)) + return(GPIO_INVALID_ARGUMENT); + + // Enable interrupt. + gpio_port->iers = 1 << (pin & 0x1F); + + return GPIO_SUCCESS; +} + + +void gpio_disable_pin_interrupt(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + gpio_port->ierc = 1 << (pin & 0x1F); +} + + +int gpio_get_pin_interrupt_flag(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + return (gpio_port->ifr >> (pin & 0x1F)) & 1; +} + + +void gpio_clear_pin_interrupt_flag(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + gpio_port->ifrc = 1 << (pin & 0x1F); +} + + +//# +//# Peripheral Event System Support. +//# +#if UC3L +int gpio_configure_pin_periph_event_mode(unsigned int pin, unsigned int mode, unsigned int use_igf) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + + if(TRUE == use_igf) + { + // Enable the glitch filter. + gpio_port->gfers = 1 << (pin & 0x1F); + } + else + { + // Disable the glitch filter. + gpio_port->gferc = 1 << (pin & 0x1F); + } + + // Configure the edge detector. + return(gpio_configure_edge_detector(pin, mode)); +} + +#endif + +//! @} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO/gpio.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO/gpio.h new file mode 100644 index 0000000..f0b5fd8 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO/gpio.h @@ -0,0 +1,583 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file has been prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief GPIO header for AVR32 UC3. + * + * This file contains basic GPIO driver functions. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with a GPIO module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + *****************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _GPIO_H_ +#define _GPIO_H_ + +#include +#include "compiler.h" + +/*! \name Return Values of the GPIO API + */ +//! @{ +#define GPIO_SUCCESS 0 //!< Function successfully completed. +#define GPIO_INVALID_ARGUMENT 1 //!< Input parameters are out of range. +//! @} + + +/*! \name Interrupt Trigger Modes + */ +//! @{ +#define GPIO_PIN_CHANGE 0 //!< Interrupt triggered upon pin change. +#define GPIO_RISING_EDGE 1 //!< Interrupt triggered upon rising edge. +#define GPIO_FALLING_EDGE 2 //!< Interrupt triggered upon falling edge. +//! @} + + +//! A type definition of pins and modules connectivity. +typedef struct +{ + unsigned char pin; //!< Module pin. + unsigned char function; //!< Module function. +} gpio_map_t[]; + + +/*! \name Peripheral Bus Interface + * + * Low-speed interface with a non-deterministic number of clock cycles per + * access. + * + * This interface operates with lower clock frequencies (fPB <= fCPU), and its + * timing is not deterministic since it needs to access a shared bus which may + * be heavily loaded. + * + * \note This interface is immediately available without initialization. + */ +//! @{ + +/*! \brief Enables specific module modes for a set of pins. + * + * \param gpiomap The pin map. + * \param size The number of pins in \a gpiomap. + * + * \return \ref GPIO_SUCCESS or \ref GPIO_INVALID_ARGUMENT. + */ +extern int gpio_enable_module(const gpio_map_t gpiomap, unsigned int size); + +/*! \brief Enables a specific module mode for a pin. + * + * \param pin The pin number.\n + * Refer to the product header file `uc3x.h' (where x is the part + * number; e.g. x = a0512) for module pins. E.g., to enable a PWM + * channel output, the pin number can be AVR32_PWM_3_PIN for PWM + * channel 3. + * \param function The pin function.\n + * Refer to the product header file `uc3x.h' (where x is the + * part number; e.g. x = a0512) for module pin functions. E.g., + * to enable a PWM channel output, the pin function can be + * AVR32_PWM_3_FUNCTION for PWM channel 3. + * + * \return \ref GPIO_SUCCESS or \ref GPIO_INVALID_ARGUMENT. + */ +extern int gpio_enable_module_pin(unsigned int pin, unsigned int function); + +/*! \brief Enables the GPIO mode of a set of pins. + * + * \param gpiomap The pin map. + * \param size The number of pins in \a gpiomap. + */ +extern void gpio_enable_gpio(const gpio_map_t gpiomap, unsigned int size); + +/*! \brief Enables the GPIO mode of a pin. + * + * \param pin The pin number.\n + * Refer to the product header file `uc3x.h' (where x is the part + * number; e.g. x = a0512) for pin definitions. E.g., to enable the + * GPIO mode of PX21, AVR32_PIN_PX21 can be used. Module pins such as + * AVR32_PWM_3_PIN for PWM channel 3 can also be used to release + * module pins for GPIO. + */ +extern void gpio_enable_gpio_pin(unsigned int pin); + +// The open-drain mode is not synthesized on the current AVR32 products. +// If one day some AVR32 products have this feature, the corresponding part +// numbers should be listed in the #if below. +// Note that other functions are available in this driver to use pins with open +// drain in GPIO mode. The advantage of the open-drain mode functions over these +// other functions is that they can be used not only in GPIO mode but also in +// module mode. +#if 0 + +/*! \brief Enables the open-drain mode of a pin. + * + * \param pin The pin number. + */ +extern void gpio_enable_pin_open_drain(unsigned int pin); + +/*! \brief Disables the open-drain mode of a pin. + * + * \param pin The pin number. + */ +extern void gpio_disable_pin_open_drain(unsigned int pin); + +#endif + +/*! \brief Enables the pull-up resistor of a pin. + * + * \param pin The pin number. + */ +extern void gpio_enable_pin_pull_up(unsigned int pin); + +/*! \brief Disables the pull-up resistor of a pin. + * + * \param pin The pin number. + */ +extern void gpio_disable_pin_pull_up(unsigned int pin); + +#if defined(AVR32_GPIO_200_H_INCLUDED) || defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED) +// Added support of Pull-up Resistor, Pull-down Resistor and Buskeeper Control. + +/*! \brief Enables the pull-down resistor of a pin. + * + * \param pin The pin number. + */ +extern void gpio_enable_pin_pull_down(unsigned int pin); + +/*! \brief Disables the pull-down resistor of a pin. + * + * \param pin The pin number. + */ +extern void gpio_disable_pin_pull_down(unsigned int pin); + +/*! \brief Enables the buskeeper functionality on a pin. + * + * \param pin The pin number. + */ +extern void gpio_enable_pin_buskeeper(unsigned int pin); + +/*! \brief Disables the buskeeper functionality on a pin. + * + * \param pin The pin number. + */ +extern void gpio_disable_pin_buskeeper(unsigned int pin); + +#endif + +/*! \brief Returns the value of a pin. + * + * \param pin The pin number. + * + * \return The pin value. + */ +extern int gpio_get_pin_value(unsigned int pin); + +/*! \brief Returns the output value set for a GPIO pin. + * + * \param pin The pin number. + * + * \return The pin output value. + * + * \note This function must be used in conjunction with \ref gpio_set_gpio_pin, + * \ref gpio_clr_gpio_pin and \ref gpio_tgl_gpio_pin. + */ +extern int gpio_get_gpio_pin_output_value(unsigned int pin); + +/*! \brief Returns the output value set for a GPIO pin using open drain. + * + * \param pin The pin number. + * + * \return The pin output value. + * + * \note This function must be used in conjunction with + * \ref gpio_set_gpio_open_drain_pin, \ref gpio_clr_gpio_open_drain_pin + * and \ref gpio_tgl_gpio_open_drain_pin. + */ +extern int gpio_get_gpio_open_drain_pin_output_value(unsigned int pin); + +/*! \brief Drives a GPIO pin to 1. + * + * \param pin The pin number. + */ +extern void gpio_set_gpio_pin(unsigned int pin); + +/*! \brief Drives a GPIO pin to 0. + * + * \param pin The pin number. + */ +extern void gpio_clr_gpio_pin(unsigned int pin); + +/*! \brief Toggles a GPIO pin. + * + * \param pin The pin number. + */ +extern void gpio_tgl_gpio_pin(unsigned int pin); + +/*! \brief Drives a GPIO pin to 1 using open drain. + * + * \param pin The pin number. + */ +extern void gpio_set_gpio_open_drain_pin(unsigned int pin); + +/*! \brief Drives a GPIO pin to 0 using open drain. + * + * \param pin The pin number. + */ +extern void gpio_clr_gpio_open_drain_pin(unsigned int pin); + +/*! \brief Toggles a GPIO pin using open drain. + * + * \param pin The pin number. + */ +extern void gpio_tgl_gpio_open_drain_pin(unsigned int pin); + +/*! \brief Enables the glitch filter of a pin. + * + * When the glitch filter is enabled, a glitch with duration of less than 1 + * clock cycle is automatically rejected, while a pulse with duration of 2 clock + * cycles or more is accepted. For pulse durations between 1 clock cycle and 2 + * clock cycles, the pulse may or may not be taken into account, depending on + * the precise timing of its occurrence. Thus for a pulse to be guaranteed + * visible it must exceed 2 clock cycles, whereas for a glitch to be reliably + * filtered out, its duration must not exceed 1 clock cycle. The filter + * introduces 2 clock cycles latency. + * + * \param pin The pin number. + */ +extern void gpio_enable_pin_glitch_filter(unsigned int pin); + +/*! \brief Disables the glitch filter of a pin. + * + * \param pin The pin number. + */ +extern void gpio_disable_pin_glitch_filter(unsigned int pin); + +/*! \brief Enables the interrupt of a pin with the specified settings. + * + * \param pin The pin number. + * \param mode The trigger mode (\ref GPIO_PIN_CHANGE, \ref GPIO_RISING_EDGE or + * \ref GPIO_FALLING_EDGE). + * + * \return \ref GPIO_SUCCESS or \ref GPIO_INVALID_ARGUMENT. + */ +extern int gpio_enable_pin_interrupt(unsigned int pin, unsigned int mode); + +/*! \brief Disables the interrupt of a pin. + * + * \param pin The pin number. + */ +extern void gpio_disable_pin_interrupt(unsigned int pin); + +/*! \brief Gets the interrupt flag of a pin. + * + * \param pin The pin number. + * + * \return The pin interrupt flag. + */ +extern int gpio_get_pin_interrupt_flag(unsigned int pin); + +/*! \brief Clears the interrupt flag of a pin. + * + * \param pin The pin number. + */ +extern void gpio_clear_pin_interrupt_flag(unsigned int pin); + +//! @} + + +#if (defined AVR32_GPIO_LOCAL_ADDRESS) +/*! \name Local Bus Interface + * + * High-speed interface with only one clock cycle per access. + * + * This interface operates with high clock frequency (fCPU), and its timing is + * deterministic since it does not need to access a shared bus which may be + * heavily loaded. + * + * \warning To use this interface, the clock frequency of the peripheral bus on + * which the GPIO peripheral is connected must be set to the CPU clock + * frequency (fPB = fCPU). + * + * \note This interface has to be initialized in order to be available. + */ +//! @{ + +/*! \brief Enables the local bus interface for GPIO. + * + * \note This function must have been called at least once before using other + * functions in this interface. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void gpio_local_init(void) +{ + Set_system_register(AVR32_CPUCR, + Get_system_register(AVR32_CPUCR) | AVR32_CPUCR_LOCEN_MASK); +} + +/*! \brief Enables the output driver of a pin. + * + * \param pin The pin number. + * + * \note \ref gpio_local_init must have been called beforehand. + * + * \note This function does not enable the GPIO mode of the pin. + * \ref gpio_enable_gpio_pin can be called for this purpose. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void gpio_local_enable_pin_output_driver(unsigned int pin) +{ + AVR32_GPIO_LOCAL.port[pin >> 5].oders = 1 << (pin & 0x1F); +} + +/*! \brief Disables the output driver of a pin. + * + * \param pin The pin number. + * + * \note \ref gpio_local_init must have been called beforehand. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void gpio_local_disable_pin_output_driver(unsigned int pin) +{ + AVR32_GPIO_LOCAL.port[pin >> 5].oderc = 1 << (pin & 0x1F); +} + +/*! \brief Returns the value of a pin. + * + * \param pin The pin number. + * + * \return The pin value. + * + * \note \ref gpio_local_init must have been called beforehand. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ int gpio_local_get_pin_value(unsigned int pin) +{ + return (AVR32_GPIO_LOCAL.port[pin >> 5].pvr >> (pin & 0x1F)) & 1; +} + +/*! \brief Drives a GPIO pin to 1. + * + * \param pin The pin number. + * + * \note \ref gpio_local_init must have been called beforehand. + * + * \note This function does not enable the GPIO mode of the pin nor its output + * driver. \ref gpio_enable_gpio_pin and + * \ref gpio_local_enable_pin_output_driver can be called for this + * purpose. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void gpio_local_set_gpio_pin(unsigned int pin) +{ + AVR32_GPIO_LOCAL.port[pin >> 5].ovrs = 1 << (pin & 0x1F); +} + +/*! \brief Drives a GPIO pin to 0. + * + * \param pin The pin number. + * + * \note \ref gpio_local_init must have been called beforehand. + * + * \note This function does not enable the GPIO mode of the pin nor its output + * driver. \ref gpio_enable_gpio_pin and + * \ref gpio_local_enable_pin_output_driver can be called for this + * purpose. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void gpio_local_clr_gpio_pin(unsigned int pin) +{ + AVR32_GPIO_LOCAL.port[pin >> 5].ovrc = 1 << (pin & 0x1F); +} + +/*! \brief Toggles a GPIO pin. + * + * \param pin The pin number. + * + * \note \ref gpio_local_init must have been called beforehand. + * + * \note This function does not enable the GPIO mode of the pin nor its output + * driver. \ref gpio_enable_gpio_pin and + * \ref gpio_local_enable_pin_output_driver can be called for this + * purpose. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void gpio_local_tgl_gpio_pin(unsigned int pin) +{ + AVR32_GPIO_LOCAL.port[pin >> 5].ovrt = 1 << (pin & 0x1F); +} + +/*! \brief Initializes the configuration of a GPIO pin so that it can be used + * with GPIO open-drain functions. + * + * \note This function must have been called at least once before using + * \ref gpio_local_set_gpio_open_drain_pin, + * \ref gpio_local_clr_gpio_open_drain_pin or + * \ref gpio_local_tgl_gpio_open_drain_pin. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void gpio_local_init_gpio_open_drain_pin(unsigned int pin) +{ + AVR32_GPIO_LOCAL.port[pin >> 5].ovrc = 1 << (pin & 0x1F); +} + +/*! \brief Drives a GPIO pin to 1 using open drain. + * + * \param pin The pin number. + * + * \note \ref gpio_local_init and \ref gpio_local_init_gpio_open_drain_pin must + * have been called beforehand. + * + * \note This function does not enable the GPIO mode of the pin. + * \ref gpio_enable_gpio_pin can be called for this purpose. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void gpio_local_set_gpio_open_drain_pin(unsigned int pin) +{ + AVR32_GPIO_LOCAL.port[pin >> 5].oderc = 1 << (pin & 0x1F); +} + +/*! \brief Drives a GPIO pin to 0 using open drain. + * + * \param pin The pin number. + * + * \note \ref gpio_local_init and \ref gpio_local_init_gpio_open_drain_pin must + * have been called beforehand. + * + * \note This function does not enable the GPIO mode of the pin. + * \ref gpio_enable_gpio_pin can be called for this purpose. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void gpio_local_clr_gpio_open_drain_pin(unsigned int pin) +{ + AVR32_GPIO_LOCAL.port[pin >> 5].oders = 1 << (pin & 0x1F); +} + +/*! \brief Toggles a GPIO pin using open drain. + * + * \param pin The pin number. + * + * \note \ref gpio_local_init and \ref gpio_local_init_gpio_open_drain_pin must + * have been called beforehand. + * + * \note This function does not enable the GPIO mode of the pin. + * \ref gpio_enable_gpio_pin can be called for this purpose. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void gpio_local_tgl_gpio_open_drain_pin(unsigned int pin) +{ + AVR32_GPIO_LOCAL.port[pin >> 5].odert = 1 << (pin & 0x1F); +} + +//! @} +#endif // AVR32_GPIO_LOCAL_ADDRESS + +#if UC3L +//! @{ +/*! \name Peripheral Event System support + * + * The GPIO can be programmed to output peripheral events whenever an interrupt + * condition is detected, such as pin value change, or only when a rising or + * falling edge is detected. + * + */ + +/*! \brief Enables the peripheral event generation of a pin. + * + * \param pin The pin number. + * + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void gpio_enable_pin_periph_event(unsigned int pin) +{ + AVR32_GPIO.port[pin >> 5].oderc = 1 << (pin & 0x1F); // The GPIO output driver is disabled for that pin. + AVR32_GPIO.port[pin >> 5].evers = 1 << (pin & 0x1F); +} + +/*! \brief Disables the peripheral event generation of a pin. + * + * \param pin The pin number. + * + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void gpio_disable_pin_periph_event(unsigned int pin) +{ + AVR32_GPIO.port[pin >> 5].everc = 1 << (pin & 0x1F); +} + +/*! \brief Configure the peripheral event trigger mode of a pin + * + * \param pin The pin number. + * \param mode The trigger mode (\ref GPIO_PIN_CHANGE, \ref GPIO_RISING_EDGE or + * \ref GPIO_FALLING_EDGE). + * \param use_igf use the Input Glitch Filter (TRUE) or not (FALSE). + * + * \return \ref GPIO_SUCCESS or \ref GPIO_INVALID_ARGUMENT. + */ +extern int gpio_configure_pin_periph_event_mode(unsigned int pin, unsigned int mode, unsigned int use_igf); + +//! @} +#endif + + +#endif // _GPIO_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/exception.x b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/exception.x new file mode 100644 index 0000000..ec4109d --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/exception.x @@ -0,0 +1,239 @@ +/* This file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Exception and interrupt vectors. + * + * This file maps all events supported by an AVR32. + * + * - Compiler: GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with an INTC module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#if !__AVR32_UC__ && !__AVR32_AP__ + #error Implementation of the AVR32 architecture not supported by the INTC driver. +#endif + + +#include + + +//! @{ +//! \verbatim + + + .section .exception, "ax", @progbits + + +// Start of Exception Vector Table. + + // EVBA must be aligned with a power of two strictly greater than the EVBA- + // relative offset of the last vector. + .balign 0x200 + + // Export symbol. + .global _evba + .type _evba, @function +_evba: + + .org 0x000 + // Unrecoverable Exception. +_handle_Unrecoverable_Exception: + rjmp $ + + .org 0x004 + // TLB Multiple Hit. +_handle_TLB_Multiple_Hit: + rjmp $ + + .org 0x008 + // Bus Error Data Fetch. +_handle_Bus_Error_Data_Fetch: + rjmp $ + + .org 0x00C + // Bus Error Instruction Fetch. +_handle_Bus_Error_Instruction_Fetch: + rjmp $ + + .org 0x010 + // NMI. +_handle_NMI: + rjmp $ + + .org 0x014 + // Instruction Address. +_handle_Instruction_Address: + rjmp $ + + .org 0x018 + // ITLB Protection. +_handle_ITLB_Protection: + rjmp $ + + .org 0x01C + // Breakpoint. +_handle_Breakpoint: + rjmp $ + + .org 0x020 + // Illegal Opcode. +_handle_Illegal_Opcode: + rjmp $ + + .org 0x024 + // Unimplemented Instruction. +_handle_Unimplemented_Instruction: + rjmp $ + + .org 0x028 + // Privilege Violation. +_handle_Privilege_Violation: + rjmp $ + + .org 0x02C + // Floating-Point: UNUSED IN AVR32UC and AVR32AP. +_handle_Floating_Point: + rjmp $ + + .org 0x030 + // Coprocessor Absent: UNUSED IN AVR32UC. +_handle_Coprocessor_Absent: + rjmp $ + + .org 0x034 + // Data Address (Read). +_handle_Data_Address_Read: + rjmp $ + + .org 0x038 + // Data Address (Write). +_handle_Data_Address_Write: + rjmp $ + + .org 0x03C + // DTLB Protection (Read). +_handle_DTLB_Protection_Read: + rjmp $ + + .org 0x040 + // DTLB Protection (Write). +_handle_DTLB_Protection_Write: + rjmp $ + + .org 0x044 + // DTLB Modified: UNUSED IN AVR32UC. +_handle_DTLB_Modified: + rjmp $ + + .org 0x050 + // ITLB Miss. +_handle_ITLB_Miss: + rjmp $ + + .org 0x060 + // DTLB Miss (Read). +_handle_DTLB_Miss_Read: + rjmp $ + + .org 0x070 + // DTLB Miss (Write). +_handle_DTLB_Miss_Write: + rjmp $ + + .org 0x100 + // Supervisor Call. +_handle_Supervisor_Call: + rjmp $ + + +// Interrupt support. +// The interrupt controller must provide the offset address relative to EVBA. +// Important note: +// All interrupts call a C function named _get_interrupt_handler. +// This function will read group and interrupt line number to then return in +// R12 a pointer to a user-provided interrupt handler. + + .balign 4 + + .irp priority, 0, 1, 2, 3 +_int\priority: +#if __AVR32_UC__ + // R8-R12, LR, PC and SR are automatically pushed onto the system stack by the + // CPU upon interrupt entry. No other register is saved by hardware. +#elif __AVR32_AP__ + // PC and SR are automatically saved in respectively RAR_INTx and RSR_INTx by + // the CPU upon interrupt entry. No other register is saved by hardware. + pushm r8-r12, lr +#endif + mov r12, \priority // Pass the int_level parameter to the _get_interrupt_handler function. + call _get_interrupt_handler + cp.w r12, 0 // Get the pointer to the interrupt handler returned by the function. +#if __AVR32_UC__ + movne pc, r12 // If this was not a spurious interrupt (R12 != NULL), jump to the handler. +#elif __AVR32_AP__ + breq spint\priority // If this was a spurious interrupt (R12 == NULL), branch. + st.w --sp, r12 // Push the pointer to the interrupt handler onto the system stack since no register may be altered. + popm r8-r12, lr, pc // Restore registers and jump to the handler. +spint\priority: + popm r8-r12, lr +#endif + rete // If this was a spurious interrupt (R12 == NULL), return from event handler. + .endr + + +// Constant data area. + + .balign 4 + + // Values to store in the interrupt priority registers for the various interrupt priority levels. + // The interrupt priority registers contain the interrupt priority level and + // the EVBA-relative interrupt vector offset. + .global ipr_val + .type ipr_val, @object +ipr_val: + .word (AVR32_INTC_INT0 << AVR32_INTC_IPR_INTLEVEL_OFFSET) | (_int0 - _evba),\ + (AVR32_INTC_INT1 << AVR32_INTC_IPR_INTLEVEL_OFFSET) | (_int1 - _evba),\ + (AVR32_INTC_INT2 << AVR32_INTC_IPR_INTLEVEL_OFFSET) | (_int2 - _evba),\ + (AVR32_INTC_INT3 << AVR32_INTC_IPR_INTLEVEL_OFFSET) | (_int3 - _evba) + + +//! \endverbatim +//! @} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/intc.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/intc.c new file mode 100644 index 0000000..84d498d --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/intc.c @@ -0,0 +1,214 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief INTC driver for AVR32 UC3. + * + * AVR32 Interrupt Controller driver module. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with an INTC module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#include +#include "compiler.h" +#include "preprocessor.h" +#include "intc.h" + +// define _evba from exception.S +extern void _evba; + +//! Values to store in the interrupt priority registers for the various interrupt priority levels. +extern const unsigned int ipr_val[AVR32_INTC_NUM_INT_LEVELS]; + +//! Creates a table of interrupt line handlers per interrupt group in order to optimize RAM space. +//! Each line handler table contains a set of pointers to interrupt handlers. +#if (defined __GNUC__) +#define DECL_INT_LINE_HANDLER_TABLE(GRP, unused) \ +static volatile __int_handler _int_line_handler_table_##GRP[Max(AVR32_INTC_NUM_IRQS_PER_GRP##GRP, 1)]; +#elif (defined __ICCAVR32__) +#define DECL_INT_LINE_HANDLER_TABLE(GRP, unused) \ +static volatile __no_init __int_handler _int_line_handler_table_##GRP[Max(AVR32_INTC_NUM_IRQS_PER_GRP##GRP, 1)]; +#endif +MREPEAT(AVR32_INTC_NUM_INT_GRPS, DECL_INT_LINE_HANDLER_TABLE, ~); +#undef DECL_INT_LINE_HANDLER_TABLE + +//! Table containing for each interrupt group the number of interrupt request +//! lines and a pointer to the table of interrupt line handlers. +static const struct +{ + unsigned int num_irqs; + volatile __int_handler *_int_line_handler_table; +} _int_handler_table[AVR32_INTC_NUM_INT_GRPS] = +{ +#define INSERT_INT_LINE_HANDLER_TABLE(GRP, unused) \ + {AVR32_INTC_NUM_IRQS_PER_GRP##GRP, _int_line_handler_table_##GRP}, + MREPEAT(AVR32_INTC_NUM_INT_GRPS, INSERT_INT_LINE_HANDLER_TABLE, ~) +#undef INSERT_INT_LINE_HANDLER_TABLE +}; + + +/*! \brief Default interrupt handler. + * + * \note Taken and adapted from Newlib. + */ +#if (defined __GNUC__) +__attribute__((__interrupt__)) +#elif (defined __ICCAVR32__) +__interrupt +#endif +static void _unhandled_interrupt(void) +{ + // Catch unregistered interrupts. + while (TRUE); +} + + +/*! \brief Gets the interrupt handler of the current event at the \a int_level + * interrupt priority level (called from exception.S). + * + * \param int_level Interrupt priority level to handle. + * + * \return Interrupt handler to execute. + * + * \note Taken and adapted from Newlib. + */ +__int_handler _get_interrupt_handler(unsigned int int_level) +{ + // ICR3 is mapped first, ICR0 last. + // Code in exception.S puts int_level in R12 which is used by AVR32-GCC to + // pass a single argument to a function. + unsigned int int_grp = AVR32_INTC.icr[AVR32_INTC_INT3 - int_level]; + unsigned int int_req = AVR32_INTC.irr[int_grp]; + + // As an interrupt may disappear while it is being fetched by the CPU + // (spurious interrupt caused by a delayed response from an MCU peripheral to + // an interrupt flag clear or interrupt disable instruction), check if there + // are remaining interrupt lines to process. + // If a spurious interrupt occurs, the status register (SR) contains an + // execution mode and interrupt level masks corresponding to a level 0 + // interrupt, whatever the interrupt priority level causing the spurious + // event. This behavior has been chosen because a spurious interrupt has not + // to be a priority one and because it may not cause any trouble to other + // interrupts. + // However, these spurious interrupts place the hardware in an unstable state + // and could give problems in other/future versions of the CPU, so the + // software has to be written so that they never occur. The only safe way of + // achieving this is to always clear or disable peripheral interrupts with the + // following sequence: + // 1: Mask the interrupt in the CPU by setting GM (or IxM) in SR. + // 2: Perform the bus access to the peripheral register that clears or + // disables the interrupt. + // 3: Wait until the interrupt has actually been cleared or disabled by the + // peripheral. This is usually performed by reading from a register in the + // same peripheral (it DOES NOT have to be the same register that was + // accessed in step 2, but it MUST be in the same peripheral), what takes + // bus system latencies into account, but peripheral internal latencies + // (generally 0 cycle) also have to be considered. + // 4: Unmask the interrupt in the CPU by clearing GM (or IxM) in SR. + // Note that steps 1 and 4 are useless inside interrupt handlers as the + // corresponding interrupt level is automatically masked by IxM (unless IxM is + // explicitly cleared by the software). + // + // Get the right IRQ handler. + // + // If several interrupt lines are active in the group, the interrupt line with + // the highest number is selected. This is to be coherent with the + // prioritization of interrupt groups performed by the hardware interrupt + // controller. + // + // If no handler has been registered for the pending interrupt, + // _unhandled_interrupt will be selected thanks to the initialization of + // _int_line_handler_table_x by INTC_init_interrupts. + // + // exception.S will provide the interrupt handler with a clean interrupt stack + // frame, with nothing more pushed onto the stack. The interrupt handler must + // manage the `rete' instruction, what can be done thanks to pure assembly, + // inline assembly or the `__attribute__((__interrupt__))' C function + // attribute. + return (int_req) ? _int_handler_table[int_grp]._int_line_handler_table[32 - clz(int_req) - 1] : NULL; +} + +//! Init EVBA address. This sequence might also be done in the UTILS/STARTUP/GCC/crt0.S +static __inline__ void INTC_init_evba(void) +{ + Set_system_register(AVR32_EVBA, (int)&_evba ); +} + +void INTC_init_interrupts(void) +{ + unsigned int int_grp, int_req; + + INTC_init_evba(); + + // For all interrupt groups, + for (int_grp = 0; int_grp < AVR32_INTC_NUM_INT_GRPS; int_grp++) + { + // For all interrupt request lines of each group, + for (int_req = 0; int_req < _int_handler_table[int_grp].num_irqs; int_req++) + { + // Assign _unhandled_interrupt as default interrupt handler. + _int_handler_table[int_grp]._int_line_handler_table[int_req] = &_unhandled_interrupt; + } + + // Set the interrupt group priority register to its default value. + // By default, all interrupt groups are linked to the interrupt priority + // level 0 and to the interrupt vector _int0. + AVR32_INTC.ipr[int_grp] = ipr_val[AVR32_INTC_INT0]; + } +} + + +void INTC_register_interrupt(__int_handler handler, unsigned int irq, unsigned int int_level) +{ + // Determine the group of the IRQ. + unsigned int int_grp = irq / AVR32_INTC_MAX_NUM_IRQS_PER_GRP; + + // Store in _int_line_handler_table_x the pointer to the interrupt handler, so + // that _get_interrupt_handler can retrieve it when the interrupt is vectored. + _int_handler_table[int_grp]._int_line_handler_table[irq % AVR32_INTC_MAX_NUM_IRQS_PER_GRP] = handler; + + // Program the corresponding IPRX register to set the interrupt priority level + // and the interrupt vector offset that will be fetched by the core interrupt + // system. + // NOTE: The _intx functions are intermediate assembly functions between the + // core interrupt system and the user interrupt handler. + AVR32_INTC.ipr[int_grp] = ipr_val[int_level & (AVR32_INTC_IPR_INTLEVEL_MASK >> AVR32_INTC_IPR_INTLEVEL_OFFSET)]; +} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/intc.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/intc.h new file mode 100644 index 0000000..31a4fc1 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/intc.h @@ -0,0 +1,100 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief INTC driver for AVR32 UC3. + * + * AVR32 Interrupt Controller driver module. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with an INTC module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _INTC_H_ +#define _INTC_H_ + +#include "compiler.h" + + +//! Maximal number of interrupt request lines per group. +#define AVR32_INTC_MAX_NUM_IRQS_PER_GRP 32 + +//! Number of interrupt priority levels. +#define AVR32_INTC_NUM_INT_LEVELS (1 << AVR32_INTC_IPR_INTLEVEL_SIZE) + + +#ifdef __AVR32_ABI_COMPILER__ // Automatically defined when compiling for AVR32, not when assembling. + +//! Pointer to interrupt handler. +#if (defined __GNUC__) +typedef void (*__int_handler)(void); +#elif (defined __ICCAVR32__) +typedef void (__interrupt *__int_handler)(void); +#endif + + +/*! \brief Initializes the hardware interrupt controller driver. + * + * \note Taken and adapted from Newlib. + */ +extern void INTC_init_interrupts(void); + +/*! \brief Registers an interrupt handler. + * + * \param handler Interrupt handler to register. + * \param irq IRQ of the interrupt handler to register. + * \param int_level Interrupt priority level to assign to the group of this IRQ. + * + * \warning The interrupt handler must manage the `rete' instruction, what can + * be done thanks to pure assembly, inline assembly or the + * `__attribute__((__interrupt__))' C function attribute. + * + * \warning If several interrupt handlers of a same group are registered with + * different priority levels, only the latest priority level set will + * be effective. + * + * \note Taken and adapted from Newlib. + */ +extern void INTC_register_interrupt(__int_handler handler, unsigned int irq, unsigned int int_level); + +#endif // __AVR32_ABI_COMPILER__ + + +#endif // _INTC_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA/pdca.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA/pdca.c new file mode 100644 index 0000000..6c00f9e --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA/pdca.c @@ -0,0 +1,296 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief PDCA driver for AVR32 UC3. + * + * This file defines a useful set of functions for the PDCA interface on AVR32 + * devices. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with a PDCA module. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#include "compiler.h" +#include "pdca.h" + + +volatile avr32_pdca_channel_t *pdca_get_handler(unsigned int pdca_ch_number) +{ + // get the correct channel pointer + volatile avr32_pdca_channel_t *pdca_channel = &AVR32_PDCA.channel[pdca_ch_number]; + + if (pdca_ch_number >= AVR32_PDCA_CHANNEL_LENGTH) + return (volatile avr32_pdca_channel_t *)PDCA_INVALID_ARGUMENT; + + return pdca_channel; +} + + +int pdca_init_channel(unsigned int pdca_ch_number, const pdca_channel_options_t *opt) +{ + // get the correct channel pointer + volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); + + pdca_disable_interrupt_transfer_complete(pdca_ch_number); // disable channel interrupt + pdca_disable_interrupt_reload_counter_zero(pdca_ch_number); // disable channel interrupt + + Bool global_interrupt_enabled = Is_global_interrupt_enabled(); + + if (global_interrupt_enabled) Disable_global_interrupt(); + pdca_channel->mar = (unsigned long)opt->addr; + pdca_channel->tcr = opt->size; + pdca_channel->psr = opt->pid; + pdca_channel->marr = (unsigned long)opt->r_addr; + pdca_channel->tcrr = opt->r_size; + pdca_channel->mr = +#if (defined AVR32_PDCA_120_H_INCLUDED ) || (defined AVR32_PDCA_121_H_INCLUDED ) || (defined AVR32_PDCA_122_H_INCLUDED ) +opt->etrig << AVR32_PDCA_ETRIG_OFFSET | +#endif // #ifdef AVR32_PDCA_120_H_INCLUDED + opt->transfer_size << AVR32_PDCA_SIZE_OFFSET; + pdca_channel->cr = AVR32_PDCA_ECLR_MASK; + pdca_channel->isr; + if (global_interrupt_enabled) Enable_global_interrupt(); + + return PDCA_SUCCESS; +} + + +unsigned int pdca_get_channel_status(unsigned int pdca_ch_number) +{ + // get the correct channel pointer + volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); + + return (pdca_channel->sr & AVR32_PDCA_TEN_MASK) != 0; +} + + +void pdca_disable(unsigned int pdca_ch_number) +{ + // get the correct channel pointer + volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); + + // Disable transfer + pdca_channel->cr = AVR32_PDCA_TDIS_MASK; + +} + + +void pdca_enable(unsigned int pdca_ch_number) +{ + // get the correct channel pointer + volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); + + // Enable transfer + pdca_channel->cr = AVR32_PDCA_TEN_MASK; +} + + +unsigned int pdca_get_load_size(unsigned int pdca_ch_number) +{ + // get the correct channel pointer + volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); + + return pdca_channel->tcr; +} + + +void pdca_load_channel(unsigned int pdca_ch_number, volatile void *addr, unsigned int size) +{ + // get the correct channel pointer + volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); + + Bool global_interrupt_enabled = Is_global_interrupt_enabled(); + + if (global_interrupt_enabled) Disable_global_interrupt(); + pdca_channel->mar = (unsigned long)addr; + pdca_channel->tcr = size; + pdca_channel->cr = AVR32_PDCA_ECLR_MASK; + pdca_channel->isr; + if (global_interrupt_enabled) Enable_global_interrupt(); +} + + +unsigned int pdca_get_reload_size(unsigned int pdca_ch_number) +{ + // get the correct channel pointer + volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); + + return pdca_channel->tcrr; +} + + +void pdca_reload_channel(unsigned int pdca_ch_number, volatile void *addr, unsigned int size) +{ + // get the correct channel pointer + volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); + + Bool global_interrupt_enabled = Is_global_interrupt_enabled(); + + if (global_interrupt_enabled) Disable_global_interrupt(); + // set up next memory address + pdca_channel->marr = (unsigned long)addr; + // set up next memory size + pdca_channel->tcrr = size; + pdca_channel->cr = AVR32_PDCA_ECLR_MASK; + pdca_channel->isr; + if (global_interrupt_enabled) Enable_global_interrupt(); +} + + +void pdca_set_peripheral_select(unsigned int pdca_ch_number, unsigned int pid) +{ + // get the correct channel pointer + volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); + + pdca_channel->psr = pid; +} + + +void pdca_set_transfer_size(unsigned int pdca_ch_number, unsigned int transfer_size) +{ + // get the correct channel pointer + volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); + + pdca_channel->mr = (pdca_channel->mr & ~AVR32_PDCA_SIZE_MASK) | + transfer_size << AVR32_PDCA_SIZE_OFFSET; +} + + +#if (defined AVR32_PDCA_120_H_INCLUDED ) || (defined AVR32_PDCA_121_H_INCLUDED ) || (defined AVR32_PDCA_122_H_INCLUDED ) + + +void pdca_disable_event_trigger(unsigned int pdca_ch_number) +{ + // get the correct channel pointer + volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); + + pdca_channel->mr &= ~AVR32_PDCA_ETRIG_MASK; +} + + +void pdca_enable_event_trigger(unsigned int pdca_ch_number) +{ + // get the correct channel pointer + volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); + + pdca_channel->mr |= AVR32_PDCA_ETRIG_MASK; +} + + +#endif // #ifdef AVR32_PDCA_120_H_INCLUDED + + +void pdca_disable_interrupt_transfer_error(unsigned int pdca_ch_number) +{ + // get the correct channel pointer + volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); + + Bool global_interrupt_enabled = Is_global_interrupt_enabled(); + + if (global_interrupt_enabled) Disable_global_interrupt(); + pdca_channel->idr = AVR32_PDCA_TERR_MASK; + pdca_channel->isr; + if (global_interrupt_enabled) Enable_global_interrupt(); +} + + +void pdca_enable_interrupt_transfer_error(unsigned int pdca_ch_number) +{ + // get the correct channel pointer + volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); + + pdca_channel->ier = AVR32_PDCA_TERR_MASK; +} + + +void pdca_disable_interrupt_transfer_complete(unsigned int pdca_ch_number) +{ + // get the correct channel pointer + volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); + + Bool global_interrupt_enabled = Is_global_interrupt_enabled(); + + if (global_interrupt_enabled) Disable_global_interrupt(); + pdca_channel->idr = AVR32_PDCA_TRC_MASK; + pdca_channel->isr; + if (global_interrupt_enabled) Enable_global_interrupt(); +} + + +void pdca_enable_interrupt_transfer_complete(unsigned int pdca_ch_number) +{ + // get the correct channel pointer + volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); + + pdca_channel->ier = AVR32_PDCA_TRC_MASK; +} + + +void pdca_disable_interrupt_reload_counter_zero(unsigned int pdca_ch_number) +{ + // get the correct channel pointer + volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); + + Bool global_interrupt_enabled = Is_global_interrupt_enabled(); + + if (global_interrupt_enabled) Disable_global_interrupt(); + pdca_channel->idr = AVR32_PDCA_RCZ_MASK; + pdca_channel->isr; + if (global_interrupt_enabled) Enable_global_interrupt(); +} + + +void pdca_enable_interrupt_reload_counter_zero(unsigned int pdca_ch_number) +{ + // get the correct channel pointer + volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); + + pdca_channel->ier = AVR32_PDCA_RCZ_MASK; +} + + +unsigned long pdca_get_transfer_status(unsigned int pdca_ch_number) +{ + // get the correct channel pointer + volatile avr32_pdca_channel_t *pdca_channel = pdca_get_handler(pdca_ch_number); + + return pdca_channel->isr; +} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA/pdca.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA/pdca.h new file mode 100644 index 0000000..5668fe9 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA/pdca.h @@ -0,0 +1,251 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief PDCA driver for AVR32 UC3. + * + * This file defines a useful set of functions for the PDCA interface on AVR32 + * devices. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with a PDCA module. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _PDCA_H_ +#define _PDCA_H_ + +#include + + +//! Size of PDCA transfer: byte. +#define PDCA_TRANSFER_SIZE_BYTE AVR32_PDCA_BYTE + +//! Size of PDCA transfer: half-word. +#define PDCA_TRANSFER_SIZE_HALF_WORD AVR32_PDCA_HALF_WORD + +//! Size of PDCA transfer: word. +#define PDCA_TRANSFER_SIZE_WORD AVR32_PDCA_WORD + +/*! \name PDCA Driver Status Codes + */ +//! @{ +#define PDCA_SUCCESS 0 +#define PDCA_INVALID_ARGUMENT -1 +//! @} + +/*! \name PDCA Transfer Status Codes + */ +//! @{ +#define PDCA_TRANSFER_ERROR AVR32_PDCA_TERR_MASK +#define PDCA_TRANSFER_COMPLETE AVR32_PDCA_TRC_MASK +#define PDCA_TRANSFER_COUNTER_RELOAD_IS_ZERO AVR32_PDCA_RCZ_MASK +//! @} + + +//! PDCA channel options. +typedef struct +{ + //! Memory address. + volatile void *addr ; + //! Transfer counter. + unsigned int size ; + //! Next memory address. + volatile void *r_addr ; + //! Next transfer counter. + unsigned int r_size ; + //! Select peripheral ID. + unsigned int pid ; + //! Select the size of the transfer (byte, half-word or word). + unsigned int transfer_size ; +#if (defined AVR32_PDCA_120_H_INCLUDED ) || (defined AVR32_PDCA_121_H_INCLUDED ) || (defined AVR32_PDCA_122_H_INCLUDED ) +// Note: the options in this preprocessor section are only available from the PDCA IP version 1.2.0 on. + //! Enable (\c 1) or disable (\c 0) the transfer upon event trigger. + unsigned char etrig ; +#endif // #ifdef AVR32_PDCA_120_H_INCLUDED +} pdca_channel_options_t; + + +/*! \brief Get PDCA channel handler + * + * \param pdca_ch_number PDCA channel + * + * \return channel handled or PDCA_INVALID_ARGUMENT + */ +extern volatile avr32_pdca_channel_t *pdca_get_handler(unsigned int pdca_ch_number); + +/*! \brief Set the channel configuration + * + * \param pdca_ch_number PDCA channel + * \param opt channel option + */ +extern int pdca_init_channel(unsigned int pdca_ch_number, const pdca_channel_options_t *opt); + +/*! \brief Get the PDCA channel transfer enable status + * + * \param pdca_ch_number PDCA channel + * + * \return \c 1 if channel transfer is enabled, else \c 0 + */ +extern unsigned int pdca_get_channel_status(unsigned int pdca_ch_number); + +/*! \brief Disable the PDCA for the given channel + * + * \param pdca_ch_number PDCA channel + */ +extern void pdca_disable(unsigned int pdca_ch_number); + +/*! \brief Enable the PDCA for the given channel + * + * \param pdca_ch_number PDCA channel + */ +extern void pdca_enable(unsigned int pdca_ch_number); + +/*! \brief Get PDCA channel load size (or remaining size if transfer started) + * + * \param pdca_ch_number PDCA channel + * + * \return size current size to transfer + */ +extern unsigned int pdca_get_load_size(unsigned int pdca_ch_number); + +/*! \brief Set PDCA channel load values + * + * \param pdca_ch_number PDCA channel + * \param addr address where data to load are stored + * \param size size of the data block to load + */ +extern void pdca_load_channel(unsigned int pdca_ch_number, volatile void *addr, unsigned int size); + +/*! \brief Get PDCA channel reload size + * + * \param pdca_ch_number PDCA channel + * + * \return size current reload size + */ +extern unsigned int pdca_get_reload_size(unsigned int pdca_ch_number); + +/*! \brief Set PDCA channel reload values + * + * \param pdca_ch_number PDCA channel + * \param addr address where data to load are stored + * \param size size of the data block to load + */ +extern void pdca_reload_channel(unsigned int pdca_ch_number, volatile void *addr, unsigned int size); + +/*! \brief Set the peripheral function to use with the PDCA channel + * + * \param pdca_ch_number PDCA channel + * \param pid the peripheral ID + */ +extern void pdca_set_peripheral_select(unsigned int pdca_ch_number, unsigned int pid); + +/*! \brief Set the size of the transfer + * + * \param pdca_ch_number PDCA channel + * \param transfer_size size of the transfer (byte, half-word or word) + */ +extern void pdca_set_transfer_size(unsigned int pdca_ch_number, unsigned int transfer_size); + +#if (defined AVR32_PDCA_120_H_INCLUDED ) || (defined AVR32_PDCA_121_H_INCLUDED ) || (defined AVR32_PDCA_122_H_INCLUDED ) +// Note: the functions in this preprocessor section are only available from the PDCA IP version 1.2.0 on. + +/*! \brief Disable the event-triggered transfer feature + * + * \param pdca_ch_number PDCA channel + */ +extern void pdca_disable_event_trigger(unsigned int pdca_ch_number); + +/*! \brief Enable the event-triggered transfer feature + * + * \param pdca_ch_number PDCA channel + */ +extern void pdca_enable_event_trigger(unsigned int pdca_ch_number); + +#endif // #ifdef AVR32_PDCA_120_H_INCLUDED + +/*! \brief Disable PDCA transfer error interrupt + * + * \param pdca_ch_number PDCA channel + */ +extern void pdca_disable_interrupt_transfer_error(unsigned int pdca_ch_number); + +/*! \brief Enable PDCA transfer error interrupt + * + * \param pdca_ch_number PDCA channel + */ +extern void pdca_enable_interrupt_transfer_error(unsigned int pdca_ch_number); + +/*! \brief Disable PDCA transfer interrupt when completed (ie TCR and TCRR are both zero) + * + * \param pdca_ch_number PDCA channel + */ +extern void pdca_disable_interrupt_transfer_complete(unsigned int pdca_ch_number); + +/*! \brief Enable PDCA transfer interrupt when completed (ie TCR and TCRR are both zero) + * + * \param pdca_ch_number PDCA channel + */ +extern void pdca_enable_interrupt_transfer_complete(unsigned int pdca_ch_number); + +/*! \brief Disable PDCA transfer interrupt when TCRR reaches zero + * + * \param pdca_ch_number PDCA channel + */ +extern void pdca_disable_interrupt_reload_counter_zero(unsigned int pdca_ch_number); + +/*! \brief Enable PDCA transfer interrupt when TCRR reaches zero + * + * \param pdca_ch_number PDCA channel + */ +extern void pdca_enable_interrupt_reload_counter_zero(unsigned int pdca_ch_number); + +/*! \brief Get PDCA channel transfer status + * + * \param pdca_ch_number PDCA channel + * + * \return PDCA transfer status with the following bit-masks:\n + * - \c PDCA_TRANSFER_ERROR;\n + * - \c PDCA_TRANSFER_COMPLETE;\n + * - \c PDCA_TRANSFER_COUNTER_RELOAD_IS_ZERO. + */ +extern unsigned long pdca_get_transfer_status(unsigned int pdca_ch_number); + + +#endif // _PDCA_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm.c new file mode 100644 index 0000000..76d9268 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm.c @@ -0,0 +1,546 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file has been prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Power Manager driver. + * + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + *****************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#include "compiler.h" +#include "pm.h" + + +/*! \name PM Writable Bit-Field Registers + */ +//! @{ + +typedef union +{ + unsigned long mcctrl; + avr32_pm_mcctrl_t MCCTRL; +} u_avr32_pm_mcctrl_t; + +typedef union +{ + unsigned long cksel; + avr32_pm_cksel_t CKSEL; +} u_avr32_pm_cksel_t; + +typedef union +{ + unsigned long pll; + avr32_pm_pll_t PLL; +} u_avr32_pm_pll_t; + +typedef union +{ + unsigned long oscctrl0; + avr32_pm_oscctrl0_t OSCCTRL0; +} u_avr32_pm_oscctrl0_t; + +typedef union +{ + unsigned long oscctrl1; + avr32_pm_oscctrl1_t OSCCTRL1; +} u_avr32_pm_oscctrl1_t; + +typedef union +{ + unsigned long oscctrl32; + avr32_pm_oscctrl32_t OSCCTRL32; +} u_avr32_pm_oscctrl32_t; + +typedef union +{ + unsigned long ier; + avr32_pm_ier_t IER; +} u_avr32_pm_ier_t; + +typedef union +{ + unsigned long idr; + avr32_pm_idr_t IDR; +} u_avr32_pm_idr_t; + +typedef union +{ + unsigned long icr; + avr32_pm_icr_t ICR; +} u_avr32_pm_icr_t; + +typedef union +{ + unsigned long gcctrl; + avr32_pm_gcctrl_t GCCTRL; +} u_avr32_pm_gcctrl_t; + +typedef union +{ + unsigned long rccr; + avr32_pm_rccr_t RCCR; +} u_avr32_pm_rccr_t; + +typedef union +{ + unsigned long bgcr; + avr32_pm_bgcr_t BGCR; +} u_avr32_pm_bgcr_t; + +typedef union +{ + unsigned long vregcr; + avr32_pm_vregcr_t VREGCR; +} u_avr32_pm_vregcr_t; + +typedef union +{ + unsigned long bod; + avr32_pm_bod_t BOD; +} u_avr32_pm_bod_t; + +//! @} + + +/*! \brief Sets the mode of the oscillator 0. + * + * \param pm Base address of the Power Manager (i.e. &AVR32_PM). + * \param mode Oscillator 0 mode (i.e. AVR32_PM_OSCCTRL0_MODE_x). + */ +static void pm_set_osc0_mode(volatile avr32_pm_t *pm, unsigned int mode) +{ + // Read + u_avr32_pm_oscctrl0_t u_avr32_pm_oscctrl0 = {pm->oscctrl0}; + // Modify + u_avr32_pm_oscctrl0.OSCCTRL0.mode = mode; + // Write + pm->oscctrl0 = u_avr32_pm_oscctrl0.oscctrl0; +} + + +void pm_enable_osc0_ext_clock(volatile avr32_pm_t *pm) +{ + pm_set_osc0_mode(pm, AVR32_PM_OSCCTRL0_MODE_EXT_CLOCK); +} + + +void pm_enable_osc0_crystal(volatile avr32_pm_t *pm, unsigned int fosc0) +{ + pm_set_osc0_mode(pm, (fosc0 < 900000) ? AVR32_PM_OSCCTRL0_MODE_CRYSTAL_G0 : + (fosc0 < 3000000) ? AVR32_PM_OSCCTRL0_MODE_CRYSTAL_G1 : + (fosc0 < 8000000) ? AVR32_PM_OSCCTRL0_MODE_CRYSTAL_G2 : + AVR32_PM_OSCCTRL0_MODE_CRYSTAL_G3); +} + + +void pm_enable_clk0(volatile avr32_pm_t *pm, unsigned int startup) +{ + pm_enable_clk0_no_wait(pm, startup); + pm_wait_for_clk0_ready(pm); +} + + +void pm_disable_clk0(volatile avr32_pm_t *pm) +{ + pm->mcctrl &= ~AVR32_PM_MCCTRL_OSC0EN_MASK; +} + + +void pm_enable_clk0_no_wait(volatile avr32_pm_t *pm, unsigned int startup) +{ + // Read register + u_avr32_pm_oscctrl0_t u_avr32_pm_oscctrl0 = {pm->oscctrl0}; + // Modify + u_avr32_pm_oscctrl0.OSCCTRL0.startup = startup; + // Write back + pm->oscctrl0 = u_avr32_pm_oscctrl0.oscctrl0; + + pm->mcctrl |= AVR32_PM_MCCTRL_OSC0EN_MASK; +} + + +void pm_wait_for_clk0_ready(volatile avr32_pm_t *pm) +{ + while (!(pm->poscsr & AVR32_PM_POSCSR_OSC0RDY_MASK)); +} + + +/*! \brief Sets the mode of the oscillator 1. + * + * \param pm Base address of the Power Manager (i.e. &AVR32_PM). + * \param mode Oscillator 1 mode (i.e. AVR32_PM_OSCCTRL1_MODE_x). + */ +static void pm_set_osc1_mode(volatile avr32_pm_t *pm, unsigned int mode) +{ + // Read + u_avr32_pm_oscctrl1_t u_avr32_pm_oscctrl1 = {pm->oscctrl1}; + // Modify + u_avr32_pm_oscctrl1.OSCCTRL1.mode = mode; + // Write + pm->oscctrl1 = u_avr32_pm_oscctrl1.oscctrl1; +} + + +void pm_enable_osc1_ext_clock(volatile avr32_pm_t *pm) +{ + pm_set_osc1_mode(pm, AVR32_PM_OSCCTRL1_MODE_EXT_CLOCK); +} + + +void pm_enable_osc1_crystal(volatile avr32_pm_t *pm, unsigned int fosc1) +{ + pm_set_osc1_mode(pm, (fosc1 < 900000) ? AVR32_PM_OSCCTRL1_MODE_CRYSTAL_G0 : + (fosc1 < 3000000) ? AVR32_PM_OSCCTRL1_MODE_CRYSTAL_G1 : + (fosc1 < 8000000) ? AVR32_PM_OSCCTRL1_MODE_CRYSTAL_G2 : + AVR32_PM_OSCCTRL1_MODE_CRYSTAL_G3); +} + + +void pm_enable_clk1(volatile avr32_pm_t *pm, unsigned int startup) +{ + pm_enable_clk1_no_wait(pm, startup); + pm_wait_for_clk1_ready(pm); +} + + +void pm_disable_clk1(volatile avr32_pm_t *pm) +{ + pm->mcctrl &= ~AVR32_PM_MCCTRL_OSC1EN_MASK; +} + + +void pm_enable_clk1_no_wait(volatile avr32_pm_t *pm, unsigned int startup) +{ + // Read register + u_avr32_pm_oscctrl1_t u_avr32_pm_oscctrl1 = {pm->oscctrl1}; + // Modify + u_avr32_pm_oscctrl1.OSCCTRL1.startup = startup; + // Write back + pm->oscctrl1 = u_avr32_pm_oscctrl1.oscctrl1; + + pm->mcctrl |= AVR32_PM_MCCTRL_OSC1EN_MASK; +} + + +void pm_wait_for_clk1_ready(volatile avr32_pm_t *pm) +{ + while (!(pm->poscsr & AVR32_PM_POSCSR_OSC1RDY_MASK)); +} + + +/*! \brief Sets the mode of the 32-kHz oscillator. + * + * \param pm Base address of the Power Manager (i.e. &AVR32_PM). + * \param mode 32-kHz oscillator mode (i.e. AVR32_PM_OSCCTRL32_MODE_x). + */ +static void pm_set_osc32_mode(volatile avr32_pm_t *pm, unsigned int mode) +{ + // Read + u_avr32_pm_oscctrl32_t u_avr32_pm_oscctrl32 = {pm->oscctrl32}; + // Modify + u_avr32_pm_oscctrl32.OSCCTRL32.mode = mode; + // Write + pm->oscctrl32 = u_avr32_pm_oscctrl32.oscctrl32; +} + + +void pm_enable_osc32_ext_clock(volatile avr32_pm_t *pm) +{ + pm_set_osc32_mode(pm, AVR32_PM_OSCCTRL32_MODE_EXT_CLOCK); +} + + +void pm_enable_osc32_crystal(volatile avr32_pm_t *pm) +{ + pm_set_osc32_mode(pm, AVR32_PM_OSCCTRL32_MODE_CRYSTAL); +} + + +void pm_enable_clk32(volatile avr32_pm_t *pm, unsigned int startup) +{ + pm_enable_clk32_no_wait(pm, startup); + pm_wait_for_clk32_ready(pm); +} + + +void pm_disable_clk32(volatile avr32_pm_t *pm) +{ + pm->oscctrl32 &= ~AVR32_PM_OSCCTRL32_OSC32EN_MASK; +} + + +void pm_enable_clk32_no_wait(volatile avr32_pm_t *pm, unsigned int startup) +{ + // Read register + u_avr32_pm_oscctrl32_t u_avr32_pm_oscctrl32 = {pm->oscctrl32}; + // Modify + u_avr32_pm_oscctrl32.OSCCTRL32.osc32en = 1; + u_avr32_pm_oscctrl32.OSCCTRL32.startup = startup; + // Write back + pm->oscctrl32 = u_avr32_pm_oscctrl32.oscctrl32; +} + + +void pm_wait_for_clk32_ready(volatile avr32_pm_t *pm) +{ + while (!(pm->poscsr & AVR32_PM_POSCSR_OSC32RDY_MASK)); +} + + +void pm_cksel(volatile avr32_pm_t *pm, + unsigned int pbadiv, + unsigned int pbasel, + unsigned int pbbdiv, + unsigned int pbbsel, + unsigned int hsbdiv, + unsigned int hsbsel) +{ + u_avr32_pm_cksel_t u_avr32_pm_cksel = {0}; + + u_avr32_pm_cksel.CKSEL.cpusel = hsbsel; + u_avr32_pm_cksel.CKSEL.cpudiv = hsbdiv; + u_avr32_pm_cksel.CKSEL.hsbsel = hsbsel; + u_avr32_pm_cksel.CKSEL.hsbdiv = hsbdiv; + u_avr32_pm_cksel.CKSEL.pbasel = pbasel; + u_avr32_pm_cksel.CKSEL.pbadiv = pbadiv; + u_avr32_pm_cksel.CKSEL.pbbsel = pbbsel; + u_avr32_pm_cksel.CKSEL.pbbdiv = pbbdiv; + + pm->cksel = u_avr32_pm_cksel.cksel; + + // Wait for ckrdy bit and then clear it + while (!(pm->poscsr & AVR32_PM_POSCSR_CKRDY_MASK)); +} + + +void pm_gc_setup(volatile avr32_pm_t *pm, + unsigned int gc, + unsigned int osc_or_pll, // Use Osc (=0) or PLL (=1) + unsigned int pll_osc, // Sel Osc0/PLL0 or Osc1/PLL1 + unsigned int diven, + unsigned int div) +{ + u_avr32_pm_gcctrl_t u_avr32_pm_gcctrl = {0}; + + u_avr32_pm_gcctrl.GCCTRL.oscsel = pll_osc; + u_avr32_pm_gcctrl.GCCTRL.pllsel = osc_or_pll; + u_avr32_pm_gcctrl.GCCTRL.diven = diven; + u_avr32_pm_gcctrl.GCCTRL.div = div; + + pm->gcctrl[gc] = u_avr32_pm_gcctrl.gcctrl; +} + + +void pm_gc_enable(volatile avr32_pm_t *pm, + unsigned int gc) +{ + pm->gcctrl[gc] |= AVR32_PM_GCCTRL_CEN_MASK; +} + + +void pm_gc_disable(volatile avr32_pm_t *pm, + unsigned int gc) +{ + pm->gcctrl[gc] &= ~AVR32_PM_GCCTRL_CEN_MASK; +} + + +void pm_pll_setup(volatile avr32_pm_t *pm, + unsigned int pll, + unsigned int mul, + unsigned int div, + unsigned int osc, + unsigned int lockcount) +{ + u_avr32_pm_pll_t u_avr32_pm_pll = {0}; + + u_avr32_pm_pll.PLL.pllosc = osc; + u_avr32_pm_pll.PLL.plldiv = div; + u_avr32_pm_pll.PLL.pllmul = mul; + u_avr32_pm_pll.PLL.pllcount = lockcount; + + pm->pll[pll] = u_avr32_pm_pll.pll; +} + + +void pm_pll_set_option(volatile avr32_pm_t *pm, + unsigned int pll, + unsigned int pll_freq, + unsigned int pll_div2, + unsigned int pll_wbwdisable) +{ + u_avr32_pm_pll_t u_avr32_pm_pll = {pm->pll[pll]}; + u_avr32_pm_pll.PLL.pllopt = pll_freq | (pll_div2 << 1) | (pll_wbwdisable << 2); + pm->pll[pll] = u_avr32_pm_pll.pll; +} + + +unsigned int pm_pll_get_option(volatile avr32_pm_t *pm, + unsigned int pll) +{ + return (pm->pll[pll] & AVR32_PM_PLLOPT_MASK) >> AVR32_PM_PLLOPT_OFFSET; +} + + +void pm_pll_enable(volatile avr32_pm_t *pm, + unsigned int pll) +{ + pm->pll[pll] |= AVR32_PM_PLLEN_MASK; +} + + +void pm_pll_disable(volatile avr32_pm_t *pm, + unsigned int pll) +{ + pm->pll[pll] &= ~AVR32_PM_PLLEN_MASK; +} + + +void pm_wait_for_pll0_locked(volatile avr32_pm_t *pm) +{ + while (!(pm->poscsr & AVR32_PM_POSCSR_LOCK0_MASK)); +} + + +void pm_wait_for_pll1_locked(volatile avr32_pm_t *pm) +{ + while (!(pm->poscsr & AVR32_PM_POSCSR_LOCK1_MASK)); +} + + +void pm_switch_to_clock(volatile avr32_pm_t *pm, unsigned long clock) +{ + // Read + u_avr32_pm_mcctrl_t u_avr32_pm_mcctrl = {pm->mcctrl}; + // Modify + u_avr32_pm_mcctrl.MCCTRL.mcsel = clock; + // Write back + pm->mcctrl = u_avr32_pm_mcctrl.mcctrl; +} + + +void pm_switch_to_osc0(volatile avr32_pm_t *pm, unsigned int fosc0, unsigned int startup) +{ + pm_enable_osc0_crystal(pm, fosc0); // Enable the Osc0 in crystal mode + pm_enable_clk0(pm, startup); // Crystal startup time - This parameter is critical and depends on the characteristics of the crystal + pm_switch_to_clock(pm, AVR32_PM_MCSEL_OSC0); // Then switch main clock to Osc0 +} + + +void pm_bod_enable_irq(volatile avr32_pm_t *pm) +{ + pm->ier = AVR32_PM_IER_BODDET_MASK; +} + + +void pm_bod_disable_irq(volatile avr32_pm_t *pm) +{ + Bool global_interrupt_enabled = Is_global_interrupt_enabled(); + + if (global_interrupt_enabled) Disable_global_interrupt(); + pm->idr = AVR32_PM_IDR_BODDET_MASK; + pm->isr; + if (global_interrupt_enabled) Enable_global_interrupt(); +} + + +void pm_bod_clear_irq(volatile avr32_pm_t *pm) +{ + pm->icr = AVR32_PM_ICR_BODDET_MASK; +} + + +unsigned long pm_bod_get_irq_status(volatile avr32_pm_t *pm) +{ + return ((pm->isr & AVR32_PM_ISR_BODDET_MASK) != 0); +} + + +unsigned long pm_bod_get_irq_enable_bit(volatile avr32_pm_t *pm) +{ + return ((pm->imr & AVR32_PM_IMR_BODDET_MASK) != 0); +} + + +unsigned long pm_bod_get_level(volatile avr32_pm_t *pm) +{ + return (pm->bod & AVR32_PM_BOD_LEVEL_MASK) >> AVR32_PM_BOD_LEVEL_OFFSET; +} + + +unsigned long pm_read_gplp(volatile avr32_pm_t *pm, unsigned long gplp) +{ + return pm->gplp[gplp]; +} + + +void pm_write_gplp(volatile avr32_pm_t *pm, unsigned long gplp, unsigned long value) +{ + pm->gplp[gplp] = value; +} + + +long pm_enable_module(volatile avr32_pm_t *pm, unsigned long module) +{ + unsigned long domain = module>>5; + unsigned long *regptr = (unsigned long*)(&(pm->cpumask) + domain); + + // Implementation-specific shortcut: the ckMASK registers are contiguous and + // memory-mapped in that order: CPUMASK, HSBMASK, PBAMASK, PBBMASK. + + *regptr |= (1<<(module%32)); + + return PASS; +} + +long pm_disable_module(volatile avr32_pm_t *pm, unsigned long module) +{ + unsigned long domain = module>>5; + unsigned long *regptr = (unsigned long*)(&(pm->cpumask) + domain); + + // Implementation-specific shortcut: the ckMASK registers are contiguous and + // memory-mapped in that order: CPUMASK, HSBMASK, PBAMASK, PBBMASK. + + *regptr &= ~(1<<(module%32)); + + return PASS; +} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm.h new file mode 100644 index 0000000..ca679f7 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm.h @@ -0,0 +1,493 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file has been prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Power Manager driver. + * + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + *****************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _PM_H_ +#define _PM_H_ + +#include +#include "compiler.h" +#include "preprocessor.h" + + +/*! \brief Sets the MCU in the specified sleep mode. + * + * \param mode Sleep mode: + * \arg \c AVR32_PM_SMODE_IDLE: Idle; + * \arg \c AVR32_PM_SMODE_FROZEN: Frozen; + * \arg \c AVR32_PM_SMODE_STANDBY: Standby; + * \arg \c AVR32_PM_SMODE_STOP: Stop; + * \arg \c AVR32_PM_SMODE_DEEP_STOP: DeepStop; + * \arg \c AVR32_PM_SMODE_STATIC: Static. + */ +#define SLEEP(mode) {__asm__ __volatile__ ("sleep "STRINGZ(mode));} + + +//! Input and output parameters when initializing PM clocks using pm_configure_clocks(). +typedef struct +{ + //! CPU frequency (input/output argument). + unsigned long cpu_f; + + //! PBA frequency (input/output argument). + unsigned long pba_f; + + //! Oscillator 0's external crystal(or external clock) frequency (board dependant) (input argument). + unsigned long osc0_f; + + //! Oscillator 0's external crystal(or external clock) startup time: AVR32_PM_OSCCTRL0_STARTUP_x_RCOSC (input argument). + unsigned long osc0_startup; +} pm_freq_param_t; + +#define PM_FREQ_STATUS_FAIL (-1) +#define PM_FREQ_STATUS_OK (0) + + +/*! \brief Gets the MCU reset cause. + * + * \param pm Base address of the Power Manager instance (i.e. &AVR32_PM). + * + * \return The MCU reset cause which can be masked with the + * \c AVR32_PM_RCAUSE_x_MASK bit-masks to isolate specific causes. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ unsigned int pm_get_reset_cause(volatile avr32_pm_t *pm) +{ + return pm->rcause; +} + + +/*! + * \brief This function will enable the external clock mode of the oscillator 0. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + */ +extern void pm_enable_osc0_ext_clock(volatile avr32_pm_t *pm); + + +/*! + * \brief This function will enable the crystal mode of the oscillator 0. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param fosc0 Oscillator 0 crystal frequency (Hz) + */ +extern void pm_enable_osc0_crystal(volatile avr32_pm_t *pm, unsigned int fosc0); + + +/*! + * \brief This function will enable the oscillator 0 to be used with a startup time. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param startup Clock 0 startup time. AVR32_PM_OSCCTRL0_STARTUP_x_RCOSC. + */ +extern void pm_enable_clk0(volatile avr32_pm_t *pm, unsigned int startup); + + +/*! + * \brief This function will disable the oscillator 0. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + */ +extern void pm_disable_clk0(volatile avr32_pm_t *pm); + + +/*! + * \brief This function will enable the oscillator 0 to be used with no startup time. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param startup Clock 0 startup time, for which the function does not wait. AVR32_PM_OSCCTRL0_STARTUP_x_RCOSC. + */ +extern void pm_enable_clk0_no_wait(volatile avr32_pm_t *pm, unsigned int startup); + + +/*! + * \brief This function will wait until the Osc0 clock is ready. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + */ +extern void pm_wait_for_clk0_ready(volatile avr32_pm_t *pm); + + +/*! + * \brief This function will enable the external clock mode of the oscillator 1. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + */ +extern void pm_enable_osc1_ext_clock(volatile avr32_pm_t *pm); + + +/*! + * \brief This function will enable the crystal mode of the oscillator 1. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param fosc1 Oscillator 1 crystal frequency (Hz) + */ +extern void pm_enable_osc1_crystal(volatile avr32_pm_t *pm, unsigned int fosc1); + + +/*! + * \brief This function will enable the oscillator 1 to be used with a startup time. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param startup Clock 1 startup time. AVR32_PM_OSCCTRL1_STARTUP_x_RCOSC. + */ +extern void pm_enable_clk1(volatile avr32_pm_t *pm, unsigned int startup); + + +/*! + * \brief This function will disable the oscillator 1. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + */ +extern void pm_disable_clk1(volatile avr32_pm_t *pm); + + +/*! + * \brief This function will enable the oscillator 1 to be used with no startup time. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param startup Clock 1 startup time, for which the function does not wait. AVR32_PM_OSCCTRL1_STARTUP_x_RCOSC. + */ +extern void pm_enable_clk1_no_wait(volatile avr32_pm_t *pm, unsigned int startup); + + +/*! + * \brief This function will wait until the Osc1 clock is ready. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + */ +extern void pm_wait_for_clk1_ready(volatile avr32_pm_t *pm); + + +/*! + * \brief This function will enable the external clock mode of the 32-kHz oscillator. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + */ +extern void pm_enable_osc32_ext_clock(volatile avr32_pm_t *pm); + + +/*! + * \brief This function will enable the crystal mode of the 32-kHz oscillator. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + */ +extern void pm_enable_osc32_crystal(volatile avr32_pm_t *pm); + + +/*! + * \brief This function will enable the oscillator 32 to be used with a startup time. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param startup Clock 32 kHz startup time. AVR32_PM_OSCCTRL32_STARTUP_x_RCOSC. + */ +extern void pm_enable_clk32(volatile avr32_pm_t *pm, unsigned int startup); + + +/*! + * \brief This function will disable the oscillator 32. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + */ +extern void pm_disable_clk32(volatile avr32_pm_t *pm); + + +/*! + * \brief This function will enable the oscillator 32 to be used with no startup time. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param startup Clock 32 kHz startup time, for which the function does not wait. AVR32_PM_OSCCTRL32_STARTUP_x_RCOSC. + */ +extern void pm_enable_clk32_no_wait(volatile avr32_pm_t *pm, unsigned int startup); + + +/*! + * \brief This function will wait until the osc32 clock is ready. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + */ +extern void pm_wait_for_clk32_ready(volatile avr32_pm_t *pm); + + +/*! + * \brief This function will select all the power manager clocks. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param pbadiv Peripheral Bus A clock divisor enable + * \param pbasel Peripheral Bus A select + * \param pbbdiv Peripheral Bus B clock divisor enable + * \param pbbsel Peripheral Bus B select + * \param hsbdiv High Speed Bus clock divisor enable (CPU clock = HSB clock) + * \param hsbsel High Speed Bus select (CPU clock = HSB clock ) + */ +extern void pm_cksel(volatile avr32_pm_t *pm, unsigned int pbadiv, unsigned int pbasel, unsigned int pbbdiv, unsigned int pbbsel, unsigned int hsbdiv, unsigned int hsbsel); + + +/*! + * \brief This function will setup a generic clock. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param gc generic clock number (0 for gc0...) + * \param osc_or_pll Use OSC (=0) or PLL (=1) + * \param pll_osc Select Osc0/PLL0 or Osc1/PLL1 + * \param diven Generic clock divisor enable + * \param div Generic clock divisor + */ +extern void pm_gc_setup(volatile avr32_pm_t *pm, unsigned int gc, unsigned int osc_or_pll, unsigned int pll_osc, unsigned int diven, unsigned int div); + + +/*! + * \brief This function will enable a generic clock. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param gc generic clock number (0 for gc0...) + */ +extern void pm_gc_enable(volatile avr32_pm_t *pm, unsigned int gc); + + +/*! + * \brief This function will disable a generic clock. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param gc generic clock number (0 for gc0...) + */ +extern void pm_gc_disable(volatile avr32_pm_t *pm, unsigned int gc); + + +/*! + * \brief This function will setup a PLL. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param pll PLL number(0 for PLL0, 1 for PLL1) + * \param mul PLL MUL in the PLL formula + * \param div PLL DIV in the PLL formula + * \param osc OSC number (0 for osc0, 1 for osc1) + * \param lockcount PLL lockount + */ +extern void pm_pll_setup(volatile avr32_pm_t *pm, unsigned int pll, unsigned int mul, unsigned int div, unsigned int osc, unsigned int lockcount); + + +/*! + * \brief This function will set a PLL option. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param pll PLL number(0 for PLL0, 1 for PLL1) + * \param pll_freq Set to 1 for VCO frequency range 80-180MHz, set to 0 for VCO frequency range 160-240Mhz. + * \param pll_div2 Divide the PLL output frequency by 2 (this settings does not change the FVCO value) + * \param pll_wbwdisable 1 Disable the Wide-Bandith Mode (Wide-Bandwith mode allow a faster startup time and out-of-lock time). 0 to enable the Wide-Bandith Mode. + */ +extern void pm_pll_set_option(volatile avr32_pm_t *pm, unsigned int pll, unsigned int pll_freq, unsigned int pll_div2, unsigned int pll_wbwdisable); + + +/*! + * \brief This function will get a PLL option. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param pll PLL number(0 for PLL0, 1 for PLL1) + * \return Option + */ +extern unsigned int pm_pll_get_option(volatile avr32_pm_t *pm, unsigned int pll); + + +/*! + * \brief This function will enable a PLL. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param pll PLL number(0 for PLL0, 1 for PLL1) + */ +extern void pm_pll_enable(volatile avr32_pm_t *pm, unsigned int pll); + + +/*! + * \brief This function will disable a PLL. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param pll PLL number(0 for PLL0, 1 for PLL1) + */ +extern void pm_pll_disable(volatile avr32_pm_t *pm, unsigned int pll); + + +/*! + * \brief This function will wait for PLL0 locked + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + */ +extern void pm_wait_for_pll0_locked(volatile avr32_pm_t *pm); + + +/*! + * \brief This function will wait for PLL1 locked + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + */ +extern void pm_wait_for_pll1_locked(volatile avr32_pm_t *pm); + + +/*! + * \brief This function will switch the power manager main clock. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param clock Clock to be switched on. AVR32_PM_MCSEL_SLOW for RCOsc, AVR32_PM_MCSEL_OSC0 for Osc0, AVR32_PM_MCSEL_PLL0 for PLL0. + */ +extern void pm_switch_to_clock(volatile avr32_pm_t *pm, unsigned long clock); + + +/*! + * \brief Switch main clock to clock Osc0 (crystal mode) + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param fosc0 Oscillator 0 crystal frequency (Hz) + * \param startup Crystal 0 startup time. AVR32_PM_OSCCTRL0_STARTUP_x_RCOSC. + */ +extern void pm_switch_to_osc0(volatile avr32_pm_t *pm, unsigned int fosc0, unsigned int startup); + + +/*! \brief Enables the Brown-Out Detector interrupt. + * + * \param pm Base address of the Power Manager (i.e. &AVR32_PM). + */ +extern void pm_bod_enable_irq(volatile avr32_pm_t *pm); + + +/*! \brief Disables the Brown-Out Detector interrupt. + * + * \param pm Base address of the Power Manager (i.e. &AVR32_PM). + */ +extern void pm_bod_disable_irq(volatile avr32_pm_t *pm); + + +/*! \brief Clears the Brown-Out Detector interrupt flag. + * + * \param pm Base address of the Power Manager (i.e. &AVR32_PM). + */ +extern void pm_bod_clear_irq(volatile avr32_pm_t *pm); + + +/*! \brief Gets the Brown-Out Detector interrupt flag. + * + * \param pm Base address of the Power Manager (i.e. &AVR32_PM). + * + * \retval 0 No BOD interrupt. + * \retval 1 BOD interrupt pending. + */ +extern unsigned long pm_bod_get_irq_status(volatile avr32_pm_t *pm); + + +/*! \brief Gets the Brown-Out Detector interrupt enable status. + * + * \param pm Base address of the Power Manager (i.e. &AVR32_PM). + * + * \retval 0 BOD interrupt disabled. + * \retval 1 BOD interrupt enabled. + */ +extern unsigned long pm_bod_get_irq_enable_bit(volatile avr32_pm_t *pm); + + +/*! \brief Gets the triggering threshold of the Brown-Out Detector. + * + * \param pm Base address of the Power Manager (i.e. &AVR32_PM). + * + * \return Triggering threshold of the BOD. See the electrical characteristics + * in the part datasheet for actual voltage levels. + */ +extern unsigned long pm_bod_get_level(volatile avr32_pm_t *pm); + + +/*! + * \brief Read the content of the PM GPLP registers + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param gplp GPLP register index (0,1,... depending on the number of GPLP registers for a given part) + * + * \return The content of the chosen GPLP register. + */ +extern unsigned long pm_read_gplp(volatile avr32_pm_t *pm, unsigned long gplp); + + +/*! + * \brief Write into the PM GPLP registers + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param gplp GPLP register index (0,1,... depending on the number of GPLP registers for a given part) + * \param value Value to write + */ +extern void pm_write_gplp(volatile avr32_pm_t *pm, unsigned long gplp, unsigned long value); + + +/*! \brief Enable the clock of a module. + * + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param module The module to clock (use one of the defines in the part-specific + * header file under "toolchain folder"/avr32/inc(lude)/avr32/; depending on the + * clock domain, look for the sections "CPU clocks", "HSB clocks", "PBx clocks") + * + * \return Status. + * \retval 0 Success. + * \retval <0 An error occured. + */ +extern long pm_enable_module(volatile avr32_pm_t *pm, unsigned long module); + +/*! \brief Disable the clock of a module. + * + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param module The module to shut down (use one of the defines in the part-specific + * header file under "toolchain folder"/avr32/inc(lude)/avr32/; depending on the + * clock domain, look for the sections "CPU clocks", "HSB clocks", "PBx clocks") + * + * \return Status. + * \retval 0 Success. + * \retval <0 An error occured. + */ +extern long pm_disable_module(volatile avr32_pm_t *pm, unsigned long module); + + + +/*! \brief Automatically configure the CPU, PBA, PBB, and HSB clocks + * according to the user wishes. + * + * This function needs some parameters stored in a pm_freq_param_t structure: + * - cpu_f and pba_f are the wanted frequencies, + * - osc0_f is the oscillator 0 on-board frequency (e.g. FOSC0), + * - osc0_startup is the oscillator 0 startup time (e.g. OSC0_STARTUP). + * + * The function will then configure the clocks using the following rules: + * - It first try to find a valid PLL frequency (the highest possible value to avoid jitter) in order + * to satisfy the CPU frequency, + * - It optimizes the configuration depending the various divide stages, + * - Then, the PBA frequency is configured from the CPU freq. + * - Note that HSB and PBB are configured with the same frequency as CPU. + * - Note also that the number of wait states of the flash read accesses is automatically set-up depending + * the CPU frequency. As a consequence, the application needs the FLASHC driver to compile. + * + * The CPU, HSB and PBA frequencies programmed after configuration are stored back into cpu_f and pba_f. + * + * \param param pointer on the configuration structure. + * + * \retval PM_FREQ_STATUS_OK Mode successfully initialized. + * \retval PM_FREQ_STATUS_FAIL The configuration can not be done. + */ +extern int pm_configure_clocks(pm_freq_param_t *param); + + +/*! \brief Automatically configure the USB clock. + * + * USB clock is configured to 48MHz, using the PLL1 from the Oscillator0, assuming + * a 12 MHz crystal is connected to it. + */ +extern void pm_configure_usb_clock(void); + + +#endif // _PM_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm_conf_clocks.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm_conf_clocks.c new file mode 100644 index 0000000..8beb83b --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm_conf_clocks.c @@ -0,0 +1,268 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file has been prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Power Manager clocks configuration helper. + * + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + *****************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#include +#include "compiler.h" +#include "pm.h" + +extern void flashc_set_wait_state(unsigned int wait_state); +#if (defined AVR32_FLASHC_210_H_INCLUDED) +extern void flashc_issue_command(unsigned int command, int page_number); +#endif + + +#define PM_MAX_MUL ((1 << AVR32_PM_PLL0_PLLMUL_SIZE) - 1) + + +int pm_configure_clocks(pm_freq_param_t *param) +{ + // Supported frequencies: + // Fosc0 mul div PLL div2_en cpu_f pba_f Comment + // 12 15 1 192 1 12 12 + // 12 9 3 40 1 20 20 PLL out of spec + // 12 15 1 192 1 24 12 + // 12 9 1 120 1 30 15 + // 12 9 3 40 0 40 20 PLL out of spec + // 12 15 1 192 1 48 12 + // 12 15 1 192 1 48 24 + // 12 8 1 108 1 54 27 + // 12 9 1 120 1 60 15 + // 12 9 1 120 1 60 30 + // 12 10 1 132 1 66 16.5 + // + unsigned long in_cpu_f = param->cpu_f; + unsigned long in_osc0_f = param->osc0_f; + unsigned long mul, div, div2_en = 0, div2_cpu = 0, div2_pba = 0; + unsigned long pll_freq, rest; + Bool b_div2_pba, b_div2_cpu; + + // Switch to external Oscillator 0 + pm_switch_to_osc0(&AVR32_PM, in_osc0_f, param->osc0_startup); + + // Start with CPU freq config + if (in_cpu_f == in_osc0_f) + { + param->cpu_f = in_osc0_f; + param->pba_f = in_osc0_f; + return PM_FREQ_STATUS_OK; + } + else if (in_cpu_f < in_osc0_f) + { + // TBD + } + + rest = in_cpu_f % in_osc0_f; + + for (div = 1; div < 32; div++) + { + if ((div * rest) % in_osc0_f == 0) + break; + } + if (div == 32) + return PM_FREQ_STATUS_FAIL; + + mul = (in_cpu_f * div) / in_osc0_f; + + if (mul > PM_MAX_MUL) + return PM_FREQ_STATUS_FAIL; + + // export 2power from PLL div to div2_cpu + while (!(div % 2)) + { + div /= 2; + div2_cpu++; + } + + // Here we know the mul and div parameter of the PLL config. + // . Check out if the PLL has a valid in_cpu_f. + // . Try to have for the PLL frequency (VCO output) the highest possible value + // to reduce jitter. + while (in_osc0_f * 2 * mul / div < AVR32_PM_PLL_VCO_RANGE0_MAX_FREQ) + { + if (2 * mul > PM_MAX_MUL) + break; + mul *= 2; + div2_cpu++; + } + + if (div2_cpu != 0) + { + div2_cpu--; + div2_en = 1; + } + + pll_freq = in_osc0_f * mul / (div * (1 << div2_en)); + + // Update real CPU Frequency + param->cpu_f = pll_freq / (1 << div2_cpu); + mul--; + + pm_pll_setup(&AVR32_PM + , 0 // pll + , mul // mul + , div // div + , 0 // osc + , 16 // lockcount + ); + + pm_pll_set_option(&AVR32_PM + , 0 // pll + // PLL clock is lower than 160MHz: need to set pllopt. + , (pll_freq < AVR32_PM_PLL_VCO_RANGE0_MIN_FREQ) ? 1 : 0 // pll_freq + , div2_en // pll_div2 + , 0 // pll_wbwdisable + ); + + rest = pll_freq; + while (rest > AVR32_PM_PBA_MAX_FREQ || + rest != param->pba_f) + { + div2_pba++; + rest = pll_freq / (1 << div2_pba); + if (rest < param->pba_f) + break; + } + + // Update real PBA Frequency + param->pba_f = pll_freq / (1 << div2_pba); + + // Enable PLL0 + pm_pll_enable(&AVR32_PM, 0); + + // Wait for PLL0 locked + pm_wait_for_pll0_locked(&AVR32_PM); + + if (div2_cpu) + { + b_div2_cpu = TRUE; + div2_cpu--; + } + else + b_div2_cpu = FALSE; + + if (div2_pba) + { + b_div2_pba = TRUE; + div2_pba--; + } + else + b_div2_pba = FALSE; + + pm_cksel(&AVR32_PM + , b_div2_pba, div2_pba // PBA + , b_div2_cpu, div2_cpu // PBB + , b_div2_cpu, div2_cpu // HSB + ); + + if (param->cpu_f > AVR32_FLASHC_FWS_0_MAX_FREQ) + { + flashc_set_wait_state(1); +#if (defined AVR32_FLASHC_210_H_INCLUDED) + if (param->cpu_f > AVR32_FLASHC_HSEN_FWS_1_MAX_FREQ) + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_HSEN, -1); + else + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_HSDIS, -1); +#endif + } + else + { + flashc_set_wait_state(0); +#if (defined AVR32_FLASHC_210_H_INCLUDED) + if (param->cpu_f > AVR32_FLASHC_HSEN_FWS_0_MAX_FREQ) + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_HSEN, -1); + else + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_HSDIS, -1); +#endif + } + + pm_switch_to_clock(&AVR32_PM, AVR32_PM_MCCTRL_MCSEL_PLL0); + + return PM_FREQ_STATUS_OK; +} + + +void pm_configure_usb_clock(void) +{ +#if UC3A3 + + // Setup USB GCLK. + pm_gc_setup(&AVR32_PM, AVR32_PM_GCLK_USBB, // gc + 0, // osc_or_pll: use Osc (if 0) or PLL (if 1) + 0, // pll_osc: select Osc0/PLL0 or Osc1/PLL1 + 0, // diven + 0); // div + + // Enable USB GCLK. + pm_gc_enable(&AVR32_PM, AVR32_PM_GCLK_USBB); +#else + // Use 12MHz from OSC0 and generate 96 MHz + pm_pll_setup(&AVR32_PM, 1, // pll. + 7, // mul. + 1, // div. + 0, // osc. + 16); // lockcount. + + pm_pll_set_option(&AVR32_PM, 1, // pll. + 1, // pll_freq: choose the range 80-180MHz. + 1, // pll_div2. + 0); // pll_wbwdisable. + + // start PLL1 and wait forl lock + pm_pll_enable(&AVR32_PM, 1); + + // Wait for PLL1 locked. + pm_wait_for_pll1_locked(&AVR32_PM); + + pm_gc_setup(&AVR32_PM, AVR32_PM_GCLK_USBB, // gc. + 1, // osc_or_pll: use Osc (if 0) or PLL (if 1). + 1, // pll_osc: select Osc0/PLL0 or Osc1/PLL1. + 0, // diven. + 0); // div. + pm_gc_enable(&AVR32_PM, AVR32_PM_GCLK_USBB); +#endif +} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/power_clocks_lib.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/power_clocks_lib.c new file mode 100644 index 0000000..f5fc155 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/power_clocks_lib.c @@ -0,0 +1,566 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file has been prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief High-level library abstracting features such as oscillators/pll/dfll + * configuration, clock configuration, System-sensible parameters + * configuration, buses clocks configuration, sleep mode, reset. + * + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + *****************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ +#include "power_clocks_lib.h" + + +//! Device-specific data +#if UC3L +static long int pcl_configure_clocks_uc3l(pcl_freq_param_t *param); // FORWARD declaration +#endif + +#if UC3C +static long int pcl_configure_clocks_uc3c(pcl_freq_param_t *param); // FORWARD declaration +#endif + +long int pcl_configure_clocks(pcl_freq_param_t *param) +{ +#ifndef AVR32_PM_VERSION_RESETVALUE + // Implementation for UC3A, UC3A3, UC3B parts. + return(pm_configure_clocks(param)); +#else + #ifdef AVR32_PM_410_H_INCLUDED + // Implementation for UC3C parts. + return(pcl_configure_clocks_uc3c(param)); + #else + // Implementation for UC3L parts. + return(pcl_configure_clocks_uc3l(param)); + #endif +#endif +} + + +//! Device-specific implementation +#if UC3L +// FORWARD declaration +static long int pcl_configure_synchronous_clocks( pm_clk_src_t main_clk_src, + unsigned long main_clock_freq_hz, + pcl_freq_param_t *param); + +long int pcl_configure_clocks_rcsys(pcl_freq_param_t *param) +{ + // Supported main clock sources: PCL_MC_RCSYS + + // Supported synchronous clocks frequencies if RCSYS is the main clock source: + // 115200Hz, 57600Hz, 28800Hz, 14400Hz, 7200Hz, 3600Hz, 1800Hz, 900Hz, 450Hz. + + // NOTE: by default, this implementation doesn't perform thorough checks on the + // input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. + +#ifdef AVR32SFW_INPUT_CHECK + // Verify that fCPU >= fPBx + if((param->cpu_f < param->pba_f) || (param->cpu_f < param->pbb_f)) + return(-1); +#endif + +#ifdef AVR32SFW_INPUT_CHECK + // Verify that the target frequencies are reachable. + if((param->cpu_f > SCIF_SLOWCLOCK_FREQ_HZ) || (param->pba_f > SCIF_SLOWCLOCK_FREQ_HZ) + || (param->pbb_f > SCIF_SLOWCLOCK_FREQ_HZ)) + return(-1); +#endif + + return(pcl_configure_synchronous_clocks(PM_CLK_SRC_SLOW, SCIF_SLOWCLOCK_FREQ_HZ, param)); +} + + +long int pcl_configure_clocks_rc120m(pcl_freq_param_t *param) +{ + // Supported main clock sources: PCL_MC_RC120M + + // Supported synchronous clocks frequencies if RC120M is the main clock source: + // 30MHz, 15MHz, 7.5MHz, 3.75MHz, 1.875MHz, 937.5kHz, 468.75kHz. + + // NOTE: by default, this implementation doesn't perform thorough checks on the + // input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. + +#ifdef AVR32SFW_INPUT_CHECK + // Verify that fCPU >= fPBx + if((param->cpu_f < param->pba_f) || (param->cpu_f < param->pbb_f)) + return(-1); +#endif + +#ifdef AVR32SFW_INPUT_CHECK + // Verify that the target frequencies are reachable. + if((param->cpu_f > SCIF_RC120M_FREQ_HZ) || (param->pba_f > SCIF_RC120M_FREQ_HZ) + || (param->pbb_f > SCIF_RC120M_FREQ_HZ)) + return(-1); +#endif + + // Start the 120MHz internal RCosc (RC120M) clock + scif_start_rc120M(); + + return(pcl_configure_synchronous_clocks(PM_CLK_SRC_RC120M, SCIF_RC120M_FREQ_HZ, param)); +} + + +long int pcl_configure_clocks_osc0(pcl_freq_param_t *param) +{ + // Supported main clock sources: PCL_MC_OSC0 + + // Supported synchronous clocks frequencies if OSC0 is the main clock source: + // (these obviously depend on the OSC0 frequency; we'll take 16MHz as an example) + // 16MHz, 8MHz, 4MHz, 2MHz, 1MHz, 500kHz, 250kHz, 125kHz, 62.5kHz. + + // NOTE: by default, this implementation doesn't perform thorough checks on the + // input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. + + unsigned long main_clock_freq; + + +#ifdef AVR32SFW_INPUT_CHECK + // Verify that fCPU >= fPBx + if((param->cpu_f < param->pba_f) || (param->cpu_f < param->pbb_f)) + return(-1); +#endif + + main_clock_freq = param->osc0_f; +#ifdef AVR32SFW_INPUT_CHECK + // Verify that the target frequencies are reachable. + if((param->cpu_f > main_clock_freq) || (param->pba_f > main_clock_freq) + || (param->pbb_f > main_clock_freq)) + return(-1); +#endif + // Configure OSC0 in crystal mode, external crystal with a fcrystal Hz frequency. + scif_configure_osc_crystalmode(SCIF_OSC0, main_clock_freq); + // Enable the OSC0 + scif_enable_osc(SCIF_OSC0, param->osc0_startup, true); + + return(pcl_configure_synchronous_clocks(PM_CLK_SRC_OSC0, main_clock_freq, param)); +} + + +long int pcl_configure_clocks_dfll0(pcl_freq_param_t *param) +{ + // Supported main clock sources: PCL_MC_DFLL + + // Supported synchronous clocks frequencies if DFLL is the main clock source: + // (these obviously depend on the DFLL target frequency; we'll take 100MHz as an example) + // 50MHz, 25MHz, 12.5MHz, 6.25MHz, 3.125MHz, 1562.5kHz, 781.25kHz, 390.625kHz. + + // NOTE: by default, this implementation doesn't perform thorough checks on the + // input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. + + unsigned long main_clock_freq; + scif_gclk_opt_t *pgc_dfllif_ref_opt; + + +#ifdef AVR32SFW_INPUT_CHECK + // Verify that fCPU >= fPBx + if((param->cpu_f < param->pba_f) || (param->cpu_f < param->pbb_f)) + return(-1); +#endif + + main_clock_freq = param->dfll_f; +#ifdef AVR32SFW_INPUT_CHECK + // Verify that the target DFLL output frequency is in the correct range. + if((main_clock_freq > SCIF_DFLL_MAXFREQ_HZ) || (main_clock_freq < SCIF_DFLL_MINFREQ_HZ)) + return(-1); + // Verify that the target frequencies are reachable. + if((param->cpu_f > main_clock_freq) || (param->pba_f > main_clock_freq) + || (param->pbb_f > main_clock_freq)) + return(-1); +#endif + pgc_dfllif_ref_opt = (scif_gclk_opt_t *)param->pextra_params; + // Implementation note: this implementation configures the DFLL in closed-loop + // mode (because it gives the best accuracy) which enables the generic clock CLK_DFLLIF_REF + // as a reference (RCSYS being used as the generic clock source, undivided). + scif_dfll0_closedloop_configure_and_start(pgc_dfllif_ref_opt, main_clock_freq, TRUE); + + return(pcl_configure_synchronous_clocks(PM_CLK_SRC_DFLL0, main_clock_freq, param)); +} + + +static long int pcl_configure_clocks_uc3l(pcl_freq_param_t *param) +{ + // Supported main clock sources: PCL_MC_RCSYS, PCL_MC_OSC0, PCL_MC_DFLL0, PCL_MC_RC120M + + // Supported synchronous clocks frequencies if RCSYS is the main clock source: + // 115200Hz, 57600Hz, 28800Hz, 14400Hz, 7200Hz, 3600Hz, 1800Hz, 900Hz, 450Hz. + + // Supported synchronous clocks frequencies if RC120M is the main clock source: + // 30MHz, 15MHz, 7.5MHz, 3.75MHz, 1.875MHz, 937.5kHz, 468.75kHz. + + // Supported synchronous clocks frequencies if OSC0 is the main clock source: + // (these obviously depend on the OSC0 frequency; we'll take 16MHz as an example) + // 16MHz, 8MHz, 4MHz, 2MHz, 1MHz, 500kHz, 250kHz, 125kHz, 62.5kHz. + + // Supported synchronous clocks frequencies if DFLL is the main clock source: + // (these obviously depend on the DFLL target frequency; we'll take 100MHz as an example) + // 50MHz, 25MHz, 12.5MHz, 6.25MHz, 3.125MHz, 1562.5kHz, 781.25kHz, 390.625kHz. + + // NOTE: by default, this implementation doesn't perform thorough checks on the + // input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. + + +#ifdef AVR32SFW_INPUT_CHECK + // Verify that fCPU >= fPBx + if((param->cpu_f < param->pba_f) || (param->cpu_f < param->pbb_f)) + return(-1); +#endif + + if(PCL_MC_RCSYS == param->main_clk_src) + { + return(pcl_configure_clocks_rcsys(param)); + } + else if(PCL_MC_RC120M == param->main_clk_src) + { + return(pcl_configure_clocks_rc120m(param)); + } + else if(PCL_MC_OSC0 == param->main_clk_src) + { + return(pcl_configure_clocks_osc0(param)); + } + else // PCL_MC_DFLL0 == param->main_clk_src + { + return(pcl_configure_clocks_dfll0(param)); + } +} + +static long int pcl_configure_synchronous_clocks(pm_clk_src_t main_clk_src, unsigned long main_clock_freq_hz, pcl_freq_param_t *param) +{ + //# + //# Set the Synchronous clock division ratio for each clock domain + //# + pm_set_all_cksel(main_clock_freq_hz, param->cpu_f, param->pba_f, param->pbb_f); + + //# + //# Set the Flash wait state and the speed read mode (depending on the target CPU frequency). + //# +#if UC3L + flashcdw_set_flash_waitstate_and_readmode(param->cpu_f); +#elif UC3C + flashc_set_flash_waitstate_and_readmode(param->cpu_f); +#endif + + + //# + //# Switch the main clock source to the selected clock. + //# + pm_set_mclk_source(main_clk_src); + + return PASS; +} + +#endif // UC3L device-specific implementation + +//! UC3C Device-specific implementation +#if UC3C +static long int pcl_configure_clocks_uc3c(pcl_freq_param_t *param) +{ + #define PM_MAX_MUL ((1 << AVR32_SCIF_PLLMUL_SIZE) - 1) + #define AVR32_PM_PBA_MAX_FREQ 66000000 + #define AVR32_PM_PLL_VCO_RANGE0_MAX_FREQ 240000000 + #define AVR32_PM_PLL_VCO_RANGE0_MIN_FREQ 160000000 + + // Implementation for UC3C parts. + // Supported frequencies: + // Fosc0 mul div PLL div2_en cpu_f pba_f Comment + // 12 15 1 192 1 12 12 + // 12 9 3 40 1 20 20 PLL out of spec + // 12 15 1 192 1 24 12 + // 12 9 1 120 1 30 15 + // 12 9 3 40 0 40 20 PLL out of spec + // 12 15 1 192 1 48 12 + // 12 15 1 192 1 48 24 + // 12 8 1 108 1 54 27 + // 12 9 1 120 1 60 15 + // 12 9 1 120 1 60 30 + // 12 10 1 132 1 66 16.5 + // + unsigned long in_cpu_f = param->cpu_f; + unsigned long in_osc0_f = param->osc0_f; + unsigned long mul, div, div2_en = 0, div2_cpu = 0, div2_pba = 0; + unsigned long pll_freq, rest; + Bool b_div2_pba, b_div2_cpu; + + // Configure OSC0 in crystal mode, external crystal with a FOSC0 Hz frequency. + scif_configure_osc_crystalmode(SCIF_OSC0, in_osc0_f); + // Enable the OSC0 + scif_enable_osc(SCIF_OSC0, param->osc0_startup, true); + // Set the main clock source as being OSC0. + pm_set_mclk_source(PM_CLK_SRC_OSC0); + + // Start with CPU freq config + if (in_cpu_f == in_osc0_f) + { + param->cpu_f = in_osc0_f; + param->pba_f = in_osc0_f; + return PASS; + } + else if (in_cpu_f < in_osc0_f) + { + // TBD + } + + rest = in_cpu_f % in_osc0_f; + + for (div = 1; div < 32; div++) + { + if ((div * rest) % in_osc0_f == 0) + break; + } + if (div == 32) + return FAIL; + + mul = (in_cpu_f * div) / in_osc0_f; + + if (mul > PM_MAX_MUL) + return FAIL; + + // export 2power from PLL div to div2_cpu + while (!(div % 2)) + { + div /= 2; + div2_cpu++; + } + + // Here we know the mul and div parameter of the PLL config. + // . Check out if the PLL has a valid in_cpu_f. + // . Try to have for the PLL frequency (VCO output) the highest possible value + // to reduce jitter. + while (in_osc0_f * 2 * mul / div < AVR32_PM_PLL_VCO_RANGE0_MAX_FREQ) + { + if (2 * mul > PM_MAX_MUL) + break; + mul *= 2; + div2_cpu++; + } + + if (div2_cpu != 0) + { + div2_cpu--; + div2_en = 1; + } + + pll_freq = in_osc0_f * mul / (div * (1 << div2_en)); + + // Update real CPU Frequency + param->cpu_f = pll_freq / (1 << div2_cpu); + mul--; + + scif_pll_opt_t opt; + + opt.osc = SCIF_OSC0, // Sel Osc0 or Osc1 + opt.lockcount = 16, // lockcount in main clock for the PLL wait lock + opt.div = div, // DIV=1 in the formula + opt.mul = mul, // MUL=7 in the formula + opt.pll_div2 = div2_en, // pll_div2 Divide the PLL output frequency by 2 (this settings does not change the FVCO value) + opt.pll_wbwdisable = 0, //pll_wbwdisable 1 Disable the Wide-Bandith Mode (Wide-Bandwith mode allow a faster startup time and out-of-lock time). 0 to enable the Wide-Bandith Mode. + opt.pll_freq = (pll_freq < AVR32_PM_PLL_VCO_RANGE0_MIN_FREQ) ? 1 : 0, // Set to 1 for VCO frequency range 80-180MHz, set to 0 for VCO frequency range 160-240Mhz. + + + scif_pll_setup(SCIF_PLL0, opt); // lockcount in main clock for the PLL wait lock + + /* Enable PLL0 */ + scif_pll_enable(SCIF_PLL0); + + /* Wait for PLL0 locked */ + scif_wait_for_pll_locked(SCIF_PLL0) ; + + rest = pll_freq; + while (rest > AVR32_PM_PBA_MAX_FREQ || + rest != param->pba_f) + { + div2_pba++; + rest = pll_freq / (1 << div2_pba); + if (rest < param->pba_f) + break; + } + + // Update real PBA Frequency + param->pba_f = pll_freq / (1 << div2_pba); + + + if (div2_cpu) + { + b_div2_cpu = TRUE; + div2_cpu--; + } + else + b_div2_cpu = FALSE; + + if (div2_pba) + { + b_div2_pba = TRUE; + div2_pba--; + } + else + b_div2_pba = FALSE; + + if (b_div2_cpu == TRUE ) + { + pm_set_clk_domain_div(PM_CLK_DOMAIN_0, (pm_divratio_t) div2_cpu); // CPU + pm_set_clk_domain_div(PM_CLK_DOMAIN_1, (pm_divratio_t) div2_cpu); // HSB + pm_set_clk_domain_div(PM_CLK_DOMAIN_3, (pm_divratio_t) div2_cpu); // PBB + } + if (b_div2_pba == TRUE ) + { + pm_set_clk_domain_div(PM_CLK_DOMAIN_2, (pm_divratio_t) div2_pba); // PBA + pm_set_clk_domain_div(PM_CLK_DOMAIN_4, (pm_divratio_t) div2_pba); // PBC + } + + // Set Flashc Wait State + flashc_set_flash_waitstate_and_readmode(param->cpu_f); + + // Set the main clock source as being PLL0. + pm_set_mclk_source(PM_CLK_SRC_PLL0); + + return PASS; +} +#endif // UC3C device-specific implementation + +long int pcl_switch_to_osc(pcl_osc_t osc, unsigned int fcrystal, unsigned int startup) +{ +#ifndef AVR32_PM_VERSION_RESETVALUE +// Implementation for UC3A, UC3A3, UC3B parts. + if(PCL_OSC0 == osc) + { + // Configure OSC0 in crystal mode, external crystal with a FOSC0 Hz frequency, + // enable the OSC0, set the main clock source as being OSC0. + pm_switch_to_osc0(&AVR32_PM, fcrystal, startup); + } + else + { + return PCL_NOT_SUPPORTED; + } +#else +// Implementation for UC3C, UC3L parts. + #if AVR32_PM_VERSION_RESETVALUE < 0x400 + return PCL_NOT_SUPPORTED; + #else + if(PCL_OSC0 == osc) + { + // Configure OSC0 in crystal mode, external crystal with a fcrystal Hz frequency. + scif_configure_osc_crystalmode(SCIF_OSC0, fcrystal); + // Enable the OSC0 + scif_enable_osc(SCIF_OSC0, startup, true); + // Set the Flash wait state and the speed read mode (depending on the target CPU frequency). +#if UC3L + flashcdw_set_flash_waitstate_and_readmode(fcrystal); +#elif UC3C + flashc_set_flash_waitstate_and_readmode(fcrystal); +#endif + // Set the main clock source as being OSC0. + pm_set_mclk_source(PM_CLK_SRC_OSC0); + } + else + { + return PCL_NOT_SUPPORTED; + } + #endif +#endif + return PASS; +} + +long int pcl_configure_usb_clock(void) +{ +#ifndef AVR32_PM_VERSION_RESETVALUE +// Implementation for UC3A, UC3A3, UC3B parts. + pm_configure_usb_clock(); + return PASS; +#else + #ifdef AVR32_PM_410_H_INCLUDED + const scif_pll_opt_t opt = { + .osc = SCIF_OSC0, // Sel Osc0 or Osc1 + .lockcount = 16, // lockcount in main clock for the PLL wait lock + .div = 1, // DIV=1 in the formula + .mul = 5, // MUL=7 in the formula + .pll_div2 = 1, // pll_div2 Divide the PLL output frequency by 2 (this settings does not change the FVCO value) + .pll_wbwdisable = 0, //pll_wbwdisable 1 Disable the Wide-Bandith Mode (Wide-Bandwith mode allow a faster startup time and out-of-lock time). 0 to enable the Wide-Bandith Mode. + .pll_freq = 1, // Set to 1 for VCO frequency range 80-180MHz, set to 0 for VCO frequency range 160-240Mhz. + }; + + /* Setup PLL1 on Osc0, mul=7 ,no divisor, lockcount=16, ie. 16Mhzx6 = 96MHz output */ + scif_pll_setup(SCIF_PLL1, opt); // lockcount in main clock for the PLL wait lock + + /* Enable PLL1 */ + scif_pll_enable(SCIF_PLL1); + + /* Wait for PLL1 locked */ + scif_wait_for_pll_locked(SCIF_PLL1) ; + + // Implementation for UC3C parts. + // Setup the generic clock for USB + scif_gc_setup(AVR32_SCIF_GCLK_USB, + SCIF_GCCTRL_PLL1, + AVR32_SCIF_GC_NO_DIV_CLOCK, + 0); + // Now enable the generic clock + scif_gc_enable(AVR32_SCIF_GCLK_USB); + return PASS; + #else + return PCL_NOT_SUPPORTED; + #endif +#endif +} + + +#if UC3L +#else +void pcl_write_gplp(unsigned long gplp, unsigned long value) +{ +#ifndef AVR32_PM_VERSION_RESETVALUE +// Implementation for UC3A, UC3A3, UC3B parts. + pm_write_gplp(&AVR32_PM,gplp,value); +#else + scif_write_gplp(gplp,value); +#endif +} + +unsigned long pcl_read_gplp(unsigned long gplp) +{ +#ifndef AVR32_PM_VERSION_RESETVALUE +// Implementation for UC3A, UC3A3, UC3B parts. + return pm_read_gplp(&AVR32_PM,gplp); +#else + return scif_read_gplp(gplp); +#endif +} +#endif diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/power_clocks_lib.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/power_clocks_lib.h new file mode 100644 index 0000000..28c5888 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/power_clocks_lib.h @@ -0,0 +1,379 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file has been prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief High-level library abstracting features such as oscillators/pll/dfll + * configuration, clock configuration, System-sensible parameters + * configuration, buses clocks configuration, sleep mode, reset. + * + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + *****************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _POWER_CLOCKS_LIB_H_ +#define _POWER_CLOCKS_LIB_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "compiler.h" + +#ifndef AVR32_PM_VERSION_RESETVALUE +// Support for UC3A, UC3A3, UC3B parts. + #include "pm.h" +#else +//! Device-specific data +#if UC3L + #include "pm_uc3l.h" + #include "scif_uc3l.h" + #include "flashcdw.h" +#elif UC3C + #include "pm_uc3c.h" + #include "scif_uc3c.h" + #include "flashc.h" +#endif +#endif + +/*! \name Clocks Management + */ +//! @{ + +//! The different oscillators +typedef enum +{ + PCL_OSC0 = 0, + PCL_OSC1 = 1 +} pcl_osc_t; + +//! The different DFLLs +typedef enum +{ + PCL_DFLL0 = 0, + PCL_DFLL1 = 1 +} pcl_dfll_t; + +//! Possible Main Clock Sources +typedef enum +{ + PCL_MC_RCSYS, // Default main clock source, supported by all (aka Slow Clock) + PCL_MC_OSC0, // Supported by all + PCL_MC_OSC1, // Supported by UC3C only + PCL_MC_OSC0_PLL0, // Supported by UC3A, UC3B, UC3A3, UC3C (the main clock source is PLL0 with OSC0 as reference) + PCL_MC_OSC1_PLL0, // Supported by UC3A, UC3B, UC3A3, UC3C (the main clock source is PLL0 with OSC1 as reference) + PCL_MC_OSC0_PLL1, // Supported by UC3C (the main clock source is PLL1 with OSC0 as reference) + PCL_MC_OSC1_PLL1, // Supported by UC3C (the main clock source is PLL1 with OSC1 as reference) + PCL_MC_DFLL0, // Supported by UC3L + PCL_MC_DFLL1, // Not supported yet + PCL_MC_RC120M, // Supported by UC3L, UC3C + PCL_MC_RC8M, // Supported by UC3C + PCL_MC_CRIPOSC // Supported by UC3C +} pcl_mainclk_t; + +//! Input and output parameters to configure clocks with pcl_configure_clocks(). +// NOTE: regarding the frequency settings, always abide by the datasheet rules and min & max supported frequencies. +#ifndef AVR32_PM_VERSION_RESETVALUE +// Support for UC3A, UC3A3, UC3B parts. +#define pcl_freq_param_t pm_freq_param_t // See pm.h +#else +// Support for UC3C, UC3L parts. +typedef struct +{ + //! Main clock source selection (input argument). + pcl_mainclk_t main_clk_src; + + //! Target CPU frequency (input/output argument). + unsigned long cpu_f; + + //! Target PBA frequency (input/output argument). + unsigned long pba_f; + + //! Target PBB frequency (input/output argument). + unsigned long pbb_f; + + //! Target PBC frequency (input/output argument). + unsigned long pbc_f; + + //! Oscillator 0's external crystal(or external clock) frequency (board dependant) (input argument). + unsigned long osc0_f; + + //! Oscillator 0's external crystal(or external clock) startup time: AVR32_PM_OSCCTRL0_STARTUP_x_RCOSC (input argument). + unsigned long osc0_startup; + + //! DFLL target frequency (input/output argument) (NOTE: the bigger, the most stable the frequency) + unsigned long dfll_f; + + //! Other parameters that might be necessary depending on the device (implementation-dependent). + // For the UC3L DFLL setup, this parameter should be pointing to a structure of + // type (scif_gclk_opt_t *). + void *pextra_params; +} pcl_freq_param_t; +#endif + +//! Define "not supported" for the lib. +#define PCL_NOT_SUPPORTED (-10000) + +/*! \brief Automatically configure the CPU, PBA, PBB, and HSB clocks + * + * This function needs some parameters stored in a pcl_freq_param_t structure: + * - main_clk_src is the id of the main clock source to use, + * - cpu_f and pba_f and pbb_f are the wanted frequencies, + * - osc0_f is the oscillator 0's external crystal (or external clock) on-board frequency (e.g. FOSC0), + * - osc0_startup is the oscillator 0's external crystal (or external clock) startup time (e.g. OSC0_STARTUP). + * - dfll_f is the target DFLL frequency to set-up if main_clk_src is the dfll. + * + * The CPU, HSB and PBA frequencies programmed after configuration are stored back into cpu_f and pba_f. + * + * \note: since it is dynamically computing the appropriate field values of the + * configuration registers from the parameters structure, this function is not + * optimal in terms of code size. For a code size optimal solution, it is better + * to create a new function from pcl_configure_clocks() and modify it to use + * preprocessor computation from pre-defined target frequencies. + * + * \param param pointer on the configuration structure. + * + * \retval 0 Success. + * \retval <0 The configuration cannot be performed. + */ +extern long int pcl_configure_clocks(pcl_freq_param_t *param); + +/*! \brief Automatically configure the CPU, PBA, PBB, and HSB clocks using the RCSYS osc as main source clock. + * + * This function needs some parameters stored in a pcl_freq_param_t structure: + * - cpu_f and pba_f and pbb_f are the wanted frequencies + * + * Supported main clock sources: PCL_MC_RCSYS + * + * Supported synchronous clocks frequencies: + * 115200Hz, 57600Hz, 28800Hz, 14400Hz, 7200Hz, 3600Hz, 1800Hz, 900Hz, 450Hz. + * + * \note: by default, this implementation doesn't perform thorough checks on the + * input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. + * + * \note: since it is dynamically computing the appropriate field values of the + * configuration registers from the parameters structure, this function is not + * optimal in terms of code size. For a code size optimal solution, it is better + * to create a new function from pcl_configure_clocks_rcsys() and modify it to use + * preprocessor computation from pre-defined target frequencies. + * + * \param param pointer on the configuration structure. + * + * \retval 0 Success. + * \retval <0 The configuration cannot be performed. + */ +extern long int pcl_configure_clocks_rcsys(pcl_freq_param_t *param); + +/*! \brief Automatically configure the CPU, PBA, PBB, and HSB clocks using the RC120M osc as main source clock. + * + * This function needs some parameters stored in a pcl_freq_param_t structure: + * - cpu_f and pba_f and pbb_f are the wanted frequencies + * + * Supported main clock sources: PCL_MC_RC120M + * + * Supported synchronous clocks frequencies: + * 30MHz, 15MHz, 7.5MHz, 3.75MHz, 1.875MHz, 937.5kHz, 468.75kHz. + * + * \note: by default, this implementation doesn't perform thorough checks on the + * input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. + * + * \note: since it is dynamically computing the appropriate field values of the + * configuration registers from the parameters structure, this function is not + * optimal in terms of code size. For a code size optimal solution, it is better + * to create a new function from pcl_configure_clocks_rc120m() and modify it to + * use preprocessor computation from pre-defined target frequencies. + * + * \param param pointer on the configuration structure. + * + * \retval 0 Success. + * \retval <0 The configuration cannot be performed. + */ +extern long int pcl_configure_clocks_rc120m(pcl_freq_param_t *param); + +/*! \brief Automatically configure the CPU, PBA, PBB, and HSB clocks using the OSC0 osc as main source clock + * + * This function needs some parameters stored in a pcl_freq_param_t structure: + * - cpu_f and pba_f and pbb_f are the wanted frequencies, + * - osc0_f is the oscillator 0's external crystal (or external clock) on-board frequency (e.g. FOSC0), + * - osc0_startup is the oscillator 0's external crystal (or external clock) startup time (e.g. OSC0_STARTUP). + * + * Supported main clock sources: PCL_MC_OSC0 + * + * Supported synchronous clocks frequencies: + * (these obviously depend on the OSC0 frequency; we'll take 16MHz as an example) + * 16MHz, 8MHz, 4MHz, 2MHz, 1MHz, 500kHz, 250kHz, 125kHz, 62.5kHz. + * + * \note: by default, this implementation doesn't perform thorough checks on the + * input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. + * + * \note: since it is dynamically computing the appropriate field values of the + * configuration registers from the parameters structure, this function is not + * optimal in terms of code size. For a code size optimal solution, it is better + * to create a new function from pcl_configure_clocks_osc0() and modify it to use + * preprocessor computation from pre-defined target frequencies. + * + * \param param pointer on the configuration structure. + * + * \retval 0 Success. + * \retval <0 The configuration cannot be performed. + */ +extern long int pcl_configure_clocks_osc0(pcl_freq_param_t *param); + +/*! \brief Automatically configure the CPU, PBA, PBB, and HSB clocks using the DFLL0 as main source clock + * + * This function needs some parameters stored in a pcl_freq_param_t structure: + * - cpu_f and pba_f and pbb_f are the wanted frequencies, + * - dfll_f is the target DFLL frequency to set-up + * + * \note: when the DFLL0 is to be used as main source clock for the synchronous clocks, + * the target frequency of the DFLL should be chosen to be as high as possible + * within the specification range (for stability reasons); the target cpu and pbx + * frequencies will then be reached by appropriate division ratio. + * + * Supported main clock sources: PCL_MC_DFLL0 + * + * Supported synchronous clocks frequencies: + * (these obviously depend on the DFLL target frequency; we'll take 100MHz as an example) + * 50MHz, 25MHz, 12.5MHz, 6.25MHz, 3.125MHz, 1562.5kHz, 781.25kHz, 390.625kHz. + * + * \note: by default, this implementation doesn't perform thorough checks on the + * input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. + * + * \note: since it is dynamically computing the appropriate field values of the + * configuration registers from the parameters structure, this function is not + * optimal in terms of code size. For a code size optimal solution, it is better + * to create a new function from pcl_configure_clocks_dfll0() and modify it to + * use preprocessor computation from pre-defined target frequencies. + * + * \param param pointer on the configuration structure. + * + * \retval 0 Success. + * \retval <0 The configuration cannot be performed. + */ +extern long int pcl_configure_clocks_dfll0(pcl_freq_param_t *param); + +/*! \brief Switch the main clock source to Osc0 configured in crystal mode + * + * \param osc The oscillator to enable and switch to. + * \param fcrystal Oscillator external crystal frequency (Hz) + * \param startup Oscillator startup time. + * + * \return Status. + * \retval 0 Success. + * \retval <0 An error occured. + */ +extern long int pcl_switch_to_osc(pcl_osc_t osc, unsigned int fcrystal, unsigned int startup); + +/*! \brief Enable the clock of a module. + * + * \param module The module to clock (use one of the defines in the part-specific + * header file under "toolchain folder"/avr32/inc(lude)/avr32/; depending on the + * clock domain, look for the sections "CPU clocks", "HSB clocks", "PBx clocks" + * or look in the module section). + * + * \return Status. + * \retval 0 Success. + * \retval <0 An error occured. + */ +#ifndef AVR32_PM_VERSION_RESETVALUE +// Implementation for UC3A, UC3A3, UC3B parts. +#define pcl_enable_module(module) pm_enable_module(&AVR32_PM, module) +#else +// Implementation for UC3C, UC3L parts. +#define pcl_enable_module(module) pm_enable_module(module) +#endif + +/*! \brief Disable the clock of a module. + * + * \param module The module to shut down (use one of the defines in the part-specific + * header file under "toolchain folder"/avr32/inc(lude)/avr32/; depending on the + * clock domain, look for the sections "CPU clocks", "HSB clocks", "PBx clocks" + * or look in the module section). + * + * \return Status. + * \retval 0 Success. + * \retval <0 An error occured. + */ +#ifndef AVR32_PM_VERSION_RESETVALUE +// Implementation for UC3A, UC3A3, UC3B parts. +#define pcl_disable_module(module) pm_disable_module(&AVR32_PM, module) +#else +// Implementation for UC3C, UC3L parts. +#define pcl_disable_module(module) pm_disable_module(module) +#endif + +/*! \brief Configure the USB Clock + * + * + * \return Status. + * \retval 0 Success. + * \retval <0 An error occured. + */ +extern long int pcl_configure_usb_clock(void); + +//! @} + +/*! \name Power Management + */ +//! @{ +/*! + * \brief Read the content of the GPLP registers + * \param gplp GPLP register index (0,1,... depending on the number of GPLP registers for a given part) + * + * \return The content of the chosen GPLP register. + */ +extern unsigned long pcl_read_gplp(unsigned long gplp); + + +/*! + * \brief Write into the GPLP registers + * \param gplp GPLP register index (0,1,... depending on the number of GPLP registers for a given part) + * \param value Value to write + */ +extern void pcl_write_gplp(unsigned long gplp, unsigned long value); + +//! @} + +#ifdef __cplusplus +} +#endif + +#endif // _POWER_CLOCKS_LIB_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/RTC/rtc.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/RTC/rtc.c new file mode 100644 index 0000000..4cbae0f --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/RTC/rtc.c @@ -0,0 +1,213 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief RTC driver for AVR32 UC3. + * + * AVR32 Real Time Counter driver module. + * + * - Compiler: GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with an RTC and a PM module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#include +#include "compiler.h" +#include "pm.h" +#include "rtc.h" + + +int rtc_is_busy(volatile avr32_rtc_t *rtc) +{ + return (rtc->ctrl & AVR32_RTC_CTRL_BUSY_MASK) != 0; +} + + +int rtc_init(volatile avr32_rtc_t *rtc, unsigned char osc_type, unsigned char psel) +{ + // If exit, it means that the configuration has not been set correctly + if (osc_type > (1 << AVR32_RTC_CTRL_CLK32_SIZE) - 1 || + psel > (1 << AVR32_RTC_CTRL_PSEL_SIZE) - 1) + return 0; + + // If we use the 32-kHz oscillator, we have to enable it first + if (osc_type == RTC_OSC_32KHZ) + { + // Select the 32-kHz oscillator crystal + pm_enable_osc32_crystal(&AVR32_PM); + // Enable the 32-kHz clock + pm_enable_clk32_no_wait(&AVR32_PM, AVR32_PM_OSCCTRL32_STARTUP_0_RCOSC); + } + + // Wait until the rtc CTRL register is up-to-date + while (rtc_is_busy(rtc)); + + // Set the new RTC configuration + rtc->ctrl = osc_type << AVR32_RTC_CTRL_CLK32_OFFSET | + psel << AVR32_RTC_CTRL_PSEL_OFFSET | + AVR32_RTC_CTRL_CLKEN_MASK; + + // Wait until write is done + while (rtc_is_busy(rtc)); + + // Set the counter value to 0 + rtc_set_value(rtc, 0x00000000); + // Set the top value to 0xFFFFFFFF + rtc_set_top_value(rtc, 0xFFFFFFFF); + + return 1; +} + + +void rtc_set_value(volatile avr32_rtc_t *rtc, unsigned long val) +{ + // Wait until we can write into the VAL register + while (rtc_is_busy(rtc)); + // Set the new val value + rtc->val = val; + // Wait until write is done + while (rtc_is_busy(rtc)); +} + + +unsigned long rtc_get_value(volatile avr32_rtc_t *rtc) +{ + return rtc->val; +} + + +void rtc_enable_wake_up(volatile avr32_rtc_t *rtc) +{ + // Wait until the rtc CTRL register is up-to-date + while (rtc_is_busy(rtc)); + // Enable the wake up of the RTC + rtc->ctrl |= AVR32_RTC_CTRL_WAKE_EN_MASK; + // Wait until write is done + while (rtc_is_busy(rtc)); +} + + +void rtc_disable_wake_up(volatile avr32_rtc_t *rtc) +{ + // Wait until the rtc CTRL register is up-to-date + while (rtc_is_busy(rtc)); + // Disable the wake up of the RTC + rtc->ctrl &= ~AVR32_RTC_CTRL_WAKE_EN_MASK; + // Wait until write is done + while (rtc_is_busy(rtc)); +} + + +void rtc_enable(volatile avr32_rtc_t *rtc) +{ + // Wait until the rtc CTRL register is up-to-date + while (rtc_is_busy(rtc)); + // Enable the RTC + rtc->ctrl |= AVR32_RTC_CTRL_EN_MASK; + // Wait until write is done + while (rtc_is_busy(rtc)); +} + + +void rtc_disable(volatile avr32_rtc_t *rtc) +{ + // Wait until the rtc CTRL register is up-to-date + while (rtc_is_busy(rtc)); + // Disable the RTC + rtc->ctrl &= ~AVR32_RTC_CTRL_EN_MASK; + // Wait until write is done + while (rtc_is_busy(rtc)); +} + + +void rtc_enable_interrupt(volatile avr32_rtc_t *rtc) +{ + rtc->ier = AVR32_RTC_IER_TOPI_MASK; +} + + +void rtc_disable_interrupt(volatile avr32_rtc_t *rtc) +{ + Bool global_interrupt_enabled = Is_global_interrupt_enabled(); + + if (global_interrupt_enabled) Disable_global_interrupt(); + rtc->idr = AVR32_RTC_IDR_TOPI_MASK; + rtc->imr; + if (global_interrupt_enabled) Enable_global_interrupt(); +} + + +void rtc_clear_interrupt(volatile avr32_rtc_t *rtc) +{ + Bool global_interrupt_enabled = Is_global_interrupt_enabled(); + + if (global_interrupt_enabled) Disable_global_interrupt(); + rtc->icr = AVR32_RTC_ICR_TOPI_MASK; + rtc->isr; + if (global_interrupt_enabled) Enable_global_interrupt(); +} + + +void rtc_set_top_value(volatile avr32_rtc_t *rtc, unsigned long top) +{ + // Wait until we can write into the VAL register + while (rtc_is_busy(rtc)); + // Set the new val value + rtc->top = top; + // Wait until write is done + while (rtc_is_busy(rtc)); +} + + +unsigned long rtc_get_top_value(volatile avr32_rtc_t *rtc) +{ + return rtc->top; +} + + +int rtc_interrupt_enabled(volatile avr32_rtc_t *rtc) +{ + return (rtc->imr & AVR32_RTC_IMR_TOPI_MASK) != 0; +} + + +int rtc_is_interrupt(volatile avr32_rtc_t *rtc) +{ + return (rtc->isr & AVR32_RTC_ISR_TOPI_MASK) != 0; +} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/RTC/rtc.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/RTC/rtc.h new file mode 100644 index 0000000..5702c29 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/RTC/rtc.h @@ -0,0 +1,191 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief RTC driver for AVR32 UC3. + * + * AVR32 Real Time Counter driver module. + * + * - Compiler: GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with an RTC and a PM module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _RTC_H_ +#define _RTC_H_ + +#include "compiler.h" +#include + + +/*! \name Oscillator Types + */ +//! @{ +#define RTC_OSC_32KHZ 1 +#define RTC_OSC_RC 0 +//! @} + +/*! \name Predefined PSEL Values + */ +//! @{ + +//! The PSEL value to set the RTC source clock (after the prescaler) to 1 Hz, +//! when using an external 32-kHz crystal. +#define RTC_PSEL_32KHZ_1HZ 14 + +//! The PSEL value to set the RTC source clock (after the prescaler) to 1.76 Hz, +//! when using the internal RC oscillator (~ 115 kHz). +#define RTC_PSEL_RC_1_76HZ 15 + +//! @} + + +/*! + * \brief This function will initialise the RTC module. + * If you use the 32 KHz oscillator, it will enable this module. + * This function also set the top value of the RTC to 0xFFFFFFFF + * and the value to 0. + * \param rtc Base address of the RTC (i.e. &AVR32_RTC). + * \param osc_type The oscillator you want to use. If you need a better + * accuracy, use the 32 KHz oscillator (i.e. RTC_OSC_32KHZ). + * \param psel The preselector value for the corresponding oscillator (4-bits). + * To obtain this value, you can use this formula: + * psel = log(Fosc/Frtc)/log(2)-1, where Fosc is the frequency of the + * oscillator you are using (32 KHz or 115 KHz) and Frtc the frequency + * desired. + * \return 1 if the initialisation succeds otherwize it will return 0. + */ +extern int rtc_init(volatile avr32_rtc_t *rtc, unsigned char osc_type, unsigned char psel); + +/*! + * \brief Enable the RTC. + * \param rtc Base address of the RTC (i.e. &AVR32_RTC). + */ +extern void rtc_enable(volatile avr32_rtc_t *rtc); + +/*! + * \brief Disable the RTC. + * \param rtc Base address of the RTC (i.e. &AVR32_RTC). + */ +extern void rtc_disable(volatile avr32_rtc_t *rtc); + +/*! + * \brief Enable the wake up feature of the RTC. + * \param rtc Base address of the RTC (i.e. &AVR32_RTC). + */ +extern void rtc_enable_wake_up(volatile avr32_rtc_t *rtc); + +/*! + * \brief Disable the wake up feature of the RTC. + * \param rtc Base address of the RTC (i.e. &AVR32_RTC). + */ +extern void rtc_disable_wake_up(volatile avr32_rtc_t *rtc); + +/*! + * \brief Enable the interrupt feature of the RTC. + * An interrupt is raised when the value of the RTC + * is equal to its top value. + * \param rtc Base address of the RTC (i.e. &AVR32_RTC). + */ +extern void rtc_enable_interrupt(volatile avr32_rtc_t *rtc); + +/*! + * \brief Disable the interrupt feature of the RTC. + * \param rtc Base address of the RTC (i.e. &AVR32_RTC). + */ +extern void rtc_disable_interrupt(volatile avr32_rtc_t *rtc); + +/*! + * \brief Clear the interrupt flag. + * Call this function once you handled the interrupt. + * \param rtc Base address of the RTC (i.e. &AVR32_RTC). + */ +extern void rtc_clear_interrupt(volatile avr32_rtc_t *rtc); + +/*! + * \brief Get the status of interrupts. + * \param rtc Base address of the RTC (i.e. &AVR32_RTC). + * \return 1 if the interrupts are enabled otherwize it returns 0. + */ +extern int rtc_interrupt_enabled(volatile avr32_rtc_t *rtc); + +/*! + * \brief Check if an interrupt is raised. + * \param rtc Base address of the RTC (i.e. &AVR32_RTC). + * \return 1 if an interrupt is currently raised otherwize it returns 0. + */ +extern int rtc_is_interrupt(volatile avr32_rtc_t *rtc); + +/*! + * \brief This function sets the RTC current top value. + * \param rtc Base address of the RTC (i.e. &AVR32_RTC). + * \param top The top value you want to store. + */ +extern void rtc_set_top_value(volatile avr32_rtc_t *rtc, unsigned long top); + +/*! + * \brief This function returns the RTC current top value. + * \param rtc Base address of the RTC (i.e. &AVR32_RTC). + * \return The RTC current top value. + */ +extern unsigned long rtc_get_top_value(volatile avr32_rtc_t *rtc); + +/*! + * \brief This function checks if the RTC is busy or not. + * \param rtc Base address of the RTC (i.e. &AVR32_RTC). + * \return 1 if the RTC is busy otherwize it will return 0. + */ +extern int rtc_is_busy(volatile avr32_rtc_t *rtc); + +/*! + * \brief This function sets the RTC current value. + * \param rtc Base address of the RTC (i.e. &AVR32_RTC). + * \param val The value you want to store. + */ +extern void rtc_set_value(volatile avr32_rtc_t *rtc, unsigned long val); + +/*! + * \brief This function returns the RTC current value. + * \param rtc Base address of the RTC (i.e. &AVR32_RTC). + * \return The RTC current value. + */ +extern unsigned long rtc_get_value(volatile avr32_rtc_t *rtc); + + +#endif // _RTC_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/SPI/spi.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/SPI/spi.c new file mode 100644 index 0000000..d2b7ccd --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/SPI/spi.c @@ -0,0 +1,443 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief SPI driver for AVR32 UC3. + * + * This file defines a useful set of functions for the SPI interface on AVR32 + * devices. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with an SPI module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#include "spi.h" + +#ifdef FREERTOS_USED + +#include "FreeRTOS.h" +#include "semphr.h" + +#endif + + +/*! \name SPI Writable Bit-Field Registers + */ +//! @{ + +typedef union +{ + unsigned long cr; + avr32_spi_cr_t CR; +} u_avr32_spi_cr_t; + +typedef union +{ + unsigned long mr; + avr32_spi_mr_t MR; +} u_avr32_spi_mr_t; + +typedef union +{ + unsigned long tdr; + avr32_spi_tdr_t TDR; +} u_avr32_spi_tdr_t; + +typedef union +{ + unsigned long ier; + avr32_spi_ier_t IER; +} u_avr32_spi_ier_t; + +typedef union +{ + unsigned long idr; + avr32_spi_idr_t IDR; +} u_avr32_spi_idr_t; + +typedef union +{ + unsigned long csr; + avr32_spi_csr0_t CSR; +} u_avr32_spi_csr_t; + +//! @} + + +#ifdef FREERTOS_USED + +//! The SPI mutex. +static xSemaphoreHandle xSPIMutex; + +#endif + + +/*! \brief Calculates the baudrate divider. + * + * \param options Pointer to a structure containing initialization options for + * an SPI channel. + * \param pba_hz SPI module input clock frequency (PBA clock, Hz). + * + * \return Divider or error code. + * \retval >=0 Success. + * \retval <0 Error. + */ +static int getBaudDiv(const spi_options_t *options, unsigned int pba_hz) +{ + int baudDiv = (pba_hz + options->baudrate / 2) / options->baudrate; + + if (baudDiv <= 0 || baudDiv > 255) { + return -1; + } + + return baudDiv; +} + + +void spi_reset(volatile avr32_spi_t *spi) +{ + spi->cr = AVR32_SPI_CR_SWRST_MASK; +} + + +spi_status_t spi_initSlave(volatile avr32_spi_t *spi, + unsigned char bits, + unsigned char spi_mode) +{ + if (spi_mode > 3 || + bits < 8 || bits > 16) { + return SPI_ERROR_ARGUMENT; + } + + // Reset. + spi->cr = AVR32_SPI_CR_SWRST_MASK; + + // Will use CSR0 offsets; these are the same for CSR0 to CSR3. + spi->csr0 = ((spi_mode >> 1) << AVR32_SPI_CSR0_CPOL_OFFSET) | + (((spi_mode & 0x1) ^ 0x1) << AVR32_SPI_CSR0_NCPHA_OFFSET) | + ((bits - 8) << AVR32_SPI_CSR0_BITS_OFFSET); + + return SPI_OK; +} + + +spi_status_t spi_initTest(volatile avr32_spi_t *spi) +{ + // Reset. + spi->cr = AVR32_SPI_CR_SWRST_MASK; + spi->mr |= AVR32_SPI_MR_MSTR_MASK | // Master Mode. + AVR32_SPI_MR_LLB_MASK; // Local Loopback. + + return SPI_OK; +} + + +spi_status_t spi_initMaster(volatile avr32_spi_t *spi, const spi_options_t *options) +{ + u_avr32_spi_mr_t u_avr32_spi_mr; + + if (options->modfdis > 1) { + return SPI_ERROR_ARGUMENT; + } + + // Reset. + spi->cr = AVR32_SPI_CR_SWRST_MASK; + + // Master Mode. + u_avr32_spi_mr.mr = spi->mr; + u_avr32_spi_mr.MR.mstr = 1; + u_avr32_spi_mr.MR.modfdis = options->modfdis; + u_avr32_spi_mr.MR.llb = 0; + u_avr32_spi_mr.MR.pcs = (1 << AVR32_SPI_MR_PCS_SIZE) - 1; + spi->mr = u_avr32_spi_mr.mr; + + return SPI_OK; +} + + +spi_status_t spi_selectionMode(volatile avr32_spi_t *spi, + unsigned char variable_ps, + unsigned char pcs_decode, + unsigned char delay) +{ + u_avr32_spi_mr_t u_avr32_spi_mr; + + if (variable_ps > 1 || + pcs_decode > 1) { + return SPI_ERROR_ARGUMENT; + } + + u_avr32_spi_mr.mr = spi->mr; + u_avr32_spi_mr.MR.ps = variable_ps; + u_avr32_spi_mr.MR.pcsdec = pcs_decode; + u_avr32_spi_mr.MR.dlybcs = delay; + spi->mr = u_avr32_spi_mr.mr; + + return SPI_OK; +} + + +spi_status_t spi_selectChip(volatile avr32_spi_t *spi, unsigned char chip) +{ +#ifdef FREERTOS_USED + while (pdFALSE == xSemaphoreTake(xSPIMutex, 20)); +#endif + + // Assert all lines; no peripheral is selected. + spi->mr |= AVR32_SPI_MR_PCS_MASK; + + if (spi->mr & AVR32_SPI_MR_PCSDEC_MASK) { + // The signal is decoded; allow up to 15 chips. + if (chip > 14) { + return SPI_ERROR_ARGUMENT; + } + + spi->mr &= ~AVR32_SPI_MR_PCS_MASK | (chip << AVR32_SPI_MR_PCS_OFFSET); + } else { + if (chip > 3) { + return SPI_ERROR_ARGUMENT; + } + + spi->mr &= ~(1 << (AVR32_SPI_MR_PCS_OFFSET + chip)); + } + + return SPI_OK; +} + + +spi_status_t spi_unselectChip(volatile avr32_spi_t *spi, unsigned char chip) +{ + unsigned int timeout = SPI_TIMEOUT; + + while (!(spi->sr & AVR32_SPI_SR_TXEMPTY_MASK)) { + if (!timeout--) { + return SPI_ERROR_TIMEOUT; + } + } + + // Assert all lines; no peripheral is selected. + spi->mr |= AVR32_SPI_MR_PCS_MASK; + + // Last transfer, so deassert the current NPCS if CSAAT is set. + spi->cr = AVR32_SPI_CR_LASTXFER_MASK; + +#ifdef FREERTOS_USED + xSemaphoreGive(xSPIMutex); +#endif + + return SPI_OK; +} + + +spi_status_t spi_setupChipReg(volatile avr32_spi_t *spi, + const spi_options_t *options, + unsigned int pba_hz) +{ + u_avr32_spi_csr_t u_avr32_spi_csr; + + if (options->spi_mode > 3 || + options->stay_act > 1 || + options->bits < 8 || options->bits > 16) { + return SPI_ERROR_ARGUMENT; + } + + int baudDiv = getBaudDiv(options, pba_hz); + + if (baudDiv < 0) { + return SPI_ERROR_ARGUMENT; + } + + // Will use CSR0 offsets; these are the same for CSR0 to CSR3. + u_avr32_spi_csr.csr = 0; + u_avr32_spi_csr.CSR.cpol = options->spi_mode >> 1; + u_avr32_spi_csr.CSR.ncpha = (options->spi_mode & 0x1) ^ 0x1; + u_avr32_spi_csr.CSR.csaat = options->stay_act; + u_avr32_spi_csr.CSR.bits = options->bits - 8; + u_avr32_spi_csr.CSR.scbr = baudDiv; + u_avr32_spi_csr.CSR.dlybs = options->spck_delay; + u_avr32_spi_csr.CSR.dlybct = options->trans_delay; + + switch(options->reg) { + case 0: + spi->csr0 = u_avr32_spi_csr.csr; + break; + case 1: + spi->csr1 = u_avr32_spi_csr.csr; + break; + case 2: + spi->csr2 = u_avr32_spi_csr.csr; + break; + case 3: + spi->csr3 = u_avr32_spi_csr.csr; + break; + default: + return SPI_ERROR_ARGUMENT; + } + +#ifdef FREERTOS_USED + if (!xSPIMutex) + { + // Create the SPI mutex. + vSemaphoreCreateBinary(xSPIMutex); + if (!xSPIMutex) + { + while(1); + } + } +#endif + + return SPI_OK; +} + + +void spi_enable(volatile avr32_spi_t *spi) +{ + spi->cr = AVR32_SPI_CR_SPIEN_MASK; +} + + +void spi_disable(volatile avr32_spi_t *spi) +{ + spi->cr = AVR32_SPI_CR_SPIDIS_MASK; +} + + +int spi_is_enabled(volatile avr32_spi_t *spi) +{ + return (spi->sr & AVR32_SPI_SR_SPIENS_MASK) != 0; +} + + +inline unsigned char spi_writeRegisterEmptyCheck(volatile avr32_spi_t *spi) +{ + return ((spi->sr & AVR32_SPI_SR_TDRE_MASK) != 0); +} + + +inline spi_status_t spi_write(volatile avr32_spi_t *spi, unsigned short data) +{ + unsigned int timeout = SPI_TIMEOUT; + + while (!(spi->sr & AVR32_SPI_SR_TDRE_MASK)) { + if (!timeout--) { + return SPI_ERROR_TIMEOUT; + } + } + + spi->tdr = data << AVR32_SPI_TDR_TD_OFFSET; + + return SPI_OK; +} + + +spi_status_t spi_variableSlaveWrite(volatile avr32_spi_t *spi, unsigned short data, + unsigned char pcs, unsigned char lastxfer) +{ + unsigned int timeout = SPI_TIMEOUT; + + if (pcs > 14 || lastxfer > 1) { + return SPI_ERROR_ARGUMENT; + } + + while (!(spi->sr & AVR32_SPI_SR_TDRE_MASK)) { + if (!timeout--) { + return SPI_ERROR_TIMEOUT; + } + } + + spi->tdr = (data << AVR32_SPI_TDR_TD_OFFSET) | + (pcs << AVR32_SPI_TDR_PCS_OFFSET) | + (lastxfer << AVR32_SPI_TDR_LASTXFER_OFFSET); + + return SPI_OK; +} + + +inline unsigned char spi_writeEndCheck(volatile avr32_spi_t *spi) +{ + return ((spi->sr & AVR32_SPI_SR_TXEMPTY_MASK) != 0); +} + + +unsigned char spi_readRegisterFullCheck(volatile avr32_spi_t *spi) +{ + return ((spi->sr & AVR32_SPI_SR_RDRF_MASK) != 0); +} + + +inline spi_status_t spi_read(volatile avr32_spi_t *spi, unsigned short *data) +{ + unsigned int timeout = SPI_TIMEOUT; + + while ((spi->sr & (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK)) != + (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK)) { + if (!timeout--) { + return SPI_ERROR_TIMEOUT; + } + } + + *data = spi->rdr >> AVR32_SPI_RDR_RD_OFFSET; + + return SPI_OK; +} + + +unsigned char spi_getStatus(volatile avr32_spi_t *spi) +{ + spi_status_t ret = SPI_OK; + unsigned long sr = spi->sr; + + if (sr & AVR32_SPI_SR_OVRES_MASK) { + ret = SPI_ERROR_OVERRUN; + } + + if (sr & AVR32_SPI_SR_MODF_MASK) { + ret += SPI_ERROR_MODE_FAULT; + } + + if (ret == (SPI_ERROR_OVERRUN + SPI_ERROR_MODE_FAULT)) { + return SPI_ERROR_OVERRUN_AND_MODE_FAULT; + } + else if (ret > 0) { + return ret; + } else { + return SPI_OK; + } +} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/SPI/spi.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/SPI/spi.h new file mode 100644 index 0000000..6dcc928 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/SPI/spi.h @@ -0,0 +1,342 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief SPI driver for AVR32 UC3. + * + * This file defines a useful set of functions for the SPI interface on AVR32 + * devices. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with an SPI module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _SPI_H_ +#define _SPI_H_ + +#include + + +//! Time-out value (number of attempts). +#define SPI_TIMEOUT 10000 + + +//! Status codes used by the SPI driver. +typedef enum +{ + SPI_ERROR = -1, + SPI_OK = 0, + SPI_ERROR_TIMEOUT = 1, + SPI_ERROR_ARGUMENT, + SPI_ERROR_OVERRUN, + SPI_ERROR_MODE_FAULT, + SPI_ERROR_OVERRUN_AND_MODE_FAULT +} spi_status_t; + +//! Option structure for SPI channels. +typedef struct +{ + //! The SPI channel to set up. + unsigned char reg; + + //! Preferred baudrate for the SPI. + unsigned int baudrate; + + //! Number of bits in each character (8 to 16). + unsigned char bits; + + //! Delay before first clock pulse after selecting slave (in PBA clock periods). + unsigned char spck_delay; + + //! Delay between each transfer/character (in PBA clock periods). + unsigned char trans_delay; + + //! Sets this chip to stay active after last transfer to it. + unsigned char stay_act; + + //! Which SPI mode to use when transmitting. + unsigned char spi_mode; + + //! Disables the mode fault detection. + //! With this bit cleared, the SPI master mode will disable itself if another + //! master tries to address it. + unsigned char modfdis; +} spi_options_t; + + +/*! \brief Resets the SPI controller. + * + * \param spi Base address of the SPI instance. + */ +extern void spi_reset(volatile avr32_spi_t *spi); + +/*! \brief Initializes the SPI in slave mode. + * + * \param spi Base address of the SPI instance. + * \param bits Number of bits in each transmitted character (8 to 16). + * \param spi_mode Clock polarity and phase. + * + * \return Status. + * \retval SPI_OK Success. + * \retval SPI_ERROR_ARGUMENT Invalid argument(s) passed. + */ +extern spi_status_t spi_initSlave(volatile avr32_spi_t *spi, + unsigned char bits, + unsigned char spi_mode); + +/*! \brief Sets up the SPI in a test mode where the transmitter is connected to + * the receiver (local loopback). + * + * \param spi Base address of the SPI instance. + * + * \return Status. + * \retval SPI_OK Success. + */ +extern spi_status_t spi_initTest(volatile avr32_spi_t *spi); + +/*! \brief Initializes the SPI in master mode. + * + * \param spi Base address of the SPI instance. + * \param options Pointer to a structure containing initialization options. + * + * \return Status. + * \retval SPI_OK Success. + * \retval SPI_ERROR_ARGUMENT Invalid argument(s) passed. + */ +extern spi_status_t spi_initMaster(volatile avr32_spi_t *spi, const spi_options_t *options); + +/*! \brief Sets up how and when the slave chips are selected (master mode only). + * + * \param spi Base address of the SPI instance. + * \param variable_ps Target slave is selected in transfer register for every + * character to transmit. + * \param pcs_decode The four chip select lines are decoded externally. Values + * 0 to 14 can be given to \ref spi_selectChip. + * \param delay Delay in PBA periods between chip selects. + * + * \return Status. + * \retval SPI_OK Success. + * \retval SPI_ERROR_ARGUMENT Invalid argument(s) passed. + */ +extern spi_status_t spi_selectionMode(volatile avr32_spi_t *spi, + unsigned char variable_ps, + unsigned char pcs_decode, + unsigned char delay); + +/*! \brief Selects slave chip. + * + * \param spi Base address of the SPI instance. + * \param chip Slave chip number (normal: 0 to 3, extarnally decoded signal: 0 + * to 14). + * + * \return Status. + * \retval SPI_OK Success. + * \retval SPI_ERROR_ARGUMENT Invalid argument(s) passed. + */ +extern spi_status_t spi_selectChip(volatile avr32_spi_t *spi, unsigned char chip); + +/*! \brief Unselects slave chip. + * + * \param spi Base address of the SPI instance. + * \param chip Slave chip number (normal: 0 to 3, extarnally decoded signal: 0 + * to 14). + * + * \return Status. + * \retval SPI_OK Success. + * \retval SPI_ERROR_TIMEOUT Time-out. + * + * \note Will block program execution until time-out occurs if last transmission + * is not complete. Invoke \ref spi_writeEndCheck beforehand if needed. + */ +extern spi_status_t spi_unselectChip(volatile avr32_spi_t *spi, unsigned char chip); + +/*! \brief Sets options for a specific slave chip. + * + * The baudrate field has to be written before transfer in master mode. Four + * similar registers exist, one for each slave. When using encoded slave + * addressing, reg=0 sets options for slaves 0 to 3, reg=1 for slaves 4 to 7 and + * so on. + * + * \param spi Base address of the SPI instance. + * \param options Pointer to a structure containing initialization options for + * an SPI channel. + * \param pba_hz SPI module input clock frequency (PBA clock, Hz). + * + * \return Status. + * \retval SPI_OK Success. + * \retval SPI_ERROR_ARGUMENT Invalid argument(s) passed. + */ +extern spi_status_t spi_setupChipReg(volatile avr32_spi_t *spi, + const spi_options_t *options, + unsigned int pba_hz); + +/*! \brief Enables the SPI. + * + * \param spi Base address of the SPI instance. + */ +extern void spi_enable(volatile avr32_spi_t *spi); + +/*! \brief Disables the SPI. + * + * Ensures that nothing is transferred while setting up buffers. + * + * \param spi Base address of the SPI instance. + * + * \warning This may cause data loss if used on a slave SPI. + */ +extern void spi_disable(volatile avr32_spi_t *spi); + +/*! \brief Tests if the SPI is enabled. + * + * \param spi Base address of the SPI instance. + * + * \return \c 1 if the SPI is enabled, otherwise \c 0. + */ +extern int spi_is_enabled(volatile avr32_spi_t *spi); + +/*! \brief Checks if there is no data in the transmit register. + * + * \param spi Base address of the SPI instance. + * + * \return Status. + * \retval 1 No data in TDR. + * \retval 0 Some data in TDR. + */ +extern unsigned char spi_writeRegisterEmptyCheck(volatile avr32_spi_t *spi); + +/*! \brief Writes one data word in master fixed peripheral select mode or in + * slave mode. + * + * \param spi Base address of the SPI instance. + * \param data The data word to write. + * + * \return Status. + * \retval SPI_OK Success. + * \retval SPI_ERROR_TIMEOUT Time-out. + * + * \note Will block program execution until time-out occurs if transmitter is + * busy and transmit buffer is full. Invoke + * \ref spi_writeRegisterEmptyCheck beforehand if needed. + * + * \note Once the data has been written to the transmit buffer, the end of + * transmission is not waited for. Invoke \ref spi_writeEndCheck if + * needed. + */ +extern spi_status_t spi_write(volatile avr32_spi_t *spi, unsigned short data); + +/*! \brief Selects a slave in master variable peripheral select mode and writes + * one data word to it. + * + * \param spi Base address of the SPI instance. + * \param data The data word to write. + * \param pcs Slave selector (bit 0 -> nCS line 0, bit 1 -> nCS line 1, + * etc.). + * \param lastxfer Boolean indicating whether this is the last data word + * transfer. + * + * \return Status. + * \retval SPI_OK Success. + * \retval SPI_ERROR_TIMEOUT Time-out. + * \retval SPI_ERROR_ARGUMENT Invalid argument(s) passed. + * + * \note Will block program execution until time-out occurs if transmitter is + * busy and transmit buffer is full. Invoke + * \ref spi_writeRegisterEmptyCheck beforehand if needed. + * + * \note Once the data has been written to the transmit buffer, the end of + * transmission is not waited for. Invoke \ref spi_writeEndCheck if + * needed. + */ +extern spi_status_t spi_variableSlaveWrite(volatile avr32_spi_t *spi, + unsigned short data, + unsigned char pcs, + unsigned char lastxfer); + +/*! \brief Checks if all transmissions are complete. + * + * \param spi Base address of the SPI instance. + * + * \return Status. + * \retval 1 All transmissions complete. + * \retval 0 Transmissions not complete. + */ +extern unsigned char spi_writeEndCheck(volatile avr32_spi_t *spi); + +/*! \brief Checks if there is data in the receive register. + * + * \param spi Base address of the SPI instance. + * + * \return Status. + * \retval 1 Some data in RDR. + * \retval 0 No data in RDR. + */ +extern unsigned char spi_readRegisterFullCheck(volatile avr32_spi_t *spi); + +/*! \brief Reads one data word in master mode or in slave mode. + * + * \param spi Base address of the SPI instance. + * \param data Pointer to the location where to store the received data word. + * + * \return Status. + * \retval SPI_OK Success. + * \retval SPI_ERROR_TIMEOUT Time-out. + * + * \note Will block program execution until time-out occurs if no data is + * received or last transmission is not complete. Invoke + * \ref spi_writeEndCheck or \ref spi_readRegisterFullCheck beforehand if + * needed. + */ +extern spi_status_t spi_read(volatile avr32_spi_t *spi, unsigned short *data); + +/*! \brief Gets status information from the SPI. + * + * \param spi Base address of the SPI instance. + * + * \return Status. + * \retval SPI_OK Success. + * \retval SPI_ERROR_OVERRUN Overrun error. + * \retval SPI_ERROR_MODE_FAULT Mode fault (SPI addressed as slave + * while in master mode). + * \retval SPI_ERROR_OVERRUN_AND_MODE_FAULT Overrun error and mode fault. + */ +extern unsigned char spi_getStatus(volatile avr32_spi_t *spi); + + +#endif // _SPI_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/TC/tc.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/TC/tc.c new file mode 100644 index 0000000..225642e --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/TC/tc.c @@ -0,0 +1,314 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief TC driver for AVR32 UC3. + * + * AVR32 Timer/Counter driver module. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with a TC module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#include +#include "compiler.h" +#include "tc.h" + + +int tc_get_interrupt_settings(volatile avr32_tc_t *tc, unsigned int channel) +{ + // Check for valid input. + if (channel >= TC_NUMBER_OF_CHANNELS) + return TC_INVALID_ARGUMENT; + + return tc->channel[channel].imr; +} + + +int tc_configure_interrupts(volatile avr32_tc_t *tc, unsigned int channel, const tc_interrupt_t *bitfield) +{ + Bool global_interrupt_enabled = Is_global_interrupt_enabled(); + + // Check for valid input. + if (channel >= TC_NUMBER_OF_CHANNELS) + return TC_INVALID_ARGUMENT; + + // Enable the appropriate interrupts. + tc->channel[channel].ier = bitfield->etrgs << AVR32_TC_ETRGS_OFFSET | + bitfield->ldrbs << AVR32_TC_LDRBS_OFFSET | + bitfield->ldras << AVR32_TC_LDRAS_OFFSET | + bitfield->cpcs << AVR32_TC_CPCS_OFFSET | + bitfield->cpbs << AVR32_TC_CPBS_OFFSET | + bitfield->cpas << AVR32_TC_CPAS_OFFSET | + bitfield->lovrs << AVR32_TC_LOVRS_OFFSET | + bitfield->covfs << AVR32_TC_COVFS_OFFSET; + + // Disable the appropriate interrupts. + if (global_interrupt_enabled) Disable_global_interrupt(); + tc->channel[channel].idr = (~bitfield->etrgs & 1) << AVR32_TC_ETRGS_OFFSET | + (~bitfield->ldrbs & 1) << AVR32_TC_LDRBS_OFFSET | + (~bitfield->ldras & 1) << AVR32_TC_LDRAS_OFFSET | + (~bitfield->cpcs & 1) << AVR32_TC_CPCS_OFFSET | + (~bitfield->cpbs & 1) << AVR32_TC_CPBS_OFFSET | + (~bitfield->cpas & 1) << AVR32_TC_CPAS_OFFSET | + (~bitfield->lovrs & 1) << AVR32_TC_LOVRS_OFFSET | + (~bitfield->covfs & 1) << AVR32_TC_COVFS_OFFSET; + tc->channel[channel].sr; + if (global_interrupt_enabled) Enable_global_interrupt(); + + return 0; +} + + +int tc_select_external_clock(volatile avr32_tc_t *tc, unsigned int channel, unsigned int ext_clk_sig_src) +{ + // Check for valid input. + if (channel >= TC_NUMBER_OF_CHANNELS || ext_clk_sig_src >= 1 << AVR32_TC_BMR_TC0XC0S_SIZE) + return TC_INVALID_ARGUMENT; + + // Clear bit-field and set the correct behavior. + tc->bmr = (tc->bmr & ~(AVR32_TC_BMR_TC0XC0S_MASK << (channel * AVR32_TC_BMR_TC0XC0S_SIZE))) | + (ext_clk_sig_src << (channel * AVR32_TC_BMR_TC0XC0S_SIZE)); + + return 0; +} + + +int tc_init_capture(volatile avr32_tc_t *tc, const tc_capture_opt_t *opt) +{ + // Check for valid input. + if (opt->channel >= TC_NUMBER_OF_CHANNELS) + return TC_INVALID_ARGUMENT; + + // MEASURE SIGNALS: Capture operating mode. + tc->channel[opt->channel].cmr = opt->ldrb << AVR32_TC_LDRB_OFFSET | + opt->ldra << AVR32_TC_LDRA_OFFSET | + 0 << AVR32_TC_WAVE_OFFSET | + opt->cpctrg << AVR32_TC_CPCTRG_OFFSET | + opt->abetrg << AVR32_TC_ABETRG_OFFSET | + opt->etrgedg << AVR32_TC_ETRGEDG_OFFSET| + opt->ldbdis << AVR32_TC_LDBDIS_OFFSET | + opt->ldbstop << AVR32_TC_LDBSTOP_OFFSET | + opt->burst << AVR32_TC_BURST_OFFSET | + opt->clki << AVR32_TC_CLKI_OFFSET | + opt->tcclks << AVR32_TC_TCCLKS_OFFSET; + + return 0; +} + + +int tc_init_waveform(volatile avr32_tc_t *tc, const tc_waveform_opt_t *opt) +{ + // Check for valid input. + if (opt->channel >= TC_NUMBER_OF_CHANNELS) + return TC_INVALID_ARGUMENT; + + // GENERATE SIGNALS: Waveform operating mode. + tc->channel[opt->channel].cmr = opt->bswtrg << AVR32_TC_BSWTRG_OFFSET | + opt->beevt << AVR32_TC_BEEVT_OFFSET | + opt->bcpc << AVR32_TC_BCPC_OFFSET | + opt->bcpb << AVR32_TC_BCPB_OFFSET | + opt->aswtrg << AVR32_TC_ASWTRG_OFFSET | + opt->aeevt << AVR32_TC_AEEVT_OFFSET | + opt->acpc << AVR32_TC_ACPC_OFFSET | + opt->acpa << AVR32_TC_ACPA_OFFSET | + 1 << AVR32_TC_WAVE_OFFSET | + opt->wavsel << AVR32_TC_WAVSEL_OFFSET | + opt->enetrg << AVR32_TC_ENETRG_OFFSET | + opt->eevt << AVR32_TC_EEVT_OFFSET | + opt->eevtedg << AVR32_TC_EEVTEDG_OFFSET | + opt->cpcdis << AVR32_TC_CPCDIS_OFFSET | + opt->cpcstop << AVR32_TC_CPCSTOP_OFFSET | + opt->burst << AVR32_TC_BURST_OFFSET | + opt->clki << AVR32_TC_CLKI_OFFSET | + opt->tcclks << AVR32_TC_TCCLKS_OFFSET; + + return 0; +} + + +int tc_start(volatile avr32_tc_t *tc, unsigned int channel) +{ + // Check for valid input. + if (channel >= TC_NUMBER_OF_CHANNELS) + return TC_INVALID_ARGUMENT; + + // Enable, reset and start the selected timer/counter channel. + tc->channel[channel].ccr = AVR32_TC_SWTRG_MASK | AVR32_TC_CLKEN_MASK; + + return 0; +} + + +int tc_stop(volatile avr32_tc_t *tc, unsigned int channel) +{ + // Check for valid input. + if (channel >= TC_NUMBER_OF_CHANNELS) + return TC_INVALID_ARGUMENT; + + // Disable the selected timer/counter channel. + tc->channel[channel].ccr = AVR32_TC_CLKDIS_MASK; + + return 0; +} + + +int tc_software_trigger(volatile avr32_tc_t *tc, unsigned int channel) +{ + // Check for valid input. + if (channel >= TC_NUMBER_OF_CHANNELS) + return TC_INVALID_ARGUMENT; + + // Reset the selected timer/counter channel. + tc->channel[channel].ccr = AVR32_TC_SWTRG_MASK; + + return 0; +} + + +void tc_sync_trigger(volatile avr32_tc_t *tc) +{ + // Reset all channels of the selected timer/counter. + tc->bcr = AVR32_TC_BCR_SYNC_MASK; +} + + +void tc_sync_start(volatile avr32_tc_t *tc) +{ + unsigned int i; + // Enable the clock for each channel. + for(i=0; ichannel[i].ccr = AVR32_TC_CLKEN_MASK; + + // Reset all channels of the selected timer/counter. + tc->bcr = AVR32_TC_BCR_SYNC_MASK; +} + + +int tc_read_sr(volatile avr32_tc_t *tc, unsigned int channel) +{ + // Check for valid input. + if (channel >= TC_NUMBER_OF_CHANNELS) + return TC_INVALID_ARGUMENT; + + return tc->channel[channel].sr; +} + + +int tc_read_tc(volatile avr32_tc_t *tc, unsigned int channel) +{ + // Check for valid input. + if (channel >= TC_NUMBER_OF_CHANNELS) + return TC_INVALID_ARGUMENT; + + return Rd_bitfield(tc->channel[channel].cv, AVR32_TC_CV_MASK); +} + + +int tc_read_ra(volatile avr32_tc_t *tc, unsigned int channel) +{ + // Check for valid input. + if (channel >= TC_NUMBER_OF_CHANNELS) + return TC_INVALID_ARGUMENT; + + return Rd_bitfield(tc->channel[channel].ra, AVR32_TC_RA_MASK); +} + + +int tc_read_rb(volatile avr32_tc_t *tc, unsigned int channel) +{ + // Check for valid input. + if (channel >= TC_NUMBER_OF_CHANNELS) + return TC_INVALID_ARGUMENT; + + return Rd_bitfield(tc->channel[channel].rb, AVR32_TC_RB_MASK); +} + + +int tc_read_rc(volatile avr32_tc_t *tc, unsigned int channel) +{ + // Check for valid input. + if (channel >= TC_NUMBER_OF_CHANNELS) + return TC_INVALID_ARGUMENT; + + return Rd_bitfield(tc->channel[channel].rc, AVR32_TC_RC_MASK); +} + + +int tc_write_ra(volatile avr32_tc_t *tc, unsigned int channel, unsigned short value) +{ + // Check for valid input. + if (channel >= TC_NUMBER_OF_CHANNELS) + return TC_INVALID_ARGUMENT; + + // This function is only available in WAVEFORM mode. + if (Tst_bits(tc->channel[channel].cmr, AVR32_TC_WAVE_MASK)) + Wr_bitfield(tc->channel[channel].ra, AVR32_TC_RA_MASK, value); + + return value; +} + + +int tc_write_rb(volatile avr32_tc_t *tc, unsigned int channel, unsigned short value) +{ + // Check for valid input. + if (channel >= TC_NUMBER_OF_CHANNELS) + return TC_INVALID_ARGUMENT; + + // This function is only available in WAVEFORM mode. + if (Tst_bits(tc->channel[channel].cmr, AVR32_TC_WAVE_MASK)) + Wr_bitfield(tc->channel[channel].rb, AVR32_TC_RB_MASK, value); + + return value; +} + + +int tc_write_rc(volatile avr32_tc_t *tc, unsigned int channel, unsigned short value) +{ + // Check for valid input. + if (channel >= TC_NUMBER_OF_CHANNELS) + return TC_INVALID_ARGUMENT; + + // This function is only available in WAVEFORM mode. + if (Tst_bits(tc->channel[channel].cmr, AVR32_TC_WAVE_MASK)) + Wr_bitfield(tc->channel[channel].rc, AVR32_TC_RC_MASK, value); + + return value; +} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/TC/tc.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/TC/tc.h new file mode 100644 index 0000000..45ef4f2 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/TC/tc.h @@ -0,0 +1,591 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Timer/Counter driver for AVR32 UC3. + * + * AVR32 Timer/Counter driver module. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with a TC module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _TC_H_ +#define _TC_H_ + +#include + + +//! TC driver functions return value in case of invalid argument(s). +#define TC_INVALID_ARGUMENT (-1) + +//! Number of timer/counter channels. +#define TC_NUMBER_OF_CHANNELS (sizeof(((avr32_tc_t *)0)->channel) / sizeof(avr32_tc_channel_t)) + +/*! \name External Clock Signal 0 Selection + */ +//! @{ +#define TC_CH0_EXT_CLK0_SRC_TCLK0 AVR32_TC_TC0XC0S_TCLK0 +#define TC_CH0_EXT_CLK0_SRC_NO_CLK AVR32_TC_TC0XC0S_NO_CLK +#define TC_CH0_EXT_CLK0_SRC_TIOA1 AVR32_TC_TC0XC0S_TIOA1 +#define TC_CH0_EXT_CLK0_SRC_TIOA2 AVR32_TC_TC0XC0S_TIOA2 +//! @} + +/*! \name External Clock Signal 1 Selection + */ +//! @{ +#define TC_CH1_EXT_CLK1_SRC_TCLK1 AVR32_TC_TC1XC1S_TCLK1 +#define TC_CH1_EXT_CLK1_SRC_NO_CLK AVR32_TC_TC1XC1S_NO_CLK +#define TC_CH1_EXT_CLK1_SRC_TIOA0 AVR32_TC_TC1XC1S_TIOA0 +#define TC_CH1_EXT_CLK1_SRC_TIOA2 AVR32_TC_TC1XC1S_TIOA2 +//! @} + +/*! \name External Clock Signal 2 Selection + */ +//! @{ +#define TC_CH2_EXT_CLK2_SRC_TCLK2 AVR32_TC_TC2XC2S_TCLK2 +#define TC_CH2_EXT_CLK2_SRC_NO_CLK AVR32_TC_TC2XC2S_NO_CLK +#define TC_CH2_EXT_CLK2_SRC_TIOA0 AVR32_TC_TC2XC2S_TIOA0 +#define TC_CH2_EXT_CLK2_SRC_TIOA1 AVR32_TC_TC2XC2S_TIOA1 +//! @} + +/*! \name Event/Trigger Actions on Output + */ +//! @{ +#define TC_EVT_EFFECT_NOOP AVR32_TC_NONE +#define TC_EVT_EFFECT_SET AVR32_TC_SET +#define TC_EVT_EFFECT_CLEAR AVR32_TC_CLEAR +#define TC_EVT_EFFECT_TOGGLE AVR32_TC_TOGGLE +//! @} + +/*! \name RC Compare Trigger Enable + */ +//! @{ +#define TC_NO_TRIGGER_COMPARE_RC 0 +#define TC_TRIGGER_COMPARE_RC 1 +//! @} + +/*! \name Waveform Selection + */ +//! @{ +#define TC_WAVEFORM_SEL_UP_MODE AVR32_TC_WAVSEL_UP_NO_AUTO +#define TC_WAVEFORM_SEL_UP_MODE_RC_TRIGGER AVR32_TC_WAVSEL_UP_AUTO +#define TC_WAVEFORM_SEL_UPDOWN_MODE AVR32_TC_WAVSEL_UPDOWN_NO_AUTO +#define TC_WAVEFORM_SEL_UPDOWN_MODE_RC_TRIGGER AVR32_TC_WAVSEL_UPDOWN_AUTO +//! @} + +/*! \name TIOA or TIOB External Trigger Selection + */ +//! @{ +#define TC_EXT_TRIG_SEL_TIOA 1 +#define TC_EXT_TRIG_SEL_TIOB 0 +//! @} + +/*! \name External Event Selection + */ +//! @{ +#define TC_EXT_EVENT_SEL_TIOB_INPUT AVR32_TC_EEVT_TIOB_INPUT +#define TC_EXT_EVENT_SEL_XC0_OUTPUT AVR32_TC_EEVT_XC0_OUTPUT +#define TC_EXT_EVENT_SEL_XC1_OUTPUT AVR32_TC_EEVT_XC1_OUTPUT +#define TC_EXT_EVENT_SEL_XC2_OUTPUT AVR32_TC_EEVT_XC2_OUTPUT +//! @} + +/*! \name Edge Selection + */ +//! @{ +#define TC_SEL_NO_EDGE AVR32_TC_EEVTEDG_NO_EDGE +#define TC_SEL_RISING_EDGE AVR32_TC_EEVTEDG_POS_EDGE +#define TC_SEL_FALLING_EDGE AVR32_TC_EEVTEDG_NEG_EDGE +#define TC_SEL_EACH_EDGE AVR32_TC_EEVTEDG_BOTH_EDGES +//! @} + +/*! \name Burst Signal Selection + */ +//! @{ +#define TC_BURST_NOT_GATED AVR32_TC_BURST_NOT_GATED +#define TC_BURST_CLK_AND_XC0 AVR32_TC_BURST_CLK_AND_XC0 +#define TC_BURST_CLK_AND_XC1 AVR32_TC_BURST_CLK_AND_XC1 +#define TC_BURST_CLK_AND_XC2 AVR32_TC_BURST_CLK_AND_XC2 +//! @} + +/*! \name Clock Invert + */ +//! @{ +#define TC_CLOCK_RISING_EDGE 0 +#define TC_CLOCK_FALLING_EDGE 1 +//! @} + +/*! \name Clock Selection + */ +//! @{ +#define TC_CLOCK_SOURCE_TC1 AVR32_TC_TCCLKS_TIMER_CLOCK1 +#define TC_CLOCK_SOURCE_TC2 AVR32_TC_TCCLKS_TIMER_CLOCK2 +#define TC_CLOCK_SOURCE_TC3 AVR32_TC_TCCLKS_TIMER_CLOCK3 +#define TC_CLOCK_SOURCE_TC4 AVR32_TC_TCCLKS_TIMER_CLOCK4 +#define TC_CLOCK_SOURCE_TC5 AVR32_TC_TCCLKS_TIMER_CLOCK5 +#define TC_CLOCK_SOURCE_XC0 AVR32_TC_TCCLKS_XC0 +#define TC_CLOCK_SOURCE_XC1 AVR32_TC_TCCLKS_XC1 +#define TC_CLOCK_SOURCE_XC2 AVR32_TC_TCCLKS_XC2 +//! @} + + +//! Timer/counter interrupts. +typedef struct +{ + unsigned int :24; + + //! External trigger interrupt. + unsigned int etrgs : 1; + + //! RB load interrupt. + unsigned int ldrbs : 1; + + //! RA load interrupt. + unsigned int ldras : 1; + + //! RC compare interrupt. + unsigned int cpcs : 1; + + //! RB compare interrupt. + unsigned int cpbs : 1; + + //! RA compare interrupt. + unsigned int cpas : 1; + + //! Load overrun interrupt. + unsigned int lovrs : 1; + + //! Counter overflow interrupt. + unsigned int covfs : 1; +} tc_interrupt_t; + +//! Parameters when initializing a timer/counter in capture mode. +typedef struct +{ + //! Channel to initialize. + unsigned int channel ; + + unsigned int :12; + + //! RB loading selection:\n + //! - \ref TC_SEL_NO_EDGE;\n + //! - \ref TC_SEL_RISING_EDGE;\n + //! - \ref TC_SEL_FALLING_EDGE;\n + //! - \ref TC_SEL_EACH_EDGE. + unsigned int ldrb : 2; + + //! RA loading selection:\n + //! - \ref TC_SEL_NO_EDGE;\n + //! - \ref TC_SEL_RISING_EDGE;\n + //! - \ref TC_SEL_FALLING_EDGE;\n + //! - \ref TC_SEL_EACH_EDGE. + unsigned int ldra : 2; + + unsigned int : 1; + + //! RC compare trigger enable:\n + //! - \ref TC_NO_TRIGGER_COMPARE_RC;\n + //! - \ref TC_TRIGGER_COMPARE_RC. + unsigned int cpctrg : 1; + + unsigned int : 3; + + //! TIOA or TIOB external trigger selection:\n + //! - \ref TC_EXT_TRIG_SEL_TIOA;\n + //! - \ref TC_EXT_TRIG_SEL_TIOB. + unsigned int abetrg : 1; + + //! External trigger edge selection:\n + //! - \ref TC_SEL_NO_EDGE;\n + //! - \ref TC_SEL_RISING_EDGE;\n + //! - \ref TC_SEL_FALLING_EDGE;\n + //! - \ref TC_SEL_EACH_EDGE. + unsigned int etrgedg : 2; + + //! Counter clock disable with RB loading:\n + //! - \c FALSE;\n + //! - \c TRUE. + unsigned int ldbdis : 1; + + //! Counter clock stopped with RB loading:\n + //! - \c FALSE;\n + //! - \c TRUE. + unsigned int ldbstop : 1; + + //! Burst signal selection:\n + //! - \ref TC_BURST_NOT_GATED;\n + //! - \ref TC_BURST_CLK_AND_XC0;\n + //! - \ref TC_BURST_CLK_AND_XC1;\n + //! - \ref TC_BURST_CLK_AND_XC2. + unsigned int burst : 2; + + //! Clock invert:\n + //! - \ref TC_CLOCK_RISING_EDGE;\n + //! - \ref TC_CLOCK_FALLING_EDGE. + unsigned int clki : 1; + + //! Clock selection:\n + //! - \ref TC_CLOCK_SOURCE_TC1;\n + //! - \ref TC_CLOCK_SOURCE_TC2;\n + //! - \ref TC_CLOCK_SOURCE_TC3;\n + //! - \ref TC_CLOCK_SOURCE_TC4;\n + //! - \ref TC_CLOCK_SOURCE_TC5;\n + //! - \ref TC_CLOCK_SOURCE_XC0;\n + //! - \ref TC_CLOCK_SOURCE_XC1;\n + //! - \ref TC_CLOCK_SOURCE_XC2. + unsigned int tcclks : 3; +} tc_capture_opt_t; + +//! Parameters when initializing a timer/counter in waveform mode. +typedef struct +{ + //! Channel to initialize. + unsigned int channel ; + + //! Software trigger effect on TIOB:\n + //! - \ref TC_EVT_EFFECT_NOOP;\n + //! - \ref TC_EVT_EFFECT_SET;\n + //! - \ref TC_EVT_EFFECT_CLEAR;\n + //! - \ref TC_EVT_EFFECT_TOGGLE. + unsigned int bswtrg : 2; + + //! External event effect on TIOB:\n + //! - \ref TC_EVT_EFFECT_NOOP;\n + //! - \ref TC_EVT_EFFECT_SET;\n + //! - \ref TC_EVT_EFFECT_CLEAR;\n + //! - \ref TC_EVT_EFFECT_TOGGLE. + unsigned int beevt : 2; + + //! RC compare effect on TIOB:\n + //! - \ref TC_EVT_EFFECT_NOOP;\n + //! - \ref TC_EVT_EFFECT_SET;\n + //! - \ref TC_EVT_EFFECT_CLEAR;\n + //! - \ref TC_EVT_EFFECT_TOGGLE. + unsigned int bcpc : 2; + + //! RB compare effect on TIOB:\n + //! - \ref TC_EVT_EFFECT_NOOP;\n + //! - \ref TC_EVT_EFFECT_SET;\n + //! - \ref TC_EVT_EFFECT_CLEAR;\n + //! - \ref TC_EVT_EFFECT_TOGGLE. + unsigned int bcpb : 2; + + //! Software trigger effect on TIOA:\n + //! - \ref TC_EVT_EFFECT_NOOP;\n + //! - \ref TC_EVT_EFFECT_SET;\n + //! - \ref TC_EVT_EFFECT_CLEAR;\n + //! - \ref TC_EVT_EFFECT_TOGGLE. + unsigned int aswtrg : 2; + + //! External event effect on TIOA:\n + //! - \ref TC_EVT_EFFECT_NOOP;\n + //! - \ref TC_EVT_EFFECT_SET;\n + //! - \ref TC_EVT_EFFECT_CLEAR;\n + //! - \ref TC_EVT_EFFECT_TOGGLE. + unsigned int aeevt : 2; + + //! RC compare effect on TIOA:\n + //! - \ref TC_EVT_EFFECT_NOOP;\n + //! - \ref TC_EVT_EFFECT_SET;\n + //! - \ref TC_EVT_EFFECT_CLEAR;\n + //! - \ref TC_EVT_EFFECT_TOGGLE. + unsigned int acpc : 2; + + //! RA compare effect on TIOA:\n + //! - \ref TC_EVT_EFFECT_NOOP;\n + //! - \ref TC_EVT_EFFECT_SET;\n + //! - \ref TC_EVT_EFFECT_CLEAR;\n + //! - \ref TC_EVT_EFFECT_TOGGLE. + unsigned int acpa : 2; + + unsigned int : 1; + + //! Waveform selection:\n + //! - \ref TC_WAVEFORM_SEL_UP_MODE;\n + //! - \ref TC_WAVEFORM_SEL_UP_MODE_RC_TRIGGER;\n + //! - \ref TC_WAVEFORM_SEL_UPDOWN_MODE;\n + //! - \ref TC_WAVEFORM_SEL_UPDOWN_MODE_RC_TRIGGER. + unsigned int wavsel : 2; + + //! External event trigger enable:\n + //! - \c FALSE;\n + //! - \c TRUE. + unsigned int enetrg : 1; + + //! External event selection:\n + //! - \ref TC_EXT_EVENT_SEL_TIOB_INPUT;\n + //! - \ref TC_EXT_EVENT_SEL_XC0_OUTPUT;\n + //! - \ref TC_EXT_EVENT_SEL_XC1_OUTPUT;\n + //! - \ref TC_EXT_EVENT_SEL_XC2_OUTPUT. + unsigned int eevt : 2; + + //! External event edge selection:\n + //! - \ref TC_SEL_NO_EDGE;\n + //! - \ref TC_SEL_RISING_EDGE;\n + //! - \ref TC_SEL_FALLING_EDGE;\n + //! - \ref TC_SEL_EACH_EDGE. + unsigned int eevtedg : 2; + + //! Counter clock disable with RC compare:\n + //! - \c FALSE;\n + //! - \c TRUE. + unsigned int cpcdis : 1; + + //! Counter clock stopped with RC compare:\n + //! - \c FALSE;\n + //! - \c TRUE. + unsigned int cpcstop : 1; + + //! Burst signal selection:\n + //! - \ref TC_BURST_NOT_GATED;\n + //! - \ref TC_BURST_CLK_AND_XC0;\n + //! - \ref TC_BURST_CLK_AND_XC1;\n + //! - \ref TC_BURST_CLK_AND_XC2. + unsigned int burst : 2; + + //! Clock invert:\n + //! - \ref TC_CLOCK_RISING_EDGE;\n + //! - \ref TC_CLOCK_FALLING_EDGE. + unsigned int clki : 1; + + //! Clock selection:\n + //! - \ref TC_CLOCK_SOURCE_TC1;\n + //! - \ref TC_CLOCK_SOURCE_TC2;\n + //! - \ref TC_CLOCK_SOURCE_TC3;\n + //! - \ref TC_CLOCK_SOURCE_TC4;\n + //! - \ref TC_CLOCK_SOURCE_TC5;\n + //! - \ref TC_CLOCK_SOURCE_XC0;\n + //! - \ref TC_CLOCK_SOURCE_XC1;\n + //! - \ref TC_CLOCK_SOURCE_XC2. + unsigned int tcclks : 3; +} tc_waveform_opt_t; + + +/*! \brief Reads timer/counter interrupt settings. + * + * \param tc Pointer to the TC instance to access. + * \param channel The TC instance channel to access. + * + * \retval >=0 The interrupt enable configuration organized according to \ref tc_interrupt_t. + * \retval TC_INVALID_ARGUMENT Invalid argument(s). + */ +extern int tc_get_interrupt_settings(volatile avr32_tc_t *tc, unsigned int channel); + +/*! \brief Enables various timer/counter interrupts. + * + * \param tc Pointer to the TC instance to access. + * \param channel The TC instance channel to access. + * \param bitfield The interrupt enable configuration. + * + * \retval 0 Success. + * \retval TC_INVALID_ARGUMENT Invalid argument(s). + */ +extern int tc_configure_interrupts(volatile avr32_tc_t *tc, unsigned int channel, const tc_interrupt_t *bitfield); + +/*! \brief Selects which external clock to use and how to configure it. + * + * \param tc Pointer to the TC instance to access. + * \param channel The TC instance channel to access. + * \param ext_clk_sig_src External clock signal selection: + * \arg \c TC_CH0_EXT_CLK0_SRC_TCLK0; + * \arg \c TC_CH0_EXT_CLK0_SRC_NO_CLK; + * \arg \c TC_CH0_EXT_CLK0_SRC_TIOA1; + * \arg \c TC_CH0_EXT_CLK0_SRC_TIOA2; + * \arg \c TC_CH1_EXT_CLK1_SRC_TCLK1; + * \arg \c TC_CH1_EXT_CLK1_SRC_NO_CLK; + * \arg \c TC_CH1_EXT_CLK1_SRC_TIOA0; + * \arg \c TC_CH1_EXT_CLK1_SRC_TIOA2; + * \arg \c TC_CH2_EXT_CLK2_SRC_TCLK2; + * \arg \c TC_CH2_EXT_CLK2_SRC_NO_CLK; + * \arg \c TC_CH2_EXT_CLK2_SRC_TIOA0; + * \arg \c TC_CH2_EXT_CLK2_SRC_TIOA1. + * + * \retval 0 Success. + * \retval TC_INVALID_ARGUMENT Invalid argument(s). + */ +extern int tc_select_external_clock(volatile avr32_tc_t *tc, unsigned int channel, unsigned int ext_clk_sig_src); + +/*! \brief Sets options for timer/counter capture initialization. + * + * \param tc Pointer to the TC instance to access. + * \param opt Options for capture mode. + * + * \retval 0 Success. + * \retval TC_INVALID_ARGUMENT Invalid argument(s). + */ +extern int tc_init_capture(volatile avr32_tc_t *tc, const tc_capture_opt_t *opt); + +/*! \brief Sets options for timer/counter waveform initialization. + * + * \param tc Pointer to the TC instance to access. + * \param opt Options for waveform generation. + * + * \retval 0 Success. + * \retval TC_INVALID_ARGUMENT Invalid argument(s). + */ +extern int tc_init_waveform(volatile avr32_tc_t *tc, const tc_waveform_opt_t *opt); + +/*! \brief Starts a timer/counter. + * + * \param tc Pointer to the TC instance to access. + * \param channel The TC instance channel to access. + * + * \retval 0 Success. + * \retval TC_INVALID_ARGUMENT Invalid argument(s). + */ +extern int tc_start(volatile avr32_tc_t *tc, unsigned int channel); + +/*! \brief Stops a timer/counter. + * + * \param tc Pointer to the TC instance to access. + * \param channel The TC instance channel to access. + * + * \retval 0 Success. + * \retval TC_INVALID_ARGUMENT Invalid argument(s). + */ +extern int tc_stop(volatile avr32_tc_t *tc, unsigned int channel); + +/*! \brief Performs a software trigger: the counter is reset and the clock is started. + * + * \param tc Pointer to the TC instance to access. + * \param channel The TC instance channel to access. + * + * \retval 0 Success. + * \retval TC_INVALID_ARGUMENT Invalid argument(s). + */ +extern int tc_software_trigger(volatile avr32_tc_t *tc, unsigned int channel); + +/*! \brief Asserts a SYNC signal to generate a software trigger and reset all channels. + * + * \param tc Pointer to the TC instance to access. + */ +extern void tc_sync_trigger(volatile avr32_tc_t *tc); + +/*! \brief Start all TC channels simultaneously. + * + * \param tc Pointer to the TC instance to access. + */ +extern void tc_sync_start(volatile avr32_tc_t *tc); + +/*! \brief Reads the status register. + * + * \param tc Pointer to the TC instance to access. + * \param channel The TC instance channel to access. + * + * \retval >=0 Status register value. + * \retval TC_INVALID_ARGUMENT Invalid argument(s). + */ +extern int tc_read_sr(volatile avr32_tc_t *tc, unsigned int channel); + +/*! \brief Reads the channel's TC counter and returns the value. + * + * \param tc Pointer to the TC instance to access. + * \param channel The TC instance channel to access. + * + * \retval >=0 TC counter value. + * \retval TC_INVALID_ARGUMENT Invalid argument(s). + */ +extern int tc_read_tc(volatile avr32_tc_t *tc, unsigned int channel); + +/*! \brief Reads the channel's RA register and returns the value. + * + * \param tc Pointer to the TC instance to access. + * \param channel The TC instance channel to access. + * + * \retval >=0 RA register value. + * \retval TC_INVALID_ARGUMENT Invalid argument(s). + */ +extern int tc_read_ra(volatile avr32_tc_t *tc, unsigned int channel); + +/*! \brief Reads the channel's RB register and returns the value. + * + * \param tc Pointer to the TC instance to access. + * \param channel The TC instance channel to access. + * + * \retval >=0 RB register value. + * \retval TC_INVALID_ARGUMENT Invalid argument(s). + */ +extern int tc_read_rb(volatile avr32_tc_t *tc, unsigned int channel); + +/*! \brief Reads the channel's RC register and returns the value. + * + * \param tc Pointer to the TC instance to access. + * \param channel The TC instance channel to access. + * + * \retval >=0 RC register value. + * \retval TC_INVALID_ARGUMENT Invalid argument(s). + */ +extern int tc_read_rc(volatile avr32_tc_t *tc, unsigned int channel); + +/*! \brief Writes a value to the channel's RA register. + * + * \param tc Pointer to the TC instance to access. + * \param channel The TC instance channel to access. + * \param value Value to write to the RA register. + * + * \retval >=0 Written value. + * \retval TC_INVALID_ARGUMENT Invalid argument(s). + */ +extern int tc_write_ra(volatile avr32_tc_t *tc, unsigned int channel, unsigned short value); + +/*! \brief Writes a value to the channel's RB register. + * + * \param tc Pointer to the TC instance to access. + * \param channel The TC instance channel to access. + * \param value Value to write to the RB register. + * + * \retval >=0 Written value. + * \retval TC_INVALID_ARGUMENT Invalid argument(s). + */ +extern int tc_write_rb(volatile avr32_tc_t *tc, unsigned int channel, unsigned short value); + +/*! \brief Writes a value to the channel's RC register. + * + * \param tc Pointer to the TC instance to access. + * \param channel The TC instance channel to access. + * \param value Value to write to the RC register. + * + * \retval >=0 Written value. + * \retval TC_INVALID_ARGUMENT Invalid argument(s). + */ +extern int tc_write_rc(volatile avr32_tc_t *tc, unsigned int channel, unsigned short value); + + +#endif // _TC_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/USART/usart.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/USART/usart.c new file mode 100644 index 0000000..b95882a --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/USART/usart.c @@ -0,0 +1,914 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief USART driver for AVR32 UC3. + * + * This file contains basic functions for the AVR32 USART, with support for all + * modes, settings and clock speeds. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with a USART module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#include "compiler.h" +#include "usart.h" + + +//------------------------------------------------------------------------------ +/*! \name Private Functions + */ +//! @{ + + +/*! \brief Checks if the USART is in multidrop mode. + * + * \param usart Base address of the USART instance. + * + * \return \c 1 if the USART is in multidrop mode, otherwise \c 0. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +static __inline__ int usart_mode_is_multidrop(volatile avr32_usart_t *usart) +{ + return ((usart->mr >> AVR32_USART_MR_PAR_OFFSET) & AVR32_USART_MR_PAR_MULTI) == AVR32_USART_MR_PAR_MULTI; +} + + +/*! \brief Calculates a clock divider (\e CD) and a fractional part (\e FP) for + * the USART asynchronous modes to generate a baud rate as close as + * possible to the baud rate set point. + * + * Baud rate calculation: + * \f$ Baudrate = \frac{SelectedClock}{Over \times (CD + \frac{FP}{8})} \f$, \e Over being 16 or 8. + * The maximal oversampling is selected if it allows to generate a baud rate close to the set point. + * + * \param usart Base address of the USART instance. + * \param baudrate Baud rate set point. + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * + * \retval USART_SUCCESS Baud rate successfully initialized. + * \retval USART_INVALID_INPUT Baud rate set point is out of range for the given input clock frequency. + */ +static int usart_set_async_baudrate(volatile avr32_usart_t *usart, unsigned int baudrate, unsigned long pba_hz) +{ + unsigned int over = (pba_hz >= 16 * baudrate) ? 16 : 8; + unsigned int cd_fp = ((1 << AVR32_USART_BRGR_FP_SIZE) * pba_hz + (over * baudrate) / 2) / (over * baudrate); + unsigned int cd = cd_fp >> AVR32_USART_BRGR_FP_SIZE; + unsigned int fp = cd_fp & ((1 << AVR32_USART_BRGR_FP_SIZE) - 1); + + if (cd < 1 || cd > (1 << AVR32_USART_BRGR_CD_SIZE) - 1) + return USART_INVALID_INPUT; + + usart->mr = (usart->mr & ~(AVR32_USART_MR_USCLKS_MASK | + AVR32_USART_MR_SYNC_MASK | + AVR32_USART_MR_OVER_MASK)) | + AVR32_USART_MR_USCLKS_MCK << AVR32_USART_MR_USCLKS_OFFSET | + ((over == 16) ? AVR32_USART_MR_OVER_X16 : AVR32_USART_MR_OVER_X8) << AVR32_USART_MR_OVER_OFFSET; + + usart->brgr = cd << AVR32_USART_BRGR_CD_OFFSET | + fp << AVR32_USART_BRGR_FP_OFFSET; + + return USART_SUCCESS; +} + + +/*! \brief Calculates a clock divider (\e CD) for the USART synchronous master + * modes to generate a baud rate as close as possible to the baud rate + * set point. + * + * Baud rate calculation: + * \f$ Baudrate = \frac{SelectedClock}{CD} \f$. + * + * \param usart Base address of the USART instance. + * \param baudrate Baud rate set point. + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * + * \retval USART_SUCCESS Baud rate successfully initialized. + * \retval USART_INVALID_INPUT Baud rate set point is out of range for the given input clock frequency. + */ +static int usart_set_sync_master_baudrate(volatile avr32_usart_t *usart, unsigned int baudrate, unsigned long pba_hz) +{ + unsigned int cd = (pba_hz + baudrate / 2) / baudrate; + + if (cd < 1 || cd > (1 << AVR32_USART_BRGR_CD_SIZE) - 1) + return USART_INVALID_INPUT; + + usart->mr = (usart->mr & ~AVR32_USART_MR_USCLKS_MASK) | + AVR32_USART_MR_USCLKS_MCK << AVR32_USART_MR_USCLKS_OFFSET | + AVR32_USART_MR_SYNC_MASK; + + usart->brgr = cd << AVR32_USART_BRGR_CD_OFFSET; + + return USART_SUCCESS; +} + + +/*! \brief Selects the SCK pin as the source of baud rate for the USART + * synchronous slave modes. + * + * \param usart Base address of the USART instance. + * + * \retval USART_SUCCESS Baud rate successfully initialized. + */ +static int usart_set_sync_slave_baudrate(volatile avr32_usart_t *usart) +{ + usart->mr = (usart->mr & ~AVR32_USART_MR_USCLKS_MASK) | + AVR32_USART_MR_USCLKS_SCK << AVR32_USART_MR_USCLKS_OFFSET | + AVR32_USART_MR_SYNC_MASK; + + return USART_SUCCESS; +} + + +/*! \brief Calculates a clock divider (\e CD) for the USART ISO7816 mode to + * generate an ISO7816 clock as close as possible to the clock set point. + * + * ISO7816 clock calculation: + * \f$ Clock = \frac{SelectedClock}{CD} \f$. + * + * \param usart Base address of the USART instance. + * \param clock ISO7816 clock set point. + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * + * \retval USART_SUCCESS ISO7816 clock successfully initialized. + * \retval USART_INVALID_INPUT ISO7816 clock set point is out of range for the given input clock frequency. + */ +static int usart_set_iso7816_clock(volatile avr32_usart_t *usart, unsigned int clock, unsigned long pba_hz) +{ + unsigned int cd = (pba_hz + clock / 2) / clock; + + if (cd < 1 || cd > (1 << AVR32_USART_BRGR_CD_SIZE) - 1) + return USART_INVALID_INPUT; + + usart->mr = (usart->mr & ~(AVR32_USART_MR_USCLKS_MASK | + AVR32_USART_MR_SYNC_MASK | + AVR32_USART_MR_OVER_MASK)) | + AVR32_USART_MR_USCLKS_MCK << AVR32_USART_MR_USCLKS_OFFSET | + AVR32_USART_MR_OVER_X16 << AVR32_USART_MR_OVER_OFFSET; + + usart->brgr = cd << AVR32_USART_BRGR_CD_OFFSET; + + return USART_SUCCESS; +} + + +#if defined(AVR32_USART_400_H_INCLUDED) || \ + defined(AVR32_USART_410_H_INCLUDED) || \ + defined(AVR32_USART_420_H_INCLUDED) || \ + defined(AVR32_USART_440_H_INCLUDED) || \ + defined(AVR32_USART_602_H_INCLUDED) + + +/*! \brief Calculates a clock divider (\e CD) for the USART SPI master mode to + * generate a baud rate as close as possible to the baud rate set point. + * + * Baud rate calculation: + * \f$ Baudrate = \frac{SelectedClock}{CD} \f$. + * + * \param usart Base address of the USART instance. + * \param baudrate Baud rate set point. + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * + * \retval USART_SUCCESS Baud rate successfully initialized. + * \retval USART_INVALID_INPUT Baud rate set point is out of range for the given input clock frequency. + */ +static int usart_set_spi_master_baudrate(volatile avr32_usart_t *usart, unsigned int baudrate, unsigned long pba_hz) +{ + unsigned int cd = (pba_hz + baudrate / 2) / baudrate; + + if (cd < 4 || cd > (1 << AVR32_USART_BRGR_CD_SIZE) - 1) + return USART_INVALID_INPUT; + + usart->mr = (usart->mr & ~AVR32_USART_MR_USCLKS_MASK) | + AVR32_USART_MR_USCLKS_MCK << AVR32_USART_MR_USCLKS_OFFSET; + + usart->brgr = cd << AVR32_USART_BRGR_CD_OFFSET; + + return USART_SUCCESS; +} + + +/*! \brief Selects the SCK pin as the source of baud rate for the USART SPI + * slave mode. + * + * \param usart Base address of the USART instance. + * + * \retval USART_SUCCESS Baud rate successfully initialized. + */ +static int usart_set_spi_slave_baudrate(volatile avr32_usart_t *usart) +{ + usart->mr = (usart->mr & ~AVR32_USART_MR_USCLKS_MASK) | + AVR32_USART_MR_USCLKS_SCK << AVR32_USART_MR_USCLKS_OFFSET; + + return USART_SUCCESS; +} + + +#endif // USART rev. >= 4.0.0 + + +//! @} + + +//------------------------------------------------------------------------------ +/*! \name Initialization Functions + */ +//! @{ + + +void usart_reset(volatile avr32_usart_t *usart) +{ + Bool global_interrupt_enabled = Is_global_interrupt_enabled(); + + // Disable all USART interrupts. + // Interrupts needed should be set explicitly on every reset. + if (global_interrupt_enabled) Disable_global_interrupt(); + usart->idr = 0xFFFFFFFF; + usart->csr; + if (global_interrupt_enabled) Enable_global_interrupt(); + + // Reset mode and other registers that could cause unpredictable behavior after reset. + usart->mr = 0; + usart->rtor = 0; + usart->ttgr = 0; + + // Shutdown TX and RX (will be re-enabled when setup has successfully completed), + // reset status bits and turn off DTR and RTS. + usart->cr = AVR32_USART_CR_RSTRX_MASK | + AVR32_USART_CR_RSTTX_MASK | + AVR32_USART_CR_RSTSTA_MASK | + AVR32_USART_CR_RSTIT_MASK | + AVR32_USART_CR_RSTNACK_MASK | +#ifndef AVR32_USART_440_H_INCLUDED +// Note: Modem Signal Management DTR-DSR-DCD-RI are not included in USART rev.440. + AVR32_USART_CR_DTRDIS_MASK | +#endif + AVR32_USART_CR_RTSDIS_MASK; +} + + +int usart_init_rs232(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz) +{ + // Reset the USART and shutdown TX and RX. + usart_reset(usart); + + // Check input values. + if (!opt || // Null pointer. + opt->charlength < 5 || opt->charlength > 9 || + opt->paritytype > 7 || + opt->stopbits > 2 + 255 || + opt->channelmode > 3 || + usart_set_async_baudrate(usart, opt->baudrate, pba_hz) == USART_INVALID_INPUT) + return USART_INVALID_INPUT; + + if (opt->charlength == 9) + { + // Character length set to 9 bits. MODE9 dominates CHRL. + usart->mr |= AVR32_USART_MR_MODE9_MASK; + } + else + { + // CHRL gives the character length (- 5) when MODE9 = 0. + usart->mr |= (opt->charlength - 5) << AVR32_USART_MR_CHRL_OFFSET; + } + + usart->mr |= opt->paritytype << AVR32_USART_MR_PAR_OFFSET | + opt->channelmode << AVR32_USART_MR_CHMODE_OFFSET; + + if (opt->stopbits > USART_2_STOPBITS) + { + // Set two stop bits + usart->mr |= AVR32_USART_MR_NBSTOP_2 << AVR32_USART_MR_NBSTOP_OFFSET; + // and a timeguard period gives the rest. + usart->ttgr = opt->stopbits - USART_2_STOPBITS; + } + else + // Insert 1, 1.5 or 2 stop bits. + usart->mr |= opt->stopbits << AVR32_USART_MR_NBSTOP_OFFSET; + + // Set normal mode. + usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) | + AVR32_USART_MR_MODE_NORMAL << AVR32_USART_MR_MODE_OFFSET; + + // Setup complete; enable communication. + // Enable input and output. + usart->cr = AVR32_USART_CR_RXEN_MASK | + AVR32_USART_CR_TXEN_MASK; + + return USART_SUCCESS; +} + + +int usart_init_rs232_tx_only(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz) +{ + // Reset the USART and shutdown TX and RX. + usart_reset(usart); + + // Check input values. + if (!opt || // Null pointer. + opt->charlength < 5 || opt->charlength > 9 || + opt->paritytype > 7 || + opt->stopbits == 1 || opt->stopbits > 2 + 255 || + opt->channelmode > 3 || + usart_set_sync_master_baudrate(usart, opt->baudrate, pba_hz) == USART_INVALID_INPUT) + return USART_INVALID_INPUT; + + if (opt->charlength == 9) + { + // Character length set to 9 bits. MODE9 dominates CHRL. + usart->mr |= AVR32_USART_MR_MODE9_MASK; + } + else + { + // CHRL gives the character length (- 5) when MODE9 = 0. + usart->mr |= (opt->charlength - 5) << AVR32_USART_MR_CHRL_OFFSET; + } + + usart->mr |= opt->paritytype << AVR32_USART_MR_PAR_OFFSET | + opt->channelmode << AVR32_USART_MR_CHMODE_OFFSET; + + if (opt->stopbits > USART_2_STOPBITS) + { + // Set two stop bits + usart->mr |= AVR32_USART_MR_NBSTOP_2 << AVR32_USART_MR_NBSTOP_OFFSET; + // and a timeguard period gives the rest. + usart->ttgr = opt->stopbits - USART_2_STOPBITS; + } + else + // Insert 1 or 2 stop bits. + usart->mr |= opt->stopbits << AVR32_USART_MR_NBSTOP_OFFSET; + + // Set normal mode. + usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) | + AVR32_USART_MR_MODE_NORMAL << AVR32_USART_MR_MODE_OFFSET; + + // Setup complete; enable communication. + // Enable only output as input is not possible in synchronous mode without + // transferring clock. + usart->cr = AVR32_USART_CR_TXEN_MASK; + + return USART_SUCCESS; +} + + +int usart_init_hw_handshaking(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz) +{ + // First: Setup standard RS232. + if (usart_init_rs232(usart, opt, pba_hz) == USART_INVALID_INPUT) + return USART_INVALID_INPUT; + + // Set hardware handshaking mode. + usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) | + AVR32_USART_MR_MODE_HARDWARE << AVR32_USART_MR_MODE_OFFSET; + + return USART_SUCCESS; +} + + +int usart_init_modem(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz) +{ + // First: Setup standard RS232. + if (usart_init_rs232(usart, opt, pba_hz) == USART_INVALID_INPUT) + return USART_INVALID_INPUT; + + // Set modem mode. + usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) | + AVR32_USART_MR_MODE_MODEM << AVR32_USART_MR_MODE_OFFSET; + + return USART_SUCCESS; +} + + +int usart_init_sync_master(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz) +{ + // Reset the USART and shutdown TX and RX. + usart_reset(usart); + + // Check input values. + if (!opt || // Null pointer. + opt->charlength < 5 || opt->charlength > 9 || + opt->paritytype > 7 || + opt->stopbits == 1 || opt->stopbits > 2 + 255 || + opt->channelmode > 3 || + usart_set_sync_master_baudrate(usart, opt->baudrate, pba_hz) == USART_INVALID_INPUT) + return USART_INVALID_INPUT; + + if (opt->charlength == 9) + { + // Character length set to 9 bits. MODE9 dominates CHRL. + usart->mr |= AVR32_USART_MR_MODE9_MASK; + } + else + { + // CHRL gives the character length (- 5) when MODE9 = 0. + usart->mr |= (opt->charlength - 5) << AVR32_USART_MR_CHRL_OFFSET; + } + + usart->mr |= opt->paritytype << AVR32_USART_MR_PAR_OFFSET | + opt->channelmode << AVR32_USART_MR_CHMODE_OFFSET; + + if (opt->stopbits > USART_2_STOPBITS) + { + // Set two stop bits + usart->mr |= AVR32_USART_MR_NBSTOP_2 << AVR32_USART_MR_NBSTOP_OFFSET; + // and a timeguard period gives the rest. + usart->ttgr = opt->stopbits - USART_2_STOPBITS; + } + else + // Insert 1 or 2 stop bits. + usart->mr |= opt->stopbits << AVR32_USART_MR_NBSTOP_OFFSET; + + // Set normal mode. + usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) | + AVR32_USART_MR_MODE_NORMAL << AVR32_USART_MR_MODE_OFFSET | + AVR32_USART_MR_CLKO_MASK; + + // Setup complete; enable communication. + // Enable input and output. + usart->cr = AVR32_USART_CR_RXEN_MASK | + AVR32_USART_CR_TXEN_MASK; + + return USART_SUCCESS; +} + + +int usart_init_sync_slave(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz) +{ + // Reset the USART and shutdown TX and RX. + usart_reset(usart); + + // Check input values. + if (!opt || // Null pointer. + opt->charlength < 5 || opt->charlength > 9 || + opt->paritytype > 7 || + opt->stopbits == 1 || opt->stopbits > 2 + 255 || + opt->channelmode > 3 || + usart_set_sync_slave_baudrate(usart) == USART_INVALID_INPUT) + return USART_INVALID_INPUT; + + if (opt->charlength == 9) + { + // Character length set to 9 bits. MODE9 dominates CHRL. + usart->mr |= AVR32_USART_MR_MODE9_MASK; + } + else + { + // CHRL gives the character length (- 5) when MODE9 = 0. + usart->mr |= (opt->charlength - 5) << AVR32_USART_MR_CHRL_OFFSET; + } + + usart->mr |= opt->paritytype << AVR32_USART_MR_PAR_OFFSET | + opt->channelmode << AVR32_USART_MR_CHMODE_OFFSET; + + if (opt->stopbits > USART_2_STOPBITS) + { + // Set two stop bits + usart->mr |= AVR32_USART_MR_NBSTOP_2 << AVR32_USART_MR_NBSTOP_OFFSET; + // and a timeguard period gives the rest. + usart->ttgr = opt->stopbits - USART_2_STOPBITS; + } + else + // Insert 1 or 2 stop bits. + usart->mr |= opt->stopbits << AVR32_USART_MR_NBSTOP_OFFSET; + + // Set normal mode. + usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) | + AVR32_USART_MR_MODE_NORMAL << AVR32_USART_MR_MODE_OFFSET; + + // Setup complete; enable communication. + // Enable input and output. + usart->cr = AVR32_USART_CR_RXEN_MASK | + AVR32_USART_CR_TXEN_MASK; + + return USART_SUCCESS; +} + + +int usart_init_rs485(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz) +{ + // First: Setup standard RS232. + if (usart_init_rs232(usart, opt, pba_hz) == USART_INVALID_INPUT) + return USART_INVALID_INPUT; + + // Set RS485 mode. + usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) | + AVR32_USART_MR_MODE_RS485 << AVR32_USART_MR_MODE_OFFSET; + + return USART_SUCCESS; +} + + +int usart_init_IrDA(volatile avr32_usart_t *usart, const usart_options_t *opt, + long pba_hz, unsigned char irda_filter) +{ + // First: Setup standard RS232. + if (usart_init_rs232(usart, opt, pba_hz) == USART_INVALID_INPUT) + return USART_INVALID_INPUT; + + // Set IrDA filter. + usart->ifr = irda_filter; + + // Set IrDA mode and activate filtering of input. + usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) | + AVR32_USART_MODE_IRDA << AVR32_USART_MR_MODE_OFFSET | + AVR32_USART_MR_FILTER_MASK; + + return USART_SUCCESS; +} + + +int usart_init_iso7816(volatile avr32_usart_t *usart, const usart_iso7816_options_t *opt, int t, long pba_hz) +{ + // Reset the USART and shutdown TX and RX. + usart_reset(usart); + + // Check input values. + if (!opt || // Null pointer. + opt->paritytype > 1) + return USART_INVALID_INPUT; + + if (t == 0) + { + // Set USART mode to ISO7816, T=0. + // The T=0 protocol always uses 2 stop bits. + usart->mr = AVR32_USART_MR_MODE_ISO7816_T0 << AVR32_USART_MR_MODE_OFFSET | + AVR32_USART_MR_NBSTOP_2 << AVR32_USART_MR_NBSTOP_OFFSET | + opt->bit_order << AVR32_USART_MR_MSBF_OFFSET; // Allow MSBF in T=0. + } + else if (t == 1) + { + // Only LSB first in the T=1 protocol. + // max_iterations field is only used in T=0 mode. + if (opt->bit_order != 0 || + opt->max_iterations != 0) + return USART_INVALID_INPUT; + + // Set USART mode to ISO7816, T=1. + // The T=1 protocol always uses 1 stop bit. + usart->mr = AVR32_USART_MR_MODE_ISO7816_T1 << AVR32_USART_MR_MODE_OFFSET | + AVR32_USART_MR_NBSTOP_1 << AVR32_USART_MR_NBSTOP_OFFSET; + } + else + return USART_INVALID_INPUT; + + if (usart_set_iso7816_clock(usart, opt->iso7816_hz, pba_hz) == USART_INVALID_INPUT) + return USART_INVALID_INPUT; + + // Set FIDI register: bit rate = selected clock/FI_DI_ratio/16. + usart->fidi = opt->fidi_ratio; + + // Set ISO7816 spesific options in the MODE register. + usart->mr |= opt->paritytype << AVR32_USART_MR_PAR_OFFSET | + AVR32_USART_MR_CLKO_MASK | // Enable clock output. + opt->inhibit_nack << AVR32_USART_MR_INACK_OFFSET | + opt->dis_suc_nack << AVR32_USART_MR_DSNACK_OFFSET | + opt->max_iterations << AVR32_USART_MR_MAX_ITERATION_OFFSET; + + // Setup complete; enable the receiver by default. + usart_iso7816_enable_receiver(usart); + + return USART_SUCCESS; +} + + +#if defined(AVR32_USART_400_H_INCLUDED) || \ + defined(AVR32_USART_410_H_INCLUDED) || \ + defined(AVR32_USART_420_H_INCLUDED) || \ + defined(AVR32_USART_440_H_INCLUDED) || \ + defined(AVR32_USART_602_H_INCLUDED) + + +int usart_init_lin_master(volatile avr32_usart_t *usart, unsigned long baudrate, long pba_hz) +{ + // Reset the USART and shutdown TX and RX. + usart_reset(usart); + + // Check input values. + if (usart_set_async_baudrate(usart, baudrate, pba_hz) == USART_INVALID_INPUT) + return USART_INVALID_INPUT; + + usart->mr |= AVR32_USART_MR_MODE_LIN_MASTER << AVR32_USART_MR_MODE_OFFSET; // LIN master mode. + + // Setup complete; enable communication. + // Enable input and output. + usart->cr = AVR32_USART_CR_RXEN_MASK | + AVR32_USART_CR_TXEN_MASK; + + return USART_SUCCESS; +} + + +int usart_init_lin_slave(volatile avr32_usart_t *usart, unsigned long baudrate, long pba_hz) +{ + // Reset the USART and shutdown TX and RX. + usart_reset(usart); + + // Check input values. + if (usart_set_async_baudrate(usart, baudrate, pba_hz) == USART_INVALID_INPUT) + return USART_INVALID_INPUT; + + usart->mr |= AVR32_USART_MR_MODE_LIN_SLAVE << AVR32_USART_MR_MODE_OFFSET; // LIN slave mode. + + // Setup complete; enable communication. + // Enable input and output. + usart->cr = AVR32_USART_CR_RXEN_MASK | + AVR32_USART_CR_TXEN_MASK; + + return USART_SUCCESS; +} + + +int usart_init_spi_master(volatile avr32_usart_t *usart, const usart_spi_options_t *opt, long pba_hz) +{ + // Reset the USART and shutdown TX and RX. + usart_reset(usart); + + // Check input values. + if (!opt || // Null pointer. + opt->charlength < 5 || opt->charlength > 9 || + opt->spimode > 3 || + opt->channelmode > 3 || + usart_set_spi_master_baudrate(usart, opt->baudrate, pba_hz) == USART_INVALID_INPUT) + return USART_INVALID_INPUT; + + if (opt->charlength == 9) + { + // Character length set to 9 bits. MODE9 dominates CHRL. + usart->mr |= AVR32_USART_MR_MODE9_MASK; + } + else + { + // CHRL gives the character length (- 5) when MODE9 = 0. + usart->mr |= (opt->charlength - 5) << AVR32_USART_MR_CHRL_OFFSET; + } + + usart->mr |= AVR32_USART_MR_MODE_SPI_MASTER << AVR32_USART_MR_MODE_OFFSET | // SPI master mode. + ((opt->spimode & 0x1) ^ 0x1) << AVR32_USART_MR_SYNC_OFFSET | // SPI clock phase. + opt->channelmode << AVR32_USART_MR_CHMODE_OFFSET | // Channel mode. + (opt->spimode >> 1) << AVR32_USART_MR_MSBF_OFFSET | // SPI clock polarity. + AVR32_USART_MR_CLKO_MASK; // Drive SCK pin. + + // Setup complete; enable communication. + // Enable input and output. + usart->cr = AVR32_USART_CR_RXEN_MASK | + AVR32_USART_CR_TXEN_MASK; + + return USART_SUCCESS; +} + + +int usart_init_spi_slave(volatile avr32_usart_t *usart, const usart_spi_options_t *opt, long pba_hz) +{ + // Reset the USART and shutdown TX and RX. + usart_reset(usart); + + // Check input values. + if (!opt || // Null pointer. + opt->charlength < 5 || opt->charlength > 9 || + opt->spimode > 3 || + opt->channelmode > 3 || + usart_set_spi_slave_baudrate(usart) == USART_INVALID_INPUT) + return USART_INVALID_INPUT; + + if (opt->charlength == 9) + { + // Character length set to 9 bits. MODE9 dominates CHRL. + usart->mr |= AVR32_USART_MR_MODE9_MASK; + } + else + { + // CHRL gives the character length (- 5) when MODE9 = 0. + usart->mr |= (opt->charlength - 5) << AVR32_USART_MR_CHRL_OFFSET; + } + + usart->mr |= AVR32_USART_MR_MODE_SPI_SLAVE << AVR32_USART_MR_MODE_OFFSET | // SPI slave mode. + ((opt->spimode & 0x1) ^ 0x1) << AVR32_USART_MR_SYNC_OFFSET | // SPI clock phase. + opt->channelmode << AVR32_USART_MR_CHMODE_OFFSET | // Channel mode. + (opt->spimode >> 1) << AVR32_USART_MR_MSBF_OFFSET; // SPI clock polarity. + + // Setup complete; enable communication. + // Enable input and output. + usart->cr = AVR32_USART_CR_RXEN_MASK | + AVR32_USART_CR_TXEN_MASK; + + return USART_SUCCESS; +} + + +#endif // USART rev. >= 4.0.0 + + +//! @} + + +//------------------------------------------------------------------------------ +#if defined(AVR32_USART_400_H_INCLUDED) || \ + defined(AVR32_USART_410_H_INCLUDED) || \ + defined(AVR32_USART_420_H_INCLUDED) || \ + defined(AVR32_USART_440_H_INCLUDED) || \ + defined(AVR32_USART_602_H_INCLUDED) + + +/*! \name SPI Control Functions + */ +//! @{ + + +int usart_spi_selectChip(volatile avr32_usart_t *usart) +{ + // Force the SPI chip select. + usart->cr = AVR32_USART_CR_RTSEN_MASK; + + return USART_SUCCESS; +} + + +int usart_spi_unselectChip(volatile avr32_usart_t *usart) +{ + int timeout = USART_DEFAULT_TIMEOUT; + + do + { + if (!timeout--) return USART_FAILURE; + } while (!usart_tx_empty(usart)); + + // Release the SPI chip select. + usart->cr = AVR32_USART_CR_RTSDIS_MASK; + + return USART_SUCCESS; +} + + +//! @} + + +#endif // USART rev. >= 4.0.0 + + +//------------------------------------------------------------------------------ +/*! \name Transmit/Receive Functions + */ +//! @{ + + +int usart_send_address(volatile avr32_usart_t *usart, int address) +{ + // Check if USART is in multidrop / RS485 mode. + if (!usart_mode_is_multidrop(usart)) return USART_MODE_FAULT; + + // Prepare to send an address. + usart->cr = AVR32_USART_CR_SENDA_MASK; + + // Write the address to TX. + usart_bw_write_char(usart, address); + + return USART_SUCCESS; +} + + +int usart_write_char(volatile avr32_usart_t *usart, int c) +{ + if (usart_tx_ready(usart)) + { + usart->thr = (c << AVR32_USART_THR_TXCHR_OFFSET) & AVR32_USART_THR_TXCHR_MASK; + return USART_SUCCESS; + } + else + return USART_TX_BUSY; +} + + +int usart_putchar(volatile avr32_usart_t *usart, int c) +{ + int timeout = USART_DEFAULT_TIMEOUT; + + if (c == '\n') + { + do + { + if (!timeout--) return USART_FAILURE; + } while (usart_write_char(usart, '\r') != USART_SUCCESS); + + timeout = USART_DEFAULT_TIMEOUT; + } + + do + { + if (!timeout--) return USART_FAILURE; + } while (usart_write_char(usart, c) != USART_SUCCESS); + + return USART_SUCCESS; +} + + +int usart_read_char(volatile avr32_usart_t *usart, int *c) +{ + // Check for errors: frame, parity and overrun. In RS485 mode, a parity error + // would mean that an address char has been received. + if (usart->csr & (AVR32_USART_CSR_OVRE_MASK | + AVR32_USART_CSR_FRAME_MASK | + AVR32_USART_CSR_PARE_MASK)) + return USART_RX_ERROR; + + // No error; if we really did receive a char, read it and return SUCCESS. + if (usart_test_hit(usart)) + { + *c = (usart->rhr & AVR32_USART_RHR_RXCHR_MASK) >> AVR32_USART_RHR_RXCHR_OFFSET; + return USART_SUCCESS; + } + else + return USART_RX_EMPTY; +} + + +int usart_getchar(volatile avr32_usart_t *usart) +{ + int c, ret; + + while ((ret = usart_read_char(usart, &c)) == USART_RX_EMPTY); + + if (ret == USART_RX_ERROR) + return USART_FAILURE; + + return c; +} + + +void usart_write_line(volatile avr32_usart_t *usart, const char *string) +{ + while (*string != '\0') + usart_putchar(usart, *string++); +} + + +int usart_get_echo_line(volatile avr32_usart_t *usart) +{ + int rx_char; + int retval = USART_SUCCESS; + + while (1) + { + rx_char = usart_getchar(usart); + if (rx_char == USART_FAILURE) + { + usart_write_line(usart, "Error!!!\n"); + retval = USART_FAILURE; + break; + } + if (rx_char == '\x03') + { + retval = USART_FAILURE; + break; + } + usart_putchar(usart, rx_char); + if (rx_char == '\r') + { + usart_putchar(usart, '\n'); + break; + } + } + + return retval; +} + + +//! @} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/USART/usart.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/USART/usart.h new file mode 100644 index 0000000..bc1c100 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/DRIVERS/USART/usart.h @@ -0,0 +1,889 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief USART driver for AVR32 UC3. + * + * This file contains basic functions for the AVR32 USART, with support for all + * modes, settings and clock speeds. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with a USART module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _USART_H_ +#define _USART_H_ + +#include +#include "compiler.h" + + +/*! \name Return Values + */ +//! @{ +#define USART_SUCCESS 0 //!< Successful completion. +#define USART_FAILURE -1 //!< Failure because of some unspecified reason. +#define USART_INVALID_INPUT 1 //!< Input value out of range. +#define USART_INVALID_ARGUMENT -1 //!< Argument value out of range. +#define USART_TX_BUSY 2 //!< Transmitter was busy. +#define USART_RX_EMPTY 3 //!< Nothing was received. +#define USART_RX_ERROR 4 //!< Transmission error occurred. +#define USART_MODE_FAULT 5 //!< USART not in the appropriate mode. +//! @} + +//! Default time-out value (number of attempts). +#define USART_DEFAULT_TIMEOUT 10000 + +/*! \name Parity Settings + */ +//! @{ +#define USART_EVEN_PARITY AVR32_USART_MR_PAR_EVEN //!< Use even parity on character transmission. +#define USART_ODD_PARITY AVR32_USART_MR_PAR_ODD //!< Use odd parity on character transmission. +#define USART_SPACE_PARITY AVR32_USART_MR_PAR_SPACE //!< Use a space as parity bit. +#define USART_MARK_PARITY AVR32_USART_MR_PAR_MARK //!< Use a mark as parity bit. +#define USART_NO_PARITY AVR32_USART_MR_PAR_NONE //!< Don't use a parity bit. +#define USART_MULTIDROP_PARITY AVR32_USART_MR_PAR_MULTI //!< Parity bit is used to flag address characters. +//! @} + +/*! \name Stop Bits Settings + */ +//! @{ +#define USART_1_STOPBIT AVR32_USART_MR_NBSTOP_1 //!< Use 1 stop bit. +#define USART_1_5_STOPBITS AVR32_USART_MR_NBSTOP_1_5 //!< Use 1.5 stop bits. +#define USART_2_STOPBITS AVR32_USART_MR_NBSTOP_2 //!< Use 2 stop bits (for more, just give the number of bits). +//! @} + +/*! \name Channel Modes + */ +//! @{ +#define USART_NORMAL_CHMODE AVR32_USART_MR_CHMODE_NORMAL //!< Normal communication. +#define USART_AUTO_ECHO AVR32_USART_MR_CHMODE_ECHO //!< Echo data. +#define USART_LOCAL_LOOPBACK AVR32_USART_MR_CHMODE_LOCAL_LOOP //!< Local loopback. +#define USART_REMOTE_LOOPBACK AVR32_USART_MR_CHMODE_REMOTE_LOOP //!< Remote loopback. +//! @} + +#if defined(AVR32_USART_400_H_INCLUDED) || \ + defined(AVR32_USART_410_H_INCLUDED) || \ + defined(AVR32_USART_420_H_INCLUDED) || \ + defined(AVR32_USART_440_H_INCLUDED) || \ + defined(AVR32_USART_602_H_INCLUDED) + +/*! \name LIN Node Actions + */ +//! @{ +#define USART_LIN_PUBLISH_ACTION AVR32_USART_LINMR_NACT_PUBLISH //!< The USART transmits the response. +#define USART_LIN_SUBSCRIBE_ACTION AVR32_USART_LINMR_NACT_SUBSCRIBE //!< The USART receives the response. +#define USART_LIN_IGNORE_ACTION AVR32_USART_LINMR_NACT_IGNORE //!< The USART does not transmit and does not receive the reponse. +//! @} + +/*! \name LIN Checksum Types + */ +//! @{ +#define USART_LIN_ENHANCED_CHECKSUM 0 //!< LIN 2.0 "enhanced" checksum. +#define USART_LIN_CLASSIC_CHECKSUM 1 //!< LIN 1.3 "classic" checksum. +//! @} + +#endif // USART rev. >= 4.0.0 + + +//! Input parameters when initializing RS232 and similar modes. +typedef struct +{ + //! Set baud rate of the USART (unused in slave modes). + unsigned long baudrate; + + //! Number of bits to transmit as a character (5 to 9). + unsigned char charlength; + + //! How to calculate the parity bit: \ref USART_EVEN_PARITY, \ref USART_ODD_PARITY, + //! \ref USART_SPACE_PARITY, \ref USART_MARK_PARITY, \ref USART_NO_PARITY or + //! \ref USART_MULTIDROP_PARITY. + unsigned char paritytype; + + //! Number of stop bits between two characters: \ref USART_1_STOPBIT, + //! \ref USART_1_5_STOPBITS, \ref USART_2_STOPBITS or any number from 3 to 257 + //! which will result in a time guard period of that length between characters. + //! \note \ref USART_1_5_STOPBITS is supported in asynchronous modes only. + unsigned short stopbits; + + //! Run the channel in testmode: \ref USART_NORMAL_CHMODE, \ref USART_AUTO_ECHO, + //! \ref USART_LOCAL_LOOPBACK or \ref USART_REMOTE_LOOPBACK. + unsigned char channelmode; +} usart_options_t; + +//! Input parameters when initializing ISO7816 mode. +typedef struct +{ + //! Set the frequency of the ISO7816 clock. + unsigned long iso7816_hz; + + //! The number of ISO7816 clock ticks in every bit period (1 to 2047, 0 = disable clock). + //! Bit rate = \ref iso7816_hz / \ref fidi_ratio. + unsigned short fidi_ratio; + + //! How to calculate the parity bit: \ref USART_EVEN_PARITY for normal mode or + //! \ref USART_ODD_PARITY for inverse mode. + unsigned char paritytype; + + //! Inhibit Non Acknowledge:\n + //! - 0: the NACK is generated;\n + //! - 1: the NACK is not generated. + //! + //! \note This bit will be used only in ISO7816 mode, protocol T = 0 receiver. + int inhibit_nack; + + //! Disable successive NACKs. + //! Successive parity errors are counted up to the value in the \ref max_iterations field. + //! These parity errors generate a NACK on the ISO line. As soon as this value is reached, + //! no addititional NACK is sent on the ISO line. The ITERATION flag is asserted. + int dis_suc_nack; + + //! Max number of repetitions (0 to 7). + unsigned char max_iterations; + + //! Bit order in transmitted characters:\n + //! - 0: LSB first;\n + //! - 1: MSB first. + int bit_order; +} usart_iso7816_options_t; + +#if defined(AVR32_USART_400_H_INCLUDED) || \ + defined(AVR32_USART_410_H_INCLUDED) || \ + defined(AVR32_USART_420_H_INCLUDED) || \ + defined(AVR32_USART_440_H_INCLUDED) || \ + defined(AVR32_USART_602_H_INCLUDED) + +//! Input parameters when initializing SPI mode. +typedef struct +{ + //! Set the frequency of the SPI clock (unused in slave mode). + unsigned long baudrate; + + //! Number of bits to transmit as a character (5 to 9). + unsigned char charlength; + + //! Which SPI mode to use. + unsigned char spimode; + + //! Run the channel in testmode: \ref USART_NORMAL_CHMODE, \ref USART_AUTO_ECHO, + //! \ref USART_LOCAL_LOOPBACK or \ref USART_REMOTE_LOOPBACK. + unsigned char channelmode; +} usart_spi_options_t; + +#endif // USART rev. >= 4.0.0 + + +//------------------------------------------------------------------------------ +/*! \name Initialization Functions + */ +//! @{ + +/*! \brief Resets the USART and disables TX and RX. + * + * \param usart Base address of the USART instance. + */ +extern void usart_reset(volatile avr32_usart_t *usart); + +/*! \brief Sets up the USART to use the standard RS232 protocol. + * + * \param usart Base address of the USART instance. + * \param opt Options needed to set up RS232 communication (see \ref usart_options_t). + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * + * \retval USART_SUCCESS Mode successfully initialized. + * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. + */ +extern int usart_init_rs232(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz); + +/*! \brief Sets up the USART to use the standard RS232 protocol in TX-only mode. + * + * Compared to \ref usart_init_rs232, this function allows very high baud rates + * (up to \a pba_hz instead of \a pba_hz / \c 8) at the expense of full duplex. + * + * \param usart Base address of the USART instance. + * \param opt Options needed to set up RS232 communication (see \ref usart_options_t). + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * + * \retval USART_SUCCESS Mode successfully initialized. + * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. + * + * \note The \c 1.5 stop bit is not supported in this mode. + */ +extern int usart_init_rs232_tx_only(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz); + +/*! \brief Sets up the USART to use hardware handshaking. + * + * \param usart Base address of the USART instance. + * \param opt Options needed to set up RS232 communication (see \ref usart_options_t). + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * + * \retval USART_SUCCESS Mode successfully initialized. + * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. + * + * \note \ref usart_init_rs232 does not need to be invoked before this function. + */ +extern int usart_init_hw_handshaking(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz); + +/*! \brief Sets up the USART to use the modem protocol, activating dedicated inputs/outputs. + * + * \param usart Base address of the USART instance. + * \param opt Options needed to set up RS232 communication (see \ref usart_options_t). + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * + * \retval USART_SUCCESS Mode successfully initialized. + * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. + */ +extern int usart_init_modem(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz); + +/*! \brief Sets up the USART to use a synchronous RS232-like protocol in master mode. + * + * \param usart Base address of the USART instance. + * \param opt Options needed to set up RS232 communication (see \ref usart_options_t). + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * + * \retval USART_SUCCESS Mode successfully initialized. + * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. + */ +extern int usart_init_sync_master(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz); + +/*! \brief Sets up the USART to use a synchronous RS232-like protocol in slave mode. + * + * \param usart Base address of the USART instance. + * \param opt Options needed to set up RS232 communication (see \ref usart_options_t). + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * + * \retval USART_SUCCESS Mode successfully initialized. + * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. + */ +extern int usart_init_sync_slave(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz); + +/*! \brief Sets up the USART to use the RS485 protocol. + * + * \param usart Base address of the USART instance. + * \param opt Options needed to set up RS232 communication (see \ref usart_options_t). + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * + * \retval USART_SUCCESS Mode successfully initialized. + * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. + */ +extern int usart_init_rs485(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz); + +/*! \brief Sets up the USART to use the IrDA protocol. + * + * \param usart Base address of the USART instance. + * \param opt Options needed to set up RS232 communication (see \ref usart_options_t). + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * \param irda_filter Counter used to distinguish received ones from zeros. + * + * \retval USART_SUCCESS Mode successfully initialized. + * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. + */ +extern int usart_init_IrDA(volatile avr32_usart_t *usart, const usart_options_t *opt, + long pba_hz, unsigned char irda_filter); + +/*! \brief Sets up the USART to use the ISO7816 T=0 or T=1 smartcard protocols. + * + * The receiver is enabled by default. \ref usart_iso7816_enable_receiver and + * \ref usart_iso7816_enable_transmitter can be called to change the half-duplex + * communication direction. + * + * \param usart Base address of the USART instance. + * \param opt Options needed to set up ISO7816 communication (see \ref usart_iso7816_options_t). + * \param t ISO7816 mode to use (T=0 or T=1). + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * + * \retval USART_SUCCESS Mode successfully initialized. + * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. + */ +extern int usart_init_iso7816(volatile avr32_usart_t *usart, const usart_iso7816_options_t *opt, int t, long pba_hz); + +#if defined(AVR32_USART_400_H_INCLUDED) || \ + defined(AVR32_USART_410_H_INCLUDED) || \ + defined(AVR32_USART_420_H_INCLUDED) || \ + defined(AVR32_USART_440_H_INCLUDED) || \ + defined(AVR32_USART_602_H_INCLUDED) + +/*! \brief Sets up the USART to use the LIN master mode. + * + * \param usart Base address of the USART instance. + * \param baudrate Baud rate. + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * + */ +extern int usart_init_lin_master(volatile avr32_usart_t *usart, unsigned long baudrate, long pba_hz); + +/*! \brief Sets up the USART to use the LIN slave mode. + * + * \param usart Base address of the USART instance. + * \param baudrate Baud rate. + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * + */ +extern int usart_init_lin_slave(volatile avr32_usart_t *usart, unsigned long baudrate, long pba_hz); + +/*! \brief Sets up the USART to use the SPI master mode. + * + * \ref usart_spi_selectChip and \ref usart_spi_unselectChip can be called to + * select or unselect the SPI slave chip. + * + * \param usart Base address of the USART instance. + * \param opt Options needed to set up SPI mode (see \ref usart_spi_options_t). + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * + * \retval USART_SUCCESS Mode successfully initialized. + * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. + */ +extern int usart_init_spi_master(volatile avr32_usart_t *usart, const usart_spi_options_t *opt, long pba_hz); + +/*! \brief Sets up the USART to use the SPI slave mode. + * + * \param usart Base address of the USART instance. + * \param opt Options needed to set up SPI mode (see \ref usart_spi_options_t). + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * + * \retval USART_SUCCESS Mode successfully initialized. + * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. + */ +extern int usart_init_spi_slave(volatile avr32_usart_t *usart, const usart_spi_options_t *opt, long pba_hz); + +#endif // USART rev. >= 4.0.0 + +//! @} + + +//------------------------------------------------------------------------------ +/*! \name Read and Reset Error Status Bits + */ +//! @{ + +/*! \brief Resets the error status. + * + * This function resets the status bits indicating that a parity error, + * framing error or overrun has occurred. The RXBRK bit, indicating + * a start/end of break condition on the RX line, is also reset. + * + * \param usart Base address of the USART instance. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void usart_reset_status(volatile avr32_usart_t *usart) +{ + usart->cr = AVR32_USART_CR_RSTSTA_MASK; +} + +/*! \brief Checks if a parity error has occurred since last status reset. + * + * \param usart Base address of the USART instance. + * + * \return \c 1 if a parity error has been detected, otherwise \c 0. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ int usart_parity_error(volatile avr32_usart_t *usart) +{ + return (usart->csr & AVR32_USART_CSR_PARE_MASK) != 0; +} + +/*! \brief Checks if a framing error has occurred since last status reset. + * + * \param usart Base address of the USART instance. + * + * \return \c 1 if a framing error has been detected, otherwise \c 0. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ int usart_framing_error(volatile avr32_usart_t *usart) +{ + return (usart->csr & AVR32_USART_CSR_FRAME_MASK) != 0; +} + +/*! \brief Checks if an overrun error has occurred since last status reset. + * + * \param usart Base address of the USART instance. + * + * \return \c 1 if a overrun error has been detected, otherwise \c 0. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ int usart_overrun_error(volatile avr32_usart_t *usart) +{ + return (usart->csr & AVR32_USART_CSR_OVRE_MASK) != 0; +} + +#if defined(AVR32_USART_400_H_INCLUDED) || \ + defined(AVR32_USART_410_H_INCLUDED) || \ + defined(AVR32_USART_420_H_INCLUDED) || \ + defined(AVR32_USART_440_H_INCLUDED) || \ + defined(AVR32_USART_602_H_INCLUDED) + +/*! \brief Get LIN Error Status + * + * \param usart Base address of the USART instance. + * + * \retval The binary value of the error field. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ int usart_lin_get_error(volatile avr32_usart_t *usart) +{ + return (usart->csr & (AVR32_USART_CSR_LINSNRE_MASK | + AVR32_USART_CSR_LINCE_MASK | + AVR32_USART_CSR_LINIPE_MASK | + AVR32_USART_CSR_LINISFE_MASK | + AVR32_USART_CSR_LINBE_MASK)) >> AVR32_USART_CSR_LINBE_OFFSET; +} + +#endif // USART rev. >= 4.0.0 + +//! @} + + +//------------------------------------------------------------------------------ +/*! \name ISO7816 Control Functions + */ +//! @{ + +/*! \brief Enables the ISO7816 receiver. + * + * The ISO7816 transmitter is disabled. + * + * \param usart Base address of the USART instance. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void usart_iso7816_enable_receiver(volatile avr32_usart_t *usart) +{ + usart->cr = AVR32_USART_CR_TXDIS_MASK | AVR32_USART_CR_RXEN_MASK; +} + +/*! \brief Enables the ISO7816 transmitter. + * + * The ISO7816 receiver is disabled. + * + * \param usart Base address of the USART instance. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void usart_iso7816_enable_transmitter(volatile avr32_usart_t *usart) +{ + usart->cr = AVR32_USART_CR_RXDIS_MASK | AVR32_USART_CR_TXEN_MASK; +} + +//! @} + + +//------------------------------------------------------------------------------ +#if defined(AVR32_USART_400_H_INCLUDED) || \ + defined(AVR32_USART_410_H_INCLUDED) || \ + defined(AVR32_USART_420_H_INCLUDED) || \ + defined(AVR32_USART_440_H_INCLUDED) || \ + defined(AVR32_USART_602_H_INCLUDED) + +/*! \name LIN Control Functions + */ +//! @{ + +/*! \brief Sets the node action. + * + * \param usart Base address of the USART instance. + * \param action The node action: \ref USART_LIN_PUBLISH_ACTION, + * \ref USART_LIN_SUBSCRIBE_ACTION or + * \ref USART_LIN_IGNORE_ACTION. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void usart_lin_set_node_action(volatile avr32_usart_t *usart, unsigned char action) +{ + usart->linmr = (usart->linmr & ~AVR32_USART_LINMR_NACT_MASK) | + action << AVR32_USART_LINMR_NACT_OFFSET; +} + +/*! \brief Enables or disables the Identifier parity. + * + * \param usart Base address of the USART instance. + * \param parity Whether to enable the Identifier parity: \c TRUE or \c FALSE. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void usart_lin_enable_parity(volatile avr32_usart_t *usart, unsigned char parity) +{ + usart->linmr = (usart->linmr & ~AVR32_USART_LINMR_PARDIS_MASK) | + !parity << AVR32_USART_LINMR_PARDIS_OFFSET; +} + +/*! \brief Enables or disables the checksum. + * + * \param usart Base address of the USART instance. + * \param parity Whether to enable the checksum: \c TRUE or \c FALSE. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void usart_lin_enable_checksum(volatile avr32_usart_t *usart, unsigned char checksum) +{ + usart->linmr = (usart->linmr & ~AVR32_USART_LINMR_CHKDIS_MASK) | + !checksum << AVR32_USART_LINMR_CHKDIS_OFFSET; +} + +/*! \brief Sets the checksum type. + * + * \param usart Base address of the USART instance. + * \param chktyp The checksum type: \ref USART_LIN_ENHANCED_CHEKSUM or + * \ref USART_LIN_CLASSIC_CHECKSUM. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void usart_lin_set_checksum(volatile avr32_usart_t *usart, unsigned char chktyp) +{ + usart->linmr = (usart->linmr & ~AVR32_USART_LINMR_CHKTYP_MASK) | + chktyp << AVR32_USART_LINMR_CHKTYP_OFFSET; +} + +/*! \brief Gets the response data length. + * + * \param usart Base address of the USART instance. + * + * \return The response data length. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ unsigned char usart_lin_get_data_length(volatile avr32_usart_t *usart) +{ + if (usart->linmr & AVR32_USART_LINMR_DLM_MASK) + { + unsigned char data_length = 1 << ((usart->linir >> (AVR32_USART_LINIR_IDCHR_OFFSET + 4)) & 0x03); + if (data_length == 1) + data_length = 2; + return data_length; + } + else + return ((usart->linmr & AVR32_USART_LINMR_DLC_MASK) >> AVR32_USART_LINMR_DLC_OFFSET) + 1; +} + +/*! \brief Sets the response data length for LIN 1.x. + * + * \param usart Base address of the USART instance. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void usart_lin_set_data_length_lin1x(volatile avr32_usart_t *usart) +{ + usart->linmr |= AVR32_USART_LINMR_DLM_MASK; +} + +/*! \brief Sets the response data length for LIN 2.x. + * + * \param usart Base address of the USART instance. + * \param data_length The response data length. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void usart_lin_set_data_length_lin2x(volatile avr32_usart_t *usart, unsigned char data_length) +{ + usart->linmr = (usart->linmr & ~(AVR32_USART_LINMR_DLC_MASK | + AVR32_USART_LINMR_DLM_MASK)) | + (data_length - 1) << AVR32_USART_LINMR_DLC_OFFSET; +} + +/*! \brief Enables or disables the frame slot mode. + * + * \param usart Base address of the USART instance. + * \param frameslot Whether to enable the frame slot mode: \c TRUE or + * \c FALSE. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void usart_lin_enable_frameslot(volatile avr32_usart_t *usart, unsigned char frameslot) +{ + usart->linmr = (usart->linmr & ~AVR32_USART_LINMR_FSDIS_MASK) | + !frameslot << AVR32_USART_LINMR_FSDIS_OFFSET; +} + +/*! \brief Gets the Identifier character. + * + * \param usart Base address of the USART instance. + * + * \return The Identifier character. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ unsigned char usart_lin_get_id_char(volatile avr32_usart_t *usart) +{ + return (usart->linir & AVR32_USART_LINIR_IDCHR_MASK) >> AVR32_USART_LINIR_IDCHR_OFFSET; +} + +/*! \brief Sets the Identifier character. + * + * \param usart Base address of the USART instance. + * \param id_char The Identifier character. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void usart_lin_set_id_char(volatile avr32_usart_t *usart, unsigned char id_char) +{ + usart->linir = (usart->linir & ~AVR32_USART_LINIR_IDCHR_MASK) | + id_char << AVR32_USART_LINIR_IDCHR_OFFSET; +} + +//! @} + +#endif // USART rev. >= 4.0.0 + + +//------------------------------------------------------------------------------ +#if defined(AVR32_USART_400_H_INCLUDED) || \ + defined(AVR32_USART_410_H_INCLUDED) || \ + defined(AVR32_USART_420_H_INCLUDED) || \ + defined(AVR32_USART_440_H_INCLUDED) || \ + defined(AVR32_USART_602_H_INCLUDED) + +/*! \name SPI Control Functions + */ +//! @{ + +/*! \brief Selects SPI slave chip. + * + * \param usart Base address of the USART instance. + * + * \retval USART_SUCCESS Success. + */ +extern int usart_spi_selectChip(volatile avr32_usart_t *usart); + +/*! \brief Unselects SPI slave chip. + * + * \param usart Base address of the USART instance. + * + * \retval USART_SUCCESS Success. + * \retval USART_FAILURE Time-out. + */ +extern int usart_spi_unselectChip(volatile avr32_usart_t *usart); + +//! @} + +#endif // USART rev. >= 4.0.0 + + +//------------------------------------------------------------------------------ +/*! \name Transmit/Receive Functions + */ +//! @{ + +/*! \brief Addresses a receiver. + * + * While in RS485 mode, receivers only accept data addressed to them. + * A packet/char with the address tag set has to precede any data. + * This function is used to address a receiver. This receiver should read + * all the following data, until an address packet addresses another receiver. + * + * \param usart Base address of the USART instance. + * \param address Address of the target device. + * + * \retval USART_SUCCESS Address successfully sent (if current mode is RS485). + * \retval USART_MODE_FAULT Wrong operating mode. + */ +extern int usart_send_address(volatile avr32_usart_t *usart, int address); + +/*! \brief Tests if the USART is ready to transmit a character. + * + * \param usart Base address of the USART instance. + * + * \return \c 1 if the USART Transmit Holding Register is free, otherwise \c 0. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ int usart_tx_ready(volatile avr32_usart_t *usart) +{ + return (usart->csr & AVR32_USART_CSR_TXRDY_MASK) != 0; +} + +/*! \brief Writes the given character to the TX buffer if the transmitter is ready. + * + * \param usart Base address of the USART instance. + * \param c The character (up to 9 bits) to transmit. + * + * \retval USART_SUCCESS The transmitter was ready. + * \retval USART_TX_BUSY The transmitter was busy. + */ +extern int usart_write_char(volatile avr32_usart_t *usart, int c); + +/*! \brief An active wait writing a character to the USART. + * + * \param usart Base address of the USART instance. + * \param c The character (up to 9 bits) to transmit. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void usart_bw_write_char(volatile avr32_usart_t *usart, int c) +{ + while (usart_write_char(usart, c) != USART_SUCCESS); +} + +/*! \brief Sends a character with the USART. + * + * \param usart Base address of the USART instance. + * \param c Character to write. + * + * \retval USART_SUCCESS The character was written. + * \retval USART_FAILURE The function timed out before the USART transmitter became ready to send. + */ +extern int usart_putchar(volatile avr32_usart_t *usart, int c); + +/*! \brief Tests if all requested USART transmissions are over. + * + * \param usart Base address of the USART instance. + * + * \return \c 1 if the USART Transmit Shift Register and the USART Transmit + * Holding Register are free, otherwise \c 0. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ int usart_tx_empty(volatile avr32_usart_t *usart) +{ + return (usart->csr & AVR32_USART_CSR_TXEMPTY_MASK) != 0; +} + +/*! \brief Tests if the USART contains a received character. + * + * \param usart Base address of the USART instance. + * + * \return \c 1 if the USART Receive Holding Register is full, otherwise \c 0. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ int usart_test_hit(volatile avr32_usart_t *usart) +{ + return (usart->csr & AVR32_USART_CSR_RXRDY_MASK) != 0; +} + +/*! \brief Checks the RX buffer for a received character, and stores it at the + * given memory location. + * + * \param usart Base address of the USART instance. + * \param c Pointer to the where the read character should be stored + * (must be at least short in order to accept 9-bit characters). + * + * \retval USART_SUCCESS The character was read successfully. + * \retval USART_RX_EMPTY The RX buffer was empty. + * \retval USART_RX_ERROR An error was deteceted. + */ +extern int usart_read_char(volatile avr32_usart_t *usart, int *c); + +/*! \brief Waits until a character is received, and returns it. + * + * \param usart Base address of the USART instance. + * + * \return The received character, or \ref USART_FAILURE upon error. + */ +extern int usart_getchar(volatile avr32_usart_t *usart); + +/*! \brief Writes one character string to the USART. + * + * \param usart Base address of the USART instance. + * \param string String to be written. + */ +extern void usart_write_line(volatile avr32_usart_t *usart, const char *string); + +/*! \brief Gets and echoes characters until end of line. + * + * \param usart Base address of the USART instance. + * + * \retval USART_SUCCESS Success. + * \retval USART_FAILURE Low-level error detected or ETX character received. + */ +extern int usart_get_echo_line(volatile avr32_usart_t *usart); + +#if defined(AVR32_USART_400_H_INCLUDED) || \ + defined(AVR32_USART_410_H_INCLUDED) || \ + defined(AVR32_USART_420_H_INCLUDED) || \ + defined(AVR32_USART_440_H_INCLUDED) || \ + defined(AVR32_USART_602_H_INCLUDED) + +/*! \brief Abort LIN transmission. + * + * \param usart Base address of the USART instance. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void usart_lin_abort(volatile avr32_usart_t *usart) +{ + usart->cr = AVR32_USART_LINABT_MASK; +} + +/*! \brief Tests if a LIN transfer has been completed. + * + * \param usart Base address of the USART instance. + * + * \return \c 1 if a LIN transfer has been completed, otherwise \c 0. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ int usart_lin_transfer_completed(volatile avr32_usart_t *usart) +{ + return (usart->csr & AVR32_USART_CSR_LINTC_MASK) != 0; +} + +#endif // USART rev. >= 4.0.0 + +//! @} + + +#endif // _USART_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/DELAY/delay.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/DELAY/delay.c new file mode 100644 index 0000000..ad5ecca --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/DELAY/delay.c @@ -0,0 +1,87 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ****************************************************************** + * + * \brief Management of the delays. + * + * This file manages the "delays", with or without an OS. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ***************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +//_____ I N C L U D E S ___________________________________________________ + +#include "delay.h" + + +//_____ M A C R O S ________________________________________________________ + + +//_____ D E F I N I T I O N S ______________________________________________ + +//! CPU frequency +#ifndef FREERTOS_USED +static unsigned long s_fcpu_hz; +#endif +#if (defined NUTOS_USED) +extern void NutSleep(unsigned long ms); +#endif + +//_____ D E C L A R A T I O N S ____________________________________________ + +void delay_init(unsigned long fcpu_hz) +{ +#ifndef FREERTOS_USED + s_fcpu_hz = fcpu_hz; +#endif +} + + +void delay_ms(unsigned long delay) +{ +#if (defined FREERTOS_USED) + vTaskDelay( (portTickType)TASK_DELAY_MS(delay) ); +#elif (defined NUTOS_USED) + NutSleep(delay); +#else + cpu_delay_ms(delay, s_fcpu_hz); +#endif +} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/DELAY/delay.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/DELAY/delay.h new file mode 100644 index 0000000..2811326 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/DELAY/delay.h @@ -0,0 +1,80 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief AT32UC3 delay management header file. + * + * This file contains definitions and services to handle "delays". + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 AT32UC3 devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _DELAY_H_ +#define _DELAY_H_ + +#include "compiler.h" +#ifdef FREERTOS_USED +# include "FreeRTOS.h" +# include "task.h" +#else +# include "cycle_counter.h" +#endif + + +/*! + * \brief Initialize the delay driver. + * + * \param fcpu_hz: CPU frequency in Hz. + */ +extern void delay_init(unsigned long fcpu_hz); + + +/*! + * \brief Waits during at least the specified delay (in millisecond) before returning. + * + * Note that in the case of FreeRTOS, the function will delay the current task for a given number of ms. + * + * \param delay: Number of millisecond to wait. + */ +extern void delay_ms(unsigned long delay); + + +#endif // _DELAY_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/dhcp.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/dhcp.c new file mode 100644 index 0000000..8ef6c84 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/dhcp.c @@ -0,0 +1,1724 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/** + * @file + * Dynamic Host Configuration Protocol client + * + */ + +/* + * + * Copyright (c) 2001-2004 Leon Woestenberg + * Copyright (c) 2001-2004 Axon Digital Design B.V., The Netherlands. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is a contribution to the lwIP TCP/IP stack. + * The Swedish Institute of Computer Science and Adam Dunkels + * are specifically granted permission to redistribute this + * source code. + * + * Author: Leon Woestenberg + * + * This is a DHCP client for the lwIP TCP/IP stack. It aims to conform + * with RFC 2131 and RFC 2132. + * + * TODO: + * - Proper parsing of DHCP messages exploiting file/sname field overloading. + * - Add JavaDoc style documentation (API, internals). + * - Support for interfaces other than Ethernet (SLIP, PPP, ...) + * + * Please coordinate changes and requests with Leon Woestenberg + * + * + * Integration with your code: + * + * In lwip/dhcp.h + * #define DHCP_COARSE_TIMER_SECS (recommended 60 which is a minute) + * #define DHCP_FINE_TIMER_MSECS (recommended 500 which equals TCP coarse timer) + * + * Then have your application call dhcp_coarse_tmr() and + * dhcp_fine_tmr() on the defined intervals. + * + * dhcp_start(struct netif *netif); + * starts a DHCP client instance which configures the interface by + * obtaining an IP address lease and maintaining it. + * + * Use dhcp_release(netif) to end the lease and use dhcp_stop(netif) + * to remove the DHCP client. + * + */ + +#include "lwip/opt.h" + +#if LWIP_DHCP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/stats.h" +#include "lwip/mem.h" +#include "lwip/udp.h" +#include "lwip/ip_addr.h" +#include "lwip/netif.h" +#include "lwip/inet.h" +#include "lwip/sys.h" +#include "lwip/dhcp.h" +#include "lwip/autoip.h" +#include "lwip/dns.h" +#include "netif/etharp.h" + +#include + +/** Default for DHCP_GLOBAL_XID is 0xABCD0000 + * This can be changed by defining DHCP_GLOBAL_XID and DHCP_GLOBAL_XID_HEADER, e.g. + * #define DHCP_GLOBAL_XID_HEADER "stdlib.h" + * #define DHCP_GLOBAL_XID rand() + */ +#ifdef DHCP_GLOBAL_XID_HEADER +#include DHCP_GLOBAL_XID_HEADER /* include optional starting XID generation prototypes */ +#endif + +/** DHCP_OPTION_MAX_MSG_SIZE is set to the MTU + * MTU is checked to be big enough in dhcp_start */ +#define DHCP_MAX_MSG_LEN(netif) (netif->mtu) +#define DHCP_MAX_MSG_LEN_MIN_REQUIRED 576 +/** Minimum length for reply before packet is parsed */ +#define DHCP_MIN_REPLY_LEN 44 + +#define REBOOT_TRIES 2 + +/* DHCP client state machine functions */ +static void dhcp_handle_ack(struct netif *netif); +static void dhcp_handle_nak(struct netif *netif); +static void dhcp_handle_offer(struct netif *netif); + +static err_t dhcp_discover(struct netif *netif); +static err_t dhcp_select(struct netif *netif); +static void dhcp_bind(struct netif *netif); +#if DHCP_DOES_ARP_CHECK +static void dhcp_check(struct netif *netif); +static err_t dhcp_decline(struct netif *netif); +#endif /* DHCP_DOES_ARP_CHECK */ +static err_t dhcp_rebind(struct netif *netif); +static err_t dhcp_reboot(struct netif *netif); +static void dhcp_set_state(struct dhcp *dhcp, u8_t new_state); + +/* receive, unfold, parse and free incoming messages */ +static void dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr, u16_t port); +static err_t dhcp_unfold_reply(struct dhcp *dhcp, struct pbuf *p); +static u8_t *dhcp_get_option_ptr(struct dhcp *dhcp, u8_t option_type); +static u8_t dhcp_get_option_byte(u8_t *ptr); +#if 0 +static u16_t dhcp_get_option_short(u8_t *ptr); +#endif +static u32_t dhcp_get_option_long(u8_t *ptr); +static void dhcp_free_reply(struct dhcp *dhcp); + +/* set the DHCP timers */ +static void dhcp_timeout(struct netif *netif); +static void dhcp_t1_timeout(struct netif *netif); +static void dhcp_t2_timeout(struct netif *netif); + +/* build outgoing messages */ +/* create a DHCP request, fill in common headers */ +static err_t dhcp_create_request(struct netif *netif); +/* free a DHCP request */ +static void dhcp_delete_request(struct netif *netif); +/* add a DHCP option (type, then length in bytes) */ +static void dhcp_option(struct dhcp *dhcp, u8_t option_type, u8_t option_len); +/* add option values */ +static void dhcp_option_byte(struct dhcp *dhcp, u8_t value); +static void dhcp_option_short(struct dhcp *dhcp, u16_t value); +static void dhcp_option_long(struct dhcp *dhcp, u32_t value); +/* always add the DHCP options trailer to end and pad */ +static void dhcp_option_trailer(struct dhcp *dhcp); + +/** + * Back-off the DHCP client (because of a received NAK response). + * + * Back-off the DHCP client because of a received NAK. Receiving a + * NAK means the client asked for something non-sensible, for + * example when it tries to renew a lease obtained on another network. + * + * We clear any existing set IP address and restart DHCP negotiation + * afresh (as per RFC2131 3.2.3). + * + * @param netif the netif under DHCP control + */ +static void +dhcp_handle_nak(struct netif *netif) +{ + struct dhcp *dhcp = netif->dhcp; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_handle_nak(netif=%p) %c%c%"U16_F"\n", + (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num)); + /* Set the interface down since the address must no longer be used, as per RFC2131 */ + netif_set_down(netif); + /* remove IP address from interface */ + netif_set_ipaddr(netif, IP_ADDR_ANY); + netif_set_gw(netif, IP_ADDR_ANY); + netif_set_netmask(netif, IP_ADDR_ANY); + /* Change to a defined state */ + dhcp_set_state(dhcp, DHCP_BACKING_OFF); + /* We can immediately restart discovery */ + dhcp_discover(netif); +} + +#if DHCP_DOES_ARP_CHECK +/** + * Checks if the offered IP address is already in use. + * + * It does so by sending an ARP request for the offered address and + * entering CHECKING state. If no ARP reply is received within a small + * interval, the address is assumed to be free for use by us. + * + * @param netif the netif under DHCP control + */ +static void +dhcp_check(struct netif *netif) +{ + struct dhcp *dhcp = netif->dhcp; + err_t result; + u16_t msecs; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_check(netif=%p) %c%c\n", (void *)netif, (s16_t)netif->name[0], + (s16_t)netif->name[1])); + dhcp_set_state(dhcp, DHCP_CHECKING); + /* create an ARP query for the offered IP address, expecting that no host + responds, as the IP address should not be in use. */ + result = etharp_query(netif, &dhcp->offered_ip_addr, NULL); + if (result != ERR_OK) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("dhcp_check: could not perform ARP query\n")); + } + dhcp->tries++; + msecs = 500; + dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_check(): set request timeout %"U16_F" msecs\n", msecs)); +} +#endif /* DHCP_DOES_ARP_CHECK */ + +/** + * Remember the configuration offered by a DHCP server. + * + * @param netif the netif under DHCP control + */ +static void +dhcp_handle_offer(struct netif *netif) +{ + struct dhcp *dhcp = netif->dhcp; + /* obtain the server address */ + u8_t *option_ptr = dhcp_get_option_ptr(dhcp, DHCP_OPTION_SERVER_ID); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_handle_offer(netif=%p) %c%c%"U16_F"\n", + (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num)); + if (option_ptr != NULL) { + dhcp->server_ip_addr.addr = htonl(dhcp_get_option_long(&option_ptr[2])); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_handle_offer(): server 0x%08"X32_F"\n", dhcp->server_ip_addr.addr)); + /* remember offered address */ + ip_addr_set(&dhcp->offered_ip_addr, (struct ip_addr *)&dhcp->msg_in->yiaddr); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_handle_offer(): offer for 0x%08"X32_F"\n", dhcp->offered_ip_addr.addr)); + + dhcp_select(netif); + } +} + +/** + * Select a DHCP server offer out of all offers. + * + * Simply select the first offer received. + * + * @param netif the netif under DHCP control + * @return lwIP specific error (see error.h) + */ +static err_t +dhcp_select(struct netif *netif) +{ + struct dhcp *dhcp = netif->dhcp; + err_t result; + u16_t msecs; +#if LWIP_NETIF_HOSTNAME + const char *p; +#endif /* LWIP_NETIF_HOSTNAME */ + + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_select(netif=%p) %c%c%"U16_F"\n", (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num)); + dhcp_set_state(dhcp, DHCP_REQUESTING); + + /* create and initialize the DHCP message header */ + result = dhcp_create_request(netif); + if (result == ERR_OK) { + dhcp_option(dhcp, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN); + dhcp_option_byte(dhcp, DHCP_REQUEST); + + dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); + dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif)); + + /* MUST request the offered IP address */ + dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4); + dhcp_option_long(dhcp, ntohl(dhcp->offered_ip_addr.addr)); + + dhcp_option(dhcp, DHCP_OPTION_SERVER_ID, 4); + dhcp_option_long(dhcp, ntohl(dhcp->server_ip_addr.addr)); + + dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, 4/*num options*/); + dhcp_option_byte(dhcp, DHCP_OPTION_SUBNET_MASK); + dhcp_option_byte(dhcp, DHCP_OPTION_ROUTER); + dhcp_option_byte(dhcp, DHCP_OPTION_BROADCAST); + dhcp_option_byte(dhcp, DHCP_OPTION_DNS_SERVER); + +#if LWIP_NETIF_HOSTNAME + p = (const char*)netif->hostname; + if (p != NULL) { + dhcp_option(dhcp, DHCP_OPTION_HOSTNAME, strlen(p)); + while (*p) { + dhcp_option_byte(dhcp, *p++); + } + } +#endif /* LWIP_NETIF_HOSTNAME */ + + dhcp_option_trailer(dhcp); + /* shrink the pbuf to the actual content length */ + pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len); + + /* send broadcast to any DHCP server */ + udp_sendto_if(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif); + dhcp_delete_request(netif); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_select: REQUESTING\n")); + } else { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("dhcp_select: could not allocate DHCP request\n")); + } + dhcp->tries++; + msecs = (dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000; + dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_select(): set request timeout %"U16_F" msecs\n", msecs)); + return result; +} + +/** + * The DHCP timer that checks for lease renewal/rebind timeouts. + * + */ +void +dhcp_coarse_tmr() +{ + struct netif *netif = netif_list; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_coarse_tmr()\n")); + /* iterate through all network interfaces */ + while (netif != NULL) { + /* only act on DHCP configured interfaces */ + if (netif->dhcp != NULL) { + /* timer is active (non zero), and triggers (zeroes) now? */ + if (netif->dhcp->t2_timeout-- == 1) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_coarse_tmr(): t2 timeout\n")); + /* this clients' rebind timeout triggered */ + dhcp_t2_timeout(netif); + /* timer is active (non zero), and triggers (zeroes) now */ + } else if (netif->dhcp->t1_timeout-- == 1) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_coarse_tmr(): t1 timeout\n")); + /* this clients' renewal timeout triggered */ + dhcp_t1_timeout(netif); + } + } + /* proceed to next netif */ + netif = netif->next; + } +} + +/** + * DHCP transaction timeout handling + * + * A DHCP server is expected to respond within a short period of time. + * This timer checks whether an outstanding DHCP request is timed out. + * + */ +void +dhcp_fine_tmr() +{ + struct netif *netif = netif_list; + /* loop through netif's */ + while (netif != NULL) { + /* only act on DHCP configured interfaces */ + if (netif->dhcp != NULL) { + /* timer is active (non zero), and is about to trigger now */ + if (netif->dhcp->request_timeout > 1) { + netif->dhcp->request_timeout--; + } + else if (netif->dhcp->request_timeout == 1) { + netif->dhcp->request_timeout--; + /* { netif->dhcp->request_timeout == 0 } */ + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_fine_tmr(): request timeout\n")); + /* this clients' request timeout triggered */ + dhcp_timeout(netif); + } + } + /* proceed to next network interface */ + netif = netif->next; + } +} + +/** + * A DHCP negotiation transaction, or ARP request, has timed out. + * + * The timer that was started with the DHCP or ARP request has + * timed out, indicating no response was received in time. + * + * @param netif the netif under DHCP control + */ +static void +dhcp_timeout(struct netif *netif) +{ + struct dhcp *dhcp = netif->dhcp; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_timeout()\n")); + /* back-off period has passed, or server selection timed out */ + if ((dhcp->state == DHCP_BACKING_OFF) || (dhcp->state == DHCP_SELECTING)) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_timeout(): restarting discovery\n")); + dhcp_discover(netif); + /* receiving the requested lease timed out */ + } else if (dhcp->state == DHCP_REQUESTING) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): REQUESTING, DHCP request timed out\n")); + if (dhcp->tries <= 5) { + dhcp_select(netif); + } else { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): REQUESTING, releasing, restarting\n")); + dhcp_release(netif); + dhcp_discover(netif); + } +#if DHCP_DOES_ARP_CHECK + /* received no ARP reply for the offered address (which is good) */ + } else if (dhcp->state == DHCP_CHECKING) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): CHECKING, ARP request timed out\n")); + if (dhcp->tries <= 1) { + dhcp_check(netif); + /* no ARP replies on the offered address, + looks like the IP address is indeed free */ + } else { + /* bind the interface to the offered address */ + dhcp_bind(netif); + } +#endif /* DHCP_DOES_ARP_CHECK */ + } + /* did not get response to renew request? */ + else if (dhcp->state == DHCP_RENEWING) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): RENEWING, DHCP request timed out\n")); + /* just retry renewal */ + /* note that the rebind timer will eventually time-out if renew does not work */ + dhcp_renew(netif); + /* did not get response to rebind request? */ + } else if (dhcp->state == DHCP_REBINDING) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): REBINDING, DHCP request timed out\n")); + if (dhcp->tries <= 8) { + dhcp_rebind(netif); + } else { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): RELEASING, DISCOVERING\n")); + dhcp_release(netif); + dhcp_discover(netif); + } + } else if (dhcp->state == DHCP_REBOOTING) { + if (dhcp->tries < REBOOT_TRIES) { + dhcp_reboot(netif); + } else { + dhcp_discover(netif); + } + } +} + +/** + * The renewal period has timed out. + * + * @param netif the netif under DHCP control + */ +static void +dhcp_t1_timeout(struct netif *netif) +{ + struct dhcp *dhcp = netif->dhcp; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_t1_timeout()\n")); + if ((dhcp->state == DHCP_REQUESTING) || (dhcp->state == DHCP_BOUND) || (dhcp->state == DHCP_RENEWING)) { + /* just retry to renew - note that the rebind timer (t2) will + * eventually time-out if renew tries fail. */ + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_t1_timeout(): must renew\n")); + dhcp_renew(netif); + } +} + +/** + * The rebind period has timed out. + * + * @param netif the netif under DHCP control + */ +static void +dhcp_t2_timeout(struct netif *netif) +{ + struct dhcp *dhcp = netif->dhcp; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_t2_timeout()\n")); + if ((dhcp->state == DHCP_REQUESTING) || (dhcp->state == DHCP_BOUND) || (dhcp->state == DHCP_RENEWING)) { + /* just retry to rebind */ + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_t2_timeout(): must rebind\n")); + dhcp_rebind(netif); + } +} + +/** + * Handle a DHCP ACK packet + * + * @param netif the netif under DHCP control + */ +static void +dhcp_handle_ack(struct netif *netif) +{ + struct dhcp *dhcp = netif->dhcp; + u8_t *option_ptr; + /* clear options we might not get from the ACK */ + dhcp->offered_sn_mask.addr = 0; + dhcp->offered_gw_addr.addr = 0; + dhcp->offered_bc_addr.addr = 0; + + /* lease time given? */ + option_ptr = dhcp_get_option_ptr(dhcp, DHCP_OPTION_LEASE_TIME); + if (option_ptr != NULL) { + /* remember offered lease time */ + dhcp->offered_t0_lease = dhcp_get_option_long(option_ptr + 2); + } + /* renewal period given? */ + option_ptr = dhcp_get_option_ptr(dhcp, DHCP_OPTION_T1); + if (option_ptr != NULL) { + /* remember given renewal period */ + dhcp->offered_t1_renew = dhcp_get_option_long(option_ptr + 2); + } else { + /* calculate safe periods for renewal */ + dhcp->offered_t1_renew = dhcp->offered_t0_lease / 2; + } + + /* renewal period given? */ + option_ptr = dhcp_get_option_ptr(dhcp, DHCP_OPTION_T2); + if (option_ptr != NULL) { + /* remember given rebind period */ + dhcp->offered_t2_rebind = dhcp_get_option_long(option_ptr + 2); + } else { + /* calculate safe periods for rebinding */ + dhcp->offered_t2_rebind = dhcp->offered_t0_lease; + } + + /* (y)our internet address */ + ip_addr_set(&dhcp->offered_ip_addr, &dhcp->msg_in->yiaddr); + +/** + * Patch #1308 + * TODO: we must check if the file field is not overloaded by DHCP options! + */ +#if 0 + /* boot server address */ + ip_addr_set(&dhcp->offered_si_addr, &dhcp->msg_in->siaddr); + /* boot file name */ + if (dhcp->msg_in->file[0]) { + dhcp->boot_file_name = mem_malloc(strlen(dhcp->msg_in->file) + 1); + strcpy(dhcp->boot_file_name, dhcp->msg_in->file); + } +#endif + + /* subnet mask */ + option_ptr = dhcp_get_option_ptr(dhcp, DHCP_OPTION_SUBNET_MASK); + /* subnet mask given? */ + if (option_ptr != NULL) { + dhcp->offered_sn_mask.addr = htonl(dhcp_get_option_long(&option_ptr[2])); + } + + /* gateway router */ + option_ptr = dhcp_get_option_ptr(dhcp, DHCP_OPTION_ROUTER); + if (option_ptr != NULL) { + dhcp->offered_gw_addr.addr = htonl(dhcp_get_option_long(&option_ptr[2])); + } + + /* broadcast address */ + option_ptr = dhcp_get_option_ptr(dhcp, DHCP_OPTION_BROADCAST); + if (option_ptr != NULL) { + dhcp->offered_bc_addr.addr = htonl(dhcp_get_option_long(&option_ptr[2])); + } + + /* DNS servers */ + option_ptr = dhcp_get_option_ptr(dhcp, DHCP_OPTION_DNS_SERVER); + if (option_ptr != NULL) { + u8_t n; + dhcp->dns_count = dhcp_get_option_byte(&option_ptr[1]) / (u32_t)sizeof(struct ip_addr); + /* limit to at most DHCP_MAX_DNS DNS servers */ + if (dhcp->dns_count > DHCP_MAX_DNS) + dhcp->dns_count = DHCP_MAX_DNS; + for (n = 0; n < dhcp->dns_count; n++) { + dhcp->offered_dns_addr[n].addr = htonl(dhcp_get_option_long(&option_ptr[2 + n * 4])); +#if LWIP_DNS + dns_setserver( n, (struct ip_addr *)(&(dhcp->offered_dns_addr[n].addr))); +#endif /* LWIP_DNS */ + } +#if LWIP_DNS + dns_setserver( n, (struct ip_addr *)(&ip_addr_any)); +#endif /* LWIP_DNS */ + } +} + +/** + * Start DHCP negotiation for a network interface. + * + * If no DHCP client instance was attached to this interface, + * a new client is created first. If a DHCP client instance + * was already present, it restarts negotiation. + * + * @param netif The lwIP network interface + * @return lwIP error code + * - ERR_OK - No error + * - ERR_MEM - Out of memory + */ +err_t +dhcp_start(struct netif *netif) +{ + struct dhcp *dhcp; + err_t result = ERR_OK; + + LWIP_ERROR("netif != NULL", (netif != NULL), return ERR_ARG;); + dhcp = netif->dhcp; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_start(netif=%p) %c%c%"U16_F"\n", (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num)); + /* Remove the flag that says this netif is handled by DHCP, + it is set when we succeeded starting. */ + netif->flags &= ~NETIF_FLAG_DHCP; + + /* check MTU of the netif */ + if (netif->mtu < DHCP_MAX_MSG_LEN_MIN_REQUIRED) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): Cannot use this netif with DHCP: MTU is too small\n")); + return ERR_MEM; + } + + /* no DHCP client attached yet? */ + if (dhcp == NULL) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): starting new DHCP client\n")); + dhcp = mem_malloc(sizeof(struct dhcp)); + if (dhcp == NULL) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): could not allocate dhcp\n")); + return ERR_MEM; + } + /* store this dhcp client in the netif */ + netif->dhcp = dhcp; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): allocated dhcp")); + /* already has DHCP client attached */ + } else { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_start(): restarting DHCP configuration\n")); + if (dhcp->pcb != NULL) { + udp_remove(dhcp->pcb); + } + LWIP_ASSERT("pbuf p_out wasn't freed", dhcp->p_out == NULL); + LWIP_ASSERT("reply wasn't freed", dhcp->msg_in == NULL && + dhcp->options_in == NULL && dhcp->options_in_len == 0); + } + + /* clear data structure */ + memset(dhcp, 0, sizeof(struct dhcp)); + /* allocate UDP PCB */ + dhcp->pcb = udp_new(); + if (dhcp->pcb == NULL) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): could not obtain pcb\n")); + mem_free((void *)dhcp); + netif->dhcp = dhcp = NULL; + return ERR_MEM; + } +#if IP_SOF_BROADCAST + dhcp->pcb->so_options|=SOF_BROADCAST; +#endif /* IP_SOF_BROADCAST */ + /* set up local and remote port for the pcb */ + udp_bind(dhcp->pcb, IP_ADDR_ANY, DHCP_CLIENT_PORT); + udp_connect(dhcp->pcb, IP_ADDR_ANY, DHCP_SERVER_PORT); + /* set up the recv callback and argument */ + udp_recv(dhcp->pcb, dhcp_recv, netif); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): starting DHCP configuration\n")); + /* (re)start the DHCP negotiation */ + result = dhcp_discover(netif); + if (result != ERR_OK) { + /* free resources allocated above */ + dhcp_stop(netif); + return ERR_MEM; + } + /* Set the flag that says this netif is handled by DHCP. */ + netif->flags |= NETIF_FLAG_DHCP; + return result; +} + +/** + * Inform a DHCP server of our manual configuration. + * + * This informs DHCP servers of our fixed IP address configuration + * by sending an INFORM message. It does not involve DHCP address + * configuration, it is just here to be nice to the network. + * + * @param netif The lwIP network interface + */ +void +dhcp_inform(struct netif *netif) +{ + struct dhcp *dhcp, *old_dhcp; + err_t result = ERR_OK; + dhcp = mem_malloc(sizeof(struct dhcp)); + if (dhcp == NULL) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_inform(): could not allocate dhcp\n")); + return; + } + memset(dhcp, 0, sizeof(struct dhcp)); + + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_inform(): allocated dhcp\n")); + dhcp->pcb = udp_new(); + if (dhcp->pcb == NULL) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_inform(): could not obtain pcb")); + goto free_dhcp_and_return; + } + old_dhcp = netif->dhcp; + netif->dhcp = dhcp; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_inform(): created new udp pcb\n")); + /* create and initialize the DHCP message header */ + result = dhcp_create_request(netif); + if (result == ERR_OK) { + + dhcp_option(dhcp, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN); + dhcp_option_byte(dhcp, DHCP_INFORM); + + dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); + dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif)); + + dhcp_option_trailer(dhcp); + + pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len); + +#if IP_SOF_BROADCAST + dhcp->pcb->so_options|=SOF_BROADCAST; +#endif /* IP_SOF_BROADCAST */ + udp_bind(dhcp->pcb, IP_ADDR_ANY, DHCP_CLIENT_PORT); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_inform: INFORMING\n")); + udp_sendto_if(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif); + dhcp_delete_request(netif); + } else { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_inform: could not allocate DHCP request\n")); + } + + udp_remove(dhcp->pcb); + dhcp->pcb = NULL; + netif->dhcp = old_dhcp; +free_dhcp_and_return: + mem_free((void *)dhcp); +} + +/** Handle a possible change in the network configuration. + * + * This enters the REBOOTING state to verify that the currently bound + * address is still valid. + */ +void +dhcp_network_changed(struct netif *netif) +{ + struct dhcp *dhcp = netif->dhcp; + if (!dhcp) + return; + switch (dhcp->state) { + case DHCP_REBINDING: + case DHCP_RENEWING: + case DHCP_BOUND: + case DHCP_REBOOTING: + netif_set_down(netif); + dhcp->tries = 0; + dhcp_reboot(netif); + break; + case DHCP_OFF: + /* stay off */ + break; + default: + dhcp->tries = 0; + dhcp_discover(netif); + break; + } +} + +#if DHCP_DOES_ARP_CHECK +/** + * Match an ARP reply with the offered IP address. + * + * @param netif the network interface on which the reply was received + * @param addr The IP address we received a reply from + */ +void dhcp_arp_reply(struct netif *netif, struct ip_addr *addr) +{ + LWIP_ERROR("netif != NULL", (netif != NULL), return;); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_arp_reply()\n")); + /* is a DHCP client doing an ARP check? */ + if ((netif->dhcp != NULL) && (netif->dhcp->state == DHCP_CHECKING)) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_arp_reply(): CHECKING, arp reply for 0x%08"X32_F"\n", addr->addr)); + /* did a host respond with the address we + were offered by the DHCP server? */ + if (ip_addr_cmp(addr, &netif->dhcp->offered_ip_addr)) { + /* we will not accept the offered address */ + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE | LWIP_DBG_LEVEL_WARNING, + ("dhcp_arp_reply(): arp reply matched with offered address, declining\n")); + dhcp_decline(netif); + } + } +} + +/** + * Decline an offered lease. + * + * Tell the DHCP server we do not accept the offered address. + * One reason to decline the lease is when we find out the address + * is already in use by another host (through ARP). + * + * @param netif the netif under DHCP control + */ +static err_t +dhcp_decline(struct netif *netif) +{ + struct dhcp *dhcp = netif->dhcp; + err_t result = ERR_OK; + u16_t msecs; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_decline()\n")); + dhcp_set_state(dhcp, DHCP_BACKING_OFF); + /* create and initialize the DHCP message header */ + result = dhcp_create_request(netif); + if (result == ERR_OK) { + dhcp_option(dhcp, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN); + dhcp_option_byte(dhcp, DHCP_DECLINE); + + dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4); + dhcp_option_long(dhcp, ntohl(dhcp->offered_ip_addr.addr)); + + dhcp_option_trailer(dhcp); + /* resize pbuf to reflect true size of options */ + pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len); + + /* per section 4.4.4, broadcast DECLINE messages */ + udp_sendto_if(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif); + dhcp_delete_request(netif); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_decline: BACKING OFF\n")); + } else { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, + ("dhcp_decline: could not allocate DHCP request\n")); + } + dhcp->tries++; + msecs = 10*1000; + dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_decline(): set request timeout %"U16_F" msecs\n", msecs)); + return result; +} +#endif + + +/** + * Start the DHCP process, discover a DHCP server. + * + * @param netif the netif under DHCP control + */ +static err_t +dhcp_discover(struct netif *netif) +{ + struct dhcp *dhcp = netif->dhcp; + err_t result = ERR_OK; + u16_t msecs; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover()\n")); + ip_addr_set(&dhcp->offered_ip_addr, IP_ADDR_ANY); + dhcp_set_state(dhcp, DHCP_SELECTING); + /* create and initialize the DHCP message header */ + result = dhcp_create_request(netif); + if (result == ERR_OK) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: making request\n")); + dhcp_option(dhcp, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN); + dhcp_option_byte(dhcp, DHCP_DISCOVER); + + dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); + dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif)); + + dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, 4/*num options*/); + dhcp_option_byte(dhcp, DHCP_OPTION_SUBNET_MASK); + dhcp_option_byte(dhcp, DHCP_OPTION_ROUTER); + dhcp_option_byte(dhcp, DHCP_OPTION_BROADCAST); + dhcp_option_byte(dhcp, DHCP_OPTION_DNS_SERVER); + + dhcp_option_trailer(dhcp); + + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: realloc()ing\n")); + pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len); + + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: sendto(DISCOVER, IP_ADDR_BROADCAST, DHCP_SERVER_PORT)\n")); + udp_sendto_if(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: deleting()ing\n")); + dhcp_delete_request(netif); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_discover: SELECTING\n")); + } else { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_discover: could not allocate DHCP request\n")); + } + dhcp->tries++; +#if LWIP_DHCP_AUTOIP_COOP + if(dhcp->tries >= LWIP_DHCP_AUTOIP_COOP_TRIES && dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_OFF) { + dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_ON; + autoip_start(netif); + } +#endif /* LWIP_DHCP_AUTOIP_COOP */ + msecs = (dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000; + dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_discover(): set request timeout %"U16_F" msecs\n", msecs)); + return result; +} + + +/** + * Bind the interface to the offered IP address. + * + * @param netif network interface to bind to the offered address + */ +static void +dhcp_bind(struct netif *netif) +{ + u32_t timeout; + struct dhcp *dhcp; + struct ip_addr sn_mask, gw_addr; + LWIP_ERROR("dhcp_bind: netif != NULL", (netif != NULL), return;); + dhcp = netif->dhcp; + LWIP_ERROR("dhcp_bind: dhcp != NULL", (dhcp != NULL), return;); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_bind(netif=%p) %c%c%"U16_F"\n", (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num)); + + /* temporary DHCP lease? */ + if (dhcp->offered_t1_renew != 0xffffffffUL) { + /* set renewal period timer */ + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_bind(): t1 renewal timer %"U32_F" secs\n", dhcp->offered_t1_renew)); + timeout = (dhcp->offered_t1_renew + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS; + if(timeout > 0xffff) { + timeout = 0xffff; + } + dhcp->t1_timeout = (u16_t)timeout; + if (dhcp->t1_timeout == 0) { + dhcp->t1_timeout = 1; + } + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_bind(): set request timeout %"U32_F" msecs\n", dhcp->offered_t1_renew*1000)); + } + /* set renewal period timer */ + if (dhcp->offered_t2_rebind != 0xffffffffUL) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_bind(): t2 rebind timer %"U32_F" secs\n", dhcp->offered_t2_rebind)); + timeout = (dhcp->offered_t2_rebind + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS; + if(timeout > 0xffff) { + timeout = 0xffff; + } + dhcp->t2_timeout = (u16_t)timeout; + if (dhcp->t2_timeout == 0) { + dhcp->t2_timeout = 1; + } + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_bind(): set request timeout %"U32_F" msecs\n", dhcp->offered_t2_rebind*1000)); + } + /* copy offered network mask */ + ip_addr_set(&sn_mask, &dhcp->offered_sn_mask); + + /* subnet mask not given? */ + /* TODO: this is not a valid check. what if the network mask is 0? */ + if (sn_mask.addr == 0) { + /* choose a safe subnet mask given the network class */ + u8_t first_octet = ip4_addr1(&sn_mask); + if (first_octet <= 127) { + sn_mask.addr = htonl(0xff000000); + } else if (first_octet >= 192) { + sn_mask.addr = htonl(0xffffff00); + } else { + sn_mask.addr = htonl(0xffff0000); + } + } + + ip_addr_set(&gw_addr, &dhcp->offered_gw_addr); + /* gateway address not given? */ + if (gw_addr.addr == 0) { + /* copy network address */ + gw_addr.addr = (dhcp->offered_ip_addr.addr & sn_mask.addr); + /* use first host address on network as gateway */ + gw_addr.addr |= htonl(0x00000001); + } + +#if LWIP_DHCP_AUTOIP_COOP + if(dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_ON) { + autoip_stop(netif); + dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_OFF; + } +#endif /* LWIP_DHCP_AUTOIP_COOP */ + + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_bind(): IP: 0x%08"X32_F"\n", dhcp->offered_ip_addr.addr)); + netif_set_ipaddr(netif, &dhcp->offered_ip_addr); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_bind(): SN: 0x%08"X32_F"\n", sn_mask.addr)); + netif_set_netmask(netif, &sn_mask); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_bind(): GW: 0x%08"X32_F"\n", gw_addr.addr)); + netif_set_gw(netif, &gw_addr); + /* bring the interface up */ + netif_set_up(netif); + /* netif is now bound to DHCP leased address */ + dhcp_set_state(dhcp, DHCP_BOUND); +} + +/** + * Renew an existing DHCP lease at the involved DHCP server. + * + * @param netif network interface which must renew its lease + */ +err_t +dhcp_renew(struct netif *netif) +{ + struct dhcp *dhcp = netif->dhcp; + err_t result; + u16_t msecs; +#if LWIP_NETIF_HOSTNAME + const char *p; +#endif /* LWIP_NETIF_HOSTNAME */ + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_renew()\n")); + dhcp_set_state(dhcp, DHCP_RENEWING); + + /* create and initialize the DHCP message header */ + result = dhcp_create_request(netif); + if (result == ERR_OK) { + + dhcp_option(dhcp, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN); + dhcp_option_byte(dhcp, DHCP_REQUEST); + + dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); + dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif)); + +#if LWIP_NETIF_HOSTNAME + p = (const char*)netif->hostname; + if (p != NULL) { + dhcp_option(dhcp, DHCP_OPTION_HOSTNAME, strlen(p)); + while (*p) { + dhcp_option_byte(dhcp, *p++); + } + } +#endif /* LWIP_NETIF_HOSTNAME */ + +#if 0 + dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4); + dhcp_option_long(dhcp, ntohl(dhcp->offered_ip_addr.addr)); +#endif + +#if 0 + dhcp_option(dhcp, DHCP_OPTION_SERVER_ID, 4); + dhcp_option_long(dhcp, ntohl(dhcp->server_ip_addr.addr)); +#endif + /* append DHCP message trailer */ + dhcp_option_trailer(dhcp); + + pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len); + + udp_sendto_if(dhcp->pcb, dhcp->p_out, &dhcp->server_ip_addr, DHCP_SERVER_PORT, netif); + dhcp_delete_request(netif); + + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_renew: RENEWING\n")); + } else { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_renew: could not allocate DHCP request\n")); + } + dhcp->tries++; + /* back-off on retries, but to a maximum of 20 seconds */ + msecs = dhcp->tries < 10 ? dhcp->tries * 2000 : 20 * 1000; + dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_renew(): set request timeout %"U16_F" msecs\n", msecs)); + return result; +} + +/** + * Rebind with a DHCP server for an existing DHCP lease. + * + * @param netif network interface which must rebind with a DHCP server + */ +static err_t +dhcp_rebind(struct netif *netif) +{ + struct dhcp *dhcp = netif->dhcp; + err_t result; + u16_t msecs; +#if LWIP_NETIF_HOSTNAME + const char *p; +#endif /* LWIP_NETIF_HOSTNAME */ + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_rebind()\n")); + dhcp_set_state(dhcp, DHCP_REBINDING); + + /* create and initialize the DHCP message header */ + result = dhcp_create_request(netif); + if (result == ERR_OK) { + + dhcp_option(dhcp, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN); + dhcp_option_byte(dhcp, DHCP_REQUEST); + + dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); + dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif)); + +#if LWIP_NETIF_HOSTNAME + p = (const char*)netif->hostname; + if (p != NULL) { + dhcp_option(dhcp, DHCP_OPTION_HOSTNAME, strlen(p)); + while (*p) { + dhcp_option_byte(dhcp, *p++); + } + } +#endif /* LWIP_NETIF_HOSTNAME */ + +#if 0 + dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4); + dhcp_option_long(dhcp, ntohl(dhcp->offered_ip_addr.addr)); + + dhcp_option(dhcp, DHCP_OPTION_SERVER_ID, 4); + dhcp_option_long(dhcp, ntohl(dhcp->server_ip_addr.addr)); +#endif + + dhcp_option_trailer(dhcp); + + pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len); + + /* broadcast to server */ + udp_sendto_if(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif); + dhcp_delete_request(netif); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_rebind: REBINDING\n")); + } else { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_rebind: could not allocate DHCP request\n")); + } + dhcp->tries++; + msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000; + dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_rebind(): set request timeout %"U16_F" msecs\n", msecs)); + return result; +} + +/** + * Enter REBOOTING state to verify an existing lease + * + * @param netif network interface which must reboot + */ +static err_t +dhcp_reboot(struct netif *netif) +{ + struct dhcp *dhcp = netif->dhcp; + err_t result; + u16_t msecs; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_reboot()\n")); + dhcp_set_state(dhcp, DHCP_REBOOTING); + + /* create and initialize the DHCP message header */ + result = dhcp_create_request(netif); + if (result == ERR_OK) { + + dhcp_option(dhcp, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN); + dhcp_option_byte(dhcp, DHCP_REQUEST); + + dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); + dhcp_option_short(dhcp, 576); + + dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4); + dhcp_option_long(dhcp, ntohl(dhcp->offered_ip_addr.addr)); + + dhcp_option_trailer(dhcp); + + pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len); + + /* broadcast to server */ + udp_sendto_if(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif); + dhcp_delete_request(netif); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_reboot: REBOOTING\n")); + } else { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_reboot: could not allocate DHCP request\n")); + } + dhcp->tries++; + msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000; + dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_reboot(): set request timeout %"U16_F" msecs\n", msecs)); + return result; +} + + +/** + * Release a DHCP lease. + * + * @param netif network interface which must release its lease + */ +err_t +dhcp_release(struct netif *netif) +{ + struct dhcp *dhcp = netif->dhcp; + err_t result; + u16_t msecs; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_release()\n")); + + /* idle DHCP client */ + dhcp_set_state(dhcp, DHCP_OFF); + /* clean old DHCP offer */ + dhcp->server_ip_addr.addr = 0; + dhcp->offered_ip_addr.addr = dhcp->offered_sn_mask.addr = 0; + dhcp->offered_gw_addr.addr = dhcp->offered_bc_addr.addr = 0; + dhcp->offered_t0_lease = dhcp->offered_t1_renew = dhcp->offered_t2_rebind = 0; + dhcp->dns_count = 0; + + /* create and initialize the DHCP message header */ + result = dhcp_create_request(netif); + if (result == ERR_OK) { + dhcp_option(dhcp, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN); + dhcp_option_byte(dhcp, DHCP_RELEASE); + + dhcp_option_trailer(dhcp); + + pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len); + + udp_sendto_if(dhcp->pcb, dhcp->p_out, &dhcp->server_ip_addr, DHCP_SERVER_PORT, netif); + dhcp_delete_request(netif); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_release: RELEASED, DHCP_OFF\n")); + } else { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_release: could not allocate DHCP request\n")); + } + dhcp->tries++; + msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000; + dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_release(): set request timeout %"U16_F" msecs\n", msecs)); + /* bring the interface down */ + netif_set_down(netif); + /* remove IP address from interface */ + netif_set_ipaddr(netif, IP_ADDR_ANY); + netif_set_gw(netif, IP_ADDR_ANY); + netif_set_netmask(netif, IP_ADDR_ANY); + + /* TODO: netif_down(netif); */ + return result; +} + +/** + * Remove the DHCP client from the interface. + * + * @param netif The network interface to stop DHCP on + */ +void +dhcp_stop(struct netif *netif) +{ + struct dhcp *dhcp = netif->dhcp; + LWIP_ERROR("dhcp_stop: netif != NULL", (netif != NULL), return;); + /* Remove the flag that says this netif is handled by DHCP. */ + netif->flags &= ~NETIF_FLAG_DHCP; + + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_stop()\n")); + /* netif is DHCP configured? */ + if (dhcp != NULL) { +#if LWIP_DHCP_AUTOIP_COOP + if(dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_ON) { + autoip_stop(netif); + dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_OFF; + } +#endif /* LWIP_DHCP_AUTOIP_COOP */ + + if (dhcp->pcb != NULL) { + udp_remove(dhcp->pcb); + dhcp->pcb = NULL; + } + LWIP_ASSERT("reply wasn't freed", dhcp->msg_in == NULL && + dhcp->options_in == NULL && dhcp->options_in_len == 0); + mem_free((void *)dhcp); + netif->dhcp = NULL; + } +} + +/* + * Set the DHCP state of a DHCP client. + * + * If the state changed, reset the number of tries. + * + * TODO: we might also want to reset the timeout here? + */ +static void +dhcp_set_state(struct dhcp *dhcp, u8_t new_state) +{ + if (new_state != dhcp->state) { + dhcp->state = new_state; + dhcp->tries = 0; + } +} + +/* + * Concatenate an option type and length field to the outgoing + * DHCP message. + * + */ +static void +dhcp_option(struct dhcp *dhcp, u8_t option_type, u8_t option_len) +{ + LWIP_ASSERT("dhcp_option: dhcp->options_out_len + 2 + option_len <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 2U + option_len <= DHCP_OPTIONS_LEN); + dhcp->msg_out->options[dhcp->options_out_len++] = option_type; + dhcp->msg_out->options[dhcp->options_out_len++] = option_len; +} +/* + * Concatenate a single byte to the outgoing DHCP message. + * + */ +static void +dhcp_option_byte(struct dhcp *dhcp, u8_t value) +{ + LWIP_ASSERT("dhcp_option_byte: dhcp->options_out_len < DHCP_OPTIONS_LEN", dhcp->options_out_len < DHCP_OPTIONS_LEN); + dhcp->msg_out->options[dhcp->options_out_len++] = value; +} + +static void +dhcp_option_short(struct dhcp *dhcp, u16_t value) +{ + LWIP_ASSERT("dhcp_option_short: dhcp->options_out_len + 2 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 2U <= DHCP_OPTIONS_LEN); + dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff00U) >> 8); + dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t) (value & 0x00ffU); +} + +static void +dhcp_option_long(struct dhcp *dhcp, u32_t value) +{ + LWIP_ASSERT("dhcp_option_long: dhcp->options_out_len + 4 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 4U <= DHCP_OPTIONS_LEN); + dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff000000UL) >> 24); + dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x00ff0000UL) >> 16); + dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x0000ff00UL) >> 8); + dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x000000ffUL)); +} + +/** + * Extract the DHCP message and the DHCP options. + * + * Extract the DHCP message and the DHCP options, each into a contiguous + * piece of memory. As a DHCP message is variable sized by its options, + * and also allows overriding some fields for options, the easy approach + * is to first unfold the options into a conitguous piece of memory, and + * use that further on. + * + */ +static err_t +dhcp_unfold_reply(struct dhcp *dhcp, struct pbuf *p) +{ + u16_t ret; + LWIP_ERROR("dhcp != NULL", (dhcp != NULL), return ERR_ARG;); + /* free any left-overs from previous unfolds */ + dhcp_free_reply(dhcp); + /* options present? */ + if (p->tot_len > (sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN)) { + dhcp->options_in_len = p->tot_len - (sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN); + dhcp->options_in = mem_malloc(dhcp->options_in_len); + if (dhcp->options_in == NULL) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, + ("dhcp_unfold_reply(): could not allocate dhcp->options\n")); + dhcp->options_in_len = 0; + return ERR_MEM; + } + } + dhcp->msg_in = mem_malloc(sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN); + if (dhcp->msg_in == NULL) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, + ("dhcp_unfold_reply(): could not allocate dhcp->msg_in\n")); + if (dhcp->options_in != NULL) { + mem_free(dhcp->options_in); + dhcp->options_in = NULL; + dhcp->options_in_len = 0; + } + return ERR_MEM; + } + + /** copy the DHCP message without options */ + ret = pbuf_copy_partial(p, dhcp->msg_in, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN, 0); + LWIP_ASSERT("ret == sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN", ret == sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_unfold_reply(): copied %"U16_F" bytes into dhcp->msg_in[]\n", + sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN)); + + if (dhcp->options_in != NULL) { + /** copy the DHCP options */ + ret = pbuf_copy_partial(p, dhcp->options_in, dhcp->options_in_len, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN); + LWIP_ASSERT("ret == dhcp->options_in_len", ret == dhcp->options_in_len); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_unfold_reply(): copied %"U16_F" bytes to dhcp->options_in[]\n", + dhcp->options_in_len)); + } + LWIP_UNUSED_ARG(ret); + return ERR_OK; +} + +/** + * Free the incoming DHCP message including contiguous copy of + * its DHCP options. + */ +static void dhcp_free_reply(struct dhcp *dhcp) +{ + if (dhcp->msg_in != NULL) { + mem_free((void *)dhcp->msg_in); + dhcp->msg_in = NULL; + } + if (dhcp->options_in) { + mem_free(dhcp->options_in); + dhcp->options_in = NULL; + dhcp->options_in_len = 0; + } + LWIP_DEBUGF(DHCP_DEBUG, ("dhcp_free_reply(): free'd\n")); +} + +/** + * If an incoming DHCP message is in response to us, then trigger the state machine + */ +static void dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr, u16_t port) +{ + struct netif *netif = (struct netif *)arg; + struct dhcp *dhcp = netif->dhcp; + struct dhcp_msg *reply_msg = (struct dhcp_msg *)p->payload; + u8_t *options_ptr; + u8_t msg_type; + u8_t i; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_recv(pbuf = %p) from DHCP server %"U16_F".%"U16_F".%"U16_F".%"U16_F" port %"U16_F"\n", (void*)p, + (u16_t)(ntohl(addr->addr) >> 24 & 0xff), (u16_t)(ntohl(addr->addr) >> 16 & 0xff), + (u16_t)(ntohl(addr->addr) >> 8 & 0xff), (u16_t)(ntohl(addr->addr) & 0xff), port)); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("pbuf->len = %"U16_F"\n", p->len)); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("pbuf->tot_len = %"U16_F"\n", p->tot_len)); + /* prevent warnings about unused arguments */ + LWIP_UNUSED_ARG(pcb); + LWIP_UNUSED_ARG(addr); + LWIP_UNUSED_ARG(port); + + LWIP_ASSERT("reply wasn't freed", dhcp->msg_in == NULL && + dhcp->options_in == NULL && dhcp->options_in_len == 0); + + if (p->len < DHCP_MIN_REPLY_LEN) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("DHCP reply message too short\n")); + goto free_pbuf_and_return; + } + + if (reply_msg->op != DHCP_BOOTREPLY) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("not a DHCP reply message, but type %"U16_F"\n", (u16_t)reply_msg->op)); + goto free_pbuf_and_return; + } + /* iterate through hardware address and match against DHCP message */ + for (i = 0; i < netif->hwaddr_len; i++) { + if (netif->hwaddr[i] != reply_msg->chaddr[i]) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, + ("netif->hwaddr[%"U16_F"]==%02"X16_F" != reply_msg->chaddr[%"U16_F"]==%02"X16_F"\n", + (u16_t)i, (u16_t)netif->hwaddr[i], (u16_t)i, (u16_t)reply_msg->chaddr[i])); + goto free_pbuf_and_return; + } + } + /* match transaction ID against what we expected */ + if (ntohl(reply_msg->xid) != dhcp->xid) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, + ("transaction id mismatch reply_msg->xid(%"X32_F")!=dhcp->xid(%"X32_F")\n",ntohl(reply_msg->xid),dhcp->xid)); + goto free_pbuf_and_return; + } + /* option fields could be unfold? */ + if (dhcp_unfold_reply(dhcp, p) != ERR_OK) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, + ("problem unfolding DHCP message - too short on memory?\n")); + goto free_pbuf_and_return; + } + + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("searching DHCP_OPTION_MESSAGE_TYPE\n")); + /* obtain pointer to DHCP message type */ + options_ptr = dhcp_get_option_ptr(dhcp, DHCP_OPTION_MESSAGE_TYPE); + if (options_ptr == NULL) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("DHCP_OPTION_MESSAGE_TYPE option not found\n")); + goto free_pbuf_and_return; + } + + /* read DHCP message type */ + msg_type = dhcp_get_option_byte(options_ptr + 2); + /* message type is DHCP ACK? */ + if (msg_type == DHCP_ACK) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("DHCP_ACK received\n")); + /* in requesting state? */ + if (dhcp->state == DHCP_REQUESTING) { + dhcp_handle_ack(netif); + dhcp->request_timeout = 0; +#if DHCP_DOES_ARP_CHECK + /* check if the acknowledged lease address is already in use */ + dhcp_check(netif); +#else + /* bind interface to the acknowledged lease address */ + dhcp_bind(netif); +#endif + } + /* already bound to the given lease address? */ + else if ((dhcp->state == DHCP_REBOOTING) || (dhcp->state == DHCP_REBINDING) || (dhcp->state == DHCP_RENEWING)) { + dhcp->request_timeout = 0; + dhcp_bind(netif); + } + } + /* received a DHCP_NAK in appropriate state? */ + else if ((msg_type == DHCP_NAK) && + ((dhcp->state == DHCP_REBOOTING) || (dhcp->state == DHCP_REQUESTING) || + (dhcp->state == DHCP_REBINDING) || (dhcp->state == DHCP_RENEWING ))) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("DHCP_NAK received\n")); + dhcp->request_timeout = 0; + dhcp_handle_nak(netif); + } + /* received a DHCP_OFFER in DHCP_SELECTING state? */ + else if ((msg_type == DHCP_OFFER) && (dhcp->state == DHCP_SELECTING)) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("DHCP_OFFER received in DHCP_SELECTING state\n")); + dhcp->request_timeout = 0; + /* remember offered lease */ + dhcp_handle_offer(netif); + } +free_pbuf_and_return: + dhcp_free_reply(dhcp); + pbuf_free(p); +} + +/** + * Create a DHCP request, fill in common headers + * + * @param netif the netif under DHCP control + */ +static err_t +dhcp_create_request(struct netif *netif) +{ + struct dhcp *dhcp; + u16_t i; +#ifndef DHCP_GLOBAL_XID + /** default global transaction identifier starting value (easy to match + * with a packet analyser). We simply increment for each new request. + * Predefine DHCP_GLOBAL_XID to a better value or a function call to generate one + * at runtime, any supporting function prototypes can be defined in DHCP_GLOBAL_XID_HEADER */ + static u32_t xid = 0xABCD0000; +#else + static u32_t xid; + static u8_t xid_initialised = 0; + if (!xid_initialised) { + xid = DHCP_GLOBAL_XID; + xid_initialised = !xid_initialised; + } +#endif + LWIP_ERROR("dhcp_create_request: netif != NULL", (netif != NULL), return ERR_ARG;); + dhcp = netif->dhcp; + LWIP_ERROR("dhcp_create_request: dhcp != NULL", (dhcp != NULL), return ERR_VAL;); + LWIP_ASSERT("dhcp_create_request: dhcp->p_out == NULL", dhcp->p_out == NULL); + LWIP_ASSERT("dhcp_create_request: dhcp->msg_out == NULL", dhcp->msg_out == NULL); + dhcp->p_out = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct dhcp_msg), PBUF_RAM); + if (dhcp->p_out == NULL) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, + ("dhcp_create_request(): could not allocate pbuf\n")); + return ERR_MEM; + } + LWIP_ASSERT("dhcp_create_request: check that first pbuf can hold struct dhcp_msg", + (dhcp->p_out->len >= sizeof(struct dhcp_msg))); + + /* reuse transaction identifier in retransmissions */ + if (dhcp->tries==0) + xid++; + dhcp->xid = xid; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, + ("transaction id xid(%"X32_F")\n", xid)); + + dhcp->msg_out = (struct dhcp_msg *)dhcp->p_out->payload; + + dhcp->msg_out->op = DHCP_BOOTREQUEST; + /* TODO: make link layer independent */ + dhcp->msg_out->htype = DHCP_HTYPE_ETH; + /* TODO: make link layer independent */ + dhcp->msg_out->hlen = DHCP_HLEN_ETH; + dhcp->msg_out->hops = 0; + dhcp->msg_out->xid = htonl(dhcp->xid); + dhcp->msg_out->secs = 0; + dhcp->msg_out->flags = 0; + dhcp->msg_out->ciaddr.addr = 0; + if (dhcp->state==DHCP_BOUND || dhcp->state==DHCP_RENEWING || dhcp->state==DHCP_REBINDING) { + dhcp->msg_out->ciaddr.addr = netif->ip_addr.addr; + } + dhcp->msg_out->yiaddr.addr = 0; + dhcp->msg_out->siaddr.addr = 0; + dhcp->msg_out->giaddr.addr = 0; + for (i = 0; i < DHCP_CHADDR_LEN; i++) { + /* copy netif hardware address, pad with zeroes */ + dhcp->msg_out->chaddr[i] = (i < netif->hwaddr_len) ? netif->hwaddr[i] : 0/* pad byte*/; + } + for (i = 0; i < DHCP_SNAME_LEN; i++) { + dhcp->msg_out->sname[i] = 0; + } + for (i = 0; i < DHCP_FILE_LEN; i++) { + dhcp->msg_out->file[i] = 0; + } + dhcp->msg_out->cookie = htonl(0x63825363UL); + dhcp->options_out_len = 0; + /* fill options field with an incrementing array (for debugging purposes) */ + for (i = 0; i < DHCP_OPTIONS_LEN; i++) { + dhcp->msg_out->options[i] = (u8_t)i; /* for debugging only, no matter if truncated */ + } + return ERR_OK; +} + +/** + * Free previously allocated memory used to send a DHCP request. + * + * @param netif the netif under DHCP control + */ +static void +dhcp_delete_request(struct netif *netif) +{ + struct dhcp *dhcp; + LWIP_ERROR("dhcp_delete_request: netif != NULL", (netif != NULL), return;); + dhcp = netif->dhcp; + LWIP_ERROR("dhcp_delete_request: dhcp != NULL", (dhcp != NULL), return;); + LWIP_ASSERT("dhcp_delete_request: dhcp->p_out != NULL", dhcp->p_out != NULL); + LWIP_ASSERT("dhcp_delete_request: dhcp->msg_out != NULL", dhcp->msg_out != NULL); + if (dhcp->p_out != NULL) { + pbuf_free(dhcp->p_out); + } + dhcp->p_out = NULL; + dhcp->msg_out = NULL; +} + +/** + * Add a DHCP message trailer + * + * Adds the END option to the DHCP message, and if + * necessary, up to three padding bytes. + * + * @param dhcp DHCP state structure + */ +static void +dhcp_option_trailer(struct dhcp *dhcp) +{ + LWIP_ERROR("dhcp_option_trailer: dhcp != NULL", (dhcp != NULL), return;); + LWIP_ASSERT("dhcp_option_trailer: dhcp->msg_out != NULL\n", dhcp->msg_out != NULL); + LWIP_ASSERT("dhcp_option_trailer: dhcp->options_out_len < DHCP_OPTIONS_LEN\n", dhcp->options_out_len < DHCP_OPTIONS_LEN); + dhcp->msg_out->options[dhcp->options_out_len++] = DHCP_OPTION_END; + /* packet is too small, or not 4 byte aligned? */ + while ((dhcp->options_out_len < DHCP_MIN_OPTIONS_LEN) || (dhcp->options_out_len & 3)) { + /* LWIP_DEBUGF(DHCP_DEBUG,("dhcp_option_trailer:dhcp->options_out_len=%"U16_F", DHCP_OPTIONS_LEN=%"U16_F, dhcp->options_out_len, DHCP_OPTIONS_LEN)); */ + LWIP_ASSERT("dhcp_option_trailer: dhcp->options_out_len < DHCP_OPTIONS_LEN\n", dhcp->options_out_len < DHCP_OPTIONS_LEN); + /* add a fill/padding byte */ + dhcp->msg_out->options[dhcp->options_out_len++] = 0; + } +} + +/** + * Find the offset of a DHCP option inside the DHCP message. + * + * @param dhcp DHCP client + * @param option_type + * + * @return a byte offset into the UDP message where the option was found, or + * zero if the given option was not found. + */ +static u8_t *dhcp_get_option_ptr(struct dhcp *dhcp, u8_t option_type) +{ + u8_t overload = DHCP_OVERLOAD_NONE; + + /* options available? */ + if ((dhcp->options_in != NULL) && (dhcp->options_in_len > 0)) { + /* start with options field */ + u8_t *options = (u8_t *)dhcp->options_in; + u16_t offset = 0; + /* at least 1 byte to read and no end marker, then at least 3 bytes to read? */ + while ((offset < dhcp->options_in_len) && (options[offset] != DHCP_OPTION_END)) { + /* LWIP_DEBUGF(DHCP_DEBUG, ("msg_offset=%"U16_F", q->len=%"U16_F, msg_offset, q->len)); */ + /* are the sname and/or file field overloaded with options? */ + if (options[offset] == DHCP_OPTION_OVERLOAD) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("overloaded message detected\n")); + /* skip option type and length */ + offset += 2; + overload = options[offset++]; + } + /* requested option found */ + else if (options[offset] == option_type) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("option found at offset %"U16_F" in options\n", offset)); + return &options[offset]; + /* skip option */ + } else { + LWIP_DEBUGF(DHCP_DEBUG, ("skipping option %"U16_F" in options\n", options[offset])); + /* skip option type */ + offset++; + /* skip option length, and then length bytes */ + offset += 1 + options[offset]; + } + } + /* is this an overloaded message? */ + if (overload != DHCP_OVERLOAD_NONE) { + u16_t field_len; + if (overload == DHCP_OVERLOAD_FILE) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("overloaded file field\n")); + options = (u8_t *)&dhcp->msg_in->file; + field_len = DHCP_FILE_LEN; + } else if (overload == DHCP_OVERLOAD_SNAME) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("overloaded sname field\n")); + options = (u8_t *)&dhcp->msg_in->sname; + field_len = DHCP_SNAME_LEN; + /* TODO: check if else if () is necessary */ + } else { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("overloaded sname and file field\n")); + options = (u8_t *)&dhcp->msg_in->sname; + field_len = DHCP_FILE_LEN + DHCP_SNAME_LEN; + } + offset = 0; + + /* at least 1 byte to read and no end marker */ + while ((offset < field_len) && (options[offset] != DHCP_OPTION_END)) { + if (options[offset] == option_type) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("option found at offset=%"U16_F"\n", offset)); + return &options[offset]; + /* skip option */ + } else { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("skipping option %"U16_F"\n", options[offset])); + /* skip option type */ + offset++; + offset += 1 + options[offset]; + } + } + } + } + return NULL; +} + +/** + * Return the byte of DHCP option data. + * + * @param client DHCP client. + * @param ptr pointer obtained by dhcp_get_option_ptr(). + * + * @return byte value at the given address. + */ +static u8_t +dhcp_get_option_byte(u8_t *ptr) +{ + LWIP_DEBUGF(DHCP_DEBUG, ("option byte value=%"U16_F"\n", (u16_t)(*ptr))); + return *ptr; +} + +#if 0 /* currently unused */ +/** + * Return the 16-bit value of DHCP option data. + * + * @param client DHCP client. + * @param ptr pointer obtained by dhcp_get_option_ptr(). + * + * @return byte value at the given address. + */ +static u16_t +dhcp_get_option_short(u8_t *ptr) +{ + u16_t value; + value = *ptr++ << 8; + value |= *ptr; + LWIP_DEBUGF(DHCP_DEBUG, ("option short value=%"U16_F"\n", value)); + return value; +} +#endif + +/** + * Return the 32-bit value of DHCP option data. + * + * @param client DHCP client. + * @param ptr pointer obtained by dhcp_get_option_ptr(). + * + * @return byte value at the given address. + */ +static u32_t dhcp_get_option_long(u8_t *ptr) +{ + u32_t value; + value = (u32_t)(*ptr++) << 24; + value |= (u32_t)(*ptr++) << 16; + value |= (u32_t)(*ptr++) << 8; + value |= (u32_t)(*ptr++); + LWIP_DEBUGF(DHCP_DEBUG, ("option long value=%"U32_F"\n", value)); + return value; +} + +#endif /* LWIP_DHCP */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/dns.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/dns.c new file mode 100644 index 0000000..62ccf63 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/dns.c @@ -0,0 +1,982 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/** + * @file + * DNS - host name to IP address resolver. + * + */ + +/** + + * This file implements a DNS host name to IP address resolver. + + * Port to lwIP from uIP + * by Jim Pettinato April 2007 + + * uIP version Copyright (c) 2002-2003, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * DNS.C + * + * The lwIP DNS resolver functions are used to lookup a host name and + * map it to a numerical IP address. It maintains a list of resolved + * hostnames that can be queried with the dns_lookup() function. + * New hostnames can be resolved using the dns_query() function. + * + * The lwIP version of the resolver also adds a non-blocking version of + * gethostbyname() that will work with a raw API application. This function + * checks for an IP address string first and converts it if it is valid. + * gethostbyname() then does a dns_lookup() to see if the name is + * already in the table. If so, the IP is returned. If not, a query is + * issued and the function returns with a ERR_INPROGRESS status. The app + * using the dns client must then go into a waiting state. + * + * Once a hostname has been resolved (or found to be non-existent), + * the resolver code calls a specified callback function (which + * must be implemented by the module that uses the resolver). + */ + +/*----------------------------------------------------------------------------- + * RFC 1035 - Domain names - implementation and specification + * RFC 2181 - Clarifications to the DNS Specification + *----------------------------------------------------------------------------*/ + +/** @todo: define good default values (rfc compliance) */ +/** @todo: improve answer parsing, more checkings... */ +/** @todo: check RFC1035 - 7.3. Processing responses */ + +/*----------------------------------------------------------------------------- + * Includes + *----------------------------------------------------------------------------*/ + +#include "lwip/opt.h" + +#if LWIP_DNS /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/udp.h" +#include "lwip/mem.h" +#include "lwip/dns.h" + +#include + +/** DNS server IP address */ +#ifndef DNS_SERVER_ADDRESS +#define DNS_SERVER_ADDRESS inet_addr("208.67.222.222") /* resolver1.opendns.com */ +#endif + +/** DNS server port address */ +#ifndef DNS_SERVER_PORT +#define DNS_SERVER_PORT 53 +#endif + +/** DNS maximum number of retries when asking for a name, before "timeout". */ +#ifndef DNS_MAX_RETRIES +#define DNS_MAX_RETRIES 4 +#endif + +/** DNS resource record max. TTL (one week as default) */ +#ifndef DNS_MAX_TTL +#define DNS_MAX_TTL 604800 +#endif + +/* DNS protocol flags */ +#define DNS_FLAG1_RESPONSE 0x80 +#define DNS_FLAG1_OPCODE_STATUS 0x10 +#define DNS_FLAG1_OPCODE_INVERSE 0x08 +#define DNS_FLAG1_OPCODE_STANDARD 0x00 +#define DNS_FLAG1_AUTHORATIVE 0x04 +#define DNS_FLAG1_TRUNC 0x02 +#define DNS_FLAG1_RD 0x01 +#define DNS_FLAG2_RA 0x80 +#define DNS_FLAG2_ERR_MASK 0x0f +#define DNS_FLAG2_ERR_NONE 0x00 +#define DNS_FLAG2_ERR_NAME 0x03 + +/* DNS protocol states */ +#define DNS_STATE_UNUSED 0 +#define DNS_STATE_NEW 1 +#define DNS_STATE_ASKING 2 +#define DNS_STATE_DONE 3 + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +/** DNS message header */ +struct dns_hdr { + PACK_STRUCT_FIELD(u16_t id); + PACK_STRUCT_FIELD(u8_t flags1); + PACK_STRUCT_FIELD(u8_t flags2); + PACK_STRUCT_FIELD(u16_t numquestions); + PACK_STRUCT_FIELD(u16_t numanswers); + PACK_STRUCT_FIELD(u16_t numauthrr); + PACK_STRUCT_FIELD(u16_t numextrarr); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif +#define SIZEOF_DNS_HDR 12 + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +/** DNS query message structure */ +struct dns_query { + /* DNS query record starts with either a domain name or a pointer + to a name already present somewhere in the packet. */ + PACK_STRUCT_FIELD(u16_t type); + PACK_STRUCT_FIELD(u16_t class); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif +#define SIZEOF_DNS_QUERY 4 + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +/** DNS answer message structure */ +struct dns_answer { + /* DNS answer record starts with either a domain name or a pointer + to a name already present somewhere in the packet. */ + PACK_STRUCT_FIELD(u16_t type); + PACK_STRUCT_FIELD(u16_t class); + PACK_STRUCT_FIELD(u32_t ttl); + PACK_STRUCT_FIELD(u16_t len); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif +#define SIZEOF_DNS_ANSWER 10 + +/** DNS table entry */ +struct dns_table_entry { + u8_t state; + u8_t numdns; + u8_t tmr; + u8_t retries; + u8_t seqno; + u8_t err; + u32_t ttl; + char name[DNS_MAX_NAME_LENGTH]; + struct ip_addr ipaddr; + /* pointer to callback on DNS query done */ + dns_found_callback found; + void *arg; +}; + +#if DNS_LOCAL_HOSTLIST +/** struct used for local host-list */ +struct local_hostlist_entry { + /** static hostname */ + const char *name; + /** static host address in network byteorder */ + u32_t addr; + struct local_hostlist_entry *next; +}; + +#if DNS_LOCAL_HOSTLIST_IS_DYNAMIC +/** Local host-list. For hostnames in this list, no + * external name resolution is performed */ +static struct local_hostlist_entry *local_hostlist_dynamic; +#else /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */ + +/** Defining this allows the local_hostlist_static to be placed in a different + * linker section (e.g. FLASH) */ +#ifndef DNS_LOCAL_HOSTLIST_STORAGE_PRE +#define DNS_LOCAL_HOSTLIST_STORAGE_PRE static +#endif /* DNS_LOCAL_HOSTLIST_STORAGE_PRE */ +/** Defining this allows the local_hostlist_static to be placed in a different + * linker section (e.g. FLASH) */ +#ifndef DNS_LOCAL_HOSTLIST_STORAGE_POST +#define DNS_LOCAL_HOSTLIST_STORAGE_POST +#endif /* DNS_LOCAL_HOSTLIST_STORAGE_POST */ +DNS_LOCAL_HOSTLIST_STORAGE_PRE struct local_hostlist_entry local_hostlist_static[] + DNS_LOCAL_HOSTLIST_STORAGE_POST = DNS_LOCAL_HOSTLIST_INIT; + +#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */ + +static void dns_init_local(); +#endif /* DNS_LOCAL_HOSTLIST */ + + +/* forward declarations */ +static void dns_recv(void *s, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr, u16_t port); +static void dns_check_entries(void); + +/*----------------------------------------------------------------------------- + * Globales + *----------------------------------------------------------------------------*/ + +/* DNS variables */ +static struct udp_pcb *dns_pcb; +static u8_t dns_seqno; +static struct dns_table_entry dns_table[DNS_TABLE_SIZE]; +static struct ip_addr dns_servers[DNS_MAX_SERVERS]; + +#if (DNS_USES_STATIC_BUF == 1) +static u8_t dns_payload[DNS_MSG_SIZE]; +#endif /* (DNS_USES_STATIC_BUF == 1) */ + +/** + * Initialize the resolver: set up the UDP pcb and configure the default server + * (DNS_SERVER_ADDRESS). + */ +void +dns_init() +{ + struct ip_addr dnsserver; + + /* initialize default DNS server address */ + dnsserver.addr = DNS_SERVER_ADDRESS; + + LWIP_DEBUGF(DNS_DEBUG, ("dns_init: initializing\n")); + + /* if dns client not yet initialized... */ + if (dns_pcb == NULL) { + dns_pcb = udp_new(); + + if (dns_pcb != NULL) { + /* initialize DNS table not needed (initialized to zero since it is a + * global variable) */ + LWIP_ASSERT("For implicit initialization to work, DNS_STATE_UNUSED needs to be 0", + DNS_STATE_UNUSED == 0); + + /* initialize DNS client */ + udp_bind(dns_pcb, IP_ADDR_ANY, 0); + udp_recv(dns_pcb, dns_recv, NULL); + + /* initialize default DNS primary server */ + dns_setserver(0, &dnsserver); + } + } +#if DNS_LOCAL_HOSTLIST + dns_init_local(); +#endif +} + +/** + * Initialize one of the DNS servers. + * + * @param numdns the index of the DNS server to set must be < DNS_MAX_SERVERS + * @param dnsserver IP address of the DNS server to set + */ +void +dns_setserver(u8_t numdns, struct ip_addr *dnsserver) +{ + if ((numdns < DNS_MAX_SERVERS) && (dns_pcb != NULL) && + (dnsserver != NULL) && (dnsserver->addr !=0 )) { + dns_servers[numdns] = (*dnsserver); + } +} + +/** + * Obtain one of the currently configured DNS server. + * + * @param numdns the index of the DNS server + * @return IP address of the indexed DNS server or "ip_addr_any" if the DNS + * server has not been configured. + */ +struct ip_addr +dns_getserver(u8_t numdns) +{ + if (numdns < DNS_MAX_SERVERS) { + return dns_servers[numdns]; + } else { + return *IP_ADDR_ANY; + } +} + +/** + * The DNS resolver client timer - handle retries and timeouts and should + * be called every DNS_TMR_INTERVAL milliseconds (every second by default). + */ +void +dns_tmr(void) +{ + if (dns_pcb != NULL) { + LWIP_DEBUGF(DNS_DEBUG, ("dns_tmr: dns_check_entries\n")); + dns_check_entries(); + } +} + +#if DNS_LOCAL_HOSTLIST +static void +dns_init_local() +{ +#if DNS_LOCAL_HOSTLIST_IS_DYNAMIC && defined(DNS_LOCAL_HOSTLIST_INIT) + int i; + struct local_hostlist_entry *entry; + /* Dynamic: copy entries from DNS_LOCAL_HOSTLIST_INIT to list */ + struct local_hostlist_entry local_hostlist_init[] = DNS_LOCAL_HOSTLIST_INIT; + for (i = 0; i < sizeof(local_hostlist_init) / sizeof(struct local_hostlist_entry); i++) { + entry = mem_malloc(sizeof(struct local_hostlist_entry)); + LWIP_ASSERT("mem-error in dns_init_local", entry != NULL); + if (entry != NULL) { + struct local_hostlist_entry *init_entry = &local_hostlist_init[i]; + entry->name = init_entry->name; + entry->addr = init_entry->addr; + entry->next = local_hostlist_dynamic; + local_hostlist_dynamic = entry; + } + } +#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC && defined(DNS_LOCAL_HOSTLIST_INIT) */ +} + +/** + * Scans the local host-list for a hostname. + * + * @param hostname Hostname to look for in the local host-list + * @return The first IP address for the hostname in the local host-list or + * INADDR_NONE if not found. + */ +static u32_t +dns_lookup_local(const char *hostname) +{ +#if DNS_LOCAL_HOSTLIST_IS_DYNAMIC + struct local_hostlist_entry *entry = local_hostlist_dynamic; + while(entry != NULL) { + if(strcmp(entry->name, hostname) == 0) { + return entry->addr; + } + entry = entry->next; + } +#else /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */ + int i; + for (i = 0; i < sizeof(local_hostlist_static) / sizeof(struct local_hostlist_entry); i++) { + if(strcmp(local_hostlist_static[i].name, hostname) == 0) { + return local_hostlist_static[i].addr; + } + } +#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */ + return INADDR_NONE; +} + +#if DNS_LOCAL_HOSTLIST_IS_DYNAMIC +/** Remove all entries from the local host-list for a specific hostname + * and/or IP addess + * + * @param hostname hostname for which entries shall be removed from the local + * host-list + * @param addr address for which entries shall be removed from the local host-list + * @return the number of removed entries + */ +int +dns_local_removehost(const char *hostname, const struct ip_addr *addr) +{ + int removed = 0; + struct local_hostlist_entry *entry = local_hostlist_dynamic; + struct local_hostlist_entry *last_entry = NULL; + while (entry != NULL) { + if (((hostname == NULL) || !strcmp(entry->name, hostname)) && + ((addr == NULL) || (entry->addr == addr->addr))) { + struct local_hostlist_entry *free_entry; + if (last_entry != NULL) { + last_entry->next = entry->next; + } else { + local_hostlist_dynamic = entry->next; + } + free_entry = entry; + entry = entry->next; + mem_free(free_entry); + removed++; + } else { + last_entry = entry; + entry = entry->next; + } + } + return removed; +} + +/** + * Add a hostname/IP address pair to the local host-list. + * Duplicates are not checked. + * + * @param hostname hostname of the new entry + * @param addr IP address of the new entry + * @return ERR_OK if succeeded or ERR_MEM on memory error + */ +err_t +dns_local_addhost(const char *hostname, const struct ip_addr *addr) +{ + struct local_hostlist_entry *entry; + entry = mem_malloc(sizeof(struct local_hostlist_entry)); + if (entry == NULL) { + return ERR_MEM; + } + entry->name = hostname; + entry->addr = addr->addr; + entry->next = local_hostlist_dynamic; + local_hostlist_dynamic = entry; + return ERR_OK; +} +#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC*/ +#endif /* DNS_LOCAL_HOSTLIST */ + +/** + * Look up a hostname in the array of known hostnames. + * + * @note This function only looks in the internal array of known + * hostnames, it does not send out a query for the hostname if none + * was found. The function dns_enqueue() can be used to send a query + * for a hostname. + * + * @param name the hostname to look up + * @return the hostname's IP address, as u32_t (instead of struct ip_addr to + * better check for failure: != INADDR_NONE) or INADDR_NONE if the hostname + * was not found in the cached dns_table. + */ +static u32_t +dns_lookup(const char *name) +{ + u8_t i; +#if DNS_LOCAL_HOSTLIST || defined(DNS_LOOKUP_LOCAL_EXTERN) + u32_t addr; +#endif /* DNS_LOCAL_HOSTLIST || defined(DNS_LOOKUP_LOCAL_EXTERN) */ +#if DNS_LOCAL_HOSTLIST + if ((addr = dns_lookup_local(name)) != INADDR_NONE) { + return addr; + } +#endif /* DNS_LOCAL_HOSTLIST */ +#ifdef DNS_LOOKUP_LOCAL_EXTERN + if((addr = DNS_LOOKUP_LOCAL_EXTERN(name)) != INADDR_NONE) { + return addr; + } +#endif /* DNS_LOOKUP_LOCAL_EXTERN */ + + /* Walk through name list, return entry if found. If not, return NULL. */ + for (i = 0; i < DNS_TABLE_SIZE; ++i) { + if ((dns_table[i].state == DNS_STATE_DONE) && + (strcmp(name, dns_table[i].name) == 0)) { + LWIP_DEBUGF(DNS_DEBUG, ("dns_lookup: \"%s\": found = ", name)); + ip_addr_debug_print(DNS_DEBUG, &(dns_table[i].ipaddr)); + LWIP_DEBUGF(DNS_DEBUG, ("\n")); + return dns_table[i].ipaddr.addr; + } + } + + return INADDR_NONE; +} + +#if DNS_DOES_NAME_CHECK +/** + * Compare the "dotted" name "query" with the encoded name "response" + * to make sure an answer from the DNS server matches the current dns_table + * entry (otherwise, answers might arrive late for hostname not on the list + * any more). + * + * @param query hostname (not encoded) from the dns_table + * @param response encoded hostname in the DNS response + * @return 0: names equal; 1: names differ + */ +static u8_t +dns_compare_name(unsigned char *query, unsigned char *response) +{ + unsigned char n; + + do { + n = *response++; + /** @see RFC 1035 - 4.1.4. Message compression */ + if ((n & 0xc0) == 0xc0) { + /* Compressed name */ + break; + } else { + /* Not compressed name */ + while (n > 0) { + if ((*query) != (*response)) { + return 1; + } + ++response; + ++query; + --n; + }; + ++query; + } + } while (*response != 0); + + return 0; +} +#endif /* DNS_DOES_NAME_CHECK */ + +/** + * Walk through a compact encoded DNS name and return the end of the name. + * + * @param query encoded DNS name in the DNS server response + * @return end of the name + */ +static unsigned char * +dns_parse_name(unsigned char *query) +{ + unsigned char n; + + do { + n = *query++; + /** @see RFC 1035 - 4.1.4. Message compression */ + if ((n & 0xc0) == 0xc0) { + /* Compressed name */ + break; + } else { + /* Not compressed name */ + while (n > 0) { + ++query; + --n; + }; + } + } while (*query != 0); + + return query + 1; +} + +/** + * Send a DNS query packet. + * + * @param numdns index of the DNS server in the dns_servers table + * @param name hostname to query + * @param id index of the hostname in dns_table, used as transaction ID in the + * DNS query packet + * @return ERR_OK if packet is sent; an err_t indicating the problem otherwise + */ +static err_t +dns_send(u8_t numdns, const char* name, u8_t id) +{ + err_t err; + struct dns_hdr *hdr; + struct dns_query qry; + struct pbuf *p; + char *query, *nptr; + const char *pHostname; + u8_t n; + + LWIP_DEBUGF(DNS_DEBUG, ("dns_send: dns_servers[%"U16_F"] \"%s\": request\n", + (u16_t)(numdns), name)); + LWIP_ASSERT("dns server out of array", numdns < DNS_MAX_SERVERS); + LWIP_ASSERT("dns server has no IP address set", dns_servers[numdns].addr != 0); + + /* if here, we have either a new query or a retry on a previous query to process */ + p = pbuf_alloc(PBUF_TRANSPORT, SIZEOF_DNS_HDR + DNS_MAX_NAME_LENGTH + + SIZEOF_DNS_QUERY, PBUF_RAM); + if (p != NULL) { + LWIP_ASSERT("pbuf must be in one piece", p->next == NULL); + /* fill dns header */ + hdr = (struct dns_hdr*)p->payload; + memset(hdr, 0, SIZEOF_DNS_HDR); + hdr->id = htons(id); + hdr->flags1 = DNS_FLAG1_RD; + hdr->numquestions = htons(1); + query = (char*)hdr + SIZEOF_DNS_HDR; + pHostname = name; + --pHostname; + + /* convert hostname into suitable query format. */ + do { + ++pHostname; + nptr = query; + ++query; + for(n = 0; *pHostname != '.' && *pHostname != 0; ++pHostname) { + *query = *pHostname; + ++query; + ++n; + } + *nptr = n; + } while(*pHostname != 0); + *query++='\0'; + + /* fill dns query */ + qry.type = htons(DNS_RRTYPE_A); + qry.class = htons(DNS_RRCLASS_IN); + MEMCPY( query, &qry, SIZEOF_DNS_QUERY); + + /* resize pbuf to the exact dns query */ + pbuf_realloc(p, (query + SIZEOF_DNS_QUERY) - ((char*)(p->payload))); + + /* connect to the server for faster receiving */ + udp_connect(dns_pcb, &dns_servers[numdns], DNS_SERVER_PORT); + /* send dns packet */ + err = udp_sendto(dns_pcb, p, &dns_servers[numdns], DNS_SERVER_PORT); + + /* free pbuf */ + pbuf_free(p); + } else { + err = ERR_MEM; + } + + return err; +} + +/** + * dns_check_entry() - see if pEntry has not yet been queried and, if so, sends out a query. + * Check an entry in the dns_table: + * - send out query for new entries + * - retry old pending entries on timeout (also with different servers) + * - remove completed entries from the table if their TTL has expired + * + * @param i index of the dns_table entry to check + */ +static void +dns_check_entry(u8_t i) +{ + struct dns_table_entry *pEntry = &dns_table[i]; + + LWIP_ASSERT("array index out of bounds", i < DNS_TABLE_SIZE); + + switch(pEntry->state) { + + case DNS_STATE_NEW: { + /* initialize new entry */ + pEntry->state = DNS_STATE_ASKING; + pEntry->numdns = 0; + pEntry->tmr = 1; + pEntry->retries = 0; + + /* send DNS packet for this entry */ + dns_send(pEntry->numdns, pEntry->name, i); + break; + } + + case DNS_STATE_ASKING: { + if (--pEntry->tmr == 0) { + if (++pEntry->retries == DNS_MAX_RETRIES) { + if ((pEntry->numdns+1numdns+1].addr!=0)) { + /* change of server */ + pEntry->numdns++; + pEntry->tmr = 1; + pEntry->retries = 0; + break; + } else { + LWIP_DEBUGF(DNS_DEBUG, ("dns_check_entry: \"%s\": timeout\n", pEntry->name)); + /* call specified callback function if provided */ + if (pEntry->found) + (*pEntry->found)(pEntry->name, NULL, pEntry->arg); + /* flush this entry */ + pEntry->state = DNS_STATE_UNUSED; + pEntry->found = NULL; + break; + } + } + + /* wait longer for the next retry */ + pEntry->tmr = pEntry->retries; + + /* send DNS packet for this entry */ + dns_send(pEntry->numdns, pEntry->name, i); + } + break; + } + + case DNS_STATE_DONE: { + /* if the time to live is nul */ + if (--pEntry->ttl == 0) { + LWIP_DEBUGF(DNS_DEBUG, ("dns_check_entry: \"%s\": flush\n", pEntry->name)); + /* flush this entry */ + pEntry->state = DNS_STATE_UNUSED; + pEntry->found = NULL; + } + break; + } + case DNS_STATE_UNUSED: + /* nothing to do */ + break; + default: + LWIP_ASSERT("unknown dns_table entry state:", 0); + break; + } +} + +/** + * Call dns_check_entry for each entry in dns_table - check all entries. + */ +static void +dns_check_entries(void) +{ + u8_t i; + + for (i = 0; i < DNS_TABLE_SIZE; ++i) { + dns_check_entry(i); + } +} + +/** + * Receive input function for DNS response packets arriving for the dns UDP pcb. + * + * @params see udp.h + */ +static void +dns_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr, u16_t port) +{ + u8_t i; + char *pHostname; + struct dns_hdr *hdr; + struct dns_answer ans; + struct dns_table_entry *pEntry; + u8_t nquestions, nanswers; +#if (DNS_USES_STATIC_BUF == 0) + u8_t dns_payload[DNS_MSG_SIZE]; +#endif /* (DNS_USES_STATIC_BUF == 0) */ +#if (DNS_USES_STATIC_BUF == 2) + u8_t* dns_payload; +#endif /* (DNS_USES_STATIC_BUF == 2) */ + + LWIP_UNUSED_ARG(arg); + LWIP_UNUSED_ARG(pcb); + LWIP_UNUSED_ARG(addr); + LWIP_UNUSED_ARG(port); + + /* is the dns message too big ? */ + if (p->tot_len > DNS_MSG_SIZE) { + LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: pbuf too big\n")); + /* free pbuf and return */ + goto memerr1; + } + + /* is the dns message big enough ? */ + if (p->tot_len < (SIZEOF_DNS_HDR + SIZEOF_DNS_QUERY + SIZEOF_DNS_ANSWER)) { + LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: pbuf too small\n")); + /* free pbuf and return */ + goto memerr1; + } + +#if (DNS_USES_STATIC_BUF == 2) + dns_payload = mem_malloc(p->tot_len); + if (dns_payload == NULL) { + LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: mem_malloc error\n")); + /* free pbuf and return */ + goto memerr1; + } +#endif /* (DNS_USES_STATIC_BUF == 2) */ + + /* copy dns payload inside static buffer for processing */ + if (pbuf_copy_partial(p, dns_payload, p->tot_len, 0) == p->tot_len) { + /* The ID in the DNS header should be our entry into the name table. */ + hdr = (struct dns_hdr*)dns_payload; + i = htons(hdr->id); + if (i < DNS_TABLE_SIZE) { + pEntry = &dns_table[i]; + if(pEntry->state == DNS_STATE_ASKING) { + /* This entry is now completed. */ + pEntry->state = DNS_STATE_DONE; + pEntry->err = hdr->flags2 & DNS_FLAG2_ERR_MASK; + + /* We only care about the question(s) and the answers. The authrr + and the extrarr are simply discarded. */ + nquestions = htons(hdr->numquestions); + nanswers = htons(hdr->numanswers); + + /* Check for error. If so, call callback to inform. */ + if (((hdr->flags1 & DNS_FLAG1_RESPONSE) == 0) || (pEntry->err != 0) || (nquestions != 1)) { + LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": error in flags\n", pEntry->name)); + /* call callback to indicate error, clean up memory and return */ + goto responseerr; + } + +#if DNS_DOES_NAME_CHECK + /* Check if the name in the "question" part match with the name in the entry. */ + if (dns_compare_name((unsigned char *)(pEntry->name), (unsigned char *)dns_payload + SIZEOF_DNS_HDR) != 0) { + LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": response not match to query\n", pEntry->name)); + /* call callback to indicate error, clean up memory and return */ + goto responseerr; + } +#endif /* DNS_DOES_NAME_CHECK */ + + /* Skip the name in the "question" part */ + pHostname = (char *) dns_parse_name((unsigned char *)dns_payload + SIZEOF_DNS_HDR) + SIZEOF_DNS_QUERY; + + while(nanswers > 0) { + /* skip answer resource record's host name */ + pHostname = (char *) dns_parse_name((unsigned char *)pHostname); + + /* Check for IP address type and Internet class. Others are discarded. */ + MEMCPY(&ans, pHostname, SIZEOF_DNS_ANSWER); + if((ntohs(ans.type) == DNS_RRTYPE_A) && (ntohs(ans.class) == DNS_RRCLASS_IN) && (ntohs(ans.len) == sizeof(struct ip_addr)) ) { + /* read the answer resource record's TTL, and maximize it if needed */ + pEntry->ttl = ntohl(ans.ttl); + if (pEntry->ttl > DNS_MAX_TTL) { + pEntry->ttl = DNS_MAX_TTL; + } + /* read the IP address after answer resource record's header */ + MEMCPY( &(pEntry->ipaddr), (pHostname+SIZEOF_DNS_ANSWER), sizeof(struct ip_addr)); + LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": response = ", pEntry->name)); + ip_addr_debug_print(DNS_DEBUG, (&(pEntry->ipaddr))); + LWIP_DEBUGF(DNS_DEBUG, ("\n")); + /* call specified callback function if provided */ + if (pEntry->found) { + (*pEntry->found)(pEntry->name, &pEntry->ipaddr, pEntry->arg); + } + /* deallocate memory and return */ + goto memerr2; + } else { + pHostname = pHostname + SIZEOF_DNS_ANSWER + htons(ans.len); + } + --nanswers; + } + LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": error in response\n", pEntry->name)); + /* call callback to indicate error, clean up memory and return */ + goto responseerr; + } + } + } + + /* deallocate memory and return */ + goto memerr2; + +responseerr: + /* ERROR: call specified callback function with NULL as name to indicate an error */ + if (pEntry->found) { + (*pEntry->found)(pEntry->name, NULL, pEntry->arg); + } + /* flush this entry */ + pEntry->state = DNS_STATE_UNUSED; + pEntry->found = NULL; + +memerr2: +#if (DNS_USES_STATIC_BUF == 2) + /* free dns buffer */ + mem_free(dns_payload); +#endif /* (DNS_USES_STATIC_BUF == 2) */ + +memerr1: + /* free pbuf */ + pbuf_free(p); + return; +} + +/** + * Queues a new hostname to resolve and sends out a DNS query for that hostname + * + * @param name the hostname that is to be queried + * @param found a callback founction to be called on success, failure or timeout + * @param callback_arg argument to pass to the callback function + * @return @return a err_t return code. + */ +static err_t +dns_enqueue(const char *name, dns_found_callback found, void *callback_arg) +{ + u8_t i; + u8_t lseq, lseqi; + struct dns_table_entry *pEntry = NULL; + + /* search an unused entry, or the oldest one */ + lseq = lseqi = 0; + for (i = 0; i < DNS_TABLE_SIZE; ++i) { + pEntry = &dns_table[i]; + /* is it an unused entry ? */ + if (pEntry->state == DNS_STATE_UNUSED) + break; + + /* check if this is the oldest completed entry */ + if (pEntry->state == DNS_STATE_DONE) { + if ((dns_seqno - pEntry->seqno) > lseq) { + lseq = dns_seqno - pEntry->seqno; + lseqi = i; + } + } + } + + /* if we don't have found an unused entry, use the oldest completed one */ + if (i == DNS_TABLE_SIZE) { + if ((lseqi >= DNS_TABLE_SIZE) || (dns_table[lseqi].state != DNS_STATE_DONE)) { + /* no entry can't be used now, table is full */ + LWIP_DEBUGF(DNS_DEBUG, ("dns_enqueue: \"%s\": DNS entries table is full\n", name)); + return ERR_MEM; + } else { + /* use the oldest completed one */ + i = lseqi; + pEntry = &dns_table[i]; + } + } + + /* use this entry */ + LWIP_DEBUGF(DNS_DEBUG, ("dns_enqueue: \"%s\": use DNS entry %"U16_F"\n", name, (u16_t)(i))); + + /* fill the entry */ + pEntry->state = DNS_STATE_NEW; + pEntry->seqno = dns_seqno++; + pEntry->found = found; + pEntry->arg = callback_arg; + strcpy(pEntry->name, name); + + /* force to send query without waiting timer */ + dns_check_entry(i); + + /* dns query is enqueued */ + return ERR_INPROGRESS; +} + +/** + * Resolve a hostname (string) into an IP address. + * NON-BLOCKING callback version for use with raw API!!! + * + * Returns immediately with one of err_t return codes: + * - ERR_OK if hostname is a valid IP address string or the host + * name is already in the local names table. + * - ERR_INPROGRESS enqueue a request to be sent to the DNS server + * for resolution if no errors are present. + * + * @param hostname the hostname that is to be queried + * @param addr pointer to a struct ip_addr where to store the address if it is already + * cached in the dns_table (only valid if ERR_OK is returned!) + * @param found a callback function to be called on success, failure or timeout (only if + * ERR_INPROGRESS is returned!) + * @param callback_arg argument to pass to the callback function + * @return a err_t return code. + */ +err_t +dns_gethostbyname(const char *hostname, struct ip_addr *addr, dns_found_callback found, + void *callback_arg) +{ + /* not initialized or no valid server yet, or invalid addr pointer + * or invalid hostname or invalid hostname length */ + if ((dns_pcb == NULL) || (addr == NULL) || + (!hostname) || (!hostname[0]) || + (strlen(hostname) >= DNS_MAX_NAME_LENGTH)) { + return ERR_VAL; + } + +#if LWIP_HAVE_LOOPIF + if (strcmp(hostname,"localhost")==0) { + addr->addr = htonl(INADDR_LOOPBACK); + return ERR_OK; + } +#endif /* LWIP_HAVE_LOOPIF */ + + /* host name already in octet notation? set ip addr and return ERR_OK + * already have this address cached? */ + if (((addr->addr = inet_addr(hostname)) != INADDR_NONE) || + ((addr->addr = dns_lookup(hostname)) != INADDR_NONE)) { + return ERR_OK; + } + + /* queue query with specified callback */ + return dns_enqueue(hostname, found, callback_arg); +} + +#endif /* LWIP_DNS */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/init.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/init.c new file mode 100644 index 0000000..b799527 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/init.c @@ -0,0 +1,276 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/** + * @file + * Modules initialization + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "lwip/opt.h" + +#include "lwip/init.h" +#include "lwip/stats.h" +#include "lwip/sys.h" +#include "lwip/mem.h" +#include "lwip/memp.h" +#include "lwip/pbuf.h" +#include "lwip/netif.h" +#include "lwip/sockets.h" +#include "lwip/ip.h" +#include "lwip/raw.h" +#include "lwip/udp.h" +#include "lwip/tcp.h" +#include "lwip/snmp_msg.h" +#include "lwip/autoip.h" +#include "lwip/igmp.h" +#include "lwip/dns.h" +#include "netif/etharp.h" + +/* Compile-time sanity checks for configuration errors. + * These can be done independently of LWIP_DEBUG, without penalty. + */ +#ifndef BYTE_ORDER + #error "BYTE_ORDER is not defined, you have to define it in your cc.h" +#endif +#if (!IP_SOF_BROADCAST && IP_SOF_BROADCAST_RECV) + #error "If you want to use broadcast filter per pcb on recv operations, you have to define IP_SOF_BROADCAST=1 in your lwipopts.h" +#endif +#if (!LWIP_ARP && ARP_QUEUEING) + #error "If you want to use ARP Queueing, you have to define LWIP_ARP=1 in your lwipopts.h" +#endif +#if (!LWIP_UDP && LWIP_UDPLITE) + #error "If you want to use UDP Lite, you have to define LWIP_UDP=1 in your lwipopts.h" +#endif +#if (!LWIP_UDP && LWIP_SNMP) + #error "If you want to use SNMP, you have to define LWIP_UDP=1 in your lwipopts.h" +#endif +#if (!LWIP_UDP && LWIP_DHCP) + #error "If you want to use DHCP, you have to define LWIP_UDP=1 in your lwipopts.h" +#endif +#if (!LWIP_UDP && LWIP_IGMP) + #error "If you want to use IGMP, you have to define LWIP_UDP=1 in your lwipopts.h" +#endif +#if (!LWIP_UDP && LWIP_DNS) + #error "If you want to use DNS, you have to define LWIP_UDP=1 in your lwipopts.h" +#endif +#if (LWIP_ARP && (ARP_TABLE_SIZE > 0x7f)) + #error "If you want to use ARP, ARP_TABLE_SIZE must fit in an s8_t, so, you have to reduce it in your lwipopts.h" +#endif +#if (LWIP_ARP && ARP_QUEUEING && (MEMP_NUM_ARP_QUEUE<=0)) + #error "If you want to use ARP Queueing, you have to define MEMP_NUM_ARP_QUEUE>=1 in your lwipopts.h" +#endif +#if (LWIP_RAW && (MEMP_NUM_RAW_PCB<=0)) + #error "If you want to use RAW, you have to define MEMP_NUM_RAW_PCB>=1 in your lwipopts.h" +#endif +#if (LWIP_UDP && (MEMP_NUM_UDP_PCB<=0)) + #error "If you want to use UDP, you have to define MEMP_NUM_UDP_PCB>=1 in your lwipopts.h" +#endif +#if (LWIP_TCP && (MEMP_NUM_TCP_PCB<=0)) + #error "If you want to use TCP, you have to define MEMP_NUM_TCP_PCB>=1 in your lwipopts.h" +#endif +#if (LWIP_TCP && (TCP_WND > 0xffff)) + #error "If you want to use TCP, TCP_WND must fit in an u16_t, so, you have to reduce it in your lwipopts.h" +#endif +#if (LWIP_TCP && (TCP_SND_QUEUELEN > 0xffff)) + #error "If you want to use TCP, TCP_SND_QUEUELEN must fit in an u16_t, so, you have to reduce it in your lwipopts.h" +#endif +#if (LWIP_TCP && ((TCP_MAXRTX > 12) || (TCP_SYNMAXRTX > 12))) + #error "If you want to use TCP, TCP_MAXRTX and TCP_SYNMAXRTX must less or equal to 12 (due to tcp_backoff table), so, you have to reduce them in your lwipopts.h" +#endif +#if (LWIP_TCP && TCP_LISTEN_BACKLOG && (TCP_DEFAULT_LISTEN_BACKLOG < 0) || (TCP_DEFAULT_LISTEN_BACKLOG > 0xff)) + #error "If you want to use TCP backlog, TCP_DEFAULT_LISTEN_BACKLOG must fit into an u8_t" +#endif +#if (LWIP_IGMP && (MEMP_NUM_IGMP_GROUP<=1)) + #error "If you want to use IGMP, you have to define MEMP_NUM_IGMP_GROUP>1 in your lwipopts.h" +#endif +#if (PPP_SUPPORT && (NO_SYS==1)) + #error "If you want to use PPP, you have to define NO_SYS=0 in your lwipopts.h" +#endif +#if (LWIP_NETIF_API && (NO_SYS==1)) + #error "If you want to use NETIF API, you have to define NO_SYS=0 in your lwipopts.h" +#endif +#if ((LWIP_SOCKET || LWIP_NETCONN) && (NO_SYS==1)) + #error "If you want to use Sequential API, you have to define NO_SYS=0 in your lwipopts.h" +#endif +#if ((LWIP_NETCONN || LWIP_SOCKET) && (MEMP_NUM_TCPIP_MSG_API<=0)) + #error "If you want to use Sequential API, you have to define MEMP_NUM_TCPIP_MSG_API>=1 in your lwipopts.h" +#endif +#if (!LWIP_NETCONN && LWIP_SOCKET) + #error "If you want to use Socket API, you have to define LWIP_NETCONN=1 in your lwipopts.h" +#endif +#if (((!LWIP_DHCP) || (!LWIP_AUTOIP)) && LWIP_DHCP_AUTOIP_COOP) + #error "If you want to use DHCP/AUTOIP cooperation mode, you have to define LWIP_DHCP=1 and LWIP_AUTOIP=1 in your lwipopts.h" +#endif +#if (((!LWIP_DHCP) || (!LWIP_ARP)) && DHCP_DOES_ARP_CHECK) + #error "If you want to use DHCP ARP checking, you have to define LWIP_DHCP=1 and LWIP_ARP=1 in your lwipopts.h" +#endif +#if (!LWIP_ARP && LWIP_AUTOIP) + #error "If you want to use AUTOIP, you have to define LWIP_ARP=1 in your lwipopts.h" +#endif +#if (LWIP_SNMP && (SNMP_CONCURRENT_REQUESTS<=0)) + #error "If you want to use SNMP, you have to define SNMP_CONCURRENT_REQUESTS>=1 in your lwipopts.h" +#endif +#if (LWIP_SNMP && (SNMP_TRAP_DESTINATIONS<=0)) + #error "If you want to use SNMP, you have to define SNMP_TRAP_DESTINATIONS>=1 in your lwipopts.h" +#endif +#if (LWIP_TCP && ((LWIP_EVENT_API && LWIP_CALLBACK_API) || (!LWIP_EVENT_API && !LWIP_CALLBACK_API))) + #error "One and exactly one of LWIP_EVENT_API and LWIP_CALLBACK_API has to be enabled in your lwipopts.h" +#endif +/* There must be sufficient timeouts, taking into account requirements of the subsystems. */ +#if ((NO_SYS==0) && (MEMP_NUM_SYS_TIMEOUT < (LWIP_TCP + IP_REASSEMBLY + LWIP_ARP + (2*LWIP_DHCP) + LWIP_AUTOIP + LWIP_IGMP + LWIP_DNS + PPP_SUPPORT))) + #error "MEMP_NUM_SYS_TIMEOUT is too low to accomodate all required timeouts" +#endif +#if (IP_REASSEMBLY && (MEMP_NUM_REASSDATA > IP_REASS_MAX_PBUFS)) + #error "MEMP_NUM_REASSDATA > IP_REASS_MAX_PBUFS doesn't make sense since each struct ip_reassdata must hold 2 pbufs at least!" +#endif +#if (MEM_LIBC_MALLOC && MEM_USE_POOLS) + #error "MEM_LIBC_MALLOC and MEM_USE_POOLS may not both be simultaneously enabled in your lwipopts.h" +#endif +#if (MEM_USE_POOLS && !MEMP_USE_CUSTOM_POOLS) + #error "MEM_USE_POOLS requires custom pools (MEMP_USE_CUSTOM_POOLS) to be enabled in your lwipopts.h" +#endif +#if (PBUF_POOL_BUFSIZE <= MEM_ALIGNMENT) + #error "PBUF_POOL_BUFSIZE must be greater than MEM_ALIGNMENT or the offset may take the full first pbuf" +#endif +#if (TCP_QUEUE_OOSEQ && !LWIP_TCP) + #error "TCP_QUEUE_OOSEQ requires LWIP_TCP" +#endif +#if (DNS_LOCAL_HOSTLIST && !DNS_LOCAL_HOSTLIST_IS_DYNAMIC && !(defined(DNS_LOCAL_HOSTLIST_INIT))) + #error "you have to define define DNS_LOCAL_HOSTLIST_INIT {{'host1', 0x123}, {'host2', 0x234}} to initialize DNS_LOCAL_HOSTLIST" +#endif +#if PPP_SUPPORT && !PPPOS_SUPPORT & !PPPOE_SUPPORT + #error "PPP_SUPPORT needs either PPPOS_SUPPORT or PPPOE_SUPPORT turned on" +#endif + + +/* Compile-time checks for deprecated options. + */ +#ifdef MEMP_NUM_TCPIP_MSG + #error "MEMP_NUM_TCPIP_MSG option is deprecated. Remove it from your lwipopts.h." +#endif +#ifdef MEMP_NUM_API_MSG + #error "MEMP_NUM_API_MSG option is deprecated. Remove it from your lwipopts.h." +#endif +#ifdef TCP_REXMIT_DEBUG + #error "TCP_REXMIT_DEBUG option is deprecated. Remove it from your lwipopts.h." +#endif +#ifdef RAW_STATS + #error "RAW_STATS option is deprecated. Remove it from your lwipopts.h." +#endif +#ifdef ETHARP_QUEUE_FIRST + #error "ETHARP_QUEUE_FIRST option is deprecated. Remove it from your lwipopts.h." +#endif +#ifdef ETHARP_ALWAYS_INSERT + #error "ETHARP_ALWAYS_INSERT option is deprecated. Remove it from your lwipopts.h." +#endif +#if SO_REUSE +/* I removed the lot since this was an ugly hack. It broke the raw-API. + It also came with many ugly goto's, Christiaan Simons. */ + #error "SO_REUSE currently unavailable, this was a hack" +#endif + +#ifdef LWIP_DEBUG +static void +lwip_sanity_check(void) +{ + /* Warnings */ +#if LWIP_NETCONN + if (MEMP_NUM_NETCONN > (MEMP_NUM_TCP_PCB+MEMP_NUM_TCP_PCB_LISTEN+MEMP_NUM_UDP_PCB+MEMP_NUM_RAW_PCB)) + LWIP_PLATFORM_DIAG(("lwip_sanity_check: WARNING: MEMP_NUM_NETCONN should be less than the sum of MEMP_NUM_{TCP,RAW,UDP}_PCB+MEMP_NUM_TCP_PCB_LISTEN\n")); +#endif /* LWIP_NETCONN */ +#if LWIP_TCP + if (MEMP_NUM_TCP_SEG < TCP_SND_QUEUELEN) + LWIP_PLATFORM_DIAG(("lwip_sanity_check: WARNING: MEMP_NUM_TCP_SEG should be at least as big as TCP_SND_QUEUELEN\n")); + if (TCP_SND_BUF < 2 * TCP_MSS) + LWIP_PLATFORM_DIAG(("lwip_sanity_check: WARNING: TCP_SND_BUF must be at least as much as (2 * TCP_MSS) for things to work smoothly\n")); + if (TCP_SND_QUEUELEN < (2 * (TCP_SND_BUF/TCP_MSS))) + LWIP_PLATFORM_DIAG(("lwip_sanity_check: WARNING: TCP_SND_QUEUELEN must be at least as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work\n")); + if (TCP_SNDLOWAT > TCP_SND_BUF) + LWIP_PLATFORM_DIAG(("lwip_sanity_check: WARNING: TCP_SNDLOWAT must be less than or equal to TCP_SND_BUF.\n")); + if (TCP_WND > (PBUF_POOL_SIZE*PBUF_POOL_BUFSIZE)) + LWIP_PLATFORM_DIAG(("lwip_sanity_check: WARNING: TCP_WND is larger than space provided by PBUF_POOL_SIZE*PBUF_POOL_BUFSIZE\n")); + if (TCP_WND < TCP_MSS) + LWIP_PLATFORM_DIAG(("lwip_sanity_check: WARNING: TCP_WND is smaller than MSS\n")); +#endif /* LWIP_TCP */ +} +#else /* LWIP_DEBUG */ +#define lwip_sanity_check() +#endif /* LWIP_DEBUG */ + +/** + * Perform Sanity check of user-configurable values, and initialize all modules. + */ +void +lwip_init(void) +{ + /* Sanity check user-configurable values */ + lwip_sanity_check(); + + /* Modules initialization */ + stats_init(); + sys_init(); + mem_init(); + memp_init(); + pbuf_init(); + netif_init(); +#if LWIP_SOCKET + lwip_socket_init(); +#endif /* LWIP_SOCKET */ + ip_init(); +#if LWIP_ARP + etharp_init(); +#endif /* LWIP_ARP */ +#if LWIP_RAW + raw_init(); +#endif /* LWIP_RAW */ +#if LWIP_UDP + udp_init(); +#endif /* LWIP_UDP */ +#if LWIP_TCP + tcp_init(); +#endif /* LWIP_TCP */ +#if LWIP_SNMP + snmp_init(); +#endif /* LWIP_SNMP */ +#if LWIP_AUTOIP + autoip_init(); +#endif /* LWIP_AUTOIP */ +#if LWIP_IGMP + igmp_init(); +#endif /* LWIP_IGMP */ +#if LWIP_DNS + dns_init(); +#endif /* LWIP_DNS */ +} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/autoip.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/autoip.c new file mode 100644 index 0000000..dde6b6d --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/autoip.c @@ -0,0 +1,499 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/** + * @file + * AutoIP Automatic LinkLocal IP Configuration + * + */ + +/* + * + * Copyright (c) 2007 Dominik Spies + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * Author: Dominik Spies + * + * This is a AutoIP implementation for the lwIP TCP/IP stack. It aims to conform + * with RFC 3927. + * + * + * Please coordinate changes and requests with Dominik Spies + * + */ + +/******************************************************************************* + * USAGE: + * + * define LWIP_AUTOIP 1 in your lwipopts.h + * + * If you don't use tcpip.c (so, don't call, you don't call tcpip_init): + * - First, call autoip_init(). + * - call autoip_tmr() all AUTOIP_TMR_INTERVAL msces, + * that should be defined in autoip.h. + * I recommend a value of 100. The value must divide 1000 with a remainder almost 0. + * Possible values are 1000, 500, 333, 250, 200, 166, 142, 125, 111, 100 .... + * + * Without DHCP: + * - Call autoip_start() after netif_add(). + * + * With DHCP: + * - define LWIP_DHCP_AUTOIP_COOP 1 in your lwipopts.h. + * - Configure your DHCP Client. + * + */ + +#include "lwip/opt.h" + +#if LWIP_AUTOIP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/mem.h" +#include "lwip/udp.h" +#include "lwip/ip_addr.h" +#include "lwip/netif.h" +#include "lwip/autoip.h" +#include "netif/etharp.h" + +#include +#include + +/* 169.254.0.0 */ +#define AUTOIP_NET 0xA9FE0000 +/* 169.254.1.0 */ +#define AUTOIP_RANGE_START (AUTOIP_NET | 0x0100) +/* 169.254.254.255 */ +#define AUTOIP_RANGE_END (AUTOIP_NET | 0xFEFF) + + +/** Pseudo random macro based on netif informations. + * You could use "rand()" from the C Library if you define LWIP_AUTOIP_RAND in lwipopts.h */ +#ifndef LWIP_AUTOIP_RAND +#define LWIP_AUTOIP_RAND(netif) ( (((u32_t)((netif->hwaddr[5]) & 0xff) << 24) | \ + ((u32_t)((netif->hwaddr[3]) & 0xff) << 16) | \ + ((u32_t)((netif->hwaddr[2]) & 0xff) << 8) | \ + ((u32_t)((netif->hwaddr[4]) & 0xff))) + \ + (netif->autoip?netif->autoip->tried_llipaddr:0)) +#endif /* LWIP_AUTOIP_RAND */ + +/** + * Macro that generates the initial IP address to be tried by AUTOIP. + * If you want to override this, define it to something else in lwipopts.h. + */ +#ifndef LWIP_AUTOIP_CREATE_SEED_ADDR +#define LWIP_AUTOIP_CREATE_SEED_ADDR(netif) \ + htonl(AUTOIP_RANGE_START + ((u32_t)(((u8_t)(netif->hwaddr[4])) | \ + ((u32_t)((u8_t)(netif->hwaddr[5]))) << 8))) +#endif /* LWIP_AUTOIP_CREATE_SEED_ADDR */ + +/* static functions */ +static void autoip_handle_arp_conflict(struct netif *netif); + +/* creates a pseudo random LL IP-Address for a network interface */ +static void autoip_create_addr(struct netif *netif, struct ip_addr *ipaddr); + +/* sends an ARP probe */ +static err_t autoip_arp_probe(struct netif *netif); + +/* sends an ARP announce */ +static err_t autoip_arp_announce(struct netif *netif); + +/* configure interface for use with current LL IP-Address */ +static err_t autoip_bind(struct netif *netif); + +/* start sending probes for llipaddr */ +static void autoip_start_probing(struct netif *netif); + +/** + * Initialize this module + */ +void +autoip_init(void) +{ + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, ("autoip_init()\n")); +} + +/** + * Handle a IP address conflict after an ARP conflict detection + */ +static void +autoip_handle_arp_conflict(struct netif *netif) +{ + /* Somehow detect if we are defending or retreating */ + unsigned char defend = 1; /* tbd */ + + if(defend) { + if(netif->autoip->lastconflict > 0) { + /* retreat, there was a conflicting ARP in the last + * DEFEND_INTERVAL seconds + */ + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, + ("autoip_handle_arp_conflict(): we are defending, but in DEFEND_INTERVAL, retreating\n")); + + /* TODO: close all TCP sessions */ + autoip_start(netif); + } else { + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, + ("autoip_handle_arp_conflict(): we are defend, send ARP Announce\n")); + autoip_arp_announce(netif); + netif->autoip->lastconflict = DEFEND_INTERVAL * AUTOIP_TICKS_PER_SECOND; + } + } else { + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, + ("autoip_handle_arp_conflict(): we do not defend, retreating\n")); + /* TODO: close all TCP sessions */ + autoip_start(netif); + } +} + +/** + * Create an IP-Address out of range 169.254.1.0 to 169.254.254.255 + * + * @param netif network interface on which create the IP-Address + * @param ipaddr ip address to initialize + */ +static void +autoip_create_addr(struct netif *netif, struct ip_addr *ipaddr) +{ + /* Here we create an IP-Address out of range 169.254.1.0 to 169.254.254.255 + * compliant to RFC 3927 Section 2.1 + * We have 254 * 256 possibilities */ + + u32_t addr = ntohl(LWIP_AUTOIP_CREATE_SEED_ADDR(netif)); + addr += netif->autoip->tried_llipaddr; + addr = AUTOIP_NET | (addr & 0xffff); + /* Now, 169.254.0.0 <= addr <= 169.254.255.255 */ + + if (addr < AUTOIP_RANGE_START) { + addr += AUTOIP_RANGE_END - AUTOIP_RANGE_START + 1; + } + if (addr > AUTOIP_RANGE_END) { + addr -= AUTOIP_RANGE_END - AUTOIP_RANGE_START + 1; + } + LWIP_ASSERT("AUTOIP address not in range", (addr >= AUTOIP_RANGE_START) && + (addr <= AUTOIP_RANGE_END)); + ipaddr->addr = htonl(addr); + + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, + ("autoip_create_addr(): tried_llipaddr=%"U16_F", 0x%08"X32_F"\n", + (u16_t)(netif->autoip->tried_llipaddr), (u32_t)(ipaddr->addr))); +} + +/** + * Sends an ARP probe from a network interface + * + * @param netif network interface used to send the probe + */ +static err_t +autoip_arp_probe(struct netif *netif) +{ + return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, ðbroadcast, + (struct eth_addr *)netif->hwaddr, IP_ADDR_ANY, ðzero, + &netif->autoip->llipaddr, ARP_REQUEST); +} + +/** + * Sends an ARP announce from a network interface + * + * @param netif network interface used to send the announce + */ +static err_t +autoip_arp_announce(struct netif *netif) +{ + return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, ðbroadcast, + (struct eth_addr *)netif->hwaddr, &netif->autoip->llipaddr, ðzero, + &netif->autoip->llipaddr, ARP_REQUEST); +} + +/** + * Configure interface for use with current LL IP-Address + * + * @param netif network interface to configure with current LL IP-Address + */ +static err_t +autoip_bind(struct netif *netif) +{ + struct autoip *autoip = netif->autoip; + struct ip_addr sn_mask, gw_addr; + + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, + ("autoip_bind(netif=%p) %c%c%"U16_F" 0x%08"X32_F"\n", + (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num, autoip->llipaddr.addr)); + + IP4_ADDR(&sn_mask, 255, 255, 0, 0); + IP4_ADDR(&gw_addr, 0, 0, 0, 0); + + netif_set_ipaddr(netif, &autoip->llipaddr); + netif_set_netmask(netif, &sn_mask); + netif_set_gw(netif, &gw_addr); + + /* bring the interface up */ + netif_set_up(netif); + + return ERR_OK; +} + +/** + * Start AutoIP client + * + * @param netif network interface on which start the AutoIP client + */ +err_t +autoip_start(struct netif *netif) +{ + struct autoip *autoip = netif->autoip; + err_t result = ERR_OK; + + if(netif_is_up(netif)) { + netif_set_down(netif); + } + + /* Set IP-Address, Netmask and Gateway to 0 to make sure that + * ARP Packets are formed correctly + */ + netif->ip_addr.addr = 0; + netif->netmask.addr = 0; + netif->gw.addr = 0; + + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, + ("autoip_start(netif=%p) %c%c%"U16_F"\n", (void*)netif, netif->name[0], + netif->name[1], (u16_t)netif->num)); + if(autoip == NULL) { + /* no AutoIP client attached yet? */ + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, + ("autoip_start(): starting new AUTOIP client\n")); + autoip = mem_malloc(sizeof(struct autoip)); + if(autoip == NULL) { + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, + ("autoip_start(): could not allocate autoip\n")); + return ERR_MEM; + } + memset( autoip, 0, sizeof(struct autoip)); + /* store this AutoIP client in the netif */ + netif->autoip = autoip; + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, ("autoip_start(): allocated autoip")); + } else { + autoip->state = AUTOIP_STATE_OFF; + autoip->ttw = 0; + autoip->sent_num = 0; + memset(&autoip->llipaddr, 0, sizeof(struct ip_addr)); + autoip->lastconflict = 0; + } + + autoip_create_addr(netif, &(autoip->llipaddr)); + autoip->tried_llipaddr++; + autoip_start_probing(netif); + + return result; +} + +static void +autoip_start_probing(struct netif *netif) +{ + struct autoip *autoip = netif->autoip; + + autoip->state = AUTOIP_STATE_PROBING; + autoip->sent_num = 0; + + /* time to wait to first probe, this is randomly + * choosen out of 0 to PROBE_WAIT seconds. + * compliant to RFC 3927 Section 2.2.1 + */ + autoip->ttw = (u16_t)(LWIP_AUTOIP_RAND(netif) % (PROBE_WAIT * AUTOIP_TICKS_PER_SECOND)); + + /* + * if we tried more then MAX_CONFLICTS we must limit our rate for + * accquiring and probing address + * compliant to RFC 3927 Section 2.2.1 + */ + if(autoip->tried_llipaddr > MAX_CONFLICTS) { + autoip->ttw = RATE_LIMIT_INTERVAL * AUTOIP_TICKS_PER_SECOND; + } +} + +/** + * Handle a possible change in the network configuration. + * + * If there is an AutoIP address configured, take the interface down + * and begin probing with the same address. + */ +void +autoip_network_changed(struct netif *netif) +{ + if (netif->autoip && netif->autoip->state != AUTOIP_STATE_OFF) { + netif_set_down(netif); + autoip_start_probing(netif); + } +} + +/** + * Stop AutoIP client + * + * @param netif network interface on which stop the AutoIP client + */ +err_t +autoip_stop(struct netif *netif) +{ + netif->autoip->state = AUTOIP_STATE_OFF; + netif_set_down(netif); + return ERR_OK; +} + +/** + * Has to be called in loop every AUTOIP_TMR_INTERVAL milliseconds + */ +void +autoip_tmr() +{ + struct netif *netif = netif_list; + /* loop through netif's */ + while (netif != NULL) { + /* only act on AutoIP configured interfaces */ + if (netif->autoip != NULL) { + if(netif->autoip->lastconflict > 0) { + netif->autoip->lastconflict--; + } + + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, + ("autoip_tmr() AutoIP-State: %"U16_F", ttw=%"U16_F"\n", + (u16_t)(netif->autoip->state), netif->autoip->ttw)); + + switch(netif->autoip->state) { + case AUTOIP_STATE_PROBING: + if(netif->autoip->ttw > 0) { + netif->autoip->ttw--; + } else { + if(netif->autoip->sent_num >= PROBE_NUM) { + netif->autoip->state = AUTOIP_STATE_ANNOUNCING; + netif->autoip->sent_num = 0; + netif->autoip->ttw = ANNOUNCE_WAIT * AUTOIP_TICKS_PER_SECOND; + } else { + autoip_arp_probe(netif); + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, + ("autoip_tmr() PROBING Sent Probe\n")); + netif->autoip->sent_num++; + /* calculate time to wait to next probe */ + netif->autoip->ttw = (u16_t)((LWIP_AUTOIP_RAND(netif) % + ((PROBE_MAX - PROBE_MIN) * AUTOIP_TICKS_PER_SECOND) ) + + PROBE_MIN * AUTOIP_TICKS_PER_SECOND); + } + } + break; + + case AUTOIP_STATE_ANNOUNCING: + if(netif->autoip->ttw > 0) { + netif->autoip->ttw--; + } else { + if(netif->autoip->sent_num == 0) { + /* We are here the first time, so we waited ANNOUNCE_WAIT seconds + * Now we can bind to an IP address and use it. + * + * autoip_bind calls netif_set_up. This triggers a gratuitous ARP + * which counts as an announcement. + */ + autoip_bind(netif); + } else { + autoip_arp_announce(netif); + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, + ("autoip_tmr() ANNOUNCING Sent Announce\n")); + } + netif->autoip->ttw = ANNOUNCE_INTERVAL * AUTOIP_TICKS_PER_SECOND; + netif->autoip->sent_num++; + + if(netif->autoip->sent_num >= ANNOUNCE_NUM) { + netif->autoip->state = AUTOIP_STATE_BOUND; + netif->autoip->sent_num = 0; + netif->autoip->ttw = 0; + } + } + break; + } + } + /* proceed to next network interface */ + netif = netif->next; + } +} + +/** + * Handles every incoming ARP Packet, called by etharp_arp_input. + * + * @param netif network interface to use for autoip processing + * @param hdr Incoming ARP packet + */ +void +autoip_arp_reply(struct netif *netif, struct etharp_hdr *hdr) +{ + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, ("autoip_arp_reply()\n")); + if ((netif->autoip != NULL) && (netif->autoip->state != AUTOIP_STATE_OFF)) { + /* when ip.src == llipaddr && hw.src != netif->hwaddr + * + * when probing ip.dst == llipaddr && hw.src != netif->hwaddr + * we have a conflict and must solve it + */ + struct ip_addr sipaddr, dipaddr; + struct eth_addr netifaddr; + netifaddr.addr[0] = netif->hwaddr[0]; + netifaddr.addr[1] = netif->hwaddr[1]; + netifaddr.addr[2] = netif->hwaddr[2]; + netifaddr.addr[3] = netif->hwaddr[3]; + netifaddr.addr[4] = netif->hwaddr[4]; + netifaddr.addr[5] = netif->hwaddr[5]; + + /* Copy struct ip_addr2 to aligned ip_addr, to support compilers without + * structure packing (not using structure copy which breaks strict-aliasing rules). + */ + SMEMCPY(&sipaddr, &hdr->sipaddr, sizeof(sipaddr)); + SMEMCPY(&dipaddr, &hdr->dipaddr, sizeof(dipaddr)); + + if ((netif->autoip->state == AUTOIP_STATE_PROBING) || + ((netif->autoip->state == AUTOIP_STATE_ANNOUNCING) && + (netif->autoip->sent_num == 0))) { + /* RFC 3927 Section 2.2.1: + * from beginning to after ANNOUNCE_WAIT + * seconds we have a conflict if + * ip.src == llipaddr OR + * ip.dst == llipaddr && hw.src != own hwaddr + */ + if ((ip_addr_cmp(&sipaddr, &netif->autoip->llipaddr)) || + (ip_addr_cmp(&dipaddr, &netif->autoip->llipaddr) && + !eth_addr_cmp(&netifaddr, &hdr->shwaddr))) { + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE | LWIP_DBG_LEVEL_WARNING, + ("autoip_arp_reply(): Probe Conflict detected\n")); + autoip_start(netif); + } + } else { + /* RFC 3927 Section 2.5: + * in any state we have a conflict if + * ip.src == llipaddr && hw.src != own hwaddr + */ + if (ip_addr_cmp(&sipaddr, &netif->autoip->llipaddr) && + !eth_addr_cmp(&netifaddr, &hdr->shwaddr)) { + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE | LWIP_DBG_LEVEL_WARNING, + ("autoip_arp_reply(): Conflicting ARP-Packet detected\n")); + autoip_handle_arp_conflict(netif); + } + } + } +} + +#endif /* LWIP_AUTOIP */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/icmp.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/icmp.c new file mode 100644 index 0000000..3ee17ae --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/icmp.c @@ -0,0 +1,333 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/** + * @file + * ICMP - Internet Control Message Protocol + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +/* Some ICMP messages should be passed to the transport protocols. This + is not implemented. */ + +#include "lwip/opt.h" + +#if LWIP_ICMP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/icmp.h" +#include "lwip/inet.h" +#include "lwip/inet_chksum.h" +#include "lwip/ip.h" +#include "lwip/def.h" +#include "lwip/stats.h" +#include "lwip/snmp.h" + +#include + +/** Small optimization: set to 0 if incoming PBUF_POOL pbuf always can be + * used to modify and send a response packet (and to 1 if this is not the case, + * e.g. when link header is stripped of when receiving) */ +#ifndef LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN +#define LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN 1 +#endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */ + +/* The amount of data from the original packet to return in a dest-unreachable */ +#define ICMP_DEST_UNREACH_DATASIZE 8 + +static void icmp_send_response(struct pbuf *p, u8_t type, u8_t code); + +/** + * Processes ICMP input packets, called from ip_input(). + * + * Currently only processes icmp echo requests and sends + * out the echo response. + * + * @param p the icmp echo request packet, p->payload pointing to the ip header + * @param inp the netif on which this packet was received + */ +void +icmp_input(struct pbuf *p, struct netif *inp) +{ + u8_t type; +#ifdef LWIP_DEBUG + u8_t code; +#endif /* LWIP_DEBUG */ + struct icmp_echo_hdr *iecho; + struct ip_hdr *iphdr; + struct ip_addr tmpaddr; + s16_t hlen; + + ICMP_STATS_INC(icmp.recv); + snmp_inc_icmpinmsgs(); + + + iphdr = p->payload; + hlen = IPH_HL(iphdr) * 4; + if (pbuf_header(p, -hlen) || (p->tot_len < sizeof(u16_t)*2)) { + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: short ICMP (%"U16_F" bytes) received\n", p->tot_len)); + goto lenerr; + } + + type = *((u8_t *)p->payload); +#ifdef LWIP_DEBUG + code = *(((u8_t *)p->payload)+1); +#endif /* LWIP_DEBUG */ + switch (type) { + case ICMP_ECHO: +#if !LWIP_MULTICAST_PING || !LWIP_BROADCAST_PING + { + int accepted = 1; +#if !LWIP_MULTICAST_PING + /* multicast destination address? */ + if (ip_addr_ismulticast(&iphdr->dest)) { + accepted = 0; + } +#endif /* LWIP_MULTICAST_PING */ +#if !LWIP_BROADCAST_PING + /* broadcast destination address? */ + if (ip_addr_isbroadcast(&iphdr->dest, inp)) { + accepted = 0; + } +#endif /* LWIP_BROADCAST_PING */ + /* broadcast or multicast destination address not acceptd? */ + if (!accepted) { + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: Not echoing to multicast or broadcast pings\n")); + ICMP_STATS_INC(icmp.err); + pbuf_free(p); + return; + } + } +#endif /* !LWIP_MULTICAST_PING || !LWIP_BROADCAST_PING */ + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ping\n")); + if (p->tot_len < sizeof(struct icmp_echo_hdr)) { + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: bad ICMP echo received\n")); + goto lenerr; + } + if (inet_chksum_pbuf(p) != 0) { + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: checksum failed for received ICMP echo\n")); + pbuf_free(p); + ICMP_STATS_INC(icmp.chkerr); + snmp_inc_icmpinerrors(); + return; + } +#if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN + if (pbuf_header(p, (PBUF_IP_HLEN + PBUF_LINK_HLEN))) { + /* p is not big enough to contain link headers + * allocate a new one and copy p into it + */ + struct pbuf *r; + /* switch p->payload to ip header */ + if (pbuf_header(p, hlen)) { + LWIP_ASSERT("icmp_input: moving p->payload to ip header failed\n", 0); + goto memerr; + } + /* allocate new packet buffer with space for link headers */ + r = pbuf_alloc(PBUF_LINK, p->tot_len, PBUF_RAM); + if (r == NULL) { + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: allocating new pbuf failed\n")); + goto memerr; + } + LWIP_ASSERT("check that first pbuf can hold struct the ICMP header", + (r->len >= hlen + sizeof(struct icmp_echo_hdr))); + /* copy the whole packet including ip header */ + if (pbuf_copy(r, p) != ERR_OK) { + LWIP_ASSERT("icmp_input: copying to new pbuf failed\n", 0); + goto memerr; + } + iphdr = r->payload; + /* switch r->payload back to icmp header */ + if (pbuf_header(r, -hlen)) { + LWIP_ASSERT("icmp_input: restoring original p->payload failed\n", 0); + goto memerr; + } + /* free the original p */ + pbuf_free(p); + /* we now have an identical copy of p that has room for link headers */ + p = r; + } else { + /* restore p->payload to point to icmp header */ + if (pbuf_header(p, -(s16_t)(PBUF_IP_HLEN + PBUF_LINK_HLEN))) { + LWIP_ASSERT("icmp_input: restoring original p->payload failed\n", 0); + goto memerr; + } + } +#endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */ + /* At this point, all checks are OK. */ + /* We generate an answer by switching the dest and src ip addresses, + * setting the icmp type to ECHO_RESPONSE and updating the checksum. */ + iecho = p->payload; + tmpaddr.addr = iphdr->src.addr; + iphdr->src.addr = iphdr->dest.addr; + iphdr->dest.addr = tmpaddr.addr; + ICMPH_TYPE_SET(iecho, ICMP_ER); + /* adjust the checksum */ + if (iecho->chksum >= htons(0xffff - (ICMP_ECHO << 8))) { + iecho->chksum += htons(ICMP_ECHO << 8) + 1; + } else { + iecho->chksum += htons(ICMP_ECHO << 8); + } + + /* Set the correct TTL and recalculate the header checksum. */ + IPH_TTL_SET(iphdr, ICMP_TTL); + IPH_CHKSUM_SET(iphdr, 0); +#if CHECKSUM_GEN_IP + IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, IP_HLEN)); +#endif /* CHECKSUM_GEN_IP */ + + ICMP_STATS_INC(icmp.xmit); + /* increase number of messages attempted to send */ + snmp_inc_icmpoutmsgs(); + /* increase number of echo replies attempted to send */ + snmp_inc_icmpoutechoreps(); + + if(pbuf_header(p, hlen)) { + LWIP_ASSERT("Can't move over header in packet", 0); + } else { + err_t ret; + ret = ip_output_if(p, &(iphdr->src), IP_HDRINCL, + ICMP_TTL, 0, IP_PROTO_ICMP, inp); + if (ret != ERR_OK) { + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ip_output_if returned an error: %c.\n", ret)); + } + } + break; + default: + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ICMP type %"S16_F" code %"S16_F" not supported.\n", + (s16_t)type, (s16_t)code)); + ICMP_STATS_INC(icmp.proterr); + ICMP_STATS_INC(icmp.drop); + } + pbuf_free(p); + return; +lenerr: + pbuf_free(p); + ICMP_STATS_INC(icmp.lenerr); + snmp_inc_icmpinerrors(); + return; +#if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN +memerr: + pbuf_free(p); + ICMP_STATS_INC(icmp.err); + snmp_inc_icmpinerrors(); + return; +#endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */ +} + +/** + * Send an icmp 'destination unreachable' packet, called from ip_input() if + * the transport layer protocol is unknown and from udp_input() if the local + * port is not bound. + * + * @param p the input packet for which the 'unreachable' should be sent, + * p->payload pointing to the IP header + * @param t type of the 'unreachable' packet + */ +void +icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t) +{ + icmp_send_response(p, ICMP_DUR, t); +} + +#if IP_FORWARD || IP_REASSEMBLY +/** + * Send a 'time exceeded' packet, called from ip_forward() if TTL is 0. + * + * @param p the input packet for which the 'time exceeded' should be sent, + * p->payload pointing to the IP header + * @param t type of the 'time exceeded' packet + */ +void +icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t) +{ + icmp_send_response(p, ICMP_TE, t); +} + +#endif /* IP_FORWARD || IP_REASSEMBLY */ + +/** + * Send an icmp packet in response to an incoming packet. + * + * @param p the input packet for which the 'unreachable' should be sent, + * p->payload pointing to the IP header + * @param type Type of the ICMP header + * @param code Code of the ICMP header + */ +static void +icmp_send_response(struct pbuf *p, u8_t type, u8_t code) +{ + struct pbuf *q; + struct ip_hdr *iphdr; + /* we can use the echo header here */ + struct icmp_echo_hdr *icmphdr; + + /* ICMP header + IP header + 8 bytes of data */ + q = pbuf_alloc(PBUF_IP, sizeof(struct icmp_echo_hdr) + IP_HLEN + ICMP_DEST_UNREACH_DATASIZE, + PBUF_RAM); + if (q == NULL) { + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_time_exceeded: failed to allocate pbuf for ICMP packet.\n")); + return; + } + LWIP_ASSERT("check that first pbuf can hold icmp message", + (q->len >= (sizeof(struct icmp_echo_hdr) + IP_HLEN + ICMP_DEST_UNREACH_DATASIZE))); + + iphdr = p->payload; + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_time_exceeded from ")); + ip_addr_debug_print(ICMP_DEBUG, &(iphdr->src)); + LWIP_DEBUGF(ICMP_DEBUG, (" to ")); + ip_addr_debug_print(ICMP_DEBUG, &(iphdr->dest)); + LWIP_DEBUGF(ICMP_DEBUG, ("\n")); + + icmphdr = q->payload; + icmphdr->type = type; + icmphdr->code = code; + icmphdr->id = 0; + icmphdr->seqno = 0; + + /* copy fields from original packet */ + SMEMCPY((u8_t *)q->payload + sizeof(struct icmp_echo_hdr), (u8_t *)p->payload, + IP_HLEN + ICMP_DEST_UNREACH_DATASIZE); + + /* calculate checksum */ + icmphdr->chksum = 0; + icmphdr->chksum = inet_chksum(icmphdr, q->len); + ICMP_STATS_INC(icmp.xmit); + /* increase number of messages attempted to send */ + snmp_inc_icmpoutmsgs(); + /* increase number of destination unreachable messages attempted to send */ + snmp_inc_icmpouttimeexcds(); + ip_output(q, NULL, &(iphdr->src), ICMP_TTL, 0, IP_PROTO_ICMP); + pbuf_free(q); +} + +#endif /* LWIP_ICMP */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/igmp.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/igmp.c new file mode 100644 index 0000000..b302ef4 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/igmp.c @@ -0,0 +1,759 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/** + * @file + * IGMP - Internet Group Management Protocol + * + */ + +/* + * Copyright (c) 2002 CITEL Technologies Ltd. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of CITEL Technologies Ltd nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY CITEL TECHNOLOGIES AND CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL CITEL TECHNOLOGIES OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is a contribution to the lwIP TCP/IP stack. + * The Swedish Institute of Computer Science and Adam Dunkels + * are specifically granted permission to redistribute this + * source code. +*/ + +/*------------------------------------------------------------- +Note 1) +Although the rfc requires V1 AND V2 capability +we will only support v2 since now V1 is very old (August 1989) +V1 can be added if required + +a debug print and statistic have been implemented to +show this up. +------------------------------------------------------------- +------------------------------------------------------------- +Note 2) +A query for a specific group address (as opposed to ALLHOSTS) +has now been implemented as I am unsure if it is required + +a debug print and statistic have been implemented to +show this up. +------------------------------------------------------------- +------------------------------------------------------------- +Note 3) +The router alert rfc 2113 is implemented in outgoing packets +but not checked rigorously incoming +------------------------------------------------------------- +Steve Reynolds +------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- + * RFC 988 - Host extensions for IP multicasting - V0 + * RFC 1054 - Host extensions for IP multicasting - + * RFC 1112 - Host extensions for IP multicasting - V1 + * RFC 2236 - Internet Group Management Protocol, Version 2 - V2 <- this code is based on this RFC (it's the "de facto" standard) + * RFC 3376 - Internet Group Management Protocol, Version 3 - V3 + * RFC 4604 - Using Internet Group Management Protocol Version 3... - V3+ + * RFC 2113 - IP Router Alert Option - + *----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- + * Includes + *----------------------------------------------------------------------------*/ + +#include "lwip/opt.h" + +#if LWIP_IGMP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/igmp.h" +#include "lwip/debug.h" +#include "lwip/def.h" +#include "lwip/mem.h" +#include "lwip/ip.h" +#include "lwip/inet.h" +#include "lwip/inet_chksum.h" +#include "lwip/netif.h" +#include "lwip/icmp.h" +#include "lwip/udp.h" +#include "lwip/tcp.h" +#include "lwip/stats.h" + +#include "string.h" + +/*----------------------------------------------------------------------------- + * Globales + *----------------------------------------------------------------------------*/ + +static struct igmp_group* igmp_group_list; +static struct ip_addr allsystems; +static struct ip_addr allrouters; + +/** + * Initialize the IGMP module + */ +void +igmp_init(void) +{ + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_init: initializing\n")); + + IP4_ADDR(&allsystems, 224, 0, 0, 1); + IP4_ADDR(&allrouters, 224, 0, 0, 2); +} + +#ifdef LWIP_DEBUG +/** + * Dump global IGMP groups list + */ +void +igmp_dump_group_list() +{ + struct igmp_group *group = igmp_group_list; + + while (group != NULL) { + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_dump_group_list: [%"U32_F"] ", (u32_t)(group->group_state))); + ip_addr_debug_print(IGMP_DEBUG, &group->group_address); + LWIP_DEBUGF(IGMP_DEBUG, (" on if %p\n", group->interface)); + group = group->next; + } + LWIP_DEBUGF(IGMP_DEBUG, ("\n")); +} +#else +#define igmp_dump_group_list() +#endif /* LWIP_DEBUG */ + +/** + * Start IGMP processing on interface + * + * @param netif network interface on which start IGMP processing + */ +err_t +igmp_start(struct netif *netif) +{ + struct igmp_group* group; + + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_start: starting IGMP processing on if %p\n", netif)); + + group = igmp_lookup_group(netif, &allsystems); + + if (group != NULL) { + group->group_state = IGMP_GROUP_IDLE_MEMBER; + group->use++; + + /* Allow the igmp messages at the MAC level */ + if (netif->igmp_mac_filter != NULL) { + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_start: igmp_mac_filter(ADD ")); + ip_addr_debug_print(IGMP_DEBUG, &allsystems); + LWIP_DEBUGF(IGMP_DEBUG, (") on if %p\n", netif)); + netif->igmp_mac_filter( netif, &allsystems, IGMP_ADD_MAC_FILTER); + } + + return ERR_OK; + } + + return ERR_MEM; +} + +/** + * Stop IGMP processing on interface + * + * @param netif network interface on which stop IGMP processing + */ +err_t +igmp_stop(struct netif *netif) +{ + struct igmp_group *group = igmp_group_list; + struct igmp_group *prev = NULL; + struct igmp_group *next; + + /* look for groups joined on this interface further down the list */ + while (group != NULL) { + next = group->next; + /* is it a group joined on this interface? */ + if (group->interface == netif) { + /* is it the first group of the list? */ + if (group == igmp_group_list) { + igmp_group_list = next; + } + /* is there a "previous" group defined? */ + if (prev != NULL) { + prev->next = next; + } + /* disable the group at the MAC level */ + if (netif->igmp_mac_filter != NULL) { + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_stop: igmp_mac_filter(DEL ")); + ip_addr_debug_print(IGMP_DEBUG, &group->group_address); + LWIP_DEBUGF(IGMP_DEBUG, (") on if %p\n", netif)); + netif->igmp_mac_filter(netif, &(group->group_address), IGMP_DEL_MAC_FILTER); + } + /* free group */ + memp_free(MEMP_IGMP_GROUP, group); + } else { + /* change the "previous" */ + prev = group; + } + /* move to "next" */ + group = next; + } + return ERR_OK; +} + +/** + * Report IGMP memberships for this interface + * + * @param netif network interface on which report IGMP memberships + */ +void +igmp_report_groups( struct netif *netif) +{ + struct igmp_group *group = igmp_group_list; + + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_report_groups: sending IGMP reports on if %p\n", netif)); + + while (group != NULL) { + if (group->interface == netif) { + igmp_delaying_member( group, IGMP_JOIN_DELAYING_MEMBER_TMR); + } + group = group->next; + } +} + +/** + * Search for a group in the global igmp_group_list + * + * @param ifp the network interface for which to look + * @param addr the group ip address to search for + * @return a struct igmp_group* if the group has been found, + * NULL if the group wasn't found. + */ +struct igmp_group * +igmp_lookfor_group(struct netif *ifp, struct ip_addr *addr) +{ + struct igmp_group *group = igmp_group_list; + + while (group != NULL) { + if ((group->interface == ifp) && (ip_addr_cmp(&(group->group_address), addr))) { + return group; + } + group = group->next; + } + + /* to be clearer, we return NULL here instead of + * 'group' (which is also NULL at this point). + */ + return NULL; +} + +/** + * Search for a specific igmp group and create a new one if not found- + * + * @param ifp the network interface for which to look + * @param addr the group ip address to search + * @return a struct igmp_group*, + * NULL on memory error. + */ +struct igmp_group * +igmp_lookup_group(struct netif *ifp, struct ip_addr *addr) +{ + struct igmp_group *group = igmp_group_list; + + /* Search if the group already exists */ + group = igmp_lookfor_group(ifp, addr); + if (group != NULL) { + /* Group already exists. */ + return group; + } + + /* Group doesn't exist yet, create a new one */ + group = memp_malloc(MEMP_IGMP_GROUP); + if (group != NULL) { + group->interface = ifp; + ip_addr_set(&(group->group_address), addr); + group->timer = 0; /* Not running */ + group->group_state = IGMP_GROUP_NON_MEMBER; + group->last_reporter_flag = 0; + group->use = 0; + group->next = igmp_group_list; + + igmp_group_list = group; + } + + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_lookup_group: %sallocated a new group with address ", (group?"":"impossible to "))); + ip_addr_debug_print(IGMP_DEBUG, addr); + LWIP_DEBUGF(IGMP_DEBUG, (" on if %p\n", ifp)); + + return group; +} + +/** + * Remove a group in the global igmp_group_list + * + * @param group the group to remove from the global igmp_group_list + * @return ERR_OK if group was removed from the list, an err_t otherwise + */ +err_t +igmp_remove_group(struct igmp_group *group) +{ + err_t err = ERR_OK; + + /* Is it the first group? */ + if (igmp_group_list == group) { + igmp_group_list = group->next; + } else { + /* look for group further down the list */ + struct igmp_group *tmpGroup; + for (tmpGroup = igmp_group_list; tmpGroup != NULL; tmpGroup = tmpGroup->next) { + if (tmpGroup->next == group) { + tmpGroup->next = group->next; + break; + } + } + /* Group not found in the global igmp_group_list */ + if (tmpGroup == NULL) + err = ERR_ARG; + } + /* free group */ + memp_free(MEMP_IGMP_GROUP, group); + + return err; +} + +/** + * Called from ip_input() if a new IGMP packet is received. + * + * @param p received igmp packet, p->payload pointing to the ip header + * @param inp network interface on which the packet was received + * @param dest destination ip address of the igmp packet + */ +void +igmp_input(struct pbuf *p, struct netif *inp, struct ip_addr *dest) +{ + struct ip_hdr * iphdr; + struct igmp_msg* igmp; + struct igmp_group* group; + struct igmp_group* groupref; + + /* Note that the length CAN be greater than 8 but only 8 are used - All are included in the checksum */ + iphdr = p->payload; + if (pbuf_header(p, -(s16_t)(IPH_HL(iphdr) * 4)) || (p->len < IGMP_MINLEN)) { + pbuf_free(p); + IGMP_STATS_INC(igmp.lenerr); + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: length error\n")); + return; + } + + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: message from ")); + ip_addr_debug_print(IGMP_DEBUG, &(iphdr->src)); + LWIP_DEBUGF(IGMP_DEBUG, (" to address ")); + ip_addr_debug_print(IGMP_DEBUG, &(iphdr->dest)); + LWIP_DEBUGF(IGMP_DEBUG, (" on if %p\n", inp)); + + /* Now calculate and check the checksum */ + igmp = (struct igmp_msg *)p->payload; + if (inet_chksum(igmp, p->len)) { + pbuf_free(p); + IGMP_STATS_INC(igmp.chkerr); + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: checksum error\n")); + return; + } + + /* Packet is ok so find an existing group */ + group = igmp_lookfor_group(inp, dest); /* use the incoming IP address! */ + + /* If group can be found or create... */ + if (!group) { + pbuf_free(p); + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: IGMP frame not for us\n")); + return; + } + + /* NOW ACT ON THE INCOMING MESSAGE TYPE... */ + switch (igmp->igmp_msgtype) { + case IGMP_MEMB_QUERY: { + /* IGMP_MEMB_QUERY to the "all systems" address ? */ + if ((ip_addr_cmp(dest, &allsystems)) && (igmp->igmp_group_address.addr == 0)) { + /* THIS IS THE GENERAL QUERY */ + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: General IGMP_MEMB_QUERY on \"ALL SYSTEMS\" address (224.0.0.1) [igmp_maxresp=%i]\n", (int)(igmp->igmp_maxresp))); + + if (igmp->igmp_maxresp == 0) { + IGMP_STATS_INC(igmp.v1_rxed); + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: got an all hosts query with time== 0 - this is V1 and not implemented - treat as v2\n")); + igmp->igmp_maxresp = IGMP_V1_DELAYING_MEMBER_TMR; + } + + IGMP_STATS_INC(igmp.group_query_rxed); + groupref = igmp_group_list; + while (groupref) { + /* Do not send messages on the all systems group address! */ + if ((groupref->interface == inp) && (!(ip_addr_cmp(&(groupref->group_address), &allsystems)))) { + igmp_delaying_member( groupref, igmp->igmp_maxresp); + } + groupref = groupref->next; + } + } else { + /* IGMP_MEMB_QUERY to a specific group ? */ + if (group->group_address.addr != 0) { + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: IGMP_MEMB_QUERY to a specific group ")); + ip_addr_debug_print(IGMP_DEBUG, &group->group_address); + if (ip_addr_cmp (dest, &allsystems)) { + LWIP_DEBUGF(IGMP_DEBUG, (" using \"ALL SYSTEMS\" address (224.0.0.1) [igmp_maxresp=%i]\n", (int)(igmp->igmp_maxresp))); + /* we first need to re-lookfor the group since we used dest last time */ + group = igmp_lookfor_group(inp, &igmp->igmp_group_address); + } else { + LWIP_DEBUGF(IGMP_DEBUG, (" with the group address as destination [igmp_maxresp=%i]\n", (int)(igmp->igmp_maxresp))); + } + + if (group != NULL) { + IGMP_STATS_INC(igmp.unicast_query); + igmp_delaying_member( group, igmp->igmp_maxresp); + } + } + } + break; + } + case IGMP_V2_MEMB_REPORT: { + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: IGMP_V2_MEMB_REPORT\n")); + + IGMP_STATS_INC(igmp.report_rxed); + if (group->group_state == IGMP_GROUP_DELAYING_MEMBER) { + /* This is on a specific group we have already looked up */ + group->timer = 0; /* stopped */ + group->group_state = IGMP_GROUP_IDLE_MEMBER; + group->last_reporter_flag = 0; + } + break; + } + default: { + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: unexpected msg %d in state %d on group %p on if %p\n", + igmp->igmp_msgtype, group->group_state, &group, group->interface)); + break; + } + } + + pbuf_free(p); + return; +} + +/** + * Join a group on one network interface. + * + * @param ifaddr ip address of the network interface which should join a new group + * @param groupaddr the ip address of the group which to join + * @return ERR_OK if group was joined on the netif(s), an err_t otherwise + */ +err_t +igmp_joingroup(struct ip_addr *ifaddr, struct ip_addr *groupaddr) +{ + err_t err = ERR_VAL; /* no matching interface */ + struct igmp_group *group; + struct netif *netif; + + /* make sure it is multicast address */ + LWIP_ERROR("igmp_joingroup: attempt to join non-multicast address", ip_addr_ismulticast(groupaddr), return ERR_VAL;); + LWIP_ERROR("igmp_joingroup: attempt to join allsystems address", (!ip_addr_cmp(groupaddr, &allsystems)), return ERR_VAL;); + + /* loop through netif's */ + netif = netif_list; + while (netif != NULL) { + /* Should we join this interface ? */ + if ((netif->flags & NETIF_FLAG_IGMP) && ((ip_addr_isany(ifaddr) || ip_addr_cmp(&(netif->ip_addr), ifaddr)))) { + /* find group or create a new one if not found */ + group = igmp_lookup_group(netif, groupaddr); + + if (group != NULL) { + /* This should create a new group, check the state to make sure */ + if (group->group_state != IGMP_GROUP_NON_MEMBER) { + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_joingroup: join to group not in state IGMP_GROUP_NON_MEMBER\n")); + } else { + /* OK - it was new group */ + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_joingroup: join to new group: ")); + ip_addr_debug_print(IGMP_DEBUG, groupaddr); + LWIP_DEBUGF(IGMP_DEBUG, ("\n")); + + /* If first use of the group, allow the group at the MAC level */ + if ((group->use==0) && (netif->igmp_mac_filter != NULL)) { + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_joingroup: igmp_mac_filter(ADD ")); + ip_addr_debug_print(IGMP_DEBUG, groupaddr); + LWIP_DEBUGF(IGMP_DEBUG, (") on if %p\n", netif)); + netif->igmp_mac_filter(netif, groupaddr, IGMP_ADD_MAC_FILTER); + } + + IGMP_STATS_INC(igmp.join_sent); + igmp_send(group, IGMP_V2_MEMB_REPORT); + + igmp_start_timer(group, IGMP_JOIN_DELAYING_MEMBER_TMR); + + /* Need to work out where this timer comes from */ + group->group_state = IGMP_GROUP_DELAYING_MEMBER; + } + /* Increment group use */ + group->use++; + /* Join on this interface */ + err = ERR_OK; + } else { + /* Return an error even if some network interfaces are joined */ + /** @todo undo any other netif already joined */ + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_joingroup: Not enought memory to join to group\n")); + return ERR_MEM; + } + } + /* proceed to next network interface */ + netif = netif->next; + } + + return err; +} + +/** + * Leave a group on one network interface. + * + * @param ifaddr ip address of the network interface which should leave a group + * @param groupaddr the ip address of the group which to leave + * @return ERR_OK if group was left on the netif(s), an err_t otherwise + */ +err_t +igmp_leavegroup(struct ip_addr *ifaddr, struct ip_addr *groupaddr) +{ + err_t err = ERR_VAL; /* no matching interface */ + struct igmp_group *group; + struct netif *netif; + + /* make sure it is multicast address */ + LWIP_ERROR("igmp_leavegroup: attempt to leave non-multicast address", ip_addr_ismulticast(groupaddr), return ERR_VAL;); + LWIP_ERROR("igmp_leavegroup: attempt to leave allsystems address", (!ip_addr_cmp(groupaddr, &allsystems)), return ERR_VAL;); + + /* loop through netif's */ + netif = netif_list; + while (netif != NULL) { + /* Should we leave this interface ? */ + if ((netif->flags & NETIF_FLAG_IGMP) && ((ip_addr_isany(ifaddr) || ip_addr_cmp(&(netif->ip_addr), ifaddr)))) { + /* find group */ + group = igmp_lookfor_group(netif, groupaddr); + + if (group != NULL) { + /* Only send a leave if the flag is set according to the state diagram */ + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_leavegroup: Leaving group: ")); + ip_addr_debug_print(IGMP_DEBUG, groupaddr); + LWIP_DEBUGF(IGMP_DEBUG, ("\n")); + + /* If there is no other use of the group */ + if (group->use <= 1) { + /* If we are the last reporter for this group */ + if (group->last_reporter_flag) { + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_leavegroup: sending leaving group\n")); + IGMP_STATS_INC(igmp.leave_sent); + igmp_send(group, IGMP_LEAVE_GROUP); + } + + /* Disable the group at the MAC level */ + if (netif->igmp_mac_filter != NULL) { + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_leavegroup: igmp_mac_filter(DEL ")); + ip_addr_debug_print(IGMP_DEBUG, groupaddr); + LWIP_DEBUGF(IGMP_DEBUG, (") on if %p\n", netif)); + netif->igmp_mac_filter(netif, groupaddr, IGMP_DEL_MAC_FILTER); + } + + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_leavegroup: remove group: ")); + ip_addr_debug_print(IGMP_DEBUG, groupaddr); + LWIP_DEBUGF(IGMP_DEBUG, ("\n")); + + /* Free the group */ + igmp_remove_group(group); + } else { + /* Decrement group use */ + group->use--; + } + /* Leave on this interface */ + err = ERR_OK; + } else { + /* It's not a fatal error on "leavegroup" */ + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_leavegroup: not member of group\n")); + } + } + /* proceed to next network interface */ + netif = netif->next; + } + + return err; +} + +/** + * The igmp timer function (both for NO_SYS=1 and =0) + * Should be called every IGMP_TMR_INTERVAL milliseconds (100 ms is default). + */ +void +igmp_tmr(void) +{ + struct igmp_group *group = igmp_group_list; + + while (group != NULL) { + if (group->timer != 0) { + group->timer -= 1; + if (group->timer == 0) { + igmp_timeout(group); + } + } + group = group->next; + } +} + +/** + * Called if a timeout for one group is reached. + * Sends a report for this group. + * + * @param group an igmp_group for which a timeout is reached + */ +void +igmp_timeout(struct igmp_group *group) +{ + /* If the state is IGMP_GROUP_DELAYING_MEMBER then we send a report for this group */ + if (group->group_state == IGMP_GROUP_DELAYING_MEMBER) { + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_timeout: report membership for group with address ")); + ip_addr_debug_print(IGMP_DEBUG, &(group->group_address)); + LWIP_DEBUGF(IGMP_DEBUG, (" on if %p\n", group->interface)); + + igmp_send(group, IGMP_V2_MEMB_REPORT); + } +} + +/** + * Start a timer for an igmp group + * + * @param group the igmp_group for which to start a timer + * @param max_time the time in multiples of IGMP_TMR_INTERVAL (decrease with + * every call to igmp_tmr()) + */ +void +igmp_start_timer(struct igmp_group *group, u8_t max_time) +{ + /** + * @todo Important !! this should be random 0 -> max_time. Find out how to do this + */ + group->timer = max_time; +} + +/** + * Stop a timer for an igmp_group + * + * @param group the igmp_group for which to stop the timer + */ +void +igmp_stop_timer(struct igmp_group *group) +{ + group->timer = 0; +} + +/** + * Delaying membership report for a group if necessary + * + * @param group the igmp_group for which "delaying" membership report + * @param maxresp query delay + */ +void +igmp_delaying_member( struct igmp_group *group, u8_t maxresp) +{ + if ((group->group_state == IGMP_GROUP_IDLE_MEMBER) || + ((group->group_state == IGMP_GROUP_DELAYING_MEMBER) && (maxresp > group->timer))) { + igmp_start_timer(group, (maxresp)/2); + group->group_state = IGMP_GROUP_DELAYING_MEMBER; + } +} + + +/** + * Sends an IP packet on a network interface. This function constructs the IP header + * and calculates the IP header checksum. If the source IP address is NULL, + * the IP address of the outgoing network interface is filled in as source address. + * + * @param p the packet to send (p->payload points to the data, e.g. next + protocol header; if dest == IP_HDRINCL, p already includes an IP + header and p->payload points to that IP header) + * @param src the source IP address to send from (if src == IP_ADDR_ANY, the + * IP address of the netif used to send is used as source address) + * @param dest the destination IP address to send the packet to + * @param ttl the TTL value to be set in the IP header + * @param proto the PROTOCOL to be set in the IP header + * @param netif the netif on which to send this packet + * @return ERR_OK if the packet was sent OK + * ERR_BUF if p doesn't have enough space for IP/LINK headers + * returns errors returned by netif->output + */ +err_t +igmp_ip_output_if(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, + u8_t ttl, u8_t proto, struct netif *netif) +{ + /* This is the "router alert" option */ + u16_t ra[2]; + ra[0] = htons (ROUTER_ALERT); + ra[1] = 0x0000; /* Router shall examine packet */ + return ip_output_if_opt(p, src, dest, ttl, 0, proto, netif, ra, ROUTER_ALERTLEN); +} + +/** + * Send an igmp packet to a specific group. + * + * @param group the group to which to send the packet + * @param type the type of igmp packet to send + */ +void +igmp_send(struct igmp_group *group, u8_t type) +{ + struct pbuf* p = NULL; + struct igmp_msg* igmp = NULL; + struct ip_addr src = {0}; + struct ip_addr* dest = NULL; + + /* IP header + "router alert" option + IGMP header */ + p = pbuf_alloc(PBUF_TRANSPORT, IGMP_MINLEN, PBUF_RAM); + + if (p) { + igmp = p->payload; + LWIP_ASSERT("igmp_send: check that first pbuf can hold struct igmp_msg", + (p->len >= sizeof(struct igmp_msg))); + ip_addr_set(&src, &((group->interface)->ip_addr)); + + if (type == IGMP_V2_MEMB_REPORT) { + dest = &(group->group_address); + IGMP_STATS_INC(igmp.report_sent); + ip_addr_set(&(igmp->igmp_group_address), &(group->group_address)); + group->last_reporter_flag = 1; /* Remember we were the last to report */ + } else { + if (type == IGMP_LEAVE_GROUP) { + dest = &allrouters; + ip_addr_set(&(igmp->igmp_group_address), &(group->group_address)); + } + } + + if ((type == IGMP_V2_MEMB_REPORT) || (type == IGMP_LEAVE_GROUP)) { + igmp->igmp_msgtype = type; + igmp->igmp_maxresp = 0; + igmp->igmp_checksum = 0; + igmp->igmp_checksum = inet_chksum( igmp, IGMP_MINLEN); + + igmp_ip_output_if(p, &src, dest, IGMP_TTL, IP_PROTO_IGMP, group->interface); + } + + pbuf_free(p); + } else { + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_send: not enough memory for igmp_send\n")); + } +} + +#endif /* LWIP_IGMP */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/inet.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/inet.c new file mode 100644 index 0000000..0d4f922 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/inet.c @@ -0,0 +1,280 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/** + * @file + * Functions common to all TCP/IPv4 modules, such as the byte order functions. + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "lwip/opt.h" + +#include "lwip/inet.h" + +/* Here for now until needed in other places in lwIP */ +#ifndef isprint +#define in_range(c, lo, up) ((u8_t)c >= lo && (u8_t)c <= up) +#define isprint(c) in_range(c, 0x20, 0x7f) +#define isdigit(c) in_range(c, '0', '9') +#define isxdigit(c) (isdigit(c) || in_range(c, 'a', 'f') || in_range(c, 'A', 'F')) +#define islower(c) in_range(c, 'a', 'z') +#define isspace(c) (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v') +#endif + +/** + * Ascii internet address interpretation routine. + * The value returned is in network order. + * + * @param cp IP address in ascii represenation (e.g. "127.0.0.1") + * @return ip address in network order + */ +u32_t +inet_addr(const char *cp) +{ + struct in_addr val; + + if (inet_aton(cp, &val)) { + return (val.s_addr); + } + return (INADDR_NONE); +} + +/** + * Check whether "cp" is a valid ascii representation + * of an Internet address and convert to a binary address. + * Returns 1 if the address is valid, 0 if not. + * This replaces inet_addr, the return value from which + * cannot distinguish between failure and a local broadcast address. + * + * @param cp IP address in ascii represenation (e.g. "127.0.0.1") + * @param addr pointer to which to save the ip address in network order + * @return 1 if cp could be converted to addr, 0 on failure + */ +int +inet_aton(const char *cp, struct in_addr *addr) +{ + u32_t val; + u8_t base; + char c; + u32_t parts[4]; + u32_t *pp = parts; + + c = *cp; + for (;;) { + /* + * Collect number up to ``.''. + * Values are specified as for C: + * 0x=hex, 0=octal, 1-9=decimal. + */ + if (!isdigit(c)) + return (0); + val = 0; + base = 10; + if (c == '0') { + c = *++cp; + if (c == 'x' || c == 'X') { + base = 16; + c = *++cp; + } else + base = 8; + } + for (;;) { + if (isdigit(c)) { + val = (val * base) + (int)(c - '0'); + c = *++cp; + } else if (base == 16 && isxdigit(c)) { + val = (val << 4) | (int)(c + 10 - (islower(c) ? 'a' : 'A')); + c = *++cp; + } else + break; + } + if (c == '.') { + /* + * Internet format: + * a.b.c.d + * a.b.c (with c treated as 16 bits) + * a.b (with b treated as 24 bits) + */ + if (pp >= parts + 3) + return (0); + *pp++ = val; + c = *++cp; + } else + break; + } + /* + * Check for trailing characters. + */ + if (c != '\0' && !isspace(c)) + return (0); + /* + * Concoct the address according to + * the number of parts specified. + */ + switch (pp - parts + 1) { + + case 0: + return (0); /* initial nondigit */ + + case 1: /* a -- 32 bits */ + break; + + case 2: /* a.b -- 8.24 bits */ + if (val > 0xffffffUL) + return (0); + val |= parts[0] << 24; + break; + + case 3: /* a.b.c -- 8.8.16 bits */ + if (val > 0xffff) + return (0); + val |= (parts[0] << 24) | (parts[1] << 16); + break; + + case 4: /* a.b.c.d -- 8.8.8.8 bits */ + if (val > 0xff) + return (0); + val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8); + break; + } + if (addr) + addr->s_addr = htonl(val); + return (1); +} + +/** + * Convert numeric IP address into decimal dotted ASCII representation. + * returns ptr to static buffer; not reentrant! + * + * @param addr ip address in network order to convert + * @return pointer to a global static (!) buffer that holds the ASCII + * represenation of addr + */ +char * +inet_ntoa(struct in_addr addr) +{ + static char str[16]; + u32_t s_addr = addr.s_addr; + char inv[3]; + char *rp; + u8_t *ap; + u8_t rem; + u8_t n; + u8_t i; + + rp = str; + ap = (u8_t *)&s_addr; + for(n = 0; n < 4; n++) { + i = 0; + do { + rem = *ap % (u8_t)10; + *ap /= (u8_t)10; + inv[i++] = '0' + rem; + } while(*ap); + while(i--) + *rp++ = inv[i]; + *rp++ = '.'; + ap++; + } + *--rp = 0; + return str; +} + +/** + * These are reference implementations of the byte swapping functions. + * Again with the aim of being simple, correct and fully portable. + * Byte swapping is the second thing you would want to optimize. You will + * need to port it to your architecture and in your cc.h: + * + * #define LWIP_PLATFORM_BYTESWAP 1 + * #define LWIP_PLATFORM_HTONS(x) + * #define LWIP_PLATFORM_HTONL(x) + * + * Note ntohs() and ntohl() are merely references to the htonx counterparts. + */ + +#if (LWIP_PLATFORM_BYTESWAP == 0) && (BYTE_ORDER == LITTLE_ENDIAN) + +/** + * Convert an u16_t from host- to network byte order. + * + * @param n u16_t in host byte order + * @return n in network byte order + */ +u16_t +htons(u16_t n) +{ + return ((n & 0xff) << 8) | ((n & 0xff00) >> 8); +} + +/** + * Convert an u16_t from network- to host byte order. + * + * @param n u16_t in network byte order + * @return n in host byte order + */ +u16_t +ntohs(u16_t n) +{ + return htons(n); +} + +/** + * Convert an u32_t from host- to network byte order. + * + * @param n u32_t in host byte order + * @return n in network byte order + */ +u32_t +htonl(u32_t n) +{ + return ((n & 0xff) << 24) | + ((n & 0xff00) << 8) | + ((n & 0xff0000UL) >> 8) | + ((n & 0xff000000UL) >> 24); +} + +/** + * Convert an u32_t from network- to host byte order. + * + * @param n u32_t in network byte order + * @return n in host byte order + */ +u32_t +ntohl(u32_t n) +{ + return htonl(n); +} + +#endif /* (LWIP_PLATFORM_BYTESWAP == 0) && (BYTE_ORDER == LITTLE_ENDIAN) */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/inet_chksum.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/inet_chksum.c new file mode 100644 index 0000000..47a11d4 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/inet_chksum.c @@ -0,0 +1,440 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/** + * @file + * Incluse internet checksum functions. + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "lwip/opt.h" + +#include "lwip/inet_chksum.h" +#include "lwip/inet.h" + +#include + +/* These are some reference implementations of the checksum algorithm, with the + * aim of being simple, correct and fully portable. Checksumming is the + * first thing you would want to optimize for your platform. If you create + * your own version, link it in and in your cc.h put: + * + * #define LWIP_CHKSUM + * + * Or you can select from the implementations below by defining + * LWIP_CHKSUM_ALGORITHM to 1, 2 or 3. + */ + +#ifndef LWIP_CHKSUM +# define LWIP_CHKSUM lwip_standard_chksum +# ifndef LWIP_CHKSUM_ALGORITHM +# define LWIP_CHKSUM_ALGORITHM 1 +# endif +#endif +/* If none set: */ +#ifndef LWIP_CHKSUM_ALGORITHM +# define LWIP_CHKSUM_ALGORITHM 0 +#endif + +/** Like the name says... */ +#if LWIP_PLATFORM_BYTESWAP && (BYTE_ORDER == LITTLE_ENDIAN) +/* little endian and PLATFORM_BYTESWAP defined */ +#define SWAP_BYTES_IN_WORD(w) LWIP_PLATFORM_HTONS(w) +#else +/* can't use htons on big endian (or PLATFORM_BYTESWAP not defined)... */ +#define SWAP_BYTES_IN_WORD(w) ((w & 0xff) << 8) | ((w & 0xff00) >> 8) +#endif + +/** Split an u32_t in two u16_ts and add them up */ +#define FOLD_U32T(u) ((u >> 16) + (u & 0x0000ffffUL)) + +#if (LWIP_CHKSUM_ALGORITHM == 1) /* Version #1 */ +/** + * lwip checksum + * + * @param dataptr points to start of data to be summed at any boundary + * @param len length of data to be summed + * @return host order (!) lwip checksum (non-inverted Internet sum) + * + * @note accumulator size limits summable length to 64k + * @note host endianess is irrelevant (p3 RFC1071) + */ +static u16_t +lwip_standard_chksum(void *dataptr, u16_t len) +{ + u32_t acc; + u16_t src; + u8_t *octetptr; + + acc = 0; + /* dataptr may be at odd or even addresses */ + octetptr = (u8_t*)dataptr; + while (len > 1) { + /* declare first octet as most significant + thus assume network order, ignoring host order */ + src = (*octetptr) << 8; + octetptr++; + /* declare second octet as least significant */ + src |= (*octetptr); + octetptr++; + acc += src; + len -= 2; + } + if (len > 0) { + /* accumulate remaining octet */ + src = (*octetptr) << 8; + acc += src; + } + /* add deferred carry bits */ + acc = (acc >> 16) + (acc & 0x0000ffffUL); + if ((acc & 0xffff0000UL) != 0) { + acc = (acc >> 16) + (acc & 0x0000ffffUL); + } + /* This maybe a little confusing: reorder sum using htons() + instead of ntohs() since it has a little less call overhead. + The caller must invert bits for Internet sum ! */ + return htons((u16_t)acc); +} +#endif + +#if (LWIP_CHKSUM_ALGORITHM == 2) /* Alternative version #2 */ +/* + * Curt McDowell + * Broadcom Corp. + * csm@broadcom.com + * + * IP checksum two bytes at a time with support for + * unaligned buffer. + * Works for len up to and including 0x20000. + * by Curt McDowell, Broadcom Corp. 12/08/2005 + * + * @param dataptr points to start of data to be summed at any boundary + * @param len length of data to be summed + * @return host order (!) lwip checksum (non-inverted Internet sum) + */ + +static u16_t +lwip_standard_chksum(void *dataptr, int len) +{ + u8_t *pb = dataptr; + u16_t *ps, t = 0; + u32_t sum = 0; + int odd = ((u32_t)pb & 1); + + /* Get aligned to u16_t */ + if (odd && len > 0) { + ((u8_t *)&t)[1] = *pb++; + len--; + } + + /* Add the bulk of the data */ + ps = (u16_t *)pb; + while (len > 1) { + sum += *ps++; + len -= 2; + } + + /* Consume left-over byte, if any */ + if (len > 0) { + ((u8_t *)&t)[0] = *(u8_t *)ps;; + } + + /* Add end bytes */ + sum += t; + + /* Fold 32-bit sum to 16 bits + calling this twice is propably faster than if statements... */ + sum = FOLD_U32T(sum); + sum = FOLD_U32T(sum); + + /* Swap if alignment was odd */ + if (odd) { + sum = SWAP_BYTES_IN_WORD(sum); + } + + return sum; +} +#endif + +#if (LWIP_CHKSUM_ALGORITHM == 3) /* Alternative version #3 */ +/** + * An optimized checksum routine. Basically, it uses loop-unrolling on + * the checksum loop, treating the head and tail bytes specially, whereas + * the inner loop acts on 8 bytes at a time. + * + * @arg start of buffer to be checksummed. May be an odd byte address. + * @len number of bytes in the buffer to be checksummed. + * @return host order (!) lwip checksum (non-inverted Internet sum) + * + * by Curt McDowell, Broadcom Corp. December 8th, 2005 + */ + +static u16_t +lwip_standard_chksum(void *dataptr, int len) +{ + u8_t *pb = dataptr; + u16_t *ps, t = 0; + u32_t *pl; + u32_t sum = 0, tmp; + /* starts at odd byte address? */ + int odd = ((u32_t)pb & 1); + + if (odd && len > 0) { + ((u8_t *)&t)[1] = *pb++; + len--; + } + + ps = (u16_t *)pb; + + if (((u32_t)ps & 3) && len > 1) { + sum += *ps++; + len -= 2; + } + + pl = (u32_t *)ps; + + while (len > 7) { + tmp = sum + *pl++; /* ping */ + if (tmp < sum) { + tmp++; /* add back carry */ + } + + sum = tmp + *pl++; /* pong */ + if (sum < tmp) { + sum++; /* add back carry */ + } + + len -= 8; + } + + /* make room in upper bits */ + sum = FOLD_U32T(sum); + + ps = (u16_t *)pl; + + /* 16-bit aligned word remaining? */ + while (len > 1) { + sum += *ps++; + len -= 2; + } + + /* dangling tail byte remaining? */ + if (len > 0) { /* include odd byte */ + ((u8_t *)&t)[0] = *(u8_t *)ps; + } + + sum += t; /* add end bytes */ + + /* Fold 32-bit sum to 16 bits + calling this twice is propably faster than if statements... */ + sum = FOLD_U32T(sum); + sum = FOLD_U32T(sum); + + if (odd) { + sum = SWAP_BYTES_IN_WORD(sum); + } + + return sum; +} +#endif + +/* inet_chksum_pseudo: + * + * Calculates the pseudo Internet checksum used by TCP and UDP for a pbuf chain. + * IP addresses are expected to be in network byte order. + * + * @param p chain of pbufs over that a checksum should be calculated (ip data part) + * @param src source ip address (used for checksum of pseudo header) + * @param dst destination ip address (used for checksum of pseudo header) + * @param proto ip protocol (used for checksum of pseudo header) + * @param proto_len length of the ip data part (used for checksum of pseudo header) + * @return checksum (as u16_t) to be saved directly in the protocol header + */ +u16_t +inet_chksum_pseudo(struct pbuf *p, + struct ip_addr *src, struct ip_addr *dest, + u8_t proto, u16_t proto_len) +{ + u32_t acc; + struct pbuf *q; + u8_t swapped; + + acc = 0; + swapped = 0; + /* iterate through all pbuf in chain */ + for(q = p; q != NULL; q = q->next) { + LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): checksumming pbuf %p (has next %p) \n", + (void *)q, (void *)q->next)); + acc += LWIP_CHKSUM(q->payload, q->len); + /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): unwrapped lwip_chksum()=%"X32_F" \n", acc));*/ + /* just executing this next line is probably faster that the if statement needed + to check whether we really need to execute it, and does no harm */ + acc = FOLD_U32T(acc); + if (q->len % 2 != 0) { + swapped = 1 - swapped; + acc = SWAP_BYTES_IN_WORD(acc); + } + /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): wrapped lwip_chksum()=%"X32_F" \n", acc));*/ + } + + if (swapped) { + acc = SWAP_BYTES_IN_WORD(acc); + } + acc += (src->addr & 0xffffUL); + acc += ((src->addr >> 16) & 0xffffUL); + acc += (dest->addr & 0xffffUL); + acc += ((dest->addr >> 16) & 0xffffUL); + acc += (u32_t)htons((u16_t)proto); + acc += (u32_t)htons(proto_len); + + /* Fold 32-bit sum to 16 bits + calling this twice is propably faster than if statements... */ + acc = FOLD_U32T(acc); + acc = FOLD_U32T(acc); + LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): pbuf chain lwip_chksum()=%"X32_F"\n", acc)); + return (u16_t)~(acc & 0xffffUL); +} + +/* inet_chksum_pseudo: + * + * Calculates the pseudo Internet checksum used by TCP and UDP for a pbuf chain. + * IP addresses are expected to be in network byte order. + * + * @param p chain of pbufs over that a checksum should be calculated (ip data part) + * @param src source ip address (used for checksum of pseudo header) + * @param dst destination ip address (used for checksum of pseudo header) + * @param proto ip protocol (used for checksum of pseudo header) + * @param proto_len length of the ip data part (used for checksum of pseudo header) + * @return checksum (as u16_t) to be saved directly in the protocol header + */ +/* Currently only used by UDPLITE, although this could change in the future. */ +#if LWIP_UDPLITE +u16_t +inet_chksum_pseudo_partial(struct pbuf *p, + struct ip_addr *src, struct ip_addr *dest, + u8_t proto, u16_t proto_len, u16_t chksum_len) +{ + u32_t acc; + struct pbuf *q; + u8_t swapped; + u16_t chklen; + + acc = 0; + swapped = 0; + /* iterate through all pbuf in chain */ + for(q = p; (q != NULL) && (chksum_len > 0); q = q->next) { + LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): checksumming pbuf %p (has next %p) \n", + (void *)q, (void *)q->next)); + chklen = q->len; + if (chklen > chksum_len) { + chklen = chksum_len; + } + acc += LWIP_CHKSUM(q->payload, chklen); + chksum_len -= chklen; + LWIP_ASSERT("delete me", chksum_len < 0x7fff); + /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): unwrapped lwip_chksum()=%"X32_F" \n", acc));*/ + /* fold the upper bit down */ + acc = FOLD_U32T(acc); + if (q->len % 2 != 0) { + swapped = 1 - swapped; + acc = SWAP_BYTES_IN_WORD(acc); + } + /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): wrapped lwip_chksum()=%"X32_F" \n", acc));*/ + } + + if (swapped) { + acc = SWAP_BYTES_IN_WORD(acc); + } + acc += (src->addr & 0xffffUL); + acc += ((src->addr >> 16) & 0xffffUL); + acc += (dest->addr & 0xffffUL); + acc += ((dest->addr >> 16) & 0xffffUL); + acc += (u32_t)htons((u16_t)proto); + acc += (u32_t)htons(proto_len); + + /* Fold 32-bit sum to 16 bits + calling this twice is propably faster than if statements... */ + acc = FOLD_U32T(acc); + acc = FOLD_U32T(acc); + LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): pbuf chain lwip_chksum()=%"X32_F"\n", acc)); + return (u16_t)~(acc & 0xffffUL); +} +#endif /* LWIP_UDPLITE */ + +/* inet_chksum: + * + * Calculates the Internet checksum over a portion of memory. Used primarily for IP + * and ICMP. + * + * @param dataptr start of the buffer to calculate the checksum (no alignment needed) + * @param len length of the buffer to calculate the checksum + * @return checksum (as u16_t) to be saved directly in the protocol header + */ + +u16_t +inet_chksum(void *dataptr, u16_t len) +{ + return ~LWIP_CHKSUM(dataptr, len); +} + +/** + * Calculate a checksum over a chain of pbufs (without pseudo-header, much like + * inet_chksum only pbufs are used). + * + * @param p pbuf chain over that the checksum should be calculated + * @return checksum (as u16_t) to be saved directly in the protocol header + */ +u16_t +inet_chksum_pbuf(struct pbuf *p) +{ + u32_t acc; + struct pbuf *q; + u8_t swapped; + + acc = 0; + swapped = 0; + for(q = p; q != NULL; q = q->next) { + acc += LWIP_CHKSUM(q->payload, q->len); + acc = FOLD_U32T(acc); + if (q->len % 2 != 0) { + swapped = 1 - swapped; + acc = SWAP_BYTES_IN_WORD(acc); + } + } + + if (swapped) { + acc = SWAP_BYTES_IN_WORD(acc); + } + return (u16_t)~(acc & 0xffffUL); +} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/ip.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/ip.c new file mode 100644 index 0000000..a958242 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/ip.c @@ -0,0 +1,725 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/** + * @file + * This is the IPv4 layer implementation for incoming and outgoing IP traffic. + * + * @see ip_frag.c + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "lwip/opt.h" +#include "lwip/ip.h" +#include "lwip/def.h" +#include "lwip/mem.h" +#include "lwip/ip_frag.h" +#include "lwip/inet.h" +#include "lwip/inet_chksum.h" +#include "lwip/netif.h" +#include "lwip/icmp.h" +#include "lwip/igmp.h" +#include "lwip/raw.h" +#include "lwip/udp.h" +#include "lwip/tcp.h" +#include "lwip/snmp.h" +#include "lwip/dhcp.h" +#include "lwip/stats.h" +#include "arch/perf.h" + +#include + +/** + * The interface that provided the packet for the current callback + * invocation. + */ +struct netif *current_netif; + +/** + * Header of the input packet currently being processed. + */ +const struct ip_hdr *current_header; + +/** + * Finds the appropriate network interface for a given IP address. It + * searches the list of network interfaces linearly. A match is found + * if the masked IP address of the network interface equals the masked + * IP address given to the function. + * + * @param dest the destination IP address for which to find the route + * @return the netif on which to send to reach dest + */ +struct netif * +ip_route(struct ip_addr *dest) +{ + struct netif *netif; + + /* iterate through netifs */ + for(netif = netif_list; netif != NULL; netif = netif->next) { + /* network mask matches? */ + if (netif_is_up(netif)) { + if (ip_addr_netcmp(dest, &(netif->ip_addr), &(netif->netmask))) { + /* return netif on which to forward IP packet */ + return netif; + } + } + } + if ((netif_default == NULL) || (!netif_is_up(netif_default))) { + LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip_route: No route to 0x%"X32_F"\n", dest->addr)); + IP_STATS_INC(ip.rterr); + snmp_inc_ipoutnoroutes(); + return NULL; + } + /* no matching netif found, use default netif */ + return netif_default; +} + +#if IP_FORWARD +/** + * Forwards an IP packet. It finds an appropriate route for the + * packet, decrements the TTL value of the packet, adjusts the + * checksum and outputs the packet on the appropriate interface. + * + * @param p the packet to forward (p->payload points to IP header) + * @param iphdr the IP header of the input packet + * @param inp the netif on which this packet was received + * @return the netif on which the packet was sent (NULL if it wasn't sent) + */ +static struct netif * +ip_forward(struct pbuf *p, struct ip_hdr *iphdr, struct netif *inp) +{ + struct netif *netif; + + PERF_START; + /* Find network interface where to forward this IP packet to. */ + netif = ip_route((struct ip_addr *)&(iphdr->dest)); + if (netif == NULL) { + LWIP_DEBUGF(IP_DEBUG, ("ip_forward: no forwarding route for 0x%"X32_F" found\n", + iphdr->dest.addr)); + snmp_inc_ipoutnoroutes(); + return (struct netif *)NULL; + } + /* Do not forward packets onto the same network interface on which + * they arrived. */ + if (netif == inp) { + LWIP_DEBUGF(IP_DEBUG, ("ip_forward: not bouncing packets back on incoming interface.\n")); + snmp_inc_ipoutnoroutes(); + return (struct netif *)NULL; + } + + /* decrement TTL */ + IPH_TTL_SET(iphdr, IPH_TTL(iphdr) - 1); + /* send ICMP if TTL == 0 */ + if (IPH_TTL(iphdr) == 0) { + snmp_inc_ipinhdrerrors(); +#if LWIP_ICMP + /* Don't send ICMP messages in response to ICMP messages */ + if (IPH_PROTO(iphdr) != IP_PROTO_ICMP) { + icmp_time_exceeded(p, ICMP_TE_TTL); + } +#endif /* LWIP_ICMP */ + return (struct netif *)NULL; + } + + /* Incrementally update the IP checksum. */ + if (IPH_CHKSUM(iphdr) >= htons(0xffff - 0x100)) { + IPH_CHKSUM_SET(iphdr, IPH_CHKSUM(iphdr) + htons(0x100) + 1); + } else { + IPH_CHKSUM_SET(iphdr, IPH_CHKSUM(iphdr) + htons(0x100)); + } + + LWIP_DEBUGF(IP_DEBUG, ("ip_forward: forwarding packet to 0x%"X32_F"\n", + iphdr->dest.addr)); + + IP_STATS_INC(ip.fw); + IP_STATS_INC(ip.xmit); + snmp_inc_ipforwdatagrams(); + + PERF_STOP("ip_forward"); + /* transmit pbuf on chosen interface */ + netif->output(netif, p, (struct ip_addr *)&(iphdr->dest)); + return netif; +} +#endif /* IP_FORWARD */ + +/** + * This function is called by the network interface device driver when + * an IP packet is received. The function does the basic checks of the + * IP header such as packet size being at least larger than the header + * size etc. If the packet was not destined for us, the packet is + * forwarded (using ip_forward). The IP checksum is always checked. + * + * Finally, the packet is sent to the upper layer protocol input function. + * + * @param p the received IP packet (p->payload points to IP header) + * @param inp the netif on which this packet was received + * @return ERR_OK if the packet was processed (could return ERR_* if it wasn't + * processed, but currently always returns ERR_OK) + */ +err_t +ip_input(struct pbuf *p, struct netif *inp) +{ + struct ip_hdr *iphdr; + struct netif *netif; + u16_t iphdr_hlen; + u16_t iphdr_len; +#if LWIP_DHCP + int check_ip_src=1; +#endif /* LWIP_DHCP */ + + IP_STATS_INC(ip.recv); + snmp_inc_ipinreceives(); + + /* identify the IP header */ + iphdr = p->payload; + if (IPH_V(iphdr) != 4) { + LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_WARNING, ("IP packet dropped due to bad version number %"U16_F"\n", IPH_V(iphdr))); + ip_debug_print(p); + pbuf_free(p); + IP_STATS_INC(ip.err); + IP_STATS_INC(ip.drop); + snmp_inc_ipinhdrerrors(); + return ERR_OK; + } + + /* obtain IP header length in number of 32-bit words */ + iphdr_hlen = IPH_HL(iphdr); + /* calculate IP header length in bytes */ + iphdr_hlen *= 4; + /* obtain ip length in bytes */ + iphdr_len = ntohs(IPH_LEN(iphdr)); + + /* header length exceeds first pbuf length, or ip length exceeds total pbuf length? */ + if ((iphdr_hlen > p->len) || (iphdr_len > p->tot_len)) { + if (iphdr_hlen > p->len) { + LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, + ("IP header (len %"U16_F") does not fit in first pbuf (len %"U16_F"), IP packet dropped.\n", + iphdr_hlen, p->len)); + } + if (iphdr_len > p->tot_len) { + LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, + ("IP (len %"U16_F") is longer than pbuf (len %"U16_F"), IP packet dropped.\n", + iphdr_len, p->tot_len)); + } + /* free (drop) packet pbufs */ + pbuf_free(p); + IP_STATS_INC(ip.lenerr); + IP_STATS_INC(ip.drop); + snmp_inc_ipindiscards(); + return ERR_OK; + } + + /* verify checksum */ +#if CHECKSUM_CHECK_IP + if (inet_chksum(iphdr, iphdr_hlen) != 0) { + + LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, + ("Checksum (0x%"X16_F") failed, IP packet dropped.\n", inet_chksum(iphdr, iphdr_hlen))); + ip_debug_print(p); + pbuf_free(p); + IP_STATS_INC(ip.chkerr); + IP_STATS_INC(ip.drop); + snmp_inc_ipinhdrerrors(); + return ERR_OK; + } +#endif + + /* Trim pbuf. This should have been done at the netif layer, + * but we'll do it anyway just to be sure that its done. */ + pbuf_realloc(p, iphdr_len); + + /* match packet against an interface, i.e. is this packet for us? */ +#if LWIP_IGMP + if (ip_addr_ismulticast(&(iphdr->dest))) { + if ((inp->flags & NETIF_FLAG_IGMP) && (igmp_lookfor_group(inp, &(iphdr->dest)))) { + netif = inp; + } else { + netif = NULL; + } + } else +#endif /* LWIP_IGMP */ + { + /* start trying with inp. if that's not acceptable, start walking the + list of configured netifs. + 'first' is used as a boolean to mark whether we started walking the list */ + int first = 1; + netif = inp; + do { + LWIP_DEBUGF(IP_DEBUG, ("ip_input: iphdr->dest 0x%"X32_F" netif->ip_addr 0x%"X32_F" (0x%"X32_F", 0x%"X32_F", 0x%"X32_F")\n", + iphdr->dest.addr, netif->ip_addr.addr, + iphdr->dest.addr & netif->netmask.addr, + netif->ip_addr.addr & netif->netmask.addr, + iphdr->dest.addr & ~(netif->netmask.addr))); + + /* interface is up and configured? */ + if ((netif_is_up(netif)) && (!ip_addr_isany(&(netif->ip_addr)))) { + /* unicast to this interface address? */ + if (ip_addr_cmp(&(iphdr->dest), &(netif->ip_addr)) || + /* or broadcast on this interface network address? */ + ip_addr_isbroadcast(&(iphdr->dest), netif)) { + LWIP_DEBUGF(IP_DEBUG, ("ip_input: packet accepted on interface %c%c\n", + netif->name[0], netif->name[1])); + /* break out of for loop */ + break; + } + } + if (first) { + first = 0; + netif = netif_list; + } else { + netif = netif->next; + } + if (netif == inp) { + netif = netif->next; + } + } while(netif != NULL); + } + +#if LWIP_DHCP + /* Pass DHCP messages regardless of destination address. DHCP traffic is addressed + * using link layer addressing (such as Ethernet MAC) so we must not filter on IP. + * According to RFC 1542 section 3.1.1, referred by RFC 2131). + */ + if (netif == NULL) { + /* remote port is DHCP server? */ + if (IPH_PROTO(iphdr) == IP_PROTO_UDP) { + LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, ("ip_input: UDP packet to DHCP client port %"U16_F"\n", + ntohs(((struct udp_hdr *)((u8_t *)iphdr + iphdr_hlen))->dest))); + if (ntohs(((struct udp_hdr *)((u8_t *)iphdr + iphdr_hlen))->dest) == DHCP_CLIENT_PORT) { + LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, ("ip_input: DHCP packet accepted.\n")); + netif = inp; + check_ip_src = 0; + } + } + } +#endif /* LWIP_DHCP */ + + /* broadcast or multicast packet source address? Compliant with RFC 1122: 3.2.1.3 */ +#if LWIP_DHCP + /* DHCP servers need 0.0.0.0 to be allowed as source address (RFC 1.1.2.2: 3.2.1.3/a) */ + if (check_ip_src && (iphdr->src.addr != 0)) +#endif /* LWIP_DHCP */ + { if ((ip_addr_isbroadcast(&(iphdr->src), inp)) || + (ip_addr_ismulticast(&(iphdr->src)))) { + /* packet source is not valid */ + LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("ip_input: packet source is not valid.\n")); + /* free (drop) packet pbufs */ + pbuf_free(p); + IP_STATS_INC(ip.drop); + snmp_inc_ipinaddrerrors(); + snmp_inc_ipindiscards(); + return ERR_OK; + } + } + + /* packet not for us? */ + if (netif == NULL) { + /* packet not for us, route or discard */ + LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, ("ip_input: packet not for us.\n")); +#if IP_FORWARD + /* non-broadcast packet? */ + if (!ip_addr_isbroadcast(&(iphdr->dest), inp)) { + /* try to forward IP packet on (other) interfaces */ + ip_forward(p, iphdr, inp); + } else +#endif /* IP_FORWARD */ + { + snmp_inc_ipinaddrerrors(); + snmp_inc_ipindiscards(); + } + pbuf_free(p); + return ERR_OK; + } + /* packet consists of multiple fragments? */ + if ((IPH_OFFSET(iphdr) & htons(IP_OFFMASK | IP_MF)) != 0) { +#if IP_REASSEMBLY /* packet fragment reassembly code present? */ + LWIP_DEBUGF(IP_DEBUG, ("IP packet is a fragment (id=0x%04"X16_F" tot_len=%"U16_F" len=%"U16_F" MF=%"U16_F" offset=%"U16_F"), calling ip_reass()\n", + ntohs(IPH_ID(iphdr)), p->tot_len, ntohs(IPH_LEN(iphdr)), !!(IPH_OFFSET(iphdr) & htons(IP_MF)), (ntohs(IPH_OFFSET(iphdr)) & IP_OFFMASK)*8)); + /* reassemble the packet*/ + p = ip_reass(p); + /* packet not fully reassembled yet? */ + if (p == NULL) { + return ERR_OK; + } + iphdr = p->payload; +#else /* IP_REASSEMBLY == 0, no packet fragment reassembly code present */ + pbuf_free(p); + LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("IP packet dropped since it was fragmented (0x%"X16_F") (while IP_REASSEMBLY == 0).\n", + ntohs(IPH_OFFSET(iphdr)))); + IP_STATS_INC(ip.opterr); + IP_STATS_INC(ip.drop); + /* unsupported protocol feature */ + snmp_inc_ipinunknownprotos(); + return ERR_OK; +#endif /* IP_REASSEMBLY */ + } + +#if IP_OPTIONS_ALLOWED == 0 /* no support for IP options in the IP header? */ + +#if LWIP_IGMP + /* there is an extra "router alert" option in IGMP messages which we allow for but do not police */ + if((iphdr_hlen > IP_HLEN && (IPH_PROTO(iphdr) != IP_PROTO_IGMP)) { +#else + if (iphdr_hlen > IP_HLEN) { +#endif /* LWIP_IGMP */ + LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("IP packet dropped since there were IP options (while IP_OPTIONS_ALLOWED == 0).\n")); + pbuf_free(p); + IP_STATS_INC(ip.opterr); + IP_STATS_INC(ip.drop); + /* unsupported protocol feature */ + snmp_inc_ipinunknownprotos(); + return ERR_OK; + } +#endif /* IP_OPTIONS_ALLOWED == 0 */ + + /* send to upper layers */ + LWIP_DEBUGF(IP_DEBUG, ("ip_input: \n")); + ip_debug_print(p); + LWIP_DEBUGF(IP_DEBUG, ("ip_input: p->len %"U16_F" p->tot_len %"U16_F"\n", p->len, p->tot_len)); + + current_netif = inp; + current_header = iphdr; + +#if LWIP_RAW + /* raw input did not eat the packet? */ + if (raw_input(p, inp) == 0) +#endif /* LWIP_RAW */ + { + + switch (IPH_PROTO(iphdr)) { +#if LWIP_UDP + case IP_PROTO_UDP: +#if LWIP_UDPLITE + case IP_PROTO_UDPLITE: +#endif /* LWIP_UDPLITE */ + snmp_inc_ipindelivers(); + udp_input(p, inp); + break; +#endif /* LWIP_UDP */ +#if LWIP_TCP + case IP_PROTO_TCP: + snmp_inc_ipindelivers(); + tcp_input(p, inp); + break; +#endif /* LWIP_TCP */ +#if LWIP_ICMP + case IP_PROTO_ICMP: + snmp_inc_ipindelivers(); + icmp_input(p, inp); + break; +#endif /* LWIP_ICMP */ +#if LWIP_IGMP + case IP_PROTO_IGMP: + igmp_input(p,inp,&(iphdr->dest)); + break; +#endif /* LWIP_IGMP */ + default: +#if LWIP_ICMP + /* send ICMP destination protocol unreachable unless is was a broadcast */ + if (!ip_addr_isbroadcast(&(iphdr->dest), inp) && + !ip_addr_ismulticast(&(iphdr->dest))) { + p->payload = iphdr; + icmp_dest_unreach(p, ICMP_DUR_PROTO); + } +#endif /* LWIP_ICMP */ + pbuf_free(p); + + LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("Unsupported transport protocol %"U16_F"\n", IPH_PROTO(iphdr))); + + IP_STATS_INC(ip.proterr); + IP_STATS_INC(ip.drop); + snmp_inc_ipinunknownprotos(); + } + } + + current_netif = NULL; + current_header = NULL; + + return ERR_OK; +} + +/** + * Sends an IP packet on a network interface. This function constructs + * the IP header and calculates the IP header checksum. If the source + * IP address is NULL, the IP address of the outgoing network + * interface is filled in as source address. + * If the destination IP address is IP_HDRINCL, p is assumed to already + * include an IP header and p->payload points to it instead of the data. + * + * @param p the packet to send (p->payload points to the data, e.g. next + protocol header; if dest == IP_HDRINCL, p already includes an IP + header and p->payload points to that IP header) + * @param src the source IP address to send from (if src == IP_ADDR_ANY, the + * IP address of the netif used to send is used as source address) + * @param dest the destination IP address to send the packet to + * @param ttl the TTL value to be set in the IP header + * @param tos the TOS value to be set in the IP header + * @param proto the PROTOCOL to be set in the IP header + * @param netif the netif on which to send this packet + * @return ERR_OK if the packet was sent OK + * ERR_BUF if p doesn't have enough space for IP/LINK headers + * returns errors returned by netif->output + * + * @note ip_id: RFC791 "some host may be able to simply use + * unique identifiers independent of destination" + */ +err_t +ip_output_if(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, + u8_t ttl, u8_t tos, + u8_t proto, struct netif *netif) +{ +#if IP_OPTIONS_SEND + return ip_output_if_opt(p, src, dest, ttl, tos, proto, netif, NULL, 0); +} + +/** + * Same as ip_output_if() but with the possibility to include IP options: + * + * @ param ip_options pointer to the IP options, copied into the IP header + * @ param optlen length of ip_options + */ +err_t ip_output_if_opt(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, + u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options, + u16_t optlen) +{ +#endif /* IP_OPTIONS_SEND */ + struct ip_hdr *iphdr; + static u16_t ip_id = 0; + + snmp_inc_ipoutrequests(); + + /* Should the IP header be generated or is it already included in p? */ + if (dest != IP_HDRINCL) { + u16_t ip_hlen = IP_HLEN; +#if IP_OPTIONS_SEND + u16_t optlen_aligned = 0; + if (optlen != 0) { + /* round up to a multiple of 4 */ + optlen_aligned = ((optlen + 3) & ~3); + ip_hlen += optlen_aligned; + /* First write in the IP options */ + if (pbuf_header(p, optlen_aligned)) { + LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip_output_if_opt: not enough room for IP options in pbuf\n")); + IP_STATS_INC(ip.err); + snmp_inc_ipoutdiscards(); + return ERR_BUF; + } + MEMCPY(p->payload, ip_options, optlen); + if (optlen < optlen_aligned) { + /* zero the remaining bytes */ + memset(((char*)p->payload) + optlen, 0, optlen_aligned - optlen); + } + } +#endif /* IP_OPTIONS_SEND */ + /* generate IP header */ + if (pbuf_header(p, IP_HLEN)) { + LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip_output: not enough room for IP header in pbuf\n")); + + IP_STATS_INC(ip.err); + snmp_inc_ipoutdiscards(); + return ERR_BUF; + } + + iphdr = p->payload; + LWIP_ASSERT("check that first pbuf can hold struct ip_hdr", + (p->len >= sizeof(struct ip_hdr))); + + IPH_TTL_SET(iphdr, ttl); + IPH_PROTO_SET(iphdr, proto); + + ip_addr_set(&(iphdr->dest), dest); + + IPH_VHLTOS_SET(iphdr, 4, ip_hlen / 4, tos); + IPH_LEN_SET(iphdr, htons(p->tot_len)); + IPH_OFFSET_SET(iphdr, 0); + IPH_ID_SET(iphdr, htons(ip_id)); + ++ip_id; + + if (ip_addr_isany(src)) { + ip_addr_set(&(iphdr->src), &(netif->ip_addr)); + } else { + ip_addr_set(&(iphdr->src), src); + } + + IPH_CHKSUM_SET(iphdr, 0); +#if CHECKSUM_GEN_IP + IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, ip_hlen)); +#endif + } else { + /* IP header already included in p */ + iphdr = p->payload; + dest = &(iphdr->dest); + } + + IP_STATS_INC(ip.xmit); + + LWIP_DEBUGF(IP_DEBUG, ("ip_output_if: %c%c%"U16_F"\n", netif->name[0], netif->name[1], netif->num)); + ip_debug_print(p); + +#if ENABLE_LOOPBACK + if (ip_addr_cmp(dest, &netif->ip_addr)) { + /* Packet to self, enqueue it for loopback */ + LWIP_DEBUGF(IP_DEBUG, ("netif_loop_output()")); + return netif_loop_output(netif, p, dest); + } +#endif /* ENABLE_LOOPBACK */ +#if IP_FRAG + /* don't fragment if interface has mtu set to 0 [loopif] */ + if (netif->mtu && (p->tot_len > netif->mtu)) { + return ip_frag(p,netif,dest); + } +#endif + + LWIP_DEBUGF(IP_DEBUG, ("netif->output()")); + return netif->output(netif, p, dest); +} + +/** + * Simple interface to ip_output_if. It finds the outgoing network + * interface and calls upon ip_output_if to do the actual work. + * + * @param p the packet to send (p->payload points to the data, e.g. next + protocol header; if dest == IP_HDRINCL, p already includes an IP + header and p->payload points to that IP header) + * @param src the source IP address to send from (if src == IP_ADDR_ANY, the + * IP address of the netif used to send is used as source address) + * @param dest the destination IP address to send the packet to + * @param ttl the TTL value to be set in the IP header + * @param tos the TOS value to be set in the IP header + * @param proto the PROTOCOL to be set in the IP header + * + * @return ERR_RTE if no route is found + * see ip_output_if() for more return values + */ +err_t +ip_output(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, + u8_t ttl, u8_t tos, u8_t proto) +{ + struct netif *netif; + + if ((netif = ip_route(dest)) == NULL) { + LWIP_DEBUGF(IP_DEBUG, ("ip_output: No route to 0x%"X32_F"\n", dest->addr)); + IP_STATS_INC(ip.rterr); + return ERR_RTE; + } + + return ip_output_if(p, src, dest, ttl, tos, proto, netif); +} + +#if LWIP_NETIF_HWADDRHINT +/** Like ip_output, but takes and addr_hint pointer that is passed on to netif->addr_hint + * before calling ip_output_if. + * + * @param p the packet to send (p->payload points to the data, e.g. next + protocol header; if dest == IP_HDRINCL, p already includes an IP + header and p->payload points to that IP header) + * @param src the source IP address to send from (if src == IP_ADDR_ANY, the + * IP address of the netif used to send is used as source address) + * @param dest the destination IP address to send the packet to + * @param ttl the TTL value to be set in the IP header + * @param tos the TOS value to be set in the IP header + * @param proto the PROTOCOL to be set in the IP header + * @param addr_hint address hint pointer set to netif->addr_hint before + * calling ip_output_if() + * + * @return ERR_RTE if no route is found + * see ip_output_if() for more return values + */ +err_t +ip_output_hinted(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, + u8_t ttl, u8_t tos, u8_t proto, u8_t *addr_hint) +{ + struct netif *netif; + err_t err; + + if ((netif = ip_route(dest)) == NULL) { + LWIP_DEBUGF(IP_DEBUG, ("ip_output: No route to 0x%"X32_F"\n", dest->addr)); + IP_STATS_INC(ip.rterr); + return ERR_RTE; + } + + netif->addr_hint = addr_hint; + err = ip_output_if(p, src, dest, ttl, tos, proto, netif); + netif->addr_hint = NULL; + + return err; +} +#endif /* LWIP_NETIF_HWADDRHINT*/ + +#if IP_DEBUG +/* Print an IP header by using LWIP_DEBUGF + * @param p an IP packet, p->payload pointing to the IP header + */ +void +ip_debug_print(struct pbuf *p) +{ + struct ip_hdr *iphdr = p->payload; + u8_t *payload; + + payload = (u8_t *)iphdr + IP_HLEN; + + LWIP_DEBUGF(IP_DEBUG, ("IP header:\n")); + LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); + LWIP_DEBUGF(IP_DEBUG, ("|%2"S16_F" |%2"S16_F" | 0x%02"X16_F" | %5"U16_F" | (v, hl, tos, len)\n", + IPH_V(iphdr), + IPH_HL(iphdr), + IPH_TOS(iphdr), + ntohs(IPH_LEN(iphdr)))); + LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); + LWIP_DEBUGF(IP_DEBUG, ("| %5"U16_F" |%"U16_F"%"U16_F"%"U16_F"| %4"U16_F" | (id, flags, offset)\n", + ntohs(IPH_ID(iphdr)), + ntohs(IPH_OFFSET(iphdr)) >> 15 & 1, + ntohs(IPH_OFFSET(iphdr)) >> 14 & 1, + ntohs(IPH_OFFSET(iphdr)) >> 13 & 1, + ntohs(IPH_OFFSET(iphdr)) & IP_OFFMASK)); + LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); + LWIP_DEBUGF(IP_DEBUG, ("| %3"U16_F" | %3"U16_F" | 0x%04"X16_F" | (ttl, proto, chksum)\n", + IPH_TTL(iphdr), + IPH_PROTO(iphdr), + ntohs(IPH_CHKSUM(iphdr)))); + LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); + LWIP_DEBUGF(IP_DEBUG, ("| %3"U16_F" | %3"U16_F" | %3"U16_F" | %3"U16_F" | (src)\n", + ip4_addr1(&iphdr->src), + ip4_addr2(&iphdr->src), + ip4_addr3(&iphdr->src), + ip4_addr4(&iphdr->src))); + LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); + LWIP_DEBUGF(IP_DEBUG, ("| %3"U16_F" | %3"U16_F" | %3"U16_F" | %3"U16_F" | (dest)\n", + ip4_addr1(&iphdr->dest), + ip4_addr2(&iphdr->dest), + ip4_addr3(&iphdr->dest), + ip4_addr4(&iphdr->dest))); + LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); +} +#endif /* IP_DEBUG */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/ip_addr.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/ip_addr.c new file mode 100644 index 0000000..33e0aad --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/ip_addr.c @@ -0,0 +1,86 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/** + * @file + * This is the IPv4 address tools implementation. + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "lwip/opt.h" +#include "lwip/ip_addr.h" +#include "lwip/inet.h" +#include "lwip/netif.h" + +#define IP_ADDR_ANY_VALUE 0x00000000UL +#define IP_ADDR_BROADCAST_VALUE 0xffffffffUL + +/* used by IP_ADDR_ANY and IP_ADDR_BROADCAST in ip_addr.h */ +const struct ip_addr ip_addr_any = { IP_ADDR_ANY_VALUE }; +const struct ip_addr ip_addr_broadcast = { IP_ADDR_BROADCAST_VALUE }; + +/** + * Determine if an address is a broadcast address on a network interface + * + * @param addr address to be checked + * @param netif the network interface against which the address is checked + * @return returns non-zero if the address is a broadcast address + */ +u8_t ip_addr_isbroadcast(struct ip_addr *addr, struct netif *netif) +{ + u32_t addr2test; + + addr2test = addr->addr; + /* all ones (broadcast) or all zeroes (old skool broadcast) */ + if ((~addr2test == IP_ADDR_ANY_VALUE) || + (addr2test == IP_ADDR_ANY_VALUE)) + return 1; + /* no broadcast support on this network interface? */ + else if ((netif->flags & NETIF_FLAG_BROADCAST) == 0) + /* the given address cannot be a broadcast address + * nor can we check against any broadcast addresses */ + return 0; + /* address matches network interface address exactly? => no broadcast */ + else if (addr2test == netif->ip_addr.addr) + return 0; + /* on the same (sub) network... */ + else if (ip_addr_netcmp(addr, &(netif->ip_addr), &(netif->netmask)) + /* ...and host identifier bits are all ones? =>... */ + && ((addr2test & ~netif->netmask.addr) == + (IP_ADDR_BROADCAST_VALUE & ~netif->netmask.addr))) + /* => network broadcast address */ + return 1; + else + return 0; +} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/ip_frag.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/ip_frag.c new file mode 100644 index 0000000..ab35572 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/ipv4/ip_frag.c @@ -0,0 +1,794 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/** + * @file + * This is the IPv4 packet segmentation and reassembly implementation. + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Jani Monoses + * Simon Goldschmidt + * original reassembly code by Adam Dunkels + * + */ + +#include "lwip/opt.h" +#include "lwip/ip_frag.h" +#include "lwip/ip.h" +#include "lwip/inet.h" +#include "lwip/inet_chksum.h" +#include "lwip/netif.h" +#include "lwip/snmp.h" +#include "lwip/stats.h" +#include "lwip/icmp.h" + +#include + +#if IP_REASSEMBLY +/** + * The IP reassembly code currently has the following limitations: + * - IP header options are not supported + * - fragments must not overlap (e.g. due to different routes), + * currently, overlapping or duplicate fragments are thrown away + * if IP_REASS_CHECK_OVERLAP=1 (the default)! + * + * @todo: work with IP header options + */ + +/** Setting this to 0, you can turn off checking the fragments for overlapping + * regions. The code gets a little smaller. Only use this if you know that + * overlapping won't occur on your network! */ +#ifndef IP_REASS_CHECK_OVERLAP +#define IP_REASS_CHECK_OVERLAP 1 +#endif /* IP_REASS_CHECK_OVERLAP */ + +/** Set to 0 to prevent freeing the oldest datagram when the reassembly buffer is + * full (IP_REASS_MAX_PBUFS pbufs are enqueued). The code gets a little smaller. + * Datagrams will be freed by timeout only. Especially useful when MEMP_NUM_REASSDATA + * is set to 1, so one datagram can be reassembled at a time, only. */ +#ifndef IP_REASS_FREE_OLDEST +#define IP_REASS_FREE_OLDEST 1 +#endif /* IP_REASS_FREE_OLDEST */ + +#define IP_REASS_FLAG_LASTFRAG 0x01 + +/** This is a helper struct which holds the starting + * offset and the ending offset of this fragment to + * easily chain the fragments. + * It has to be packed since it has to fit inside the IP header. + */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct ip_reass_helper { + PACK_STRUCT_FIELD(struct pbuf *next_pbuf); + PACK_STRUCT_FIELD(u16_t start); + PACK_STRUCT_FIELD(u16_t end); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +#define IP_ADDRESSES_AND_ID_MATCH(iphdrA, iphdrB) \ + (ip_addr_cmp(&(iphdrA)->src, &(iphdrB)->src) && \ + ip_addr_cmp(&(iphdrA)->dest, &(iphdrB)->dest) && \ + IPH_ID(iphdrA) == IPH_ID(iphdrB)) ? 1 : 0 + +/* global variables */ +static struct ip_reassdata *reassdatagrams; +static u16_t ip_reass_pbufcount; + +/* function prototypes */ +static void ip_reass_dequeue_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev); +static int ip_reass_free_complete_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev); + +/** + * Reassembly timer base function + * for both NO_SYS == 0 and 1 (!). + * + * Should be called every 1000 msec (defined by IP_TMR_INTERVAL). + */ +void +ip_reass_tmr(void) +{ + struct ip_reassdata *r, *prev = NULL; + + r = reassdatagrams; + while (r != NULL) { + /* Decrement the timer. Once it reaches 0, + * clean up the incomplete fragment assembly */ + if (r->timer > 0) { + r->timer--; + LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass_tmr: timer dec %"U16_F"\n",(u16_t)r->timer)); + prev = r; + r = r->next; + } else { + /* reassembly timed out */ + struct ip_reassdata *tmp; + LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass_tmr: timer timed out\n")); + tmp = r; + /* get the next pointer before freeing */ + r = r->next; + /* free the helper struct and all enqueued pbufs */ + ip_reass_free_complete_datagram(tmp, prev); + } + } +} + +/** + * Free a datagram (struct ip_reassdata) and all its pbufs. + * Updates the total count of enqueued pbufs (ip_reass_pbufcount), + * SNMP counters and sends an ICMP time exceeded packet. + * + * @param ipr datagram to free + * @param prev the previous datagram in the linked list + * @return the number of pbufs freed + */ +static int +ip_reass_free_complete_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev) +{ + int pbufs_freed = 0; + struct pbuf *p; + struct ip_reass_helper *iprh; + + LWIP_ASSERT("prev != ipr", prev != ipr); + if (prev != NULL) { + LWIP_ASSERT("prev->next == ipr", prev->next == ipr); + } + + snmp_inc_ipreasmfails(); +#if LWIP_ICMP + iprh = (struct ip_reass_helper *)ipr->p->payload; + if (iprh->start == 0) { + /* The first fragment was received, send ICMP time exceeded. */ + /* First, de-queue the first pbuf from r->p. */ + p = ipr->p; + ipr->p = iprh->next_pbuf; + /* Then, copy the original header into it. */ + SMEMCPY(p->payload, &ipr->iphdr, IP_HLEN); + icmp_time_exceeded(p, ICMP_TE_FRAG); + pbufs_freed += pbuf_clen(p); + pbuf_free(p); + } +#endif /* LWIP_ICMP */ + + /* First, free all received pbufs. The individual pbufs need to be released + separately as they have not yet been chained */ + p = ipr->p; + while (p != NULL) { + struct pbuf *pcur; + iprh = (struct ip_reass_helper *)p->payload; + pcur = p; + /* get the next pointer before freeing */ + p = iprh->next_pbuf; + pbufs_freed += pbuf_clen(pcur); + pbuf_free(pcur); + } + /* Then, unchain the struct ip_reassdata from the list and free it. */ + ip_reass_dequeue_datagram(ipr, prev); + LWIP_ASSERT("ip_reass_pbufcount >= clen", ip_reass_pbufcount >= pbufs_freed); + ip_reass_pbufcount -= pbufs_freed; + + return pbufs_freed; +} + +#if IP_REASS_FREE_OLDEST +/** + * Free the oldest datagram to make room for enqueueing new fragments. + * The datagram 'fraghdr' belongs to is not freed! + * + * @param fraghdr IP header of the current fragment + * @param pbufs_needed number of pbufs needed to enqueue + * (used for freeing other datagrams if not enough space) + * @return the number of pbufs freed + */ +static int +ip_reass_remove_oldest_datagram(struct ip_hdr *fraghdr, int pbufs_needed) +{ + /* @todo Can't we simply remove the last datagram in the + * linked list behind reassdatagrams? + */ + struct ip_reassdata *r, *oldest, *prev; + int pbufs_freed = 0, pbufs_freed_current; + int other_datagrams; + + /* Free datagrams until being allowed to enqueue 'pbufs_needed' pbufs, + * but don't free the datagram that 'fraghdr' belongs to! */ + do { + oldest = NULL; + prev = NULL; + other_datagrams = 0; + r = reassdatagrams; + while (r != NULL) { + if (!IP_ADDRESSES_AND_ID_MATCH(&r->iphdr, fraghdr)) { + /* Not the same datagram as fraghdr */ + other_datagrams++; + if (oldest == NULL) { + oldest = r; + } else if (r->timer <= oldest->timer) { + /* older than the previous oldest */ + oldest = r; + } + } + if (r->next != NULL) { + prev = r; + } + r = r->next; + } + if (oldest != NULL) { + pbufs_freed_current = ip_reass_free_complete_datagram(oldest, prev); + pbufs_freed += pbufs_freed_current; + } + } while ((pbufs_freed < pbufs_needed) && (other_datagrams > 1)); + return pbufs_freed; +} +#endif /* IP_REASS_FREE_OLDEST */ + +/** + * Enqueues a new fragment into the fragment queue + * @param fraghdr points to the new fragments IP hdr + * @param clen number of pbufs needed to enqueue (used for freeing other datagrams if not enough space) + * @return A pointer to the queue location into which the fragment was enqueued + */ +static struct ip_reassdata* +ip_reass_enqueue_new_datagram(struct ip_hdr *fraghdr, int clen) +{ + struct ip_reassdata* ipr; + /* No matching previous fragment found, allocate a new reassdata struct */ + ipr = memp_malloc(MEMP_REASSDATA); + if (ipr == NULL) { +#if IP_REASS_FREE_OLDEST + if (ip_reass_remove_oldest_datagram(fraghdr, clen) >= clen) { + ipr = memp_malloc(MEMP_REASSDATA); + } + if (ipr == NULL) +#endif /* IP_REASS_FREE_OLDEST */ + { + IPFRAG_STATS_INC(ip_frag.memerr); + LWIP_DEBUGF(IP_REASS_DEBUG,("Failed to alloc reassdata struct\n")); + return NULL; + } + } + memset(ipr, 0, sizeof(struct ip_reassdata)); + ipr->timer = IP_REASS_MAXAGE; + + /* enqueue the new structure to the front of the list */ + ipr->next = reassdatagrams; + reassdatagrams = ipr; + /* copy the ip header for later tests and input */ + /* @todo: no ip options supported? */ + SMEMCPY(&(ipr->iphdr), fraghdr, IP_HLEN); + return ipr; +} + +/** + * Dequeues a datagram from the datagram queue. Doesn't deallocate the pbufs. + * @param ipr points to the queue entry to dequeue + */ +static void +ip_reass_dequeue_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev) +{ + + /* dequeue the reass struct */ + if (reassdatagrams == ipr) { + /* it was the first in the list */ + reassdatagrams = ipr->next; + } else { + /* it wasn't the first, so it must have a valid 'prev' */ + LWIP_ASSERT("sanity check linked list", prev != NULL); + prev->next = ipr->next; + } + + /* now we can free the ip_reass struct */ + memp_free(MEMP_REASSDATA, ipr); +} + +/** + * Chain a new pbuf into the pbuf list that composes the datagram. The pbuf list + * will grow over time as new pbufs are rx. + * Also checks that the datagram passes basic continuity checks (if the last + * fragment was received at least once). + * @param root_p points to the 'root' pbuf for the current datagram being assembled. + * @param new_p points to the pbuf for the current fragment + * @return 0 if invalid, >0 otherwise + */ +static int +ip_reass_chain_frag_into_datagram_and_validate(struct ip_reassdata *ipr, struct pbuf *new_p) +{ + struct ip_reass_helper *iprh, *iprh_tmp, *iprh_prev=NULL; + struct pbuf *q; + u16_t offset,len; + struct ip_hdr *fraghdr; + int valid = 1; + + /* Extract length and fragment offset from current fragment */ + fraghdr = (struct ip_hdr*)new_p->payload; + len = ntohs(IPH_LEN(fraghdr)) - IPH_HL(fraghdr) * 4; + offset = (ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) * 8; + + /* overwrite the fragment's ip header from the pbuf with our helper struct, + * and setup the embedded helper structure. */ + /* make sure the struct ip_reass_helper fits into the IP header */ + LWIP_ASSERT("sizeof(struct ip_reass_helper) <= IP_HLEN", + sizeof(struct ip_reass_helper) <= IP_HLEN); + iprh = (struct ip_reass_helper*)new_p->payload; + iprh->next_pbuf = NULL; + iprh->start = offset; + iprh->end = offset + len; + + /* Iterate through until we either get to the end of the list (append), + * or we find on with a larger offset (insert). */ + for (q = ipr->p; q != NULL;) { + iprh_tmp = (struct ip_reass_helper*)q->payload; + if (iprh->start < iprh_tmp->start) { + /* the new pbuf should be inserted before this */ + iprh->next_pbuf = q; + if (iprh_prev != NULL) { + /* not the fragment with the lowest offset */ +#if IP_REASS_CHECK_OVERLAP + if ((iprh->start < iprh_prev->end) || (iprh->end > iprh_tmp->start)) { + /* fragment overlaps with previous or following, throw away */ + goto freepbuf; + } +#endif /* IP_REASS_CHECK_OVERLAP */ + iprh_prev->next_pbuf = new_p; + } else { + /* fragment with the lowest offset */ + ipr->p = new_p; + } + break; + } else if(iprh->start == iprh_tmp->start) { + /* received the same datagram twice: no need to keep the datagram */ + goto freepbuf; +#if IP_REASS_CHECK_OVERLAP + } else if(iprh->start < iprh_tmp->end) { + /* overlap: no need to keep the new datagram */ + goto freepbuf; +#endif /* IP_REASS_CHECK_OVERLAP */ + } else { + /* Check if the fragments received so far have no wholes. */ + if (iprh_prev != NULL) { + if (iprh_prev->end != iprh_tmp->start) { + /* There is a fragment missing between the current + * and the previous fragment */ + valid = 0; + } + } + } + q = iprh_tmp->next_pbuf; + iprh_prev = iprh_tmp; + } + + /* If q is NULL, then we made it to the end of the list. Determine what to do now */ + if (q == NULL) { + if (iprh_prev != NULL) { + /* this is (for now), the fragment with the highest offset: + * chain it to the last fragment */ +#if IP_REASS_CHECK_OVERLAP + LWIP_ASSERT("check fragments don't overlap", iprh_prev->end <= iprh->start); +#endif /* IP_REASS_CHECK_OVERLAP */ + iprh_prev->next_pbuf = new_p; + if (iprh_prev->end != iprh->start) { + valid = 0; + } + } else { +#if IP_REASS_CHECK_OVERLAP + LWIP_ASSERT("no previous fragment, this must be the first fragment!", + ipr->p == NULL); +#endif /* IP_REASS_CHECK_OVERLAP */ + /* this is the first fragment we ever received for this ip datagram */ + ipr->p = new_p; + } + } + + /* At this point, the validation part begins: */ + /* If we already received the last fragment */ + if ((ipr->flags & IP_REASS_FLAG_LASTFRAG) != 0) { + /* and had no wholes so far */ + if (valid) { + /* then check if the rest of the fragments is here */ + /* Check if the queue starts with the first datagram */ + if (((struct ip_reass_helper*)ipr->p->payload)->start != 0) { + valid = 0; + } else { + /* and check that there are no wholes after this datagram */ + iprh_prev = iprh; + q = iprh->next_pbuf; + while (q != NULL) { + iprh = (struct ip_reass_helper*)q->payload; + if (iprh_prev->end != iprh->start) { + valid = 0; + break; + } + iprh_prev = iprh; + q = iprh->next_pbuf; + } + /* if still valid, all fragments are received + * (because to the MF==0 already arrived */ + if (valid) { + LWIP_ASSERT("sanity check", ipr->p != NULL); + LWIP_ASSERT("sanity check", + ((struct ip_reass_helper*)ipr->p->payload) != iprh); + LWIP_ASSERT("validate_datagram:next_pbuf!=NULL", + iprh->next_pbuf == NULL); + LWIP_ASSERT("validate_datagram:datagram end!=datagram len", + iprh->end == ipr->datagram_len); + } + } + } + /* If valid is 0 here, there are some fragments missing in the middle + * (since MF == 0 has already arrived). Such datagrams simply time out if + * no more fragments are received... */ + return valid; + } + /* If we come here, not all fragments were received, yet! */ + return 0; /* not yet valid! */ +#if IP_REASS_CHECK_OVERLAP +freepbuf: + ip_reass_pbufcount -= pbuf_clen(new_p); + pbuf_free(new_p); + return 0; +#endif /* IP_REASS_CHECK_OVERLAP */ +} + +/** + * Reassembles incoming IP fragments into an IP datagram. + * + * @param p points to a pbuf chain of the fragment + * @return NULL if reassembly is incomplete, ? otherwise + */ +struct pbuf * +ip_reass(struct pbuf *p) +{ + struct pbuf *r; + struct ip_hdr *fraghdr; + struct ip_reassdata *ipr; + struct ip_reass_helper *iprh; + u16_t offset, len; + u8_t clen; + struct ip_reassdata *ipr_prev = NULL; + + IPFRAG_STATS_INC(ip_frag.recv); + snmp_inc_ipreasmreqds(); + + fraghdr = (struct ip_hdr*)p->payload; + + if ((IPH_HL(fraghdr) * 4) != IP_HLEN) { + LWIP_DEBUGF(IP_REASS_DEBUG,("ip_reass: IP options currently not supported!\n")); + IPFRAG_STATS_INC(ip_frag.err); + goto nullreturn; + } + + offset = (ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) * 8; + len = ntohs(IPH_LEN(fraghdr)) - IPH_HL(fraghdr) * 4; + + /* Check if we are allowed to enqueue more datagrams. */ + clen = pbuf_clen(p); + if ((ip_reass_pbufcount + clen) > IP_REASS_MAX_PBUFS) { +#if IP_REASS_FREE_OLDEST + if (!ip_reass_remove_oldest_datagram(fraghdr, clen) || + ((ip_reass_pbufcount + clen) > IP_REASS_MAX_PBUFS)) +#endif /* IP_REASS_FREE_OLDEST */ + { + /* No datagram could be freed and still too many pbufs enqueued */ + LWIP_DEBUGF(IP_REASS_DEBUG,("ip_reass: Overflow condition: pbufct=%d, clen=%d, MAX=%d\n", + ip_reass_pbufcount, clen, IP_REASS_MAX_PBUFS)); + IPFRAG_STATS_INC(ip_frag.memerr); + /* @todo: send ICMP time exceeded here? */ + /* drop this pbuf */ + goto nullreturn; + } + } + + /* Look for the datagram the fragment belongs to in the current datagram queue, + * remembering the previous in the queue for later dequeueing. */ + for (ipr = reassdatagrams; ipr != NULL; ipr = ipr->next) { + /* Check if the incoming fragment matches the one currently present + in the reassembly buffer. If so, we proceed with copying the + fragment into the buffer. */ + if (IP_ADDRESSES_AND_ID_MATCH(&ipr->iphdr, fraghdr)) { + LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass: matching previous fragment ID=%"X16_F"\n", + ntohs(IPH_ID(fraghdr)))); + IPFRAG_STATS_INC(ip_frag.cachehit); + break; + } + ipr_prev = ipr; + } + + if (ipr == NULL) { + /* Enqueue a new datagram into the datagram queue */ + ipr = ip_reass_enqueue_new_datagram(fraghdr, clen); + /* Bail if unable to enqueue */ + if(ipr == NULL) { + goto nullreturn; + } + } else { + if (((ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) == 0) && + ((ntohs(IPH_OFFSET(&ipr->iphdr)) & IP_OFFMASK) != 0)) { + /* ipr->iphdr is not the header from the first fragment, but fraghdr is + * -> copy fraghdr into ipr->iphdr since we want to have the header + * of the first fragment (for ICMP time exceeded and later, for copying + * all options, if supported)*/ + SMEMCPY(&ipr->iphdr, fraghdr, IP_HLEN); + } + } + /* Track the current number of pbufs current 'in-flight', in order to limit + the number of fragments that may be enqueued at any one time */ + ip_reass_pbufcount += clen; + + /* At this point, we have either created a new entry or pointing + * to an existing one */ + + /* check for 'no more fragments', and update queue entry*/ + if ((ntohs(IPH_OFFSET(fraghdr)) & IP_MF) == 0) { + ipr->flags |= IP_REASS_FLAG_LASTFRAG; + ipr->datagram_len = offset + len; + LWIP_DEBUGF(IP_REASS_DEBUG, + ("ip_reass: last fragment seen, total len %"S16_F"\n", + ipr->datagram_len)); + } + /* find the right place to insert this pbuf */ + /* @todo: trim pbufs if fragments are overlapping */ + if (ip_reass_chain_frag_into_datagram_and_validate(ipr, p)) { + /* the totally last fragment (flag more fragments = 0) was received at least + * once AND all fragments are received */ + ipr->datagram_len += IP_HLEN; + + /* save the second pbuf before copying the header over the pointer */ + r = ((struct ip_reass_helper*)ipr->p->payload)->next_pbuf; + + /* copy the original ip header back to the first pbuf */ + fraghdr = (struct ip_hdr*)(ipr->p->payload); + SMEMCPY(fraghdr, &ipr->iphdr, IP_HLEN); + IPH_LEN_SET(fraghdr, htons(ipr->datagram_len)); + IPH_OFFSET_SET(fraghdr, 0); + IPH_CHKSUM_SET(fraghdr, 0); + /* @todo: do we need to set calculate the correct checksum? */ + IPH_CHKSUM_SET(fraghdr, inet_chksum(fraghdr, IP_HLEN)); + + p = ipr->p; + + /* chain together the pbufs contained within the reass_data list. */ + while(r != NULL) { + iprh = (struct ip_reass_helper*)r->payload; + + /* hide the ip header for every succeding fragment */ + pbuf_header(r, -IP_HLEN); + pbuf_cat(p, r); + r = iprh->next_pbuf; + } + /* release the sources allocate for the fragment queue entry */ + ip_reass_dequeue_datagram(ipr, ipr_prev); + + /* and adjust the number of pbufs currently queued for reassembly. */ + ip_reass_pbufcount -= pbuf_clen(p); + + /* Return the pbuf chain */ + return p; + } + /* the datagram is not (yet?) reassembled completely */ + LWIP_DEBUGF(IP_REASS_DEBUG,("ip_reass_pbufcount: %d out\n", ip_reass_pbufcount)); + return NULL; + +nullreturn: + LWIP_DEBUGF(IP_REASS_DEBUG,("ip_reass: nullreturn\n")); + IPFRAG_STATS_INC(ip_frag.drop); + pbuf_free(p); + return NULL; +} +#endif /* IP_REASSEMBLY */ + +#if IP_FRAG +#if IP_FRAG_USES_STATIC_BUF +static u8_t buf[LWIP_MEM_ALIGN_SIZE(IP_FRAG_MAX_MTU + MEM_ALIGNMENT - 1)]; +#endif /* IP_FRAG_USES_STATIC_BUF */ + +/** + * Fragment an IP datagram if too large for the netif. + * + * Chop the datagram in MTU sized chunks and send them in order + * by using a fixed size static memory buffer (PBUF_REF) or + * point PBUF_REFs into p (depending on IP_FRAG_USES_STATIC_BUF). + * + * @param p ip packet to send + * @param netif the netif on which to send + * @param dest destination ip address to which to send + * + * @return ERR_OK if sent successfully, err_t otherwise + */ +err_t +ip_frag(struct pbuf *p, struct netif *netif, struct ip_addr *dest) +{ + struct pbuf *rambuf; +#if IP_FRAG_USES_STATIC_BUF + struct pbuf *header; +#else + struct pbuf *newpbuf; + struct ip_hdr *original_iphdr; +#endif + struct ip_hdr *iphdr; + u16_t nfb; + u16_t left, cop; + u16_t mtu = netif->mtu; + u16_t ofo, omf; + u16_t last; + u16_t poff = IP_HLEN; + u16_t tmp; +#if !IP_FRAG_USES_STATIC_BUF + u16_t newpbuflen = 0; + u16_t left_to_copy; +#endif + + /* Get a RAM based MTU sized pbuf */ +#if IP_FRAG_USES_STATIC_BUF + /* When using a static buffer, we use a PBUF_REF, which we will + * use to reference the packet (without link header). + * Layer and length is irrelevant. + */ + rambuf = pbuf_alloc(PBUF_LINK, 0, PBUF_REF); + if (rambuf == NULL) { + LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_frag: pbuf_alloc(PBUF_LINK, 0, PBUF_REF) failed\n")); + return ERR_MEM; + } + rambuf->tot_len = rambuf->len = mtu; + rambuf->payload = LWIP_MEM_ALIGN((void *)buf); + + /* Copy the IP header in it */ + iphdr = rambuf->payload; + SMEMCPY(iphdr, p->payload, IP_HLEN); +#else /* IP_FRAG_USES_STATIC_BUF */ + original_iphdr = p->payload; + iphdr = original_iphdr; +#endif /* IP_FRAG_USES_STATIC_BUF */ + + /* Save original offset */ + tmp = ntohs(IPH_OFFSET(iphdr)); + ofo = tmp & IP_OFFMASK; + omf = tmp & IP_MF; + + left = p->tot_len - IP_HLEN; + + nfb = (mtu - IP_HLEN) / 8; + + while (left) { + last = (left <= mtu - IP_HLEN); + + /* Set new offset and MF flag */ + tmp = omf | (IP_OFFMASK & (ofo)); + if (!last) + tmp = tmp | IP_MF; + + /* Fill this fragment */ + cop = last ? left : nfb * 8; + +#if IP_FRAG_USES_STATIC_BUF + poff += pbuf_copy_partial(p, (u8_t*)iphdr + IP_HLEN, cop, poff); +#else /* IP_FRAG_USES_STATIC_BUF */ + /* When not using a static buffer, create a chain of pbufs. + * The first will be a PBUF_RAM holding the link and IP header. + * The rest will be PBUF_REFs mirroring the pbuf chain to be fragged, + * but limited to the size of an mtu. + */ + rambuf = pbuf_alloc(PBUF_LINK, IP_HLEN, PBUF_RAM); + if (rambuf == NULL) { + return ERR_MEM; + } + LWIP_ASSERT("this needs a pbuf in one piece!", + (p->len >= (IP_HLEN))); + SMEMCPY(rambuf->payload, original_iphdr, IP_HLEN); + iphdr = rambuf->payload; + + /* Can just adjust p directly for needed offset. */ + p->payload = (u8_t *)p->payload + poff; + p->len -= poff; + + left_to_copy = cop; + while (left_to_copy) { + newpbuflen = (left_to_copy < p->len) ? left_to_copy : p->len; + /* Is this pbuf already empty? */ + if (!newpbuflen) { + p = p->next; + continue; + } + newpbuf = pbuf_alloc(PBUF_RAW, 0, PBUF_REF); + if (newpbuf == NULL) { + pbuf_free(rambuf); + return ERR_MEM; + } + /* Mirror this pbuf, although we might not need all of it. */ + newpbuf->payload = p->payload; + newpbuf->len = newpbuf->tot_len = newpbuflen; + /* Add it to end of rambuf's chain, but using pbuf_cat, not pbuf_chain + * so that it is removed when pbuf_dechain is later called on rambuf. + */ + pbuf_cat(rambuf, newpbuf); + left_to_copy -= newpbuflen; + if (left_to_copy) + p = p->next; + } + poff = newpbuflen; +#endif /* IP_FRAG_USES_STATIC_BUF */ + + /* Correct header */ + IPH_OFFSET_SET(iphdr, htons(tmp)); + IPH_LEN_SET(iphdr, htons(cop + IP_HLEN)); + IPH_CHKSUM_SET(iphdr, 0); + IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, IP_HLEN)); + +#if IP_FRAG_USES_STATIC_BUF + if (last) + pbuf_realloc(rambuf, left + IP_HLEN); + + /* This part is ugly: we alloc a RAM based pbuf for + * the link level header for each chunk and then + * free it.A PBUF_ROM style pbuf for which pbuf_header + * worked would make things simpler. + */ + header = pbuf_alloc(PBUF_LINK, 0, PBUF_RAM); + if (header != NULL) { + pbuf_chain(header, rambuf); + netif->output(netif, header, dest); + IPFRAG_STATS_INC(ip_frag.xmit); + snmp_inc_ipfragcreates(); + pbuf_free(header); + } else { + LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_frag: pbuf_alloc() for header failed\n")); + pbuf_free(rambuf); + return ERR_MEM; + } +#else /* IP_FRAG_USES_STATIC_BUF */ + /* No need for separate header pbuf - we allowed room for it in rambuf + * when allocated. + */ + netif->output(netif, rambuf, dest); + IPFRAG_STATS_INC(ip_frag.xmit); + + /* Unfortunately we can't reuse rambuf - the hardware may still be + * using the buffer. Instead we free it (and the ensuing chain) and + * recreate it next time round the loop. If we're lucky the hardware + * will have already sent the packet, the free will really free, and + * there will be zero memory penalty. + */ + + pbuf_free(rambuf); +#endif /* IP_FRAG_USES_STATIC_BUF */ + left -= cop; + ofo += nfb; + } +#if IP_FRAG_USES_STATIC_BUF + pbuf_free(rambuf); +#endif /* IP_FRAG_USES_STATIC_BUF */ + snmp_inc_ipfragoks(); + return ERR_OK; +} +#endif /* IP_FRAG */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/mem.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/mem.c new file mode 100644 index 0000000..ea3f4a6 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/mem.c @@ -0,0 +1,635 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/** + * @file + * Dynamic memory manager + * + * This is a lightweight replacement for the standard C library malloc(). + * + * If you want to use the standard C library malloc() instead, define + * MEM_LIBC_MALLOC to 1 in your lwipopts.h + * + * To let mem_malloc() use pools (prevents fragmentation and is much faster than + * a heap but might waste some memory), define MEM_USE_POOLS to 1, define + * MEM_USE_CUSTOM_POOLS to 1 and create a file "lwippools.h" that includes a list + * of pools like this (more pools can be added between _START and _END): + * + * Define three pools with sizes 256, 512, and 1512 bytes + * LWIP_MALLOC_MEMPOOL_START + * LWIP_MALLOC_MEMPOOL(20, 256) + * LWIP_MALLOC_MEMPOOL(10, 512) + * LWIP_MALLOC_MEMPOOL(5, 1512) + * LWIP_MALLOC_MEMPOOL_END + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * Simon Goldschmidt + * + */ + +#include "lwip/opt.h" + +#if !MEM_LIBC_MALLOC /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/def.h" +#include "lwip/mem.h" +#include "lwip/sys.h" +#include "lwip/stats.h" + +#include + +#if MEM_USE_POOLS +/* lwIP head implemented with different sized pools */ + +/** + * Allocate memory: determine the smallest pool that is big enough + * to contain an element of 'size' and get an element from that pool. + * + * @param size the size in bytes of the memory needed + * @return a pointer to the allocated memory or NULL if the pool is empty + */ +void * +mem_malloc(mem_size_t size) +{ + struct memp_malloc_helper *element; + memp_t poolnr; + mem_size_t required_size = size + sizeof(struct memp_malloc_helper); + + for (poolnr = MEMP_POOL_FIRST; poolnr <= MEMP_POOL_LAST; poolnr++) { +#if MEM_USE_POOLS_TRY_BIGGER_POOL +again: +#endif /* MEM_USE_POOLS_TRY_BIGGER_POOL */ + /* is this pool big enough to hold an element of the required size + plus a struct memp_malloc_helper that saves the pool this element came from? */ + if (required_size <= memp_sizes[poolnr]) { + break; + } + } + if (poolnr > MEMP_POOL_LAST) { + LWIP_ASSERT("mem_malloc(): no pool is that big!", 0); + return NULL; + } + element = (struct memp_malloc_helper*)memp_malloc(poolnr); + if (element == NULL) { + /* No need to DEBUGF or ASSERT: This error is already + taken care of in memp.c */ +#if MEM_USE_POOLS_TRY_BIGGER_POOL + /** Try a bigger pool if this one is empty! */ + if (poolnr < MEMP_POOL_LAST) { + poolnr++; + goto again; + } +#endif /* MEM_USE_POOLS_TRY_BIGGER_POOL */ + return NULL; + } + + /* save the pool number this element came from */ + element->poolnr = poolnr; + /* and return a pointer to the memory directly after the struct memp_malloc_helper */ + element++; + + return element; +} + +/** + * Free memory previously allocated by mem_malloc. Loads the pool number + * and calls memp_free with that pool number to put the element back into + * its pool + * + * @param rmem the memory element to free + */ +void +mem_free(void *rmem) +{ + struct memp_malloc_helper *hmem = (struct memp_malloc_helper*)rmem; + + LWIP_ASSERT("rmem != NULL", (rmem != NULL)); + LWIP_ASSERT("rmem == MEM_ALIGN(rmem)", (rmem == LWIP_MEM_ALIGN(rmem))); + + /* get the original struct memp_malloc_helper */ + hmem--; + + LWIP_ASSERT("hmem != NULL", (hmem != NULL)); + LWIP_ASSERT("hmem == MEM_ALIGN(hmem)", (hmem == LWIP_MEM_ALIGN(hmem))); + LWIP_ASSERT("hmem->poolnr < MEMP_MAX", (hmem->poolnr < MEMP_MAX)); + + /* and put it in the pool we saved earlier */ + memp_free(hmem->poolnr, hmem); +} + +#else /* MEM_USE_POOLS */ +/* lwIP replacement for your libc malloc() */ + +/** + * The heap is made up as a list of structs of this type. + * This does not have to be aligned since for getting its size, + * we only use the macro SIZEOF_STRUCT_MEM, which automatically alignes. + */ +struct mem { + /** index (-> ram[next]) of the next struct */ + mem_size_t next; + /** index (-> ram[next]) of the next struct */ + mem_size_t prev; + /** 1: this area is used; 0: this area is unused */ + u8_t used; +}; + +/** All allocated blocks will be MIN_SIZE bytes big, at least! + * MIN_SIZE can be overridden to suit your needs. Smaller values save space, + * larger values could prevent too small blocks to fragment the RAM too much. */ +#ifndef MIN_SIZE +#define MIN_SIZE 12 +#endif /* MIN_SIZE */ +/* some alignment macros: we define them here for better source code layout */ +#define MIN_SIZE_ALIGNED LWIP_MEM_ALIGN_SIZE(MIN_SIZE) +#define SIZEOF_STRUCT_MEM LWIP_MEM_ALIGN_SIZE(sizeof(struct mem)) +#define MEM_SIZE_ALIGNED LWIP_MEM_ALIGN_SIZE(MEM_SIZE) + +/** the heap. we need one struct mem at the end and some room for alignment */ +static u8_t ram_heap[MEM_SIZE_ALIGNED + (2*SIZEOF_STRUCT_MEM) + MEM_ALIGNMENT]; +/** pointer to the heap (ram_heap): for alignment, ram is now a pointer instead of an array */ +static u8_t *ram; +/** the last entry, always unused! */ +static struct mem *ram_end; +/** pointer to the lowest free block, this is used for faster search */ +static struct mem *lfree; + +/** concurrent access protection */ +static sys_sem_t mem_sem; + +#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT + +static volatile u8_t mem_free_count; + +/* Allow mem_free from other (e.g. interrupt) context */ +#define LWIP_MEM_FREE_DECL_PROTECT() SYS_ARCH_DECL_PROTECT(lev_free) +#define LWIP_MEM_FREE_PROTECT() SYS_ARCH_PROTECT(lev_free) +#define LWIP_MEM_FREE_UNPROTECT() SYS_ARCH_UNPROTECT(lev_free) +#define LWIP_MEM_ALLOC_DECL_PROTECT() SYS_ARCH_DECL_PROTECT(lev_alloc) +#define LWIP_MEM_ALLOC_PROTECT() SYS_ARCH_PROTECT(lev_alloc) +#define LWIP_MEM_ALLOC_UNPROTECT() SYS_ARCH_UNPROTECT(lev_alloc) + +#else /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ + +/* Protect the heap only by using a semaphore */ +#define LWIP_MEM_FREE_DECL_PROTECT() +#define LWIP_MEM_FREE_PROTECT() sys_arch_sem_wait(mem_sem, 0) +#define LWIP_MEM_FREE_UNPROTECT() sys_sem_signal(mem_sem) +/* mem_malloc is protected using semaphore AND LWIP_MEM_ALLOC_PROTECT */ +#define LWIP_MEM_ALLOC_DECL_PROTECT() +#define LWIP_MEM_ALLOC_PROTECT() +#define LWIP_MEM_ALLOC_UNPROTECT() + +#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ + + +/** + * "Plug holes" by combining adjacent empty struct mems. + * After this function is through, there should not exist + * one empty struct mem pointing to another empty struct mem. + * + * @param mem this points to a struct mem which just has been freed + * @internal this function is only called by mem_free() and mem_realloc() + * + * This assumes access to the heap is protected by the calling function + * already. + */ +static void +plug_holes(struct mem *mem) +{ + struct mem *nmem; + struct mem *pmem; + + LWIP_ASSERT("plug_holes: mem >= ram", (u8_t *)mem >= ram); + LWIP_ASSERT("plug_holes: mem < ram_end", (u8_t *)mem < (u8_t *)ram_end); + LWIP_ASSERT("plug_holes: mem->used == 0", mem->used == 0); + + /* plug hole forward */ + LWIP_ASSERT("plug_holes: mem->next <= MEM_SIZE_ALIGNED", mem->next <= MEM_SIZE_ALIGNED); + + nmem = (struct mem *)&ram[mem->next]; + if (mem != nmem && nmem->used == 0 && (u8_t *)nmem != (u8_t *)ram_end) { + /* if mem->next is unused and not end of ram, combine mem and mem->next */ + if (lfree == nmem) { + lfree = mem; + } + mem->next = nmem->next; + ((struct mem *)&ram[nmem->next])->prev = (u8_t *)mem - ram; + } + + /* plug hole backward */ + pmem = (struct mem *)&ram[mem->prev]; + if (pmem != mem && pmem->used == 0) { + /* if mem->prev is unused, combine mem and mem->prev */ + if (lfree == mem) { + lfree = pmem; + } + pmem->next = mem->next; + ((struct mem *)&ram[mem->next])->prev = (u8_t *)pmem - ram; + } +} + +/** + * Zero the heap and initialize start, end and lowest-free + */ +void +mem_init(void) +{ + struct mem *mem; + + LWIP_ASSERT("Sanity check alignment", + (SIZEOF_STRUCT_MEM & (MEM_ALIGNMENT-1)) == 0); + + /* align the heap */ + ram = LWIP_MEM_ALIGN(ram_heap); + /* initialize the start of the heap */ + mem = (struct mem *)ram; + mem->next = MEM_SIZE_ALIGNED; + mem->prev = 0; + mem->used = 0; + /* initialize the end of the heap */ + ram_end = (struct mem *)&ram[MEM_SIZE_ALIGNED]; + ram_end->used = 1; + ram_end->next = MEM_SIZE_ALIGNED; + ram_end->prev = MEM_SIZE_ALIGNED; + + mem_sem = sys_sem_new(1); + + /* initialize the lowest-free pointer to the start of the heap */ + lfree = (struct mem *)ram; + + MEM_STATS_AVAIL(avail, MEM_SIZE_ALIGNED); +} + +/** + * Put a struct mem back on the heap + * + * @param rmem is the data portion of a struct mem as returned by a previous + * call to mem_malloc() + */ +void +mem_free(void *rmem) +{ + struct mem *mem; + LWIP_MEM_FREE_DECL_PROTECT(); + + if (rmem == NULL) { + LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("mem_free(p == NULL) was called.\n")); + return; + } + LWIP_ASSERT("mem_free: sanity check alignment", (((mem_ptr_t)rmem) & (MEM_ALIGNMENT-1)) == 0); + + LWIP_ASSERT("mem_free: legal memory", (u8_t *)rmem >= (u8_t *)ram && + (u8_t *)rmem < (u8_t *)ram_end); + + if ((u8_t *)rmem < (u8_t *)ram || (u8_t *)rmem >= (u8_t *)ram_end) { + SYS_ARCH_DECL_PROTECT(lev); + LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_free: illegal memory\n")); + /* protect mem stats from concurrent access */ + SYS_ARCH_PROTECT(lev); + MEM_STATS_INC(illegal); + SYS_ARCH_UNPROTECT(lev); + return; + } + /* protect the heap from concurrent access */ + LWIP_MEM_FREE_PROTECT(); + /* Get the corresponding struct mem ... */ + mem = (struct mem *)((u8_t *)rmem - SIZEOF_STRUCT_MEM); + /* ... which has to be in a used state ... */ + LWIP_ASSERT("mem_free: mem->used", mem->used); + /* ... and is now unused. */ + mem->used = 0; + + if (mem < lfree) { + /* the newly freed struct is now the lowest */ + lfree = mem; + } + + MEM_STATS_DEC_USED(used, mem->next - ((u8_t *)mem - ram)); + + /* finally, see if prev or next are free also */ + plug_holes(mem); +#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT + mem_free_count = 1; +#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ + LWIP_MEM_FREE_UNPROTECT(); +} + +/** + * In contrast to its name, mem_realloc can only shrink memory, not expand it. + * Since the only use (for now) is in pbuf_realloc (which also can only shrink), + * this shouldn't be a problem! + * + * @param rmem pointer to memory allocated by mem_malloc the is to be shrinked + * @param newsize required size after shrinking (needs to be smaller than or + * equal to the previous size) + * @return for compatibility reasons: is always == rmem, at the moment + * or NULL if newsize is > old size, in which case rmem is NOT touched + * or freed! + */ +void * +mem_realloc(void *rmem, mem_size_t newsize) +{ + mem_size_t size; + mem_size_t ptr, ptr2; + struct mem *mem, *mem2; + /* use the FREE_PROTECT here: it protects with sem OR SYS_ARCH_PROTECT */ + LWIP_MEM_FREE_DECL_PROTECT(); + + /* Expand the size of the allocated memory region so that we can + adjust for alignment. */ + newsize = LWIP_MEM_ALIGN_SIZE(newsize); + + if(newsize < MIN_SIZE_ALIGNED) { + /* every data block must be at least MIN_SIZE_ALIGNED long */ + newsize = MIN_SIZE_ALIGNED; + } + + if (newsize > MEM_SIZE_ALIGNED) { + return NULL; + } + + LWIP_ASSERT("mem_realloc: legal memory", (u8_t *)rmem >= (u8_t *)ram && + (u8_t *)rmem < (u8_t *)ram_end); + + if ((u8_t *)rmem < (u8_t *)ram || (u8_t *)rmem >= (u8_t *)ram_end) { + SYS_ARCH_DECL_PROTECT(lev); + LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_realloc: illegal memory\n")); + /* protect mem stats from concurrent access */ + SYS_ARCH_PROTECT(lev); + MEM_STATS_INC(illegal); + SYS_ARCH_UNPROTECT(lev); + return rmem; + } + /* Get the corresponding struct mem ... */ + mem = (struct mem *)((u8_t *)rmem - SIZEOF_STRUCT_MEM); + /* ... and its offset pointer */ + ptr = (u8_t *)mem - ram; + + size = mem->next - ptr - SIZEOF_STRUCT_MEM; + LWIP_ASSERT("mem_realloc can only shrink memory", newsize <= size); + if (newsize > size) { + /* not supported */ + return NULL; + } + if (newsize == size) { + /* No change in size, simply return */ + return rmem; + } + + /* protect the heap from concurrent access */ + LWIP_MEM_FREE_PROTECT(); + + MEM_STATS_DEC_USED(used, (size - newsize)); + + mem2 = (struct mem *)&ram[mem->next]; + if(mem2->used == 0) { + /* The next struct is unused, we can simply move it at little */ + mem_size_t next; + /* remember the old next pointer */ + next = mem2->next; + /* create new struct mem which is moved directly after the shrinked mem */ + ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize; + if (lfree == mem2) { + lfree = (struct mem *)&ram[ptr2]; + } + mem2 = (struct mem *)&ram[ptr2]; + mem2->used = 0; + /* restore the next pointer */ + mem2->next = next; + /* link it back to mem */ + mem2->prev = ptr; + /* link mem to it */ + mem->next = ptr2; + /* last thing to restore linked list: as we have moved mem2, + * let 'mem2->next->prev' point to mem2 again. but only if mem2->next is not + * the end of the heap */ + if (mem2->next != MEM_SIZE_ALIGNED) { + ((struct mem *)&ram[mem2->next])->prev = ptr2; + } + /* no need to plug holes, we've already done that */ + } else if (newsize + SIZEOF_STRUCT_MEM + MIN_SIZE_ALIGNED <= size) { + /* Next struct is used but there's room for another struct mem with + * at least MIN_SIZE_ALIGNED of data. + * Old size ('size') must be big enough to contain at least 'newsize' plus a struct mem + * ('SIZEOF_STRUCT_MEM') with some data ('MIN_SIZE_ALIGNED'). + * @todo we could leave out MIN_SIZE_ALIGNED. We would create an empty + * region that couldn't hold data, but when mem->next gets freed, + * the 2 regions would be combined, resulting in more free memory */ + ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize; + mem2 = (struct mem *)&ram[ptr2]; + if (mem2 < lfree) { + lfree = mem2; + } + mem2->used = 0; + mem2->next = mem->next; + mem2->prev = ptr; + mem->next = ptr2; + if (mem2->next != MEM_SIZE_ALIGNED) { + ((struct mem *)&ram[mem2->next])->prev = ptr2; + } + /* the original mem->next is used, so no need to plug holes! */ + } + /* else { + next struct mem is used but size between mem and mem2 is not big enough + to create another struct mem + -> don't do anyhting. + -> the remaining space stays unused since it is too small + } */ +#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT + mem_free_count = 1; +#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ + LWIP_MEM_FREE_UNPROTECT(); + return rmem; +} + +/** + * Adam's mem_malloc() plus solution for bug #17922 + * Allocate a block of memory with a minimum of 'size' bytes. + * + * @param size is the minimum size of the requested block in bytes. + * @return pointer to allocated memory or NULL if no free memory was found. + * + * Note that the returned value will always be aligned (as defined by MEM_ALIGNMENT). + */ +void * +mem_malloc(mem_size_t size) +{ + mem_size_t ptr, ptr2; + struct mem *mem, *mem2; +#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT + u8_t local_mem_free_count = 0; +#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ + LWIP_MEM_ALLOC_DECL_PROTECT(); + + if (size == 0) { + return NULL; + } + + /* Expand the size of the allocated memory region so that we can + adjust for alignment. */ + size = LWIP_MEM_ALIGN_SIZE(size); + + if(size < MIN_SIZE_ALIGNED) { + /* every data block must be at least MIN_SIZE_ALIGNED long */ + size = MIN_SIZE_ALIGNED; + } + + if (size > MEM_SIZE_ALIGNED) { + return NULL; + } + + /* protect the heap from concurrent access */ + sys_arch_sem_wait(mem_sem, 0); + LWIP_MEM_ALLOC_PROTECT(); +#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT + /* run as long as a mem_free disturbed mem_malloc */ + do { + local_mem_free_count = 0; +#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ + + /* Scan through the heap searching for a free block that is big enough, + * beginning with the lowest free block. + */ + for (ptr = (u8_t *)lfree - ram; ptr < MEM_SIZE_ALIGNED - size; + ptr = ((struct mem *)&ram[ptr])->next) { + mem = (struct mem *)&ram[ptr]; +#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT + mem_free_count = 0; + LWIP_MEM_ALLOC_UNPROTECT(); + /* allow mem_free to run */ + LWIP_MEM_ALLOC_PROTECT(); + if (mem_free_count != 0) { + local_mem_free_count = mem_free_count; + } + mem_free_count = 0; +#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ + + if ((!mem->used) && + (mem->next - (ptr + SIZEOF_STRUCT_MEM)) >= size) { + /* mem is not used and at least perfect fit is possible: + * mem->next - (ptr + SIZEOF_STRUCT_MEM) gives us the 'user data size' of mem */ + + if (mem->next - (ptr + SIZEOF_STRUCT_MEM) >= (size + SIZEOF_STRUCT_MEM + MIN_SIZE_ALIGNED)) { + /* (in addition to the above, we test if another struct mem (SIZEOF_STRUCT_MEM) containing + * at least MIN_SIZE_ALIGNED of data also fits in the 'user data space' of 'mem') + * -> split large block, create empty remainder, + * remainder must be large enough to contain MIN_SIZE_ALIGNED data: if + * mem->next - (ptr + (2*SIZEOF_STRUCT_MEM)) == size, + * struct mem would fit in but no data between mem2 and mem2->next + * @todo we could leave out MIN_SIZE_ALIGNED. We would create an empty + * region that couldn't hold data, but when mem->next gets freed, + * the 2 regions would be combined, resulting in more free memory + */ + ptr2 = ptr + SIZEOF_STRUCT_MEM + size; + /* create mem2 struct */ + mem2 = (struct mem *)&ram[ptr2]; + mem2->used = 0; + mem2->next = mem->next; + mem2->prev = ptr; + /* and insert it between mem and mem->next */ + mem->next = ptr2; + mem->used = 1; + + if (mem2->next != MEM_SIZE_ALIGNED) { + ((struct mem *)&ram[mem2->next])->prev = ptr2; + } + MEM_STATS_INC_USED(used, (size + SIZEOF_STRUCT_MEM)); + } else { + /* (a mem2 struct does no fit into the user data space of mem and mem->next will always + * be used at this point: if not we have 2 unused structs in a row, plug_holes should have + * take care of this). + * -> near fit or excact fit: do not split, no mem2 creation + * also can't move mem->next directly behind mem, since mem->next + * will always be used at this point! + */ + mem->used = 1; + MEM_STATS_INC_USED(used, mem->next - ((u8_t *)mem - ram)); + } + + if (mem == lfree) { + /* Find next free block after mem and update lowest free pointer */ + while (lfree->used && lfree != ram_end) { + LWIP_MEM_ALLOC_UNPROTECT(); + /* prevent high interrupt latency... */ + LWIP_MEM_ALLOC_PROTECT(); + lfree = (struct mem *)&ram[lfree->next]; + } + LWIP_ASSERT("mem_malloc: !lfree->used", ((lfree == ram_end) || (!lfree->used))); + } + LWIP_MEM_ALLOC_UNPROTECT(); + sys_sem_signal(mem_sem); + LWIP_ASSERT("mem_malloc: allocated memory not above ram_end.", + (mem_ptr_t)mem + SIZEOF_STRUCT_MEM + size <= (mem_ptr_t)ram_end); + LWIP_ASSERT("mem_malloc: allocated memory properly aligned.", + ((mem_ptr_t)mem + SIZEOF_STRUCT_MEM) % MEM_ALIGNMENT == 0); + LWIP_ASSERT("mem_malloc: sanity check alignment", + (((mem_ptr_t)mem) & (MEM_ALIGNMENT-1)) == 0); + + return (u8_t *)mem + SIZEOF_STRUCT_MEM; + } + } +#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT + /* if we got interrupted by a mem_free, try again */ + } while(local_mem_free_count != 0); +#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ + LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("mem_malloc: could not allocate %"S16_F" bytes\n", (s16_t)size)); + MEM_STATS_INC(err); + LWIP_MEM_ALLOC_UNPROTECT(); + sys_sem_signal(mem_sem); + return NULL; +} + +#endif /* MEM_USE_POOLS */ +/** + * Contiguously allocates enough space for count objects that are size bytes + * of memory each and returns a pointer to the allocated memory. + * + * The allocated memory is filled with bytes of value zero. + * + * @param count number of objects to allocate + * @param size size of the objects to allocate + * @return pointer to allocated memory / NULL pointer if there is an error + */ +void *mem_calloc(mem_size_t count, mem_size_t size) +{ + void *p; + + /* allocate 'count' objects of size 'size' */ + p = mem_malloc(count * size); + if (p) { + /* zero the memory */ + memset(p, 0, count * size); + } + return p; +} + +#endif /* !MEM_LIBC_MALLOC */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/memp.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/memp.c new file mode 100644 index 0000000..bd2fd26 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/memp.c @@ -0,0 +1,388 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/** + * @file + * Dynamic pool memory manager + * + * lwIP has dedicated pools for many structures (netconn, protocol control blocks, + * packet buffers, ...). All these pools are managed here. + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "lwip/opt.h" + +#include "lwip/memp.h" +#include "lwip/pbuf.h" +#include "lwip/udp.h" +#include "lwip/raw.h" +#include "lwip/tcp.h" +#include "lwip/igmp.h" +#include "lwip/api.h" +#include "lwip/api_msg.h" +#include "lwip/tcpip.h" +#include "lwip/sys.h" +#include "lwip/stats.h" +#include "netif/etharp.h" +#include "lwip/ip_frag.h" + +#include + +#if !MEMP_MEM_MALLOC /* don't build if not configured for use in lwipopts.h */ + +struct memp { + struct memp *next; +#if MEMP_OVERFLOW_CHECK + const char *file; + int line; +#endif /* MEMP_OVERFLOW_CHECK */ +}; + +#if MEMP_OVERFLOW_CHECK +/* if MEMP_OVERFLOW_CHECK is turned on, we reserve some bytes at the beginning + * and at the end of each element, initialize them as 0xcd and check + * them later. */ +/* If MEMP_OVERFLOW_CHECK is >= 2, on every call to memp_malloc or memp_free, + * every single element in each pool is checked! + * This is VERY SLOW but also very helpful. */ +/* MEMP_SANITY_REGION_BEFORE and MEMP_SANITY_REGION_AFTER can be overridden in + * lwipopts.h to change the amount reserved for checking. */ +#ifndef MEMP_SANITY_REGION_BEFORE +#define MEMP_SANITY_REGION_BEFORE 16 +#endif /* MEMP_SANITY_REGION_BEFORE*/ +#if MEMP_SANITY_REGION_BEFORE > 0 +#define MEMP_SANITY_REGION_BEFORE_ALIGNED LWIP_MEM_ALIGN_SIZE(MEMP_SANITY_REGION_BEFORE) +#else +#define MEMP_SANITY_REGION_BEFORE_ALIGNED 0 +#endif /* MEMP_SANITY_REGION_BEFORE*/ +#ifndef MEMP_SANITY_REGION_AFTER +#define MEMP_SANITY_REGION_AFTER 16 +#endif /* MEMP_SANITY_REGION_AFTER*/ +#if MEMP_SANITY_REGION_AFTER > 0 +#define MEMP_SANITY_REGION_AFTER_ALIGNED LWIP_MEM_ALIGN_SIZE(MEMP_SANITY_REGION_AFTER) +#else +#define MEMP_SANITY_REGION_AFTER_ALIGNED 0 +#endif /* MEMP_SANITY_REGION_AFTER*/ + +/* MEMP_SIZE: save space for struct memp and for sanity check */ +#define MEMP_SIZE (LWIP_MEM_ALIGN_SIZE(sizeof(struct memp)) + MEMP_SANITY_REGION_BEFORE_ALIGNED) +#define MEMP_ALIGN_SIZE(x) (LWIP_MEM_ALIGN_SIZE(x) + MEMP_SANITY_REGION_AFTER_ALIGNED) + +#else /* MEMP_OVERFLOW_CHECK */ + +/* No sanity checks + * We don't need to preserve the struct memp while not allocated, so we + * can save a little space and set MEMP_SIZE to 0. + */ +#define MEMP_SIZE 0 +#define MEMP_ALIGN_SIZE(x) (LWIP_MEM_ALIGN_SIZE(x)) + +#endif /* MEMP_OVERFLOW_CHECK */ + +/** This array holds the first free element of each pool. + * Elements form a linked list. */ +static struct memp *memp_tab[MEMP_MAX]; + +#else /* MEMP_MEM_MALLOC */ + +#define MEMP_ALIGN_SIZE(x) (LWIP_MEM_ALIGN_SIZE(x)) + +#endif /* MEMP_MEM_MALLOC */ + +/** This array holds the element sizes of each pool. */ +#if !MEM_USE_POOLS && !MEMP_MEM_MALLOC +static +#endif +const u16_t memp_sizes[MEMP_MAX] = { +#define LWIP_MEMPOOL(name,num,size,desc) LWIP_MEM_ALIGN_SIZE(size), +#include "lwip/memp_std.h" +}; + +#if !MEMP_MEM_MALLOC /* don't build if not configured for use in lwipopts.h */ + +/** This array holds the number of elements in each pool. */ +static const u16_t memp_num[MEMP_MAX] = { +#define LWIP_MEMPOOL(name,num,size,desc) (num), +#include "lwip/memp_std.h" +}; + +/** This array holds a textual description of each pool. */ +#ifdef LWIP_DEBUG +static const char *memp_desc[MEMP_MAX] = { +#define LWIP_MEMPOOL(name,num,size,desc) (desc), +#include "lwip/memp_std.h" +}; +#endif /* LWIP_DEBUG */ + +/** This is the actual memory used by the pools. */ +static u8_t memp_memory[MEM_ALIGNMENT - 1 +#define LWIP_MEMPOOL(name,num,size,desc) + ( (num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size) ) ) +#include "lwip/memp_std.h" +]; + +#if MEMP_SANITY_CHECK +/** + * Check that memp-lists don't form a circle + */ +static int +memp_sanity(void) +{ + s16_t i, c; + struct memp *m, *n; + + for (i = 0; i < MEMP_MAX; i++) { + for (m = memp_tab[i]; m != NULL; m = m->next) { + c = 1; + for (n = memp_tab[i]; n != NULL; n = n->next) { + if (n == m && --c < 0) { + return 0; + } + } + } + } + return 1; +} +#endif /* MEMP_SANITY_CHECK*/ +#if MEMP_OVERFLOW_CHECK +/** + * Check if a memp element was victim of an overflow + * (e.g. the restricted area after it has been altered) + * + * @param p the memp element to check + * @param memp_size the element size of the pool p comes from + */ +static void +memp_overflow_check_element(struct memp *p, u16_t memp_size) +{ + u16_t k; + u8_t *m; +#if MEMP_SANITY_REGION_BEFORE_ALIGNED > 0 + m = (u8_t*)p + MEMP_SIZE - MEMP_SANITY_REGION_BEFORE_ALIGNED; + for (k = 0; k < MEMP_SANITY_REGION_BEFORE_ALIGNED; k++) { + if (m[k] != 0xcd) { + LWIP_ASSERT("detected memp underflow!", 0); + } + } +#endif +#if MEMP_SANITY_REGION_AFTER_ALIGNED > 0 + m = (u8_t*)p + MEMP_SIZE + memp_size; + for (k = 0; k < MEMP_SANITY_REGION_AFTER_ALIGNED; k++) { + if (m[k] != 0xcd) { + LWIP_ASSERT("detected memp overflow!", 0); + } + } +#endif +} + +/** + * Do an overflow check for all elements in every pool. + * + * @see memp_overflow_check_element for a description of the check + */ +static void +memp_overflow_check_all(void) +{ + u16_t i, j; + struct memp *p; + + p = LWIP_MEM_ALIGN(memp_memory); + for (i = 0; i < MEMP_MAX; ++i) { + p = p; + for (j = 0; j < memp_num[i]; ++j) { + memp_overflow_check_element(p, memp_sizes[i]); + p = (struct memp*)((u8_t*)p + MEMP_SIZE + memp_sizes[i] + MEMP_SANITY_REGION_AFTER_ALIGNED); + } + } +} + +/** + * Initialize the restricted areas of all memp elements in every pool. + */ +static void +memp_overflow_init(void) +{ + u16_t i, j; + struct memp *p; + u8_t *m; + + p = LWIP_MEM_ALIGN(memp_memory); + for (i = 0; i < MEMP_MAX; ++i) { + p = p; + for (j = 0; j < memp_num[i]; ++j) { +#if MEMP_SANITY_REGION_BEFORE_ALIGNED > 0 + m = (u8_t*)p + MEMP_SIZE - MEMP_SANITY_REGION_BEFORE_ALIGNED; + memset(m, 0xcd, MEMP_SANITY_REGION_BEFORE_ALIGNED); +#endif +#if MEMP_SANITY_REGION_AFTER_ALIGNED > 0 + m = (u8_t*)p + MEMP_SIZE + memp_sizes[i]; + memset(m, 0xcd, MEMP_SANITY_REGION_AFTER_ALIGNED); +#endif + p = (struct memp*)((u8_t*)p + MEMP_SIZE + memp_sizes[i] + MEMP_SANITY_REGION_AFTER_ALIGNED); + } + } +} +#endif /* MEMP_OVERFLOW_CHECK */ + +/** + * Initialize this module. + * + * Carves out memp_memory into linked lists for each pool-type. + */ +void +memp_init(void) +{ + struct memp *memp; + u16_t i, j; + + for (i = 0; i < MEMP_MAX; ++i) { + MEMP_STATS_AVAIL(used, i, 0); + MEMP_STATS_AVAIL(max, i, 0); + MEMP_STATS_AVAIL(err, i, 0); + MEMP_STATS_AVAIL(avail, i, memp_num[i]); + } + + memp = LWIP_MEM_ALIGN(memp_memory); + /* for every pool: */ + for (i = 0; i < MEMP_MAX; ++i) { + memp_tab[i] = NULL; + /* create a linked list of memp elements */ + for (j = 0; j < memp_num[i]; ++j) { + memp->next = memp_tab[i]; + memp_tab[i] = memp; + memp = (struct memp *)((u8_t *)memp + MEMP_SIZE + memp_sizes[i] +#if MEMP_OVERFLOW_CHECK + + MEMP_SANITY_REGION_AFTER_ALIGNED +#endif + ); + } + } +#if MEMP_OVERFLOW_CHECK + memp_overflow_init(); + /* check everything a first time to see if it worked */ + memp_overflow_check_all(); +#endif /* MEMP_OVERFLOW_CHECK */ +} + +/** + * Get an element from a specific pool. + * + * @param type the pool to get an element from + * + * the debug version has two more parameters: + * @param file file name calling this function + * @param line number of line where this function is called + * + * @return a pointer to the allocated memory or a NULL pointer on error + */ +void * +#if !MEMP_OVERFLOW_CHECK +memp_malloc(memp_t type) +#else +memp_malloc_fn(memp_t type, const char* file, const int line) +#endif +{ + struct memp *memp; + SYS_ARCH_DECL_PROTECT(old_level); + + LWIP_ERROR("memp_malloc: type < MEMP_MAX", (type < MEMP_MAX), return NULL;); + + SYS_ARCH_PROTECT(old_level); +#if MEMP_OVERFLOW_CHECK >= 2 + memp_overflow_check_all(); +#endif /* MEMP_OVERFLOW_CHECK >= 2 */ + + memp = memp_tab[type]; + + if (memp != NULL) { + memp_tab[type] = memp->next; +#if MEMP_OVERFLOW_CHECK + memp->next = NULL; + memp->file = file; + memp->line = line; +#endif /* MEMP_OVERFLOW_CHECK */ + MEMP_STATS_INC_USED(used, type); + LWIP_ASSERT("memp_malloc: memp properly aligned", + ((mem_ptr_t)memp % MEM_ALIGNMENT) == 0); + memp = (struct memp*)((u8_t*)memp + MEMP_SIZE); + } else { + LWIP_DEBUGF(MEMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("memp_malloc: out of memory in pool %s\n", memp_desc[type])); + MEMP_STATS_INC(err, type); + } + + SYS_ARCH_UNPROTECT(old_level); + + return memp; +} + +/** + * Put an element back into its pool. + * + * @param type the pool where to put mem + * @param mem the memp element to free + */ +void +memp_free(memp_t type, void *mem) +{ + struct memp *memp; + SYS_ARCH_DECL_PROTECT(old_level); + + if (mem == NULL) { + return; + } + LWIP_ASSERT("memp_free: mem properly aligned", + ((mem_ptr_t)mem % MEM_ALIGNMENT) == 0); + + memp = (struct memp *)((u8_t*)mem - MEMP_SIZE); + + SYS_ARCH_PROTECT(old_level); +#if MEMP_OVERFLOW_CHECK +#if MEMP_OVERFLOW_CHECK >= 2 + memp_overflow_check_all(); +#else + memp_overflow_check_element(memp, memp_sizes[type]); +#endif /* MEMP_OVERFLOW_CHECK >= 2 */ +#endif /* MEMP_OVERFLOW_CHECK */ + + MEMP_STATS_DEC(used, type); + + memp->next = memp_tab[type]; + memp_tab[type] = memp; + +#if MEMP_SANITY_CHECK + LWIP_ASSERT("memp sanity", memp_sanity()); +#endif /* MEMP_SANITY_CHECK */ + + SYS_ARCH_UNPROTECT(old_level); +} + +#endif /* MEMP_MEM_MALLOC */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/netif.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/netif.c new file mode 100644 index 0000000..cf3815c --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/netif.c @@ -0,0 +1,683 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/** + * @file + * lwIP network interface abstraction + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "lwip/opt.h" + +#include "lwip/def.h" +#include "lwip/ip_addr.h" +#include "lwip/netif.h" +#include "lwip/tcp.h" +#include "lwip/snmp.h" +#include "lwip/igmp.h" +#include "netif/etharp.h" +#if ENABLE_LOOPBACK +#include "lwip/sys.h" +#if LWIP_NETIF_LOOPBACK_MULTITHREADING +#include "lwip/tcpip.h" +#endif /* LWIP_NETIF_LOOPBACK_MULTITHREADING */ +#endif /* ENABLE_LOOPBACK */ + +#if LWIP_AUTOIP +#include "lwip/autoip.h" +#endif /* LWIP_AUTOIP */ +#if LWIP_DHCP +#include "lwip/dhcp.h" +#endif /* LWIP_DHCP */ + +#if LWIP_NETIF_STATUS_CALLBACK +#define NETIF_STATUS_CALLBACK(n) { if (n->status_callback) (n->status_callback)(n); } +#else +#define NETIF_STATUS_CALLBACK(n) { /* NOP */ } +#endif /* LWIP_NETIF_STATUS_CALLBACK */ + +#if LWIP_NETIF_LINK_CALLBACK +#define NETIF_LINK_CALLBACK(n) { if (n->link_callback) (n->link_callback)(n); } +#else +#define NETIF_LINK_CALLBACK(n) { /* NOP */ } +#endif /* LWIP_NETIF_LINK_CALLBACK */ + +struct netif *netif_list; +struct netif *netif_default; + +/** + * Add a network interface to the list of lwIP netifs. + * + * @param netif a pre-allocated netif structure + * @param ipaddr IP address for the new netif + * @param netmask network mask for the new netif + * @param gw default gateway IP address for the new netif + * @param state opaque data passed to the new netif + * @param init callback function that initializes the interface + * @param input callback function that is called to pass + * ingress packets up in the protocol layer stack. + * + * @return netif, or NULL if failed. + */ +struct netif * +netif_add(struct netif *netif, struct ip_addr *ipaddr, struct ip_addr *netmask, + struct ip_addr *gw, + void *state, + err_t (* init)(struct netif *netif), + err_t (* input)(struct pbuf *p, struct netif *netif)) +{ + static u8_t netifnum = 0; + + /* reset new interface configuration state */ + netif->ip_addr.addr = 0; + netif->netmask.addr = 0; + netif->gw.addr = 0; + netif->flags = 0; +#if LWIP_DHCP + /* netif not under DHCP control by default */ + netif->dhcp = NULL; +#endif /* LWIP_DHCP */ +#if LWIP_AUTOIP + /* netif not under AutoIP control by default */ + netif->autoip = NULL; +#endif /* LWIP_AUTOIP */ +#if LWIP_NETIF_STATUS_CALLBACK + netif->status_callback = NULL; +#endif /* LWIP_NETIF_STATUS_CALLBACK */ +#if LWIP_NETIF_LINK_CALLBACK + netif->link_callback = NULL; +#endif /* LWIP_NETIF_LINK_CALLBACK */ +#if LWIP_IGMP + netif->igmp_mac_filter = NULL; +#endif /* LWIP_IGMP */ +#if ENABLE_LOOPBACK + netif->loop_first = NULL; + netif->loop_last = NULL; +#endif /* ENABLE_LOOPBACK */ + + /* remember netif specific state information data */ + netif->state = state; + netif->num = netifnum++; + netif->input = input; +#if LWIP_NETIF_HWADDRHINT + netif->addr_hint = NULL; +#endif /* LWIP_NETIF_HWADDRHINT*/ +#if ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS + netif->loop_cnt_current = 0; +#endif /* ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS */ + + netif_set_addr(netif, ipaddr, netmask, gw); + + /* call user specified initialization function for netif */ + if (init(netif) != ERR_OK) { + return NULL; + } + + /* add this netif to the list */ + netif->next = netif_list; + netif_list = netif; + snmp_inc_iflist(); + +#if LWIP_IGMP + /* start IGMP processing */ + if (netif->flags & NETIF_FLAG_IGMP) { + igmp_start( netif); + } +#endif /* LWIP_IGMP */ + + LWIP_DEBUGF(NETIF_DEBUG, ("netif: added interface %c%c IP addr ", + netif->name[0], netif->name[1])); + ip_addr_debug_print(NETIF_DEBUG, ipaddr); + LWIP_DEBUGF(NETIF_DEBUG, (" netmask ")); + ip_addr_debug_print(NETIF_DEBUG, netmask); + LWIP_DEBUGF(NETIF_DEBUG, (" gw ")); + ip_addr_debug_print(NETIF_DEBUG, gw); + LWIP_DEBUGF(NETIF_DEBUG, ("\n")); + return netif; +} + +/** + * Change IP address configuration for a network interface (including netmask + * and default gateway). + * + * @param netif the network interface to change + * @param ipaddr the new IP address + * @param netmask the new netmask + * @param gw the new default gateway + */ +void +netif_set_addr(struct netif *netif, struct ip_addr *ipaddr, struct ip_addr *netmask, + struct ip_addr *gw) +{ + netif_set_ipaddr(netif, ipaddr); + netif_set_netmask(netif, netmask); + netif_set_gw(netif, gw); +} + +/** + * Remove a network interface from the list of lwIP netifs. + * + * @param netif the network interface to remove + */ +void netif_remove(struct netif * netif) +{ + if ( netif == NULL ) return; + +#if LWIP_IGMP + /* stop IGMP processing */ + if (netif->flags & NETIF_FLAG_IGMP) { + igmp_stop( netif); + } +#endif /* LWIP_IGMP */ + + snmp_delete_ipaddridx_tree(netif); + + /* is it the first netif? */ + if (netif_list == netif) { + netif_list = netif->next; + snmp_dec_iflist(); + } + else { + /* look for netif further down the list */ + struct netif * tmpNetif; + for (tmpNetif = netif_list; tmpNetif != NULL; tmpNetif = tmpNetif->next) { + if (tmpNetif->next == netif) { + tmpNetif->next = netif->next; + snmp_dec_iflist(); + break; + } + } + if (tmpNetif == NULL) + return; /* we didn't find any netif today */ + } + /* this netif is default? */ + if (netif_default == netif) + /* reset default netif */ + netif_set_default(NULL); + LWIP_DEBUGF( NETIF_DEBUG, ("netif_remove: removed netif\n") ); +} + +/** + * Find a network interface by searching for its name + * + * @param name the name of the netif (like netif->name) plus concatenated number + * in ascii representation (e.g. 'en0') + */ +struct netif * +netif_find(char *name) +{ + struct netif *netif; + u8_t num; + + if (name == NULL) { + return NULL; + } + + num = name[2] - '0'; + + for(netif = netif_list; netif != NULL; netif = netif->next) { + if (num == netif->num && + name[0] == netif->name[0] && + name[1] == netif->name[1]) { + LWIP_DEBUGF(NETIF_DEBUG, ("netif_find: found %c%c\n", name[0], name[1])); + return netif; + } + } + LWIP_DEBUGF(NETIF_DEBUG, ("netif_find: didn't find %c%c\n", name[0], name[1])); + return NULL; +} + +/** + * Change the IP address of a network interface + * + * @param netif the network interface to change + * @param ipaddr the new IP address + * + * @note call netif_set_addr() if you also want to change netmask and + * default gateway + */ +void +netif_set_ipaddr(struct netif *netif, struct ip_addr *ipaddr) +{ + /* TODO: Handling of obsolete pcbs */ + /* See: http://mail.gnu.org/archive/html/lwip-users/2003-03/msg00118.html */ +#if LWIP_TCP + struct tcp_pcb *pcb; + struct tcp_pcb_listen *lpcb; + + /* address is actually being changed? */ + if ((ip_addr_cmp(ipaddr, &(netif->ip_addr))) == 0) + { + /* extern struct tcp_pcb *tcp_active_pcbs; defined by tcp.h */ + LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_set_ipaddr: netif address being changed\n")); + pcb = tcp_active_pcbs; + while (pcb != NULL) { + /* PCB bound to current local interface address? */ + if (ip_addr_cmp(&(pcb->local_ip), &(netif->ip_addr))) { + /* this connection must be aborted */ + struct tcp_pcb *next = pcb->next; + LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_set_ipaddr: aborting TCP pcb %p\n", (void *)pcb)); + tcp_abort(pcb); + pcb = next; + } else { + pcb = pcb->next; + } + } + for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) { + /* PCB bound to current local interface address? */ + if ((!(ip_addr_isany(&(lpcb->local_ip)))) && + (ip_addr_cmp(&(lpcb->local_ip), &(netif->ip_addr)))) { + /* The PCB is listening to the old ipaddr and + * is set to listen to the new one instead */ + ip_addr_set(&(lpcb->local_ip), ipaddr); + } + } + } +#endif + snmp_delete_ipaddridx_tree(netif); + snmp_delete_iprteidx_tree(0,netif); + /* set new IP address to netif */ + ip_addr_set(&(netif->ip_addr), ipaddr); + snmp_insert_ipaddridx_tree(netif); + snmp_insert_iprteidx_tree(0,netif); + + LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("netif: IP address of interface %c%c set to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", + netif->name[0], netif->name[1], + ip4_addr1(&netif->ip_addr), + ip4_addr2(&netif->ip_addr), + ip4_addr3(&netif->ip_addr), + ip4_addr4(&netif->ip_addr))); +} + +/** + * Change the default gateway for a network interface + * + * @param netif the network interface to change + * @param gw the new default gateway + * + * @note call netif_set_addr() if you also want to change ip address and netmask + */ +void +netif_set_gw(struct netif *netif, struct ip_addr *gw) +{ + ip_addr_set(&(netif->gw), gw); + LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("netif: GW address of interface %c%c set to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", + netif->name[0], netif->name[1], + ip4_addr1(&netif->gw), + ip4_addr2(&netif->gw), + ip4_addr3(&netif->gw), + ip4_addr4(&netif->gw))); +} + +/** + * Change the netmask of a network interface + * + * @param netif the network interface to change + * @param netmask the new netmask + * + * @note call netif_set_addr() if you also want to change ip address and + * default gateway + */ +void +netif_set_netmask(struct netif *netif, struct ip_addr *netmask) +{ + snmp_delete_iprteidx_tree(0, netif); + /* set new netmask to netif */ + ip_addr_set(&(netif->netmask), netmask); + snmp_insert_iprteidx_tree(0, netif); + LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("netif: netmask of interface %c%c set to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", + netif->name[0], netif->name[1], + ip4_addr1(&netif->netmask), + ip4_addr2(&netif->netmask), + ip4_addr3(&netif->netmask), + ip4_addr4(&netif->netmask))); +} + +/** + * Set a network interface as the default network interface + * (used to output all packets for which no specific route is found) + * + * @param netif the default network interface + */ +void +netif_set_default(struct netif *netif) +{ + if (netif == NULL) + { + /* remove default route */ + snmp_delete_iprteidx_tree(1, netif); + } + else + { + /* install default route */ + snmp_insert_iprteidx_tree(1, netif); + } + netif_default = netif; + LWIP_DEBUGF(NETIF_DEBUG, ("netif: setting default interface %c%c\n", + netif ? netif->name[0] : '\'', netif ? netif->name[1] : '\'')); +} + +/** + * Bring an interface up, available for processing + * traffic. + * + * @note: Enabling DHCP on a down interface will make it come + * up once configured. + * + * @see dhcp_start() + */ +void netif_set_up(struct netif *netif) +{ + if ( !(netif->flags & NETIF_FLAG_UP )) { + netif->flags |= NETIF_FLAG_UP; + +#if LWIP_SNMP + snmp_get_sysuptime(&netif->ts); +#endif /* LWIP_SNMP */ + + NETIF_LINK_CALLBACK(netif); + NETIF_STATUS_CALLBACK(netif); + +#if LWIP_ARP + /* For Ethernet network interfaces, we would like to send a "gratuitous ARP" */ + if (netif->flags & NETIF_FLAG_ETHARP) { + etharp_gratuitous(netif); + } +#endif /* LWIP_ARP */ + +#if LWIP_IGMP + /* resend IGMP memberships */ + if (netif->flags & NETIF_FLAG_IGMP) { + igmp_report_groups( netif); + } +#endif /* LWIP_IGMP */ + } +} + +/** + * Bring an interface down, disabling any traffic processing. + * + * @note: Enabling DHCP on a down interface will make it come + * up once configured. + * + * @see dhcp_start() + */ +void netif_set_down(struct netif *netif) +{ + if ( netif->flags & NETIF_FLAG_UP ) + { + netif->flags &= ~NETIF_FLAG_UP; +#if LWIP_SNMP + snmp_get_sysuptime(&netif->ts); +#endif + + NETIF_LINK_CALLBACK(netif); + NETIF_STATUS_CALLBACK(netif); + } +} + +/** + * Ask if an interface is up + */ +u8_t netif_is_up(struct netif *netif) +{ + return (netif->flags & NETIF_FLAG_UP)?1:0; +} + +#if LWIP_NETIF_STATUS_CALLBACK +/** + * Set callback to be called when interface is brought up/down + */ +void netif_set_status_callback(struct netif *netif, void (* status_callback)(struct netif *netif )) +{ + if ( netif ) + netif->status_callback = status_callback; +} +#endif /* LWIP_NETIF_STATUS_CALLBACK */ + +#if LWIP_NETIF_LINK_CALLBACK +/** + * Called by a driver when its link goes up + */ +void netif_set_link_up(struct netif *netif ) +{ + netif->flags |= NETIF_FLAG_LINK_UP; + +#if LWIP_DHCP + if (netif->dhcp) { + dhcp_network_changed(netif); + } +#endif /* LWIP_DHCP */ + +#if LWIP_AUTOIP + if (netif->autoip) { + autoip_network_changed(netif); + } +#endif /* LWIP_AUTOIP */ + + if (netif->flags & NETIF_FLAG_UP) { +#if LWIP_ARP + /* For Ethernet network interfaces, we would like to send a "gratuitous ARP" */ + if (netif->flags & NETIF_FLAG_ETHARP) { + etharp_gratuitous(netif); + } +#endif /* LWIP_ARP */ + +#if LWIP_IGMP + /* resend IGMP memberships */ + if (netif->flags & NETIF_FLAG_IGMP) { + igmp_report_groups( netif); + } +#endif /* LWIP_IGMP */ + } + NETIF_LINK_CALLBACK(netif); +} + +/** + * Called by a driver when its link goes down + */ +void netif_set_link_down(struct netif *netif ) +{ + netif->flags &= ~NETIF_FLAG_LINK_UP; + NETIF_LINK_CALLBACK(netif); +} + +/** + * Ask if a link is up + */ +u8_t netif_is_link_up(struct netif *netif) +{ + return (netif->flags & NETIF_FLAG_LINK_UP) ? 1 : 0; +} + +/** + * Set callback to be called when link is brought up/down + */ +void netif_set_link_callback(struct netif *netif, void (* link_callback)(struct netif *netif )) +{ + if (netif) { + netif->link_callback = link_callback; + } +} +#endif /* LWIP_NETIF_LINK_CALLBACK */ + +#if ENABLE_LOOPBACK +/** + * Send an IP packet to be received on the same netif (loopif-like). + * The pbuf is simply copied and handed back to netif->input. + * In multithreaded mode, this is done directly since netif->input must put + * the packet on a queue. + * In callback mode, the packet is put on an internal queue and is fed to + * netif->input by netif_poll(). + * + * @param netif the lwip network interface structure + * @param p the (IP) packet to 'send' + * @param ipaddr the ip address to send the packet to (not used) + * @return ERR_OK if the packet has been sent + * ERR_MEM if the pbuf used to copy the packet couldn't be allocated + */ +err_t +netif_loop_output(struct netif *netif, struct pbuf *p, + struct ip_addr *ipaddr) +{ + struct pbuf *r; + err_t err; + struct pbuf *last; +#if LWIP_LOOPBACK_MAX_PBUFS + u8_t clen = 0; +#endif /* LWIP_LOOPBACK_MAX_PBUFS */ + SYS_ARCH_DECL_PROTECT(lev); + LWIP_UNUSED_ARG(ipaddr); + + /* Allocate a new pbuf */ + r = pbuf_alloc(PBUF_LINK, p->tot_len, PBUF_RAM); + if (r == NULL) { + return ERR_MEM; + } +#if LWIP_LOOPBACK_MAX_PBUFS + clen = pbuf_clen(r); + /* check for overflow or too many pbuf on queue */ + if(((netif->loop_cnt_current + clen) < netif->loop_cnt_current) || + ((netif->loop_cnt_current + clen) > LWIP_LOOPBACK_MAX_PBUFS)) { + pbuf_free(r); + r = NULL; + return ERR_MEM; + } + netif->loop_cnt_current += clen; +#endif /* LWIP_LOOPBACK_MAX_PBUFS */ + + /* Copy the whole pbuf queue p into the single pbuf r */ + if ((err = pbuf_copy(r, p)) != ERR_OK) { + pbuf_free(r); + r = NULL; + return err; + } + + /* Put the packet on a linked list which gets emptied through calling + netif_poll(). */ + + /* let last point to the last pbuf in chain r */ + for (last = r; last->next != NULL; last = last->next); + + SYS_ARCH_PROTECT(lev); + if(netif->loop_first != NULL) { + LWIP_ASSERT("if first != NULL, last must also be != NULL", netif->loop_last != NULL); + netif->loop_last->next = r; + netif->loop_last = last; + } else { + netif->loop_first = r; + netif->loop_last = last; + } + SYS_ARCH_UNPROTECT(lev); + +#if LWIP_NETIF_LOOPBACK_MULTITHREADING + /* For multithreading environment, schedule a call to netif_poll */ + tcpip_callback((void (*)(void *))(netif_poll), netif); +#endif /* LWIP_NETIF_LOOPBACK_MULTITHREADING */ + + return ERR_OK; +} + +/** + * Call netif_poll() in the main loop of your application. This is to prevent + * reentering non-reentrant functions like tcp_input(). Packets passed to + * netif_loop_output() are put on a list that is passed to netif->input() by + * netif_poll(). + */ +void +netif_poll(struct netif *netif) +{ + struct pbuf *in; + SYS_ARCH_DECL_PROTECT(lev); + + do { + /* Get a packet from the list. With SYS_LIGHTWEIGHT_PROT=1, this is protected */ + SYS_ARCH_PROTECT(lev); + in = netif->loop_first; + if(in != NULL) { + struct pbuf *in_end = in; +#if LWIP_LOOPBACK_MAX_PBUFS + u8_t clen = pbuf_clen(in); + /* adjust the number of pbufs on queue */ + LWIP_ASSERT("netif->loop_cnt_current underflow", + ((netif->loop_cnt_current - clen) < netif->loop_cnt_current)); + netif->loop_cnt_current -= clen; +#endif /* LWIP_LOOPBACK_MAX_PBUFS */ + while(in_end->len != in_end->tot_len) { + LWIP_ASSERT("bogus pbuf: len != tot_len but next == NULL!", in_end->next != NULL); + in_end = in_end->next; + } + /* 'in_end' now points to the last pbuf from 'in' */ + if(in_end == netif->loop_last) { + /* this was the last pbuf in the list */ + netif->loop_first = netif->loop_last = NULL; + } else { + /* pop the pbuf off the list */ + netif->loop_first = in_end->next; + LWIP_ASSERT("should not be null since first != last!", netif->loop_first != NULL); + } + /* De-queue the pbuf from its successors on the 'loop_' list. */ + in_end->next = NULL; + } + SYS_ARCH_UNPROTECT(lev); + + if(in != NULL) { + /* loopback packets are always IP packets! */ + if(ip_input(in, netif) != ERR_OK) { + pbuf_free(in); + } + /* Don't reference the packet any more! */ + in = NULL; + } + /* go on while there is a packet on the list */ + } while(netif->loop_first != NULL); +} + +#if !LWIP_NETIF_LOOPBACK_MULTITHREADING +/** + * Calls netif_poll() for every netif on the netif_list. + */ +void +netif_poll_all(void) +{ + struct netif *netif = netif_list; + /* loop through netifs */ + while (netif != NULL) { + netif_poll(netif); + /* proceed to next network interface */ + netif = netif->next; + } +} +#endif /* !LWIP_NETIF_LOOPBACK_MULTITHREADING */ +#endif /* ENABLE_LOOPBACK */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/pbuf.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/pbuf.c new file mode 100644 index 0000000..6284b9a --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/pbuf.c @@ -0,0 +1,931 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/** + * @file + * Packet buffer management + * + * Packets are built from the pbuf data structure. It supports dynamic + * memory allocation for packet contents or can reference externally + * managed packet contents both in RAM and ROM. Quick allocation for + * incoming packets is provided through pools with fixed sized pbufs. + * + * A packet may span over multiple pbufs, chained as a singly linked + * list. This is called a "pbuf chain". + * + * Multiple packets may be queued, also using this singly linked list. + * This is called a "packet queue". + * + * So, a packet queue consists of one or more pbuf chains, each of + * which consist of one or more pbufs. CURRENTLY, PACKET QUEUES ARE + * NOT SUPPORTED!!! Use helper structs to queue multiple packets. + * + * The differences between a pbuf chain and a packet queue are very + * precise but subtle. + * + * The last pbuf of a packet has a ->tot_len field that equals the + * ->len field. It can be found by traversing the list. If the last + * pbuf of a packet has a ->next field other than NULL, more packets + * are on the queue. + * + * Therefore, looping through a pbuf of a single packet, has an + * loop end condition (tot_len == p->len), NOT (next == NULL). + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "lwip/opt.h" + +#include "lwip/stats.h" +#include "lwip/def.h" +#include "lwip/mem.h" +#include "lwip/memp.h" +#include "lwip/pbuf.h" +#include "lwip/sys.h" +#include "arch/perf.h" +#if TCP_QUEUE_OOSEQ +#include "lwip/tcp.h" +#endif + +#include + +#define SIZEOF_STRUCT_PBUF LWIP_MEM_ALIGN_SIZE(sizeof(struct pbuf)) +/* Since the pool is created in memp, PBUF_POOL_BUFSIZE will be automatically + aligned there. Therefore, PBUF_POOL_BUFSIZE_ALIGNED can be used here. */ +#define PBUF_POOL_BUFSIZE_ALIGNED LWIP_MEM_ALIGN_SIZE(PBUF_POOL_BUFSIZE) + +#if !TCP_QUEUE_OOSEQ || NO_SYS +#define PBUF_POOL_IS_EMPTY() +#else /* !TCP_QUEUE_OOSEQ || NO_SYS */ +/** Define this to 0 to prevent freeing ooseq pbufs when the PBUF_POOL is empty */ +#ifndef PBUF_POOL_FREE_OOSEQ +#define PBUF_POOL_FREE_OOSEQ 1 +#endif /* PBUF_POOL_FREE_OOSEQ */ + +#if PBUF_POOL_FREE_OOSEQ +#include "lwip/tcpip.h" +#define PBUF_POOL_IS_EMPTY() pbuf_pool_is_empty() +static u8_t pbuf_free_ooseq_queued; +/** + * Attempt to reclaim some memory from queued out-of-sequence TCP segments + * if we run out of pool pbufs. It's better to give priority to new packets + * if we're running out. + * + * This must be done in the correct thread context therefore this function + * can only be used with NO_SYS=0 and through tcpip_callback. + */ +static void +pbuf_free_ooseq(void* arg) +{ + struct tcp_pcb* pcb; + SYS_ARCH_DECL_PROTECT(old_level); + LWIP_UNUSED_ARG(arg); + + SYS_ARCH_PROTECT(old_level); + pbuf_free_ooseq_queued = 0; + SYS_ARCH_UNPROTECT(old_level); + + for (pcb = tcp_active_pcbs; NULL != pcb; pcb = pcb->next) { + if (NULL != pcb->ooseq) { + /** Free the ooseq pbufs of one PCB only */ + LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free_ooseq: freeing out-of-sequence pbufs\n")); + tcp_segs_free(pcb->ooseq); + pcb->ooseq = NULL; + return; + } + } +} + +/** Queue a call to pbuf_free_ooseq if not already queued. */ +static void +pbuf_pool_is_empty(void) +{ + u8_t queued; + SYS_ARCH_DECL_PROTECT(old_level); + + SYS_ARCH_PROTECT(old_level); + queued = pbuf_free_ooseq_queued; + pbuf_free_ooseq_queued = 1; + SYS_ARCH_UNPROTECT(old_level); + + if(!queued) { + /* queue a call to pbuf_free_ooseq if not already queued */ + if(tcpip_callback_with_block(pbuf_free_ooseq, NULL, 0) != ERR_OK) { + SYS_ARCH_PROTECT(old_level); + pbuf_free_ooseq_queued = 0; + SYS_ARCH_UNPROTECT(old_level); + } + } +} +#endif /* PBUF_POOL_FREE_OOSEQ */ +#endif /* !TCP_QUEUE_OOSEQ || NO_SYS */ + +/** + * Allocates a pbuf of the given type (possibly a chain for PBUF_POOL type). + * + * The actual memory allocated for the pbuf is determined by the + * layer at which the pbuf is allocated and the requested size + * (from the size parameter). + * + * @param layer flag to define header size + * @param length size of the pbuf's payload + * @param type this parameter decides how and where the pbuf + * should be allocated as follows: + * + * - PBUF_RAM: buffer memory for pbuf is allocated as one large + * chunk. This includes protocol headers as well. + * - PBUF_ROM: no buffer memory is allocated for the pbuf, even for + * protocol headers. Additional headers must be prepended + * by allocating another pbuf and chain in to the front of + * the ROM pbuf. It is assumed that the memory used is really + * similar to ROM in that it is immutable and will not be + * changed. Memory which is dynamic should generally not + * be attached to PBUF_ROM pbufs. Use PBUF_REF instead. + * - PBUF_REF: no buffer memory is allocated for the pbuf, even for + * protocol headers. It is assumed that the pbuf is only + * being used in a single thread. If the pbuf gets queued, + * then pbuf_take should be called to copy the buffer. + * - PBUF_POOL: the pbuf is allocated as a pbuf chain, with pbufs from + * the pbuf pool that is allocated during pbuf_init(). + * + * @return the allocated pbuf. If multiple pbufs where allocated, this + * is the first pbuf of a pbuf chain. + */ +struct pbuf * +pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type) +{ + struct pbuf *p, *q, *r; + u16_t offset; + s32_t rem_len; /* remaining length */ + LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc(length=%"U16_F")\n", length)); + + /* determine header offset */ + offset = 0; + switch (layer) { + case PBUF_TRANSPORT: + /* add room for transport (often TCP) layer header */ + offset += PBUF_TRANSPORT_HLEN; + /* FALLTHROUGH */ + case PBUF_IP: + /* add room for IP layer header */ + offset += PBUF_IP_HLEN; + /* FALLTHROUGH */ + case PBUF_LINK: + /* add room for link layer header */ + offset += PBUF_LINK_HLEN; + break; + case PBUF_RAW: + break; + default: + LWIP_ASSERT("pbuf_alloc: bad pbuf layer", 0); + return NULL; + } + + switch (type) { + case PBUF_POOL: + /* allocate head of pbuf chain into p */ + p = memp_malloc(MEMP_PBUF_POOL); + LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc: allocated pbuf %p\n", (void *)p)); + if (p == NULL) { + PBUF_POOL_IS_EMPTY(); + return NULL; + } + p->type = type; + p->next = NULL; + + /* make the payload pointer point 'offset' bytes into pbuf data memory */ + p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + (SIZEOF_STRUCT_PBUF + offset))); + LWIP_ASSERT("pbuf_alloc: pbuf p->payload properly aligned", + ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0); + /* the total length of the pbuf chain is the requested size */ + p->tot_len = length; + /* set the length of the first pbuf in the chain */ + p->len = LWIP_MIN(length, PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset)); + LWIP_ASSERT("check p->payload + p->len does not overflow pbuf", + ((u8_t*)p->payload + p->len <= + (u8_t*)p + SIZEOF_STRUCT_PBUF + PBUF_POOL_BUFSIZE_ALIGNED)); + LWIP_ASSERT("PBUF_POOL_BUFSIZE must be bigger than MEM_ALIGNMENT", + (PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset)) > 0 ); + /* set reference count (needed here in case we fail) */ + p->ref = 1; + + /* now allocate the tail of the pbuf chain */ + + /* remember first pbuf for linkage in next iteration */ + r = p; + /* remaining length to be allocated */ + rem_len = length - p->len; + /* any remaining pbufs to be allocated? */ + while (rem_len > 0) { + q = memp_malloc(MEMP_PBUF_POOL); + if (q == NULL) { + PBUF_POOL_IS_EMPTY(); + /* free chain so far allocated */ + pbuf_free(p); + /* bail out unsuccesfully */ + return NULL; + } + q->type = type; + q->flags = 0; + q->next = NULL; + /* make previous pbuf point to this pbuf */ + r->next = q; + /* set total length of this pbuf and next in chain */ + LWIP_ASSERT("rem_len < max_u16_t", rem_len < 0xffff); + q->tot_len = (u16_t)rem_len; + /* this pbuf length is pool size, unless smaller sized tail */ + q->len = LWIP_MIN((u16_t)rem_len, PBUF_POOL_BUFSIZE_ALIGNED); + q->payload = (void *)((u8_t *)q + SIZEOF_STRUCT_PBUF); + LWIP_ASSERT("pbuf_alloc: pbuf q->payload properly aligned", + ((mem_ptr_t)q->payload % MEM_ALIGNMENT) == 0); + LWIP_ASSERT("check p->payload + p->len does not overflow pbuf", + ((u8_t*)p->payload + p->len <= + (u8_t*)p + SIZEOF_STRUCT_PBUF + PBUF_POOL_BUFSIZE_ALIGNED)); + q->ref = 1; + /* calculate remaining length to be allocated */ + rem_len -= q->len; + /* remember this pbuf for linkage in next iteration */ + r = q; + } + /* end of chain */ + /*r->next = NULL;*/ + + break; + case PBUF_RAM: + /* If pbuf is to be allocated in RAM, allocate memory for it. */ + p = (struct pbuf*)mem_malloc(LWIP_MEM_ALIGN_SIZE(SIZEOF_STRUCT_PBUF + offset) + LWIP_MEM_ALIGN_SIZE(length)); + if (p == NULL) { + return NULL; + } + /* Set up internal structure of the pbuf. */ + p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + SIZEOF_STRUCT_PBUF + offset)); + p->len = p->tot_len = length; + p->next = NULL; + p->type = type; + + LWIP_ASSERT("pbuf_alloc: pbuf->payload properly aligned", + ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0); + break; + /* pbuf references existing (non-volatile static constant) ROM payload? */ + case PBUF_ROM: + /* pbuf references existing (externally allocated) RAM payload? */ + case PBUF_REF: + /* only allocate memory for the pbuf structure */ + p = memp_malloc(MEMP_PBUF); + if (p == NULL) { + LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_LEVEL_SERIOUS, + ("pbuf_alloc: Could not allocate MEMP_PBUF for PBUF_%s.\n", + (type == PBUF_ROM) ? "ROM" : "REF")); + return NULL; + } + /* caller must set this field properly, afterwards */ + p->payload = NULL; + p->len = p->tot_len = length; + p->next = NULL; + p->type = type; + break; + default: + LWIP_ASSERT("pbuf_alloc: erroneous type", 0); + return NULL; + } + /* set reference count */ + p->ref = 1; + /* set flags */ + p->flags = 0; + LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc(length=%"U16_F") == %p\n", length, (void *)p)); + return p; +} + + +/** + * Shrink a pbuf chain to a desired length. + * + * @param p pbuf to shrink. + * @param new_len desired new length of pbuf chain + * + * Depending on the desired length, the first few pbufs in a chain might + * be skipped and left unchanged. The new last pbuf in the chain will be + * resized, and any remaining pbufs will be freed. + * + * @note If the pbuf is ROM/REF, only the ->tot_len and ->len fields are adjusted. + * @note May not be called on a packet queue. + * + * @note Despite its name, pbuf_realloc cannot grow the size of a pbuf (chain). + */ +void +pbuf_realloc(struct pbuf *p, u16_t new_len) +{ + struct pbuf *q; + u16_t rem_len; /* remaining length */ + s32_t grow; + + LWIP_ASSERT("pbuf_realloc: p != NULL", p != NULL); + LWIP_ASSERT("pbuf_realloc: sane p->type", p->type == PBUF_POOL || + p->type == PBUF_ROM || + p->type == PBUF_RAM || + p->type == PBUF_REF); + + /* desired length larger than current length? */ + if (new_len >= p->tot_len) { + /* enlarging not yet supported */ + return; + } + + /* the pbuf chain grows by (new_len - p->tot_len) bytes + * (which may be negative in case of shrinking) */ + grow = new_len - p->tot_len; + + /* first, step over any pbufs that should remain in the chain */ + rem_len = new_len; + q = p; + /* should this pbuf be kept? */ + while (rem_len > q->len) { + /* decrease remaining length by pbuf length */ + rem_len -= q->len; + /* decrease total length indicator */ + LWIP_ASSERT("grow < max_u16_t", grow < 0xffff); + q->tot_len += (u16_t)grow; + /* proceed to next pbuf in chain */ + q = q->next; + LWIP_ASSERT("pbuf_realloc: q != NULL", q != NULL); + } + /* we have now reached the new last pbuf (in q) */ + /* rem_len == desired length for pbuf q */ + + /* shrink allocated memory for PBUF_RAM */ + /* (other types merely adjust their length fields */ + if ((q->type == PBUF_RAM) && (rem_len != q->len)) { + /* reallocate and adjust the length of the pbuf that will be split */ + q = mem_realloc(q, (u8_t *)q->payload - (u8_t *)q + rem_len); + LWIP_ASSERT("mem_realloc give q == NULL", q != NULL); + } + /* adjust length fields for new last pbuf */ + q->len = rem_len; + q->tot_len = q->len; + + /* any remaining pbufs in chain? */ + if (q->next != NULL) { + /* free remaining pbufs in chain */ + pbuf_free(q->next); + } + /* q is last packet in chain */ + q->next = NULL; + +} + +/** + * Adjusts the payload pointer to hide or reveal headers in the payload. + * + * Adjusts the ->payload pointer so that space for a header + * (dis)appears in the pbuf payload. + * + * The ->payload, ->tot_len and ->len fields are adjusted. + * + * @param p pbuf to change the header size. + * @param header_size_increment Number of bytes to increment header size which + * increases the size of the pbuf. New space is on the front. + * (Using a negative value decreases the header size.) + * If hdr_size_inc is 0, this function does nothing and returns succesful. + * + * PBUF_ROM and PBUF_REF type buffers cannot have their sizes increased, so + * the call will fail. A check is made that the increase in header size does + * not move the payload pointer in front of the start of the buffer. + * @return non-zero on failure, zero on success. + * + */ +u8_t +pbuf_header(struct pbuf *p, s16_t header_size_increment) +{ + u16_t type; + void *payload; + u16_t increment_magnitude; + + LWIP_ASSERT("p != NULL", p != NULL); + if ((header_size_increment == 0) || (p == NULL)) + return 0; + + if (header_size_increment < 0){ + increment_magnitude = -header_size_increment; + /* Check that we aren't going to move off the end of the pbuf */ + LWIP_ERROR("increment_magnitude <= p->len", (increment_magnitude <= p->len), return 1;); + } else { + increment_magnitude = header_size_increment; +#if 0 + /* Can't assert these as some callers speculatively call + pbuf_header() to see if it's OK. Will return 1 below instead. */ + /* Check that we've got the correct type of pbuf to work with */ + LWIP_ASSERT("p->type == PBUF_RAM || p->type == PBUF_POOL", + p->type == PBUF_RAM || p->type == PBUF_POOL); + /* Check that we aren't going to move off the beginning of the pbuf */ + LWIP_ASSERT("p->payload - increment_magnitude >= p + SIZEOF_STRUCT_PBUF", + (u8_t *)p->payload - increment_magnitude >= (u8_t *)p + SIZEOF_STRUCT_PBUF); +#endif + } + + type = p->type; + /* remember current payload pointer */ + payload = p->payload; + + /* pbuf types containing payloads? */ + if (type == PBUF_RAM || type == PBUF_POOL) { + /* set new payload pointer */ + p->payload = (u8_t *)p->payload - header_size_increment; + /* boundary check fails? */ + if ((u8_t *)p->payload < (u8_t *)p + SIZEOF_STRUCT_PBUF) { + LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_LEVEL_SERIOUS, + ("pbuf_header: failed as %p < %p (not enough space for new header size)\n", + (void *)p->payload, (void *)(p + 1))); + /* restore old payload pointer */ + p->payload = payload; + /* bail out unsuccesfully */ + return 1; + } + /* pbuf types refering to external payloads? */ + } else if (type == PBUF_REF || type == PBUF_ROM) { + /* hide a header in the payload? */ + if ((header_size_increment < 0) && (increment_magnitude <= p->len)) { + /* increase payload pointer */ + p->payload = (u8_t *)p->payload - header_size_increment; + } else { + /* cannot expand payload to front (yet!) + * bail out unsuccesfully */ + return 1; + } + } + else { + /* Unknown type */ + LWIP_ASSERT("bad pbuf type", 0); + return 1; + } + /* modify pbuf length fields */ + p->len += header_size_increment; + p->tot_len += header_size_increment; + + LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_header: old %p new %p (%"S16_F")\n", + (void *)payload, (void *)p->payload, header_size_increment)); + + return 0; +} + +/** + * Dereference a pbuf chain or queue and deallocate any no-longer-used + * pbufs at the head of this chain or queue. + * + * Decrements the pbuf reference count. If it reaches zero, the pbuf is + * deallocated. + * + * For a pbuf chain, this is repeated for each pbuf in the chain, + * up to the first pbuf which has a non-zero reference count after + * decrementing. So, when all reference counts are one, the whole + * chain is free'd. + * + * @param p The pbuf (chain) to be dereferenced. + * + * @return the number of pbufs that were de-allocated + * from the head of the chain. + * + * @note MUST NOT be called on a packet queue (Not verified to work yet). + * @note the reference counter of a pbuf equals the number of pointers + * that refer to the pbuf (or into the pbuf). + * + * @internal examples: + * + * Assuming existing chains a->b->c with the following reference + * counts, calling pbuf_free(a) results in: + * + * 1->2->3 becomes ...1->3 + * 3->3->3 becomes 2->3->3 + * 1->1->2 becomes ......1 + * 2->1->1 becomes 1->1->1 + * 1->1->1 becomes ....... + * + */ +u8_t +pbuf_free(struct pbuf *p) +{ + u16_t type; + struct pbuf *q; + u8_t count; + + if (p == NULL) { + LWIP_ASSERT("p != NULL", p != NULL); + /* if assertions are disabled, proceed with debug output */ + LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_LEVEL_SERIOUS, + ("pbuf_free(p == NULL) was called.\n")); + return 0; + } + LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free(%p)\n", (void *)p)); + + PERF_START; + + LWIP_ASSERT("pbuf_free: sane type", + p->type == PBUF_RAM || p->type == PBUF_ROM || + p->type == PBUF_REF || p->type == PBUF_POOL); + + count = 0; + /* de-allocate all consecutive pbufs from the head of the chain that + * obtain a zero reference count after decrementing*/ + while (p != NULL) { + u16_t ref; + SYS_ARCH_DECL_PROTECT(old_level); + /* Since decrementing ref cannot be guaranteed to be a single machine operation + * we must protect it. We put the new ref into a local variable to prevent + * further protection. */ + SYS_ARCH_PROTECT(old_level); + /* all pbufs in a chain are referenced at least once */ + LWIP_ASSERT("pbuf_free: p->ref > 0", p->ref > 0); + /* decrease reference count (number of pointers to pbuf) */ + ref = --(p->ref); + SYS_ARCH_UNPROTECT(old_level); + /* this pbuf is no longer referenced to? */ + if (ref == 0) { + /* remember next pbuf in chain for next iteration */ + q = p->next; + LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free: deallocating %p\n", (void *)p)); + type = p->type; + /* is this a pbuf from the pool? */ + if (type == PBUF_POOL) { + memp_free(MEMP_PBUF_POOL, p); + /* is this a ROM or RAM referencing pbuf? */ + } else if (type == PBUF_ROM || type == PBUF_REF) { + memp_free(MEMP_PBUF, p); + /* type == PBUF_RAM */ + } else { + mem_free(p); + } + count++; + /* proceed to next pbuf */ + p = q; + /* p->ref > 0, this pbuf is still referenced to */ + /* (and so the remaining pbufs in chain as well) */ + } else { + LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free: %p has ref %"U16_F", ending here.\n", (void *)p, ref)); + /* stop walking through the chain */ + p = NULL; + } + } + PERF_STOP("pbuf_free"); + /* return number of de-allocated pbufs */ + return count; +} + +/** + * Count number of pbufs in a chain + * + * @param p first pbuf of chain + * @return the number of pbufs in a chain + */ + +u8_t +pbuf_clen(struct pbuf *p) +{ + u8_t len; + + len = 0; + while (p != NULL) { + ++len; + p = p->next; + } + return len; +} + +/** + * Increment the reference count of the pbuf. + * + * @param p pbuf to increase reference counter of + * + */ +void +pbuf_ref(struct pbuf *p) +{ + SYS_ARCH_DECL_PROTECT(old_level); + /* pbuf given? */ + if (p != NULL) { + SYS_ARCH_PROTECT(old_level); + ++(p->ref); + SYS_ARCH_UNPROTECT(old_level); + } +} + +/** + * Concatenate two pbufs (each may be a pbuf chain) and take over + * the caller's reference of the tail pbuf. + * + * @note The caller MAY NOT reference the tail pbuf afterwards. + * Use pbuf_chain() for that purpose. + * + * @see pbuf_chain() + */ + +void +pbuf_cat(struct pbuf *h, struct pbuf *t) +{ + struct pbuf *p; + + LWIP_ERROR("(h != NULL) && (t != NULL) (programmer violates API)", + ((h != NULL) && (t != NULL)), return;); + + /* proceed to last pbuf of chain */ + for (p = h; p->next != NULL; p = p->next) { + /* add total length of second chain to all totals of first chain */ + p->tot_len += t->tot_len; + } + /* { p is last pbuf of first h chain, p->next == NULL } */ + LWIP_ASSERT("p->tot_len == p->len (of last pbuf in chain)", p->tot_len == p->len); + LWIP_ASSERT("p->next == NULL", p->next == NULL); + /* add total length of second chain to last pbuf total of first chain */ + p->tot_len += t->tot_len; + /* chain last pbuf of head (p) with first of tail (t) */ + p->next = t; + /* p->next now references t, but the caller will drop its reference to t, + * so netto there is no change to the reference count of t. + */ +} + +/** + * Chain two pbufs (or pbuf chains) together. + * + * The caller MUST call pbuf_free(t) once it has stopped + * using it. Use pbuf_cat() instead if you no longer use t. + * + * @param h head pbuf (chain) + * @param t tail pbuf (chain) + * @note The pbufs MUST belong to the same packet. + * @note MAY NOT be called on a packet queue. + * + * The ->tot_len fields of all pbufs of the head chain are adjusted. + * The ->next field of the last pbuf of the head chain is adjusted. + * The ->ref field of the first pbuf of the tail chain is adjusted. + * + */ +void +pbuf_chain(struct pbuf *h, struct pbuf *t) +{ + pbuf_cat(h, t); + /* t is now referenced by h */ + pbuf_ref(t); + LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_chain: %p references %p\n", (void *)h, (void *)t)); +} + +/** + * Dechains the first pbuf from its succeeding pbufs in the chain. + * + * Makes p->tot_len field equal to p->len. + * @param p pbuf to dechain + * @return remainder of the pbuf chain, or NULL if it was de-allocated. + * @note May not be called on a packet queue. + */ +struct pbuf * +pbuf_dechain(struct pbuf *p) +{ + struct pbuf *q; + u8_t tail_gone = 1; + /* tail */ + q = p->next; + /* pbuf has successor in chain? */ + if (q != NULL) { + /* assert tot_len invariant: (p->tot_len == p->len + (p->next? p->next->tot_len: 0) */ + LWIP_ASSERT("p->tot_len == p->len + q->tot_len", q->tot_len == p->tot_len - p->len); + /* enforce invariant if assertion is disabled */ + q->tot_len = p->tot_len - p->len; + /* decouple pbuf from remainder */ + p->next = NULL; + /* total length of pbuf p is its own length only */ + p->tot_len = p->len; + /* q is no longer referenced by p, free it */ + LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_dechain: unreferencing %p\n", (void *)q)); + tail_gone = pbuf_free(q); + if (tail_gone > 0) { + LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, + ("pbuf_dechain: deallocated %p (as it is no longer referenced)\n", (void *)q)); + } + /* return remaining tail or NULL if deallocated */ + } + /* assert tot_len invariant: (p->tot_len == p->len + (p->next? p->next->tot_len: 0) */ + LWIP_ASSERT("p->tot_len == p->len", p->tot_len == p->len); + return ((tail_gone > 0) ? NULL : q); +} + +/** + * + * Create PBUF_RAM copies of pbufs. + * + * Used to queue packets on behalf of the lwIP stack, such as + * ARP based queueing. + * + * @note You MUST explicitly use p = pbuf_take(p); + * + * @note Only one packet is copied, no packet queue! + * + * @param p_to pbuf destination of the copy + * @param p_from pbuf source of the copy + * + * @return ERR_OK if pbuf was copied + * ERR_ARG if one of the pbufs is NULL or p_to is not big + * enough to hold p_from + */ +err_t +pbuf_copy(struct pbuf *p_to, struct pbuf *p_from) +{ + u16_t offset_to=0, offset_from=0, len; + + LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_copy(%p, %p)\n", + (void*)p_to, (void*)p_from)); + + /* is the target big enough to hold the source? */ + LWIP_ERROR("pbuf_copy: target not big enough to hold source", ((p_to != NULL) && + (p_from != NULL) && (p_to->tot_len >= p_from->tot_len)), return ERR_ARG;); + + /* iterate through pbuf chain */ + do + { + LWIP_ASSERT("p_to != NULL", p_to != NULL); + /* copy one part of the original chain */ + if ((p_to->len - offset_to) >= (p_from->len - offset_from)) { + /* complete current p_from fits into current p_to */ + len = p_from->len - offset_from; + } else { + /* current p_from does not fit into current p_to */ + len = p_to->len - offset_to; + } + MEMCPY((u8_t*)p_to->payload + offset_to, (u8_t*)p_from->payload + offset_from, len); + offset_to += len; + offset_from += len; + LWIP_ASSERT("offset_to <= p_to->len", offset_to <= p_to->len); + if (offset_to == p_to->len) { + /* on to next p_to (if any) */ + offset_to = 0; + p_to = p_to->next; + } + LWIP_ASSERT("offset_from <= p_from->len", offset_from <= p_from->len); + if (offset_from >= p_from->len) { + /* on to next p_from (if any) */ + offset_from = 0; + p_from = p_from->next; + } + + if((p_from != NULL) && (p_from->len == p_from->tot_len)) { + /* don't copy more than one packet! */ + LWIP_ERROR("pbuf_copy() does not allow packet queues!\n", + (p_from->next == NULL), return ERR_VAL;); + } + if((p_to != NULL) && (p_to->len == p_to->tot_len)) { + /* don't copy more than one packet! */ + LWIP_ERROR("pbuf_copy() does not allow packet queues!\n", + (p_to->next == NULL), return ERR_VAL;); + } + } while (p_from); + LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_copy: end of chain reached.\n")); + return ERR_OK; +} + +/** + * Copy (part of) the contents of a packet buffer + * to an application supplied buffer. + * + * @param buf the pbuf from which to copy data + * @param dataptr the application supplied buffer + * @param len length of data to copy (dataptr must be big enough). No more + * than buf->tot_len will be copied, irrespective of len + * @param offset offset into the packet buffer from where to begin copying len bytes + * @return the number of bytes copied, or 0 on failure + */ +u16_t +pbuf_copy_partial(struct pbuf *buf, void *dataptr, u16_t len, u16_t offset) +{ + struct pbuf *p; + u16_t left; + u16_t buf_copy_len; + u16_t copied_total = 0; + + LWIP_ERROR("pbuf_copy_partial: invalid buf", (buf != NULL), return 0;); + LWIP_ERROR("pbuf_copy_partial: invalid dataptr", (dataptr != NULL), return 0;); + + left = 0; + + if((buf == NULL) || (dataptr == NULL)) { + return 0; + } + + /* Note some systems use byte copy if dataptr or one of the pbuf payload pointers are unaligned. */ + for(p = buf; len != 0 && p != NULL; p = p->next) { + if ((offset != 0) && (offset >= p->len)) { + /* don't copy from this buffer -> on to the next */ + offset -= p->len; + } else { + /* copy from this buffer. maybe only partially. */ + buf_copy_len = p->len - offset; + if (buf_copy_len > len) + buf_copy_len = len; + /* copy the necessary parts of the buffer */ + MEMCPY(&((char*)dataptr)[left], &((char*)p->payload)[offset], buf_copy_len); + copied_total += buf_copy_len; + left += buf_copy_len; + len -= buf_copy_len; + offset = 0; + } + } + return copied_total; +} + +/** + * Copy application supplied data into a pbuf. + * This function can only be used to copy the equivalent of buf->tot_len data. + * + * @param buf pbuf to fill with data + * @param dataptr application supplied data buffer + * @param len length of the application supplied data buffer + * + * @return ERR_OK if successful, ERR_MEM if the pbuf is not big enough + */ +err_t +pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len) +{ + struct pbuf *p; + u16_t buf_copy_len; + u16_t total_copy_len = len; + u16_t copied_total = 0; + + LWIP_ERROR("pbuf_take: invalid buf", (buf != NULL), return 0;); + LWIP_ERROR("pbuf_take: invalid dataptr", (dataptr != NULL), return 0;); + + if ((buf == NULL) || (dataptr == NULL) || (buf->tot_len < len)) { + return ERR_ARG; + } + + /* Note some systems use byte copy if dataptr or one of the pbuf payload pointers are unaligned. */ + for(p = buf; total_copy_len != 0; p = p->next) { + LWIP_ASSERT("pbuf_take: invalid pbuf", p != NULL); + buf_copy_len = total_copy_len; + if (buf_copy_len > p->len) { + /* this pbuf cannot hold all remaining data */ + buf_copy_len = p->len; + } + /* copy the necessary parts of the buffer */ + MEMCPY(p->payload, &((char*)dataptr)[copied_total], buf_copy_len); + total_copy_len -= buf_copy_len; + copied_total += buf_copy_len; + } + LWIP_ASSERT("did not copy all data", total_copy_len == 0 && copied_total == len); + return ERR_OK; +} + +/** + * Creates a single pbuf out of a queue of pbufs. + * + * @remark: The source pbuf 'p' is not freed by this function because that can + * be illegal in some places! + * + * @param p the source pbuf + * @param layer pbuf_layer of the new pbuf + * + * @return a new, single pbuf (p->next is NULL) + * or the old pbuf if allocation fails + */ +struct pbuf* +pbuf_coalesce(struct pbuf *p, pbuf_layer layer) +{ + struct pbuf *q; + err_t err; + if (p->next == NULL) { + return p; + } + q = pbuf_alloc(layer, p->tot_len, PBUF_RAM); + if (q == NULL) { + /* @todo: what do we do now? */ + return p; + } + err = pbuf_copy(q, p); + LWIP_ASSERT("pbuf_copy failed", err == ERR_OK); + pbuf_free(p); + return q; +} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/raw.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/raw.c new file mode 100644 index 0000000..6966bbc --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/raw.c @@ -0,0 +1,355 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/** + * @file + * Implementation of raw protocol PCBs for low-level handling of + * different types of protocols besides (or overriding) those + * already available in lwIP. + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "lwip/opt.h" + +#if LWIP_RAW /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/def.h" +#include "lwip/memp.h" +#include "lwip/inet.h" +#include "lwip/ip_addr.h" +#include "lwip/netif.h" +#include "lwip/raw.h" +#include "lwip/stats.h" +#include "lwip/snmp.h" +#include "arch/perf.h" + +#include + +/** The list of RAW PCBs */ +static struct raw_pcb *raw_pcbs; + +/** + * Determine if in incoming IP packet is covered by a RAW PCB + * and if so, pass it to a user-provided receive callback function. + * + * Given an incoming IP datagram (as a chain of pbufs) this function + * finds a corresponding RAW PCB and calls the corresponding receive + * callback function. + * + * @param p pbuf to be demultiplexed to a RAW PCB. + * @param inp network interface on which the datagram was received. + * @return - 1 if the packet has been eaten by a RAW PCB receive + * callback function. The caller MAY NOT not reference the + * packet any longer, and MAY NOT call pbuf_free(). + * @return - 0 if packet is not eaten (pbuf is still referenced by the + * caller). + * + */ +u8_t +raw_input(struct pbuf *p, struct netif *inp) +{ + struct raw_pcb *pcb, *prev; + struct ip_hdr *iphdr; + s16_t proto; + u8_t eaten = 0; + + LWIP_UNUSED_ARG(inp); + + iphdr = p->payload; + proto = IPH_PROTO(iphdr); + + prev = NULL; + pcb = raw_pcbs; + /* loop through all raw pcbs until the packet is eaten by one */ + /* this allows multiple pcbs to match against the packet by design */ + while ((eaten == 0) && (pcb != NULL)) { + if (pcb->protocol == proto) { +#if IP_SOF_BROADCAST_RECV + /* broadcast filter? */ + if ((pcb->so_options & SOF_BROADCAST) || !ip_addr_isbroadcast(&(iphdr->dest), inp)) +#endif /* IP_SOF_BROADCAST_RECV */ + { + /* receive callback function available? */ + if (pcb->recv != NULL) { + /* the receive callback function did not eat the packet? */ + if (pcb->recv(pcb->recv_arg, pcb, p, &(iphdr->src)) != 0) { + /* receive function ate the packet */ + p = NULL; + eaten = 1; + if (prev != NULL) { + /* move the pcb to the front of raw_pcbs so that is + found faster next time */ + prev->next = pcb->next; + pcb->next = raw_pcbs; + raw_pcbs = pcb; + } + } + } + /* no receive callback function was set for this raw PCB */ + } + /* drop the packet */ + } + prev = pcb; + pcb = pcb->next; + } + return eaten; +} + +/** + * Bind a RAW PCB. + * + * @param pcb RAW PCB to be bound with a local address ipaddr. + * @param ipaddr local IP address to bind with. Use IP_ADDR_ANY to + * bind to all local interfaces. + * + * @return lwIP error code. + * - ERR_OK. Successful. No error occured. + * - ERR_USE. The specified IP address is already bound to by + * another RAW PCB. + * + * @see raw_disconnect() + */ +err_t +raw_bind(struct raw_pcb *pcb, struct ip_addr *ipaddr) +{ + ip_addr_set(&pcb->local_ip, ipaddr); + return ERR_OK; +} + +/** + * Connect an RAW PCB. This function is required by upper layers + * of lwip. Using the raw api you could use raw_sendto() instead + * + * This will associate the RAW PCB with the remote address. + * + * @param pcb RAW PCB to be connected with remote address ipaddr and port. + * @param ipaddr remote IP address to connect with. + * + * @return lwIP error code + * + * @see raw_disconnect() and raw_sendto() + */ +err_t +raw_connect(struct raw_pcb *pcb, struct ip_addr *ipaddr) +{ + ip_addr_set(&pcb->remote_ip, ipaddr); + return ERR_OK; +} + + +/** + * Set the callback function for received packets that match the + * raw PCB's protocol and binding. + * + * The callback function MUST either + * - eat the packet by calling pbuf_free() and returning non-zero. The + * packet will not be passed to other raw PCBs or other protocol layers. + * - not free the packet, and return zero. The packet will be matched + * against further PCBs and/or forwarded to another protocol layers. + * + * @return non-zero if the packet was free()d, zero if the packet remains + * available for others. + */ +void +raw_recv(struct raw_pcb *pcb, + u8_t (* recv)(void *arg, struct raw_pcb *upcb, struct pbuf *p, + struct ip_addr *addr), + void *recv_arg) +{ + /* remember recv() callback and user data */ + pcb->recv = recv; + pcb->recv_arg = recv_arg; +} + +/** + * Send the raw IP packet to the given address. Note that actually you cannot + * modify the IP headers (this is inconsistent with the receive callback where + * you actually get the IP headers), you can only specify the IP payload here. + * It requires some more changes in lwIP. (there will be a raw_send() function + * then.) + * + * @param pcb the raw pcb which to send + * @param p the IP payload to send + * @param ipaddr the destination address of the IP packet + * + */ +err_t +raw_sendto(struct raw_pcb *pcb, struct pbuf *p, struct ip_addr *ipaddr) +{ + err_t err; + struct netif *netif; + struct ip_addr *src_ip; + struct pbuf *q; /* q will be sent down the stack */ + + LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_TRACE, ("raw_sendto\n")); + + /* not enough space to add an IP header to first pbuf in given p chain? */ + if (pbuf_header(p, IP_HLEN)) { + /* allocate header in new pbuf */ + q = pbuf_alloc(PBUF_IP, 0, PBUF_RAM); + /* new header pbuf could not be allocated? */ + if (q == NULL) { + LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("raw_sendto: could not allocate header\n")); + return ERR_MEM; + } + /* chain header q in front of given pbuf p */ + pbuf_chain(q, p); + /* { first pbuf q points to header pbuf } */ + LWIP_DEBUGF(RAW_DEBUG, ("raw_sendto: added header pbuf %p before given pbuf %p\n", (void *)q, (void *)p)); + } else { + /* first pbuf q equals given pbuf */ + q = p; + if(pbuf_header(q, -IP_HLEN)) { + LWIP_ASSERT("Can't restore header we just removed!", 0); + return ERR_MEM; + } + } + + if ((netif = ip_route(ipaddr)) == NULL) { + LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_LEVEL_WARNING, ("raw_sendto: No route to 0x%"X32_F"\n", ipaddr->addr)); + /* free any temporary header pbuf allocated by pbuf_header() */ + if (q != p) { + pbuf_free(q); + } + return ERR_RTE; + } + +#if IP_SOF_BROADCAST + /* broadcast filter? */ + if ( ((pcb->so_options & SOF_BROADCAST) == 0) && ip_addr_isbroadcast(ipaddr, netif) ) { + LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_LEVEL_WARNING, ("raw_sendto: SOF_BROADCAST not enabled on pcb %p\n", (void *)pcb)); + /* free any temporary header pbuf allocated by pbuf_header() */ + if (q != p) { + pbuf_free(q); + } + return ERR_VAL; + } +#endif /* IP_SOF_BROADCAST */ + + if (ip_addr_isany(&pcb->local_ip)) { + /* use outgoing network interface IP address as source address */ + src_ip = &(netif->ip_addr); + } else { + /* use RAW PCB local IP address as source address */ + src_ip = &(pcb->local_ip); + } + +#if LWIP_NETIF_HWADDRHINT + netif->addr_hint = &(pcb->addr_hint); +#endif /* LWIP_NETIF_HWADDRHINT*/ + err = ip_output_if (q, src_ip, ipaddr, pcb->ttl, pcb->tos, pcb->protocol, netif); +#if LWIP_NETIF_HWADDRHINT + netif->addr_hint = NULL; +#endif /* LWIP_NETIF_HWADDRHINT*/ + + /* did we chain a header earlier? */ + if (q != p) { + /* free the header */ + pbuf_free(q); + } + return err; +} + +/** + * Send the raw IP packet to the address given by raw_connect() + * + * @param pcb the raw pcb which to send + * @param p the IP payload to send + * + */ +err_t +raw_send(struct raw_pcb *pcb, struct pbuf *p) +{ + return raw_sendto(pcb, p, &pcb->remote_ip); +} + +/** + * Remove an RAW PCB. + * + * @param pcb RAW PCB to be removed. The PCB is removed from the list of + * RAW PCB's and the data structure is freed from memory. + * + * @see raw_new() + */ +void +raw_remove(struct raw_pcb *pcb) +{ + struct raw_pcb *pcb2; + /* pcb to be removed is first in list? */ + if (raw_pcbs == pcb) { + /* make list start at 2nd pcb */ + raw_pcbs = raw_pcbs->next; + /* pcb not 1st in list */ + } else { + for(pcb2 = raw_pcbs; pcb2 != NULL; pcb2 = pcb2->next) { + /* find pcb in raw_pcbs list */ + if (pcb2->next != NULL && pcb2->next == pcb) { + /* remove pcb from list */ + pcb2->next = pcb->next; + } + } + } + memp_free(MEMP_RAW_PCB, pcb); +} + +/** + * Create a RAW PCB. + * + * @return The RAW PCB which was created. NULL if the PCB data structure + * could not be allocated. + * + * @param proto the protocol number of the IPs payload (e.g. IP_PROTO_ICMP) + * + * @see raw_remove() + */ +struct raw_pcb * +raw_new(u8_t proto) { + struct raw_pcb *pcb; + + LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_TRACE, ("raw_new\n")); + + pcb = memp_malloc(MEMP_RAW_PCB); + /* could allocate RAW PCB? */ + if (pcb != NULL) { + /* initialize PCB to all zeroes */ + memset(pcb, 0, sizeof(struct raw_pcb)); + pcb->protocol = proto; + pcb->ttl = RAW_TTL; + pcb->next = raw_pcbs; + raw_pcbs = pcb; + } + return pcb; +} + +#endif /* LWIP_RAW */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/stats.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/stats.c new file mode 100644 index 0000000..4299a94 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/stats.c @@ -0,0 +1,151 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/** + * @file + * Statistics module + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "lwip/opt.h" + +#if LWIP_STATS /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/def.h" +#include "lwip/stats.h" +#include "lwip/mem.h" + +#include + +struct stats_ lwip_stats; + +#if LWIP_STATS_DISPLAY +void +stats_display_proto(struct stats_proto *proto, char *name) +{ + LWIP_PLATFORM_DIAG(("\n%s\n\t", name)); + LWIP_PLATFORM_DIAG(("xmit: %"STAT_COUNTER_F"\n\t", proto->xmit)); + LWIP_PLATFORM_DIAG(("recv: %"STAT_COUNTER_F"\n\t", proto->recv)); + LWIP_PLATFORM_DIAG(("fw: %"STAT_COUNTER_F"\n\t", proto->fw)); + LWIP_PLATFORM_DIAG(("drop: %"STAT_COUNTER_F"\n\t", proto->drop)); + LWIP_PLATFORM_DIAG(("chkerr: %"STAT_COUNTER_F"\n\t", proto->chkerr)); + LWIP_PLATFORM_DIAG(("lenerr: %"STAT_COUNTER_F"\n\t", proto->lenerr)); + LWIP_PLATFORM_DIAG(("memerr: %"STAT_COUNTER_F"\n\t", proto->memerr)); + LWIP_PLATFORM_DIAG(("rterr: %"STAT_COUNTER_F"\n\t", proto->rterr)); + LWIP_PLATFORM_DIAG(("proterr: %"STAT_COUNTER_F"\n\t", proto->proterr)); + LWIP_PLATFORM_DIAG(("opterr: %"STAT_COUNTER_F"\n\t", proto->opterr)); + LWIP_PLATFORM_DIAG(("err: %"STAT_COUNTER_F"\n\t", proto->err)); + LWIP_PLATFORM_DIAG(("cachehit: %"STAT_COUNTER_F"\n", proto->cachehit)); +} + +#if IGMP_STATS +void +stats_display_igmp(struct stats_igmp *igmp) +{ + LWIP_PLATFORM_DIAG(("\nIGMP\n\t")); + LWIP_PLATFORM_DIAG(("lenerr: %"STAT_COUNTER_F"\n\t", igmp->lenerr)); + LWIP_PLATFORM_DIAG(("chkerr: %"STAT_COUNTER_F"\n\t", igmp->chkerr)); + LWIP_PLATFORM_DIAG(("v1_rxed: %"STAT_COUNTER_F"\n\t", igmp->v1_rxed)); + LWIP_PLATFORM_DIAG(("join_sent: %"STAT_COUNTER_F"\n\t", igmp->join_sent)); + LWIP_PLATFORM_DIAG(("leave_sent: %"STAT_COUNTER_F"\n\t", igmp->leave_sent)); + LWIP_PLATFORM_DIAG(("unicast_query: %"STAT_COUNTER_F"\n\t", igmp->unicast_query)); + LWIP_PLATFORM_DIAG(("report_sent: %"STAT_COUNTER_F"\n\t", igmp->report_sent)); + LWIP_PLATFORM_DIAG(("report_rxed: %"STAT_COUNTER_F"\n\t", igmp->report_rxed)); + LWIP_PLATFORM_DIAG(("group_query_rxed: %"STAT_COUNTER_F"\n", igmp->group_query_rxed)); +} +#endif /* IGMP_STATS */ + +#if MEM_STATS || MEMP_STATS +void +stats_display_mem(struct stats_mem *mem, char *name) +{ + LWIP_PLATFORM_DIAG(("\nMEM %s\n\t", name)); + LWIP_PLATFORM_DIAG(("avail: %"U32_F"\n\t", (u32_t)mem->avail)); + LWIP_PLATFORM_DIAG(("used: %"U32_F"\n\t", (u32_t)mem->used)); + LWIP_PLATFORM_DIAG(("max: %"U32_F"\n\t", (u32_t)mem->max)); + LWIP_PLATFORM_DIAG(("err: %"U32_F"\n", (u32_t)mem->err)); +} + +#if MEMP_STATS +void +stats_display_memp(struct stats_mem *mem, int index) +{ + char * memp_names[] = { +#define LWIP_MEMPOOL(name,num,size,desc) desc, +#include "lwip/memp_std.h" + }; + if(index < MEMP_MAX) { + stats_display_mem(mem, memp_names[index]); + } +} +#endif /* MEMP_STATS */ +#endif /* MEM_STATS || MEMP_STATS */ + +#if SYS_STATS +void +stats_display_sys(struct stats_sys *sys) +{ + LWIP_PLATFORM_DIAG(("\nSYS\n\t")); + LWIP_PLATFORM_DIAG(("sem.used: %"U32_F"\n\t", (u32_t)sys->sem.used)); + LWIP_PLATFORM_DIAG(("sem.max: %"U32_F"\n\t", (u32_t)sys->sem.max)); + LWIP_PLATFORM_DIAG(("sem.err: %"U32_F"\n\t", (u32_t)sys->sem.err)); + LWIP_PLATFORM_DIAG(("mbox.used: %"U32_F"\n\t", (u32_t)sys->mbox.used)); + LWIP_PLATFORM_DIAG(("mbox.max: %"U32_F"\n\t", (u32_t)sys->mbox.max)); + LWIP_PLATFORM_DIAG(("mbox.err: %"U32_F"\n\t", (u32_t)sys->mbox.err)); +} +#endif /* SYS_STATS */ + +void +stats_display(void) +{ + s16_t i; + + LINK_STATS_DISPLAY(); + ETHARP_STATS_DISPLAY(); + IPFRAG_STATS_DISPLAY(); + IP_STATS_DISPLAY(); + IGMP_STATS_DISPLAY(); + ICMP_STATS_DISPLAY(); + UDP_STATS_DISPLAY(); + TCP_STATS_DISPLAY(); + MEM_STATS_DISPLAY(); + for (i = 0; i < MEMP_MAX; i++) { + MEMP_STATS_DISPLAY(i); + } + SYS_STATS_DISPLAY(); +} +#endif /* LWIP_STATS_DISPLAY */ + +#endif /* LWIP_STATS */ + diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/tcp.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/tcp.c new file mode 100644 index 0000000..c588d21 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/tcp.c @@ -0,0 +1,1463 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/** + * @file + * Transmission Control Protocol for IP + * + * This file contains common functions for the TCP implementation, such as functinos + * for manipulating the data structures and the TCP timer functions. TCP functions + * related to input and output is found in tcp_in.c and tcp_out.c respectively. + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "lwip/opt.h" + +#if LWIP_TCP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/def.h" +#include "lwip/mem.h" +#include "lwip/memp.h" +#include "lwip/snmp.h" +#include "lwip/tcp.h" +#include "lwip/debug.h" +#include "lwip/stats.h" + +#include + +const char *tcp_state_str[] = { + "CLOSED", + "LISTEN", + "SYN_SENT", + "SYN_RCVD", + "ESTABLISHED", + "FIN_WAIT_1", + "FIN_WAIT_2", + "CLOSE_WAIT", + "CLOSING", + "LAST_ACK", + "TIME_WAIT" +}; + +/* Incremented every coarse grained timer shot (typically every 500 ms). */ +u32_t tcp_ticks; +const u8_t tcp_backoff[13] = + { 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7}; + /* Times per slowtmr hits */ +const u8_t tcp_persist_backoff[7] = { 3, 6, 12, 24, 48, 96, 120 }; + +/* The TCP PCB lists. */ + +/** List of all TCP PCBs bound but not yet (connected || listening) */ +struct tcp_pcb *tcp_bound_pcbs; +/** List of all TCP PCBs in LISTEN state */ +union tcp_listen_pcbs_t tcp_listen_pcbs; +/** List of all TCP PCBs that are in a state in which + * they accept or send data. */ +struct tcp_pcb *tcp_active_pcbs; +/** List of all TCP PCBs in TIME-WAIT state */ +struct tcp_pcb *tcp_tw_pcbs; + +struct tcp_pcb *tcp_tmp_pcb; + +static u8_t tcp_timer; +static u16_t tcp_new_port(void); + +/** + * Called periodically to dispatch TCP timers. + * + */ +void +tcp_tmr(void) +{ + /* Call tcp_fasttmr() every 250 ms */ + tcp_fasttmr(); + + if (++tcp_timer & 1) { + /* Call tcp_tmr() every 500 ms, i.e., every other timer + tcp_tmr() is called. */ + tcp_slowtmr(); + } +} + +/** + * Closes the connection held by the PCB. + * + * Listening pcbs are freed and may not be referenced any more. + * Connection pcbs are freed if not yet connected and may not be referenced + * any more. If a connection is established (at least SYN received or in + * a closing state), the connection is closed, and put in a closing state. + * The pcb is then automatically freed in tcp_slowtmr(). It is therefore + * unsafe to reference it. + * + * @param pcb the tcp_pcb to close + * @return ERR_OK if connection has been closed + * another err_t if closing failed and pcb is not freed + */ +err_t +tcp_close(struct tcp_pcb *pcb) +{ + err_t err; + +#if TCP_DEBUG + LWIP_DEBUGF(TCP_DEBUG, ("tcp_close: closing in ")); + tcp_debug_print_state(pcb->state); +#endif /* TCP_DEBUG */ + + switch (pcb->state) { + case CLOSED: + /* Closing a pcb in the CLOSED state might seem erroneous, + * however, it is in this state once allocated and as yet unused + * and the user needs some way to free it should the need arise. + * Calling tcp_close() with a pcb that has already been closed, (i.e. twice) + * or for a pcb that has been used and then entered the CLOSED state + * is erroneous, but this should never happen as the pcb has in those cases + * been freed, and so any remaining handles are bogus. */ + err = ERR_OK; + TCP_RMV(&tcp_bound_pcbs, pcb); + memp_free(MEMP_TCP_PCB, pcb); + pcb = NULL; + break; + case LISTEN: + err = ERR_OK; + tcp_pcb_remove((struct tcp_pcb **)&tcp_listen_pcbs.pcbs, pcb); + memp_free(MEMP_TCP_PCB_LISTEN, pcb); + pcb = NULL; + break; + case SYN_SENT: + err = ERR_OK; + tcp_pcb_remove(&tcp_active_pcbs, pcb); + memp_free(MEMP_TCP_PCB, pcb); + pcb = NULL; + snmp_inc_tcpattemptfails(); + break; + case SYN_RCVD: + err = tcp_send_ctrl(pcb, TCP_FIN); + if (err == ERR_OK) { + snmp_inc_tcpattemptfails(); + pcb->state = FIN_WAIT_1; + } + break; + case ESTABLISHED: + err = tcp_send_ctrl(pcb, TCP_FIN); + if (err == ERR_OK) { + snmp_inc_tcpestabresets(); + pcb->state = FIN_WAIT_1; + } + break; + case CLOSE_WAIT: + err = tcp_send_ctrl(pcb, TCP_FIN); + if (err == ERR_OK) { + snmp_inc_tcpestabresets(); + pcb->state = LAST_ACK; + } + break; + default: + /* Has already been closed, do nothing. */ + err = ERR_OK; + pcb = NULL; + break; + } + + if (pcb != NULL && err == ERR_OK) { + /* To ensure all data has been sent when tcp_close returns, we have + to make sure tcp_output doesn't fail. + Since we don't really have to ensure all data has been sent when tcp_close + returns (unsent data is sent from tcp timer functions, also), we don't care + for the return value of tcp_output for now. */ + /* @todo: When implementing SO_LINGER, this must be changed somehow: + If SOF_LINGER is set, the data should be sent when tcp_close returns. */ + tcp_output(pcb); + } + return err; +} + +/** + * Abandons a connection and optionally sends a RST to the remote + * host. Deletes the local protocol control block. This is done when + * a connection is killed because of shortage of memory. + * + * @param pcb the tcp_pcb to abort + * @param reset boolean to indicate whether a reset should be sent + */ +void +tcp_abandon(struct tcp_pcb *pcb, int reset) +{ + u32_t seqno, ackno; + u16_t remote_port, local_port; + struct ip_addr remote_ip, local_ip; +#if LWIP_CALLBACK_API + void (* errf)(void *arg, err_t err); +#endif /* LWIP_CALLBACK_API */ + void *errf_arg; + + + /* Figure out on which TCP PCB list we are, and remove us. If we + are in an active state, call the receive function associated with + the PCB with a NULL argument, and send an RST to the remote end. */ + if (pcb->state == TIME_WAIT) { + tcp_pcb_remove(&tcp_tw_pcbs, pcb); + memp_free(MEMP_TCP_PCB, pcb); + } else { + seqno = pcb->snd_nxt; + ackno = pcb->rcv_nxt; + ip_addr_set(&local_ip, &(pcb->local_ip)); + ip_addr_set(&remote_ip, &(pcb->remote_ip)); + local_port = pcb->local_port; + remote_port = pcb->remote_port; +#if LWIP_CALLBACK_API + errf = pcb->errf; +#endif /* LWIP_CALLBACK_API */ + errf_arg = pcb->callback_arg; + tcp_pcb_remove(&tcp_active_pcbs, pcb); + if (pcb->unacked != NULL) { + tcp_segs_free(pcb->unacked); + } + if (pcb->unsent != NULL) { + tcp_segs_free(pcb->unsent); + } +#if TCP_QUEUE_OOSEQ + if (pcb->ooseq != NULL) { + tcp_segs_free(pcb->ooseq); + } +#endif /* TCP_QUEUE_OOSEQ */ + memp_free(MEMP_TCP_PCB, pcb); + TCP_EVENT_ERR(errf, errf_arg, ERR_ABRT); + if (reset) { + LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_abandon: sending RST\n")); + tcp_rst(seqno, ackno, &local_ip, &remote_ip, local_port, remote_port); + } + } +} + +/** + * Binds the connection to a local portnumber and IP address. If the + * IP address is not given (i.e., ipaddr == NULL), the IP address of + * the outgoing network interface is used instead. + * + * @param pcb the tcp_pcb to bind (no check is done whether this pcb is + * already bound!) + * @param ipaddr the local ip address to bind to (use IP_ADDR_ANY to bind + * to any local address + * @param port the local port to bind to + * @return ERR_USE if the port is already in use + * ERR_OK if bound + */ +err_t +tcp_bind(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port) +{ + struct tcp_pcb *cpcb; + + LWIP_ERROR("tcp_bind: can only bind in state CLOSED", pcb->state == CLOSED, return ERR_ISCONN); + + if (port == 0) { + port = tcp_new_port(); + } + /* Check if the address already is in use. */ + /* Check the listen pcbs. */ + for(cpcb = (struct tcp_pcb *)tcp_listen_pcbs.pcbs; + cpcb != NULL; cpcb = cpcb->next) { + if (cpcb->local_port == port) { + if (ip_addr_isany(&(cpcb->local_ip)) || + ip_addr_isany(ipaddr) || + ip_addr_cmp(&(cpcb->local_ip), ipaddr)) { + return ERR_USE; + } + } + } + /* Check the connected pcbs. */ + for(cpcb = tcp_active_pcbs; + cpcb != NULL; cpcb = cpcb->next) { + if (cpcb->local_port == port) { + if (ip_addr_isany(&(cpcb->local_ip)) || + ip_addr_isany(ipaddr) || + ip_addr_cmp(&(cpcb->local_ip), ipaddr)) { + return ERR_USE; + } + } + } + /* Check the bound, not yet connected pcbs. */ + for(cpcb = tcp_bound_pcbs; cpcb != NULL; cpcb = cpcb->next) { + if (cpcb->local_port == port) { + if (ip_addr_isany(&(cpcb->local_ip)) || + ip_addr_isany(ipaddr) || + ip_addr_cmp(&(cpcb->local_ip), ipaddr)) { + return ERR_USE; + } + } + } + /* @todo: until SO_REUSEADDR is implemented (see task #6995 on savannah), + * we have to check the pcbs in TIME-WAIT state, also: */ + for(cpcb = tcp_tw_pcbs; cpcb != NULL; cpcb = cpcb->next) { + if (cpcb->local_port == port) { + if (ip_addr_cmp(&(cpcb->local_ip), ipaddr)) { + return ERR_USE; + } + } + } + + if (!ip_addr_isany(ipaddr)) { + pcb->local_ip = *ipaddr; + } + pcb->local_port = port; + TCP_REG(&tcp_bound_pcbs, pcb); + LWIP_DEBUGF(TCP_DEBUG, ("tcp_bind: bind to port %"U16_F"\n", port)); + return ERR_OK; +} +#if LWIP_CALLBACK_API +/** + * Default accept callback if no accept callback is specified by the user. + */ +static err_t +tcp_accept_null(void *arg, struct tcp_pcb *pcb, err_t err) +{ + LWIP_UNUSED_ARG(arg); + LWIP_UNUSED_ARG(pcb); + LWIP_UNUSED_ARG(err); + + return ERR_ABRT; +} +#endif /* LWIP_CALLBACK_API */ + +/** + * Set the state of the connection to be LISTEN, which means that it + * is able to accept incoming connections. The protocol control block + * is reallocated in order to consume less memory. Setting the + * connection to LISTEN is an irreversible process. + * + * @param pcb the original tcp_pcb + * @param backlog the incoming connections queue limit + * @return tcp_pcb used for listening, consumes less memory. + * + * @note The original tcp_pcb is freed. This function therefore has to be + * called like this: + * tpcb = tcp_listen(tpcb); + */ +struct tcp_pcb * +tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog) +{ + struct tcp_pcb_listen *lpcb; + + LWIP_UNUSED_ARG(backlog); + LWIP_ERROR("tcp_listen: pcb already connected", pcb->state == CLOSED, return NULL); + + /* already listening? */ + if (pcb->state == LISTEN) { + return pcb; + } + lpcb = memp_malloc(MEMP_TCP_PCB_LISTEN); + if (lpcb == NULL) { + return NULL; + } + lpcb->callback_arg = pcb->callback_arg; + lpcb->local_port = pcb->local_port; + lpcb->state = LISTEN; + lpcb->so_options = pcb->so_options; + lpcb->so_options |= SOF_ACCEPTCONN; + lpcb->ttl = pcb->ttl; + lpcb->tos = pcb->tos; + ip_addr_set(&lpcb->local_ip, &pcb->local_ip); + TCP_RMV(&tcp_bound_pcbs, pcb); + memp_free(MEMP_TCP_PCB, pcb); +#if LWIP_CALLBACK_API + lpcb->accept = tcp_accept_null; +#endif /* LWIP_CALLBACK_API */ +#if TCP_LISTEN_BACKLOG + lpcb->accepts_pending = 0; + lpcb->backlog = (backlog ? backlog : 1); +#endif /* TCP_LISTEN_BACKLOG */ + TCP_REG(&tcp_listen_pcbs.listen_pcbs, lpcb); + return (struct tcp_pcb *)lpcb; +} + +/** + * Update the state that tracks the available window space to advertise. + * + * Returns how much extra window would be advertised if we sent an + * update now. + */ +u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb) +{ + u32_t new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd; + + if (TCP_SEQ_GEQ(new_right_edge, pcb->rcv_ann_right_edge + LWIP_MIN((TCP_WND / 2), pcb->mss))) { + /* we can advertise more window */ + pcb->rcv_ann_wnd = pcb->rcv_wnd; + return new_right_edge - pcb->rcv_ann_right_edge; + } else { + if (TCP_SEQ_GT(pcb->rcv_nxt, pcb->rcv_ann_right_edge)) { + /* Can happen due to other end sending out of advertised window, + * but within actual available (but not yet advertised) window */ + pcb->rcv_ann_wnd = 0; + } else { + /* keep the right edge of window constant */ + pcb->rcv_ann_wnd = pcb->rcv_ann_right_edge - pcb->rcv_nxt; + } + return 0; + } +} + +/** + * This function should be called by the application when it has + * processed the data. The purpose is to advertise a larger window + * when the data has been processed. + * + * @param pcb the tcp_pcb for which data is read + * @param len the amount of bytes that have been read by the application + */ +void +tcp_recved(struct tcp_pcb *pcb, u16_t len) +{ + int wnd_inflation; + + LWIP_ASSERT("tcp_recved: len would wrap rcv_wnd\n", + len <= 0xffff - pcb->rcv_wnd ); + + pcb->rcv_wnd += len; + if (pcb->rcv_wnd > TCP_WND) + pcb->rcv_wnd = TCP_WND; + + wnd_inflation = tcp_update_rcv_ann_wnd(pcb); + + /* If the change in the right edge of window is significant (default + * watermark is TCP_WND/2), then send an explicit update now. + * Otherwise wait for a packet to be sent in the normal course of + * events (or more window to be available later) */ + if (wnd_inflation >= TCP_WND_UPDATE_THRESHOLD) + tcp_ack_now(pcb); + + LWIP_DEBUGF(TCP_DEBUG, ("tcp_recved: recveived %"U16_F" bytes, wnd %"U16_F" (%"U16_F").\n", + len, pcb->rcv_wnd, TCP_WND - pcb->rcv_wnd)); +} + +/** + * A nastly hack featuring 'goto' statements that allocates a + * new TCP local port. + * + * @return a new (free) local TCP port number + */ +static u16_t +tcp_new_port(void) +{ + struct tcp_pcb *pcb; +#ifndef TCP_LOCAL_PORT_RANGE_START +#define TCP_LOCAL_PORT_RANGE_START 4096 +#define TCP_LOCAL_PORT_RANGE_END 0x7fff +#endif + static u16_t port = TCP_LOCAL_PORT_RANGE_START; + + again: + if (++port > TCP_LOCAL_PORT_RANGE_END) { + port = TCP_LOCAL_PORT_RANGE_START; + } + + for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { + if (pcb->local_port == port) { + goto again; + } + } + for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { + if (pcb->local_port == port) { + goto again; + } + } + for(pcb = (struct tcp_pcb *)tcp_listen_pcbs.pcbs; pcb != NULL; pcb = pcb->next) { + if (pcb->local_port == port) { + goto again; + } + } + return port; +} + +/** + * Connects to another host. The function given as the "connected" + * argument will be called when the connection has been established. + * + * @param pcb the tcp_pcb used to establish the connection + * @param ipaddr the remote ip address to connect to + * @param port the remote tcp port to connect to + * @param connected callback function to call when connected (or on error) + * @return ERR_VAL if invalid arguments are given + * ERR_OK if connect request has been sent + * other err_t values if connect request couldn't be sent + */ +err_t +tcp_connect(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port, + err_t (* connected)(void *arg, struct tcp_pcb *tpcb, err_t err)) +{ + err_t ret; + u32_t iss; + + LWIP_ERROR("tcp_connect: can only connected from state CLOSED", pcb->state == CLOSED, return ERR_ISCONN); + + LWIP_DEBUGF(TCP_DEBUG, ("tcp_connect to port %"U16_F"\n", port)); + if (ipaddr != NULL) { + pcb->remote_ip = *ipaddr; + } else { + return ERR_VAL; + } + pcb->remote_port = port; + if (pcb->local_port == 0) { + pcb->local_port = tcp_new_port(); + } + iss = tcp_next_iss(); + pcb->rcv_nxt = 0; + pcb->snd_nxt = iss; + pcb->lastack = iss - 1; + pcb->snd_lbb = iss - 1; + pcb->rcv_wnd = TCP_WND; + pcb->rcv_ann_wnd = TCP_WND; + pcb->rcv_ann_right_edge = pcb->rcv_nxt; + pcb->snd_wnd = TCP_WND; + /* As initial send MSS, we use TCP_MSS but limit it to 536. + The send MSS is updated when an MSS option is received. */ + pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS; +#if TCP_CALCULATE_EFF_SEND_MSS + pcb->mss = tcp_eff_send_mss(pcb->mss, ipaddr); +#endif /* TCP_CALCULATE_EFF_SEND_MSS */ + pcb->cwnd = 1; + pcb->ssthresh = pcb->mss * 10; + pcb->state = SYN_SENT; +#if LWIP_CALLBACK_API + pcb->connected = connected; +#endif /* LWIP_CALLBACK_API */ + TCP_RMV(&tcp_bound_pcbs, pcb); + TCP_REG(&tcp_active_pcbs, pcb); + + snmp_inc_tcpactiveopens(); + + ret = tcp_enqueue(pcb, NULL, 0, TCP_SYN, 0, TF_SEG_OPTS_MSS +#if LWIP_TCP_TIMESTAMPS + | TF_SEG_OPTS_TS +#endif + ); + if (ret == ERR_OK) { + tcp_output(pcb); + } + return ret; +} + +/** + * Called every 500 ms and implements the retransmission timer and the timer that + * removes PCBs that have been in TIME-WAIT for enough time. It also increments + * various timers such as the inactivity timer in each PCB. + * + * Automatically called from tcp_tmr(). + */ +void +tcp_slowtmr(void) +{ + struct tcp_pcb *pcb, *pcb2, *prev; + u16_t eff_wnd; + u8_t pcb_remove; /* flag if a PCB should be removed */ + u8_t pcb_reset; /* flag if a RST should be sent when removing */ + err_t err; + + err = ERR_OK; + + ++tcp_ticks; + + /* Steps through all of the active PCBs. */ + prev = NULL; + pcb = tcp_active_pcbs; + if (pcb == NULL) { + LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: no active pcbs\n")); + } + while (pcb != NULL) { + LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: processing active pcb\n")); + LWIP_ASSERT("tcp_slowtmr: active pcb->state != CLOSED\n", pcb->state != CLOSED); + LWIP_ASSERT("tcp_slowtmr: active pcb->state != LISTEN\n", pcb->state != LISTEN); + LWIP_ASSERT("tcp_slowtmr: active pcb->state != TIME-WAIT\n", pcb->state != TIME_WAIT); + + pcb_remove = 0; + pcb_reset = 0; + + if (pcb->state == SYN_SENT && pcb->nrtx == TCP_SYNMAXRTX) { + ++pcb_remove; + LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max SYN retries reached\n")); + } + else if (pcb->nrtx == TCP_MAXRTX) { + ++pcb_remove; + LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max DATA retries reached\n")); + } else { + if (pcb->persist_backoff > 0) { + /* If snd_wnd is zero, use persist timer to send 1 byte probes + * instead of using the standard retransmission mechanism. */ + pcb->persist_cnt++; + if (pcb->persist_cnt >= tcp_persist_backoff[pcb->persist_backoff-1]) { + pcb->persist_cnt = 0; + if (pcb->persist_backoff < sizeof(tcp_persist_backoff)) { + pcb->persist_backoff++; + } + tcp_zero_window_probe(pcb); + } + } else { + /* Increase the retransmission timer if it is running */ + if(pcb->rtime >= 0) + ++pcb->rtime; + + if (pcb->unacked != NULL && pcb->rtime >= pcb->rto) { + /* Time for a retransmission. */ + LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_slowtmr: rtime %"S16_F + " pcb->rto %"S16_F"\n", + pcb->rtime, pcb->rto)); + + /* Double retransmission time-out unless we are trying to + * connect to somebody (i.e., we are in SYN_SENT). */ + if (pcb->state != SYN_SENT) { + pcb->rto = ((pcb->sa >> 3) + pcb->sv) << tcp_backoff[pcb->nrtx]; + } + + /* Reset the retransmission timer. */ + pcb->rtime = 0; + + /* Reduce congestion window and ssthresh. */ + eff_wnd = LWIP_MIN(pcb->cwnd, pcb->snd_wnd); + pcb->ssthresh = eff_wnd >> 1; + if (pcb->ssthresh < pcb->mss) { + pcb->ssthresh = pcb->mss * 2; + } + pcb->cwnd = pcb->mss; + LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_slowtmr: cwnd %"U16_F + " ssthresh %"U16_F"\n", + pcb->cwnd, pcb->ssthresh)); + + /* The following needs to be called AFTER cwnd is set to one + mss - STJ */ + tcp_rexmit_rto(pcb); + } + } + } + /* Check if this PCB has stayed too long in FIN-WAIT-2 */ + if (pcb->state == FIN_WAIT_2) { + if ((u32_t)(tcp_ticks - pcb->tmr) > + TCP_FIN_WAIT_TIMEOUT / TCP_SLOW_INTERVAL) { + ++pcb_remove; + LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in FIN-WAIT-2\n")); + } + } + + /* Check if KEEPALIVE should be sent */ + if((pcb->so_options & SOF_KEEPALIVE) && + ((pcb->state == ESTABLISHED) || + (pcb->state == CLOSE_WAIT))) { +#if LWIP_TCP_KEEPALIVE + if((u32_t)(tcp_ticks - pcb->tmr) > + (pcb->keep_idle + (pcb->keep_cnt*pcb->keep_intvl)) + / TCP_SLOW_INTERVAL) +#else + if((u32_t)(tcp_ticks - pcb->tmr) > + (pcb->keep_idle + TCP_MAXIDLE) / TCP_SLOW_INTERVAL) +#endif /* LWIP_TCP_KEEPALIVE */ + { + LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: KEEPALIVE timeout. Aborting connection to %"U16_F".%"U16_F".%"U16_F".%"U16_F".\n", + ip4_addr1(&pcb->remote_ip), ip4_addr2(&pcb->remote_ip), + ip4_addr3(&pcb->remote_ip), ip4_addr4(&pcb->remote_ip))); + + ++pcb_remove; + ++pcb_reset; + } +#if LWIP_TCP_KEEPALIVE + else if((u32_t)(tcp_ticks - pcb->tmr) > + (pcb->keep_idle + pcb->keep_cnt_sent * pcb->keep_intvl) + / TCP_SLOW_INTERVAL) +#else + else if((u32_t)(tcp_ticks - pcb->tmr) > + (pcb->keep_idle + pcb->keep_cnt_sent * TCP_KEEPINTVL_DEFAULT) + / TCP_SLOW_INTERVAL) +#endif /* LWIP_TCP_KEEPALIVE */ + { + tcp_keepalive(pcb); + pcb->keep_cnt_sent++; + } + } + + /* If this PCB has queued out of sequence data, but has been + inactive for too long, will drop the data (it will eventually + be retransmitted). */ +#if TCP_QUEUE_OOSEQ + if (pcb->ooseq != NULL && + (u32_t)tcp_ticks - pcb->tmr >= pcb->rto * TCP_OOSEQ_TIMEOUT) { + tcp_segs_free(pcb->ooseq); + pcb->ooseq = NULL; + LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_slowtmr: dropping OOSEQ queued data\n")); + } +#endif /* TCP_QUEUE_OOSEQ */ + + /* Check if this PCB has stayed too long in SYN-RCVD */ + if (pcb->state == SYN_RCVD) { + if ((u32_t)(tcp_ticks - pcb->tmr) > + TCP_SYN_RCVD_TIMEOUT / TCP_SLOW_INTERVAL) { + ++pcb_remove; + LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in SYN-RCVD\n")); + } + } + + /* Check if this PCB has stayed too long in LAST-ACK */ + if (pcb->state == LAST_ACK) { + if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) { + ++pcb_remove; + LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in LAST-ACK\n")); + } + } + + /* If the PCB should be removed, do it. */ + if (pcb_remove) { + tcp_pcb_purge(pcb); + /* Remove PCB from tcp_active_pcbs list. */ + if (prev != NULL) { + LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_active_pcbs", pcb != tcp_active_pcbs); + prev->next = pcb->next; + } else { + /* This PCB was the first. */ + LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_active_pcbs", tcp_active_pcbs == pcb); + tcp_active_pcbs = pcb->next; + } + + TCP_EVENT_ERR(pcb->errf, pcb->callback_arg, ERR_ABRT); + if (pcb_reset) { + tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip, + pcb->local_port, pcb->remote_port); + } + + pcb2 = pcb->next; + memp_free(MEMP_TCP_PCB, pcb); + pcb = pcb2; + } else { + + /* We check if we should poll the connection. */ + ++pcb->polltmr; + if (pcb->polltmr >= pcb->pollinterval) { + pcb->polltmr = 0; + LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: polling application\n")); + TCP_EVENT_POLL(pcb, err); + if (err == ERR_OK) { + tcp_output(pcb); + } + } + + prev = pcb; + pcb = pcb->next; + } + } + + + /* Steps through all of the TIME-WAIT PCBs. */ + prev = NULL; + pcb = tcp_tw_pcbs; + while (pcb != NULL) { + LWIP_ASSERT("tcp_slowtmr: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT); + pcb_remove = 0; + + /* Check if this PCB has stayed long enough in TIME-WAIT */ + if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) { + ++pcb_remove; + } + + + + /* If the PCB should be removed, do it. */ + if (pcb_remove) { + tcp_pcb_purge(pcb); + /* Remove PCB from tcp_tw_pcbs list. */ + if (prev != NULL) { + LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_tw_pcbs", pcb != tcp_tw_pcbs); + prev->next = pcb->next; + } else { + /* This PCB was the first. */ + LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb); + tcp_tw_pcbs = pcb->next; + } + pcb2 = pcb->next; + memp_free(MEMP_TCP_PCB, pcb); + pcb = pcb2; + } else { + prev = pcb; + pcb = pcb->next; + } + } +} + +/** + * Is called every TCP_FAST_INTERVAL (250 ms) and process data previously + * "refused" by upper layer (application) and sends delayed ACKs. + * + * Automatically called from tcp_tmr(). + */ +void +tcp_fasttmr(void) +{ + struct tcp_pcb *pcb; + + for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { + /* If there is data which was previously "refused" by upper layer */ + if (pcb->refused_data != NULL) { + /* Notify again application with data previously received. */ + err_t err; + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_fasttmr: notify kept packet\n")); + TCP_EVENT_RECV(pcb, pcb->refused_data, ERR_OK, err); + if (err == ERR_OK) { + pcb->refused_data = NULL; + } + } + + /* send delayed ACKs */ + if (pcb->flags & TF_ACK_DELAY) { + LWIP_DEBUGF(TCP_DEBUG, ("tcp_fasttmr: delayed ACK\n")); + tcp_ack_now(pcb); + pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW); + } + } +} + +/** + * Deallocates a list of TCP segments (tcp_seg structures). + * + * @param seg tcp_seg list of TCP segments to free + * @return the number of pbufs that were deallocated + */ +u8_t +tcp_segs_free(struct tcp_seg *seg) +{ + u8_t count = 0; + struct tcp_seg *next; + while (seg != NULL) { + next = seg->next; + count += tcp_seg_free(seg); + seg = next; + } + return count; +} + +/** + * Frees a TCP segment (tcp_seg structure). + * + * @param seg single tcp_seg to free + * @return the number of pbufs that were deallocated + */ +u8_t +tcp_seg_free(struct tcp_seg *seg) +{ + u8_t count = 0; + + if (seg != NULL) { + if (seg->p != NULL) { + count = pbuf_free(seg->p); +#if TCP_DEBUG + seg->p = NULL; +#endif /* TCP_DEBUG */ + } + memp_free(MEMP_TCP_SEG, seg); + } + return count; +} + +/** + * Sets the priority of a connection. + * + * @param pcb the tcp_pcb to manipulate + * @param prio new priority + */ +void +tcp_setprio(struct tcp_pcb *pcb, u8_t prio) +{ + pcb->prio = prio; +} +#if TCP_QUEUE_OOSEQ + +/** + * Returns a copy of the given TCP segment. + * The pbuf and data are not copied, only the pointers + * + * @param seg the old tcp_seg + * @return a copy of seg + */ +struct tcp_seg * +tcp_seg_copy(struct tcp_seg *seg) +{ + struct tcp_seg *cseg; + + cseg = memp_malloc(MEMP_TCP_SEG); + if (cseg == NULL) { + return NULL; + } + SMEMCPY((u8_t *)cseg, (const u8_t *)seg, sizeof(struct tcp_seg)); + pbuf_ref(cseg->p); + return cseg; +} +#endif + +#if LWIP_CALLBACK_API +/** + * Default receive callback that is called if the user didn't register + * a recv callback for the pcb. + */ +err_t +tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) +{ + LWIP_UNUSED_ARG(arg); + if (p != NULL) { + tcp_recved(pcb, p->tot_len); + pbuf_free(p); + } else if (err == ERR_OK) { + return tcp_close(pcb); + } + return ERR_OK; +} +#endif /* LWIP_CALLBACK_API */ + +/** + * Kills the oldest active connection that has lower priority than prio. + * + * @param prio minimum priority + */ +static void +tcp_kill_prio(u8_t prio) +{ + struct tcp_pcb *pcb, *inactive; + u32_t inactivity; + u8_t mprio; + + + mprio = TCP_PRIO_MAX; + + /* We kill the oldest active connection that has lower priority than prio. */ + inactivity = 0; + inactive = NULL; + for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { + if (pcb->prio <= prio && + pcb->prio <= mprio && + (u32_t)(tcp_ticks - pcb->tmr) >= inactivity) { + inactivity = tcp_ticks - pcb->tmr; + inactive = pcb; + mprio = pcb->prio; + } + } + if (inactive != NULL) { + LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_prio: killing oldest PCB %p (%"S32_F")\n", + (void *)inactive, inactivity)); + tcp_abort(inactive); + } +} + +/** + * Kills the oldest connection that is in TIME_WAIT state. + * Called from tcp_alloc() if no more connections are available. + */ +static void +tcp_kill_timewait(void) +{ + struct tcp_pcb *pcb, *inactive; + u32_t inactivity; + + inactivity = 0; + inactive = NULL; + /* Go through the list of TIME_WAIT pcbs and get the oldest pcb. */ + for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { + if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) { + inactivity = tcp_ticks - pcb->tmr; + inactive = pcb; + } + } + if (inactive != NULL) { + LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_timewait: killing oldest TIME-WAIT PCB %p (%"S32_F")\n", + (void *)inactive, inactivity)); + tcp_abort(inactive); + } +} + +/** + * Allocate a new tcp_pcb structure. + * + * @param prio priority for the new pcb + * @return a new tcp_pcb that initially is in state CLOSED + */ +struct tcp_pcb * +tcp_alloc(u8_t prio) +{ + struct tcp_pcb *pcb; + u32_t iss; + + pcb = memp_malloc(MEMP_TCP_PCB); + if (pcb == NULL) { + /* Try killing oldest connection in TIME-WAIT. */ + LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing off oldest TIME-WAIT connection\n")); + tcp_kill_timewait(); + /* Try to allocate a tcp_pcb again. */ + pcb = memp_malloc(MEMP_TCP_PCB); + if (pcb == NULL) { + /* Try killing active connections with lower priority than the new one. */ + LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing connection with prio lower than %d\n", prio)); + tcp_kill_prio(prio); + /* Try to allocate a tcp_pcb again. */ + pcb = memp_malloc(MEMP_TCP_PCB); + if (pcb != NULL) { + /* adjust err stats: memp_malloc failed twice before */ + MEMP_STATS_DEC(err, MEMP_TCP_PCB); + } + } + if (pcb != NULL) { + /* adjust err stats: timewait PCB was freed above */ + MEMP_STATS_DEC(err, MEMP_TCP_PCB); + } + } + if (pcb != NULL) { + memset(pcb, 0, sizeof(struct tcp_pcb)); + pcb->prio = TCP_PRIO_NORMAL; + pcb->snd_buf = TCP_SND_BUF; + pcb->snd_queuelen = 0; + pcb->rcv_wnd = TCP_WND; + pcb->rcv_ann_wnd = TCP_WND; + pcb->tos = 0; + pcb->ttl = TCP_TTL; + /* As initial send MSS, we use TCP_MSS but limit it to 536. + The send MSS is updated when an MSS option is received. */ + pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS; + pcb->rto = 3000 / TCP_SLOW_INTERVAL; + pcb->sa = 0; + pcb->sv = 3000 / TCP_SLOW_INTERVAL; + pcb->rtime = -1; + pcb->cwnd = 1; + iss = tcp_next_iss(); + pcb->snd_wl2 = iss; + pcb->snd_nxt = iss; + pcb->lastack = iss; + pcb->snd_lbb = iss; + pcb->tmr = tcp_ticks; + + pcb->polltmr = 0; + +#if LWIP_CALLBACK_API + pcb->recv = tcp_recv_null; +#endif /* LWIP_CALLBACK_API */ + + /* Init KEEPALIVE timer */ + pcb->keep_idle = TCP_KEEPIDLE_DEFAULT; + +#if LWIP_TCP_KEEPALIVE + pcb->keep_intvl = TCP_KEEPINTVL_DEFAULT; + pcb->keep_cnt = TCP_KEEPCNT_DEFAULT; +#endif /* LWIP_TCP_KEEPALIVE */ + + pcb->keep_cnt_sent = 0; + } + return pcb; +} + +/** + * Creates a new TCP protocol control block but doesn't place it on + * any of the TCP PCB lists. + * The pcb is not put on any list until binding using tcp_bind(). + * + * @internal: Maybe there should be a idle TCP PCB list where these + * PCBs are put on. Port reservation using tcp_bind() is implemented but + * allocated pcbs that are not bound can't be killed automatically if wanting + * to allocate a pcb with higher prio (@see tcp_kill_prio()) + * + * @return a new tcp_pcb that initially is in state CLOSED + */ +struct tcp_pcb * +tcp_new(void) +{ + return tcp_alloc(TCP_PRIO_NORMAL); +} + +/** + * Used to specify the argument that should be passed callback + * functions. + * + * @param pcb tcp_pcb to set the callback argument + * @param arg void pointer argument to pass to callback functions + */ +void +tcp_arg(struct tcp_pcb *pcb, void *arg) +{ + pcb->callback_arg = arg; +} +#if LWIP_CALLBACK_API + +/** + * Used to specify the function that should be called when a TCP + * connection receives data. + * + * @param pcb tcp_pcb to set the recv callback + * @param recv callback function to call for this pcb when data is received + */ +void +tcp_recv(struct tcp_pcb *pcb, + err_t (* recv)(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)) +{ + pcb->recv = recv; +} + +/** + * Used to specify the function that should be called when TCP data + * has been successfully delivered to the remote host. + * + * @param pcb tcp_pcb to set the sent callback + * @param sent callback function to call for this pcb when data is successfully sent + */ +void +tcp_sent(struct tcp_pcb *pcb, + err_t (* sent)(void *arg, struct tcp_pcb *tpcb, u16_t len)) +{ + pcb->sent = sent; +} + +/** + * Used to specify the function that should be called when a fatal error + * has occured on the connection. + * + * @param pcb tcp_pcb to set the err callback + * @param errf callback function to call for this pcb when a fatal error + * has occured on the connection + */ +void +tcp_err(struct tcp_pcb *pcb, + void (* errf)(void *arg, err_t err)) +{ + pcb->errf = errf; +} + +/** + * Used for specifying the function that should be called when a + * LISTENing connection has been connected to another host. + * + * @param pcb tcp_pcb to set the accept callback + * @param accept callback function to call for this pcb when LISTENing + * connection has been connected to another host + */ +void +tcp_accept(struct tcp_pcb *pcb, + err_t (* accept)(void *arg, struct tcp_pcb *newpcb, err_t err)) +{ + pcb->accept = accept; +} +#endif /* LWIP_CALLBACK_API */ + + +/** + * Used to specify the function that should be called periodically + * from TCP. The interval is specified in terms of the TCP coarse + * timer interval, which is called twice a second. + * + */ +void +tcp_poll(struct tcp_pcb *pcb, + err_t (* poll)(void *arg, struct tcp_pcb *tpcb), u8_t interval) +{ +#if LWIP_CALLBACK_API + pcb->poll = poll; +#endif /* LWIP_CALLBACK_API */ + pcb->pollinterval = interval; +} + +/** + * Purges a TCP PCB. Removes any buffered data and frees the buffer memory + * (pcb->ooseq, pcb->unsent and pcb->unacked are freed). + * + * @param pcb tcp_pcb to purge. The pcb itself is not deallocated! + */ +void +tcp_pcb_purge(struct tcp_pcb *pcb) +{ + if (pcb->state != CLOSED && + pcb->state != TIME_WAIT && + pcb->state != LISTEN) { + + LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge\n")); + +#if TCP_LISTEN_BACKLOG + if (pcb->state == SYN_RCVD) { + /* Need to find the corresponding listen_pcb and decrease its accepts_pending */ + struct tcp_pcb_listen *lpcb; + LWIP_ASSERT("tcp_pcb_purge: pcb->state == SYN_RCVD but tcp_listen_pcbs is NULL", + tcp_listen_pcbs.listen_pcbs != NULL); + for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) { + if ((lpcb->local_port == pcb->local_port) && + (ip_addr_isany(&lpcb->local_ip) || + ip_addr_cmp(&pcb->local_ip, &lpcb->local_ip))) { + /* port and address of the listen pcb match the timed-out pcb */ + LWIP_ASSERT("tcp_pcb_purge: listen pcb does not have accepts pending", + lpcb->accepts_pending > 0); + lpcb->accepts_pending--; + break; + } + } + } +#endif /* TCP_LISTEN_BACKLOG */ + + + if (pcb->refused_data != NULL) { + LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->refused_data\n")); + pbuf_free(pcb->refused_data); + pcb->refused_data = NULL; + } + if (pcb->unsent != NULL) { + LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: not all data sent\n")); + } + if (pcb->unacked != NULL) { + LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->unacked\n")); + } +#if TCP_QUEUE_OOSEQ /* LW */ + if (pcb->ooseq != NULL) { + LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->ooseq\n")); + } + + /* Stop the retransmission timer as it will expect data on unacked + queue if it fires */ + pcb->rtime = -1; + + tcp_segs_free(pcb->ooseq); + pcb->ooseq = NULL; +#endif /* TCP_QUEUE_OOSEQ */ + tcp_segs_free(pcb->unsent); + tcp_segs_free(pcb->unacked); + pcb->unacked = pcb->unsent = NULL; + } +} + +/** + * Purges the PCB and removes it from a PCB list. Any delayed ACKs are sent first. + * + * @param pcblist PCB list to purge. + * @param pcb tcp_pcb to purge. The pcb itself is NOT deallocated! + */ +void +tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb) +{ + TCP_RMV(pcblist, pcb); + + tcp_pcb_purge(pcb); + + /* if there is an outstanding delayed ACKs, send it */ + if (pcb->state != TIME_WAIT && + pcb->state != LISTEN && + pcb->flags & TF_ACK_DELAY) { + pcb->flags |= TF_ACK_NOW; + tcp_output(pcb); + } + + if (pcb->state != LISTEN) { + LWIP_ASSERT("unsent segments leaking", pcb->unsent == NULL); + LWIP_ASSERT("unacked segments leaking", pcb->unacked == NULL); +#if TCP_QUEUE_OOSEQ + LWIP_ASSERT("ooseq segments leaking", pcb->ooseq == NULL); +#endif /* TCP_QUEUE_OOSEQ */ + } + + pcb->state = CLOSED; + + LWIP_ASSERT("tcp_pcb_remove: tcp_pcbs_sane()", tcp_pcbs_sane()); +} + +/** + * Calculates a new initial sequence number for new connections. + * + * @return u32_t pseudo random sequence number + */ +u32_t +tcp_next_iss(void) +{ + static u32_t iss = 6510; + + iss += tcp_ticks; /* XXX */ + return iss; +} + +#if TCP_CALCULATE_EFF_SEND_MSS +/** + * Calcluates the effective send mss that can be used for a specific IP address + * by using ip_route to determin the netif used to send to the address and + * calculating the minimum of TCP_MSS and that netif's mtu (if set). + */ +u16_t +tcp_eff_send_mss(u16_t sendmss, struct ip_addr *addr) +{ + u16_t mss_s; + struct netif *outif; + + outif = ip_route(addr); + if ((outif != NULL) && (outif->mtu != 0)) { + mss_s = outif->mtu - IP_HLEN - TCP_HLEN; + /* RFC 1122, chap 4.2.2.6: + * Eff.snd.MSS = min(SendMSS+20, MMS_S) - TCPhdrsize - IPoptionsize + * We correct for TCP options in tcp_enqueue(), and don't support + * IP options + */ + sendmss = LWIP_MIN(sendmss, mss_s); + } + return sendmss; +} +#endif /* TCP_CALCULATE_EFF_SEND_MSS */ + +const char* +tcp_debug_state_str(enum tcp_state s) +{ + return tcp_state_str[s]; +} + +#if TCP_DEBUG || TCP_INPUT_DEBUG || TCP_OUTPUT_DEBUG +/** + * Print a tcp header for debugging purposes. + * + * @param tcphdr pointer to a struct tcp_hdr + */ +void +tcp_debug_print(struct tcp_hdr *tcphdr) +{ + LWIP_DEBUGF(TCP_DEBUG, ("TCP header:\n")); + LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); + LWIP_DEBUGF(TCP_DEBUG, ("| %5"U16_F" | %5"U16_F" | (src port, dest port)\n", + ntohs(tcphdr->src), ntohs(tcphdr->dest))); + LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); + LWIP_DEBUGF(TCP_DEBUG, ("| %010"U32_F" | (seq no)\n", + ntohl(tcphdr->seqno))); + LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); + LWIP_DEBUGF(TCP_DEBUG, ("| %010"U32_F" | (ack no)\n", + ntohl(tcphdr->ackno))); + LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); + LWIP_DEBUGF(TCP_DEBUG, ("| %2"U16_F" | |%"U16_F"%"U16_F"%"U16_F"%"U16_F"%"U16_F"%"U16_F"| %5"U16_F" | (hdrlen, flags (", + TCPH_HDRLEN(tcphdr), + TCPH_FLAGS(tcphdr) >> 5 & 1, + TCPH_FLAGS(tcphdr) >> 4 & 1, + TCPH_FLAGS(tcphdr) >> 3 & 1, + TCPH_FLAGS(tcphdr) >> 2 & 1, + TCPH_FLAGS(tcphdr) >> 1 & 1, + TCPH_FLAGS(tcphdr) & 1, + ntohs(tcphdr->wnd))); + tcp_debug_print_flags(TCPH_FLAGS(tcphdr)); + LWIP_DEBUGF(TCP_DEBUG, ("), win)\n")); + LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); + LWIP_DEBUGF(TCP_DEBUG, ("| 0x%04"X16_F" | %5"U16_F" | (chksum, urgp)\n", + ntohs(tcphdr->chksum), ntohs(tcphdr->urgp))); + LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); +} + +/** + * Print a tcp state for debugging purposes. + * + * @param s enum tcp_state to print + */ +void +tcp_debug_print_state(enum tcp_state s) +{ + LWIP_DEBUGF(TCP_DEBUG, ("State: %s\n", tcp_state_str[s])); +} + +/** + * Print tcp flags for debugging purposes. + * + * @param flags tcp flags, all active flags are printed + */ +void +tcp_debug_print_flags(u8_t flags) +{ + if (flags & TCP_FIN) { + LWIP_DEBUGF(TCP_DEBUG, ("FIN ")); + } + if (flags & TCP_SYN) { + LWIP_DEBUGF(TCP_DEBUG, ("SYN ")); + } + if (flags & TCP_RST) { + LWIP_DEBUGF(TCP_DEBUG, ("RST ")); + } + if (flags & TCP_PSH) { + LWIP_DEBUGF(TCP_DEBUG, ("PSH ")); + } + if (flags & TCP_ACK) { + LWIP_DEBUGF(TCP_DEBUG, ("ACK ")); + } + if (flags & TCP_URG) { + LWIP_DEBUGF(TCP_DEBUG, ("URG ")); + } + if (flags & TCP_ECE) { + LWIP_DEBUGF(TCP_DEBUG, ("ECE ")); + } + if (flags & TCP_CWR) { + LWIP_DEBUGF(TCP_DEBUG, ("CWR ")); + } + LWIP_DEBUGF(TCP_DEBUG, ("\n")); +} + +/** + * Print all tcp_pcbs in every list for debugging purposes. + */ +void +tcp_debug_print_pcbs(void) +{ + struct tcp_pcb *pcb; + LWIP_DEBUGF(TCP_DEBUG, ("Active PCB states:\n")); + for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { + LWIP_DEBUGF(TCP_DEBUG, ("[%p]Local port %"U16_F", foreign port %"U16_F" snd_nxt %"U32_F" rcv_nxt %"U32_F" ", + pcb, pcb->local_port, pcb->remote_port, + pcb->snd_nxt, pcb->rcv_nxt)); + tcp_debug_print_state(pcb->state); + } + LWIP_DEBUGF(TCP_DEBUG, ("Listen PCB states:\n")); + for(pcb = (struct tcp_pcb *)tcp_listen_pcbs.pcbs; pcb != NULL; pcb = pcb->next) { + LWIP_DEBUGF(TCP_DEBUG, ("[%p]Local port %"U16_F", foreign port %"U16_F" snd_nxt %"U32_F" rcv_nxt %"U32_F" ", + pcb, pcb->local_port, pcb->remote_port, + pcb->snd_nxt, pcb->rcv_nxt)); + tcp_debug_print_state(pcb->state); + } + LWIP_DEBUGF(TCP_DEBUG, ("TIME-WAIT PCB states:\n")); + for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { + LWIP_DEBUGF(TCP_DEBUG, ("[%p]Local port %"U16_F", foreign port %"U16_F" snd_nxt %"U32_F" rcv_nxt %"U32_F" ", + pcb, pcb->local_port, pcb->remote_port, + pcb->snd_nxt, pcb->rcv_nxt)); + tcp_debug_print_state(pcb->state); + } +} + +/** + * Check state consistency of the tcp_pcb lists. + */ +s16_t +tcp_pcbs_sane(void) +{ + struct tcp_pcb *pcb; + for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { + LWIP_ASSERT("tcp_pcbs_sane: active pcb->state != CLOSED", pcb->state != CLOSED); + LWIP_ASSERT("tcp_pcbs_sane: active pcb->state != LISTEN", pcb->state != LISTEN); + LWIP_ASSERT("tcp_pcbs_sane: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT); + } + for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { + LWIP_ASSERT("tcp_pcbs_sane: tw pcb->state == TIME-WAIT", pcb->state == TIME_WAIT); + } + return 1; +} +#endif /* TCP_DEBUG */ + +#endif /* LWIP_TCP */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/tcp_in.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/tcp_in.c new file mode 100644 index 0000000..3930b40 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/tcp_in.c @@ -0,0 +1,1508 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/** + * @file + * Transmission Control Protocol, incoming traffic + * + * The input processing functions of the TCP layer. + * + * These functions are generally called in the order (ip_input() ->) + * tcp_input() -> * tcp_process() -> tcp_receive() (-> application). + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "lwip/opt.h" + +#if LWIP_TCP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/tcp.h" +#include "lwip/def.h" +#include "lwip/ip_addr.h" +#include "lwip/netif.h" +#include "lwip/mem.h" +#include "lwip/memp.h" +#include "lwip/inet.h" +#include "lwip/inet_chksum.h" +#include "lwip/stats.h" +#include "lwip/snmp.h" +#include "arch/perf.h" + +/* These variables are global to all functions involved in the input + processing of TCP segments. They are set by the tcp_input() + function. */ +static struct tcp_seg inseg; +static struct tcp_hdr *tcphdr; +static struct ip_hdr *iphdr; +static u32_t seqno, ackno; +static u8_t flags; +static u16_t tcplen; + +static u8_t recv_flags; +static struct pbuf *recv_data; + +struct tcp_pcb *tcp_input_pcb; + +/* Forward declarations. */ +static err_t tcp_process(struct tcp_pcb *pcb); +static void tcp_receive(struct tcp_pcb *pcb); +static void tcp_parseopt(struct tcp_pcb *pcb); + +static err_t tcp_listen_input(struct tcp_pcb_listen *pcb); +static err_t tcp_timewait_input(struct tcp_pcb *pcb); + +/** + * The initial input processing of TCP. It verifies the TCP header, demultiplexes + * the segment between the PCBs and passes it on to tcp_process(), which implements + * the TCP finite state machine. This function is called by the IP layer (in + * ip_input()). + * + * @param p received TCP segment to process (p->payload pointing to the IP header) + * @param inp network interface on which this segment was received + */ +void +tcp_input(struct pbuf *p, struct netif *inp) +{ + struct tcp_pcb *pcb, *prev; + struct tcp_pcb_listen *lpcb; + u8_t hdrlen; + err_t err; + + PERF_START; + + TCP_STATS_INC(tcp.recv); + snmp_inc_tcpinsegs(); + + iphdr = p->payload; + tcphdr = (struct tcp_hdr *)((u8_t *)p->payload + IPH_HL(iphdr) * 4); + +#if TCP_INPUT_DEBUG + tcp_debug_print(tcphdr); +#endif + + /* remove header from payload */ + if (pbuf_header(p, -((s16_t)(IPH_HL(iphdr) * 4))) || (p->tot_len < sizeof(struct tcp_hdr))) { + /* drop short packets */ + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: short packet (%"U16_F" bytes) discarded\n", p->tot_len)); + TCP_STATS_INC(tcp.lenerr); + TCP_STATS_INC(tcp.drop); + snmp_inc_tcpinerrs(); + pbuf_free(p); + return; + } + + /* Don't even process incoming broadcasts/multicasts. */ + if (ip_addr_isbroadcast(&(iphdr->dest), inp) || + ip_addr_ismulticast(&(iphdr->dest))) { + TCP_STATS_INC(tcp.proterr); + TCP_STATS_INC(tcp.drop); + snmp_inc_tcpinerrs(); + pbuf_free(p); + return; + } + +#if CHECKSUM_CHECK_TCP + /* Verify TCP checksum. */ + if (inet_chksum_pseudo(p, (struct ip_addr *)&(iphdr->src), + (struct ip_addr *)&(iphdr->dest), + IP_PROTO_TCP, p->tot_len) != 0) { + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: packet discarded due to failing checksum 0x%04"X16_F"\n", + inet_chksum_pseudo(p, (struct ip_addr *)&(iphdr->src), (struct ip_addr *)&(iphdr->dest), + IP_PROTO_TCP, p->tot_len))); +#if TCP_DEBUG + tcp_debug_print(tcphdr); +#endif /* TCP_DEBUG */ + TCP_STATS_INC(tcp.chkerr); + TCP_STATS_INC(tcp.drop); + snmp_inc_tcpinerrs(); + pbuf_free(p); + return; + } +#endif + + /* Move the payload pointer in the pbuf so that it points to the + TCP data instead of the TCP header. */ + hdrlen = TCPH_HDRLEN(tcphdr); + if(pbuf_header(p, -(hdrlen * 4))){ + /* drop short packets */ + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: short packet\n")); + TCP_STATS_INC(tcp.lenerr); + TCP_STATS_INC(tcp.drop); + snmp_inc_tcpinerrs(); + pbuf_free(p); + return; + } + + /* Convert fields in TCP header to host byte order. */ + tcphdr->src = ntohs(tcphdr->src); + tcphdr->dest = ntohs(tcphdr->dest); + seqno = tcphdr->seqno = ntohl(tcphdr->seqno); + ackno = tcphdr->ackno = ntohl(tcphdr->ackno); + tcphdr->wnd = ntohs(tcphdr->wnd); + + flags = TCPH_FLAGS(tcphdr); + tcplen = p->tot_len + ((flags & (TCP_FIN | TCP_SYN)) ? 1 : 0); + + /* Demultiplex an incoming segment. First, we check if it is destined + for an active connection. */ + prev = NULL; + + + for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { + LWIP_ASSERT("tcp_input: active pcb->state != CLOSED", pcb->state != CLOSED); + LWIP_ASSERT("tcp_input: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT); + LWIP_ASSERT("tcp_input: active pcb->state != LISTEN", pcb->state != LISTEN); + if (pcb->remote_port == tcphdr->src && + pcb->local_port == tcphdr->dest && + ip_addr_cmp(&(pcb->remote_ip), &(iphdr->src)) && + ip_addr_cmp(&(pcb->local_ip), &(iphdr->dest))) { + + /* Move this PCB to the front of the list so that subsequent + lookups will be faster (we exploit locality in TCP segment + arrivals). */ + LWIP_ASSERT("tcp_input: pcb->next != pcb (before cache)", pcb->next != pcb); + if (prev != NULL) { + prev->next = pcb->next; + pcb->next = tcp_active_pcbs; + tcp_active_pcbs = pcb; + } + LWIP_ASSERT("tcp_input: pcb->next != pcb (after cache)", pcb->next != pcb); + break; + } + prev = pcb; + } + + if (pcb == NULL) { + /* If it did not go to an active connection, we check the connections + in the TIME-WAIT state. */ + for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { + LWIP_ASSERT("tcp_input: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT); + if (pcb->remote_port == tcphdr->src && + pcb->local_port == tcphdr->dest && + ip_addr_cmp(&(pcb->remote_ip), &(iphdr->src)) && + ip_addr_cmp(&(pcb->local_ip), &(iphdr->dest))) { + /* We don't really care enough to move this PCB to the front + of the list since we are not very likely to receive that + many segments for connections in TIME-WAIT. */ + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: packed for TIME_WAITing connection.\n")); + tcp_timewait_input(pcb); + pbuf_free(p); + return; + } + } + + /* Finally, if we still did not get a match, we check all PCBs that + are LISTENing for incoming connections. */ + prev = NULL; + for(lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) { + if ((ip_addr_isany(&(lpcb->local_ip)) || + ip_addr_cmp(&(lpcb->local_ip), &(iphdr->dest))) && + lpcb->local_port == tcphdr->dest) { + /* Move this PCB to the front of the list so that subsequent + lookups will be faster (we exploit locality in TCP segment + arrivals). */ + if (prev != NULL) { + ((struct tcp_pcb_listen *)prev)->next = lpcb->next; + /* our successor is the remainder of the listening list */ + lpcb->next = tcp_listen_pcbs.listen_pcbs; + /* put this listening pcb at the head of the listening list */ + tcp_listen_pcbs.listen_pcbs = lpcb; + } + + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: packed for LISTENing connection.\n")); + tcp_listen_input(lpcb); + pbuf_free(p); + return; + } + prev = (struct tcp_pcb *)lpcb; + } + } + +#if TCP_INPUT_DEBUG + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("+-+-+-+-+-+-+-+-+-+-+-+-+-+- tcp_input: flags ")); + tcp_debug_print_flags(TCPH_FLAGS(tcphdr)); + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n")); +#endif /* TCP_INPUT_DEBUG */ + + + if (pcb != NULL) { + /* The incoming segment belongs to a connection. */ +#if TCP_INPUT_DEBUG +#if TCP_DEBUG + tcp_debug_print_state(pcb->state); +#endif /* TCP_DEBUG */ +#endif /* TCP_INPUT_DEBUG */ + + /* Set up a tcp_seg structure. */ + inseg.next = NULL; + inseg.len = p->tot_len; + inseg.dataptr = p->payload; + inseg.p = p; + inseg.tcphdr = tcphdr; + + recv_data = NULL; + recv_flags = 0; + + /* If there is data which was previously "refused" by upper layer */ + if (pcb->refused_data != NULL) { + /* Notify again application with data previously received. */ + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: notify kept packet\n")); + TCP_EVENT_RECV(pcb, pcb->refused_data, ERR_OK, err); + if (err == ERR_OK) { + pcb->refused_data = NULL; + } else { + /* drop incoming packets, because pcb is "full" */ + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: drop incoming packets, because pcb is \"full\"\n")); + TCP_STATS_INC(tcp.drop); + snmp_inc_tcpinerrs(); + pbuf_free(p); + return; + } + } + tcp_input_pcb = pcb; + err = tcp_process(pcb); + /* A return value of ERR_ABRT means that tcp_abort() was called + and that the pcb has been freed. If so, we don't do anything. */ + if (err != ERR_ABRT) { + if (recv_flags & TF_RESET) { + /* TF_RESET means that the connection was reset by the other + end. We then call the error callback to inform the + application that the connection is dead before we + deallocate the PCB. */ + TCP_EVENT_ERR(pcb->errf, pcb->callback_arg, ERR_RST); + tcp_pcb_remove(&tcp_active_pcbs, pcb); + memp_free(MEMP_TCP_PCB, pcb); + } else if (recv_flags & TF_CLOSED) { + /* The connection has been closed and we will deallocate the + PCB. */ + tcp_pcb_remove(&tcp_active_pcbs, pcb); + memp_free(MEMP_TCP_PCB, pcb); + } else { + err = ERR_OK; + /* If the application has registered a "sent" function to be + called when new send buffer space is available, we call it + now. */ + if (pcb->acked > 0) { + TCP_EVENT_SENT(pcb, pcb->acked, err); + } + + if (recv_data != NULL) { + if(flags & TCP_PSH) { + recv_data->flags |= PBUF_FLAG_PUSH; + } + + /* Notify application that data has been received. */ + TCP_EVENT_RECV(pcb, recv_data, ERR_OK, err); + + /* If the upper layer can't receive this data, store it */ + if (err != ERR_OK) { + pcb->refused_data = recv_data; + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: keep incoming packet, because pcb is \"full\"\n")); + } + } + + /* If a FIN segment was received, we call the callback + function with a NULL buffer to indicate EOF. */ + if (recv_flags & TF_GOT_FIN) { + TCP_EVENT_RECV(pcb, NULL, ERR_OK, err); + } + + tcp_input_pcb = NULL; + /* Try to send something out. */ + tcp_output(pcb); +#if TCP_INPUT_DEBUG +#if TCP_DEBUG + tcp_debug_print_state(pcb->state); +#endif /* TCP_DEBUG */ +#endif /* TCP_INPUT_DEBUG */ + } + } + tcp_input_pcb = NULL; + + + /* give up our reference to inseg.p */ + if (inseg.p != NULL) + { + pbuf_free(inseg.p); + inseg.p = NULL; + } + } else { + + /* If no matching PCB was found, send a TCP RST (reset) to the + sender. */ + LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_input: no PCB match found, resetting.\n")); + if (!(TCPH_FLAGS(tcphdr) & TCP_RST)) { + TCP_STATS_INC(tcp.proterr); + TCP_STATS_INC(tcp.drop); + tcp_rst(ackno, seqno + tcplen, + &(iphdr->dest), &(iphdr->src), + tcphdr->dest, tcphdr->src); + } + pbuf_free(p); + } + + LWIP_ASSERT("tcp_input: tcp_pcbs_sane()", tcp_pcbs_sane()); + PERF_STOP("tcp_input"); +} + +/** + * Called by tcp_input() when a segment arrives for a listening + * connection (from tcp_input()). + * + * @param pcb the tcp_pcb_listen for which a segment arrived + * @return ERR_OK if the segment was processed + * another err_t on error + * + * @note the return value is not (yet?) used in tcp_input() + * @note the segment which arrived is saved in global variables, therefore only the pcb + * involved is passed as a parameter to this function + */ +static err_t +tcp_listen_input(struct tcp_pcb_listen *pcb) +{ + struct tcp_pcb *npcb; + err_t rc; + + /* In the LISTEN state, we check for incoming SYN segments, + creates a new PCB, and responds with a SYN|ACK. */ + if (flags & TCP_ACK) { + /* For incoming segments with the ACK flag set, respond with a + RST. */ + LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_listen_input: ACK in LISTEN, sending reset\n")); + tcp_rst(ackno + 1, seqno + tcplen, + &(iphdr->dest), &(iphdr->src), + tcphdr->dest, tcphdr->src); + } else if (flags & TCP_SYN) { + LWIP_DEBUGF(TCP_DEBUG, ("TCP connection request %"U16_F" -> %"U16_F".\n", tcphdr->src, tcphdr->dest)); +#if TCP_LISTEN_BACKLOG + if (pcb->accepts_pending >= pcb->backlog) { + LWIP_DEBUGF(TCP_DEBUG, ("tcp_listen_input: listen backlog exceeded for port %"U16_F"\n", tcphdr->dest)); + return ERR_ABRT; + } +#endif /* TCP_LISTEN_BACKLOG */ + npcb = tcp_alloc(pcb->prio); + /* If a new PCB could not be created (probably due to lack of memory), + we don't do anything, but rely on the sender will retransmit the + SYN at a time when we have more memory available. */ + if (npcb == NULL) { + LWIP_DEBUGF(TCP_DEBUG, ("tcp_listen_input: could not allocate PCB\n")); + TCP_STATS_INC(tcp.memerr); + return ERR_MEM; + } +#if TCP_LISTEN_BACKLOG + pcb->accepts_pending++; +#endif /* TCP_LISTEN_BACKLOG */ + /* Set up the new PCB. */ + ip_addr_set(&(npcb->local_ip), &(iphdr->dest)); + npcb->local_port = pcb->local_port; + ip_addr_set(&(npcb->remote_ip), &(iphdr->src)); + npcb->remote_port = tcphdr->src; + npcb->state = SYN_RCVD; + npcb->rcv_nxt = seqno + 1; + npcb->rcv_ann_right_edge = npcb->rcv_nxt; + npcb->snd_wnd = tcphdr->wnd; + npcb->ssthresh = npcb->snd_wnd; + npcb->snd_wl1 = seqno - 1;/* initialise to seqno-1 to force window update */ + npcb->callback_arg = pcb->callback_arg; +#if LWIP_CALLBACK_API + npcb->accept = pcb->accept; +#endif /* LWIP_CALLBACK_API */ + /* inherit socket options */ + npcb->so_options = pcb->so_options & (SOF_DEBUG|SOF_DONTROUTE|SOF_KEEPALIVE|SOF_OOBINLINE|SOF_LINGER); + /* Register the new PCB so that we can begin receiving segments + for it. */ + TCP_REG(&tcp_active_pcbs, npcb); + + /* Parse any options in the SYN. */ + tcp_parseopt(npcb); +#if TCP_CALCULATE_EFF_SEND_MSS + npcb->mss = tcp_eff_send_mss(npcb->mss, &(npcb->remote_ip)); +#endif /* TCP_CALCULATE_EFF_SEND_MSS */ + + snmp_inc_tcppassiveopens(); + + /* Send a SYN|ACK together with the MSS option. */ + rc = tcp_enqueue(npcb, NULL, 0, TCP_SYN | TCP_ACK, 0, TF_SEG_OPTS_MSS +#if LWIP_TCP_TIMESTAMPS + /* and maybe include the TIMESTAMP option */ + | (npcb->flags & TF_TIMESTAMP ? TF_SEG_OPTS_TS : 0) +#endif + ); + if (rc != ERR_OK) { + tcp_abandon(npcb, 0); + return rc; + } + return tcp_output(npcb); + } + return ERR_OK; +} + +/** + * Called by tcp_input() when a segment arrives for a connection in + * TIME_WAIT. + * + * @param pcb the tcp_pcb for which a segment arrived + * + * @note the segment which arrived is saved in global variables, therefore only the pcb + * involved is passed as a parameter to this function + */ +static err_t +tcp_timewait_input(struct tcp_pcb *pcb) +{ + /* RFC 1337: in TIME_WAIT, ignore RST and ACK FINs + any 'acceptable' segments */ + /* RFC 793 3.9 Event Processing - Segment Arrives: + * - first check sequence number - we skip that one in TIME_WAIT (always + * acceptable since we only send ACKs) + * - second check the RST bit (... return) */ + if (flags & TCP_RST) { + return ERR_OK; + } + /* - fourth, check the SYN bit, */ + if (flags & TCP_SYN) { + /* If an incoming segment is not acceptable, an acknowledgment + should be sent in reply */ + if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt+pcb->rcv_wnd)) { + /* If the SYN is in the window it is an error, send a reset */ + tcp_rst(ackno, seqno + tcplen, &(iphdr->dest), &(iphdr->src), + tcphdr->dest, tcphdr->src); + return ERR_OK; + } + } else if (flags & TCP_FIN) { + /* - eighth, check the FIN bit: Remain in the TIME-WAIT state. + Restart the 2 MSL time-wait timeout.*/ + pcb->tmr = tcp_ticks; + } + + if ((tcplen > 0)) { + /* Acknowledge data, FIN or out-of-window SYN */ + pcb->flags |= TF_ACK_NOW; + return tcp_output(pcb); + } + return ERR_OK; +} + +/** + * Implements the TCP state machine. Called by tcp_input. In some + * states tcp_receive() is called to receive data. The tcp_seg + * argument will be freed by the caller (tcp_input()) unless the + * recv_data pointer in the pcb is set. + * + * @param pcb the tcp_pcb for which a segment arrived + * + * @note the segment which arrived is saved in global variables, therefore only the pcb + * involved is passed as a parameter to this function + */ +static err_t +tcp_process(struct tcp_pcb *pcb) +{ + struct tcp_seg *rseg; + u8_t acceptable = 0; + err_t err; + + err = ERR_OK; + + /* Process incoming RST segments. */ + if (flags & TCP_RST) { + /* First, determine if the reset is acceptable. */ + if (pcb->state == SYN_SENT) { + if (ackno == pcb->snd_nxt) { + acceptable = 1; + } + } else { + if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, + pcb->rcv_nxt+pcb->rcv_wnd)) { + acceptable = 1; + } + } + + if (acceptable) { + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_process: Connection RESET\n")); + LWIP_ASSERT("tcp_input: pcb->state != CLOSED", pcb->state != CLOSED); + recv_flags |= TF_RESET; + pcb->flags &= ~TF_ACK_DELAY; + return ERR_RST; + } else { + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_process: unacceptable reset seqno %"U32_F" rcv_nxt %"U32_F"\n", + seqno, pcb->rcv_nxt)); + LWIP_DEBUGF(TCP_DEBUG, ("tcp_process: unacceptable reset seqno %"U32_F" rcv_nxt %"U32_F"\n", + seqno, pcb->rcv_nxt)); + return ERR_OK; + } + } + + if ((flags & TCP_SYN) && (pcb->state != SYN_SENT && pcb->state != SYN_RCVD)) { + /* Cope with new connection attempt after remote end crashed */ + tcp_ack_now(pcb); + return ERR_OK; + } + + /* Update the PCB (in)activity timer. */ + pcb->tmr = tcp_ticks; + pcb->keep_cnt_sent = 0; + + tcp_parseopt(pcb); + + /* Do different things depending on the TCP state. */ + switch (pcb->state) { + case SYN_SENT: + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("SYN-SENT: ackno %"U32_F" pcb->snd_nxt %"U32_F" unacked %"U32_F"\n", ackno, + pcb->snd_nxt, ntohl(pcb->unacked->tcphdr->seqno))); + /* received SYN ACK with expected sequence number? */ + if ((flags & TCP_ACK) && (flags & TCP_SYN) + && ackno == ntohl(pcb->unacked->tcphdr->seqno) + 1) { + pcb->snd_buf++; + pcb->rcv_nxt = seqno + 1; + pcb->rcv_ann_right_edge = pcb->rcv_nxt; + pcb->lastack = ackno; + pcb->snd_wnd = tcphdr->wnd; + pcb->snd_wl1 = seqno - 1; /* initialise to seqno - 1 to force window update */ + pcb->state = ESTABLISHED; + +#if TCP_CALCULATE_EFF_SEND_MSS + pcb->mss = tcp_eff_send_mss(pcb->mss, &(pcb->remote_ip)); +#endif /* TCP_CALCULATE_EFF_SEND_MSS */ + + /* Set ssthresh again after changing pcb->mss (already set in tcp_connect + * but for the default value of pcb->mss) */ + pcb->ssthresh = pcb->mss * 10; + + pcb->cwnd = ((pcb->cwnd == 1) ? (pcb->mss * 2) : pcb->mss); + LWIP_ASSERT("pcb->snd_queuelen > 0", (pcb->snd_queuelen > 0)); + --pcb->snd_queuelen; + LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_process: SYN-SENT --queuelen %"U16_F"\n", (u16_t)pcb->snd_queuelen)); + rseg = pcb->unacked; + pcb->unacked = rseg->next; + + /* If there's nothing left to acknowledge, stop the retransmit + timer, otherwise reset it to start again */ + if(pcb->unacked == NULL) + pcb->rtime = -1; + else { + pcb->rtime = 0; + pcb->nrtx = 0; + } + + tcp_seg_free(rseg); + + /* Call the user specified function to call when sucessfully + * connected. */ + TCP_EVENT_CONNECTED(pcb, ERR_OK, err); + tcp_ack_now(pcb); + } + /* received ACK? possibly a half-open connection */ + else if (flags & TCP_ACK) { + /* send a RST to bring the other side in a non-synchronized state. */ + tcp_rst(ackno, seqno + tcplen, &(iphdr->dest), &(iphdr->src), + tcphdr->dest, tcphdr->src); + } + break; + case SYN_RCVD: + if (flags & TCP_ACK) { + /* expected ACK number? */ + if (TCP_SEQ_BETWEEN(ackno, pcb->lastack+1, pcb->snd_nxt)) { + u16_t old_cwnd; + pcb->state = ESTABLISHED; + LWIP_DEBUGF(TCP_DEBUG, ("TCP connection established %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest)); +#if LWIP_CALLBACK_API + LWIP_ASSERT("pcb->accept != NULL", pcb->accept != NULL); +#endif + /* Call the accept function. */ + TCP_EVENT_ACCEPT(pcb, ERR_OK, err); + if (err != ERR_OK) { + /* If the accept function returns with an error, we abort + * the connection. */ + tcp_abort(pcb); + return ERR_ABRT; + } + old_cwnd = pcb->cwnd; + /* If there was any data contained within this ACK, + * we'd better pass it on to the application as well. */ + tcp_receive(pcb); + + /* Prevent ACK for SYN to generate a sent event */ + if (pcb->acked != 0) { + pcb->acked--; + } + + pcb->cwnd = ((old_cwnd == 1) ? (pcb->mss * 2) : pcb->mss); + + if (recv_flags & TF_GOT_FIN) { + tcp_ack_now(pcb); + pcb->state = CLOSE_WAIT; + } + } + /* incorrect ACK number */ + else { + /* send RST */ + tcp_rst(ackno, seqno + tcplen, &(iphdr->dest), &(iphdr->src), + tcphdr->dest, tcphdr->src); + } + } else if ((flags & TCP_SYN) && (seqno == pcb->rcv_nxt - 1)) { + /* Looks like another copy of the SYN - retransmit our SYN-ACK */ + tcp_rexmit(pcb); + } + break; + case CLOSE_WAIT: + /* FALLTHROUGH */ + case ESTABLISHED: + tcp_receive(pcb); + if (recv_flags & TF_GOT_FIN) { /* passive close */ + tcp_ack_now(pcb); + pcb->state = CLOSE_WAIT; + } + break; + case FIN_WAIT_1: + tcp_receive(pcb); + if (recv_flags & TF_GOT_FIN) { + if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt)) { + LWIP_DEBUGF(TCP_DEBUG, + ("TCP connection closed: FIN_WAIT_1 %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest)); + tcp_ack_now(pcb); + tcp_pcb_purge(pcb); + TCP_RMV(&tcp_active_pcbs, pcb); + pcb->state = TIME_WAIT; + TCP_REG(&tcp_tw_pcbs, pcb); + } else { + tcp_ack_now(pcb); + pcb->state = CLOSING; + } + } else if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt)) { + pcb->state = FIN_WAIT_2; + } + break; + case FIN_WAIT_2: + tcp_receive(pcb); + if (recv_flags & TF_GOT_FIN) { + LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: FIN_WAIT_2 %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest)); + tcp_ack_now(pcb); + tcp_pcb_purge(pcb); + TCP_RMV(&tcp_active_pcbs, pcb); + pcb->state = TIME_WAIT; + TCP_REG(&tcp_tw_pcbs, pcb); + } + break; + case CLOSING: + tcp_receive(pcb); + if (flags & TCP_ACK && ackno == pcb->snd_nxt) { + LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: CLOSING %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest)); + tcp_pcb_purge(pcb); + TCP_RMV(&tcp_active_pcbs, pcb); + pcb->state = TIME_WAIT; + TCP_REG(&tcp_tw_pcbs, pcb); + } + break; + case LAST_ACK: + tcp_receive(pcb); + if (flags & TCP_ACK && ackno == pcb->snd_nxt) { + LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: LAST_ACK %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest)); + /* bugfix #21699: don't set pcb->state to CLOSED here or we risk leaking segments */ + recv_flags |= TF_CLOSED; + } + break; + default: + break; + } + return ERR_OK; +} + +#if TCP_QUEUE_OOSEQ +/** + * Insert segment into the list (segments covered with new one will be deleted) + * + * Called from tcp_receive() + */ +static void +tcp_oos_insert_segment(struct tcp_seg *cseg, struct tcp_seg *next) +{ + struct tcp_seg *old_seg; + + if (TCPH_FLAGS(cseg->tcphdr) & TCP_FIN) { + /* received segment overlaps all following segments */ + tcp_segs_free(next); + next = NULL; + } + else { + /* delete some following segments + oos queue may have segments with FIN flag */ + while (next && + TCP_SEQ_GEQ((seqno + cseg->len), + (next->tcphdr->seqno + next->len))) { + /* cseg with FIN already processed */ + if (TCPH_FLAGS(next->tcphdr) & TCP_FIN) { + TCPH_FLAGS_SET(cseg->tcphdr, TCPH_FLAGS(cseg->tcphdr) | TCP_FIN); + } + old_seg = next; + next = next->next; + tcp_seg_free(old_seg); + } + if (next && + TCP_SEQ_GT(seqno + cseg->len, next->tcphdr->seqno)) { + /* We need to trim the incoming segment. */ + cseg->len = (u16_t)(next->tcphdr->seqno - seqno); + pbuf_realloc(cseg->p, cseg->len); + } + } + cseg->next = next; +} +#endif + +/** + * Called by tcp_process. Checks if the given segment is an ACK for outstanding + * data, and if so frees the memory of the buffered data. Next, is places the + * segment on any of the receive queues (pcb->recved or pcb->ooseq). If the segment + * is buffered, the pbuf is referenced by pbuf_ref so that it will not be freed until + * i it has been removed from the buffer. + * + * If the incoming segment constitutes an ACK for a segment that was used for RTT + * estimation, the RTT is estimated here as well. + * + * Called from tcp_process(). + */ +static void +tcp_receive(struct tcp_pcb *pcb) +{ + struct tcp_seg *next; +#if TCP_QUEUE_OOSEQ + struct tcp_seg *prev, *cseg; +#endif + struct pbuf *p; + s32_t off; + s16_t m; + u32_t right_wnd_edge; + u16_t new_tot_len; + int found_dupack = 0; + + if (flags & TCP_ACK) { + right_wnd_edge = pcb->snd_wnd + pcb->snd_wl2; + + /* Update window. */ + if (TCP_SEQ_LT(pcb->snd_wl1, seqno) || + (pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) || + (pcb->snd_wl2 == ackno && tcphdr->wnd > pcb->snd_wnd)) { + pcb->snd_wnd = tcphdr->wnd; + pcb->snd_wl1 = seqno; + pcb->snd_wl2 = ackno; + if (pcb->snd_wnd > 0 && pcb->persist_backoff > 0) { + pcb->persist_backoff = 0; + } + LWIP_DEBUGF(TCP_WND_DEBUG, ("tcp_receive: window update %"U16_F"\n", pcb->snd_wnd)); +#if TCP_WND_DEBUG + } else { + if (pcb->snd_wnd != tcphdr->wnd) { + LWIP_DEBUGF(TCP_WND_DEBUG, + ("tcp_receive: no window update lastack %"U32_F" ackno %" + U32_F" wl1 %"U32_F" seqno %"U32_F" wl2 %"U32_F"\n", + pcb->lastack, ackno, pcb->snd_wl1, seqno, pcb->snd_wl2)); + } +#endif /* TCP_WND_DEBUG */ + } + + /* (From Stevens TCP/IP Illustrated Vol II, p970.) Its only a + * duplicate ack if: + * 1) It doesn't ACK new data + * 2) length of received packet is zero (i.e. no payload) + * 3) the advertised window hasn't changed + * 4) There is outstanding unacknowledged data (retransmission timer running) + * 5) The ACK is == biggest ACK sequence number so far seen (snd_una) + * + * If it passes all five, should process as a dupack: + * a) dupacks < 3: do nothing + * b) dupacks == 3: fast retransmit + * c) dupacks > 3: increase cwnd + * + * If it only passes 1-3, should reset dupack counter (and add to + * stats, which we don't do in lwIP) + * + * If it only passes 1, should reset dupack counter + * + */ + + /* Clause 1 */ + if (TCP_SEQ_LEQ(ackno, pcb->lastack)) { + pcb->acked = 0; + /* Clause 2 */ + if (tcplen == 0) { + /* Clause 3 */ + if (pcb->snd_wl2 + pcb->snd_wnd == right_wnd_edge){ + /* Clause 4 */ + if (pcb->rtime >= 0) { + /* Clause 5 */ + if (pcb->lastack == ackno) { + found_dupack = 1; + if (pcb->dupacks + 1 > pcb->dupacks) + ++pcb->dupacks; + if (pcb->dupacks > 3) { + /* Inflate the congestion window, but not if it means that + the value overflows. */ + if ((u16_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) { + pcb->cwnd += pcb->mss; + } + } else if (pcb->dupacks == 3) { + /* Do fast retransmit */ + tcp_rexmit_fast(pcb); + } + } + } + } + } + /* If Clause (1) or more is true, but not a duplicate ack, reset + * count of consecutive duplicate acks */ + if (!found_dupack) { + pcb->dupacks = 0; + } + } else if (TCP_SEQ_BETWEEN(ackno, pcb->lastack+1, pcb->snd_nxt)){ + /* We come here when the ACK acknowledges new data. */ + + /* Reset the "IN Fast Retransmit" flag, since we are no longer + in fast retransmit. Also reset the congestion window to the + slow start threshold. */ + if (pcb->flags & TF_INFR) { + pcb->flags &= ~TF_INFR; + pcb->cwnd = pcb->ssthresh; + } + + /* Reset the number of retransmissions. */ + pcb->nrtx = 0; + + /* Reset the retransmission time-out. */ + pcb->rto = (pcb->sa >> 3) + pcb->sv; + + /* Update the send buffer space. Diff between the two can never exceed 64K? */ + pcb->acked = (u16_t)(ackno - pcb->lastack); + + pcb->snd_buf += pcb->acked; + + /* Reset the fast retransmit variables. */ + pcb->dupacks = 0; + pcb->lastack = ackno; + + /* Update the congestion control variables (cwnd and + ssthresh). */ + if (pcb->state >= ESTABLISHED) { + if (pcb->cwnd < pcb->ssthresh) { + if ((u16_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) { + pcb->cwnd += pcb->mss; + } + LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_receive: slow start cwnd %"U16_F"\n", pcb->cwnd)); + } else { + u16_t new_cwnd = (pcb->cwnd + pcb->mss * pcb->mss / pcb->cwnd); + if (new_cwnd > pcb->cwnd) { + pcb->cwnd = new_cwnd; + } + LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_receive: congestion avoidance cwnd %"U16_F"\n", pcb->cwnd)); + } + } + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: ACK for %"U32_F", unacked->seqno %"U32_F":%"U32_F"\n", + ackno, + pcb->unacked != NULL? + ntohl(pcb->unacked->tcphdr->seqno): 0, + pcb->unacked != NULL? + ntohl(pcb->unacked->tcphdr->seqno) + TCP_TCPLEN(pcb->unacked): 0)); + + /* Remove segment from the unacknowledged list if the incoming + ACK acknowlegdes them. */ + while (pcb->unacked != NULL && + TCP_SEQ_LEQ(ntohl(pcb->unacked->tcphdr->seqno) + + TCP_TCPLEN(pcb->unacked), ackno)) { + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: removing %"U32_F":%"U32_F" from pcb->unacked\n", + ntohl(pcb->unacked->tcphdr->seqno), + ntohl(pcb->unacked->tcphdr->seqno) + + TCP_TCPLEN(pcb->unacked))); + + next = pcb->unacked; + pcb->unacked = pcb->unacked->next; + + LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_receive: queuelen %"U16_F" ... ", (u16_t)pcb->snd_queuelen)); + LWIP_ASSERT("pcb->snd_queuelen >= pbuf_clen(next->p)", (pcb->snd_queuelen >= pbuf_clen(next->p))); + /* Prevent ACK for FIN to generate a sent event */ + if ((pcb->acked != 0) && ((TCPH_FLAGS(next->tcphdr) & TCP_FIN) != 0)) { + pcb->acked--; + } + + pcb->snd_queuelen -= pbuf_clen(next->p); + tcp_seg_free(next); + + LWIP_DEBUGF(TCP_QLEN_DEBUG, ("%"U16_F" (after freeing unacked)\n", (u16_t)pcb->snd_queuelen)); + if (pcb->snd_queuelen != 0) { + LWIP_ASSERT("tcp_receive: valid queue length", pcb->unacked != NULL || + pcb->unsent != NULL); + } + } + + /* If there's nothing left to acknowledge, stop the retransmit + timer, otherwise reset it to start again */ + if(pcb->unacked == NULL) + pcb->rtime = -1; + else + pcb->rtime = 0; + + pcb->polltmr = 0; + } else { + /* Fix bug bug #21582: out of sequence ACK, didn't really ack anything */ + pcb->acked = 0; + } + + /* We go through the ->unsent list to see if any of the segments + on the list are acknowledged by the ACK. This may seem + strange since an "unsent" segment shouldn't be acked. The + rationale is that lwIP puts all outstanding segments on the + ->unsent list after a retransmission, so these segments may + in fact have been sent once. */ + while (pcb->unsent != NULL && + TCP_SEQ_BETWEEN(ackno, ntohl(pcb->unsent->tcphdr->seqno) + + TCP_TCPLEN(pcb->unsent), pcb->snd_nxt)) { + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: removing %"U32_F":%"U32_F" from pcb->unsent\n", + ntohl(pcb->unsent->tcphdr->seqno), ntohl(pcb->unsent->tcphdr->seqno) + + TCP_TCPLEN(pcb->unsent))); + + next = pcb->unsent; + pcb->unsent = pcb->unsent->next; + LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_receive: queuelen %"U16_F" ... ", (u16_t)pcb->snd_queuelen)); + LWIP_ASSERT("pcb->snd_queuelen >= pbuf_clen(next->p)", (pcb->snd_queuelen >= pbuf_clen(next->p))); + /* Prevent ACK for FIN to generate a sent event */ + if ((pcb->acked != 0) && ((TCPH_FLAGS(next->tcphdr) & TCP_FIN) != 0)) { + pcb->acked--; + } + pcb->snd_queuelen -= pbuf_clen(next->p); + tcp_seg_free(next); + LWIP_DEBUGF(TCP_QLEN_DEBUG, ("%"U16_F" (after freeing unsent)\n", (u16_t)pcb->snd_queuelen)); + if (pcb->snd_queuelen != 0) { + LWIP_ASSERT("tcp_receive: valid queue length", + pcb->unacked != NULL || pcb->unsent != NULL); + } + } + /* End of ACK for new data processing. */ + + LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: pcb->rttest %"U32_F" rtseq %"U32_F" ackno %"U32_F"\n", + pcb->rttest, pcb->rtseq, ackno)); + + /* RTT estimation calculations. This is done by checking if the + incoming segment acknowledges the segment we use to take a + round-trip time measurement. */ + if (pcb->rttest && TCP_SEQ_LT(pcb->rtseq, ackno)) { + /* diff between this shouldn't exceed 32K since this are tcp timer ticks + and a round-trip shouldn't be that long... */ + m = (s16_t)(tcp_ticks - pcb->rttest); + + LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: experienced rtt %"U16_F" ticks (%"U16_F" msec).\n", + m, m * TCP_SLOW_INTERVAL)); + + /* This is taken directly from VJs original code in his paper */ + m = m - (pcb->sa >> 3); + pcb->sa += m; + if (m < 0) { + m = -m; + } + m = m - (pcb->sv >> 2); + pcb->sv += m; + pcb->rto = (pcb->sa >> 3) + pcb->sv; + + LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: RTO %"U16_F" (%"U16_F" milliseconds)\n", + pcb->rto, pcb->rto * TCP_SLOW_INTERVAL)); + + pcb->rttest = 0; + } + } + + /* If the incoming segment contains data, we must process it + further. */ + if (tcplen > 0) { + /* This code basically does three things: + + +) If the incoming segment contains data that is the next + in-sequence data, this data is passed to the application. This + might involve trimming the first edge of the data. The rcv_nxt + variable and the advertised window are adjusted. + + +) If the incoming segment has data that is above the next + sequence number expected (->rcv_nxt), the segment is placed on + the ->ooseq queue. This is done by finding the appropriate + place in the ->ooseq queue (which is ordered by sequence + number) and trim the segment in both ends if needed. An + immediate ACK is sent to indicate that we received an + out-of-sequence segment. + + +) Finally, we check if the first segment on the ->ooseq queue + now is in sequence (i.e., if rcv_nxt >= ooseq->seqno). If + rcv_nxt > ooseq->seqno, we must trim the first edge of the + segment on ->ooseq before we adjust rcv_nxt. The data in the + segments that are now on sequence are chained onto the + incoming segment so that we only need to call the application + once. + */ + + /* First, we check if we must trim the first edge. We have to do + this if the sequence number of the incoming segment is less + than rcv_nxt, and the sequence number plus the length of the + segment is larger than rcv_nxt. */ + /* if (TCP_SEQ_LT(seqno, pcb->rcv_nxt)){ + if (TCP_SEQ_LT(pcb->rcv_nxt, seqno + tcplen)) {*/ + if (TCP_SEQ_BETWEEN(pcb->rcv_nxt, seqno + 1, seqno + tcplen - 1)){ + /* Trimming the first edge is done by pushing the payload + pointer in the pbuf downwards. This is somewhat tricky since + we do not want to discard the full contents of the pbuf up to + the new starting point of the data since we have to keep the + TCP header which is present in the first pbuf in the chain. + + What is done is really quite a nasty hack: the first pbuf in + the pbuf chain is pointed to by inseg.p. Since we need to be + able to deallocate the whole pbuf, we cannot change this + inseg.p pointer to point to any of the later pbufs in the + chain. Instead, we point the ->payload pointer in the first + pbuf to data in one of the later pbufs. We also set the + inseg.data pointer to point to the right place. This way, the + ->p pointer will still point to the first pbuf, but the + ->p->payload pointer will point to data in another pbuf. + + After we are done with adjusting the pbuf pointers we must + adjust the ->data pointer in the seg and the segment + length.*/ + + off = pcb->rcv_nxt - seqno; + p = inseg.p; + LWIP_ASSERT("inseg.p != NULL", inseg.p); + LWIP_ASSERT("insane offset!", (off < 0x7fff)); + if (inseg.p->len < off) { + LWIP_ASSERT("pbuf too short!", (((s32_t)inseg.p->tot_len) >= off)); + new_tot_len = (u16_t)(inseg.p->tot_len - off); + while (p->len < off) { + off -= p->len; + /* KJM following line changed (with addition of new_tot_len var) + to fix bug #9076 + inseg.p->tot_len -= p->len; */ + p->tot_len = new_tot_len; + p->len = 0; + p = p->next; + } + if(pbuf_header(p, (s16_t)-off)) { + /* Do we need to cope with this failing? Assert for now */ + LWIP_ASSERT("pbuf_header failed", 0); + } + } else { + if(pbuf_header(inseg.p, (s16_t)-off)) { + /* Do we need to cope with this failing? Assert for now */ + LWIP_ASSERT("pbuf_header failed", 0); + } + } + /* KJM following line changed to use p->payload rather than inseg->p->payload + to fix bug #9076 */ + inseg.dataptr = p->payload; + inseg.len -= (u16_t)(pcb->rcv_nxt - seqno); + inseg.tcphdr->seqno = seqno = pcb->rcv_nxt; + } + else { + if (TCP_SEQ_LT(seqno, pcb->rcv_nxt)){ + /* the whole segment is < rcv_nxt */ + /* must be a duplicate of a packet that has already been correctly handled */ + + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: duplicate seqno %"U32_F"\n", seqno)); + tcp_ack_now(pcb); + } + } + + /* The sequence number must be within the window (above rcv_nxt + and below rcv_nxt + rcv_wnd) in order to be further + processed. */ + if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, + pcb->rcv_nxt + pcb->rcv_wnd - 1)){ + if (pcb->rcv_nxt == seqno) { + /* The incoming segment is the next in sequence. We check if + we have to trim the end of the segment and update rcv_nxt + and pass the data to the application. */ + tcplen = TCP_TCPLEN(&inseg); + + if (tcplen > pcb->rcv_wnd) { + LWIP_DEBUGF(TCP_INPUT_DEBUG, + ("tcp_receive: other end overran receive window" + "seqno %"U32_F" len %"U32_F" right edge %"U32_F"\n", + seqno, tcplen, pcb->rcv_nxt + pcb->rcv_wnd)); + if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) { + /* Must remove the FIN from the header as we're trimming + * that byte of sequence-space from the packet */ + TCPH_FLAGS_SET(inseg.tcphdr, TCPH_FLAGS(inseg.tcphdr) &~ TCP_FIN); + } + /* Adjust length of segment to fit in the window. */ + inseg.len = pcb->rcv_wnd; + if (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) { + inseg.len -= 1; + } + pbuf_realloc(inseg.p, inseg.len); + tcplen = TCP_TCPLEN(&inseg); + LWIP_ASSERT("tcp_receive: segment not trimmed correctly to rcv_wnd\n", + (seqno + tcplen) == (pcb->rcv_nxt + pcb->rcv_wnd)); + } +#if TCP_QUEUE_OOSEQ + if (pcb->ooseq != NULL) { + if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) { + LWIP_DEBUGF(TCP_INPUT_DEBUG, + ("tcp_receive: received in-order FIN, binning ooseq queue\n")); + /* Received in-order FIN means anything that was received + * out of order must now have been received in-order, so + * bin the ooseq queue + * rcv_nxt + * . |--ooseq--| + * .==seg============|FIN + */ + while (pcb->ooseq != NULL) { + struct tcp_seg *old_ooseq = pcb->ooseq; + pcb->ooseq = pcb->ooseq->next; + tcp_seg_free(old_ooseq); + } + } + else { + struct tcp_seg* next = pcb->ooseq; + struct tcp_seg *old_seg; + /* rcv_nxt + * . |--ooseq--| + * .==seg============| + */ + while (next && + TCP_SEQ_GEQ(seqno + tcplen, + next->tcphdr->seqno + next->len)) { + /* inseg doesn't have FIN (already processed) */ + if (TCPH_FLAGS(next->tcphdr) & TCP_FIN && + (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) == 0) { + TCPH_FLAGS_SET(inseg.tcphdr, + TCPH_FLAGS(inseg.tcphdr) | TCP_FIN); + tcplen = TCP_TCPLEN(&inseg); + } + old_seg = next; + next = next->next; + tcp_seg_free(old_seg); + } + /* rcv_nxt + * . |--ooseq--| + * .==seg============| + */ + if (next && + TCP_SEQ_GT(seqno + tcplen, + next->tcphdr->seqno)) { + /* FIN in inseg already handled by dropping whole ooseq queue */ + inseg.len = (u16_t)(pcb->ooseq->tcphdr->seqno - seqno); + if (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) { + inseg.len -= 1; + } + pbuf_realloc(inseg.p, inseg.len); + tcplen = TCP_TCPLEN(&inseg); + LWIP_ASSERT("tcp_receive: segment not trimmed correctly to ooseq queue\n", + (seqno + tcplen) == pcb->ooseq->tcphdr->seqno); + } + pcb->ooseq = next; + } + } +#endif /* TCP_QUEUE_OOSEQ */ + + pcb->rcv_nxt = seqno + tcplen; + + /* Update the receiver's (our) window. */ + LWIP_ASSERT("tcp_receive: tcplen > rcv_wnd\n", pcb->rcv_wnd >= tcplen); + pcb->rcv_wnd -= tcplen; + + tcp_update_rcv_ann_wnd(pcb); + + /* If there is data in the segment, we make preparations to + pass this up to the application. The ->recv_data variable + is used for holding the pbuf that goes to the + application. The code for reassembling out-of-sequence data + chains its data on this pbuf as well. + + If the segment was a FIN, we set the TF_GOT_FIN flag that will + be used to indicate to the application that the remote side has + closed its end of the connection. */ + if (inseg.p->tot_len > 0) { + recv_data = inseg.p; + /* Since this pbuf now is the responsibility of the + application, we delete our reference to it so that we won't + (mistakingly) deallocate it. */ + inseg.p = NULL; + } + if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) { + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: received FIN.\n")); + recv_flags |= TF_GOT_FIN; + } + +#if TCP_QUEUE_OOSEQ + /* We now check if we have segments on the ->ooseq queue that + is now in sequence. */ + while (pcb->ooseq != NULL && + pcb->ooseq->tcphdr->seqno == pcb->rcv_nxt) { + + cseg = pcb->ooseq; + seqno = pcb->ooseq->tcphdr->seqno; + + pcb->rcv_nxt += TCP_TCPLEN(cseg); + LWIP_ASSERT("tcp_receive: ooseq tcplen > rcv_wnd\n", + pcb->rcv_wnd >= TCP_TCPLEN(cseg)); + pcb->rcv_wnd -= TCP_TCPLEN(cseg); + + tcp_update_rcv_ann_wnd(pcb); + + if (cseg->p->tot_len > 0) { + /* Chain this pbuf onto the pbuf that we will pass to + the application. */ + if (recv_data) { + pbuf_cat(recv_data, cseg->p); + } else { + recv_data = cseg->p; + } + cseg->p = NULL; + } + if (TCPH_FLAGS(cseg->tcphdr) & TCP_FIN) { + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: dequeued FIN.\n")); + recv_flags |= TF_GOT_FIN; + if (pcb->state == ESTABLISHED) { /* force passive close or we can move to active close */ + pcb->state = CLOSE_WAIT; + } + } + + pcb->ooseq = cseg->next; + tcp_seg_free(cseg); + } +#endif /* TCP_QUEUE_OOSEQ */ + + + /* Acknowledge the segment(s). */ + tcp_ack(pcb); + + } else { + /* We get here if the incoming segment is out-of-sequence. */ + tcp_send_empty_ack(pcb); +#if TCP_QUEUE_OOSEQ + /* We queue the segment on the ->ooseq queue. */ + if (pcb->ooseq == NULL) { + pcb->ooseq = tcp_seg_copy(&inseg); + } else { + /* If the queue is not empty, we walk through the queue and + try to find a place where the sequence number of the + incoming segment is between the sequence numbers of the + previous and the next segment on the ->ooseq queue. That is + the place where we put the incoming segment. If needed, we + trim the second edges of the previous and the incoming + segment so that it will fit into the sequence. + + If the incoming segment has the same sequence number as a + segment on the ->ooseq queue, we discard the segment that + contains less data. */ + + prev = NULL; + for(next = pcb->ooseq; next != NULL; next = next->next) { + if (seqno == next->tcphdr->seqno) { + /* The sequence number of the incoming segment is the + same as the sequence number of the segment on + ->ooseq. We check the lengths to see which one to + discard. */ + if (inseg.len > next->len) { + /* The incoming segment is larger than the old + segment. We replace some segments with the new + one. */ + cseg = tcp_seg_copy(&inseg); + if (cseg != NULL) { + if (prev != NULL) { + prev->next = cseg; + } else { + pcb->ooseq = cseg; + } + tcp_oos_insert_segment(cseg, next); + } + break; + } else { + /* Either the lenghts are the same or the incoming + segment was smaller than the old one; in either + case, we ditch the incoming segment. */ + break; + } + } else { + if (prev == NULL) { + if (TCP_SEQ_LT(seqno, next->tcphdr->seqno)) { + /* The sequence number of the incoming segment is lower + than the sequence number of the first segment on the + queue. We put the incoming segment first on the + queue. */ + cseg = tcp_seg_copy(&inseg); + if (cseg != NULL) { + pcb->ooseq = cseg; + tcp_oos_insert_segment(cseg, next); + } + break; + } + } else { + /*if (TCP_SEQ_LT(prev->tcphdr->seqno, seqno) && + TCP_SEQ_LT(seqno, next->tcphdr->seqno)) {*/ + if (TCP_SEQ_BETWEEN(seqno, prev->tcphdr->seqno+1, next->tcphdr->seqno-1)) { + /* The sequence number of the incoming segment is in + between the sequence numbers of the previous and + the next segment on ->ooseq. We trim trim the previous + segment, delete next segments that included in received segment + and trim received, if needed. */ + cseg = tcp_seg_copy(&inseg); + if (cseg != NULL) { + if (TCP_SEQ_GT(prev->tcphdr->seqno + prev->len, seqno)) { + /* We need to trim the prev segment. */ + prev->len = (u16_t)(seqno - prev->tcphdr->seqno); + pbuf_realloc(prev->p, prev->len); + } + prev->next = cseg; + tcp_oos_insert_segment(cseg, next); + } + break; + } + } + /* If the "next" segment is the last segment on the + ooseq queue, we add the incoming segment to the end + of the list. */ + if (next->next == NULL && + TCP_SEQ_GT(seqno, next->tcphdr->seqno)) { + if (TCPH_FLAGS(next->tcphdr) & TCP_FIN) { + /* segment "next" already contains all data */ + break; + } + next->next = tcp_seg_copy(&inseg); + if (next->next != NULL) { + if (TCP_SEQ_GT(next->tcphdr->seqno + next->len, seqno)) { + /* We need to trim the last segment. */ + next->len = (u16_t)(seqno - next->tcphdr->seqno); + pbuf_realloc(next->p, next->len); + } + } + break; + } + } + prev = next; + } + } +#endif /* TCP_QUEUE_OOSEQ */ + + } + } else { + /* The incoming segment is not withing the window. */ + tcp_send_empty_ack(pcb); + } + } else { + /* Segments with length 0 is taken care of here. Segments that + fall out of the window are ACKed. */ + /*if (TCP_SEQ_GT(pcb->rcv_nxt, seqno) || + TCP_SEQ_GEQ(seqno, pcb->rcv_nxt + pcb->rcv_wnd)) {*/ + if(!TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt + pcb->rcv_wnd-1)){ + tcp_ack_now(pcb); + } + } +} + +/** + * Parses the options contained in the incoming segment. + * + * Called from tcp_listen_input() and tcp_process(). + * Currently, only the MSS option is supported! + * + * @param pcb the tcp_pcb for which a segment arrived + */ +static void +tcp_parseopt(struct tcp_pcb *pcb) +{ + u16_t c, max_c; + u16_t mss; + u8_t *opts, opt; +#if LWIP_TCP_TIMESTAMPS + u32_t tsval; +#endif + + opts = (u8_t *)tcphdr + TCP_HLEN; + + /* Parse the TCP MSS option, if present. */ + if(TCPH_HDRLEN(tcphdr) > 0x5) { + max_c = (TCPH_HDRLEN(tcphdr) - 5) << 2; + for (c = 0; c < max_c; ) { + opt = opts[c]; + switch (opt) { + case 0x00: + /* End of options. */ + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: EOL\n")); + return; + case 0x01: + /* NOP option. */ + ++c; + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: NOP\n")); + break; + case 0x02: + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: MSS\n")); + if (opts[c + 1] != 0x04 || c + 0x04 > max_c) { + /* Bad length */ + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n")); + return; + } + /* An MSS option with the right option length. */ + mss = (opts[c + 2] << 8) | opts[c + 3]; + /* Limit the mss to the configured TCP_MSS and prevent division by zero */ + pcb->mss = ((mss > TCP_MSS) || (mss == 0)) ? TCP_MSS : mss; + /* Advance to next option */ + c += 0x04; + break; +#if LWIP_TCP_TIMESTAMPS + case 0x08: + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: TS\n")); + if (opts[c + 1] != 0x0A || c + 0x0A > max_c) { + /* Bad length */ + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n")); + return; + } + /* TCP timestamp option with valid length */ + tsval = (opts[c+2]) | (opts[c+3] << 8) | + (opts[c+4] << 16) | (opts[c+5] << 24); + if (flags & TCP_SYN) { + pcb->ts_recent = ntohl(tsval); + pcb->flags |= TF_TIMESTAMP; + } else if (TCP_SEQ_BETWEEN(pcb->ts_lastacksent, seqno, seqno+tcplen)) { + pcb->ts_recent = ntohl(tsval); + } + /* Advance to next option */ + c += 0x0A; + break; +#endif + default: + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: other\n")); + if (opts[c + 1] == 0) { + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n")); + /* If the length field is zero, the options are malformed + and we don't process them further. */ + return; + } + /* All other options have a length field, so that we easily + can skip past them. */ + c += opts[c + 1]; + } + } + } +} + +#endif /* LWIP_TCP */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/tcp_out.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/tcp_out.c new file mode 100644 index 0000000..9605beb --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/tcp_out.c @@ -0,0 +1,1071 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/** + * @file + * Transmission Control Protocol, outgoing traffic + * + * The output functions of TCP. + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "lwip/opt.h" + +#if LWIP_TCP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/tcp.h" +#include "lwip/def.h" +#include "lwip/mem.h" +#include "lwip/memp.h" +#include "lwip/sys.h" +#include "lwip/ip_addr.h" +#include "lwip/netif.h" +#include "lwip/inet.h" +#include "lwip/inet_chksum.h" +#include "lwip/stats.h" +#include "lwip/snmp.h" + +#include +#define _TEST_HD_ +/* Forward declarations.*/ +static void tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb); + +static struct tcp_hdr * +tcp_output_set_header(struct tcp_pcb *pcb, struct pbuf *p, int optlen, + u32_t seqno_be /* already in network byte order */) +{ + struct tcp_hdr *tcphdr = p->payload; + tcphdr->src = htons(pcb->local_port); + tcphdr->dest = htons(pcb->remote_port); + tcphdr->seqno = seqno_be; + tcphdr->ackno = htonl(pcb->rcv_nxt); + TCPH_FLAGS_SET(tcphdr, TCP_ACK); + tcphdr->wnd = htons(pcb->rcv_ann_wnd); + tcphdr->urgp = 0; + TCPH_HDRLEN_SET(tcphdr, (5 + optlen / 4)); + tcphdr->chksum = 0; + + /* If we're sending a packet, update the announced right window edge */ + pcb->rcv_ann_right_edge = pcb->rcv_nxt + pcb->rcv_ann_wnd; + + return tcphdr; +} + +/** + * Called by tcp_close() to send a segment including flags but not data. + * + * @param pcb the tcp_pcb over which to send a segment + * @param flags the flags to set in the segment header + * @return ERR_OK if sent, another err_t otherwise + */ +err_t +tcp_send_ctrl(struct tcp_pcb *pcb, u8_t flags) +{ + /* no data, no length, flags, copy=1, no optdata */ + return tcp_enqueue(pcb, NULL, 0, flags, TCP_WRITE_FLAG_COPY, 0); +} + +/** + * Write data for sending (but does not send it immediately). + * + * It waits in the expectation of more data being sent soon (as + * it can send them more efficiently by combining them together). + * To prompt the system to send data now, call tcp_output() after + * calling tcp_write(). + * + * @param pcb Protocol control block of the TCP connection to enqueue data for. + * @param data pointer to the data to send + * @param len length (in bytes) of the data to send + * @param apiflags combination of following flags : + * - TCP_WRITE_FLAG_COPY (0x01) data will be copied into memory belonging to the stack + * - TCP_WRITE_FLAG_MORE (0x02) for TCP connection, PSH flag will be set on last segment sent, + * @return ERR_OK if enqueued, another err_t on error + * + * @see tcp_write() + */ +err_t +tcp_write(struct tcp_pcb *pcb, const void *data, u16_t len, u8_t apiflags) +{ + LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_write(pcb=%p, data=%p, len=%"U16_F", apiflags=%"U16_F")\n", (void *)pcb, + data, len, (u16_t)apiflags)); + /* connection is in valid state for data transmission? */ + if (pcb->state == ESTABLISHED || + pcb->state == CLOSE_WAIT || + pcb->state == SYN_SENT || + pcb->state == SYN_RCVD) { + if (len > 0) { +#if LWIP_TCP_TIMESTAMPS + return tcp_enqueue(pcb, (void *)data, len, 0, apiflags, + pcb->flags & TF_TIMESTAMP ? TF_SEG_OPTS_TS : 0); +#else + return tcp_enqueue(pcb, (void *)data, len, 0, apiflags, 0); +#endif + } + return ERR_OK; + } else { + LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_STATE | LWIP_DBG_LEVEL_SEVERE, ("tcp_write() called in invalid state\n")); + return ERR_CONN; + } +} + +/** + * Enqueue data and/or TCP options for transmission + * + * Called by tcp_connect(), tcp_listen_input(), tcp_send_ctrl() and tcp_write(). + * + * @param pcb Protocol control block for the TCP connection to enqueue data for. + * @param arg Pointer to the data to be enqueued for sending. + * @param len Data length in bytes + * @param flags tcp header flags to set in the outgoing segment + * @param apiflags combination of following flags : + * - TCP_WRITE_FLAG_COPY (0x01) data will be copied into memory belonging to the stack + * - TCP_WRITE_FLAG_MORE (0x02) for TCP connection, PSH flag will be set on last segment sent, + * @param optflags options to include in segment later on (see definition of struct tcp_seg) + */ +err_t +tcp_enqueue(struct tcp_pcb *pcb, void *arg, u16_t len, + u8_t flags, u8_t apiflags, u8_t optflags) +{ + struct pbuf *p; + struct tcp_seg *seg, *useg, *queue; + u32_t seqno; + u16_t left, seglen; + void *ptr; + u16_t queuelen; + u8_t optlen; + + LWIP_DEBUGF(TCP_OUTPUT_DEBUG, + ("tcp_enqueue(pcb=%p, arg=%p, len=%"U16_F", flags=%"X16_F", apiflags=%"U16_F")\n", + (void *)pcb, arg, len, (u16_t)flags, (u16_t)apiflags)); + LWIP_ERROR("tcp_enqueue: packet needs payload, options, or SYN/FIN (programmer violates API)", + ((len != 0) || (optflags != 0) || ((flags & (TCP_SYN | TCP_FIN)) != 0)), + return ERR_ARG;); + LWIP_ERROR("tcp_enqueue: len != 0 || arg == NULL (programmer violates API)", + ((len != 0) || (arg == NULL)), return ERR_ARG;); + + /* fail on too much data */ + if (len > pcb->snd_buf) { + LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_WARNING, + ("tcp_enqueue: too much data (len=%"U16_F" > snd_buf=%"U16_F")\n", len, pcb->snd_buf)); + pcb->flags |= TF_NAGLEMEMERR; + return ERR_MEM; + } + left = len; + ptr = arg; + + optlen = LWIP_TCP_OPT_LENGTH(optflags); + + /* seqno will be the sequence number of the first segment enqueued + * by the call to this function. */ + seqno = pcb->snd_lbb; + + LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_enqueue: queuelen: %"U16_F"\n", (u16_t)pcb->snd_queuelen)); + + /* If total number of pbufs on the unsent/unacked queues exceeds the + * configured maximum, return an error */ + queuelen = pcb->snd_queuelen; + /* check for configured max queuelen and possible overflow */ + if ((queuelen >= TCP_SND_QUEUELEN) || (queuelen > TCP_SNDQUEUELEN_OVERFLOW)) { + LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_WARNING, + ("tcp_enqueue: too long queue %"U16_F" (max %"U16_F")\n", queuelen, TCP_SND_QUEUELEN)); + TCP_STATS_INC(tcp.memerr); + pcb->flags |= TF_NAGLEMEMERR; + return ERR_MEM; + } + if (queuelen != 0) { + LWIP_ASSERT("tcp_enqueue: pbufs on queue => at least one queue non-empty", + pcb->unacked != NULL || pcb->unsent != NULL); + } else { + LWIP_ASSERT("tcp_enqueue: no pbufs on queue => both queues empty", + pcb->unacked == NULL && pcb->unsent == NULL); + } + + /* First, break up the data into segments and tuck them together in + * the local "queue" variable. */ + useg = queue = seg = NULL; + seglen = 0; + while (queue == NULL || left > 0) { + /* The segment length (including options) should be at most the MSS */ + seglen = left > (pcb->mss - optlen) ? (pcb->mss - optlen) : left; + + /* Allocate memory for tcp_seg, and fill in fields. */ + seg = memp_malloc(MEMP_TCP_SEG); + if (seg == NULL) { + LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, + ("tcp_enqueue: could not allocate memory for tcp_seg\n")); + goto memerr; + } + seg->next = NULL; + seg->p = NULL; + + /* first segment of to-be-queued data? */ + if (queue == NULL) { + queue = seg; + } + /* subsequent segments of to-be-queued data */ + else { + /* Attach the segment to the end of the queued segments */ + LWIP_ASSERT("useg != NULL", useg != NULL); + useg->next = seg; + } + /* remember last segment of to-be-queued data for next iteration */ + useg = seg; + + /* If copy is set, memory should be allocated + * and data copied into pbuf, otherwise data comes from + * ROM or other static memory, and need not be copied. */ + if (apiflags & TCP_WRITE_FLAG_COPY) { + if ((seg->p = pbuf_alloc(PBUF_TRANSPORT, seglen + optlen, PBUF_RAM)) == NULL) { + LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, + ("tcp_enqueue : could not allocate memory for pbuf copy size %"U16_F"\n", seglen)); + goto memerr; + } + LWIP_ASSERT("check that first pbuf can hold the complete seglen", + (seg->p->len >= seglen + optlen)); + queuelen += pbuf_clen(seg->p); + if (arg != NULL) { + MEMCPY((char *)seg->p->payload + optlen, ptr, seglen); + } + seg->dataptr = seg->p->payload; + } + /* do not copy data */ + else { + /* First, allocate a pbuf for the headers. */ + if ((seg->p = pbuf_alloc(PBUF_TRANSPORT, optlen, PBUF_RAM)) == NULL) { + LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, + ("tcp_enqueue: could not allocate memory for header pbuf\n")); + goto memerr; + } + queuelen += pbuf_clen(seg->p); + + /* Second, allocate a pbuf for holding the data. + * since the referenced data is available at least until it is sent out on the + * link (as it has to be ACKed by the remote party) we can safely use PBUF_ROM + * instead of PBUF_REF here. + */ + if (left > 0) { + if ((p = pbuf_alloc(PBUF_RAW, seglen, PBUF_ROM)) == NULL) { + /* If allocation fails, we have to deallocate the header pbuf as well. */ + pbuf_free(seg->p); + seg->p = NULL; + LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, + ("tcp_enqueue: could not allocate memory for zero-copy pbuf\n")); + goto memerr; + } + ++queuelen; + /* reference the non-volatile payload data */ + p->payload = ptr; + seg->dataptr = ptr; + + /* Concatenate the headers and data pbufs together. */ + pbuf_cat(seg->p/*header*/, p/*data*/); + p = NULL; + } + } + + /* Now that there are more segments queued, we check again if the + length of the queue exceeds the configured maximum or overflows. */ + if ((queuelen > TCP_SND_QUEUELEN) || (queuelen > TCP_SNDQUEUELEN_OVERFLOW)) { + LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, + ("tcp_enqueue: queue too long %"U16_F" (%"U16_F")\n", queuelen, TCP_SND_QUEUELEN)); + goto memerr; + } + + seg->len = seglen; + + /* build TCP header */ + if (pbuf_header(seg->p, TCP_HLEN)) { + LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("tcp_enqueue: no room for TCP header in pbuf.\n")); + TCP_STATS_INC(tcp.err); + goto memerr; + } + seg->tcphdr = seg->p->payload; + seg->tcphdr->src = htons(pcb->local_port); + seg->tcphdr->dest = htons(pcb->remote_port); + seg->tcphdr->seqno = htonl(seqno); + seg->tcphdr->urgp = 0; + TCPH_FLAGS_SET(seg->tcphdr, flags); + /* don't fill in tcphdr->ackno and tcphdr->wnd until later */ + + seg->flags = optflags; + + /* Set the length of the header */ + TCPH_HDRLEN_SET(seg->tcphdr, (5 + optlen / 4)); + LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_TRACE, ("tcp_enqueue: queueing %"U32_F":%"U32_F" (0x%"X16_F")\n", + ntohl(seg->tcphdr->seqno), + ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg), + (u16_t)flags)); + + left -= seglen; + seqno += seglen; + ptr = (void *)((u8_t *)ptr + seglen); + } + + /* Now that the data to be enqueued has been broken up into TCP + segments in the queue variable, we add them to the end of the + pcb->unsent queue. */ + if (pcb->unsent == NULL) { + useg = NULL; + } + else { + for (useg = pcb->unsent; useg->next != NULL; useg = useg->next); + } + /* { useg is last segment on the unsent queue, NULL if list is empty } */ + + /* If there is room in the last pbuf on the unsent queue, + chain the first pbuf on the queue together with that. */ + if (useg != NULL && + TCP_TCPLEN(useg) != 0 && + !(TCPH_FLAGS(useg->tcphdr) & (TCP_SYN | TCP_FIN)) && + (!(flags & (TCP_SYN | TCP_FIN)) || (flags == TCP_FIN)) && + /* fit within max seg size */ + (useg->len + queue->len <= pcb->mss) && + /* only concatenate segments with the same options */ + (useg->flags == queue->flags) && + /* segments are consecutive */ + (ntohl(useg->tcphdr->seqno) + useg->len == ntohl(queue->tcphdr->seqno)) ) { + /* Remove TCP header from first segment of our to-be-queued list */ + if(pbuf_header(queue->p, -(TCP_HLEN + optlen))) { + /* Can we cope with this failing? Just assert for now */ + LWIP_ASSERT("pbuf_header failed\n", 0); + TCP_STATS_INC(tcp.err); + goto memerr; + } + if (queue->p->len == 0) { + /* free the first (header-only) pbuf if it is now empty (contained only headers) */ + struct pbuf *old_q = queue->p; + queue->p = queue->p->next; + old_q->next = NULL; + queuelen--; + pbuf_free(old_q); + } + if (flags & TCP_FIN) { + /* the new segment contains only FIN, no data -> put the FIN into the last segment */ + LWIP_ASSERT("FIN enqueued together with data", queue->p == NULL && queue->len == 0); + TCPH_SET_FLAG(useg->tcphdr, TCP_FIN); + } else { + LWIP_ASSERT("zero-length pbuf", (queue->p != NULL) && (queue->p->len > 0)); + pbuf_cat(useg->p, queue->p); + useg->len += queue->len; + useg->next = queue->next; + } + + LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("tcp_enqueue: chaining segments, new len %"U16_F"\n", useg->len)); + if (seg == queue) { + seg = useg; + seglen = useg->len; + } + memp_free(MEMP_TCP_SEG, queue); + } + else { + /* empty list */ + if (useg == NULL) { + /* initialize list with this segment */ + pcb->unsent = queue; + } + /* enqueue segment */ + else { + useg->next = queue; + } + } + if ((flags & TCP_SYN) || (flags & TCP_FIN)) { + ++len; + } + if (flags & TCP_FIN) { + pcb->flags |= TF_FIN; + } + pcb->snd_lbb += len; + + pcb->snd_buf -= len; + + /* update number of segments on the queues */ + pcb->snd_queuelen = queuelen; + LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_enqueue: %"S16_F" (after enqueued)\n", pcb->snd_queuelen)); + if (pcb->snd_queuelen != 0) { + LWIP_ASSERT("tcp_enqueue: valid queue length", + pcb->unacked != NULL || pcb->unsent != NULL); + } + + /* Set the PSH flag in the last segment that we enqueued, but only + if the segment has data (indicated by seglen > 0). */ + if (seg != NULL && seglen > 0 && seg->tcphdr != NULL && ((apiflags & TCP_WRITE_FLAG_MORE)==0)) { + TCPH_SET_FLAG(seg->tcphdr, TCP_PSH); + } + + return ERR_OK; +memerr: + pcb->flags |= TF_NAGLEMEMERR; + TCP_STATS_INC(tcp.memerr); + + if (queue != NULL) { + tcp_segs_free(queue); + } + if (pcb->snd_queuelen != 0) { + LWIP_ASSERT("tcp_enqueue: valid queue length", pcb->unacked != NULL || + pcb->unsent != NULL); + } + LWIP_DEBUGF(TCP_QLEN_DEBUG | LWIP_DBG_STATE, ("tcp_enqueue: %"S16_F" (with mem err)\n", pcb->snd_queuelen)); + return ERR_MEM; +} + + +#if LWIP_TCP_TIMESTAMPS +/* Build a timestamp option (12 bytes long) at the specified options pointer) + * + * @param pcb tcp_pcb + * @param opts option pointer where to store the timestamp option + */ +static void +tcp_build_timestamp_option(struct tcp_pcb *pcb, u32_t *opts) +{ + /* Pad with two NOP options to make everything nicely aligned */ + opts[0] = htonl(0x0101080A); + opts[1] = htonl(sys_now()); + opts[2] = htonl(pcb->ts_recent); +} +#endif + +/** Send an ACK without data. + * + * @param pcb Protocol control block for the TCP connection to send the ACK + */ +err_t +tcp_send_empty_ack(struct tcp_pcb *pcb) +{ + struct pbuf *p; + struct tcp_hdr *tcphdr; + u8_t optlen = 0; + +#if LWIP_TCP_TIMESTAMPS + if (pcb->flags & TF_TIMESTAMP) { + optlen = LWIP_TCP_OPT_LENGTH(TF_SEG_OPTS_TS); + } +#endif + p = pbuf_alloc(PBUF_IP, TCP_HLEN + optlen, PBUF_RAM); + if (p == NULL) { + LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output: (ACK) could not allocate pbuf\n")); + return ERR_BUF; + } + LWIP_DEBUGF(TCP_OUTPUT_DEBUG, + ("tcp_output: sending ACK for %"U32_F"\n", pcb->rcv_nxt)); + /* remove ACK flags from the PCB, as we send an empty ACK now */ + pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW); + + tcphdr = tcp_output_set_header(pcb, p, optlen, htonl(pcb->snd_nxt)); + + /* NB. MSS option is only sent on SYNs, so ignore it here */ +#if LWIP_TCP_TIMESTAMPS + pcb->ts_lastacksent = pcb->rcv_nxt; + + if (pcb->flags & TF_TIMESTAMP) { + tcp_build_timestamp_option(pcb, (u32_t *)(tcphdr + 1)); + } +#endif + +#if CHECKSUM_GEN_TCP + tcphdr->chksum = inet_chksum_pseudo(p, &(pcb->local_ip), &(pcb->remote_ip), + IP_PROTO_TCP, p->tot_len); +#endif +#if LWIP_NETIF_HWADDRHINT + ip_output_hinted(p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos, + IP_PROTO_TCP, &(pcb->addr_hint)); +#else /* LWIP_NETIF_HWADDRHINT*/ + ip_output(p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos, + IP_PROTO_TCP); +#endif /* LWIP_NETIF_HWADDRHINT*/ + pbuf_free(p); + + return ERR_OK; +} + +/** + * Find out what we can send and send it + * + * @param pcb Protocol control block for the TCP connection to send data + * @return ERR_OK if data has been sent or nothing to send + * another err_t on error + */ +err_t +tcp_output(struct tcp_pcb *pcb) +{ + struct tcp_seg *seg, *useg; + u32_t wnd, snd_nxt; +#if TCP_CWND_DEBUG + s16_t i = 0; +#endif /* TCP_CWND_DEBUG */ + + /* First, check if we are invoked by the TCP input processing + code. If so, we do not output anything. Instead, we rely on the + input processing code to call us when input processing is done + with. */ + if (tcp_input_pcb == pcb) { + return ERR_OK; + } + + wnd = LWIP_MIN(pcb->snd_wnd, pcb->cwnd); + + seg = pcb->unsent; + + /* If the TF_ACK_NOW flag is set and no data will be sent (either + * because the ->unsent queue is empty or because the window does + * not allow it), construct an empty ACK segment and send it. + * + * If data is to be sent, we will just piggyback the ACK (see below). + */ + if (pcb->flags & TF_ACK_NOW && + (seg == NULL || + ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len > wnd)) { + return tcp_send_empty_ack(pcb); + } + + /* useg should point to last segment on unacked queue */ + useg = pcb->unacked; + if (useg != NULL) { + for (; useg->next != NULL; useg = useg->next); + } + +#if TCP_OUTPUT_DEBUG + if (seg == NULL) { + LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output: nothing to send (%p)\n", + (void*)pcb->unsent)); + } +#endif /* TCP_OUTPUT_DEBUG */ +#if TCP_CWND_DEBUG + if (seg == NULL) { + LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_output: snd_wnd %"U16_F + ", cwnd %"U16_F", wnd %"U32_F + ", seg == NULL, ack %"U32_F"\n", + pcb->snd_wnd, pcb->cwnd, wnd, pcb->lastack)); + } else { + LWIP_DEBUGF(TCP_CWND_DEBUG, + ("tcp_output: snd_wnd %"U16_F", cwnd %"U16_F", wnd %"U32_F + ", effwnd %"U32_F", seq %"U32_F", ack %"U32_F"\n", + pcb->snd_wnd, pcb->cwnd, wnd, + ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len, + ntohl(seg->tcphdr->seqno), pcb->lastack)); + } +#endif /* TCP_CWND_DEBUG */ + /* data available and window allows it to be sent? */ + while (seg != NULL && + ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len <= wnd) { + LWIP_ASSERT("RST not expected here!", + (TCPH_FLAGS(seg->tcphdr) & TCP_RST) == 0); + /* Stop sending if the nagle algorithm would prevent it + * Don't stop: + * - if tcp_enqueue had a memory error before (prevent delayed ACK timeout) or + * - if FIN was already enqueued for this PCB (SYN is always alone in a segment - + * either seg->next != NULL or pcb->unacked == NULL; + * RST is no sent using tcp_enqueue/tcp_output. + */ + if((tcp_do_output_nagle(pcb) == 0) && + ((pcb->flags & (TF_NAGLEMEMERR | TF_FIN)) == 0)){ + break; + } +#if TCP_CWND_DEBUG + LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_output: snd_wnd %"U16_F", cwnd %"U16_F", wnd %"U32_F", effwnd %"U32_F", seq %"U32_F", ack %"U32_F", i %"S16_F"\n", + pcb->snd_wnd, pcb->cwnd, wnd, + ntohl(seg->tcphdr->seqno) + seg->len - + pcb->lastack, + ntohl(seg->tcphdr->seqno), pcb->lastack, i)); + ++i; +#endif /* TCP_CWND_DEBUG */ + + pcb->unsent = seg->next; + + if (pcb->state != SYN_SENT) { + TCPH_SET_FLAG(seg->tcphdr, TCP_ACK); + pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW); + } + + tcp_output_segment(seg, pcb); + snd_nxt = ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg); + if (TCP_SEQ_LT(pcb->snd_nxt, snd_nxt)) { + pcb->snd_nxt = snd_nxt; + } + /* put segment on unacknowledged list if length > 0 */ + if (TCP_TCPLEN(seg) > 0) { + seg->next = NULL; + /* unacked list is empty? */ + if (pcb->unacked == NULL) { + pcb->unacked = seg; + useg = seg; + /* unacked list is not empty? */ + } else { + /* In the case of fast retransmit, the packet should not go to the tail + * of the unacked queue, but rather somewhere before it. We need to check for + * this case. -STJ Jul 27, 2004 */ + if (TCP_SEQ_LT(ntohl(seg->tcphdr->seqno), ntohl(useg->tcphdr->seqno))){ + /* add segment to before tail of unacked list, keeping the list sorted */ + struct tcp_seg **cur_seg = &(pcb->unacked); + while (*cur_seg && + TCP_SEQ_LT(ntohl((*cur_seg)->tcphdr->seqno), ntohl(seg->tcphdr->seqno))) { + cur_seg = &((*cur_seg)->next ); + } + seg->next = (*cur_seg); + (*cur_seg) = seg; + } else { + /* add segment to tail of unacked list */ + useg->next = seg; + useg = useg->next; + } + } + /* do not queue empty segments on the unacked list */ + } else { + tcp_seg_free(seg); + } + seg = pcb->unsent; + } + + if (seg != NULL && pcb->persist_backoff == 0 && + ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len > pcb->snd_wnd) { + /* prepare for persist timer */ + pcb->persist_cnt = 0; + pcb->persist_backoff = 1; + } + + pcb->flags &= ~TF_NAGLEMEMERR; + return ERR_OK; +} + +/** + * Called by tcp_output() to actually send a TCP segment over IP. + * + * @param seg the tcp_seg to send + * @param pcb the tcp_pcb for the TCP connection used to send the segment + */ +static void +tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb) +{ + u16_t len; + struct netif *netif; + u32_t *opts; + + /** @bug Exclude retransmitted segments from this count. */ + snmp_inc_tcpoutsegs(); + + /* The TCP header has already been constructed, but the ackno and + wnd fields remain. */ + seg->tcphdr->ackno = htonl(pcb->rcv_nxt); + + /* advertise our receive window size in this TCP segment */ + seg->tcphdr->wnd = htons(pcb->rcv_ann_wnd); + + pcb->rcv_ann_right_edge = pcb->rcv_nxt + pcb->rcv_ann_wnd; + + /* Add any requested options. NB MSS option is only set on SYN + packets, so ignore it here */ + opts = (u32_t *)(seg->tcphdr + 1); + if (seg->flags & TF_SEG_OPTS_MSS) { + TCP_BUILD_MSS_OPTION(*opts); + opts += 1; + } +#if LWIP_TCP_TIMESTAMPS + pcb->ts_lastacksent = pcb->rcv_nxt; + + if (seg->flags & TF_SEG_OPTS_TS) { + tcp_build_timestamp_option(pcb, opts); + opts += 3; + } +#endif + +#ifdef _TEST_HD_ + /* ANGR: set rtime this _before_ checking ip_route(). Otherwise TCP_SYN will + * not be retransmitted in case the interface was down and tcp_connect() + * will not return any error. Since we still want the err_cb() (or maybe + * the wifi link comes up), make sure that we fulfill the retransmissions in + * tcp_slowtmr() + */ + + /* Set retransmission timer running if it is not currently enabled */ + if(pcb->rtime == -1) + pcb->rtime = 0; +#endif + + /* If we don't have a local IP address, we get one by + calling ip_route(). */ + if (ip_addr_isany(&(pcb->local_ip))) { + netif = ip_route(&(pcb->remote_ip)); + if (netif == NULL) { + return; + } + ip_addr_set(&(pcb->local_ip), &(netif->ip_addr)); + } + +#ifndef _TEST_HD_ + //Set retransmission timer running if it is not currently enabled + if(pcb->rtime == -1) + pcb->rtime = 0; +#endif + + if (pcb->rttest == 0) { + pcb->rttest = tcp_ticks; + pcb->rtseq = ntohl(seg->tcphdr->seqno); + + LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_output_segment: rtseq %"U32_F"\n", pcb->rtseq)); + } + LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output_segment: %"U32_F":%"U32_F"\n", + htonl(seg->tcphdr->seqno), htonl(seg->tcphdr->seqno) + + seg->len)); + + len = (u16_t)((u8_t *)seg->tcphdr - (u8_t *)seg->p->payload); + + seg->p->len -= len; + seg->p->tot_len -= len; + + seg->p->payload = seg->tcphdr; + + seg->tcphdr->chksum = 0; +#if CHECKSUM_GEN_TCP + seg->tcphdr->chksum = inet_chksum_pseudo(seg->p, + &(pcb->local_ip), + &(pcb->remote_ip), + IP_PROTO_TCP, seg->p->tot_len); +#endif + TCP_STATS_INC(tcp.xmit); + +#if LWIP_NETIF_HWADDRHINT + ip_output_hinted(seg->p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos, + IP_PROTO_TCP, &(pcb->addr_hint)); +#else /* LWIP_NETIF_HWADDRHINT*/ + ip_output(seg->p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos, + IP_PROTO_TCP); +#endif /* LWIP_NETIF_HWADDRHINT*/ +} + +/** + * Send a TCP RESET packet (empty segment with RST flag set) either to + * abort a connection or to show that there is no matching local connection + * for a received segment. + * + * Called by tcp_abort() (to abort a local connection), tcp_input() (if no + * matching local pcb was found), tcp_listen_input() (if incoming segment + * has ACK flag set) and tcp_process() (received segment in the wrong state) + * + * Since a RST segment is in most cases not sent for an active connection, + * tcp_rst() has a number of arguments that are taken from a tcp_pcb for + * most other segment output functions. + * + * @param seqno the sequence number to use for the outgoing segment + * @param ackno the acknowledge number to use for the outgoing segment + * @param local_ip the local IP address to send the segment from + * @param remote_ip the remote IP address to send the segment to + * @param local_port the local TCP port to send the segment from + * @param remote_port the remote TCP port to send the segment to + */ +void +tcp_rst(u32_t seqno, u32_t ackno, + struct ip_addr *local_ip, struct ip_addr *remote_ip, + u16_t local_port, u16_t remote_port) +{ + struct pbuf *p; + struct tcp_hdr *tcphdr; + p = pbuf_alloc(PBUF_IP, TCP_HLEN, PBUF_RAM); + if (p == NULL) { + LWIP_DEBUGF(TCP_DEBUG, ("tcp_rst: could not allocate memory for pbuf\n")); + return; + } + LWIP_ASSERT("check that first pbuf can hold struct tcp_hdr", + (p->len >= sizeof(struct tcp_hdr))); + + tcphdr = p->payload; + tcphdr->src = htons(local_port); + tcphdr->dest = htons(remote_port); + tcphdr->seqno = htonl(seqno); + tcphdr->ackno = htonl(ackno); + TCPH_FLAGS_SET(tcphdr, TCP_RST | TCP_ACK); + tcphdr->wnd = htons(TCP_WND); + tcphdr->urgp = 0; + TCPH_HDRLEN_SET(tcphdr, 5); + + tcphdr->chksum = 0; +#if CHECKSUM_GEN_TCP + tcphdr->chksum = inet_chksum_pseudo(p, local_ip, remote_ip, + IP_PROTO_TCP, p->tot_len); +#endif + TCP_STATS_INC(tcp.xmit); + snmp_inc_tcpoutrsts(); + /* Send output with hardcoded TTL since we have no access to the pcb */ + ip_output(p, local_ip, remote_ip, TCP_TTL, 0, IP_PROTO_TCP); + pbuf_free(p); + LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_rst: seqno %"U32_F" ackno %"U32_F".\n", seqno, ackno)); +} + +/** + * Requeue all unacked segments for retransmission + * + * Called by tcp_slowtmr() for slow retransmission. + * + * @param pcb the tcp_pcb for which to re-enqueue all unacked segments + */ +void +tcp_rexmit_rto(struct tcp_pcb *pcb) +{ + struct tcp_seg *seg; + + if (pcb->unacked == NULL) { + return; + } + + /* Move all unacked segments to the head of the unsent queue */ + for (seg = pcb->unacked; seg->next != NULL; seg = seg->next); + /* concatenate unsent queue after unacked queue */ + seg->next = pcb->unsent; + /* unsent queue is the concatenated queue (of unacked, unsent) */ + pcb->unsent = pcb->unacked; + /* unacked queue is now empty */ + pcb->unacked = NULL; + + /* increment number of retransmissions */ + ++pcb->nrtx; + + /* Don't take any RTT measurements after retransmitting. */ + pcb->rttest = 0; + + /* Do the actual retransmission */ + tcp_output(pcb); +} + +/** + * Requeue the first unacked segment for retransmission + * + * Called by tcp_receive() for fast retramsmit. + * + * @param pcb the tcp_pcb for which to retransmit the first unacked segment + */ +void +tcp_rexmit(struct tcp_pcb *pcb) +{ + struct tcp_seg *seg; + struct tcp_seg **cur_seg; + + if (pcb->unacked == NULL) { + return; + } + + /* Move the first unacked segment to the unsent queue */ + /* Keep the unsent queue sorted. */ + seg = pcb->unacked; + pcb->unacked = seg->next; + + cur_seg = &(pcb->unsent); + while (*cur_seg && + TCP_SEQ_LT(ntohl((*cur_seg)->tcphdr->seqno), ntohl(seg->tcphdr->seqno))) { + cur_seg = &((*cur_seg)->next ); + } + seg->next = *cur_seg; + *cur_seg = seg; + + ++pcb->nrtx; + + /* Don't take any rtt measurements after retransmitting. */ + pcb->rttest = 0; + + /* Do the actual retransmission. */ + snmp_inc_tcpretranssegs(); + /* No need to call tcp_output: we are always called from tcp_input() + and thus tcp_output directly returns. */ +} + + +/** + * Handle retransmission after three dupacks received + * + * @param pcb the tcp_pcb for which to retransmit the first unacked segment + */ +void +tcp_rexmit_fast(struct tcp_pcb *pcb) +{ + if (pcb->unacked != NULL && !(pcb->flags & TF_INFR)) { + /* This is fast retransmit. Retransmit the first unacked segment. */ + LWIP_DEBUGF(TCP_FR_DEBUG, + ("tcp_receive: dupacks %"U16_F" (%"U32_F + "), fast retransmit %"U32_F"\n", + (u16_t)pcb->dupacks, pcb->lastack, + ntohl(pcb->unacked->tcphdr->seqno))); + tcp_rexmit(pcb); + + /* Set ssthresh to half of the minimum of the current + * cwnd and the advertised window */ + if (pcb->cwnd > pcb->snd_wnd) + pcb->ssthresh = pcb->snd_wnd / 2; + else + pcb->ssthresh = pcb->cwnd / 2; + + /* The minimum value for ssthresh should be 2 MSS */ + if (pcb->ssthresh < 2*pcb->mss) { + LWIP_DEBUGF(TCP_FR_DEBUG, + ("tcp_receive: The minimum value for ssthresh %"U16_F + " should be min 2 mss %"U16_F"...\n", + pcb->ssthresh, 2*pcb->mss)); + pcb->ssthresh = 2*pcb->mss; + } + + pcb->cwnd = pcb->ssthresh + 3 * pcb->mss; + pcb->flags |= TF_INFR; + } +} + + +/** + * Send keepalive packets to keep a connection active although + * no data is sent over it. + * + * Called by tcp_slowtmr() + * + * @param pcb the tcp_pcb for which to send a keepalive packet + */ +void +tcp_keepalive(struct tcp_pcb *pcb) +{ + struct pbuf *p; + struct tcp_hdr *tcphdr; + + LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: sending KEEPALIVE probe to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", + ip4_addr1(&pcb->remote_ip), ip4_addr2(&pcb->remote_ip), + ip4_addr3(&pcb->remote_ip), ip4_addr4(&pcb->remote_ip))); + + LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: tcp_ticks %"U32_F" pcb->tmr %"U32_F" pcb->keep_cnt_sent %"U16_F"\n", + tcp_ticks, pcb->tmr, pcb->keep_cnt_sent)); + + p = pbuf_alloc(PBUF_IP, TCP_HLEN, PBUF_RAM); + + if(p == NULL) { + LWIP_DEBUGF(TCP_DEBUG, + ("tcp_keepalive: could not allocate memory for pbuf\n")); + return; + } + LWIP_ASSERT("check that first pbuf can hold struct tcp_hdr", + (p->len >= sizeof(struct tcp_hdr))); + + tcphdr = tcp_output_set_header(pcb, p, 0, htonl(pcb->snd_nxt - 1)); + +#if CHECKSUM_GEN_TCP + tcphdr->chksum = inet_chksum_pseudo(p, &pcb->local_ip, &pcb->remote_ip, + IP_PROTO_TCP, p->tot_len); +#endif + TCP_STATS_INC(tcp.xmit); + + /* Send output to IP */ +#if LWIP_NETIF_HWADDRHINT + ip_output_hinted(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP, + &(pcb->addr_hint)); +#else /* LWIP_NETIF_HWADDRHINT*/ + ip_output(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP); +#endif /* LWIP_NETIF_HWADDRHINT*/ + + pbuf_free(p); + + LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: seqno %"U32_F" ackno %"U32_F".\n", + pcb->snd_nxt - 1, pcb->rcv_nxt)); +} + + +/** + * Send persist timer zero-window probes to keep a connection active + * when a window update is lost. + * + * Called by tcp_slowtmr() + * + * @param pcb the tcp_pcb for which to send a zero-window probe packet + */ +void +tcp_zero_window_probe(struct tcp_pcb *pcb) +{ + struct pbuf *p; + struct tcp_hdr *tcphdr; + struct tcp_seg *seg; + u16_t len; + u8_t is_fin; + + LWIP_DEBUGF(TCP_DEBUG, + ("tcp_zero_window_probe: sending ZERO WINDOW probe to %" + U16_F".%"U16_F".%"U16_F".%"U16_F"\n", + ip4_addr1(&pcb->remote_ip), ip4_addr2(&pcb->remote_ip), + ip4_addr3(&pcb->remote_ip), ip4_addr4(&pcb->remote_ip))); + + LWIP_DEBUGF(TCP_DEBUG, + ("tcp_zero_window_probe: tcp_ticks %"U32_F + " pcb->tmr %"U32_F" pcb->keep_cnt_sent %"U16_F"\n", + tcp_ticks, pcb->tmr, pcb->keep_cnt_sent)); + + seg = pcb->unacked; + + if(seg == NULL) + seg = pcb->unsent; + + if(seg == NULL) + return; + + is_fin = ((TCPH_FLAGS(seg->tcphdr) & TCP_FIN) != 0) && (seg->len == 0); + len = is_fin ? TCP_HLEN : TCP_HLEN + 1; + + p = pbuf_alloc(PBUF_IP, len, PBUF_RAM); + if(p == NULL) { + LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: no memory for pbuf\n")); + return; + } + LWIP_ASSERT("check that first pbuf can hold struct tcp_hdr", + (p->len >= sizeof(struct tcp_hdr))); + + tcphdr = tcp_output_set_header(pcb, p, 0, seg->tcphdr->seqno); + + if (is_fin) { + /* FIN segment, no data */ + TCPH_FLAGS_SET(tcphdr, TCP_ACK | TCP_FIN); + } else { + /* Data segment, copy in one byte from the head of the unacked queue */ + *((char *)p->payload + sizeof(struct tcp_hdr)) = *(char *)seg->dataptr; + } + +#if CHECKSUM_GEN_TCP + tcphdr->chksum = inet_chksum_pseudo(p, &pcb->local_ip, &pcb->remote_ip, + IP_PROTO_TCP, p->tot_len); +#endif + TCP_STATS_INC(tcp.xmit); + + /* Send output to IP */ +#if LWIP_NETIF_HWADDRHINT + ip_output_hinted(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP, + &(pcb->addr_hint)); +#else /* LWIP_NETIF_HWADDRHINT*/ + ip_output(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP); +#endif /* LWIP_NETIF_HWADDRHINT*/ + + pbuf_free(p); + + LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: seqno %"U32_F + " ackno %"U32_F".\n", + pcb->snd_nxt - 1, pcb->rcv_nxt)); +} +#endif /* LWIP_TCP */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/udp.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/udp.c new file mode 100644 index 0000000..697ca7c --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/core/udp.c @@ -0,0 +1,843 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/** + * @file + * User Datagram Protocol module + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + + +/* udp.c + * + * The code for the User Datagram Protocol UDP & UDPLite (RFC 3828). + * + */ + +/* @todo Check the use of '(struct udp_pcb).chksum_len_rx'! + */ + +#include "lwip/opt.h" + +#if LWIP_UDP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/udp.h" +#include "lwip/def.h" +#include "lwip/memp.h" +#include "lwip/inet.h" +#include "lwip/inet_chksum.h" +#include "lwip/ip_addr.h" +#include "lwip/netif.h" +#include "lwip/icmp.h" +#include "lwip/stats.h" +#include "lwip/snmp.h" +#include "arch/perf.h" +#include "lwip/dhcp.h" + +#include + +/* The list of UDP PCBs */ +/* exported in udp.h (was static) */ +struct udp_pcb *udp_pcbs; + +/** + * Process an incoming UDP datagram. + * + * Given an incoming UDP datagram (as a chain of pbufs) this function + * finds a corresponding UDP PCB and hands over the pbuf to the pcbs + * recv function. If no pcb is found or the datagram is incorrect, the + * pbuf is freed. + * + * @param p pbuf to be demultiplexed to a UDP PCB. + * @param inp network interface on which the datagram was received. + * + */ +void +udp_input(struct pbuf *p, struct netif *inp) +{ + struct udp_hdr *udphdr; + struct udp_pcb *pcb, *prev; + struct udp_pcb *uncon_pcb; + struct ip_hdr *iphdr; + u16_t src, dest; + u8_t local_match; + u8_t broadcast; + + PERF_START; + + UDP_STATS_INC(udp.recv); + + iphdr = p->payload; + + /* Check minimum length (IP header + UDP header) + * and move payload pointer to UDP header */ + if (p->tot_len < (IPH_HL(iphdr) * 4 + UDP_HLEN) || pbuf_header(p, -(s16_t)(IPH_HL(iphdr) * 4))) { + /* drop short packets */ + LWIP_DEBUGF(UDP_DEBUG, + ("udp_input: short UDP datagram (%"U16_F" bytes) discarded\n", p->tot_len)); + UDP_STATS_INC(udp.lenerr); + UDP_STATS_INC(udp.drop); + snmp_inc_udpinerrors(); + pbuf_free(p); + goto end; + } + + udphdr = (struct udp_hdr *)p->payload; + + /* is broadcast packet ? */ + broadcast = ip_addr_isbroadcast(&(iphdr->dest), inp); + + LWIP_DEBUGF(UDP_DEBUG, ("udp_input: received datagram of length %"U16_F"\n", p->tot_len)); + + /* convert src and dest ports to host byte order */ + src = ntohs(udphdr->src); + dest = ntohs(udphdr->dest); + + udp_debug_print(udphdr); + + /* print the UDP source and destination */ + LWIP_DEBUGF(UDP_DEBUG, + ("udp (%"U16_F".%"U16_F".%"U16_F".%"U16_F", %"U16_F") <-- " + "(%"U16_F".%"U16_F".%"U16_F".%"U16_F", %"U16_F")\n", + ip4_addr1(&iphdr->dest), ip4_addr2(&iphdr->dest), + ip4_addr3(&iphdr->dest), ip4_addr4(&iphdr->dest), ntohs(udphdr->dest), + ip4_addr1(&iphdr->src), ip4_addr2(&iphdr->src), + ip4_addr3(&iphdr->src), ip4_addr4(&iphdr->src), ntohs(udphdr->src))); + +#if LWIP_DHCP + pcb = NULL; + /* when LWIP_DHCP is active, packets to DHCP_CLIENT_PORT may only be processed by + the dhcp module, no other UDP pcb may use the local UDP port DHCP_CLIENT_PORT */ + if (dest == DHCP_CLIENT_PORT) { + /* all packets for DHCP_CLIENT_PORT not coming from DHCP_SERVER_PORT are dropped! */ + if (src == DHCP_SERVER_PORT) { + if ((inp->dhcp != NULL) && (inp->dhcp->pcb != NULL)) { + /* accept the packe if + (- broadcast or directed to us) -> DHCP is link-layer-addressed, local ip is always ANY! + - inp->dhcp->pcb->remote == ANY or iphdr->src */ + if ((ip_addr_isany(&inp->dhcp->pcb->remote_ip) || + ip_addr_cmp(&(inp->dhcp->pcb->remote_ip), &(iphdr->src)))) { + pcb = inp->dhcp->pcb; + } + } + } + } else +#endif /* LWIP_DHCP */ + { + prev = NULL; + local_match = 0; + uncon_pcb = NULL; + /* Iterate through the UDP pcb list for a matching pcb. + * 'Perfect match' pcbs (connected to the remote port & ip address) are + * preferred. If no perfect match is found, the first unconnected pcb that + * matches the local port and ip address gets the datagram. */ + for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) { + local_match = 0; + /* print the PCB local and remote address */ + LWIP_DEBUGF(UDP_DEBUG, + ("pcb (%"U16_F".%"U16_F".%"U16_F".%"U16_F", %"U16_F") --- " + "(%"U16_F".%"U16_F".%"U16_F".%"U16_F", %"U16_F")\n", + ip4_addr1(&pcb->local_ip), ip4_addr2(&pcb->local_ip), + ip4_addr3(&pcb->local_ip), ip4_addr4(&pcb->local_ip), pcb->local_port, + ip4_addr1(&pcb->remote_ip), ip4_addr2(&pcb->remote_ip), + ip4_addr3(&pcb->remote_ip), ip4_addr4(&pcb->remote_ip), pcb->remote_port)); + + /* compare PCB local addr+port to UDP destination addr+port */ + if ((pcb->local_port == dest) && + ((!broadcast && ip_addr_isany(&pcb->local_ip)) || + ip_addr_cmp(&(pcb->local_ip), &(iphdr->dest)) || +#if LWIP_IGMP + ip_addr_ismulticast(&(iphdr->dest)) || +#endif /* LWIP_IGMP */ +#if IP_SOF_BROADCAST_RECV + (broadcast && (pcb->so_options & SOF_BROADCAST)))) { +#else /* IP_SOF_BROADCAST_RECV */ + (broadcast))) { +#endif /* IP_SOF_BROADCAST_RECV */ + local_match = 1; + if ((uncon_pcb == NULL) && + ((pcb->flags & UDP_FLAGS_CONNECTED) == 0)) { + /* the first unconnected matching PCB */ + uncon_pcb = pcb; + } + } + /* compare PCB remote addr+port to UDP source addr+port */ + if ((local_match != 0) && + (pcb->remote_port == src) && + (ip_addr_isany(&pcb->remote_ip) || + ip_addr_cmp(&(pcb->remote_ip), &(iphdr->src)))) { + /* the first fully matching PCB */ + if (prev != NULL) { + /* move the pcb to the front of udp_pcbs so that is + found faster next time */ + prev->next = pcb->next; + pcb->next = udp_pcbs; + udp_pcbs = pcb; + } else { + UDP_STATS_INC(udp.cachehit); + } + break; + } + prev = pcb; + } + /* no fully matching pcb found? then look for an unconnected pcb */ + if (pcb == NULL) { + pcb = uncon_pcb; + } + } + + /* Check checksum if this is a match or if it was directed at us. */ + if (pcb != NULL || ip_addr_cmp(&inp->ip_addr, &iphdr->dest)) { + LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_input: calculating checksum\n")); +#if LWIP_UDPLITE + if (IPH_PROTO(iphdr) == IP_PROTO_UDPLITE) { + /* Do the UDP Lite checksum */ +#if CHECKSUM_CHECK_UDP + u16_t chklen = ntohs(udphdr->len); + if (chklen < sizeof(struct udp_hdr)) { + if (chklen == 0) { + /* For UDP-Lite, checksum length of 0 means checksum + over the complete packet (See RFC 3828 chap. 3.1) */ + chklen = p->tot_len; + } else { + /* At least the UDP-Lite header must be covered by the + checksum! (Again, see RFC 3828 chap. 3.1) */ + UDP_STATS_INC(udp.chkerr); + UDP_STATS_INC(udp.drop); + snmp_inc_udpinerrors(); + pbuf_free(p); + goto end; + } + } + if (inet_chksum_pseudo_partial(p, (struct ip_addr *)&(iphdr->src), + (struct ip_addr *)&(iphdr->dest), + IP_PROTO_UDPLITE, p->tot_len, chklen) != 0) { + LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, + ("udp_input: UDP Lite datagram discarded due to failing checksum\n")); + UDP_STATS_INC(udp.chkerr); + UDP_STATS_INC(udp.drop); + snmp_inc_udpinerrors(); + pbuf_free(p); + goto end; + } +#endif /* CHECKSUM_CHECK_UDP */ + } else +#endif /* LWIP_UDPLITE */ + { +#if CHECKSUM_CHECK_UDP + if (udphdr->chksum != 0) { + if (inet_chksum_pseudo(p, (struct ip_addr *)&(iphdr->src), + (struct ip_addr *)&(iphdr->dest), + IP_PROTO_UDP, p->tot_len) != 0) { + LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, + ("udp_input: UDP datagram discarded due to failing checksum\n")); + UDP_STATS_INC(udp.chkerr); + UDP_STATS_INC(udp.drop); + snmp_inc_udpinerrors(); + pbuf_free(p); + goto end; + } + } +#endif /* CHECKSUM_CHECK_UDP */ + } + if(pbuf_header(p, -UDP_HLEN)) { + /* Can we cope with this failing? Just assert for now */ + LWIP_ASSERT("pbuf_header failed\n", 0); + UDP_STATS_INC(udp.drop); + snmp_inc_udpinerrors(); + pbuf_free(p); + goto end; + } + if (pcb != NULL) { + snmp_inc_udpindatagrams(); + /* callback */ + if (pcb->recv != NULL) { + /* now the recv function is responsible for freeing p */ + pcb->recv(pcb->recv_arg, pcb, p, &iphdr->src, src); + } else { + /* no recv function registered? then we have to free the pbuf! */ + pbuf_free(p); + goto end; + } + } else { + LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_input: not for us.\n")); + +#if LWIP_ICMP + /* No match was found, send ICMP destination port unreachable unless + destination address was broadcast/multicast. */ + if (!broadcast && + !ip_addr_ismulticast(&iphdr->dest)) { + /* move payload pointer back to ip header */ + pbuf_header(p, (IPH_HL(iphdr) * 4) + UDP_HLEN); + LWIP_ASSERT("p->payload == iphdr", (p->payload == iphdr)); + icmp_dest_unreach(p, ICMP_DUR_PORT); + } +#endif /* LWIP_ICMP */ + UDP_STATS_INC(udp.proterr); + UDP_STATS_INC(udp.drop); + snmp_inc_udpnoports(); + pbuf_free(p); + } + } else { + pbuf_free(p); + } +end: + PERF_STOP("udp_input"); +} + +/** + * Send data using UDP. + * + * @param pcb UDP PCB used to send the data. + * @param p chain of pbuf's to be sent. + * + * The datagram will be sent to the current remote_ip & remote_port + * stored in pcb. If the pcb is not bound to a port, it will + * automatically be bound to a random port. + * + * @return lwIP error code. + * - ERR_OK. Successful. No error occured. + * - ERR_MEM. Out of memory. + * - ERR_RTE. Could not find route to destination address. + * - More errors could be returned by lower protocol layers. + * + * @see udp_disconnect() udp_sendto() + */ +err_t +udp_send(struct udp_pcb *pcb, struct pbuf *p) +{ + /* send to the packet using remote ip and port stored in the pcb */ + return udp_sendto(pcb, p, &pcb->remote_ip, pcb->remote_port); +} + +/** + * Send data to a specified address using UDP. + * + * @param pcb UDP PCB used to send the data. + * @param p chain of pbuf's to be sent. + * @param dst_ip Destination IP address. + * @param dst_port Destination UDP port. + * + * dst_ip & dst_port are expected to be in the same byte order as in the pcb. + * + * If the PCB already has a remote address association, it will + * be restored after the data is sent. + * + * @return lwIP error code (@see udp_send for possible error codes) + * + * @see udp_disconnect() udp_send() + */ +err_t +udp_sendto(struct udp_pcb *pcb, struct pbuf *p, + struct ip_addr *dst_ip, u16_t dst_port) +{ + struct netif *netif; + + LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_send\n")); + + /* find the outgoing network interface for this packet */ +#if LWIP_IGMP + netif = ip_route((ip_addr_ismulticast(dst_ip))?(&(pcb->multicast_ip)):(dst_ip)); +#else + netif = ip_route(dst_ip); +#endif /* LWIP_IGMP */ + + /* no outgoing network interface could be found? */ + if (netif == NULL) { + LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("udp_send: No route to 0x%"X32_F"\n", dst_ip->addr)); + UDP_STATS_INC(udp.rterr); + return ERR_RTE; + } + return udp_sendto_if(pcb, p, dst_ip, dst_port, netif); +} + +/** + * Send data to a specified address using UDP. + * The netif used for sending can be specified. + * + * This function exists mainly for DHCP, to be able to send UDP packets + * on a netif that is still down. + * + * @param pcb UDP PCB used to send the data. + * @param p chain of pbuf's to be sent. + * @param dst_ip Destination IP address. + * @param dst_port Destination UDP port. + * @param netif the netif used for sending. + * + * dst_ip & dst_port are expected to be in the same byte order as in the pcb. + * + * @return lwIP error code (@see udp_send for possible error codes) + * + * @see udp_disconnect() udp_send() + */ +err_t +udp_sendto_if(struct udp_pcb *pcb, struct pbuf *p, + struct ip_addr *dst_ip, u16_t dst_port, struct netif *netif) +{ + struct udp_hdr *udphdr; + struct ip_addr *src_ip; + err_t err; + struct pbuf *q; /* q will be sent down the stack */ + +#if IP_SOF_BROADCAST + /* broadcast filter? */ + if ( ((pcb->so_options & SOF_BROADCAST) == 0) && ip_addr_isbroadcast(dst_ip, netif) ) { + LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, + ("udp_sendto_if: SOF_BROADCAST not enabled on pcb %p\n", (void *)pcb)); + return ERR_VAL; + } +#endif /* IP_SOF_BROADCAST */ + + /* if the PCB is not yet bound to a port, bind it here */ + if (pcb->local_port == 0) { + LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_send: not yet bound to a port, binding now\n")); + err = udp_bind(pcb, &pcb->local_ip, pcb->local_port); + if (err != ERR_OK) { + LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("udp_send: forced port bind failed\n")); + return err; + } + } + + /* not enough space to add an UDP header to first pbuf in given p chain? */ + if (pbuf_header(p, UDP_HLEN)) { + /* allocate header in a separate new pbuf */ + q = pbuf_alloc(PBUF_IP, UDP_HLEN, PBUF_RAM); + /* new header pbuf could not be allocated? */ + if (q == NULL) { + LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("udp_send: could not allocate header\n")); + return ERR_MEM; + } + /* chain header q in front of given pbuf p */ + pbuf_chain(q, p); + /* first pbuf q points to header pbuf */ + LWIP_DEBUGF(UDP_DEBUG, + ("udp_send: added header pbuf %p before given pbuf %p\n", (void *)q, (void *)p)); + } else { + /* adding space for header within p succeeded */ + /* first pbuf q equals given pbuf */ + q = p; + LWIP_DEBUGF(UDP_DEBUG, ("udp_send: added header in given pbuf %p\n", (void *)p)); + } + LWIP_ASSERT("check that first pbuf can hold struct udp_hdr", + (q->len >= sizeof(struct udp_hdr))); + /* q now represents the packet to be sent */ + udphdr = q->payload; + udphdr->src = htons(pcb->local_port); + udphdr->dest = htons(dst_port); + /* in UDP, 0 checksum means 'no checksum' */ + udphdr->chksum = 0x0000; + + /* PCB local address is IP_ANY_ADDR? */ + if (ip_addr_isany(&pcb->local_ip)) { + /* use outgoing network interface IP address as source address */ + src_ip = &(netif->ip_addr); + } else { + /* check if UDP PCB local IP address is correct + * this could be an old address if netif->ip_addr has changed */ + if (!ip_addr_cmp(&(pcb->local_ip), &(netif->ip_addr))) { + /* local_ip doesn't match, drop the packet */ + if (q != p) { + /* free the header pbuf */ + pbuf_free(q); + q = NULL; + /* p is still referenced by the caller, and will live on */ + } + return ERR_VAL; + } + /* use UDP PCB local IP address as source address */ + src_ip = &(pcb->local_ip); + } + + LWIP_DEBUGF(UDP_DEBUG, ("udp_send: sending datagram of length %"U16_F"\n", q->tot_len)); + +#if LWIP_UDPLITE + /* UDP Lite protocol? */ + if (pcb->flags & UDP_FLAGS_UDPLITE) { + u16_t chklen, chklen_hdr; + LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP LITE packet length %"U16_F"\n", q->tot_len)); + /* set UDP message length in UDP header */ + chklen_hdr = chklen = pcb->chksum_len_tx; + if ((chklen < sizeof(struct udp_hdr)) || (chklen > q->tot_len)) { + if (chklen != 0) { + LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP LITE pcb->chksum_len is illegal: %"U16_F"\n", chklen)); + } + /* For UDP-Lite, checksum length of 0 means checksum + over the complete packet. (See RFC 3828 chap. 3.1) + At least the UDP-Lite header must be covered by the + checksum, therefore, if chksum_len has an illegal + value, we generate the checksum over the complete + packet to be safe. */ + chklen_hdr = 0; + chklen = q->tot_len; + } + udphdr->len = htons(chklen_hdr); + /* calculate checksum */ +#if CHECKSUM_GEN_UDP + udphdr->chksum = inet_chksum_pseudo_partial(q, src_ip, dst_ip, + IP_PROTO_UDPLITE, q->tot_len, chklen); + /* chksum zero must become 0xffff, as zero means 'no checksum' */ + if (udphdr->chksum == 0x0000) + udphdr->chksum = 0xffff; +#endif /* CHECKSUM_CHECK_UDP */ + /* output to IP */ + LWIP_DEBUGF(UDP_DEBUG, ("udp_send: ip_output_if (,,,,IP_PROTO_UDPLITE,)\n")); +#if LWIP_NETIF_HWADDRHINT + netif->addr_hint = &(pcb->addr_hint); +#endif /* LWIP_NETIF_HWADDRHINT*/ + err = ip_output_if(q, src_ip, dst_ip, pcb->ttl, pcb->tos, IP_PROTO_UDPLITE, netif); +#if LWIP_NETIF_HWADDRHINT + netif->addr_hint = NULL; +#endif /* LWIP_NETIF_HWADDRHINT*/ + } else +#endif /* LWIP_UDPLITE */ + { /* UDP */ + LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP packet length %"U16_F"\n", q->tot_len)); + udphdr->len = htons(q->tot_len); + /* calculate checksum */ +#if CHECKSUM_GEN_UDP + if ((pcb->flags & UDP_FLAGS_NOCHKSUM) == 0) { + udphdr->chksum = inet_chksum_pseudo(q, src_ip, dst_ip, IP_PROTO_UDP, q->tot_len); + /* chksum zero must become 0xffff, as zero means 'no checksum' */ + if (udphdr->chksum == 0x0000) udphdr->chksum = 0xffff; + } +#endif /* CHECKSUM_CHECK_UDP */ + LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP checksum 0x%04"X16_F"\n", udphdr->chksum)); + LWIP_DEBUGF(UDP_DEBUG, ("udp_send: ip_output_if (,,,,IP_PROTO_UDP,)\n")); + /* output to IP */ +#if LWIP_NETIF_HWADDRHINT + netif->addr_hint = &(pcb->addr_hint); +#endif /* LWIP_NETIF_HWADDRHINT*/ + err = ip_output_if(q, src_ip, dst_ip, pcb->ttl, pcb->tos, IP_PROTO_UDP, netif); +#if LWIP_NETIF_HWADDRHINT + netif->addr_hint = NULL; +#endif /* LWIP_NETIF_HWADDRHINT*/ + } + /* TODO: must this be increased even if error occured? */ + snmp_inc_udpoutdatagrams(); + + /* did we chain a separate header pbuf earlier? */ + if (q != p) { + /* free the header pbuf */ + pbuf_free(q); + q = NULL; + /* p is still referenced by the caller, and will live on */ + } + + UDP_STATS_INC(udp.xmit); + return err; +} + +/** + * Bind an UDP PCB. + * + * @param pcb UDP PCB to be bound with a local address ipaddr and port. + * @param ipaddr local IP address to bind with. Use IP_ADDR_ANY to + * bind to all local interfaces. + * @param port local UDP port to bind with. Use 0 to automatically bind + * to a random port between UDP_LOCAL_PORT_RANGE_START and + * UDP_LOCAL_PORT_RANGE_END. + * + * ipaddr & port are expected to be in the same byte order as in the pcb. + * + * @return lwIP error code. + * - ERR_OK. Successful. No error occured. + * - ERR_USE. The specified ipaddr and port are already bound to by + * another UDP PCB. + * + * @see udp_disconnect() + */ +err_t +udp_bind(struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port) +{ + struct udp_pcb *ipcb; + u8_t rebind; + + LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_bind(ipaddr = ")); + ip_addr_debug_print(UDP_DEBUG, ipaddr); + LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, (", port = %"U16_F")\n", port)); + + rebind = 0; + /* Check for double bind and rebind of the same pcb */ + for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) { + /* is this UDP PCB already on active list? */ + if (pcb == ipcb) { + /* pcb may occur at most once in active list */ + LWIP_ASSERT("rebind == 0", rebind == 0); + /* pcb already in list, just rebind */ + rebind = 1; + } + + /* this code does not allow upper layer to share a UDP port for + listening to broadcast or multicast traffic (See SO_REUSE_ADDR and + SO_REUSE_PORT under *BSD). TODO: See where it fits instead, OR + combine with implementation of UDP PCB flags. Leon Woestenberg. */ +#ifdef LWIP_UDP_TODO + /* port matches that of PCB in list? */ + else + if ((ipcb->local_port == port) && + /* IP address matches, or one is IP_ADDR_ANY? */ + (ip_addr_isany(&(ipcb->local_ip)) || + ip_addr_isany(ipaddr) || + ip_addr_cmp(&(ipcb->local_ip), ipaddr))) { + /* other PCB already binds to this local IP and port */ + LWIP_DEBUGF(UDP_DEBUG, + ("udp_bind: local port %"U16_F" already bound by another pcb\n", port)); + return ERR_USE; + } +#endif + } + + ip_addr_set(&pcb->local_ip, ipaddr); + + /* no port specified? */ + if (port == 0) { +#ifndef UDP_LOCAL_PORT_RANGE_START +#define UDP_LOCAL_PORT_RANGE_START 4096 +#define UDP_LOCAL_PORT_RANGE_END 0x7fff +#endif + port = UDP_LOCAL_PORT_RANGE_START; + ipcb = udp_pcbs; + while ((ipcb != NULL) && (port != UDP_LOCAL_PORT_RANGE_END)) { + if (ipcb->local_port == port) { + /* port is already used by another udp_pcb */ + port++; + /* restart scanning all udp pcbs */ + ipcb = udp_pcbs; + } else + /* go on with next udp pcb */ + ipcb = ipcb->next; + } + if (ipcb != NULL) { + /* no more ports available in local range */ + LWIP_DEBUGF(UDP_DEBUG, ("udp_bind: out of free UDP ports\n")); + return ERR_USE; + } + } + pcb->local_port = port; + snmp_insert_udpidx_tree(pcb); + /* pcb not active yet? */ + if (rebind == 0) { + /* place the PCB on the active list if not already there */ + pcb->next = udp_pcbs; + udp_pcbs = pcb; + } + LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, + ("udp_bind: bound to %"U16_F".%"U16_F".%"U16_F".%"U16_F", port %"U16_F"\n", + (u16_t)((ntohl(pcb->local_ip.addr) >> 24) & 0xff), + (u16_t)((ntohl(pcb->local_ip.addr) >> 16) & 0xff), + (u16_t)((ntohl(pcb->local_ip.addr) >> 8) & 0xff), + (u16_t)(ntohl(pcb->local_ip.addr) & 0xff), pcb->local_port)); + return ERR_OK; +} +/** + * Connect an UDP PCB. + * + * This will associate the UDP PCB with the remote address. + * + * @param pcb UDP PCB to be connected with remote address ipaddr and port. + * @param ipaddr remote IP address to connect with. + * @param port remote UDP port to connect with. + * + * @return lwIP error code + * + * ipaddr & port are expected to be in the same byte order as in the pcb. + * + * The udp pcb is bound to a random local port if not already bound. + * + * @see udp_disconnect() + */ +err_t +udp_connect(struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port) +{ + struct udp_pcb *ipcb; + + if (pcb->local_port == 0) { + err_t err = udp_bind(pcb, &pcb->local_ip, pcb->local_port); + if (err != ERR_OK) + return err; + } + + ip_addr_set(&pcb->remote_ip, ipaddr); + pcb->remote_port = port; + pcb->flags |= UDP_FLAGS_CONNECTED; +/** TODO: this functionality belongs in upper layers */ +#ifdef LWIP_UDP_TODO + /* Nail down local IP for netconn_addr()/getsockname() */ + if (ip_addr_isany(&pcb->local_ip) && !ip_addr_isany(&pcb->remote_ip)) { + struct netif *netif; + + if ((netif = ip_route(&(pcb->remote_ip))) == NULL) { + LWIP_DEBUGF(UDP_DEBUG, ("udp_connect: No route to 0x%lx\n", pcb->remote_ip.addr)); + UDP_STATS_INC(udp.rterr); + return ERR_RTE; + } + /** TODO: this will bind the udp pcb locally, to the interface which + is used to route output packets to the remote address. However, we + might want to accept incoming packets on any interface! */ + pcb->local_ip = netif->ip_addr; + } else if (ip_addr_isany(&pcb->remote_ip)) { + pcb->local_ip.addr = 0; + } +#endif + LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, + ("udp_connect: connected to %"U16_F".%"U16_F".%"U16_F".%"U16_F",port %"U16_F"\n", + (u16_t)((ntohl(pcb->remote_ip.addr) >> 24) & 0xff), + (u16_t)((ntohl(pcb->remote_ip.addr) >> 16) & 0xff), + (u16_t)((ntohl(pcb->remote_ip.addr) >> 8) & 0xff), + (u16_t)(ntohl(pcb->remote_ip.addr) & 0xff), pcb->remote_port)); + + /* Insert UDP PCB into the list of active UDP PCBs. */ + for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) { + if (pcb == ipcb) { + /* already on the list, just return */ + return ERR_OK; + } + } + /* PCB not yet on the list, add PCB now */ + pcb->next = udp_pcbs; + udp_pcbs = pcb; + return ERR_OK; +} + +/** + * Disconnect a UDP PCB + * + * @param pcb the udp pcb to disconnect. + */ +void +udp_disconnect(struct udp_pcb *pcb) +{ + /* reset remote address association */ + ip_addr_set(&pcb->remote_ip, IP_ADDR_ANY); + pcb->remote_port = 0; + /* mark PCB as unconnected */ + pcb->flags &= ~UDP_FLAGS_CONNECTED; +} + +/** + * Set a receive callback for a UDP PCB + * + * This callback will be called when receiving a datagram for the pcb. + * + * @param pcb the pcb for wich to set the recv callback + * @param recv function pointer of the callback function + * @param recv_arg additional argument to pass to the callback function + */ +void +udp_recv(struct udp_pcb *pcb, + void (* recv)(void *arg, struct udp_pcb *upcb, struct pbuf *p, + struct ip_addr *addr, u16_t port), + void *recv_arg) +{ + /* remember recv() callback and user data */ + pcb->recv = recv; + pcb->recv_arg = recv_arg; +} + +/** + * Remove an UDP PCB. + * + * @param pcb UDP PCB to be removed. The PCB is removed from the list of + * UDP PCB's and the data structure is freed from memory. + * + * @see udp_new() + */ +void +udp_remove(struct udp_pcb *pcb) +{ + struct udp_pcb *pcb2; + + snmp_delete_udpidx_tree(pcb); + /* pcb to be removed is first in list? */ + if (udp_pcbs == pcb) { + /* make list start at 2nd pcb */ + udp_pcbs = udp_pcbs->next; + /* pcb not 1st in list */ + } else + for (pcb2 = udp_pcbs; pcb2 != NULL; pcb2 = pcb2->next) { + /* find pcb in udp_pcbs list */ + if (pcb2->next != NULL && pcb2->next == pcb) { + /* remove pcb from list */ + pcb2->next = pcb->next; + } + } + memp_free(MEMP_UDP_PCB, pcb); +} + +/** + * Create a UDP PCB. + * + * @return The UDP PCB which was created. NULL if the PCB data structure + * could not be allocated. + * + * @see udp_remove() + */ +struct udp_pcb * +udp_new(void) +{ + struct udp_pcb *pcb; + pcb = memp_malloc(MEMP_UDP_PCB); + /* could allocate UDP PCB? */ + if (pcb != NULL) { + /* UDP Lite: by initializing to all zeroes, chksum_len is set to 0 + * which means checksum is generated over the whole datagram per default + * (recommended as default by RFC 3828). */ + /* initialize PCB to all zeroes */ + memset(pcb, 0, sizeof(struct udp_pcb)); + pcb->ttl = UDP_TTL; + } + return pcb; +} + +#if UDP_DEBUG +/** + * Print UDP header information for debug purposes. + * + * @param udphdr pointer to the udp header in memory. + */ +void +udp_debug_print(struct udp_hdr *udphdr) +{ + LWIP_DEBUGF(UDP_DEBUG, ("UDP header:\n")); + LWIP_DEBUGF(UDP_DEBUG, ("+-------------------------------+\n")); + LWIP_DEBUGF(UDP_DEBUG, ("| %5"U16_F" | %5"U16_F" | (src port, dest port)\n", + ntohs(udphdr->src), ntohs(udphdr->dest))); + LWIP_DEBUGF(UDP_DEBUG, ("+-------------------------------+\n")); + LWIP_DEBUGF(UDP_DEBUG, ("| %5"U16_F" | 0x%04"X16_F" | (len, chksum)\n", + ntohs(udphdr->len), ntohs(udphdr->chksum))); + LWIP_DEBUGF(UDP_DEBUG, ("+-------------------------------+\n")); +} +#endif /* UDP_DEBUG */ + +#endif /* LWIP_UDP */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/autoip.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/autoip.h new file mode 100644 index 0000000..d5464b7 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/autoip.h @@ -0,0 +1,118 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/** + * @file + * + * AutoIP Automatic LinkLocal IP Configuration + */ + +/* + * + * Copyright (c) 2007 Dominik Spies + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * Author: Dominik Spies + * + * This is a AutoIP implementation for the lwIP TCP/IP stack. It aims to conform + * with RFC 3927. + * + * + * Please coordinate changes and requests with Dominik Spies + * + */ + +#ifndef __LWIP_AUTOIP_H__ +#define __LWIP_AUTOIP_H__ + +#include "lwip/opt.h" + +#if LWIP_AUTOIP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/netif.h" +#include "lwip/udp.h" +#include "netif/etharp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* AutoIP Timing */ +#define AUTOIP_TMR_INTERVAL 100 +#define AUTOIP_TICKS_PER_SECOND (1000 / AUTOIP_TMR_INTERVAL) + +/* RFC 3927 Constants */ +#define PROBE_WAIT 1 /* second (initial random delay) */ +#define PROBE_MIN 1 /* second (minimum delay till repeated probe) */ +#define PROBE_MAX 2 /* seconds (maximum delay till repeated probe) */ +#define PROBE_NUM 3 /* (number of probe packets) */ +#define ANNOUNCE_NUM 2 /* (number of announcement packets) */ +#define ANNOUNCE_INTERVAL 2 /* seconds (time between announcement packets) */ +#define ANNOUNCE_WAIT 2 /* seconds (delay before announcing) */ +#define MAX_CONFLICTS 10 /* (max conflicts before rate limiting) */ +#define RATE_LIMIT_INTERVAL 60 /* seconds (delay between successive attempts) */ +#define DEFEND_INTERVAL 10 /* seconds (min. wait between defensive ARPs) */ + +/* AutoIP client states */ +#define AUTOIP_STATE_OFF 0 +#define AUTOIP_STATE_PROBING 1 +#define AUTOIP_STATE_ANNOUNCING 2 +#define AUTOIP_STATE_BOUND 3 + +struct autoip +{ + struct ip_addr llipaddr; /* the currently selected, probed, announced or used LL IP-Address */ + u8_t state; /* current AutoIP state machine state */ + u8_t sent_num; /* sent number of probes or announces, dependent on state */ + u16_t ttw; /* ticks to wait, tick is AUTOIP_TMR_INTERVAL long */ + u8_t lastconflict; /* ticks until a conflict can be solved by defending */ + u8_t tried_llipaddr; /* total number of probed/used Link Local IP-Addresses */ +}; + + +/** Init srand, has to be called before entering mainloop */ +void autoip_init(void); + +/** Start AutoIP client */ +err_t autoip_start(struct netif *netif); + +/** Stop AutoIP client */ +err_t autoip_stop(struct netif *netif); + +/** Handles every incoming ARP Packet, called by etharp_arp_input */ +void autoip_arp_reply(struct netif *netif, struct etharp_hdr *hdr); + +/** Has to be called in loop every AUTOIP_TMR_INTERVAL milliseconds */ +void autoip_tmr(void); + +/** Handle a possible change in the network configuration */ +void autoip_network_changed(struct netif *netif); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_AUTOIP */ + +#endif /* __LWIP_AUTOIP_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/icmp.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/icmp.h new file mode 100644 index 0000000..3f917ba --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/icmp.h @@ -0,0 +1,113 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_ICMP_H__ +#define __LWIP_ICMP_H__ + +#include "lwip/opt.h" +#include "lwip/pbuf.h" +#include "lwip/ip_addr.h" +#include "lwip/netif.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ICMP_ER 0 /* echo reply */ +#define ICMP_DUR 3 /* destination unreachable */ +#define ICMP_SQ 4 /* source quench */ +#define ICMP_RD 5 /* redirect */ +#define ICMP_ECHO 8 /* echo */ +#define ICMP_TE 11 /* time exceeded */ +#define ICMP_PP 12 /* parameter problem */ +#define ICMP_TS 13 /* timestamp */ +#define ICMP_TSR 14 /* timestamp reply */ +#define ICMP_IRQ 15 /* information request */ +#define ICMP_IR 16 /* information reply */ + +enum icmp_dur_type { + ICMP_DUR_NET = 0, /* net unreachable */ + ICMP_DUR_HOST = 1, /* host unreachable */ + ICMP_DUR_PROTO = 2, /* protocol unreachable */ + ICMP_DUR_PORT = 3, /* port unreachable */ + ICMP_DUR_FRAG = 4, /* fragmentation needed and DF set */ + ICMP_DUR_SR = 5 /* source route failed */ +}; + +enum icmp_te_type { + ICMP_TE_TTL = 0, /* time to live exceeded in transit */ + ICMP_TE_FRAG = 1 /* fragment reassembly time exceeded */ +}; + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +/** This is the standard ICMP header only that the u32_t data + * is splitted to two u16_t like ICMP echo needs it. + * This header is also used for other ICMP types that do not + * use the data part. + */ +PACK_STRUCT_BEGIN +struct icmp_echo_hdr { + PACK_STRUCT_FIELD(u8_t type); + PACK_STRUCT_FIELD(u8_t code); + PACK_STRUCT_FIELD(u16_t chksum); + PACK_STRUCT_FIELD(u16_t id); + PACK_STRUCT_FIELD(u16_t seqno); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +#define ICMPH_TYPE(hdr) ((hdr)->type) +#define ICMPH_CODE(hdr) ((hdr)->code) + +/** Combines type and code to an u16_t */ +#define ICMPH_TYPE_SET(hdr, t) ((hdr)->type = (t)) +#define ICMPH_CODE_SET(hdr, c) ((hdr)->code = (c)) + + +#if LWIP_ICMP /* don't build if not configured for use in lwipopts.h */ + +void icmp_input(struct pbuf *p, struct netif *inp); +void icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t); +void icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t); + +#endif /* LWIP_ICMP */ + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_ICMP_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/igmp.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/igmp.h new file mode 100644 index 0000000..da67e75 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/igmp.h @@ -0,0 +1,164 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Copyright (c) 2002 CITEL Technologies Ltd. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of CITEL Technologies Ltd nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY CITEL TECHNOLOGIES AND CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL CITEL TECHNOLOGIES OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is a contribution to the lwIP TCP/IP stack. + * The Swedish Institute of Computer Science and Adam Dunkels + * are specifically granted permission to redistribute this + * source code. +*/ + +#ifndef __LWIP_IGMP_H__ +#define __LWIP_IGMP_H__ + +#include "lwip/opt.h" +#include "lwip/ip_addr.h" +#include "lwip/netif.h" +#include "lwip/pbuf.h" + +#if LWIP_IGMP /* don't build if not configured for use in lwipopts.h */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * IGMP constants + */ +#define IP_PROTO_IGMP 2 +#define IGMP_TTL 1 +#define IGMP_MINLEN 8 +#define ROUTER_ALERT 0x9404 +#define ROUTER_ALERTLEN 4 + +/* + * IGMP message types, including version number. + */ +#define IGMP_MEMB_QUERY 0x11 /* Membership query */ +#define IGMP_V1_MEMB_REPORT 0x12 /* Ver. 1 membership report */ +#define IGMP_V2_MEMB_REPORT 0x16 /* Ver. 2 membership report */ +#define IGMP_LEAVE_GROUP 0x17 /* Leave-group message */ + +/* IGMP timer */ +#define IGMP_TMR_INTERVAL 100 /* Milliseconds */ +#define IGMP_V1_DELAYING_MEMBER_TMR (1000/IGMP_TMR_INTERVAL) +#define IGMP_JOIN_DELAYING_MEMBER_TMR (500 /IGMP_TMR_INTERVAL) + +/* MAC Filter Actions */ +#define IGMP_DEL_MAC_FILTER 0 +#define IGMP_ADD_MAC_FILTER 1 + +/* Group membership states */ +#define IGMP_GROUP_NON_MEMBER 0 +#define IGMP_GROUP_DELAYING_MEMBER 1 +#define IGMP_GROUP_IDLE_MEMBER 2 + +/* + * IGMP packet format. + */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct igmp_msg { + PACK_STRUCT_FIELD(u8_t igmp_msgtype); + PACK_STRUCT_FIELD(u8_t igmp_maxresp); + PACK_STRUCT_FIELD(u16_t igmp_checksum); + PACK_STRUCT_FIELD(struct ip_addr igmp_group_address); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +/* + * now a group structure - there is + * a list of groups for each interface + * these should really be linked from the interface, but + * if we keep them separate we will not affect the lwip original code + * too much + * + * There will be a group for the all systems group address but this + * will not run the state machine as it is used to kick off reports + * from all the other groups + */ + +struct igmp_group { + struct igmp_group *next; + struct netif *interface; + struct ip_addr group_address; + u8_t last_reporter_flag; /* signifies we were the last person to report */ + u8_t group_state; + u16_t timer; + u8_t use; /* counter of simultaneous uses */ +}; + + +/* Prototypes */ +void igmp_init(void); + +err_t igmp_start( struct netif *netif); + +err_t igmp_stop( struct netif *netif); + +void igmp_report_groups( struct netif *netif); + +struct igmp_group *igmp_lookfor_group( struct netif *ifp, struct ip_addr *addr); + +struct igmp_group *igmp_lookup_group( struct netif *ifp, struct ip_addr *addr); + +err_t igmp_remove_group( struct igmp_group *group); + +void igmp_input( struct pbuf *p, struct netif *inp, struct ip_addr *dest); + +err_t igmp_joingroup( struct ip_addr *ifaddr, struct ip_addr *groupaddr); + +err_t igmp_leavegroup( struct ip_addr *ifaddr, struct ip_addr *groupaddr); + +void igmp_tmr(void); + +void igmp_timeout( struct igmp_group *group); + +void igmp_start_timer( struct igmp_group *group, u8_t max_time); + +void igmp_stop_timer( struct igmp_group *group); + +void igmp_delaying_member( struct igmp_group *group, u8_t maxresp); + +err_t igmp_ip_output_if( struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, u8_t ttl, u8_t proto, struct netif *netif); + +void igmp_send( struct igmp_group *group, u8_t type); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_IGMP */ + +#endif /* __LWIP_IGMP_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/inet.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/inet.h new file mode 100644 index 0000000..903afdf --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/inet.h @@ -0,0 +1,105 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_INET_H__ +#define __LWIP_INET_H__ + +#include "lwip/opt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* For compatibility with BSD code */ +struct in_addr { + u32_t s_addr; +}; + +#define INADDR_NONE ((u32_t)0xffffffffUL) /* 255.255.255.255 */ +#define INADDR_LOOPBACK ((u32_t)0x7f000001UL) /* 127.0.0.1 */ +#define INADDR_ANY ((u32_t)0x00000000UL) /* 0.0.0.0 */ +#define INADDR_BROADCAST ((u32_t)0xffffffffUL) /* 255.255.255.255 */ + +u32_t inet_addr(const char *cp); +int inet_aton(const char *cp, struct in_addr *addr); +char *inet_ntoa(struct in_addr addr); /* returns ptr to static buffer; not reentrant! */ + +#ifdef htons +#undef htons +#endif /* htons */ +#ifdef htonl +#undef htonl +#endif /* htonl */ +#ifdef ntohs +#undef ntohs +#endif /* ntohs */ +#ifdef ntohl +#undef ntohl +#endif /* ntohl */ + +#ifndef LWIP_PLATFORM_BYTESWAP +#define LWIP_PLATFORM_BYTESWAP 0 +#endif + +#if BYTE_ORDER == BIG_ENDIAN +#define htons(x) (x) +#define ntohs(x) (x) +#define htonl(x) (x) +#define ntohl(x) (x) +#else /* BYTE_ORDER != BIG_ENDIAN */ +#ifdef LWIP_PREFIX_BYTEORDER_FUNCS +/* workaround for naming collisions on some platforms */ +#define htons lwip_htons +#define ntohs lwip_ntohs +#define htonl lwip_htonl +#define ntohl lwip_ntohl +#endif /* LWIP_PREFIX_BYTEORDER_FUNCS */ +#if LWIP_PLATFORM_BYTESWAP +#define htons(x) LWIP_PLATFORM_HTONS(x) +#define ntohs(x) LWIP_PLATFORM_HTONS(x) +#define htonl(x) LWIP_PLATFORM_HTONL(x) +#define ntohl(x) LWIP_PLATFORM_HTONL(x) +#else /* LWIP_PLATFORM_BYTESWAP */ +u16_t htons(u16_t x); +u16_t ntohs(u16_t x); +u32_t htonl(u32_t x); +u32_t ntohl(u32_t x); +#endif /* LWIP_PLATFORM_BYTESWAP */ + +#endif /* BYTE_ORDER == BIG_ENDIAN */ + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_INET_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/inet_chksum.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/inet_chksum.h new file mode 100644 index 0000000..6f5b1b6 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/inet_chksum.h @@ -0,0 +1,62 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_INET_CHKSUM_H__ +#define __LWIP_INET_CHKSUM_H__ + +#include "lwip/opt.h" + +#include "lwip/pbuf.h" +#include "lwip/ip_addr.h" + +#ifdef __cplusplus +extern "C" { +#endif + +u16_t inet_chksum(void *dataptr, u16_t len); +u16_t inet_chksum_pbuf(struct pbuf *p); +u16_t inet_chksum_pseudo(struct pbuf *p, + struct ip_addr *src, struct ip_addr *dest, + u8_t proto, u16_t proto_len); +#if LWIP_UDPLITE +u16_t inet_chksum_pseudo_partial(struct pbuf *p, + struct ip_addr *src, struct ip_addr *dest, + u8_t proto, u16_t proto_len, u16_t chksum_len); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_INET_H__ */ + diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/ip.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/ip.h new file mode 100644 index 0000000..6b2cdee --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/ip.h @@ -0,0 +1,200 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_IP_H__ +#define __LWIP_IP_H__ + +#include "lwip/opt.h" + +#include "lwip/def.h" +#include "lwip/pbuf.h" +#include "lwip/ip_addr.h" +#include "lwip/err.h" +#include "lwip/netif.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** Currently, the function ip_output_if_opt() is only used with IGMP */ +#define IP_OPTIONS_SEND LWIP_IGMP + +#define IP_HLEN 20 + +#define IP_PROTO_ICMP 1 +#define IP_PROTO_UDP 17 +#define IP_PROTO_UDPLITE 136 +#define IP_PROTO_TCP 6 + +/* This is passed as the destination address to ip_output_if (not + to ip_output), meaning that an IP header already is constructed + in the pbuf. This is used when TCP retransmits. */ +#ifdef IP_HDRINCL +#undef IP_HDRINCL +#endif /* IP_HDRINCL */ +#define IP_HDRINCL NULL + +#if LWIP_NETIF_HWADDRHINT +#define IP_PCB_ADDRHINT ;u8_t addr_hint +#else +#define IP_PCB_ADDRHINT +#endif /* LWIP_NETIF_HWADDRHINT */ + +/* This is the common part of all PCB types. It needs to be at the + beginning of a PCB type definition. It is located here so that + changes to this common part are made in one location instead of + having to change all PCB structs. */ +#define IP_PCB \ + /* ip addresses in network byte order */ \ + struct ip_addr local_ip; \ + struct ip_addr remote_ip; \ + /* Socket options */ \ + u16_t so_options; \ + /* Type Of Service */ \ + u8_t tos; \ + /* Time To Live */ \ + u8_t ttl \ + /* link layer address resolution hint */ \ + IP_PCB_ADDRHINT + +struct ip_pcb { +/* Common members of all PCB types */ + IP_PCB; +}; + +/* + * Option flags per-socket. These are the same like SO_XXX. + */ +#define SOF_DEBUG (u16_t)0x0001U /* turn on debugging info recording */ +#define SOF_ACCEPTCONN (u16_t)0x0002U /* socket has had listen() */ +#define SOF_REUSEADDR (u16_t)0x0004U /* allow local address reuse */ +#define SOF_KEEPALIVE (u16_t)0x0008U /* keep connections alive */ +#define SOF_DONTROUTE (u16_t)0x0010U /* just use interface addresses */ +#define SOF_BROADCAST (u16_t)0x0020U /* permit to send and to receive broadcast messages (see IP_SOF_BROADCAST option) */ +#define SOF_USELOOPBACK (u16_t)0x0040U /* bypass hardware when possible */ +#define SOF_LINGER (u16_t)0x0080U /* linger on close if data present */ +#define SOF_OOBINLINE (u16_t)0x0100U /* leave received OOB data in line */ +#define SOF_REUSEPORT (u16_t)0x0200U /* allow local address & port reuse */ + + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct ip_hdr { + /* version / header length / type of service */ + PACK_STRUCT_FIELD(u16_t _v_hl_tos); + /* total length */ + PACK_STRUCT_FIELD(u16_t _len); + /* identification */ + PACK_STRUCT_FIELD(u16_t _id); + /* fragment offset field */ + PACK_STRUCT_FIELD(u16_t _offset); +#define IP_RF 0x8000 /* reserved fragment flag */ +#define IP_DF 0x4000 /* dont fragment flag */ +#define IP_MF 0x2000 /* more fragments flag */ +#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ + /* time to live / protocol*/ + PACK_STRUCT_FIELD(u16_t _ttl_proto); + /* checksum */ + PACK_STRUCT_FIELD(u16_t _chksum); + /* source and destination IP addresses */ + PACK_STRUCT_FIELD(struct ip_addr src); + PACK_STRUCT_FIELD(struct ip_addr dest); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +#define IPH_V(hdr) (ntohs((hdr)->_v_hl_tos) >> 12) +#define IPH_HL(hdr) ((ntohs((hdr)->_v_hl_tos) >> 8) & 0x0f) +#define IPH_TOS(hdr) (ntohs((hdr)->_v_hl_tos) & 0xff) +#define IPH_LEN(hdr) ((hdr)->_len) +#define IPH_ID(hdr) ((hdr)->_id) +#define IPH_OFFSET(hdr) ((hdr)->_offset) +#define IPH_TTL(hdr) (ntohs((hdr)->_ttl_proto) >> 8) +#define IPH_PROTO(hdr) (ntohs((hdr)->_ttl_proto) & 0xff) +#define IPH_CHKSUM(hdr) ((hdr)->_chksum) + +#define IPH_VHLTOS_SET(hdr, v, hl, tos) (hdr)->_v_hl_tos = (htons(((v) << 12) | ((hl) << 8) | (tos))) +#define IPH_LEN_SET(hdr, len) (hdr)->_len = (len) +#define IPH_ID_SET(hdr, id) (hdr)->_id = (id) +#define IPH_OFFSET_SET(hdr, off) (hdr)->_offset = (off) +#define IPH_TTL_SET(hdr, ttl) (hdr)->_ttl_proto = (htons(IPH_PROTO(hdr) | ((u16_t)(ttl) << 8))) +#define IPH_PROTO_SET(hdr, proto) (hdr)->_ttl_proto = (htons((proto) | (IPH_TTL(hdr) << 8))) +#define IPH_CHKSUM_SET(hdr, chksum) (hdr)->_chksum = (chksum) + +/** The interface that provided the packet for the current callback invocation. */ +extern struct netif *current_netif; +/** Header of the input packet currently being processed. */ +extern const struct ip_hdr *current_header; + +#define ip_init() /* Compatibility define, not init needed. */ +struct netif *ip_route(struct ip_addr *dest); +err_t ip_input(struct pbuf *p, struct netif *inp); +err_t ip_output(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, + u8_t ttl, u8_t tos, u8_t proto); +err_t ip_output_if(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, + u8_t ttl, u8_t tos, u8_t proto, + struct netif *netif); +#if LWIP_NETIF_HWADDRHINT +err_t ip_output_hinted(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, + u8_t ttl, u8_t tos, u8_t proto, u8_t *addr_hint); +#endif /* LWIP_NETIF_HWADDRHINT */ +#if IP_OPTIONS_SEND +err_t ip_output_if_opt(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, + u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options, + u16_t optlen); +#endif /* IP_OPTIONS_SEND */ +/** Get the interface that received the current packet. + * This function must only be called from a receive callback (udp_recv, + * raw_recv, tcp_accept). It will return NULL otherwise. */ +#define ip_current_netif() (current_netif) +/** Get the IP header of the current packet. + * This function must only be called from a receive callback (udp_recv, + * raw_recv, tcp_accept). It will return NULL otherwise. */ +#define ip_current_header() (current_header) +#if IP_DEBUG +void ip_debug_print(struct pbuf *p); +#else +#define ip_debug_print(p) +#endif /* IP_DEBUG */ + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_IP_H__ */ + + diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/ip_addr.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/ip_addr.h new file mode 100644 index 0000000..5fbc44d --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/ip_addr.h @@ -0,0 +1,175 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_IP_ADDR_H__ +#define __LWIP_IP_ADDR_H__ + +#include "lwip/opt.h" + +#include "lwip/inet.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct ip_addr { + PACK_STRUCT_FIELD(u32_t addr); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +/* + * struct ipaddr2 is used in the definition of the ARP packet format in + * order to support compilers that don't have structure packing. + */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct ip_addr2 { + PACK_STRUCT_FIELD(u16_t addrw[2]); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +struct netif; + +extern const struct ip_addr ip_addr_any; +extern const struct ip_addr ip_addr_broadcast; + +/** IP_ADDR_ can be used as a fixed IP address + * for the wildcard and the broadcast address + */ +#define IP_ADDR_ANY ((struct ip_addr *)&ip_addr_any) +#define IP_ADDR_BROADCAST ((struct ip_addr *)&ip_addr_broadcast) + +/* Definitions of the bits in an Internet address integer. + + On subnets, host and network parts are found according to + the subnet mask, not these masks. */ + +#define IN_CLASSA(a) ((((u32_t)(a)) & 0x80000000UL) == 0) +#define IN_CLASSA_NET 0xff000000 +#define IN_CLASSA_NSHIFT 24 +#define IN_CLASSA_HOST (0xffffffff & ~IN_CLASSA_NET) +#define IN_CLASSA_MAX 128 + +#define IN_CLASSB(a) ((((u32_t)(a)) & 0xc0000000UL) == 0x80000000UL) +#define IN_CLASSB_NET 0xffff0000 +#define IN_CLASSB_NSHIFT 16 +#define IN_CLASSB_HOST (0xffffffff & ~IN_CLASSB_NET) +#define IN_CLASSB_MAX 65536 + +#define IN_CLASSC(a) ((((u32_t)(a)) & 0xe0000000UL) == 0xc0000000UL) +#define IN_CLASSC_NET 0xffffff00 +#define IN_CLASSC_NSHIFT 8 +#define IN_CLASSC_HOST (0xffffffff & ~IN_CLASSC_NET) + +#define IN_CLASSD(a) (((u32_t)(a) & 0xf0000000UL) == 0xe0000000UL) +#define IN_CLASSD_NET 0xf0000000 /* These ones aren't really */ +#define IN_CLASSD_NSHIFT 28 /* net and host fields, but */ +#define IN_CLASSD_HOST 0x0fffffff /* routing needn't know. */ +#define IN_MULTICAST(a) IN_CLASSD(a) + +#define IN_EXPERIMENTAL(a) (((u32_t)(a) & 0xf0000000UL) == 0xf0000000UL) +#define IN_BADCLASS(a) (((u32_t)(a) & 0xf0000000UL) == 0xf0000000UL) + +#define IN_LOOPBACKNET 127 /* official! */ + +#define IP4_ADDR(ipaddr, a,b,c,d) \ + (ipaddr)->addr = htonl(((u32_t)((a) & 0xff) << 24) | \ + ((u32_t)((b) & 0xff) << 16) | \ + ((u32_t)((c) & 0xff) << 8) | \ + (u32_t)((d) & 0xff)) + +#define ip_addr_set(dest, src) (dest)->addr = \ + ((src) == NULL? 0:\ + (src)->addr) +/** + * Determine if two address are on the same network. + * + * @arg addr1 IP address 1 + * @arg addr2 IP address 2 + * @arg mask network identifier mask + * @return !0 if the network identifiers of both address match + */ +#define ip_addr_netcmp(addr1, addr2, mask) (((addr1)->addr & \ + (mask)->addr) == \ + ((addr2)->addr & \ + (mask)->addr)) +#define ip_addr_cmp(addr1, addr2) ((addr1)->addr == (addr2)->addr) + +#define ip_addr_isany(addr1) ((addr1) == NULL || (addr1)->addr == 0) + +u8_t ip_addr_isbroadcast(struct ip_addr *, struct netif *); + +#define ip_addr_ismulticast(addr1) (((addr1)->addr & ntohl(0xf0000000UL)) == ntohl(0xe0000000UL)) + +#define ip_addr_islinklocal(addr1) (((addr1)->addr & ntohl(0xffff0000UL)) == ntohl(0xa9fe0000UL)) + +#define ip_addr_debug_print(debug, ipaddr) \ + LWIP_DEBUGF(debug, ("%"U16_F".%"U16_F".%"U16_F".%"U16_F, \ + ipaddr != NULL ? \ + (u16_t)(ntohl((ipaddr)->addr) >> 24) & 0xff : 0, \ + ipaddr != NULL ? \ + (u16_t)(ntohl((ipaddr)->addr) >> 16) & 0xff : 0, \ + ipaddr != NULL ? \ + (u16_t)(ntohl((ipaddr)->addr) >> 8) & 0xff : 0, \ + ipaddr != NULL ? \ + (u16_t)ntohl((ipaddr)->addr) & 0xff : 0)) + +/* These are cast to u16_t, with the intent that they are often arguments + * to printf using the U16_F format from cc.h. */ +#define ip4_addr1(ipaddr) ((u16_t)(ntohl((ipaddr)->addr) >> 24) & 0xff) +#define ip4_addr2(ipaddr) ((u16_t)(ntohl((ipaddr)->addr) >> 16) & 0xff) +#define ip4_addr3(ipaddr) ((u16_t)(ntohl((ipaddr)->addr) >> 8) & 0xff) +#define ip4_addr4(ipaddr) ((u16_t)(ntohl((ipaddr)->addr)) & 0xff) + +/** + * Same as inet_ntoa() but takes a struct ip_addr* + */ +#define ip_ntoa(addr) ((addr != NULL) ? inet_ntoa(*((struct in_addr*)(addr))) : "NULL") + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_IP_ADDR_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/ip_frag.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/ip_frag.h new file mode 100644 index 0000000..adc6e91 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4/lwip/ip_frag.h @@ -0,0 +1,78 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Jani Monoses + * + */ + +#ifndef __LWIP_IP_FRAG_H__ +#define __LWIP_IP_FRAG_H__ + +#include "lwip/opt.h" +#include "lwip/err.h" +#include "lwip/pbuf.h" +#include "lwip/netif.h" +#include "lwip/ip_addr.h" +#include "lwip/ip.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if IP_REASSEMBLY +/* The IP reassembly timer interval in milliseconds. */ +#define IP_TMR_INTERVAL 1000 + +/* IP reassembly helper struct. + * This is exported because memp needs to know the size. + */ +struct ip_reassdata { + struct ip_reassdata *next; + struct pbuf *p; + struct ip_hdr iphdr; + u16_t datagram_len; + u8_t flags; + u8_t timer; +}; + +void ip_reass_init(void); +void ip_reass_tmr(void); +struct pbuf * ip_reass(struct pbuf *p); +#endif /* IP_REASSEMBLY */ + +#if IP_FRAG +err_t ip_frag(struct pbuf *p, struct netif *netif, struct ip_addr *dest); +#endif /* IP_FRAG */ + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_IP_FRAG_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/api.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/api.h new file mode 100644 index 0000000..7d2c9e6 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/api.h @@ -0,0 +1,224 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_API_H__ +#define __LWIP_API_H__ + +#include "lwip/opt.h" + +#if LWIP_NETCONN /* don't build if not configured for use in lwipopts.h */ + +#include /* for size_t */ + +#include "lwip/netbuf.h" +#include "lwip/sys.h" +#include "lwip/ip_addr.h" +#include "lwip/err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Throughout this file, IP addresses and port numbers are expected to be in + * the same byte order as in the corresponding pcb. + */ + +/* Flags for netconn_write */ +#define NETCONN_NOFLAG 0x00 +#define NETCONN_NOCOPY 0x00 /* Only for source code compatibility */ +#define NETCONN_COPY 0x01 +#define NETCONN_MORE 0x02 + +/* Helpers to process several netconn_types by the same code */ +#define NETCONNTYPE_GROUP(t) (t&0xF0) +#define NETCONNTYPE_DATAGRAM(t) (t&0xE0) + +enum netconn_type { + NETCONN_INVALID = 0, + /* NETCONN_TCP Group */ + NETCONN_TCP = 0x10, + /* NETCONN_UDP Group */ + NETCONN_UDP = 0x20, + NETCONN_UDPLITE = 0x21, + NETCONN_UDPNOCHKSUM= 0x22, + /* NETCONN_RAW Group */ + NETCONN_RAW = 0x40 +}; + +enum netconn_state { + NETCONN_NONE, + NETCONN_WRITE, + NETCONN_LISTEN, + NETCONN_CONNECT, + NETCONN_CLOSE +}; + +enum netconn_evt { + NETCONN_EVT_RCVPLUS, + NETCONN_EVT_RCVMINUS, + NETCONN_EVT_SENDPLUS, + NETCONN_EVT_SENDMINUS +}; + +#if LWIP_IGMP +enum netconn_igmp { + NETCONN_JOIN, + NETCONN_LEAVE +}; +#endif /* LWIP_IGMP */ + +/* forward-declare some structs to avoid to include their headers */ +struct ip_pcb; +struct tcp_pcb; +struct udp_pcb; +struct raw_pcb; +struct netconn; + +/** A callback prototype to inform about events for a netconn */ +typedef void (* netconn_callback)(struct netconn *, enum netconn_evt, u16_t len); + +/** A netconn descriptor */ +struct netconn { + /** type of the netconn (TCP, UDP or RAW) */ + enum netconn_type type; + /** current state of the netconn */ + enum netconn_state state; + /** the lwIP internal protocol control block */ + union { + struct ip_pcb *ip; + struct tcp_pcb *tcp; + struct udp_pcb *udp; + struct raw_pcb *raw; + } pcb; + /** the last error this netconn had */ + err_t err; + /** sem that is used to synchroneously execute functions in the core context */ + sys_sem_t op_completed; + /** mbox where received packets are stored until they are fetched + by the netconn application thread (can grow quite big) */ + sys_mbox_t recvmbox; + /** mbox where new connections are stored until processed + by the application thread */ + sys_mbox_t acceptmbox; + /** only used for socket layer */ + int socket; +#if LWIP_SO_RCVTIMEO + /** timeout to wait for new data to be received + (or connections to arrive for listening netconns) */ + int recv_timeout; +#endif /* LWIP_SO_RCVTIMEO */ +#if LWIP_SO_RCVBUF + /** maximum amount of bytes queued in recvmbox */ + int recv_bufsize; +#endif /* LWIP_SO_RCVBUF */ + s16_t recv_avail; +#if LWIP_TCP + /** TCP: when data passed to netconn_write doesn't fit into the send buffer, + this temporarily stores the message. */ + struct api_msg_msg *write_msg; + /** TCP: when data passed to netconn_write doesn't fit into the send buffer, + this temporarily stores how much is already sent. */ + size_t write_offset; +#if LWIP_TCPIP_CORE_LOCKING + /** TCP: when data passed to netconn_write doesn't fit into the send buffer, + this temporarily stores whether to wake up the original application task + if data couldn't be sent in the first try. */ + u8_t write_delayed; +#endif /* LWIP_TCPIP_CORE_LOCKING */ +#endif /* LWIP_TCP */ + /** A callback function that is informed about events for this netconn */ + netconn_callback callback; +}; + +/* Register an Network connection event */ +#define API_EVENT(c,e,l) if (c->callback) { \ + (*c->callback)(c, e, l); \ + } + +/* Network connection functions: */ +#define netconn_new(t) netconn_new_with_proto_and_callback(t, 0, NULL) +#define netconn_new_with_callback(t, c) netconn_new_with_proto_and_callback(t, 0, c) +struct +netconn *netconn_new_with_proto_and_callback(enum netconn_type t, u8_t proto, + netconn_callback callback); +err_t netconn_delete (struct netconn *conn); +/** Get the type of a netconn (as enum netconn_type). */ +#define netconn_type(conn) (conn->type) + +err_t netconn_getaddr (struct netconn *conn, + struct ip_addr *addr, + u16_t *port, + u8_t local); +#define netconn_peer(c,i,p) netconn_getaddr(c,i,p,0) +#define netconn_addr(c,i,p) netconn_getaddr(c,i,p,1) + +err_t netconn_bind (struct netconn *conn, + struct ip_addr *addr, + u16_t port); +err_t netconn_connect (struct netconn *conn, + struct ip_addr *addr, + u16_t port); +err_t netconn_disconnect (struct netconn *conn); +err_t netconn_listen_with_backlog(struct netconn *conn, u8_t backlog); +#define netconn_listen(conn) netconn_listen_with_backlog(conn, TCP_DEFAULT_LISTEN_BACKLOG) +struct netconn * netconn_accept (struct netconn *conn); +struct netbuf * netconn_recv (struct netconn *conn); +err_t netconn_sendto (struct netconn *conn, + struct netbuf *buf, struct ip_addr *addr, u16_t port); +err_t netconn_send (struct netconn *conn, + struct netbuf *buf); +err_t netconn_write (struct netconn *conn, + const void *dataptr, size_t size, + u8_t apiflags); +err_t netconn_close (struct netconn *conn); + +#if LWIP_IGMP +err_t netconn_join_leave_group (struct netconn *conn, + struct ip_addr *multiaddr, + struct ip_addr *interface, + enum netconn_igmp join_or_leave); +#endif /* LWIP_IGMP */ +#if LWIP_DNS +err_t netconn_gethostbyname(const char *name, struct ip_addr *addr); +#endif /* LWIP_DNS */ + +#define netconn_err(conn) ((conn)->err) +#define netconn_recv_bufsize(conn) ((conn)->recv_bufsize) + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_NETCONN */ + +#endif /* __LWIP_API_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/api_msg.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/api_msg.h new file mode 100644 index 0000000..7718d90 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/api_msg.h @@ -0,0 +1,164 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_API_MSG_H__ +#define __LWIP_API_MSG_H__ + +#include "lwip/opt.h" + +#if LWIP_NETCONN /* don't build if not configured for use in lwipopts.h */ + +#include /* for size_t */ + +#include "lwip/ip_addr.h" +#include "lwip/err.h" +#include "lwip/sys.h" +#include "lwip/igmp.h" +#include "lwip/api.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* IP addresses and port numbers are expected to be in + * the same byte order as in the corresponding pcb. + */ +/** This struct includes everything that is necessary to execute a function + for a netconn in another thread context (mainly used to process netconns + in the tcpip_thread context to be thread safe). */ +struct api_msg_msg { + /** The netconn which to process - always needed: it includes the semaphore + which is used to block the application thread until the function finished. */ + struct netconn *conn; + /** Depending on the executed function, one of these union members is used */ + union { + /** used for do_send */ + struct netbuf *b; + /** used for do_newconn */ + struct { + u8_t proto; + } n; + /** used for do_bind and do_connect */ + struct { + struct ip_addr *ipaddr; + u16_t port; + } bc; + /** used for do_getaddr */ + struct { + struct ip_addr *ipaddr; + u16_t *port; + u8_t local; + } ad; + /** used for do_write */ + struct { + const void *dataptr; + size_t len; + u8_t apiflags; + } w; + /** used for do_recv */ + struct { + u16_t len; + } r; +#if LWIP_IGMP + /** used for do_join_leave_group */ + struct { + struct ip_addr *multiaddr; + struct ip_addr *interface; + enum netconn_igmp join_or_leave; + } jl; +#endif /* LWIP_IGMP */ +#if TCP_LISTEN_BACKLOG + struct { + u8_t backlog; + } lb; +#endif /* TCP_LISTEN_BACKLOG */ + } msg; +}; + +/** This struct contains a function to execute in another thread context and + a struct api_msg_msg that serves as an argument for this function. + This is passed to tcpip_apimsg to execute functions in tcpip_thread context. */ +struct api_msg { + /** function to execute in tcpip_thread context */ + void (* function)(struct api_msg_msg *msg); + /** arguments for this function */ + struct api_msg_msg msg; +}; + +#if LWIP_DNS +/** As do_gethostbyname requires more arguments but doesn't require a netconn, + it has its own struct (to avoid struct api_msg getting bigger than necessary). + do_gethostbyname must be called using tcpip_callback instead of tcpip_apimsg + (see netconn_gethostbyname). */ +struct dns_api_msg { + /** Hostname to query or dotted IP address string */ + const char *name; + /** Rhe resolved address is stored here */ + struct ip_addr *addr; + /** This semaphore is posted when the name is resolved, the application thread + should wait on it. */ + sys_sem_t sem; + /** Errors are given back here */ + err_t *err; +}; +#endif /* LWIP_DNS */ + +void do_newconn ( struct api_msg_msg *msg); +void do_delconn ( struct api_msg_msg *msg); +void do_bind ( struct api_msg_msg *msg); +void do_connect ( struct api_msg_msg *msg); +void do_disconnect ( struct api_msg_msg *msg); +void do_listen ( struct api_msg_msg *msg); +void do_send ( struct api_msg_msg *msg); +void do_recv ( struct api_msg_msg *msg); +void do_write ( struct api_msg_msg *msg); +void do_getaddr ( struct api_msg_msg *msg); +void do_close ( struct api_msg_msg *msg); +#if LWIP_IGMP +void do_join_leave_group( struct api_msg_msg *msg); +#endif /* LWIP_IGMP */ + +#if LWIP_DNS +void do_gethostbyname(void *arg); +#endif /* LWIP_DNS */ + +struct netconn* netconn_alloc(enum netconn_type t, netconn_callback callback); +void netconn_free(struct netconn *conn); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_NETCONN */ + +#endif /* __LWIP_API_MSG_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/arch.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/arch.h new file mode 100644 index 0000000..5ab190a --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/arch.h @@ -0,0 +1,235 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_ARCH_H__ +#define __LWIP_ARCH_H__ + +#ifndef LITTLE_ENDIAN +#define LITTLE_ENDIAN 1234 +#endif + +#ifndef BIG_ENDIAN +#define BIG_ENDIAN 4321 +#endif + +#include "arch/cc.h" + +/** Temporary: define format string for size_t if not defined in cc.h */ +#ifndef SZT_F +#define SZT_F U32_F +#endif /* SZT_F */ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef PACK_STRUCT_BEGIN +#define PACK_STRUCT_BEGIN +#endif /* PACK_STRUCT_BEGIN */ + +#ifndef PACK_STRUCT_END +#define PACK_STRUCT_END +#endif /* PACK_STRUCT_END */ + +#ifndef PACK_STRUCT_FIELD +#define PACK_STRUCT_FIELD(x) x +#endif /* PACK_STRUCT_FIELD */ + + +#ifndef LWIP_UNUSED_ARG +#define LWIP_UNUSED_ARG(x) (void)x +#endif /* LWIP_UNUSED_ARG */ + + +#ifdef LWIP_PROVIDE_ERRNO + +#define EPERM 1 /* Operation not permitted */ +#define ENOENT 2 /* No such file or directory */ +#define ESRCH 3 /* No such process */ +#define EINTR 4 /* Interrupted system call */ +#define EIO 5 /* I/O error */ +#define ENXIO 6 /* No such device or address */ +#define E2BIG 7 /* Arg list too long */ +#define ENOEXEC 8 /* Exec format error */ +#define EBADF 9 /* Bad file number */ +#define ECHILD 10 /* No child processes */ +#define EAGAIN 11 /* Try again */ +#define ENOMEM 12 /* Out of memory */ +#define EACCES 13 /* Permission denied */ +#define EFAULT 14 /* Bad address */ +#define ENOTBLK 15 /* Block device required */ +#define EBUSY 16 /* Device or resource busy */ +#define EEXIST 17 /* File exists */ +#define EXDEV 18 /* Cross-device link */ +#define ENODEV 19 /* No such device */ +#define ENOTDIR 20 /* Not a directory */ +#define EISDIR 21 /* Is a directory */ +#define EINVAL 22 /* Invalid argument */ +#define ENFILE 23 /* File table overflow */ +#define EMFILE 24 /* Too many open files */ +#define ENOTTY 25 /* Not a typewriter */ +#define ETXTBSY 26 /* Text file busy */ +#define EFBIG 27 /* File too large */ +#define ENOSPC 28 /* No space left on device */ +#define ESPIPE 29 /* Illegal seek */ +#define EROFS 30 /* Read-only file system */ +#define EMLINK 31 /* Too many links */ +#define EPIPE 32 /* Broken pipe */ +#define EDOM 33 /* Math argument out of domain of func */ +#define ERANGE 34 /* Math result not representable */ +#define EDEADLK 35 /* Resource deadlock would occur */ +#define ENAMETOOLONG 36 /* File name too long */ +#define ENOLCK 37 /* No record locks available */ +#define ENOSYS 38 /* Function not implemented */ +#define ENOTEMPTY 39 /* Directory not empty */ +#define ELOOP 40 /* Too many symbolic links encountered */ +#define EWOULDBLOCK EAGAIN /* Operation would block */ +#define ENOMSG 42 /* No message of desired type */ +#define EIDRM 43 /* Identifier removed */ +#define ECHRNG 44 /* Channel number out of range */ +#define EL2NSYNC 45 /* Level 2 not synchronized */ +#define EL3HLT 46 /* Level 3 halted */ +#define EL3RST 47 /* Level 3 reset */ +#define ELNRNG 48 /* Link number out of range */ +#define EUNATCH 49 /* Protocol driver not attached */ +#define ENOCSI 50 /* No CSI structure available */ +#define EL2HLT 51 /* Level 2 halted */ +#define EBADE 52 /* Invalid exchange */ +#define EBADR 53 /* Invalid request descriptor */ +#define EXFULL 54 /* Exchange full */ +#define ENOANO 55 /* No anode */ +#define EBADRQC 56 /* Invalid request code */ +#define EBADSLT 57 /* Invalid slot */ + +#define EDEADLOCK EDEADLK + +#define EBFONT 59 /* Bad font file format */ +#define ENOSTR 60 /* Device not a stream */ +#define ENODATA 61 /* No data available */ +#define ETIME 62 /* Timer expired */ +#define ENOSR 63 /* Out of streams resources */ +#define ENONET 64 /* Machine is not on the network */ +#define ENOPKG 65 /* Package not installed */ +#define EREMOTE 66 /* Object is remote */ +#define ENOLINK 67 /* Link has been severed */ +#define EADV 68 /* Advertise error */ +#define ESRMNT 69 /* Srmount error */ +#define ECOMM 70 /* Communication error on send */ +#define EPROTO 71 /* Protocol error */ +#define EMULTIHOP 72 /* Multihop attempted */ +#define EDOTDOT 73 /* RFS specific error */ +#define EBADMSG 74 /* Not a data message */ +#define EOVERFLOW 75 /* Value too large for defined data type */ +#define ENOTUNIQ 76 /* Name not unique on network */ +#define EBADFD 77 /* File descriptor in bad state */ +#define EREMCHG 78 /* Remote address changed */ +#define ELIBACC 79 /* Can not access a needed shared library */ +#define ELIBBAD 80 /* Accessing a corrupted shared library */ +#define ELIBSCN 81 /* .lib section in a.out corrupted */ +#define ELIBMAX 82 /* Attempting to link in too many shared libraries */ +#define ELIBEXEC 83 /* Cannot exec a shared library directly */ +#define EILSEQ 84 /* Illegal byte sequence */ +#define ERESTART 85 /* Interrupted system call should be restarted */ +#define ESTRPIPE 86 /* Streams pipe error */ +#define EUSERS 87 /* Too many users */ +#define ENOTSOCK 88 /* Socket operation on non-socket */ +#define EDESTADDRREQ 89 /* Destination address required */ +#define EMSGSIZE 90 /* Message too long */ +#define EPROTOTYPE 91 /* Protocol wrong type for socket */ +#define ENOPROTOOPT 92 /* Protocol not available */ +#define EPROTONOSUPPORT 93 /* Protocol not supported */ +#define ESOCKTNOSUPPORT 94 /* Socket type not supported */ +#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */ +#define EPFNOSUPPORT 96 /* Protocol family not supported */ +#define EAFNOSUPPORT 97 /* Address family not supported by protocol */ +#define EADDRINUSE 98 /* Address already in use */ +#define EADDRNOTAVAIL 99 /* Cannot assign requested address */ +#define ENETDOWN 100 /* Network is down */ +#define ENETUNREACH 101 /* Network is unreachable */ +#define ENETRESET 102 /* Network dropped connection because of reset */ +#define ECONNABORTED 103 /* Software caused connection abort */ +#define ECONNRESET 104 /* Connection reset by peer */ +#define ENOBUFS 105 /* No buffer space available */ +#define EISCONN 106 /* Transport endpoint is already connected */ +#define ENOTCONN 107 /* Transport endpoint is not connected */ +#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */ +#define ETOOMANYREFS 109 /* Too many references: cannot splice */ +#define ETIMEDOUT 110 /* Connection timed out */ +#define ECONNREFUSED 111 /* Connection refused */ +#define EHOSTDOWN 112 /* Host is down */ +#define EHOSTUNREACH 113 /* No route to host */ +#define EALREADY 114 /* Operation already in progress */ +#define EINPROGRESS 115 /* Operation now in progress */ +#define ESTALE 116 /* Stale NFS file handle */ +#define EUCLEAN 117 /* Structure needs cleaning */ +#define ENOTNAM 118 /* Not a XENIX named type file */ +#define ENAVAIL 119 /* No XENIX semaphores available */ +#define EISNAM 120 /* Is a named type file */ +#define EREMOTEIO 121 /* Remote I/O error */ +#define EDQUOT 122 /* Quota exceeded */ + +#define ENOMEDIUM 123 /* No medium found */ +#define EMEDIUMTYPE 124 /* Wrong medium type */ + + +#define ENSROK 0 /* DNS server returned answer with no data */ +#define ENSRNODATA 160 /* DNS server returned answer with no data */ +#define ENSRFORMERR 161 /* DNS server claims query was misformatted */ +#define ENSRSERVFAIL 162 /* DNS server returned general failure */ +#define ENSRNOTFOUND 163 /* Domain name not found */ +#define ENSRNOTIMP 164 /* DNS server does not implement requested operation */ +#define ENSRREFUSED 165 /* DNS server refused query */ +#define ENSRBADQUERY 166 /* Misformatted DNS query */ +#define ENSRBADNAME 167 /* Misformatted domain name */ +#define ENSRBADFAMILY 168 /* Unsupported address family */ +#define ENSRBADRESP 169 /* Misformatted DNS reply */ +#define ENSRCONNREFUSED 170 /* Could not contact DNS servers */ +#define ENSRTIMEOUT 171 /* Timeout while contacting DNS servers */ +#define ENSROF 172 /* End of file */ +#define ENSRFILE 173 /* Error reading file */ +#define ENSRNOMEM 174 /* Out of memory */ +#define ENSRDESTRUCTION 175 /* Application terminated lookup */ +#define ENSRQUERYDOMAINTOOLONG 176 /* Domain name is too long */ +#define ENSRCNAMELOOP 177 /* Domain name is too long */ + +#ifndef errno +extern int errno; +#endif + +#endif /* LWIP_PROVIDE_ERRNO */ + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_ARCH_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/debug.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/debug.h new file mode 100644 index 0000000..fb07607 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/debug.h @@ -0,0 +1,100 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_DEBUG_H__ +#define __LWIP_DEBUG_H__ + +#include "lwip/arch.h" + +/** lower two bits indicate debug level + * - 0 all + * - 1 warning + * - 2 serious + * - 3 severe + */ +#define LWIP_DBG_LEVEL_ALL 0x00 +#define LWIP_DBG_LEVEL_OFF LWIP_DBG_LEVEL_ALL /* compatibility define only */ +#define LWIP_DBG_LEVEL_WARNING 0x01 /* bad checksums, dropped packets, ... */ +#define LWIP_DBG_LEVEL_SERIOUS 0x02 /* memory allocation failures, ... */ +#define LWIP_DBG_LEVEL_SEVERE 0x03 +#define LWIP_DBG_MASK_LEVEL 0x03 + +/** flag for LWIP_DEBUGF to enable that debug message */ +#define LWIP_DBG_ON 0x80U +/** flag for LWIP_DEBUGF to disable that debug message */ +#define LWIP_DBG_OFF 0x00U + +/** flag for LWIP_DEBUGF indicating a tracing message (to follow program flow) */ +#define LWIP_DBG_TRACE 0x40U +/** flag for LWIP_DEBUGF indicating a state debug message (to follow module states) */ +#define LWIP_DBG_STATE 0x20U +/** flag for LWIP_DEBUGF indicating newly added code, not thoroughly tested yet */ +#define LWIP_DBG_FRESH 0x10U +/** flag for LWIP_DEBUGF to halt after printing this debug message */ +#define LWIP_DBG_HALT 0x08U + +#ifndef LWIP_NOASSERT +#define LWIP_ASSERT(message, assertion) do { if(!(assertion)) \ + LWIP_PLATFORM_ASSERT(message); } while(0) +#else /* LWIP_NOASSERT */ +#define LWIP_ASSERT(message, assertion) +#endif /* LWIP_NOASSERT */ + +/** if "expression" isn't true, then print "message" and execute "handler" expression */ +#ifndef LWIP_ERROR +#define LWIP_ERROR(message, expression, handler) do { if (!(expression)) { \ + LWIP_PLATFORM_ASSERT(message); handler;}} while(0) +#endif /* LWIP_ERROR */ + +#ifdef LWIP_DEBUG +/** print debug message only if debug message type is enabled... + * AND is of correct type AND is at least LWIP_DBG_LEVEL + */ +#define LWIP_DEBUGF(debug, message) do { \ + if ( \ + ((debug) & LWIP_DBG_ON) && \ + ((debug) & LWIP_DBG_TYPES_ON) && \ + ((s16_t)((debug) & LWIP_DBG_MASK_LEVEL) >= LWIP_DBG_MIN_LEVEL)) { \ + LWIP_PLATFORM_DIAG(message); \ + if ((debug) & LWIP_DBG_HALT) { \ + while(1); \ + } \ + } \ + } while(0) + +#else /* LWIP_DEBUG */ +#define LWIP_DEBUGF(debug, message) +#endif /* LWIP_DEBUG */ + +#endif /* __LWIP_DEBUG_H__ */ + diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/def.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/def.h new file mode 100644 index 0000000..c3681ac --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/def.h @@ -0,0 +1,49 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_DEF_H__ +#define __LWIP_DEF_H__ + +/* this might define NULL already */ +#include "lwip/arch.h" + +#define LWIP_MAX(x , y) (((x) > (y)) ? (x) : (y)) +#define LWIP_MIN(x , y) (((x) < (y)) ? (x) : (y)) + +#ifndef NULL +#define NULL ((void *)0) +#endif + + +#endif /* __LWIP_DEF_H__ */ + diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/dhcp.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/dhcp.h new file mode 100644 index 0000000..27a0ade --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/dhcp.h @@ -0,0 +1,248 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/** @file + */ + +#ifndef __LWIP_DHCP_H__ +#define __LWIP_DHCP_H__ + +#include "lwip/opt.h" + +#if LWIP_DHCP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/netif.h" +#include "lwip/udp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** period (in seconds) of the application calling dhcp_coarse_tmr() */ +#define DHCP_COARSE_TIMER_SECS 60 +/** period (in milliseconds) of the application calling dhcp_coarse_tmr() */ +#define DHCP_COARSE_TIMER_MSECS (DHCP_COARSE_TIMER_SECS * 1000UL) +/** period (in milliseconds) of the application calling dhcp_fine_tmr() */ +#define DHCP_FINE_TIMER_MSECS 500 + +struct dhcp +{ + /** transaction identifier of last sent request */ + u32_t xid; + /** our connection to the DHCP server */ + struct udp_pcb *pcb; + /** incoming msg */ + struct dhcp_msg *msg_in; + /** incoming msg options */ + void *options_in; + /** ingoing msg options length */ + u16_t options_in_len; + /** current DHCP state machine state */ + u8_t state; + /** retries of current request */ + u8_t tries; + + struct pbuf *p_out; /* pbuf of outcoming msg */ + struct dhcp_msg *msg_out; /* outgoing msg */ + u16_t options_out_len; /* outgoing msg options length */ + u16_t request_timeout; /* #ticks with period DHCP_FINE_TIMER_SECS for request timeout */ + u16_t t1_timeout; /* #ticks with period DHCP_COARSE_TIMER_SECS for renewal time */ + u16_t t2_timeout; /* #ticks with period DHCP_COARSE_TIMER_SECS for rebind time */ + struct ip_addr server_ip_addr; /* dhcp server address that offered this lease */ + struct ip_addr offered_ip_addr; + struct ip_addr offered_sn_mask; + struct ip_addr offered_gw_addr; + struct ip_addr offered_bc_addr; +#define DHCP_MAX_DNS 2 + u32_t dns_count; /* actual number of DNS servers obtained */ + struct ip_addr offered_dns_addr[DHCP_MAX_DNS]; /* DNS server addresses */ + + u32_t offered_t0_lease; /* lease period (in seconds) */ + u32_t offered_t1_renew; /* recommended renew time (usually 50% of lease period) */ + u32_t offered_t2_rebind; /* recommended rebind time (usually 66% of lease period) */ +#if LWIP_DHCP_AUTOIP_COOP + u8_t autoip_coop_state; +#endif +/** Patch #1308 + * TODO: See dhcp.c "TODO"s + */ +#if 0 + struct ip_addr offered_si_addr; + u8_t *boot_file_name; +#endif +}; + +/* MUST be compiled with "pack structs" or equivalent! */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +/** minimum set of fields of any DHCP message */ +struct dhcp_msg +{ + PACK_STRUCT_FIELD(u8_t op); + PACK_STRUCT_FIELD(u8_t htype); + PACK_STRUCT_FIELD(u8_t hlen); + PACK_STRUCT_FIELD(u8_t hops); + PACK_STRUCT_FIELD(u32_t xid); + PACK_STRUCT_FIELD(u16_t secs); + PACK_STRUCT_FIELD(u16_t flags); + PACK_STRUCT_FIELD(struct ip_addr ciaddr); + PACK_STRUCT_FIELD(struct ip_addr yiaddr); + PACK_STRUCT_FIELD(struct ip_addr siaddr); + PACK_STRUCT_FIELD(struct ip_addr giaddr); +#define DHCP_CHADDR_LEN 16U + PACK_STRUCT_FIELD(u8_t chaddr[DHCP_CHADDR_LEN]); +#define DHCP_SNAME_LEN 64U + PACK_STRUCT_FIELD(u8_t sname[DHCP_SNAME_LEN]); +#define DHCP_FILE_LEN 128U + PACK_STRUCT_FIELD(u8_t file[DHCP_FILE_LEN]); + PACK_STRUCT_FIELD(u32_t cookie); +#define DHCP_MIN_OPTIONS_LEN 68U +/** make sure user does not configure this too small */ +#if ((defined(DHCP_OPTIONS_LEN)) && (DHCP_OPTIONS_LEN < DHCP_MIN_OPTIONS_LEN)) +# undef DHCP_OPTIONS_LEN +#endif +/** allow this to be configured in lwipopts.h, but not too small */ +#if (!defined(DHCP_OPTIONS_LEN)) +/** set this to be sufficient for your options in outgoing DHCP msgs */ +# define DHCP_OPTIONS_LEN DHCP_MIN_OPTIONS_LEN +#endif + PACK_STRUCT_FIELD(u8_t options[DHCP_OPTIONS_LEN]); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +/** start DHCP configuration */ +err_t dhcp_start(struct netif *netif); +/** enforce early lease renewal (not needed normally)*/ +err_t dhcp_renew(struct netif *netif); +/** release the DHCP lease, usually called before dhcp_stop()*/ +err_t dhcp_release(struct netif *netif); +/** stop DHCP configuration */ +void dhcp_stop(struct netif *netif); +/** inform server of our manual IP address */ +void dhcp_inform(struct netif *netif); +/** Handle a possible change in the network configuration */ +void dhcp_network_changed(struct netif *netif); + +/** if enabled, check whether the offered IP address is not in use, using ARP */ +#if DHCP_DOES_ARP_CHECK +void dhcp_arp_reply(struct netif *netif, struct ip_addr *addr); +#endif + +/** to be called every minute */ +void dhcp_coarse_tmr(void); +/** to be called every half second */ +void dhcp_fine_tmr(void); + +/** DHCP message item offsets and length */ +#define DHCP_MSG_OFS (UDP_DATA_OFS) + #define DHCP_OP_OFS (DHCP_MSG_OFS + 0) + #define DHCP_HTYPE_OFS (DHCP_MSG_OFS + 1) + #define DHCP_HLEN_OFS (DHCP_MSG_OFS + 2) + #define DHCP_HOPS_OFS (DHCP_MSG_OFS + 3) + #define DHCP_XID_OFS (DHCP_MSG_OFS + 4) + #define DHCP_SECS_OFS (DHCP_MSG_OFS + 8) + #define DHCP_FLAGS_OFS (DHCP_MSG_OFS + 10) + #define DHCP_CIADDR_OFS (DHCP_MSG_OFS + 12) + #define DHCP_YIADDR_OFS (DHCP_MSG_OFS + 16) + #define DHCP_SIADDR_OFS (DHCP_MSG_OFS + 20) + #define DHCP_GIADDR_OFS (DHCP_MSG_OFS + 24) + #define DHCP_CHADDR_OFS (DHCP_MSG_OFS + 28) + #define DHCP_SNAME_OFS (DHCP_MSG_OFS + 44) + #define DHCP_FILE_OFS (DHCP_MSG_OFS + 108) +#define DHCP_MSG_LEN 236 + +#define DHCP_COOKIE_OFS (DHCP_MSG_OFS + DHCP_MSG_LEN) +#define DHCP_OPTIONS_OFS (DHCP_MSG_OFS + DHCP_MSG_LEN + 4) + +#define DHCP_CLIENT_PORT 68 +#define DHCP_SERVER_PORT 67 + +/** DHCP client states */ +#define DHCP_REQUESTING 1 +#define DHCP_INIT 2 +#define DHCP_REBOOTING 3 +#define DHCP_REBINDING 4 +#define DHCP_RENEWING 5 +#define DHCP_SELECTING 6 +#define DHCP_INFORMING 7 +#define DHCP_CHECKING 8 +#define DHCP_PERMANENT 9 +#define DHCP_BOUND 10 +/** not yet implemented #define DHCP_RELEASING 11 */ +#define DHCP_BACKING_OFF 12 +#define DHCP_OFF 13 + +/** AUTOIP cooperatation flags */ +#define DHCP_AUTOIP_COOP_STATE_OFF 0 +#define DHCP_AUTOIP_COOP_STATE_ON 1 + +#define DHCP_BOOTREQUEST 1 +#define DHCP_BOOTREPLY 2 + +#define DHCP_DISCOVER 1 +#define DHCP_OFFER 2 +#define DHCP_REQUEST 3 +#define DHCP_DECLINE 4 +#define DHCP_ACK 5 +#define DHCP_NAK 6 +#define DHCP_RELEASE 7 +#define DHCP_INFORM 8 + +#define DHCP_HTYPE_ETH 1 + +#define DHCP_HLEN_ETH 6 + +#define DHCP_BROADCAST_FLAG 15 +#define DHCP_BROADCAST_MASK (1 << DHCP_FLAG_BROADCAST) + +/** BootP options */ +#define DHCP_OPTION_PAD 0 +#define DHCP_OPTION_SUBNET_MASK 1 /* RFC 2132 3.3 */ +#define DHCP_OPTION_ROUTER 3 +#define DHCP_OPTION_DNS_SERVER 6 +#define DHCP_OPTION_HOSTNAME 12 +#define DHCP_OPTION_IP_TTL 23 +#define DHCP_OPTION_MTU 26 +#define DHCP_OPTION_BROADCAST 28 +#define DHCP_OPTION_TCP_TTL 37 +#define DHCP_OPTION_END 255 + +/** DHCP options */ +#define DHCP_OPTION_REQUESTED_IP 50 /* RFC 2132 9.1, requested IP address */ +#define DHCP_OPTION_LEASE_TIME 51 /* RFC 2132 9.2, time in seconds, in 4 bytes */ +#define DHCP_OPTION_OVERLOAD 52 /* RFC2132 9.3, use file and/or sname field for options */ + +#define DHCP_OPTION_MESSAGE_TYPE 53 /* RFC 2132 9.6, important for DHCP */ +#define DHCP_OPTION_MESSAGE_TYPE_LEN 1 + + +#define DHCP_OPTION_SERVER_ID 54 /* RFC 2132 9.7, server IP address */ +#define DHCP_OPTION_PARAMETER_REQUEST_LIST 55 /* RFC 2132 9.8, requested option types */ + +#define DHCP_OPTION_MAX_MSG_SIZE 57 /* RFC 2132 9.10, message size accepted >= 576 */ +#define DHCP_OPTION_MAX_MSG_SIZE_LEN 2 + +#define DHCP_OPTION_T1 58 /* T1 renewal time */ +#define DHCP_OPTION_T2 59 /* T2 rebinding time */ +#define DHCP_OPTION_US 60 +#define DHCP_OPTION_CLIENT_ID 61 +#define DHCP_OPTION_TFTP_SERVERNAME 66 +#define DHCP_OPTION_BOOTFILE 67 + +/** possible combinations of overloading the file and sname fields with options */ +#define DHCP_OVERLOAD_NONE 0 +#define DHCP_OVERLOAD_FILE 1 +#define DHCP_OVERLOAD_SNAME 2 +#define DHCP_OVERLOAD_SNAME_FILE 3 + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_DHCP */ + +#endif /*__LWIP_DHCP_H__*/ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/dns.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/dns.h new file mode 100644 index 0000000..c1b8ae0 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/dns.h @@ -0,0 +1,99 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/** + * lwip DNS resolver header file. + + * Author: Jim Pettinato + * April 2007 + + * ported from uIP resolv.c Copyright (c) 2002-2003, Adam Dunkels. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __LWIP_DNS_H__ +#define __LWIP_DNS_H__ + +#include "lwip/opt.h" + +#if LWIP_DNS /* don't build if not configured for use in lwipopts.h */ + +/** DNS timer period */ +#define DNS_TMR_INTERVAL 1000 + +/** DNS field TYPE used for "Resource Records" */ +#define DNS_RRTYPE_A 1 /* a host address */ +#define DNS_RRTYPE_NS 2 /* an authoritative name server */ +#define DNS_RRTYPE_MD 3 /* a mail destination (Obsolete - use MX) */ +#define DNS_RRTYPE_MF 4 /* a mail forwarder (Obsolete - use MX) */ +#define DNS_RRTYPE_CNAME 5 /* the canonical name for an alias */ +#define DNS_RRTYPE_SOA 6 /* marks the start of a zone of authority */ +#define DNS_RRTYPE_MB 7 /* a mailbox domain name (EXPERIMENTAL) */ +#define DNS_RRTYPE_MG 8 /* a mail group member (EXPERIMENTAL) */ +#define DNS_RRTYPE_MR 9 /* a mail rename domain name (EXPERIMENTAL) */ +#define DNS_RRTYPE_NULL 10 /* a null RR (EXPERIMENTAL) */ +#define DNS_RRTYPE_WKS 11 /* a well known service description */ +#define DNS_RRTYPE_PTR 12 /* a domain name pointer */ +#define DNS_RRTYPE_HINFO 13 /* host information */ +#define DNS_RRTYPE_MINFO 14 /* mailbox or mail list information */ +#define DNS_RRTYPE_MX 15 /* mail exchange */ +#define DNS_RRTYPE_TXT 16 /* text strings */ + +/** DNS field CLASS used for "Resource Records" */ +#define DNS_RRCLASS_IN 1 /* the Internet */ +#define DNS_RRCLASS_CS 2 /* the CSNET class (Obsolete - used only for examples in some obsolete RFCs) */ +#define DNS_RRCLASS_CH 3 /* the CHAOS class */ +#define DNS_RRCLASS_HS 4 /* Hesiod [Dyer 87] */ +#define DNS_RRCLASS_FLUSH 0x800 /* Flush bit */ + +/** Callback which is invoked when a hostname is found. + * A function of this type must be implemented by the application using the DNS resolver. + * @param name pointer to the name that was looked up. + * @param ipaddr pointer to a struct ip_addr containing the IP address of the hostname, + * or NULL if the name could not be found (or on any other error). + * @param callback_arg a user-specified callback argument passed to dns_gethostbyname +*/ +typedef void (*dns_found_callback)(const char *name, struct ip_addr *ipaddr, void *callback_arg); + + +void dns_init(void); + +void dns_tmr(void); + +void dns_setserver(u8_t numdns, struct ip_addr *dnsserver); + +struct ip_addr dns_getserver(u8_t numdns); + +err_t dns_gethostbyname(const char *hostname, struct ip_addr *addr, + dns_found_callback found, void *callback_arg); + +#if DNS_LOCAL_HOSTLIST && DNS_LOCAL_HOSTLIST_IS_DYNAMIC +int dns_local_removehost(const char *hostname, const struct ip_addr *addr); +err_t dns_local_addhost(const char *hostname, const struct ip_addr *addr); +#endif /* DNS_LOCAL_HOSTLIST && DNS_LOCAL_HOSTLIST_IS_DYNAMIC */ + +#endif /* LWIP_DNS */ + +#endif /* __LWIP_DNS_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/err.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/err.h new file mode 100644 index 0000000..792f276 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/err.h @@ -0,0 +1,89 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_ERR_H__ +#define __LWIP_ERR_H__ + +#include "lwip/opt.h" +#include "lwip/arch.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** Define LWIP_ERR_T in cc.h if you want to use + * a different type for your platform (must be signed). */ +#ifdef LWIP_ERR_T +typedef LWIP_ERR_T err_t; +#else /* LWIP_ERR_T */ + typedef s8_t err_t; +#endif /* LWIP_ERR_T*/ + +/* Definitions for error constants. */ + +#define ERR_OK 0 /* No error, everything OK. */ +#define ERR_MEM -1 /* Out of memory error. */ +#define ERR_BUF -2 /* Buffer error. */ +#define ERR_TIMEOUT -3 /* Timeout. */ +#define ERR_RTE -4 /* Routing problem. */ + +#define ERR_IS_FATAL(e) ((e) < ERR_RTE) + +#define ERR_ABRT -5 /* Connection aborted. */ +#define ERR_RST -6 /* Connection reset. */ +#define ERR_CLSD -7 /* Connection closed. */ +#define ERR_CONN -8 /* Not connected. */ + +#define ERR_VAL -9 /* Illegal value. */ + +#define ERR_ARG -10 /* Illegal argument. */ + +#define ERR_USE -11 /* Address in use. */ + +#define ERR_IF -12 /* Low-level netif error */ +#define ERR_ISCONN -13 /* Already connected. */ + +#define ERR_INPROGRESS -14 /* Operation in progress */ + + +#ifdef LWIP_DEBUG +extern const char *lwip_strerr(err_t err); +#else +#define lwip_strerr(x) "" +#endif /* LWIP_DEBUG */ + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_ERR_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/init.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/init.h new file mode 100644 index 0000000..a86e0d9 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/init.h @@ -0,0 +1,74 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_INIT_H__ +#define __LWIP_INIT_H__ + +#include "lwip/opt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** X.x.x: Major version of the stack */ +#define LWIP_VERSION_MAJOR 1U +/** x.X.x: Minor version of the stack */ +#define LWIP_VERSION_MINOR 3U +/** x.x.X: Revision of the stack */ +#define LWIP_VERSION_REVISION 2U +/** For release candidates, this is set to 1..254 + * For official releases, this is set to 255 (LWIP_RC_RELEASE) + * For development versions (CVS), this is set to 0 (LWIP_RC_DEVELOPMENT) */ +#define LWIP_VERSION_RC 255U + +/** LWIP_VERSION_RC is set to LWIP_RC_RELEASE for official releases */ +#define LWIP_RC_RELEASE 255U +/** LWIP_VERSION_RC is set to LWIP_RC_DEVELOPMENT for CVS versions */ +#define LWIP_RC_DEVELOPMENT 0U + +#define LWIP_VERSION_IS_RELEASE (LWIP_VERSION_RC == LWIP_RC_RELEASE) +#define LWIP_VERSION_IS_DEVELOPMENT (LWIP_VERSION_RC == LWIP_RC_DEVELOPMENT) +#define LWIP_VERSION_IS_RC ((LWIP_VERSION_RC != LWIP_RC_RELEASE) && (LWIP_VERSION_RC != LWIP_RC_DEVELOPMENT)) + +/** Provides the version of the stack */ +#define LWIP_VERSION (LWIP_VERSION_MAJOR << 24 | LWIP_VERSION_MINOR << 16 | \ + LWIP_VERSION_REVISION << 8 | LWIP_VERSION_RC) + +/* Modules initialization */ +void lwip_init(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_INIT_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/mem.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/mem.h new file mode 100644 index 0000000..327229e --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/mem.h @@ -0,0 +1,109 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_MEM_H__ +#define __LWIP_MEM_H__ + +#include "lwip/opt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if MEM_LIBC_MALLOC + +#include /* for size_t */ + +typedef size_t mem_size_t; + +/* aliases for C library malloc() */ +#define mem_init() +/* in case C library malloc() needs extra protection, + * allow these defines to be overridden. + */ +#ifndef mem_free +#define mem_free free +#endif +#ifndef mem_malloc +#define mem_malloc malloc +#endif +#ifndef mem_calloc +#define mem_calloc calloc +#endif +#ifndef mem_realloc +static void *mem_realloc(void *mem, mem_size_t size) +{ + LWIP_UNUSED_ARG(size); + return mem; +} +#endif +#else /* MEM_LIBC_MALLOC */ + +/* MEM_SIZE would have to be aligned, but using 64000 here instead of + * 65535 leaves some room for alignment... + */ +#if MEM_SIZE > 64000l +typedef u32_t mem_size_t; +#else +typedef u16_t mem_size_t; +#endif /* MEM_SIZE > 64000 */ + +#if MEM_USE_POOLS +/** mem_init is not used when using pools instead of a heap */ +#define mem_init() +/** mem_realloc is not used when using pools instead of a heap: + we can't free part of a pool element and don't want to copy the rest */ +#define mem_realloc(mem, size) (mem) +#else /* MEM_USE_POOLS */ +/* lwIP alternative malloc */ +void mem_init(void); +void *mem_realloc(void *mem, mem_size_t size); +#endif /* MEM_USE_POOLS */ +void *mem_malloc(mem_size_t size); +void *mem_calloc(mem_size_t count, mem_size_t size); +void mem_free(void *mem); +#endif /* MEM_LIBC_MALLOC */ + +#ifndef LWIP_MEM_ALIGN_SIZE +#define LWIP_MEM_ALIGN_SIZE(size) (((size) + MEM_ALIGNMENT - 1) & ~(MEM_ALIGNMENT-1)) +#endif + +#ifndef LWIP_MEM_ALIGN +#define LWIP_MEM_ALIGN(addr) ((void *)(((mem_ptr_t)(addr) + MEM_ALIGNMENT - 1) & ~(mem_ptr_t)(MEM_ALIGNMENT-1))) +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_MEM_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/memp.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/memp.h new file mode 100644 index 0000000..3de7bf9 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/memp.h @@ -0,0 +1,118 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#ifndef __LWIP_MEMP_H__ +#define __LWIP_MEMP_H__ + +#include "lwip/opt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Create the list of all memory pools managed by memp. MEMP_MAX represents a NULL pool at the end */ +typedef enum { +#define LWIP_MEMPOOL(name,num,size,desc) MEMP_##name, +#include "lwip/memp_std.h" + MEMP_MAX +} memp_t; + +#if MEM_USE_POOLS +/* Use a helper type to get the start and end of the user "memory pools" for mem_malloc */ +typedef enum { + /* Get the first (via: + MEMP_POOL_HELPER_START = ((u8_t) 1*MEMP_POOL_A + 0*MEMP_POOL_B + 0*MEMP_POOL_C + 0)*/ + MEMP_POOL_HELPER_FIRST = ((u8_t) +#define LWIP_MEMPOOL(name,num,size,desc) +#define LWIP_MALLOC_MEMPOOL_START 1 +#define LWIP_MALLOC_MEMPOOL(num, size) * MEMP_POOL_##size + 0 +#define LWIP_MALLOC_MEMPOOL_END +#include "lwip/memp_std.h" + ) , + /* Get the last (via: + MEMP_POOL_HELPER_END = ((u8_t) 0 + MEMP_POOL_A*0 + MEMP_POOL_B*0 + MEMP_POOL_C*1) */ + MEMP_POOL_HELPER_LAST = ((u8_t) +#define LWIP_MEMPOOL(name,num,size,desc) +#define LWIP_MALLOC_MEMPOOL_START +#define LWIP_MALLOC_MEMPOOL(num, size) 0 + MEMP_POOL_##size * +#define LWIP_MALLOC_MEMPOOL_END 1 +#include "lwip/memp_std.h" + ) +} memp_pool_helper_t; + +/* The actual start and stop values are here (cast them over) + We use this helper type and these defines so we can avoid using const memp_t values */ +#define MEMP_POOL_FIRST ((memp_t) MEMP_POOL_HELPER_FIRST) +#define MEMP_POOL_LAST ((memp_t) MEMP_POOL_HELPER_LAST) +#endif /* MEM_USE_POOLS */ + +#if MEMP_MEM_MALLOC || MEM_USE_POOLS +extern const u16_t memp_sizes[MEMP_MAX]; +#endif /* MEMP_MEM_MALLOC || MEM_USE_POOLS */ + +#if MEMP_MEM_MALLOC + +#include "mem.h" + +#define memp_init() +#define memp_malloc(type) mem_malloc(memp_sizes[type]) +#define memp_free(type, mem) mem_free(mem) + +#else /* MEMP_MEM_MALLOC */ + +#if MEM_USE_POOLS +/** This structure is used to save the pool one element came from. */ +struct memp_malloc_helper +{ + memp_t poolnr; +}; +#endif /* MEM_USE_POOLS */ + +void memp_init(void); + +#if MEMP_OVERFLOW_CHECK +void *memp_malloc_fn(memp_t type, const char* file, const int line); +#define memp_malloc(t) memp_malloc_fn((t), __FILE__, __LINE__) +#else +void *memp_malloc(memp_t type); +#endif +void memp_free(memp_t type, void *mem); + +#endif /* MEMP_MEM_MALLOC */ + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_MEMP_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/memp_std.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/memp_std.h new file mode 100644 index 0000000..d8d4945 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/memp_std.h @@ -0,0 +1,104 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * SETUP: Make sure we define everything we will need. + * + * We have create three types of pools: + * 1) MEMPOOL - standard pools + * 2) MALLOC_MEMPOOL - to be used by mem_malloc in mem.c + * 3) PBUF_MEMPOOL - a mempool of pbuf's, so include space for the pbuf struct + * + * If the include'r doesn't require any special treatment of each of the types + * above, then will declare #2 & #3 to be just standard mempools. + */ +#ifndef LWIP_MALLOC_MEMPOOL +/* This treats "malloc pools" just like any other pool. + The pools are a little bigger to provide 'size' as the amount of user data. */ +#define LWIP_MALLOC_MEMPOOL(num, size) LWIP_MEMPOOL(POOL_##size, num, (size + sizeof(struct memp_malloc_helper)), "MALLOC_"#size) +#define LWIP_MALLOC_MEMPOOL_START +#define LWIP_MALLOC_MEMPOOL_END +#endif /* LWIP_MALLOC_MEMPOOL */ + +#ifndef LWIP_PBUF_MEMPOOL +/* This treats "pbuf pools" just like any other pool. + * Allocates buffers for a pbuf struct AND a payload size */ +#define LWIP_PBUF_MEMPOOL(name, num, payload, desc) LWIP_MEMPOOL(name, num, (MEMP_ALIGN_SIZE(sizeof(struct pbuf)) + MEMP_ALIGN_SIZE(payload)), desc) +#endif /* LWIP_PBUF_MEMPOOL */ + + +/* + * A list of internal pools used by LWIP. + * + * LWIP_MEMPOOL(pool_name, number_elements, element_size, pool_description) + * creates a pool name MEMP_pool_name. description is used in stats.c + */ +#if LWIP_RAW +LWIP_MEMPOOL(RAW_PCB, MEMP_NUM_RAW_PCB, sizeof(struct raw_pcb), "RAW_PCB") +#endif /* LWIP_RAW */ + +#if LWIP_UDP +LWIP_MEMPOOL(UDP_PCB, MEMP_NUM_UDP_PCB, sizeof(struct udp_pcb), "UDP_PCB") +#endif /* LWIP_UDP */ + +#if LWIP_TCP +LWIP_MEMPOOL(TCP_PCB, MEMP_NUM_TCP_PCB, sizeof(struct tcp_pcb), "TCP_PCB") +LWIP_MEMPOOL(TCP_PCB_LISTEN, MEMP_NUM_TCP_PCB_LISTEN, sizeof(struct tcp_pcb_listen), "TCP_PCB_LISTEN") +LWIP_MEMPOOL(TCP_SEG, MEMP_NUM_TCP_SEG, sizeof(struct tcp_seg), "TCP_SEG") +#endif /* LWIP_TCP */ + +#if IP_REASSEMBLY +LWIP_MEMPOOL(REASSDATA, MEMP_NUM_REASSDATA, sizeof(struct ip_reassdata), "REASSDATA") +#endif /* IP_REASSEMBLY */ + +#if LWIP_NETCONN +LWIP_MEMPOOL(NETBUF, MEMP_NUM_NETBUF, sizeof(struct netbuf), "NETBUF") +LWIP_MEMPOOL(NETCONN, MEMP_NUM_NETCONN, sizeof(struct netconn), "NETCONN") +#endif /* LWIP_NETCONN */ + +#if NO_SYS==0 +LWIP_MEMPOOL(TCPIP_MSG_API, MEMP_NUM_TCPIP_MSG_API, sizeof(struct tcpip_msg), "TCPIP_MSG_API") +LWIP_MEMPOOL(TCPIP_MSG_INPKT,MEMP_NUM_TCPIP_MSG_INPKT, sizeof(struct tcpip_msg), "TCPIP_MSG_INPKT") +#endif /* NO_SYS==0 */ + +#if ARP_QUEUEING +LWIP_MEMPOOL(ARP_QUEUE, MEMP_NUM_ARP_QUEUE, sizeof(struct etharp_q_entry), "ARP_QUEUE") +#endif /* ARP_QUEUEING */ + +#if LWIP_IGMP +LWIP_MEMPOOL(IGMP_GROUP, MEMP_NUM_IGMP_GROUP, sizeof(struct igmp_group), "IGMP_GROUP") +#endif /* LWIP_IGMP */ + +#if NO_SYS==0 +LWIP_MEMPOOL(SYS_TIMEOUT, MEMP_NUM_SYS_TIMEOUT, sizeof(struct sys_timeo), "SYS_TIMEOUT") +#endif /* NO_SYS==0 */ + + +/* + * A list of pools of pbuf's used by LWIP. + * + * LWIP_PBUF_MEMPOOL(pool_name, number_elements, pbuf_payload_size, pool_description) + * creates a pool name MEMP_pool_name. description is used in stats.c + * This allocates enough space for the pbuf struct and a payload. + * (Example: pbuf_payload_size=0 allocates only size for the struct) + */ +LWIP_PBUF_MEMPOOL(PBUF, MEMP_NUM_PBUF, 0, "PBUF_REF/ROM") +LWIP_PBUF_MEMPOOL(PBUF_POOL, PBUF_POOL_SIZE, PBUF_POOL_BUFSIZE, "PBUF_POOL") + + +/* + * Allow for user-defined pools; this must be explicitly set in lwipopts.h + * since the default is to NOT look for lwippools.h + */ +#if MEMP_USE_CUSTOM_POOLS +#include "lwippools.h" +#endif /* MEMP_USE_CUSTOM_POOLS */ + +/* + * REQUIRED CLEANUP: Clear up so we don't get "multiply defined" error later + * (#undef is ignored for something that is not defined) + */ +#undef LWIP_MEMPOOL +#undef LWIP_MALLOC_MEMPOOL +#undef LWIP_MALLOC_MEMPOOL_START +#undef LWIP_MALLOC_MEMPOOL_END +#undef LWIP_PBUF_MEMPOOL diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/netbuf.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/netbuf.h new file mode 100644 index 0000000..ab9ea33 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/netbuf.h @@ -0,0 +1,88 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_NETBUF_H__ +#define __LWIP_NETBUF_H__ + +#include "lwip/opt.h" +#include "lwip/pbuf.h" +#include "lwip/ip_addr.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct netbuf { + struct pbuf *p, *ptr; + struct ip_addr *addr; + u16_t port; +#if LWIP_NETBUF_RECVINFO + struct ip_addr *toaddr; + u16_t toport; +#endif /* LWIP_NETBUF_RECVINFO */ +}; + +/* Network buffer functions: */ +struct netbuf * netbuf_new (void); +void netbuf_delete (struct netbuf *buf); +void * netbuf_alloc (struct netbuf *buf, u16_t size); +void netbuf_free (struct netbuf *buf); +err_t netbuf_ref (struct netbuf *buf, + const void *dataptr, u16_t size); +void netbuf_chain (struct netbuf *head, + struct netbuf *tail); + +u16_t netbuf_len (struct netbuf *buf); +err_t netbuf_data (struct netbuf *buf, + void **dataptr, u16_t *len); +s8_t netbuf_next (struct netbuf *buf); +void netbuf_first (struct netbuf *buf); + + +#define netbuf_copy_partial(buf, dataptr, len, offset) \ + pbuf_copy_partial((buf)->p, (dataptr), (len), (offset)) +#define netbuf_copy(buf,dataptr,len) netbuf_copy_partial(buf, dataptr, len, 0) +#define netbuf_take(buf, dataptr, len) pbuf_take((buf)->p, dataptr, len) +#define netbuf_len(buf) ((buf)->p->tot_len) +#define netbuf_fromaddr(buf) ((buf)->addr) +#define netbuf_fromport(buf) ((buf)->port) +#if LWIP_NETBUF_RECVINFO +#define netbuf_destaddr(buf) ((buf)->toaddr) +#define netbuf_destport(buf) ((buf)->toport) +#endif /* LWIP_NETBUF_RECVINFO */ + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_NETBUF_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/netdb.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/netdb.h new file mode 100644 index 0000000..c59c3a4 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/netdb.h @@ -0,0 +1,113 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ + +#include "lwip/opt.h" + +#if LWIP_DNS && LWIP_SOCKET + +#include /* for size_t */ + +#include "lwip/sockets.h" + +/* some rarely used options */ +#ifndef LWIP_DNS_API_DECLARE_H_ERRNO +#define LWIP_DNS_API_DECLARE_H_ERRNO 1 +#endif + +#ifndef LWIP_DNS_API_DEFINE_ERRORS +#define LWIP_DNS_API_DEFINE_ERRORS 1 +#endif + +#ifndef LWIP_DNS_API_DECLARE_STRUCTS +#define LWIP_DNS_API_DECLARE_STRUCTS 1 +#endif + +#if LWIP_DNS_API_DEFINE_ERRORS +/** Errors used by the DNS API functions, h_errno can be one of them */ +#define EAI_NONAME 200 +#define EAI_SERVICE 201 +#define EAI_FAIL 202 +#define EAI_MEMORY 203 + +#define HOST_NOT_FOUND 210 +#define NO_DATA 211 +#define NO_RECOVERY 212 +#define TRY_AGAIN 213 +#endif /* LWIP_DNS_API_DEFINE_ERRORS */ + +#if LWIP_DNS_API_DECLARE_STRUCTS +struct hostent { + char *h_name; /* Official name of the host. */ + char **h_aliases; /* A pointer to an array of pointers to alternative host names, + terminated by a null pointer. */ + int h_addrtype; /* Address type. */ + int h_length; /* The length, in bytes, of the address. */ + char **h_addr_list; /* A pointer to an array of pointers to network addresses (in + network byte order) for the host, terminated by a null pointer. */ +#define h_addr h_addr_list[0] /* for backward compatibility */ +}; + +struct addrinfo { + int ai_flags; /* Input flags. */ + int ai_family; /* Address family of socket. */ + int ai_socktype; /* Socket type. */ + int ai_protocol; /* Protocol of socket. */ + socklen_t ai_addrlen; /* Length of socket address. */ + struct sockaddr *ai_addr; /* Socket address of socket. */ + char *ai_canonname; /* Canonical name of service location. */ + struct addrinfo *ai_next; /* Pointer to next in list. */ +}; +#endif /* LWIP_DNS_API_DECLARE_STRUCTS */ + +#if LWIP_DNS_API_DECLARE_H_ERRNO +/* application accessable error code set by the DNS API functions */ +extern int h_errno; +#endif /* LWIP_DNS_API_DECLARE_H_ERRNO*/ + +struct hostent *lwip_gethostbyname(const char *name); +int lwip_gethostbyname_r(const char *name, struct hostent *ret, char *buf, + size_t buflen, struct hostent **result, int *h_errnop); +void lwip_freeaddrinfo(struct addrinfo *ai); +int lwip_getaddrinfo(const char *nodename, + const char *servname, + const struct addrinfo *hints, + struct addrinfo **res); + +#if LWIP_COMPAT_SOCKETS +#define gethostbyname(name) lwip_gethostbyname(name) +#define gethostbyname_r(name, ret, buf, buflen, result, h_errnop) \ + lwip_gethostbyname_r(name, ret, buf, buflen, result, h_errnop) +#define freeaddrinfo(addrinfo) lwip_freeaddrinfo(addrinfo) +#define getaddrinfo(nodname, servname, hints, res) \ + lwip_getaddrinfo(nodname, servname, hints, res) +#endif /* LWIP_COMPAT_SOCKETS */ + +#endif /* LWIP_DNS && LWIP_SOCKET */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/netif.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/netif.h new file mode 100644 index 0000000..8e650d7 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/netif.h @@ -0,0 +1,265 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_NETIF_H__ +#define __LWIP_NETIF_H__ + +#include "lwip/opt.h" + +#define ENABLE_LOOPBACK (LWIP_NETIF_LOOPBACK || LWIP_HAVE_LOOPIF) + +#include "lwip/err.h" + +#include "lwip/ip_addr.h" + +#include "lwip/inet.h" +#include "lwip/pbuf.h" +#if LWIP_DHCP +struct dhcp; +#endif +#if LWIP_AUTOIP +struct autoip; +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Throughout this file, IP addresses are expected to be in + * the same byte order as in IP_PCB. */ + +/** must be the maximum of all used hardware address lengths + across all types of interfaces in use */ +#define NETIF_MAX_HWADDR_LEN 6U + +/** TODO: define the use (where, when, whom) of netif flags */ + +/** whether the network interface is 'up'. this is + * a software flag used to control whether this network + * interface is enabled and processes traffic. + */ +#define NETIF_FLAG_UP 0x01U +/** if set, the netif has broadcast capability */ +#define NETIF_FLAG_BROADCAST 0x02U +/** if set, the netif is one end of a point-to-point connection */ +#define NETIF_FLAG_POINTTOPOINT 0x04U +/** if set, the interface is configured using DHCP */ +#define NETIF_FLAG_DHCP 0x08U +/** if set, the interface has an active link + * (set by the network interface driver) */ +#define NETIF_FLAG_LINK_UP 0x10U +/** if set, the netif is an device using ARP */ +#define NETIF_FLAG_ETHARP 0x20U +/** if set, the netif has IGMP capability */ +#define NETIF_FLAG_IGMP 0x40U + +/** Generic data structure used for all lwIP network interfaces. + * The following fields should be filled in by the initialization + * function for the device driver: hwaddr_len, hwaddr[], mtu, flags */ + +struct netif { + /** pointer to next in linked list */ + struct netif *next; + + /** IP address configuration in network byte order */ + struct ip_addr ip_addr; + struct ip_addr netmask; + struct ip_addr gw; + + /** This function is called by the network device driver + * to pass a packet up the TCP/IP stack. */ + err_t (* input)(struct pbuf *p, struct netif *inp); + /** This function is called by the IP module when it wants + * to send a packet on the interface. This function typically + * first resolves the hardware address, then sends the packet. */ + err_t (* output)(struct netif *netif, struct pbuf *p, + struct ip_addr *ipaddr); + /** This function is called by the ARP module when it wants + * to send a packet on the interface. This function outputs + * the pbuf as-is on the link medium. */ + err_t (* linkoutput)(struct netif *netif, struct pbuf *p); +#if LWIP_NETIF_STATUS_CALLBACK + /** This function is called when the netif state is set to up or down + */ + void (* status_callback)(struct netif *netif); +#endif /* LWIP_NETIF_STATUS_CALLBACK */ +#if LWIP_NETIF_LINK_CALLBACK + /** This function is called when the netif link is set to up or down + */ + void (* link_callback)(struct netif *netif); +#endif /* LWIP_NETIF_LINK_CALLBACK */ + /** This field can be set by the device driver and could point + * to state information for the device. */ + void *state; +#if LWIP_DHCP + /** the DHCP client state information for this netif */ + struct dhcp *dhcp; +#endif /* LWIP_DHCP */ +#if LWIP_AUTOIP + /** the AutoIP client state information for this netif */ + struct autoip *autoip; +#endif +#if LWIP_NETIF_HOSTNAME + /* the hostname for this netif, NULL is a valid value */ + char* hostname; +#endif /* LWIP_NETIF_HOSTNAME */ + /** maximum transfer unit (in bytes) */ + u16_t mtu; + /** number of bytes used in hwaddr */ + u8_t hwaddr_len; + /** link level hardware address of this interface */ + u8_t hwaddr[NETIF_MAX_HWADDR_LEN]; + /** flags (see NETIF_FLAG_ above) */ + u8_t flags; + /** descriptive abbreviation */ + char name[2]; + /** number of this interface */ + u8_t num; +#if LWIP_SNMP + /** link type (from "snmp_ifType" enum from snmp.h) */ + u8_t link_type; + /** (estimate) link speed */ + u32_t link_speed; + /** timestamp at last change made (up/down) */ + u32_t ts; + /** counters */ + u32_t ifinoctets; + u32_t ifinucastpkts; + u32_t ifinnucastpkts; + u32_t ifindiscards; + u32_t ifoutoctets; + u32_t ifoutucastpkts; + u32_t ifoutnucastpkts; + u32_t ifoutdiscards; +#endif /* LWIP_SNMP */ +#if LWIP_IGMP + /* This function could be called to add or delete a entry in the multicast filter table of the ethernet MAC.*/ + err_t (*igmp_mac_filter)( struct netif *netif, struct ip_addr *group, u8_t action); +#endif /* LWIP_IGMP */ +#if LWIP_NETIF_HWADDRHINT + u8_t *addr_hint; +#endif /* LWIP_NETIF_HWADDRHINT */ +#if ENABLE_LOOPBACK + /* List of packets to be queued for ourselves. */ + struct pbuf *loop_first; + struct pbuf *loop_last; +#if LWIP_LOOPBACK_MAX_PBUFS + u16_t loop_cnt_current; +#endif /* LWIP_LOOPBACK_MAX_PBUFS */ +#endif /* ENABLE_LOOPBACK */ +}; + +#if LWIP_SNMP +#define NETIF_INIT_SNMP(netif, type, speed) \ + /* use "snmp_ifType" enum from snmp.h for "type", snmp_ifType_ethernet_csmacd by example */ \ + netif->link_type = type; \ + /* your link speed here (units: bits per second) */ \ + netif->link_speed = speed; \ + netif->ts = 0; \ + netif->ifinoctets = 0; \ + netif->ifinucastpkts = 0; \ + netif->ifinnucastpkts = 0; \ + netif->ifindiscards = 0; \ + netif->ifoutoctets = 0; \ + netif->ifoutucastpkts = 0; \ + netif->ifoutnucastpkts = 0; \ + netif->ifoutdiscards = 0 +#else /* LWIP_SNMP */ +#define NETIF_INIT_SNMP(netif, type, speed) +#endif /* LWIP_SNMP */ + + +/** The list of network interfaces. */ +extern struct netif *netif_list; +/** The default network interface. */ +extern struct netif *netif_default; + +#define netif_init() /* Compatibility define, not init needed. */ + +struct netif *netif_add(struct netif *netif, struct ip_addr *ipaddr, struct ip_addr *netmask, + struct ip_addr *gw, + void *state, + err_t (* init)(struct netif *netif), + err_t (* input)(struct pbuf *p, struct netif *netif)); + +void +netif_set_addr(struct netif *netif,struct ip_addr *ipaddr, struct ip_addr *netmask, + struct ip_addr *gw); +void netif_remove(struct netif * netif); + +/* Returns a network interface given its name. The name is of the form + "et0", where the first two letters are the "name" field in the + netif structure, and the digit is in the num field in the same + structure. */ +struct netif *netif_find(char *name); + +void netif_set_default(struct netif *netif); + +void netif_set_ipaddr(struct netif *netif, struct ip_addr *ipaddr); +void netif_set_netmask(struct netif *netif, struct ip_addr *netmask); +void netif_set_gw(struct netif *netif, struct ip_addr *gw); + +void netif_set_up(struct netif *netif); +void netif_set_down(struct netif *netif); +u8_t netif_is_up(struct netif *netif); + +#if LWIP_NETIF_STATUS_CALLBACK +/* + * Set callback to be called when interface is brought up/down + */ +void netif_set_status_callback(struct netif *netif, void (* status_callback)(struct netif *netif)); +#endif /* LWIP_NETIF_STATUS_CALLBACK */ + +#if LWIP_NETIF_LINK_CALLBACK +void netif_set_link_up(struct netif *netif); +void netif_set_link_down(struct netif *netif); +u8_t netif_is_link_up(struct netif *netif); +/* + * Set callback to be called when link is brought up/down + */ +void netif_set_link_callback(struct netif *netif, void (* link_callback)(struct netif *netif)); +#endif /* LWIP_NETIF_LINK_CALLBACK */ + +#ifdef __cplusplus +} +#endif + +#if ENABLE_LOOPBACK +err_t netif_loop_output(struct netif *netif, struct pbuf *p, struct ip_addr *dest_ip); +void netif_poll(struct netif *netif); +#if !LWIP_NETIF_LOOPBACK_MULTITHREADING +void netif_poll_all(void); +#endif /* !LWIP_NETIF_LOOPBACK_MULTITHREADING */ +#endif /* ENABLE_LOOPBACK */ + +#endif /* __LWIP_NETIF_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/netifapi.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/netifapi.h new file mode 100644 index 0000000..22d8690 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/netifapi.h @@ -0,0 +1,107 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + */ + +#ifndef __LWIP_NETIFAPI_H__ +#define __LWIP_NETIFAPI_H__ + +#include "lwip/opt.h" + +#if LWIP_NETIF_API /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/sys.h" +#include "lwip/netif.h" +#include "lwip/dhcp.h" +#include "lwip/autoip.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct netifapi_msg_msg { +#if !LWIP_TCPIP_CORE_LOCKING + sys_sem_t sem; +#endif /* !LWIP_TCPIP_CORE_LOCKING */ + err_t err; + struct netif *netif; + union { + struct { + struct ip_addr *ipaddr; + struct ip_addr *netmask; + struct ip_addr *gw; + void *state; + err_t (* init) (struct netif *netif); + err_t (* input)(struct pbuf *p, struct netif *netif); + } add; + struct { + void (* voidfunc)(struct netif *netif); + err_t (* errtfunc)(struct netif *netif); + } common; + } msg; +}; + +struct netifapi_msg { + void (* function)(struct netifapi_msg_msg *msg); + struct netifapi_msg_msg msg; +}; + + +/* API for application */ +err_t netifapi_netif_add ( struct netif *netif, + struct ip_addr *ipaddr, + struct ip_addr *netmask, + struct ip_addr *gw, + void *state, + err_t (* init)(struct netif *netif), + err_t (* input)(struct pbuf *p, struct netif *netif) ); + +err_t netifapi_netif_set_addr ( struct netif *netif, + struct ip_addr *ipaddr, + struct ip_addr *netmask, + struct ip_addr *gw ); + +err_t netifapi_netif_common ( struct netif *netif, + void (* voidfunc)(struct netif *netif), + err_t (* errtfunc)(struct netif *netif) ); + +#define netifapi_netif_remove(n) netifapi_netif_common(n, netif_remove, NULL) +#define netifapi_netif_set_up(n) netifapi_netif_common(n, netif_set_up, NULL) +#define netifapi_netif_set_down(n) netifapi_netif_common(n, netif_set_down, NULL) +#define netifapi_netif_set_default(n) netifapi_netif_common(n, netif_set_default, NULL) +#define netifapi_dhcp_start(n) netifapi_netif_common(n, NULL, dhcp_start) +#define netifapi_dhcp_stop(n) netifapi_netif_common(n, dhcp_stop, NULL) +#define netifapi_autoip_start(n) netifapi_netif_common(n, NULL, autoip_start) +#define netifapi_autoip_stop(n) netifapi_netif_common(n, NULL, autoip_stop) + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_NETIF_API */ + +#endif /* __LWIP_NETIFAPI_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/opt.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/opt.h new file mode 100644 index 0000000..a7cdbd8 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/opt.h @@ -0,0 +1,1842 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/** + * @file + * + * lwIP Options Configuration + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_OPT_H__ +#define __LWIP_OPT_H__ + +/* + * Include user defined options first. Anything not defined in these files + * will be set to standard values. Override anything you dont like! + */ +#include "lwipopts.h" +#include "lwip/debug.h" + +/* + ----------------------------------------------- + ---------- Platform specific locking ---------- + ----------------------------------------------- +*/ + +/** + * SYS_LIGHTWEIGHT_PROT==1: if you want inter-task protection for certain + * critical regions during buffer allocation, deallocation and memory + * allocation and deallocation. + */ +#ifndef SYS_LIGHTWEIGHT_PROT +#define SYS_LIGHTWEIGHT_PROT 0 +#endif + +/** + * NO_SYS==1: Provides VERY minimal functionality. Otherwise, + * use lwIP facilities. + */ +#ifndef NO_SYS +#define NO_SYS 0 +#endif + +/** + * MEMCPY: override this if you have a faster implementation at hand than the + * one included in your C library + */ +#ifndef MEMCPY +#define MEMCPY(dst,src,len) memcpy(dst,src,len) +#endif + +/** + * SMEMCPY: override this with care! Some compilers (e.g. gcc) can inline a + * call to memcpy() if the length is known at compile time and is small. + */ +#ifndef SMEMCPY +#define SMEMCPY(dst,src,len) memcpy(dst,src,len) +#endif + +/* + ------------------------------------ + ---------- Memory options ---------- + ------------------------------------ +*/ +/** + * MEM_LIBC_MALLOC==1: Use malloc/free/realloc provided by your C-library + * instead of the lwip internal allocator. Can save code size if you + * already use it. + */ +#ifndef MEM_LIBC_MALLOC +#define MEM_LIBC_MALLOC 0 +#endif + +/** +* MEMP_MEM_MALLOC==1: Use mem_malloc/mem_free instead of the lwip pool allocator. +* Especially useful with MEM_LIBC_MALLOC but handle with care regarding execution +* speed and usage from interrupts! +*/ +#ifndef MEMP_MEM_MALLOC +#define MEMP_MEM_MALLOC 0 +#endif + +/** + * MEM_ALIGNMENT: should be set to the alignment of the CPU + * 4 byte alignment -> #define MEM_ALIGNMENT 4 + * 2 byte alignment -> #define MEM_ALIGNMENT 2 + */ +#ifndef MEM_ALIGNMENT +#define MEM_ALIGNMENT 1 +#endif + +/** + * MEM_SIZE: the size of the heap memory. If the application will send + * a lot of data that needs to be copied, this should be set high. + */ +#ifndef MEM_SIZE +#define MEM_SIZE 1600 +#endif + +/** + * MEMP_OVERFLOW_CHECK: memp overflow protection reserves a configurable + * amount of bytes before and after each memp element in every pool and fills + * it with a prominent default value. + * MEMP_OVERFLOW_CHECK == 0 no checking + * MEMP_OVERFLOW_CHECK == 1 checks each element when it is freed + * MEMP_OVERFLOW_CHECK >= 2 checks each element in every pool every time + * memp_malloc() or memp_free() is called (useful but slow!) + */ +#ifndef MEMP_OVERFLOW_CHECK +#define MEMP_OVERFLOW_CHECK 0 +#endif + +/** + * MEMP_SANITY_CHECK==1: run a sanity check after each memp_free() to make + * sure that there are no cycles in the linked lists. + */ +#ifndef MEMP_SANITY_CHECK +#define MEMP_SANITY_CHECK 0 +#endif + +/** + * MEM_USE_POOLS==1: Use an alternative to malloc() by allocating from a set + * of memory pools of various sizes. When mem_malloc is called, an element of + * the smallest pool that can provide the length needed is returned. + * To use this, MEMP_USE_CUSTOM_POOLS also has to be enabled. + */ +#ifndef MEM_USE_POOLS +#define MEM_USE_POOLS 0 +#endif + +/** + * MEM_USE_POOLS_TRY_BIGGER_POOL==1: if one malloc-pool is empty, try the next + * bigger pool - WARNING: THIS MIGHT WASTE MEMORY but it can make a system more + * reliable. */ +#ifndef MEM_USE_POOLS_TRY_BIGGER_POOL +#define MEM_USE_POOLS_TRY_BIGGER_POOL 0 +#endif + +/** + * MEMP_USE_CUSTOM_POOLS==1: whether to include a user file lwippools.h + * that defines additional pools beyond the "standard" ones required + * by lwIP. If you set this to 1, you must have lwippools.h in your + * inlude path somewhere. + */ +#ifndef MEMP_USE_CUSTOM_POOLS +#define MEMP_USE_CUSTOM_POOLS 0 +#endif + +/** + * Set this to 1 if you want to free PBUF_RAM pbufs (or call mem_free()) from + * interrupt context (or another context that doesn't allow waiting for a + * semaphore). + * If set to 1, mem_malloc will be protected by a semaphore and SYS_ARCH_PROTECT, + * while mem_free will only use SYS_ARCH_PROTECT. mem_malloc SYS_ARCH_UNPROTECTs + * with each loop so that mem_free can run. + * + * ATTENTION: As you can see from the above description, this leads to dis-/ + * enabling interrupts often, which can be slow! Also, on low memory, mem_malloc + * can need longer. + * + * If you don't want that, at least for NO_SYS=0, you can still use the following + * functions to enqueue a deallocation call which then runs in the tcpip_thread + * context: + * - pbuf_free_callback(p); + * - mem_free_callback(m); + */ +#ifndef LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT +#define LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 0 +#endif + +/* + ------------------------------------------------ + ---------- Internal Memory Pool Sizes ---------- + ------------------------------------------------ +*/ +/** + * MEMP_NUM_PBUF: the number of memp struct pbufs (used for PBUF_ROM and PBUF_REF). + * If the application sends a lot of data out of ROM (or other static memory), + * this should be set high. + */ +#ifndef MEMP_NUM_PBUF +#define MEMP_NUM_PBUF 16 +#endif + +/** + * MEMP_NUM_RAW_PCB: Number of raw connection PCBs + * (requires the LWIP_RAW option) + */ +#ifndef MEMP_NUM_RAW_PCB +#define MEMP_NUM_RAW_PCB 4 +#endif + +/** + * MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One + * per active UDP "connection". + * (requires the LWIP_UDP option) + */ +#ifndef MEMP_NUM_UDP_PCB +#define MEMP_NUM_UDP_PCB 4 +#endif + +/** + * MEMP_NUM_TCP_PCB: the number of simulatenously active TCP connections. + * (requires the LWIP_TCP option) + */ +#ifndef MEMP_NUM_TCP_PCB +#define MEMP_NUM_TCP_PCB 5 +#endif + +/** + * MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP connections. + * (requires the LWIP_TCP option) + */ +#ifndef MEMP_NUM_TCP_PCB_LISTEN +#define MEMP_NUM_TCP_PCB_LISTEN 8 +#endif + +/** + * MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP segments. + * (requires the LWIP_TCP option) + */ +#ifndef MEMP_NUM_TCP_SEG +#define MEMP_NUM_TCP_SEG 16 +#endif + +/** + * MEMP_NUM_REASSDATA: the number of simultaneously IP packets queued for + * reassembly (whole packets, not fragments!) + */ +#ifndef MEMP_NUM_REASSDATA +#define MEMP_NUM_REASSDATA 5 +#endif + +/** + * MEMP_NUM_ARP_QUEUE: the number of simulateously queued outgoing + * packets (pbufs) that are waiting for an ARP request (to resolve + * their destination address) to finish. + * (requires the ARP_QUEUEING option) + */ +#ifndef MEMP_NUM_ARP_QUEUE +#define MEMP_NUM_ARP_QUEUE 30 +#endif + +/** + * MEMP_NUM_IGMP_GROUP: The number of multicast groups whose network interfaces + * can be members et the same time (one per netif - allsystems group -, plus one + * per netif membership). + * (requires the LWIP_IGMP option) + */ +#ifndef MEMP_NUM_IGMP_GROUP +#define MEMP_NUM_IGMP_GROUP 8 +#endif + +/** + * MEMP_NUM_SYS_TIMEOUT: the number of simulateously active timeouts. + * (requires NO_SYS==0) + */ +#ifndef MEMP_NUM_SYS_TIMEOUT +#define MEMP_NUM_SYS_TIMEOUT 3 +#endif + +/** + * MEMP_NUM_NETBUF: the number of struct netbufs. + * (only needed if you use the sequential API, like api_lib.c) + */ +#ifndef MEMP_NUM_NETBUF +#define MEMP_NUM_NETBUF 2 +#endif + +/** + * MEMP_NUM_NETCONN: the number of struct netconns. + * (only needed if you use the sequential API, like api_lib.c) + */ +#ifndef MEMP_NUM_NETCONN +#define MEMP_NUM_NETCONN 4 +#endif + +/** + * MEMP_NUM_TCPIP_MSG_API: the number of struct tcpip_msg, which are used + * for callback/timeout API communication. + * (only needed if you use tcpip.c) + */ +#ifndef MEMP_NUM_TCPIP_MSG_API +#define MEMP_NUM_TCPIP_MSG_API 8 +#endif + +/** + * MEMP_NUM_TCPIP_MSG_INPKT: the number of struct tcpip_msg, which are used + * for incoming packets. + * (only needed if you use tcpip.c) + */ +#ifndef MEMP_NUM_TCPIP_MSG_INPKT +#define MEMP_NUM_TCPIP_MSG_INPKT 8 +#endif + +/** + * PBUF_POOL_SIZE: the number of buffers in the pbuf pool. + */ +#ifndef PBUF_POOL_SIZE +#define PBUF_POOL_SIZE 16 +#endif + +/* + --------------------------------- + ---------- ARP options ---------- + --------------------------------- +*/ +/** + * LWIP_ARP==1: Enable ARP functionality. + */ +#ifndef LWIP_ARP +#define LWIP_ARP 1 +#endif + +/** + * ARP_TABLE_SIZE: Number of active MAC-IP address pairs cached. + */ +#ifndef ARP_TABLE_SIZE +#define ARP_TABLE_SIZE 10 +#endif + +/** + * ARP_QUEUEING==1: Outgoing packets are queued during hardware address + * resolution. + */ +#ifndef ARP_QUEUEING +#define ARP_QUEUEING 1 +#endif + +/** + * ETHARP_TRUST_IP_MAC==1: Incoming IP packets cause the ARP table to be + * updated with the source MAC and IP addresses supplied in the packet. + * You may want to disable this if you do not trust LAN peers to have the + * correct addresses, or as a limited approach to attempt to handle + * spoofing. If disabled, lwIP will need to make a new ARP request if + * the peer is not already in the ARP table, adding a little latency. + */ +#ifndef ETHARP_TRUST_IP_MAC +#define ETHARP_TRUST_IP_MAC 1 +#endif + +/** + * ETHARP_SUPPORT_VLAN==1: support receiving ethernet packets with VLAN header. + * Additionally, you can define ETHARP_VLAN_CHECK to an u16_t VLAN ID to check. + * If ETHARP_VLAN_CHECK is defined, only VLAN-traffic for this VLAN is accepted. + * If ETHARP_VLAN_CHECK is not defined, all traffic is accepted. + */ +#ifndef ETHARP_SUPPORT_VLAN +#define ETHARP_SUPPORT_VLAN 0 +#endif + +/* + -------------------------------- + ---------- IP options ---------- + -------------------------------- +*/ +/** + * IP_FORWARD==1: Enables the ability to forward IP packets across network + * interfaces. If you are going to run lwIP on a device with only one network + * interface, define this to 0. + */ +#ifndef IP_FORWARD +#define IP_FORWARD 0 +#endif + +/** + * IP_OPTIONS_ALLOWED: Defines the behavior for IP options. + * IP_OPTIONS_ALLOWED==0: All packets with IP options are dropped. + * IP_OPTIONS_ALLOWED==1: IP options are allowed (but not parsed). + */ +#ifndef IP_OPTIONS_ALLOWED +#define IP_OPTIONS_ALLOWED 1 +#endif + +/** + * IP_REASSEMBLY==1: Reassemble incoming fragmented IP packets. Note that + * this option does not affect outgoing packet sizes, which can be controlled + * via IP_FRAG. + */ +#ifndef IP_REASSEMBLY +#define IP_REASSEMBLY 1 +#endif + +/** + * IP_FRAG==1: Fragment outgoing IP packets if their size exceeds MTU. Note + * that this option does not affect incoming packet sizes, which can be + * controlled via IP_REASSEMBLY. + */ +#ifndef IP_FRAG +#define IP_FRAG 1 +#endif + +/** + * IP_REASS_MAXAGE: Maximum time (in multiples of IP_TMR_INTERVAL - so seconds, normally) + * a fragmented IP packet waits for all fragments to arrive. If not all fragments arrived + * in this time, the whole packet is discarded. + */ +#ifndef IP_REASS_MAXAGE +#define IP_REASS_MAXAGE 3 +#endif + +/** + * IP_REASS_MAX_PBUFS: Total maximum amount of pbufs waiting to be reassembled. + * Since the received pbufs are enqueued, be sure to configure + * PBUF_POOL_SIZE > IP_REASS_MAX_PBUFS so that the stack is still able to receive + * packets even if the maximum amount of fragments is enqueued for reassembly! + */ +#ifndef IP_REASS_MAX_PBUFS +#define IP_REASS_MAX_PBUFS 10 +#endif + +/** + * IP_FRAG_USES_STATIC_BUF==1: Use a static MTU-sized buffer for IP + * fragmentation. Otherwise pbufs are allocated and reference the original + * packet data to be fragmented. + */ +#ifndef IP_FRAG_USES_STATIC_BUF +#define IP_FRAG_USES_STATIC_BUF 1 +#endif + +/** + * IP_FRAG_MAX_MTU: Assumed max MTU on any interface for IP frag buffer + * (requires IP_FRAG_USES_STATIC_BUF==1) + */ +#if IP_FRAG_USES_STATIC_BUF && !defined(IP_FRAG_MAX_MTU) +#define IP_FRAG_MAX_MTU 1500 +#endif + +/** + * IP_DEFAULT_TTL: Default value for Time-To-Live used by transport layers. + */ +#ifndef IP_DEFAULT_TTL +#define IP_DEFAULT_TTL 255 +#endif + +/** + * IP_SOF_BROADCAST=1: Use the SOF_BROADCAST field to enable broadcast + * filter per pcb on udp and raw send operations. To enable broadcast filter + * on recv operations, you also have to set IP_SOF_BROADCAST_RECV=1. + */ +#ifndef IP_SOF_BROADCAST +#define IP_SOF_BROADCAST 0 +#endif + +/** + * IP_SOF_BROADCAST_RECV (requires IP_SOF_BROADCAST=1) enable the broadcast + * filter on recv operations. + */ +#ifndef IP_SOF_BROADCAST_RECV +#define IP_SOF_BROADCAST_RECV 0 +#endif + +/* + ---------------------------------- + ---------- ICMP options ---------- + ---------------------------------- +*/ +/** + * LWIP_ICMP==1: Enable ICMP module inside the IP stack. + * Be careful, disable that make your product non-compliant to RFC1122 + */ +#ifndef LWIP_ICMP +#define LWIP_ICMP 1 +#endif + +/** + * ICMP_TTL: Default value for Time-To-Live used by ICMP packets. + */ +#ifndef ICMP_TTL +#define ICMP_TTL (IP_DEFAULT_TTL) +#endif + +/** + * LWIP_BROADCAST_PING==1: respond to broadcast pings (default is unicast only) + */ +#ifndef LWIP_BROADCAST_PING +#define LWIP_BROADCAST_PING 0 +#endif + +/** + * LWIP_MULTICAST_PING==1: respond to multicast pings (default is unicast only) + */ +#ifndef LWIP_MULTICAST_PING +#define LWIP_MULTICAST_PING 0 +#endif + +/* + --------------------------------- + ---------- RAW options ---------- + --------------------------------- +*/ +/** + * LWIP_RAW==1: Enable application layer to hook into the IP layer itself. + */ +#ifndef LWIP_RAW +#define LWIP_RAW 1 +#endif + +/** + * LWIP_RAW==1: Enable application layer to hook into the IP layer itself. + */ +#ifndef RAW_TTL +#define RAW_TTL (IP_DEFAULT_TTL) +#endif + +/* + ---------------------------------- + ---------- DHCP options ---------- + ---------------------------------- +*/ +/** + * LWIP_DHCP==1: Enable DHCP module. + */ +#ifndef LWIP_DHCP +#define LWIP_DHCP 0 +#endif + +/** + * DHCP_DOES_ARP_CHECK==1: Do an ARP check on the offered address. + */ +#ifndef DHCP_DOES_ARP_CHECK +#define DHCP_DOES_ARP_CHECK ((LWIP_DHCP) && (LWIP_ARP)) +#endif + +/* + ------------------------------------ + ---------- AUTOIP options ---------- + ------------------------------------ +*/ +/** + * LWIP_AUTOIP==1: Enable AUTOIP module. + */ +#ifndef LWIP_AUTOIP +#define LWIP_AUTOIP 0 +#endif + +/** + * LWIP_DHCP_AUTOIP_COOP==1: Allow DHCP and AUTOIP to be both enabled on + * the same interface at the same time. + */ +#ifndef LWIP_DHCP_AUTOIP_COOP +#define LWIP_DHCP_AUTOIP_COOP 0 +#endif + +/** + * LWIP_DHCP_AUTOIP_COOP_TRIES: Set to the number of DHCP DISCOVER probes + * that should be sent before falling back on AUTOIP. This can be set + * as low as 1 to get an AutoIP address very quickly, but you should + * be prepared to handle a changing IP address when DHCP overrides + * AutoIP. + */ +#ifndef LWIP_DHCP_AUTOIP_COOP_TRIES +#define LWIP_DHCP_AUTOIP_COOP_TRIES 9 +#endif + +/* + ---------------------------------- + ---------- SNMP options ---------- + ---------------------------------- +*/ +/** + * LWIP_SNMP==1: Turn on SNMP module. UDP must be available for SNMP + * transport. + */ +#ifndef LWIP_SNMP +#define LWIP_SNMP 0 +#endif + +/** + * SNMP_CONCURRENT_REQUESTS: Number of concurrent requests the module will + * allow. At least one request buffer is required. + */ +#ifndef SNMP_CONCURRENT_REQUESTS +#define SNMP_CONCURRENT_REQUESTS 1 +#endif + +/** + * SNMP_TRAP_DESTINATIONS: Number of trap destinations. At least one trap + * destination is required + */ +#ifndef SNMP_TRAP_DESTINATIONS +#define SNMP_TRAP_DESTINATIONS 1 +#endif + +/** + * SNMP_PRIVATE_MIB: + */ +#ifndef SNMP_PRIVATE_MIB +#define SNMP_PRIVATE_MIB 0 +#endif + +/** + * Only allow SNMP write actions that are 'safe' (e.g. disabeling netifs is not + * a safe action and disabled when SNMP_SAFE_REQUESTS = 1). + * Unsafe requests are disabled by default! + */ +#ifndef SNMP_SAFE_REQUESTS +#define SNMP_SAFE_REQUESTS 1 +#endif + +/* + ---------------------------------- + ---------- IGMP options ---------- + ---------------------------------- +*/ +/** + * LWIP_IGMP==1: Turn on IGMP module. + */ +#ifndef LWIP_IGMP +#define LWIP_IGMP 0 +#endif + +/* + ---------------------------------- + ---------- DNS options ----------- + ---------------------------------- +*/ +/** + * LWIP_DNS==1: Turn on DNS module. UDP must be available for DNS + * transport. + */ +#ifndef LWIP_DNS +#define LWIP_DNS 0 +#endif + +/** DNS maximum number of entries to maintain locally. */ +#ifndef DNS_TABLE_SIZE +#define DNS_TABLE_SIZE 4 +#endif + +/** DNS maximum host name length supported in the name table. */ +#ifndef DNS_MAX_NAME_LENGTH +#define DNS_MAX_NAME_LENGTH 256 +#endif + +/** The maximum of DNS servers */ +#ifndef DNS_MAX_SERVERS +#define DNS_MAX_SERVERS 2 +#endif + +/** DNS do a name checking between the query and the response. */ +#ifndef DNS_DOES_NAME_CHECK +#define DNS_DOES_NAME_CHECK 1 +#endif + +/** DNS use a local buffer if DNS_USES_STATIC_BUF=0, a static one if + DNS_USES_STATIC_BUF=1, or a dynamic one if DNS_USES_STATIC_BUF=2. + The buffer will be of size DNS_MSG_SIZE */ +#ifndef DNS_USES_STATIC_BUF +#define DNS_USES_STATIC_BUF 1 +#endif + +/** DNS message max. size. Default value is RFC compliant. */ +#ifndef DNS_MSG_SIZE +#define DNS_MSG_SIZE 512 +#endif + +/** DNS_LOCAL_HOSTLIST: Implements a local host-to-address list. If enabled, + * you have to define + * #define DNS_LOCAL_HOSTLIST_INIT {{"host1", 0x123}, {"host2", 0x234}} + * (an array of structs name/address, where address is an u32_t in network + * byte order). + * + * Instead, you can also use an external function: + * #define DNS_LOOKUP_LOCAL_EXTERN(x) extern u32_t my_lookup_function(const char *name) + * that returns the IP address or INADDR_NONE if not found. + */ +#ifndef DNS_LOCAL_HOSTLIST +#define DNS_LOCAL_HOSTLIST 0 +#endif /* DNS_LOCAL_HOSTLIST */ + +/** If this is turned on, the local host-list can be dynamically changed + * at runtime. */ +#ifndef DNS_LOCAL_HOSTLIST_IS_DYNAMIC +#define DNS_LOCAL_HOSTLIST_IS_DYNAMIC 0 +#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */ + +/* + --------------------------------- + ---------- UDP options ---------- + --------------------------------- +*/ +/** + * LWIP_UDP==1: Turn on UDP. + */ +#ifndef LWIP_UDP +#define LWIP_UDP 1 +#endif + +/** + * LWIP_UDPLITE==1: Turn on UDP-Lite. (Requires LWIP_UDP) + */ +#ifndef LWIP_UDPLITE +#define LWIP_UDPLITE 0 +#endif + +/** + * UDP_TTL: Default Time-To-Live value. + */ +#ifndef UDP_TTL +#define UDP_TTL (IP_DEFAULT_TTL) +#endif + +/** + * LWIP_NETBUF_RECVINFO==1: append destination addr and port to every netbuf. + */ +#ifndef LWIP_NETBUF_RECVINFO +#define LWIP_NETBUF_RECVINFO 0 +#endif + +/* + --------------------------------- + ---------- TCP options ---------- + --------------------------------- +*/ +/** + * LWIP_TCP==1: Turn on TCP. + */ +#ifndef LWIP_TCP +#define LWIP_TCP 1 +#endif + +/** + * TCP_TTL: Default Time-To-Live value. + */ +#ifndef TCP_TTL +#define TCP_TTL (IP_DEFAULT_TTL) +#endif + +/** + * TCP_WND: The size of a TCP window. This must be at least + * (2 * TCP_MSS) for things to work well + */ +#ifndef TCP_WND +#define TCP_WND (4 * TCP_MSS) +#endif + +/** + * TCP_MAXRTX: Maximum number of retransmissions of data segments. + */ +#ifndef TCP_MAXRTX +#define TCP_MAXRTX 12 +#endif + +/** + * TCP_SYNMAXRTX: Maximum number of retransmissions of SYN segments. + */ +#ifndef TCP_SYNMAXRTX +#define TCP_SYNMAXRTX 6 +#endif + +/** + * TCP_QUEUE_OOSEQ==1: TCP will queue segments that arrive out of order. + * Define to 0 if your device is low on memory. + */ +#ifndef TCP_QUEUE_OOSEQ +#define TCP_QUEUE_OOSEQ (LWIP_TCP) +#endif + +/** + * TCP_MSS: TCP Maximum segment size. (default is 536, a conservative default, + * you might want to increase this.) + * For the receive side, this MSS is advertised to the remote side + * when opening a connection. For the transmit size, this MSS sets + * an upper limit on the MSS advertised by the remote host. + */ +#ifndef TCP_MSS +#define TCP_MSS 536 +#endif + +/** + * TCP_CALCULATE_EFF_SEND_MSS: "The maximum size of a segment that TCP really + * sends, the 'effective send MSS,' MUST be the smaller of the send MSS (which + * reflects the available reassembly buffer size at the remote host) and the + * largest size permitted by the IP layer" (RFC 1122) + * Setting this to 1 enables code that checks TCP_MSS against the MTU of the + * netif used for a connection and limits the MSS if it would be too big otherwise. + */ +#ifndef TCP_CALCULATE_EFF_SEND_MSS +#define TCP_CALCULATE_EFF_SEND_MSS 1 +#endif + + +/** + * TCP_SND_BUF: TCP sender buffer space (bytes). + */ +#ifndef TCP_SND_BUF +#define TCP_SND_BUF 256 +#endif + +/** + * TCP_SND_QUEUELEN: TCP sender buffer space (pbufs). This must be at least + * as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. + */ +#ifndef TCP_SND_QUEUELEN +#define TCP_SND_QUEUELEN (4 * (TCP_SND_BUF)/(TCP_MSS)) +#endif + +/** + * TCP_SNDLOWAT: TCP writable space (bytes). This must be less than or equal + * to TCP_SND_BUF. It is the amount of space which must be available in the + * TCP snd_buf for select to return writable. + */ +#ifndef TCP_SNDLOWAT +#define TCP_SNDLOWAT ((TCP_SND_BUF)/2) +#endif + +/** + * TCP_LISTEN_BACKLOG: Enable the backlog option for tcp listen pcb. + */ +#ifndef TCP_LISTEN_BACKLOG +#define TCP_LISTEN_BACKLOG 0 +#endif + +/** + * The maximum allowed backlog for TCP listen netconns. + * This backlog is used unless another is explicitly specified. + * 0xff is the maximum (u8_t). + */ +#ifndef TCP_DEFAULT_LISTEN_BACKLOG +#define TCP_DEFAULT_LISTEN_BACKLOG 0xff +#endif + +/** + * LWIP_TCP_TIMESTAMPS==1: support the TCP timestamp option. + */ +#ifndef LWIP_TCP_TIMESTAMPS +#define LWIP_TCP_TIMESTAMPS 0 +#endif + +/** + * TCP_WND_UPDATE_THRESHOLD: difference in window to trigger an + * explicit window update + */ +#ifndef TCP_WND_UPDATE_THRESHOLD +#define TCP_WND_UPDATE_THRESHOLD (TCP_WND / 4) +#endif + +/** + * LWIP_EVENT_API and LWIP_CALLBACK_API: Only one of these should be set to 1. + * LWIP_EVENT_API==1: The user defines lwip_tcp_event() to receive all + * events (accept, sent, etc) that happen in the system. + * LWIP_CALLBACK_API==1: The PCB callback function is called directly + * for the event. + */ +#ifndef LWIP_EVENT_API +#define LWIP_EVENT_API 0 +#define LWIP_CALLBACK_API 1 +#else +#define LWIP_EVENT_API 1 +#define LWIP_CALLBACK_API 0 +#endif + + +/* + ---------------------------------- + ---------- Pbuf options ---------- + ---------------------------------- +*/ +/** + * PBUF_LINK_HLEN: the number of bytes that should be allocated for a + * link level header. The default is 14, the standard value for + * Ethernet. + */ +#ifndef PBUF_LINK_HLEN +#define PBUF_LINK_HLEN 14 +#endif + +/** + * PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. The default is + * designed to accomodate single full size TCP frame in one pbuf, including + * TCP_MSS, IP header, and link header. + */ +#ifndef PBUF_POOL_BUFSIZE +#define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_HLEN) +#endif + +/* + ------------------------------------------------ + ---------- Network Interfaces options ---------- + ------------------------------------------------ +*/ +/** + * LWIP_NETIF_HOSTNAME==1: use DHCP_OPTION_HOSTNAME with netif's hostname + * field. + */ +#ifndef LWIP_NETIF_HOSTNAME +#define LWIP_NETIF_HOSTNAME 0 +#endif + +/** + * LWIP_NETIF_API==1: Support netif api (in netifapi.c) + */ +#ifndef LWIP_NETIF_API +#define LWIP_NETIF_API 0 +#endif + +/** + * LWIP_NETIF_STATUS_CALLBACK==1: Support a callback function whenever an interface + * changes its up/down status (i.e., due to DHCP IP acquistion) + */ +#ifndef LWIP_NETIF_STATUS_CALLBACK +#define LWIP_NETIF_STATUS_CALLBACK 0 +#endif + +/** + * LWIP_NETIF_LINK_CALLBACK==1: Support a callback function from an interface + * whenever the link changes (i.e., link down) + */ +#ifndef LWIP_NETIF_LINK_CALLBACK +#define LWIP_NETIF_LINK_CALLBACK 0 +#endif + +/** + * LWIP_NETIF_HWADDRHINT==1: Cache link-layer-address hints (e.g. table + * indices) in struct netif. TCP and UDP can make use of this to prevent + * scanning the ARP table for every sent packet. While this is faster for big + * ARP tables or many concurrent connections, it might be counterproductive + * if you have a tiny ARP table or if there never are concurrent connections. + */ +#ifndef LWIP_NETIF_HWADDRHINT +#define LWIP_NETIF_HWADDRHINT 0 +#endif + +/** + * LWIP_NETIF_LOOPBACK==1: Support sending packets with a destination IP + * address equal to the netif IP address, looping them back up the stack. + */ +#ifndef LWIP_NETIF_LOOPBACK +#define LWIP_NETIF_LOOPBACK 0 +#endif + +/** + * LWIP_LOOPBACK_MAX_PBUFS: Maximum number of pbufs on queue for loopback + * sending for each netif (0 = disabled) + */ +#ifndef LWIP_LOOPBACK_MAX_PBUFS +#define LWIP_LOOPBACK_MAX_PBUFS 0 +#endif + +/** + * LWIP_NETIF_LOOPBACK_MULTITHREADING: Indicates whether threading is enabled in + * the system, as netifs must change how they behave depending on this setting + * for the LWIP_NETIF_LOOPBACK option to work. + * Setting this is needed to avoid reentering non-reentrant functions like + * tcp_input(). + * LWIP_NETIF_LOOPBACK_MULTITHREADING==1: Indicates that the user is using a + * multithreaded environment like tcpip.c. In this case, netif->input() + * is called directly. + * LWIP_NETIF_LOOPBACK_MULTITHREADING==0: Indicates a polling (or NO_SYS) setup. + * The packets are put on a list and netif_poll() must be called in + * the main application loop. + */ +#ifndef LWIP_NETIF_LOOPBACK_MULTITHREADING +#define LWIP_NETIF_LOOPBACK_MULTITHREADING (!NO_SYS) +#endif + +/** + * LWIP_NETIF_TX_SINGLE_PBUF: if this is set to 1, lwIP tries to put all data + * to be sent into one single pbuf. This is for compatibility with DMA-enabled + * MACs that do not support scatter-gather. + * Beware that this might involve CPU-memcpy before transmitting that would not + * be needed without this flag! Use this only if you need to! + * + * @todo: TCP and IP-frag do not work with this, yet: + */ +#ifndef LWIP_NETIF_TX_SINGLE_PBUF +#define LWIP_NETIF_TX_SINGLE_PBUF 0 +#endif /* LWIP_NETIF_TX_SINGLE_PBUF */ + +/* + ------------------------------------ + ---------- LOOPIF options ---------- + ------------------------------------ +*/ +/** + * LWIP_HAVE_LOOPIF==1: Support loop interface (127.0.0.1) and loopif.c + */ +#ifndef LWIP_HAVE_LOOPIF +#define LWIP_HAVE_LOOPIF 0 +#endif + +/* + ------------------------------------ + ---------- SLIPIF options ---------- + ------------------------------------ +*/ +/** + * LWIP_HAVE_SLIPIF==1: Support slip interface and slipif.c + */ +#ifndef LWIP_HAVE_SLIPIF +#define LWIP_HAVE_SLIPIF 0 +#endif + +/* + ------------------------------------ + ---------- Thread options ---------- + ------------------------------------ +*/ +/** + * TCPIP_THREAD_NAME: The name assigned to the main tcpip thread. + */ +#ifndef TCPIP_THREAD_NAME +#define TCPIP_THREAD_NAME "tcpip_thread" +#endif + +/** + * TCPIP_THREAD_STACKSIZE: The stack size used by the main tcpip thread. + * The stack size value itself is platform-dependent, but is passed to + * sys_thread_new() when the thread is created. + */ +#ifndef TCPIP_THREAD_STACKSIZE +#define TCPIP_THREAD_STACKSIZE 0 +#endif + +/** + * TCPIP_THREAD_PRIO: The priority assigned to the main tcpip thread. + * The priority value itself is platform-dependent, but is passed to + * sys_thread_new() when the thread is created. + */ +#ifndef TCPIP_THREAD_PRIO +#define TCPIP_THREAD_PRIO 1 +#endif + +/** + * TCPIP_MBOX_SIZE: The mailbox size for the tcpip thread messages + * The queue size value itself is platform-dependent, but is passed to + * sys_mbox_new() when tcpip_init is called. + */ +#ifndef TCPIP_MBOX_SIZE +#define TCPIP_MBOX_SIZE 0 +#endif + +/** + * SLIPIF_THREAD_NAME: The name assigned to the slipif_loop thread. + */ +#ifndef SLIPIF_THREAD_NAME +#define SLIPIF_THREAD_NAME "slipif_loop" +#endif + +/** + * SLIP_THREAD_STACKSIZE: The stack size used by the slipif_loop thread. + * The stack size value itself is platform-dependent, but is passed to + * sys_thread_new() when the thread is created. + */ +#ifndef SLIPIF_THREAD_STACKSIZE +#define SLIPIF_THREAD_STACKSIZE 0 +#endif + +/** + * SLIPIF_THREAD_PRIO: The priority assigned to the slipif_loop thread. + * The priority value itself is platform-dependent, but is passed to + * sys_thread_new() when the thread is created. + */ +#ifndef SLIPIF_THREAD_PRIO +#define SLIPIF_THREAD_PRIO 1 +#endif + +/** + * PPP_THREAD_NAME: The name assigned to the pppMain thread. + */ +#ifndef PPP_THREAD_NAME +#define PPP_THREAD_NAME "pppMain" +#endif + +/** + * PPP_THREAD_STACKSIZE: The stack size used by the pppMain thread. + * The stack size value itself is platform-dependent, but is passed to + * sys_thread_new() when the thread is created. + */ +#ifndef PPP_THREAD_STACKSIZE +#define PPP_THREAD_STACKSIZE 0 +#endif + +/** + * PPP_THREAD_PRIO: The priority assigned to the pppMain thread. + * The priority value itself is platform-dependent, but is passed to + * sys_thread_new() when the thread is created. + */ +#ifndef PPP_THREAD_PRIO +#define PPP_THREAD_PRIO 1 +#endif + +/** + * DEFAULT_THREAD_NAME: The name assigned to any other lwIP thread. + */ +#ifndef DEFAULT_THREAD_NAME +#define DEFAULT_THREAD_NAME "lwIP" +#endif + +/** + * DEFAULT_THREAD_STACKSIZE: The stack size used by any other lwIP thread. + * The stack size value itself is platform-dependent, but is passed to + * sys_thread_new() when the thread is created. + */ +#ifndef DEFAULT_THREAD_STACKSIZE +#define DEFAULT_THREAD_STACKSIZE 0 +#endif + +/** + * DEFAULT_THREAD_PRIO: The priority assigned to any other lwIP thread. + * The priority value itself is platform-dependent, but is passed to + * sys_thread_new() when the thread is created. + */ +#ifndef DEFAULT_THREAD_PRIO +#define DEFAULT_THREAD_PRIO 1 +#endif + +/** + * DEFAULT_RAW_RECVMBOX_SIZE: The mailbox size for the incoming packets on a + * NETCONN_RAW. The queue size value itself is platform-dependent, but is passed + * to sys_mbox_new() when the recvmbox is created. + */ +#ifndef DEFAULT_RAW_RECVMBOX_SIZE +#define DEFAULT_RAW_RECVMBOX_SIZE 0 +#endif + +/** + * DEFAULT_UDP_RECVMBOX_SIZE: The mailbox size for the incoming packets on a + * NETCONN_UDP. The queue size value itself is platform-dependent, but is passed + * to sys_mbox_new() when the recvmbox is created. + */ +#ifndef DEFAULT_UDP_RECVMBOX_SIZE +#define DEFAULT_UDP_RECVMBOX_SIZE 0 +#endif + +/** + * DEFAULT_TCP_RECVMBOX_SIZE: The mailbox size for the incoming packets on a + * NETCONN_TCP. The queue size value itself is platform-dependent, but is passed + * to sys_mbox_new() when the recvmbox is created. + */ +#ifndef DEFAULT_TCP_RECVMBOX_SIZE +#define DEFAULT_TCP_RECVMBOX_SIZE 0 +#endif + +/** + * DEFAULT_ACCEPTMBOX_SIZE: The mailbox size for the incoming connections. + * The queue size value itself is platform-dependent, but is passed to + * sys_mbox_new() when the acceptmbox is created. + */ +#ifndef DEFAULT_ACCEPTMBOX_SIZE +#define DEFAULT_ACCEPTMBOX_SIZE 0 +#endif + +/* + ---------------------------------------------- + ---------- Sequential layer options ---------- + ---------------------------------------------- +*/ +/** + * LWIP_TCPIP_CORE_LOCKING: (EXPERIMENTAL!) + * Don't use it if you're not an active lwIP project member + */ +#ifndef LWIP_TCPIP_CORE_LOCKING +#define LWIP_TCPIP_CORE_LOCKING 0 +#endif + +/** + * LWIP_NETCONN==1: Enable Netconn API (require to use api_lib.c) + */ +#ifndef LWIP_NETCONN +#define LWIP_NETCONN 1 +#endif + +/* + ------------------------------------ + ---------- Socket options ---------- + ------------------------------------ +*/ +/** + * LWIP_SOCKET==1: Enable Socket API (require to use sockets.c) + */ +#ifndef LWIP_SOCKET +#define LWIP_SOCKET 1 +#endif + +/** + * LWIP_COMPAT_SOCKETS==1: Enable BSD-style sockets functions names. + * (only used if you use sockets.c) + */ +#ifndef LWIP_COMPAT_SOCKETS +#define LWIP_COMPAT_SOCKETS 1 +#endif + +/** + * LWIP_POSIX_SOCKETS_IO_NAMES==1: Enable POSIX-style sockets functions names. + * Disable this option if you use a POSIX operating system that uses the same + * names (read, write & close). (only used if you use sockets.c) + */ +#ifndef LWIP_POSIX_SOCKETS_IO_NAMES +#define LWIP_POSIX_SOCKETS_IO_NAMES 1 +#endif + +/** + * LWIP_TCP_KEEPALIVE==1: Enable TCP_KEEPIDLE, TCP_KEEPINTVL and TCP_KEEPCNT + * options processing. Note that TCP_KEEPIDLE and TCP_KEEPINTVL have to be set + * in seconds. (does not require sockets.c, and will affect tcp.c) + */ +#ifndef LWIP_TCP_KEEPALIVE +#define LWIP_TCP_KEEPALIVE 1 +#endif + +/** + * LWIP_SO_RCVTIMEO==1: Enable SO_RCVTIMEO processing. + */ +#ifndef LWIP_SO_RCVTIMEO +#define LWIP_SO_RCVTIMEO 0 +#endif + +/** + * LWIP_SO_RCVBUF==1: Enable SO_RCVBUF processing. + */ +#ifndef LWIP_SO_RCVBUF +#define LWIP_SO_RCVBUF 0 +#endif + +/** + * If LWIP_SO_RCVBUF is used, this is the default value for recv_bufsize. + */ +#ifndef RECV_BUFSIZE_DEFAULT +#define RECV_BUFSIZE_DEFAULT INT_MAX +#endif + +/** + * SO_REUSE==1: Enable SO_REUSEADDR and SO_REUSEPORT options. DO NOT USE! + */ +#ifndef SO_REUSE +#define SO_REUSE 0 +#endif + +/* + ---------------------------------------- + ---------- Statistics options ---------- + ---------------------------------------- +*/ +/** + * LWIP_STATS==1: Enable statistics collection in lwip_stats. + */ +#ifndef LWIP_STATS +#define LWIP_STATS 1 +#endif + +#if LWIP_STATS + +/** + * LWIP_STATS_DISPLAY==1: Compile in the statistics output functions. + */ +#ifndef LWIP_STATS_DISPLAY +#define LWIP_STATS_DISPLAY 0 +#endif + +/** + * LINK_STATS==1: Enable link stats. + */ +#ifndef LINK_STATS +#define LINK_STATS 1 +#endif + +/** + * ETHARP_STATS==1: Enable etharp stats. + */ +#ifndef ETHARP_STATS +#define ETHARP_STATS (LWIP_ARP) +#endif + +/** + * IP_STATS==1: Enable IP stats. + */ +#ifndef IP_STATS +#define IP_STATS 1 +#endif + +/** + * IPFRAG_STATS==1: Enable IP fragmentation stats. Default is + * on if using either frag or reass. + */ +#ifndef IPFRAG_STATS +#define IPFRAG_STATS (IP_REASSEMBLY || IP_FRAG) +#endif + +/** + * ICMP_STATS==1: Enable ICMP stats. + */ +#ifndef ICMP_STATS +#define ICMP_STATS 1 +#endif + +/** + * IGMP_STATS==1: Enable IGMP stats. + */ +#ifndef IGMP_STATS +#define IGMP_STATS (LWIP_IGMP) +#endif + +/** + * UDP_STATS==1: Enable UDP stats. Default is on if + * UDP enabled, otherwise off. + */ +#ifndef UDP_STATS +#define UDP_STATS (LWIP_UDP) +#endif + +/** + * TCP_STATS==1: Enable TCP stats. Default is on if TCP + * enabled, otherwise off. + */ +#ifndef TCP_STATS +#define TCP_STATS (LWIP_TCP) +#endif + +/** + * MEM_STATS==1: Enable mem.c stats. + */ +#ifndef MEM_STATS +#define MEM_STATS ((MEM_LIBC_MALLOC == 0) && (MEM_USE_POOLS == 0)) +#endif + +/** + * MEMP_STATS==1: Enable memp.c pool stats. + */ +#ifndef MEMP_STATS +#define MEMP_STATS (MEMP_MEM_MALLOC == 0) +#endif + +/** + * SYS_STATS==1: Enable system stats (sem and mbox counts, etc). + */ +#ifndef SYS_STATS +#define SYS_STATS (NO_SYS == 0) +#endif + +#else + +#define LINK_STATS 0 +#define IP_STATS 0 +#define IPFRAG_STATS 0 +#define ICMP_STATS 0 +#define IGMP_STATS 0 +#define UDP_STATS 0 +#define TCP_STATS 0 +#define MEM_STATS 0 +#define MEMP_STATS 0 +#define SYS_STATS 0 +#define LWIP_STATS_DISPLAY 0 + +#endif /* LWIP_STATS */ + +/* + --------------------------------- + ---------- PPP options ---------- + --------------------------------- +*/ +/** + * PPP_SUPPORT==1: Enable PPP. + */ +#ifndef PPP_SUPPORT +#define PPP_SUPPORT 0 +#endif + +/** + * PPPOE_SUPPORT==1: Enable PPP Over Ethernet + */ +#ifndef PPPOE_SUPPORT +#define PPPOE_SUPPORT 0 +#endif + +/** + * PPPOS_SUPPORT==1: Enable PPP Over Serial + */ +#ifndef PPPOS_SUPPORT +#define PPPOS_SUPPORT PPP_SUPPORT +#endif + +#if PPP_SUPPORT + +/** + * NUM_PPP: Max PPP sessions. + */ +#ifndef NUM_PPP +#define NUM_PPP 1 +#endif + +/** + * PAP_SUPPORT==1: Support PAP. + */ +#ifndef PAP_SUPPORT +#define PAP_SUPPORT 0 +#endif + +/** + * CHAP_SUPPORT==1: Support CHAP. + */ +#ifndef CHAP_SUPPORT +#define CHAP_SUPPORT 0 +#endif + +/** + * MSCHAP_SUPPORT==1: Support MSCHAP. CURRENTLY NOT SUPPORTED! DO NOT SET! + */ +#ifndef MSCHAP_SUPPORT +#define MSCHAP_SUPPORT 0 +#endif + +/** + * CBCP_SUPPORT==1: Support CBCP. CURRENTLY NOT SUPPORTED! DO NOT SET! + */ +#ifndef CBCP_SUPPORT +#define CBCP_SUPPORT 0 +#endif + +/** + * CCP_SUPPORT==1: Support CCP. CURRENTLY NOT SUPPORTED! DO NOT SET! + */ +#ifndef CCP_SUPPORT +#define CCP_SUPPORT 0 +#endif + +/** + * VJ_SUPPORT==1: Support VJ header compression. + */ +#ifndef VJ_SUPPORT +#define VJ_SUPPORT 0 +#endif + +/** + * MD5_SUPPORT==1: Support MD5 (see also CHAP). + */ +#ifndef MD5_SUPPORT +#define MD5_SUPPORT 0 +#endif + +/* + * Timeouts + */ +#ifndef FSM_DEFTIMEOUT +#define FSM_DEFTIMEOUT 6 /* Timeout time in seconds */ +#endif + +#ifndef FSM_DEFMAXTERMREQS +#define FSM_DEFMAXTERMREQS 2 /* Maximum Terminate-Request transmissions */ +#endif + +#ifndef FSM_DEFMAXCONFREQS +#define FSM_DEFMAXCONFREQS 10 /* Maximum Configure-Request transmissions */ +#endif + +#ifndef FSM_DEFMAXNAKLOOPS +#define FSM_DEFMAXNAKLOOPS 5 /* Maximum number of nak loops */ +#endif + +#ifndef UPAP_DEFTIMEOUT +#define UPAP_DEFTIMEOUT 6 /* Timeout (seconds) for retransmitting req */ +#endif + +#ifndef UPAP_DEFREQTIME +#define UPAP_DEFREQTIME 30 /* Time to wait for auth-req from peer */ +#endif + +#ifndef CHAP_DEFTIMEOUT +#define CHAP_DEFTIMEOUT 6 /* Timeout time in seconds */ +#endif + +#ifndef CHAP_DEFTRANSMITS +#define CHAP_DEFTRANSMITS 10 /* max # times to send challenge */ +#endif + +/* Interval in seconds between keepalive echo requests, 0 to disable. */ +#ifndef LCP_ECHOINTERVAL +#define LCP_ECHOINTERVAL 0 +#endif + +/* Number of unanswered echo requests before failure. */ +#ifndef LCP_MAXECHOFAILS +#define LCP_MAXECHOFAILS 3 +#endif + +/* Max Xmit idle time (in jiffies) before resend flag char. */ +#ifndef PPP_MAXIDLEFLAG +#define PPP_MAXIDLEFLAG 100 +#endif + +/* + * Packet sizes + * + * Note - lcp shouldn't be allowed to negotiate stuff outside these + * limits. See lcp.h in the pppd directory. + * (XXX - these constants should simply be shared by lcp.c instead + * of living in lcp.h) + */ +#define PPP_MTU 1500 /* Default MTU (size of Info field) */ +#ifndef PPP_MAXMTU +/* #define PPP_MAXMTU 65535 - (PPP_HDRLEN + PPP_FCSLEN) */ +#define PPP_MAXMTU 1500 /* Largest MTU we allow */ +#endif +#define PPP_MINMTU 64 +#define PPP_MRU 1500 /* default MRU = max length of info field */ +#define PPP_MAXMRU 1500 /* Largest MRU we allow */ +#ifndef PPP_DEFMRU +#define PPP_DEFMRU 296 /* Try for this */ +#endif +#define PPP_MINMRU 128 /* No MRUs below this */ + +#ifndef MAXNAMELEN +#define MAXNAMELEN 256 /* max length of hostname or name for auth */ +#endif +#ifndef MAXSECRETLEN +#define MAXSECRETLEN 256 /* max length of password or secret */ +#endif + +#endif /* PPP_SUPPORT */ + +/* + -------------------------------------- + ---------- Checksum options ---------- + -------------------------------------- +*/ +/** + * CHECKSUM_GEN_IP==1: Generate checksums in software for outgoing IP packets. + */ +#ifndef CHECKSUM_GEN_IP +#define CHECKSUM_GEN_IP 1 +#endif + +/** + * CHECKSUM_GEN_UDP==1: Generate checksums in software for outgoing UDP packets. + */ +#ifndef CHECKSUM_GEN_UDP +#define CHECKSUM_GEN_UDP 1 +#endif + +/** + * CHECKSUM_GEN_TCP==1: Generate checksums in software for outgoing TCP packets. + */ +#ifndef CHECKSUM_GEN_TCP +#define CHECKSUM_GEN_TCP 1 +#endif + +/** + * CHECKSUM_CHECK_IP==1: Check checksums in software for incoming IP packets. + */ +#ifndef CHECKSUM_CHECK_IP +#define CHECKSUM_CHECK_IP 1 +#endif + +/** + * CHECKSUM_CHECK_UDP==1: Check checksums in software for incoming UDP packets. + */ +#ifndef CHECKSUM_CHECK_UDP +#define CHECKSUM_CHECK_UDP 1 +#endif + +/** + * CHECKSUM_CHECK_TCP==1: Check checksums in software for incoming TCP packets. + */ +#ifndef CHECKSUM_CHECK_TCP +#define CHECKSUM_CHECK_TCP 1 +#endif + +/* + --------------------------------------- + ---------- Debugging options ---------- + --------------------------------------- +*/ +/** + * LWIP_DBG_MIN_LEVEL: After masking, the value of the debug is + * compared against this value. If it is smaller, then debugging + * messages are written. + */ +#ifndef LWIP_DBG_MIN_LEVEL +#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_ALL +#endif + +/** + * LWIP_DBG_TYPES_ON: A mask that can be used to globally enable/disable + * debug messages of certain types. + */ +#ifndef LWIP_DBG_TYPES_ON +#define LWIP_DBG_TYPES_ON LWIP_DBG_ON +#endif + +/** + * ETHARP_DEBUG: Enable debugging in etharp.c. + */ +#ifndef ETHARP_DEBUG +#define ETHARP_DEBUG LWIP_DBG_OFF +#endif + +/** + * NETIF_DEBUG: Enable debugging in netif.c. + */ +#ifndef NETIF_DEBUG +#define NETIF_DEBUG LWIP_DBG_OFF +#endif + +/** + * PBUF_DEBUG: Enable debugging in pbuf.c. + */ +#ifndef PBUF_DEBUG +#define PBUF_DEBUG LWIP_DBG_OFF +#endif + +/** + * API_LIB_DEBUG: Enable debugging in api_lib.c. + */ +#ifndef API_LIB_DEBUG +#define API_LIB_DEBUG LWIP_DBG_OFF +#endif + +/** + * API_MSG_DEBUG: Enable debugging in api_msg.c. + */ +#ifndef API_MSG_DEBUG +#define API_MSG_DEBUG LWIP_DBG_OFF +#endif + +/** + * SOCKETS_DEBUG: Enable debugging in sockets.c. + */ +#ifndef SOCKETS_DEBUG +#define SOCKETS_DEBUG LWIP_DBG_OFF +#endif + +/** + * ICMP_DEBUG: Enable debugging in icmp.c. + */ +#ifndef ICMP_DEBUG +#define ICMP_DEBUG LWIP_DBG_OFF +#endif + +/** + * IGMP_DEBUG: Enable debugging in igmp.c. + */ +#ifndef IGMP_DEBUG +#define IGMP_DEBUG LWIP_DBG_OFF +#endif + +/** + * INET_DEBUG: Enable debugging in inet.c. + */ +#ifndef INET_DEBUG +#define INET_DEBUG LWIP_DBG_OFF +#endif + +/** + * IP_DEBUG: Enable debugging for IP. + */ +#ifndef IP_DEBUG +#define IP_DEBUG LWIP_DBG_OFF +#endif + +/** + * IP_REASS_DEBUG: Enable debugging in ip_frag.c for both frag & reass. + */ +#ifndef IP_REASS_DEBUG +#define IP_REASS_DEBUG LWIP_DBG_OFF +#endif + +/** + * RAW_DEBUG: Enable debugging in raw.c. + */ +#ifndef RAW_DEBUG +#define RAW_DEBUG LWIP_DBG_OFF +#endif + +/** + * MEM_DEBUG: Enable debugging in mem.c. + */ +#ifndef MEM_DEBUG +#define MEM_DEBUG LWIP_DBG_OFF +#endif + +/** + * MEMP_DEBUG: Enable debugging in memp.c. + */ +#ifndef MEMP_DEBUG +#define MEMP_DEBUG LWIP_DBG_OFF +#endif + +/** + * SYS_DEBUG: Enable debugging in sys.c. + */ +#ifndef SYS_DEBUG +#define SYS_DEBUG LWIP_DBG_OFF +#endif + +/** + * TCP_DEBUG: Enable debugging for TCP. + */ +#ifndef TCP_DEBUG +#define TCP_DEBUG LWIP_DBG_OFF +#endif + +/** + * TCP_INPUT_DEBUG: Enable debugging in tcp_in.c for incoming debug. + */ +#ifndef TCP_INPUT_DEBUG +#define TCP_INPUT_DEBUG LWIP_DBG_ON +#endif + +/** + * TCP_FR_DEBUG: Enable debugging in tcp_in.c for fast retransmit. + */ +#ifndef TCP_FR_DEBUG +#define TCP_FR_DEBUG LWIP_DBG_OFF +#endif + +/** + * TCP_RTO_DEBUG: Enable debugging in TCP for retransmit + * timeout. + */ +#ifndef TCP_RTO_DEBUG +#define TCP_RTO_DEBUG LWIP_DBG_OFF +#endif + +/** + * TCP_CWND_DEBUG: Enable debugging for TCP congestion window. + */ +#ifndef TCP_CWND_DEBUG +#define TCP_CWND_DEBUG LWIP_DBG_OFF +#endif + +/** + * TCP_WND_DEBUG: Enable debugging in tcp_in.c for window updating. + */ +#ifndef TCP_WND_DEBUG +#define TCP_WND_DEBUG LWIP_DBG_OFF +#endif + +/** + * TCP_OUTPUT_DEBUG: Enable debugging in tcp_out.c output functions. + */ +#ifndef TCP_OUTPUT_DEBUG +#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF +#endif + +/** + * TCP_RST_DEBUG: Enable debugging for TCP with the RST message. + */ +#ifndef TCP_RST_DEBUG +#define TCP_RST_DEBUG LWIP_DBG_OFF +#endif + +/** + * TCP_QLEN_DEBUG: Enable debugging for TCP queue lengths. + */ +#ifndef TCP_QLEN_DEBUG +#define TCP_QLEN_DEBUG LWIP_DBG_OFF +#endif + +/** + * UDP_DEBUG: Enable debugging in UDP. + */ +#ifndef UDP_DEBUG +#define UDP_DEBUG LWIP_DBG_OFF +#endif + +/** + * TCPIP_DEBUG: Enable debugging in tcpip.c. + */ +#ifndef TCPIP_DEBUG +#define TCPIP_DEBUG LWIP_DBG_OFF +#endif + +/** + * PPP_DEBUG: Enable debugging for PPP. + */ +#ifndef PPP_DEBUG +#define PPP_DEBUG LWIP_DBG_OFF +#endif + +/** + * SLIP_DEBUG: Enable debugging in slipif.c. + */ +#ifndef SLIP_DEBUG +#define SLIP_DEBUG LWIP_DBG_OFF +#endif + +/** + * DHCP_DEBUG: Enable debugging in dhcp.c. + */ +#ifndef DHCP_DEBUG +#define DHCP_DEBUG LWIP_DBG_OFF +#endif + +/** + * AUTOIP_DEBUG: Enable debugging in autoip.c. + */ +#ifndef AUTOIP_DEBUG +#define AUTOIP_DEBUG LWIP_DBG_OFF +#endif + +/** + * SNMP_MSG_DEBUG: Enable debugging for SNMP messages. + */ +#ifndef SNMP_MSG_DEBUG +#define SNMP_MSG_DEBUG LWIP_DBG_OFF +#endif + +/** + * SNMP_MIB_DEBUG: Enable debugging for SNMP MIBs. + */ +#ifndef SNMP_MIB_DEBUG +#define SNMP_MIB_DEBUG LWIP_DBG_OFF +#endif + +/** + * DNS_DEBUG: Enable debugging for DNS. + */ +#ifndef DNS_DEBUG +#define DNS_DEBUG LWIP_DBG_OFF +#endif + +#endif /* __LWIP_OPT_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/pbuf.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/pbuf.h new file mode 100644 index 0000000..8ca61b1 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/pbuf.h @@ -0,0 +1,122 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#ifndef __LWIP_PBUF_H__ +#define __LWIP_PBUF_H__ + +#include "lwip/opt.h" +#include "lwip/err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define PBUF_TRANSPORT_HLEN 20 +#define PBUF_IP_HLEN 20 + +typedef enum { + PBUF_TRANSPORT, + PBUF_IP, + PBUF_LINK, + PBUF_RAW +} pbuf_layer; + +typedef enum { + PBUF_RAM, /* pbuf data is stored in RAM */ + PBUF_ROM, /* pbuf data is stored in ROM */ + PBUF_REF, /* pbuf comes from the pbuf pool */ + PBUF_POOL /* pbuf payload refers to RAM */ +} pbuf_type; + + +/** indicates this packet's data should be immediately passed to the application */ +#define PBUF_FLAG_PUSH 0x01U + +struct pbuf { + /** next pbuf in singly linked pbuf chain */ + struct pbuf *next; + + /** pointer to the actual data in the buffer */ + void *payload; + + /** + * total length of this buffer and all next buffers in chain + * belonging to the same packet. + * + * For non-queue packet chains this is the invariant: + * p->tot_len == p->len + (p->next? p->next->tot_len: 0) + */ + u16_t tot_len; + + /** length of this buffer */ + u16_t len; + + /** pbuf_type as u8_t instead of enum to save space */ + u8_t /*pbuf_type*/ type; + + /** misc flags */ + u8_t flags; + + /** + * the reference count always equals the number of pointers + * that refer to this pbuf. This can be pointers from an application, + * the stack itself, or pbuf->next pointers from a chain. + */ + u16_t ref; + +}; + +/* Initializes the pbuf module. This call is empty for now, but may not be in future. */ +#define pbuf_init() + +struct pbuf *pbuf_alloc(pbuf_layer l, u16_t size, pbuf_type type); +void pbuf_realloc(struct pbuf *p, u16_t size); +u8_t pbuf_header(struct pbuf *p, s16_t header_size); +void pbuf_ref(struct pbuf *p); +void pbuf_ref_chain(struct pbuf *p); +u8_t pbuf_free(struct pbuf *p); +u8_t pbuf_clen(struct pbuf *p); +void pbuf_cat(struct pbuf *head, struct pbuf *tail); +void pbuf_chain(struct pbuf *head, struct pbuf *tail); +struct pbuf *pbuf_dechain(struct pbuf *p); +err_t pbuf_copy(struct pbuf *p_to, struct pbuf *p_from); +u16_t pbuf_copy_partial(struct pbuf *p, void *dataptr, u16_t len, u16_t offset); +err_t pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len); +struct pbuf *pbuf_coalesce(struct pbuf *p, pbuf_layer layer); + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_PBUF_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/raw.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/raw.h new file mode 100644 index 0000000..545c433 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/raw.h @@ -0,0 +1,99 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_RAW_H__ +#define __LWIP_RAW_H__ + +#include "lwip/opt.h" + +#if LWIP_RAW /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/pbuf.h" +#include "lwip/inet.h" +#include "lwip/ip.h" +#include "lwip/ip_addr.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct raw_pcb { +/* Common members of all PCB types */ + IP_PCB; + + struct raw_pcb *next; + + u8_t protocol; + + /* receive callback function + * @param arg user supplied argument (raw_pcb.recv_arg) + * @param pcb the raw_pcb which received data + * @param p the packet buffer that was received + * @param addr the remote IP address from which the packet was received + * @return 1 if the packet was 'eaten' (aka. deleted), + * 0 if the packet lives on + * If returning 1, the callback is responsible for freeing the pbuf + * if it's not used any more. + */ + u8_t (* recv)(void *arg, struct raw_pcb *pcb, struct pbuf *p, + struct ip_addr *addr); + /* user-supplied argument for the recv callback */ + void *recv_arg; +}; + +/* The following functions is the application layer interface to the + RAW code. */ +struct raw_pcb * raw_new (u8_t proto); +void raw_remove (struct raw_pcb *pcb); +err_t raw_bind (struct raw_pcb *pcb, struct ip_addr *ipaddr); +err_t raw_connect (struct raw_pcb *pcb, struct ip_addr *ipaddr); + +void raw_recv (struct raw_pcb *pcb, + u8_t (* recv)(void *arg, struct raw_pcb *pcb, + struct pbuf *p, + struct ip_addr *addr), + void *recv_arg); +err_t raw_sendto (struct raw_pcb *pcb, struct pbuf *p, struct ip_addr *ipaddr); +err_t raw_send (struct raw_pcb *pcb, struct pbuf *p); + +/* The following functions are the lower layer interface to RAW. */ +u8_t raw_input (struct pbuf *p, struct netif *inp); +#define raw_init() /* Compatibility define, not init needed. */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_RAW */ + +#endif /* __LWIP_RAW_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/sio.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/sio.h new file mode 100644 index 0000000..10eabcf --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/sio.h @@ -0,0 +1,143 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + */ + +/* + * This is the interface to the platform specific serial IO module + * It needs to be implemented by those platforms which need SLIP or PPP + */ + +#ifndef __SIO_H__ +#define __SIO_H__ + +#include "lwip/arch.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* If you want to define sio_fd_t elsewhere or differently, + define this in your cc.h file. */ +#ifndef __sio_fd_t_defined +typedef void * sio_fd_t; +#endif + +/* The following functions can be defined to something else in your cc.h file + or be implemented in your custom sio.c file. */ + +#ifndef sio_open +/** + * Opens a serial device for communication. + * + * @param devnum device number + * @return handle to serial device if successful, NULL otherwise + */ +sio_fd_t sio_open(u8_t devnum); +#endif + +#ifndef sio_send +/** + * Sends a single character to the serial device. + * + * @param c character to send + * @param fd serial device handle + * + * @note This function will block until the character can be sent. + */ +void sio_send(u8_t c, sio_fd_t fd); +#endif + +#ifndef sio_recv +/** + * Receives a single character from the serial device. + * + * @param fd serial device handle + * + * @note This function will block until a character is received. + */ +u8_t sio_recv(sio_fd_t fd); +#endif + +#ifndef sio_read +/** + * Reads from the serial device. + * + * @param fd serial device handle + * @param data pointer to data buffer for receiving + * @param len maximum length (in bytes) of data to receive + * @return number of bytes actually received - may be 0 if aborted by sio_read_abort + * + * @note This function will block until data can be received. The blocking + * can be cancelled by calling sio_read_abort(). + */ +u32_t sio_read(sio_fd_t fd, u8_t *data, u32_t len); +#endif + +#ifndef sio_tryread +/** + * Tries to read from the serial device. Same as sio_read but returns + * immediately if no data is available and never blocks. + * + * @param fd serial device handle + * @param data pointer to data buffer for receiving + * @param len maximum length (in bytes) of data to receive + * @return number of bytes actually received + */ +u32_t sio_tryread(sio_fd_t fd, u8_t *data, u32_t len); +#endif + +#ifndef sio_write +/** + * Writes to the serial device. + * + * @param fd serial device handle + * @param data pointer to data to send + * @param len length (in bytes) of data to send + * @return number of bytes actually sent + * + * @note This function will block until all data can be sent. + */ +u32_t sio_write(sio_fd_t fd, u8_t *data, u32_t len); +#endif + +#ifndef sio_read_abort +/** + * Aborts a blocking sio_read() call. + * + * @param fd serial device handle + */ +void sio_read_abort(sio_fd_t fd); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __SIO_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/snmp.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/snmp.h new file mode 100644 index 0000000..b87717f --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/snmp.h @@ -0,0 +1,366 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Copyright (c) 2001, 2002 Leon Woestenberg + * Copyright (c) 2001, 2002 Axon Digital Design B.V., The Netherlands. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Leon Woestenberg + * + */ +#ifndef __LWIP_SNMP_H__ +#define __LWIP_SNMP_H__ + +#include "lwip/opt.h" +#include "lwip/netif.h" +#include "lwip/udp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @see RFC1213, "MIB-II, 6. Definitions" + */ +enum snmp_ifType { + snmp_ifType_other=1, /* none of the following */ + snmp_ifType_regular1822, + snmp_ifType_hdh1822, + snmp_ifType_ddn_x25, + snmp_ifType_rfc877_x25, + snmp_ifType_ethernet_csmacd, + snmp_ifType_iso88023_csmacd, + snmp_ifType_iso88024_tokenBus, + snmp_ifType_iso88025_tokenRing, + snmp_ifType_iso88026_man, + snmp_ifType_starLan, + snmp_ifType_proteon_10Mbit, + snmp_ifType_proteon_80Mbit, + snmp_ifType_hyperchannel, + snmp_ifType_fddi, + snmp_ifType_lapb, + snmp_ifType_sdlc, + snmp_ifType_ds1, /* T-1 */ + snmp_ifType_e1, /* european equiv. of T-1 */ + snmp_ifType_basicISDN, + snmp_ifType_primaryISDN, /* proprietary serial */ + snmp_ifType_propPointToPointSerial, + snmp_ifType_ppp, + snmp_ifType_softwareLoopback, + snmp_ifType_eon, /* CLNP over IP [11] */ + snmp_ifType_ethernet_3Mbit, + snmp_ifType_nsip, /* XNS over IP */ + snmp_ifType_slip, /* generic SLIP */ + snmp_ifType_ultra, /* ULTRA technologies */ + snmp_ifType_ds3, /* T-3 */ + snmp_ifType_sip, /* SMDS */ + snmp_ifType_frame_relay +}; + +#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */ + +/** SNMP "sysuptime" Interval */ +#define SNMP_SYSUPTIME_INTERVAL 10 + +/** fixed maximum length for object identifier type */ +#define LWIP_SNMP_OBJ_ID_LEN 32 + +/** internal object identifier representation */ +struct snmp_obj_id +{ + u8_t len; + s32_t id[LWIP_SNMP_OBJ_ID_LEN]; +}; + +/* system */ +void snmp_set_sysdesr(u8_t* str, u8_t* len); +void snmp_set_sysobjid(struct snmp_obj_id *oid); +void snmp_get_sysobjid_ptr(struct snmp_obj_id **oid); +void snmp_inc_sysuptime(void); +void snmp_add_sysuptime(u32_t value); +void snmp_get_sysuptime(u32_t *value); +void snmp_set_syscontact(u8_t *ocstr, u8_t *ocstrlen); +void snmp_set_sysname(u8_t *ocstr, u8_t *ocstrlen); +void snmp_set_syslocation(u8_t *ocstr, u8_t *ocstrlen); + +/* network interface */ +void snmp_add_ifinoctets(struct netif *ni, u32_t value); +void snmp_inc_ifinucastpkts(struct netif *ni); +void snmp_inc_ifinnucastpkts(struct netif *ni); +void snmp_inc_ifindiscards(struct netif *ni); +void snmp_add_ifoutoctets(struct netif *ni, u32_t value); +void snmp_inc_ifoutucastpkts(struct netif *ni); +void snmp_inc_ifoutnucastpkts(struct netif *ni); +void snmp_inc_ifoutdiscards(struct netif *ni); +void snmp_inc_iflist(void); +void snmp_dec_iflist(void); + +/* ARP (for atTable and ipNetToMediaTable) */ +void snmp_insert_arpidx_tree(struct netif *ni, struct ip_addr *ip); +void snmp_delete_arpidx_tree(struct netif *ni, struct ip_addr *ip); + +/* IP */ +void snmp_inc_ipinreceives(void); +void snmp_inc_ipinhdrerrors(void); +void snmp_inc_ipinaddrerrors(void); +void snmp_inc_ipforwdatagrams(void); +void snmp_inc_ipinunknownprotos(void); +void snmp_inc_ipindiscards(void); +void snmp_inc_ipindelivers(void); +void snmp_inc_ipoutrequests(void); +void snmp_inc_ipoutdiscards(void); +void snmp_inc_ipoutnoroutes(void); +void snmp_inc_ipreasmreqds(void); +void snmp_inc_ipreasmoks(void); +void snmp_inc_ipreasmfails(void); +void snmp_inc_ipfragoks(void); +void snmp_inc_ipfragfails(void); +void snmp_inc_ipfragcreates(void); +void snmp_inc_iproutingdiscards(void); +void snmp_insert_ipaddridx_tree(struct netif *ni); +void snmp_delete_ipaddridx_tree(struct netif *ni); +void snmp_insert_iprteidx_tree(u8_t dflt, struct netif *ni); +void snmp_delete_iprteidx_tree(u8_t dflt, struct netif *ni); + +/* ICMP */ +void snmp_inc_icmpinmsgs(void); +void snmp_inc_icmpinerrors(void); +void snmp_inc_icmpindestunreachs(void); +void snmp_inc_icmpintimeexcds(void); +void snmp_inc_icmpinparmprobs(void); +void snmp_inc_icmpinsrcquenchs(void); +void snmp_inc_icmpinredirects(void); +void snmp_inc_icmpinechos(void); +void snmp_inc_icmpinechoreps(void); +void snmp_inc_icmpintimestamps(void); +void snmp_inc_icmpintimestampreps(void); +void snmp_inc_icmpinaddrmasks(void); +void snmp_inc_icmpinaddrmaskreps(void); +void snmp_inc_icmpoutmsgs(void); +void snmp_inc_icmpouterrors(void); +void snmp_inc_icmpoutdestunreachs(void); +void snmp_inc_icmpouttimeexcds(void); +void snmp_inc_icmpoutparmprobs(void); +void snmp_inc_icmpoutsrcquenchs(void); +void snmp_inc_icmpoutredirects(void); +void snmp_inc_icmpoutechos(void); +void snmp_inc_icmpoutechoreps(void); +void snmp_inc_icmpouttimestamps(void); +void snmp_inc_icmpouttimestampreps(void); +void snmp_inc_icmpoutaddrmasks(void); +void snmp_inc_icmpoutaddrmaskreps(void); + +/* TCP */ +void snmp_inc_tcpactiveopens(void); +void snmp_inc_tcppassiveopens(void); +void snmp_inc_tcpattemptfails(void); +void snmp_inc_tcpestabresets(void); +void snmp_inc_tcpinsegs(void); +void snmp_inc_tcpoutsegs(void); +void snmp_inc_tcpretranssegs(void); +void snmp_inc_tcpinerrs(void); +void snmp_inc_tcpoutrsts(void); + +/* UDP */ +void snmp_inc_udpindatagrams(void); +void snmp_inc_udpnoports(void); +void snmp_inc_udpinerrors(void); +void snmp_inc_udpoutdatagrams(void); +void snmp_insert_udpidx_tree(struct udp_pcb *pcb); +void snmp_delete_udpidx_tree(struct udp_pcb *pcb); + +/* SNMP */ +void snmp_inc_snmpinpkts(void); +void snmp_inc_snmpoutpkts(void); +void snmp_inc_snmpinbadversions(void); +void snmp_inc_snmpinbadcommunitynames(void); +void snmp_inc_snmpinbadcommunityuses(void); +void snmp_inc_snmpinasnparseerrs(void); +void snmp_inc_snmpintoobigs(void); +void snmp_inc_snmpinnosuchnames(void); +void snmp_inc_snmpinbadvalues(void); +void snmp_inc_snmpinreadonlys(void); +void snmp_inc_snmpingenerrs(void); +void snmp_add_snmpintotalreqvars(u8_t value); +void snmp_add_snmpintotalsetvars(u8_t value); +void snmp_inc_snmpingetrequests(void); +void snmp_inc_snmpingetnexts(void); +void snmp_inc_snmpinsetrequests(void); +void snmp_inc_snmpingetresponses(void); +void snmp_inc_snmpintraps(void); +void snmp_inc_snmpouttoobigs(void); +void snmp_inc_snmpoutnosuchnames(void); +void snmp_inc_snmpoutbadvalues(void); +void snmp_inc_snmpoutgenerrs(void); +void snmp_inc_snmpoutgetrequests(void); +void snmp_inc_snmpoutgetnexts(void); +void snmp_inc_snmpoutsetrequests(void); +void snmp_inc_snmpoutgetresponses(void); +void snmp_inc_snmpouttraps(void); +void snmp_get_snmpgrpid_ptr(struct snmp_obj_id **oid); +void snmp_set_snmpenableauthentraps(u8_t *value); +void snmp_get_snmpenableauthentraps(u8_t *value); + +/* LWIP_SNMP support not available */ +/* define everything to be empty */ +#else + +/* system */ +#define snmp_set_sysdesr(str, len) +#define snmp_set_sysobjid(oid); +#define snmp_get_sysobjid_ptr(oid) +#define snmp_inc_sysuptime() +#define snmp_add_sysuptime(value) +#define snmp_get_sysuptime(value) +#define snmp_set_syscontact(ocstr, ocstrlen); +#define snmp_set_sysname(ocstr, ocstrlen); +#define snmp_set_syslocation(ocstr, ocstrlen); + +/* network interface */ +#define snmp_add_ifinoctets(ni,value) +#define snmp_inc_ifinucastpkts(ni) +#define snmp_inc_ifinnucastpkts(ni) +#define snmp_inc_ifindiscards(ni) +#define snmp_add_ifoutoctets(ni,value) +#define snmp_inc_ifoutucastpkts(ni) +#define snmp_inc_ifoutnucastpkts(ni) +#define snmp_inc_ifoutdiscards(ni) +#define snmp_inc_iflist() +#define snmp_dec_iflist() + +/* ARP */ +#define snmp_insert_arpidx_tree(ni,ip) +#define snmp_delete_arpidx_tree(ni,ip) + +/* IP */ +#define snmp_inc_ipinreceives() +#define snmp_inc_ipinhdrerrors() +#define snmp_inc_ipinaddrerrors() +#define snmp_inc_ipforwdatagrams() +#define snmp_inc_ipinunknownprotos() +#define snmp_inc_ipindiscards() +#define snmp_inc_ipindelivers() +#define snmp_inc_ipoutrequests() +#define snmp_inc_ipoutdiscards() +#define snmp_inc_ipoutnoroutes() +#define snmp_inc_ipreasmreqds() +#define snmp_inc_ipreasmoks() +#define snmp_inc_ipreasmfails() +#define snmp_inc_ipfragoks() +#define snmp_inc_ipfragfails() +#define snmp_inc_ipfragcreates() +#define snmp_inc_iproutingdiscards() +#define snmp_insert_ipaddridx_tree(ni) +#define snmp_delete_ipaddridx_tree(ni) +#define snmp_insert_iprteidx_tree(dflt, ni) +#define snmp_delete_iprteidx_tree(dflt, ni) + +/* ICMP */ +#define snmp_inc_icmpinmsgs() +#define snmp_inc_icmpinerrors() +#define snmp_inc_icmpindestunreachs() +#define snmp_inc_icmpintimeexcds() +#define snmp_inc_icmpinparmprobs() +#define snmp_inc_icmpinsrcquenchs() +#define snmp_inc_icmpinredirects() +#define snmp_inc_icmpinechos() +#define snmp_inc_icmpinechoreps() +#define snmp_inc_icmpintimestamps() +#define snmp_inc_icmpintimestampreps() +#define snmp_inc_icmpinaddrmasks() +#define snmp_inc_icmpinaddrmaskreps() +#define snmp_inc_icmpoutmsgs() +#define snmp_inc_icmpouterrors() +#define snmp_inc_icmpoutdestunreachs() +#define snmp_inc_icmpouttimeexcds() +#define snmp_inc_icmpoutparmprobs() +#define snmp_inc_icmpoutsrcquenchs() +#define snmp_inc_icmpoutredirects() +#define snmp_inc_icmpoutechos() +#define snmp_inc_icmpoutechoreps() +#define snmp_inc_icmpouttimestamps() +#define snmp_inc_icmpouttimestampreps() +#define snmp_inc_icmpoutaddrmasks() +#define snmp_inc_icmpoutaddrmaskreps() +/* TCP */ +#define snmp_inc_tcpactiveopens() +#define snmp_inc_tcppassiveopens() +#define snmp_inc_tcpattemptfails() +#define snmp_inc_tcpestabresets() +#define snmp_inc_tcpinsegs() +#define snmp_inc_tcpoutsegs() +#define snmp_inc_tcpretranssegs() +#define snmp_inc_tcpinerrs() +#define snmp_inc_tcpoutrsts() + +/* UDP */ +#define snmp_inc_udpindatagrams() +#define snmp_inc_udpnoports() +#define snmp_inc_udpinerrors() +#define snmp_inc_udpoutdatagrams() +#define snmp_insert_udpidx_tree(pcb) +#define snmp_delete_udpidx_tree(pcb) + +/* SNMP */ +#define snmp_inc_snmpinpkts() +#define snmp_inc_snmpoutpkts() +#define snmp_inc_snmpinbadversions() +#define snmp_inc_snmpinbadcommunitynames() +#define snmp_inc_snmpinbadcommunityuses() +#define snmp_inc_snmpinasnparseerrs() +#define snmp_inc_snmpintoobigs() +#define snmp_inc_snmpinnosuchnames() +#define snmp_inc_snmpinbadvalues() +#define snmp_inc_snmpinreadonlys() +#define snmp_inc_snmpingenerrs() +#define snmp_add_snmpintotalreqvars(value) +#define snmp_add_snmpintotalsetvars(value) +#define snmp_inc_snmpingetrequests() +#define snmp_inc_snmpingetnexts() +#define snmp_inc_snmpinsetrequests() +#define snmp_inc_snmpingetresponses() +#define snmp_inc_snmpintraps() +#define snmp_inc_snmpouttoobigs() +#define snmp_inc_snmpoutnosuchnames() +#define snmp_inc_snmpoutbadvalues() +#define snmp_inc_snmpoutgenerrs() +#define snmp_inc_snmpoutgetrequests() +#define snmp_inc_snmpoutgetnexts() +#define snmp_inc_snmpoutsetrequests() +#define snmp_inc_snmpoutgetresponses() +#define snmp_inc_snmpouttraps() +#define snmp_get_snmpgrpid_ptr(oid) +#define snmp_set_snmpenableauthentraps(value) +#define snmp_get_snmpenableauthentraps(value) + +#endif /* LWIP_SNMP */ + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_SNMP_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/snmp_asn1.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/snmp_asn1.h new file mode 100644 index 0000000..a40d5ef --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/snmp_asn1.h @@ -0,0 +1,103 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/** + * @file + * Abstract Syntax Notation One (ISO 8824, 8825) codec. + */ + +/* + * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * Author: Christiaan Simons + */ + +#ifndef __LWIP_SNMP_ASN1_H__ +#define __LWIP_SNMP_ASN1_H__ + +#include "lwip/opt.h" +#include "lwip/err.h" +#include "lwip/pbuf.h" +#include "lwip/snmp.h" + +#if LWIP_SNMP + +#ifdef __cplusplus +extern "C" { +#endif + +#define SNMP_ASN1_UNIV (!0x80 | !0x40) +#define SNMP_ASN1_APPLIC (!0x80 | 0x40) +#define SNMP_ASN1_CONTXT ( 0x80 | !0x40) + +#define SNMP_ASN1_CONSTR (0x20) +#define SNMP_ASN1_PRIMIT (!0x20) + +/* universal tags */ +#define SNMP_ASN1_INTEG 2 +#define SNMP_ASN1_OC_STR 4 +#define SNMP_ASN1_NUL 5 +#define SNMP_ASN1_OBJ_ID 6 +#define SNMP_ASN1_SEQ 16 + +/* application specific (SNMP) tags */ +#define SNMP_ASN1_IPADDR 0 /* octet string size(4) */ +#define SNMP_ASN1_COUNTER 1 /* u32_t */ +#define SNMP_ASN1_GAUGE 2 /* u32_t */ +#define SNMP_ASN1_TIMETICKS 3 /* u32_t */ +#define SNMP_ASN1_OPAQUE 4 /* octet string */ + +/* context specific (SNMP) tags */ +#define SNMP_ASN1_PDU_GET_REQ 0 +#define SNMP_ASN1_PDU_GET_NEXT_REQ 1 +#define SNMP_ASN1_PDU_GET_RESP 2 +#define SNMP_ASN1_PDU_SET_REQ 3 +#define SNMP_ASN1_PDU_TRAP 4 + +err_t snmp_asn1_dec_type(struct pbuf *p, u16_t ofs, u8_t *type); +err_t snmp_asn1_dec_length(struct pbuf *p, u16_t ofs, u8_t *octets_used, u16_t *length); +err_t snmp_asn1_dec_u32t(struct pbuf *p, u16_t ofs, u16_t len, u32_t *value); +err_t snmp_asn1_dec_s32t(struct pbuf *p, u16_t ofs, u16_t len, s32_t *value); +err_t snmp_asn1_dec_oid(struct pbuf *p, u16_t ofs, u16_t len, struct snmp_obj_id *oid); +err_t snmp_asn1_dec_raw(struct pbuf *p, u16_t ofs, u16_t len, u16_t raw_len, u8_t *raw); + +void snmp_asn1_enc_length_cnt(u16_t length, u8_t *octets_needed); +void snmp_asn1_enc_u32t_cnt(u32_t value, u16_t *octets_needed); +void snmp_asn1_enc_s32t_cnt(s32_t value, u16_t *octets_needed); +void snmp_asn1_enc_oid_cnt(u8_t ident_len, s32_t *ident, u16_t *octets_needed); +err_t snmp_asn1_enc_type(struct pbuf *p, u16_t ofs, u8_t type); +err_t snmp_asn1_enc_length(struct pbuf *p, u16_t ofs, u16_t length); +err_t snmp_asn1_enc_u32t(struct pbuf *p, u16_t ofs, u8_t octets_needed, u32_t value); +err_t snmp_asn1_enc_s32t(struct pbuf *p, u16_t ofs, u8_t octets_needed, s32_t value); +err_t snmp_asn1_enc_oid(struct pbuf *p, u16_t ofs, u8_t ident_len, s32_t *ident); +err_t snmp_asn1_enc_raw(struct pbuf *p, u16_t ofs, u8_t raw_len, u8_t *raw); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_SNMP */ + +#endif /* __LWIP_SNMP_ASN1_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/snmp_msg.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/snmp_msg.h new file mode 100644 index 0000000..6e50a61 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/snmp_msg.h @@ -0,0 +1,313 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/** + * @file + * SNMP Agent message handling structures. + */ + +/* + * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * Author: Christiaan Simons + */ + +#ifndef __LWIP_SNMP_MSG_H__ +#define __LWIP_SNMP_MSG_H__ + +#include "lwip/opt.h" +#include "lwip/snmp.h" +#include "lwip/snmp_structs.h" + +#if LWIP_SNMP + +#if SNMP_PRIVATE_MIB +#include "private_mib.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* The listen port of the SNMP agent. Clients have to make their requests to + this port. Most standard clients won't work if you change this! */ +#ifndef SNMP_IN_PORT +#define SNMP_IN_PORT 161 +#endif +/* The remote port the SNMP agent sends traps to. Most standard trap sinks won't + work if you change this! */ +#ifndef SNMP_TRAP_PORT +#define SNMP_TRAP_PORT 162 +#endif + +#define SNMP_ES_NOERROR 0 +#define SNMP_ES_TOOBIG 1 +#define SNMP_ES_NOSUCHNAME 2 +#define SNMP_ES_BADVALUE 3 +#define SNMP_ES_READONLY 4 +#define SNMP_ES_GENERROR 5 + +#define SNMP_GENTRAP_COLDSTART 0 +#define SNMP_GENTRAP_WARMSTART 1 +#define SNMP_GENTRAP_AUTHFAIL 4 +#define SNMP_GENTRAP_ENTERPRISESPC 6 + +struct snmp_varbind +{ + /* next pointer, NULL for last in list */ + struct snmp_varbind *next; + /* previous pointer, NULL for first in list */ + struct snmp_varbind *prev; + + /* object identifier length (in s32_t) */ + u8_t ident_len; + /* object identifier array */ + s32_t *ident; + + /* object value ASN1 type */ + u8_t value_type; + /* object value length (in u8_t) */ + u8_t value_len; + /* object value */ + void *value; + + /* encoding varbind seq length length */ + u8_t seqlenlen; + /* encoding object identifier length length */ + u8_t olenlen; + /* encoding object value length length */ + u8_t vlenlen; + /* encoding varbind seq length */ + u16_t seqlen; + /* encoding object identifier length */ + u16_t olen; + /* encoding object value length */ + u16_t vlen; +}; + +struct snmp_varbind_root +{ + struct snmp_varbind *head; + struct snmp_varbind *tail; + /* number of variable bindings in list */ + u8_t count; + /* encoding varbind-list seq length length */ + u8_t seqlenlen; + /* encoding varbind-list seq length */ + u16_t seqlen; +}; + +/** output response message header length fields */ +struct snmp_resp_header_lengths +{ + /* encoding error-index length length */ + u8_t erridxlenlen; + /* encoding error-status length length */ + u8_t errstatlenlen; + /* encoding request id length length */ + u8_t ridlenlen; + /* encoding pdu length length */ + u8_t pdulenlen; + /* encoding community length length */ + u8_t comlenlen; + /* encoding version length length */ + u8_t verlenlen; + /* encoding sequence length length */ + u8_t seqlenlen; + + /* encoding error-index length */ + u16_t erridxlen; + /* encoding error-status length */ + u16_t errstatlen; + /* encoding request id length */ + u16_t ridlen; + /* encoding pdu length */ + u16_t pdulen; + /* encoding community length */ + u16_t comlen; + /* encoding version length */ + u16_t verlen; + /* encoding sequence length */ + u16_t seqlen; +}; + +/** output response message header length fields */ +struct snmp_trap_header_lengths +{ + /* encoding timestamp length length */ + u8_t tslenlen; + /* encoding specific-trap length length */ + u8_t strplenlen; + /* encoding generic-trap length length */ + u8_t gtrplenlen; + /* encoding agent-addr length length */ + u8_t aaddrlenlen; + /* encoding enterprise-id length length */ + u8_t eidlenlen; + /* encoding pdu length length */ + u8_t pdulenlen; + /* encoding community length length */ + u8_t comlenlen; + /* encoding version length length */ + u8_t verlenlen; + /* encoding sequence length length */ + u8_t seqlenlen; + + /* encoding timestamp length */ + u16_t tslen; + /* encoding specific-trap length */ + u16_t strplen; + /* encoding generic-trap length */ + u16_t gtrplen; + /* encoding agent-addr length */ + u16_t aaddrlen; + /* encoding enterprise-id length */ + u16_t eidlen; + /* encoding pdu length */ + u16_t pdulen; + /* encoding community length */ + u16_t comlen; + /* encoding version length */ + u16_t verlen; + /* encoding sequence length */ + u16_t seqlen; +}; + +/* Accepting new SNMP messages. */ +#define SNMP_MSG_EMPTY 0 +/* Search for matching object for variable binding. */ +#define SNMP_MSG_SEARCH_OBJ 1 +/* Perform SNMP operation on in-memory object. + Pass-through states, for symmetry only. */ +#define SNMP_MSG_INTERNAL_GET_OBJDEF 2 +#define SNMP_MSG_INTERNAL_GET_VALUE 3 +#define SNMP_MSG_INTERNAL_SET_TEST 4 +#define SNMP_MSG_INTERNAL_GET_OBJDEF_S 5 +#define SNMP_MSG_INTERNAL_SET_VALUE 6 +/* Perform SNMP operation on object located externally. + In theory this could be used for building a proxy agent. + Practical use is for an enterprise spc. app. gateway. */ +#define SNMP_MSG_EXTERNAL_GET_OBJDEF 7 +#define SNMP_MSG_EXTERNAL_GET_VALUE 8 +#define SNMP_MSG_EXTERNAL_SET_TEST 9 +#define SNMP_MSG_EXTERNAL_GET_OBJDEF_S 10 +#define SNMP_MSG_EXTERNAL_SET_VALUE 11 + +#define SNMP_COMMUNITY_STR_LEN 64 +struct snmp_msg_pstat +{ + /* lwIP local port (161) binding */ + struct udp_pcb *pcb; + /* source IP address */ + struct ip_addr sip; + /* source UDP port */ + u16_t sp; + /* request type */ + u8_t rt; + /* request ID */ + s32_t rid; + /* error status */ + s32_t error_status; + /* error index */ + s32_t error_index; + /* community name (zero terminated) */ + u8_t community[SNMP_COMMUNITY_STR_LEN + 1]; + /* community string length (exclusive zero term) */ + u8_t com_strlen; + /* one out of MSG_EMPTY, MSG_DEMUX, MSG_INTERNAL, MSG_EXTERNAL_x */ + u8_t state; + /* saved arguments for MSG_EXTERNAL_x */ + struct mib_external_node *ext_mib_node; + struct snmp_name_ptr ext_name_ptr; + struct obj_def ext_object_def; + struct snmp_obj_id ext_oid; + /* index into input variable binding list */ + u8_t vb_idx; + /* ptr into input variable binding list */ + struct snmp_varbind *vb_ptr; + /* list of variable bindings from input */ + struct snmp_varbind_root invb; + /* list of variable bindings to output */ + struct snmp_varbind_root outvb; + /* output response lengths used in ASN encoding */ + struct snmp_resp_header_lengths rhl; +}; + +struct snmp_msg_trap +{ + /* lwIP local port (161) binding */ + struct udp_pcb *pcb; + /* destination IP address in network order */ + struct ip_addr dip; + + /* source enterprise ID (sysObjectID) */ + struct snmp_obj_id *enterprise; + /* source IP address, raw network order format */ + u8_t sip_raw[4]; + /* generic trap code */ + u32_t gen_trap; + /* specific trap code */ + u32_t spc_trap; + /* timestamp */ + u32_t ts; + /* list of variable bindings to output */ + struct snmp_varbind_root outvb; + /* output trap lengths used in ASN encoding */ + struct snmp_trap_header_lengths thl; +}; + +/** Agent Version constant, 0 = v1 oddity */ +extern const s32_t snmp_version; +/** Agent default "public" community string */ +extern const char snmp_publiccommunity[7]; + +extern struct snmp_msg_trap trap_msg; + +/** Agent setup, start listening to port 161. */ +void snmp_init(void); +void snmp_trap_dst_enable(u8_t dst_idx, u8_t enable); +void snmp_trap_dst_ip_set(u8_t dst_idx, struct ip_addr *dst); + +/** Varbind-list functions. */ +struct snmp_varbind* snmp_varbind_alloc(struct snmp_obj_id *oid, u8_t type, u8_t len); +void snmp_varbind_free(struct snmp_varbind *vb); +void snmp_varbind_list_free(struct snmp_varbind_root *root); +void snmp_varbind_tail_add(struct snmp_varbind_root *root, struct snmp_varbind *vb); +struct snmp_varbind* snmp_varbind_tail_remove(struct snmp_varbind_root *root); + +/** Handle an internal (recv) or external (private response) event. */ +void snmp_msg_event(u8_t request_id); +err_t snmp_send_response(struct snmp_msg_pstat *m_stat); +err_t snmp_send_trap(s8_t generic_trap, struct snmp_obj_id *eoid, s32_t specific_trap); +void snmp_coldstart_trap(void); +void snmp_authfail_trap(void); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_SNMP */ + +#endif /* __LWIP_SNMP_MSG_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/snmp_structs.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/snmp_structs.h new file mode 100644 index 0000000..93f4ea3 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/snmp_structs.h @@ -0,0 +1,264 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/** + * @file + * Generic MIB tree structures. + * + * @todo namespace prefixes + */ + +/* + * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * Author: Christiaan Simons + */ + +#ifndef __LWIP_SNMP_STRUCTS_H__ +#define __LWIP_SNMP_STRUCTS_H__ + +#include "lwip/opt.h" + +#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/snmp.h" + +#if SNMP_PRIVATE_MIB +#include "private_mib.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* MIB object instance */ +#define MIB_OBJECT_NONE 0 +#define MIB_OBJECT_SCALAR 1 +#define MIB_OBJECT_TAB 2 + +/* MIB object access */ +#define MIB_OBJECT_READ_ONLY 0 +#define MIB_OBJECT_READ_WRITE 1 +#define MIB_OBJECT_WRITE_ONLY 2 +#define MIB_OBJECT_NOT_ACCESSIBLE 3 + +/** object definition returned by (get_object_def)() */ +struct obj_def +{ + /* MIB_OBJECT_NONE (0), MIB_OBJECT_SCALAR (1), MIB_OBJECT_TAB (2) */ + u8_t instance; + /* 0 read-only, 1 read-write, 2 write-only, 3 not-accessible */ + u8_t access; + /* ASN type for this object */ + u8_t asn_type; + /* value length (host length) */ + u16_t v_len; + /* length of instance part of supplied object identifier */ + u8_t id_inst_len; + /* instance part of supplied object identifier */ + s32_t *id_inst_ptr; +}; + +struct snmp_name_ptr +{ + u8_t ident_len; + s32_t *ident; +}; + +/** MIB const scalar (.0) node */ +#define MIB_NODE_SC 0x01 +/** MIB const array node */ +#define MIB_NODE_AR 0x02 +/** MIB array node (mem_malloced from RAM) */ +#define MIB_NODE_RA 0x03 +/** MIB list root node (mem_malloced from RAM) */ +#define MIB_NODE_LR 0x04 +/** MIB node for external objects */ +#define MIB_NODE_EX 0x05 + +/** node "base class" layout, the mandatory fields for a node */ +struct mib_node +{ + /** returns struct obj_def for the given object identifier */ + void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od); + /** returns object value for the given object identifier, + @note the caller must allocate at least len bytes for the value */ + void (*get_value)(struct obj_def *od, u16_t len, void *value); + /** tests length and/or range BEFORE setting */ + u8_t (*set_test)(struct obj_def *od, u16_t len, void *value); + /** sets object value, only to be called when set_test() */ + void (*set_value)(struct obj_def *od, u16_t len, void *value); + /** One out of MIB_NODE_AR, MIB_NODE_LR or MIB_NODE_EX */ + const u8_t node_type; + /* array or max list length */ + const u16_t maxlength; +}; + +/** derived node for scalars .0 index */ +typedef struct mib_node mib_scalar_node; + +/** derived node, points to a fixed size const array + of sub-identifiers plus a 'child' pointer */ +struct mib_array_node +{ + /* inherited "base class" members */ + void (* const get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od); + void (* const get_value)(struct obj_def *od, u16_t len, void *value); + u8_t (*set_test)(struct obj_def *od, u16_t len, void *value); + void (*set_value)(struct obj_def *od, u16_t len, void *value); + + const u8_t node_type; + const u16_t maxlength; + + /* aditional struct members */ + const s32_t *objid; + struct mib_node* const *nptr; +}; + +/** derived node, points to a fixed size mem_malloced array + of sub-identifiers plus a 'child' pointer */ +struct mib_ram_array_node +{ + /* inherited "base class" members */ + void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od); + void (*get_value)(struct obj_def *od, u16_t len, void *value); + u8_t (*set_test)(struct obj_def *od, u16_t len, void *value); + void (*set_value)(struct obj_def *od, u16_t len, void *value); + + u8_t node_type; + u16_t maxlength; + + /* aditional struct members */ + s32_t *objid; + struct mib_node **nptr; +}; + +struct mib_list_node +{ + struct mib_list_node *prev; + struct mib_list_node *next; + s32_t objid; + struct mib_node *nptr; +}; + +/** derived node, points to a doubly linked list + of sub-identifiers plus a 'child' pointer */ +struct mib_list_rootnode +{ + /* inherited "base class" members */ + void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od); + void (*get_value)(struct obj_def *od, u16_t len, void *value); + u8_t (*set_test)(struct obj_def *od, u16_t len, void *value); + void (*set_value)(struct obj_def *od, u16_t len, void *value); + + u8_t node_type; + u16_t maxlength; + + /* aditional struct members */ + struct mib_list_node *head; + struct mib_list_node *tail; + /* counts list nodes in list */ + u16_t count; +}; + +/** derived node, has access functions for mib object in external memory or device + using 'tree_level' and 'idx', with a range 0 .. (level_length() - 1) */ +struct mib_external_node +{ + /* inherited "base class" members */ + void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od); + void (*get_value)(struct obj_def *od, u16_t len, void *value); + u8_t (*set_test)(struct obj_def *od, u16_t len, void *value); + void (*set_value)(struct obj_def *od, u16_t len, void *value); + + u8_t node_type; + u16_t maxlength; + + /* aditional struct members */ + /** points to an extenal (in memory) record of some sort of addressing + information, passed to and interpreted by the funtions below */ + void* addr_inf; + /** tree levels under this node */ + u8_t tree_levels; + /** number of objects at this level */ + u16_t (*level_length)(void* addr_inf, u8_t level); + /** compares object sub identifier with external id + return zero when equal, nonzero when unequal */ + s32_t (*ident_cmp)(void* addr_inf, u8_t level, u16_t idx, s32_t sub_id); + void (*get_objid)(void* addr_inf, u8_t level, u16_t idx, s32_t *sub_id); + + /** async Questions */ + void (*get_object_def_q)(void* addr_inf, u8_t rid, u8_t ident_len, s32_t *ident); + void (*get_value_q)(u8_t rid, struct obj_def *od); + void (*set_test_q)(u8_t rid, struct obj_def *od); + void (*set_value_q)(u8_t rid, struct obj_def *od, u16_t len, void *value); + /** async Answers */ + void (*get_object_def_a)(u8_t rid, u8_t ident_len, s32_t *ident, struct obj_def *od); + void (*get_value_a)(u8_t rid, struct obj_def *od, u16_t len, void *value); + u8_t (*set_test_a)(u8_t rid, struct obj_def *od, u16_t len, void *value); + void (*set_value_a)(u8_t rid, struct obj_def *od, u16_t len, void *value); + /** async Panic Close (agent returns error reply, + e.g. used for external transaction cleanup) */ + void (*get_object_def_pc)(u8_t rid, u8_t ident_len, s32_t *ident); + void (*get_value_pc)(u8_t rid, struct obj_def *od); + void (*set_test_pc)(u8_t rid, struct obj_def *od); + void (*set_value_pc)(u8_t rid, struct obj_def *od); +}; + +/** export MIB tree from mib2.c */ +extern const struct mib_array_node internet; + +/** dummy function pointers for non-leaf MIB nodes from mib2.c */ +void noleafs_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od); +void noleafs_get_value(struct obj_def *od, u16_t len, void *value); +u8_t noleafs_set_test(struct obj_def *od, u16_t len, void *value); +void noleafs_set_value(struct obj_def *od, u16_t len, void *value); + +void snmp_oidtoip(s32_t *ident, struct ip_addr *ip); +void snmp_iptooid(struct ip_addr *ip, s32_t *ident); +void snmp_ifindextonetif(s32_t ifindex, struct netif **netif); +void snmp_netiftoifindex(struct netif *netif, s32_t *ifidx); + +struct mib_list_node* snmp_mib_ln_alloc(s32_t id); +void snmp_mib_ln_free(struct mib_list_node *ln); +struct mib_list_rootnode* snmp_mib_lrn_alloc(void); +void snmp_mib_lrn_free(struct mib_list_rootnode *lrn); + +s8_t snmp_mib_node_insert(struct mib_list_rootnode *rn, s32_t objid, struct mib_list_node **insn); +s8_t snmp_mib_node_find(struct mib_list_rootnode *rn, s32_t objid, struct mib_list_node **fn); +struct mib_list_rootnode *snmp_mib_node_delete(struct mib_list_rootnode *rn, struct mib_list_node *n); + +struct mib_node* snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_name_ptr *np); +struct mib_node* snmp_expand_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret); +u8_t snmp_iso_prefix_tst(u8_t ident_len, s32_t *ident); +u8_t snmp_iso_prefix_expand(u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_SNMP */ + +#endif /* __LWIP_SNMP_STRUCTS_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/sockets.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/sockets.h new file mode 100644 index 0000000..675c1f7 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/sockets.h @@ -0,0 +1,359 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + + +#ifndef __LWIP_SOCKETS_H__ +#define __LWIP_SOCKETS_H__ + +#include "lwip/opt.h" + +#if LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */ + +#include /* for size_t */ + +#include "lwip/ip_addr.h" +#include "lwip/inet.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* members are in network byte order */ +struct sockaddr_in { + u8_t sin_len; + u8_t sin_family; + u16_t sin_port; + struct in_addr sin_addr; + char sin_zero[8]; +}; + +struct sockaddr { + u8_t sa_len; + u8_t sa_family; + char sa_data[14]; +}; + +#ifndef socklen_t +# define socklen_t u32_t +#endif + +/* Socket protocol types (TCP/UDP/RAW) */ +#define SOCK_STREAM 1 +#define SOCK_DGRAM 2 +#define SOCK_RAW 3 + +/* + * Option flags per-socket. These must match the SOF_ flags in ip.h! + */ +#define SO_DEBUG 0x0001 /* Unimplemented: turn on debugging info recording */ +#define SO_ACCEPTCONN 0x0002 /* socket has had listen() */ +#define SO_REUSEADDR 0x0004 /* Unimplemented: allow local address reuse */ +#define SO_KEEPALIVE 0x0008 /* keep connections alive */ +#define SO_DONTROUTE 0x0010 /* Unimplemented: just use interface addresses */ +#define SO_BROADCAST 0x0020 /* permit to send and to receive broadcast messages (see IP_SOF_BROADCAST option) */ +#define SO_USELOOPBACK 0x0040 /* Unimplemented: bypass hardware when possible */ +#define SO_LINGER 0x0080 /* linger on close if data present */ +#define SO_OOBINLINE 0x0100 /* Unimplemented: leave received OOB data in line */ +#define SO_REUSEPORT 0x0200 /* Unimplemented: allow local address & port reuse */ + +#define SO_DONTLINGER ((int)(~SO_LINGER)) + +/* + * Additional options, not kept in so_options. + */ +#define SO_SNDBUF 0x1001 /* Unimplemented: send buffer size */ +#define SO_RCVBUF 0x1002 /* receive buffer size */ +#define SO_SNDLOWAT 0x1003 /* Unimplemented: send low-water mark */ +#define SO_RCVLOWAT 0x1004 /* Unimplemented: receive low-water mark */ +#define SO_SNDTIMEO 0x1005 /* Unimplemented: send timeout */ +#define SO_RCVTIMEO 0x1006 /* receive timeout */ +#define SO_ERROR 0x1007 /* get error status and clear */ +#define SO_TYPE 0x1008 /* get socket type */ +#define SO_CONTIMEO 0x1009 /* Unimplemented: connect timeout */ +#define SO_NO_CHECK 0x100a /* don't create UDP checksum */ + + +/* + * Structure used for manipulating linger option. + */ +struct linger { + int l_onoff; /* option on/off */ + int l_linger; /* linger time */ +}; + +/* + * Level number for (get/set)sockopt() to apply to socket itself. + */ +#define SOL_SOCKET 0xfff /* options for socket level */ + + +#define AF_UNSPEC 0 +#define AF_INET 2 +#define PF_INET AF_INET +#define PF_UNSPEC AF_UNSPEC + +#define IPPROTO_IP 0 +#define IPPROTO_TCP 6 +#define IPPROTO_UDP 17 +#define IPPROTO_UDPLITE 136 + +/* Flags we can use with send and recv. */ +#define MSG_PEEK 0x01 /* Peeks at an incoming message */ +#define MSG_WAITALL 0x02 /* Unimplemented: Requests that the function block until the full amount of data requested can be returned */ +#define MSG_OOB 0x04 /* Unimplemented: Requests out-of-band data. The significance and semantics of out-of-band data are protocol-specific */ +#define MSG_DONTWAIT 0x08 /* Nonblocking i/o for this operation only */ +#define MSG_MORE 0x10 /* Sender will send more */ + + +/* + * Options for level IPPROTO_IP + */ +#define IP_TOS 1 +#define IP_TTL 2 + +#if LWIP_TCP +/* + * Options for level IPPROTO_TCP + */ +#define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */ +#define TCP_KEEPALIVE 0x02 /* send KEEPALIVE probes when idle for pcb->keep_idle milliseconds */ +#define TCP_KEEPIDLE 0x03 /* set pcb->keep_idle - Same as TCP_KEEPALIVE, but use seconds for get/setsockopt */ +#define TCP_KEEPINTVL 0x04 /* set pcb->keep_intvl - Use seconds for get/setsockopt */ +#define TCP_KEEPCNT 0x05 /* set pcb->keep_cnt - Use number of probes sent for get/setsockopt */ +#endif /* LWIP_TCP */ + +#if LWIP_UDP && LWIP_UDPLITE +/* + * Options for level IPPROTO_UDPLITE + */ +#define UDPLITE_SEND_CSCOV 0x01 /* sender checksum coverage */ +#define UDPLITE_RECV_CSCOV 0x02 /* minimal receiver checksum coverage */ +#endif /* LWIP_UDP && LWIP_UDPLITE*/ + + +#if LWIP_IGMP +/* + * Options and types for UDP multicast traffic handling + */ +#define IP_ADD_MEMBERSHIP 3 +#define IP_DROP_MEMBERSHIP 4 +#define IP_MULTICAST_TTL 5 +#define IP_MULTICAST_IF 6 +#define IP_MULTICAST_LOOP 7 + +typedef struct ip_mreq { + struct in_addr imr_multiaddr; /* IP multicast address of group */ + struct in_addr imr_interface; /* local IP address of interface */ +} ip_mreq; +#endif /* LWIP_IGMP */ + +/* + * The Type of Service provides an indication of the abstract + * parameters of the quality of service desired. These parameters are + * to be used to guide the selection of the actual service parameters + * when transmitting a datagram through a particular network. Several + * networks offer service precedence, which somehow treats high + * precedence traffic as more important than other traffic (generally + * by accepting only traffic above a certain precedence at time of high + * load). The major choice is a three way tradeoff between low-delay, + * high-reliability, and high-throughput. + * The use of the Delay, Throughput, and Reliability indications may + * increase the cost (in some sense) of the service. In many networks + * better performance for one of these parameters is coupled with worse + * performance on another. Except for very unusual cases at most two + * of these three indications should be set. + */ +#define IPTOS_TOS_MASK 0x1E +#define IPTOS_TOS(tos) ((tos) & IPTOS_TOS_MASK) +#define IPTOS_LOWDELAY 0x10 +#define IPTOS_THROUGHPUT 0x08 +#define IPTOS_RELIABILITY 0x04 +#define IPTOS_LOWCOST 0x02 +#define IPTOS_MINCOST IPTOS_LOWCOST + +/* + * The Network Control precedence designation is intended to be used + * within a network only. The actual use and control of that + * designation is up to each network. The Internetwork Control + * designation is intended for use by gateway control originators only. + * If the actual use of these precedence designations is of concern to + * a particular network, it is the responsibility of that network to + * control the access to, and use of, those precedence designations. + */ +#define IPTOS_PREC_MASK 0xe0 +#define IPTOS_PREC(tos) ((tos) & IPTOS_PREC_MASK) +#define IPTOS_PREC_NETCONTROL 0xe0 +#define IPTOS_PREC_INTERNETCONTROL 0xc0 +#define IPTOS_PREC_CRITIC_ECP 0xa0 +#define IPTOS_PREC_FLASHOVERRIDE 0x80 +#define IPTOS_PREC_FLASH 0x60 +#define IPTOS_PREC_IMMEDIATE 0x40 +#define IPTOS_PREC_PRIORITY 0x20 +#define IPTOS_PREC_ROUTINE 0x00 + + +/* + * Commands for ioctlsocket(), taken from the BSD file fcntl.h. + * lwip_ioctl only supports FIONREAD and FIONBIO, for now + * + * Ioctl's have the command encoded in the lower word, + * and the size of any in or out parameters in the upper + * word. The high 2 bits of the upper word are used + * to encode the in/out status of the parameter; for now + * we restrict parameters to at most 128 bytes. + */ +#if !defined(FIONREAD) || !defined(FIONBIO) +#define IOCPARM_MASK 0x7fU /* parameters must be < 128 bytes */ +#define IOC_VOID 0x20000000UL /* no parameters */ +#define IOC_OUT 0x40000000UL /* copy out parameters */ +#define IOC_IN 0x80000000UL /* copy in parameters */ +#define IOC_INOUT (IOC_IN|IOC_OUT) + /* 0x20000000 distinguishes new & + old ioctl's */ +#define _IO(x,y) (IOC_VOID|((x)<<8)|(y)) + +#define _IOR(x,y,t) (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y)) + +#define _IOW(x,y,t) (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y)) +#endif /* !defined(FIONREAD) || !defined(FIONBIO) */ + +#ifndef FIONREAD +#define FIONREAD _IOR('f', 127, unsigned long) /* get # bytes to read */ +#endif +#ifndef FIONBIO +#define FIONBIO _IOW('f', 126, unsigned long) /* set/clear non-blocking i/o */ +#endif + +/* Socket I/O Controls: unimplemented */ +#ifndef SIOCSHIWAT +#define SIOCSHIWAT _IOW('s', 0, unsigned long) /* set high watermark */ +#define SIOCGHIWAT _IOR('s', 1, unsigned long) /* get high watermark */ +#define SIOCSLOWAT _IOW('s', 2, unsigned long) /* set low watermark */ +#define SIOCGLOWAT _IOR('s', 3, unsigned long) /* get low watermark */ +#define SIOCATMARK _IOR('s', 7, unsigned long) /* at oob mark? */ +#endif + +/* Socket flags: */ +#ifndef O_NONBLOCK +#define O_NONBLOCK 04000U +#endif + +/* FD_SET used for lwip_select */ +#ifndef FD_SET + #undef FD_SETSIZE + /* Make FD_SETSIZE match NUM_SOCKETS in socket.c */ + #define FD_SETSIZE MEMP_NUM_NETCONN + #define FD_SET(n, p) ((p)->fd_bits[(n)/8] |= (1 << ((n) & 7))) + #define FD_CLR(n, p) ((p)->fd_bits[(n)/8] &= ~(1 << ((n) & 7))) + #define FD_ISSET(n,p) ((p)->fd_bits[(n)/8] & (1 << ((n) & 7))) + #define FD_ZERO(p) memset((void*)(p),0,sizeof(*(p))) + + typedef struct fd_set { + unsigned char fd_bits [(FD_SETSIZE+7)/8]; + } fd_set; + +#endif /* FD_SET */ + +/** LWIP_TIMEVAL_PRIVATE: if you want to use the struct timeval provided + * by your system, set this to 0 and include in cc.h */ +#ifndef LWIP_TIMEVAL_PRIVATE +#define LWIP_TIMEVAL_PRIVATE 1 +#endif + +#if LWIP_TIMEVAL_PRIVATE +struct timeval { + long tv_sec; /* seconds */ + long tv_usec; /* and microseconds */ +}; +#endif /* LWIP_TIMEVAL_PRIVATE */ + +void lwip_socket_init(void); + +int lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen); +int lwip_bind(int s, const struct sockaddr *name, socklen_t namelen); +int lwip_shutdown(int s, int how); +int lwip_getpeername (int s, struct sockaddr *name, socklen_t *namelen); +int lwip_getsockname (int s, struct sockaddr *name, socklen_t *namelen); +int lwip_getsockopt (int s, int level, int optname, void *optval, socklen_t *optlen); +int lwip_setsockopt (int s, int level, int optname, const void *optval, socklen_t optlen); +int lwip_close(int s); +int lwip_connect(int s, const struct sockaddr *name, socklen_t namelen); +int lwip_listen(int s, int backlog); +int lwip_recv(int s, void *mem, size_t len, int flags); +int lwip_read(int s, void *mem, size_t len); +int lwip_recvfrom(int s, void *mem, size_t len, int flags, + struct sockaddr *from, socklen_t *fromlen); +int lwip_send(int s, const void *dataptr, size_t size, int flags); +int lwip_sendto(int s, const void *dataptr, size_t size, int flags, + const struct sockaddr *to, socklen_t tolen); +int lwip_socket(int domain, int type, int protocol); +int lwip_write(int s, const void *dataptr, size_t size); +int lwip_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, + struct timeval *timeout); +int lwip_ioctl(int s, long cmd, void *argp); + +#if LWIP_COMPAT_SOCKETS +#define accept(a,b,c) lwip_accept(a,b,c) +#define bind(a,b,c) lwip_bind(a,b,c) +#define shutdown(a,b) lwip_shutdown(a,b) +#define closesocket(s) lwip_close(s) +#define connect(a,b,c) lwip_connect(a,b,c) +#define getsockname(a,b,c) lwip_getsockname(a,b,c) +#define getpeername(a,b,c) lwip_getpeername(a,b,c) +#define setsockopt(a,b,c,d,e) lwip_setsockopt(a,b,c,d,e) +#define getsockopt(a,b,c,d,e) lwip_getsockopt(a,b,c,d,e) +#define listen(a,b) lwip_listen(a,b) +#define recv(a,b,c,d) lwip_recv(a,b,c,d) +#define recvfrom(a,b,c,d,e,f) lwip_recvfrom(a,b,c,d,e,f) +#define send(a,b,c,d) lwip_send(a,b,c,d) +#define sendto(a,b,c,d,e,f) lwip_sendto(a,b,c,d,e,f) +#define socket(a,b,c) lwip_socket(a,b,c) +#define select(a,b,c,d,e) lwip_select(a,b,c,d,e) +#define ioctlsocket(a,b,c) lwip_ioctl(a,b,c) + +#if LWIP_POSIX_SOCKETS_IO_NAMES +#define read(a,b,c) lwip_read(a,b,c) +#define write(a,b,c) lwip_write(a,b,c) +#define close(s) lwip_close(s) +#endif /* LWIP_POSIX_SOCKETS_IO_NAMES */ + +#endif /* LWIP_COMPAT_SOCKETS */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_SOCKET */ + +#endif /* __LWIP_SOCKETS_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/stats.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/stats.h new file mode 100644 index 0000000..4aec5e5 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/stats.h @@ -0,0 +1,285 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_STATS_H__ +#define __LWIP_STATS_H__ + +#include "lwip/opt.h" + +#include "lwip/mem.h" +#include "lwip/memp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if LWIP_STATS + +#ifndef LWIP_STATS_LARGE +#define LWIP_STATS_LARGE 0 +#endif + +#if LWIP_STATS_LARGE +#define STAT_COUNTER u32_t +#define STAT_COUNTER_F U32_F +#else +#define STAT_COUNTER u16_t +#define STAT_COUNTER_F U16_F +#endif + +struct stats_proto { + STAT_COUNTER xmit; /* Transmitted packets. */ + STAT_COUNTER recv; /* Received packets. */ + STAT_COUNTER fw; /* Forwarded packets. */ + STAT_COUNTER drop; /* Dropped packets. */ + STAT_COUNTER chkerr; /* Checksum error. */ + STAT_COUNTER lenerr; /* Invalid length error. */ + STAT_COUNTER memerr; /* Out of memory error. */ + STAT_COUNTER rterr; /* Routing error. */ + STAT_COUNTER proterr; /* Protocol error. */ + STAT_COUNTER opterr; /* Error in options. */ + STAT_COUNTER err; /* Misc error. */ + STAT_COUNTER cachehit; +}; + +struct stats_igmp { + STAT_COUNTER lenerr; /* Invalid length error. */ + STAT_COUNTER chkerr; /* Checksum error. */ + STAT_COUNTER v1_rxed; /* */ + STAT_COUNTER join_sent; /* */ + STAT_COUNTER leave_sent; /* */ + STAT_COUNTER unicast_query; /* */ + STAT_COUNTER report_sent; /* */ + STAT_COUNTER report_rxed; /* */ + STAT_COUNTER group_query_rxed; /* */ +}; + +struct stats_mem { + mem_size_t avail; + mem_size_t used; + mem_size_t max; + STAT_COUNTER err; + STAT_COUNTER illegal; +}; + +struct stats_syselem { + STAT_COUNTER used; + STAT_COUNTER max; + STAT_COUNTER err; +}; + +struct stats_sys { + struct stats_syselem sem; + struct stats_syselem mbox; +}; + +struct stats_ { +#if LINK_STATS + struct stats_proto link; +#endif +#if ETHARP_STATS + struct stats_proto etharp; +#endif +#if IPFRAG_STATS + struct stats_proto ip_frag; +#endif +#if IP_STATS + struct stats_proto ip; +#endif +#if ICMP_STATS + struct stats_proto icmp; +#endif +#if IGMP_STATS + struct stats_igmp igmp; +#endif +#if UDP_STATS + struct stats_proto udp; +#endif +#if TCP_STATS + struct stats_proto tcp; +#endif +#if MEM_STATS + struct stats_mem mem; +#endif +#if MEMP_STATS + struct stats_mem memp[MEMP_MAX]; +#endif +#if SYS_STATS + struct stats_sys sys; +#endif +}; + +extern struct stats_ lwip_stats; + +#define stats_init() /* Compatibility define, not init needed. */ + +#define STATS_INC(x) ++lwip_stats.x +#define STATS_DEC(x) --lwip_stats.x +#else +#define stats_init() +#define STATS_INC(x) +#define STATS_DEC(x) +#endif /* LWIP_STATS */ + +#if TCP_STATS +#define TCP_STATS_INC(x) STATS_INC(x) +#define TCP_STATS_DISPLAY() stats_display_proto(&lwip_stats.tcp, "TCP") +#else +#define TCP_STATS_INC(x) +#define TCP_STATS_DISPLAY() +#endif + +#if UDP_STATS +#define UDP_STATS_INC(x) STATS_INC(x) +#define UDP_STATS_DISPLAY() stats_display_proto(&lwip_stats.udp, "UDP") +#else +#define UDP_STATS_INC(x) +#define UDP_STATS_DISPLAY() +#endif + +#if ICMP_STATS +#define ICMP_STATS_INC(x) STATS_INC(x) +#define ICMP_STATS_DISPLAY() stats_display_proto(&lwip_stats.icmp, "ICMP") +#else +#define ICMP_STATS_INC(x) +#define ICMP_STATS_DISPLAY() +#endif + +#if IGMP_STATS +#define IGMP_STATS_INC(x) STATS_INC(x) +#define IGMP_STATS_DISPLAY() stats_display_igmp(&lwip_stats.igmp) +#else +#define IGMP_STATS_INC(x) +#define IGMP_STATS_DISPLAY() +#endif + +#if IP_STATS +#define IP_STATS_INC(x) STATS_INC(x) +#define IP_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip, "IP") +#else +#define IP_STATS_INC(x) +#define IP_STATS_DISPLAY() +#endif + +#if IPFRAG_STATS +#define IPFRAG_STATS_INC(x) STATS_INC(x) +#define IPFRAG_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip_frag, "IP_FRAG") +#else +#define IPFRAG_STATS_INC(x) +#define IPFRAG_STATS_DISPLAY() +#endif + +#if ETHARP_STATS +#define ETHARP_STATS_INC(x) STATS_INC(x) +#define ETHARP_STATS_DISPLAY() stats_display_proto(&lwip_stats.etharp, "ETHARP") +#else +#define ETHARP_STATS_INC(x) +#define ETHARP_STATS_DISPLAY() +#endif + +#if LINK_STATS +#define LINK_STATS_INC(x) STATS_INC(x) +#define LINK_STATS_DISPLAY() stats_display_proto(&lwip_stats.link, "LINK") +#else +#define LINK_STATS_INC(x) +#define LINK_STATS_DISPLAY() +#endif + +#if MEM_STATS +#define MEM_STATS_AVAIL(x, y) lwip_stats.mem.x = y +#define MEM_STATS_INC(x) STATS_INC(mem.x) +#define MEM_STATS_INC_USED(x, y) do { lwip_stats.mem.used += y; \ + if (lwip_stats.mem.max < lwip_stats.mem.used) { \ + lwip_stats.mem.max = lwip_stats.mem.used; \ + } \ + } while(0) +#define MEM_STATS_DEC_USED(x, y) lwip_stats.mem.x -= y +#define MEM_STATS_DISPLAY() stats_display_mem(&lwip_stats.mem, "HEAP") +#else +#define MEM_STATS_AVAIL(x, y) +#define MEM_STATS_INC(x) +#define MEM_STATS_INC_USED(x, y) +#define MEM_STATS_DEC_USED(x, y) +#define MEM_STATS_DISPLAY() +#endif + +#if MEMP_STATS +#define MEMP_STATS_AVAIL(x, i, y) lwip_stats.memp[i].x = y +#define MEMP_STATS_INC(x, i) STATS_INC(memp[i].x) +#define MEMP_STATS_DEC(x, i) STATS_DEC(memp[i].x) +#define MEMP_STATS_INC_USED(x, i) do { ++lwip_stats.memp[i].used; \ + if (lwip_stats.memp[i].max < lwip_stats.memp[i].used) { \ + lwip_stats.memp[i].max = lwip_stats.memp[i].used; \ + } \ + } while(0) +#define MEMP_STATS_DISPLAY(i) stats_display_memp(&lwip_stats.memp[i], i) +#else +#define MEMP_STATS_AVAIL(x, i, y) +#define MEMP_STATS_INC(x, i) +#define MEMP_STATS_DEC(x, i) +#define MEMP_STATS_INC_USED(x, i) +#define MEMP_STATS_DISPLAY(i) +#endif + +#if SYS_STATS +#define SYS_STATS_INC(x) STATS_INC(sys.x) +#define SYS_STATS_DEC(x) STATS_DEC(sys.x) +#define SYS_STATS_DISPLAY() stats_display_sys(&lwip_stats.sys) +#else +#define SYS_STATS_INC(x) +#define SYS_STATS_DEC(x) +#define SYS_STATS_DISPLAY() +#endif + +/* Display of statistics */ +#if LWIP_STATS_DISPLAY +void stats_display(void); +void stats_display_proto(struct stats_proto *proto, char *name); +void stats_display_igmp(struct stats_igmp *igmp); +void stats_display_mem(struct stats_mem *mem, char *name); +void stats_display_memp(struct stats_mem *mem, int index); +void stats_display_sys(struct stats_sys *sys); +#else +#define stats_display() +#define stats_display_proto(proto, name) +#define stats_display_igmp(igmp) +#define stats_display_mem(mem, name) +#define stats_display_memp(mem, index) +#define stats_display_sys(sys) +#endif /* LWIP_STATS_DISPLAY */ + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_STATS_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/sys.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/sys.h new file mode 100644 index 0000000..9a4f02a --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/sys.h @@ -0,0 +1,245 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_SYS_H__ +#define __LWIP_SYS_H__ + +#include "lwip/opt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if NO_SYS + +/* For a totally minimal and standalone system, we provide null + definitions of the sys_ functions. */ +typedef u8_t sys_sem_t; +typedef u8_t sys_mbox_t; +struct sys_timeo {u8_t dummy;}; + +#define sys_init() +#define sys_timeout(m,h,a) +#define sys_untimeout(m,a) +#define sys_sem_new(c) c +#define sys_sem_signal(s) +#define sys_sem_wait(s) +#define sys_sem_wait_timeout(s,t) +#define sys_arch_sem_wait(s,t) +#define sys_sem_free(s) +#define sys_mbox_new(s) 0 +#define sys_mbox_fetch(m,d) +#define sys_mbox_tryfetch(m,d) +#define sys_mbox_post(m,d) +#define sys_mbox_trypost(m,d) +#define sys_mbox_free(m) + +#define sys_thread_new(n,t,a,s,p) + +#else /* NO_SYS */ + +/** Return code for timeouts from sys_arch_mbox_fetch and sys_arch_sem_wait */ +#define SYS_ARCH_TIMEOUT 0xffffffffUL + +/* sys_mbox_tryfetch returns SYS_MBOX_EMPTY if appropriate. + * For now we use the same magic value, but we allow this to change in future. + */ +#define SYS_MBOX_EMPTY SYS_ARCH_TIMEOUT + +#include "lwip/err.h" +#include "arch/sys_arch.h" + +typedef void (* sys_timeout_handler)(void *arg); + +struct sys_timeo { + struct sys_timeo *next; + u32_t time; + sys_timeout_handler h; + void *arg; +}; + +struct sys_timeouts { + struct sys_timeo *next; +}; + +/* sys_init() must be called before anthing else. */ +void sys_init(void); + +/* + * sys_timeout(): + * + * Schedule a timeout a specified amount of milliseconds in the + * future. When the timeout occurs, the specified timeout handler will + * be called. The handler will be passed the "arg" argument when + * called. + * + */ +void sys_timeout(u32_t msecs, sys_timeout_handler h, void *arg); +void sys_untimeout(sys_timeout_handler h, void *arg); +struct sys_timeouts *sys_arch_timeouts(void); + +/* Semaphore functions. */ +sys_sem_t sys_sem_new(u8_t count); +void sys_sem_signal(sys_sem_t sem); +u32_t sys_arch_sem_wait(sys_sem_t sem, u32_t timeout); +void sys_sem_free(sys_sem_t sem); +void sys_sem_wait(sys_sem_t sem); +int sys_sem_wait_timeout(sys_sem_t sem, u32_t timeout); + +/* Time functions. */ +#ifndef sys_msleep +void sys_msleep(u32_t ms); /* only has a (close to) 1 jiffy resolution. */ +#endif +#ifndef sys_jiffies +u32_t sys_jiffies(void); /* since power up. */ +#endif + +/* Mailbox functions. */ +sys_mbox_t sys_mbox_new(int size); +void sys_mbox_post(sys_mbox_t mbox, void *msg); +err_t sys_mbox_trypost(sys_mbox_t mbox, void *msg); +u32_t sys_arch_mbox_fetch(sys_mbox_t mbox, void **msg, u32_t timeout); +#ifndef sys_arch_mbox_tryfetch /* Allow port to override with a macro */ +u32_t sys_arch_mbox_tryfetch(sys_mbox_t mbox, void **msg); +#endif +/* For now, we map straight to sys_arch implementation. */ +#define sys_mbox_tryfetch(mbox, msg) sys_arch_mbox_tryfetch(mbox, msg) +void sys_mbox_free(sys_mbox_t mbox); +void sys_mbox_fetch(sys_mbox_t mbox, void **msg); + +/* Thread functions. */ +sys_thread_t sys_thread_new(char *name, void (* thread)(void *arg), void *arg, int stacksize, int prio); + +#endif /* NO_SYS */ + +/** Returns the current time in milliseconds. */ +u32_t sys_now(void); + +/* Critical Region Protection */ +/* These functions must be implemented in the sys_arch.c file. + In some implementations they can provide a more light-weight protection + mechanism than using semaphores. Otherwise semaphores can be used for + implementation */ +#ifndef SYS_ARCH_PROTECT +/** SYS_LIGHTWEIGHT_PROT + * define SYS_LIGHTWEIGHT_PROT in lwipopts.h if you want inter-task protection + * for certain critical regions during buffer allocation, deallocation and memory + * allocation and deallocation. + */ +#if SYS_LIGHTWEIGHT_PROT + +/** SYS_ARCH_DECL_PROTECT + * declare a protection variable. This macro will default to defining a variable of + * type sys_prot_t. If a particular port needs a different implementation, then + * this macro may be defined in sys_arch.h. + */ +#define SYS_ARCH_DECL_PROTECT(lev) sys_prot_t lev +/** SYS_ARCH_PROTECT + * Perform a "fast" protect. This could be implemented by + * disabling interrupts for an embedded system or by using a semaphore or + * mutex. The implementation should allow calling SYS_ARCH_PROTECT when + * already protected. The old protection level is returned in the variable + * "lev". This macro will default to calling the sys_arch_protect() function + * which should be implemented in sys_arch.c. If a particular port needs a + * different implementation, then this macro may be defined in sys_arch.h + */ +#define SYS_ARCH_PROTECT(lev) lev = sys_arch_protect() +/** SYS_ARCH_UNPROTECT + * Perform a "fast" set of the protection level to "lev". This could be + * implemented by setting the interrupt level to "lev" within the MACRO or by + * using a semaphore or mutex. This macro will default to calling the + * sys_arch_unprotect() function which should be implemented in + * sys_arch.c. If a particular port needs a different implementation, then + * this macro may be defined in sys_arch.h + */ +#define SYS_ARCH_UNPROTECT(lev) sys_arch_unprotect(lev) +sys_prot_t sys_arch_protect(void); +void sys_arch_unprotect(sys_prot_t pval); + +#else + +#define SYS_ARCH_DECL_PROTECT(lev) +#define SYS_ARCH_PROTECT(lev) +#define SYS_ARCH_UNPROTECT(lev) + +#endif /* SYS_LIGHTWEIGHT_PROT */ + +#endif /* SYS_ARCH_PROTECT */ + +/* + * Macros to set/get and increase/decrease variables in a thread-safe way. + * Use these for accessing variable that are used from more than one thread. + */ + +#ifndef SYS_ARCH_INC +#define SYS_ARCH_INC(var, val) do { \ + SYS_ARCH_DECL_PROTECT(old_level); \ + SYS_ARCH_PROTECT(old_level); \ + var += val; \ + SYS_ARCH_UNPROTECT(old_level); \ + } while(0) +#endif /* SYS_ARCH_INC */ + +#ifndef SYS_ARCH_DEC +#define SYS_ARCH_DEC(var, val) do { \ + SYS_ARCH_DECL_PROTECT(old_level); \ + SYS_ARCH_PROTECT(old_level); \ + var -= val; \ + SYS_ARCH_UNPROTECT(old_level); \ + } while(0) +#endif /* SYS_ARCH_DEC */ + +#ifndef SYS_ARCH_GET +#define SYS_ARCH_GET(var, ret) do { \ + SYS_ARCH_DECL_PROTECT(old_level); \ + SYS_ARCH_PROTECT(old_level); \ + ret = var; \ + SYS_ARCH_UNPROTECT(old_level); \ + } while(0) +#endif /* SYS_ARCH_GET */ + +#ifndef SYS_ARCH_SET +#define SYS_ARCH_SET(var, val) do { \ + SYS_ARCH_DECL_PROTECT(old_level); \ + SYS_ARCH_PROTECT(old_level); \ + var = val; \ + SYS_ARCH_UNPROTECT(old_level); \ + } while(0) +#endif /* SYS_ARCH_SET */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_SYS_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/tcp.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/tcp.h new file mode 100644 index 0000000..c151574 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/tcp.h @@ -0,0 +1,709 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_TCP_H__ +#define __LWIP_TCP_H__ + +#include "lwip/opt.h" + +#if LWIP_TCP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/sys.h" +#include "lwip/mem.h" +#include "lwip/pbuf.h" +#include "lwip/ip.h" +#include "lwip/icmp.h" +#include "lwip/err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct tcp_pcb; + +/* Functions for interfacing with TCP: */ + +/* Lower layer interface to TCP: */ +#define tcp_init() /* Compatibility define, not init needed. */ +void tcp_tmr (void); /* Must be called every + TCP_TMR_INTERVAL + ms. (Typically 250 ms). */ +/* Application program's interface: */ +struct tcp_pcb * tcp_new (void); +struct tcp_pcb * tcp_alloc (u8_t prio); + +void tcp_arg (struct tcp_pcb *pcb, void *arg); +void tcp_accept (struct tcp_pcb *pcb, + err_t (* accept)(void *arg, struct tcp_pcb *newpcb, + err_t err)); +void tcp_recv (struct tcp_pcb *pcb, + err_t (* recv)(void *arg, struct tcp_pcb *tpcb, + struct pbuf *p, err_t err)); +void tcp_sent (struct tcp_pcb *pcb, + err_t (* sent)(void *arg, struct tcp_pcb *tpcb, + u16_t len)); +void tcp_poll (struct tcp_pcb *pcb, + err_t (* poll)(void *arg, struct tcp_pcb *tpcb), + u8_t interval); +void tcp_err (struct tcp_pcb *pcb, + void (* err)(void *arg, err_t err)); + +#define tcp_mss(pcb) ((pcb)->mss) +#define tcp_sndbuf(pcb) ((pcb)->snd_buf) +#define tcp_nagle_disable(pcb) ((pcb)->flags |= TF_NODELAY) +#define tcp_nagle_enable(pcb) ((pcb)->flags &= ~TF_NODELAY) +#define tcp_nagle_disabled(pcb) (((pcb)->flags & TF_NODELAY) != 0) + +#if TCP_LISTEN_BACKLOG +#define tcp_accepted(pcb) (((struct tcp_pcb_listen *)(pcb))->accepts_pending--) +#else /* TCP_LISTEN_BACKLOG */ +#define tcp_accepted(pcb) +#endif /* TCP_LISTEN_BACKLOG */ + +void tcp_recved (struct tcp_pcb *pcb, u16_t len); +err_t tcp_bind (struct tcp_pcb *pcb, struct ip_addr *ipaddr, + u16_t port); +err_t tcp_connect (struct tcp_pcb *pcb, struct ip_addr *ipaddr, + u16_t port, err_t (* connected)(void *arg, + struct tcp_pcb *tpcb, + err_t err)); + +struct tcp_pcb * tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog); +#define tcp_listen(pcb) tcp_listen_with_backlog(pcb, TCP_DEFAULT_LISTEN_BACKLOG) + +void tcp_abandon (struct tcp_pcb *pcb, int reset); +#define tcp_abort(pcb) tcp_abandon((pcb), 1) +err_t tcp_close (struct tcp_pcb *pcb); + +/* Flags for "apiflags" parameter in tcp_write and tcp_enqueue */ +#define TCP_WRITE_FLAG_COPY 0x01 +#define TCP_WRITE_FLAG_MORE 0x02 + +err_t tcp_write (struct tcp_pcb *pcb, const void *dataptr, u16_t len, + u8_t apiflags); + +void tcp_setprio (struct tcp_pcb *pcb, u8_t prio); + +#define TCP_PRIO_MIN 1 +#define TCP_PRIO_NORMAL 64 +#define TCP_PRIO_MAX 127 + +/* It is also possible to call these two functions at the right + intervals (instead of calling tcp_tmr()). */ +void tcp_slowtmr (void); +void tcp_fasttmr (void); + + +/* Only used by IP to pass a TCP segment to TCP: */ +void tcp_input (struct pbuf *p, struct netif *inp); +/* Used within the TCP code only: */ +err_t tcp_send_empty_ack(struct tcp_pcb *pcb); +err_t tcp_output (struct tcp_pcb *pcb); +void tcp_rexmit (struct tcp_pcb *pcb); +void tcp_rexmit_rto (struct tcp_pcb *pcb); +void tcp_rexmit_fast (struct tcp_pcb *pcb); +u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb); + +/** + * This is the Nagle algorithm: try to combine user data to send as few TCP + * segments as possible. Only send if + * - no previously transmitted data on the connection remains unacknowledged or + * - the TF_NODELAY flag is set (nagle algorithm turned off for this pcb) or + * - the only unsent segment is at least pcb->mss bytes long (or there is more + * than one unsent segment - with lwIP, this can happen although unsent->len < mss) + * - or if we are in fast-retransmit (TF_INFR) + */ +#define tcp_do_output_nagle(tpcb) ((((tpcb)->unacked == NULL) || \ + ((tpcb)->flags & (TF_NODELAY | TF_INFR)) || \ + (((tpcb)->unsent != NULL) && (((tpcb)->unsent->next != NULL) || \ + ((tpcb)->unsent->len >= (tpcb)->mss))) \ + ) ? 1 : 0) +#define tcp_output_nagle(tpcb) (tcp_do_output_nagle(tpcb) ? tcp_output(tpcb) : ERR_OK) + + +#define TCP_SEQ_LT(a,b) ((s32_t)((a)-(b)) < 0) +#define TCP_SEQ_LEQ(a,b) ((s32_t)((a)-(b)) <= 0) +#define TCP_SEQ_GT(a,b) ((s32_t)((a)-(b)) > 0) +#define TCP_SEQ_GEQ(a,b) ((s32_t)((a)-(b)) >= 0) +/* is b<=a<=c? */ +#if 0 /* see bug #10548 */ +#define TCP_SEQ_BETWEEN(a,b,c) ((c)-(b) >= (a)-(b)) +#endif +#define TCP_SEQ_BETWEEN(a,b,c) (TCP_SEQ_GEQ(a,b) && TCP_SEQ_LEQ(a,c)) +#define TCP_FIN 0x01U +#define TCP_SYN 0x02U +#define TCP_RST 0x04U +#define TCP_PSH 0x08U +#define TCP_ACK 0x10U +#define TCP_URG 0x20U +#define TCP_ECE 0x40U +#define TCP_CWR 0x80U + +#define TCP_FLAGS 0x3fU + +/* Length of the TCP header, excluding options. */ +#define TCP_HLEN 20 + +#ifndef TCP_TMR_INTERVAL +#define TCP_TMR_INTERVAL 250 /* The TCP timer interval in milliseconds. */ +#endif /* TCP_TMR_INTERVAL */ + +#ifndef TCP_FAST_INTERVAL +#define TCP_FAST_INTERVAL TCP_TMR_INTERVAL /* the fine grained timeout in milliseconds */ +#endif /* TCP_FAST_INTERVAL */ + +#ifndef TCP_SLOW_INTERVAL +#define TCP_SLOW_INTERVAL (2*TCP_TMR_INTERVAL) /* the coarse grained timeout in milliseconds */ +#endif /* TCP_SLOW_INTERVAL */ + +#define TCP_FIN_WAIT_TIMEOUT 20000 /* milliseconds */ +#define TCP_SYN_RCVD_TIMEOUT 20000 /* milliseconds */ + +#define TCP_OOSEQ_TIMEOUT 6U /* x RTO */ + +#ifndef TCP_MSL +#define TCP_MSL 60000UL /* The maximum segment lifetime in milliseconds */ +#endif + +/* Keepalive values, compliant with RFC 1122. Don't change this unless you know what you're doing */ +#ifndef TCP_KEEPIDLE_DEFAULT +#define TCP_KEEPIDLE_DEFAULT 7200000UL /* Default KEEPALIVE timer in milliseconds */ +#endif + +#ifndef TCP_KEEPINTVL_DEFAULT +#define TCP_KEEPINTVL_DEFAULT 75000UL /* Default Time between KEEPALIVE probes in milliseconds */ +#endif + +#ifndef TCP_KEEPCNT_DEFAULT +#define TCP_KEEPCNT_DEFAULT 9U /* Default Counter for KEEPALIVE probes */ +#endif + +#define TCP_MAXIDLE TCP_KEEPCNT_DEFAULT * TCP_KEEPINTVL_DEFAULT /* Maximum KEEPALIVE probe time */ + +/* Fields are (of course) in network byte order. + * Some fields are converted to host byte order in tcp_input(). + */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct tcp_hdr { + PACK_STRUCT_FIELD(u16_t src); + PACK_STRUCT_FIELD(u16_t dest); + PACK_STRUCT_FIELD(u32_t seqno); + PACK_STRUCT_FIELD(u32_t ackno); + PACK_STRUCT_FIELD(u16_t _hdrlen_rsvd_flags); + PACK_STRUCT_FIELD(u16_t wnd); + PACK_STRUCT_FIELD(u16_t chksum); + PACK_STRUCT_FIELD(u16_t urgp); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +#define TCPH_OFFSET(phdr) (ntohs((phdr)->_hdrlen_rsvd_flags) >> 8) +#define TCPH_HDRLEN(phdr) (ntohs((phdr)->_hdrlen_rsvd_flags) >> 12) +#define TCPH_FLAGS(phdr) (ntohs((phdr)->_hdrlen_rsvd_flags) & TCP_FLAGS) + +#define TCPH_OFFSET_SET(phdr, offset) (phdr)->_hdrlen_rsvd_flags = htons(((offset) << 8) | TCPH_FLAGS(phdr)) +#define TCPH_HDRLEN_SET(phdr, len) (phdr)->_hdrlen_rsvd_flags = htons(((len) << 12) | TCPH_FLAGS(phdr)) +#define TCPH_FLAGS_SET(phdr, flags) (phdr)->_hdrlen_rsvd_flags = (((phdr)->_hdrlen_rsvd_flags & htons((u16_t)(~(u16_t)(TCP_FLAGS)))) | htons(flags)) +#define TCPH_SET_FLAG(phdr, flags ) (phdr)->_hdrlen_rsvd_flags = ((phdr)->_hdrlen_rsvd_flags | htons(flags)) +#define TCPH_UNSET_FLAG(phdr, flags) (phdr)->_hdrlen_rsvd_flags = htons(ntohs((phdr)->_hdrlen_rsvd_flags) | (TCPH_FLAGS(phdr) & ~(flags)) ) + +#define TCP_TCPLEN(seg) ((seg)->len + ((TCPH_FLAGS((seg)->tcphdr) & (TCP_FIN | TCP_SYN)) != 0)) + +enum tcp_state { + CLOSED = 0, + LISTEN = 1, + SYN_SENT = 2, + SYN_RCVD = 3, + ESTABLISHED = 4, + FIN_WAIT_1 = 5, + FIN_WAIT_2 = 6, + CLOSE_WAIT = 7, + CLOSING = 8, + LAST_ACK = 9, + TIME_WAIT = 10 +}; + +/** Flags used on input processing, not on pcb->flags +*/ +#define TF_RESET (u8_t)0x08U /* Connection was reset. */ +#define TF_CLOSED (u8_t)0x10U /* Connection was sucessfully closed. */ +#define TF_GOT_FIN (u8_t)0x20U /* Connection was closed by the remote end. */ + + +#if LWIP_CALLBACK_API + /* Function to call when a listener has been connected. + * @param arg user-supplied argument (tcp_pcb.callback_arg) + * @param pcb a new tcp_pcb that now is connected + * @param err an error argument (TODO: that is current always ERR_OK?) + * @return ERR_OK: accept the new connection, + * any other err_t abortsthe new connection + */ +#define DEF_ACCEPT_CALLBACK err_t (* accept)(void *arg, struct tcp_pcb *newpcb, err_t err) +#else /* LWIP_CALLBACK_API */ +#define DEF_ACCEPT_CALLBACK +#endif /* LWIP_CALLBACK_API */ + +/** + * members common to struct tcp_pcb and struct tcp_listen_pcb + */ +#define TCP_PCB_COMMON(type) \ + type *next; /* for the linked list */ \ + enum tcp_state state; /* TCP state */ \ + u8_t prio; \ + void *callback_arg; \ + /* ports are in host byte order */ \ + u16_t local_port; \ + /* the accept callback for listen- and normal pcbs, if LWIP_CALLBACK_API */ \ + DEF_ACCEPT_CALLBACK + + +/* the TCP protocol control block */ +struct tcp_pcb { +/** common PCB members */ + IP_PCB; +/** protocol specific PCB members */ + TCP_PCB_COMMON(struct tcp_pcb); + + /* ports are in host byte order */ + u16_t remote_port; + + u8_t flags; +#define TF_ACK_DELAY ((u8_t)0x01U) /* Delayed ACK. */ +#define TF_ACK_NOW ((u8_t)0x02U) /* Immediate ACK. */ +#define TF_INFR ((u8_t)0x04U) /* In fast recovery. */ +#define TF_TIMESTAMP ((u8_t)0x08U) /* Timestamp option enabled */ +#define TF_FIN ((u8_t)0x20U) /* Connection was closed locally (FIN segment enqueued). */ +#define TF_NODELAY ((u8_t)0x40U) /* Disable Nagle algorithm */ +#define TF_NAGLEMEMERR ((u8_t)0x80U) /* nagle enabled, memerr, try to output to prevent delayed ACK to happen */ + + /* the rest of the fields are in host byte order + as we have to do some math with them */ + /* receiver variables */ + u32_t rcv_nxt; /* next seqno expected */ + u16_t rcv_wnd; /* receiver window available */ + u16_t rcv_ann_wnd; /* receiver window to announce */ + u32_t rcv_ann_right_edge; /* announced right edge of window */ + + /* Timers */ + u32_t tmr; + u8_t polltmr, pollinterval; + + /* Retransmission timer. */ + s16_t rtime; + + u16_t mss; /* maximum segment size */ + + /* RTT (round trip time) estimation variables */ + u32_t rttest; /* RTT estimate in 500ms ticks */ + u32_t rtseq; /* sequence number being timed */ + s16_t sa, sv; /* @todo document this */ + + s16_t rto; /* retransmission time-out */ + u8_t nrtx; /* number of retransmissions */ + + /* fast retransmit/recovery */ + u32_t lastack; /* Highest acknowledged seqno. */ + u8_t dupacks; + + /* congestion avoidance/control variables */ + u16_t cwnd; + u16_t ssthresh; + + /* sender variables */ + u32_t snd_nxt; /* next new seqno to be sent */ + u16_t snd_wnd; /* sender window */ + u32_t snd_wl1, snd_wl2; /* Sequence and acknowledgement numbers of last + window update. */ + u32_t snd_lbb; /* Sequence number of next byte to be buffered. */ + + u16_t acked; + + u16_t snd_buf; /* Available buffer space for sending (in bytes). */ +#define TCP_SNDQUEUELEN_OVERFLOW (0xffff-3) + u16_t snd_queuelen; /* Available buffer space for sending (in tcp_segs). */ + + + /* These are ordered by sequence number: */ + struct tcp_seg *unsent; /* Unsent (queued) segments. */ + struct tcp_seg *unacked; /* Sent but unacknowledged segments. */ +#if TCP_QUEUE_OOSEQ + struct tcp_seg *ooseq; /* Received out of sequence segments. */ +#endif /* TCP_QUEUE_OOSEQ */ + + struct pbuf *refused_data; /* Data previously received but not yet taken by upper layer */ + +#if LWIP_CALLBACK_API + /* Function to be called when more send buffer space is available. + * @param arg user-supplied argument (tcp_pcb.callback_arg) + * @param pcb the tcp_pcb which has send buffer space available + * @param space the amount of bytes available + * @return ERR_OK: try to send some data by calling tcp_output + */ + err_t (* sent)(void *arg, struct tcp_pcb *pcb, u16_t space); + + /* Function to be called when (in-sequence) data has arrived. + * @param arg user-supplied argument (tcp_pcb.callback_arg) + * @param pcb the tcp_pcb for which data has arrived + * @param p the packet buffer which arrived + * @param err an error argument (TODO: that is current always ERR_OK?) + * @return ERR_OK: try to send some data by calling tcp_output + */ + err_t (* recv)(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err); + + /* Function to be called when a connection has been set up. + * @param arg user-supplied argument (tcp_pcb.callback_arg) + * @param pcb the tcp_pcb that now is connected + * @param err an error argument (TODO: that is current always ERR_OK?) + * @return value is currently ignored + */ + err_t (* connected)(void *arg, struct tcp_pcb *pcb, err_t err); + + /* Function which is called periodically. + * The period can be adjusted in multiples of the TCP slow timer interval + * by changing tcp_pcb.polltmr. + * @param arg user-supplied argument (tcp_pcb.callback_arg) + * @param pcb the tcp_pcb to poll for + * @return ERR_OK: try to send some data by calling tcp_output + */ + err_t (* poll)(void *arg, struct tcp_pcb *pcb); + + /* Function to be called whenever a fatal error occurs. + * There is no pcb parameter since most of the times, the pcb is + * already deallocated (or there is no pcb) when this function is called. + * @param arg user-supplied argument (tcp_pcb.callback_arg) + * @param err an indication why the error callback is called: + * ERR_ABRT: aborted through tcp_abort or by a TCP timer + * ERR_RST: the connection was reset by the remote host + */ + void (* errf)(void *arg, err_t err); +#endif /* LWIP_CALLBACK_API */ + +#if LWIP_TCP_TIMESTAMPS + u32_t ts_lastacksent; + u32_t ts_recent; +#endif /* LWIP_TCP_TIMESTAMPS */ + + /* idle time before KEEPALIVE is sent */ + u32_t keep_idle; +#if LWIP_TCP_KEEPALIVE + u32_t keep_intvl; + u32_t keep_cnt; +#endif /* LWIP_TCP_KEEPALIVE */ + + /* Persist timer counter */ + u32_t persist_cnt; + /* Persist timer back-off */ + u8_t persist_backoff; + + /* KEEPALIVE counter */ + u8_t keep_cnt_sent; +}; + +struct tcp_pcb_listen { +/* Common members of all PCB types */ + IP_PCB; +/* Protocol specific PCB members */ + TCP_PCB_COMMON(struct tcp_pcb_listen); + +#if TCP_LISTEN_BACKLOG + u8_t backlog; + u8_t accepts_pending; +#endif /* TCP_LISTEN_BACKLOG */ +}; + +#if LWIP_EVENT_API + +enum lwip_event { + LWIP_EVENT_ACCEPT, + LWIP_EVENT_SENT, + LWIP_EVENT_RECV, + LWIP_EVENT_CONNECTED, + LWIP_EVENT_POLL, + LWIP_EVENT_ERR +}; + +err_t lwip_tcp_event(void *arg, struct tcp_pcb *pcb, + enum lwip_event, + struct pbuf *p, + u16_t size, + err_t err); + +#define TCP_EVENT_ACCEPT(pcb,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\ + LWIP_EVENT_ACCEPT, NULL, 0, err) +#define TCP_EVENT_SENT(pcb,space,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\ + LWIP_EVENT_SENT, NULL, space, ERR_OK) +#define TCP_EVENT_RECV(pcb,p,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\ + LWIP_EVENT_RECV, (p), 0, (err)) +#define TCP_EVENT_CONNECTED(pcb,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\ + LWIP_EVENT_CONNECTED, NULL, 0, (err)) +#define TCP_EVENT_POLL(pcb,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\ + LWIP_EVENT_POLL, NULL, 0, ERR_OK) +#define TCP_EVENT_ERR(errf,arg,err) lwip_tcp_event((arg), NULL, \ + LWIP_EVENT_ERR, NULL, 0, (err)) +#else /* LWIP_EVENT_API */ + +#define TCP_EVENT_ACCEPT(pcb,err,ret) \ + do { \ + if((pcb)->accept != NULL) \ + (ret) = (pcb)->accept((pcb)->callback_arg,(pcb),(err)); \ + else (ret) = ERR_OK; \ + } while (0) + +#define TCP_EVENT_SENT(pcb,space,ret) \ + do { \ + if((pcb)->sent != NULL) \ + (ret) = (pcb)->sent((pcb)->callback_arg,(pcb),(space)); \ + else (ret) = ERR_OK; \ + } while (0) + +#define TCP_EVENT_RECV(pcb,p,err,ret) \ + do { \ + if((pcb)->recv != NULL) { \ + (ret) = (pcb)->recv((pcb)->callback_arg,(pcb),(p),(err)); \ + } else { \ + (ret) = tcp_recv_null(NULL, (pcb), (p), (err)); \ + } \ + } while (0) + +#define TCP_EVENT_CONNECTED(pcb,err,ret) \ + do { \ + if((pcb)->connected != NULL) \ + (ret) = (pcb)->connected((pcb)->callback_arg,(pcb),(err)); \ + else (ret) = ERR_OK; \ + } while (0) + +#define TCP_EVENT_POLL(pcb,ret) \ + do { \ + if((pcb)->poll != NULL) \ + (ret) = (pcb)->poll((pcb)->callback_arg,(pcb)); \ + else (ret) = ERR_OK; \ + } while (0) + +#define TCP_EVENT_ERR(errf,arg,err) \ + do { \ + if((errf) != NULL) \ + (errf)((arg),(err)); \ + } while (0) + +#endif /* LWIP_EVENT_API */ + +/* This structure represents a TCP segment on the unsent and unacked queues */ +struct tcp_seg { + struct tcp_seg *next; /* used when putting segements on a queue */ + struct pbuf *p; /* buffer containing data + TCP header */ + void *dataptr; /* pointer to the TCP data in the pbuf */ + u16_t len; /* the TCP length of this segment */ + u8_t flags; +#define TF_SEG_OPTS_MSS (u8_t)0x01U /* Include MSS option. */ +#define TF_SEG_OPTS_TS (u8_t)0x02U /* Include timestamp option. */ + struct tcp_hdr *tcphdr; /* the TCP header */ +}; + +#define LWIP_TCP_OPT_LENGTH(flags) \ + (flags & TF_SEG_OPTS_MSS ? 4 : 0) + \ + (flags & TF_SEG_OPTS_TS ? 12 : 0) + +/** This returns a TCP header option for MSS in an u32_t */ +#define TCP_BUILD_MSS_OPTION(x) (x) = htonl(((u32_t)2 << 24) | \ + ((u32_t)4 << 16) | \ + (((u32_t)TCP_MSS / 256) << 8) | \ + (TCP_MSS & 255)) + +/* Internal functions and global variables: */ +struct tcp_pcb *tcp_pcb_copy(struct tcp_pcb *pcb); +void tcp_pcb_purge(struct tcp_pcb *pcb); +void tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb); + +u8_t tcp_segs_free(struct tcp_seg *seg); +u8_t tcp_seg_free(struct tcp_seg *seg); +struct tcp_seg *tcp_seg_copy(struct tcp_seg *seg); + +#define tcp_ack(pcb) \ + do { \ + if((pcb)->flags & TF_ACK_DELAY) { \ + (pcb)->flags &= ~TF_ACK_DELAY; \ + (pcb)->flags |= TF_ACK_NOW; \ + tcp_output(pcb); \ + } \ + else { \ + (pcb)->flags |= TF_ACK_DELAY; \ + } \ + } while (0) + +#define tcp_ack_now(pcb) \ + do { \ + (pcb)->flags |= TF_ACK_NOW; \ + tcp_output(pcb); \ + } while (0) + +err_t tcp_send_ctrl(struct tcp_pcb *pcb, u8_t flags); +err_t tcp_enqueue(struct tcp_pcb *pcb, void *dataptr, u16_t len, + u8_t flags, u8_t apiflags, u8_t optflags); + +void tcp_rexmit_seg(struct tcp_pcb *pcb, struct tcp_seg *seg); + +void tcp_rst(u32_t seqno, u32_t ackno, + struct ip_addr *local_ip, struct ip_addr *remote_ip, + u16_t local_port, u16_t remote_port); + +u32_t tcp_next_iss(void); + +void tcp_keepalive(struct tcp_pcb *pcb); +void tcp_zero_window_probe(struct tcp_pcb *pcb); + +#if TCP_CALCULATE_EFF_SEND_MSS +u16_t tcp_eff_send_mss(u16_t sendmss, struct ip_addr *addr); +#endif /* TCP_CALCULATE_EFF_SEND_MSS */ + +#if LWIP_CALLBACK_API +err_t tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err); +#endif /* LWIP_CALLBACK_API */ + +extern struct tcp_pcb *tcp_input_pcb; +extern u32_t tcp_ticks; + +const char* tcp_debug_state_str(enum tcp_state s); +#if TCP_DEBUG || TCP_INPUT_DEBUG || TCP_OUTPUT_DEBUG +void tcp_debug_print(struct tcp_hdr *tcphdr); +void tcp_debug_print_flags(u8_t flags); +void tcp_debug_print_state(enum tcp_state s); +void tcp_debug_print_pcbs(void); +s16_t tcp_pcbs_sane(void); +#else +# define tcp_debug_print(tcphdr) +# define tcp_debug_print_flags(flags) +# define tcp_debug_print_state(s) +# define tcp_debug_print_pcbs() +# define tcp_pcbs_sane() 1 +#endif /* TCP_DEBUG */ + +#if NO_SYS +#define tcp_timer_needed() +#else +void tcp_timer_needed(void); +#endif + +/* The TCP PCB lists. */ +union tcp_listen_pcbs_t { /* List of all TCP PCBs in LISTEN state. */ + struct tcp_pcb_listen *listen_pcbs; + struct tcp_pcb *pcbs; +}; +extern union tcp_listen_pcbs_t tcp_listen_pcbs; +extern struct tcp_pcb *tcp_active_pcbs; /* List of all TCP PCBs that are in a + state in which they accept or send + data. */ +extern struct tcp_pcb *tcp_tw_pcbs; /* List of all TCP PCBs in TIME-WAIT. */ + +extern struct tcp_pcb *tcp_tmp_pcb; /* Only used for temporary storage. */ + +/* Axioms about the above lists: + 1) Every TCP PCB that is not CLOSED is in one of the lists. + 2) A PCB is only in one of the lists. + 3) All PCBs in the tcp_listen_pcbs list is in LISTEN state. + 4) All PCBs in the tcp_tw_pcbs list is in TIME-WAIT state. +*/ + +/* Define two macros, TCP_REG and TCP_RMV that registers a TCP PCB + with a PCB list or removes a PCB from a list, respectively. */ +#if 0 +#define TCP_REG(pcbs, npcb) do {\ + LWIP_DEBUGF(TCP_DEBUG, ("TCP_REG %p local port %d\n", npcb, npcb->local_port)); \ + for(tcp_tmp_pcb = *pcbs; \ + tcp_tmp_pcb != NULL; \ + tcp_tmp_pcb = tcp_tmp_pcb->next) { \ + LWIP_ASSERT("TCP_REG: already registered\n", tcp_tmp_pcb != npcb); \ + } \ + LWIP_ASSERT("TCP_REG: pcb->state != CLOSED", npcb->state != CLOSED); \ + npcb->next = *pcbs; \ + LWIP_ASSERT("TCP_REG: npcb->next != npcb", npcb->next != npcb); \ + *(pcbs) = npcb; \ + LWIP_ASSERT("TCP_RMV: tcp_pcbs sane", tcp_pcbs_sane()); \ + tcp_timer_needed(); \ + } while(0) +#define TCP_RMV(pcbs, npcb) do { \ + LWIP_ASSERT("TCP_RMV: pcbs != NULL", *pcbs != NULL); \ + LWIP_DEBUGF(TCP_DEBUG, ("TCP_RMV: removing %p from %p\n", npcb, *pcbs)); \ + if(*pcbs == npcb) { \ + *pcbs = (*pcbs)->next; \ + } else for(tcp_tmp_pcb = *pcbs; tcp_tmp_pcb != NULL; tcp_tmp_pcb = tcp_tmp_pcb->next) { \ + if(tcp_tmp_pcb->next == npcb) { \ + tcp_tmp_pcb->next = npcb->next; \ + break; \ + } \ + } \ + npcb->next = NULL; \ + LWIP_ASSERT("TCP_RMV: tcp_pcbs sane", tcp_pcbs_sane()); \ + LWIP_DEBUGF(TCP_DEBUG, ("TCP_RMV: removed %p from %p\n", npcb, *pcbs)); \ + } while(0) + +#else /* LWIP_DEBUG */ + +#define TCP_REG(pcbs, npcb) \ + do { \ + npcb->next = *pcbs; \ + *(pcbs) = npcb; \ + tcp_timer_needed(); \ + } while (0) + +#define TCP_RMV(pcbs, npcb) \ + do { \ + if(*(pcbs) == npcb) { \ + (*(pcbs)) = (*pcbs)->next; \ + } \ + else { \ + for(tcp_tmp_pcb = *pcbs; \ + tcp_tmp_pcb != NULL; \ + tcp_tmp_pcb = tcp_tmp_pcb->next) { \ + if(tcp_tmp_pcb->next == npcb) { \ + tcp_tmp_pcb->next = npcb->next; \ + break; \ + } \ + } \ + } \ + npcb->next = NULL; \ + } while(0) + +#endif /* LWIP_DEBUG */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_TCP */ + +#endif /* __LWIP_TCP_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/tcpip.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/tcpip.h new file mode 100644 index 0000000..00a3ec5 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/tcpip.h @@ -0,0 +1,143 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_TCPIP_H__ +#define __LWIP_TCPIP_H__ + +#include "lwip/opt.h" + +#if !NO_SYS /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/api_msg.h" +#include "lwip/netifapi.h" +#include "lwip/pbuf.h" +#include "lwip/api.h" +#include "lwip/sys.h" +#include "lwip/netif.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if LWIP_TCPIP_CORE_LOCKING +/** The global semaphore to lock the stack. */ +extern sys_sem_t lock_tcpip_core; +#define LOCK_TCPIP_CORE() sys_sem_wait(lock_tcpip_core) +#define UNLOCK_TCPIP_CORE() sys_sem_signal(lock_tcpip_core) +#define TCPIP_APIMSG(m) tcpip_apimsg_lock(m) +#define TCPIP_APIMSG_ACK(m) +#define TCPIP_NETIFAPI(m) tcpip_netifapi_lock(m) +#define TCPIP_NETIFAPI_ACK(m) +#else +#define LOCK_TCPIP_CORE() +#define UNLOCK_TCPIP_CORE() +#define TCPIP_APIMSG(m) tcpip_apimsg(m) +#define TCPIP_APIMSG_ACK(m) sys_sem_signal(m->conn->op_completed) +#define TCPIP_NETIFAPI(m) tcpip_netifapi(m) +#define TCPIP_NETIFAPI_ACK(m) sys_sem_signal(m->sem) +#endif /* LWIP_TCPIP_CORE_LOCKING */ + +void tcpip_init(void (* tcpip_init_done)(void *), void *arg); + +#if LWIP_NETCONN +err_t tcpip_apimsg(struct api_msg *apimsg); +#if LWIP_TCPIP_CORE_LOCKING +err_t tcpip_apimsg_lock(struct api_msg *apimsg); +#endif /* LWIP_TCPIP_CORE_LOCKING */ +#endif /* LWIP_NETCONN */ + +err_t tcpip_input(struct pbuf *p, struct netif *inp); + +#if LWIP_NETIF_API +err_t tcpip_netifapi(struct netifapi_msg *netifapimsg); +#if LWIP_TCPIP_CORE_LOCKING +err_t tcpip_netifapi_lock(struct netifapi_msg *netifapimsg); +#endif /* LWIP_TCPIP_CORE_LOCKING */ +#endif /* LWIP_NETIF_API */ + +err_t tcpip_callback_with_block(void (*f)(void *ctx), void *ctx, u8_t block); +#define tcpip_callback(f, ctx) tcpip_callback_with_block(f, ctx, 1) + +/* free pbufs or heap memory from another context without blocking */ +err_t pbuf_free_callback(struct pbuf *p); +err_t mem_free_callback(void *m); + +err_t tcpip_timeout(u32_t msecs, sys_timeout_handler h, void *arg); +err_t tcpip_untimeout(sys_timeout_handler h, void *arg); + +enum tcpip_msg_type { +#if LWIP_NETCONN + TCPIP_MSG_API, +#endif /* LWIP_NETCONN */ + TCPIP_MSG_INPKT, +#if LWIP_NETIF_API + TCPIP_MSG_NETIFAPI, +#endif /* LWIP_NETIF_API */ + TCPIP_MSG_CALLBACK, + TCPIP_MSG_TIMEOUT, + TCPIP_MSG_UNTIMEOUT +}; + +struct tcpip_msg { + enum tcpip_msg_type type; + sys_sem_t *sem; + union { +#if LWIP_NETCONN + struct api_msg *apimsg; +#endif /* LWIP_NETCONN */ +#if LWIP_NETIF_API + struct netifapi_msg *netifapimsg; +#endif /* LWIP_NETIF_API */ + struct { + struct pbuf *p; + struct netif *netif; + } inp; + struct { + void (*f)(void *ctx); + void *ctx; + } cb; + struct { + u32_t msecs; + sys_timeout_handler h; + void *arg; + } tmo; + } msg; +}; + +#ifdef __cplusplus +} +#endif + +#endif /* !NO_SYS */ + +#endif /* __LWIP_TCPIP_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/udp.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/udp.h new file mode 100644 index 0000000..1269ee1 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/lwip/udp.h @@ -0,0 +1,155 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_UDP_H__ +#define __LWIP_UDP_H__ + +#include "lwip/opt.h" + +#if LWIP_UDP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/pbuf.h" +#include "lwip/netif.h" +#include "lwip/ip_addr.h" +#include "lwip/ip.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define UDP_HLEN 8 + +/* Fields are (of course) in network byte order. */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct udp_hdr { + PACK_STRUCT_FIELD(u16_t src); + PACK_STRUCT_FIELD(u16_t dest); /* src/dest UDP ports */ + PACK_STRUCT_FIELD(u16_t len); + PACK_STRUCT_FIELD(u16_t chksum); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +#define UDP_FLAGS_NOCHKSUM 0x01U +#define UDP_FLAGS_UDPLITE 0x02U +#define UDP_FLAGS_CONNECTED 0x04U + +struct udp_pcb { +/* Common members of all PCB types */ + IP_PCB; + +/* Protocol specific PCB members */ + + struct udp_pcb *next; + + u8_t flags; + /* ports are in host byte order */ + u16_t local_port, remote_port; + +#if LWIP_IGMP + /* outgoing network interface for multicast packets */ + struct ip_addr multicast_ip; +#endif /* LWIP_IGMP */ + +#if LWIP_UDPLITE + /* used for UDP_LITE only */ + u16_t chksum_len_rx, chksum_len_tx; +#endif /* LWIP_UDPLITE */ + + /* receive callback function + * addr and port are in same byte order as in the pcb + * The callback is responsible for freeing the pbuf + * if it's not used any more. + * + * ATTENTION: Be aware that 'addr' points into the pbuf 'p' so freeing this pbuf + * makes 'addr' invalid, too. + * + * @param arg user supplied argument (udp_pcb.recv_arg) + * @param pcb the udp_pcb which received data + * @param p the packet buffer that was received + * @param addr the remote IP address from which the packet was received + * @param port the remote port from which the packet was received + */ + void (* recv)(void *arg, struct udp_pcb *pcb, struct pbuf *p, + struct ip_addr *addr, u16_t port); + /* user-supplied argument for the recv callback */ + void *recv_arg; +}; +/* udp_pcbs export for exernal reference (e.g. SNMP agent) */ +extern struct udp_pcb *udp_pcbs; + +/* The following functions is the application layer interface to the + UDP code. */ +struct udp_pcb * udp_new (void); +void udp_remove (struct udp_pcb *pcb); +err_t udp_bind (struct udp_pcb *pcb, struct ip_addr *ipaddr, + u16_t port); +err_t udp_connect (struct udp_pcb *pcb, struct ip_addr *ipaddr, + u16_t port); +void udp_disconnect (struct udp_pcb *pcb); +void udp_recv (struct udp_pcb *pcb, + void (* recv)(void *arg, struct udp_pcb *upcb, + struct pbuf *p, + struct ip_addr *addr, + u16_t port), + void *recv_arg); +err_t udp_sendto_if (struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *dst_ip, u16_t dst_port, struct netif *netif); +err_t udp_sendto (struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *dst_ip, u16_t dst_port); +err_t udp_send (struct udp_pcb *pcb, struct pbuf *p); + +#define udp_flags(pcb) ((pcb)->flags) +#define udp_setflags(pcb, f) ((pcb)->flags = (f)) + +/* The following functions are the lower layer interface to UDP. */ +void udp_input (struct pbuf *p, struct netif *inp); + +#define udp_init() /* Compatibility define, not init needed. */ + +#if UDP_DEBUG +void udp_debug_print(struct udp_hdr *udphdr); +#else +#define udp_debug_print(udphdr) +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_UDP */ + +#endif /* __LWIP_UDP_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/netif/etharp.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/netif/etharp.h new file mode 100644 index 0000000..fb1542a --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/netif/etharp.h @@ -0,0 +1,194 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * Copyright (c) 2003-2004 Leon Woestenberg + * Copyright (c) 2003-2004 Axon Digital Design B.V., The Netherlands. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#ifndef __NETIF_ETHARP_H__ +#define __NETIF_ETHARP_H__ + +#include "lwip/opt.h" + +#if LWIP_ARP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/pbuf.h" +#include "lwip/ip_addr.h" +#include "lwip/netif.h" +#include "lwip/ip.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef ETH_PAD_SIZE +#define ETH_PAD_SIZE 0 +#endif + +#ifndef ETHARP_HWADDR_LEN +#define ETHARP_HWADDR_LEN 6 +#endif + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct eth_addr { + PACK_STRUCT_FIELD(u8_t addr[ETHARP_HWADDR_LEN]); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct eth_hdr { +#if ETH_PAD_SIZE + PACK_STRUCT_FIELD(u8_t padding[ETH_PAD_SIZE]); +#endif + PACK_STRUCT_FIELD(struct eth_addr dest); + PACK_STRUCT_FIELD(struct eth_addr src); + PACK_STRUCT_FIELD(u16_t type); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +#define SIZEOF_ETH_HDR (14 + ETH_PAD_SIZE) + +#if ETHARP_SUPPORT_VLAN + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct eth_vlan_hdr { + PACK_STRUCT_FIELD(u16_t tpid); + PACK_STRUCT_FIELD(u16_t prio_vid); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +#define SIZEOF_VLAN_HDR 4 +#define VLAN_ID(vlan_hdr) (htons((vlan_hdr)->prio_vid) & 0xFFF) + +#endif /* ETHARP_SUPPORT_VLAN */ + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +/** the ARP message */ +struct etharp_hdr { + PACK_STRUCT_FIELD(u16_t hwtype); + PACK_STRUCT_FIELD(u16_t proto); + PACK_STRUCT_FIELD(u16_t _hwlen_protolen); + PACK_STRUCT_FIELD(u16_t opcode); + PACK_STRUCT_FIELD(struct eth_addr shwaddr); + PACK_STRUCT_FIELD(struct ip_addr2 sipaddr); + PACK_STRUCT_FIELD(struct eth_addr dhwaddr); + PACK_STRUCT_FIELD(struct ip_addr2 dipaddr); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +#define SIZEOF_ETHARP_HDR 28 +#define SIZEOF_ETHARP_PACKET (SIZEOF_ETH_HDR + SIZEOF_ETHARP_HDR) + +/** 5 seconds period */ +#define ARP_TMR_INTERVAL 5000 + +#define ETHTYPE_ARP 0x0806 +#define ETHTYPE_IP 0x0800 +#define ETHTYPE_VLAN 0x8100 +#define ETHTYPE_PPPOEDISC 0x8863 /* PPP Over Ethernet Discovery Stage */ +#define ETHTYPE_PPPOE 0x8864 /* PPP Over Ethernet Session Stage */ + +/** ARP message types (opcodes) */ +#define ARP_REQUEST 1 +#define ARP_REPLY 2 + +#if ARP_QUEUEING +/** struct for queueing outgoing packets for unknown address + * defined here to be accessed by memp.h + */ +struct etharp_q_entry { + struct etharp_q_entry *next; + struct pbuf *p; +}; +#endif /* ARP_QUEUEING */ + +#define etharp_init() /* Compatibility define, not init needed. */ +void etharp_tmr(void); +s8_t etharp_find_addr(struct netif *netif, struct ip_addr *ipaddr, + struct eth_addr **eth_ret, struct ip_addr **ip_ret); +void etharp_ip_input(struct netif *netif, struct pbuf *p); +void etharp_arp_input(struct netif *netif, struct eth_addr *ethaddr, + struct pbuf *p); +err_t etharp_output(struct netif *netif, struct pbuf *q, struct ip_addr *ipaddr); +err_t etharp_query(struct netif *netif, struct ip_addr *ipaddr, struct pbuf *q); +err_t etharp_request(struct netif *netif, struct ip_addr *ipaddr); +/** For Ethernet network interfaces, we might want to send "gratuitous ARP"; + * this is an ARP packet sent by a node in order to spontaneously cause other + * nodes to update an entry in their ARP cache. + * From RFC 3220 "IP Mobility Support for IPv4" section 4.6. */ +#define etharp_gratuitous(netif) etharp_request((netif), &(netif)->ip_addr) + +err_t ethernet_input(struct pbuf *p, struct netif *netif); + +#if LWIP_AUTOIP +err_t etharp_raw(struct netif *netif, const struct eth_addr *ethsrc_addr, + const struct eth_addr *ethdst_addr, + const struct eth_addr *hwsrc_addr, const struct ip_addr *ipsrc_addr, + const struct eth_addr *hwdst_addr, const struct ip_addr *ipdst_addr, + const u16_t opcode); +#endif /* LWIP_AUTOIP */ + +#define eth_addr_cmp(addr1, addr2) (memcmp((addr1)->addr, (addr2)->addr, ETHARP_HWADDR_LEN) == 0) + +extern const struct eth_addr ethbroadcast, ethzero; + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_ARP */ + +#endif /* __NETIF_ARP_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/netif/loopif.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/netif/loopif.h new file mode 100644 index 0000000..3f4fa62 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/netif/loopif.h @@ -0,0 +1,55 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __NETIF_LOOPIF_H__ +#define __NETIF_LOOPIF_H__ + +#include "lwip/opt.h" +#include "lwip/netif.h" +#include "lwip/err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if !LWIP_NETIF_LOOPBACK_MULTITHREADING +#define loopif_poll netif_poll +#endif /* !LWIP_NETIF_LOOPBACK_MULTITHREADING */ + +err_t loopif_init(struct netif *netif); + +#ifdef __cplusplus +} +#endif + +#endif /* __NETIF_LOOPIF_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/netif/ppp_oe.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/netif/ppp_oe.h new file mode 100644 index 0000000..fac0a78 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/netif/ppp_oe.h @@ -0,0 +1,163 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/***************************************************************************** +* ppp_oe.h - PPP Over Ethernet implementation for lwIP. +* +* Copyright (c) 2006 by Marc Boucher, Services Informatiques (MBSI) inc. +* +* The authors hereby grant permission to use, copy, modify, distribute, +* and license this software and its documentation for any purpose, provided +* that existing copyright notices are retained in all copies and that this +* notice and the following disclaimer are included verbatim in any +* distributions. No written agreement, license, or royalty fee is required +* for any of the authorized uses. +* +* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +****************************************************************************** +* REVISION HISTORY +* +* 06-01-01 Marc Boucher +* Ported to lwIP. +*****************************************************************************/ + + + +/* based on NetBSD: if_pppoe.c,v 1.64 2006/01/31 23:50:15 martin Exp */ + +/*- + * Copyright (c) 2002 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Martin Husemann . + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef PPP_OE_H +#define PPP_OE_H + +#include "lwip/opt.h" + +#if PPPOE_SUPPORT > 0 + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct pppoehdr { + PACK_STRUCT_FIELD(u8_t vertype); + PACK_STRUCT_FIELD(u8_t code); + PACK_STRUCT_FIELD(u16_t session); + PACK_STRUCT_FIELD(u16_t plen); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct pppoetag { + PACK_STRUCT_FIELD(u16_t tag); + PACK_STRUCT_FIELD(u16_t len); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + + +#define PPPOE_STATE_INITIAL 0 +#define PPPOE_STATE_PADI_SENT 1 +#define PPPOE_STATE_PADR_SENT 2 +#define PPPOE_STATE_SESSION 3 +#define PPPOE_STATE_CLOSING 4 +/* passive */ +#define PPPOE_STATE_PADO_SENT 1 + +#define PPPOE_HEADERLEN sizeof(struct pppoehdr) +#define PPPOE_VERTYPE 0x11 /* VER=1, TYPE = 1 */ + +#define PPPOE_TAG_EOL 0x0000 /* end of list */ +#define PPPOE_TAG_SNAME 0x0101 /* service name */ +#define PPPOE_TAG_ACNAME 0x0102 /* access concentrator name */ +#define PPPOE_TAG_HUNIQUE 0x0103 /* host unique */ +#define PPPOE_TAG_ACCOOKIE 0x0104 /* AC cookie */ +#define PPPOE_TAG_VENDOR 0x0105 /* vendor specific */ +#define PPPOE_TAG_RELAYSID 0x0110 /* relay session id */ +#define PPPOE_TAG_SNAME_ERR 0x0201 /* service name error */ +#define PPPOE_TAG_ACSYS_ERR 0x0202 /* AC system error */ +#define PPPOE_TAG_GENERIC_ERR 0x0203 /* gerneric error */ + +#define PPPOE_CODE_PADI 0x09 /* Active Discovery Initiation */ +#define PPPOE_CODE_PADO 0x07 /* Active Discovery Offer */ +#define PPPOE_CODE_PADR 0x19 /* Active Discovery Request */ +#define PPPOE_CODE_PADS 0x65 /* Active Discovery Session confirmation */ +#define PPPOE_CODE_PADT 0xA7 /* Active Discovery Terminate */ + +#ifndef ETHERMTU +#define ETHERMTU 1500 +#endif + +/* two byte PPP protocol discriminator, then IP data */ +#define PPPOE_MAXMTU (ETHERMTU-PPPOE_HEADERLEN-2) + +struct pppoe_softc; + + +void pppoe_init(void); + +err_t pppoe_create(struct netif *ethif, int pd, void (*linkStatusCB)(int pd, int up), struct pppoe_softc **scptr); +err_t pppoe_destroy(struct netif *ifp); + +int pppoe_connect(struct pppoe_softc *sc); +void pppoe_disconnect(struct pppoe_softc *sc); + +void pppoe_disc_input(struct netif *netif, struct pbuf *p); +void pppoe_data_input(struct netif *netif, struct pbuf *p); + +err_t pppoe_xmit(struct pppoe_softc *sc, struct pbuf *pb); + +extern int pppoe_hdrlen; + +#endif /* PPPOE_SUPPORT */ + +#endif /* PPP_OE_H */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/netif/slipif.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/netif/slipif.h new file mode 100644 index 0000000..ddc2dfa --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/netif/slipif.h @@ -0,0 +1,53 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __NETIF_SLIPIF_H__ +#define __NETIF_SLIPIF_H__ + +#include "lwip/netif.h" + +#ifdef __cplusplus +extern "C" { +#endif + +err_t slipif_init(struct netif * netif); +void slipif_poll(struct netif *netif); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/netif/etharp.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/netif/etharp.c new file mode 100644 index 0000000..1a5d134 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/netif/etharp.c @@ -0,0 +1,1224 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/** + * @file + * Address Resolution Protocol module for IP over Ethernet + * + * Functionally, ARP is divided into two parts. The first maps an IP address + * to a physical address when sending a packet, and the second part answers + * requests from other machines for our physical address. + * + * This implementation complies with RFC 826 (Ethernet ARP). It supports + * Gratuitious ARP from RFC3220 (IP Mobility Support for IPv4) section 4.6 + * if an interface calls etharp_gratuitous(our_netif) upon address change. + */ + +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * Copyright (c) 2003-2004 Leon Woestenberg + * Copyright (c) 2003-2004 Axon Digital Design B.V., The Netherlands. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + */ + +#include "lwip/opt.h" + +#if LWIP_ARP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/inet.h" +#include "lwip/ip.h" +#include "lwip/stats.h" +#include "lwip/snmp.h" +#include "lwip/dhcp.h" +#include "lwip/autoip.h" +#include "netif/etharp.h" + +#if PPPOE_SUPPORT +#include "netif/ppp_oe.h" +#endif /* PPPOE_SUPPORT */ + +#include + +/** the time an ARP entry stays valid after its last update, + * for ARP_TMR_INTERVAL = 5000, this is + * (240 * 5) seconds = 20 minutes. + */ +#define ARP_MAXAGE 240 +/** the time an ARP entry stays pending after first request, + * for ARP_TMR_INTERVAL = 5000, this is + * (2 * 5) seconds = 10 seconds. + * + * @internal Keep this number at least 2, otherwise it might + * run out instantly if the timeout occurs directly after a request. + */ +#define ARP_MAXPENDING 2 + +#define HWTYPE_ETHERNET 1 + +#define ARPH_HWLEN(hdr) (ntohs((hdr)->_hwlen_protolen) >> 8) +#define ARPH_PROTOLEN(hdr) (ntohs((hdr)->_hwlen_protolen) & 0xff) + +#define ARPH_HWLEN_SET(hdr, len) (hdr)->_hwlen_protolen = htons(ARPH_PROTOLEN(hdr) | ((len) << 8)) +#define ARPH_PROTOLEN_SET(hdr, len) (hdr)->_hwlen_protolen = htons((len) | (ARPH_HWLEN(hdr) << 8)) + +enum etharp_state { + ETHARP_STATE_EMPTY = 0, + ETHARP_STATE_PENDING, + ETHARP_STATE_STABLE +}; + +struct etharp_entry { +#if ARP_QUEUEING + /** + * Pointer to queue of pending outgoing packets on this ARP entry. + */ + struct etharp_q_entry *q; +#endif + struct ip_addr ipaddr; + struct eth_addr ethaddr; + enum etharp_state state; + u8_t ctime; + struct netif *netif; +}; + +const struct eth_addr ethbroadcast = {{0xff,0xff,0xff,0xff,0xff,0xff}}; +const struct eth_addr ethzero = {{0,0,0,0,0,0}}; +static struct etharp_entry arp_table[ARP_TABLE_SIZE]; +#if !LWIP_NETIF_HWADDRHINT +static u8_t etharp_cached_entry; +#endif + +/** + * Try hard to create a new entry - we want the IP address to appear in + * the cache (even if this means removing an active entry or so). */ +#define ETHARP_TRY_HARD 1 +#define ETHARP_FIND_ONLY 2 + +#if LWIP_NETIF_HWADDRHINT +#define NETIF_SET_HINT(netif, hint) if (((netif) != NULL) && ((netif)->addr_hint != NULL)) \ + *((netif)->addr_hint) = (hint); +static s8_t find_entry(struct ip_addr *ipaddr, u8_t flags, struct netif *netif); +#else /* LWIP_NETIF_HWADDRHINT */ +static s8_t find_entry(struct ip_addr *ipaddr, u8_t flags); +#endif /* LWIP_NETIF_HWADDRHINT */ + +static err_t update_arp_entry(struct netif *netif, struct ip_addr *ipaddr, struct eth_addr *ethaddr, u8_t flags); + + +/* Some checks, instead of etharp_init(): */ +#if (LWIP_ARP && (ARP_TABLE_SIZE > 0x7f)) + #error "If you want to use ARP, ARP_TABLE_SIZE must fit in an s8_t, so, you have to reduce it in your lwipopts.h" +#endif + + +#if ARP_QUEUEING +/** + * Free a complete queue of etharp entries + * + * @param q a qeueue of etharp_q_entry's to free + */ +static void +free_etharp_q(struct etharp_q_entry *q) +{ + struct etharp_q_entry *r; + LWIP_ASSERT("q != NULL", q != NULL); + LWIP_ASSERT("q->p != NULL", q->p != NULL); + while (q) { + r = q; + q = q->next; + LWIP_ASSERT("r->p != NULL", (r->p != NULL)); + pbuf_free(r->p); + memp_free(MEMP_ARP_QUEUE, r); + } +} +#endif + +/** + * Clears expired entries in the ARP table. + * + * This function should be called every ETHARP_TMR_INTERVAL microseconds (5 seconds), + * in order to expire entries in the ARP table. + */ +void +etharp_tmr(void) +{ + u8_t i; + + LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer\n")); + /* remove expired entries from the ARP table */ + for (i = 0; i < ARP_TABLE_SIZE; ++i) { + arp_table[i].ctime++; + if (((arp_table[i].state == ETHARP_STATE_STABLE) && + (arp_table[i].ctime >= ARP_MAXAGE)) || + ((arp_table[i].state == ETHARP_STATE_PENDING) && + (arp_table[i].ctime >= ARP_MAXPENDING))) { + /* pending or stable entry has become old! */ + LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer: expired %s entry %"U16_F".\n", + arp_table[i].state == ETHARP_STATE_STABLE ? "stable" : "pending", (u16_t)i)); + /* clean up entries that have just been expired */ + /* remove from SNMP ARP index tree */ + snmp_delete_arpidx_tree(arp_table[i].netif, &arp_table[i].ipaddr); +#if ARP_QUEUEING + /* and empty packet queue */ + if (arp_table[i].q != NULL) { + /* remove all queued packets */ + LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer: freeing entry %"U16_F", packet queue %p.\n", (u16_t)i, (void *)(arp_table[i].q))); + free_etharp_q(arp_table[i].q); + arp_table[i].q = NULL; + } +#endif + /* recycle entry for re-use */ + arp_table[i].state = ETHARP_STATE_EMPTY; + } +#if ARP_QUEUEING + /* still pending entry? (not expired) */ + if (arp_table[i].state == ETHARP_STATE_PENDING) { + /* resend an ARP query here? */ + } +#endif + } +} + +/** + * Search the ARP table for a matching or new entry. + * + * If an IP address is given, return a pending or stable ARP entry that matches + * the address. If no match is found, create a new entry with this address set, + * but in state ETHARP_EMPTY. The caller must check and possibly change the + * state of the returned entry. + * + * If ipaddr is NULL, return a initialized new entry in state ETHARP_EMPTY. + * + * In all cases, attempt to create new entries from an empty entry. If no + * empty entries are available and ETHARP_TRY_HARD flag is set, recycle + * old entries. Heuristic choose the least important entry for recycling. + * + * @param ipaddr IP address to find in ARP cache, or to add if not found. + * @param flags + * - ETHARP_TRY_HARD: Try hard to create a entry by allowing recycling of + * active (stable or pending) entries. + * + * @return The ARP entry index that matched or is created, ERR_MEM if no + * entry is found or could be recycled. + */ +static s8_t +#if LWIP_NETIF_HWADDRHINT +find_entry(struct ip_addr *ipaddr, u8_t flags, struct netif *netif) +#else /* LWIP_NETIF_HWADDRHINT */ +find_entry(struct ip_addr *ipaddr, u8_t flags) +#endif /* LWIP_NETIF_HWADDRHINT */ +{ + s8_t old_pending = ARP_TABLE_SIZE, old_stable = ARP_TABLE_SIZE; + s8_t empty = ARP_TABLE_SIZE; + u8_t i = 0, age_pending = 0, age_stable = 0; +#if ARP_QUEUEING + /* oldest entry with packets on queue */ + s8_t old_queue = ARP_TABLE_SIZE; + /* its age */ + u8_t age_queue = 0; +#endif + + /* First, test if the last call to this function asked for the + * same address. If so, we're really fast! */ + if (ipaddr) { + /* ipaddr to search for was given */ +#if LWIP_NETIF_HWADDRHINT + if ((netif != NULL) && (netif->addr_hint != NULL)) { + /* per-pcb cached entry was given */ + u8_t per_pcb_cache = *(netif->addr_hint); + if ((per_pcb_cache < ARP_TABLE_SIZE) && arp_table[per_pcb_cache].state == ETHARP_STATE_STABLE) { + /* the per-pcb-cached entry is stable */ + if (ip_addr_cmp(ipaddr, &arp_table[per_pcb_cache].ipaddr)) { + /* per-pcb cached entry was the right one! */ + ETHARP_STATS_INC(etharp.cachehit); + return per_pcb_cache; + } + } + } +#else /* #if LWIP_NETIF_HWADDRHINT */ + if (arp_table[etharp_cached_entry].state == ETHARP_STATE_STABLE) { + /* the cached entry is stable */ + if (ip_addr_cmp(ipaddr, &arp_table[etharp_cached_entry].ipaddr)) { + /* cached entry was the right one! */ + ETHARP_STATS_INC(etharp.cachehit); + return etharp_cached_entry; + } + } +#endif /* #if LWIP_NETIF_HWADDRHINT */ + } + + /** + * a) do a search through the cache, remember candidates + * b) select candidate entry + * c) create new entry + */ + + /* a) in a single search sweep, do all of this + * 1) remember the first empty entry (if any) + * 2) remember the oldest stable entry (if any) + * 3) remember the oldest pending entry without queued packets (if any) + * 4) remember the oldest pending entry with queued packets (if any) + * 5) search for a matching IP entry, either pending or stable + * until 5 matches, or all entries are searched for. + */ + + for (i = 0; i < ARP_TABLE_SIZE; ++i) { + /* no empty entry found yet and now we do find one? */ + if ((empty == ARP_TABLE_SIZE) && (arp_table[i].state == ETHARP_STATE_EMPTY)) { + LWIP_DEBUGF(ETHARP_DEBUG, ("find_entry: found empty entry %"U16_F"\n", (u16_t)i)); + /* remember first empty entry */ + empty = i; + } + /* pending entry? */ + else if (arp_table[i].state == ETHARP_STATE_PENDING) { + /* if given, does IP address match IP address in ARP entry? */ + if (ipaddr && ip_addr_cmp(ipaddr, &arp_table[i].ipaddr)) { + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("find_entry: found matching pending entry %"U16_F"\n", (u16_t)i)); + /* found exact IP address match, simply bail out */ +#if LWIP_NETIF_HWADDRHINT + NETIF_SET_HINT(netif, i); +#else /* #if LWIP_NETIF_HWADDRHINT */ + etharp_cached_entry = i; +#endif /* #if LWIP_NETIF_HWADDRHINT */ + return i; +#if ARP_QUEUEING + /* pending with queued packets? */ + } else if (arp_table[i].q != NULL) { + if (arp_table[i].ctime >= age_queue) { + old_queue = i; + age_queue = arp_table[i].ctime; + } +#endif + /* pending without queued packets? */ + } else { + if (arp_table[i].ctime >= age_pending) { + old_pending = i; + age_pending = arp_table[i].ctime; + } + } + } + /* stable entry? */ + else if (arp_table[i].state == ETHARP_STATE_STABLE) { + /* if given, does IP address match IP address in ARP entry? */ + if (ipaddr && ip_addr_cmp(ipaddr, &arp_table[i].ipaddr)) { + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("find_entry: found matching stable entry %"U16_F"\n", (u16_t)i)); + /* found exact IP address match, simply bail out */ +#if LWIP_NETIF_HWADDRHINT + NETIF_SET_HINT(netif, i); +#else /* #if LWIP_NETIF_HWADDRHINT */ + etharp_cached_entry = i; +#endif /* #if LWIP_NETIF_HWADDRHINT */ + return i; + /* remember entry with oldest stable entry in oldest, its age in maxtime */ + } else if (arp_table[i].ctime >= age_stable) { + old_stable = i; + age_stable = arp_table[i].ctime; + } + } + } + /* { we have no match } => try to create a new entry */ + + /* no empty entry found and not allowed to recycle? */ + if (((empty == ARP_TABLE_SIZE) && ((flags & ETHARP_TRY_HARD) == 0)) + /* or don't create new entry, only search? */ + || ((flags & ETHARP_FIND_ONLY) != 0)) { + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("find_entry: no empty entry found and not allowed to recycle\n")); + return (s8_t)ERR_MEM; + } + + /* b) choose the least destructive entry to recycle: + * 1) empty entry + * 2) oldest stable entry + * 3) oldest pending entry without queued packets + * 4) oldest pending entry with queued packets + * + * { ETHARP_TRY_HARD is set at this point } + */ + + /* 1) empty entry available? */ + if (empty < ARP_TABLE_SIZE) { + i = empty; + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("find_entry: selecting empty entry %"U16_F"\n", (u16_t)i)); + } + /* 2) found recyclable stable entry? */ + else if (old_stable < ARP_TABLE_SIZE) { + /* recycle oldest stable*/ + i = old_stable; + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("find_entry: selecting oldest stable entry %"U16_F"\n", (u16_t)i)); +#if ARP_QUEUEING + /* no queued packets should exist on stable entries */ + LWIP_ASSERT("arp_table[i].q == NULL", arp_table[i].q == NULL); +#endif + /* 3) found recyclable pending entry without queued packets? */ + } else if (old_pending < ARP_TABLE_SIZE) { + /* recycle oldest pending */ + i = old_pending; + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("find_entry: selecting oldest pending entry %"U16_F" (without queue)\n", (u16_t)i)); +#if ARP_QUEUEING + /* 4) found recyclable pending entry with queued packets? */ + } else if (old_queue < ARP_TABLE_SIZE) { + /* recycle oldest pending */ + i = old_queue; + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("find_entry: selecting oldest pending entry %"U16_F", freeing packet queue %p\n", (u16_t)i, (void *)(arp_table[i].q))); + free_etharp_q(arp_table[i].q); + arp_table[i].q = NULL; +#endif + /* no empty or recyclable entries found */ + } else { + return (s8_t)ERR_MEM; + } + + /* { empty or recyclable entry found } */ + LWIP_ASSERT("i < ARP_TABLE_SIZE", i < ARP_TABLE_SIZE); + + if (arp_table[i].state != ETHARP_STATE_EMPTY) + { + snmp_delete_arpidx_tree(arp_table[i].netif, &arp_table[i].ipaddr); + } + /* recycle entry (no-op for an already empty entry) */ + arp_table[i].state = ETHARP_STATE_EMPTY; + + /* IP address given? */ + if (ipaddr != NULL) { + /* set IP address */ + ip_addr_set(&arp_table[i].ipaddr, ipaddr); + } + arp_table[i].ctime = 0; +#if LWIP_NETIF_HWADDRHINT + NETIF_SET_HINT(netif, i); +#else /* #if LWIP_NETIF_HWADDRHINT */ + etharp_cached_entry = i; +#endif /* #if LWIP_NETIF_HWADDRHINT */ + return (err_t)i; +} + +/** + * Send an IP packet on the network using netif->linkoutput + * The ethernet header is filled in before sending. + * + * @params netif the lwIP network interface on which to send the packet + * @params p the packet to send, p->payload pointing to the (uninitialized) ethernet header + * @params src the source MAC address to be copied into the ethernet header + * @params dst the destination MAC address to be copied into the ethernet header + * @return ERR_OK if the packet was sent, any other err_t on failure + */ +static err_t +etharp_send_ip(struct netif *netif, struct pbuf *p, struct eth_addr *src, struct eth_addr *dst) +{ + struct eth_hdr *ethhdr = p->payload; + u8_t k; + + LWIP_ASSERT("netif->hwaddr_len must be the same as ETHARP_HWADDR_LEN for etharp!", + (netif->hwaddr_len == ETHARP_HWADDR_LEN)); + k = ETHARP_HWADDR_LEN; + while(k > 0) { + k--; + ethhdr->dest.addr[k] = dst->addr[k]; + ethhdr->src.addr[k] = src->addr[k]; + } + ethhdr->type = htons(ETHTYPE_IP); + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_send_ip: sending packet %p\n", (void *)p)); + /* send the packet */ + return netif->linkoutput(netif, p); +} + +/** + * Update (or insert) a IP/MAC address pair in the ARP cache. + * + * If a pending entry is resolved, any queued packets will be sent + * at this point. + * + * @param ipaddr IP address of the inserted ARP entry. + * @param ethaddr Ethernet address of the inserted ARP entry. + * @param flags Defines behaviour: + * - ETHARP_TRY_HARD Allows ARP to insert this as a new item. If not specified, + * only existing ARP entries will be updated. + * + * @return + * - ERR_OK Succesfully updated ARP cache. + * - ERR_MEM If we could not add a new ARP entry when ETHARP_TRY_HARD was set. + * - ERR_ARG Non-unicast address given, those will not appear in ARP cache. + * + * @see pbuf_free() + */ +static err_t +update_arp_entry(struct netif *netif, struct ip_addr *ipaddr, struct eth_addr *ethaddr, u8_t flags) +{ + s8_t i; + u8_t k; + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("update_arp_entry()\n")); + LWIP_ASSERT("netif->hwaddr_len == ETHARP_HWADDR_LEN", netif->hwaddr_len == ETHARP_HWADDR_LEN); + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("update_arp_entry: %"U16_F".%"U16_F".%"U16_F".%"U16_F" - %02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F"\n", + ip4_addr1(ipaddr), ip4_addr2(ipaddr), ip4_addr3(ipaddr), ip4_addr4(ipaddr), + ethaddr->addr[0], ethaddr->addr[1], ethaddr->addr[2], + ethaddr->addr[3], ethaddr->addr[4], ethaddr->addr[5])); + /* non-unicast address? */ + if (ip_addr_isany(ipaddr) || + ip_addr_isbroadcast(ipaddr, netif) || + ip_addr_ismulticast(ipaddr)) { + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("update_arp_entry: will not add non-unicast IP address to ARP cache\n")); + return ERR_ARG; + } + /* find or create ARP entry */ +#if LWIP_NETIF_HWADDRHINT + i = find_entry(ipaddr, flags, netif); +#else /* LWIP_NETIF_HWADDRHINT */ + i = find_entry(ipaddr, flags); +#endif /* LWIP_NETIF_HWADDRHINT */ + /* bail out if no entry could be found */ + if (i < 0) + return (err_t)i; + + /* mark it stable */ + arp_table[i].state = ETHARP_STATE_STABLE; + /* record network interface */ + arp_table[i].netif = netif; + + /* insert in SNMP ARP index tree */ + snmp_insert_arpidx_tree(netif, &arp_table[i].ipaddr); + + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("update_arp_entry: updating stable entry %"S16_F"\n", (s16_t)i)); + /* update address */ + k = ETHARP_HWADDR_LEN; + while (k > 0) { + k--; + arp_table[i].ethaddr.addr[k] = ethaddr->addr[k]; + } + /* reset time stamp */ + arp_table[i].ctime = 0; +#if ARP_QUEUEING + /* this is where we will send out queued packets! */ + while (arp_table[i].q != NULL) { + struct pbuf *p; + /* remember remainder of queue */ + struct etharp_q_entry *q = arp_table[i].q; + /* pop first item off the queue */ + arp_table[i].q = q->next; + /* get the packet pointer */ + p = q->p; + /* now queue entry can be freed */ + memp_free(MEMP_ARP_QUEUE, q); + /* send the queued IP packet */ + etharp_send_ip(netif, p, (struct eth_addr*)(netif->hwaddr), ethaddr); + /* free the queued IP packet */ + pbuf_free(p); + } +#endif + return ERR_OK; +} + +/** + * Finds (stable) ethernet/IP address pair from ARP table + * using interface and IP address index. + * @note the addresses in the ARP table are in network order! + * + * @param netif points to interface index + * @param ipaddr points to the (network order) IP address index + * @param eth_ret points to return pointer + * @param ip_ret points to return pointer + * @return table index if found, -1 otherwise + */ +s8_t +etharp_find_addr(struct netif *netif, struct ip_addr *ipaddr, + struct eth_addr **eth_ret, struct ip_addr **ip_ret) +{ + s8_t i; + + LWIP_UNUSED_ARG(netif); + +#if LWIP_NETIF_HWADDRHINT + i = find_entry(ipaddr, ETHARP_FIND_ONLY, NULL); +#else /* LWIP_NETIF_HWADDRHINT */ + i = find_entry(ipaddr, ETHARP_FIND_ONLY); +#endif /* LWIP_NETIF_HWADDRHINT */ + if((i >= 0) && arp_table[i].state == ETHARP_STATE_STABLE) { + *eth_ret = &arp_table[i].ethaddr; + *ip_ret = &arp_table[i].ipaddr; + return i; + } + return -1; +} + +/** + * Updates the ARP table using the given IP packet. + * + * Uses the incoming IP packet's source address to update the + * ARP cache for the local network. The function does not alter + * or free the packet. This function must be called before the + * packet p is passed to the IP layer. + * + * @param netif The lwIP network interface on which the IP packet pbuf arrived. + * @param p The IP packet that arrived on netif. + * + * @return NULL + * + * @see pbuf_free() + */ +void +etharp_ip_input(struct netif *netif, struct pbuf *p) +{ + struct eth_hdr *ethhdr; + struct ip_hdr *iphdr; + LWIP_ERROR("netif != NULL", (netif != NULL), return;); + /* Only insert an entry if the source IP address of the + incoming IP packet comes from a host on the local network. */ + ethhdr = p->payload; + iphdr = (struct ip_hdr *)((u8_t*)ethhdr + SIZEOF_ETH_HDR); +#if ETHARP_SUPPORT_VLAN + if (ethhdr->type == ETHTYPE_VLAN) { + iphdr = (struct ip_hdr *)((u8_t*)ethhdr + SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR); + } +#endif /* ETHARP_SUPPORT_VLAN */ + + /* source is not on the local network? */ + if (!ip_addr_netcmp(&(iphdr->src), &(netif->ip_addr), &(netif->netmask))) { + /* do nothing */ + return; + } + + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_ip_input: updating ETHARP table.\n")); + /* update ARP table */ + /* @todo We could use ETHARP_TRY_HARD if we think we are going to talk + * back soon (for example, if the destination IP address is ours. */ + update_arp_entry(netif, &(iphdr->src), &(ethhdr->src), 0); +} + + +/** + * Responds to ARP requests to us. Upon ARP replies to us, add entry to cache + * send out queued IP packets. Updates cache with snooped address pairs. + * + * Should be called for incoming ARP packets. The pbuf in the argument + * is freed by this function. + * + * @param netif The lwIP network interface on which the ARP packet pbuf arrived. + * @param ethaddr Ethernet address of netif. + * @param p The ARP packet that arrived on netif. Is freed by this function. + * + * @return NULL + * + * @see pbuf_free() + */ +void +etharp_arp_input(struct netif *netif, struct eth_addr *ethaddr, struct pbuf *p) +{ + struct etharp_hdr *hdr; + struct eth_hdr *ethhdr; + /* these are aligned properly, whereas the ARP header fields might not be */ + struct ip_addr sipaddr, dipaddr; + u8_t i; + u8_t for_us; +#if LWIP_AUTOIP + const u8_t * ethdst_hwaddr; +#endif /* LWIP_AUTOIP */ + + LWIP_ERROR("netif != NULL", (netif != NULL), return;); + + /* drop short ARP packets: we have to check for p->len instead of p->tot_len here + since a struct etharp_hdr is pointed to p->payload, so it musn't be chained! */ + if (p->len < SIZEOF_ETHARP_PACKET) { + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, + ("etharp_arp_input: packet dropped, too short (%"S16_F"/%"S16_F")\n", p->tot_len, + (s16_t)SIZEOF_ETHARP_PACKET)); + ETHARP_STATS_INC(etharp.lenerr); + ETHARP_STATS_INC(etharp.drop); + pbuf_free(p); + return; + } + + ethhdr = p->payload; + hdr = (struct etharp_hdr *)((u8_t*)ethhdr + SIZEOF_ETH_HDR); +#if ETHARP_SUPPORT_VLAN + if (ethhdr->type == ETHTYPE_VLAN) { + hdr = (struct etharp_hdr *)(((u8_t*)ethhdr) + SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR); + } +#endif /* ETHARP_SUPPORT_VLAN */ + + /* RFC 826 "Packet Reception": */ + if ((hdr->hwtype != htons(HWTYPE_ETHERNET)) || + (hdr->_hwlen_protolen != htons((ETHARP_HWADDR_LEN << 8) | sizeof(struct ip_addr))) || + (hdr->proto != htons(ETHTYPE_IP)) || + (ethhdr->type != htons(ETHTYPE_ARP))) { + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, + ("etharp_arp_input: packet dropped, wrong hw type, hwlen, proto, protolen or ethernet type (%"U16_F"/%"U16_F"/%"U16_F"/%"U16_F"/%"U16_F")\n", + hdr->hwtype, ARPH_HWLEN(hdr), hdr->proto, ARPH_PROTOLEN(hdr), ethhdr->type)); + ETHARP_STATS_INC(etharp.proterr); + ETHARP_STATS_INC(etharp.drop); + pbuf_free(p); + return; + } + ETHARP_STATS_INC(etharp.recv); + +#if LWIP_AUTOIP + /* We have to check if a host already has configured our random + * created link local address and continously check if there is + * a host with this IP-address so we can detect collisions */ + autoip_arp_reply(netif, hdr); +#endif /* LWIP_AUTOIP */ + + /* Copy struct ip_addr2 to aligned ip_addr, to support compilers without + * structure packing (not using structure copy which breaks strict-aliasing rules). */ + SMEMCPY(&sipaddr, &hdr->sipaddr, sizeof(sipaddr)); + SMEMCPY(&dipaddr, &hdr->dipaddr, sizeof(dipaddr)); + + /* this interface is not configured? */ + if (netif->ip_addr.addr == 0) { + for_us = 0; + } else { + /* ARP packet directed to us? */ + for_us = ip_addr_cmp(&dipaddr, &(netif->ip_addr)); + } + + /* ARP message directed to us? */ + if (for_us) { + /* add IP address in ARP cache; assume requester wants to talk to us. + * can result in directly sending the queued packets for this host. */ + update_arp_entry(netif, &sipaddr, &(hdr->shwaddr), ETHARP_TRY_HARD); + /* ARP message not directed to us? */ + } else { + /* update the source IP address in the cache, if present */ + update_arp_entry(netif, &sipaddr, &(hdr->shwaddr), 0); + } + + /* now act on the message itself */ + switch (htons(hdr->opcode)) { + /* ARP request? */ + case ARP_REQUEST: + /* ARP request. If it asked for our address, we send out a + * reply. In any case, we time-stamp any existing ARP entry, + * and possiby send out an IP packet that was queued on it. */ + + LWIP_DEBUGF (ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_arp_input: incoming ARP request\n")); + /* ARP request for our address? */ + if (for_us) { + + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_arp_input: replying to ARP request for our IP address\n")); + /* Re-use pbuf to send ARP reply. + Since we are re-using an existing pbuf, we can't call etharp_raw since + that would allocate a new pbuf. */ + hdr->opcode = htons(ARP_REPLY); + + hdr->dipaddr = hdr->sipaddr; + SMEMCPY(&hdr->sipaddr, &netif->ip_addr, sizeof(hdr->sipaddr)); + + LWIP_ASSERT("netif->hwaddr_len must be the same as ETHARP_HWADDR_LEN for etharp!", + (netif->hwaddr_len == ETHARP_HWADDR_LEN)); + i = ETHARP_HWADDR_LEN; +#if LWIP_AUTOIP + /* If we are using Link-Local, ARP packets must be broadcast on the + * link layer. (See RFC3927 Section 2.5) */ + ethdst_hwaddr = ((netif->autoip != NULL) && (netif->autoip->state != AUTOIP_STATE_OFF)) ? (u8_t*)(ethbroadcast.addr) : hdr->shwaddr.addr; +#endif /* LWIP_AUTOIP */ + + while(i > 0) { + i--; + hdr->dhwaddr.addr[i] = hdr->shwaddr.addr[i]; +#if LWIP_AUTOIP + ethhdr->dest.addr[i] = ethdst_hwaddr[i]; +#else /* LWIP_AUTOIP */ + ethhdr->dest.addr[i] = hdr->shwaddr.addr[i]; +#endif /* LWIP_AUTOIP */ + hdr->shwaddr.addr[i] = ethaddr->addr[i]; + ethhdr->src.addr[i] = ethaddr->addr[i]; + } + + /* hwtype, hwaddr_len, proto, protolen and the type in the ethernet header + are already correct, we tested that before */ + + /* return ARP reply */ + netif->linkoutput(netif, p); + /* we are not configured? */ + } else if (netif->ip_addr.addr == 0) { + /* { for_us == 0 and netif->ip_addr.addr == 0 } */ + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_arp_input: we are unconfigured, ARP request ignored.\n")); + /* request was not directed to us */ + } else { + /* { for_us == 0 and netif->ip_addr.addr != 0 } */ + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_arp_input: ARP request was not for us.\n")); + } + break; + case ARP_REPLY: + /* ARP reply. We already updated the ARP cache earlier. */ + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_arp_input: incoming ARP reply\n")); +#if (LWIP_DHCP && DHCP_DOES_ARP_CHECK) + /* DHCP wants to know about ARP replies from any host with an + * IP address also offered to us by the DHCP server. We do not + * want to take a duplicate IP address on a single network. + * @todo How should we handle redundant (fail-over) interfaces? */ + dhcp_arp_reply(netif, &sipaddr); +#endif + break; + default: + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_arp_input: ARP unknown opcode type %"S16_F"\n", htons(hdr->opcode))); + ETHARP_STATS_INC(etharp.err); + break; + } + /* free ARP packet */ + pbuf_free(p); +} + +/** + * Resolve and fill-in Ethernet address header for outgoing IP packet. + * + * For IP multicast and broadcast, corresponding Ethernet addresses + * are selected and the packet is transmitted on the link. + * + * For unicast addresses, the packet is submitted to etharp_query(). In + * case the IP address is outside the local network, the IP address of + * the gateway is used. + * + * @param netif The lwIP network interface which the IP packet will be sent on. + * @param q The pbuf(s) containing the IP packet to be sent. + * @param ipaddr The IP address of the packet destination. + * + * @return + * - ERR_RTE No route to destination (no gateway to external networks), + * or the return type of either etharp_query() or etharp_send_ip(). + */ +err_t +etharp_output(struct netif *netif, struct pbuf *q, struct ip_addr *ipaddr) +{ + struct eth_addr *dest, mcastaddr; + + /* make room for Ethernet header - should not fail */ + if (pbuf_header(q, sizeof(struct eth_hdr)) != 0) { + /* bail out */ + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, + ("etharp_output: could not allocate room for header.\n")); + LINK_STATS_INC(link.lenerr); + return ERR_BUF; + } + + /* assume unresolved Ethernet address */ + dest = NULL; + /* Determine on destination hardware address. Broadcasts and multicasts + * are special, other IP addresses are looked up in the ARP table. */ + + /* broadcast destination IP address? */ + if (ip_addr_isbroadcast(ipaddr, netif)) { + /* broadcast on Ethernet also */ + dest = (struct eth_addr *)ðbroadcast; + /* multicast destination IP address? */ + } else if (ip_addr_ismulticast(ipaddr)) { + /* Hash IP multicast address to MAC address.*/ + mcastaddr.addr[0] = 0x01; + mcastaddr.addr[1] = 0x00; + mcastaddr.addr[2] = 0x5e; + mcastaddr.addr[3] = ip4_addr2(ipaddr) & 0x7f; + mcastaddr.addr[4] = ip4_addr3(ipaddr); + mcastaddr.addr[5] = ip4_addr4(ipaddr); + /* destination Ethernet address is multicast */ + dest = &mcastaddr; + /* unicast destination IP address? */ + } else { + /* outside local network? */ + if (!ip_addr_netcmp(ipaddr, &(netif->ip_addr), &(netif->netmask))) { + /* interface has default gateway? */ + if (netif->gw.addr != 0) { + /* send to hardware address of default gateway IP address */ + ipaddr = &(netif->gw); + /* no default gateway available */ + } else { + /* no route to destination error (default gateway missing) */ + return ERR_RTE; + } + } + /* queue on destination Ethernet address belonging to ipaddr */ + return etharp_query(netif, ipaddr, q); + } + + /* continuation for multicast/broadcast destinations */ + /* obtain source Ethernet address of the given interface */ + /* send packet directly on the link */ + return etharp_send_ip(netif, q, (struct eth_addr*)(netif->hwaddr), dest); +} + +/** + * Send an ARP request for the given IP address and/or queue a packet. + * + * If the IP address was not yet in the cache, a pending ARP cache entry + * is added and an ARP request is sent for the given address. The packet + * is queued on this entry. + * + * If the IP address was already pending in the cache, a new ARP request + * is sent for the given address. The packet is queued on this entry. + * + * If the IP address was already stable in the cache, and a packet is + * given, it is directly sent and no ARP request is sent out. + * + * If the IP address was already stable in the cache, and no packet is + * given, an ARP request is sent out. + * + * @param netif The lwIP network interface on which ipaddr + * must be queried for. + * @param ipaddr The IP address to be resolved. + * @param q If non-NULL, a pbuf that must be delivered to the IP address. + * q is not freed by this function. + * + * @note q must only be ONE packet, not a packet queue! + * + * @return + * - ERR_BUF Could not make room for Ethernet header. + * - ERR_MEM Hardware address unknown, and no more ARP entries available + * to query for address or queue the packet. + * - ERR_MEM Could not queue packet due to memory shortage. + * - ERR_RTE No route to destination (no gateway to external networks). + * - ERR_ARG Non-unicast address given, those will not appear in ARP cache. + * + */ +err_t +etharp_query(struct netif *netif, struct ip_addr *ipaddr, struct pbuf *q) +{ + struct eth_addr * srcaddr = (struct eth_addr *)netif->hwaddr; + err_t result = ERR_MEM; + s8_t i; /* ARP entry index */ + + /* non-unicast address? */ + if (ip_addr_isbroadcast(ipaddr, netif) || + ip_addr_ismulticast(ipaddr) || + ip_addr_isany(ipaddr)) { + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: will not add non-unicast IP address to ARP cache\n")); + return ERR_ARG; + } + + /* find entry in ARP cache, ask to create entry if queueing packet */ +#if LWIP_NETIF_HWADDRHINT + i = find_entry(ipaddr, ETHARP_TRY_HARD, netif); +#else /* LWIP_NETIF_HWADDRHINT */ + i = find_entry(ipaddr, ETHARP_TRY_HARD); +#endif /* LWIP_NETIF_HWADDRHINT */ + + /* could not find or create entry? */ + if (i < 0) { + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: could not create ARP entry\n")); + if (q) { + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: packet dropped\n")); + ETHARP_STATS_INC(etharp.memerr); + } + return (err_t)i; + } + + /* mark a fresh entry as pending (we just sent a request) */ + if (arp_table[i].state == ETHARP_STATE_EMPTY) { + arp_table[i].state = ETHARP_STATE_PENDING; + } + + /* { i is either a STABLE or (new or existing) PENDING entry } */ + LWIP_ASSERT("arp_table[i].state == PENDING or STABLE", + ((arp_table[i].state == ETHARP_STATE_PENDING) || + (arp_table[i].state == ETHARP_STATE_STABLE))); + + /* do we have a pending entry? or an implicit query request? */ + if ((arp_table[i].state == ETHARP_STATE_PENDING) || (q == NULL)) { + /* try to resolve it; send out ARP request */ + result = etharp_request(netif, ipaddr); + if (result != ERR_OK) { + /* ARP request couldn't be sent */ + /* We don't re-send arp request in etharp_tmr, but we still queue packets, + since this failure could be temporary, and the next packet calling + etharp_query again could lead to sending the queued packets. */ + } + } + + /* packet given? */ + if (q != NULL) { + /* stable entry? */ + if (arp_table[i].state == ETHARP_STATE_STABLE) { + /* we have a valid IP->Ethernet address mapping */ + /* send the packet */ + result = etharp_send_ip(netif, q, srcaddr, &(arp_table[i].ethaddr)); + /* pending entry? (either just created or already pending */ + } else if (arp_table[i].state == ETHARP_STATE_PENDING) { +#if ARP_QUEUEING /* queue the given q packet */ + struct pbuf *p; + int copy_needed = 0; + /* IF q includes a PBUF_REF, PBUF_POOL or PBUF_RAM, we have no choice but + * to copy the whole queue into a new PBUF_RAM (see bug #11400) + * PBUF_ROMs can be left as they are, since ROM must not get changed. */ + p = q; + while (p) { + LWIP_ASSERT("no packet queues allowed!", (p->len != p->tot_len) || (p->next == 0)); + if(p->type != PBUF_ROM) { + copy_needed = 1; + break; + } + p = p->next; + } + if(copy_needed) { + /* copy the whole packet into new pbufs */ + p = pbuf_alloc(PBUF_RAW, p->tot_len, PBUF_RAM); + if(p != NULL) { + if (pbuf_copy(p, q) != ERR_OK) { + pbuf_free(p); + p = NULL; + } + } + } else { + /* referencing the old pbuf is enough */ + p = q; + pbuf_ref(p); + } + /* packet could be taken over? */ + if (p != NULL) { + /* queue packet ... */ + struct etharp_q_entry *new_entry; + /* allocate a new arp queue entry */ + new_entry = memp_malloc(MEMP_ARP_QUEUE); + if (new_entry != NULL) { + new_entry->next = 0; + new_entry->p = p; + if(arp_table[i].q != NULL) { + /* queue was already existent, append the new entry to the end */ + struct etharp_q_entry *r; + r = arp_table[i].q; + while (r->next != NULL) { + r = r->next; + } + r->next = new_entry; + } else { + /* queue did not exist, first item in queue */ + arp_table[i].q = new_entry; + } + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: queued packet %p on ARP entry %"S16_F"\n", (void *)q, (s16_t)i)); + result = ERR_OK; + } else { + /* the pool MEMP_ARP_QUEUE is empty */ + pbuf_free(p); + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: could not queue a copy of PBUF_REF packet %p (out of memory)\n", (void *)q)); + /* { result == ERR_MEM } through initialization */ + } + } else { + ETHARP_STATS_INC(etharp.memerr); + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: could not queue a copy of PBUF_REF packet %p (out of memory)\n", (void *)q)); + /* { result == ERR_MEM } through initialization */ + } +#else /* ARP_QUEUEING == 0 */ + /* q && state == PENDING && ARP_QUEUEING == 0 => result = ERR_MEM */ + /* { result == ERR_MEM } through initialization */ + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: Ethernet destination address unknown, queueing disabled, packet %p dropped\n", (void *)q)); +#endif + } + } + return result; +} + +/** + * Send a raw ARP packet (opcode and all addresses can be modified) + * + * @param netif the lwip network interface on which to send the ARP packet + * @param ethsrc_addr the source MAC address for the ethernet header + * @param ethdst_addr the destination MAC address for the ethernet header + * @param hwsrc_addr the source MAC address for the ARP protocol header + * @param ipsrc_addr the source IP address for the ARP protocol header + * @param hwdst_addr the destination MAC address for the ARP protocol header + * @param ipdst_addr the destination IP address for the ARP protocol header + * @param opcode the type of the ARP packet + * @return ERR_OK if the ARP packet has been sent + * ERR_MEM if the ARP packet couldn't be allocated + * any other err_t on failure + */ +#if !LWIP_AUTOIP +static +#endif /* LWIP_AUTOIP */ +err_t +etharp_raw(struct netif *netif, const struct eth_addr *ethsrc_addr, + const struct eth_addr *ethdst_addr, + const struct eth_addr *hwsrc_addr, const struct ip_addr *ipsrc_addr, + const struct eth_addr *hwdst_addr, const struct ip_addr *ipdst_addr, + const u16_t opcode) +{ + struct pbuf *p; + err_t result = ERR_OK; + u8_t k; /* ARP entry index */ + struct eth_hdr *ethhdr; + struct etharp_hdr *hdr; +#if LWIP_AUTOIP + const u8_t * ethdst_hwaddr; +#endif /* LWIP_AUTOIP */ + + /* allocate a pbuf for the outgoing ARP request packet */ + p = pbuf_alloc(PBUF_RAW, SIZEOF_ETHARP_PACKET, PBUF_RAM); + /* could allocate a pbuf for an ARP request? */ + if (p == NULL) { + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, + ("etharp_raw: could not allocate pbuf for ARP request.\n")); + ETHARP_STATS_INC(etharp.memerr); + return ERR_MEM; + } + LWIP_ASSERT("check that first pbuf can hold struct etharp_hdr", + (p->len >= SIZEOF_ETHARP_PACKET)); + + ethhdr = p->payload; + hdr = (struct etharp_hdr *)((u8_t*)ethhdr + SIZEOF_ETH_HDR); + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_raw: sending raw ARP packet.\n")); + hdr->opcode = htons(opcode); + + LWIP_ASSERT("netif->hwaddr_len must be the same as ETHARP_HWADDR_LEN for etharp!", + (netif->hwaddr_len == ETHARP_HWADDR_LEN)); + k = ETHARP_HWADDR_LEN; +#if LWIP_AUTOIP + /* If we are using Link-Local, ARP packets must be broadcast on the + * link layer. (See RFC3927 Section 2.5) */ + ethdst_hwaddr = ((netif->autoip != NULL) && (netif->autoip->state != AUTOIP_STATE_OFF)) ? (u8_t*)(ethbroadcast.addr) : ethdst_addr->addr; +#endif /* LWIP_AUTOIP */ + /* Write MAC-Addresses (combined loop for both headers) */ + while(k > 0) { + k--; + /* Write the ARP MAC-Addresses */ + hdr->shwaddr.addr[k] = hwsrc_addr->addr[k]; + hdr->dhwaddr.addr[k] = hwdst_addr->addr[k]; + /* Write the Ethernet MAC-Addresses */ +#if LWIP_AUTOIP + ethhdr->dest.addr[k] = ethdst_hwaddr[k]; +#else /* LWIP_AUTOIP */ + ethhdr->dest.addr[k] = ethdst_addr->addr[k]; +#endif /* LWIP_AUTOIP */ + ethhdr->src.addr[k] = ethsrc_addr->addr[k]; + } + hdr->sipaddr = *(struct ip_addr2 *)ipsrc_addr; + hdr->dipaddr = *(struct ip_addr2 *)ipdst_addr; + + hdr->hwtype = htons(HWTYPE_ETHERNET); + hdr->proto = htons(ETHTYPE_IP); + /* set hwlen and protolen together */ + hdr->_hwlen_protolen = htons((ETHARP_HWADDR_LEN << 8) | sizeof(struct ip_addr)); + + ethhdr->type = htons(ETHTYPE_ARP); + /* send ARP query */ + result = netif->linkoutput(netif, p); + ETHARP_STATS_INC(etharp.xmit); + /* free ARP query packet */ + pbuf_free(p); + p = NULL; + /* could not allocate pbuf for ARP request */ + + return result; +} + +/** + * Send an ARP request packet asking for ipaddr. + * + * @param netif the lwip network interface on which to send the request + * @param ipaddr the IP address for which to ask + * @return ERR_OK if the request has been sent + * ERR_MEM if the ARP packet couldn't be allocated + * any other err_t on failure + */ +err_t +etharp_request(struct netif *netif, struct ip_addr *ipaddr) +{ + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_request: sending ARP request.\n")); + return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, ðbroadcast, + (struct eth_addr *)netif->hwaddr, &netif->ip_addr, ðzero, + ipaddr, ARP_REQUEST); +} + +/** + * Process received ethernet frames. Using this function instead of directly + * calling ip_input and passing ARP frames through etharp in ethernetif_input, + * the ARP cache is protected from concurrent access. + * + * @param p the recevied packet, p->payload pointing to the ethernet header + * @param netif the network interface on which the packet was received + */ +err_t +ethernet_input(struct pbuf *p, struct netif *netif) +{ + struct eth_hdr* ethhdr; + u16_t type; + + /* points to packet payload, which starts with an Ethernet header */ + ethhdr = p->payload; + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, + ("ethernet_input: dest:%02x:%02x:%02x:%02x:%02x:%02x, src:%02x:%02x:%02x:%02x:%02x:%02x, type:%2hx\n", + (unsigned)ethhdr->dest.addr[0], (unsigned)ethhdr->dest.addr[1], (unsigned)ethhdr->dest.addr[2], + (unsigned)ethhdr->dest.addr[3], (unsigned)ethhdr->dest.addr[4], (unsigned)ethhdr->dest.addr[5], + (unsigned)ethhdr->src.addr[0], (unsigned)ethhdr->src.addr[1], (unsigned)ethhdr->src.addr[2], + (unsigned)ethhdr->src.addr[3], (unsigned)ethhdr->src.addr[4], (unsigned)ethhdr->src.addr[5], + (unsigned)htons(ethhdr->type))); + + type = htons(ethhdr->type); +#if ETHARP_SUPPORT_VLAN + if (type == ETHTYPE_VLAN) { + struct eth_vlan_hdr *vlan = (struct eth_vlan_hdr*)(((char*)ethhdr) + SIZEOF_ETH_HDR); +#ifdef ETHARP_VLAN_CHECK /* if not, allow all VLANs */ + if (VLAN_ID(vlan) != ETHARP_VLAN_CHECK) { + /* silently ignore this packet: not for our VLAN */ + pbuf_free(p); + return ERR_OK; + } +#endif /* ETHARP_VLAN_CHECK */ + type = htons(vlan->tpid); + } +#endif /* ETHARP_SUPPORT_VLAN */ + + switch (type) { + /* IP packet? */ + case ETHTYPE_IP: +#if ETHARP_TRUST_IP_MAC + /* update ARP table */ + etharp_ip_input(netif, p); +#endif /* ETHARP_TRUST_IP_MAC */ + /* skip Ethernet header */ + if(pbuf_header(p, -(s16_t)SIZEOF_ETH_HDR)) { + LWIP_ASSERT("Can't move over header in packet", 0); + pbuf_free(p); + p = NULL; + } else { + /* pass to IP layer */ + ip_input(p, netif); + } + break; + + case ETHTYPE_ARP: + /* pass p to ARP module */ + etharp_arp_input(netif, (struct eth_addr*)(netif->hwaddr), p); + break; + +#if PPPOE_SUPPORT + case ETHTYPE_PPPOEDISC: /* PPP Over Ethernet Discovery Stage */ + pppoe_disc_input(netif, p); + break; + + case ETHTYPE_PPPOE: /* PPP Over Ethernet Session Stage */ + pppoe_data_input(netif, p); + break; +#endif /* PPPOE_SUPPORT */ + + default: + ETHARP_STATS_INC(etharp.proterr); + ETHARP_STATS_INC(etharp.drop); + pbuf_free(p); + p = NULL; + break; + } + + /* This means the pbuf is freed or consumed, + so the caller doesn't have to free it again */ + return ERR_OK; +} +#endif /* LWIP_ARP */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/netif/loopif.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/netif/loopif.c new file mode 100644 index 0000000..b7d6632 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/netif/loopif.c @@ -0,0 +1,68 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/** + * @file + * Loop Interface + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#include "lwip/opt.h" + +#if LWIP_HAVE_LOOPIF + +#include "netif/loopif.h" +#include "lwip/snmp.h" + +/** + * Initialize a lwip network interface structure for a loopback interface + * + * @param netif the lwip network interface structure for this loopif + * @return ERR_OK if the loopif is initialized + * ERR_MEM if private data couldn't be allocated + */ +err_t +loopif_init(struct netif *netif) +{ + /* initialize the snmp variables and counters inside the struct netif + * ifSpeed: no assumption can be made! + */ + NETIF_INIT_SNMP(netif, snmp_ifType_softwareLoopback, 0); + + netif->name[0] = 'l'; + netif->name[1] = 'o'; + netif->output = netif_loop_output; + return ERR_OK; +} + +#endif /* LWIP_HAVE_LOOPIF */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/include/arch/cc.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/include/arch/cc.h new file mode 100644 index 0000000..fc9c07d --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/include/arch/cc.h @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __ARCH_CC_H__ +#define __ARCH_CC_H__ + +/* Define platform endianness */ +#ifndef BYTE_ORDER +#define BYTE_ORDER BIG_ENDIAN +#endif /* BYTE_ORDER */ + +/* Define generic types used in lwIP */ +typedef unsigned char u8_t; +typedef signed char s8_t; +typedef unsigned short u16_t; +typedef signed short s16_t; +typedef unsigned long u32_t; +typedef signed long s32_t; + +typedef u32_t mem_ptr_t; + +/* Define (sn)printf formatters for these lwIP types */ +#define U16_F "u" +#define S16_F "d" +#define X16_F "x" +#define U32_F "u" +#define S32_F "d" +#define X32_F "x" + +/* Compiler hints for packing structures */ +#define PACK_STRUCT_FIELD(x) x +#define PACK_STRUCT_STRUCT __attribute__((packed)) +#define PACK_STRUCT_BEGIN +#define PACK_STRUCT_END + +/* Plaform specific diagnostic output */ +#ifdef CONFIG_OWL +# include +# define LWIP_PLATFORM_DIAG(x) owl_printf x +# define LWIP_PLATFORM_ASSERT(x) owl_assert(x) +#else +# include +# define LWIP_PLATFORM_DIAG(x) do { printk x; } while(0) +# define LWIP_PLATFORM_ASSERT(x) do { \ + printk("Assertion \"%s\" failed at line " \ + "%d in %s\n", \ + x, __LINE__, __FILE__); while(1); \ + } while(0) +#endif + +#endif /* __ARCH_CC_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/include/arch/perf.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/include/arch/perf.h new file mode 100644 index 0000000..4991787 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/include/arch/perf.h @@ -0,0 +1,7 @@ +#ifndef __PERF_H__ +#define __PERF_H__ + +#define PERF_START /* null definition */ +#define PERF_STOP(x) /* null definition */ + +#endif diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/include/lwipopts.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/include/lwipopts.h new file mode 100644 index 0000000..ae4df23 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/include/lwipopts.h @@ -0,0 +1,426 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/** + * @file + * + * lwIP Options Configuration + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIPOPTS_H__ +#define __LWIPOPTS_H__ + +#include "wl_api.h" + +/* + ----------------------------------------------- + ---------- Platform specific locking ---------- + ----------------------------------------------- +*/ + +/** + * NO_SYS==1: Provides VERY minimal functionality. Otherwise, + * use lwIP facilities. + */ +#define NO_SYS 1 + + +/* + ------------------------------------ + ---------- Memory options ---------- + ------------------------------------ +*/ +/** + * MEM_ALIGNMENT: should be set to the alignment of the CPU + * 4 byte alignment -> #define MEM_ALIGNMENT 4 + * 2 byte alignment -> #define MEM_ALIGNMENT 2 + */ +#define MEM_ALIGNMENT 4 + +/** + * MEM_SIZE: the size of the heap memory. If the application will send + * a lot of data that needs to be copied, this should be set high. + */ +#define MEM_SIZE 16000 + + +/* + ------------------------------------------------ + ---------- Internal Memory Pool Sizes ---------- + ------------------------------------------------ +*/ +/** + * MEMP_NUM_PBUF: the number of memp struct pbufs (used for PBUF_ROM and PBUF_REF). + * If the application sends a lot of data out of ROM (or other static memory), + * this should be set high. + */ +#define MEMP_NUM_PBUF 30 + +/** + * MEMP_NUM_RAW_PCB: Number of raw connection PCBs + * (requires the LWIP_RAW option) + */ +#define MEMP_NUM_RAW_PCB 4 + +/** + * MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One + * per active UDP "connection". + * (requires the LWIP_UDP option) + */ +#define MEMP_NUM_UDP_PCB 4 + +/** + * MEMP_NUM_TCP_PCB: the number of simulatenously active TCP connections. + * (requires the LWIP_TCP option) + */ +#define MEMP_NUM_TCP_PCB 2 + +/** + * MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP connections. + * (requires the LWIP_TCP option) + */ +#define MEMP_NUM_TCP_PCB_LISTEN 2 + +/** + * MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP segments. + * (requires the LWIP_TCP option) + */ +#define MEMP_NUM_TCP_SEG 32 + +/** + * MEMP_NUM_ARP_QUEUE: the number of simulateously queued outgoing + * packets (pbufs) that are waiting for an ARP request (to resolve + * their destination address) to finish. + * (requires the ARP_QUEUEING option) + */ +#define MEMP_NUM_ARP_QUEUE 2 + +/** + * MEMP_NUM_SYS_TIMEOUT: the number of simulateously active timeouts. + * (requires NO_SYS==0) + */ +#define MEMP_NUM_SYS_TIMEOUT 0 + +/** + * MEMP_NUM_NETBUF: the number of struct netbufs. + * (only needed if you use the sequential API, like api_lib.c) + */ +#define MEMP_NUM_NETBUF 0 + +/** + * MEMP_NUM_NETCONN: the number of struct netconns. + * (only needed if you use the sequential API, like api_lib.c) + */ +#define MEMP_NUM_NETCONN 0 + +/** + * MEMP_NUM_TCPIP_MSG_API: the number of struct tcpip_msg, which are used + * for callback/timeout API communication. + * (only needed if you use tcpip.c) + */ +#define MEMP_NUM_TCPIP_MSG_API 0 + +/** + * MEMP_NUM_TCPIP_MSG_INPKT: the number of struct tcpip_msg, which are used + * for incoming packets. + * (only needed if you use tcpip.c) + */ +#define MEMP_NUM_TCPIP_MSG_INPKT 0 + +/** + * PBUF_POOL_SIZE: the number of buffers in the pbuf pool. + */ +#define PBUF_POOL_SIZE 32 + +/* + --------------------------------- + ---------- ARP options ---------- + --------------------------------- +*/ +/** + * LWIP_ARP==1: Enable ARP functionality. + */ +#define LWIP_ARP 1 + +/* + -------------------------------- + ---------- IP options ---------- + -------------------------------- +*/ +/** + * IP_FORWARD==1: Enables the ability to forward IP packets across network + * interfaces. If you are going to run lwIP on a device with only one network + * interface, define this to 0. + */ +#define IP_FORWARD 0 + +/** + * IP_OPTIONS: Defines the behavior for IP options. + * IP_OPTIONS==0_ALLOWED: All packets with IP options are dropped. + * IP_OPTIONS==1_ALLOWED: IP options are allowed (but not parsed). + */ +#define IP_OPTIONS_ALLOWED 1 + +/** + * IP_REASSEMBLY==1: Reassemble incoming fragmented IP packets. Note that + * this option does not affect outgoing packet sizes, which can be controlled + * via IP_FRAG. + */ +#define IP_REASSEMBLY 1 + +/** + * IP_FRAG==1: Fragment outgoing IP packets if their size exceeds MTU. Note + * that this option does not affect incoming packet sizes, which can be + * controlled via IP_REASSEMBLY. + */ +#define IP_FRAG 1 + +/** + * IP_REASS_MAXAGE: Maximum time (in multiples of IP_TMR_INTERVAL - so seconds, normally) + * a fragmented IP packet waits for all fragments to arrive. If not all fragments arrived + * in this time, the whole packet is discarded. + */ +#define IP_REASS_MAXAGE 3 + +/** + * IP_REASS_MAX_PBUFS: Total maximum amount of pbufs waiting to be reassembled. + * Since the received pbufs are enqueued, be sure to configure + * PBUF_POOL_SIZE > IP_REASS_MAX_PBUFS so that the stack is still able to receive + * packets even if the maximum amount of fragments is enqueued for reassembly! + */ +#define IP_REASS_MAX_PBUFS 10 + +/** + * IP_FRAG_USES_STATIC_BUF==1: Use a static MTU-sized buffer for IP + * fragmentation. Otherwise pbufs are allocated and reference the original + * packet data to be fragmented. + */ +#define IP_FRAG_USES_STATIC_BUF 0 + +/** + * IP_DEFAULT_TTL: Default value for Time-To-Live used by transport layers. + */ +#define IP_DEFAULT_TTL 255 + +/* + ---------------------------------- + ---------- ICMP options ---------- + ---------------------------------- +*/ +/** + * LWIP_ICMP==1: Enable ICMP module inside the IP stack. + * Be careful, disable that make your product non-compliant to RFC1122 + */ +#define LWIP_ICMP 1 + +/** + * ICMP_TTL: Default value for Time-To-Live used by ICMP packets. + */ +#define ICMP_TTL (IP_DEFAULT_TTL) + +/* + --------------------------------- + ---------- RAW options ---------- + --------------------------------- +*/ +/** + * LWIP_RAW==1: Enable application layer to hook into the IP layer itself. + */ +#define LWIP_RAW 1 + +/* + ---------------------------------- + ---------- DHCP options ---------- + ---------------------------------- +*/ +/** + * LWIP_DHCP==1: Enable DHCP module. + */ +#define LWIP_DHCP 1 + +/* + ------------------------------------ + ---------- AUTOIP options ---------- + ------------------------------------ +*/ +/** + * LWIP_AUTOIP==1: Enable AUTOIP module. + */ +#define LWIP_AUTOIP 0 + +/* + ---------------------------------- + ---------- SNMP options ---------- + ---------------------------------- +*/ +/** + * LWIP_SNMP==1: Turn on SNMP module. UDP must be available for SNMP + * transport. + */ +#define LWIP_SNMP 0 +#define SNMP_PRIVATE_MIB 0 + +/* + ---------------------------------- + ---------- IGMP options ---------- + ---------------------------------- +*/ +/** + * LWIP_IGMP==1: Turn on IGMP module. + */ +#define LWIP_IGMP 1 + +/* + ---------------------------------- + ---------- DNS options ----------- + ---------------------------------- +*/ +/** + * LWIP_DNS==1: Turn on DNS module. UDP must be available for DNS + * transport. + */ +#define LWIP_DNS 1 + +/* + --------------------------------- + ---------- UDP options ---------- + --------------------------------- +*/ +/** + * LWIP_UDP==1: Turn on UDP. + */ +#define LWIP_UDP 1 + +/** + * LWIP_UDPLITE==1: Turn on UDP-Lite. (Requires LWIP_UDP) + */ +#define LWIP_UDPLITE 0 + +/** + * UDP_TTL: Default Time-To-Live value. + */ +#define UDP_TTL (IP_DEFAULT_TTL) + +/* + --------------------------------- + ---------- TCP options ---------- + --------------------------------- +*/ +/** + * LWIP_TCP==1: Turn on TCP. + */ +#define LWIP_TCP 1 + +/* + ---------------------------------- + ---------- Pbuf options ---------- + ---------------------------------- +*/ +/** + * PBUF_LINK_HLEN: the number of bytes that should be allocated for a + * link level header. The default is 14, the standard value for + * Ethernet. + */ +#define PBUF_LINK_HLEN (14 + ETH_PAD_SIZE) + +/* + ------------------------------------ + ---------- LOOPIF options ---------- + ------------------------------------ +*/ +/** + * LWIP_HAVE_LOOPIF==1: Support loop interface (127.0.0.1) and loopif.c + */ +#define LWIP_HAVE_LOOPIF 1 +#define LWIP_LOOPIF_MULTITHREADING 0 + +/* + ---------------------------------------------- + ---------- Sequential layer options ---------- + ---------------------------------------------- +*/ + +/** + * LWIP_NETCONN==1: Enable Netconn API (require to use api_lib.c) + */ +#define LWIP_NETCONN 0 + +/* + ------------------------------------ + ---------- Socket options ---------- + ------------------------------------ +*/ +/** + * LWIP_SOCKET==1: Enable Socket API (require to use sockets.c) + */ +#define LWIP_SOCKET 0 + +/* + ---------------------------------------- + ---------- Statistics options ---------- + ---------------------------------------- +*/ +/** + * LWIP_STATS==1: Enable statistics collection in lwip_stats. + */ +#define LWIP_STATS 1 +#define LINK_STATS 1 + +/* Misc */ +#define LWIP_NETIF_LINK_CALLBACK 1 +#define LWIP_NETIF_STATUS_CALLBACK 1 +#define LWIP_TIMEVAL_PRIVATE 0 + +#undef DHCP_DOES_ARP_CHECK + +#if 0 +#define LWIP_DEBUG 1 +//#define NETIF_DEBUG LWIP_DBG_ON +#define DHCP_DEBUG LWIP_DBG_ON +//#define ICMP_DEBUG LWIP_DBG_ON +//#define TCP_DEBUG LWIP_DBG_ON +//#define TCP_RTO_DEBUG LWIP_DBG_ON +//#define IP_DEBUG LWIP_DBG_ON +//#define TCP_CWND_DEBUG LWIP_DBG_ON +//#define ETHARP_DEBUG LWIP_DBG_ON +//#define PBUF_DEBUG LWIP_DBG_ON +#define TCP_INPUT_DEBUG LWIP_DBG_ON +#define TCP_OUTPUT_DEBUG LWIP_DBG_ON +#endif + +#define ETH_PAD_SIZE WL_HEADER_SIZE /* size of wifiengine header */ +#define MEM_LIBC_MALLOC 1 + +#define TCP_MSS 512 +#define TCP_SND_BUF 4096 +#endif /* __LWIPOPTS_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/include/netif/wlif.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/include/netif/wlif.h new file mode 100644 index 0000000..6354e1c --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/include/netif/wlif.h @@ -0,0 +1,10 @@ +#ifndef __NETIF_NRWLANIF_H__ +#define __NETIF_NRWLANIF_H__ + +#include "lwip/netif.h" +#include "lwip/err.h" + +err_t wlif_init(struct netif *netif); +void wlif_poll(struct netif *netif); + +#endif diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/netif/wlif.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/netif/wlif.c new file mode 100644 index 0000000..55d5b6a --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/netif/wlif.c @@ -0,0 +1,386 @@ +#include "lwip/opt.h" +#include "lwip/def.h" +#include "lwip/mem.h" +#include "lwip/pbuf.h" +#include "lwip/stats.h" +#include "lwip/sys.h" +#include "netif/etharp.h" +#include "netif/wlif.h" +#include +#include + +#define IFNAME0 'w' +#define IFNAME1 'l' + +/* the queue size will affect the tx performance when using power save. + * A small queue will quickly become filled up if we have to wake the device + * before the actual transmission can occur. When the queue is filled up, the + * packets will be discarded and retransmission will be handled by the upper + * layers. In case of TCP, the retransmission time might be quite long. + * + * If the packets can be put in the pqueue instead, all the packets + * (if possible) will be transmitted when the device wakes up, so we don't have + * to wait for retransmission from upper layers. + */ +#define PQUEUE_SIZE 8 + +struct wlif_t { + volatile uint8_t rx_pending; + + struct { + struct pbuf* buf[PQUEUE_SIZE]; + uint8_t first; + uint8_t last; + } pqueue; +}; + +#define PQUEUE_EMPTY(q) (q.last == q.first) +#define PQUEUE_FULL(q) ((q.last + 1) % PQUEUE_SIZE == q.first) +#define PQUEUE_FIRST(q) (q.buf[q.first]) +#define PQUEUE_DEQUEUE(q) \ + ({ \ + struct pbuf* __p = PQUEUE_FIRST(q); \ + q.first = (q.first + 1) % PQUEUE_SIZE; \ + __p; \ + }) +#define PQUEUE_ENQUEUE(q, p) \ + ({ \ + q.buf[q.last] = p; \ + q.last = (q.last + 1) % PQUEUE_SIZE; \ + }) + + +static err_t process_pqueue(struct netif* netif) +{ + struct pbuf *p; + struct pbuf *q; + int status; + struct wlif_t *priv = (struct wlif_t*) netif->state; + + /* queue empty? finished */ + if (PQUEUE_EMPTY(priv->pqueue)) + return ERR_OK; + + /* get first packet in queue */ + p = PQUEUE_FIRST(priv->pqueue); + + status = wl_process_tx( + p->payload + WL_HEADER_SIZE, /* ptr to eth hdr */ + p->len - WL_HEADER_SIZE, /* input buffer len */ + p->tot_len - WL_HEADER_SIZE, /* pkt len */ + p->payload, /* ptr to WE hdr */ + 0, /* prio */ + p); /* pkt handle */ + + /* if we fail due to power save mode, leave packet in queue and + * try again when target is awake again (upon WL_RX_EVENT_WAKEUP). + */ + if (status == WL_RESOURCES) + return ERR_IF; + + /* if we fail for another reason, just discard the packet */ + if (status != WL_SUCCESS) { + PQUEUE_DEQUEUE(priv->pqueue); + pbuf_free(p); + return ERR_IF; + } + + /* Send the data from the pbuf to the interface, one pbuf at a + * time. The size of the data in each pbuf is kept in the ->len + * variable. + */ + for (q = p; q != NULL; q = q->next) + wl_tx(q->payload, q->len); + + /* remove packet from queue and dec refcnt */ + PQUEUE_DEQUEUE(priv->pqueue); + pbuf_free(p); + + LINK_STATS_INC(link.xmit); + + /* tell caller to process next packet */ + return ERR_INPROGRESS; +} + + +/** + * Called in interrupt context when we can read more data from the mac. + * + */ +static void +rx_isr(void* ctx) +{ + struct netif *netif = ctx; + struct wlif_t *priv = (struct wlif_t*) netif->state; + priv->rx_pending = 1; +} + + +/** + * In this function, the hardware should be initialized. + * Called from wlif_init(). + * + * @param netif the already initialized lwip network interface structure + * for this ethernetif + */ +static err_t +low_level_init(struct netif *netif) +{ + /* device capabilities */ + netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | + NETIF_FLAG_IGMP; + + /* NETIF_FLAG_LINK_UP must be set only when we have an wlan assoc */ + + /* set MAC hardware address length */ + netif->hwaddr_len = ETHARP_HWADDR_LEN; + + if (wl_get_mac_addr(netif->hwaddr) != WL_SUCCESS) + return ERR_IF; + + /* maximum transfer unit */ + netif->mtu = 1500; + + return ERR_OK; +} + + +/** + * This function should do the actual transmission of the packet. The packet is + * contained in the pbuf that is passed to the function. This pbuf + * might be chained. + * + * @param netif the lwip network interface structure for this ethernetif + * @param p the MAC packet to send (e.g. IP packet including MAC addresses and + * type) + * @return ERR_OK if the packet could be sent + * an err_t value if the packet couldn't be sent + * + * @note Returning ERR_MEM here if a DMA queue of your MAC is full can lead to + * strange results. You might consider waiting for space in the DMA queue + * to become availale since the stack doesn't retry to send a packet + * dropped because of memory failure (except for the TCP timers). + */ +static err_t +low_level_output(struct netif *netif, struct pbuf *p) +{ + struct wlif_t* priv = (struct wlif_t*) netif->state; + + /* must have a linear buffer containing up to and including + * the ethernet header + */ + if (p->len < sizeof(struct eth_hdr)) + return ERR_IF; + + /* queue full? drop packet */ + if (PQUEUE_FULL(priv->pqueue)) + return ERR_INPROGRESS; /* no one seems to check this anyway */ + + /* queue packet */ + PQUEUE_ENQUEUE(priv->pqueue, p); + pbuf_ref(p); + while (process_pqueue(netif) == ERR_INPROGRESS); + return ERR_OK; /* no one seems to check this anyway */ +} + +/** + * Should allocate a pbuf and transfer the bytes of the incoming + * packet from the interface into the pbuf. + * + * @param netif the lwip network interface structure for this ethernetif + * @return a pbuf filled with the received packet (including MAC header) + * NULL on memory error + */ +static struct pbuf * +low_level_input(struct netif *netif) +{ + struct pbuf *p; + struct wlif_t *priv = (struct wlif_t*) netif->state; + + char *stripped_pkt; + size_t stripped_pkt_len; + u16_t vlan; + u8_t rx_hdr_size; + int status; + u16_t len; + + /* maximum packet length from wl_rx() */ + len = WL_MAX_PKT_LEN; + + /* We allocate a continous pbuf */ + p = pbuf_alloc(PBUF_RAW, len, PBUF_RAM); + if (p == NULL) { + LWIP_DEBUGF(NETIF_DEBUG, ("low_level_input: fail to alloc " + "pbuf of len:%"S32_F"\n", len)); + return NULL; + } + + /* Read the entire msg */ + priv->rx_pending = 0; + wl_rx(p->payload, &len); + if (len == 0) { + LWIP_DEBUGF(NETIF_DEBUG, ("low_level_input: len was 0")); + return NULL; + } + + status = wl_process_rx( + p->payload, /* input buf */ + len, /* input buf length */ + &stripped_pkt, + &stripped_pkt_len, + &vlan); + + if (status == WL_ABSORBED) { + LWIP_DEBUGF(NETIF_DEBUG, ("low_level_input: absorbed")); + pbuf_free(p); + return NULL; + } + + /* Data packet, remove padding */ + rx_hdr_size = stripped_pkt - (char*) p->payload; + pbuf_realloc(p, stripped_pkt_len + rx_hdr_size); + + LINK_STATS_INC(link.recv); + return p; +} + + +/** + * This function will be called by wlif_poll() when a packet has been received + * from the mac. Then the type of the received packet is determined and + * the appropriate input function is called. + * + * @param netif the lwip network interface structure for this ethernetif + */ +static void +wlif_input(struct netif *netif) +{ + struct eth_hdr *ethhdr; + struct pbuf *p; + + /* move received packet into a new pbuf */ + p = low_level_input(netif); + + /* no packet could be read, silently ignore this */ + if (p == NULL) + return; + + /* points to packet payload, which starts with an Ethernet header */ + ethhdr = p->payload; + switch (htons(ethhdr->type)) { + /* IP or ARP packet? */ + case ETHTYPE_IP: + case ETHTYPE_ARP: +#if PPPOE_SUPPORT + /* PPPoE packet? */ + case ETHTYPE_PPPOEDISC: + case ETHTYPE_PPPOE: +#endif /* PPPOE_SUPPORT */ + /* full packet send to tcpip_thread to process */ + if (netif->input(p, netif) != ERR_OK) { + LWIP_DEBUGF(NETIF_DEBUG, + ("wlif_input: IP input error\n")); + pbuf_free(p); + p = NULL; + } + break; + + default: + pbuf_free(p); + p = NULL; + break; + } +} + +static ssize_t pkt_read_cb(char *dst, + void *src_handle, + size_t read_len, + int offset) { + ssize_t rc; + + rc = pbuf_copy_partial((struct pbuf *)src_handle, + dst, + read_len, + offset + WL_HEADER_SIZE); + if ( 0 == rc ) { + return -1; + } + + return rc; +} + +/** + * Should be called at the beginning of the program to set up the + * network interface. It calls the function low_level_init() to do the + * actual setup of the hardware. + * + * This function should be passed as a parameter to netif_add(). + * + * @param netif the lwip network interface structure for this ethernetif + * @return ERR_OK if the loopif is initialized + * ERR_MEM if private data couldn't be allocated + * any other err_t on error + */ +err_t +wlif_init(struct netif *netif) +{ + static struct wlif_t wlif; + + LWIP_ASSERT("netif != NULL", (netif != NULL)); + +#if LWIP_NETIF_HOSTNAME + /* Initialize interface hostname */ + if ( NULL == netif->hostname ) { + netif->hostname = "wlif"; + } +#endif /* LWIP_NETIF_HOSTNAME */ + + netif->state = &wlif; + netif->name[0] = IFNAME0; + netif->name[1] = IFNAME1; + + /* We directly use etharp_output() here to save a function call. + * You can instead declare your own function an call etharp_output() + * from it if you have to do some checks before sending (e.g. if link + * is available...) */ + netif->output = etharp_output; + netif->linkoutput = low_level_output; + + wl_register_rx_isr(rx_isr, netif); + wl_register_pkt_read_cb(pkt_read_cb); + + /* initialize the hardware */ + return low_level_init(netif); +} + + +/** + * + */ +void +wlif_poll(struct netif* netif) +{ + struct wlif_t* priv = NULL; + + /* wl api forward progress */ + wl_poll(); + + if (netif) + priv = (struct wlif_t*) netif->state; + + /* wlif_init() not called yet? */ + if (priv == NULL) + return; + + /* no packets pending? */ + if (!priv->rx_pending) + return; + + /* read the pending packet */ + wlif_input(netif); + + /* send any packets that was queued due to filled up target queue + * or power save mode. + */ + process_pqueue(netif); +} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/readme.txt b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/readme.txt new file mode 100644 index 0000000..c95f30e --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/readme.txt @@ -0,0 +1 @@ +This directory is specific to the WIFI H&D SPB104 components (\COMPONENTS\WIFI\HD_SPB104). diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS/ctrl_access.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS/ctrl_access.c new file mode 100644 index 0000000..09790c2 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS/ctrl_access.c @@ -0,0 +1,571 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Abstraction layer for memory interfaces. + * + * This module contains the interfaces: + * - MEM <-> USB; + * - MEM <-> RAM; + * - MEM <-> MEM. + * + * This module may be configured and expanded to support the following features: + * - write-protected globals; + * - password-protected data; + * - specific features; + * - etc. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +//_____ I N C L U D E S ____________________________________________________ + +#include "compiler.h" +#include "preprocessor.h" +#ifdef FREERTOS_USED +#include "FreeRTOS.h" +#include "semphr.h" +#endif +#include "ctrl_access.h" + + +//_____ D E F I N I T I O N S ______________________________________________ + +#ifdef FREERTOS_USED + +/*! \name LUN Access Protection Macros + */ +//! @{ + +/*! \brief Locks accesses to LUNs. + * + * \return \c TRUE if the access was successfully locked, else \c FALSE. + */ +#define Ctrl_access_lock() ctrl_access_lock() + +/*! \brief Unlocks accesses to LUNs. + */ +#define Ctrl_access_unlock() xSemaphoreGive(ctrl_access_semphr) + +//! @} + +//! Handle to the semaphore protecting accesses to LUNs. +static xSemaphoreHandle ctrl_access_semphr = NULL; + +#else + +/*! \name LUN Access Protection Macros + */ +//! @{ + +/*! \brief Locks accesses to LUNs. + * + * \return \c TRUE if the access was successfully locked, else \c FALSE. + */ +#define Ctrl_access_lock() TRUE + +/*! \brief Unlocks accesses to LUNs. + */ +#define Ctrl_access_unlock() + +//! @} + +#endif // FREERTOS_USED + + +#if MAX_LUN + +/*! \brief Initializes an entry of the LUN descriptor table. + * + * \param lun Logical Unit Number. + * + * \return LUN descriptor table entry initializer. + */ +#if ACCESS_USB == ENABLED && ACCESS_MEM_TO_RAM == ENABLED +#define Lun_desc_entry(lun) \ + {\ + TPASTE3(Lun_, lun, _test_unit_ready),\ + TPASTE3(Lun_, lun, _read_capacity),\ + TPASTE3(Lun_, lun, _wr_protect),\ + TPASTE3(Lun_, lun, _removal),\ + TPASTE3(Lun_, lun, _usb_read_10),\ + TPASTE3(Lun_, lun, _usb_write_10),\ + TPASTE3(Lun_, lun, _mem_2_ram),\ + TPASTE3(Lun_, lun, _ram_2_mem),\ + TPASTE3(LUN_, lun, _NAME)\ + } +#elif ACCESS_USB == ENABLED +#define Lun_desc_entry(lun) \ + {\ + TPASTE3(Lun_, lun, _test_unit_ready),\ + TPASTE3(Lun_, lun, _read_capacity),\ + TPASTE3(Lun_, lun, _wr_protect),\ + TPASTE3(Lun_, lun, _removal),\ + TPASTE3(Lun_, lun, _usb_read_10),\ + TPASTE3(Lun_, lun, _usb_write_10),\ + TPASTE3(LUN_, lun, _NAME)\ + } +#elif ACCESS_MEM_TO_RAM == ENABLED +#define Lun_desc_entry(lun) \ + {\ + TPASTE3(Lun_, lun, _test_unit_ready),\ + TPASTE3(Lun_, lun, _read_capacity),\ + TPASTE3(Lun_, lun, _wr_protect),\ + TPASTE3(Lun_, lun, _removal),\ + TPASTE3(Lun_, lun, _mem_2_ram),\ + TPASTE3(Lun_, lun, _ram_2_mem),\ + TPASTE3(LUN_, lun, _NAME)\ + } +#else +#define Lun_desc_entry(lun) \ + {\ + TPASTE3(Lun_, lun, _test_unit_ready),\ + TPASTE3(Lun_, lun, _read_capacity),\ + TPASTE3(Lun_, lun, _wr_protect),\ + TPASTE3(Lun_, lun, _removal),\ + TPASTE3(LUN_, lun, _NAME)\ + } +#endif + +//! LUN descriptor table. +static const struct +{ + Ctrl_status (*test_unit_ready)(void); + Ctrl_status (*read_capacity)(U32 *); + Bool (*wr_protect)(void); + Bool (*removal)(void); +#if ACCESS_USB == ENABLED + Ctrl_status (*usb_read_10)(U32, U16); + Ctrl_status (*usb_write_10)(U32, U16); +#endif +#if ACCESS_MEM_TO_RAM == ENABLED + Ctrl_status (*mem_2_ram)(U32, void *); + Ctrl_status (*ram_2_mem)(U32, const void *); +#endif + const char *name; +} lun_desc[MAX_LUN] = +{ +#if LUN_0 == ENABLE + Lun_desc_entry(0), +#endif +#if LUN_1 == ENABLE + Lun_desc_entry(1), +#endif +#if LUN_2 == ENABLE + Lun_desc_entry(2), +#endif +#if LUN_3 == ENABLE + Lun_desc_entry(3), +#endif +#if LUN_4 == ENABLE + Lun_desc_entry(4), +#endif +#if LUN_5 == ENABLE + Lun_desc_entry(5), +#endif +#if LUN_6 == ENABLE + Lun_desc_entry(6), +#endif +#if LUN_7 == ENABLE + Lun_desc_entry(7) +#endif +}; + +#endif + + +#if GLOBAL_WR_PROTECT == ENABLED +Bool g_wr_protect; +#endif + + +/*! \name Control Interface + */ +//! @{ + + +#ifdef FREERTOS_USED + +Bool ctrl_access_init(void) +{ + // If the handle to the protecting semaphore is not valid, + if (!ctrl_access_semphr) + { + // try to create the semaphore. + vSemaphoreCreateBinary(ctrl_access_semphr); + + // If the semaphore could not be created, there is no backup solution. + if (!ctrl_access_semphr) return FALSE; + } + + return TRUE; +} + + +/*! \brief Locks accesses to LUNs. + * + * \return \c TRUE if the access was successfully locked, else \c FALSE. + */ +static Bool ctrl_access_lock(void) +{ + // If the semaphore could not be created, there is no backup solution. + if (!ctrl_access_semphr) return FALSE; + + // Wait for the semaphore. + while (!xSemaphoreTake(ctrl_access_semphr, portMAX_DELAY)); + + return TRUE; +} + +#endif // FREERTOS_USED + + +U8 get_nb_lun(void) +{ +#if MEM_USB == ENABLE + U8 nb_lun; + + if (!Ctrl_access_lock()) return MAX_LUN; + + nb_lun = MAX_LUN + host_get_lun(); + + Ctrl_access_unlock(); + + return nb_lun; +#else + return MAX_LUN; +#endif +} + + +U8 get_cur_lun(void) +{ + return LUN_ID_0; +} + + +Ctrl_status mem_test_unit_ready(U8 lun) +{ + Ctrl_status status; + + if (!Ctrl_access_lock()) return CTRL_FAIL; + + status = +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].test_unit_ready() : +#endif +#if LUN_USB == ENABLE + Lun_usb_test_unit_ready(lun - LUN_ID_USB); +#else + CTRL_FAIL; +#endif + + Ctrl_access_unlock(); + + return status; +} + + +Ctrl_status mem_read_capacity(U8 lun, U32 *u32_nb_sector) +{ + Ctrl_status status; + + if (!Ctrl_access_lock()) return CTRL_FAIL; + + status = +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].read_capacity(u32_nb_sector) : +#endif +#if LUN_USB == ENABLE + Lun_usb_read_capacity(lun - LUN_ID_USB, u32_nb_sector); +#else + CTRL_FAIL; +#endif + + Ctrl_access_unlock(); + + return status; +} + + +U8 mem_sector_size(U8 lun) +{ + U8 sector_size; + + if (!Ctrl_access_lock()) return 0; + + sector_size = +#if MAX_LUN + (lun < MAX_LUN) ? 1 : +#endif +#if LUN_USB == ENABLE + Lun_usb_read_sector_size(lun - LUN_ID_USB); +#else + 0; +#endif + + Ctrl_access_unlock(); + + return sector_size; +} + + +Bool mem_wr_protect(U8 lun) +{ + Bool wr_protect; + + if (!Ctrl_access_lock()) return TRUE; + + wr_protect = +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].wr_protect() : +#endif +#if LUN_USB == ENABLE + Lun_usb_wr_protect(lun - LUN_ID_USB); +#else + TRUE; +#endif + + Ctrl_access_unlock(); + + return wr_protect; +} + + +Bool mem_removal(U8 lun) +{ + Bool removal; + + if (!Ctrl_access_lock()) return TRUE; + + removal = +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].removal() : +#endif +#if LUN_USB == ENABLE + Lun_usb_removal(); +#else + TRUE; +#endif + + Ctrl_access_unlock(); + + return removal; +} + + +const char *mem_name(U8 lun) +{ + return +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].name : +#endif +#if LUN_USB == ENABLE + LUN_USB_NAME; +#else + NULL; +#endif +} + + +//! @} + + +#if ACCESS_USB == ENABLED + +/*! \name MEM <-> USB Interface + */ +//! @{ + + +Ctrl_status memory_2_usb(U8 lun, U32 addr, U16 nb_sector) +{ + Ctrl_status status; + + if (!Ctrl_access_lock()) return CTRL_FAIL; + + memory_start_read_action(nb_sector); + status = +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].usb_read_10(addr, nb_sector) : +#endif + CTRL_FAIL; + memory_stop_read_action(); + + Ctrl_access_unlock(); + + return status; +} + + +Ctrl_status usb_2_memory(U8 lun, U32 addr, U16 nb_sector) +{ + Ctrl_status status; + + if (!Ctrl_access_lock()) return CTRL_FAIL; + + memory_start_write_action(nb_sector); + status = +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].usb_write_10(addr, nb_sector) : +#endif + CTRL_FAIL; + memory_stop_write_action(); + + Ctrl_access_unlock(); + + return status; +} + + +//! @} + +#endif // ACCESS_USB == ENABLED + + +#if ACCESS_MEM_TO_RAM == ENABLED + +/*! \name MEM <-> RAM Interface + */ +//! @{ + + +Ctrl_status memory_2_ram(U8 lun, U32 addr, void *ram) +{ + Ctrl_status status; + + if (!Ctrl_access_lock()) return CTRL_FAIL; + + memory_start_read_action(1); + status = +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].mem_2_ram(addr, ram) : +#endif +#if LUN_USB == ENABLE + Lun_usb_mem_2_ram(addr, ram); +#else + CTRL_FAIL; +#endif + memory_stop_read_action(); + + Ctrl_access_unlock(); + + return status; +} + + +Ctrl_status ram_2_memory(U8 lun, U32 addr, const void *ram) +{ + Ctrl_status status; + + if (!Ctrl_access_lock()) return CTRL_FAIL; + + memory_start_write_action(1); + status = +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].ram_2_mem(addr, ram) : +#endif +#if LUN_USB == ENABLE + Lun_usb_ram_2_mem(addr, ram); +#else + CTRL_FAIL; +#endif + memory_stop_write_action(); + + Ctrl_access_unlock(); + + return status; +} + + +//! @} + +#endif // ACCESS_MEM_TO_RAM == ENABLED + + +#if ACCESS_STREAM == ENABLED + +/*! \name Streaming MEM <-> MEM Interface + */ +//! @{ + + + #if ACCESS_MEM_TO_MEM == ENABLED + +#include "fat.h" + +Ctrl_status stream_mem_to_mem(U8 src_lun, U32 src_addr, U8 dest_lun, U32 dest_addr, U16 nb_sector) +{ +#if (defined __GNUC__) && (defined __AVR32__) + __attribute__((__aligned__(4))) +#elif (defined __ICCAVR32__) + #pragma data_alignment = 4 +#endif + static U8 sector_buf[FS_512B]; + Ctrl_status status = CTRL_GOOD; + + while (nb_sector--) + { + if ((status = memory_2_ram(src_lun, src_addr++, sector_buf)) != CTRL_GOOD) break; + if ((status = ram_2_memory(dest_lun, dest_addr++, sector_buf)) != CTRL_GOOD) break; + } + + return status; +} + + #endif // ACCESS_MEM_TO_MEM == ENABLED + + +Ctrl_status stream_state(U8 id) +{ + return CTRL_GOOD; +} + + +U16 stream_stop(U8 id) +{ + return 0; +} + + +//! @} + +#endif // ACCESS_STREAM == ENABLED diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS/ctrl_access.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS/ctrl_access.h new file mode 100644 index 0000000..358bf65 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS/ctrl_access.h @@ -0,0 +1,369 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Abstraction layer for memory interfaces. + * + * This module contains the interfaces: + * - MEM <-> USB; + * - MEM <-> RAM; + * - MEM <-> MEM. + * + * This module may be configured and expanded to support the following features: + * - write-protected globals; + * - password-protected data; + * - specific features; + * - etc. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _CTRL_ACCESS_H_ +#define _CTRL_ACCESS_H_ + +#include "compiler.h" +#include "conf_access.h" + + +//! Status returned by CTRL_ACCESS interfaces. +typedef enum +{ + CTRL_GOOD = PASS, //!< Success, memory ready. + CTRL_FAIL = FAIL, //!< An error occurred. + CTRL_NO_PRESENT = FAIL + 1, //!< Memory unplugged. + CTRL_BUSY = FAIL + 2 //!< Memory not initialized or changed. +} Ctrl_status; + + +// FYI: Each Logical Unit Number (LUN) corresponds to a memory. + +// Check LUN defines. +#ifndef LUN_0 + #error LUN_0 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_1 + #error LUN_1 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_2 + #error LUN_2 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_3 + #error LUN_3 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_4 + #error LUN_4 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_5 + #error LUN_5 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_6 + #error LUN_6 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_7 + #error LUN_7 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_USB + #error LUN_USB must be defined as ENABLE or DISABLE in conf_access.h +#endif + +/*! \name LUN IDs + */ +//! @{ +#define LUN_ID_0 (0) //!< First static LUN. +#define LUN_ID_1 (LUN_ID_0 + LUN_0) +#define LUN_ID_2 (LUN_ID_1 + LUN_1) +#define LUN_ID_3 (LUN_ID_2 + LUN_2) +#define LUN_ID_4 (LUN_ID_3 + LUN_3) +#define LUN_ID_5 (LUN_ID_4 + LUN_4) +#define LUN_ID_6 (LUN_ID_5 + LUN_5) +#define LUN_ID_7 (LUN_ID_6 + LUN_6) +#define MAX_LUN (LUN_ID_7 + LUN_7) //!< Number of static LUNs. +#define LUN_ID_USB (MAX_LUN) //!< First dynamic LUN (USB host mass storage). +//! @} + + +// Include LUN header files. +#if LUN_0 == ENABLE + #include LUN_0_INCLUDE +#endif +#if LUN_1 == ENABLE + #include LUN_1_INCLUDE +#endif +#if LUN_2 == ENABLE + #include LUN_2_INCLUDE +#endif +#if LUN_3 == ENABLE + #include LUN_3_INCLUDE +#endif +#if LUN_4 == ENABLE + #include LUN_4_INCLUDE +#endif +#if LUN_5 == ENABLE + #include LUN_5_INCLUDE +#endif +#if LUN_6 == ENABLE + #include LUN_6_INCLUDE +#endif +#if LUN_7 == ENABLE + #include LUN_7_INCLUDE +#endif +#if LUN_USB == ENABLE + #include LUN_USB_INCLUDE +#endif + + +// Check the configuration of write protection in conf_access.h. +#ifndef GLOBAL_WR_PROTECT + #error GLOBAL_WR_PROTECT must be defined as ENABLED or DISABLED in conf_access.h +#endif + + +#if GLOBAL_WR_PROTECT == ENABLED + +//! Write protect. +extern Bool g_wr_protect; + +#endif + + +/*! \name Control Interface + */ +//! @{ + +#ifdef FREERTOS_USED + +/*! \brief Initializes the LUN access locker. + * + * \return \c TRUE if the locker was successfully initialized, else \c FALSE. + */ +extern Bool ctrl_access_init(void); + +#endif // FREERTOS_USED + +/*! \brief Returns the number of LUNs. + * + * \return Number of LUNs in the system. + */ +extern U8 get_nb_lun(void); + +/*! \brief Returns the current LUN. + * + * \return Current LUN. + * + * \todo Implement. + */ +extern U8 get_cur_lun(void); + +/*! \brief Tests the memory state and initializes the memory if required. + * + * The TEST UNIT READY SCSI primary command allows an application client to poll + * a LUN until it is ready without having to allocate memory for returned data. + * + * This command may be used to check the media status of LUNs with removable + * media. + * + * \param lun Logical Unit Number. + * + * \return Status. + */ +extern Ctrl_status mem_test_unit_ready(U8 lun); + +/*! \brief Returns the address of the last valid sector (512 bytes) in the + * memory. + * + * \param lun Logical Unit Number. + * \param u32_nb_sector Pointer to the address of the last valid sector. + * + * \return Status. + */ +extern Ctrl_status mem_read_capacity(U8 lun, U32 *u32_nb_sector); + +/*! \brief Returns the size of the physical sector. + * + * \param lun Logical Unit Number. + * + * \return Sector size (unit: 512 bytes). + */ +extern U8 mem_sector_size(U8 lun); + +/*! \brief Returns the write-protection state of the memory. + * + * \param lun Logical Unit Number. + * + * \return \c TRUE if the memory is write-protected, else \c FALSE. + * + * \note Only used by removable memories with hardware-specific write + * protection. + */ +extern Bool mem_wr_protect(U8 lun); + +/*! \brief Tells whether the memory is removable. + * + * \param lun Logical Unit Number. + * + * \return \c TRUE if the memory is removable, else \c FALSE. + */ +extern Bool mem_removal(U8 lun); + +/*! \brief Returns a pointer to the LUN name. + * + * \param lun Logical Unit Number. + * + * \return Pointer to the LUN name string. + */ +extern const char *mem_name(U8 lun); + +//! @} + + +#if ACCESS_USB == ENABLED + +/*! \name MEM <-> USB Interface + */ +//! @{ + +/*! \brief Tranfers data from the memory to USB. + * + * \param lun Logical Unit Number. + * \param addr Address of first memory sector to read. + * \param nb_sector Number of sectors to transfer. + * + * \return Status. + */ +extern Ctrl_status memory_2_usb(U8 lun, U32 addr, U16 nb_sector); + +/*! \brief Tranfers data from USB to the memory. + * + * \param lun Logical Unit Number. + * \param addr Address of first memory sector to write. + * \param nb_sector Number of sectors to transfer. + * + * \return Status. + */ +extern Ctrl_status usb_2_memory(U8 lun, U32 addr, U16 nb_sector); + +//! @} + +#endif // ACCESS_USB == ENABLED + + +#if ACCESS_MEM_TO_RAM == ENABLED + +/*! \name MEM <-> RAM Interface + */ +//! @{ + +/*! \brief Copies 1 data sector from the memory to RAM. + * + * \param lun Logical Unit Number. + * \param addr Address of first memory sector to read. + * \param ram Pointer to RAM buffer to write. + * + * \return Status. + */ +extern Ctrl_status memory_2_ram(U8 lun, U32 addr, void *ram); + +/*! \brief Copies 1 data sector from RAM to the memory. + * + * \param lun Logical Unit Number. + * \param addr Address of first memory sector to write. + * \param ram Pointer to RAM buffer to read. + * + * \return Status. + */ +extern Ctrl_status ram_2_memory(U8 lun, U32 addr, const void *ram); + +//! @} + +#endif // ACCESS_MEM_TO_RAM == ENABLED + + +#if ACCESS_STREAM == ENABLED + +/*! \name Streaming MEM <-> MEM Interface + */ +//! @{ + +//! Erroneous streaming data transfer ID. +#define ID_STREAM_ERR 0xFF + + #if ACCESS_MEM_TO_MEM == ENABLED + +/*! \brief Copies data from one memory to another. + * + * \param src_lun Source Logical Unit Number. + * \param src_addr Source address of first memory sector to read. + * \param dest_lun Destination Logical Unit Number. + * \param dest_addr Destination address of first memory sector to write. + * \param nb_sector Number of sectors to copy. + * + * \return Status. + */ +extern Ctrl_status stream_mem_to_mem(U8 src_lun, U32 src_addr, U8 dest_lun, U32 dest_addr, U16 nb_sector); + + #endif // ACCESS_MEM_TO_MEM == ENABLED + +/*! \brief Returns the state of a streaming data transfer. + * + * \param id Transfer ID. + * + * \return Status. + * + * \todo Implement. + */ +extern Ctrl_status stream_state(U8 id); + +/*! \brief Stops a streaming data transfer. + * + * \param id Transfer ID. + * + * \return Number of remaining sectors. + * + * \todo Implement. + */ +extern U16 stream_stop(U8 id); + +//! @} + +#endif // ACCESS_STREAM == ENABLED + + +#endif // _CTRL_ACCESS_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/debug.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/debug.c new file mode 100644 index 0000000..fe8a2a0 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/debug.c @@ -0,0 +1,133 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Macros and functions dedicated to debug purposes. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with a USART module can be used. + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#include "compiler.h" +#include "debug.h" +#include "util.h" + + +#if (defined __GNUC__) +# include "malloc.h" + +U32 get_heap_curr_used_size( void ) +{ + struct mallinfo my_info=mallinfo(); + return my_info.uordblks; +} + +U32 get_heap_total_used_size( void ) +{ + struct mallinfo my_info=mallinfo(); + return my_info.arena; +} +#endif + +U32 get_heap_free_size( void ) +{ + U32 high_mark= AVR32_SRAM_SIZE; + U32 low_mark = 0; + U32 size ; + void* p_mem; + + size = (high_mark + low_mark)/2; + + do + { + p_mem = malloc(size); + if( p_mem != NULL) + { // Can allocate memory + free(p_mem); + low_mark = size; + } + else + { // Can not allocate memory + high_mark = size; + } + + size = (high_mark + low_mark)/2; + } + while( (high_mark-low_mark) >1 ); + + return size; +} + +static void* round_trace_pbuf; +static U32 round_trace_size; + +void uc3_round_trace_init(void* buf, U32 size) +{ + round_trace_pbuf = buf; + (*(U32*)round_trace_pbuf)=(U32)buf+4; + round_trace_size = size; +} + +void uc3_round_trace(U32 val) +{ + //Disable_global_interrupt(); + + U32* p_wr = (U32*)(*(U32*)round_trace_pbuf); + *p_wr = val; + p_wr++; + if( ((U32)p_wr % round_trace_size) ==0 ) + p_wr= (U32*)round_trace_pbuf+1; + *p_wr = 0xdeadbeef; + *(U32*)round_trace_pbuf = (U32)p_wr; + + //Enable_global_interrupt(); +} + +void dump(char* _buf, uint16_t _count) { + + int i; + for (i = 0; i < _count; ++i) + { + printk("0x%x ", _buf[i]); + if ((i!=0)&&(i % 10 == 0)) + printk("\n\t"); + } + printk("\n"); +} + diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/debug.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/debug.h new file mode 100644 index 0000000..a832d7c --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/debug.h @@ -0,0 +1,116 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Macros and functions dedicated to debug purposes. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with a USART module can be used. + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _DEBUG_H_ +#define _DEBUG_H_ + +#include "stringz.h" + +/*! \brief These macros are used to add traces memory. + * + * First, initialise the trace with Uc3_trace_init(pointer), giving the start address + * of the memory location where will be stored the trace. + * Use Uc3_trace(something) to store "something" into the memory. The end of the trace + * is signaled by the "0xdeadbeef" pattern. + */ +#define Uc3_trace_init(debug_addr) \ + *(U32*)(debug_addr)=debug_addr+4 + +#define Uc3_trace(debug_addr, x) \ + *(U32*)(*(U32*)(debug_addr) ) = (U32)(x) ;\ + *(U32*)(*(U32*)(debug_addr)+4) = 0xdeadbeef ;\ + *(U32*)(debug_addr ) = *(U32*)(debug_addr)+4 + +/*! \brief This macro is used to insert labels into assembly output. + * + */ +#define Insert_label(name) \ + __asm__ __volatile__ (STRINGZ(name)":"); + +#if (defined __GNUC__) +/*! \brief Returns the number of total of used bytes allocated from the HEAP. + * + * \retval total number of used bytes. + */ +U32 get_heap_total_used_size( void ); + +/*! \brief Returns the number of bytes currently used from the HEAP. + * + * \retval total number of used bytes. + */ +U32 get_heap_curr_used_size( void ); +#endif + +/*! \brief Returns the number of free bytes in the HEAP. + * + * This funtion tries to allocate the maximum number of bytes by dichotomical method. + * + * \retval number of free bytes. + */ +extern U32 get_heap_free_size( void ); + +/*! \name Traces function using a round buffer + */ +//! @{ + +/*! \brief Initialize the trace using a round buffer. + * + * \param buf Base address of the buffer used for the trace. + * \param size Size of the round buffer. Must be a power of 2. + */ +void uc3_round_trace_init(void* buf, U32 size); + +/*! \brief Trace a data in the round buffer. + * + * The end of the trace is signaled by the "0xdeadbeef" pattern. + * \param val Data to trace; + */ +void uc3_round_trace(U32 val); + +//! @} + + +#endif // _DEBUG_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/print_funcs.c b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/print_funcs.c new file mode 100644 index 0000000..99e9274 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/print_funcs.c @@ -0,0 +1,215 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Strings and integers print module for debug purposes. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with a USART module can be used. + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#include "compiler.h" +#include "gpio.h" +#include "usart.h" +#include "print_funcs.h" + + +//! ASCII representation of hexadecimal digits. +static const char HEX_DIGITS[16] = "0123456789ABCDEF"; + + +void init_dbg_rs232(long pba_hz) +{ + init_dbg_rs232_ex(DBG_USART_BAUDRATE, pba_hz); +} + + +void init_dbg_rs232_ex(unsigned long baudrate, long pba_hz) +{ + static const gpio_map_t DBG_USART_GPIO_MAP = + { + {DBG_USART_RX_PIN, DBG_USART_RX_FUNCTION}, + {DBG_USART_TX_PIN, DBG_USART_TX_FUNCTION} + }; + + // Options for debug USART. + usart_options_t dbg_usart_options = + { + .baudrate = baudrate, + .charlength = 8, + .paritytype = USART_NO_PARITY, + .stopbits = USART_1_STOPBIT, + .channelmode = USART_NORMAL_CHMODE + }; + + // Setup GPIO for debug USART. + gpio_enable_module(DBG_USART_GPIO_MAP, + sizeof(DBG_USART_GPIO_MAP) / sizeof(DBG_USART_GPIO_MAP[0])); + + // Initialize it in RS232 mode. + usart_init_rs232(DBG_USART, &dbg_usart_options, pba_hz); +} + + +void print_dbg(const char *str) +{ + // Redirection to the debug USART. + print(DBG_USART, str); +} + + +void print_dbg_char(int c) +{ + // Redirection to the debug USART. + print_char(DBG_USART, c); +} + + +void print_dbg_ulong(unsigned long n) +{ + // Redirection to the debug USART. + print_ulong(DBG_USART, n); +} + + +void print_dbg_char_hex(unsigned char n) +{ + // Redirection to the debug USART. + print_char_hex(DBG_USART, n); +} + + +void print_dbg_short_hex(unsigned short n) +{ + // Redirection to the debug USART. + print_short_hex(DBG_USART, n); +} + + +void print_dbg_hex(unsigned long n) +{ + // Redirection to the debug USART. + print_hex(DBG_USART, n); +} + + +void print(volatile avr32_usart_t *usart, const char *str) +{ + // Invoke the USART driver to transmit the input string with the given USART. + usart_write_line(usart, str); +} + + +void print_char(volatile avr32_usart_t *usart, int c) +{ + // Invoke the USART driver to transmit the input character with the given USART. + usart_putchar(usart, c); +} + + +void print_ulong(volatile avr32_usart_t *usart, unsigned long n) +{ + char tmp[11]; + int i = sizeof(tmp) - 1; + + // Convert the given number to an ASCII decimal representation. + tmp[i] = '\0'; + do + { + tmp[--i] = '0' + n % 10; + n /= 10; + } while (n); + + // Transmit the resulting string with the given USART. + print(usart, tmp + i); +} + + +void print_char_hex(volatile avr32_usart_t *usart, unsigned char n) +{ + char tmp[3]; + int i; + + // Convert the given number to an ASCII hexadecimal representation. + tmp[2] = '\0'; + for (i = 1; i >= 0; i--) + { + tmp[i] = HEX_DIGITS[n & 0xF]; + n >>= 4; + } + + // Transmit the resulting string with the given USART. + print(usart, tmp); +} + + +void print_short_hex(volatile avr32_usart_t *usart, unsigned short n) +{ + char tmp[5]; + int i; + + // Convert the given number to an ASCII hexadecimal representation. + tmp[4] = '\0'; + for (i = 3; i >= 0; i--) + { + tmp[i] = HEX_DIGITS[n & 0xF]; + n >>= 4; + } + + // Transmit the resulting string with the given USART. + print(usart, tmp); +} + + +void print_hex(volatile avr32_usart_t *usart, unsigned long n) +{ + char tmp[9]; + int i; + + // Convert the given number to an ASCII hexadecimal representation. + tmp[8] = '\0'; + for (i = 7; i >= 0; i--) + { + tmp[i] = HEX_DIGITS[n & 0xF]; + n >>= 4; + } + + // Transmit the resulting string with the given USART. + print(usart, tmp); +} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/print_funcs.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/print_funcs.h new file mode 100644 index 0000000..38f931d --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/print_funcs.h @@ -0,0 +1,294 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Strings and integers print module for debug purposes. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with a USART module can be used. + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _PRINT_FUNCS_H_ +#define _PRINT_FUNCS_H_ + +#include +#include "board.h" + + +/*! \name USART Settings for the Debug Module + */ +//! @{ +#if BOARD == EVK1100 +# define DBG_USART (&AVR32_USART1) +# define DBG_USART_RX_PIN AVR32_USART1_RXD_0_0_PIN +# define DBG_USART_RX_FUNCTION AVR32_USART1_RXD_0_0_FUNCTION +# define DBG_USART_TX_PIN AVR32_USART1_TXD_0_0_PIN +# define DBG_USART_TX_FUNCTION AVR32_USART1_TXD_0_0_FUNCTION +# define DBG_USART_BAUDRATE 57600 +#elif BOARD == EVK1101 +# define DBG_USART (&AVR32_USART1) +# define DBG_USART_RX_PIN AVR32_USART1_RXD_0_0_PIN +# define DBG_USART_RX_FUNCTION AVR32_USART1_RXD_0_0_FUNCTION +# define DBG_USART_TX_PIN AVR32_USART1_TXD_0_0_PIN +# define DBG_USART_TX_FUNCTION AVR32_USART1_TXD_0_0_FUNCTION +# define DBG_USART_BAUDRATE 57600 +#elif BOARD == UC3C_EK +# define DBG_USART (&AVR32_USART2) +# define DBG_USART_RX_PIN AVR32_USART2_RXD_0_1_PIN +# define DBG_USART_RX_FUNCTION AVR32_USART2_RXD_0_1_FUNCTION +# define DBG_USART_TX_PIN AVR32_USART2_TXD_0_1_PIN +# define DBG_USART_TX_FUNCTION AVR32_USART2_TXD_0_1_FUNCTION +# define DBG_USART_BAUDRATE 57600 +#elif BOARD == EVK1104 +# define DBG_USART (&AVR32_USART1) +# define DBG_USART_RX_PIN AVR32_USART1_RXD_0_0_PIN +# define DBG_USART_RX_FUNCTION AVR32_USART1_RXD_0_0_FUNCTION +# define DBG_USART_TX_PIN AVR32_USART1_TXD_0_0_PIN +# define DBG_USART_TX_FUNCTION AVR32_USART1_TXD_0_0_FUNCTION +# define DBG_USART_BAUDRATE 57600 +#elif BOARD == EVK1105 +# define DBG_USART (&AVR32_USART0) +# define DBG_USART_RX_PIN AVR32_USART0_RXD_0_0_PIN +# define DBG_USART_RX_FUNCTION AVR32_USART0_RXD_0_0_FUNCTION +# define DBG_USART_TX_PIN AVR32_USART0_TXD_0_0_PIN +# define DBG_USART_TX_FUNCTION AVR32_USART0_TXD_0_0_FUNCTION +# define DBG_USART_BAUDRATE 57600 +#elif BOARD == STK1000 +# define DBG_USART (&AVR32_USART1) +# define DBG_USART_RX_PIN AVR32_USART1_RXD_0_PIN +# define DBG_USART_RX_FUNCTION AVR32_USART1_RXD_0_FUNCTION +# define DBG_USART_TX_PIN AVR32_USART1_TXD_0_PIN +# define DBG_USART_TX_FUNCTION AVR32_USART1_TXD_0_FUNCTION +# define DBG_USART_BAUDRATE 115200 +#elif BOARD == NGW100 +# define DBG_USART (&AVR32_USART1) +# define DBG_USART_RX_PIN AVR32_USART1_RXD_0_PIN +# define DBG_USART_RX_FUNCTION AVR32_USART1_RXD_0_FUNCTION +# define DBG_USART_TX_PIN AVR32_USART1_TXD_0_PIN +# define DBG_USART_TX_FUNCTION AVR32_USART1_TXD_0_FUNCTION +# define DBG_USART_BAUDRATE 115200 +#elif BOARD == STK600_RCUC3L0 +# define DBG_USART (&AVR32_USART1) +# define DBG_USART_RX_PIN AVR32_USART1_RXD_0_1_PIN +# define DBG_USART_RX_FUNCTION AVR32_USART1_RXD_0_1_FUNCTION +// For the RX pin, connect STK600.PORTE.PE3 to STK600.RS232 SPARE.RXD +# define DBG_USART_TX_PIN AVR32_USART1_TXD_0_1_PIN +# define DBG_USART_TX_FUNCTION AVR32_USART1_TXD_0_1_FUNCTION +// For the TX pin, connect STK600.PORTE.PE2 to STK600.RS232 SPARE.TXD +# define DBG_USART_BAUDRATE 57600 +# define DBG_USART_CLOCK_MASK AVR32_USART1_CLK_PBA +#elif BOARD == UC3L_EK +# define DBG_USART (&AVR32_USART3) +# define DBG_USART_RX_PIN AVR32_USART3_RXD_0_0_PIN +# define DBG_USART_RX_FUNCTION AVR32_USART3_RXD_0_0_FUNCTION +# define DBG_USART_TX_PIN AVR32_USART3_TXD_0_0_PIN +# define DBG_USART_TX_FUNCTION AVR32_USART3_TXD_0_0_FUNCTION +# define DBG_USART_BAUDRATE 57600 +# define DBG_USART_CLOCK_MASK AVR32_USART3_CLK_PBA +#elif BOARD == ARDUINO +# define DBG_USART (&AVR32_USART1) +# define DBG_USART_RX_PIN AVR32_USART1_RXD_0_0_PIN +# define DBG_USART_RX_FUNCTION AVR32_USART1_RXD_0_0_FUNCTION +# define DBG_USART_TX_PIN AVR32_USART1_TXD_0_0_PIN +# define DBG_USART_TX_FUNCTION AVR32_USART1_TXD_0_0_FUNCTION +# define DBG_USART_BAUDRATE 57600 +# define DBG_USART_CLOCK_MASK AVR32_USART1_CLK_PBA +#endif + +#if !defined(DBG_USART) || \ + !defined(DBG_USART_RX_PIN) || \ + !defined(DBG_USART_RX_FUNCTION) || \ + !defined(DBG_USART_TX_PIN) || \ + !defined(DBG_USART_TX_FUNCTION) || \ + !defined(DBG_USART_BAUDRATE) +# error The USART configuration to use for debug on your board is missing +#endif +//! @} + +/*! \name VT100 Common Commands + */ +//! @{ +#define CLEARSCR "\x1B[2J\x1B[;H" //!< Clear screen. +#define CLEAREOL "\x1B[K" //!< Clear end of line. +#define CLEAREOS "\x1B[J" //!< Clear end of screen. +#define CLEARLCR "\x1B[0K" //!< Clear line cursor right. +#define CLEARLCL "\x1B[1K" //!< Clear line cursor left. +#define CLEARELN "\x1B[2K" //!< Clear entire line. +#define CLEARCDW "\x1B[0J" //!< Clear cursor down. +#define CLEARCUP "\x1B[1J" //!< Clear cursor up. +#define GOTOYX "\x1B[%.2d;%.2dH" //!< Set cursor to (y, x). +#define INSERTMOD "\x1B[4h" //!< Insert mode. +#define OVERWRITEMOD "\x1B[4l" //!< Overwrite mode. +#define DELAFCURSOR "\x1B[K" //!< Erase from cursor to end of line. +#define CRLF "\r\n" //!< Carriage Return + Line Feed. +//! @} + +/*! \name VT100 Cursor Commands + */ +//! @{ +#define CURSON "\x1B[?25h" //!< Show cursor. +#define CURSOFF "\x1B[?25l" //!< Hide cursor. +//! @} + +/*! \name VT100 Character Commands + */ +//! @{ +#define NORMAL "\x1B[0m" //!< Normal. +#define BOLD "\x1B[1m" //!< Bold. +#define UNDERLINE "\x1B[4m" //!< Underline. +#define BLINKING "\x1B[5m" //!< Blink. +#define INVVIDEO "\x1B[7m" //!< Inverse video. +//! @} + +/*! \name VT100 Color Commands + */ +//! @{ +#define CL_BLACK "\033[22;30m" //!< Black. +#define CL_RED "\033[22;31m" //!< Red. +#define CL_GREEN "\033[22;32m" //!< Green. +#define CL_BROWN "\033[22;33m" //!< Brown. +#define CL_BLUE "\033[22;34m" //!< Blue. +#define CL_MAGENTA "\033[22;35m" //!< Magenta. +#define CL_CYAN "\033[22;36m" //!< Cyan. +#define CL_GRAY "\033[22;37m" //!< Gray. +#define CL_DARKGRAY "\033[01;30m" //!< Dark gray. +#define CL_LIGHTRED "\033[01;31m" //!< Light red. +#define CL_LIGHTGREEN "\033[01;32m" //!< Light green. +#define CL_YELLOW "\033[01;33m" //!< Yellow. +#define CL_LIGHTBLUE "\033[01;34m" //!< Light blue. +#define CL_LIGHTMAGENTA "\033[01;35m" //!< Light magenta. +#define CL_LIGHTCYAN "\033[01;36m" //!< Light cyan. +#define CL_WHITE "\033[01;37m" //!< White. +//! @} + + +/*! \brief Sets up DBG_USART with 8N1 at DBG_USART_BAUDRATE. + * + * \param pba_hz PBA clock frequency (Hz). + */ +extern void init_dbg_rs232(long pba_hz); + +/*! \brief Sets up DBG_USART with 8N1 at a given baud rate. + * + * \param baudrate Baud rate to set DBG_USART to. + * \param pba_hz PBA clock frequency (Hz). + */ +extern void init_dbg_rs232_ex(unsigned long baudrate, long pba_hz); + +/*! \brief Prints a string of characters to DBG_USART. + * + * \param str The string of characters to print. + */ +extern void print_dbg(const char *str); + +/*! \brief Prints a character to DBG_USART. + * + * \param c The character to print. + */ +extern void print_dbg_char(int c); + +/*! \brief Prints an integer to DBG_USART in a decimal representation. + * + * \param n The integer to print. + */ +extern void print_dbg_ulong(unsigned long n); + +/*! \brief Prints a char to DBG_USART in an hexadecimal representation. + * + * \param n The char to print. + */ +extern void print_dbg_char_hex(unsigned char n); + +/*! \brief Prints a short integer to DBG_USART in an hexadecimal representation. + * + * \param n The short integer to print. + */ +extern void print_dbg_short_hex(unsigned short n); + +/*! \brief Prints an integer to DBG_USART in an hexadecimal representation. + * + * \param n The integer to print. + */ +extern void print_dbg_hex(unsigned long n); + +/*! \brief Prints a string of characters to a given USART. + * + * \param usart Base address of the USART instance to print to. + * \param str The string of characters to print. + */ +extern void print(volatile avr32_usart_t *usart, const char *str); + +/*! \brief Prints a character to a given USART. + * + * \param usart Base address of the USART instance to print to. + * \param c The character to print. + */ +extern void print_char(volatile avr32_usart_t *usart, int c); + +/*! \brief Prints an integer to a given USART in a decimal representation. + * + * \param usart Base address of the USART instance to print to. + * \param n The integer to print. + */ +extern void print_ulong(volatile avr32_usart_t *usart, unsigned long n); + +/*! \brief Prints a char to a given USART in an hexadecimal representation. + * + * \param usart Base address of the USART instance to print to. + * \param n The char to print. + */ +extern void print_char_hex(volatile avr32_usart_t *usart, unsigned char n); + +/*! \brief Prints a short integer to a given USART in an hexadecimal + * representation. + * + * \param usart Base address of the USART instance to print to. + * \param n The short integer to print. + */ +extern void print_short_hex(volatile avr32_usart_t *usart, unsigned short n); + +/*! \brief Prints an integer to a given USART in an hexadecimal representation. + * + * \param usart Base address of the USART instance to print to. + * \param n The integer to print. + */ +extern void print_hex(volatile avr32_usart_t *usart, unsigned long n); + + +#endif // _PRINT_FUNCS_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_cpu.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_cpu.h new file mode 100644 index 0000000..e3ebea7 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_cpu.h @@ -0,0 +1,63 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief NEWLIB_ADDONS CPU include file for AVR32. + * + * - Compiler: GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef __AVR32_NEWLIB_ADDONS_CPU_H__ +#define __AVR32_NEWLIB_ADDONS_CPU_H__ + +#include <_ansi.h> + +_BEGIN_STD_C + +#define CPU_HZ get_cpu_hz() + +void udelay(unsigned long usec); +void set_cpu_hz(unsigned int clk_hz); +unsigned int get_cpu_hz(); + +_END_STD_C + +#endif diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_exceptions.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_exceptions.h new file mode 100644 index 0000000..31caf13 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_exceptions.h @@ -0,0 +1,120 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief NEWLIB_ADDONS exceptions include file for AVR32. + * + * - Compiler: GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef __AVR32_NEWLIB_ADDONS_EXCEPTIONS_H__ +#define __AVR32_NEWLIB_ADDONS_EXCEPTIONS_H__ + +#include <_ansi.h> + +_BEGIN_STD_C + +/* + Exception vector offsets +*/ +#define EVBA_UNRECOVERABLE 0x000 +#define EVBA_TLB_MULTIPLE 0x004 +#define EVBA_BUS_ERROR_DATA 0x008 +#define EVBA_BUS_ERROR_INSTR 0x00C +#define EVBA_NMI 0x010 +#define EVBA_INSTR_ADDR 0x014 +#define EVBA_ITLB_MISS 0x050 +#define EVBA_ITLB_PROT 0x018 +#define EVBA_BREAKPOINT 0x01C +#define EVBA_ILLEGAL_OPCODE 0x020 +#define EVBA_UNIMPLEMENTED 0x024 +#define EVBA_PRIVILEGE_VIOL 0x028 +#define EVBA_FLOATING_POINT 0x02C +#define EVBA_COP_ABSENT 0x030 +#define EVBA_SCALL 0x100 +#define EVBA_DATA_ADDR_R 0x034 +#define EVBA_DATA_ADDR_W 0x038 +#define EVBA_DTLB_MISS_R 0x060 +#define EVBA_DTLB_MISS_W 0x070 +#define EVBA_DTLB_PROT_R 0x03C +#define EVBA_DTLB_PROT_W 0x040 +#define EVBA_DTLB_MODIFIED 0x044 + + +/* + Define the form of the function used when registering exceptions. + The function should return the address which the exception should + return to after the exception processing. +*/ + +typedef unsigned int (*__exception_handler)(int /*evba_offset*/, int /*return address*/); + +/* + Define the form of the function used when registering a scall handler. +*/ + +typedef void (*__scall_handler)(int /*code*/, int /*p1*/, int /*p2*/ + , int /*p3*/, int /*p4*/); + +/* + Function for registering an exception handler for the exception with + offset given by evba_offset. +*/ +void _register_exception_handler(__exception_handler handler, int evba_offset); + +/* + Function for registering a scall handler which can be a arbirary + function which uses r8-r12 for parameters. +*/ +void _register_scall_handler(__scall_handler handler); + +/* + Initialize exceptions. Must be called before registering exception handlers + and needed to enable exceptions. 'evba' is the pointer to the exception + vector. 'handler_table' is a pointer to an array where the pointers to + the exception handlers are stored. This array must be at least 0x104 bytes + and word aligned. +*/ +void init_exceptions(void *evba, void *handler_table); + +_END_STD_C + +#endif diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_interrupts.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_interrupts.h new file mode 100644 index 0000000..76d81f7 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_interrupts.h @@ -0,0 +1,82 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief NEWLIB_ADDONS interrupts include file for AVR32. + * + * - Compiler: GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef __AVR32_NEWLIB_ADDONS_INTERRUPTS_H__ +#define __AVR32_NEWLIB_ADDONS_INTERRUPTS_H__ + +#include <_ansi.h> + +_BEGIN_STD_C + +#define INT_GRPS 64 +#define INT_LINES 32 +#define INTPR_BASE (__intc_base__ + 0x0000) +#define INTREQ_BASE (__intc_base__ + 64*4) +#define INTCAUSE_BASE (__intc_base__ + 2*64*4) + +//Register offsets +#define INTLEVEL 30 +#define AUTOVECTOR 0 +#define AUTOVECTOR_BITS 14 + +//Priorities +#define INT0 0 +#define INT1 1 +#define INT2 2 +#define INT3 3 + + +typedef void (*__newlib_int_handler)(int /* int_grp*/, void */*user_handle*/); + +__newlib_int_handler register_interrupt(__newlib_int_handler handler, int int_grp, int line, int priority, + .../* void *user_handle*/); +void init_interrupts(); +void set_interrupts_base(void *base); + +_END_STD_C + +#endif diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_io.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_io.h new file mode 100644 index 0000000..a725769 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_io.h @@ -0,0 +1,174 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief NEWLIB_ADDONS miscellaneous macros include file for AVR32. + * + * - Compiler: GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef __AVR32_NEWLIB_ADDONS_IO_H__ +#define __AVR32_NEWLIB_ADDONS_IO_H__ + +#include <_ansi.h> + +_BEGIN_STD_C + +typedef char u8; +typedef unsigned int u32; + +#define __raw_writeb(v,a) (*(volatile unsigned char *)(a) = (v)) +#define __raw_writew(v,a) (*(volatile unsigned short *)(a) = (v)) +#define __raw_writel(v,a) (*(volatile unsigned int *)(a) = (v)) + +#define __raw_readb(a) (*(volatile unsigned char *)(a)) +#define __raw_readw(a) (*(volatile unsigned short *)(a)) +#define __raw_readl(a) (*(volatile unsigned int *)(a)) + +/* As long as I/O is only performed in P4 (or possibly P3), we're safe */ +#define writeb(v,a) __raw_writeb(v,a) +#define writew(v,a) __raw_writew(v,a) +#define writel(v,a) __raw_writel(v,a) + +#define readb(a) __raw_readb(a) +#define readw(a) __raw_readw(a) +#define readl(a) __raw_readl(a) + +/* Memory segments when segmentation is enabled */ +#define P0SEG 0x00000000 +#define P1SEG 0x80000000 +#define P2SEG 0xa0000000 +#define P3SEG 0xc0000000 +#define P4SEG 0xe0000000 + +/* Returns the privileged segment base of a given address */ +#define PXSEG(a) (((unsigned long)(a)) & 0xe0000000) + +/* Returns the physical address of a PnSEG (n=1,2) address */ +#define PHYSADDR(a) (((unsigned long)(a)) & 0x1fffffff) + +/* + * Map an address to a certain privileged segment + */ +#define P1SEGADDR(a) ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P1SEG)) +#define P2SEGADDR(a) ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P2SEG)) +#define P3SEGADDR(a) ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P3SEG)) +#define P4SEGADDR(a) ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P4SEG)) + + +#define cached(addr) P1SEGADDR(addr) +#define uncached(addr) P2SEGADDR(addr) +#define physaddr(addr) PHYSADDR(addr) + +#define BF(field, value) \ + ({ union { \ + struct { \ + unsigned : 32 - field ## _OFFSET - field ## _SIZE ; \ + unsigned long __val: field ## _SIZE ; \ + }; \ + unsigned long __ul; \ + } __tmp; \ + __tmp.__ul = 0; \ + __tmp.__val = value; \ + __tmp.__ul;}) + +#define BF_D(field, value) \ + ({ union { \ + struct { \ + unsigned long long : 64 - field ## _OFFSET - field ## _SIZE ; \ + unsigned long long __val: field ## _SIZE ; \ + }; \ + unsigned long long __ul; \ + } __tmp; \ + __tmp.__ul = 0; \ + __tmp.__val = value; \ + __tmp.__ul;}) + +#define BFINS(var, field, value) \ + { union {\ + struct { \ + unsigned : 32 - field ## _OFFSET - field ## _SIZE ; \ + unsigned long __val: field ## _SIZE ; \ + }; \ + unsigned long __ul; \ + } __tmp; \ + __tmp.__ul = var; \ + __tmp.__val = value; \ + var = __tmp.__ul;} + +#define BFEXT(var, field) \ + ({ union {\ + struct { \ + unsigned : 32 - field ## _OFFSET - field ## _SIZE ; \ + unsigned long __val: field ## _SIZE ; \ + }; \ + unsigned long __ul; \ + } __tmp; \ + __tmp.__ul = var; \ + __tmp.__val; }) + +#define BFINS_D(var, field, value) \ + { union {\ + struct { \ + unsigned long long : 64 - field ## _OFFSET - field ## _SIZE ; \ + unsigned long long __val: field ## _SIZE ; \ + }; \ + unsigned long long __ul; \ + } __tmp; \ + __tmp.__ul = var; \ + __tmp.__val = value; \ + var = __tmp.__ul;} + +#define BFEXT_D(var, field) \ + ({ union {\ + struct { \ + unsigned long long : 64 - field ## _OFFSET - field ## _SIZE ; \ + unsigned long long __val: field ## _SIZE ; \ + }; \ + unsigned long long __ul; \ + } __tmp; \ + __tmp.__ul = var; \ + __tmp.__val; }) + + +_END_STD_C + +#endif diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_usart.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_usart.h new file mode 100644 index 0000000..6c4697d --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_usart.h @@ -0,0 +1,208 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief NEWLIB_ADDONS USART include file for AVR32. + * + * - Compiler: GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef __AVR32_NEWLIB_ADDONS_USART_H__ +#define __AVR32_NEWLIB_ADDONS_USART_H__ + +#include <_ansi.h> + +#include "nlao_io.h" + +_BEGIN_STD_C + +struct usart3 { + volatile u32 us_cr; + volatile u32 us_mr; + volatile u32 us_ier; + volatile u32 us_idr; + volatile u32 us_imr; + volatile u32 us_csr; + volatile u32 us_rhr; + volatile u32 us_thr; + volatile u32 us_brgr; + volatile u32 us_rtor; + volatile u32 us_ttgr; + volatile u32 us_reserved[5]; + volatile u32 us_fidi; + volatile u32 us_ner; + volatile u32 us_xxr; + volatile u32 us_if; +}; + +/* Register offsets */ +#define US_CR 0x0000 +#define US_MR 0x0004 +#define US_IER 0x0008 +#define US_IDR 0x000c +#define US_IMR 0x0010 +#define US_CSR 0x0014 +#define US_RHR 0x0018 +#define US_THR 0x001c +#define US_BRGR 0x0020 +#define US_RTOR 0x0024 +#define US_TTGR 0x0028 + +#define US_FIDI 0x0040 +#define US_NER 0x0044 +#define US_XXR 0x0048 +#define US_IF 0x004c + +#define US_RPR 0x0100 +#define US_RCR 0x0104 +#define US_TPR 0x0108 +#define US_TCR 0x010c +#define US_RNPR 0x0110 +#define US_RNCR 0x0114 +#define US_TNPR 0x0118 +#define US_TNCR 0x011c +#define US_PTCR 0x0120 +#define US_PTSR 0x0124 + + + + +/* USART3 Control Register */ +#define US_CR_RSTRX (1 << 2) +#define US_CR_RSTTX (1 << 3) +#define US_CR_RXEN (1 << 4) +#define US_CR_RXDIS (1 << 5) +#define US_CR_TXEN (1 << 6) +#define US_CR_TXDIS (1 << 7) +#define US_CR_RSTSTA (1 << 8) +#define US_CR_STTBRK (1 << 9) +#define US_CR_STPBRK (1 << 10) + +#define US_CR_DTREN (1 << 16) +#define US_CR_DTRDIS (1 << 17) +#define US_CR_RTSEN (1 << 18) +#define US_CR_RTSDIS (1 << 19) + +/* USART3 Mode Register */ +#define US_MR_MODE (15 << 0) +#define US_MR_MODE_NORMAL ( 0 << 0) +#define US_MR_MODE_HWFLOW ( 2 << 0) +#define US_MR_CLKS ( 3 << 4) +#define US_MR_CLKS_CLOCK ( 0 << 4) +#define US_MR_CLKS_FDIV1 ( 1 << 4) +#define US_MR_CLKS_SLOW ( 2 << 4) +#define US_MR_CLKS_EXT ( 3 << 4) +#define US_MR_CHRL_5BITS ( 0 << 6) +#define US_MR_CHRL_6BITS ( 1 << 6) +#define US_MR_CHRL_7BITS ( 2 << 6) +#define US_MR_CHRL_8BITS ( 3 << 6) +#define US_MR_SYNC ( 1 << 8) +#define US_MR_PAR_EVEN ( 0 << 9) +#define US_MR_PAR_ODD ( 1 << 9) +#define US_MR_PAR_SPACE ( 2 << 9) +#define US_MR_PAR_MARK ( 3 << 9) +#define US_MR_PAR_NONE ( 4 << 9) +#define US_MR_PAR_MDROP ( 6 << 9) +#define US_MR_NBSTOP_1BIT ( 0 << 12) +#define US_MR_NBSTOP_1_5BIT ( 1 << 12) +#define US_MR_NBSTOP_2BITS ( 2 << 12) +#define US_MR_OVER ( 1 << 19) +#define US_MR_OVER_X16 ( 0 << 19) +#define US_MR_OVER_X8 ( 1 << 19) + +/* USART3 Channel Status Register */ +#define US_CSR_RXRDY (1 << 0) +#define US_CSR_TXRDY (1 << 1) +#define US_CSR_RXBRK (1 << 2) +#define US_CSR_ENDRX (1 << 3) +#define US_CSR_ENDTX (1 << 4) + + +#define US_CSR_OVRE (1 << 5) +#define US_CSR_FRAME (1 << 6) +#define US_CSR_PARE (1 << 7) + +#define US_CSR_TXEMPTY (1 << 9) + +#define US_CSR_TXBUFE (1 << 11) +#define US_CSR_RXBUFF (1 << 12) +#define US_CSR_RIIC (1 << 16) +#define US_CSR_DSRIC (1 << 17) +#define US_CSR_DCDIC (1 << 18) +#define US_CSR_CTSIC (1 << 19) +#define US_CSR_RI (1 << 20) +#define US_CSR_DSR (1 << 21) +#define US_CSR_DCD (1 << 22) +#define US_CSR_CTS (1 << 23) + +/* USART3 Baud Rate Generator Register */ +#define US_BRGR_CD_OFFSET 0 +#define US_BRGR_FP_OFFSET 16 + +#define US_BRGR_CD_SIZE 16 +#define US_BRGR_FP_SIZE 3 + +#define US_BRGR_CD (0xFFFF << 0) +#define US_BRGR_FP ( 7 << 16) + +/*USART3 PDC Transfer Control Register */ +#define US_PTCR_RXTEN (1 << 0) +#define US_PTCR_RXTDIS (1 << 1) +#define US_PTCR_TXTEN (1 << 8) +#define US_PTCR_TXTDIS (1 << 9) + +/*USART3 PDC Transfer Status Register */ +#define US_PTSR_RXTEN (1 << 0) +#define US_PTSR_TXTEN (1 << 8) + + +int usart_init(int baudrate); +void usart_putc(char c); +void usart_puts(const char *s); +int usart_getc(void); +int usart_tstc(void); +void usart_setbrg(int baudrate, int cpu_clock); +void set_usart_base(void *usart_base); + + +_END_STD_C + +#endif /* MERLIN_USART3_H */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/libnewlib_addons-at32ucr2-speed_opt.a b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/libnewlib_addons-at32ucr2-speed_opt.a new file mode 100644 index 0000000..aa673ec Binary files /dev/null and b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/libnewlib_addons-at32ucr2-speed_opt.a differ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LINKER_SCRIPTS/AT32UC3A/0512/GCC/link_uc3a0512.lds b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LINKER_SCRIPTS/AT32UC3A/0512/GCC/link_uc3a0512.lds new file mode 100644 index 0000000..59152ac --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LINKER_SCRIPTS/AT32UC3A/0512/GCC/link_uc3a0512.lds @@ -0,0 +1,266 @@ +/****************************************************************************** + * AVR32 AT32UC3A0512 GNU LD script file. + * + * - Compiler: GNU GCC for AVR32 + * - Supported devices: AVR32 AT32UC3A0512 + * + * - author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +OUTPUT_FORMAT("elf32-avr32", "elf32-avr32", "elf32-avr32") + +OUTPUT_ARCH(avr32:uc) + +ENTRY(_start) + +MEMORY +{ + FLASH (rxai!w) : ORIGIN = 0x80000000, LENGTH = 0x00080000 + INTRAM (wxa!ri) : ORIGIN = 0x00000004, LENGTH = 0x0000FFFC + USERPAGE : ORIGIN = 0x80800000, LENGTH = 0x00000200 +} + +PHDRS +{ + FLASH PT_LOAD; + INTRAM_ALIGN PT_NULL; + INTRAM_AT_FLASH PT_LOAD; + INTRAM PT_NULL; + USERPAGE PT_LOAD; +} + +SECTIONS +{ + /* If this heap size is selected, all the INTRAM space from the end of the + data area to the beginning of the stack will be allocated for the heap. */ + __max_heap_size__ = -1; + + /* Use a default heap size if heap size was not defined. */ + __heap_size__ = DEFINED(__heap_size__) ? __heap_size__ : __max_heap_size__; + + /* Use a default stack size if stack size was not defined. */ + __stack_size__ = DEFINED(__stack_size__) ? __stack_size__ : 4K; + + /* Read-only sections, merged into text segment: */ + PROVIDE (__executable_start = 0x80000000); . = 0x80000000; + .interp : { *(.interp) } >FLASH AT>FLASH :FLASH + .reset : { *(.reset) } >FLASH AT>FLASH :FLASH + .hash : { *(.hash) } >FLASH AT>FLASH :FLASH + .dynsym : { *(.dynsym) } >FLASH AT>FLASH :FLASH + .dynstr : { *(.dynstr) } >FLASH AT>FLASH :FLASH + .gnu.version : { *(.gnu.version) } >FLASH AT>FLASH :FLASH + .gnu.version_d : { *(.gnu.version_d) } >FLASH AT>FLASH :FLASH + .gnu.version_r : { *(.gnu.version_r) } >FLASH AT>FLASH :FLASH + .rel.init : { *(.rel.init) } >FLASH AT>FLASH :FLASH + .rela.init : { *(.rela.init) } >FLASH AT>FLASH :FLASH + .rel.text : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) } >FLASH AT>FLASH :FLASH + .rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) } >FLASH AT>FLASH :FLASH + .rel.fini : { *(.rel.fini) } >FLASH AT>FLASH :FLASH + .rela.fini : { *(.rela.fini) } >FLASH AT>FLASH :FLASH + .rel.rodata : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) } >FLASH AT>FLASH :FLASH + .rela.rodata : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) } >FLASH AT>FLASH :FLASH + .rel.data.rel.ro : { *(.rel.data.rel.ro*) } >FLASH AT>FLASH :FLASH + .rela.data.rel.ro : { *(.rel.data.rel.ro*) } >FLASH AT>FLASH :FLASH + .rel.data : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) } >FLASH AT>FLASH :FLASH + .rela.data : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) } >FLASH AT>FLASH :FLASH + .rel.tdata : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) } >FLASH AT>FLASH :FLASH + .rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) } >FLASH AT>FLASH :FLASH + .rel.tbss : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) } >FLASH AT>FLASH :FLASH + .rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) } >FLASH AT>FLASH :FLASH + .rel.ctors : { *(.rel.ctors) } >FLASH AT>FLASH :FLASH + .rela.ctors : { *(.rela.ctors) } >FLASH AT>FLASH :FLASH + .rel.dtors : { *(.rel.dtors) } >FLASH AT>FLASH :FLASH + .rela.dtors : { *(.rela.dtors) } >FLASH AT>FLASH :FLASH + .rel.got : { *(.rel.got) } >FLASH AT>FLASH :FLASH + .rela.got : { *(.rela.got) } >FLASH AT>FLASH :FLASH + .rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) } >FLASH AT>FLASH :FLASH + .rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) } >FLASH AT>FLASH :FLASH + .rel.plt : { *(.rel.plt) } >FLASH AT>FLASH :FLASH + .rela.plt : { *(.rela.plt) } >FLASH AT>FLASH :FLASH + .init : + { + KEEP (*(.init)) + } >FLASH AT>FLASH :FLASH =0xd703d703 + .plt : { *(.plt) } >FLASH AT>FLASH :FLASH + .text : + { + *(.text .stub .text.* .gnu.linkonce.t.*) + KEEP (*(.text.*personality*)) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + } >FLASH AT>FLASH :FLASH =0xd703d703 + .fini : + { + KEEP (*(.fini)) + } >FLASH AT>FLASH :FLASH =0xd703d703 + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } >FLASH AT>FLASH :FLASH + .rodata1 : { *(.rodata1) } >FLASH AT>FLASH :FLASH + .eh_frame_hdr : { *(.eh_frame_hdr) } >FLASH AT>FLASH :FLASH + .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) } >FLASH AT>FLASH :FLASH + .gcc_except_table : ONLY_IF_RO { KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) } >FLASH AT>FLASH :FLASH + .lalign : { . = ALIGN(8); PROVIDE(_data_lma = .); } >FLASH AT>FLASH :FLASH + . = ORIGIN(INTRAM); + .dalign : { . = ALIGN(8); PROVIDE(_data = .); } >INTRAM AT>INTRAM :INTRAM_ALIGN + /* Exception handling */ + .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .gcc_except_table : ONLY_IF_RW { KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + /* Thread Local Storage sections */ + .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + /* Ensure the __preinit_array_start label is properly aligned. We + could instead move the label definition inside the section, but + the linker would then create the section even if it turns out to + be empty, which isn't pretty. */ + PROVIDE (__preinit_array_start = ALIGN(32 / 8)); + .preinit_array : { KEEP (*(.preinit_array)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + PROVIDE (__preinit_array_end = .); + PROVIDE (__init_array_start = .); + .init_array : { KEEP (*(.init_array)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + PROVIDE (__init_array_end = .); + PROVIDE (__fini_array_start = .); + .fini_array : { KEEP (*(.fini_array)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + PROVIDE (__fini_array_end = .); + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin*.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .dtors : + { + KEEP (*crtbegin*.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .jcr : { KEEP (*(.jcr)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .data.rel.ro : { *(.data.rel.ro.local) *(.data.rel.ro*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .dynamic : { *(.dynamic) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .got : { *(.got.plt) *(.got) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .ramtext : { *(.ramtext .ramtext.*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .ddalign : { . = ALIGN(8); } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .data : + { + *(.data .data.* .gnu.linkonce.d.*) + KEEP (*(.gnu.linkonce.d.*personality*)) + SORT(CONSTRUCTORS) + } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .data1 : { *(.data1) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .balign : { . = ALIGN(8); PROVIDE(_edata = .); } >INTRAM AT>FLASH :INTRAM_AT_FLASH + PROVIDE (edata = .); + __bss_start = .; + .bss : + { + *(.dynbss) + *(.bss .bss.* .gnu.linkonce.b.*) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. */ + . = ALIGN(8); + } >INTRAM AT>INTRAM :INTRAM + . = ALIGN(8); + _end = .; + PROVIDE (end = .); + __heap_start__ = ALIGN(8); + .heap : + { + *(.heap) + . = (__heap_size__ == __max_heap_size__) ? + ORIGIN(INTRAM) + LENGTH(INTRAM) - __stack_size__ - ABSOLUTE(.) : + __heap_size__; + } >INTRAM AT>INTRAM :INTRAM + __heap_end__ = .; + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + .stack ORIGIN(INTRAM) + LENGTH(INTRAM) - __stack_size__ : + { + _stack = .; + *(.stack) + . = __stack_size__; + _estack = .; + } >INTRAM AT>INTRAM :INTRAM + .userpage : { *(.userpage .userpage.*) } >USERPAGE AT>USERPAGE :USERPAGE + /DISCARD/ : { *(.note.GNU-stack) } +} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LINKER_SCRIPTS/AT32UC3A/1256/GCC/link_uc3a1256.lds b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LINKER_SCRIPTS/AT32UC3A/1256/GCC/link_uc3a1256.lds new file mode 100644 index 0000000..a5926d8 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/LINKER_SCRIPTS/AT32UC3A/1256/GCC/link_uc3a1256.lds @@ -0,0 +1,266 @@ +/****************************************************************************** + * AVR32 AT32UC3A1256 GNU LD script file. + * + * - Compiler: GNU GCC for AVR32 + * - Supported devices: AVR32 AT32UC3A1256 + * + * - author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +OUTPUT_FORMAT("elf32-avr32", "elf32-avr32", "elf32-avr32") + +OUTPUT_ARCH(avr32:uc) + +ENTRY(_start) + +MEMORY +{ + FLASH (rxai!w) : ORIGIN = 0x80000000, LENGTH = 0x00040000 + INTRAM (wxa!ri) : ORIGIN = 0x00000004, LENGTH = 0x0000FFFC + USERPAGE : ORIGIN = 0x80800000, LENGTH = 0x00000200 +} + +PHDRS +{ + FLASH PT_LOAD; + INTRAM_ALIGN PT_NULL; + INTRAM_AT_FLASH PT_LOAD; + INTRAM PT_NULL; + USERPAGE PT_LOAD; +} + +SECTIONS +{ + /* If this heap size is selected, all the INTRAM space from the end of the + data area to the beginning of the stack will be allocated for the heap. */ + __max_heap_size__ = -1; + + /* Use a default heap size if heap size was not defined. */ + __heap_size__ = DEFINED(__heap_size__) ? __heap_size__ : __max_heap_size__; + + /* Use a default stack size if stack size was not defined. */ + __stack_size__ = DEFINED(__stack_size__) ? __stack_size__ : 4K; + + /* Read-only sections, merged into text segment: */ + PROVIDE (__executable_start = 0x80000000); . = 0x80000000; + .interp : { *(.interp) } >FLASH AT>FLASH :FLASH + .reset : { *(.reset) } >FLASH AT>FLASH :FLASH + .hash : { *(.hash) } >FLASH AT>FLASH :FLASH + .dynsym : { *(.dynsym) } >FLASH AT>FLASH :FLASH + .dynstr : { *(.dynstr) } >FLASH AT>FLASH :FLASH + .gnu.version : { *(.gnu.version) } >FLASH AT>FLASH :FLASH + .gnu.version_d : { *(.gnu.version_d) } >FLASH AT>FLASH :FLASH + .gnu.version_r : { *(.gnu.version_r) } >FLASH AT>FLASH :FLASH + .rel.init : { *(.rel.init) } >FLASH AT>FLASH :FLASH + .rela.init : { *(.rela.init) } >FLASH AT>FLASH :FLASH + .rel.text : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) } >FLASH AT>FLASH :FLASH + .rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) } >FLASH AT>FLASH :FLASH + .rel.fini : { *(.rel.fini) } >FLASH AT>FLASH :FLASH + .rela.fini : { *(.rela.fini) } >FLASH AT>FLASH :FLASH + .rel.rodata : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) } >FLASH AT>FLASH :FLASH + .rela.rodata : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) } >FLASH AT>FLASH :FLASH + .rel.data.rel.ro : { *(.rel.data.rel.ro*) } >FLASH AT>FLASH :FLASH + .rela.data.rel.ro : { *(.rel.data.rel.ro*) } >FLASH AT>FLASH :FLASH + .rel.data : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) } >FLASH AT>FLASH :FLASH + .rela.data : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) } >FLASH AT>FLASH :FLASH + .rel.tdata : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) } >FLASH AT>FLASH :FLASH + .rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) } >FLASH AT>FLASH :FLASH + .rel.tbss : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) } >FLASH AT>FLASH :FLASH + .rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) } >FLASH AT>FLASH :FLASH + .rel.ctors : { *(.rel.ctors) } >FLASH AT>FLASH :FLASH + .rela.ctors : { *(.rela.ctors) } >FLASH AT>FLASH :FLASH + .rel.dtors : { *(.rel.dtors) } >FLASH AT>FLASH :FLASH + .rela.dtors : { *(.rela.dtors) } >FLASH AT>FLASH :FLASH + .rel.got : { *(.rel.got) } >FLASH AT>FLASH :FLASH + .rela.got : { *(.rela.got) } >FLASH AT>FLASH :FLASH + .rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) } >FLASH AT>FLASH :FLASH + .rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) } >FLASH AT>FLASH :FLASH + .rel.plt : { *(.rel.plt) } >FLASH AT>FLASH :FLASH + .rela.plt : { *(.rela.plt) } >FLASH AT>FLASH :FLASH + .init : + { + KEEP (*(.init)) + } >FLASH AT>FLASH :FLASH =0xd703d703 + .plt : { *(.plt) } >FLASH AT>FLASH :FLASH + .text : + { + *(.text .stub .text.* .gnu.linkonce.t.*) + KEEP (*(.text.*personality*)) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + } >FLASH AT>FLASH :FLASH =0xd703d703 + .fini : + { + KEEP (*(.fini)) + } >FLASH AT>FLASH :FLASH =0xd703d703 + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } >FLASH AT>FLASH :FLASH + .rodata1 : { *(.rodata1) } >FLASH AT>FLASH :FLASH + .eh_frame_hdr : { *(.eh_frame_hdr) } >FLASH AT>FLASH :FLASH + .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) } >FLASH AT>FLASH :FLASH + .gcc_except_table : ONLY_IF_RO { KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) } >FLASH AT>FLASH :FLASH + .lalign : { . = ALIGN(8); PROVIDE(_data_lma = .); } >FLASH AT>FLASH :FLASH + . = ORIGIN(INTRAM); + .dalign : { . = ALIGN(8); PROVIDE(_data = .); } >INTRAM AT>INTRAM :INTRAM_ALIGN + /* Exception handling */ + .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .gcc_except_table : ONLY_IF_RW { KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + /* Thread Local Storage sections */ + .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + /* Ensure the __preinit_array_start label is properly aligned. We + could instead move the label definition inside the section, but + the linker would then create the section even if it turns out to + be empty, which isn't pretty. */ + PROVIDE (__preinit_array_start = ALIGN(32 / 8)); + .preinit_array : { KEEP (*(.preinit_array)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + PROVIDE (__preinit_array_end = .); + PROVIDE (__init_array_start = .); + .init_array : { KEEP (*(.init_array)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + PROVIDE (__init_array_end = .); + PROVIDE (__fini_array_start = .); + .fini_array : { KEEP (*(.fini_array)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + PROVIDE (__fini_array_end = .); + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin*.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .dtors : + { + KEEP (*crtbegin*.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .jcr : { KEEP (*(.jcr)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .data.rel.ro : { *(.data.rel.ro.local) *(.data.rel.ro*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .dynamic : { *(.dynamic) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .got : { *(.got.plt) *(.got) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .ramtext : { *(.ramtext .ramtext.*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .ddalign : { . = ALIGN(8); } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .data : + { + *(.data .data.* .gnu.linkonce.d.*) + KEEP (*(.gnu.linkonce.d.*personality*)) + SORT(CONSTRUCTORS) + } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .data1 : { *(.data1) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .balign : { . = ALIGN(8); PROVIDE(_edata = .); } >INTRAM AT>FLASH :INTRAM_AT_FLASH + PROVIDE (edata = .); + __bss_start = .; + .bss : + { + *(.dynbss) + *(.bss .bss.* .gnu.linkonce.b.*) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. */ + . = ALIGN(8); + } >INTRAM AT>INTRAM :INTRAM + . = ALIGN(8); + _end = .; + PROVIDE (end = .); + __heap_start__ = ALIGN(8); + .heap : + { + *(.heap) + . = (__heap_size__ == __max_heap_size__) ? + ORIGIN(INTRAM) + LENGTH(INTRAM) - __stack_size__ - ABSOLUTE(.) : + __heap_size__; + } >INTRAM AT>INTRAM :INTRAM + __heap_end__ = .; + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + .stack ORIGIN(INTRAM) + LENGTH(INTRAM) - __stack_size__ : + { + _stack = .; + *(.stack) + . = __stack_size__; + _estack = .; + } >INTRAM AT>INTRAM :INTRAM + .userpage : { *(.userpage .userpage.*) } >USERPAGE AT>USERPAGE :USERPAGE + /DISCARD/ : { *(.note.GNU-stack) } +} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/mrepeat.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/mrepeat.h new file mode 100644 index 0000000..41163b6 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/mrepeat.h @@ -0,0 +1,328 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Preprocessor macro repeating utils. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _MREPEAT_H_ +#define _MREPEAT_H_ + +#include "preprocessor.h" + + +//! Maximal number of repetitions supported by MREPEAT. +#define MREPEAT_LIMIT 256 + +/*! \brief Macro repeat. + * + * This macro represents a horizontal repetition construct. + * + * \param count The number of repetitious calls to macro. Valid values range from 0 to MREPEAT_LIMIT. + * \param macro A binary operation of the form macro(n, data). This macro is expanded by MREPEAT with + * the current repetition number and the auxiliary data argument. + * \param data Auxiliary data passed to macro. + * + * \return macro(0, data) macro(1, data) ... macro(count - 1, data) + */ +#define MREPEAT(count, macro, data) TPASTE2(MREPEAT, count)(macro, data) + +#define MREPEAT0( macro, data) +#define MREPEAT1( macro, data) MREPEAT0( macro, data) macro( 0, data) +#define MREPEAT2( macro, data) MREPEAT1( macro, data) macro( 1, data) +#define MREPEAT3( macro, data) MREPEAT2( macro, data) macro( 2, data) +#define MREPEAT4( macro, data) MREPEAT3( macro, data) macro( 3, data) +#define MREPEAT5( macro, data) MREPEAT4( macro, data) macro( 4, data) +#define MREPEAT6( macro, data) MREPEAT5( macro, data) macro( 5, data) +#define MREPEAT7( macro, data) MREPEAT6( macro, data) macro( 6, data) +#define MREPEAT8( macro, data) MREPEAT7( macro, data) macro( 7, data) +#define MREPEAT9( macro, data) MREPEAT8( macro, data) macro( 8, data) +#define MREPEAT10( macro, data) MREPEAT9( macro, data) macro( 9, data) +#define MREPEAT11( macro, data) MREPEAT10( macro, data) macro( 10, data) +#define MREPEAT12( macro, data) MREPEAT11( macro, data) macro( 11, data) +#define MREPEAT13( macro, data) MREPEAT12( macro, data) macro( 12, data) +#define MREPEAT14( macro, data) MREPEAT13( macro, data) macro( 13, data) +#define MREPEAT15( macro, data) MREPEAT14( macro, data) macro( 14, data) +#define MREPEAT16( macro, data) MREPEAT15( macro, data) macro( 15, data) +#define MREPEAT17( macro, data) MREPEAT16( macro, data) macro( 16, data) +#define MREPEAT18( macro, data) MREPEAT17( macro, data) macro( 17, data) +#define MREPEAT19( macro, data) MREPEAT18( macro, data) macro( 18, data) +#define MREPEAT20( macro, data) MREPEAT19( macro, data) macro( 19, data) +#define MREPEAT21( macro, data) MREPEAT20( macro, data) macro( 20, data) +#define MREPEAT22( macro, data) MREPEAT21( macro, data) macro( 21, data) +#define MREPEAT23( macro, data) MREPEAT22( macro, data) macro( 22, data) +#define MREPEAT24( macro, data) MREPEAT23( macro, data) macro( 23, data) +#define MREPEAT25( macro, data) MREPEAT24( macro, data) macro( 24, data) +#define MREPEAT26( macro, data) MREPEAT25( macro, data) macro( 25, data) +#define MREPEAT27( macro, data) MREPEAT26( macro, data) macro( 26, data) +#define MREPEAT28( macro, data) MREPEAT27( macro, data) macro( 27, data) +#define MREPEAT29( macro, data) MREPEAT28( macro, data) macro( 28, data) +#define MREPEAT30( macro, data) MREPEAT29( macro, data) macro( 29, data) +#define MREPEAT31( macro, data) MREPEAT30( macro, data) macro( 30, data) +#define MREPEAT32( macro, data) MREPEAT31( macro, data) macro( 31, data) +#define MREPEAT33( macro, data) MREPEAT32( macro, data) macro( 32, data) +#define MREPEAT34( macro, data) MREPEAT33( macro, data) macro( 33, data) +#define MREPEAT35( macro, data) MREPEAT34( macro, data) macro( 34, data) +#define MREPEAT36( macro, data) MREPEAT35( macro, data) macro( 35, data) +#define MREPEAT37( macro, data) MREPEAT36( macro, data) macro( 36, data) +#define MREPEAT38( macro, data) MREPEAT37( macro, data) macro( 37, data) +#define MREPEAT39( macro, data) MREPEAT38( macro, data) macro( 38, data) +#define MREPEAT40( macro, data) MREPEAT39( macro, data) macro( 39, data) +#define MREPEAT41( macro, data) MREPEAT40( macro, data) macro( 40, data) +#define MREPEAT42( macro, data) MREPEAT41( macro, data) macro( 41, data) +#define MREPEAT43( macro, data) MREPEAT42( macro, data) macro( 42, data) +#define MREPEAT44( macro, data) MREPEAT43( macro, data) macro( 43, data) +#define MREPEAT45( macro, data) MREPEAT44( macro, data) macro( 44, data) +#define MREPEAT46( macro, data) MREPEAT45( macro, data) macro( 45, data) +#define MREPEAT47( macro, data) MREPEAT46( macro, data) macro( 46, data) +#define MREPEAT48( macro, data) MREPEAT47( macro, data) macro( 47, data) +#define MREPEAT49( macro, data) MREPEAT48( macro, data) macro( 48, data) +#define MREPEAT50( macro, data) MREPEAT49( macro, data) macro( 49, data) +#define MREPEAT51( macro, data) MREPEAT50( macro, data) macro( 50, data) +#define MREPEAT52( macro, data) MREPEAT51( macro, data) macro( 51, data) +#define MREPEAT53( macro, data) MREPEAT52( macro, data) macro( 52, data) +#define MREPEAT54( macro, data) MREPEAT53( macro, data) macro( 53, data) +#define MREPEAT55( macro, data) MREPEAT54( macro, data) macro( 54, data) +#define MREPEAT56( macro, data) MREPEAT55( macro, data) macro( 55, data) +#define MREPEAT57( macro, data) MREPEAT56( macro, data) macro( 56, data) +#define MREPEAT58( macro, data) MREPEAT57( macro, data) macro( 57, data) +#define MREPEAT59( macro, data) MREPEAT58( macro, data) macro( 58, data) +#define MREPEAT60( macro, data) MREPEAT59( macro, data) macro( 59, data) +#define MREPEAT61( macro, data) MREPEAT60( macro, data) macro( 60, data) +#define MREPEAT62( macro, data) MREPEAT61( macro, data) macro( 61, data) +#define MREPEAT63( macro, data) MREPEAT62( macro, data) macro( 62, data) +#define MREPEAT64( macro, data) MREPEAT63( macro, data) macro( 63, data) +#define MREPEAT65( macro, data) MREPEAT64( macro, data) macro( 64, data) +#define MREPEAT66( macro, data) MREPEAT65( macro, data) macro( 65, data) +#define MREPEAT67( macro, data) MREPEAT66( macro, data) macro( 66, data) +#define MREPEAT68( macro, data) MREPEAT67( macro, data) macro( 67, data) +#define MREPEAT69( macro, data) MREPEAT68( macro, data) macro( 68, data) +#define MREPEAT70( macro, data) MREPEAT69( macro, data) macro( 69, data) +#define MREPEAT71( macro, data) MREPEAT70( macro, data) macro( 70, data) +#define MREPEAT72( macro, data) MREPEAT71( macro, data) macro( 71, data) +#define MREPEAT73( macro, data) MREPEAT72( macro, data) macro( 72, data) +#define MREPEAT74( macro, data) MREPEAT73( macro, data) macro( 73, data) +#define MREPEAT75( macro, data) MREPEAT74( macro, data) macro( 74, data) +#define MREPEAT76( macro, data) MREPEAT75( macro, data) macro( 75, data) +#define MREPEAT77( macro, data) MREPEAT76( macro, data) macro( 76, data) +#define MREPEAT78( macro, data) MREPEAT77( macro, data) macro( 77, data) +#define MREPEAT79( macro, data) MREPEAT78( macro, data) macro( 78, data) +#define MREPEAT80( macro, data) MREPEAT79( macro, data) macro( 79, data) +#define MREPEAT81( macro, data) MREPEAT80( macro, data) macro( 80, data) +#define MREPEAT82( macro, data) MREPEAT81( macro, data) macro( 81, data) +#define MREPEAT83( macro, data) MREPEAT82( macro, data) macro( 82, data) +#define MREPEAT84( macro, data) MREPEAT83( macro, data) macro( 83, data) +#define MREPEAT85( macro, data) MREPEAT84( macro, data) macro( 84, data) +#define MREPEAT86( macro, data) MREPEAT85( macro, data) macro( 85, data) +#define MREPEAT87( macro, data) MREPEAT86( macro, data) macro( 86, data) +#define MREPEAT88( macro, data) MREPEAT87( macro, data) macro( 87, data) +#define MREPEAT89( macro, data) MREPEAT88( macro, data) macro( 88, data) +#define MREPEAT90( macro, data) MREPEAT89( macro, data) macro( 89, data) +#define MREPEAT91( macro, data) MREPEAT90( macro, data) macro( 90, data) +#define MREPEAT92( macro, data) MREPEAT91( macro, data) macro( 91, data) +#define MREPEAT93( macro, data) MREPEAT92( macro, data) macro( 92, data) +#define MREPEAT94( macro, data) MREPEAT93( macro, data) macro( 93, data) +#define MREPEAT95( macro, data) MREPEAT94( macro, data) macro( 94, data) +#define MREPEAT96( macro, data) MREPEAT95( macro, data) macro( 95, data) +#define MREPEAT97( macro, data) MREPEAT96( macro, data) macro( 96, data) +#define MREPEAT98( macro, data) MREPEAT97( macro, data) macro( 97, data) +#define MREPEAT99( macro, data) MREPEAT98( macro, data) macro( 98, data) +#define MREPEAT100(macro, data) MREPEAT99( macro, data) macro( 99, data) +#define MREPEAT101(macro, data) MREPEAT100(macro, data) macro(100, data) +#define MREPEAT102(macro, data) MREPEAT101(macro, data) macro(101, data) +#define MREPEAT103(macro, data) MREPEAT102(macro, data) macro(102, data) +#define MREPEAT104(macro, data) MREPEAT103(macro, data) macro(103, data) +#define MREPEAT105(macro, data) MREPEAT104(macro, data) macro(104, data) +#define MREPEAT106(macro, data) MREPEAT105(macro, data) macro(105, data) +#define MREPEAT107(macro, data) MREPEAT106(macro, data) macro(106, data) +#define MREPEAT108(macro, data) MREPEAT107(macro, data) macro(107, data) +#define MREPEAT109(macro, data) MREPEAT108(macro, data) macro(108, data) +#define MREPEAT110(macro, data) MREPEAT109(macro, data) macro(109, data) +#define MREPEAT111(macro, data) MREPEAT110(macro, data) macro(110, data) +#define MREPEAT112(macro, data) MREPEAT111(macro, data) macro(111, data) +#define MREPEAT113(macro, data) MREPEAT112(macro, data) macro(112, data) +#define MREPEAT114(macro, data) MREPEAT113(macro, data) macro(113, data) +#define MREPEAT115(macro, data) MREPEAT114(macro, data) macro(114, data) +#define MREPEAT116(macro, data) MREPEAT115(macro, data) macro(115, data) +#define MREPEAT117(macro, data) MREPEAT116(macro, data) macro(116, data) +#define MREPEAT118(macro, data) MREPEAT117(macro, data) macro(117, data) +#define MREPEAT119(macro, data) MREPEAT118(macro, data) macro(118, data) +#define MREPEAT120(macro, data) MREPEAT119(macro, data) macro(119, data) +#define MREPEAT121(macro, data) MREPEAT120(macro, data) macro(120, data) +#define MREPEAT122(macro, data) MREPEAT121(macro, data) macro(121, data) +#define MREPEAT123(macro, data) MREPEAT122(macro, data) macro(122, data) +#define MREPEAT124(macro, data) MREPEAT123(macro, data) macro(123, data) +#define MREPEAT125(macro, data) MREPEAT124(macro, data) macro(124, data) +#define MREPEAT126(macro, data) MREPEAT125(macro, data) macro(125, data) +#define MREPEAT127(macro, data) MREPEAT126(macro, data) macro(126, data) +#define MREPEAT128(macro, data) MREPEAT127(macro, data) macro(127, data) +#define MREPEAT129(macro, data) MREPEAT128(macro, data) macro(128, data) +#define MREPEAT130(macro, data) MREPEAT129(macro, data) macro(129, data) +#define MREPEAT131(macro, data) MREPEAT130(macro, data) macro(130, data) +#define MREPEAT132(macro, data) MREPEAT131(macro, data) macro(131, data) +#define MREPEAT133(macro, data) MREPEAT132(macro, data) macro(132, data) +#define MREPEAT134(macro, data) MREPEAT133(macro, data) macro(133, data) +#define MREPEAT135(macro, data) MREPEAT134(macro, data) macro(134, data) +#define MREPEAT136(macro, data) MREPEAT135(macro, data) macro(135, data) +#define MREPEAT137(macro, data) MREPEAT136(macro, data) macro(136, data) +#define MREPEAT138(macro, data) MREPEAT137(macro, data) macro(137, data) +#define MREPEAT139(macro, data) MREPEAT138(macro, data) macro(138, data) +#define MREPEAT140(macro, data) MREPEAT139(macro, data) macro(139, data) +#define MREPEAT141(macro, data) MREPEAT140(macro, data) macro(140, data) +#define MREPEAT142(macro, data) MREPEAT141(macro, data) macro(141, data) +#define MREPEAT143(macro, data) MREPEAT142(macro, data) macro(142, data) +#define MREPEAT144(macro, data) MREPEAT143(macro, data) macro(143, data) +#define MREPEAT145(macro, data) MREPEAT144(macro, data) macro(144, data) +#define MREPEAT146(macro, data) MREPEAT145(macro, data) macro(145, data) +#define MREPEAT147(macro, data) MREPEAT146(macro, data) macro(146, data) +#define MREPEAT148(macro, data) MREPEAT147(macro, data) macro(147, data) +#define MREPEAT149(macro, data) MREPEAT148(macro, data) macro(148, data) +#define MREPEAT150(macro, data) MREPEAT149(macro, data) macro(149, data) +#define MREPEAT151(macro, data) MREPEAT150(macro, data) macro(150, data) +#define MREPEAT152(macro, data) MREPEAT151(macro, data) macro(151, data) +#define MREPEAT153(macro, data) MREPEAT152(macro, data) macro(152, data) +#define MREPEAT154(macro, data) MREPEAT153(macro, data) macro(153, data) +#define MREPEAT155(macro, data) MREPEAT154(macro, data) macro(154, data) +#define MREPEAT156(macro, data) MREPEAT155(macro, data) macro(155, data) +#define MREPEAT157(macro, data) MREPEAT156(macro, data) macro(156, data) +#define MREPEAT158(macro, data) MREPEAT157(macro, data) macro(157, data) +#define MREPEAT159(macro, data) MREPEAT158(macro, data) macro(158, data) +#define MREPEAT160(macro, data) MREPEAT159(macro, data) macro(159, data) +#define MREPEAT161(macro, data) MREPEAT160(macro, data) macro(160, data) +#define MREPEAT162(macro, data) MREPEAT161(macro, data) macro(161, data) +#define MREPEAT163(macro, data) MREPEAT162(macro, data) macro(162, data) +#define MREPEAT164(macro, data) MREPEAT163(macro, data) macro(163, data) +#define MREPEAT165(macro, data) MREPEAT164(macro, data) macro(164, data) +#define MREPEAT166(macro, data) MREPEAT165(macro, data) macro(165, data) +#define MREPEAT167(macro, data) MREPEAT166(macro, data) macro(166, data) +#define MREPEAT168(macro, data) MREPEAT167(macro, data) macro(167, data) +#define MREPEAT169(macro, data) MREPEAT168(macro, data) macro(168, data) +#define MREPEAT170(macro, data) MREPEAT169(macro, data) macro(169, data) +#define MREPEAT171(macro, data) MREPEAT170(macro, data) macro(170, data) +#define MREPEAT172(macro, data) MREPEAT171(macro, data) macro(171, data) +#define MREPEAT173(macro, data) MREPEAT172(macro, data) macro(172, data) +#define MREPEAT174(macro, data) MREPEAT173(macro, data) macro(173, data) +#define MREPEAT175(macro, data) MREPEAT174(macro, data) macro(174, data) +#define MREPEAT176(macro, data) MREPEAT175(macro, data) macro(175, data) +#define MREPEAT177(macro, data) MREPEAT176(macro, data) macro(176, data) +#define MREPEAT178(macro, data) MREPEAT177(macro, data) macro(177, data) +#define MREPEAT179(macro, data) MREPEAT178(macro, data) macro(178, data) +#define MREPEAT180(macro, data) MREPEAT179(macro, data) macro(179, data) +#define MREPEAT181(macro, data) MREPEAT180(macro, data) macro(180, data) +#define MREPEAT182(macro, data) MREPEAT181(macro, data) macro(181, data) +#define MREPEAT183(macro, data) MREPEAT182(macro, data) macro(182, data) +#define MREPEAT184(macro, data) MREPEAT183(macro, data) macro(183, data) +#define MREPEAT185(macro, data) MREPEAT184(macro, data) macro(184, data) +#define MREPEAT186(macro, data) MREPEAT185(macro, data) macro(185, data) +#define MREPEAT187(macro, data) MREPEAT186(macro, data) macro(186, data) +#define MREPEAT188(macro, data) MREPEAT187(macro, data) macro(187, data) +#define MREPEAT189(macro, data) MREPEAT188(macro, data) macro(188, data) +#define MREPEAT190(macro, data) MREPEAT189(macro, data) macro(189, data) +#define MREPEAT191(macro, data) MREPEAT190(macro, data) macro(190, data) +#define MREPEAT192(macro, data) MREPEAT191(macro, data) macro(191, data) +#define MREPEAT193(macro, data) MREPEAT192(macro, data) macro(192, data) +#define MREPEAT194(macro, data) MREPEAT193(macro, data) macro(193, data) +#define MREPEAT195(macro, data) MREPEAT194(macro, data) macro(194, data) +#define MREPEAT196(macro, data) MREPEAT195(macro, data) macro(195, data) +#define MREPEAT197(macro, data) MREPEAT196(macro, data) macro(196, data) +#define MREPEAT198(macro, data) MREPEAT197(macro, data) macro(197, data) +#define MREPEAT199(macro, data) MREPEAT198(macro, data) macro(198, data) +#define MREPEAT200(macro, data) MREPEAT199(macro, data) macro(199, data) +#define MREPEAT201(macro, data) MREPEAT200(macro, data) macro(200, data) +#define MREPEAT202(macro, data) MREPEAT201(macro, data) macro(201, data) +#define MREPEAT203(macro, data) MREPEAT202(macro, data) macro(202, data) +#define MREPEAT204(macro, data) MREPEAT203(macro, data) macro(203, data) +#define MREPEAT205(macro, data) MREPEAT204(macro, data) macro(204, data) +#define MREPEAT206(macro, data) MREPEAT205(macro, data) macro(205, data) +#define MREPEAT207(macro, data) MREPEAT206(macro, data) macro(206, data) +#define MREPEAT208(macro, data) MREPEAT207(macro, data) macro(207, data) +#define MREPEAT209(macro, data) MREPEAT208(macro, data) macro(208, data) +#define MREPEAT210(macro, data) MREPEAT209(macro, data) macro(209, data) +#define MREPEAT211(macro, data) MREPEAT210(macro, data) macro(210, data) +#define MREPEAT212(macro, data) MREPEAT211(macro, data) macro(211, data) +#define MREPEAT213(macro, data) MREPEAT212(macro, data) macro(212, data) +#define MREPEAT214(macro, data) MREPEAT213(macro, data) macro(213, data) +#define MREPEAT215(macro, data) MREPEAT214(macro, data) macro(214, data) +#define MREPEAT216(macro, data) MREPEAT215(macro, data) macro(215, data) +#define MREPEAT217(macro, data) MREPEAT216(macro, data) macro(216, data) +#define MREPEAT218(macro, data) MREPEAT217(macro, data) macro(217, data) +#define MREPEAT219(macro, data) MREPEAT218(macro, data) macro(218, data) +#define MREPEAT220(macro, data) MREPEAT219(macro, data) macro(219, data) +#define MREPEAT221(macro, data) MREPEAT220(macro, data) macro(220, data) +#define MREPEAT222(macro, data) MREPEAT221(macro, data) macro(221, data) +#define MREPEAT223(macro, data) MREPEAT222(macro, data) macro(222, data) +#define MREPEAT224(macro, data) MREPEAT223(macro, data) macro(223, data) +#define MREPEAT225(macro, data) MREPEAT224(macro, data) macro(224, data) +#define MREPEAT226(macro, data) MREPEAT225(macro, data) macro(225, data) +#define MREPEAT227(macro, data) MREPEAT226(macro, data) macro(226, data) +#define MREPEAT228(macro, data) MREPEAT227(macro, data) macro(227, data) +#define MREPEAT229(macro, data) MREPEAT228(macro, data) macro(228, data) +#define MREPEAT230(macro, data) MREPEAT229(macro, data) macro(229, data) +#define MREPEAT231(macro, data) MREPEAT230(macro, data) macro(230, data) +#define MREPEAT232(macro, data) MREPEAT231(macro, data) macro(231, data) +#define MREPEAT233(macro, data) MREPEAT232(macro, data) macro(232, data) +#define MREPEAT234(macro, data) MREPEAT233(macro, data) macro(233, data) +#define MREPEAT235(macro, data) MREPEAT234(macro, data) macro(234, data) +#define MREPEAT236(macro, data) MREPEAT235(macro, data) macro(235, data) +#define MREPEAT237(macro, data) MREPEAT236(macro, data) macro(236, data) +#define MREPEAT238(macro, data) MREPEAT237(macro, data) macro(237, data) +#define MREPEAT239(macro, data) MREPEAT238(macro, data) macro(238, data) +#define MREPEAT240(macro, data) MREPEAT239(macro, data) macro(239, data) +#define MREPEAT241(macro, data) MREPEAT240(macro, data) macro(240, data) +#define MREPEAT242(macro, data) MREPEAT241(macro, data) macro(241, data) +#define MREPEAT243(macro, data) MREPEAT242(macro, data) macro(242, data) +#define MREPEAT244(macro, data) MREPEAT243(macro, data) macro(243, data) +#define MREPEAT245(macro, data) MREPEAT244(macro, data) macro(244, data) +#define MREPEAT246(macro, data) MREPEAT245(macro, data) macro(245, data) +#define MREPEAT247(macro, data) MREPEAT246(macro, data) macro(246, data) +#define MREPEAT248(macro, data) MREPEAT247(macro, data) macro(247, data) +#define MREPEAT249(macro, data) MREPEAT248(macro, data) macro(248, data) +#define MREPEAT250(macro, data) MREPEAT249(macro, data) macro(249, data) +#define MREPEAT251(macro, data) MREPEAT250(macro, data) macro(250, data) +#define MREPEAT252(macro, data) MREPEAT251(macro, data) macro(251, data) +#define MREPEAT253(macro, data) MREPEAT252(macro, data) macro(252, data) +#define MREPEAT254(macro, data) MREPEAT253(macro, data) macro(253, data) +#define MREPEAT255(macro, data) MREPEAT254(macro, data) macro(254, data) +#define MREPEAT256(macro, data) MREPEAT255(macro, data) macro(255, data) + + +#endif // _MREPEAT_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/preprocessor.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/preprocessor.h new file mode 100644 index 0000000..5b996ba --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/preprocessor.h @@ -0,0 +1,55 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Preprocessor utils. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _PREPROCESSOR_H_ +#define _PREPROCESSOR_H_ + +#include "tpaste.h" +#include "stringz.h" +#include "mrepeat.h" + + +#endif // _PREPROCESSOR_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/stringz.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/stringz.h new file mode 100644 index 0000000..3528ea0 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/stringz.h @@ -0,0 +1,75 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Preprocessor stringizing utils. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _STRINGZ_H_ +#define _STRINGZ_H_ + + +/*! \brief Stringize. + * + * Stringize a preprocessing token, this token being allowed to be \#defined. + * + * May be used only within macros with the token passed as an argument if the token is \#defined. + * + * For example, writing STRINGZ(PIN) within a macro \#defined by PIN_NAME(PIN) + * and invoked as PIN_NAME(PIN0) with PIN0 \#defined as A0 is equivalent to + * writing "A0". + */ +#define STRINGZ(x) #x + +/*! \brief Absolute stringize. + * + * Stringize a preprocessing token, this token being allowed to be \#defined. + * + * No restriction of use if the token is \#defined. + * + * For example, writing ASTRINGZ(PIN0) anywhere with PIN0 \#defined as A0 is + * equivalent to writing "A0". + */ +#define ASTRINGZ(x) STRINGZ(x) + + +#endif // _STRINGZ_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/tpaste.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/tpaste.h new file mode 100644 index 0000000..a5d7bee --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/tpaste.h @@ -0,0 +1,95 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Preprocessor token pasting utils. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _TPASTE_H_ +#define _TPASTE_H_ + + +/*! \name Token Paste + * + * Paste N preprocessing tokens together, these tokens being allowed to be \#defined. + * + * May be used only within macros with the tokens passed as arguments if the tokens are \#defined. + * + * For example, writing TPASTE2(U, WIDTH) within a macro \#defined by + * UTYPE(WIDTH) and invoked as UTYPE(UL_WIDTH) with UL_WIDTH \#defined as 32 is + * equivalent to writing U32. + */ +//! @{ +#define TPASTE2( a, b) a##b +#define TPASTE3( a, b, c) a##b##c +#define TPASTE4( a, b, c, d) a##b##c##d +#define TPASTE5( a, b, c, d, e) a##b##c##d##e +#define TPASTE6( a, b, c, d, e, f) a##b##c##d##e##f +#define TPASTE7( a, b, c, d, e, f, g) a##b##c##d##e##f##g +#define TPASTE8( a, b, c, d, e, f, g, h) a##b##c##d##e##f##g##h +#define TPASTE9( a, b, c, d, e, f, g, h, i) a##b##c##d##e##f##g##h##i +#define TPASTE10(a, b, c, d, e, f, g, h, i, j) a##b##c##d##e##f##g##h##i##j +//! @} + +/*! \name Absolute Token Paste + * + * Paste N preprocessing tokens together, these tokens being allowed to be \#defined. + * + * No restriction of use if the tokens are \#defined. + * + * For example, writing ATPASTE2(U, UL_WIDTH) anywhere with UL_WIDTH \#defined + * as 32 is equivalent to writing U32. + */ +//! @{ +#define ATPASTE2( a, b) TPASTE2( a, b) +#define ATPASTE3( a, b, c) TPASTE3( a, b, c) +#define ATPASTE4( a, b, c, d) TPASTE4( a, b, c, d) +#define ATPASTE5( a, b, c, d, e) TPASTE5( a, b, c, d, e) +#define ATPASTE6( a, b, c, d, e, f) TPASTE6( a, b, c, d, e, f) +#define ATPASTE7( a, b, c, d, e, f, g) TPASTE7( a, b, c, d, e, f, g) +#define ATPASTE8( a, b, c, d, e, f, g, h) TPASTE8( a, b, c, d, e, f, g, h) +#define ATPASTE9( a, b, c, d, e, f, g, h, i) TPASTE9( a, b, c, d, e, f, g, h, i) +#define ATPASTE10(a, b, c, d, e, f, g, h, i, j) TPASTE10(a, b, c, d, e, f, g, h, i, j) +//! @} + + +#endif // _TPASTE_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/STARTUP_FILES/GCC/crt0.x b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/STARTUP_FILES/GCC/crt0.x new file mode 100644 index 0000000..23b658b --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/STARTUP_FILES/GCC/crt0.x @@ -0,0 +1,121 @@ +/* This file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief AVR32UC C runtime startup file. + * + * This file has been built from the Newlib crt0.S. + * + * - Compiler: GNU GCC for AVR32 + * - Supported devices: All AVR32UC devices can be used. + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#include + + +//! @{ +//! \verbatim + + + // This must be linked @ 0x80000000 if it is to be run upon reset. + .section .reset, "ax", @progbits + + + .global _start + .type _start, @function +_start: + // Jump to the C runtime startup routine. + lda.w pc, _stext + + + // _stext is placed outside the .reset section so that the program entry point + // can be changed without affecting the C runtime startup. + .section .text._stext, "ax", @progbits + + + .global _stext + .type _stext, @function +_stext: + // Set initial stack pointer. + lda.w sp, _estack + + // Set up EVBA so interrupts can be enabled. + lda.w r0, _evba + mtsr AVR32_EVBA, r0 + + // Enable the exception processing. + csrf AVR32_SR_EM_OFFSET + + // Load initialized data having a global lifetime from the data LMA. + lda.w r0, _data + lda.w r1, _edata + cp r0, r1 + brhs idata_load_loop_end + lda.w r2, _data_lma +idata_load_loop: + ld.d r4, r2++ + st.d r0++, r4 + cp r0, r1 + brlo idata_load_loop +idata_load_loop_end: + + // Clear uninitialized data having a global lifetime in the blank static storage section. + lda.w r0, __bss_start + lda.w r1, _end + cp r0, r1 + brhs udata_clear_loop_end + mov r2, 0 + mov r3, 0 +udata_clear_loop: + st.d r0++, r2 + cp r0, r1 + brlo udata_clear_loop +udata_clear_loop_end: + +#ifdef CONFIG_FRAME_POINTER + // Safety: Set the default "return" @ to the exit routine address. + lda.w lr, exit +#endif + + // Start the show. + lda.w pc, main + + +//! \endverbatim +//! @} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/compiler.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/compiler.h new file mode 100644 index 0000000..885be7f --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/compiler.h @@ -0,0 +1,1145 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Compiler file for AVR32. + * + * This file defines commonly used types and macros. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _COMPILER_H_ +#define _COMPILER_H_ + +#if ((defined __GNUC__) && (defined __AVR32__)) || (defined __ICCAVR32__ || defined __AAVR32__) +# include +#endif +#if (defined __ICCAVR32__) +# include +#endif +#include "preprocessor.h" + +#include "parts.h" + + +//_____ D E C L A R A T I O N S ____________________________________________ + +#ifdef __AVR32_ABI_COMPILER__ // Automatically defined when compiling for AVR32, not when assembling. + +#include +#include + + +#if (defined __ICCAVR32__) + +/*! \name Compiler Keywords + * + * Port of some keywords from GNU GCC for AVR32 to IAR Embedded Workbench for Atmel AVR32. + */ +//! @{ +#define __asm__ asm +#define __inline__ inline +#define __volatile__ +//! @} + +#endif + + +/*! \name Usual Types + */ +//! @{ +typedef unsigned char Bool; //!< Boolean. +#ifndef __cplusplus +#if !defined(__bool_true_false_are_defined) +typedef unsigned char bool; //!< Boolean. +#endif +#endif +typedef signed char S8 ; //!< 8-bit signed integer. +typedef unsigned char U8 ; //!< 8-bit unsigned integer. +typedef signed short int S16; //!< 16-bit signed integer. +typedef unsigned short int U16; //!< 16-bit unsigned integer. +typedef signed long int S32; //!< 32-bit signed integer. +typedef unsigned long int U32; //!< 32-bit unsigned integer. +typedef signed long long int S64; //!< 64-bit signed integer. +typedef unsigned long long int U64; //!< 64-bit unsigned integer. +typedef float F32; //!< 32-bit floating-point number. +typedef double F64; //!< 64-bit floating-point number. +//! @} + + +/*! \name Status Types + */ +//! @{ +typedef Bool Status_bool_t; //!< Boolean status. +typedef U8 Status_t; //!< 8-bit-coded status. +//! @} + + +/*! \name Aliasing Aggregate Types + */ +//! @{ + +//! 16-bit union. +typedef union +{ + S16 s16 ; + U16 u16 ; + S8 s8 [2]; + U8 u8 [2]; +} Union16; + +//! 32-bit union. +typedef union +{ + S32 s32 ; + U32 u32 ; + S16 s16[2]; + U16 u16[2]; + S8 s8 [4]; + U8 u8 [4]; +} Union32; + +//! 64-bit union. +typedef union +{ + S64 s64 ; + U64 u64 ; + S32 s32[2]; + U32 u32[2]; + S16 s16[4]; + U16 u16[4]; + S8 s8 [8]; + U8 u8 [8]; +} Union64; + +//! Union of pointers to 64-, 32-, 16- and 8-bit unsigned integers. +typedef union +{ + S64 *s64ptr; + U64 *u64ptr; + S32 *s32ptr; + U32 *u32ptr; + S16 *s16ptr; + U16 *u16ptr; + S8 *s8ptr ; + U8 *u8ptr ; +} UnionPtr; + +//! Union of pointers to volatile 64-, 32-, 16- and 8-bit unsigned integers. +typedef union +{ + volatile S64 *s64ptr; + volatile U64 *u64ptr; + volatile S32 *s32ptr; + volatile U32 *u32ptr; + volatile S16 *s16ptr; + volatile U16 *u16ptr; + volatile S8 *s8ptr ; + volatile U8 *u8ptr ; +} UnionVPtr; + +//! Union of pointers to constant 64-, 32-, 16- and 8-bit unsigned integers. +typedef union +{ + const S64 *s64ptr; + const U64 *u64ptr; + const S32 *s32ptr; + const U32 *u32ptr; + const S16 *s16ptr; + const U16 *u16ptr; + const S8 *s8ptr ; + const U8 *u8ptr ; +} UnionCPtr; + +//! Union of pointers to constant volatile 64-, 32-, 16- and 8-bit unsigned integers. +typedef union +{ + const volatile S64 *s64ptr; + const volatile U64 *u64ptr; + const volatile S32 *s32ptr; + const volatile U32 *u32ptr; + const volatile S16 *s16ptr; + const volatile U16 *u16ptr; + const volatile S8 *s8ptr ; + const volatile U8 *u8ptr ; +} UnionCVPtr; + +//! Structure of pointers to 64-, 32-, 16- and 8-bit unsigned integers. +typedef struct +{ + S64 *s64ptr; + U64 *u64ptr; + S32 *s32ptr; + U32 *u32ptr; + S16 *s16ptr; + U16 *u16ptr; + S8 *s8ptr ; + U8 *u8ptr ; +} StructPtr; + +//! Structure of pointers to volatile 64-, 32-, 16- and 8-bit unsigned integers. +typedef struct +{ + volatile S64 *s64ptr; + volatile U64 *u64ptr; + volatile S32 *s32ptr; + volatile U32 *u32ptr; + volatile S16 *s16ptr; + volatile U16 *u16ptr; + volatile S8 *s8ptr ; + volatile U8 *u8ptr ; +} StructVPtr; + +//! Structure of pointers to constant 64-, 32-, 16- and 8-bit unsigned integers. +typedef struct +{ + const S64 *s64ptr; + const U64 *u64ptr; + const S32 *s32ptr; + const U32 *u32ptr; + const S16 *s16ptr; + const U16 *u16ptr; + const S8 *s8ptr ; + const U8 *u8ptr ; +} StructCPtr; + +//! Structure of pointers to constant volatile 64-, 32-, 16- and 8-bit unsigned integers. +typedef struct +{ + const volatile S64 *s64ptr; + const volatile U64 *u64ptr; + const volatile S32 *s32ptr; + const volatile U32 *u32ptr; + const volatile S16 *s16ptr; + const volatile U16 *u16ptr; + const volatile S8 *s8ptr ; + const volatile U8 *u8ptr ; +} StructCVPtr; + +//! @} + +#endif // __AVR32_ABI_COMPILER__ + + +//_____ M A C R O S ________________________________________________________ + +/*! \name Usual Constants + */ +//! @{ +#define DISABLE 0 +#define ENABLE 1 +#define DISABLED 0 +#define ENABLED 1 +#define OFF 0 +#define ON 1 +#define FALSE 0 +#define TRUE 1 +#ifndef __cplusplus +#if !defined(__bool_true_false_are_defined) +#define false FALSE +#define true TRUE +#endif +#endif +#define KO 0 +#define OK 1 +#define PASS 0 +#define FAIL 1 +#define LOW 0 +#define HIGH 1 +#define CLR 0 +#define SET 1 +//! @} + + +#ifdef __AVR32_ABI_COMPILER__ // Automatically defined when compiling for AVR32, not when assembling. + +/*! \name Bit-Field Handling + */ +//! @{ + +/*! \brief Reads the bits of a value specified by a given bit-mask. + * + * \param value Value to read bits from. + * \param mask Bit-mask indicating bits to read. + * + * \return Read bits. + */ +#define Rd_bits( value, mask) ((value) & (mask)) + +/*! \brief Writes the bits of a C lvalue specified by a given bit-mask. + * + * \param lvalue C lvalue to write bits to. + * \param mask Bit-mask indicating bits to write. + * \param bits Bits to write. + * + * \return Resulting value with written bits. + */ +#define Wr_bits(lvalue, mask, bits) ((lvalue) = ((lvalue) & ~(mask)) |\ + ((bits ) & (mask))) + +/*! \brief Tests the bits of a value specified by a given bit-mask. + * + * \param value Value of which to test bits. + * \param mask Bit-mask indicating bits to test. + * + * \return \c 1 if at least one of the tested bits is set, else \c 0. + */ +#define Tst_bits( value, mask) (Rd_bits(value, mask) != 0) + +/*! \brief Clears the bits of a C lvalue specified by a given bit-mask. + * + * \param lvalue C lvalue of which to clear bits. + * \param mask Bit-mask indicating bits to clear. + * + * \return Resulting value with cleared bits. + */ +#define Clr_bits(lvalue, mask) ((lvalue) &= ~(mask)) + +/*! \brief Sets the bits of a C lvalue specified by a given bit-mask. + * + * \param lvalue C lvalue of which to set bits. + * \param mask Bit-mask indicating bits to set. + * + * \return Resulting value with set bits. + */ +#define Set_bits(lvalue, mask) ((lvalue) |= (mask)) + +/*! \brief Toggles the bits of a C lvalue specified by a given bit-mask. + * + * \param lvalue C lvalue of which to toggle bits. + * \param mask Bit-mask indicating bits to toggle. + * + * \return Resulting value with toggled bits. + */ +#define Tgl_bits(lvalue, mask) ((lvalue) ^= (mask)) + +/*! \brief Reads the bit-field of a value specified by a given bit-mask. + * + * \param value Value to read a bit-field from. + * \param mask Bit-mask indicating the bit-field to read. + * + * \return Read bit-field. + */ +#define Rd_bitfield( value, mask) (Rd_bits( value, mask) >> ctz(mask)) + +/*! \brief Writes the bit-field of a C lvalue specified by a given bit-mask. + * + * \param lvalue C lvalue to write a bit-field to. + * \param mask Bit-mask indicating the bit-field to write. + * \param bitfield Bit-field to write. + * + * \return Resulting value with written bit-field. + */ +#define Wr_bitfield(lvalue, mask, bitfield) (Wr_bits(lvalue, mask, (U32)(bitfield) << ctz(mask))) + +//! @} + + +/*! \brief This macro is used to test fatal errors. + * + * The macro tests if the expression is FALSE. If it is, a fatal error is + * detected and the application hangs up. + * + * \param expr Expression to evaluate and supposed to be nonzero. + */ +#ifdef _ASSERT_ENABLE_ + #define Assert(expr) \ + {\ + if (!(expr)) while (TRUE);\ + } +#else + #define Assert(expr) +#endif + + +/*! \name Zero-Bit Counting + * + * Under AVR32-GCC, __builtin_clz and __builtin_ctz behave like macros when + * applied to constant expressions (values known at compile time), so they are + * more optimized than the use of the corresponding assembly instructions and + * they can be used as constant expressions e.g. to initialize objects having + * static storage duration, and like the corresponding assembly instructions + * when applied to non-constant expressions (values unknown at compile time), so + * they are more optimized than an assembly periphrasis. Hence, clz and ctz + * ensure a possible and optimized behavior for both constant and non-constant + * expressions. + */ +//! @{ + +/*! \brief Counts the leading zero bits of the given value considered as a 32-bit integer. + * + * \param u Value of which to count the leading zero bits. + * + * \return The count of leading zero bits in \a u. + */ +#if (defined __GNUC__) + #define clz(u) __builtin_clz(u) +#elif (defined __ICCAVR32__) + #define clz(u) __count_leading_zeros(u) +#endif + +/*! \brief Counts the trailing zero bits of the given value considered as a 32-bit integer. + * + * \param u Value of which to count the trailing zero bits. + * + * \return The count of trailing zero bits in \a u. + */ +#if (defined __GNUC__) + #define ctz(u) __builtin_ctz(u) +#elif (defined __ICCAVR32__) + #define ctz(u) __count_trailing_zeros(u) +#endif + +//! @} + + +/*! \name Bit Reversing + */ +//! @{ + +/*! \brief Reverses the bits of \a u8. + * + * \param u8 U8 of which to reverse the bits. + * + * \return Value resulting from \a u8 with reversed bits. + */ +#define bit_reverse8(u8) ((U8)(bit_reverse32((U8)(u8)) >> 24)) + +/*! \brief Reverses the bits of \a u16. + * + * \param u16 U16 of which to reverse the bits. + * + * \return Value resulting from \a u16 with reversed bits. + */ +#define bit_reverse16(u16) ((U16)(bit_reverse32((U16)(u16)) >> 16)) + +/*! \brief Reverses the bits of \a u32. + * + * \param u32 U32 of which to reverse the bits. + * + * \return Value resulting from \a u32 with reversed bits. + */ +#if (defined __GNUC__) + #define bit_reverse32(u32) \ + (\ + {\ + unsigned int __value = (U32)(u32);\ + __asm__ ("brev\t%0" : "+r" (__value) : : "cc");\ + (U32)__value;\ + }\ + ) +#elif (defined __ICCAVR32__) + #define bit_reverse32(u32) ((U32)__bit_reverse((U32)(u32))) +#endif + +/*! \brief Reverses the bits of \a u64. + * + * \param u64 U64 of which to reverse the bits. + * + * \return Value resulting from \a u64 with reversed bits. + */ +#define bit_reverse64(u64) ((U64)(((U64)bit_reverse32((U64)(u64) >> 32)) |\ + ((U64)bit_reverse32((U64)(u64)) << 32))) + +//! @} + + +/*! \name Alignment + */ +//! @{ + +/*! \brief Tests alignment of the number \a val with the \a n boundary. + * + * \param val Input value. + * \param n Boundary. + * + * \return \c 1 if the number \a val is aligned with the \a n boundary, else \c 0. + */ +#define Test_align(val, n ) (!Tst_bits( val, (n) - 1 ) ) + +/*! \brief Gets alignment of the number \a val with respect to the \a n boundary. + * + * \param val Input value. + * \param n Boundary. + * + * \return Alignment of the number \a val with respect to the \a n boundary. + */ +#define Get_align( val, n ) ( Rd_bits( val, (n) - 1 ) ) + +/*! \brief Sets alignment of the lvalue number \a lval to \a alg with respect to the \a n boundary. + * + * \param lval Input/output lvalue. + * \param n Boundary. + * \param alg Alignment. + * + * \return New value of \a lval resulting from its alignment set to \a alg with respect to the \a n boundary. + */ +#define Set_align(lval, n, alg) ( Wr_bits(lval, (n) - 1, alg) ) + +/*! \brief Aligns the number \a val with the upper \a n boundary. + * + * \param val Input value. + * \param n Boundary. + * + * \return Value resulting from the number \a val aligned with the upper \a n boundary. + */ +#define Align_up( val, n ) (((val) + ((n) - 1)) & ~((n) - 1)) + +/*! \brief Aligns the number \a val with the lower \a n boundary. + * + * \param val Input value. + * \param n Boundary. + * + * \return Value resulting from the number \a val aligned with the lower \a n boundary. + */ +#define Align_down(val, n ) ( (val) & ~((n) - 1)) + +//! @} + + +/*! \name Mathematics + * + * The same considerations as for clz and ctz apply here but AVR32-GCC does not + * provide built-in functions to access the assembly instructions abs, min and + * max and it does not produce them by itself in most cases, so two sets of + * macros are defined here: + * - Abs, Min and Max to apply to constant expressions (values known at + * compile time); + * - abs, min and max to apply to non-constant expressions (values unknown at + * compile time). + */ +//! @{ + +/*! \brief Takes the absolute value of \a a. + * + * \param a Input value. + * + * \return Absolute value of \a a. + * + * \note More optimized if only used with values known at compile time. + */ +#define Abs(a) (((a) < 0 ) ? -(a) : (a)) + +/*! \brief Takes the minimal value of \a a and \a b. + * + * \param a Input value. + * \param b Input value. + * + * \return Minimal value of \a a and \a b. + * + * \note More optimized if only used with values known at compile time. + */ +#define Min(a, b) (((a) < (b)) ? (a) : (b)) + +/*! \brief Takes the maximal value of \a a and \a b. + * + * \param a Input value. + * \param b Input value. + * + * \return Maximal value of \a a and \a b. + * + * \note More optimized if only used with values known at compile time. + */ +#define Max(a, b) (((a) > (b)) ? (a) : (b)) + +/*! \brief Takes the absolute value of \a a. + * + * \param a Input value. + * + * \return Absolute value of \a a. + * + * \note More optimized if only used with values unknown at compile time. + */ +#if (defined __GNUC__) + #define abs(a) \ + (\ + {\ + int __value = (a);\ + __asm__ ("abs\t%0" : "+r" (__value) : : "cc");\ + __value;\ + }\ + ) +#elif (defined __ICCAVR32__) + #define abs(a) Abs(a) +#endif + +/*! \brief Takes the minimal value of \a a and \a b. + * + * \param a Input value. + * \param b Input value. + * + * \return Minimal value of \a a and \a b. + * + * \note More optimized if only used with values unknown at compile time. + */ +#if (defined __GNUC__) + #define min(a, b) \ + (\ + {\ + int __value, __arg_a = (a), __arg_b = (b);\ + __asm__ ("min\t%0, %1, %2" : "=r" (__value) : "r" (__arg_a), "r" (__arg_b));\ + __value;\ + }\ + ) +#elif (defined __ICCAVR32__) + #define min(a, b) __min(a, b) +#endif + +/*! \brief Takes the maximal value of \a a and \a b. + * + * \param a Input value. + * \param b Input value. + * + * \return Maximal value of \a a and \a b. + * + * \note More optimized if only used with values unknown at compile time. + */ +#if (defined __GNUC__) + #define max(a, b) \ + (\ + {\ + int __value, __arg_a = (a), __arg_b = (b);\ + __asm__ ("max\t%0, %1, %2" : "=r" (__value) : "r" (__arg_a), "r" (__arg_b));\ + __value;\ + }\ + ) +#elif (defined __ICCAVR32__) + #define max(a, b) __max(a, b) +#endif + +//! @} + + +/*! \brief Calls the routine at address \a addr. + * + * It generates a long call opcode. + * + * For example, `Long_call(0x80000000)' generates a software reset on a UC3 if + * it is invoked from the CPU supervisor mode. + * + * \param addr Address of the routine to call. + * + * \note It may be used as a long jump opcode in some special cases. + */ +#define Long_call(addr) ((*(void (*)(void))(addr))()) + +/*! \brief Resets the CPU by software. + * + * \warning It shall not be called from the CPU application mode. + */ +#if (defined __GNUC__) + #define Reset_CPU() \ + (\ + {\ + __asm__ __volatile__ (\ + "lddpc r9, 3f\n\t"\ + "mfsr r8, %[SR]\n\t"\ + "bfextu r8, r8, %[SR_M_OFFSET], %[SR_M_SIZE]\n\t"\ + "cp.w r8, 0b001\n\t"\ + "breq 0f\n\t"\ + "sub r8, pc, $ - 1f\n\t"\ + "pushm r8-r9\n\t"\ + "rete\n"\ + "0:\n\t"\ + "mtsr %[SR], r9\n"\ + "1:\n\t"\ + "mov r0, 0\n\t"\ + "mov r1, 0\n\t"\ + "mov r2, 0\n\t"\ + "mov r3, 0\n\t"\ + "mov r4, 0\n\t"\ + "mov r5, 0\n\t"\ + "mov r6, 0\n\t"\ + "mov r7, 0\n\t"\ + "mov r8, 0\n\t"\ + "mov r9, 0\n\t"\ + "mov r10, 0\n\t"\ + "mov r11, 0\n\t"\ + "mov r12, 0\n\t"\ + "mov sp, 0\n\t"\ + "stdsp sp[0], sp\n\t"\ + "ldmts sp, sp\n\t"\ + "mov lr, 0\n\t"\ + "lddpc pc, 2f\n\t"\ + ".balign 4\n"\ + "2:\n\t"\ + ".word _start\n"\ + "3:\n\t"\ + ".word %[RESET_SR]"\ + :\ + : [SR] "i" (AVR32_SR),\ + [SR_M_OFFSET] "i" (AVR32_SR_M_OFFSET),\ + [SR_M_SIZE] "i" (AVR32_SR_M_SIZE),\ + [RESET_SR] "i" (AVR32_SR_GM_MASK | AVR32_SR_EM_MASK | (AVR32_SR_M_SUP << AVR32_SR_M_OFFSET))\ + );\ + }\ + ) +#elif (defined __ICCAVR32__) + #define Reset_CPU() \ + {\ + extern void *volatile __program_start;\ + __asm__ __volatile__ (\ + "mov r7, LWRD(__program_start)\n\t"\ + "orh r7, HWRD(__program_start)\n\t"\ + "mov r9, LWRD("ASTRINGZ(AVR32_SR_GM_MASK | AVR32_SR_EM_MASK | (AVR32_SR_M_SUP << AVR32_SR_M_OFFSET))")\n\t"\ + "orh r9, HWRD("ASTRINGZ(AVR32_SR_GM_MASK | AVR32_SR_EM_MASK | (AVR32_SR_M_SUP << AVR32_SR_M_OFFSET))")\n\t"\ + "mfsr r8, "ASTRINGZ(AVR32_SR)"\n\t"\ + "bfextu r8, r8, "ASTRINGZ(AVR32_SR_M_OFFSET)", "ASTRINGZ(AVR32_SR_M_SIZE)"\n\t"\ + "cp.w r8, 001b\n\t"\ + "breq $ + 10\n\t"\ + "sub r8, pc, -12\n\t"\ + "pushm r8-r9\n\t"\ + "rete\n\t"\ + "mtsr "ASTRINGZ(AVR32_SR)", r9\n\t"\ + "mov r0, 0\n\t"\ + "mov r1, 0\n\t"\ + "mov r2, 0\n\t"\ + "mov r3, 0\n\t"\ + "mov r4, 0\n\t"\ + "mov r5, 0\n\t"\ + "mov r6, 0\n\t"\ + "st.w r0[4], r7\n\t"\ + "mov r7, 0\n\t"\ + "mov r8, 0\n\t"\ + "mov r9, 0\n\t"\ + "mov r10, 0\n\t"\ + "mov r11, 0\n\t"\ + "mov r12, 0\n\t"\ + "mov sp, 0\n\t"\ + "stdsp sp[0], sp\n\t"\ + "ldmts sp, sp\n\t"\ + "mov lr, 0\n\t"\ + "ld.w pc, lr[4]"\ + );\ + __program_start;\ + } +#endif + + +/*! \name System Register Access + */ +//! @{ + +/*! \brief Gets the value of the \a sysreg system register. + * + * \param sysreg Address of the system register of which to get the value. + * + * \return Value of the \a sysreg system register. + */ +#if (defined __GNUC__) + #define Get_system_register(sysreg) __builtin_mfsr(sysreg) +#elif (defined __ICCAVR32__) + #define Get_system_register(sysreg) __get_system_register(sysreg) +#endif + +/*! \brief Sets the value of the \a sysreg system register to \a value. + * + * \param sysreg Address of the system register of which to set the value. + * \param value Value to set the \a sysreg system register to. + */ +#if (defined __GNUC__) + #define Set_system_register(sysreg, value) __builtin_mtsr(sysreg, value) +#elif (defined __ICCAVR32__) + #define Set_system_register(sysreg, value) __set_system_register(sysreg, value) +#endif + +//! @} + + +/*! \name CPU Status Register Access + */ +//! @{ + +/*! \brief Tells whether exceptions are globally enabled. + * + * \return \c 1 if exceptions are globally enabled, else \c 0. + */ +#define Is_global_exception_enabled() (!Tst_bits(Get_system_register(AVR32_SR), AVR32_SR_EM_MASK)) + +/*! \brief Disables exceptions globally. + */ +#if (defined __GNUC__) + #define Disable_global_exception() ({__asm__ __volatile__ ("ssrf\t%0" : : "i" (AVR32_SR_EM_OFFSET));}) +#elif (defined __ICCAVR32__) + #define Disable_global_exception() (__set_status_flag(AVR32_SR_EM_OFFSET)) +#endif + +/*! \brief Enables exceptions globally. + */ +#if (defined __GNUC__) + #define Enable_global_exception() ({__asm__ __volatile__ ("csrf\t%0" : : "i" (AVR32_SR_EM_OFFSET));}) +#elif (defined __ICCAVR32__) + #define Enable_global_exception() (__clear_status_flag(AVR32_SR_EM_OFFSET)) +#endif + +/*! \brief Tells whether interrupts are globally enabled. + * + * \return \c 1 if interrupts are globally enabled, else \c 0. + */ +#define Is_global_interrupt_enabled() (!Tst_bits(Get_system_register(AVR32_SR), AVR32_SR_GM_MASK)) + +/*! \brief Disables interrupts globally. + */ +#if (defined __GNUC__) + #define Disable_global_interrupt() ({__asm__ __volatile__ ("ssrf\t%0" : : "i" (AVR32_SR_GM_OFFSET));}) +#elif (defined __ICCAVR32__) + #define Disable_global_interrupt() (__disable_interrupt()) +#endif + +/*! \brief Enables interrupts globally. + */ +#if (defined __GNUC__) + #define Enable_global_interrupt() ({__asm__ __volatile__ ("csrf\t%0" : : "i" (AVR32_SR_GM_OFFSET));}) +#elif (defined __ICCAVR32__) + #define Enable_global_interrupt() (__enable_interrupt()) +#endif + +/*! \brief Tells whether interrupt level \a int_level is enabled. + * + * \param int_level Interrupt level (0 to 3). + * + * \return \c 1 if interrupt level \a int_level is enabled, else \c 0. + */ +#define Is_interrupt_level_enabled(int_level) (!Tst_bits(Get_system_register(AVR32_SR), TPASTE3(AVR32_SR_I, int_level, M_MASK))) + +/*! \brief Disables interrupt level \a int_level. + * + * \param int_level Interrupt level to disable (0 to 3). + */ +#if (defined __GNUC__) + #define Disable_interrupt_level(int_level) ({__asm__ __volatile__ ("ssrf\t%0" : : "i" (TPASTE3(AVR32_SR_I, int_level, M_OFFSET)));}) +#elif (defined __ICCAVR32__) + #define Disable_interrupt_level(int_level) (__set_status_flag(TPASTE3(AVR32_SR_I, int_level, M_OFFSET))) +#endif + +/*! \brief Enables interrupt level \a int_level. + * + * \param int_level Interrupt level to enable (0 to 3). + */ +#if (defined __GNUC__) + #define Enable_interrupt_level(int_level) ({__asm__ __volatile__ ("csrf\t%0" : : "i" (TPASTE3(AVR32_SR_I, int_level, M_OFFSET)));}) +#elif (defined __ICCAVR32__) + #define Enable_interrupt_level(int_level) (__clear_status_flag(TPASTE3(AVR32_SR_I, int_level, M_OFFSET))) +#endif + +/*! \brief Protects subsequent code from interrupts. + */ +#define AVR32_ENTER_CRITICAL_REGION( ) \ + { \ + Bool global_interrupt_enabled = Is_global_interrupt_enabled(); \ + Disable_global_interrupt(); // Disable the appropriate interrupts. + +/*! \brief This macro must always be used in conjunction with AVR32_ENTER_CRITICAL_REGION + * so that interrupts are enabled again. + */ +#define AVR32_LEAVE_CRITICAL_REGION( ) \ + if (global_interrupt_enabled) Enable_global_interrupt(); \ + } + +//! @} + + +/*! \name Debug Register Access + */ +//! @{ + +/*! \brief Gets the value of the \a dbgreg debug register. + * + * \param dbgreg Address of the debug register of which to get the value. + * + * \return Value of the \a dbgreg debug register. + */ +#if (defined __GNUC__) + #define Get_debug_register(dbgreg) __builtin_mfdr(dbgreg) +#elif (defined __ICCAVR32__) + #define Get_debug_register(dbgreg) __get_debug_register(dbgreg) +#endif + +/*! \brief Sets the value of the \a dbgreg debug register to \a value. + * + * \param dbgreg Address of the debug register of which to set the value. + * \param value Value to set the \a dbgreg debug register to. + */ +#if (defined __GNUC__) + #define Set_debug_register(dbgreg, value) __builtin_mtdr(dbgreg, value) +#elif (defined __ICCAVR32__) + #define Set_debug_register(dbgreg, value) __set_debug_register(dbgreg, value) +#endif + +//! @} + +#endif // __AVR32_ABI_COMPILER__ + + +//! Boolean evaluating MCU little endianism. +#if ((defined __GNUC__) && (defined __AVR32__)) || ((defined __ICCAVR32__) || (defined __AAVR32__)) + #define LITTLE_ENDIAN_MCU FALSE +#else + #error If you are here, you should check what is exactly the processor you are using... + #define LITTLE_ENDIAN_MCU FALSE +#endif + +// Check that MCU endianism is correctly defined. +#ifndef LITTLE_ENDIAN_MCU + #error YOU MUST define the MCU endianism with LITTLE_ENDIAN_MCU: either FALSE or TRUE +#endif + +//! Boolean evaluating MCU big endianism. +#define BIG_ENDIAN_MCU (!LITTLE_ENDIAN_MCU) + + +#ifdef __AVR32_ABI_COMPILER__ // Automatically defined when compiling for AVR32, not when assembling. + +/*! \name MCU Endianism Handling + */ +//! @{ + +#if (LITTLE_ENDIAN_MCU==TRUE) + #define LSB(u16) (((U8 *)&(u16))[0]) //!< Least significant byte of \a u16. + #define MSB(u16) (((U8 *)&(u16))[1]) //!< Most significant byte of \a u16. + + #define LSH(u32) (((U16 *)&(u32))[0]) //!< Least significant half-word of \a u32. + #define MSH(u32) (((U16 *)&(u32))[1]) //!< Most significant half-word of \a u32. + #define LSB0W(u32) (((U8 *)&(u32))[0]) //!< Least significant byte of 1st rank of \a u32. + #define LSB1W(u32) (((U8 *)&(u32))[1]) //!< Least significant byte of 2nd rank of \a u32. + #define LSB2W(u32) (((U8 *)&(u32))[2]) //!< Least significant byte of 3rd rank of \a u32. + #define LSB3W(u32) (((U8 *)&(u32))[3]) //!< Least significant byte of 4th rank of \a u32. + #define MSB3W(u32) LSB0W(u32) //!< Most significant byte of 4th rank of \a u32. + #define MSB2W(u32) LSB1W(u32) //!< Most significant byte of 3rd rank of \a u32. + #define MSB1W(u32) LSB2W(u32) //!< Most significant byte of 2nd rank of \a u32. + #define MSB0W(u32) LSB3W(u32) //!< Most significant byte of 1st rank of \a u32. + + #define LSW(u64) (((U32 *)&(u64))[0]) //!< Least significant word of \a u64. + #define MSW(u64) (((U32 *)&(u64))[1]) //!< Most significant word of \a u64. + #define LSH0(u64) (((U16 *)&(u64))[0]) //!< Least significant half-word of 1st rank of \a u64. + #define LSH1(u64) (((U16 *)&(u64))[1]) //!< Least significant half-word of 2nd rank of \a u64. + #define LSH2(u64) (((U16 *)&(u64))[2]) //!< Least significant half-word of 3rd rank of \a u64. + #define LSH3(u64) (((U16 *)&(u64))[3]) //!< Least significant half-word of 4th rank of \a u64. + #define MSH3(u64) LSH0(u64) //!< Most significant half-word of 4th rank of \a u64. + #define MSH2(u64) LSH1(u64) //!< Most significant half-word of 3rd rank of \a u64. + #define MSH1(u64) LSH2(u64) //!< Most significant half-word of 2nd rank of \a u64. + #define MSH0(u64) LSH3(u64) //!< Most significant half-word of 1st rank of \a u64. + #define LSB0D(u64) (((U8 *)&(u64))[0]) //!< Least significant byte of 1st rank of \a u64. + #define LSB1D(u64) (((U8 *)&(u64))[1]) //!< Least significant byte of 2nd rank of \a u64. + #define LSB2D(u64) (((U8 *)&(u64))[2]) //!< Least significant byte of 3rd rank of \a u64. + #define LSB3D(u64) (((U8 *)&(u64))[3]) //!< Least significant byte of 4th rank of \a u64. + #define LSB4D(u64) (((U8 *)&(u64))[4]) //!< Least significant byte of 5th rank of \a u64. + #define LSB5D(u64) (((U8 *)&(u64))[5]) //!< Least significant byte of 6th rank of \a u64. + #define LSB6D(u64) (((U8 *)&(u64))[6]) //!< Least significant byte of 7th rank of \a u64. + #define LSB7D(u64) (((U8 *)&(u64))[7]) //!< Least significant byte of 8th rank of \a u64. + #define MSB7D(u64) LSB0D(u64) //!< Most significant byte of 8th rank of \a u64. + #define MSB6D(u64) LSB1D(u64) //!< Most significant byte of 7th rank of \a u64. + #define MSB5D(u64) LSB2D(u64) //!< Most significant byte of 6th rank of \a u64. + #define MSB4D(u64) LSB3D(u64) //!< Most significant byte of 5th rank of \a u64. + #define MSB3D(u64) LSB4D(u64) //!< Most significant byte of 4th rank of \a u64. + #define MSB2D(u64) LSB5D(u64) //!< Most significant byte of 3rd rank of \a u64. + #define MSB1D(u64) LSB6D(u64) //!< Most significant byte of 2nd rank of \a u64. + #define MSB0D(u64) LSB7D(u64) //!< Most significant byte of 1st rank of \a u64. + +#elif (BIG_ENDIAN_MCU==TRUE) + #define MSB(u16) (((U8 *)&(u16))[0]) //!< Most significant byte of \a u16. + #define LSB(u16) (((U8 *)&(u16))[1]) //!< Least significant byte of \a u16. + + #define MSH(u32) (((U16 *)&(u32))[0]) //!< Most significant half-word of \a u32. + #define LSH(u32) (((U16 *)&(u32))[1]) //!< Least significant half-word of \a u32. + #define MSB0W(u32) (((U8 *)&(u32))[0]) //!< Most significant byte of 1st rank of \a u32. + #define MSB1W(u32) (((U8 *)&(u32))[1]) //!< Most significant byte of 2nd rank of \a u32. + #define MSB2W(u32) (((U8 *)&(u32))[2]) //!< Most significant byte of 3rd rank of \a u32. + #define MSB3W(u32) (((U8 *)&(u32))[3]) //!< Most significant byte of 4th rank of \a u32. + #define LSB3W(u32) MSB0W(u32) //!< Least significant byte of 4th rank of \a u32. + #define LSB2W(u32) MSB1W(u32) //!< Least significant byte of 3rd rank of \a u32. + #define LSB1W(u32) MSB2W(u32) //!< Least significant byte of 2nd rank of \a u32. + #define LSB0W(u32) MSB3W(u32) //!< Least significant byte of 1st rank of \a u32. + + #define MSW(u64) (((U32 *)&(u64))[0]) //!< Most significant word of \a u64. + #define LSW(u64) (((U32 *)&(u64))[1]) //!< Least significant word of \a u64. + #define MSH0(u64) (((U16 *)&(u64))[0]) //!< Most significant half-word of 1st rank of \a u64. + #define MSH1(u64) (((U16 *)&(u64))[1]) //!< Most significant half-word of 2nd rank of \a u64. + #define MSH2(u64) (((U16 *)&(u64))[2]) //!< Most significant half-word of 3rd rank of \a u64. + #define MSH3(u64) (((U16 *)&(u64))[3]) //!< Most significant half-word of 4th rank of \a u64. + #define LSH3(u64) MSH0(u64) //!< Least significant half-word of 4th rank of \a u64. + #define LSH2(u64) MSH1(u64) //!< Least significant half-word of 3rd rank of \a u64. + #define LSH1(u64) MSH2(u64) //!< Least significant half-word of 2nd rank of \a u64. + #define LSH0(u64) MSH3(u64) //!< Least significant half-word of 1st rank of \a u64. + #define MSB0D(u64) (((U8 *)&(u64))[0]) //!< Most significant byte of 1st rank of \a u64. + #define MSB1D(u64) (((U8 *)&(u64))[1]) //!< Most significant byte of 2nd rank of \a u64. + #define MSB2D(u64) (((U8 *)&(u64))[2]) //!< Most significant byte of 3rd rank of \a u64. + #define MSB3D(u64) (((U8 *)&(u64))[3]) //!< Most significant byte of 4th rank of \a u64. + #define MSB4D(u64) (((U8 *)&(u64))[4]) //!< Most significant byte of 5th rank of \a u64. + #define MSB5D(u64) (((U8 *)&(u64))[5]) //!< Most significant byte of 6th rank of \a u64. + #define MSB6D(u64) (((U8 *)&(u64))[6]) //!< Most significant byte of 7th rank of \a u64. + #define MSB7D(u64) (((U8 *)&(u64))[7]) //!< Most significant byte of 8th rank of \a u64. + #define LSB7D(u64) MSB0D(u64) //!< Least significant byte of 8th rank of \a u64. + #define LSB6D(u64) MSB1D(u64) //!< Least significant byte of 7th rank of \a u64. + #define LSB5D(u64) MSB2D(u64) //!< Least significant byte of 6th rank of \a u64. + #define LSB4D(u64) MSB3D(u64) //!< Least significant byte of 5th rank of \a u64. + #define LSB3D(u64) MSB4D(u64) //!< Least significant byte of 4th rank of \a u64. + #define LSB2D(u64) MSB5D(u64) //!< Least significant byte of 3rd rank of \a u64. + #define LSB1D(u64) MSB6D(u64) //!< Least significant byte of 2nd rank of \a u64. + #define LSB0D(u64) MSB7D(u64) //!< Least significant byte of 1st rank of \a u64. + +#else + #error Unknown endianism. +#endif + +//! @} + + +/*! \name Endianism Conversion + * + * The same considerations as for clz and ctz apply here but AVR32-GCC's + * __builtin_bswap_16 and __builtin_bswap_32 do not behave like macros when + * applied to constant expressions, so two sets of macros are defined here: + * - Swap16, Swap32 and Swap64 to apply to constant expressions (values known + * at compile time); + * - swap16, swap32 and swap64 to apply to non-constant expressions (values + * unknown at compile time). + */ +//! @{ + +/*! \brief Toggles the endianism of \a u16 (by swapping its bytes). + * + * \param u16 U16 of which to toggle the endianism. + * + * \return Value resulting from \a u16 with toggled endianism. + * + * \note More optimized if only used with values known at compile time. + */ +#define Swap16(u16) ((U16)(((U16)(u16) >> 8) |\ + ((U16)(u16) << 8))) + +/*! \brief Toggles the endianism of \a u32 (by swapping its bytes). + * + * \param u32 U32 of which to toggle the endianism. + * + * \return Value resulting from \a u32 with toggled endianism. + * + * \note More optimized if only used with values known at compile time. + */ +#define Swap32(u32) ((U32)(((U32)Swap16((U32)(u32) >> 16)) |\ + ((U32)Swap16((U32)(u32)) << 16))) + +/*! \brief Toggles the endianism of \a u64 (by swapping its bytes). + * + * \param u64 U64 of which to toggle the endianism. + * + * \return Value resulting from \a u64 with toggled endianism. + * + * \note More optimized if only used with values known at compile time. + */ +#define Swap64(u64) ((U64)(((U64)Swap32((U64)(u64) >> 32)) |\ + ((U64)Swap32((U64)(u64)) << 32))) + +/*! \brief Toggles the endianism of \a u16 (by swapping its bytes). + * + * \param u16 U16 of which to toggle the endianism. + * + * \return Value resulting from \a u16 with toggled endianism. + * + * \note More optimized if only used with values unknown at compile time. + */ +#if (defined __GNUC__) + #define swap16(u16) ((U16)__builtin_bswap_16((U16)(u16))) +#elif (defined __ICCAVR32__) + #define swap16(u16) ((U16)__swap_bytes_in_halfwords((U16)(u16))) +#endif + +/*! \brief Toggles the endianism of \a u32 (by swapping its bytes). + * + * \param u32 U32 of which to toggle the endianism. + * + * \return Value resulting from \a u32 with toggled endianism. + * + * \note More optimized if only used with values unknown at compile time. + */ +#if (defined __GNUC__) + #define swap32(u32) ((U32)__builtin_bswap_32((U32)(u32))) +#elif (defined __ICCAVR32__) + #define swap32(u32) ((U32)__swap_bytes((U32)(u32))) +#endif + +/*! \brief Toggles the endianism of \a u64 (by swapping its bytes). + * + * \param u64 U64 of which to toggle the endianism. + * + * \return Value resulting from \a u64 with toggled endianism. + * + * \note More optimized if only used with values unknown at compile time. + */ +#define swap64(u64) ((U64)(((U64)swap32((U64)(u64) >> 32)) |\ + ((U64)swap32((U64)(u64)) << 32))) + +//! @} + + +/*! \name Target Abstraction + */ +//! @{ + +#define _GLOBEXT_ extern //!< extern storage-class specifier. +#define _CONST_TYPE_ const //!< const type qualifier. +#define _MEM_TYPE_SLOW_ //!< Slow memory type. +#define _MEM_TYPE_MEDFAST_ //!< Fairly fast memory type. +#define _MEM_TYPE_FAST_ //!< Fast memory type. + +typedef U8 Byte; //!< 8-bit unsigned integer. + +#define memcmp_ram2ram memcmp //!< Target-specific memcmp of RAM to RAM. +#define memcmp_code2ram memcmp //!< Target-specific memcmp of RAM to NVRAM. +#define memcpy_ram2ram memcpy //!< Target-specific memcpy from RAM to RAM. +#define memcpy_code2ram memcpy //!< Target-specific memcpy from NVRAM to RAM. + +#define LSB0(u32) LSB0W(u32) //!< Least significant byte of 1st rank of \a u32. +#define LSB1(u32) LSB1W(u32) //!< Least significant byte of 2nd rank of \a u32. +#define LSB2(u32) LSB2W(u32) //!< Least significant byte of 3rd rank of \a u32. +#define LSB3(u32) LSB3W(u32) //!< Least significant byte of 4th rank of \a u32. +#define MSB3(u32) MSB3W(u32) //!< Most significant byte of 4th rank of \a u32. +#define MSB2(u32) MSB2W(u32) //!< Most significant byte of 3rd rank of \a u32. +#define MSB1(u32) MSB1W(u32) //!< Most significant byte of 2nd rank of \a u32. +#define MSB0(u32) MSB0W(u32) //!< Most significant byte of 1st rank of \a u32. + +//! @} + +#endif // __AVR32_ABI_COMPILER__ + + +#endif // _COMPILER_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/conf_isp.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/conf_isp.h new file mode 100644 index 0000000..ca516ee --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/conf_isp.h @@ -0,0 +1,136 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ****************************************************************** + * + * \brief ISP configuration file. + * + * This file contains the possible external configuration of the ISP. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with a USB module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ***************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _CONF_ISP_H_ +#define _CONF_ISP_H_ + +#include +#include "compiler.h" + + +//_____ D E F I N I T I O N S ______________________________________________ + +#define PRODUCT_MANUFACTURER_ID 0x58 +#define PRODUCT_FAMILY_ID 0x20 + +#define ISP_VERSION 0x10 +#define ISP_ID0 0x00 +#define ISP_ID1 0x00 + +#define ISP_CFG1 (*(volatile U32 *)ISP_CFG1_ADDRESS) +#define ISP_CFG1_ADDRESS (AVR32_FLASHC_USER_PAGE_ADDRESS + ISP_CFG1_OFFSET) +#define ISP_CFG1_OFFSET 0x000001FC +#define ISP_CFG1_SIZE 4 + +#define ISP_CFG1_BOOT_KEY1 16 +#define ISP_CFG1_BOOT_KEY1_MASK 0xFFFF0000 +#define ISP_CFG1_BOOT_KEY1_OFFSET 16 +#define ISP_CFG1_BOOT_KEY1_SIZE 16 +#define ISP_CFG1_BOOT_KEY1_VALUE 0xE11E + +#define ISP_CFG1_FORCE 9 +#define ISP_CFG1_FORCE_MASK 0x00000200 +#define ISP_CFG1_FORCE_OFFSET 9 +#define ISP_CFG1_FORCE_SIZE 1 + +#define ISP_CFG1_IO_COND_EN 8 +#define ISP_CFG1_IO_COND_EN_MASK 0x00000100 +#define ISP_CFG1_IO_COND_EN_OFFSET 8 +#define ISP_CFG1_IO_COND_EN_SIZE 1 + +#define ISP_CFG1_CRC8 0 +#define ISP_CFG1_CRC8_MASK 0x000000FF +#define ISP_CFG1_CRC8_OFFSET 0 +#define ISP_CFG1_CRC8_SIZE 8 +#define ISP_CFG1_CRC8_POLYNOMIAL 0x107 + +#define ISP_CFG2 (*(volatile U32 *)ISP_CFG2_ADDRESS) +#define ISP_CFG2_ADDRESS (AVR32_FLASHC_USER_PAGE_ADDRESS + ISP_CFG2_OFFSET) +#define ISP_CFG2_OFFSET 0x000001F8 +#define ISP_CFG2_SIZE 4 + +#define ISP_CFG2_BOOT_KEY 17 +#define ISP_CFG2_BOOT_KEY_MASK 0xFFFE0000 +#define ISP_CFG2_BOOT_KEY_OFFSET 17 +#define ISP_CFG2_BOOT_KEY_SIZE 15 +#define ISP_CFG2_BOOT_KEY_VALUE 0x494F + +#define ISP_CFG2_IO_COND_LEVEL 16 +#define ISP_CFG2_IO_COND_LEVEL_MASK 0x00010000 +#define ISP_CFG2_IO_COND_LEVEL_OFFSET 16 +#define ISP_CFG2_IO_COND_LEVEL_SIZE 1 + +#define ISP_CFG2_IO_COND_PIN 8 +#define ISP_CFG2_IO_COND_PIN_MASK 0x0000FF00 +#define ISP_CFG2_IO_COND_PIN_OFFSET 8 +#define ISP_CFG2_IO_COND_PIN_SIZE 8 + +#define ISP_CFG2_CRC8 0 +#define ISP_CFG2_CRC8_MASK 0x000000FF +#define ISP_CFG2_CRC8_OFFSET 0 +#define ISP_CFG2_CRC8_SIZE 8 +#define ISP_CFG2_CRC8_POLYNOMIAL 0x107 + +#define ISP_KEY (*(volatile U32 *)ISP_KEY_ADDRESS) +#define ISP_KEY_ADDRESS (AVR32_SRAM_ADDRESS + ISP_KEY_OFFSET) +#define ISP_KEY_OFFSET 0x00000000 +#define ISP_KEY_SIZE 4 +#define ISP_KEY_VALUE ('I' << 24 | 'S' << 16 | 'P' << 8 | 'K') + +#ifndef ISP_OSC + #define ISP_OSC 0 +#endif + +#define DFU_FRAME_LENGTH 2048 + +#define PROGRAM_START_ADDRESS (AVR32_FLASH_ADDRESS + PROGRAM_START_OFFSET) +#define PROGRAM_START_OFFSET 0x00002000 + + +#endif // _CONF_ISP_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/parts.h b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/parts.h new file mode 100644 index 0000000..6637b2f --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/SOFTWARE_FRAMEWORK/UTILS/parts.h @@ -0,0 +1,203 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Arch file for AVR32. + * + * This file defines common AVR32 UC3 series. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _ARCH_H_ +#define _ARCH_H_ + +// UC3 A Series +#define UC3A0 ( defined (__GNUC__) && \ + ( defined (__AVR32_UC3A0128__) || \ + defined (__AVR32_UC3A0256__) || \ + defined (__AVR32_UC3A0512__) || \ + defined (__AVR32_UC3A0512ES__))) \ + ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ + ( defined (__AT32UC3A0128__) || \ + defined (__AT32UC3A0256__) || \ + defined (__AT32UC3A0512__) || \ + defined (__AT32UC3A0512ES__))) + +#define UC3A1 ( defined (__GNUC__) && \ + ( defined (__AVR32_UC3A1128__) || \ + defined (__AVR32_UC3A1256__) || \ + defined (__AVR32_UC3A1512__) || \ + defined (__AVR32_UC3A1512ES__))) \ + ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ + ( defined (__AT32UC3A1128__) || \ + defined (__AT32UC3A1256__) || \ + defined (__AT32UC3A1512__) || \ + defined (__AT32UC3A1512ES__))) + +#define UC3A3 ( defined (__GNUC__) && \ + ( defined (__AVR32_UC3A364__) || \ + defined (__AVR32_UC3A364S__) || \ + defined (__AVR32_UC3A3128__) || \ + defined (__AVR32_UC3A3128S__) || \ + defined (__AVR32_UC3A3256__) || \ + defined (__AVR32_UC3A3256S__))) \ + ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ + ( defined (__AT32UC3A364__) || \ + defined (__AT32UC3A364S__) || \ + defined (__AT32UC3A3128__) || \ + defined (__AT32UC3A3128S__) || \ + defined (__AT32UC3A3256__) || \ + defined (__AT32UC3A3256S__))) + +#define UC3A (UC3A0 || UC3A1 || UC3A3) + +// UC3 B Series +#define UC3B0 ( defined (__GNUC__) && \ + ( defined (__AVR32_UC3B064__) || \ + defined (__AVR32_UC3B0128__) || \ + defined (__AVR32_UC3B0256__) || \ + defined (__AVR32_UC3B0256ES__) || \ + defined (__AVR32_UC3B0512__) || \ + defined (__AVR32_UC3B0512REVC_))) \ + ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ + ( defined (__AT32UC3B064__) || \ + defined (__AT32UC3B0128__) || \ + defined (__AT32UC3B0256__) || \ + defined (__AT32UC3B0256ES__) || \ + defined (__AT32UC3B0512__) || \ + defined (__AT32UC3B0512REVC__))) + +#define UC3B1 ( defined (__GNUC__) && \ + ( defined (__AVR32_UC3B164__) || \ + defined (__AVR32_UC3B1128__) || \ + defined (__AVR32_UC3B1256__) || \ + defined (__AVR32_UC3B1256ES__) || \ + defined (__AVR32_UC3B1512__) || \ + defined (__AVR32_UC3B1512ES__))) \ + ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ + ( defined (__AT32UC3B164__) || \ + defined (__AT32UC3B1128__) || \ + defined (__AT32UC3B1256__) || \ + defined (__AT32UC3B1256ES__) || \ + defined (__AT32UC3B1512__) || \ + defined (__AT32UC3B1512REVC__))) + +#define UC3B (UC3B0 || UC3B1 ) + +// UC3 C Series +#define UC3C0 ( defined (__GNUC__) && \ + ( defined (__AVR32_UC3C064C__) || \ + defined (__AVR32_UC3C0128C__) || \ + defined (__AVR32_UC3C0256C__) || \ + defined (__AVR32_UC3C0512CREVC__))) \ + ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ + ( defined (__AT32UC3C064C__) || \ + defined (__AT32UC3C0128C__) || \ + defined (__AT32UC3C0256C__) || \ + defined (__AT32UC3C0512C__))) + +#define UC3C1 ( defined (__GNUC__) && \ + ( defined (__AVR32_UC3C164C__) || \ + defined (__AVR32_UC3C1128C__) || \ + defined (__AVR32_UC3C1256C__) || \ + defined (__AVR32_UC3C1512CREVC__))) \ + ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ + ( defined (__AT32UC3C164C__) || \ + defined (__AT32UC3C1128C__) || \ + defined (__AT32UC3C1256C__) || \ + defined (__AT32UC3C1512C__))) + +#define UC3C2 ( defined (__GNUC__) && \ + ( defined (__AVR32_UC3C264C__) || \ + defined (__AVR32_UC3C2128C__) || \ + defined (__AVR32_UC3C2256C__) || \ + defined (__AVR32_UC3C2512CREVC__))) \ + ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ + ( defined (__AT32UC3C264C__) || \ + defined (__AT32UC3C2128C__) || \ + defined (__AT32UC3C2256C__) || \ + defined (__AT32UC3C2512C__))) + +#define UC3C (UC3C0 || UC3C1 || UC3C2) + +// UC3 L Device series +#define UC3L0 ( defined (__GNUC__) && \ + ( defined (__AVR32_UC3L016__) || \ + defined (__AVR32_UC3L032__) || \ + defined (__AVR32_UC3L064__) || \ + defined (__AVR32_UC3L064REVB__))) \ + ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ + ( defined (__AT32UC3L016__) || \ + defined (__AT32UC3L032__) || \ + defined (__AT32UC3L064__) || \ + defined (__AT32UC3L064REVB__))) + +#define UC3L1 ( defined (__GNUC__) && \ + ( defined (__AVR32_UC3L116__) || \ + defined (__AVR32_UC3L132__) || \ + defined (__AVR32_UC3L164__))) \ + ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ + ( defined (__AT32UC3L116__) || \ + defined (__AT32UC3L132__) || \ + defined (__AT32UC3L164__))) + +#define UC3L2 ( defined (__GNUC__) && \ + ( defined (__AVR32_UC3L216__) || \ + defined (__AVR32_UC3L232__) || \ + defined (__AVR32_UC3L264__))) \ + ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ + ( defined (__AT32UC3L216__) || \ + defined (__AT32UC3L232__) || \ + defined (__AT32UC3L264__))) + +#define UC3L3 ( defined (__GNUC__) && \ + ( defined (__AVR32_UC3L316__) || \ + defined (__AVR32_UC3L332__) || \ + defined (__AVR32_UC3L364__))) \ + ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ + ( defined (__AT32UC3L316__) || \ + defined (__AT32UC3L332__) || \ + defined (__AT32UC3L364__))) + +#define UC3L (UC3L0 || UC3L1 || UC3L2 || UC3L3) + +#endif // _ARCH_H_ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/ard_spi.c b/firmware/libraries/WiFi/extras/wifiHD/src/ard_spi.c new file mode 100644 index 0000000..8bd288b --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/ard_spi.c @@ -0,0 +1,1969 @@ +/* + * ard_spi.c + * + * Created on: May 27, 2010 + * Author: mlf by Metodo2 srl + */ + +//#define _APP_DEBUG_ + +#include +#include "board.h" +#include "gpio.h" +#include "usart.h" +#include "ard_spi.h" +#include "ard_tcp.h" +#include "wifi_spi.h" +#include "wl_cm.h" +#include "ard_utils.h" +#include "intc.h" +#include "spi.h" +#include "debug.h" +#include "delay.h" +#include "eic.h" +#include "timer.h" +#include "lwip/dns.h" +#include +#include "util.h" +#include "lwip/udp.h" +#include "lwip_setup.h" + +extern const char* fwVersion; + +/*! \name USART Settings + */ +//! @{ +#if BOARD == EVK1105 +# define ARD_USART_SPI (&AVR32_USART1) +# define ARD_USART_SPI_SCK_PIN AVR32_USART1_CLK_0_PIN +# define ARD_USART_SPI_SCK_FUNCTION AVR32_USART1_CLK_0_FUNCTION +# define ARD_USART_SPI_MISO_PIN AVR32_USART1_TXD_0_0_PIN +# define ARD_USART_SPI_MISO_FUNCTION AVR32_USART1_TXD_0_0_FUNCTION +# define ARD_USART_SPI_MOSI_PIN AVR32_USART1_RXD_0_0_PIN +# define ARD_USART_SPI_MOSI_FUNCTION AVR32_USART1_RXD_0_0_FUNCTION +# define ARD_USART_SPI_NSS_PIN AVR32_USART1_CTS_0_0_PIN +# define ARD_USART_SPI_NSS_FUNCTION AVR32_USART1_CTS_0_0_FUNCTION +# define ARD_USART_SPI_IRQ AVR32_USART1_IRQ +#endif +#if BOARD == ARDUINO +# define ARD_SPI (&AVR32_SPI0) +#define EXT_INT_PIN_LINE1 AVR32_EIC_EXTINT_5_PIN +#define EXT_INT_FUNCTION_LINE1 AVR32_EIC_EXTINT_5_FUNCTION +#define EXT_INT_LINE1 EXT_INT5 +#define EXT_INT_IRQ_LINE1 AVR32_EIC_IRQ_5 +#define EXT_INT_NB_LINES 1 +#endif + +/* These defines should be adjusted to match the application */ +/*! \brief CPU core speed in Hz */ +#define CPUHZ 60000000 +/*! \brief Number of bytes in the receive buffer when operating in slave mode */ +#define BUFFERSIZE 64 +/*! \brief A adjustable delay avoiding multiple requests on the switches */ +//#define TIMEOUT 150000 +#define TIMEOUT CPUHZ/200 +/*! \brief Number of bits in each SPI package*/ +#define SPI_BITS 8 +/*! \brief SPI slave speed in Hz */ +#define SPI_SLAVE_SPEED 1000000 + + +#ifndef CMD_MAX_LEN +#define CMD_MAX_LEN 1024 +#endif +#ifndef REPLY_MAX_LEN +#define REPLY_MAX_LEN 1024 +#endif + +#define _BUFFERSIZE 100 + +extern void tcp_debug_print_pcbs(void); +extern bool ifStatus; +extern bool scanNetCompleted; + +static char buf[CMD_MAX_LEN]; +static char reply[REPLY_MAX_LEN]; +static uint16_t cmdCorr = 0; +static uint16_t count = 0; +static uint16_t replyCount = 0; +static cmd_spi_state_t state = SPI_CMD_IDLE; +int receivedChars = 0; +static uint8_t _receiveBuffer[_BUFFERSIZE]; +bool startReply = false; +bool end_write = false; //TODO only for debug + +// Signal indicating a new command is coming from SPI interface +static volatile Bool startRecvCmdSignal = FALSE; + +#define MAX_CMD_NUM 36 +typedef struct sCmd_spi_list{ + cmd_spi_cb_t cb; + char cmd_id; + cmd_spi_rcb_t reply_cb; + void* ctx; + char flags; +}tCmd_spi_list; + +static tCmd_spi_list cmd_spi_list[MAX_CMD_NUM] = { {0} }; + +#ifdef _SPI_STATS_ +typedef struct sStatSpi +{ + int timeoutIntErr; + int timeoutErr; + int txErr; + int rxErr; + int wrongFrame; + int frameDisalign; + int overrideFrame; + int lastCmd; + int lastError; + unsigned long status; +}tStatSpi; + +tStatSpi statSpi = {0}; + +void initStatSpi() +{ + statSpi.lastCmd = 0; + statSpi.lastError = 0; + statSpi.status= 0; + statSpi.txErr = 0; + statSpi.rxErr = 0; + statSpi.timeoutErr= 0; + statSpi.timeoutIntErr= 0; + statSpi.wrongFrame = 0; + statSpi.frameDisalign = 0; + statSpi.overrideFrame = 0; +} + +void printStatSpi() +{ + printk("totSpiCmds\t: 0x%x\n", cmdCorr); + printk("lastCmd \t: 0x%x\n", statSpi.lastCmd); + printk("lastErr \t: 0x%x\n", statSpi.lastError); + printk("spiStatus\t: 0x%X\n", statSpi.status); + printk("spiTxErr \t: 0x%x\n", statSpi.txErr); + printk("spiRxErr \t: 0x%x\n", statSpi.rxErr); + printk("spiTmoErr\t: 0x%x\n", statSpi.timeoutErr); + printk("spiTmoIntErr\t: 0x%x\n", statSpi.timeoutIntErr); + printk("wrongFrame\t: 0x%x\n", statSpi.wrongFrame); + printk("disalFrame\t: 0x%x\n", statSpi.frameDisalign); + printk("overrideFrame\t: 0x%x\n", statSpi.overrideFrame); +} + +cmd_state_t +cmd_statSpi(int argc, char* argv[], void* ctx) +{ + printStatSpi(); + return CMD_DONE; +} + +cmd_state_t +cmd_resetStatSpi(int argc, char* argv[], void* ctx) +{ + initStatSpi(); + return CMD_DONE; +} +#endif + +#define ARRAY_SIZE(a) sizeof(a) / sizeof(a[0]) +#define RETURN_ERR(e) return (e==WL_SUCCESS) ? WIFI_SPI_ACK : WIFI_SPI_ERR; +#define RESET_USART_CSR(usart) usart->cr = AVR32_USART_CR_RSTSTA_MASK; + +int result = WL_CONNECT_FAILED; //Store the result of the last operation + +void* mapSockTCP[MAX_SOCK_NUM][MAX_MODE_NUM]; + +//Udp RemoteIp and remote Port +static tRemoteClient remoteClients[MAX_SOCK_NUM] = {{0,0}}; + +void setRemoteClient(uint16_t sock, uint32_t _ipaddr, uint16_t _port) +{ + if (sock < MAX_SOCK_NUM) + { + remoteClients[sock].ipaddr = _ipaddr; + remoteClients[sock].port = _port; + } +} + +tRemoteClient* getRemoteClient(uint16_t sock) +{ + if (sock < MAX_SOCK_NUM) + { + return &remoteClients[sock]; + } + return NULL; +} + +struct netif* ard_netif = NULL; + +// Network list retrived in the last scanNetwork +static struct wl_network_list_t network_list = { 0 }; + +struct ip_addr _hostIpAddr; + +static bool hostIpAddrFound = false; + +void* getTTCP(uint8_t sock, uint8_t mode) +{ + if (sock < MAX_SOCK_NUM) + return mapSockTCP[sock][mode]; + return NULL; +} + +int getSock(void * _ttcp) +{ + if (_ttcp != NULL) + { + int i = 0; + for (; istart_time; + uint32_t bytes = ttcp->mode == TTCP_MODE_TRANSMIT ? ttcp->nbuf + * ttcp->buflen : ttcp->recved; + + if (ttcp->verbose) + printk("\n"); + + printk("TTCP [%p]: %d bytes processed, %d.%d KB/s (%s/%s)\n", ttcp, bytes, + bytes / ms, bytes % ms, ProtMode2Str(ttcp->udp), + Mode2Str(ttcp->mode)); +} +#endif + +void showTTCPstatus() +{ + printk("IF status: %s\n", (ifStatus) ? "UP":"DOWN"); + printk("CONN status: %s\n", (_connected) ? "UP":"DOWN"); + + int i = 0; + for (; iudp), Mode2Str(_ttcp->mode), ip2str(_ttcp->addr), _ttcp->port); + if (_ttcp->udp == TCP_MODE) + { + int j = 0; + for (; jtpcb[j]){ + printk("[%d tpcp-%p]-Status:%d\n", j, _ttcp->tpcb[j], _ttcp->tpcb[j]->state); + } + } + + if (_ttcp->lpcb){ + printk("[tlcp-%p]-Status:%d\n", _ttcp->lpcb, _ttcp->lpcb->state); + } + }else{ + if (_ttcp->upcb){ + struct ip_addr loc = _ttcp->upcb->local_ip; + printk("[upcp-%p] flags:0x%x local:%s[0x%x]-%d\n", + _ttcp->upcb, _ttcp->upcb->flags, + ip2str(loc), loc, _ttcp->upcb->local_port); + tRemoteClient remote = {0,0};; + getRemoteData(i, ii, &remote); + struct ip_addr ipaddr = { remote.ipaddr }; + printk("remote:%s(0x%x)-%d\n", ip2str(ipaddr), remote.ipaddr, remote.port); + } + } + //ard_tcp_print_stats(_ttcp); + printk("Data avail:%s\n", isAvailTcpDataByte(i)?"YES":"NO"); + printk("------------------------------\n"); + } + } + } + + tcp_debug_print_pcbs(); +} + +int write_stream(volatile avr32_spi_t *spi, const char *stream, uint16_t len) +{ + uint16_t _len = 0; + unsigned short dummy=0; + + do { + //SIGN1_DN(); + if (spi_write(spi, *stream) == SPI_ERROR_TIMEOUT) + { +#ifdef _SPI_STATS_ + statSpi.timeoutErr++; + statSpi.txErr++; + statSpi.lastError = SPI_ERROR_TIMEOUT; + statSpi.status = spi_getStatus(spi); +#endif + return SPI_ERROR_TIMEOUT; + } + else + { + stream++; + _len++; + spi_read(spi,&dummy); + } + //SIGN1_UP(); + }while (_len < len); + return SPI_OK; +} + +void sendError() +{ + AVAIL_FOR_SPI(); + if (spi_write(&AVR32_SPI, ERR_CMD) != SPI_ERROR_TIMEOUT) + { + //Wait to empty the buffer + while(!spi_writeRegisterEmptyCheck(&AVR32_SPI)); + } + BUSY_FOR_SPI(); + WARN("Send SPI error!\n"); +} + +#define ENABLE_SPI_INT() do { \ + volatile avr32_spi_t *spi = ARD_SPI; \ + Bool global_interrupt_enabled = Is_global_interrupt_enabled(); \ + if (global_interrupt_enabled) Disable_global_interrupt(); \ + spi->IER.rdrf = 1; spi->IER.rxbuff = 1; spi->IER.endrx = 1; \ + if (global_interrupt_enabled) Enable_global_interrupt(); \ +}while(0); + +#define DISABLE_SPI_INT() do { \ + volatile avr32_spi_t *spi = ARD_SPI; \ + Bool global_interrupt_enabled = Is_global_interrupt_enabled(); \ + if (global_interrupt_enabled) Disable_global_interrupt(); \ + spi->IDR.rdrf = 1; spi->IDR.rxbuff = 1; spi->IDR.endrx = 1; \ + if (global_interrupt_enabled) Enable_global_interrupt(); \ +}while(0); + +#define CLEAR_SPI_INT() do { \ + eic_clear_interrupt_line(&AVR32_EIC, AVR32_SPI0_IRQ); \ + }while(0); + +int spi_add_cmd(char _cmd_id, cmd_spi_cb_t cb, cmd_spi_rcb_t rcb, void* ctx, + char flag) { + U32 i; + for (i = 0; i < ARRAY_SIZE(cmd_spi_list); i++) + if (!cmd_spi_list[i].cb) + break; + + if (i == ARRAY_SIZE(cmd_spi_list)) + { + printk("List Commands full!\n"); + return -1; + } + cmd_spi_list[i].cmd_id = _cmd_id; + cmd_spi_list[i].cb = cb; + cmd_spi_list[i].reply_cb = rcb; + cmd_spi_list[i].ctx = ctx; + cmd_spi_list[i].flags = flag; + return 0; +} + +int set_net_cmd_cb(int numParam, char* buf, void* ctx) { + struct wl_ssid_t ssid; + wl_err_t err = WL_FAILURE; + tParam* param = (tParam*) buf; + + if (param->paramLen < WL_SSID_MAX_LENGTH) { + memcpy(ssid.ssid, ¶m->param, param->paramLen); + ssid.len = param->paramLen; + ssid.ssid[ssid.len] = 0; + INFO_SPI("SSID:%s\n", ssid.ssid); + //dump(ssid.ssid, ssid.len); + err = wl_cm_set_network(&ssid, NULL); + if (err != 1) + WARN("err=%d\n", err); + } else { + WARN("SSID len out of range"); + } + return err; +} + +extern uint8_t ascii_to_key(char *outp, const char *inp); + +int set_key_cmd_cb(int numParam, char* buf, void* ctx) { + struct wl_ssid_t ssid; + struct wl_mac_addr_t bssid; + uint8_t idx=0, len=0; + char key[13], key_hex[27]; + char keyIdx[2]; + wl_err_t err = WL_SUCCESS; + tParam* params = (tParam*) buf; + + INFO_SPI("%s params=%d\n", __FUNCTION__, numParam); + + // SSID + memset(&ssid, 0, sizeof ssid); + + if (params->paramLen < WL_SSID_MAX_LENGTH) { + memcpy(ssid.ssid, ¶ms->param, params->paramLen); + ssid.len = params->paramLen; + INFO_SPI("%s\n", ssid.ssid); + } else { + //printk("SSID len out of range"); + RETURN_ERR(WL_FAILURE) + } + + params = (tParam*)((char*)buf+PARAM_LEN_SIZE+params->paramLen); + strncpy(keyIdx, (const char*)¶ms->param, params->paramLen); + keyIdx[(uint8_t)params->paramLen]='\0'; + + idx = (uint8_t)atoi(keyIdx); + // KEY IDX + if ((params->paramLen != 1)||(idx < 0)||(idx > 3)){ + //printk("KEY IDX out of range %d\n", idx); + RETURN_ERR(WL_FAILURE) + } + + params = (tParam*)((char*)params+PARAM_LEN_SIZE+params->paramLen); + strncpy(key_hex, (const char*)¶ms->param, params->paramLen); + key_hex[(uint8_t)params->paramLen]='\0'; + len = ascii_to_key(key, key_hex); + // KEY + if (( len != 5)&&(len != 13)) + { + //printk("KEY len out of range %d", len); + RETURN_ERR(WL_FAILURE) + } +#if 0 + printk("KEY IDX = %d\n", idx); + dump(key, len); + printk("KEY len %d\n", len); +#endif + memset(&bssid.octet, 0xff, sizeof bssid.octet); + + wl_add_wep_key(idx, len, key, &bssid); + //wl_set_auth_mode(AUTH_MODE_SHARED_KEY); + wl_set_default_wep_key(idx); + + //Connect + err = wl_cm_set_network(&ssid, NULL); + if (err != 1) + WARN("err=%d\n", err); + RETURN_ERR(err) +} + +int set_passphrase_cmd_cb(int numParam, char* buf, void* ctx) { + struct wl_network_t net; + char pass[64]; + wl_err_t err = WL_SUCCESS; + tParam* params = (tParam*) buf; + + INFO_SPI("%s params=%d\n", __FUNCTION__, numParam); + + memset(&net, 0, sizeof net); + memset(net.bssid.octet, 0xFF, sizeof net.bssid.octet); + + net.enc_type = ENC_TYPE_AUTO; + + // SSID + if (params->paramLen < WL_SSID_MAX_LENGTH) { + memcpy(net.ssid.ssid, ¶ms->param, params->paramLen); + net.ssid.len = params->paramLen; + INFO_SPI("%s %d\n", net.ssid.ssid, net.ssid.len); + } else { + //printk("SSID len out of range"); + RETURN_ERR(WL_FAILURE) + } + params = (tParam*)((char*)buf+PARAM_LEN_SIZE+params->paramLen); + // PASSPHRASE + + strncpy(pass, (const char*)¶ms->param, params->paramLen); + pass[(uint8_t)params->paramLen]='\0'; + INFO_SPI("Pass: %s %d\n", pass, params->paramLen); + + if (wl_set_passphrase(&net, + pass, + params->paramLen, + ENC_TYPE_AUTO, + AUTH_MODE_AUTO) + != WL_SUCCESS) { + WARN("%s : Failed to add passphrase\n", __func__); + + RETURN_ERR(WL_FAILURE) + } + printk("Connect to network..."); + //Connect + err = wl_cm_set_network(&net.ssid, NULL); + if (err != 1) + printk("err=%d\n", err); + else + printk("OK\n"); + RETURN_ERR(err) +} + +int set_ip_config_cmd_cb(int numParam, char* buf, void* ctx) { + struct ip_addr lwip_addr; + struct ctx_server *hs = ctx; + struct net_cfg *ncfg = &(hs->net_cfg); + struct netif *nif = ncfg->netif; + uint8_t parmsToChange=0; + const uint8_t MAX_IP_CONFIG_PARAMS = 3; + + wl_err_t err = WL_SUCCESS; + tParam* params = (tParam*) buf; + + if (params->paramLen == 1) + { + GET_PARAM_NEXT(BYTE, params, _parmsToChange); + parmsToChange = _parmsToChange; + } + else + RETURN_ERR(WL_FAILURE) + + INFO_SPI("%p numParam=%d parmsToChange=%d\n", ctx, numParam, parmsToChange); + + if (parmsToChange <= MAX_IP_CONFIG_PARAMS) + { + int i=0; + for (; iparamLen == 4) + { + GET_PARAM_NEXT(LONG, params, _ip_addr); + lwip_addr.addr = _ip_addr; + INFO_SPI("%d] nif:%p lwip_addr=0x%x\n", i, nif, lwip_addr.addr); + switch (i) + { + case 0: // local_ip + { + netif_set_ipaddr(nif, &lwip_addr); + break; + } + case 1: // gateway + { + netif_set_gw(nif, &lwip_addr); + break; + } + case 2: // subnet + { + netif_set_netmask(nif, &lwip_addr); + break; + } + } + }else{ + RETURN_ERR(WL_FAILURE) + } + + } + /* Disable DHCP */ + ncfg->dhcp_enabled = STATIC_IP_CONFIG; + }else + RETURN_ERR(WL_FAILURE) + + RETURN_ERR(err) +} + +int set_dns_config_cmd_cb(int numParam, char* buf, void* ctx) { + struct ip_addr lwip_addr; + struct ctx_server *hs = ctx; + struct net_cfg *ncfg = &(hs->net_cfg); + struct netif *nif = ncfg->netif; + uint8_t parmsToChange=0; + const uint8_t MAX_DNS_CONFIG_PARAMS = 2; + + wl_err_t err = WL_SUCCESS; + tParam* params = (tParam*) buf; + + if (params->paramLen == 1) + { + GET_PARAM_NEXT(BYTE, params, _parmsToChange); + parmsToChange = _parmsToChange; + } + else + RETURN_ERR(WL_FAILURE) + + INFO_SPI("%p numParam=%d parmsToChange=%d\n", ctx, numParam, parmsToChange); + + if (parmsToChange <= MAX_DNS_CONFIG_PARAMS) + { + int i=0; + for (; iparamLen == 4) + { + GET_PARAM_NEXT(LONG, params, _ip_addr); + lwip_addr.addr = _ip_addr; + INFO_SPI("%d] nif:%p lwip_addr=0x%x\n", i, nif, lwip_addr.addr); + dns_setserver(i, &lwip_addr); + }else{ + RETURN_ERR(WL_FAILURE) + } + } + /* Disable DHCP */ + ncfg->dhcp_enabled = STATIC_IP_CONFIG; + }else + RETURN_ERR(WL_FAILURE) + + RETURN_ERR(err) +} + + + +void set_result(wl_status_t _status) +{ + result = _status; +} + + +void set_result_cmd(int err) +{ + wl_err_t _err = (wl_err_t)err; + switch (_err) + { + case WL_SUCCESS: + set_result(WL_CONNECTED); + ERROR_LED_OFF(); + break; + default: + case WL_OOM: + case WL_INVALID_LENGTH: + case WL_NOT_SUPPORTED: + case WL_ABSORBED: + case WL_RESOURCES: + case WL_BUSY: + case WL_RETRY: + case WL_FAILURE: + set_result(WL_CONNECT_FAILED); + ERROR_LED_ON(); + break; + } + INFO_SPI("%s %d\n", __FUNCTION__, result); +} + + + +extern int ttcp_start(struct ip_addr addr, uint16_t port, void *opaque, + void *done_cb, int mode, uint16_t nbuf, uint16_t buflen, int udp, int verbose); + + +int start_server_tcp(uint16_t port, uint8_t sock, uint8_t protMode) +{ + struct ip_addr addr = { 0 }; + uint16_t buflen = 1024; + uint16_t nbuf = 1024; + wl_err_t err = WL_FAILURE; + +#ifdef _APP_DEBUG_ + int verbose = 1; +#else + int verbose = 0; +#endif + int udp = protMode; + int mode = 1; //RECEIVE + void* _ttcp = NULL; + + if (sock >= MAX_SOCK_NUM) + return WIFI_SPI_ERR; + + if (_connected) + { + WARN("Still connected...wait\n"); + return WIFI_SPI_ERR; + } + + if (!ifStatus) + { + WARN_VER("IF down...wait\n"); + return WIFI_SPI_ERR; + } + + + if (ard_tcp_start(addr, port, NULL, NULL, mode, nbuf, buflen, udp, verbose, sock, &_ttcp) == 0) + { + INFO_SPI("Start Server %s [%d, %d] OK!\n", ProtMode2Str(protMode), port, sock); + setMapSock(sock, _ttcp); + err = WL_SUCCESS; + }else{ + + WARN("Start Server %s [%d, %d] FAILED!\n", ProtMode2Str(protMode), port, sock); + clearMapSockTcp(sock, TTCP_MODE_RECEIVE); + } + return err; +} + + +int start_server_tcp_cmd_cb(int numParam, char* buf, void* ctx) { + wl_err_t err = WL_FAILURE; + tParam* params = (tParam*) buf; + if (numParam == 3) + { + GET_PARAM_NEXT(INT, params, port); + GET_PARAM_NEXT(BYTE, params, sock); + GET_PARAM_NEXT(BYTE, params, protMode); + err = start_server_tcp(port, sock, protMode); + } + return (err==WL_SUCCESS) ? WIFI_SPI_ACK : WIFI_SPI_ERR; +} + +int start_client_tcp(uint32_t _addr, uint16_t port, uint8_t sock, uint8_t protMode) +{ + uint16_t buflen = 1024; + uint16_t nbuf = 1024; + wl_err_t err = WL_FAILURE; + struct ip_addr addr = { .addr = _addr}; + + INFO_SPI("Addr:0x%x, port:%d, sock:%d, prot:%s\n", _addr, port, sock, ProtMode2Str(protMode)); + + #ifdef _APP_DEBUG_ + int verbose = 1; + #else + int verbose = 0; + #endif + + int udp = protMode; + int mode = 0; //TRANSMIT + void* _ttcp = NULL; + + if (sock >= MAX_SOCK_NUM) + return WIFI_SPI_ERR; + + // Check previous connection + _ttcp = getTTCP(sock, TTCP_MODE_TRANSMIT); + if (_ttcp != NULL) + { + WARN("Previous client %p not stopped !\n", _ttcp); + ard_tcp_stop(_ttcp); + clearMapSockTcp(sock, TTCP_MODE_TRANSMIT); + } + + if (ard_tcp_start(addr, port, NULL, NULL, mode, nbuf, buflen, udp, verbose, sock, &_ttcp) == 0) + { + INFO_SPI("Start Client %s %p [0x%x, %d, %d] OK!\n", ProtMode2Str(protMode), + _ttcp, addr, port, sock); + setMapSock(sock, _ttcp); + err = WL_SUCCESS; + }else{ + INFO_SPI("Start Client %s %p [0x%x, %d, %d] FAILED!\n", ProtMode2Str(protMode), + _ttcp, addr, port, sock); + clearMapSockTcp(sock, TTCP_MODE_TRANSMIT); + } + return err; +} + + +int start_client_tcp_cmd_cb(int numParam, char* buf, void* ctx) { + wl_err_t err = WL_FAILURE; + tParam* params = (tParam*) buf; + if (numParam == 4) + { + GET_PARAM_NEXT(LONG, params, _addr); + GET_PARAM_NEXT(INT, params, port); + GET_PARAM_NEXT(BYTE, params, sock); + GET_PARAM_NEXT(BYTE, params, protMode); + err = start_client_tcp(_addr, port, sock, protMode); + } + return (err==WL_SUCCESS) ? WIFI_SPI_ACK : WIFI_SPI_ERR; +} + +int stop_client_tcp_cmd_cb(int numParam, char* buf, void* ctx) { + wl_err_t err = WL_FAILURE; + tParam* params = (tParam*) buf; + void* _ttcp = NULL; + + if (numParam == 1) + { + GET_PARAM_NEXT(BYTE, params, sock); + + INFO_SPI("Stop client sock:%d\n", sock); + + if (sock < MAX_SOCK_NUM) + { + _ttcp = getTTCP(sock, TTCP_MODE_TRANSMIT); + ard_tcp_stop(_ttcp); + err = WL_SUCCESS; + } + } + return (err==WL_SUCCESS) ? WIFI_SPI_ACK : WIFI_SPI_ERR; +} + +int insert_data_cmd_cb(int numParam, char* buf, void* ctx) { + + tDataParam* msg = (tDataParam*) buf; + if ((numParam == 2)&&(msg->dataLen == 1)) + { + GET_DATA_BYTE(sock, buf+2); + GET_DATA_INT(len, buf+3); + //printk("tcp:%p buf:%p len:%d\n", getTTCP(sock), (uint8_t*)(buf+5), len); + insertBuf(sock, (uint8_t*)(buf+5), len); + } + return WIFI_SPI_ACK; +} + +int send_data_udp_cmd_cb(int numParam, char* buf, void* ctx) { + wl_err_t err = WL_FAILURE; + + tParam* params = (tParam*) buf; + if ((numParam == 1)&&(params->paramLen == 1)) + { + GET_PARAM_NEXT(BYTE, params, sock); + uint16_t len = 0; + uint8_t* p = mergeBuf(sock, NULL, &len); + err = sendUdpData(getTTCP(sock, TTCP_MODE_TRANSMIT), p, len); + clearBuf(sock); + free(p); + } + + return (err==WL_SUCCESS) ? WIFI_SPI_ACK : WIFI_SPI_ERR; +} + + +int send_data_tcp_cmd_cb(int numParam, char* buf, void* ctx) { + wl_err_t err = WL_FAILURE; + DATA_LED_ON(); + tDataParam* msg = (tDataParam*) buf; + if ((numParam == 2)&&(msg->dataLen == 1)) + { + GET_DATA_BYTE(sock, buf+2); + GET_DATA_INT(len, buf+3); + //printk("tcp:%p buf:%p len:%d\n", getTTCP(sock), (uint8_t*)(buf+5), len); + err = sendTcpData(getTTCP(sock, TTCP_MODE_TRANSMIT), (uint8_t*)(buf+5), len); + } + DATA_LED_OFF(); + return (err==WL_SUCCESS) ? WIFI_SPI_ACK : WIFI_SPI_ERR; +} + +int ack_cmd_cb(int numParam, char* buf, void* ctx) { + return WIFI_SPI_ACK; +} + +int get_result_cmd_cb(int numParam, char* buf, void* ctx) { + INFO_SPI("ifStatus:%d result:%d\n", ifStatus, result); + return WIFI_SPI_ACK; +} + +int disconnect_cmd_cb(int numParam, char* buf, void* ctx) +{ + return ((wl_disconnect()==WL_SUCCESS)? WIFI_SPI_ACK : WIFI_SPI_ERR); +} + + +cmd_spi_state_t get_reply_cb(char* recv, char* reply, void* ctx, uint16_t* count) { + + CREATE_HEADER_REPLY(reply, recv, 1); + + reply[3] = 1; // paramLen + if (ctx != NULL) { + reply[4] = (*(uint8_t*)ctx); //param + } else { + reply[4] = (ifStatus)?WL_CONNECTED:result; //param + } + + END_HEADER_REPLY(reply, 5, *count); + + //INFO_SPI("result:%d\n", result); + return SPI_CMD_DONE; +} + +cmd_spi_state_t ack_reply_cb(char* recv, char* reply, void* ctx, uint16_t* count) { + + CREATE_HEADER_REPLY(reply, recv, 1); + + reply[3] = 1; // paramLen + if (ctx != NULL) { + reply[4] = (*(uint8_t*) ctx != 1) ? WIFI_SPI_ERR : WIFI_SPI_ACK; //param + } else { + reply[4] = WIFI_SPI_ACK; //param + } + + END_HEADER_REPLY(reply, 5, *count); + + return SPI_CMD_DONE; +} + +cmd_spi_state_t get_reply_ipaddr_cb(char* recv, char* reply, void* ctx, uint16_t* count) { + + CHECK_ARD_NETIF(recv, reply, count); + + CREATE_HEADER_REPLY(reply, recv, 3); + + PUT_LONG_IN_BYTE_NO(ard_netif->ip_addr.addr, reply, 3); + PUT_LONG_IN_BYTE_NO(ard_netif->netmask.addr, reply, 8); + PUT_LONG_IN_BYTE_NO(ard_netif->gw.addr, reply, 13); + + END_HEADER_REPLY(reply, 18, *count); + + return SPI_CMD_DONE; +} + +void getRemoteData(uint8_t sock, uint8_t mode, tRemoteClient* remoteData) +{ + if ((sock>=0) && (sockudp == UDP_MODE)) + { + if (_ttcp->mode == TTCP_MODE_RECEIVE) + { + remoteData->ipaddr = getRemoteClient(sock)->ipaddr; + remoteData->port = getRemoteClient(sock)->port; + }else{ + remoteData->ipaddr = (_ttcp->upcb) ? _ttcp->upcb->remote_ip.addr : 0; + remoteData->port = (_ttcp->upcb) ? _ttcp->upcb->remote_port : 0; + } + } + } + } +} + + +cmd_spi_state_t get_reply_remote_data_cb(char* recv, char* reply, void* ctx, uint16_t* count) { + + CHECK_ARD_NETIF(recv, reply, count); + DUMP_SPI_CMD(recv); + + GET_DATA_BYTE(sock, recv+4); + + CREATE_HEADER_REPLY(reply, recv, 2); + tRemoteClient remoteData = {0,0}; + //TODO pass the mode + getRemoteData(sock, TTCP_MODE_RECEIVE, &remoteData); + + PUT_LONG_IN_BYTE_NO(remoteData.ipaddr, reply, 3); + PUT_DATA_INT(remoteData.port, reply, 8); + + END_HEADER_REPLY(reply, 11, *count); + + return SPI_CMD_DONE; +} + + +void foundHostByName(const char *name, struct ip_addr *ipaddr, void *callback_arg) +{ + _hostIpAddr.addr = (ipaddr)?ipaddr->addr:0xffffffff; + INFO_SPI("foundHostByName: Found Host: name=%s ip=0x%x\n", name, _hostIpAddr.addr); + hostIpAddrFound = true; +} + +int req_reply_host_by_name_cb(int numParam, char* buf, void* ctx) { + + char hostName[DNS_MAX_NAME_LENGTH]; + tParam* params = (tParam*) buf; + + // HostName + if (params->paramLen < DNS_MAX_NAME_LENGTH) { + memcpy(hostName, ¶ms->param, params->paramLen); + hostName[params->paramLen]='\0'; + } else { + RETURN_ERR(WL_FAILURE) + } + + INFO_SPI("Looking for Host: name=%s\n", hostName); + _hostIpAddr.addr = 0; + hostIpAddrFound = false; + err_t err = dns_gethostbyname(hostName, &_hostIpAddr, foundHostByName, NULL); + if (err == ERR_OK) + { + INFO_SPI("Found Host: name=%s ip=0x%x\n", hostName, _hostIpAddr.addr); + hostIpAddrFound = true; + RETURN_ERR(WL_SUCCESS) + } + RETURN_ERR(WL_FAILURE) +} + +cmd_spi_state_t get_reply_host_by_name_cb(char* recv, char* reply, void* ctx, uint16_t* count) { + + u32_t addr = (hostIpAddrFound)?_hostIpAddr.addr : 0xffffffff; + INFO_SPI("Searching for Host: ip=0x%x found=%d\n", addr, hostIpAddrFound); + + CHECK_ARD_NETIF(recv, reply, count); + + CREATE_HEADER_REPLY(reply, recv, 1); + + PUT_LONG_IN_BYTE_NO(addr, reply, 3); + + END_HEADER_REPLY(reply, 8, *count); + + return SPI_CMD_DONE; +} + +cmd_spi_state_t get_reply_mac_cb(char* recv, char* reply, void* ctx, uint16_t* count) { + + CHECK_ARD_NETIF(recv, reply, count); + + CREATE_HEADER_REPLY(reply, recv, 1); + + reply[3] = WL_MAC_ADDR_LENGTH; + uint8_t mac[WL_MAC_ADDR_LENGTH]; + if (wl_get_mac_addr(mac) != WL_SUCCESS) { + RETURN_ERR_REPLY(recv, reply, count); + } + //rotate the byte order + reply[4]=mac[5]; + reply[5]=mac[4]; + reply[6]=mac[3]; + reply[7]=mac[2]; + reply[8]=mac[1]; + reply[9]=mac[0]; + END_HEADER_REPLY(reply, 10, *count); + + return SPI_CMD_DONE; +} + +cmd_spi_state_t get_reply_curr_net_cb(char* recv, char* reply, void* ctx, uint16_t* count) { + + uint32_t type = (uint32_t)ctx; + CHECK_ARD_NETIF(recv, reply, count); + + CREATE_HEADER_REPLY(reply, recv, 1); + + struct wl_network_t* net = wl_get_current_network(); + uint8_t len = 0; + if (net != NULL) + { + switch (type) + { + default: + case GET_CURR_SSID_CMD: + { + len = net->ssid.len; + PUT_BUFDATA_BYTE(net->ssid.ssid, len, reply, 3); + break; + } + case GET_CURR_BSSID_CMD: + { + len = WL_MAC_ADDR_LENGTH; ; + PUT_BUFDATA_BYTE_REV(net->bssid.octet, len, reply, 3); + break; + } + case GET_CURR_RSSI_CMD: + { + len=sizeof(net->rssi); + PUT_LONG_IN_BYTE_HO(net->rssi, reply, 3); + //printk("RSSI:%d", net->rssi); + break; + } + case GET_CURR_ENCT_CMD: + { + len = sizeof(net->enc_type); + PUT_DATA_BYTE(net->enc_type, reply, 3); + //printk("ENCT:%d", net->enc_type); + break; + } + } + }else{ + PUT_DATA_BYTE(0, reply, 3); + } + + END_HEADER_REPLY(reply, 3+len+1, *count); + + //dump(reply, *count); + + return SPI_CMD_DONE; +} + +cmd_spi_state_t get_reply_idx_net_cb(char* recv, char* reply, void* ctx, uint16_t* count) { + + uint32_t type = (uint32_t)ctx; + CHECK_ARD_NETIF(recv, reply, count); + + CREATE_HEADER_REPLY(reply, recv, 1); + + DUMP_SPI_CMD(recv); + + GET_DATA_BYTE(idx, recv+4); + + if (idx >= WL_NETWORKS_LIST_MAXNUM) + { + WARN("Index out of range: %d\n", idx); + return SPI_CMD_DONE; + } + uint8_t len = 0; + switch (type) + { + default: + case GET_IDX_SSID_CMD: + { + len = network_list.net[idx]->ssid.len; + PUT_BUFDATA_BYTE(network_list.net[idx]->ssid.ssid, len, reply, 3); + INFO_UTIL("SSID:%s\n", network_list.net[idx]->ssid.ssid); + break; + } + case GET_IDX_RSSI_CMD: + { + len = 4; + PUT_LONG_IN_BYTE_HO(network_list.net[idx]->rssi, reply, 3); + INFO_UTIL("RSSI:%d\n", network_list.net[idx]->rssi); + break; + } + case GET_IDX_ENCT_CMD: + { + len = 1; + PUT_DATA_BYTE(network_list.net[idx]->enc_type, reply, 3); + INFO_UTIL("ENCT:%d\n", network_list.net[idx]->enc_type); + break; + } + } + + + END_HEADER_REPLY(reply, 3+len+1, *count); + + DUMP(reply, *count); + + return SPI_CMD_DONE; +} + +static void copy_network_list(struct wl_network_list_t *dst, + struct wl_network_list_t *src) +{ + int i; + for (i = 0; i < dst->cnt; i++) + free(dst->net[i]); + free(dst->net); + + dst->cnt = 0; + + if (src->cnt == 0) + return; + dst->net = calloc(1, src->cnt * sizeof(struct wl_network_t *)); + if (dst->net == NULL) { + printk("could not allocate all gui net array\n"); + return; + } + + for (i = 0; i < src->cnt; i++) { + struct wl_network_t *net = src->net[i]; + dst->net[i] = malloc(sizeof(*net)); + if (dst->net[i] == NULL) { + printk("could not allocate all gui nets\n"); + return; + } + + memcpy(dst->net[i], net, sizeof(*net)); + dst->cnt++; + } +} + +int start_scan_net_cmd_cb(int numParam, char* buf, void* ctx) { + wl_err_t err = WL_FAILURE; + + INFO_SPI("Start Network Scan %d\n", numParam); + if (scanNetCompleted){ + scanNetCompleted = false; + err = wl_scan(); + if (err != WL_SUCCESS) + { + // May be busy scanning already, no fatal error + WARN("err=%d\n", err); + err = WL_SUCCESS; + } + } + return err; +} + +cmd_spi_state_t get_reply_scan_networks_cb(char* recv, char* reply, void* ctx, uint16_t* count) { + + const int8_t SCAN_NOT_YET_COMPLETED = 0; + + if (!scanNetCompleted) + { + //return empty list with an error to retry + CREATE_HEADER_REPLY(reply, recv, SCAN_NOT_YET_COMPLETED); + END_HEADER_REPLY(reply, 3, *count); + INFO_SPI("Scan not completed!\n"); + return SPI_CMD_DONE; + } + + int network_cnt = 0; + struct wl_network_list_t* wl_network_list; + + wl_get_network_list(&wl_network_list); + if (wl_network_list->cnt == 0) + { + CREATE_HEADER_REPLY(reply, recv, 0); + END_HEADER_REPLY(reply, 3, *count); + INFO_SPI("Networks not found!\n"); + return SPI_CMD_DONE; + } + + if (wl_network_list->cnt > WL_NETWORKS_LIST_MAXNUM) + { + network_cnt = WL_NETWORKS_LIST_MAXNUM ; + } + else{ + network_cnt = wl_network_list->cnt ; + } + + copy_network_list(&network_list, wl_network_list); + CREATE_HEADER_REPLY(reply, recv, network_cnt); + + uint8_t start = 3; + int ii = 0; + for (; ii < network_cnt; ii++) + { + uint8_t len = network_list.net[ii]->ssid.len+1; + network_list.net[ii]->ssid.ssid[network_list.net[ii]->ssid.len]=0; + PUT_BUFDATA_BYTE(network_list.net[ii]->ssid.ssid, len, reply, start); + start += len+1; + INFO_SPI("%d - %s [%d]- %d - %d - 0x%x\n",ii, network_list.net[ii]->ssid.ssid, + len, network_list.net[ii]->enc_type, + network_list.net[ii]->rssi, network_list.net[ii]->bssid); + } + + END_HEADER_REPLY(reply, start, *count); + //DUMP(reply, *count); + + return SPI_CMD_DONE; +} + +cmd_spi_state_t get_state_tcp_cmd_cb(char* recv, char* reply, void* ctx, uint16_t* count) { + + CHECK_ARD_NETIF(recv, reply, count); + + CREATE_HEADER_REPLY(reply, recv, PARAM_NUMS_1); + + uint8_t _state = CLOSED; + if ((recv[3]==1)&&(recv[4]>=0)&&(recv[4]=0)&&(_sock=0)&&(recv[4]=0)&&(recv[4]=0)&&(recv[4]=0)&&(sock=0)&&(recv[4]<0xFF)) + { + len = recv[4]; + int i= 0; + for (; i")); + DUMP_SPI(recv, count); + IF_SPI_DUMP(printk("<==")); + DUMP_SPI(reply, _count); + replyCount = _count; + return _result; +} + +unsigned char* getStartCmdSeq(unsigned char* _recv, int len, int *offset) +{ + int i = 0; + *offset = 0; + //DEB_PIN_UP(); + for (; inParam, + (char*) &(spiMsg->params[0]), cmd_spi_list[i].ctx); + }else + { + tSpiMsgData* spiMsg = (tSpiMsgData*) recv; + _result = cmd_spi_list[i].cb(spiMsg->nParam, + (char*) &(spiMsg->params[0]), cmd_spi_list[i].ctx); + } + + if (_result != WIFI_SPI_ACK) + return REPLY_ERR_CMD; + else + return REPLY_NO_ERR; + }else{ + if (spiMsg8(cmdId)) + { + tSpiMsg* spiMsg = (tSpiMsg*) recv; + _result = cmd_spi_list[i].cb(spiMsg->nParam, + (char*) &(spiMsg->params[0]), NULL); + }else{ + tSpiMsgData* spiMsg = (tSpiMsgData*) recv; + _result = cmd_spi_list[i].cb(spiMsg->nParam, + (char*) &(spiMsg->params[0]), NULL); + } + //Send Reply for GET commands or Immediate SET apply + if (cmd_spi_list[i].flags == CMD_GET_FLAG) { + if (sendReply(i, recv, reply, cmd_spi_list[i].ctx) != SPI_OK) + return REPLY_ERR_GET; + else + return REPLY_NO_ERR; + }else if (cmd_spi_list[i].flags == CMD_IMM_SET_FLAG) + { + if (sendReply(i, recv, reply, &_result) != SPI_OK) + return REPLY_ERR_GET; + else + return REPLY_NO_ERR; + + } + } + } + } + // Command not found + if (i==ARRAY_SIZE(cmd_spi_list)) + { + WARN("Unknown cmd 0x%x\n", cmdId); + DUMP(recv, count); + return REPLY_ERR_CMD; + } + return REPLY_NO_ERR; +} + +void init_spi_cmds(void* ctx) { + spi_add_cmd(SET_NET_CMD, set_net_cmd_cb, ack_reply_cb, NULL, CMD_SET_FLAG); + spi_add_cmd(SET_PASSPHRASE_CMD, set_passphrase_cmd_cb, ack_reply_cb, NULL, CMD_SET_FLAG); + spi_add_cmd(SET_KEY_CMD, set_key_cmd_cb, ack_reply_cb, NULL, CMD_SET_FLAG); + spi_add_cmd(SET_IP_CONFIG_CMD, set_ip_config_cmd_cb, ack_reply_cb, ctx, CMD_SET_FLAG); + spi_add_cmd(SET_DNS_CONFIG_CMD, set_dns_config_cmd_cb, ack_reply_cb, ctx, CMD_SET_FLAG); + spi_add_cmd(GET_CONN_STATUS_CMD, get_result_cmd_cb, get_reply_cb, NULL, CMD_GET_FLAG); + spi_add_cmd(GET_IPADDR_CMD, ack_cmd_cb, get_reply_ipaddr_cb, NULL, CMD_GET_FLAG); + spi_add_cmd(GET_MACADDR_CMD, ack_cmd_cb, get_reply_mac_cb, NULL, CMD_GET_FLAG); + spi_add_cmd(GET_CURR_SSID_CMD, ack_cmd_cb, get_reply_curr_net_cb, (void*)GET_CURR_SSID_CMD, CMD_GET_FLAG); + spi_add_cmd(GET_CURR_BSSID_CMD, ack_cmd_cb, get_reply_curr_net_cb, (void*)GET_CURR_BSSID_CMD, CMD_GET_FLAG); + spi_add_cmd(GET_CURR_RSSI_CMD, ack_cmd_cb, get_reply_curr_net_cb, (void*)GET_CURR_RSSI_CMD, CMD_GET_FLAG); + spi_add_cmd(GET_CURR_ENCT_CMD, ack_cmd_cb, get_reply_curr_net_cb, (void*)GET_CURR_ENCT_CMD, CMD_GET_FLAG); + spi_add_cmd(START_SCAN_NETWORKS, start_scan_net_cmd_cb, ack_reply_cb, NULL, CMD_SET_FLAG); + spi_add_cmd(SCAN_NETWORKS, ack_cmd_cb, get_reply_scan_networks_cb, NULL, CMD_GET_FLAG); + spi_add_cmd(DISCONNECT_CMD, disconnect_cmd_cb, ack_reply_cb, NULL, CMD_SET_FLAG); + spi_add_cmd(GET_IDX_ENCT_CMD, ack_cmd_cb, get_reply_idx_net_cb, (void*)GET_IDX_ENCT_CMD, CMD_GET_FLAG); + spi_add_cmd(GET_IDX_SSID_CMD, ack_cmd_cb, get_reply_idx_net_cb, (void*)GET_IDX_SSID_CMD, CMD_GET_FLAG); + spi_add_cmd(GET_IDX_RSSI_CMD, ack_cmd_cb, get_reply_idx_net_cb, (void*)GET_IDX_RSSI_CMD, CMD_GET_FLAG); + spi_add_cmd(REQ_HOST_BY_NAME_CMD, req_reply_host_by_name_cb, ack_reply_cb, NULL, CMD_SET_FLAG); + spi_add_cmd(GET_HOST_BY_NAME_CMD, ack_cmd_cb, get_reply_host_by_name_cb, NULL, CMD_GET_FLAG); + spi_add_cmd(START_SERVER_TCP_CMD, start_server_tcp_cmd_cb, ack_reply_cb, NULL, CMD_SET_FLAG); + spi_add_cmd(START_CLIENT_TCP_CMD, start_client_tcp_cmd_cb, ack_reply_cb, NULL, CMD_SET_FLAG); + spi_add_cmd(STOP_CLIENT_TCP_CMD, stop_client_tcp_cmd_cb, ack_reply_cb, NULL, CMD_SET_FLAG); + spi_add_cmd(GET_STATE_TCP_CMD, ack_cmd_cb, get_state_tcp_cmd_cb, NULL, CMD_GET_FLAG); + spi_add_cmd(GET_DATA_TCP_CMD, ack_cmd_cb, get_data_tcp_cmd_cb, NULL, CMD_GET_FLAG); + spi_add_cmd(AVAIL_DATA_TCP_CMD, ack_cmd_cb, avail_data_tcp_cmd_cb, NULL, CMD_GET_FLAG); + spi_add_cmd(SEND_DATA_TCP_CMD, send_data_tcp_cmd_cb, ack_reply_cb, NULL, CMD_IMM_SET_FLAG); + spi_add_cmd(DATA_SENT_TCP_CMD, ack_cmd_cb, data_sent_tcp_cmd_cb, NULL, CMD_GET_FLAG); + spi_add_cmd(GET_DATABUF_TCP_CMD, ack_cmd_cb, get_databuf_tcp_cmd_cb, NULL, CMD_GET_FLAG); + spi_add_cmd(GET_CLIENT_STATE_TCP_CMD, ack_cmd_cb, get_client_state_tcp_cmd_cb, NULL, CMD_GET_FLAG); + spi_add_cmd(GET_FW_VERSION_CMD, ack_cmd_cb, get_firmware_version_cmd_cb, NULL, CMD_GET_FLAG); + spi_add_cmd(GET_TEST_CMD, ack_cmd_cb, get_test_cmd_cb, NULL, CMD_GET_FLAG); + spi_add_cmd(INSERT_DATABUF_CMD, insert_data_cmd_cb, ack_reply_cb, NULL, CMD_IMM_SET_FLAG); + spi_add_cmd(SEND_DATA_UDP_CMD, send_data_udp_cmd_cb, ack_reply_cb, NULL, CMD_SET_FLAG); + spi_add_cmd(GET_REMOTE_DATA_CMD, ack_cmd_cb, get_reply_remote_data_cb, NULL, CMD_GET_FLAG); +} + + +int checkMsgParam8(unsigned char* buf) +{ + int paramLenTot=0; + tSpiMsg* spiMsg = (tSpiMsg*)buf; + tParam *param = spiMsg->params; + int i=0; + for (; inParam; ++i) + { + uint8_t _len = param->paramLen; + paramLenTot+= _len+1; + //printk("%d) len:0x%x\n", i, _len); + param = (tParam*)((char*)(param)+_len+1); + } + return paramLenTot; +} + +int checkMsgParam16(unsigned char* buf) +{ + int paramLenTot=0; + tSpiMsgData* spiMsg = (tSpiMsgData*)buf; + tDataParam* param = (tDataParam*)spiMsg->params; + int i=0; + for (; inParam; ++i) + { + uint16_t _len = param->dataLen; + paramLenTot+= _len+sizeof(param->dataLen); + //printk("%d) len:0x%x\n", i, _len); + param = (tDataParam*)((char*)(param)+_len+sizeof(param->dataLen)); + } + return paramLenTot; +} + +bool checkMsgFormat(uint8_t* _recv, int len, int* offset) +{ + + unsigned char* recv = getStartCmdSeq(_recv, len, offset); + if ((recv == NULL)||(recv!=_recv)) + { + DEB_PIN_TRIGGER(); + + IF_WARN_VER(DUMP((char*)_recv, len)); + + STATSPI_DISALIGN_ERROR(); + + if (recv == NULL) + return false; + } + tSpiMsg* spiMsg = (tSpiMsg*) recv; + if ((spiMsg->cmd == START_CMD)&&((spiMsg->tcmd & REPLY_FLAG) == 0)) + { + int paramLenTot = 0; + if (spiMsg8(spiMsg->tcmd)) + paramLenTot = checkMsgParam8(recv); + else + { + DUMP_SPI(_recv, len); + paramLenTot = checkMsgParam16(recv); + } + + //INFO_SPI("cmd:0x%x TotLen:%d\n", spiMsg->tcmd, paramLenTot); + char* p = (char*)recv + paramLenTot + sizeof(tSpiHdr); + if (*p == END_CMD) + { + return true; + }else{ + WARN("%d] Not found end cmd: 0x%x\n", cmdCorr, *p); + } + } + return false; +} + +//#define AVR32_USART_CSR_ITERATION_MASK (UNDERRUN) 0x00000400 +//#define AVR32_USART_CSR_OVRE_MASK 0x00000020 +//#define AVR32_USART_CSR_RXRDY_MASK 0x00000001 + + +void spi_poll(struct netif* netif) { + + ard_netif = netif; + + if (startReply) + { + startReply = false; + int offset = 0; + DISABLE_SPI_INT(); + if (checkMsgFormat(_receiveBuffer, receivedChars, &offset)) + { + state = SPI_CMD_INPROGRESS; + count = receivedChars-offset; + if (count >= CMD_MAX_LEN) + count = CMD_MAX_LEN; + memcpy(buf, &_receiveBuffer[offset], count); + + //mark as buffer used + _receiveBuffer[0] = 0; + + int err = call_reply_cb(buf, &reply[0]); + if (err != REPLY_NO_ERR) + { + DUMP_SPI(buf, count); + DUMP_SPI(reply, replyCount); + } + receivedChars = 0; + count = 0; + state = SPI_CMD_IDLE; + } + else + { + sendError(); + WARN("%d] Check format msg failed!\n", cmdCorr); + IF_WARN_VER(dump((char*)_receiveBuffer, receivedChars)); + state = SPI_CMD_IDLE; + count=0; + //mark as buffer used + _receiveBuffer[0] = 0; + } + CLEAR_SPI_INT(); + //Enable Spi int to receive a new command + ENABLE_SPI_INT(); + //Available for receiving a new spi data + AVAIL_FOR_SPI(); + } + +#ifdef _SPI_STATS_ + if (statSpi.lastError != 0) + { + WARN("%d] Errot=0x%x spiStatus:0x%x\n", cmdCorr, statSpi.lastError, statSpi.status); + statSpi.lastError = 0; + } +#endif +} + +inline int spi_slaveReceiveInt(volatile avr32_spi_t *spi) +{ + receivedChars=0; + int index = 0; + int err = SPI_OK; + state = SPI_CMD_INPUT; + bool endOfFrame = false; + + do { + unsigned int timeout = SPI_TIMEOUT; + err = SPI_OK; + + while ((spi->sr & (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK)) != + (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK)) { + if ((timeout--)==0) { + err=SPI_ERROR_TIMEOUT; + break; + } + } + //DEB_PIN_TG(); + #if 0 +#ifdef _SPI_STATS_ + if (spi->sr & AVR32_SPI_SR_OVRES_MASK) + { + STATSPI_OVERRIDE_ERROR(); + } +#endif +#endif + if (err == SPI_OK) { + _receiveBuffer[index] = (spi->rdr >> AVR32_SPI_RDR_RD_OFFSET) & 0x00ff; + DEB_PIN_UP(2); + if ((index==0) && (_receiveBuffer[index] != START_CMD)) + DEB_PIN_TRIGGER(); + ++index; + ++receivedChars; + }else{ +#ifdef _SPI_STATS_ + STATSPI_TIMEOUT_ERROR(); +#endif + break; + } + + /* break on buffer overflow */ + if (receivedChars >= _BUFFERSIZE) { + err = SPI_ERROR_OVERRUN_AND_MODE_FAULT; + break; + } + + if (_receiveBuffer[index - 1] == END_CMD) + { + int8_t numParams = 0; + int idx = PARAM_LEN_POS+1; + bool islen16bit = ((_receiveBuffer[CMD_POS] & DATA_FLAG) == DATA_FLAG); + if (index >= idx) + { + numParams = _receiveBuffer[PARAM_LEN_POS]; + while (((index-1) > idx)&&(numParams>0)) + { + if (islen16bit) + idx += (_receiveBuffer[idx]<<8) + _receiveBuffer[idx+1]+2; + else + idx += _receiveBuffer[idx]+1; + --numParams; + } + if (((index-1) == idx) && (numParams == 0)) + endOfFrame = true; + } + if (!endOfFrame){ + WARN("Wrong termination index:%d nParam:%d idx:%d 16bit:%d\n", index, numParams, idx, islen16bit); + #ifdef _DEBUG_ + dump((char*)_receiveBuffer, receivedChars); + while(0); + #endif + } + } + } while (!endOfFrame); + return err; +} + +#if defined (__GNUC__) +__attribute__((__interrupt__)) +#elif defined (__ICCAVR32__) +__interrupt +#endif +static void spi_int_handler(void) +{ + volatile avr32_spi_t *spi = ARD_SPI; + DEB_PIN_DN(2); + DISABLE_SPI_INT(); + + if ((spi->sr & AVR32_SPI_SR_RDRF_MASK) != 0) + { + int err = spi_slaveReceiveInt(ARD_SPI); + if (err == SPI_OK) + { + BUSY_FOR_SPI(); + startReply=true; + ++cmdCorr; + //maintain disable interrupt to send the reply command + return; + } + } + ENABLE_SPI_INT(); +} + +inline spi_status_t spi_read8(volatile avr32_spi_t *spi, unsigned char *data) +{ + unsigned int timeout = SPI_TIMEOUT; + + while ((spi->sr & (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK)) != + (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK)) { + if (!timeout--) { + return SPI_ERROR_TIMEOUT; + } + } + + *data = (spi->rdr >> AVR32_SPI_RDR_RD_OFFSET) & 0x00ff; + + return SPI_OK; +} + + +/*! + * \brief Interrupt handler of the External interrupt line "1". + */ +#if __GNUC__ +__attribute__((__interrupt__)) +#elif __ICCAVR32__ +__interrupt +#endif +static void eic_int_handler1(void) +{ + eic_clear_interrupt_line(&AVR32_EIC, EXT_INT_LINE1); + startRecvCmdSignal = TRUE; +} + +//! Structure holding the configuration parameters of the EIC module. +eic_options_t eic_options[EXT_INT_NB_LINES]; + +void initExtInt() +{ + // Enable edge-triggered interrupt. + eic_options[0].eic_mode = EIC_MODE_EDGE_TRIGGERED; + // Interrupt will trigger on falling edge. + eic_options[0].eic_edge = EIC_EDGE_FALLING_EDGE; + // Initialize in synchronous mode : interrupt is synchronized to the clock + eic_options[0].eic_async = EIC_SYNCH_MODE; + // Set the interrupt line number. + eic_options[0].eic_line = EXT_INT_LINE1; + + // Disable all interrupts. + Disable_global_interrupt(); + + INTC_register_interrupt(&eic_int_handler1, EXT_INT_IRQ_LINE1, AVR32_INTC_INT0); + + // Map the interrupt lines to the GPIO pins with the right peripheral functions. + gpio_enable_module_pin(EXT_INT_PIN_LINE1,EXT_INT_FUNCTION_LINE1); + + // Init the EIC controller with the options + eic_init(&AVR32_EIC, eic_options, EXT_INT_NB_LINES); + + // Enable the chosen lines and their corresponding interrupt feature. + eic_enable_line(&AVR32_EIC, eic_options[0].eic_line); + eic_enable_interrupt_line(&AVR32_EIC, eic_options[0].eic_line); + + // Enable all interrupts. + Enable_global_interrupt(); +} + +int initSpi(void* ctx) +{ + volatile avr32_spi_t *spi = &AVR32_SPI0; + gpio_map_t spi_piomap = { \ + {AVR32_SPI0_SCK_0_0_PIN, AVR32_SPI0_SCK_0_0_FUNCTION}, \ + {AVR32_SPI0_MISO_0_0_PIN, AVR32_SPI0_MISO_0_0_FUNCTION}, \ + {AVR32_SPI0_MOSI_0_0_PIN, AVR32_SPI0_MOSI_0_0_FUNCTION}, \ + {AVR32_SPI0_NPCS_0_0_PIN, AVR32_SPI0_NPCS_0_0_FUNCTION}, \ + }; + + INFO_INIT("SPI init...\n"); + + /* Init PIO */ + gpio_enable_module(spi_piomap, ARRAY_SIZE(spi_piomap)); + + spi_options_t spiOptions; + + spiOptions.reg = 0; + spiOptions.baudrate = SPI_SLAVE_SPEED; + spiOptions.bits = SPI_BITS; + spiOptions.spck_delay = 0; + spiOptions.trans_delay = 4; + spiOptions.stay_act = 0; + spiOptions.spi_mode = 0; + spiOptions.modfdis = 0; + + /* Initialize as slave; bits, spi_mode */ + if (spi_initSlave(spi, spiOptions.bits, spiOptions.spi_mode) != SPI_OK) + { + INFO_SPI("SPI initialization failed!"); + return 1; + } + + spi_status_t status = spi_setupChipReg(spi, &spiOptions, FPBA_HZ); + if (status == SPI_ERROR_ARGUMENT) + WARN("Error configuring SPI\n"); + + // Disable all interrupts. + Disable_global_interrupt(); + + // Register the SPI interrupt handler to the interrupt controller. + INTC_register_interrupt((__int_handler)(&spi_int_handler), AVR32_SPI0_IRQ, AVR32_INTC_INT0); + + // Enable all interrupts. + Enable_global_interrupt(); + + ENABLE_SPI_INT(); + + spi_enable(spi); +#ifdef _SPI_STATS_ + initStatSpi(); +#endif + init_spi_cmds(ctx); + + memset(_receiveBuffer, 0, sizeof(_receiveBuffer)); + memset(buf, 0, sizeof(buf)); + memset(reply, 0, sizeof(reply)); + + initMapSockTcp(); + set_result(WL_IDLE_STATUS); + + init_pBuf(); + + return 0; +} + diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/ard_spi.h b/firmware/libraries/WiFi/extras/wifiHD/src/ard_spi.h new file mode 100644 index 0000000..27ec33e --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/ard_spi.h @@ -0,0 +1,88 @@ +/* + * ard_spi.h + * + * Created on: May 27, 2010 + * Author: mlf by Metodo2 srl + */ + +#ifndef ARD_SPI_H_ +#define ARD_SPI_H_ + +#include "lwip/netif.h" +#include "console.h" +#include "wl_definitions.h" + + +typedef enum { + SPI_CMD_IDLE, + SPI_CMD_INPUT, + SPI_CMD_DONE, + SPI_CMD_INPROGRESS, + SPI_CMD_REPLING, + SPI_CMD_FAIL, +} cmd_spi_state_t; + +typedef enum { + REPLY_ERR_GET, + REPLY_ERR_SET, + REPLY_ERR_CMD, + REPLY_ERR_MSG, + REPLY_NO_ERR, +} reply_err_t; + + +typedef enum { + CMD_GET_FLAG = 0x01, + CMD_SET_FLAG = 0x02, + CMD_IMM_SET_FLAG = 0x04, +}cmd_flags; + +typedef enum eProtMode {TCP_MODE, UDP_MODE}tProtMode; + +#define TIMEOUT_SPI 200 +#define SPI_ALIGN_ERROR 0xF0 +#define SPI_OVERRIDE_ERROR 0xF1 +#define SPI_TIMEOUT_ERROR 0xF2 +#define DUMMY_DATA 0xFF + +typedef int (*cmd_spi_cb_t)(int numParam, char* buf, void* ctx); +typedef cmd_spi_state_t (*cmd_spi_rcb_t)(char* recv, char* reply, void* ctx, uint16_t* _count); + +typedef struct eRemoteClient{ + uint32_t ipaddr; + uint16_t port; +}tRemoteClient; + +void set_result_cmd(int err) ; + +void set_result(wl_status_t _status); + +int initSpi(void* ctx); + +void initExtInt(); + +void spi_poll(struct netif* netif); + +int spi_slaveReceive(volatile avr32_spi_t *spi); + +void showTTCPstatus(); + +int getSock(void * _ttcp); + +void* getTTCP(uint8_t sock, uint8_t mode); + +void setMapSockMode(uint8_t sock, void* _ttcp, uint8_t _tcp_mode); + +void clearMapSockTcp(uint8_t sock, uint8_t mode); + +int start_server_tcp(uint16_t port, uint8_t sock, uint8_t protMode); + +int start_client_tcp(uint32_t _addr, uint16_t port, uint8_t sock, uint8_t protMode); + +void setRemoteClient(uint16_t sock, uint32_t _ipaddr, uint16_t _port); + +tRemoteClient* getRemoteClient(uint16_t sock); + +void getRemoteData(uint8_t sock, uint8_t mode, tRemoteClient* remoteData); + +#endif /* ARD_SPI_H_ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/ard_tcp.c b/firmware/libraries/WiFi/extras/wifiHD/src/ard_tcp.c new file mode 100644 index 0000000..0a73b20 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/ard_tcp.c @@ -0,0 +1,987 @@ +/* + * ard_tcp.c + * + * Created on: May 27, 2010 + * Author: mlf by Metodo2 srl + */ + +//#define _APP_DEBUG_ +#include "lwip/opt.h" + +#include "lwip/mem.h" +#include "lwip/raw.h" +#include "lwip/icmp.h" +#include "lwip/netif.h" +#include "lwip/sys.h" +#include "lwip/sockets.h" +#include "lwip/inet.h" +#include "lwip/inet_chksum.h" +#include "lwip/tcp.h" +#include "lwip/udp.h" + +#include "ard_tcp.h" +#include "ard_spi.h" +#include "timer.h" +#include "util.h" + +#include "getopt.h" +#include "ard_utils.h" +#include "debug.h" +#include "trace.h" + +unsigned int startTime = 0; +extern bool ifStatus; + +static err_t tcp_data_sent(void *arg, struct tcp_pcb *pcb, u16_t len); + +static void atcp_init_pend_flags(struct ttcp* _ttcp) +{ + int i = 0; + for (; ipending_close[i] = false; + } +} + +/** + * Clean up and free the ttcp structure + */ +static void ard_tcp_destroy(struct ttcp* ttcp) { + err_t err = ERR_OK; + DUMP_TCP_STATE(ttcp); + + uint8_t sock = getSock(ttcp); + if (sock == -1) + WARN("ttcp already deallocated!\n"); + + freeAllTcpData(sock); + int i = 0; + for (; itpcb[i]) { + tcp_arg(ttcp->tpcb[i], NULL); + tcp_sent(ttcp->tpcb[i], NULL); + tcp_recv(ttcp->tpcb[i], NULL); + tcp_err(ttcp->tpcb[i], NULL); + //TEMPORAQARY + //err = tcp_close(ttcp->tpcb); + INFO_TCP("Closing tpcb: state:0x%x err:%d\n", ttcp->tpcb[i]->state, err); + } + } + + if (ttcp->lpcb) { + tcp_arg(ttcp->lpcb, NULL); + tcp_accept(ttcp->lpcb, NULL); + err = tcp_close(ttcp->lpcb); + INFO_TCP("Closing lpcb: state:0x%x err:%d\n", ttcp->lpcb->state, err); + } + + if (ttcp->upcb) { + udp_disconnect(ttcp->upcb); + udp_remove(ttcp->upcb); + } + + FREE_PAYLOAD(ttcp); + free(ttcp); +} + +/** + * Invoked when transfer is done or aborted (non-zero result). + */ +static void ard_tcp_done(struct ttcp* ttcp, int result) { +// if (result == 0) +// ard_tcp_print_stats(ttcp); + + if (ttcp->done_cb) + ttcp->done_cb(ttcp->opaque, result); + + ard_tcp_destroy(ttcp); + clearMapSockTcp(getSock(ttcp), GET_TCP_MODE(ttcp)); +} + +/** + * Only used in TCP mode. + * Will transmit a maximum of pbuf->tot_len bytes. + * Called upon connect and when there's space available in the TCP send window + * + */ +static err_t tcp_send_data_pcb(struct ttcp *ttcp, struct tcp_pcb *pcb) { + err_t err = ERR_OK; + uint32_t len; + + GET_CLIENT_ID(ttcp, pcb); + + len = ttcp->left[id]; + ttcp->buff_sent[id] = 0; + + if (len == 0) return ERR_MEM; + + INFO_TCP_VER("left=%d len:%d\n", ttcp->left[id], len); + + /* don't send more than we have in the payload */ + if (len > ttcp->buflen) + len = ttcp->buflen; + + /* We cannot send more data than space available in the send + buffer. */ + if (len > tcp_sndbuf(pcb)) + len = tcp_sndbuf(pcb); + + IF_TCP(startTime = timer_get_ms()); + err = tcp_write(pcb, ttcp->payload[id], len, TCP_WRITE_FLAG_COPY); + if (err != ERR_OK) + { + INFO_TCP("tcp_write failed %p state:%d len:%d err:%d\n", + pcb, pcb->state, len, err); + ttcp->buff_sent[id] = 0; + }else{ + ttcp->buff_sent[id] = 1; + ttcp->left[id] -= len; + } + + return err; +} + + +/** + * Only used in TCP mode. + */ +static err_t tcp_connect_cb(void *arg, struct tcp_pcb *tpcb, err_t err) { + struct ttcp* _ttcp = arg; + + if (_ttcp == NULL) return ERR_ARG; + + GET_CLIENT_ID(_ttcp, tpcb); + INFO_TCP("TTCP [%p-%p]: connect %d %d\n", _ttcp, tpcb, err, tpcb->state); + + _connected = ( tpcb->state == ESTABLISHED) ? 1 : 0; + _ttcp->tcp_poll_retries[id] = 0; + + _ttcp->start_time = timer_get_ms(); + + return ERR_OK; +} + +static void cleanSockState_cb(void *ctx) { + struct ttcp* _ttcp = ctx; + + if (_ttcp == NULL) return; + + int sock = getSock(_ttcp); + if (sock != -1) + clearMapSockTcp(sock, GET_TCP_MODE(_ttcp)); + INFO_TCP("TTCP [%p]: cleanSockState_cb %d\n", _ttcp, sock); + _connected = false; +} + +/** + * Only used in TCP mode. + */ + +static err_t close_conn_pcb(struct tcp_pcb* tpcb) { + + err_t err = tcp_close(tpcb); + if (err== ERR_OK) + { + tcp_arg(tpcb, NULL); + tcp_sent(tpcb, NULL); + tcp_recv(tpcb, NULL); + } + + INFO_TCP("Closing tpcb[%p]: state:0x%x err:%d\n", tpcb, tpcb->state, err); + return err; +} + +static void atcp_conn_err_cb(void *arg, err_t err) { + struct ttcp* _ttcp = arg; + + WARN("TTCP [%p]: connection error: %d currId:%d\n", + _ttcp, err, getCurrClientConnId()); + + if (ifStatus == false) + printk("Abort connection\n"); + + if (err == ERR_ABRT) + { + removeNewClientConn(_ttcp, GET_CURR_PCB(_ttcp)); + FREE_PAYLOAD_ID(_ttcp, getCurrClientConnId()); + } +} + +static void atcp_conn_cli_err_cb(void *arg, err_t err) { + struct ttcp* _ttcp = arg; + + if (_ttcp == NULL) return; + + WARN("TTCP [%p]: connection error: %d arg:%p\n", + _ttcp, err, arg); + + if (ifStatus == false) + printk("Abort connection\n"); + + if ((_ttcp)&&(err == ERR_ABRT)) + { + WARN("TTCP [%p]: free memory\n", _ttcp); + cleanSockState_cb(_ttcp); + // TODO + FREE_PAYLOAD(_ttcp); + } + + //atcp_init_pend_flags(_ttcp); +} + +static err_t close_conn(struct ttcp *_ttcp, struct tcp_pcb* tpcb) { + + if (_ttcp == NULL) return ERR_MEM; + + GET_CLIENT_ID(_ttcp, tpcb); + + err_t err = close_conn_pcb(_ttcp->tpcb[id]); + + if (err == ERR_MEM) + { + WARN("Cannot close id:%d-%p put pending\n", id, _ttcp->tpcb[id]); + _ttcp->pending_close[id] = true; + } + else{ + _ttcp->pending_close[id] = false; + removeNewClientConn(_ttcp, _ttcp->tpcb[id]); + FREE_PAYLOAD_ID(_ttcp, id); + INFO_TCP("----------------------\n"); + } + return err; +} + +void closeConnections() +{ + int ii=0; + for (; iiudp == TCP_MODE) + { + ard_tcp_destroy(_ttcp); + clearMapSockTcp(getSock(_ttcp), GET_TCP_MODE(_ttcp)); + } + } + } + } +} + +/** + * Only used in TCP mode. + */ +static err_t atcp_recv_cb(void *arg, struct tcp_pcb *pcb, struct pbuf *p, + err_t err) { + struct ttcp* ttcp = arg; + + if (err == ERR_OK && p != NULL) { + DATA_LED_ON(); + /* for print_stats() */ + ttcp->recved += p->tot_len; + + if ((ttcp->verbose)||(verboseDebug & INFO_TCP_FLAG)) { + INFO_TCP("len:%d\n",p->tot_len); + DUMP_TCP(p->payload, p->tot_len); + ttcp->print_cnt++; + } + + uint8_t* pBufferStore = insert_pBuf(p, ttcp->sock, (void*) pcb); + INFO_TCP("sock:%d pcb:%p pbuf:%p err:%d bufStore:%p len:%d\n", + ttcp->sock, pcb, p, err, pBufferStore, p->tot_len); + pbuf_free(p); + DATA_LED_OFF(); + } + + /* p will be NULL when remote end is done */ + if (err == ERR_OK && p == NULL) { + INFO_TCP("atcp_recv_cb p=NULL on sock:%d pcb:%p\n", ttcp->sock, pcb); + close_conn(ttcp, pcb); + } + + if (err!=ERR_OK) + WARN("err=%d p=%p\n", err, p); + return ERR_OK; +} + +void ack_recved(void* pcb, int len) { + // Comment the call because it is activated on atcp_recv_cb + INFO_TCP("Received %p len:%d\n", pcb, len); + tcp_recved(pcb, len); +} + +static err_t atcp_poll(void *arg, struct tcp_pcb *pcb) { + struct ttcp* _ttcp = arg; + + if (_ttcp == NULL) return ERR_ARG; + + GET_CLIENT_ID(_ttcp, pcb); + + if (_ttcp->left[id]>0) + ++_ttcp->tcp_poll_retries[id]; + + if (_ttcp->tcp_poll_retries[id] > 4) { + WARN("ARD TCP [%p] arg=%p retries=%d abort\n", + pcb, arg, _ttcp->tcp_poll_retries[id]); + _ttcp->tcp_poll_retries[id] = 0; + tcp_abort(pcb); + _ttcp->pending_close[id] = false; + return ERR_ABRT; + } + + if (pcb) + INFO_TCP_POLL("keepAliveCnt:%d keep_idle:%d persist_cnt:%d\n", + pcb->keep_cnt_sent, pcb->keep_idle, pcb->persist_cnt); + + if (_ttcp->left[id] > 0) + INFO_TCP("ARD TCP [%p-%p] arg=%p retries=%d pend.close:%d len:%d\n", + (_ttcp)?GET_FIRST_CLIENT_TCP(_ttcp):0, pcb, arg, + _ttcp->tcp_poll_retries[id], _ttcp->pending_close[id], (_ttcp)?_ttcp->left[id]:0); + tcp_send_data_pcb(_ttcp, pcb); + + if (_ttcp->pending_close[id]) + { + err_t err = ERR_OK; + if (id >=0){ + err = tcp_close(pcb); + if (err == ERR_MEM) + { + _ttcp->pending_close[id] = true; + } + else + { + _ttcp->pending_close[id] = false; + removeNewClientConn(_ttcp, _ttcp->tpcb[id]); + FREE_PAYLOAD_ID(_ttcp, id); + INFO_TCP("----------------------\n"); + } + } + INFO_TCP("ARD TCP [%p-%p] try to close pending:%d err:%d id:%d\n", pcb, + (_ttcp)?GET_FIRST_CLIENT_TCP(_ttcp):0, _ttcp->pending_close[id], err, id); + } + return ERR_OK; +} + +static err_t atcp_poll_conn(void *arg, struct tcp_pcb *pcb) { + struct ttcp* _ttcp = arg; + + if (_ttcp == NULL) return ERR_ARG; + + GET_CLIENT_ID(_ttcp, pcb) + + INFO_TCP_POLL("ARD TCP [%p-%p] arg=%p retries=%d pend.close:%d conn:%d\n", + (_ttcp)?GET_FIRST_CLIENT_TCP(_ttcp):0, pcb, arg, + _ttcp->tcp_poll_retries[id], _ttcp->pending_close[id], _connected); + + if (id != NO_VALID_ID) + { + if (_ttcp->pending_close[id]) + ++(_ttcp->tcp_poll_retries[id]); + } + + if (_ttcp->tcp_poll_retries[id] > 8) { + WARN("ARD TCP [%p-%p] arg=%p retries=%d\n", + pcb, GET_FIRST_CLIENT_TCP(_ttcp), arg, _ttcp->tcp_poll_retries[id]); + _ttcp->tcp_poll_retries[id] = 0; + tcp_abort(pcb); + return ERR_ABRT; + } + + if ((_ttcp)&&(_connected)) tcp_send_data_pcb(_ttcp, pcb); + + if ((id != NO_VALID_ID) && (_ttcp->pending_close[id])) + { + err_t err = tcp_close(pcb); + if (err == ERR_MEM) + { + _ttcp->pending_close[id] = true; + } + else + { + cleanSockState_cb(_ttcp); + FREE_PAYLOAD_ID(_ttcp, id); + _ttcp->pending_close[id] = false; + } + + INFO_TCP("ARD TCP [%p-%p] try to close pending:%d\n", pcb, (_ttcp)?GET_FIRST_CLIENT_TCP(_ttcp):0, _ttcp->pending_close[id]); + } + return ERR_OK; +} + +int8_t currConnId = 0; + +int8_t getCurrClientConnId() { return currConnId;} + +int8_t getNewClientConnId(struct ttcp* _ttcp, struct tcp_pcb *newpcb) +{ + if (_ttcp != NULL){ + int i = 0; + for (; itpcb[idx] == newpcb) + { + INFO_TCP_VER("ttcp:%p id=%d, tpcb=%p\n", _ttcp, idx, newpcb); + return idx; + } + } + } + WARN("No Valid Id for ttcp:%p pcb:%p\n", _ttcp, newpcb); + return NO_VALID_ID; +} + +struct tcp_pcb * getFirstClient(struct ttcp* _ttcp, bool verbose) +{ + if (_ttcp != NULL){ + int i = 0; + for (; itpcb[idx] != NULL) + { + if (verbose) INFO_TCP("ttcp:%p id=%d, tpcb=%p\n", _ttcp, idx, _ttcp->tpcb[idx]); + currConnId = idx; + return _ttcp->tpcb[idx]; + } + } + } + if (verbose) WARN("No Valid client for ttcp:%p\n", _ttcp); + return NULL; +} + + +int8_t setNewClientConn(struct ttcp* _ttcp, struct tcp_pcb *newpcb, uint8_t id) +{ + if ((_ttcp != NULL)&&(id>=0)&&(idtpcb[id] = newpcb; + return id; + } + return NO_VALID_ID; +} + +int8_t insertNewClientConn(struct ttcp* _ttcp, struct tcp_pcb *newpcb) +{ + if (_ttcp != NULL){ + int i = 0; + for (; itpcb[idx] == NULL)||(_ttcp->tpcb[idx] == newpcb)) + { + INFO_TCP("ttcp:%p id=%d, tpcb=%p\n", _ttcp, idx, newpcb); + _ttcp->tpcb[idx] = newpcb; + return idx; + } + } + } + return NO_VALID_ID; +} + +int8_t removeNewClientConn(struct ttcp* _ttcp, struct tcp_pcb *newpcb) +{ + if (_ttcp != NULL){ + int i = 0; + for (; itpcb[idx] == newpcb) + { + INFO_TCP("ttcp:%p id=%d, tpcb=%p\n", _ttcp, idx, newpcb); + _ttcp->tpcb[idx] = NULL; + return idx; + } + } + } + return NO_VALID_ID; +} + +bool cleanNewClientConn(struct ttcp* _ttcp) +{ + if (_ttcp != NULL){ + int i = 0; + for (; itpcb[i] = NULL; + return true; + } + return false; +} + + +/** + * Only used in TCP mode. + */ +static err_t atcp_accept_cb(void *arg, struct tcp_pcb *newpcb, err_t err) { + struct ttcp* _ttcp = arg; + + if (_ttcp == NULL) return ERR_ARG; + + INFO_TCP("ARD TCP [%p]: accept new [%p]\n", _ttcp, newpcb); + INFO_TCP("local:%d remote:%d state:%d\n", newpcb->local_port, newpcb->remote_port, newpcb->state); + + int8_t id = insertNewClientConn(_ttcp, newpcb); + + ASSERT((_ttcp->payload[id]==NULL), "payload not freed!"); + _ttcp->payload[id] = malloc(_ttcp->buflen); + INFO_TCP("Alloc payload %d-%p\n", id, _ttcp->payload[id]); + if (_ttcp->payload[id] == NULL) { + WARN("TTCP [%p]: could not allocate payload\n", _ttcp); + return -1; + } + tcp_arg(_ttcp->tpcb[id], _ttcp); + tcp_recv(_ttcp->tpcb[id], atcp_recv_cb); + tcp_err(_ttcp->tpcb[id], atcp_conn_err_cb); + tcp_poll(_ttcp->tpcb[id], atcp_poll, 4); + // Copy the pointer to ttcp also to TRANSMIT mode for the clients connected to the server + int _sock = getSock(_ttcp); + if ((_sock != -1)&&(IS_VALID_SOCK(_sock))) + setMapSockMode(_sock, _ttcp, TTCP_MODE_TRANSMIT); + _ttcp->start_time = timer_get_ms(); + return ERR_OK; +} + +/** + * Start TCP transfer. + */ +static int atcp_start(struct ttcp* ttcp) { + err_t err = ERR_OK; + + struct tcp_pcb * p = tcp_new(); + + if (p == NULL) { + WARN("TTCP [%p]: could not allocate pcb\n", ttcp); + return -1; + } + + currConnId = 0; + tcp_arg(p, ttcp); + atcp_init_pend_flags(ttcp); + + if (ttcp->mode == TTCP_MODE_TRANSMIT) { + int8_t id = insertNewClientConn(ttcp, p); + ttcp->payload[id] = malloc(ttcp->buflen); + INFO_TCP("Alloc payload %d-%p\n", id, ttcp->payload[id]); + if (ttcp->payload[id] == NULL) { + WARN("TTCP [%p]: could not allocate payload\n", ttcp); + return -1; + } + + struct tcp_pcb * pcb = p; + tcp_err(pcb, atcp_conn_cli_err_cb); + tcp_recv(pcb, atcp_recv_cb); + tcp_sent(pcb, tcp_data_sent); + tcp_poll(pcb, atcp_poll_conn, 4); + _connected = false; + INFO_TCP("[tpcb]-%p payload:%p\n", pcb, ttcp->payload[id]); + DUMP_TCP_STATE(ttcp); + if (tcp_connect(pcb, &ttcp->addr, ttcp->port, tcp_connect_cb) + != ERR_OK) { + WARN("TTCP [%p]: tcp connect failed\n", ttcp); + return -1; + } + + } else { + INFO_TCP("BEFORE BIND ttcp:%p lpcb:%p pcb:%p\n", ttcp, ttcp->lpcb, GET_FIRST_CLIENT_TCP(ttcp)); + + err = tcp_bind(p, IP_ADDR_ANY, ttcp->port); + if (err != ERR_OK){ + WARN("TTCP [%p]: bind failed err=%d Port already used\n", ttcp, err); + return -1; + } + + ttcp->lpcb = tcp_listen(p); + if (ttcp->lpcb == NULL) { + WARN("TTCP [%p]: listen failed\n", ttcp); + return -1; + } + + DUMP_TCP_STATE(ttcp); + tcp_accept(ttcp->lpcb, atcp_accept_cb); + } + + return 0; +} + +/** + * Only used in UDP mode. Will finalize the ttcp process when an end marker + * is seen. + */ +static void audp_recv_cb(void *arg, struct udp_pcb *upcb, struct pbuf *p, + struct ip_addr *addr, u16_t port) { + struct ttcp* ttcp = arg; + + /* for print_stats() */ + ttcp->recved += p->tot_len; + DUMP(p->payload,p->tot_len); + if (ttcp->verbose) { + printk("."); + if (ttcp->print_cnt % 80 == 0) + printk("\n"); + ttcp->print_cnt++; + } + INFO_TCP("UDP Insert %p sock:%d addr:%s port:%d\n", p, ttcp->sock, + ip2str(*addr), port); + insert_pBuf(p, ttcp->sock, (void*) upcb); + setRemoteClient(ttcp->sock, addr->addr, port); + + pbuf_free(p); +} + +/** + * Start UDP transfer. + */ +static int udp_start(struct ttcp* ttcp) { + err_t err = ERR_OK; + ttcp->udp_end_marker_left = 5; + ttcp->upcb = udp_new(); + if (ttcp->upcb == NULL) { + WARN("TTCP [%p]: could not allocate pcb\n", ttcp); + return -1; + } + + INFO_TCP("%s, upcb:%p %s:%d\n", __FUNCTION__, ttcp->upcb, ip2str(ttcp->addr), ttcp->port); + if (ttcp->mode == TTCP_MODE_TRANSMIT) { + if (udp_connect(ttcp->upcb, &(ttcp->addr), ttcp->port) != ERR_OK) { + WARN("TTCP [%p]: udp connect failed\n", ttcp); + return -1; + } + udp_recv(ttcp->upcb, audp_recv_cb, ttcp); + } else { + /* bind to any IP address on port specified */ + err = udp_bind(ttcp->upcb, IP_ADDR_ANY, ttcp->port); + if (err!= ERR_OK) { + WARN("TTCP [%p]: bind failed err=%d Port already used\n", ttcp, err); + return -1; + } + // clear remote client data + setRemoteClient(ttcp->sock, 0, 0); + udp_recv(ttcp->upcb, audp_recv_cb, ttcp); + } + INFO_TCP("%s, loc:0x%x-%d rem:0x%x-%d\n", __FUNCTION__, + ttcp->upcb->local_ip.addr, ttcp->upcb->local_port, + ttcp->upcb->remote_ip.addr, ttcp->upcb->remote_port); + return 0; +} + +/** + * Start a new ttcp transfer. It should be possible to call this function + * multiple times in order to get multiple ttcp streams. done_cb() will be + * invoked upon completion. + * + */ +int ard_tcp_start(struct ip_addr addr, uint16_t port, void *opaque, + ard_tcp_done_cb_t *done_cb, int mode, uint16_t nbuf, uint16_t buflen, + int udp, int verbose, uint8_t sock, void** _ttcp) { + struct ttcp* ttcp; + int status; + + if (mode != TTCP_MODE_TRANSMIT && mode != TTCP_MODE_RECEIVE) { + WARN("TTCP [-]: invalid mode\n"); + return -1; + } + + if (nbuf == 0) { + WARN("TTCP [-]: invalid nbuf\n"); + return -1; + } + + if (buflen == 0) { + WARN("TTCP [-]: invalid buflen\n"); + return -1; + } + + ttcp = calloc(1, sizeof(struct ttcp)); + if (ttcp == NULL) { + WARN("TTCP [-]: could not allocate memory for ttcp\n"); + return -1; + } + + ttcp->addr = addr; + ttcp->port = port; + ttcp->nbuf = nbuf; + ttcp->mode = mode; + ttcp->done_cb = done_cb; + ttcp->opaque = opaque; + ttcp->udp = udp; + ttcp->verbose = verbose; + ttcp->buflen = buflen; + cleanNewClientConn(ttcp); + + if (ttcp->udp) + status = udp_start(ttcp); + else + status = atcp_start(ttcp); + + if (status) { + WARN("Start server FAILED!\n"); + goto fail; + } + INFO_TCP("TTCP [%p-%p]: nbuf=%d, buflen=%d, port=%d (%s/%s)\n", ttcp, + ((ttcp->udp==1)?(void*)ttcp->upcb:GET_FIRST_CLIENT_TCP(ttcp)), ttcp->nbuf, ttcp->buflen, + ttcp->port, ProtMode2Str(ttcp->udp), Mode2Str(ttcp->mode)); + + *_ttcp = (void*) ttcp; + ttcp->sock = sock; + + return 0; + + fail: ard_tcp_destroy(ttcp); + return -1; +} + +void ard_tcp_stop(void* ttcp) { + struct ttcp* _ttcp = (struct ttcp*) ttcp; + if (_ttcp == NULL) + { + WARN("ttcp = NULL!\n"); + return; + } + if (_ttcp->mode == TTCP_MODE_TRANSMIT) { + int i = getCurrClientConnId(); + ard_tcp_destroy(_ttcp); + clearMapSockTcp(getSock(_ttcp), GET_TCP_MODE(_ttcp)); + _ttcp->tcp_poll_retries[i] = 0; + }else{ + DUMP_TCP_STATE(_ttcp); + + int i = getCurrClientConnId(); + if ((_ttcp)&&(_ttcp->tpcb[i])&&(_ttcp->tpcb[i]->state!=LAST_ACK)&&(_ttcp->tpcb[i]->state!=CLOSED)) + { + // Flush all the data + err_t err=tcp_output(_ttcp->tpcb[i]); + INFO_TCP("flush data: tpcb:%p err:%d\n", _ttcp->tpcb[i], err); + // if any socket cannot be close stop the close connection + close_conn(_ttcp, _ttcp->tpcb[i]); + } + } +} + +uint8_t getStateTcp(void* p, bool client) { + struct ttcp* _ttcp = (struct ttcp*) p; + + if (ifStatus == false) + return CLOSED; + struct tcp_pcb * pcb = GET_FIRST_CLIENT_TCP_NV(_ttcp); + if ((_ttcp != NULL) && ((pcb != NULL) || (client==0))) { + IF_SPI_POLL(DUMP_TCP_STATE(_ttcp)); + if (client) + { + if ((pcb->state != ESTABLISHED)&&(pcb->state != CLOSED)) + DUMP_TCP_STATE(_ttcp); + return pcb->state; + } + else + { + return _ttcp->lpcb->state; + } + } else { + WARN_POLL("TCP not initialized ttcp:%p tpcb:%p lpcb:%p\n", + _ttcp, ((_ttcp)?pcb:0), ((_ttcp)?_ttcp->lpcb:0)); + } + return CLOSED; +} + +uint8_t getModeTcp(void* p) { + struct ttcp* _ttcp = (struct ttcp*) p; + + if (_ttcp != NULL) + return _ttcp->mode; + return 0; +} + +uint8_t isDataSent(void* p) { + struct ttcp *_ttcp = (struct ttcp *)p; + + int8_t id = getCurrClientConnId(); + if ((_ttcp)&&(!_ttcp->buff_sent[id])) + { + return 0; + } + + return 1; +} + +static err_t tcp_data_sent(void *arg, struct tcp_pcb *pcb, u16_t len) { + struct ttcp *_ttcp; + + LWIP_UNUSED_ARG(len); + + _ttcp = arg; + + if (_ttcp == NULL) return ERR_ARG; + + GET_CLIENT_ID(_ttcp, pcb); + _ttcp->tcp_poll_retries[id] = 0; + _ttcp->buff_sent[id] = 1; + + INFO_TCP("Packet sent pcb:%p len:%d dur:%d left:%d\n", pcb, len, timer_get_ms() - startTime, + (_ttcp)?(_ttcp->left[id]):0); + + if ((_ttcp)&&(_ttcp->left[id] > 0)) { + tcp_send_data_pcb(_ttcp, pcb); + } + + return ERR_OK; +} + +int sendTcpData(void* p, uint8_t* buf, uint16_t len) +{ + struct ttcp* _ttcp = (struct ttcp*) p; + + if (_ttcp==NULL) + { + WARN("ttcp == NULL!\n"); + return WL_FAILURE; + } + + struct tcp_pcb * pcb = GET_FIRST_CLIENT_TCP_NV(_ttcp); + GET_CLIENT_ID(_ttcp, pcb); + + INFO_TCP_VER("ttcp:%p pcb:%p buf:%p len:%d\n", _ttcp, pcb, buf, len); + DUMP_TCP(buf,len); + IF_TCP_VER(DUMP_TCP_STATE(_ttcp)); + + if ((_ttcp != NULL) && (pcb != NULL) && + (buf != NULL) && (len != 0) && (_ttcp->payload[id] != NULL)) { + if (pcb->state == ESTABLISHED || pcb->state == CLOSE_WAIT || + pcb->state == SYN_SENT || pcb->state == SYN_RCVD) { + + memcpy(_ttcp->payload[id], buf, len); + _ttcp->payload[id][len]='\0'; + INFO_TCP_VER("'%s'\n", _ttcp->payload[id]); + _ttcp->left[id] = len; + tcp_sent(pcb, tcp_data_sent); + tcp_send_data_pcb(_ttcp, pcb); + + return WL_SUCCESS; + } + } + //printk("Write failure _ttcp=%p _ttcp->tpcb=%p buf=%p len=%d\n", _ttcp, _ttcp->tpcb, buf, len); + return WL_FAILURE; +} + +int sendUdpData(void* ttcp, uint8_t* buf, uint16_t len) { + struct ttcp* _ttcp = (struct ttcp*) ttcp; + if ((_ttcp != NULL) && (buf != NULL) && (len != 0)) + { + INFO_TCP("buf:%p len:%d\n", buf, len); + DUMP_TCP(buf,len); + }else{ + return WL_FAILURE; + } + + struct pbuf* p = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM); + if (p == NULL) { + WARN("TTCP [%p]: could not allocate pbuf\n", ttcp); + return WL_FAILURE; + } + memcpy(p->payload, buf, len); + if (udp_send(_ttcp->upcb, p) != ERR_OK) { + WARN("TTCP [%p]: udp_send() failed\n", _ttcp); + pbuf_free(p); + return WL_FAILURE; + } + + pbuf_free(p); + return WL_SUCCESS; +} + + + +char + usage[] = + "Usage: ttcp -t/-r [-options] host\n\ + -l length of bufs written to network (default 1024)\n\ + -n number of bufs written to network (default 1024)\n\ + -p port number to send to (default 2000)\n\ + -u udp\n\ + -v verbose\n"; + +/** + * + */ +cmd_state_t cmd_ttcp(int argc, char* argv[], void* ctx) { + + int c; + int mode = TTCP_MODE_TRANSMIT; + int verbose = 0; + uint16_t buflen = 1024; + uint16_t nbuf = 1024; + uint16_t port = 2000; + int udp = 0; + struct ip_addr addr = { 0 }; + + optind = 1; + while ((c = getopt(argc, argv, "utrl:n:p:v")) != -1) { + switch (c) { + case 't': + mode = TTCP_MODE_TRANSMIT; + break; + case 'r': + mode = TTCP_MODE_RECEIVE; + break; + case 'l': + buflen = atoi(optarg); + break; + case 'v': + verbose = 1; + break; + case 'n': + nbuf = atoi(optarg); + break; + case 'u': + udp = 1; + break; + case 'p': + port = atoi(optarg); + break; + } + } + + if (mode == TTCP_MODE_TRANSMIT) { + if (optind >= argc) { + printk("%s", usage); + return CMD_DONE; + } + + addr = str2ip(argv[optind]); + if (!addr.addr) { + printk("%s", usage); + return CMD_DONE; + } + } + void* _ttcp = NULL; + if (ard_tcp_start(addr, port, NULL, NULL, mode, nbuf, buflen, udp, verbose, + 0, &_ttcp)) + return CMD_DONE; + + return CMD_DONE; +} + + +#if 0 +#include "lwip/sockets.h" + +void testlwip() +{ + int Sock; + fd_set fdsetR; + FD_ZERO(&fdsetR); + FD_SET(Sock, &fdsetR); + fd_set fdsetE = fdsetR; + + int rc; + const int cMillies = 10000; + struct timeval timeout; + timeout.tv_sec = cMillies / 1000; + timeout.tv_usec = (cMillies % 1000) * 1000; + //rc = lwip_select(Sock + 1, &fdsetR, NULL, &fdsetE, &timeout); +} +#endif diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/ard_tcp.h b/firmware/libraries/WiFi/extras/wifiHD/src/ard_tcp.h new file mode 100644 index 0000000..078e0b0 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/ard_tcp.h @@ -0,0 +1,124 @@ +/* + * ard_tcp.h + * + * Created on: May 27, 2010 + * Author: mlf by Metodo2 srl + */ + +#ifndef ARD_TCP_H +#define ARD_TCP_H + +#include "console.h" +#include "lwip/tcp.h" + +typedef void (ard_tcp_done_cb_t)(void *opaque, int result); + +#define TTCP_MODE_TRANSMIT 0 +#define TTCP_MODE_RECEIVE 1 +#define MAX_MODE_NUM 2 + +#define GET_TCP_MODE(X) ((X!=NULL)?((struct ttcp*)(X))->mode:0) +#define IS_VALID_SOCK(SOCK) ((SOCK>=0)&&(SOCKudp:0) + +// Maximum number of client connection accepted by server +#define MAX_CLIENT_ACCEPTED 4 +#define NO_VALID_ID 0xff + +#define GET_FIRST_CLIENT_TCP(TTCP) getFirstClient(TTCP, 1) +#define GET_FIRST_CLIENT_TCP_NV(TTCP) getFirstClient(TTCP, 0) +#define GET_CLIENT_TCP(TTCP,ID) (((TTCP!=NULL)&&(ID>=0)&&(IDtpcb[ID] : NULL) +#define GET_CLIENT_ID(TTCP, PCB) uint8_t id = NO_VALID_ID; do { \ + id = getNewClientConnId(TTCP, PCB); \ + if (id == NO_VALID_ID) return ERR_MEM; \ + }while(0); +#define GET_IDX_CONN(I) ((I+currConnId)payload[id]); \ + if (TTCP->payload[id]) { \ + free(TTCP->payload[id]); \ + TTCP->payload[id] = NULL; } \ +}while(0); + +#define FREE_PAYLOAD_ID(TTCP,ID) do { \ + INFO_TCP("Freeing payload %d-%p\n", ID, TTCP->payload[ID]); \ + if (TTCP->payload[ID]) { \ + free(TTCP->payload[ID]); \ + TTCP->payload[ID] = NULL; } \ +}while(0); + + +typedef struct ttcp { + + /* options */ + struct ip_addr addr; /* host */ + uint16_t port; /* -p */ + uint16_t nbuf; /* -n */ + int mode; /* -t */ + int verbose; /* -v */ + int udp; /* -u */ + uint8_t sock; + uint8_t buff_sent[MAX_CLIENT_ACCEPTED]; + + /* common */ + uint16_t print_cnt; + uint32_t start_time; + uint32_t left[MAX_CLIENT_ACCEPTED]; + uint32_t recved; + ard_tcp_done_cb_t* done_cb; + void* opaque; + uint32_t buflen; /* -l */ + uint32_t tid; + + /* TCP specific */ + struct tcp_pcb* tpcb[MAX_CLIENT_ACCEPTED]; + struct tcp_pcb* lpcb; + char* payload[MAX_CLIENT_ACCEPTED]; + uint8_t tcp_poll_retries[MAX_CLIENT_ACCEPTED]; + bool pending_close[MAX_CLIENT_ACCEPTED]; + + /* UDP specific */ + int udp_started; + uint16_t udp_end_marker_left; + struct udp_pcb* upcb; +}ttcp_t; + +bool _connected; + +int ard_tcp_start(struct ip_addr addr, uint16_t port, void *opaque, + ard_tcp_done_cb_t *done_cb, int mode, uint16_t nbuf, uint16_t buflen, int udp, int verbose, uint8_t sock, void** _ttcp); + +void ard_tcp_stop(void* ttcp); + +uint8_t getStateTcp(void* p, bool client ); + +uint8_t getModeTcp(void* p); + +int sendTcpData(void* p, uint8_t* buf, uint16_t len); + +int sendUdpData(void* p, uint8_t* buf, uint16_t len); + +uint8_t isDataSent(void* p ); + +cmd_state_t cmd_ttcp(int argc, char* argv[], void* ctx); + +int8_t setNewClientConn(struct ttcp* _ttcp, struct tcp_pcb *newpcb, uint8_t id); + +int8_t insertNewClientConn(struct ttcp* _ttcp, struct tcp_pcb *newpcb); + +int8_t removeNewClientConn(struct ttcp* _ttcp, struct tcp_pcb *newpcb); + +bool cleanNewClientConn(struct ttcp* _ttcp); + +int8_t getNewClientConnId(struct ttcp* _ttcp, struct tcp_pcb *newpcb); + +int8_t getCurrClientConnId(); + +struct tcp_pcb * getFirstClient(struct ttcp* _ttcp, bool verbose); + +void closeConnections(); + +#endif diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/ard_utils.c b/firmware/libraries/WiFi/extras/wifiHD/src/ard_utils.c new file mode 100644 index 0000000..c2937d8 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/ard_utils.c @@ -0,0 +1,347 @@ +/* + * ard_utils.c + * + * Created on: Jul 4, 2010 + * Author: mlf by Metodo2 srl + */ +//#define _APP_DEBUG_ + +#include "lwip/pbuf.h" +#include "wifi_spi.h" +#include "ard_utils.h" +#include "debug.h" +#include "ard_spi.h" +#include "ard_tcp.h" + +#define MAX_PBUF_STORED 30 + +tData pBufStore[MAX_PBUF_STORED][MAX_SOCK_NUM]; + +unsigned char headBuf[MAX_SOCK_NUM] = {0}; +unsigned char tailBuf[MAX_SOCK_NUM] = {0}; + +#define IS_BUF_AVAIL(x) (tailBuf[x] != headBuf[x]) +#define IS_BUF_EMPTY(x) ((tailBuf[x] == 0) && (headBuf[x] == 0)) + +void init_pBuf() +{ + memset(pBufStore, 0, sizeof(pBufStore)); +} + +uint8_t* insertBuf(uint8_t sock, uint8_t* buf, uint16_t len) +{ + DUMP(buf,len); + if (sock>= MAX_SOCK_NUM) + { + WARN("Sock out of range: sock=%d", sock); + return NULL; + } + if (pBufStore[headBuf[sock]][sock].data != NULL) + { + WARN("Overwriting buffer %p idx:%d!\n", pBufStore[headBuf[sock]][sock].data, headBuf[sock]); + // to avoid memory leak free the oldest buffer + freetDataIdx(headBuf[sock], sock); + } + + u8_t* p = (u8_t*)calloc(len,sizeof(u8_t)); + if(p != NULL) { + memcpy(p, buf, len); + + pBufStore[headBuf[sock]][sock].data = p; + pBufStore[headBuf[sock]][sock].len = len; + pBufStore[headBuf[sock]][sock].idx = 0; + pBufStore[headBuf[sock]][sock].pcb = getTTCP(sock, TTCP_MODE_TRANSMIT); + headBuf[sock]++; + + if (headBuf[sock] == MAX_PBUF_STORED) + headBuf[sock] = 0; + if (headBuf[sock] == tailBuf[sock]) + { + WARN("Avoid to Overwrite data [%d-%d]!\n", headBuf[sock], tailBuf[sock]); + if (headBuf[sock] != 0) + --headBuf[sock]; + else + headBuf[sock] = MAX_PBUF_STORED-1; + } + INFO_UTIL("Insert[%d]: %p:%d-%d [%d,%d]\n", sock, p, len, p[0], headBuf[sock], tailBuf[sock]); + } + return p; +} + + +uint16_t calcMergeLen(uint8_t sock) +{ + uint16_t len = 0; + + unsigned char index = tailBuf[sock]; + do { + if (pBufStore[index][sock].data != NULL) + { + len += pBufStore[index][sock].len; + len -= pBufStore[index][sock].idx; + INFO_UTIL_VER(" [%d]: len:%d idx:%d tot:%d\n", sock, pBufStore[index][sock].len, pBufStore[index][sock].idx, len); + } + ++index; + if (index == MAX_PBUF_STORED) + index = 0; + }while (index!=headBuf[sock]); + return len; +} + +uint16_t clearBuf(uint8_t sock) +{ + uint16_t len = 0; + + unsigned char index = tailBuf[sock]; + do { + if (pBufStore[index][sock].data != NULL) + { + freetDataIdx(index,sock); + } + ++index; + if (index == MAX_PBUF_STORED) + index = 0; + }while (index!=headBuf[sock]); + tailBuf[sock]=index; + return len; +} + +uint8_t* mergeBuf(uint8_t sock, uint8_t** buf, uint16_t* _len) +{ + uint16_t len = calcMergeLen(sock); + uint8_t* p = (u8_t*)calloc(len,sizeof(u8_t)); + uint8_t* _p = p; + if(p != NULL) { + unsigned char index = tailBuf[sock]; + do { + if (pBufStore[index][sock].data != NULL) + { + memcpy(p, pBufStore[index][sock].data, pBufStore[index][sock].len); + p += pBufStore[index][sock].len; + } + ++index; + if (index == MAX_PBUF_STORED) + index = 0; + }while (index!=headBuf[sock]); + } + DUMP(_p,len); + if (buf != NULL) + *buf = _p; + if (_len != NULL) + *_len = len; + return _p; +} + +uint8_t* insert_pBuf(struct pbuf* q, uint8_t sock, void* _pcb) +{ + if (q == NULL) + return NULL; + + if (pBufStore[headBuf[sock]][sock].data != NULL) + { + WARN("Overwriting buffer %p idx:%d!\n", pBufStore[headBuf[sock]][sock].data, headBuf[sock]); + // to avoid memory leak free the oldest buffer + freetDataIdx(headBuf[sock], sock); + } + + u8_t* p = (u8_t*)calloc(q->tot_len,sizeof(u8_t)); + if(p != NULL) { + if (pbuf_copy_partial(q, p, q->tot_len,0) != q->tot_len) { + WARN("pbuf_copy_partial failed: src:%p, dst:%p, len:%d\n", q, p, q->tot_len); + free(p); + p = NULL; + return p; + } + + pBufStore[headBuf[sock]][sock].data = p; + pBufStore[headBuf[sock]][sock].len = q->tot_len; + pBufStore[headBuf[sock]][sock].idx = 0; + pBufStore[headBuf[sock]][sock].pcb = _pcb; + headBuf[sock]++; + + if (headBuf[sock] == MAX_PBUF_STORED) + headBuf[sock] = 0; + if (headBuf[sock] == tailBuf[sock]) + { + WARN("Avoid to Overwrite data [%d-%d]!\n", headBuf[sock], tailBuf[sock]); + if (headBuf[sock] != 0) + --headBuf[sock]; + else + headBuf[sock] = MAX_PBUF_STORED-1; + } + INFO_UTIL("Insert[%d]: %p:%d-%d [%d,%d]\n", sock, p, q->tot_len, p[0], headBuf[sock], tailBuf[sock]); + } + return p; +} + +void dumpPbuf(uint8_t sock) +{ + unsigned char index = tailBuf[sock]; + printk("headBuf=%d tailBuf=%d\n", headBuf[sock], tailBuf[sock]); + do { + if (pBufStore[index][sock].data != NULL) + { + printk("%d] pcb:%p Buf: %p Len:%d\n", pBufStore[index][sock].idx, pBufStore[index][sock].pcb, + pBufStore[index][sock].data, pBufStore[index][sock].len); + } + ++index; + if (index == MAX_PBUF_STORED) + index = 0; + }while (index!=headBuf[sock]); +} + +tData* get_pBuf(uint8_t sock) +{ + if (IS_BUF_EMPTY(sock)) + return NULL; + + if (IS_BUF_AVAIL(sock)) + { + tData* p = &(pBufStore[tailBuf[sock]][sock]); + INFO_UTIL_VER("%p [%d,%d]\n", p, headBuf[sock], tailBuf[sock]); + return p; + } + return NULL; +} + +void freetData(void * buf, uint8_t sock) +{ + if (buf==NULL) + { + WARN("Buf == NULL!"); + return; + } + + pBufStore[tailBuf[sock]][sock].data = NULL; + pBufStore[tailBuf[sock]][sock].len = 0; + pBufStore[tailBuf[sock]][sock].idx = 0; + pBufStore[tailBuf[sock]][sock].pcb = 0; + + if (++tailBuf[sock] == MAX_PBUF_STORED) + tailBuf[sock] = 0; + INFO_UTIL("%p [%d,%d]\n", buf, headBuf[sock], tailBuf[sock]); + free(buf); +} + +void freetDataIdx(uint8_t idxBuf, uint8_t sock) +{ + if (idxBuf >=MAX_PBUF_STORED) + { + WARN("idxBuf out of range: %d\n", idxBuf); + return; + } + + void * buf = pBufStore[idxBuf][sock].data; + + INFO_UTIL("%p idx:%d\n", buf, idxBuf); + + free(buf); + + pBufStore[idxBuf][sock].data = 0; + pBufStore[idxBuf][sock].len = 0; + pBufStore[idxBuf][sock].idx = 0; + pBufStore[idxBuf][sock].pcb = 0; +} + + +void ack_recved(void* pcb, int len); + +void ackAndFreeData(void* pcb, int len, uint8_t sock, uint8_t* data) +{ + INFO_TCP("Ack pcb:%p len:%d sock:%d data:%p\n", pcb, len, sock, data); + if (!IS_UDP_SOCK(sock)) + ack_recved(pcb, len); + if (data != NULL) + freetData(data, sock); +} + + +bool isAvailTcpDataByte(uint8_t sock) +{ + tData* p = get_pBuf(sock); + + if (p != NULL) + { + INFO_UTIL_VER("check:%d %d %p\n",p->idx, p->len, p->data); + if (p->idx == p->len) + { + INFO_UTIL("Free %p other buf %d tail:%d head:%d\n", + p->data, IS_BUF_AVAIL(sock), tailBuf[sock], headBuf[sock]); + ackAndFreeData(p->pcb, p->len, sock, p->data); + return (IS_BUF_AVAIL(sock)); + }else{ + return true; + } + } + return false; +} + +uint16_t getAvailTcpDataByte(uint8_t sock) +{ + uint16_t len = calcMergeLen(sock); + INFO_UTIL_VER("Availabled data: %d\n", len); + return len; +} + + +bool getTcpDataByte(uint8_t sock, uint8_t* payload, uint8_t peek) +{ + // ref field in struct pbuf has been used as index pointer for byte data + tData* p = get_pBuf(sock); + + if (p != NULL) + { + if (p->idx < p->len) + { + uint8_t* buf = (uint8_t*)p->data; + if (peek) + *payload = buf[p->idx]; + else + *payload = buf[p->idx++]; + INFO_UTIL_VER("get:%d %p %d\n",p->idx, p->data, *payload); + if (p->idx == p->len) + ackAndFreeData(p->pcb, p->len, sock, p->data); + return true; + }else{ + ackAndFreeData(p->pcb, p->len, sock, p->data); + } + } + return false; +} + +bool getTcpData(uint8_t sock, void** payload, uint16_t* len) +{ + tData* p = NULL; + p = get_pBuf(sock); + if (p != NULL) + { + *payload = p->data; + *len = p->len; + return true; + } + return false; +} + +bool freeTcpData(uint8_t sock) +{ + tData* p = NULL; + p = get_pBuf(sock); + if (p != NULL) + { + ackAndFreeData(p->pcb, p->len, sock, p->data); + return true; + } + return false; +} + +void freeAllTcpData(uint8_t sock) +{ + tData* p = NULL; + do{ + p = get_pBuf(sock); + if (p != NULL) + freetData(p->data, sock); + }while(p!=NULL); +} + + diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/ard_utils.h b/firmware/libraries/WiFi/extras/wifiHD/src/ard_utils.h new file mode 100644 index 0000000..323b328 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/ard_utils.h @@ -0,0 +1,295 @@ +/* + * ard_utils.h + * + * Created on: Jul 4, 2010 + * Author: mlf by Metodo2 srl + */ + +#ifndef ARD_UTILS_H_ +#define ARD_UTILS_H_ + +#include "gpio.h" +#include "debug.h" +#include "ARDUINO/arduino.h" +#define INIT_SIGNAL_FOR_SPI() gpio_disable_pin_pull_up(ARDUINO_HANDSHAKE_PIN); +#define BUSY_FOR_SPI() gpio_set_gpio_pin(ARDUINO_HANDSHAKE_PIN) +#define AVAIL_FOR_SPI() gpio_clr_gpio_pin(ARDUINO_HANDSHAKE_PIN) + +#define LED0_UP() gpio_set_gpio_pin(LED0_GPIO) +#define LED0_DN() gpio_clr_gpio_pin(LED0_GPIO) +#define LED0_TL() gpio_tgl_gpio_pin(LED0_GPIO) +#define LED1_UP() gpio_set_gpio_pin(LED1_GPIO) +#define LED1_DN() gpio_clr_gpio_pin(LED1_GPIO) +#define LED1_TL() gpio_tgl_gpio_pin(LED1_GPIO) +#define LED2_UP() gpio_set_gpio_pin(LED2_GPIO) +#define LED2_DN() gpio_clr_gpio_pin(LED2_GPIO) +#define LED2_TL() gpio_tgl_gpio_pin(LED2_GPIO) + +#ifdef _DEBUG_ +#define SIGN0_UP LED0_UP +#define SIGN0_DN LED0_DN +#define SIGN0_TL LED0_TL +#define SIGN1_UP LED1_UP +#define SIGN1_DN LED1_DN +#define SIGN1_TL LED1_TL +#define SIGN2_UP LED2_UP +#define SIGN2_DN LED2_DN +#define SIGN2_TL LED2_TL + +#define DEB_PIN_UP(X) gpio_set_gpio_pin(DEB##X##_PIN_GPIO) +#define DEB_PIN_DN(X) gpio_clr_gpio_pin(DEB##X##_PIN_GPIO) +#define DEB_PIN_ENA(X) gpio_enable_gpio_pin(DEB##X##_PIN_GPIO) +#define DEB_PIN_TOGGLE(X) gpio_tgl_gpio_pin(DEB##X##_PIN_GPIO) +#define DEB_PIN_TRIGGER(X) DEB_PIN_DN(X); DEB_PIN_UP(X); + + +#else +#define SIGN0_UP() +#define SIGN0_DN() +#define SIGN0_TL() +#define SIGN1_UP() +#define SIGN1_DN() +#define SIGN1_TL() +#define SIGN2_UP() +#define SIGN2_DN() +#define SIGN2_TL() + +#define DEB_PIN_UP(X) +#define DEB_PIN_DN(X) +#define DEB_PIN_ENA(X) +#define DEB_PIN_TOGGLE(X) +#define DEB_PIN_TRIGGER(X) + +//#define TOGGLE_SIG0 +#endif + +#define DELAY_450NS asm volatile("nop") +#define DELAY_1uS DELAY_450NS; DELAY_450NS; +#define TOGGLE_SIG0() SIGN0_UP(); DELAY_450NS;SIGN0_DN(); + + +#define LINK_LED_OFF LED0_UP +#define ERROR_LED_OFF LED1_UP +#define DATA_LED_OFF LED2_UP + +#define LINK_LED_ON LED0_DN +#define ERROR_LED_ON LED1_DN +#define DATA_LED_ON LED2_DN + +#define LINK_LED_BL LED0_TL +#define ERROR_LED_BL LED1_TL +#define DATA_LED_BL LED2_TL + + +#define CREATE_HEADER_REPLY(REPLY, RECV, NUM_PARAMS)\ + REPLY[0] = RECV[0]; \ + REPLY[1] = RECV[1] | REPLY_FLAG; \ + REPLY[2] = NUM_PARAMS; + +#define CREATE_HEADER_REPLY_WAIT(REPLY, RECV, NUM_PARAMS)\ + REPLY[0] = RECV[0]; \ + REPLY[1] = RECV[1] | WAIT_FLAG; \ + REPLY[2] = NUM_PARAMS; + + +#define END_HEADER_REPLY(REPLY, TOT_LEN, COUNT)\ + REPLY[TOT_LEN] = END_CMD; \ + REPLY[TOT_LEN+1] = 0; \ + COUNT=TOT_LEN+1; + +#define RETURN_ERR_REPLY(RECV,REPLY,COUNT) \ + {uint8_t err = 0; return ack_reply_cb(RECV,REPLY,&err,COUNT);} + +#define CHECK_ARD_NETIF(RECV,REPLY,COUNT) \ + if (ard_netif == NULL) \ + { uint8_t err = 0; return ack_reply_cb(RECV,REPLY,&err,COUNT); } + +#define PUT_LONG_IN_BYTE_HO(LONG, BYTE, IDX) { \ + uint32_t _long = LONG; \ + BYTE[IDX] = 4; \ + BYTE[IDX+1] = (uint8_t)(_long & 0xff); \ + BYTE[IDX+2] = (uint8_t)((_long & 0xff00)>>8); \ + BYTE[IDX+3] = (uint8_t)((_long & 0xff0000)>>16); \ + BYTE[IDX+4] = (uint8_t)((_long & 0xff000000)>>24); \ +} + +#define PUT_LONG_IN_BYTE_NO(LONG, BYTE, IDX) { \ + uint32_t _long = LONG; \ + BYTE[IDX] = 4; \ + BYTE[IDX+4] = (uint8_t)(_long & 0xff); \ + BYTE[IDX+3] = (uint8_t)((_long & 0xff00)>>8); \ + BYTE[IDX+2] = (uint8_t)((_long & 0xff0000)>>16); \ + BYTE[IDX+1] = (uint8_t)((_long & 0xff000000)>>24); \ +} + + +#define PUT_DATA_INT(INT, BYTE, IDX) { \ + uint16_t _int = INT; \ + BYTE[IDX] = 2; \ + BYTE[IDX+1] = (uint8_t)((_int & 0xff00)>>8); \ + BYTE[IDX+2] = (uint8_t)(_int & 0xff); \ +} + +#define PUT_DATA_INT_NO(INT, BYTE, IDX) { \ + uint16_t _int = INT; \ + BYTE[IDX] = 2; \ + BYTE[IDX+2] = (uint8_t)((_int & 0xff00)>>8); \ + BYTE[IDX+1] = (uint8_t)(_int & 0xff); \ +} + +#define PUT_DATA_BYTE(DATA, BYTE, IDX) { \ + BYTE[IDX] = 1; \ + BYTE[IDX+1] = (uint8_t)DATA; \ +} + +#define PUT_BUFDATA_BYTE(BUF, BUFLEN, BYTE, IDX) { \ + BYTE[IDX] = (uint8_t)(BUFLEN & 0xff); \ + uint16_t i = 0; \ + for (; i>8); \ + BYTE[IDX+1] = (uint8_t)(BUFLEN & 0xff); \ + uint16_t i = 0; \ + for (; iparamLen == LEN)) + +#define NEXT_PARAM(PARAM) \ + do { \ + if (PARAM!=NULL){ \ + PARAM=(tParam*)((uint8_t*)PARAM+PARAM->paramLen+1); \ + GET_PARAM_BYTE(PARAM, end) \ + if (end == END_CMD) WARN("End of cmd params", PARAM); \ + } \ + }while(0); + +#define GET_PARAM_LONG(PARAM, LONG) \ + uint32_t LONG = 0; \ + if CHECK_PARAM_LEN(PARAM, 4) { \ + tLongParam* s = (tLongParam*)PARAM; \ + LONG = s->param; \ + } + +#define GET_PARAM_INT(PARAM, INT) \ + uint16_t INT = 0; \ + if CHECK_PARAM_LEN(PARAM, 2) { \ + tIntParam* s = (tIntParam*)PARAM; \ + INT = s->param; \ + } + +#define GET_PARAM_BYTE(PARAM, BYTE) \ + uint8_t BYTE = 0; \ + if CHECK_PARAM_LEN(PARAM, 1) { \ + tByteParam* s = (tByteParam*)PARAM; \ + BYTE = s->param; \ + } + +#define GET_PARAM_NEXT(TYPE, PARAM, DATA) \ + GET_PARAM_##TYPE(PARAM, DATA) \ + NEXT_PARAM(PARAM) + +#ifdef _SPI_STATS_ +#define STATSPI_TIMEOUT_ERROR() \ + statSpi.timeoutIntErr++; \ + statSpi.rxErr++; \ + statSpi.lastError = SPI_TIMEOUT_ERROR; \ + statSpi.status = spi_getStatus(ARD_SPI); + +#define STATSPI_DISALIGN_ERROR() \ + statSpi.frameDisalign++; \ + statSpi.rxErr++; \ + statSpi.lastError = SPI_ALIGN_ERROR; \ + statSpi.status = spi_getStatus(ARD_SPI); + +#define STATSPI_OVERRIDE_ERROR() \ + statSpi.overrideFrame++; \ + statSpi.rxErr++; \ + statSpi.lastError = SPI_OVERRIDE_ERROR; \ + statSpi.status = spi_getStatus(ARD_SPI); + +#define STATSPI_TX_TIMEOUT_ERROR() \ + statSpi.timeoutErr++; \ + statSpi.txErr++; \ + statSpi.lastError = SPI_ERROR_TIMEOUT; \ + statSpi.status = spi_getStatus(ARD_SPI); +#else +#define STATSPI_TIMEOUT_ERROR() +#define STATSPI_TX_TIMEOUT_ERROR() +#define STATSPI_DISALIGN_ERROR() +#define STATSPI_OVERRIDE_ERROR() +#endif + +#define DUMP_TCP_STATE(TTCP) do {\ + int i = getCurrClientConnId(); \ + INFO_TCP("%d] ttcp:%p tpcb:%p state:%d lpcb:%p state:%d left:%d sent:%d\n", \ + i, TTCP, TTCP->tpcb[i], (TTCP->tpcb[i])?TTCP->tpcb[i]->state:0, \ + TTCP->lpcb, (TTCP->lpcb)?TTCP->lpcb->state:0, \ + (TTCP->tpcb[i])?TTCP->left[i]:0, (TTCP->tpcb[i])?TTCP->buff_sent[i]:0); \ + } while(0); + +#define Mode2Str(_Mode) ((_Mode==0)?"TRANSMIT":"RECEIVE") +#define ProtMode2Str(_protMode) ((_protMode==0)?"TCP":"UDP") + +typedef struct sData +{ + uint8_t* data; + uint16_t len; + uint16_t idx; + void* pcb; +}tData; + +struct pbuf; + +void init_pBuf(); + +uint8_t* insert_pBuf(struct pbuf* q, uint8_t sock, void* _pcb); + +uint8_t* insertBuf(uint8_t sock, uint8_t* buf, uint16_t len); + +uint8_t* mergeBuf(uint8_t sock, uint8_t** buf, uint16_t* _len); + +uint16_t clearBuf(uint8_t sock); + +tData* get_pBuf(uint8_t sock); + +void freetData(void * buf, uint8_t sock); + +void freetDataIdx(uint8_t idxBuf, uint8_t sock); + +bool isBufAvail(); + +bool getTcpData(uint8_t sock, void** payload, uint16_t* len); + +bool getTcpDataByte(uint8_t sock, uint8_t* payload, uint8_t peek); + +uint16_t getAvailTcpDataByte(uint8_t sock); + +bool isAvailTcpDataByte(uint8_t sock); + +uint8_t freeTcpData(uint8_t sock); + +void freeAllTcpData(uint8_t sock); + +#endif /* ARD_UTILS_H_ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/avr32_spi.c b/firmware/libraries/WiFi/extras/wifiHD/src/avr32_spi.c new file mode 100644 index 0000000..739fb28 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/avr32_spi.c @@ -0,0 +1,394 @@ +/*! \page License + * Copyright (C) 2009, H&D Wireless AB All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include +#include +#include +#include +#include +#include +#include +#include + +#define ARRAY_SIZE(a) sizeof(a) / sizeof(a[0]) + +__attribute__((__interrupt__)) void avr32_irq_handler(void); +void owl_spi_mdelay(uint32_t ms); + +int owl_spi_init(U8 *flags) +{ +#ifdef _ASSERT_ENABLE_ /* To silence warning if Assert() macro is empty */ + volatile avr32_pm_t *pm = &AVR32_PM; +#endif + + volatile avr32_spi_t *spi = &WL_SPI; +#if WL_SPI_CS == 1 + volatile avr32_spi_csr1_t* CSR = &spi->CSR1; +#elif WL_SPI_CS == 2 + volatile avr32_spi_csr2_t* CSR = &spi->CSR2; +#elif WL_SPI_CS == 3 + volatile avr32_spi_csr3_t* CSR = &spi->CSR3; +#elif SPI_CS == 0 + volatile avr32_spi_csr0_t* CSR = &spi->CSR0; +#endif + +#ifndef WITH_NO_DMA + volatile avr32_pdca_channel_t *pdca_tx = &AVR32_PDCA.channel[0]; + volatile avr32_pdca_channel_t *pdca_rx = &AVR32_PDCA.channel[1]; +#endif + +#ifndef WL_IRQ_PIN + *flags = SPI_FLAG_POLL; +#else + *flags = 0; +#endif + + +#ifdef WL_IRQ_PIN + /* input, irq */ + gpio_enable_gpio_pin(WL_IRQ_PIN); + gpio_enable_pin_pull_up(WL_IRQ_PIN); +#endif + +//#ifdef WL_RESET_PIN +// /* reset pin */ +// gpio_enable_gpio_pin(WL_RESET_PIN); +// gpio_set_gpio_pin(WL_RESET_PIN); +//#endif + + +#ifdef WL_POWER_PIN + /* power off the device */ + gpio_enable_gpio_pin(WL_POWER_PIN); + gpio_set_gpio_pin(WL_POWER_PIN); +#endif + +#ifdef WL_SHUTDOWN_PIN + gpio_enable_gpio_pin(WL_SHUTDOWN_PIN); + +#ifdef WL_NO_INTERNAL_RESET /* never defined for SPB104/SPB105 */ + gpio_clr_gpio_pin(WL_SHUTDOWN_PIN); +#endif + +#ifdef WL_EXTERNAL_RESET + gpio_enable_gpio_pin(WL_RESET_PIN); +#endif + +#endif /* WL_SHUTDOWN_PIN */ + +#ifdef WL_POWER_PIN + /* power on the device */ + gpio_clr_gpio_pin(WL_POWER_PIN); +#endif + +#ifdef WL_SHUTDOWN_PIN + +#ifdef WL_NO_INTERNAL_RESET /* never defined for SPB104/SPB105 */ + owl_spi_mdelay(5); + gpio_set_gpio_pin(WL_SHUTDOWN_PIN); + +#elif WL_EXTERNAL_RESET + owl_spi_mdelay(5); + gpio_set_gpio_pin(WL_SHUTDOWN_PIN); + + owl_spi_mdelay(20); + //delay_ms(10); //2ms + + /* reset pin */ + gpio_set_gpio_pin(WL_RESET_PIN); + +#else + + /* The shutdown pin will go high once the device is powered */ + { +#define SHUTDOWN_TIMEOUT 350 + uint32_t shutdown_timer = 0; + while (gpio_get_pin_value(WL_SHUTDOWN_PIN) == 0) { + if (shutdown_timer > SHUTDOWN_TIMEOUT) + { + printk("Timeout WL Shutdown\n"); + return -1; + } + owl_spi_mdelay(5); + shutdown_timer += 5; + } + } +#endif /* WL_NO_INTERNAL_RESET */ + +#else + /* We need to make a guess about the time needed to power the device, + * this will depend on the hardware design. + */ + owl_spi_mdelay(5); +#endif /* WL_SHUTDOWN_PIN */ + + /* Note: SPI0 clock enabled at reset in pm->pbamask (see 13.6.3) */ + Assert(pm->pbamask & (1 << 5)); + + /* Note: GPIO clock enabled at reset in pm->pbamask (see 13.6.3) */ + Assert(pm->pbamask & (1 << 1)); +#ifdef WL_IRQ_PIN + /* 22.4.7: "In every port there are four interrupt lines + * connected to the interrupt controller. Every eigth + * interrupts in the port are ored together to form an + * interrupt line." + * + * WL_IRQ_# = (WL_IRQ_PIN / 32) * 4 + (WL_IRQ_PIN / 8) % 4 + * 62 => 1 * 4 + 3 = 7 + */ + INTC_register_interrupt(&avr32_irq_handler, WL_IRQ, AVR32_INTC_INT0); +#endif + +#ifndef WITH_NO_DMA + INTC_register_interrupt(&avr32_irq_handler, AVR32_PDCA_IRQ_0, + AVR32_INTC_INT0); + INTC_register_interrupt(&avr32_irq_handler, AVR32_PDCA_IRQ_1, + AVR32_INTC_INT0); + pdca_tx->IER.terr = 1; + pdca_rx->IER.terr = 1; +#endif + +#ifdef WL_SPI_CLOCK_DIVIDER + CSR->scbr = WL_SPI_CLOCK_DIVIDER; +#else + CSR->scbr = 2; +#endif + + /* Use max width of TDR register, 16 bit transfers */ + CSR->bits = 0x8; + + /* Make sure that we can hold CS low until transfer is completed, e.g + * LASTXFER is set in TDR. + */ + CSR->csaat = 1; + + /* NRG component requires clock polarity high */ + CSR->cpol = 1; + + +#ifdef WL_IRQ_PIN + /* make sure to clear any pending bits in ifr here. */ + gpio_clear_pin_interrupt_flag(WL_IRQ_PIN); +#endif + + return 0; +} + +#ifndef WITH_NO_DMA +static void dma_txrx(const U8* in, U8* out, U16 len) +{ + volatile avr32_pdca_channel_t *pdca_tx = &AVR32_PDCA.channel[0]; + volatile avr32_pdca_channel_t *pdca_rx = &AVR32_PDCA.channel[1]; + + /* setup tx */ + pdca_tx->mar = (U32) in; + pdca_tx->PSR.pid = WL_PDCA_PID_TX; + pdca_tx->tcr = len / 2; + pdca_tx->MR.size = 1; /* 2-byte */ + pdca_tx->IER.trc = 1; + + /* setup rx */ + pdca_rx->mar = (U32) out; + pdca_rx->PSR.pid = WL_PDCA_PID_RX; + pdca_rx->tcr = len / 2; + pdca_rx->MR.size = 1; /* 2-byte */ + pdca_rx->IER.trc = 1; + + /* start dma's. for some reason rx must be started prior to tx */ + pdca_rx->CR.ten = 1; + pdca_tx->CR.ten = 1; + + /* blocking wait until transfer is completed */ + while (!(pdca_tx->ISR.trc && pdca_rx->ISR.trc)); +} +#endif + +/* access data using byte pointers since we might get unaligned + * data from lwip. The cpu will issue a data abort if we try + * to access data which is not properly aligned. See data sheet. + * + * Note that fifo_txrx() doesn't handle the case where len is not a + * multiple of two bytes properly. + * + * However, there is no actual case where len is odd at the same time + * as the "out" pointer is non-NULL; therefore I think that in practice, + * we'll not write beyond the end of the "out" array. + * + * The extra unknown byte fetched from the in pointer will be discarded + * by the device since a length field included in the packet header will inform + * the device of the actual number of valid bytes (this implementation is + * kind of hidden inside the library). + */ +static void fifo_txrx(const U8 *in, U8* out, U16 len) +{ + volatile avr32_spi_t *spi = &WL_SPI; + UnionCPtr in_ptr; + UnionPtr out_ptr; + U32 sr; + + Assert(len); + + in_ptr.u8ptr = in; + out_ptr.u8ptr = out; + + while (len) { + U16 rdr; + union { + avr32_spi_tdr_t TDR; + U32 tdr; + } reg = { { 0 } }; + + while (!spi->SR.tdre); + while (!spi->SR.txempty); + + /* prepare tx data register contents */ + if (in_ptr.u8ptr) { + reg.TDR.td |= (in_ptr.u8ptr[0] << 8) | in_ptr.u8ptr[1]; + in_ptr.u16ptr++; + } + else + reg.TDR.td |= 0xffff; + + /* perform tx */ + spi->tdr = reg.tdr; + + /* wait until rx is ready */ + while (!spi->SR.rdrf); + + /* fetch rx data */ + rdr = spi->RDR.rd; + if (out_ptr.u8ptr) { + out_ptr.u8ptr[0] = (rdr >> 8) & 0xff; + out_ptr.u8ptr[1] = rdr & 0xff; + out_ptr.u16ptr++; + } + + if (len >= 2) + len -= 2; + else + len = 0; + } + + sr = spi->sr; + Assert(!(sr & AVR32_SPI_SR_OVRES_MASK)); + Assert(!(sr & AVR32_SPI_SR_MODF_MASK)); +} + +void owl_spi_txrx(const U8 *in, U8* out, U16 len) +{ +#ifndef WITH_NO_DMA + static uint8_t buf[MAX_BLOCK_LEN]; + + /* unaligned data or odd number of bytes, then skip dma */ + if ((U32) in % 4 || (U32) out % 4 || len % 2) { + fifo_txrx(in, out, len); + } else { + if (in == NULL) { + memset(buf, 0xff, len); + in = buf; + } else if (out == NULL) { + out = buf; + } + dma_txrx(in, out, len); + } +#else + fifo_txrx(in, out, len); +#endif +} + +void owl_spi_irq(U8 enable) +{ +#ifdef WL_IRQ_PIN + + if (enable) + gpio_enable_pin_interrupt(WL_IRQ_PIN, GPIO_PIN_CHANGE); + else + gpio_disable_pin_interrupt(WL_IRQ_PIN); +#endif +} + +void owl_spi_cs(U8 enable) +{ + volatile avr32_spi_t *spi = &WL_SPI; + + /* + * PCS = xxx0 => NPCS[3:0] = 1110 + * PCS = xx01 => NPCS[3:0] = 1101 + * PCS = x011 => NPCS[3:0] = 1011 + * PCS = 0111 => NPCS[3:0] = 0111 + * PCS = 1111 => forbidden (no peripheral is selected) + */ + + if (enable) +#if WL_SPI_CS == 2 + spi->MR.pcs = 0x3; /* cs2 */ +#elif WL_SPI_CS == 1 + spi->MR.pcs = 0x1; /* cs1 */ +#elif WL_SPI_CS == 3 + spi->MR.pcs = 0x7; /* cs3 */ +#elif WL_SPI_CS == 0 + spi->MR.pcs = 0x0; /* cs0 */ +#endif + else + spi->MR.pcs = 0xf; +} + +void owl_spi_mdelay(uint32_t ms) +{ + volatile int a = 0; + int i; + for (i = 0; i < ms * 5000; i++) + a++; +} + +__attribute__((__interrupt__)) void avr32_irq_handler(void) +{ +#ifndef WITH_NO_DMA + volatile avr32_pdca_channel_t *pdca_tx = &AVR32_PDCA.channel[0]; + volatile avr32_pdca_channel_t *pdca_rx = &AVR32_PDCA.channel[1]; + + /* tx xfer complete */ + if (pdca_tx->IMR.trc && pdca_tx->ISR.trc) { + pdca_tx->IDR.trc = 1; + pdca_tx->CR.tdis = 1; /* disable tx xfer */ + } + + /* rx xfer complete */ + if (pdca_rx->IMR.trc && pdca_rx->ISR.trc) { + pdca_rx->IDR.trc = 1; + pdca_rx->CR.tdis = 1; /* disable rx xfer */ + } +#endif + +#ifdef WL_IRQ_PIN + if (gpio_get_pin_interrupt_flag(WL_IRQ_PIN)) { + gpio_clear_pin_interrupt_flag(WL_IRQ_PIN); + wl_spi_irq(); + } +#endif + +} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/board_init.c b/firmware/libraries/WiFi/extras/wifiHD/src/board_init.c new file mode 100644 index 0000000..a2a191e --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/board_init.c @@ -0,0 +1,297 @@ +/*! \page License + * Copyright (C) 2009, H&D Wireless AB All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include +#ifdef WITH_SDRAM + #include +#endif +#include +#include + +#ifndef NO_SERIAL /* The bootloader does not want serial port + * code */ +#include + +int board_putchar(char c) +{ + int timeout = USART_DEFAULT_TIMEOUT; + if (c == '\n') { + do { + if (!timeout--) + return USART_FAILURE; + } while (usart_write_char(&CONFIG_CONSOLE_PORT, '\r') != + USART_SUCCESS); + + timeout = USART_DEFAULT_TIMEOUT; + } + + do { + if (!timeout--) + return USART_FAILURE; + } while (usart_write_char(&CONFIG_CONSOLE_PORT, c) != USART_SUCCESS); + + return USART_SUCCESS; +} +#endif /* NO_SERIAL */ +/** + * Initializes the MCU system clocks. + */ +static void +init_sys_clocks(void) +{ + + /* if we don't run on OSC0 don't switch to it since we don't know + * what kind of oscillator we have here + */ + +#if OSC == 0 + /* switch to OSC0 to speed up the booting */ + pm_switch_to_osc0(&AVR32_PM, FOSC0, OSC0_STARTUP); +#endif + + +#ifndef USE_PLL + return; +#endif + + /* For audio, ee have to use OSC1 on to generate the correct clockrate + * for the SSC + */ +#if OSC == 1 + /* start oscillator1 */ + pm_enable_osc1_crystal(&AVR32_PM, FOSC1); + pm_enable_clk1(&AVR32_PM, OSC1_STARTUP); +#endif + + /* configure pll multipliers */ + pm_pll_setup(&AVR32_PM, + 0, /* pll */ + PLL_MUL, /* mul */ + 1, /* div */ + OSC, /* osc */ + 16); /* lockcount */ + + /* set PLL operating range and divider (fpll = fvco/2) + * this gives PLL output = 66 MHz (62.0928 MHz for EVK1105/OSC1) + */ + pm_pll_set_option(&AVR32_PM, + 0, /* pll */ + 1, /* pll_freq */ + 1, /* pll_div2 */ + 0); /* pll_wbwdisable. */ + + + /* start PLL0 and wait for the lock */ + pm_pll_enable(&AVR32_PM, 0); + pm_wait_for_pll0_locked(&AVR32_PM); + + /* Set all peripheral clocks torun at master clock rate */ + pm_cksel(&AVR32_PM, + 0, /* pbadiv */ + 0, /* pbasel */ + 0, /* pbbdiv */ + 0, /* pbbsel */ + 0, /* hsbdiv */ + 0); /* hsbsel */ + + /* Set one waitstate for the flash */ + flashc_set_wait_state(1); + + /* Switch to PLL0 as the master clock */ + pm_switch_to_clock(&AVR32_PM, AVR32_PM_MCCTRL_MCSEL_PLL0); +} + +static void init_exceptions(void) +{ + extern void _evba; + Set_system_register(AVR32_EVBA, (int)&_evba); + Enable_global_exception(); +} + +static void init_hmatrix(void) +{ + union { + unsigned long scfg; + avr32_hmatrix_scfg_t SCFG; + } u_avr32_hmatrix_scfg = { + AVR32_HMATRIX.scfg[AVR32_HMATRIX_SLAVE_FLASH] + }; + u_avr32_hmatrix_scfg.SCFG.defmstr_type = + AVR32_HMATRIX_DEFMSTR_TYPE_LAST_DEFAULT; + AVR32_HMATRIX.scfg[AVR32_HMATRIX_SLAVE_FLASH] = + u_avr32_hmatrix_scfg.scfg; +} + +static void init_interrupts(void) +{ + INTC_init_interrupts(); + Enable_global_interrupt(); +} + +static void init_spi(void) +{ +#if defined(WL_SPI) + int i; +#endif + + +#if defined(AT45DBX_SPI) + static const gpio_map_t AT45DBX_SPI_GPIO_MAP = { + { AT45DBX_SPI_SCK_PIN, AT45DBX_SPI_SCK_FUNCTION }, + { AT45DBX_SPI_MISO_PIN, AT45DBX_SPI_MISO_FUNCTION }, + { AT45DBX_SPI_MOSI_PIN, AT45DBX_SPI_MOSI_FUNCTION }, + { AT45DBX_SPI_NPCS2_PIN, AT45DBX_SPI_NPCS2_FUNCTION }, + }; +#endif + + +#if defined(WL_SPI) + const gpio_map_t WL_SPI_GPIO_MAP = { +#if defined(WL_SPI_NPCS0) + WL_SPI_NPCS0, +#endif + WL_SPI_NPCS, WL_SPI_MISO, WL_SPI_MOSI, WL_SPI_SCK + }; +#endif + +#if defined(WL_SPI) || defined(AT45DBX_SPI) + spi_options_t spiOptions = { + .modfdis = 1 /* only param used by spi_initMaster() */ + }; +#endif + +#if defined(AT45DBX_SPI) + gpio_enable_module(AT45DBX_SPI_GPIO_MAP, + sizeof(AT45DBX_SPI_GPIO_MAP) / + sizeof(AT45DBX_SPI_GPIO_MAP[0])); + spi_initMaster(AT45DBX_SPI, &spiOptions); + spi_selectionMode(AT45DBX_SPI, 0, 0, 0); +#endif + +#if defined(WL_SPI) + /* same pins might be initialized twice here */ + gpio_enable_module(WL_SPI_GPIO_MAP, + sizeof(WL_SPI_GPIO_MAP) / + sizeof(WL_SPI_GPIO_MAP[0])); + for (i = 0; i < sizeof(WL_SPI_GPIO_MAP)/sizeof(WL_SPI_GPIO_MAP[0]); i++) + gpio_enable_pin_pull_up(WL_SPI_GPIO_MAP[i].pin); + + /* same SPI controller might be initialized again */ + spi_initMaster(&WL_SPI, &spiOptions); + spi_selectionMode(&WL_SPI, 0, 0, 0); +#endif + +#if defined(AT45DBX_SPI) + spi_enable(AT45DBX_SPI); + + /* put up flash reset pin */ + gpio_set_gpio_pin(AT45DBX_CHIP_RESET); +#endif + +#if defined(WL_SPI) + spi_enable(&WL_SPI); +#endif +} + + +static void init_rs232(void) +{ +#ifndef NO_SERIAL +#if defined(BOARD_RS232_0) + const gpio_map_t BOARD_RS232_0_GPIO_MAP = { + BOARD_RS232_0_TX, + BOARD_RS232_0_RX, +#if defined(BOARD_RS232_0_RTS) && defined (BOARD_RS232_0_CTS) + BOARD_RS232_0_RTS, + BOARD_RS232_0_CTS +#endif + + }; +#endif + +#if defined(BOARD_RS232_1) + const gpio_map_t BOARD_RS232_1_GPIO_MAP = { + BOARD_RS232_1_TX, + BOARD_RS232_1_RX +#if defined(BOARD_RS232_1_RTS) && defined (BOARD_RS232_1_CTS) + BOARD_RS232_1_RTS, + BOARD_RS232_1_CTS +#endif + }; +#endif + +#if defined(BOARD_RS232_0) + gpio_enable_module(BOARD_RS232_0_GPIO_MAP, + sizeof(BOARD_RS232_0_GPIO_MAP) / + sizeof(BOARD_RS232_0_GPIO_MAP[0])); +#endif + +#if defined(BOARD_RS232_1) + gpio_enable_module(BOARD_RS232_1_GPIO_MAP, + sizeof(BOARD_RS232_1_GPIO_MAP) / + sizeof(BOARD_RS232_1_GPIO_MAP[0])); +#endif +#endif /* NO_SERIAL */ +} + +static void init_printk(void) +{ +#ifndef NO_SERIAL +#if defined(CONFIG_CONSOLE_PORT) + const usart_options_t usart_options = { + .baudrate = 57600, + .charlength = 8, + .paritytype = USART_NO_PARITY, + .stopbits = USART_1_STOPBIT, + .channelmode = USART_NORMAL_CHMODE + }; + usart_init_rs232(&CONFIG_CONSOLE_PORT, &usart_options, FPBA_HZ); +#endif +#endif /* NO_SERIAL */ +} + +void board_init(void) +{ + + init_exceptions(); + init_hmatrix(); + init_sys_clocks(); + init_interrupts(); + + init_rs232(); + init_printk(); + +#ifdef WITH_SDRAM + sdramc_init(FHSB_HZ); +#endif + init_spi(); +} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/board_init.h b/firmware/libraries/WiFi/extras/wifiHD/src/board_init.h new file mode 100644 index 0000000..05a6609 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/board_init.h @@ -0,0 +1,313 @@ +/*! \page License + * Copyright (C) 2009, H&D Wireless AB All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef STARTUP_H +#define STARTUP_H + +#include +#include /* defines SPB104, SPB105 */ + +void board_init(void); + + + +/* + * + * EVK1100 + * --------------------------------------------------------------------------- + * + */ +#if BOARD == EVK1100 + +/* USART0 physical assignment */ +#define BOARD_RS232_0 AVR32_USART1 +#define BOARD_RS232_0_TX \ + { AVR32_USART1_TXD_0_0_PIN, AVR32_USART1_TXD_0_0_FUNCTION } +#define BOARD_RS232_0_RX \ + { AVR32_USART1_RXD_0_0_PIN, AVR32_USART1_RXD_0_0_FUNCTION } + +/* USART1 physical assignment */ +#define BOARD_RS232_1 AVR32_USART0 +#define BOARD_RS232_1_TX \ + { AVR32_USART0_TXD_0_0_PIN, AVR32_USART0_TXD_0_0_FUNCTION } +#define BOARD_RS232_1_RX \ + { AVR32_USART0_RXD_0_0_PIN, AVR32_USART0_RXD_0_0_FUNCTION }, + +/* Clocks */ +#define USE_PLL +#define OSC 0 +#define PLL_MUL 10 + +/* Wifi (SPB104 only) */ +#if defined(EXT_BOARD) +#if EXT_BOARD == SPB104 +#define WL_SPI AVR32_SPI1 /* Pin 8 NC, so no irq support if using SD-slot */ +#define WL_SPI_CLOCK_DIVIDER 3 /* due to adapter */ +#define WL_PDCA_PID_TX AVR32_PDCA_PID_SPI1_TX +#define WL_PDCA_PID_RX AVR32_PDCA_PID_SPI1_RX +#define WL_SPI_CS 1 +#define WL_SPI_NPCS0 { AVR32_SPI1_NPCS_0_0_PIN, AVR32_SPI1_NPCS_0_0_FUNCTION } +#define WL_SPI_NPCS { AVR32_SPI1_NPCS_1_0_PIN, AVR32_SPI1_NPCS_1_0_FUNCTION } +#define WL_SPI_MISO { AVR32_SPI1_MISO_0_0_PIN, AVR32_SPI1_MISO_0_0_FUNCTION } +#define WL_SPI_MOSI { AVR32_SPI1_MOSI_0_0_PIN, AVR32_SPI1_MOSI_0_0_FUNCTION } +#define WL_SPI_SCK { AVR32_SPI1_SCK_0_0_PIN, AVR32_SPI1_SCK_0_0_FUNCTION } +#endif +#endif /* EXT_BOARD */ + + + + + + +/* + * + * EVK1101 + * --------------------------------------------------------------------------- + * + */ +#elif BOARD == EVK1101 + +/* USART0 physical assignment */ +#define BOARD_RS232_0 AVR32_USART1 +#define BOARD_RS232_0_TX \ + { AVR32_USART1_TXD_0_0_PIN, AVR32_USART1_TXD_0_0_FUNCTION } +#define BOARD_RS232_0_RX \ + { AVR32_USART1_RXD_0_0_PIN, AVR32_USART1_RXD_0_0_FUNCTION } + +/* Clocks */ +#define USE_PLL +#define OSC 0 +#define PLL_MUL 9 + +/* Wifi (SPB104 only) */ +#if defined(EXT_BOARD) +#if EXT_BOARD == SPB104 /* Pin 8 NC, so no irq support if using SD-slot */ +#define WL_SPI AVR32_SPI +#define WL_SPI_CLOCK_DIVIDER 3 /* due to adapter */ +#define WL_PDCA_PID_TX AVR32_PDCA_PID_SPI_TX +#define WL_PDCA_PID_RX AVR32_PDCA_PID_SPI_RX +#define WL_SPI_CS 1 +#if EXT_BOARD == SPB105 + #define WL_SHUTDOWN_PIN AVR32_PIN_PA06 + #define WL_POWER_PIN AVR32_PIN_PA30 +#endif +#define WL_SPI_NPCS0 { AVR32_SPI_NPCS_0_0_PIN, AVR32_SPI_NPCS_0_0_FUNCTION } +#define WL_SPI_NPCS { AVR32_SPI_NPCS_1_0_PIN, AVR32_SPI_NPCS_1_0_FUNCTION } +#define WL_SPI_MISO { AVR32_SPI_MISO_0_0_PIN, AVR32_SPI_MISO_0_0_FUNCTION } +#define WL_SPI_MOSI { AVR32_SPI_MOSI_0_0_PIN, AVR32_SPI_MOSI_0_0_FUNCTION } +#define WL_SPI_SCK { AVR32_SPI_SCK_0_0_PIN, AVR32_SPI_SCK_0_0_FUNCTION } +#endif +#endif /* EXT_BOARD */ + + + + + + + +/* + * + * EVK1104 + * --------------------------------------------------------------------------- + * + */ +#elif BOARD == EVK1104 /* EVK1104 */ + +/* USART0 physical assignment */ +#define BOARD_RS232_0 AVR32_USART1 +#define BOARD_RS232_0_TX \ + { AVR32_USART1_TXD_0_0_PIN, AVR32_USART1_TXD_0_0_FUNCTION } +#define BOARD_RS232_0_RX \ + { AVR32_USART1_RXD_0_0_PIN, AVR32_USART1_RXD_0_0_FUNCTION } + +/* Clocks */ +#define USE_PLL +#define OSC 0 +#define PLL_MUL 9 /* for some reason we cant use 66 MHz */ + +/* Wifi (SDIO: SPB104 only; SPI: SPB105 only) */ +#if defined(EXT_BOARD) +#if EXT_BOARD == SPB105 + #define WL_SPI AVR32_SPI0 + #define WL_PDCA_PID_TX AVR32_PDCA_PID_SPI0_TX + #define WL_PDCA_PID_RX AVR32_PDCA_PID_SPI0_RX + #define WL_SPI_CLOCK_DIVIDER 3 /* due to adapter */ + #define WL_SHUTDOWN_PIN AVR32_PIN_PA17 /* Pin 8 on RF-head -> Pin 4 on wifi */ + #define WL_IRQ_PIN AVR32_PIN_PA18 /* Pin 6 on RF-head -> Pin 3 on wifi */ + #define WL_IRQ AVR32_GPIO_IRQ_2 + #define WL_SPI_CS 3 + #define WL_SPI_NPCS { AVR32_SPI0_NPCS_3_1_PIN, AVR32_SPI0_NPCS_3_1_FUNCTION } + #define WL_SPI_MISO { AVR32_SPI0_MISO_0_0_PIN, AVR32_SPI0_MISO_0_0_FUNCTION } + #define WL_SPI_MOSI { AVR32_SPI0_MOSI_0_0_PIN, AVR32_SPI0_MOSI_0_0_FUNCTION } + #define WL_SPI_SCK { AVR32_SPI0_SCK_0_0_PIN, AVR32_SPI0_SCK_0_0_FUNCTION } +#elif EXT_BOARD == SPB104 + #ifdef SDIO_SLOT_A + #define WL_SDIO_CLK { AVR32_MCI_CLK_0_PIN, AVR32_MCI_CLK_0_FUNCTION } + #define WL_SDIO_CMD { AVR32_MCI_CMD_0_PIN, AVR32_MCI_CMD_0_FUNCTION } + #define WL_SDIO_DAT0 { AVR32_MCI_DATA_0_PIN, AVR32_MCI_DATA_0_FUNCTION } + #define WL_SDIO_DAT1 { AVR32_MCI_DATA_1_PIN, AVR32_MCI_DATA_1_FUNCTION } + #define WL_SDIO_DAT2 { AVR32_MCI_DATA_2_PIN, AVR32_MCI_DATA_2_FUNCTION } + #define WL_SDIO_DAT3 { AVR32_MCI_DATA_3_PIN, AVR32_MCI_DATA_3_FUNCTION } + #else + #define WL_SDIO_CLK { AVR32_MCI_CLK_0_PIN, AVR32_MCI_CLK_0_FUNCTION } + #define WL_SDIO_CMD { AVR32_MCI_CMD_1_0_PIN, AVR32_MCI_CMD_1_0_FUNCTION } + #define WL_SDIO_DAT0 { AVR32_MCI_DATA_8_0_PIN, AVR32_MCI_DATA_8_0_FUNCTION } + #define WL_SDIO_DAT1 { AVR32_MCI_DATA_9_0_PIN, AVR32_MCI_DATA_9_0_FUNCTION } + #define WL_SDIO_DAT2 { AVR32_MCI_DATA_10_0_PIN, AVR32_MCI_DATA_10_0_FUNCTION } + #define WL_SDIO_DAT3 { AVR32_MCI_DATA_11_0_PIN, AVR32_MCI_DATA_11_0_FUNCTION } + #endif +#endif +#endif /* EXT_BOARD */ + + + + + + + +/* + * + * EVK1105 + * --------------------------------------------------------------------------- + * + */ +#elif BOARD == EVK1105 /* EVK1105 */ + + +/* USART0 physical assignment */ +#define BOARD_RS232_0 AVR32_USART0 +#define BOARD_RS232_0_TX \ + { AVR32_USART0_TXD_0_0_PIN, AVR32_USART0_TXD_0_0_FUNCTION } +#define BOARD_RS232_0_RX \ + { AVR32_USART0_RXD_0_0_PIN, AVR32_USART0_RXD_0_0_FUNCTION } + +/* Clocks */ +#define USE_PLL +#define OSC 1 +#define PLL_MUL 10 + +/* Wifi SPB104/SPB105 */ +#if defined(EXT_BOARD) + #define WL_SPI AVR32_SPI0 + #define WL_PDCA_PID_TX AVR32_PDCA_PID_SPI0_TX + #define WL_PDCA_PID_RX AVR32_PDCA_PID_SPI0_RX + #if EXT_BOARD == SPB105 + #define WL_SPI_CLOCK_DIVIDER 3 /* due to adapter */ + #define WL_SHUTDOWN_PIN AVR32_PIN_PB31 /* Pin 8 on RF-head -> Pin 4 on wifi */ + #define WL_IRQ_PIN AVR32_PIN_PB30 /* Pin 6 on RF-head -> Pin 3 on wifi */ + #define WL_IRQ AVR32_GPIO_IRQ_7 + #define WL_SPI_CS 2 + #elif EXT_BOARD == SPB104 + #define WL_SPI_CLOCK_DIVIDER 3 /* due to adapter */ + #define WL_SPI_CS 1 + #endif + #define WL_SPI_NPCS0 { AVR32_SPI0_NPCS_0_0_PIN, AVR32_SPI0_NPCS_0_0_FUNCTION } + #if WL_SPI_CS == 1 + #define WL_SPI_NPCS { AVR32_SPI0_NPCS_1_0_PIN, AVR32_SPI0_NPCS_1_0_FUNCTION } + #elif WL_SPI_CS == 2 + #define WL_SPI_NPCS { AVR32_SPI0_NPCS_2_0_PIN, AVR32_SPI0_NPCS_2_0_FUNCTION } + #endif + #define WL_SPI_MISO { AVR32_SPI0_MISO_0_0_PIN, AVR32_SPI0_MISO_0_0_FUNCTION } + #define WL_SPI_MOSI { AVR32_SPI0_MOSI_0_0_PIN, AVR32_SPI0_MOSI_0_0_FUNCTION } + #define WL_SPI_SCK { AVR32_SPI0_SCK_0_0_PIN, AVR32_SPI0_SCK_0_0_FUNCTION } +#endif /* EXT_BOARD */ + +/* + * + * ARDUINO + * --------------------------------------------------------------------------- + * + */ +#elif BOARD == ARDUINO /* ARDUINO */ + + +/* USART0 physical assignment */ +#define BOARD_RS232_1 AVR32_USART1 +#define BOARD_RS232_1_TX \ + { AVR32_USART1_TXD_0_0_PIN, AVR32_USART1_TXD_0_0_FUNCTION } +#define BOARD_RS232_1_RX \ + { AVR32_USART1_RXD_0_0_PIN, AVR32_USART1_RXD_0_0_FUNCTION } + +/* Clocks */ +#define USE_PLL +#define OSC 0 +#define PLL_MUL 8 + +#define WL_SPI AVR32_SPI1 +#define WL_PDCA_PID_TX AVR32_PDCA_PID_SPI1_TX +#define WL_PDCA_PID_RX AVR32_PDCA_PID_SPI1_RX + +#define WL_SHUTDOWN_PIN AVR32_PIN_PA09 +#define WL_IRQ_PIN AVR32_PIN_PA03 +/* +* WL_IRQ_# = (WL_IRQ_PIN / 32) * 4 + (WL_IRQ_PIN / 8) % 4 + * 3 => 0 * 4 + 0 = 0 +*/ +#define WL_IRQ AVR32_GPIO_IRQ_0 +#define WL_SPI_CS 0 +#define WL_RESET_PIN AVR32_PIN_PA07 +#define WL_EXTERNAL_RESET 1 + + +#define WL_SPI_NPCS { AVR32_SPI1_NPCS_0_0_PIN, AVR32_SPI1_NPCS_0_0_FUNCTION } +#define WL_SPI_MISO { AVR32_SPI1_MISO_0_0_PIN, AVR32_SPI1_MISO_0_0_FUNCTION } +#define WL_SPI_MOSI { AVR32_SPI1_MOSI_0_0_PIN, AVR32_SPI1_MOSI_0_0_FUNCTION } +#define WL_SPI_SCK { AVR32_SPI1_SCK_0_0_PIN, AVR32_SPI1_SCK_0_0_FUNCTION } + +#endif /* EVKxxxx */ + + + + + + + + + +#if OSC == 0 +# define FOSC FOSC0 /* 12 MHz */ +#else +# define FOSC FOSC1 /* 11.2896 MHz */ +#endif + +#ifdef USE_PLL +# define FMCK_HZ ((FOSC * (PLL_MUL + 1)) / 2) +#else +# define FMCK_HZ FOSC +#endif + +#define FCPU_HZ FMCK_HZ +#define FHSB_HZ FCPU_HZ +#define FPBB_HZ FMCK_HZ +#define FPBA_HZ FMCK_HZ + + +#ifndef CONFIG_CONSOLE_PORT +#define CONFIG_CONSOLE_PORT BOARD_RS232_1 +#endif + +#endif diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/cmd_wl.c b/firmware/libraries/WiFi/extras/wifiHD/src/cmd_wl.c new file mode 100644 index 0000000..a210dec --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/cmd_wl.c @@ -0,0 +1,731 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*! \page License + * Copyright (C) 2009, H&D Wireless AB All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include +#include +#include +#include + +#include + +#include +#include +#include +#include + +#include "lwip/netif.h" +#include "lwip/dns.h" +#include "debug.h" +#include "ard_spi.h" +#include "ard_tcp.h" +#include "ard_utils.h" + +extern void showTTCPstatus(); + +#define _DNS_CMD_ + +/** + * + */ +cmd_state_t +cmd_scan(int argc, char* argv[], void* ctx) +{ + /* Note that the scan results presented will + * be from the last scan, not this one. + */ + wl_scan(); + print_network_list(); + return CMD_DONE; +} + +cmd_state_t +cmd_debug_toggle(int argc, char* argv[], void* ctx) +{ + extern uint8_t tr_data_trace; + if ( argc != 2 ) { + printk("usage: dt <1|0>\n"); + return CMD_DONE; + } + if ( '0' == argv[1][0] ) { + tr_data_trace = 0; + } + if ( '1' == argv[1][0] ) { + tr_data_trace = 1; + } + return CMD_DONE; +} + +/** + * + */ +cmd_state_t +cmd_connect(int argc, char* argv[], void* ctx) +{ + struct wl_ssid_t ssid; + char desired_ssid[WL_SSID_MAX_LENGTH]; + int len = 0; + + if (argc < 2) { + printk("usage: connect \n"); + return CMD_DONE; + } + + len = join_argv(desired_ssid, sizeof desired_ssid, argc - 1, argv + 1); + if (0 == len) { + return CMD_DONE; + } + + memcpy(ssid.ssid, desired_ssid, len); + ssid.len = len; + /* Start connection manager */ + wl_cm_set_network(&ssid, NULL); + wl_cm_start(); + return CMD_DONE; +} + +#ifdef WFE_6_12 +cmd_state_t +cmd_ibss(int argc, char* argv[], void* ctx) +{ + struct wl_ssid_t ssid; + char desired_ssid[WL_SSID_MAX_LENGTH]; + uint8_t channel; + enum wl_auth_mode amode; + int len = 0; + wl_err_t ret; + + if ( 2 == argc && ! strncmp(argv[1], "none", 4) ) { + printk("Disconnecting\n"); + wl_disconnect(); + wl_cm_stop(); + return CMD_DONE; + } + if (argc < 4) { + printk("usage: ibss \n"); + printk(" ibss none\n"); + return CMD_DONE; + } + + channel = atoi(argv[argc - 2]); + if ( *argv[argc - 1] == '0' ) { + amode = AUTH_MODE_OPEN_SYSTEM; + } else { + amode = AUTH_MODE_SHARED_KEY; + } + len = join_argv(desired_ssid, sizeof desired_ssid, argc - 3, argv + 1); + if (0 == len) { + return CMD_DONE; + } + if ( channel > 14 ) { + printk("Invalid channel %d\n", (int)channel); + return CMD_DONE; + } + printk("%s : Start with ssid \"%s\", channel %d\n", __func__, + desired_ssid, channel); + memcpy(ssid.ssid, desired_ssid, len); + ssid.len = len; + /* Stop the connection manager */ + wl_cm_stop(); + + ret = wl_start_adhoc_net(ssid, channel, amode); + switch (ret) { + case WL_BUSY: + printk("Driver is busy. Already connected?\n"); + break; + case WL_RETRY: + printk("Driver is busy. Retry operation\n"); + break; + case WL_OOM: + printk("Out of memory\n"); + break; + case WL_INVALID_ARGS: + printk("Invalid argument\n"); + break; + case WL_SUCCESS: + break; + default: + printk("Unknown error %d\n", ret); + break; + } + return CMD_DONE; +} +#endif +/** + * + */ +cmd_state_t +cmd_set_ip(int argc, char* argv[], void* ctx) +{ + struct ctx_server *hs = ctx; + struct net_cfg *ncfg = &(hs->net_cfg); + struct ip_addr lwip_addr; + struct netif *nif = ncfg->netif; + + if (argc == 2 && + (strncmp(argv[1], "none", 4) == 0)) { + ncfg->dhcp_enabled = DYNAMIC_IP_CONFIG; + + return CMD_DONE; + } + else if (argc != 4 ) { + printk("usage: ipconfig \n"); + printk(" or : ipconfig none (to enable DHCP)\n"); + return CMD_DONE; + } + + /* IP address */ + lwip_addr = str2ip(argv[1]); + INFO_SPI("nif:%p lwip_addr=0x%x\n", nif, lwip_addr.addr); + netif_set_ipaddr(nif, &lwip_addr); + /* Netmask */ + lwip_addr = str2ip(argv[2]); + netif_set_netmask(nif, &lwip_addr); + /* Default Gateway address */ + lwip_addr = str2ip(argv[3]); + netif_set_gw(nif, &lwip_addr); + /* Disable DHCP */ + ncfg->dhcp_enabled = STATIC_IP_CONFIG; + + return CMD_DONE; +} + +#ifdef WITH_WPA + +/** + * + */ +cmd_state_t +cmd_delpass(int argc, char* argv[], void* ctx) +{ + const char *usage = "usage: dpass \n"; + struct wl_network_t net; + char desired_ssid[WL_SSID_MAX_LENGTH]; + int len = 0; + + if (argc != 2) { + printk(usage); + return CMD_DONE; + } + + memset(&net, 0, sizeof net); + memset(net.bssid.octet, 0xFF, sizeof net.bssid.octet); + + len = join_argv(desired_ssid, sizeof desired_ssid, argc - 1, argv + 1); + if (0 == len) { + return CMD_DONE; + } + memcpy(net.ssid.ssid, desired_ssid, len); + net.ssid.len = len; + net.enc_type = ENC_TYPE_AUTO; + if (wl_clear_passphrase(&net) != WL_SUCCESS) { + printk("%s : Failed to delete passphrase\n", __func__); + } + + return CMD_DONE; +} + + +/** + * + */ +cmd_state_t +cmd_setpass(int argc, char* argv[], void* ctx) +{ + const char *usage = "usage: wpass \n"; + struct wl_network_t net; + char desired_ssid[WL_SSID_MAX_LENGTH]; + int len = 0; + + if (argc < 3) { + printk(usage); + return CMD_DONE; + } + /* Not really kosher, an ssid may legally contain 0-bytes but + * the console interface does not deal with that. + */ + memset(&net, 0, sizeof net); + memset(net.bssid.octet, 0xFF, sizeof net.bssid.octet); + + len = join_argv(desired_ssid, sizeof desired_ssid, argc - 2, argv + 1); + if (0 == len) { + return CMD_DONE; + } + + memcpy(net.ssid.ssid, desired_ssid, len); + net.ssid.len = len; + net.enc_type = ENC_TYPE_AUTO; + if (wl_set_passphrase(&net, + argv[argc - 1], + strlen(argv[argc - 1]), + ENC_TYPE_AUTO, + AUTH_MODE_AUTO) + != WL_SUCCESS) { + printk("%s : Failed to add passphrase\n", __func__); + } + + return CMD_DONE; +} +#endif + +#ifdef _DNS_CMD_ +void foundHost(const char *name, struct ip_addr *ipaddr, void *callback_arg) +{ + printk("Found Host: name=%s ip=0x%x\n", name, ipaddr->addr); +} + +/** + * + */ +cmd_state_t +cmd_gethostbyname(int argc, char* argv[], void* ctx) +{ + const char *usage = "usage: getHost \n"; + char hostname[DNS_MAX_NAME_LENGTH]; + struct ip_addr _addr; + int len = 0; + + if (argc < 2) { + printk(usage); + return CMD_DONE; + } + + len = join_argv(hostname, sizeof hostname, argc - 1, argv + 1); + if (0 == len) { + return CMD_DONE; + } + err_t err = dns_gethostbyname(hostname, &_addr, foundHost, NULL); + if (err == ERR_OK) + { + printk("Found Host: name=%s ip=0x%x\n", hostname, _addr.addr); + } + + return CMD_DONE; +} + +/** + * + */ +cmd_state_t +cmd_setDnsServer(int argc, char* argv[], void* ctx) +{ + const char *usage = "usage: setdns [1-2] aaa.bbb.ccc.ddd\n"; + struct ip_addr dnsIp; + int dnsIdx = 0; + + if (argc < 3) { + printk(usage); + return CMD_DONE; + } + + /* DNS IDX */ + dnsIdx = atoi(argv[1])-1; + /* IP address */ + dnsIp = str2ip(argv[2]); + + printk("Set DNS server %d to %s\n", dnsIdx, ip2str(dnsIp)); + dns_setserver(dnsIdx, &dnsIp); + struct ip_addr addr1 = dns_getserver(0); + struct ip_addr addr2 = dns_getserver(1); + + printk("==> DNS1: %s\n", ip2str(addr1), addr1); + printk("==> DNS2: %s\n", ip2str(addr2), addr2); + + return CMD_DONE; +} + +/** + * + */ +cmd_state_t +cmd_startSrv(int argc, char* argv[], void* ctx) +{ + const char *usage = "usage: startSrv \n"; + + int port = 0; + int sock = 0; + int protMode = 0; + + if (argc < 4) { + printk(usage); + return CMD_DONE; + } + + /* TCP port */ + port = atoi(argv[1]); + /* socket index */ + sock = atoi(argv[2]); + /* Protocol Mode */ + protMode = atoi(argv[3]); + + printk("Start %s server on port %d sock %d\n", ProtMode2Str(protMode), port, sock); + if (start_server_tcp(port, sock, protMode) == -1) + { + WARN("Start %s server on port %d sock %d FAILED\n", ProtMode2Str(protMode), port, sock); + } + return CMD_DONE; +} + +/** + * + */ +cmd_state_t +cmd_startCli(int argc, char* argv[], void* ctx) +{ + const char *usage = "usage: startCli \n"; + struct ip_addr addr = {0}; + int port = 0; + int sock = 0; + int protMode = 0; + + if (argc < 5) { + printk(usage); + return CMD_DONE; + } + + /* IP address */ + addr = str2ip(argv[1]); + /* TCP port */ + port = atoi(argv[2]); + /* socket index */ + sock = atoi(argv[3]); + /* Protocol Mode */ + protMode = atoi(argv[4]); + + printk("Start client on addr 0x%x, port %d sock %d mode %d\n", addr, port, sock, protMode); + if (start_client_tcp(addr.addr, port, sock, protMode) == -1) + { + WARN("Start client on port %d sock %d prot %d mode %d FAILED\n", port, sock, protMode); + } + return CMD_DONE; +} + +#endif + + +/** + * + */ +cmd_state_t +cmd_status(int argc, char* argv[], void* ctx) +{ + struct net_cfg *ncfg = ctx; + struct wl_network_t* net; + uint8_t mac[WL_MAC_ADDR_LENGTH]; + + printk("wl_api version " WL_API_RELEASE_NAME "\n"); + /* print mac address */ + if (wl_get_mac_addr(mac) != WL_SUCCESS) { + printk("failed to get mac address\n"); + }else{ + printk("hw addr: %s\n", mac2str(mac)); + } + + /* print network info */ + net = wl_get_current_network(); + printk("link status: "); + if (!net) { + printk("down\n"); + + }else{ + print_network(net); + } + + /* print ip address */ + if (netif_is_up(netif_default)) + { + printk("ip addr: %s - ", ip2str(netif_default->ip_addr)); + printk("netmask: %s - ", ip2str(netif_default->netmask)); + printk("gateway: %s\n", ip2str(netif_default->gw)); + } + else + printk("ip interface is down\n"); + printk("dhcp : "); + if (ncfg->dhcp_enabled == DYNAMIC_IP_CONFIG) { + printk("enabled\n"); + } + else { + printk("disabled\n"); + } + struct ip_addr addr1 = dns_getserver(0); + struct ip_addr addr2 = dns_getserver(1); + + printk("DNS: %s - ", ip2str(addr1)); + printk("%s\n", ip2str(addr2)); + + showTTCPstatus(); + return CMD_DONE; +} + +#ifdef ADD_CMDS +/** + * + */ +cmd_state_t +cmd_power(int argc, char* argv[], void* ctx) +{ + const char *usage = "usage: powersave \n"; + + if (argc < 2) { + printk(usage); + return CMD_DONE; + } + + if (!strcmp(argv[1], "on")) { + if (wl_enable_ps() != WL_SUCCESS) { + printk("could not enable power save\n"); + return CMD_DONE; + } + return CMD_DONE; + } + else if(!strcmp(argv[1], "off")) { + if (wl_disable_ps() != WL_SUCCESS) { + printk("could not disable power save\n"); + return CMD_DONE; + } + return CMD_DONE; + } + + printk(usage); + return CMD_DONE; +} +#endif + +#ifdef ADD_CMDS +/** + * + */ +cmd_state_t +cmd_psconf(int argc, char* argv[], void* ctx) +{ + const char *usage = + "usage: psconf (0/1 default 0)\n" \ + " ([ms] default 10)\n" \ + " ([ms] default 5000)\n"\ + " (0/1 default 1)\n"\ + " ([beacons] default 20)\n"; + + uint8_t use_ps_poll; + uint32_t traffic_timeout; + uint32_t ps_delay; + uint8_t rx_all_dtim; + uint16_t listen_interval; + + if (argc < 6) { + printk(usage); + return CMD_DONE; + } + + use_ps_poll = atoi(argv[1]); + traffic_timeout = atoi(argv[2]); + ps_delay = atoi(argv[3]); + rx_all_dtim = atoi(argv[4]); + listen_interval = atoi(argv[5]); + + if (use_ps_poll > 1) { + printk(usage); + return CMD_DONE; + } + + if (rx_all_dtim > 1) { + printk(usage); + return CMD_DONE; + } + + if (wl_conf_ps(use_ps_poll, traffic_timeout, ps_delay, + rx_all_dtim, listen_interval) != WL_SUCCESS) + printk("configuration failed\n"); + + return CMD_DONE; +} +#endif + +/** + * + */ +cmd_state_t +cmd_setkey(int argc, char* argv[], void* ctx) +{ + int idx, len; + char key[13]; + struct wl_mac_addr_t bssid; + const char *usage = "usage: setkey \n\t "\ + "or: setkey none\n"; + + memset(&bssid.octet, 0xff, sizeof bssid.octet); + if (argc == 2 && strcmp(argv[1], "none") == 0) { + printk("Deleting WEP keys\n"); + wl_delete_wep_key(0, &bssid); + wl_delete_wep_key(1, &bssid); + wl_delete_wep_key(2, &bssid); + wl_delete_wep_key(3, &bssid); + return CMD_DONE; + } + if (argc < 3) { + printk(usage); + return CMD_DONE; + } + idx = atoi(argv[1]); + len = strlen(argv[2]); + /* Pass phrase? */ + if ( 5 == len || 13 == len ) { + strncpy(key, argv[2], len); + } + /* Otherwise it's a hex string */ + else { + len = ascii_to_key(key, argv[2]); + if (0 == len || idx > 3 || idx < 0 || (idx == 0 && *argv[1] != '0')) { + printk(usage); + return CMD_DONE; + } + if (len != 5 && len != 13) { + printk(" WEP key must be 10 (WEP-40) or 26 (WEP-104) digits\n"); + return CMD_DONE; + } + } + wl_add_wep_key(idx, len, key, &bssid); + wl_set_default_wep_key(idx); + + return CMD_DONE; +} + +cmd_state_t +cmd_debug(int argc, char* argv[], void* ctx) +{ + int level; + const char *usage = "usage: debug
\n\t"\ + "section: init, cm, spi, tcp , util, warn\n\t" + "level : 0 (off), 1 (on), 2 (verbose)\n\t" + "or: debug print/on/off\n"; + + if (argc == 2 && strcmp(argv[1], "off") == 0) { + printk("Debug OFF\n"); + INIT_DEBUG_VARIABLES() + return CMD_DONE; + }else if (argc == 2 && strcmp(argv[1], "print") == 0) { + PRINT_DEBUG_VARIABLES() + return CMD_DONE; + }else if (argc == 2 && strcmp(argv[1], "on") == 0) { + printk("Debug ON\n"); + TURNON_DEBUG_VARIABLES(); + return CMD_DONE; + } + if (argc < 3) { + printk(usage); + return CMD_DONE; + } + level = atoi(argv[2]); + if (argc == 3 && strcmp(argv[1], "init") == 0) { + CHECK_DEBUG_LEVEL(level, INFO_INIT_FLAG); + }else if (argc == 3 && strcmp(argv[1], "spi") == 0) { + CHECK_DEBUG_LEVEL(level, INFO_SPI_FLAG); + }else if (argc == 3 && strcmp(argv[1], "tcp") == 0) { + CHECK_DEBUG_LEVEL(level, INFO_TCP_FLAG); + }else if (argc == 3 && strcmp(argv[1], "cm") == 0) { + CHECK_DEBUG_LEVEL(level, INFO_CM_FLAG); + }else if (argc == 3 && strcmp(argv[1], "util") == 0) { + CHECK_DEBUG_LEVEL(level, INFO_UTIL_FLAG); + }else if (argc == 3 && strcmp(argv[1], "warn") == 0) { + CHECK_DEBUG_LEVEL(level, INFO_WARN_FLAG); + } + return CMD_DONE; +} + +extern void dumpPbuf(uint8_t sock); + +/** + * + */ +cmd_state_t +cmd_dumpBuf(int argc, char* argv[], void* ctx) +{ + const char *usage = "usage: dumpPbuf [sock]\n\t"\ + "sock: socket Number\n"; + + if (argc == 2 && strcmp(argv[1], "all") == 0) { + printk("Dump All Buffers\n"); + int i = 0; + for (; i= 2) { + + uint8_t sock = atoi(argv[1]); + printk("Socket: %d\n", sock); + + if (argc >= 3) { + uint8_t patternType = atoi(argv[2]); + printk("PatternType: %d\n", patternType); + if (patternType == 1) + { + insertBuf(sock, (uint8_t*)pattern2[0], strlen(pattern2[0])); + insertBuf(sock, (uint8_t*)pattern2[1], strlen(pattern2[1])); + insertBuf(sock, (uint8_t*)pattern2[2], strlen(pattern2[2])); + } + if (patternType == 2) + { + mergeBuf(sock, NULL, NULL); + } + }else{ + if (sock < MAX_SOCK_NUM) + { + sendUdpData(getTTCP(sock, TTCP_MODE_TRANSMIT), (uint8_t*)pattern, sizeof(pattern)/sizeof(char)); + } + } + + } + return CMD_DONE; +} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/cmd_wl.h b/firmware/libraries/WiFi/extras/wifiHD/src/cmd_wl.h new file mode 100644 index 0000000..a1d1a0f --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/cmd_wl.h @@ -0,0 +1,66 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*! \page License + * Copyright (C) 2009, H&D Wireless AB All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef CMD_CM_H +#define CMD_CM_H + +#include +#include "netif/wlif.h" + +/*! A pointer to a struct of type "struct net_cfg" should be passed as + * the ctx pointer in the callbacks below. The struct must have a + * single instance per netif. + */ +#define _DNS_CMD_ + +cmd_state_t cmd_scan(int argc, char* argv[], void* ctx); +cmd_state_t cmd_connect(int argc, char* argv[], void* ctx); +cmd_state_t cmd_set_ip(int argc, char* argv[], void* ctx); +cmd_state_t cmd_setkey(int argc, char* argv[], void* ctx); +cmd_state_t cmd_status(int argc, char* argv[], void* ctx); +cmd_state_t cmd_power(int argc, char* argv[], void* ctx); +cmd_state_t cmd_psconf(int argc, char* argv[], void* ctx); +cmd_state_t cmd_setpass(int argc, char* argv[], void* ctx); +cmd_state_t cmd_delpass(int argc, char* argv[], void* ctx); +cmd_state_t cmd_debug(int argc, char* argv[], void* ctx); +cmd_state_t cmd_debug_toggle(int argc, char* argv[], void* ctx); +cmd_state_t cmd_statSpi(int argc, char* argv[], void* ctx); +cmd_state_t cmd_resetStatSpi(int argc, char* argv[], void* ctx); +cmd_state_t cmd_gethostbyname(int argc, char* argv[], void* ctx); +cmd_state_t cmd_setDnsServer(int argc, char* argv[], void* ctx); +cmd_state_t cmd_startSrv(int argc, char* argv[], void* ctx); +cmd_state_t cmd_startCli(int argc, char* argv[], void* ctx); +cmd_state_t cmd_dumpBuf(int argc, char* argv[], void* ctx); +cmd_state_t cmd_sendUdpData(int argc, char* argv[], void* ctx); +#ifdef WFE_6_12 +cmd_state_t cmd_ibss(int argc, char* argv[], void* ctx); +#endif + + +#endif diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/console.c b/firmware/libraries/WiFi/extras/wifiHD/src/console.c new file mode 100644 index 0000000..e54943f --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/console.c @@ -0,0 +1,212 @@ +/*! \page License + * Copyright (C) 2009, H&D Wireless AB All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAX_CMD_CONSOLE_NUM 15 +struct { + cmd_cb_t cb; + const char* str; + void* ctx; +} cmd_list[MAX_CMD_CONSOLE_NUM] = { { 0 } }; + +#ifndef CMD_MAX_LEN +#define CMD_MAX_LEN 80 +#endif +extern int board_putchar(char c); +int io_getc(char *c) +{ + int ci; + int status; + status = usart_read_char(&CONFIG_CONSOLE_PORT, &ci); + if (status == USART_RX_EMPTY) + return 1; + + if (status == USART_RX_ERROR) { + CONFIG_CONSOLE_PORT.cr = AVR32_USART_CR_RSTSTA_MASK; + return 1; + } + + if (ci == '\r') { + board_putchar('\n'); + /* Echo char. */ + } else if (ci == '\b') { + board_putchar(ci); + board_putchar(' '); + board_putchar(ci); + } else + board_putchar(ci); + + + *c = ci; + return 0; +} + +static uint8_t is_initialized = 0; + +char* console_gets() +{ + static char buf[CMD_MAX_LEN]; + static int pos = 0; + char c; + + for (;;) { + if (io_getc(&c)) + return NULL; + + if (c == '\r' || c == '\n') { + buf[pos] = 0; + pos = 0; + return buf; + } + if (c == '\b') { + pos -= 1; + if (pos < 0) pos = 0; + buf[pos] = 0; + } + else + buf[pos++] = c; + if (pos == sizeof(buf)) + pos = 0; + } + return NULL; +} + +int console_add_cmd(const char* str, cmd_cb_t cb, void* ctx) +{ + uint32_t i; + for (i = 0; i < ARRAY_SIZE(cmd_list); i++) + if (!cmd_list[i].cb) + break; + + if (i == ARRAY_SIZE(cmd_list)) + return -1; + + cmd_list[i].str = str; + cmd_list[i].cb = cb; + cmd_list[i].ctx = ctx; + return 0; +} + +void console_init(void) +{ + printk("\n$ "); + is_initialized = 1; +} + +void console_init_silent(void) { + is_initialized = 1; +} + +int console_schedule_cmd(char *cmd, int interactive) { +#define MAX_ARGS 16 + static int argc, i; + static char* argv[MAX_ARGS]; + static char *buf; + static enum { INPUT, RUN } state = INPUT; + + switch (state) { + case INPUT: { + char* token; + if (NULL == cmd) { + return 0; + } + buf = strdup(cmd); + if (!buf) + return 0; + if (!strlen(buf)) { + interactive ? printk("$ ") : 0; + free(buf); + return 0; + } +#ifdef WIFI_DEBUG_ON + printk("%s : Scheduling command \"%s\"\n", + __func__, + buf); +#endif + for (i = 0; i < ARRAY_SIZE(cmd_list); i++) + if(cmd_list[i].str && !strncmp(cmd_list[i].str, buf, min(strlen(cmd_list[i].str), strlen(buf)))) + break; + + if (ARRAY_SIZE(cmd_list) == 0) { + printk("No commands available. Is the WiFi card responding?\n"); + } + if (i == ARRAY_SIZE(cmd_list)) { + if (interactive) { + printk("available commands:\n"); + for (i = 0; i < ARRAY_SIZE(cmd_list); i++) + if (cmd_list[i].cb) + printk(" %s\n", cmd_list[i].str); + printk("$ "); + } + free(buf); + return 0; + } + + for (token = strtok(buf, " "); token != NULL; + token = strtok(NULL, " ")) { + argv[argc] = token; + argc++; + if (argc == MAX_ARGS) + break; + } + + state = RUN; + } /* fall through */ + + case RUN: { + cmd_state_t s = cmd_list[i].cb(argc, argv, cmd_list[i].ctx); + if (s == CMD_INPROGRESS) + return 1; + + interactive ? printk("$ ") : 0; + + argc = 0; + memset(argv, 0, sizeof argv); + free(buf); + state = INPUT; + } + } + + return 1; +} + + +void console_poll(void) +{ + char *buf; + buf = console_gets(); + console_schedule_cmd(buf, 1); +} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/console.h b/firmware/libraries/WiFi/extras/wifiHD/src/console.h new file mode 100644 index 0000000..79bfedb --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/console.h @@ -0,0 +1,46 @@ +/*! \page License + * Copyright (C) 2009, H&D Wireless AB All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef CONSOLE_H +#define CONSOLE_H + + +typedef enum { + CMD_DONE, + CMD_INPROGRESS +} cmd_state_t; + +typedef cmd_state_t (*cmd_cb_t)(int argc, char* argv[], void* ctx); + +void console_init(void); +void console_init_silent(void); +char* console_gets(void); +int console_add_cmd(const char* str, cmd_cb_t cb, void* ctx); +int console_schedule_cmd(char *cmd, int interactive); +void console_poll(void); + +#endif diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/debug.h b/firmware/libraries/WiFi/extras/wifiHD/src/debug.h new file mode 100644 index 0000000..154b799 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/debug.h @@ -0,0 +1,191 @@ +//*********************************************/ +// +// File: debug.h +// +// Author: Domenico La Fauci +// +//********************************************/ + + +#ifndef Debug_H +#define Debug_H + +#include +#include + +#define INFO_INIT_FLAG 1 +#define INFO_TCP_FLAG 2 +#define INFO_SPI_FLAG 4 +#define INFO_CM_FLAG 8 +#define INFO_UTIL_FLAG 16 + +#define INFO_D (1<<0xD) // Debug +#define INFO_E (1<<0xE) // Error +#define INFO_WARN_FLAG (1<<0xF) // Warning +#define DEFAULT_INFO_FLAG 0 //INFO_WARN_FLAG + +#ifdef _DEBUG_ +#define DEFINE_DEBUG_VARIABLES() \ +uint16_t enableDebug = DEFAULT_INFO_FLAG | INFO_WARN_FLAG; \ +uint16_t verboseDebug = 0; \ +uint16_t dumpDebug = 0; \ +uint16_t pollDebug = 0; +#else +#define DEFINE_DEBUG_VARIABLES() \ +uint16_t enableDebug = DEFAULT_INFO_FLAG; \ +uint16_t verboseDebug = 0; \ +uint16_t dumpDebug = 0; \ +uint16_t pollDebug = 0; +#endif + +#define INIT_DEBUG_VARIABLES() \ + enableDebug = DEFAULT_INFO_FLAG | INFO_WARN_FLAG; \ + verboseDebug = 0; \ + dumpDebug = 0; pollDebug = 0; + + +#define PRINT_DEBUG_VARIABLES() \ + printk("Debug enabled: 0x%x\n", enableDebug); \ + printk("Verbose enabled: 0x%x\n", verboseDebug); \ + printk("Dump enabled: 0x%x\n", dumpDebug); \ + printk("POoll enabled: 0x%x\n", pollDebug); + +#define TURNON_DEBUG_VARIABLES() \ + enableDebug = 0xff; + +extern uint16_t enableDebug; +extern uint16_t verboseDebug; +extern uint16_t dumpDebug; +extern uint16_t pollDebug; + +#define ENABLE_DEBUG_LEVEL 1 +#define VERBOSE_DEBUG_LEVEL 2 +#define DUMP_DEBUG_LEVEL 3 +#define POLL_DEBUG_LEVEL 4 + +#define CHECK_DEBUG(VAR, LEVEL, LEVEL_LIMIT, FLAG) \ + do{ \ + if (LEVEL >= LEVEL_LIMIT) VAR |= FLAG; \ + else VAR &= ~FLAG; \ + }while(0); + +#define CHECK_ENA_DEBUG(LEVEL, FLAG) \ + CHECK_DEBUG(enableDebug, LEVEL, ENABLE_DEBUG_LEVEL, FLAG) +#define CHECK_VERB_DEBUG(LEVEL, FLAG) \ + CHECK_DEBUG(verboseDebug, LEVEL, VERBOSE_DEBUG_LEVEL, FLAG) +#define CHECK_DUMP_DEBUG(LEVEL, FLAG) \ + CHECK_DEBUG(dumpDebug, LEVEL, DUMP_DEBUG_LEVEL, FLAG) +#define CHECK_POLL_DEBUG(LEVEL, FLAG) \ + CHECK_DEBUG(pollDebug, LEVEL, POLL_DEBUG_LEVEL, FLAG) + + +#define CHECK_DEBUG_LEVEL(LEVEL, INFO_FLAG) \ + CHECK_ENA_DEBUG(LEVEL, INFO_FLAG) \ + CHECK_VERB_DEBUG(LEVEL, INFO_FLAG) \ + CHECK_DUMP_DEBUG(LEVEL, INFO_FLAG) \ + CHECK_POLL_DEBUG(LEVEL, INFO_FLAG) + +#ifdef _INFO_DEBUG_ +#define PRINT_DEBUG(msg, args...) do { \ + printk("[%s] " msg , __func__ , ##args ); \ +} while (0) + +#define INFO_DEBUG(msg, args...) do { \ + printk("I-[%s] " msg , __func__ , ##args ); \ +} while (0) + +#define WARN_DEBUG(msg, args...) do { \ + printk("W-[%s] " msg , __func__ , ##args ); \ +} while (0) + +#else +do { }while(0); +#endif + +#define IF_DEBUG(X,Y) do { \ +if (enableDebug & INFO_##X##_FLAG) \ +Y; \ +} while (0) + +#define IF_DEBUG_VER(X,Y) do { \ +if (verboseDebug & INFO_##X##_FLAG) \ +Y; \ +} while (0) + +#define IF_DEBUG_DUMP(X,Y) do { \ +if (dumpDebug & INFO_##X##_FLAG) \ +Y; \ +} while (0) + +#define IF_DEBUG_POLL(X,Y) do { \ +if (pollDebug & INFO_##X##_FLAG) {\ +Y; \ +}} while (0) + + + +#define IF_WARN(Y) IF_DEBUG(WARN,Y) +#define IF_WARN_VER(Y) IF_DEBUG_VER(WARN,Y) +#define IF_TCP(Y) IF_DEBUG(TCP,Y) +#define IF_TCP_VER(Y) IF_DEBUG_VER(TCP,Y) +#define IF_TCP_POLL(Y) IF_DEBUG_POLL(TCP,Y) +#define IF_TCP_DUMP(Y) IF_DEBUG_DUMP(TCP,Y) +#define IF_SPI(Y) IF_DEBUG(SPI,Y) +#define IF_SPI_VER(Y) IF_DEBUG_VER(SPI,Y) +#define IF_SPI_DUMP(Y) IF_DEBUG_DUMP(SPI,Y) +#define IF_SPI_POLL(Y) IF_DEBUG_POLL(SPI,Y) +#define IF_UTIL(Y) IF_DEBUG(UTIL,Y) +#define IF_UTIL_VER(Y) IF_DEBUG_VER(UTIL,Y) + +#define WARN(msg, args...) IF_DEBUG(WARN,WARN_DEBUG(msg, ##args)) +#define WARN_VER(msg, args...) IF_DEBUG_VER(WARN,WARN_DEBUG(msg, ##args)) +#define WARN_POLL(msg, args...) IF_DEBUG_POLL(WARN,WARN_DEBUG(msg, ##args)) +#if 0 // disable to reduce the size of binary +#define INFO_INIT(msg, args...) IF_DEBUG(INIT,PRINT_DEBUG(msg, ##args)) +#define INFO_INIT_VER(msg, args...) IF_DEBUG_VER(INIT,PRINT_DEBUG(msg, ##args)) +#else +#define INFO_INIT(msg, args...) +#define INFO_INIT_VER(msg, args...) +#endif +#define INFO_TCP(msg, args...) IF_DEBUG(TCP,PRINT_DEBUG(msg, ##args)) +#define INFO_TCP_VER(msg, args...) IF_DEBUG_VER(TCP,PRINT_DEBUG(msg, ##args)) +#define INFO_TCP_DUMP(msg, args...) IF_DEBUG_DUMP(TCP,PRINT_DEBUG(msg, ##args)) +#define INFO_TCP_POLL(msg, args...) IF_DEBUG_POLL(TCP,PRINT_DEBUG(msg, ##args)) +#define INFO_SPI(msg, args...) IF_DEBUG(SPI,PRINT_DEBUG(msg, ##args)) +#define INFO_SPI_VER(msg, args...) IF_DEBUG_VER(SPI,PRINT_DEBUG(msg, ##args)) +#define INFO_SPI_DUMP(msg, args...) IF_DEBUG_DUMP(SPI,PRINT_DEBUG(msg, ##args)) +#define INFO_SPI_POLL(msg, args...) IF_DEBUG_POLL(SPI,PRINT_DEBUG(msg, ##args)) +#define INFO_UTIL(msg, args...) IF_DEBUG(UTIL,PRINT_DEBUG(msg, ##args)) +#define INFO_UTIL_VER(msg, args...) IF_DEBUG_VER(UTIL,PRINT_DEBUG(msg, ##args)) +#define CM_DPRINTF(msg, args...) IF_DEBUG(CM,PRINT_DEBUG(msg, ##args)) + +extern void dump(char* _buf, uint16_t _count); + +#define _DUMP(BUF, COUNT) do { \ + printk("[%s]: ", __func__); \ + dump((char*)BUF, COUNT); \ + } while (0) + +#ifdef _APP_DEBUG_ +#define DUMP(BUF, COUNT) _DUMP(BUF, COUNT) +#else +#define DUMP(BUF, COUNT) do {} while (0) +#endif +#endif + +#define DUMP_TCP(BUF, COUNT) IF_TCP_DUMP(_DUMP(BUF, COUNT)) +#define DUMP_SPI(BUF, COUNT) IF_SPI_DUMP(_DUMP(BUF, COUNT)) + +#define DUMP_SPI_CMD(BUF) do { \ + if (dumpDebug & INFO_SPI_FLAG) { \ + int i = 0; \ + for (; i < CMD_MAX_LEN; ++i) \ + { \ + printk("0x%x ", BUF[i]); \ + if (BUF[i] == END_CMD) \ + break; \ + } \ + printk("\n"); \ + } \ +}while(0); + diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/fw_download.h b/firmware/libraries/WiFi/extras/wifiHD/src/fw_download.h new file mode 100644 index 0000000..e36214f --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/fw_download.h @@ -0,0 +1,38 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*! \page License + * Copyright (C) 2009, H&D Wireless AB All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef FW_DOWNLOAD_H +#define FW_DOWNLOAD_H + +#include +#include + +int fw_download_init(void); +size_t fw_read_cb(void *ctx, const uint8_t** buf, size_t offset, size_t len); +#endif diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/fw_download_extflash.c b/firmware/libraries/WiFi/extras/wifiHD/src/fw_download_extflash.c new file mode 100644 index 0000000..d679271 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/fw_download_extflash.c @@ -0,0 +1,82 @@ +/*! \page License + * Copyright (C) 2009, H&D Wireless AB All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include +#include +#include +#include +#include + +int fw_download_init(void) +{ + nvram_init(); + return 0; +} + +#define BUF_SIZE 512 + + +size_t fw_read_cb(void* ctx, + const uint8_t** buf, + size_t offset, + size_t len) +{ + static uint8_t* fw_buf = NULL; + size_t rlen; + /* when firmware download is completed, this function will be + * invoked one additional time with buf set to NULL. we can + * free the firmware buffer at this time since it's no longer + * needed. + */ + if (NULL == buf) { + if (fw_buf) { + free(fw_buf); + fw_buf = NULL; + } + return 0; + } + + /* first call? then initialize flash and allocate a buffer to hold + * firmware data. + */ + if (fw_buf == NULL) { + fw_buf = malloc(BUF_SIZE); + + if (fw_buf == NULL) { + printk("could not allocate firmware buffer\n"); + return 0; + } + } + /* read at most a full buffer */ + rlen = len > BUF_SIZE ? BUF_SIZE : len; + + /* read data and update output parameters */ + nvram_read(offset, fw_buf, rlen); + *buf = fw_buf; + + return rlen; +} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/license.txt b/firmware/libraries/WiFi/extras/wifiHD/src/license.txt new file mode 100644 index 0000000..e57439f --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/license.txt @@ -0,0 +1,42 @@ + Copyright (C) 2009, H&D Wireless AB All rights reserved. + + The license to use this software in whole and in part and to + redistribute it in any form follows with the WiFi HW module from H&D + Wireless and is granted under the following restrictions: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. The name of H&D Wireless AB may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + 4. The software may only be used together with hardware from H&D + Wireless all other use is prohibited. + + 5. The license to use and redistribute the software is granted + together with the purchase of a hardware platform on a one to one + basis + + 6. The binary code may not be reversed engineered or by other means + copied to circumvent this license. + + THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE ARE EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT + SHALL HD WIRELESS AB BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + OF THE POSSIBILITY OF SUCH DAMAGE. + + For more information regarding this software license Contact H&D + Wireless AB (support@hd-wireless.se). diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/lwip_setup.c b/firmware/libraries/WiFi/extras/wifiHD/src/lwip_setup.c new file mode 100644 index 0000000..bfa8c09 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/lwip_setup.c @@ -0,0 +1,145 @@ +/*! \page License + * Copyright (C) 2009, H&D Wireless AB All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/*! + * \file lwIP setup code + * + * \brief Collects the lwIP setup code that an application has to + * execute in a standalone environment. + * + * \author H&D Wireless AB \n + * + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "lwip_setup.h" +#include "lwip/dns.h" + + +/** + * + */ +static void +tcp_tmr_cb(void *ctx) +{ + tcp_tmr(); +} + +/** + * + */ +static void +ip_tmr_cb(void *ctx) +{ + ip_reass_tmr(); +} + +/** + * + */ +static void +dns_tmr_cb(void *ctx) +{ + dns_tmr(); +} + +/** + * + */ +static void +etharp_tmr_cb(void *ctx) +{ + etharp_tmr(); +} + + +/** + * + */ +static void +dhcp_fine_tmr_cb(void *ctx) +{ + dhcp_fine_tmr(); +} + +/** + * + */ +static void +dhcp_coarse_tmr_cb(void *ctx) +{ + dhcp_coarse_tmr(); +} + +int start_ip_stack(struct net_cfg *cfg, + struct ip_addr ipaddr, + struct ip_addr netmask, + struct ip_addr gw) { + + if (cfg->dhcp_enabled) { + IP4_ADDR(&gw, 0,0,0,0); + IP4_ADDR(&ipaddr, 0,0,0,0); + IP4_ADDR(&netmask, 0,0,0,0); + } + + /* add wl to lwip interface list and set as default */ + cfg->netif = netif_add(cfg->netif, + &ipaddr, + &netmask, + &gw, + NULL, + wlif_init, /* init */ + ethernet_input /* handles ARP and IP packets */); + + if (cfg->netif == NULL) + return -1; + netif_set_default(cfg->netif); + + /* register lwip timer callbacks for tcp, arp and dhcp protocols */ + timer_sched_timeout_cb(5000, TIMEOUT_PERIODIC, + etharp_tmr_cb, NULL); + timer_sched_timeout_cb(TCP_TMR_INTERVAL, TIMEOUT_PERIODIC, + tcp_tmr_cb, NULL); + timer_sched_timeout_cb(DHCP_FINE_TIMER_MSECS, TIMEOUT_PERIODIC, + dhcp_fine_tmr_cb, NULL); + timer_sched_timeout_cb(DHCP_COARSE_TIMER_MSECS, TIMEOUT_PERIODIC, + dhcp_coarse_tmr_cb, NULL); + timer_sched_timeout_cb(IP_TMR_INTERVAL, TIMEOUT_PERIODIC, + ip_tmr_cb, NULL); + timer_sched_timeout_cb(DNS_TMR_INTERVAL, TIMEOUT_PERIODIC, + dns_tmr_cb, NULL); + + return 1; +} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/lwip_setup.h b/firmware/libraries/WiFi/extras/wifiHD/src/lwip_setup.h new file mode 100644 index 0000000..7edf2b5 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/lwip_setup.h @@ -0,0 +1,30 @@ +#ifndef _LWIP_SETUP_H +#define _LWIP_SETUP_H + +#define INIT_IP_CONFIG 0xff +#define STATIC_IP_CONFIG 0 +#define DYNAMIC_IP_CONFIG 1 + +struct net_cfg { + struct netif *netif; /* lwip network interface */ + uint8_t dhcp_enabled; + uint8_t dhcp_running; +}; + +struct ctx_server { + struct net_cfg net_cfg; + uint8_t wl_init_complete; +}; + +/*! Start the IP stack. + * If cfg->netif must have been allocated and lwip_init() + * must have been called before this function is called + * (since the IP stack may have to be polled before this + * function can be called). + */ +int start_ip_stack(struct net_cfg *cfg, + struct ip_addr ipaddr, + struct ip_addr netmask, + struct ip_addr gw); + +#endif /* _LWIP_SETUP_H */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/lwipopts.h b/firmware/libraries/WiFi/extras/wifiHD/src/lwipopts.h new file mode 100644 index 0000000..7b08b84 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/lwipopts.h @@ -0,0 +1,450 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/** + * @file + * + * lwIP Options Configuration + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIPOPTS_H__ +#define __LWIPOPTS_H__ + +#include "wl_api.h" +#include + +#ifndef BOARD +#error "BOARD must be defined" +#endif + +/* + ----------------------------------------------- + ---------- Platform specific locking ---------- + ----------------------------------------------- +*/ + +/** + * NO_SYS==1: Provides VERY minimal functionality. Otherwise, + * use lwIP facilities. + */ +#define NO_SYS 1 + + +/* + ------------------------------------ + ---------- Memory options ---------- + ------------------------------------ +*/ +/** + * MEM_ALIGNMENT: should be set to the alignment of the CPU + * 4 byte alignment -> #define MEM_ALIGNMENT 4 + * 2 byte alignment -> #define MEM_ALIGNMENT 2 + */ +#define MEM_ALIGNMENT 4 + +/** + * MEM_SIZE: the size of the heap memory. If the application will send + * a lot of data that needs to be copied, this should be set high. + */ +#define MEM_SIZE 16000 + + +/* + ------------------------------------------------ + ---------- Internal Memory Pool Sizes ---------- + ------------------------------------------------ +*/ +/** + * MEMP_NUM_PBUF: the number of memp struct pbufs (used for PBUF_ROM and PBUF_REF). + * If the application sends a lot of data out of ROM (or other static memory), + * this should be set high. + */ +#if BOARD == EVK1101 /* Reduced RAM */ + #define MEMP_NUM_PBUF 4 +#else + #define MEMP_NUM_PBUF 30 +#endif +/** + * MEMP_NUM_RAW_PCB: Number of raw connection PCBs + * (requires the LWIP_RAW option) + */ +#define MEMP_NUM_RAW_PCB 4 + +/** + * MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One + * per active UDP "connection". + * (requires the LWIP_UDP option) + */ +#define MEMP_NUM_UDP_PCB 4 + +/** + * MEMP_NUM_TCP_PCB: the number of simulatenously active TCP connections. + * (requires the LWIP_TCP option) + */ +#define MEMP_NUM_TCP_PCB 4 + +/** + * MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP connections. + * (requires the LWIP_TCP option) + */ +#define MEMP_NUM_TCP_PCB_LISTEN 2 + +/** + * MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP segments. + * (requires the LWIP_TCP option) + */ +#if BOARD == EVK1101 /* Reduced RAM */ + #define MEMP_NUM_TCP_SEG 2 +#else + #define MEMP_NUM_TCP_SEG 32 +#endif + +/** + * MEMP_NUM_ARP_QUEUE: the number of simulateously queued outgoing + * packets (pbufs) that are waiting for an ARP request (to resolve + * their destination address) to finish. + * (requires the ARP_QUEUEING option) + */ +#define MEMP_NUM_ARP_QUEUE 2 + +/** + * MEMP_NUM_SYS_TIMEOUT: the number of simulateously active timeouts. + * (requires NO_SYS==0) + */ +#define MEMP_NUM_SYS_TIMEOUT 0 + +/** + * MEMP_NUM_NETBUF: the number of struct netbufs. + * (only needed if you use the sequential API, like api_lib.c) + */ +#define MEMP_NUM_NETBUF 0 + +/** + * MEMP_NUM_NETCONN: the number of struct netconns. + * (only needed if you use the sequential API, like api_lib.c) + */ +#define MEMP_NUM_NETCONN 0 + +/** + * MEMP_NUM_TCPIP_MSG_API: the number of struct tcpip_msg, which are used + * for callback/timeout API communication. + * (only needed if you use tcpip.c) + */ +#define MEMP_NUM_TCPIP_MSG_API 0 + +/** + * MEMP_NUM_TCPIP_MSG_INPKT: the number of struct tcpip_msg, which are used + * for incoming packets. + * (only needed if you use tcpip.c) + */ +#define MEMP_NUM_TCPIP_MSG_INPKT 0 + +/** + * PBUF_POOL_SIZE: the number of buffers in the pbuf pool. + */ +#if BOARD == EVK1101 /* Reduced RAM */ + #define PBUF_POOL_SIZE 2 +#else + #define PBUF_POOL_SIZE 32 +#endif +/* + --------------------------------- + ---------- ARP options ---------- + --------------------------------- +*/ +/** + * LWIP_ARP==1: Enable ARP functionality. + */ +#define LWIP_ARP 1 + +/* + -------------------------------- + ---------- IP options ---------- + -------------------------------- +*/ +/** + * IP_FORWARD==1: Enables the ability to forward IP packets across network + * interfaces. If you are going to run lwIP on a device with only one network + * interface, define this to 0. + */ +#define IP_FORWARD 0 + +/** + * IP_OPTIONS: Defines the behavior for IP options. + * IP_OPTIONS==0_ALLOWED: All packets with IP options are dropped. + * IP_OPTIONS==1_ALLOWED: IP options are allowed (but not parsed). + */ +#define IP_OPTIONS_ALLOWED 1 + +/** + * IP_REASSEMBLY==1: Reassemble incoming fragmented IP packets. Note that + * this option does not affect outgoing packet sizes, which can be controlled + * via IP_FRAG. + */ +#define IP_REASSEMBLY 1 + +/** + * IP_FRAG==1: Fragment outgoing IP packets if their size exceeds MTU. Note + * that this option does not affect incoming packet sizes, which can be + * controlled via IP_REASSEMBLY. + */ +#define IP_FRAG 1 + +/** + * IP_REASS_MAXAGE: Maximum time (in multiples of IP_TMR_INTERVAL - so seconds, normally) + * a fragmented IP packet waits for all fragments to arrive. If not all fragments arrived + * in this time, the whole packet is discarded. + */ +#define IP_REASS_MAXAGE 3 + +/** + * IP_REASS_MAX_PBUFS: Total maximum amount of pbufs waiting to be reassembled. + * Since the received pbufs are enqueued, be sure to configure + * PBUF_POOL_SIZE > IP_REASS_MAX_PBUFS so that the stack is still able to receive + * packets even if the maximum amount of fragments is enqueued for reassembly! + */ +#if BOARD == EVK1101 /* Reduced RAM */ + #define IP_REASS_MAX_PBUFS PBUF_POOL_SIZE + #define MEMP_NUM_REASSDATA PBUF_POOL_SIZE-1 +#else + #define IP_REASS_MAX_PBUFS 10 +#endif + +/** + * IP_FRAG_USES_STATIC_BUF==1: Use a static MTU-sized buffer for IP + * fragmentation. Otherwise pbufs are allocated and reference the original + * packet data to be fragmented. + */ +#define IP_FRAG_USES_STATIC_BUF 0 + +/** + * IP_DEFAULT_TTL: Default value for Time-To-Live used by transport layers. + */ +#define IP_DEFAULT_TTL 255 + +/* + ---------------------------------- + ---------- ICMP options ---------- + ---------------------------------- +*/ +/** + * LWIP_ICMP==1: Enable ICMP module inside the IP stack. + * Be careful, disable that make your product non-compliant to RFC1122 + */ +#define LWIP_ICMP 1 + +/** + * ICMP_TTL: Default value for Time-To-Live used by ICMP packets. + */ +#define ICMP_TTL (IP_DEFAULT_TTL) + +/* + --------------------------------- + ---------- RAW options ---------- + --------------------------------- +*/ +/** + * LWIP_RAW==1: Enable application layer to hook into the IP layer itself. + */ +#define LWIP_RAW 1 + +/* + ---------------------------------- + ---------- DHCP options ---------- + ---------------------------------- +*/ +/** + * LWIP_DHCP==1: Enable DHCP module. + */ +#define LWIP_DHCP 1 + +/* + ------------------------------------ + ---------- AUTOIP options ---------- + ------------------------------------ +*/ +/** + * LWIP_AUTOIP==1: Enable AUTOIP module. + */ +#define LWIP_AUTOIP 0 + +/* + ---------------------------------- + ---------- SNMP options ---------- + ---------------------------------- +*/ +/** + * LWIP_SNMP==1: Turn on SNMP module. UDP must be available for SNMP + * transport. + */ +#define LWIP_SNMP 0 +#define SNMP_PRIVATE_MIB 0 + +/* + ---------------------------------- + ---------- IGMP options ---------- + ---------------------------------- +*/ +/** + * LWIP_IGMP==1: Turn on IGMP module. + */ +#define LWIP_IGMP 0 + +/* + ---------------------------------- + ---------- DNS options ----------- + ---------------------------------- +*/ +/** + * LWIP_DNS==1: Turn on DNS module. UDP must be available for DNS + * transport. + */ +#define LWIP_DNS 1 + +/* + --------------------------------- + ---------- UDP options ---------- + --------------------------------- +*/ +/** + * LWIP_UDP==1: Turn on UDP. + */ +#define LWIP_UDP 1 + +/** + * LWIP_UDPLITE==1: Turn on UDP-Lite. (Requires LWIP_UDP) + */ +#define LWIP_UDPLITE 0 + +/** + * UDP_TTL: Default Time-To-Live value. + */ +#define UDP_TTL (IP_DEFAULT_TTL) + +/* + --------------------------------- + ---------- TCP options ---------- + --------------------------------- +*/ +/** + * LWIP_TCP==1: Turn on TCP. + */ +#define LWIP_TCP 1 + +/* + ---------------------------------- + ---------- Pbuf options ---------- + ---------------------------------- +*/ +/** + * PBUF_LINK_HLEN: the number of bytes that should be allocated for a + * link level header. The default is 14, the standard value for + * Ethernet. + */ +#define PBUF_LINK_HLEN (14 + ETH_PAD_SIZE) + +/* + ------------------------------------ + ---------- LOOPIF options ---------- + ------------------------------------ +*/ +/** + * LWIP_HAVE_LOOPIF==1: Support loop interface (127.0.0.1) and loopif.c + */ +#define LWIP_HAVE_LOOPIF 1 +#define LWIP_LOOPIF_MULTITHREADING 0 + +/* + ---------------------------------------------- + ---------- Sequential layer options ---------- + ---------------------------------------------- +*/ + +/** + * LWIP_NETCONN==1: Enable Netconn API (require to use api_lib.c) + */ +#define LWIP_NETCONN 0 + +/* + ------------------------------------ + ---------- Socket options ---------- + ------------------------------------ +*/ +/** + * LWIP_SOCKET==1: Enable Socket API (require to use sockets.c) + */ +#define LWIP_SOCKET 0 + +/* + ---------------------------------------- + ---------- Statistics options ---------- + ---------------------------------------- +*/ +/** + * LWIP_STATS==1: Enable statistics collection in lwip_stats. + */ +#define LWIP_STATS 1 +#define LINK_STATS 1 + +/* Misc */ +#define LWIP_NETIF_LINK_CALLBACK 1 +#define LWIP_NETIF_STATUS_CALLBACK 1 +#define LWIP_TIMEVAL_PRIVATE 0 + +#undef DHCP_DOES_ARP_CHECK + +#if 0 +#define LWIP_DEBUG 1 +//#define NETIF_DEBUG LWIP_DBG_ON +//#define DHCP_DEBUG LWIP_DBG_ON +//#define ICMP_DEBUG LWIP_DBG_ON +//#define TCP_DEBUG LWIP_DBG_ON +//#define TCP_RTO_DEBUG LWIP_DBG_ON +//#define IP_DEBUG LWIP_DBG_ON +//#define TCP_CWND_DEBUG LWIP_DBG_ON +//#define ETHARP_DEBUG LWIP_DBG_ON +#define PBUF_DEBUG LWIP_DBG_ON +//#define TCP_INPUT_DEBUG LWIP_DBG_ON +//#define TCP_OUTPUT_DEBUG LWIP_DBG_ON +#endif + +#define ETH_PAD_SIZE WL_HEADER_SIZE /* size of wifiengine header */ +#define MEM_LIBC_MALLOC 1 + +#define TCP_MSS 512 +#if BOARD == EVK1101 /* Reduced RAM */ + #define TCP_SND_BUF (1460*1) /* MTU (1500) - IP - TCP hdrs == 1460 */ +#else + #define TCP_SND_BUF 4096 +#endif +#endif /* __LWIPOPTS_H__ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/main.c b/firmware/libraries/WiFi/extras/wifiHD/src/main.c new file mode 100644 index 0000000..fffb34e --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/main.c @@ -0,0 +1,454 @@ +/* + * main.c + * + * Created on: May 27, 2010 + * Author: mlf by Metodo2 srl + */ + +//#define _TEST_SPI_ + +#include +#include "board.h" +#include "gpio.h" + +#include +#include "wl_api.h" +#include "wl_cm.h" + +#include "lwip/init.h" +#include "lwip/dhcp.h" +#include "lwip/dns.h" +#include "lwip/tcp.h" +#include "netif/etharp.h" +#include "netif/wlif.h" + +#include "board_init.h" +#include "trace.h" + +#include "timer.h" +#include "util.h" +#include "cmd_wl.h" +#include "ping.h" +#include "ard_tcp.h" +#include "spi.h" +#include "ard_spi.h" +#include "delay.h" +#include "tc.h" +#include "debug.h" +#include "ard_utils.h" +#include + +/* FIRMWARE version */ +const char* fwVersion = "1.1.0"; + +#if BOARD == ARDUINO +#if !defined(DATAFLASH) +#include "wl_fw.h" + +int fw_download_init(void) { return 0;} +void fw_download_cb(void* ctx, uint8_t** buf, uint32_t* len) +{ + //printk("Fw download not available!\n"); + /* remember accross different calls */ + static uint8_t* _fw_buf = (uint8_t*)&fw_buf[0]; + static uint32_t offset = 0; + + /* when firmware download is completed, this function will be invoked + * on additional time with the input value of len set to 0. we can free + * the firmware buffer at this time since it's no longer needed. + */ + if (*len == 0) { + return; + } + + /* decide how much to read. we know *len bytes remains, but we only have + * room for SECTOR_SIEZ bytes in our buffer (fw_buf) + */ + uint32_t fw_len = *len; + + *buf = (_fw_buf+offset); + *len = fw_len; + + /* we need to know where to start reading upon next call */ + offset += fw_len; + +} +#else +#include "fw_download.h" +#endif +#endif + +bool ifStatus = false; +bool scanNetCompleted = false; + +static bool initSpiComplete = false; + +// variable used as enable flag for debug prints +DEFINE_DEBUG_VARIABLES(); + +/** + * + */ +static void +wl_cm_scan_cb(void* ctx) +{ + INFO_INIT("Scan Completed!\n"); + scanNetCompleted=true; +} + +/** + * + */ +static void +wl_cm_conn_cb(struct wl_network_t* net, void* ctx) +{ + struct ctx_server* hs = ctx; + + LINK_LED_ON(); + + INFO_INIT("Connection cb...\n"); + + printk("link up, connected to \"%s\"\n", ssid2str(&net->ssid)); + if ( hs->net_cfg.dhcp_enabled == DYNAMIC_IP_CONFIG ) { + INFO_INIT("Start DHCP...\n"); + printk("requesting dhcp ... "); + int8_t result = dhcp_start(hs->net_cfg.netif); + printk((result==ERR_OK)?"OK\n":"FAILED\n"); + hs->net_cfg.dhcp_running = 1; + } + else { + netif_set_up(hs->net_cfg.netif); + } + + INFO_INIT("Start DNS...\n"); + dns_init(); +} + + +/** + * + */ +static void +wl_cm_disconn_cb(void* ctx) +{ + struct ctx_server* hs = ctx; + + LINK_LED_OFF(); + INFO_INIT("Disconnection cb...\n"); + + if (hs->net_cfg.dhcp_running) { + printk("link down, release dhcp\n"); + dhcp_release(hs->net_cfg.netif); + dhcp_stop(hs->net_cfg.netif); + hs->net_cfg.dhcp_running = 0; + } else { + printk("link down\n"); + netif_set_down(hs->net_cfg.netif); + } + + set_result_cmd(WL_FAILURE); +} + +#if 0 +static void wl_cm_err_cb(void* ctx) +{ + int err = *(int*)ctx; + WARN("Error: %d\n", err); + set_result_cmd(err); +} +#endif + +/** + * + */ +static void +ip_status_cb(struct netif* netif) +{ + INFO_INIT("IP status cb...\n"); + if (netif_is_up(netif)) { + set_result_cmd(WL_SUCCESS); + printk("bound to %s\n", ip2str(netif->ip_addr)); + ifStatus = true; + }else{ + ifStatus = false; + closeConnections(); + WARN("Interface not up!\n"); + } +} + + +/** + * + */ +void +led_init(void) +{ + gpio_enable_gpio_pin(LED0_GPIO); + gpio_enable_gpio_pin(LED1_GPIO); + gpio_enable_gpio_pin(LED2_GPIO); + LINK_LED_OFF(); + ERROR_LED_OFF(); + DATA_LED_OFF(); +} + + +void tc_init(void) +{ + // The timer/counter instance and channel number are used in several functions. + // It's defined as local variable for ease-of-use causes and readability. + volatile avr32_tc_t *tc = WIFI_TC; + + // Options for waveform genration. + tc_waveform_opt_t waveform_opt = + { + .channel = WIFI_TC_CHANNEL_ID, // Channel selection. + + .bswtrg = TC_EVT_EFFECT_NOOP, // Software trigger effect on TIOB. + .beevt = TC_EVT_EFFECT_NOOP, // External event effect on TIOB. + .bcpc = TC_EVT_EFFECT_NOOP, // RC compare effect on TIOB. + .bcpb = TC_EVT_EFFECT_NOOP, // RB compare effect on TIOB. + + .aswtrg = TC_EVT_EFFECT_NOOP, // Software trigger effect on TIOA. + .aeevt = TC_EVT_EFFECT_NOOP, // External event effect on TIOA. + .acpc = TC_EVT_EFFECT_TOGGLE, // RC compare effect on TIOA: toggle. + .acpa = TC_EVT_EFFECT_TOGGLE, // RA compare effect on TIOA: toggle (other possibilities are none, set and clear). + + .wavsel = TC_WAVEFORM_SEL_UP_MODE_RC_TRIGGER,// Waveform selection: Up mode with automatic trigger(reset) on RC compare. + .enetrg = FALSE, // External event trigger enable. + .eevt = TC_EXT_EVENT_SEL_TIOB_INPUT, // External event selection. + .eevtedg = TC_SEL_NO_EDGE, // External event edge selection. + .cpcdis = FALSE, // Counter disable when RC compare. + .cpcstop = FALSE, // Counter clock stopped with RC compare. + + .burst = TC_BURST_NOT_GATED, // Burst signal selection. + .clki = TC_CLOCK_RISING_EDGE, // Clock inversion. + .tcclks = TC_CLOCK_SOURCE_TC2 // Internal source clock 3, connected to fPBA / 2. + }; + + // Assign I/O to timer/counter channel pin & function. + gpio_enable_module_pin(WIFI_TC_CHANNEL_PIN, WIFI_TC_CHANNEL_FUNCTION); + + // Initialize the timer/counter. + tc_init_waveform(tc, &waveform_opt); // Initialize the timer/counter waveform. + + // Set the compare triggers. + tc_write_ra(tc, WIFI_TC_CHANNEL_ID, 0x01A4); // Set RA value. + tc_write_rc(tc, WIFI_TC_CHANNEL_ID, 0x0348); // Set RC value. + + // Start the timer/counter. + tc_start(tc, WIFI_TC_CHANNEL_ID); + +} + +/** + * + */ +void +poll(struct ctx_server* hs) +{ + /* this will trigger any scheduled timer callbacks */ + timer_poll(); + + /* handle console input */ + console_poll(); + + /* wl api 'tick' */ + wl_tick(timer_get_ms()); + + /* lwip driver poll */ + wlif_poll(hs->net_cfg.netif); + + if (initSpiComplete) spi_poll(hs->net_cfg.netif); + +#ifdef WITH_GUI + gui_exec(timer_get_ms()); +#endif +} + +void initShell(void* ctx) +{ + /* initialize shell */ + INFO_INIT("Shell init...\n"); + console_init(); + console_add_cmd("scan", cmd_scan, NULL); + console_add_cmd("connect", cmd_connect, NULL); + console_add_cmd("setkey", cmd_setkey, NULL); + console_add_cmd("status", cmd_status, ctx); + console_add_cmd("debug", cmd_debug, NULL); + console_add_cmd("dumpBuf", cmd_dumpBuf, NULL); + console_add_cmd("ipconfig", cmd_set_ip, ctx); +#ifdef ADD_CMDS + console_add_cmd("powersave", cmd_power, NULL); + console_add_cmd("psconf", cmd_psconf, NULL); +#endif +#ifdef PING_CMD + console_add_cmd("ping", cmd_ping, NULL); +#endif + console_add_cmd("ttcp", cmd_ttcp, NULL); +#ifdef WITH_WPA + console_add_cmd("wpass", cmd_setpass, NULL); + console_add_cmd("dpass", cmd_delpass, NULL); +#endif +#ifdef _SPI_STATS_ + console_add_cmd("spiStat", cmd_statSpi, NULL); + console_add_cmd("resetSpiStat", cmd_resetStatSpi, NULL); +#endif +#ifdef _DNS_CMD_ + console_add_cmd("getHost", cmd_gethostbyname, NULL); + console_add_cmd("setDNS", cmd_setDnsServer, NULL); +#endif + console_add_cmd("startSrv", cmd_startSrv, NULL); + console_add_cmd("startCli", cmd_startCli, NULL); + console_add_cmd("sendUdp", cmd_sendUdpData, NULL); + +} + +/** + * + */ +void +wl_init_complete_cb(void* ctx) +{ + struct ctx_server *hs = ctx; + struct ip_addr ipaddr, netmask, gw; + wl_err_t wl_status; + + if (hs->net_cfg.dhcp_enabled == INIT_IP_CONFIG) + { + IP4_ADDR(&gw, 0,0,0,0); + IP4_ADDR(&ipaddr, 0,0,0,0); + IP4_ADDR(&netmask, 0,0,0,0); + + /* default is dhcp enabled */ + hs->net_cfg.dhcp_enabled = DYNAMIC_IP_CONFIG; + } + + start_ip_stack(&hs->net_cfg, + ipaddr, + netmask, + gw); + netif_set_status_callback(hs->net_cfg.netif, ip_status_cb); + + INFO_INIT("Starting CM...\n"); + /* start connection manager */ + wl_status = wl_cm_init(wl_cm_scan_cb, wl_cm_conn_cb, wl_cm_disconn_cb, hs); + ASSERT(wl_status == WL_SUCCESS, "failed to init wl conn mgr"); + wl_cm_start(); + + wl_scan(); + + if (initSpi(hs)){ + WARN("Spi not initialized\n"); + }else + { + initSpiComplete = true; + AVAIL_FOR_SPI(); + } + + hs->wl_init_complete = 1; +} + +void startup_init(void) +{ + INIT_SIGNAL_FOR_SPI(); + BUSY_FOR_SPI(); + + // if DEBUG enabled use DEB_PIN_GPIO for debug purposes + DEB_PIN_ENA(); + DEB_PIN_ENA(2); + DEB_PIN_UP(); + DEB_PIN_UP(2); +} + +const char timestamp[] = __TIMESTAMP__; + +/** + * + */ +int +main(void) +{ + wl_err_t wl_status; + int status; + struct ctx_server *hs; + enum wl_host_attention_mode mode; + + startup_init(); + + board_init(); + + led_init(); + + tc_init(); + + delay_init(FOSC0); + +#ifdef _TEST_SPI_ + for (;;) + { + /* handle console input */ + + console_poll(); + + spi_poll(NULL); + + } +#else + printk("Arduino Wifi Startup... [%s]\n", timestamp); + + size_t size_ctx_server = sizeof(struct ctx_server); + hs = calloc(1, size_ctx_server); + ASSERT(hs, "out of memory"); + + size_t size_netif = sizeof(struct netif); + hs->net_cfg.netif = calloc(1, size_netif); + ASSERT(hs->net_cfg.netif, "out of memory"); + hs->net_cfg.dhcp_enabled = INIT_IP_CONFIG; + + INFO_INIT("hs:%p size:0x%x netif:%p size:0x%x\n", hs, size_ctx_server, + hs->net_cfg.netif, size_netif); + initShell(hs); + timer_init(NULL, NULL); + lwip_init(); + + status = fw_download_init(); + ASSERT(status == 0, "failed to prepare for firmware download\n"); + + wl_status = wl_transport_init(fw_read_cb, hs, &mode); + if (wl_status != WL_SUCCESS) + goto err; + INFO_INIT("Mode: 0x%x\n", mode); + wl_status = wl_init(hs, wl_init_complete_cb, mode); + if (wl_status != WL_SUCCESS) + goto err; + + /* start main loop */ + for (;;) + poll(hs); + + +err: + /* show error message on console and display if wlan initialization fails */ + +#define WL_CARD_FAILURE_STR "Could not detect wl device, aborting\n" +#define WL_FIRMWARE_INVALID_STR "Invalid firmware data, aborting\n" +#define WL_OTHER_FAILURE_STR "Failed to start wl initialization\n" + + switch (wl_status) { + case WL_CARD_FAILURE: + printk(WL_CARD_FAILURE_STR); + break; + + case WL_FIRMWARE_INVALID: + printk(WL_FIRMWARE_INVALID_STR); + break; + + default: + printk(WL_OTHER_FAILURE_STR); + break; + } + for (;;) { + timer_poll(); + } +#endif +} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/nvram.c b/firmware/libraries/WiFi/extras/wifiHD/src/nvram.c new file mode 100644 index 0000000..2c61c5f --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/nvram.c @@ -0,0 +1,153 @@ +/*! \page License + * Copyright (C) 2009, H&D Wireless AB All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include + +#include "compiler.h" +#include "preprocessor.h" +#include "board.h" +#include "power_clocks_lib.h" +#include "gpio.h" +#include "spi.h" +#include "conf_at45dbx.h" +#include "at45dbx.h" +#include +#include + + +static struct nvram { + uint8_t read; + void *data; + uint32_t len; + uint16_t off; +} PRIV; + +int nvram_init(void) +{ + spi_options_t spiOptions = { + .reg = AT45DBX_SPI_FIRST_NPCS, + .baudrate = AT45DBX_SPI_MASTER_SPEED, + .bits = AT45DBX_SPI_BITS, + .spck_delay = 0, + .trans_delay = 0, + .stay_act = 1, + .spi_mode = 0, + .modfdis = 1 + }; + + at45dbx_init(spiOptions, FPBA_HZ); + return 0; +} + + +/** + * Invoked by at45dbx driver + * + */ +void at45dbx_read_multiple_sector_callback(const void *psector) +{ + struct nvram *priv = &PRIV; + const uint8_t *buf = psector; + + if (!priv->read) + return; + + memcpy(priv->data, buf + priv->off, priv->len); +} + + +/** + * Invoked by at45dbx driver + * + */ +void at45dbx_write_multiple_sector_callback(void *psector) +{ + struct nvram *priv = &PRIV; + uint8_t *buf = psector; + memcpy(buf + priv->off, priv->data, priv->len); +} + + +/** + * Write/read any number bytes into any offset of nor flash by taking care + * of cases where the length is not aligned to the sector size or where + * the addr is not aligned to the sector offsets. + * + */ +static int nvram_rw(uint32_t addr, void *data, uint16_t len, int write) +{ + struct nvram *priv = &PRIV; + priv->read = write ? 0 : 1; + + while (len) { + uint32_t sector = addr / AT45DBX_SECTOR_SIZE; + priv->data = data; + priv->off = addr % AT45DBX_SECTOR_SIZE; + priv->len = AT45DBX_SECTOR_SIZE; + + if (len < AT45DBX_SECTOR_SIZE) + priv->len = len; + + if (priv->len > AT45DBX_SECTOR_SIZE - priv->off) + priv->len = AT45DBX_SECTOR_SIZE - priv->off; + + at45dbx_read_open(sector); + at45dbx_read_multiple_sector(1); + at45dbx_read_close(); + + if (write) { + at45dbx_write_open(sector); + at45dbx_write_multiple_sector(1); + at45dbx_write_close(); + } + + data += priv->len; + len -= priv->len; + addr += priv->len; + } + + return 0; +} + +/** + * Write any number bytes into any offset of nor flash. + * + */ +int nvram_write(uint32_t addr, const void *data, uint32_t len) +{ + return nvram_rw(addr, (void *) data, len, 1); +} + + +/** + * Read any number bytes into any offset of nor flash. + * + */ +int nvram_read(uint32_t addr, void *data, uint32_t len) +{ + return nvram_rw(addr, data, len, 0); +} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/nvram.h b/firmware/libraries/WiFi/extras/wifiHD/src/nvram.h new file mode 100644 index 0000000..8882749 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/nvram.h @@ -0,0 +1,10 @@ +#ifndef NVRAM_H +#define NVRAM_H + +#include + +int nvram_init(void); +int nvram_read(uint32_t addr, void *data, uint32_t len); +int nvram_write(uint32_t addr, const void *data, uint32_t len); + +#endif diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/owl_os.c b/firmware/libraries/WiFi/extras/wifiHD/src/owl_os.c new file mode 100644 index 0000000..d17d8ce --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/owl_os.c @@ -0,0 +1,140 @@ +#include +#include +#include +#include + +#include + +void *owl_os_alloc(size_t size) +{ + return malloc(size); +} + +void *owl_os_realloc(void *ptr, size_t size) +{ + return realloc(ptr, size); +} + +void owl_os_free(void *p) +{ + free(p); +} + +void *owl_os_memcpy(void *dst, const void *src, size_t n) +{ + return memcpy(dst, src, n); +} + +void *owl_os_memset(void *s, int c, size_t n) +{ + return memset(s, c, n); +} + +void *owl_os_memmove(void *dst, const void *src, size_t n) +{ + return memmove(dst, src, n); +} + +size_t owl_os_strlen(char *s) +{ + return strlen(s); +} + +char *owl_os_strncpy(char *dst, const char *src, size_t n) +{ + return strncpy(dst, src, n); +} + +int owl_os_strncmp(const char *s1, const char *s2, size_t n) +{ + return strncmp(s1, s2, n); +} + +int owl_os_strcmp(const char *s1, const char *s2) +{ + return strcmp(s1, s2); +} + +char *owl_os_strcpy(char *dst, const char *src) +{ + return strcpy(dst, src); +} + +char *owl_os_strdup(const char *s) +{ + return strdup(s); +} + +char *owl_os_strndup(const char *s, size_t n) +{ + return strndup(s, n); +} + +int owl_os_memcmp(const void *s1, const void *s2, size_t n) +{ + return memcmp(s1, s2, n); +} + +long int owl_os_strtol(const char *nptr, char **endptr, int base) +{ + return strtol(nptr, endptr, base); +} + +char *owl_os_strchr(const char *s, int c) +{ + return strchr(s, c); +} + +char *owl_os_strrchr(const char *s, int c) +{ + return strrchr(s, c); +} + +int owl_os_strcasecmp(const char *s1, const char *s2) +{ + return strcasecmp(s1, s2); +} + +char *owl_os_strstr(const char *haystack, const char *needle) +{ + return strstr(haystack, needle); +} + +int owl_os_snprintf(char *str, size_t size, const char *format, ...) +{ + int ret; + va_list ap; + va_start(ap, format); + ret = vsniprintf(str, size, format, ap); + va_end(ap); + return ret; +} + +/* for debugging only, never called if wl_api was built without debug */ +#ifdef CONFIG_OWL +#include "owl_env.h" +int owl_os_printf(const char *fmt, ...) +{ + char *str = NULL; + va_list args; + int len; + char *iter; + + va_start(args, fmt); + + if ((str = malloc(160)) == NULL) + return -1; + + if ((len = vsniprintf(str, 160, fmt, args)) < 0) { + free(str); + return -1; + } + + iter = str; + while (*iter) + owl_putc(*iter++); + + free(str); + return len; +} +#endif diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/ping.c b/firmware/libraries/WiFi/extras/wifiHD/src/ping.c new file mode 100644 index 0000000..aba97db --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/ping.c @@ -0,0 +1,340 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is derived from a part of the lwIP TCP/IP stack. + * + */ +#ifdef PING_CMD +#include "lwip/opt.h" + +#include "lwip/mem.h" +#include "lwip/raw.h" +#include "lwip/icmp.h" +#include "lwip/netif.h" +#include "lwip/sys.h" +#include "lwip/sockets.h" +#include "lwip/inet.h" +#include "lwip/inet_chksum.h" + +#include "ping.h" +#include "timer.h" +#include "util.h" + +#include "getopt.h" + +#define PING_ID 0xAFAF + +struct ping_info_t { + struct ip_addr destination; + uint32_t deadline; /* -w (in seconds) */ + uint32_t interval; /* -i (in ms) */ + uint32_t timeout; /* ms */ + uint32_t data_size; /* -s */ + uint32_t count; /* -c, 0 means continous ping */ + uint32_t size; + uint32_t first_tx_tm; + uint32_t last_tx_tm; + uint32_t last_rx_tm; + uint32_t num_tx; + uint32_t num_rx; + uint32_t flags; + uint16_t seq_num; + Bool quiet; /* -q */ + ping_complete_cb_t complete_cb; + void *ctx; +#define PING_REPLY (1 << 0) +}; + +static struct ping_info_t INFO; + +/** Prepare a echo ICMP request */ +static void ping_prepare_echo(struct icmp_echo_hdr *iecho, + struct ping_info_t* ping_info) +{ + int i; + + ICMPH_TYPE_SET(iecho,ICMP_ECHO); + ICMPH_CODE_SET(iecho, 0); + iecho->chksum = 0; + iecho->id = PING_ID; + iecho->seqno = htons(++ping_info->seq_num); + iecho->chksum = 0; + + /* fill the additional data buffer with some data */ + for(i = 0; i < ping_info->data_size; i++) { + ((char*)iecho)[sizeof(struct icmp_echo_hdr) + i] = i; + } + + iecho->chksum = inet_chksum(iecho, ping_info->size); +} + +/* Ping using the raw ip */ +static u8_t ping_recv(void *arg, struct raw_pcb *pcb, struct pbuf *p, + struct ip_addr *addr) +{ + struct icmp_echo_hdr *iecho; + struct ip_hdr *ip = p->payload; + struct ping_info_t* ping_info = (struct ping_info_t*) arg; + uint32_t us; + + if (pbuf_header( p, -PBUF_IP_HLEN)==0) { + iecho = p->payload; + + if ((iecho->id == PING_ID) && + (iecho->seqno == htons(ping_info->seq_num))) { + ping_info->last_rx_tm = timer_get_ms(); + ping_info->num_rx++; + us = 1000 * + (ping_info->last_rx_tm - ping_info->last_tx_tm); + + if (!ping_info->quiet) + printk("%d bytes from %s: icmp_seq=%d ttl=%d " \ + "time=%d.%03d ms\n", + p->tot_len, ip2str(ip->src), + iecho->seqno, + IPH_TTL(ip), + us / 1000, us % 1000); + + /* do some ping result processing */ + ping_info->flags |= PING_REPLY; + } + } + + pbuf_free(p); + return 1; /* eat the event */ +} + +static void ping_send(struct raw_pcb *raw, struct ping_info_t* ping_info) +{ + struct pbuf *p; + struct icmp_echo_hdr *iecho; + + if (!(p = pbuf_alloc(PBUF_IP, ping_info->size, PBUF_RAM))) { + return; + } + if ((p->len == p->tot_len) && (p->next == NULL)) { + iecho = p->payload; + + ping_prepare_echo(iecho, ping_info); + raw_sendto(raw, p, &ping_info->destination); + + if (!ping_info->first_tx_tm) + ping_info->first_tx_tm = timer_get_ms(); + ping_info->last_tx_tm = timer_get_ms(); + ping_info->num_tx++; + } + pbuf_free(p); +} + +void ping_set_callback(ping_complete_cb_t cb, void *ctx) { + INFO.complete_cb = cb; + INFO.ctx = ctx; +} + +void ping_stop(uint32_t *tx_cnt, uint32_t *rx_cnt) { + struct ping_info_t *ping_info = &INFO; + + *tx_cnt = ping_info->num_tx; + *rx_cnt = ping_info->num_rx; + ping_info->count = ping_info->num_tx; + if ( 0 == ping_info->count ) { + ping_info->count = 1; + } +} + +static int init_ping_info(int argc, char* argv[], struct ping_info_t* ping_info) +{ + int c; + ping_complete_cb_t cb; + void *ctx; + + cb = ping_info->complete_cb; + ctx = ping_info->ctx; + memset(ping_info, 0, sizeof(struct ping_info_t)); + ping_info->complete_cb = cb; + ping_info->ctx = ctx; + + ping_info->deadline = 0; + ping_info->interval = 1000; + ping_info->timeout = 3000; + ping_info->data_size = 32; + ping_info->count = 3; + ping_info->destination = + netif_default ? netif_default->gw : ip_addr_any; + + optind = 1; + while ((c = getopt(argc, argv, "c:i:s:w:q")) != -1) { + switch (c) { + case 'c': + ping_info->count = atoi(optarg); + break; + + case 'i': + ping_info->interval = atoi(optarg); + break; + + case 's': + ping_info->data_size = atoi(optarg); + break; + + case 'q': + ping_info->quiet = TRUE; + break; + + case 'w': + ping_info->deadline = atoi(optarg); + break; + } + } + + ping_info->size = sizeof(struct icmp_echo_hdr) + ping_info->data_size; + + if (optind >= argc) + return -1; + + ping_info->destination = str2ip(argv[optind]); + if (!ping_info->destination.addr) + return -1; + + + ping_info->last_rx_tm = timer_get_ms(); + + return 0; +} + +static void print_stats(struct ping_info_t* ping_info) +{ + printk("\n--- %s ping statistics ---\n", + ip2str(ping_info->destination)); + printk("%d packets transmitted, %d received, %d%% packet loss, "\ + "time %dms\n\n", + ping_info->num_tx, ping_info->num_rx, + 100 * (ping_info->num_tx - ping_info->num_rx) / + ping_info->num_tx, + timer_get_ms() - ping_info->first_tx_tm); +} + +static void ping_finalize(struct ping_info_t* ping_info) { + print_stats(ping_info); + if (ping_info->complete_cb) { + ping_info->complete_cb(ping_info->num_tx, ping_info->num_rx, ping_info->ctx); + } +} + +cmd_state_t cmd_ping(int argc, char* argv[], void* ctx) +{ + static enum { + INIT, + PING, + WAIT_REPLY + } state = INIT; + + struct ping_info_t *ping_info = &INFO; + static struct raw_pcb *pcb; + + switch (state) { + case INIT: + if (init_ping_info(argc, argv, ping_info) != 0) { + printk("Usage: ping [-c count] [-i interval] " \ + "[-s packetsize]\n " \ + "[-w deadline] [-q] destination\n"); + return CMD_DONE; + } + + if (!(pcb = raw_new(IP_PROTO_ICMP))) { + printk("could not allocate pcb\n"); + state = INIT; + return CMD_DONE; + } + raw_recv(pcb, ping_recv, ping_info); + raw_bind(pcb, IP_ADDR_ANY); + + printk("PING %s %d(%d) bytes of data\n", + ip2str(ping_info->destination), + ping_info->data_size, + ping_info->size); + state = PING; + /* fall through */ + + case PING: + if (!netif_is_up(netif_default)) { + printk("netif is down\n"); + raw_remove(pcb); + state = INIT; + return CMD_DONE; + } + + if (ping_info->count && ping_info->num_tx == ping_info->count) { + ping_finalize(ping_info); + raw_remove(pcb); + state = INIT; + return CMD_DONE; + } + + + if (timer_get_ms() < ping_info->last_rx_tm + ping_info->interval) { + return CMD_INPROGRESS; + } + ping_send(pcb, ping_info); + + state = WAIT_REPLY; + return CMD_INPROGRESS; + + case WAIT_REPLY: + if (ping_info->flags & PING_REPLY) { + ping_info->flags &= (~PING_REPLY); + state = PING; + return CMD_INPROGRESS; + } + + if (timer_get_ms() > + ping_info->last_tx_tm + ping_info->timeout) { + if (!ping_info->quiet) + printk("timeout from %s\n", + ip2str(ping_info->destination)); + state = PING; + return CMD_INPROGRESS; + } + + if (ping_info->deadline && + timer_get_ms() > + ping_info->first_tx_tm + ping_info->deadline * 1000) { + ping_finalize(ping_info); + raw_remove(pcb); + state = INIT; + return CMD_DONE; + } + + return CMD_INPROGRESS; + } + + /* unreachable */ + Assert(0); + return CMD_DONE; +} +#endif diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/ping.h b/firmware/libraries/WiFi/extras/wifiHD/src/ping.h new file mode 100644 index 0000000..47d409d --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/ping.h @@ -0,0 +1,45 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is derived from a part of the lwIP TCP/IP stack. + * + */ +#ifndef PING_H +#define PING_H + +#include "console.h" + +typedef void (*ping_complete_cb_t)(uint32_t tx_pkt_cnt, uint32_t rx_pkt_cnt, void *ctx); + +void ping_set_callback(ping_complete_cb_t cb, void *ctx); + +void ping_stop(uint32_t *tx_cnt, uint32_t *rx_cnt); + +cmd_state_t cmd_ping(int argc, char* argv[], void* ctx); + +#endif diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/printf-stdarg.c b/firmware/libraries/WiFi/extras/wifiHD/src/printf-stdarg.c new file mode 100644 index 0000000..92eb217 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/printf-stdarg.c @@ -0,0 +1,323 @@ +/* This source file is part of the ATMEL AVR32-SoftwareFramework-AT32UC3A-1.4.0 Release */ + +/*This file has been prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief sprintf functions to replace newlib for AVR32 UC3. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + *****************************************************************************/ + +/* Copyright (C) 2006-2008, Atmel Corporation All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of ATMEL may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + Copyright 2001, 2002 Georges Menie (www.menie.org) + stdarg version contributed by Christian Ettinger + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser 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 +*/ + +/* + putchar is the only external dependency for this file, + if you have a working putchar, leave it commented out. + If not, uncomment the define below and + replace outbyte(c) by your own function call. + +*/ + + +#include + +static void printchar(char **str, int c) +{ + extern int board_putchar(char c); + + if (str) { + **str = c; + ++(*str); + } + else (void) board_putchar(c); +} + +#define PAD_RIGHT 1 +#define PAD_ZERO 2 + +static int prints(char **out, const char *string, int width, int pad) +{ + register int pc = 0, padchar = ' '; + + if (width > 0) { + register int len = 0; + register const char *ptr; + for (ptr = string; *ptr; ++ptr) ++len; + if (len >= width) width = 0; + else width -= len; + if (pad & PAD_ZERO) padchar = '0'; + } + if (!(pad & PAD_RIGHT)) { + for ( ; width > 0; --width) { + printchar (out, padchar); + ++pc; + } + } + for ( ; *string ; ++string) { + printchar (out, *string); + ++pc; + } + for ( ; width > 0; --width) { + printchar (out, padchar); + ++pc; + } + + return pc; +} + +/* the following should be enough for 32 bit int */ +#define PRINT_BUF_LEN 12 + +static int printi(char **out, int i, int b, int sg, int width, int pad, int letbase) +{ + char print_buf[PRINT_BUF_LEN]; + register char *s; + register int t, neg = 0, pc = 0; + register unsigned int u = i; + + if (i == 0) { + print_buf[0] = '0'; + print_buf[1] = '\0'; + return prints (out, print_buf, width, pad); + } + + if (sg && b == 10 && i < 0) { + neg = 1; + u = -i; + } + + s = print_buf + PRINT_BUF_LEN-1; + *s = '\0'; + + while (u) { + t = u % b; + if( t >= 10 ) + t += letbase - '0' - 10; + *--s = t + '0'; + u /= b; + } + + if (neg) { + if( width && (pad & PAD_ZERO) ) { + printchar (out, '-'); + ++pc; + --width; + } + else { + *--s = '-'; + } + } + + return pc + prints (out, s, width, pad); +} + +#if 0 +int fprintf(__FILE *stream, const char *format, ...) +{ +return 0; +} +#endif + +int printk_va(char **out, const char *format, va_list args ) +{ + register int width, pad; + register int pc = 0; + char scr[2]; + + for (; *format != 0; ++format) { + if (*format == '%') { + ++format; + width = pad = 0; + if (*format == '\0') break; + if (*format == '%') goto out; + if (*format == '-') { + ++format; + pad = PAD_RIGHT; + } + while (*format == '0') { + ++format; + pad |= PAD_ZERO; + } + for ( ; *format >= '0' && *format <= '9'; ++format) { + width *= 10; + width += *format - '0'; + } + if( *format == 's' ) { + register char *s = (char *)va_arg( args, int ); + pc += prints (out, s?s:"(null)", width, pad); + continue; + } + if( *format == 'd' ) { + pc += printi (out, va_arg( args, int ), 10, 1, width, pad, 'a'); + continue; + } + if( *format == 'p' ) { + pad = 8; + pc += printi (out, va_arg( args, int ), 16, 0, width, pad, 'a'); + continue; + } + if( *format == 'x' ) { + pc += printi (out, va_arg( args, int ), 16, 0, width, pad, 'a'); + continue; + } + if( *format == 'X' ) { + pc += printi (out, va_arg( args, int ), 16, 0, width, pad, 'A'); + continue; + } + if( *format == 'u' ) { + pc += printi (out, va_arg( args, int ), 10, 0, width, pad, 'a'); + continue; + } + if( *format == 'c' ) { + /* char are converted to int then pushed on the stack */ + scr[0] = (char)va_arg( args, int ); + scr[1] = '\0'; + pc += prints (out, scr, width, pad); + continue; + } + } + else { + out: + printchar (out, *format); + ++pc; + } + } + if (out) **out = '\0'; + va_end( args ); + return pc; +} + +int printk(const char *format, ...) +{ + va_list args; + + va_start( args, format ); + return printk_va( 0, format, args ); +} + +#ifndef __ARM__ +int sprintf(char *out, const char *format, ...) +{ + va_list args; + + va_start( args, format ); + return printk_va( &out, format, args ); +} +#endif + +#ifdef TEST_PRINTF +int main(void) +{ + char *ptr = "Hello world!"; + char *np = 0; + int i = 5; + unsigned int bs = sizeof(int)*8; + int mi; + char buf[80]; + + mi = (1 << (bs-1)) + 1; + printf("%s\n", ptr); + printf("printf test\n"); + printf("%s is null pointer\n", np); + printf("%d = 5\n", i); + printf("%d = - max int\n", mi); + printf("char %c = 'a'\n", 'a'); + printf("hex %x = ff\n", 0xff); + printf("hex %02x = 00\n", 0); + printf("signed %d = unsigned %u = hex %x\n", -3, -3, -3); + printf("%d %s(s)%", 0, "message"); + printf("\n"); + printf("%d %s(s) with %%\n", 0, "message"); + sprintf(buf, "justif: \"%-10s\"\n", "left"); printf("%s", buf); + sprintf(buf, "justif: \"%10s\"\n", "right"); printf("%s", buf); + sprintf(buf, " 3: %04d zero padded\n", 3); printf("%s", buf); + sprintf(buf, " 3: %-4d left justif.\n", 3); printf("%s", buf); + sprintf(buf, " 3: %4d right justif.\n", 3); printf("%s", buf); + sprintf(buf, "-3: %04d zero padded\n", -3); printf("%s", buf); + sprintf(buf, "-3: %-4d left justif.\n", -3); printf("%s", buf); + sprintf(buf, "-3: %4d right justif.\n", -3); printf("%s", buf); + + return 0; +} + +/* + * if you compile this file with + * gcc -Wall $(YOUR_C_OPTIONS) -DTEST_PRINTF -c printf.c + * you will get a normal warning: + * printf.c:214: warning: spurious trailing `%' in format + * this line is testing an invalid % at the end of the format string. + * + * this should display (on 32bit int machine) : + * + * Hello world! + * printf test + * (null) is null pointer + * 5 = 5 + * -2147483647 = - max int + * char a = 'a' + * hex ff = ff + * hex 00 = 00 + * signed -3 = unsigned 4294967293 = hex fffffffd + * 0 message(s) + * 0 message(s) with % + * justif: "left " + * justif: " right" + * 3: 0003 zero padded + * 3: 3 left justif. + * 3: 3 right justif. + * -3: -003 zero padded + * -3: -3 left justif. + * -3: -3 right justif. + */ + +#endif diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/printf-stdarg.h b/firmware/libraries/WiFi/extras/wifiHD/src/printf-stdarg.h new file mode 100644 index 0000000..bce38b6 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/printf-stdarg.h @@ -0,0 +1,34 @@ +/*! \page License + * Copyright (C) 2009, H&D Wireless AB All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef PRINTF_STDARG_H +#define PRINTF_STDARG_H +#include + +int printk(const char *format, ...); +int printk_va(char **out, const char *format, va_list args ); +#endif diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/timer.c b/firmware/libraries/WiFi/extras/wifiHD/src/timer.c new file mode 100644 index 0000000..6ffba63 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/timer.c @@ -0,0 +1,232 @@ +/*! \page License + * Copyright (C) 2009, H&D Wireless AB All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#ifdef FREERTOS_USED +#include "FreeRTOS.h" +#include "task.h" +#endif + +#define TIMER_HZ 4 + + +struct timeout_t { + U32 tick; + U32 expire_at_tick; + Bool expired; + U8 type; + void (*cb)(void* ctx); + void* ctx; +}; + +struct timer_t { + volatile U32 tick; + struct timeout_t timeout[10]; + void (*tick_isr) (void* ctx); + const U32 MS_PER_TICK; + void *ctx; +}; + +#define ARRAY_SIZE(a) sizeof(a) / sizeof(a[0]) + + +static struct timer_t TIMER = { + .tick = 0, +#ifdef FREERTOS_USED + .MS_PER_TICK = 1 / portTICK_RATE_MS, +#else + .MS_PER_TICK = TIMER_HZ, +#endif + .timeout = { { 0 } }, +}; + +#ifdef FREERTOS_USED /* Use TICK-hook */ + +void vApplicationTickHook( void ) { + struct timer_t* priv = &TIMER; + priv->tick++; + if(priv->tick_isr) { + priv->tick_isr(priv->ctx); + } +} + +#else /* Use interrupt directly */ + +static __attribute__((__interrupt__)) void irq_handler(void) +{ + volatile avr32_rtc_t *rtc = &AVR32_RTC; + struct timer_t* priv = &TIMER; + priv->tick++; + + if(priv->tick_isr) + priv->tick_isr(priv->ctx); + + rtc->icr = AVR32_RTC_ICR_TOPI_MASK; + rtc->isr; +} + +#endif + +void timer_init(void (*tick_isr) (void* ctx), void* ctx) +{ + struct timer_t* priv = &TIMER; + uint8_t id; + +#ifndef FREERTOS_USED + INTC_register_interrupt(&irq_handler, AVR32_RTC_IRQ, AVR32_INTC_INT0); + if (!rtc_init(&AVR32_RTC, RTC_OSC_RC, 0)) + Assert(0); + + rtc_set_top_value(&AVR32_RTC, 115 * priv->MS_PER_TICK / 2); + rtc_enable_interrupt(&AVR32_RTC); + rtc_enable(&AVR32_RTC); +#else + /* With FreeRTOS we use the OS tick instead */ +#endif + priv->tick_isr = tick_isr; + priv->ctx = ctx; + + for (id = 0; id < ARRAY_SIZE(priv->timeout); id++) + priv->timeout[id].expired = TRUE; +} + + +U32 timer_get_ms(void) +{ + struct timer_t* priv = &TIMER; + return priv->tick * priv->MS_PER_TICK; +} + +void timer_delay(U32 ms) +{ + struct timer_t* priv = &TIMER; + U32 expire_at_tick = priv->tick + ms / priv->MS_PER_TICK; + while (priv->tick < expire_at_tick); +} + +/** + * Called from application main loop to invoke any scheduled timeout cbs. + * This function might be called as often as possible rather than at each tick + * to support the timeout value '0', e.g a timeout within less than one tick. + * + */ +void timer_poll(void) +{ + struct timer_t* priv = &TIMER; + U8 i; + + for (i = 0; i < ARRAY_SIZE(priv->timeout); i++) { + struct timeout_t* tmo = &priv->timeout[i]; + if (tmo->expired) + continue; + + if (tmo->expire_at_tick > priv->tick) + continue; + + if (tmo->cb) + tmo->cb(tmo->ctx); + + if (tmo->type == TIMEOUT_PERIODIC) + tmo->expire_at_tick = priv->tick + tmo->tick; + else + tmo->expired = TRUE; + } +} + +static U32 timer_sched_timeout(U32 ms, U8 type) +{ + struct timer_t* priv = &TIMER; + struct timeout_t* tmo; + U8 id; + + Assert(type == TIMEOUT_ONESHOT || type == TIMEOUT_PERIODIC); + + for (id = 0; id < ARRAY_SIZE(priv->timeout); id++) { + tmo = &priv->timeout[id]; + if (tmo->expired) + break; + } + + Assert(id != ARRAY_SIZE(priv->timeout)); + + tmo->tick = ms / priv->MS_PER_TICK; + tmo->expire_at_tick = priv->tick + tmo->tick; + tmo->type = type; + tmo->expired = FALSE; + return id; +} + +U32 timer_sched_timeout_cb(U32 ms, U8 type, void (*cb)(void *ctx), void* ctx) +{ + struct timer_t* priv = &TIMER; + struct timeout_t* tmo; + U8 id; + + Assert(cb); + id = timer_sched_timeout(ms, type); + tmo = &priv->timeout[id]; + + tmo->cb = cb; + tmo->ctx = ctx; + return id; +} + + +U32 timer_mod(U32 id, U32 ms, U8 type, void (*cb)(void *ctx), void* ctx) +{ + struct timer_t* priv = &TIMER; + + if (id != INVALID_TIMER_ID && !priv->timeout[id].expired) + timer_cancel_timeout(id); + + return timer_sched_timeout_cb(ms, type, cb, ctx); +} + +void timer_cancel_timeout(U32 id) +{ + struct timer_t* priv = &TIMER; + struct timeout_t* tmo; + + tmo = &priv->timeout[id]; + tmo->expired = TRUE; +} + +int timer_interval_passed(U32 old, U32 new, U32 diff) { + /* New did not wrap */ + if (new > old && new - old > diff) { + return 1; + } + /* New did wrap */ + else if (new < old && ( ( (U32)(-1) - old ) + new ) > diff ) { + return 1; + } + return 0; +} diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/timer.h b/firmware/libraries/WiFi/extras/wifiHD/src/timer.h new file mode 100644 index 0000000..6614fbc --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/timer.h @@ -0,0 +1,51 @@ +/*! \page License + * Copyright (C) 2009, H&D Wireless AB All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef TIMER_H +#define TIMER_H +#include + +enum { + TIMEOUT_ONESHOT, + TIMEOUT_PERIODIC +}; + +#define INVALID_TIMER_ID 0xFFFFFFFF + +/* Handle timer overflows. Return 1 if the interval has passed. */ +int timer_interval_passed(uint32_t old, uint32_t new, uint32_t diff); + +void timer_tick(); +void timer_init(void (*tick_isr) (void* ctx), void* ctx); +void timer_poll(void); +void timer_delay(uint32_t ms); +uint32_t timer_sched_timeout_cb(uint32_t ms, uint8_t type, void (*cb)(void *ctx), void* ctx); +uint32_t timer_mod(uint32_t id, uint32_t ms, uint8_t type, void (*cb)(void *ctx), void* ctx); +void timer_cancel_timeout(uint32_t id); +uint32_t timer_get_ms(void); + +#endif diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/top_defs.h b/firmware/libraries/WiFi/extras/wifiHD/src/top_defs.h new file mode 100644 index 0000000..09f7c3e --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/top_defs.h @@ -0,0 +1,120 @@ +/*! \page License + * Copyright (C) 2009, H&D Wireless AB All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _TOP_DEFS_H +#define _TOP_DEFS_H + +#include +#include + +#define ARRAY_SIZE(a) sizeof(a) / sizeof((a)[0]) + +#ifndef UNREF +#define UNREF(x) x = x +#endif + +#if __GNUC__ +#ifdef __KERNEL__ +#define WEAK_DECL +#else +#define WEAK_DECL __attribute__ ((__weak__)) +#endif +#define PACKED __attribute__ ((__packed__)) +#define USED __attribute__ ((__used__)) +#else + #error "Unsupported compiler" +#endif + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + + +#if 0 +#include +/* + * These functions should _NOT_ be used, call iprintf, sniprintf, iscanf, siscanf etc + * instead. Those functions do not have support for floating point formats. + * Not using these functions saves 27kB of code. + */ +extern int printf(const char *format, ...) __attribute__ ((deprecated)); +extern int sprintf(char *str, const char *format, ...) __attribute__ ((deprecated)); +extern int snprintf(char *str, size_t size, const char *format, ...) __attribute__ ((deprecated)); + +int vprintf(const char *format, va_list ap) __attribute__ ((deprecated)); +int vfprintf(FILE *stream, const char *format, va_list ap) __attribute__ ((deprecated)); +int vsprintf(char *str, const char *format, va_list ap) __attribute__ ((deprecated)); +int vsnprintf(char *str, size_t size, const char *format, va_list ap) __attribute__ ((deprecated)); + +int scanf(const char *format, ...) __attribute__ ((deprecated)); +int fscanf(FILE *stream, const char *format, ...) __attribute__ ((deprecated)); +int sscanf(const char *str, const char *format, ...) __attribute__ ((deprecated)); + +int vscanf(const char *format, va_list ap) __attribute__ ((deprecated)); +int vsscanf(const char *str, const char *format, va_list ap) __attribute__ ((deprecated)); +int vfscanf(FILE *stream, const char *format, va_list ap) __attribute__ ((deprecated)); +#endif + +#endif + + + +#if defined(__linux__) || defined(__APPLE__) + #include + #include + #define sniprintf snprintf + #define asiprintf asprintf + #define printk printf + #define siscanf sscanf + + #define WL_ASSERT(x) assert(x) + #define WL_DEBUG(args...) printf(args) + + #ifdef NO_LWIP + /* IP address representation from lwIP */ + struct ip_addr { + uint32_t addr; + } PACKED; + #endif + + #define FEAT_SOCKETS + +#else + #define WL_ASSERT(cond) do { \ + if (!(cond)) { \ + printk("%s:%d\n", __FILE__, __LINE__); \ + for(;;); \ + } \ + } while(0) + #define WL_DEBUG(args...) printk(args) + + +#endif diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/trace.h b/firmware/libraries/WiFi/extras/wifiHD/src/trace.h new file mode 100644 index 0000000..984262a --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/trace.h @@ -0,0 +1,44 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*! \page License + * Copyright (C) 2009, H&D Wireless AB All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef TRACE_H +#define TRACE_H + +#include +#include "printf-stdarg.h" + +#define ASSERT(cond, str) do { \ + if (!(cond)) { \ + printk("%s\n", str); \ + Assert(0); \ + } \ + } while(0) + + +#endif diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/util.c b/firmware/libraries/WiFi/extras/wifiHD/src/util.c new file mode 100644 index 0000000..c01edeb --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/util.c @@ -0,0 +1,260 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*! \page License + * Copyright (C) 2009, H&D Wireless AB All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +const char* ip2str(struct ip_addr addr) +{ + static char buf[16]; + +#if BYTE_ORDER == LITTLE_ENDIAN + sniprintf(buf, sizeof(buf), "%lu.%lu.%lu.%lu", + addr.addr & 0xff, + (addr.addr >> 8) & 0xff, + (addr.addr >> 16) & 0xff, + (addr.addr >> 24) & 0xff); + return buf; +#else + sniprintf(buf, sizeof(buf), "%lu.%lu.%lu.%lu", + (addr.addr >> 24) & 0xff, + (addr.addr >> 16) & 0xff, + (addr.addr >> 8) & 0xff, + (addr.addr) & 0xff); + return buf; +#endif +} + +struct ip_addr str2ip(const char* str) +{ + int a,b,c,d; + uint32_t ip = 0; + struct ip_addr addr; + + if (siscanf(str,"%d.%d.%d.%d",&a,&b,&c,&d) != 4) + goto out; + + if (a < 0 || a > 255 || b < 0 || b > 255 || + c < 0 || c > 255 || d < 0 || d > 255) { + goto out; + } + +#if BYTE_ORDER == LITTLE_ENDIAN + ip = (d << 24) | (c << 16) | (b << 8) | a; +#else + ip = (a << 24) | (b << 16) | (c << 8) | d; +#endif + + out: + addr.addr = ip; + return addr; +} + +uint8_t ascii_to_key(char *outp, const char *inp) { + char buf[3]; + int len; + buf[2] = '\0'; + len = strlen(inp); + if (len % 2) { + printk("Invalid length\n"); + } + len = 0; + while (*inp) { + if (! isxdigit(*inp) || ! isxdigit(*(inp+1)) || + len > WL_MAX_PASS_LEN) { + return 0; + } + buf[0] = *inp++; + buf[1] = *inp++; + *outp++ = strtol(buf, NULL, 16); + len++; + } + return len; +} + + + +void printbuf(const char *prefix, const void *data, size_t len) +{ + const unsigned char *s = data; + int i, j; + + for (i = 0; i < len; i += 16) + { + printk("%s ", prefix); + for(j = 0; j < 16; j++) { + if(i + j >= len) + printk(" "); + else + printk("%02X ", (uint16_t)s[i + j]); + } + printk(": "); + for(j = 0; j < 16; j++) { + if(i + j >= len) + break; + if(s[i+j] >= 32 && s[i+j] < 127) + printk("%c", s[i + j]); + else + printk("."); + } + printk("\n"); + } +} + + +void print_network(struct wl_network_t* wl_network) +{ + printk("%s ", mac2str(wl_network->bssid.octet)); + printk("\"%s\"", ssid2str(&wl_network->ssid)); + printk(" RSSI %d dBm ", wl_network->rssi); + switch(wl_network->net_type) { + case WL_CONN_TYPE_ADHOC: + printk(" Ad-Hoc "); + break; + default : + break; + } + switch (wl_network->enc_type) { + case ENC_TYPE_WEP : + printk(" (WEP encryption)"); + break; + case ENC_TYPE_TKIP : + printk(" (TKIP encryption)"); + break; + case ENC_TYPE_CCMP : + printk(" (CCMP encryption)"); + break; + case ENC_TYPE_NONE : + break; + } + printk("\n"); + +} + +void print_network_list(void) +{ + struct wl_network_list_t* wl_network_list; + uint8_t i; + + wl_get_network_list(&wl_network_list); + + if (wl_network_list->cnt == 0) + printk("no nets found\n"); + + for (i = 0; i < wl_network_list->cnt; i++) + print_network(wl_network_list->net[i]); +} + +int join_argv(char *dst, size_t dst_len, int argc, char* argv[]) { + char *p = dst; + int i; + int len = 0; + + /* Not really kosher, an ssid may legally contain 0-bytes but + * the console interface does not deal with that. + */ + for (i = 0; i < argc; i++) { + len += strlen(argv[i]); + if (len > dst_len) { + printk("ssid too long (max %d)\n", (int) dst_len); + return 0; + } + p += sniprintf(p, + dst_len - (p - dst), + "%s ", + argv[i]); + } + if (p == dst) { + return 0; + } + p--; + *p = '\0'; /* Delete last space */ + + return p - dst; +} + +const char* ssid2str(struct wl_ssid_t *ssid) { + static char buf[WL_SSID_MAX_LENGTH + 1]; + + memset(buf, 0, sizeof buf); + memcpy(buf, ssid->ssid, ssid->len); + + return buf; +} + + +const char* mac2str(uint8_t* mac) +{ + static char buf[18]; + sniprintf(buf, sizeof(buf), "%02x-%02x-%02x-%02x-%02x-%02x", + mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + return buf; +} + + +char* enc_type2str(enum wl_enc_type enc_type) +{ + switch(enc_type) { + case ENC_TYPE_WEP: + return "WEP"; + case ENC_TYPE_CCMP: + return "CCMP"; + case ENC_TYPE_TKIP: + return "TKIP"; + default: + return ""; + }; +} + +int equal_ssid(const struct wl_ssid_t* ssid1, + const struct wl_ssid_t* ssid2) { + if (ssid1->len == ssid2->len && + (memcmp(ssid1->ssid, ssid2->ssid, ssid1->len) == 0)) { + return 1; + } + return 0; +} + +int equal_bssid(const struct wl_mac_addr_t* bssid1, + const struct wl_mac_addr_t* bssid2) { + if (memcmp(bssid1, bssid2, sizeof *bssid1) == 0) { + return 1; + } + return 0; +} + + diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/util.h b/firmware/libraries/WiFi/extras/wifiHD/src/util.h new file mode 100644 index 0000000..2b3f74f --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/util.h @@ -0,0 +1,71 @@ +/*! \page License + * Copyright (C) 2009, H&D Wireless AB All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _UTIL_H +#define _UTIL_H +#include +#include +#include +#include "lwip/ip.h" +#include + +const char* ip2str(struct ip_addr addr); + +struct ip_addr str2ip(const char* str); + +uint8_t ascii_to_key(char *outp, const char *inp); + +void print_network(struct wl_network_t* wl_network); + +void print_network_list(void); + +int join_argv(char *dst, size_t dst_len, int argc, char* argv[]); + +void printbuf(const char *prefix, const void *data, size_t len); + +const char* ssid2str(struct wl_ssid_t *ssid); + +const char* mac2str(uint8_t mac[6]); + +char* enc_type2str(enum wl_enc_type enc_type); + +int equal_ssid(const struct wl_ssid_t* ssid1, + const struct wl_ssid_t* ssid2); + +int equal_bssid(const struct wl_mac_addr_t* bssid1, + const struct wl_mac_addr_t* bssid2); + +#define NET_SET_SSID(net, xssid, ssid_len) do { \ + DE_MEMCPY((net)->ssid.ssid, (xssid), (ssid_len)); \ + (net)->ssid.len = (ssid_len); \ + } while (0) + +#define NET_SET_BSSID(net, xbssid) do { \ + DE_MEMCPY(&(net)->bssid, &(xbssid), sizeof (xbssid)); \ + } while (0) + +#endif /* _UTIL_H */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/wifi_spi.h b/firmware/libraries/WiFi/extras/wifiHD/src/wifi_spi.h new file mode 100644 index 0000000..e2e262c --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/wifi_spi.h @@ -0,0 +1,160 @@ +/* + * wifi_spi.h + * + * Created on: Jul 4, 2010 + * Author: mlf by Metodo2 srl + */ +#ifndef WiFi_Spi_h +#define WiFi_Spi_h + +#include "wl_definitions.h" + +#define CMD_FLAG 0 +#define REPLY_FLAG 1<<7 +#define DATA_FLAG 0x40 + +#define WIFI_SPI_ACK 1 +#define WIFI_SPI_ERR 0xFF + +#define TIMEOUT_CHAR 1000 + +//#define MAX_SOCK_NUM 4 /**< Maxmium number of socket */ +#define NO_SOCKET_AVAIL 255 + +#define START_CMD 0xE0 +#define END_CMD 0xEE +#define ERR_CMD 0xEF +#define CMD_POS 1 // Position of Command OpCode on SPI stream +#define PARAM_LEN_POS 2 // Position of Param len on SPI stream + +enum { + SET_NET_CMD = 0x10, + SET_PASSPHRASE_CMD = 0x11, + SET_KEY_CMD = 0x12, + TEST_CMD = 0x13, + SET_IP_CONFIG_CMD = 0x14, + SET_DNS_CONFIG_CMD = 0x15, + + GET_CONN_STATUS_CMD = 0x20, + GET_IPADDR_CMD = 0x21, + GET_MACADDR_CMD = 0x22, + GET_CURR_SSID_CMD = 0x23, + GET_CURR_BSSID_CMD = 0x24, + GET_CURR_RSSI_CMD = 0x25, + GET_CURR_ENCT_CMD = 0x26, + SCAN_NETWORKS = 0x27, + START_SERVER_TCP_CMD= 0x28, + GET_STATE_TCP_CMD = 0x29, + DATA_SENT_TCP_CMD = 0x2A, + AVAIL_DATA_TCP_CMD = 0x2B, + GET_DATA_TCP_CMD = 0x2C, + START_CLIENT_TCP_CMD= 0x2D, + STOP_CLIENT_TCP_CMD = 0x2E, + GET_CLIENT_STATE_TCP_CMD = 0x2F, + DISCONNECT_CMD = 0x30, + GET_IDX_SSID_CMD = 0x31, + GET_IDX_RSSI_CMD = 0x32, + GET_IDX_ENCT_CMD = 0x33, + REQ_HOST_BY_NAME_CMD= 0x34, + GET_HOST_BY_NAME_CMD= 0x35, + START_SCAN_NETWORKS = 0x36, + GET_FW_VERSION_CMD = 0x37, + GET_TEST_CMD = 0x38, + SEND_DATA_UDP_CMD = 0x39, + GET_REMOTE_DATA_CMD = 0x3A, + + // All command with DATA_FLAG 0x40 send a 16bit Len + + SEND_DATA_TCP_CMD = 0x44, + GET_DATABUF_TCP_CMD = 0x45, + INSERT_DATABUF_CMD = 0x46, + +}; + +#if 0 +enum wl_tcp_state { + CLOSED = 0, + LISTEN = 1, + SYN_SENT = 2, + SYN_RCVD = 3, + ESTABLISHED = 4, + FIN_WAIT_1 = 5, + FIN_WAIT_2 = 6, + CLOSE_WAIT = 7, + CLOSING = 8, + LAST_ACK = 9, + TIME_WAIT = 10 +}; +#endif + +enum numParams{ + PARAM_NUMS_0, + PARAM_NUMS_1, + PARAM_NUMS_2, + PARAM_NUMS_3, + PARAM_NUMS_4, + PARAM_NUMS_5, + MAX_PARAM_NUMS +}; + +#define MAX_PARAMS MAX_PARAM_NUMS-1 +#define PARAM_LEN_SIZE 1 + +typedef struct __attribute__((__packed__)) +{ + uint8_t paramLen; + char* param; +}tParam; + +typedef struct __attribute__((__packed__)) +{ + uint16_t dataLen; + char* data; +}tDataParam; + + +typedef struct __attribute__((__packed__)) +{ + unsigned char cmd; + unsigned char tcmd; + unsigned char nParam; + tParam params[MAX_PARAMS]; +}tSpiMsg; + +typedef struct __attribute__((__packed__)) +{ + unsigned char cmd; + unsigned char tcmd; + unsigned char nParam; + tDataParam params[MAX_PARAMS]; +}tSpiMsgData; + + +typedef struct __attribute__((__packed__)) +{ + unsigned char cmd; + unsigned char tcmd; + //unsigned char totLen; + unsigned char nParam; +}tSpiHdr; + +typedef struct __attribute__((__packed__)) +{ + uint8_t paramLen; + uint32_t param; +}tLongParam; + +typedef struct __attribute__((__packed__)) +{ + uint8_t paramLen; + uint16_t param; +}tIntParam; + +typedef struct __attribute__((__packed__)) +{ + uint8_t paramLen; + uint8_t param; +}tByteParam; + +#endif +uint8_t param; \ No newline at end of file diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/wl_cm.c b/firmware/libraries/WiFi/extras/wifiHD/src/wl_cm.c new file mode 100644 index 0000000..ebc0e45 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/wl_cm.c @@ -0,0 +1,431 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*! \page License + * Copyright (C) 2009, H&D Wireless AB All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "wl_cm.h" +#include "util.h" +#include +#include "debug.h" + +/** Roaming configuration parameters **/ + +/*! The ROAMING_RSSI_THRESHOLD setting defines how bad the current + * signal strength should be before we'll consider roaming to an AP + * with better signal strength. The objective is to stay on the + * current AP as long as the RSSI is decent, even if there are other + * APs in the same BSS with better RSSI available. + * If ROAMING_RSSI_THRESHOLD is too high we might roam unecessarily. + * If ROAMING_RSSI_THRESHOLD is too low we might not roam in time to + * avoid packet loss. This also impacts power consumption, staying + * too long with an AP with poor RSSI will consume more power. + * Unit is dBm. + */ +#define ROAMING_RSSI_THRESHOLD -65 + +/*! The ROAMING_RSSI_DIFF setting defines how much better + * than the currently associated AP a new AP must be before + * we'll attempt to roam over to the new AP. + * If ROAMING_RSSI_DIFF is too high it might be too hard + * to roam (important if the STA is expected to move + * quickly through different AP coverage areas). + * If ROAMING_RSSI_DIFF is too low we might bounce between + * two APs with similar signal strengths. + * Unit is dBm. + */ +#define ROAMING_RSSI_DIFF 10 + +# include "printf-stdarg.h" +#include "ard_utils.h" +#include "debug.h" + +/** \defgroup wl_cm Connection Manager + * + * These functions are used to configure and control the WiFi connetion + * manager. + * + * + * @{ + */ + +struct cm_candidate { + struct wl_ssid_t ssid; + struct wl_mac_addr_t bssid; +}; + +struct cm { + cm_scan_cb_t *scan_cb; + cm_conn_cb_t *conn_cb; + cm_disconn_cb_t *disconn_cb; + void* ctx; + uint8_t enabled; + struct cm_candidate candidate; +}; + + +/** + * This function can be modified to pick a network based on + * application specific criteria. + * + * If the SSID can not be found in the scan list it will be + * assumed to be a hidden SSID and the wl_connect() command + * will be called to attempt to probe for the network and + * connect to it. + */ +static struct wl_network_t* +find_best_candidate(struct cm* cm) +{ + struct wl_network_list_t* netlist; + struct wl_network_t *best_net = NULL; + uint8_t i; + + if (wl_get_network_list(&netlist) != WL_SUCCESS) + return NULL; + + if (netlist->cnt == 0) + return NULL; + + for (i = 0; i < netlist->cnt; i++) { + /* match on ssid */ + if (cm->candidate.ssid.len) + if (!equal_ssid(&cm->candidate.ssid, + &netlist->net[i]->ssid)) + continue; + + /* match bssid */ + if (strncmp((char*) cm->candidate.bssid.octet, + "\xff\xff\xff\xff\xff\xff", 6)) + if (!equal_bssid(&cm->candidate.bssid, + &netlist->net[i]->bssid)) + continue; + /* check for best rssi. */ + if ( best_net && + ( best_net->rssi > netlist->net[i]->rssi) ) { + continue; + } + best_net = netlist->net[i]; + } + + return best_net; +} + + +/** + * + */ +static void +select_net(struct cm* cm) +{ + struct wl_network_t *candidate_net; + struct wl_network_t *current_net; + struct wl_ssid_t *ssid_p; + + int ret; + + /* Nothing to do */ + if (0 == cm->candidate.ssid.len) { + return; + } + + current_net = wl_get_current_network(); + candidate_net = find_best_candidate(cm); + + /* Connected to the candidate? ... */ + if ( current_net == candidate_net ) { + if ( current_net ) { + /* ...yes, dont change. */ + + return; + } + } + + /* Roaming checks */ + if (current_net && candidate_net) { + /* Are we changing BSSs? */ + if ( equal_ssid(&candidate_net->ssid, + ¤t_net->ssid)) { + + /* ...no. Does the currently connected + * net have a decent RSSI?...*/ + if ( current_net->rssi > ROAMING_RSSI_THRESHOLD ) { + /* ...yes, stay with it. */ + return; + } + /* ...no. Does the candidate have + * sufficiently better RSSI to + * motivate a switch to it? */ + if ( candidate_net->rssi < current_net->rssi + + ROAMING_RSSI_DIFF) { + return; + } + /* ...yes, try to roam to candidate_net */ + CM_DPRINTF("CM: Roaming from rssi %d to %d\n", + current_net->rssi, + candidate_net->rssi); + } + } + /* a candidate is found */ + if (candidate_net) { + /* We connect to a specific bssid here because + * find_best_candidate() might have picked a + * particulare AP among many with the same SSID. + * wl_connect() would pick one of them at random. + */ + ret = wl_connect_bssid(candidate_net->bssid); + } + /* no candidate found */ + else { + CM_DPRINTF("CM: No candidate found for ssid \"%s\"\n", + ssid2str(&cm->candidate.ssid)); + /* Might be a hidden SSID so we try to connect to it. + * wl_connect() will trigger a directed scan + * for the SSID in this case. + */ + ssid_p = &cm->candidate.ssid; + ret = wl_connect(ssid_p->ssid, ssid_p->len); + } + switch (ret) { + case WL_SUCCESS : + return; + case WL_BUSY: + wl_disconnect(); + return; + case WL_RETRY: + break; + default : + CM_DPRINTF("CM: failed to connect\n"); + break; + } + + /* some operation failed or no candidate found */ + if (wl_scan() != WL_SUCCESS) + CM_DPRINTF("CM: failed to scan\n"); +} + + +/** + * + */ +static void +wl_scan_complete_cb(void* ctx) +{ + struct cm *cm = ctx; + + CM_DPRINTF("CM: scan completed\n"); + + if (cm->scan_cb) + cm->scan_cb(cm->ctx); + + if ( 0 == cm->enabled ) { + return; + } + select_net(cm); +} + +/** + * + */ +static void +wl_media_connected_cb(void* ctx) +{ + struct cm *cm = ctx; + struct wl_network_t *net = wl_get_current_network(); + CM_DPRINTF("CM: connected to %s\n", ssid2str(&net->ssid)); + LINK_LED_ON(); + ERROR_LED_OFF(); + if (cm->conn_cb) + cm->conn_cb(net, cm->ctx); +} + + +/** + * + */ +static void +wl_conn_failure_cb(void* ctx) +{ + struct cm *cm = ctx; + CM_DPRINTF("CM: connect failed, scanning\n"); + ERROR_LED_ON(); + LINK_LED_OFF(); + + if ( 0 == cm->enabled ) { + return; + } + if (wl_scan() != WL_SUCCESS) + /* should never happen */ + CM_DPRINTF("CM: could not start scan after connect fail!\n"); +} + + +/** + * + */ +static void +wl_conn_lost_cb(void* ctx) +{ + struct cm *cm = ctx; + CM_DPRINTF("CM: connection lost, scanning\n"); + LINK_LED_OFF(); + if (cm->disconn_cb) + cm->disconn_cb(cm->ctx); + + if ( 0 == cm->enabled ) { + return; + } + if (wl_scan() != WL_SUCCESS) + /* should never happen */ + CM_DPRINTF("CM: could not start scan after connect lost!\n"); +} + + +/** + * + */ +static void +wl_event_cb(struct wl_event_t event, void* ctx) +{ + struct cm *cm = ctx; + + switch (event.id) { + case WL_EVENT_MEDIA_CONNECTED: + wl_media_connected_cb(cm); + break; + + case WL_EVENT_CONN_FAILURE: + wl_conn_failure_cb(cm); + break; + + case WL_EVENT_MEDIA_DISCONNECTED: + CM_DPRINTF("CM: disconnected\n"); + wl_conn_lost_cb(cm); + break; + + case WL_EVENT_SCAN_COMPLETE: + wl_scan_complete_cb(cm); + break; + + default: + CM_DPRINTF("CM: unhandled event\n"); + }; +} + +static struct cm *cm = NULL; + + +/** + * Doesn't actually start the CM, just initializing. CM will run whenever + * an valid ssid is set through wl_cm_set_network() and wl_cm_start() + * has been called. + */ +wl_err_t +wl_cm_init(cm_scan_cb_t scan_cb, + cm_conn_cb_t conn_cb, + cm_disconn_cb_t disconn_cb, + void* ctx) +{ + if (cm != NULL) + return WL_FAILURE; + + cm = calloc(1, sizeof(struct cm)); + if (cm == NULL) { + CM_DPRINTF("CM: out of memory\n"); + return WL_FAILURE; + } + + if (wl_register_event_cb(wl_event_cb, cm) != WL_SUCCESS) { + CM_DPRINTF("CM: could not register event cb\n"); + return WL_FAILURE; + } + + cm->scan_cb = scan_cb; + cm->conn_cb = conn_cb; + cm->disconn_cb = disconn_cb; + cm->enabled = 0; + cm->ctx = ctx; + + CM_DPRINTF("CM: initialized\n"); + return WL_SUCCESS; +} + +wl_err_t +wl_cm_start(void) { + if (NULL == cm) + return WL_FAILURE; + + cm->enabled = 1; + return WL_SUCCESS; +} + +wl_err_t +wl_cm_stop(void) { + if (NULL == cm) + return WL_FAILURE; + + cm->enabled = 0; + return WL_SUCCESS; +} + + +/** + * Set the desired network which the connection manager should try to + * connect to. + * + * The ssid and bssid of the desired network should be specified. The ssid and + * bssid will be matched against the networks found during scan. If any + * parameter is null, it will always match. If both parameters are null, + * the first found network will be chosen. + * + * @param ssid The ssid of the desired network. If null, any ssid will match. + * @param bssid The bssid of the desired network. If null, any bssid will match. + * + */ +wl_err_t +wl_cm_set_network(struct wl_ssid_t *ssid, struct wl_mac_addr_t *bssid) +{ + if (cm == NULL) + return WL_FAILURE; + + if (ssid) + memcpy(&cm->candidate.ssid, ssid, sizeof(cm->candidate.ssid)); + else + cm->candidate.ssid.len = 0; + + if (bssid) + memcpy(&cm->candidate.bssid, bssid, + sizeof(cm->candidate.bssid)); + else + memset(&cm->candidate.bssid, 0xff, sizeof(cm->candidate.bssid)); + + if (cm->candidate.ssid.len) + wl_scan(); + + return WL_SUCCESS; +} +/* + * @} + */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/wl_cm.h b/firmware/libraries/WiFi/extras/wifiHD/src/wl_cm.h new file mode 100644 index 0000000..bbb65d9 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/wl_cm.h @@ -0,0 +1,51 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*! \page License + * Copyright (C) 2009, H&D Wireless AB All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef WL_CM_H +#define WL_CM_H + +#include +#include +#include + +typedef void (cm_scan_cb_t)(void* ctx); +typedef void (cm_conn_cb_t)(struct wl_network_t *net, void* ctx); +typedef void (cm_disconn_cb_t)(void* ctx); + +wl_err_t wl_cm_set_network(struct wl_ssid_t *ssid, struct wl_mac_addr_t *bssid); + +wl_err_t wl_cm_init(cm_scan_cb_t scan_cb, + cm_conn_cb_t conn_cb, + cm_disconn_cb_t disconn_cb, + void* ctx); + +wl_err_t wl_cm_start(void); +wl_err_t wl_cm_stop(void); + +#endif diff --git a/firmware/libraries/WiFi/extras/wifiHD/src/wl_definitions.h b/firmware/libraries/WiFi/extras/wifiHD/src/wl_definitions.h new file mode 100644 index 0000000..b07c203 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/src/wl_definitions.h @@ -0,0 +1,39 @@ +/* + * wl_definitions.h + * + * Created on: Mar 6, 2011 + * Author: mlf by Metodo2 srl + */ + +#ifndef WL_DEFINITIONS_H_ +#define WL_DEFINITIONS_H_ + +// Maximum size of a SSID +#define WL_SSID_MAX_LENGTH 32 +// Length of passphrase. Valid lengths are 8-63. +#define WL_WPA_KEY_MAX_LENGTH 63 +// Length of key in bytes. Valid values are 5 and 13. +#define WL_WEP_KEY_MAX_LENGTH 13 +// Size of a MAC-address or BSSID +#define WL_MAC_ADDR_LENGTH 6 +// Size of a MAC-address or BSSID +#define WL_IPV4_LENGTH 4 +// Maximum size of a SSID list +#define WL_NETWORKS_LIST_MAXNUM 10 +// Maxmium number of socket +#define MAX_SOCK_NUM 4 +//Maximum number of attempts to establish wifi connection +#define WL_MAX_ATTEMPT_CONNECTION 10 + +typedef enum { + WL_IDLE_STATUS, + WL_NO_SSID_AVAIL, + WL_SCAN_COMPLETED, + WL_CONNECTED, + WL_CONNECT_FAILED, + WL_CONNECTION_LOST, + WL_DISCONNECTED +} wl_status_t; + + +#endif /* WL_DEFINITIONS_H_ */ diff --git a/firmware/libraries/WiFi/extras/wifiHD/wifiHD.cproj b/firmware/libraries/WiFi/extras/wifiHD/wifiHD.cproj new file mode 100644 index 0000000..3d15941 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifiHD/wifiHD.cproj @@ -0,0 +1,1291 @@ + + + + 2.0 + 6.0 + com.Atmel.AVRGCC32 + 417e15db-488a-4b56-8d4e-fbe832b2b649 + wifiHD + AT32uc3a1256 + none + Importer + Executable + C + wifiHD + .elf + $(MSBuildProjectDirectory)\$(Configuration) + Native + com.atmel.avrdbg.tool.jtagicemk3 + true + + + + + + + + + + + + + + JTAG + + com.atmel.avrdbg.tool.jtagicemk3 + JTAGICE3 + J30200003078 + true + false + + + + 127.0.0.1 + 51999 + False + + + JTAG + + 250000 + 1000000 + 150000 + false + false + 0 + 0 + 0 + 0 + + + + 3.5.0 + false + + 0 + + + + + True + True + True + True + + + BOARD=ARDUINO + WITH_KEY + WITH_WPA + WITH_NO_DMA + DATAFLASH=1 + _INFO_DEBUG_=1 + + + + + ../src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA + ../src/SOFTWARE_FRAMEWORK/DRIVERS/TC + ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS + ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX + ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC + ../src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC + ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG + ../src/SOFTWARE_FRAMEWORK/SERVICES/DELAY + ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART + ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI + ../src/SOFTWARE_FRAMEWORK/DRIVERS/RTC + ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM + ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO + ../src/SOFTWARE_FRAMEWORK/DRIVERS/EIC + ../src/CONFIG + ../src/SOFTWARE_FRAMEWORK/DRIVERS/CPU/CYCLE_COUNTER + ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE + ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR + ../src/SOFTWARE_FRAMEWORK/UTILS + ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC + ../src/SOFTWARE_FRAMEWORK/BOARDS + ../src + ../src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include + ../src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4 + ../src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/include + ../src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD + + + Optimize for size (-Os) + -fdata-sections -ffunction-sections + True + True + True + True + -c -fmessage-length=0 + True + + + newlib_addons-at32ucr2-speed_opt + _ucr2_hd_spi_v2.7.0 + _ucr2_hd_wl_sta_intwpa_v2.7.0 + + + + + ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS + ../src/SOFTWARE_FRAMEWORK/BOARDS + ../src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/UCR2/GCC + + + True + True + True + -Wl,--gc-sections -Wl,-e,_trampoline -T../src/SOFTWARE_FRAMEWORK/UTILS/LINKER_SCRIPTS/AT32UC3A/1256/GCC/link_uc3a1256.lds + + + ../src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA + ../src/SOFTWARE_FRAMEWORK/DRIVERS/TC + ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS + ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX + ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC + ../src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC + ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG + ../src/SOFTWARE_FRAMEWORK/SERVICES/DELAY + ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART + ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI + ../src/SOFTWARE_FRAMEWORK/DRIVERS/RTC + ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM + ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO + ../src/SOFTWARE_FRAMEWORK/DRIVERS/EIC + ../src/CONFIG + ../src/SOFTWARE_FRAMEWORK/DRIVERS/CPU/CYCLE_COUNTER + ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE + ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR + ../src/SOFTWARE_FRAMEWORK/UTILS + ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC + ../src/SOFTWARE_FRAMEWORK/BOARDS + + + -Wa,-g + + + ../src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA + ../src/SOFTWARE_FRAMEWORK/DRIVERS/TC + ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS + ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX + ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC + ../src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC + ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG + ../src/SOFTWARE_FRAMEWORK/SERVICES/DELAY + ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART + ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI + ../src/SOFTWARE_FRAMEWORK/DRIVERS/RTC + ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM + ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO + ../src/SOFTWARE_FRAMEWORK/DRIVERS/EIC + ../src/CONFIG + ../src/SOFTWARE_FRAMEWORK/DRIVERS/CPU/CYCLE_COUNTER + ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE + ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR + ../src/SOFTWARE_FRAMEWORK/UTILS + ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC + ../src/SOFTWARE_FRAMEWORK/BOARDS + + + + + + + + + True + True + True + True + false + false + + + BOARD=ARDUINO + NO_SYS + _DEBUG_ + _ASSERT_ENABLE_ + WITH_KEY + WITH_WPA + WITH_NO_DMA + DATAFLASH=1 + _INFO_DEBUG_=1 + + + + + ../src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA + ../src/SOFTWARE_FRAMEWORK/DRIVERS/TC + ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS + ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX + ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC + ../src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC + ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG + ../src/SOFTWARE_FRAMEWORK/SERVICES/DELAY + ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART + ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI + ../src/SOFTWARE_FRAMEWORK/DRIVERS/RTC + ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM + ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO + ../src/SOFTWARE_FRAMEWORK/DRIVERS/EIC + ../src/CONFIG + ../src/SOFTWARE_FRAMEWORK/DRIVERS/CPU/CYCLE_COUNTER + ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE + ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR + ../src/SOFTWARE_FRAMEWORK/UTILS + ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC + ../src/SOFTWARE_FRAMEWORK/BOARDS + ../src + ../src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include + ../src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4 + ../src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/include + ../src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD + + + Optimize (-O1) + -fdata-sections -ffunction-sections + true + false + false + false + false + true + true + false + false + false + Maximum (-g3) + false + false + true + false + false + false + false + -c -fmessage-length=0 + false + true + false + false + false + false + + + newlib_addons-at32ucr2-speed_opt + _ucr2_hd_spi_v2.7.0 + _ucr2_hd_wl_sta_intwpa_v2.7.0 + + + + + ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS + ../src/SOFTWARE_FRAMEWORK/BOARDS + ../src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.7.0/UCR2/GCC + + + true + false + false + false + false + true + true + + + ../src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA + ../src/SOFTWARE_FRAMEWORK/DRIVERS/TC + ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS + ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX + ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC + ../src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC + ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG + ../src/SOFTWARE_FRAMEWORK/SERVICES/DELAY + ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART + ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI + ../src/SOFTWARE_FRAMEWORK/DRIVERS/RTC + ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM + ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO + ../src/SOFTWARE_FRAMEWORK/DRIVERS/EIC + ../src/CONFIG + ../src/SOFTWARE_FRAMEWORK/DRIVERS/CPU/CYCLE_COUNTER + ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE + ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR + ../src/SOFTWARE_FRAMEWORK/UTILS + ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC + ../src/SOFTWARE_FRAMEWORK/BOARDS + + + false + Default (-g) + -Wa,-g + + + ../src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA + ../src/SOFTWARE_FRAMEWORK/DRIVERS/TC + ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS + ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX + ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC + ../src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC + ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG + ../src/SOFTWARE_FRAMEWORK/SERVICES/DELAY + ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART + ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI + ../src/SOFTWARE_FRAMEWORK/DRIVERS/RTC + ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM + ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO + ../src/SOFTWARE_FRAMEWORK/DRIVERS/EIC + ../src/CONFIG + ../src/SOFTWARE_FRAMEWORK/DRIVERS/CPU/CYCLE_COUNTER + ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE + ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR + ../src/SOFTWARE_FRAMEWORK/UTILS + ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC + ../src/SOFTWARE_FRAMEWORK/BOARDS + + + false + false + Default (-Wa,-g) + + + + + bin\Debug_512\ + + + True + True + True + True + false + false + + + BOARD=ARDUINO + _APP_DEBUG_ + _DEBUG_ + _ASSERT_ENABLE_ + EXT_BOARD=SPB104 + WITH_KEY + WITH_WPA + WITH_NO_DMA + LWIP_DEBUG + _INFO_DEBUG_=1 + + + + + ../src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA + ../src/SOFTWARE_FRAMEWORK/DRIVERS/TC + ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS + ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX + ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC + ../src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC + ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG + ../src/SOFTWARE_FRAMEWORK/SERVICES/DELAY + ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART + ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI + ../src/SOFTWARE_FRAMEWORK/DRIVERS/RTC + ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM + ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO + ../src/SOFTWARE_FRAMEWORK/DRIVERS/EIC + ../src/CONFIG + ../src/SOFTWARE_FRAMEWORK/DRIVERS/CPU/CYCLE_COUNTER + ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE + ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR + ../src/SOFTWARE_FRAMEWORK/UTILS + ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC + ../src/SOFTWARE_FRAMEWORK/BOARDS + ../src + ../src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include + ../src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4 + ../src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/include + ../src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD + + + Optimize (-O1) + -fdata-sections + true + false + false + false + false + true + false + false + false + false + Maximum (-g3) + false + false + true + false + false + false + false + -c -fmessage-length=0 + false + true + false + false + false + false + + + newlib_addons-at32ucr2-speed_opt + _ucr2_hd_spi_standalone_v2.1.1 + _ucr2_hd_wl_standalone_v2.1.1 + + + + + ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS + ../src/SOFTWARE_FRAMEWORK/BOARDS + ../src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.1.1/UCR2/GCC + + + true + false + false + false + false + true + true + + + ../src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA + ../src/SOFTWARE_FRAMEWORK/DRIVERS/TC + ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS + ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX + ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC + ../src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC + ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG + ../src/SOFTWARE_FRAMEWORK/SERVICES/DELAY + ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART + ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI + ../src/SOFTWARE_FRAMEWORK/DRIVERS/RTC + ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM + ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO + ../src/SOFTWARE_FRAMEWORK/DRIVERS/EIC + ../src/CONFIG + ../src/SOFTWARE_FRAMEWORK/DRIVERS/CPU/CYCLE_COUNTER + ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE + ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR + ../src/SOFTWARE_FRAMEWORK/UTILS + ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC + ../src/SOFTWARE_FRAMEWORK/BOARDS + + + false + Default (-g) + -Wa,-g + + + ../src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA + ../src/SOFTWARE_FRAMEWORK/DRIVERS/TC + ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS + ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX + ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC + ../src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC + ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG + ../src/SOFTWARE_FRAMEWORK/SERVICES/DELAY + ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART + ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI + ../src/SOFTWARE_FRAMEWORK/DRIVERS/RTC + ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM + ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO + ../src/SOFTWARE_FRAMEWORK/DRIVERS/EIC + ../src/CONFIG + ../src/SOFTWARE_FRAMEWORK/DRIVERS/CPU/CYCLE_COUNTER + ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE + ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR + ../src/SOFTWARE_FRAMEWORK/UTILS + ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC + ../src/SOFTWARE_FRAMEWORK/BOARDS + + + false + false + Default (-Wa,-g) + + + + + bin\Release_512\ + + + True + True + True + True + false + false + + + BOARD=ARDUINO + _ASSERT_ENABLE_ + EXT_BOARD=SPB104 + WITH_KEY + WITH_WPA + WITH_NO_DMA + LWIP_DEBUG + _INFO_DEBUG_=1 + + + + + ../src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA + ../src/SOFTWARE_FRAMEWORK/DRIVERS/TC + ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS + ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX + ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC + ../src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC + ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG + ../src/SOFTWARE_FRAMEWORK/SERVICES/DELAY + ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART + ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI + ../src/SOFTWARE_FRAMEWORK/DRIVERS/RTC + ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM + ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO + ../src/SOFTWARE_FRAMEWORK/DRIVERS/EIC + ../src/CONFIG + ../src/SOFTWARE_FRAMEWORK/DRIVERS/CPU/CYCLE_COUNTER + ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE + ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR + ../src/SOFTWARE_FRAMEWORK/UTILS + ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC + ../src/SOFTWARE_FRAMEWORK/BOARDS + ../src + ../src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include + ../src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-1.3.2/src/include/ipv4 + ../src/SOFTWARE_FRAMEWORK/SERVICES/LWIP/lwip-port-1.3.2/HD/if/include + ../src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD + + + -fdata-sections + true + false + false + false + false + true + false + false + false + false + false + false + true + false + false + false + false + -c -fmessage-length=0 + false + true + false + false + false + false + + + newlib_addons-at32ucr2-speed_opt + _ucr2_hd_spi_standalone_v2.1.1 + _ucr2_hd_wl_standalone_v2.1.1 + + + + + ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS + ../src/SOFTWARE_FRAMEWORK/BOARDS + ../src/SOFTWARE_FRAMEWORK/COMPONENTS/WIFI/HD/v2.1.1/UCR2/GCC + + + true + false + false + false + false + true + true + + + ../src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA + ../src/SOFTWARE_FRAMEWORK/DRIVERS/TC + ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS + ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX + ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC + ../src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC + ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG + ../src/SOFTWARE_FRAMEWORK/SERVICES/DELAY + ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART + ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI + ../src/SOFTWARE_FRAMEWORK/DRIVERS/RTC + ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM + ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO + ../src/SOFTWARE_FRAMEWORK/DRIVERS/EIC + ../src/CONFIG + ../src/SOFTWARE_FRAMEWORK/DRIVERS/CPU/CYCLE_COUNTER + ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE + ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR + ../src/SOFTWARE_FRAMEWORK/UTILS + ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC + ../src/SOFTWARE_FRAMEWORK/BOARDS + + + false + -Wa,-g + + + ../src/SOFTWARE_FRAMEWORK/DRIVERS/PDCA + ../src/SOFTWARE_FRAMEWORK/DRIVERS/TC + ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS + ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX + ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC + ../src/SOFTWARE_FRAMEWORK/DRIVERS/EBI/SMC + ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG + ../src/SOFTWARE_FRAMEWORK/SERVICES/DELAY + ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART + ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI + ../src/SOFTWARE_FRAMEWORK/DRIVERS/RTC + ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM + ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO + ../src/SOFTWARE_FRAMEWORK/DRIVERS/EIC + ../src/CONFIG + ../src/SOFTWARE_FRAMEWORK/DRIVERS/CPU/CYCLE_COUNTER + ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE + ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR + ../src/SOFTWARE_FRAMEWORK/UTILS + ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC + ../src/SOFTWARE_FRAMEWORK/BOARDS + + + false + false + + + + + + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + + compile + + + compile + + + + + compile + + + + compile + + + compile + + + + compile + + + compile + + + compile + + + + + + + + + compile + + + compile + + + compile + + + compile + + + compile + + + + compile + + + compile + + + compile + + + + + compile + + + compile + + + compile + + + + + compile + + + compile + + + compile + + + + + + compile + + + + + compile + + + compile + + + + compile + + + compile + + + + compile + + + compile + + + + compile + + + compile + + + compile + + + + compile + + + compile + + + + compile + + + compile + + + compile + + + compile + + + compile + + + + compile + + + compile + + + + compile + + + compile + + + + compile + + + compile + + + + compile + + + compile + + + + + compile + + + compile + + + + + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + + compile + + + compile + + + compile + + + compile + + + + compile + + + compile + + + + + compile + + + + + compile + + + + compile + + + compile + + + + compile + + + + compile + + + + + compile + + + compile + + + + compile + + + compile + + + compile + + + + compile + + + compile + + + compile + + + compile + + + + + compile + + + + compile + + + compile + + + compile + + + compile + + + compile + + + + + + + compile + + + + + compile + + + + compile + + + compile + + + compile + + + compile + + + + + compile + + + \ No newline at end of file diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/.cproject b/firmware/libraries/WiFi/extras/wifi_dnld/.cproject new file mode 100644 index 0000000..286dad7 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/.cproject @@ -0,0 +1,1281 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/.project b/firmware/libraries/WiFi/extras/wifi_dnld/.project new file mode 100644 index 0000000..aa3047b --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/.project @@ -0,0 +1,70 @@ + + + wifi_dnld + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + ?name? + + + + org.eclipse.cdt.make.core.append_environment + true + + + org.eclipse.cdt.make.core.buildArguments + + + + org.eclipse.cdt.make.core.buildCommand + make + + + org.eclipse.cdt.make.core.buildLocation + ${workspace_loc:/wifi_dnld/Debug} + + + org.eclipse.cdt.make.core.contents + org.eclipse.cdt.make.core.activeConfigSettings + + + org.eclipse.cdt.make.core.enableAutoBuild + false + + + org.eclipse.cdt.make.core.enableCleanBuild + true + + + org.eclipse.cdt.make.core.enableFullBuild + true + + + org.eclipse.cdt.make.core.stopOnError + true + + + org.eclipse.cdt.make.core.useDefaultBuildCmd + true + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + + + + + + com.atmel.avr32.core.nature + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/Release/wifi_dnld.elf b/firmware/libraries/WiFi/extras/wifi_dnld/Release/wifi_dnld.elf new file mode 100644 index 0000000..11ec3dd Binary files /dev/null and b/firmware/libraries/WiFi/extras/wifi_dnld/Release/wifi_dnld.elf differ diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/CONFIG/conf_access.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/CONFIG/conf_access.h new file mode 100644 index 0000000..23e9b34 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/CONFIG/conf_access.h @@ -0,0 +1,170 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Memory access control configuration file. + * + * This file contains the possible external configuration of the memory access + * control. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _CONF_ACCESS_H_ +#define _CONF_ACCESS_H_ + +#include "compiler.h" +#include "board.h" + + +/*! \name Activation of Logical Unit Numbers + */ +//! @{ +#define LUN_0 DISABLE //!< On-Chip Virtual Memory. +#define LUN_1 ENABLE //!< AT45DBX Data Flash. +#define LUN_2 DISABLE //!< SD/MMC Card over SPI. +#define LUN_3 DISABLE +#define LUN_4 DISABLE +#define LUN_5 DISABLE +#define LUN_6 DISABLE +#define LUN_7 DISABLE +#define LUN_USB DISABLE //!< Host Mass-Storage Memory. +//! @} + +/*! \name LUN 0 Definitions + */ +//! @{ +#define VIRTUAL_MEM LUN_0 +#define LUN_ID_VIRTUAL_MEM LUN_ID_0 +#define LUN_0_INCLUDE "virtual_mem.h" +#define Lun_0_test_unit_ready virtual_test_unit_ready +#define Lun_0_read_capacity virtual_read_capacity +#define Lun_0_wr_protect virtual_wr_protect +#define Lun_0_removal virtual_removal +#define Lun_0_usb_read_10 virtual_usb_read_10 +#define Lun_0_usb_write_10 virtual_usb_write_10 +#define Lun_0_mem_2_ram virtual_mem_2_ram +#define Lun_0_ram_2_mem virtual_ram_2_mem +#define LUN_0_NAME "\"On-Chip Virtual Memory\"" +//! @} + +/*! \name LUN 1 Definitions + */ +//! @{ +#define AT45DBX_MEM LUN_1 +#define LUN_ID_AT45DBX_MEM LUN_ID_1 +#define LUN_1_INCLUDE "at45dbx_mem.h" +#define Lun_1_test_unit_ready at45dbx_test_unit_ready +#define Lun_1_read_capacity at45dbx_read_capacity +#define Lun_1_wr_protect at45dbx_wr_protect +#define Lun_1_removal at45dbx_removal +#define Lun_1_usb_read_10 at45dbx_usb_read_10 +#define Lun_1_usb_write_10 at45dbx_usb_write_10 +#define Lun_1_mem_2_ram at45dbx_df_2_ram +#define Lun_1_ram_2_mem at45dbx_ram_2_df +#define LUN_1_NAME "\"AT45DBX Data Flash\"" +//! @} + +/*! \name LUN 2 Definitions + */ +//! @{ +#define SD_MMC_SPI_MEM LUN_2 +#define LUN_ID_SD_MMC_SPI_MEM LUN_ID_2 +#define LUN_2_INCLUDE "sd_mmc_spi_mem.h" +#define Lun_2_test_unit_ready sd_mmc_spi_test_unit_ready +#define Lun_2_read_capacity sd_mmc_spi_read_capacity +#define Lun_2_wr_protect sd_mmc_spi_wr_protect +#define Lun_2_removal sd_mmc_spi_removal +#define Lun_2_usb_read_10 sd_mmc_spi_usb_read_10 +#define Lun_2_usb_write_10 sd_mmc_spi_usb_write_10 +#define Lun_2_mem_2_ram sd_mmc_spi_mem_2_ram +#define Lun_2_ram_2_mem sd_mmc_spi_ram_2_mem +#define LUN_2_NAME "\"SD/MMC Card over SPI\"" +//! @} + +/*! \name USB LUNs Definitions + */ +//! @{ +#define MEM_USB LUN_USB +#define LUN_ID_MEM_USB LUN_ID_USB +#define LUN_USB_INCLUDE "host_mem.h" +#define Lun_usb_test_unit_ready(lun) host_test_unit_ready(lun) +#define Lun_usb_read_capacity(lun, nb_sect) host_read_capacity(lun, nb_sect) +#define Lun_usb_read_sector_size(lun) host_read_sector_size(lun) +#define Lun_usb_wr_protect(lun) host_wr_protect(lun) +#define Lun_usb_removal() host_removal() +#define Lun_usb_mem_2_ram(addr, ram) host_read_10_ram(addr, ram) +#define Lun_usb_ram_2_mem(addr, ram) host_write_10_ram(addr, ram) +#define LUN_USB_NAME "\"Host Mass-Storage Memory\"" +//! @} + +/*! \name Actions Associated with Memory Accesses + * + * Write here the action to associate with each memory access. + * + * \warning Be careful not to waste time in order not to disturb the functions. + */ +//! @{ +#define memory_start_read_action(nb_sectors) +#define memory_stop_read_action() +#define memory_start_write_action(nb_sectors) +#define memory_stop_write_action() +//! @} + +/*! \name Activation of Interface Features + */ +//! @{ +#define ACCESS_USB DISABLED //!< MEM <-> USB interface. +#define ACCESS_MEM_TO_RAM ENABLED //!< MEM <-> RAM interface. +#define ACCESS_STREAM DISABLED //!< Streaming MEM <-> MEM interface. +#define ACCESS_STREAM_RECORD DISABLED //!< Streaming MEM <-> MEM interface in record mode. +#define ACCESS_MEM_TO_MEM DISABLED //!< MEM <-> MEM interface. +#define ACCESS_CODEC DISABLED //!< Codec interface. +//! @} + +/*! \name Specific Options for Access Control + */ +//! @{ +#define GLOBAL_WR_PROTECT DISABLED //!< Management of a global write protection. +//! @} + + +#endif // _CONF_ACCESS_H_ diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/CONFIG/conf_at45dbx.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/CONFIG/conf_at45dbx.h new file mode 100644 index 0000000..3280e4f --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/CONFIG/conf_at45dbx.h @@ -0,0 +1,83 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief AT45DBX configuration file. + * + * This file contains the possible external configuration of the AT45DBX. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with an SPI module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _CONF_AT45DBX_H_ +#define _CONF_AT45DBX_H_ + + +#include "conf_access.h" + +#if AT45DBX_MEM == DISABLE + #error conf_at45dbx.h is #included although AT45DBX_MEM is disabled +#endif + + +#include "at45dbx.h" + + +//_____ D E F I N I T I O N S ______________________________________________ + +//! Size of AT45DBX data flash memories to manage. +#define AT45DBX_MEM_SIZE AT45DBX_1MB + +//! Number of AT45DBX components to manage. +#define AT45DBX_MEM_CNT 1 + +//! First chip select used by AT45DBX components on the SPI module instance. +//! AT45DBX_SPI_NPCS0_PIN always corresponds to this first NPCS, whatever it is. +#define AT45DBX_SPI_FIRST_NPCS AT45DBX_SPI_NPCS + +//! SPI master speed in Hz. +#define AT45DBX_SPI_MASTER_SPEED 12000000 + +//! Number of bits in each SPI transfer. +#define AT45DBX_SPI_BITS 8 + + +#endif // _CONF_AT45DBX_H_ diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/Doc/SPB104 product brief.pdf b/firmware/libraries/WiFi/extras/wifi_dnld/src/Doc/SPB104 product brief.pdf new file mode 100644 index 0000000..8705cb1 Binary files /dev/null and b/firmware/libraries/WiFi/extras/wifi_dnld/src/Doc/SPB104 product brief.pdf differ diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/Doc/gettingstarted.pdf b/firmware/libraries/WiFi/extras/wifi_dnld/src/Doc/gettingstarted.pdf new file mode 100644 index 0000000..7c37693 Binary files /dev/null and b/firmware/libraries/WiFi/extras/wifi_dnld/src/Doc/gettingstarted.pdf differ diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/ASM/trampoline.x b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/ASM/trampoline.x new file mode 100644 index 0000000..c127121 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/ASM/trampoline.x @@ -0,0 +1,74 @@ +/* This file is part of the ATMEL AVR32-SoftwareFramework-AT32UC3A-1.4.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief AVR32 UC3 ISP trampoline. + * + * In order to be able to program a project with both BatchISP and JTAGICE mkII + * without having to take the general-purpose fuses into consideration, add this + * file to the project and change the program entry point to _trampoline. + * + * The pre-programmed ISP will be erased if JTAGICE mkII is used. + * + * - Compiler: GNU GCC for AVR32 + * - Supported devices: All AVR32UC devices can be used. + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (C) 2006-2008, Atmel Corporation All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of ATMEL may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#include "conf_isp.h" + + +//! @{ +//! \verbatim + + + // This must be linked @ 0x80000000 if it is to be run upon reset. + .section .reset, "ax", @progbits + + + .global _trampoline + .type _trampoline, @function +_trampoline: + // Jump to program start. + rjmp program_start + + .org PROGRAM_START_OFFSET +program_start: + // Jump to the C runtime startup routine. + lda.w pc, _stext + + +//! \endverbatim +//! @} diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/arduino.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/arduino.h new file mode 100644 index 0000000..fbdd466 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/arduino.h @@ -0,0 +1,234 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief AT32UC3A EVK1100 board header file. + * + * This file contains definitions and services related to the features of the + * EVK1100 board rev. B and C. + * + * To use this board, define BOARD=EVK1100. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 AT32UC3A devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _ARDUINO_H_ +#define _ARDUINO_H_ + +#include "compiler.h" + +#ifdef __AVR32_ABI_COMPILER__ // Automatically defined when compiling for AVR32, not when assembling. +# include "led.h" +#endif // __AVR32_ABI_COMPILER__ + + +/*! \name Oscillator Definitions + */ +//! @{ + +// RCOsc has no custom calibration by default. Set the following definition to +// the appropriate value if a custom RCOsc calibration has been applied to your +// part. +//#define FRCOSC AVR32_PM_RCOSC_FREQUENCY //!< RCOsc frequency: Hz. + +#define FOSC32 32768 //!< Osc32 frequency: Hz. +#define OSC32_STARTUP AVR32_PM_OSCCTRL32_STARTUP_8192_RCOSC //!< Osc32 startup time: RCOsc periods. + +#define FOSC0 12000000 //!< Osc0 frequency: Hz. +#define OSC0_STARTUP AVR32_PM_OSCCTRL0_STARTUP_2048_RCOSC //!< Osc0 startup time: RCOsc periods. + +// Osc1 crystal is not mounted by default. Set the following definitions to the +// appropriate values if a custom Osc1 crystal is mounted on your board. +//#define FOSC1 12000000 //!< Osc1 frequency: Hz. +//#define OSC1_STARTUP AVR32_PM_OSCCTRL1_STARTUP_2048_RCOSC //!< Osc1 startup time: RCOsc periods. + +//! @} + + +//! Number of LEDs. +#define LED_COUNT 3 + +/*! \name GPIO Connections of LEDs + */ +//! @{ +#define LED0_GPIO AVR32_PIN_PB19 +#define LED1_GPIO AVR32_PIN_PB20 +#define LED2_GPIO AVR32_PIN_PB21 +//! @} + +/*! \name PWM Channels of LEDs + */ +//! @{ +#define LED0_PWM 0 +#define LED1_PWM 1 +#define LED2_PWM 2 +//! @} + +/*! \name PWM Functions of LEDs + */ +//! @{ +#define LED0_PWM_FUNCTION AVR32_PWM_0_FUNCTION +#define LED1_PWM_FUNCTION AVR32_PWM_1_FUNCTION +#define LED2_PWM_FUNCTION AVR32_PWM_2_FUNCTION +//! @} + +/*! \name Color Identifiers of LEDs to Use with LED Functions + */ +//! @{ +#define LED_MONO0_GREEN LED0 +#define LED_MONO1_GREEN LED1 +#define LED_MONO2_GREEN LED2 +//! @} + +#if 0 +/*! \name SPI Connections of the DIP204 LCD + */ +//! @{ +#define DIP204_SPI (&AVR32_SPI1) +#define DIP204_SPI_NPCS 2 +#define DIP204_SPI_SCK_PIN AVR32_SPI1_SCK_0_0_PIN +#define DIP204_SPI_SCK_FUNCTION AVR32_SPI1_SCK_0_0_FUNCTION +#define DIP204_SPI_MISO_PIN AVR32_SPI1_MISO_0_0_PIN +#define DIP204_SPI_MISO_FUNCTION AVR32_SPI1_MISO_0_0_FUNCTION +#define DIP204_SPI_MOSI_PIN AVR32_SPI1_MOSI_0_0_PIN +#define DIP204_SPI_MOSI_FUNCTION AVR32_SPI1_MOSI_0_0_FUNCTION +#define DIP204_SPI_NPCS_PIN AVR32_SPI1_NPCS_2_0_PIN +#define DIP204_SPI_NPCS_FUNCTION AVR32_SPI1_NPCS_2_0_FUNCTION +//! @} + +/*! \name GPIO and PWM Connections of the DIP204 LCD Backlight + */ +//! @{ +#define DIP204_BACKLIGHT_PIN AVR32_PIN_PB18 +#define DIP204_PWM_CHANNEL 6 +#define DIP204_PWM_PIN AVR32_PWM_6_PIN +#define DIP204_PWM_FUNCTION AVR32_PWM_6_FUNCTION +//! @} +#endif + +/*! \name SPI Connections of the AT45DBX Data Flash Memory + */ +//! @{ +#define AT45DBX_SPI (&AVR32_SPI1) +#define AT45DBX_SPI_NPCS 2 +#define AT45DBX_SPI_SCK_PIN AVR32_SPI1_SCK_0_0_PIN +#define AT45DBX_SPI_SCK_FUNCTION AVR32_SPI1_SCK_0_0_FUNCTION +#define AT45DBX_SPI_MISO_PIN AVR32_SPI1_MISO_0_0_PIN +#define AT45DBX_SPI_MISO_FUNCTION AVR32_SPI1_MISO_0_0_FUNCTION +#define AT45DBX_SPI_MOSI_PIN AVR32_SPI1_MOSI_0_0_PIN +#define AT45DBX_SPI_MOSI_FUNCTION AVR32_SPI1_MOSI_0_0_FUNCTION +#define AT45DBX_SPI_NPCS2_PIN AVR32_SPI1_NPCS_2_0_PIN +#define AT45DBX_SPI_NPCS2_FUNCTION AVR32_SPI1_NPCS_2_0_FUNCTION +#define AT45DBX_CHIP_RESET AVR32_PIN_PA02 +//! @} + + +/*! \name GPIO and SPI Connections of the SD/MMC Connector + */ +//! @{ +//#define SD_MMC_CARD_DETECT_PIN AVR32_PIN_PA02 +//#define SD_MMC_WRITE_PROTECT_PIN AVR32_PIN_PA07 +#define SD_MMC_SPI (&AVR32_SPI1) +#define SD_MMC_SPI_NPCS 1 +#define SD_MMC_SPI_SCK_PIN AVR32_SPI1_SCK_0_0_PIN +#define SD_MMC_SPI_SCK_FUNCTION AVR32_SPI1_SCK_0_0_FUNCTION +#define SD_MMC_SPI_MISO_PIN AVR32_SPI1_MISO_0_0_PIN +#define SD_MMC_SPI_MISO_FUNCTION AVR32_SPI1_MISO_0_0_FUNCTION +#define SD_MMC_SPI_MOSI_PIN AVR32_SPI1_MOSI_0_0_PIN +#define SD_MMC_SPI_MOSI_FUNCTION AVR32_SPI1_MOSI_0_0_FUNCTION +#define SD_MMC_SPI_NPCS_PIN AVR32_SPI1_NPCS_1_0_PIN +#define SD_MMC_SPI_NPCS_FUNCTION AVR32_SPI1_NPCS_1_0_FUNCTION +//! @} + +/* Timer Counter to generate clock for WiFi chip*/ +# define WIFI_TC (&AVR32_TC) +# define WIFI_TC_CHANNEL_ID 0 +# define WIFI_TC_CHANNEL_PIN AVR32_TC_A0_0_0_PIN +# define WIFI_TC_CHANNEL_FUNCTION AVR32_TC_A0_0_0_FUNCTION +// Note that TC_A0_0_0 pin is pin 6 (PB23) on AT32UC3A1512 QFP100. + +/* Pin related to WiFi chip communication */ +#ifndef USE_POLL + #define USE_POLL +#endif + #define SPI_CS 0 + #define AVR32_SPI AVR32_SPI1 + #define GPIO_IRQ_PIN AVR32_PIN_PA03 + #define GPIO_IRQ AVR32_GPIO_IRQ_7 + #define GPIO_W_RESET_PIN AVR32_PIN_PA07 + #define GPIO_W_SHUTDOWN_PIN AVR32_PIN_PA09 + +/* Pin related to shield communication */ + #define ARDUINO_HANDSHAKE_PIN AVR32_PIN_PA25 + + #define AVR32_PDCA_PID_TX AVR32_PDCA_PID_SPI1_TX + #define AVR32_PDCA_PID_RX AVR32_PDCA_PID_SPI1_RX + + +#if 0 +/*! \name TWI Connections of the Spare TWI Connector + */ +//! @{ +#define SPARE_TWI (&AVR32_TWI) +#define SPARE_TWI_SCL_PIN AVR32_TWI_SCL_0_0_PIN +#define SPARE_TWI_SCL_FUNCTION AVR32_TWI_SCL_0_0_FUNCTION +#define SPARE_TWI_SDA_PIN AVR32_TWI_SDA_0_0_PIN +#define SPARE_TWI_SDA_FUNCTION AVR32_TWI_SDA_0_0_FUNCTION +//! @} + + +/*! \name SPI Connections of the Spare SPI Connector + */ +//! @{ +#define SPARE_SPI (&AVR32_SPI0) +#define SPARE_SPI_NPCS 0 +#define SPARE_SPI_SCK_PIN AVR32_SPI0_SCK_0_0_PIN +#define SPARE_SPI_SCK_FUNCTION AVR32_SPI0_SCK_0_0_FUNCTION +#define SPARE_SPI_MISO_PIN AVR32_SPI0_MISO_0_0_PIN +#define SPARE_SPI_MISO_FUNCTION AVR32_SPI0_MISO_0_0_FUNCTION +#define SPARE_SPI_MOSI_PIN AVR32_SPI0_MOSI_0_0_PIN +#define SPARE_SPI_MOSI_FUNCTION AVR32_SPI0_MOSI_0_0_FUNCTION +#define SPARE_SPI_NPCS_PIN AVR32_SPI0_NPCS_0_0_PIN +#define SPARE_SPI_NPCS_FUNCTION AVR32_SPI0_NPCS_0_0_FUNCTION +//! @} +#endif + +#endif // _ARDUINO_H_ diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/led.c b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/led.c new file mode 100644 index 0000000..d7cd439 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/led.c @@ -0,0 +1,346 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief AT32UC3A EVK1100 board LEDs support package. + * + * This file contains definitions and services related to the LED features of + * the EVK1100 board. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 AT32UC3A devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#include +#include "preprocessor.h" +#include "compiler.h" +#include "arduino.h" +#include "led.h" + + +//! Structure describing LED hardware connections. +typedef const struct +{ + struct + { + U32 PORT; //!< LED GPIO port. + U32 PIN_MASK; //!< Bit-mask of LED pin in GPIO port. + } GPIO; //!< LED GPIO descriptor. + struct + { + S32 CHANNEL; //!< LED PWM channel (< 0 if N/A). + S32 FUNCTION; //!< LED pin PWM function (< 0 if N/A). + } PWM; //!< LED PWM descriptor. +} tLED_DESCRIPTOR; + + +//! Hardware descriptors of all LEDs. +static tLED_DESCRIPTOR LED_DESCRIPTOR[LED_COUNT] = +{ +#define INSERT_LED_DESCRIPTOR(LED_NO, unused) \ + { \ + {LED##LED_NO##_GPIO / 32, 1 << (LED##LED_NO##_GPIO % 32)},\ + {LED##LED_NO##_PWM, LED##LED_NO##_PWM_FUNCTION } \ + }, + MREPEAT(LED_COUNT, INSERT_LED_DESCRIPTOR, ~) +#undef INSERT_LED_DESCRIPTOR +}; + + +//! Saved state of all LEDs. +static volatile U32 LED_State = (1 << LED_COUNT) - 1; + + +U32 LED_Read_Display(void) +{ + return LED_State; +} + + +void LED_Display(U32 leds) +{ + // Use the LED descriptors to get the connections of a given LED to the MCU. + tLED_DESCRIPTOR *led_descriptor; + volatile avr32_gpio_port_t *led_gpio_port; + + // Make sure only existing LEDs are specified. + leds &= (1 << LED_COUNT) - 1; + + // Update the saved state of all LEDs with the requested changes. + LED_State = leds; + + // For all LEDs... + for (led_descriptor = &LED_DESCRIPTOR[0]; + led_descriptor < LED_DESCRIPTOR + LED_COUNT; + led_descriptor++) + { + // Set the LED to the requested state. + led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; + if (leds & 1) + { + led_gpio_port->ovrc = led_descriptor->GPIO.PIN_MASK; + } + else + { + led_gpio_port->ovrs = led_descriptor->GPIO.PIN_MASK; + } + led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; + led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; + leds >>= 1; + } +} + + +U32 LED_Read_Display_Mask(U32 mask) +{ + return Rd_bits(LED_State, mask); +} + + +void LED_Display_Mask(U32 mask, U32 leds) +{ + // Use the LED descriptors to get the connections of a given LED to the MCU. + tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; + volatile avr32_gpio_port_t *led_gpio_port; + U8 led_shift; + + // Make sure only existing LEDs are specified. + mask &= (1 << LED_COUNT) - 1; + + // Update the saved state of all LEDs with the requested changes. + Wr_bits(LED_State, mask, leds); + + // While there are specified LEDs left to manage... + while (mask) + { + // Select the next specified LED and set it to the requested state. + led_shift = 1 + ctz(mask); + led_descriptor += led_shift; + led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; + leds >>= led_shift - 1; + if (leds & 1) + { + led_gpio_port->ovrc = led_descriptor->GPIO.PIN_MASK; + } + else + { + led_gpio_port->ovrs = led_descriptor->GPIO.PIN_MASK; + } + led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; + led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; + leds >>= 1; + mask >>= led_shift; + } +} + + +Bool LED_Test(U32 leds) +{ + return Tst_bits(LED_State, leds); +} + + +void LED_Off(U32 leds) +{ + // Use the LED descriptors to get the connections of a given LED to the MCU. + tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; + volatile avr32_gpio_port_t *led_gpio_port; + U8 led_shift; + + // Make sure only existing LEDs are specified. + leds &= (1 << LED_COUNT) - 1; + + // Update the saved state of all LEDs with the requested changes. + Clr_bits(LED_State, leds); + + // While there are specified LEDs left to manage... + while (leds) + { + // Select the next specified LED and turn it off. + led_shift = 1 + ctz(leds); + led_descriptor += led_shift; + led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; + led_gpio_port->ovrs = led_descriptor->GPIO.PIN_MASK; + led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; + led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; + leds >>= led_shift; + } +} + + +void LED_On(U32 leds) +{ + // Use the LED descriptors to get the connections of a given LED to the MCU. + tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; + volatile avr32_gpio_port_t *led_gpio_port; + U8 led_shift; + + // Make sure only existing LEDs are specified. + leds &= (1 << LED_COUNT) - 1; + + // Update the saved state of all LEDs with the requested changes. + Set_bits(LED_State, leds); + + // While there are specified LEDs left to manage... + while (leds) + { + // Select the next specified LED and turn it on. + led_shift = 1 + ctz(leds); + led_descriptor += led_shift; + led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; + led_gpio_port->ovrc = led_descriptor->GPIO.PIN_MASK; + led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; + led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; + leds >>= led_shift; + } +} + + +void LED_Toggle(U32 leds) +{ + // Use the LED descriptors to get the connections of a given LED to the MCU. + tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; + volatile avr32_gpio_port_t *led_gpio_port; + U8 led_shift; + + // Make sure only existing LEDs are specified. + leds &= (1 << LED_COUNT) - 1; + + // Update the saved state of all LEDs with the requested changes. + Tgl_bits(LED_State, leds); + + // While there are specified LEDs left to manage... + while (leds) + { + // Select the next specified LED and toggle it. + led_shift = 1 + ctz(leds); + led_descriptor += led_shift; + led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; + led_gpio_port->ovrt = led_descriptor->GPIO.PIN_MASK; + led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; + led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; + leds >>= led_shift; + } +} + + +U32 LED_Read_Display_Field(U32 field) +{ + return Rd_bitfield(LED_State, field); +} + + +void LED_Display_Field(U32 field, U32 leds) +{ + // Move the bit-field to the appropriate position for the bit-mask. + LED_Display_Mask(field, leds << ctz(field)); +} + + +U8 LED_Get_Intensity(U32 led) +{ + tLED_DESCRIPTOR *led_descriptor; + + // Check that the argument value is valid. + led = ctz(led); + led_descriptor = &LED_DESCRIPTOR[led]; + if (led >= LED_COUNT || led_descriptor->PWM.CHANNEL < 0) return 0; + + // Return the duty cycle value if the LED PWM channel is enabled, else 0. + return (AVR32_PWM.sr & (1 << led_descriptor->PWM.CHANNEL)) ? + AVR32_PWM.channel[led_descriptor->PWM.CHANNEL].cdty : 0; +} + + +void LED_Set_Intensity(U32 leds, U8 intensity) +{ + tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; + volatile avr32_pwm_channel_t *led_pwm_channel; + volatile avr32_gpio_port_t *led_gpio_port; + U8 led_shift; + + // For each specified LED... + for (leds &= (1 << LED_COUNT) - 1; leds; leds >>= led_shift) + { + // Select the next specified LED and check that it has a PWM channel. + led_shift = 1 + ctz(leds); + led_descriptor += led_shift; + if (led_descriptor->PWM.CHANNEL < 0) continue; + + // Initialize or update the LED PWM channel. + led_pwm_channel = &AVR32_PWM.channel[led_descriptor->PWM.CHANNEL]; + if (!(AVR32_PWM.sr & (1 << led_descriptor->PWM.CHANNEL))) + { + led_pwm_channel->cmr = (AVR32_PWM_CPRE_MCK << AVR32_PWM_CPRE_OFFSET) & + ~(AVR32_PWM_CALG_MASK | + AVR32_PWM_CPOL_MASK | + AVR32_PWM_CPD_MASK); + led_pwm_channel->cprd = 0x000000FF; + led_pwm_channel->cdty = intensity; + AVR32_PWM.ena = 1 << led_descriptor->PWM.CHANNEL; + } + else + { + AVR32_PWM.isr; + while (!(AVR32_PWM.isr & (1 << led_descriptor->PWM.CHANNEL))); + led_pwm_channel->cupd = intensity; + } + + // Switch the LED pin to its PWM function. + led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; + if (led_descriptor->PWM.FUNCTION & 0x1) + { + led_gpio_port->pmr0s = led_descriptor->GPIO.PIN_MASK; + } + else + { + led_gpio_port->pmr0c = led_descriptor->GPIO.PIN_MASK; + } + if (led_descriptor->PWM.FUNCTION & 0x2) + { + led_gpio_port->pmr1s = led_descriptor->GPIO.PIN_MASK; + } + else + { + led_gpio_port->pmr1c = led_descriptor->GPIO.PIN_MASK; + } + led_gpio_port->gperc = led_descriptor->GPIO.PIN_MASK; + } +} diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/led.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/led.h new file mode 100644 index 0000000..a577124 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/ARDUINO/led.h @@ -0,0 +1,191 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief AT32UC3A EVK1100 board LEDs support package. + * + * This file contains definitions and services related to the LED features of + * the EVK1100 board. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 AT32UC3A devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _LED_H_ +#define _LED_H_ + +#include "compiler.h" + + +/*! \name Identifiers of LEDs to Use with LED Functions + */ +//! @{ +#define LED0 0x01 +#define LED1 0x02 +#define LED2 0x04 +#define LED3 0x08 +#define LED4 0x10 +#define LED5 0x20 +#define LED6 0x40 +#define LED7 0x80 +//! @} + + +/*! \brief Gets the last state of all LEDs set through the LED API. + * + * \return State of all LEDs (1 bit per LED). + * + * \note The GPIO pin configuration of all LEDs is left unchanged. + */ +extern U32 LED_Read_Display(void); + +/*! \brief Sets the state of all LEDs. + * + * \param leds New state of all LEDs (1 bit per LED). + * + * \note The pins of all LEDs are set to GPIO output mode. + */ +extern void LED_Display(U32 leds); + +/*! \brief Gets the last state of the specified LEDs set through the LED API. + * + * \param mask LEDs of which to get the state (1 bit per LED). + * + * \return State of the specified LEDs (1 bit per LED). + * + * \note The GPIO pin configuration of all LEDs is left unchanged. + */ +extern U32 LED_Read_Display_Mask(U32 mask); + +/*! \brief Sets the state of the specified LEDs. + * + * \param mask LEDs of which to set the state (1 bit per LED). + * + * \param leds New state of the specified LEDs (1 bit per LED). + * + * \note The pins of the specified LEDs are set to GPIO output mode. + */ +extern void LED_Display_Mask(U32 mask, U32 leds); + +/*! \brief Tests the last state of the specified LEDs set through the LED API. + * + * \param leds LEDs of which to test the state (1 bit per LED). + * + * \return \c TRUE if at least one of the specified LEDs has a state on, else + * \c FALSE. + * + * \note The GPIO pin configuration of all LEDs is left unchanged. + */ +extern Bool LED_Test(U32 leds); + +/*! \brief Turns off the specified LEDs. + * + * \param leds LEDs to turn off (1 bit per LED). + * + * \note The pins of the specified LEDs are set to GPIO output mode. + */ +extern void LED_Off(U32 leds); + +/*! \brief Turns on the specified LEDs. + * + * \param leds LEDs to turn on (1 bit per LED). + * + * \note The pins of the specified LEDs are set to GPIO output mode. + */ +extern void LED_On(U32 leds); + +/*! \brief Toggles the specified LEDs. + * + * \param leds LEDs to toggle (1 bit per LED). + * + * \note The pins of the specified LEDs are set to GPIO output mode. + */ +extern void LED_Toggle(U32 leds); + +/*! \brief Gets as a bit-field the last state of the specified LEDs set through + * the LED API. + * + * \param field LEDs of which to get the state (1 bit per LED). + * + * \return State of the specified LEDs (1 bit per LED, beginning with the first + * specified LED). + * + * \note The GPIO pin configuration of all LEDs is left unchanged. + */ +extern U32 LED_Read_Display_Field(U32 field); + +/*! \brief Sets as a bit-field the state of the specified LEDs. + * + * \param field LEDs of which to set the state (1 bit per LED). + * \param leds New state of the specified LEDs (1 bit per LED, beginning with + * the first specified LED). + * + * \note The pins of the specified LEDs are set to GPIO output mode. + */ +extern void LED_Display_Field(U32 field, U32 leds); + +/*! \brief Gets the intensity of the specified LED. + * + * \param led LED of which to get the intensity (1 bit per LED; only the least + * significant set bit is used). + * + * \return Intensity of the specified LED (0x00 to 0xFF). + * + * \warning The PWM channel of the specified LED is supposed to be used only by + * this module. + * + * \note The GPIO pin configuration of all LEDs is left unchanged. + */ +extern U8 LED_Get_Intensity(U32 led); + +/*! \brief Sets the intensity of the specified LEDs. + * + * \param leds LEDs of which to set the intensity (1 bit per LED). + * \param intensity New intensity of the specified LEDs (0x00 to 0xFF). + * + * \warning The PWM channels of the specified LEDs are supposed to be used only + * by this module. + * + * \note The pins of the specified LEDs are set to PWM output mode. + */ +extern void LED_Set_Intensity(U32 leds, U8 intensity); + + +#endif // _LED_H_ diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/evk1105.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/evk1105.h new file mode 100644 index 0000000..edda44c --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/evk1105.h @@ -0,0 +1,433 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief AT32UC3A EVK1105 board header file. + * + * This file contains definitions and services related to the features of the + * EVK1105 board rev. B. + * + * To use this board, define BOARD=EVK1105. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 AT32UC3A devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _EVK1105_H_ +#define _EVK1105_H_ + +#ifdef EVK1105_REV3 +# include "evk1105_rev3.h" +#else + +#include "compiler.h" + +#ifdef __AVR32_ABI_COMPILER__ // Automatically defined when compiling for AVR32, not when assembling. +# include "led.h" +#endif // __AVR32_ABI_COMPILER__ + + +/*! \name Oscillator Definitions + */ +//! @{ + +// RCOsc has no custom calibration by default. Set the following definition to +// the appropriate value if a custom RCOsc calibration has been applied to your +// part. +//#define FRCOSC AVR32_PM_RCOSC_FREQUENCY //!< RCOsc frequency: Hz. + +#define FOSC32 32768 //!< Osc32 frequency: Hz. +#define OSC32_STARTUP AVR32_PM_OSCCTRL32_STARTUP_8192_RCOSC //!< Osc32 startup time: RCOsc periods. + +#define FOSC0 12000000 //!< Osc0 frequency: Hz. +#define OSC0_STARTUP AVR32_PM_OSCCTRL0_STARTUP_2048_RCOSC //!< Osc0 startup time: RCOsc periods. + +#define FOSC1 11289600 //!< Osc1 frequency: Hz +#define OSC1_STARTUP AVR32_PM_OSCCTRL1_STARTUP_2048_RCOSC //!< Osc1 startup time: RCOsc periods. + + +//! @} + + +/*! \name SDRAM Definitions + */ +//! @{ + +//! Part header file of used SDRAM(s). +#define SDRAM_PART_HDR "MT48LC16M16A2TG7E/mt48lc16m16a2tg7e.h" + +//! Data bus width to use the SDRAM(s) with (16 or 32 bits; always 16 bits on +//! UC3). +#define SDRAM_DBW 16 +//! @} + + +/*! \name USB Definitions + */ +//! @{ +//! Multiplexed pin used for USB_ID: AVR32_USBB_USB_ID_x_x. +//! To be selected according to the AVR32_USBB_USB_ID_x_x_PIN and +//! AVR32_USBB_USB_ID_x_x_FUNCTION definitions from . +#define AVR32_USBB_USB_ID_0_2_PIN 21 +#define AVR32_USBB_USB_ID_0_2_FUNCTION 2 +#define USB_ID AVR32_USBB_USB_ID_0_2 + +//! Multiplexed pin used for USB_VBOF: AVR32_USBB_USB_VBOF_x_x. +//! To be selected according to the AVR32_USBB_USB_VBOF_x_x_PIN and +//! AVR32_USBB_USB_VBOF_x_x_FUNCTION definitions from . +# define USB_VBOF AVR32_USBB_USB_VBOF_0_1 + + +//! Active level of the USB_VBOF output pin. +# define USB_VBOF_ACTIVE_LEVEL LOW + +//! USB overcurrent detection pin. +# define USB_OVERCURRENT_DETECT_PIN AVR32_PIN_PX15 + +//! @} + + +//! GPIO connection of the MAC PHY PWR_DOWN/INT signal. +# define MACB_INTERRUPT_PIN AVR32_PIN_PA26 + + + +//! Number of LEDs. +#define LED_COUNT 4 + +/*! \name GPIO Connections of LEDs + */ +//! @{ +# define LED0_GPIO AVR32_PIN_PB27 +# define LED1_GPIO AVR32_PIN_PB28 +# define LED2_GPIO AVR32_PIN_PA05 +# define LED3_GPIO AVR32_PIN_PA06 +//! @} + +/*! \name Color Identifiers of LEDs to Use with LED Functions + */ +//! @{ +#define LED_MONO0_GREEN LED0 +#define LED_MONO1_GREEN LED1 +#define LED_MONO2_GREEN LED2 +#define LED_MONO3_GREEN LED3 +//! @} + +/*! \name PWM Channels of LEDs + */ +//! @{ +#define LED0_PWM 4 +#define LED1_PWM 5 +#define LED2_PWM (-1) +#define LED3_PWM (-1) +//! @} + +/*! \name PWM Functions of LEDs + */ +//! @{ +/* TODO: Implement PWM functionality */ +#define LED0_PWM_FUNCTION (-1)//AVR32_PWM_0_FUNCTION +#define LED1_PWM_FUNCTION (-1)//AVR32_PWM_1_FUNCTION +#define LED2_PWM_FUNCTION (-1) +#define LED3_PWM_FUNCTION (-1) +//! @} + +//! External interrupt connection of touch sensor. +#define QT1081_EIC_EXTINT_PIN AVR32_EIC_EXTINT_1_PIN +#define QT1081_EIC_EXTINT_FUNCTION AVR32_EIC_EXTINT_1_FUNCTION +#define QT1081_EIC_EXTINT_IRQ AVR32_EIC_IRQ_1 +#define QT1081_EIC_EXTINT_INT AVR32_EIC_INT1 +/*! \name Touch sensor low power mode select + */ +#define QT1081_LP_MODE AVR32_PIN_PB29 + +/*! \name GPIO Connections of touch buttons + */ +//! @{ +#define QT1081_TOUCH_SENSOR_0 AVR32_PIN_PB22 +#define QT1081_TOUCH_SENSOR_0_PRESSED 1 +#define QT1081_TOUCH_SENSOR_1 AVR32_PIN_PB23 +#define QT1081_TOUCH_SENSOR_1_PRESSED 1 +#define QT1081_TOUCH_SENSOR_2 AVR32_PIN_PB24 +#define QT1081_TOUCH_SENSOR_2_PRESSED 1 +#define QT1081_TOUCH_SENSOR_3 AVR32_PIN_PB25 +#define QT1081_TOUCH_SENSOR_3_PRESSED 1 +#define QT1081_TOUCH_SENSOR_4 AVR32_PIN_PB26 +#define QT1081_TOUCH_SENSOR_4_PRESSED 1 + +#define QT1081_TOUCH_SENSOR_ENTER QT1081_TOUCH_SENSOR_4 +#define QT1081_TOUCH_SENSOR_ENTER_PRESSED QT1081_TOUCH_SENSOR_4_PRESSED +#define QT1081_TOUCH_SENSOR_LEFT QT1081_TOUCH_SENSOR_3 +#define QT1081_TOUCH_SENSOR_LEFT_PRESSED QT1081_TOUCH_SENSOR_3_PRESSED +#define QT1081_TOUCH_SENSOR_RIGHT QT1081_TOUCH_SENSOR_2 +#define QT1081_TOUCH_SENSOR_RIGHT_PRESSED QT1081_TOUCH_SENSOR_2_PRESSED +#define QT1081_TOUCH_SENSOR_UP QT1081_TOUCH_SENSOR_0 +#define QT1081_TOUCH_SENSOR_UP_PRESSED QT1081_TOUCH_SENSOR_0_PRESSED +#define QT1081_TOUCH_SENSOR_DOWN QT1081_TOUCH_SENSOR_1 +#define QT1081_TOUCH_SENSOR_DOWN_PRESSED QT1081_TOUCH_SENSOR_1_PRESSED +//! @} + +/*! \name SPI Connections of the AT45DBX Data Flash Memory + */ +//! @{ +#define AT45DBX_SPI (&AVR32_SPI0) +#define AT45DBX_SPI_NPCS 0 +#define AT45DBX_SPI_SCK_PIN AVR32_SPI0_SCK_0_0_PIN +#define AT45DBX_SPI_SCK_FUNCTION AVR32_SPI0_SCK_0_0_FUNCTION +#define AT45DBX_SPI_MISO_PIN AVR32_SPI0_MISO_0_0_PIN +#define AT45DBX_SPI_MISO_FUNCTION AVR32_SPI0_MISO_0_0_FUNCTION +#define AT45DBX_SPI_MOSI_PIN AVR32_SPI0_MOSI_0_0_PIN +#define AT45DBX_SPI_MOSI_FUNCTION AVR32_SPI0_MOSI_0_0_FUNCTION +#define AT45DBX_SPI_NPCS0_PIN AVR32_SPI0_NPCS_0_0_PIN +#define AT45DBX_SPI_NPCS0_FUNCTION AVR32_SPI0_NPCS_0_0_FUNCTION +//! @} + +/*! \name GPIO and SPI Connections of the SD/MMC Connector + */ +//! @{ +#define SD_MMC_CARD_DETECT_PIN AVR32_PIN_PA02 +#define SD_MMC_WRITE_PROTECT_PIN AVR32_PIN_PA18 +#define SD_MMC_SPI (&AVR32_SPI0) +#define SD_MMC_SPI_NPCS 1 +#define SD_MMC_SPI_SCK_PIN AVR32_SPI0_SCK_0_0_PIN +#define SD_MMC_SPI_SCK_FUNCTION AVR32_SPI0_SCK_0_0_FUNCTION +#define SD_MMC_SPI_MISO_PIN AVR32_SPI0_MISO_0_0_PIN +#define SD_MMC_SPI_MISO_FUNCTION AVR32_SPI0_MISO_0_0_FUNCTION +#define SD_MMC_SPI_MOSI_PIN AVR32_SPI0_MOSI_0_0_PIN +#define SD_MMC_SPI_MOSI_FUNCTION AVR32_SPI0_MOSI_0_0_FUNCTION +#define SD_MMC_SPI_NPCS_PIN AVR32_SPI0_NPCS_1_0_PIN +#define SD_MMC_SPI_NPCS_FUNCTION AVR32_SPI0_NPCS_1_0_FUNCTION +//! @} + + +/*! \name TWI expansion + */ +//! @{ +#define EXPANSION_TWI (&AVR32_TWI) +#define EXPANSION_RESET AVR32_PIN_PX16 +#define EXPANSION_TWI_SCL_PIN AVR32_TWI_SCL_0_0_PIN +#define EXPANSION_TWI_SCL_FUNCTION AVR32_TWI_SCL_0_0_FUNCTION +#define EXPANSION_TWI_SDA_PIN AVR32_TWI_SDA_0_0_PIN +#define EXPANSION_TWI_SDA_FUNCTION AVR32_TWI_SDA_0_0_FUNCTION +//! @} + +/*! \name Wireless expansion + */ + +#define WEXPANSION_EXTINT_PIN AVR32_EIC_EXTINT_8_PIN +#define WEXPANSION_EXTINT_FUNCTION AVR32_EIC_EXTINT_8_FUNCTION +#define WEXPANSION_GPIO1 AVR32_PIN_PB30 +#define WEXPANSION_GPIO2 AVR32_PIN_PB31 + +#define WEXPANSION_SPI (&AVR32_SPI0) +#define WEXPANSION_SPI_NPCS 2 +#define WEXPANSION_SPI_SCK_PIN AVR32_SPI0_SCK_0_0_PIN +#define WEXPANSION_SPI_SCK_FUNCTION AVR32_SPI0_SCK_0_0_FUNCTION +#define WEXPANSION_SPI_MISO_PIN AVR32_SPI0_MISO_0_0_PIN +#define WEXPANSION_SPI_MISO_FUNCTION AVR32_SPI0_MISO_0_0_FUNCTION +#define WEXPANSION_SPI_MOSI_PIN AVR32_SPI0_MOSI_0_0_PIN +#define WEXPANSION_SPI_MOSI_FUNCTION AVR32_SPI0_MOSI_0_0_FUNCTION +#define WEXPANSION_SPI_NPCS_PIN AVR32_SPI0_NPCS_2_0_PIN +#define WEXPANSION_SPI_NPCS_FUNCTION AVR32_SPI0_NPCS_2_0_FUNCTION + +//! @} + +/*! \name ET024006DHU TFT display + */ +//! @{ + +#define ET024006DHU_TE_PIN AVR32_PIN_PX19 +#define ET024006DHU_RESET_PIN AVR32_PIN_PX22 +#define ET024006DHU_BL_PIN AVR32_PWM_6_PIN +#define ET024006DHU_BL_FUNCTION AVR32_PWM_6_FUNCTION +#define ET024006DHU_DNC_PIN AVR32_EBI_ADDR_21_1_PIN +#define ET024006DHU_DNC_FUNCTION AVR32_EBI_ADDR_21_1_FUNCTION +#define ET024006DHU_EBI_NCS_PIN AVR32_EBI_NCS_0_1_PIN +#define ET024006DHU_EBI_NCS_FUNCTION AVR32_EBI_NCS_0_1_FUNCTION + +//! @} +/*! \name Optional SPI connection to the TFT + */ +//! @{ + +#define ET024006DHU_SPI (&AVR32_SPI0) +#define ET024006DHU_SPI_NPCS 3 +#define ET024006DHU_SPI_SCK_PIN AVR32_SPI0_SCK_0_0_PIN +#define ET024006DHU_SPI_SCK_FUNCTION AVR32_SPI0_SCK_0_0_FUNCTION +#define ET024006DHU_SPI_MISO_PIN AVR32_SPI0_MISO_0_0_PIN +#define ET024006DHU_SPI_MISO_FUNCTION AVR32_SPI0_MISO_0_0_FUNCTION +#define ET024006DHU_SPI_MOSI_PIN AVR32_SPI0_MOSI_0_0_PIN +#define ET024006DHU_SPI_MOSI_FUNCTION AVR32_SPI0_MOSI_0_0_FUNCTION +#define ET024006DHU_SPI_NPCS_PIN AVR32_SPI1_NPCS_3_0_PIN +#define ET024006DHU_SPI_NPCS_FUNCTION AVR32_SPI1_NPCS_3_0_FUNCTION + +//! @} + + +/*! \name Audio amplifier connection to the DAC + */ +//! @{ + +#define TPA6130_ABDAC (&AVR32_ABDAC) + +#define TPA6130_DATA0_PIN AVR32_ABDAC_DATA_0_1_PIN +#define TPA6130_DATA0_FUNCTION AVR32_ABDAC_DATA_0_1_FUNCTION +#define TPA6130_DATAN0_PIN AVR32_ABDAC_DATAN_0_1_PIN +#define TPA6130_DATAN0_FUNCTION AVR32_ABDAC_DATAN_0_1_FUNCTION +#define TPA6130_DATA1_PIN AVR32_ABDAC_DATA_1_1_PIN +#define TPA6130_DATA1_FUNCTION AVR32_ABDAC_DATA_1_1_FUNCTION +#define TPA6130_DATAN1_PIN AVR32_ABDAC_DATAN_1_1_PIN +#define TPA6130_DATAN1_FUNCTION AVR32_ABDAC_DATAN_1_1_FUNCTION + +#define TPA6130_ABDAC_PDCA_PID AVR32_PDCA_PID_ABDAC_TX +#define TPA6130_ABDAC_PDCA_CHANNEL 0 +#define TPA6130_ABDAC_PDCA_IRQ AVR32_PDCA_IRQ_0 +#define TPA6130_ABDAC_PDCA_INT_LEVEL AVR32_INTC_INT3 + +#define TPA6130_TWI (&AVR32_TWI) +#define TPA6130_TWI_SCL_PIN AVR32_TWI_SCL_0_0_PIN +#define TPA6130_TWI_SCL_FUNCTION AVR32_TWI_SCL_0_0_FUNCTION +#define TPA6130_TWI_SDA_PIN AVR32_TWI_SDA_0_0_PIN +#define TPA6130_TWI_SDA_FUNCTION AVR32_TWI_SDA_0_0_FUNCTION + +//! }@ +/*! \name TI TLV320AIC23B sound chip + */ +//! @{ +#define TLV320_SSC (&AVR32_SSC) +#define TLV320_SSC_TX_CLOCK_PIN AVR32_SSC_TX_CLOCK_0_PIN +#define TLV320_SSC_TX_CLOCK_FUNCTION AVR32_SSC_TX_CLOCK_0_FUNCTION +#define TLV320_SSC_TX_DATA_PIN AVR32_SSC_TX_DATA_0_PIN +#define TLV320_SSC_TX_DATA_FUNCTION AVR32_SSC_TX_DATA_0_FUNCTION +#define TLV320_SSC_TX_FRAME_SYNC_PIN AVR32_SSC_TX_FRAME_SYNC_0_PIN +#define TLV320_SSC_TX_FRAME_SYNC_FUNCTION AVR32_SSC_TX_FRAME_SYNC_0_FUNCTION + +#define TLV320_TWI (&AVR32_TWI) +#define TLV320_TWI_SCL_PIN AVR32_TWI_SCL_0_0_PIN +#define TLV320_TWI_SCL_FUNCTION AVR32_TWI_SCL_0_0_FUNCTION +#define TLV320_TWI_SDA_PIN AVR32_TWI_SDA_0_0_PIN +#define TLV320_TWI_SDA_FUNCTION AVR32_TWI_SDA_0_0_FUNCTION + +#define TLV320_PM_GCLK_PIN AVR32_PM_GCLK_0_0_PIN +#define TLV320_PM_GCLK_FUNCTION AVR32_PM_GCLK_0_0_FUNCTION +//! @} + +////! \name SPI: Apple Authentication Chip Hardware Connections +////! @{ +#define IPOD_AUTH_CHIP_SPI (&AVR32_SPI0) +#define IPOD_AUTH_CHIP_SPI_IRQ AVR32_SPI0_IRQ +#define IPOD_AUTH_CHIP_SPI_NPCS 2 +#define IPOD_AUTH_CHIP_SPI_SCK_PIN AVR32_SPI0_SCK_0_0_PIN +#define IPOD_AUTH_CHIP_SPI_SCK_FUNCTION AVR32_SPI0_SCK_0_0_FUNCTION +#define IPOD_AUTH_CHIP_SPI_MISO_PIN AVR32_SPI0_MISO_0_0_PIN +#define IPOD_AUTH_CHIP_SPI_MISO_FUNCTION AVR32_SPI0_MISO_0_0_FUNCTION +#define IPOD_AUTH_CHIP_SPI_MOSI_PIN AVR32_SPI0_MOSI_0_0_PIN +#define IPOD_AUTH_CHIP_SPI_MOSI_FUNCTION AVR32_SPI0_MOSI_0_0_FUNCTION +#define IPOD_AUTH_CHIP_SPI_NPCS_PIN AVR32_SPI0_NPCS_2_0_PIN +#define IPOD_AUTH_CHIP_SPI_NPCS_FUNCTION AVR32_SPI0_NPCS_2_0_FUNCTION +#define IPOD_AUTH_CHIP_SPI_N_RESET_PIN AVR32_PIN_PB30 +#define IPOD_AUTH_CHIP_SPI_CP_READY_PIN AVR32_PIN_PB31 +//! }@ + +/*! \name Connections of the iPOD Authentication Coprocessor + */ +//! @{ + +#define IPOD_AUTH_CHIP_TWI (&AVR32_TWI) +#define IPOD_AUTH_CHIP_TWI_SCL_PIN AVR32_TWI_SCL_0_0_PIN +#define IPOD_AUTH_CHIP_TWI_SCL_FUNCTION AVR32_TWI_SCL_0_0_FUNCTION +#define IPOD_AUTH_CHIP_TWI_SDA_PIN AVR32_TWI_SDA_0_0_PIN +#define IPOD_AUTH_CHIP_TWI_SDA_FUNCTION AVR32_TWI_SDA_0_0_FUNCTION +#define IPOD_AUTH_CHIP_TWI_N_RESET_PIN AVR32_PIN_PX16 + +//! @} + +/*! \name USART connection to the UC3B board controller + */ +//! @{ + +#define USART0_RXD_PIN AVR32_USART0_RXD_0_0_PIN +#define USART0_RXD_FUNCTION AVR32_USART0_RXD_0_0_FUNCTION +#define USART0_TXD_PIN AVR32_USART0_TXD_0_0_PIN +#define USART0_TXD_FUNCTION AVR32_USART0_TXD_0_0_FUNCTION +#define USART0_RTS_PIN AVR32_USART0_RTS_0_0_PIN +#define USART0_RTS_FUNCTION AVR32_USART0_RTS_0_0_FUNCTION +#define USART0_CTS_PIN AVR32_USART0_CTS_0_0_PIN +#define USART0_CTS_FUNCTION AVR32_USART0_CTS_0_0_FUNCTION + +//! @} + +#define ADC_VEXT_PIN AVR32_ADC_AD_7_PIN +#define ADC_VEXT_FUNCTION AVR32_ADC_AD_7_FUNCTION + +/*! \name LCD Connections of the ET024006DHU display + */ +//! @{ +#define ET024006DHU_SMC_USE_NCS 0 +#define ET024006DHU_SMC_COMPONENT_CS "smc_et024006dhu.h" + +#define ET024006DHU_EBI_DATA_0 AVR32_EBI_DATA_0 +#define ET024006DHU_EBI_DATA_1 AVR32_EBI_DATA_1 +#define ET024006DHU_EBI_DATA_2 AVR32_EBI_DATA_2 +#define ET024006DHU_EBI_DATA_3 AVR32_EBI_DATA_3 +#define ET024006DHU_EBI_DATA_4 AVR32_EBI_DATA_4 +#define ET024006DHU_EBI_DATA_5 AVR32_EBI_DATA_5 +#define ET024006DHU_EBI_DATA_6 AVR32_EBI_DATA_6 +#define ET024006DHU_EBI_DATA_7 AVR32_EBI_DATA_7 +#define ET024006DHU_EBI_DATA_8 AVR32_EBI_DATA_8 +#define ET024006DHU_EBI_DATA_9 AVR32_EBI_DATA_9 +#define ET024006DHU_EBI_DATA_10 AVR32_EBI_DATA_10 +#define ET024006DHU_EBI_DATA_11 AVR32_EBI_DATA_11 +#define ET024006DHU_EBI_DATA_12 AVR32_EBI_DATA_12 +#define ET024006DHU_EBI_DATA_13 AVR32_EBI_DATA_13 +#define ET024006DHU_EBI_DATA_14 AVR32_EBI_DATA_14 +#define ET024006DHU_EBI_DATA_15 AVR32_EBI_DATA_15 + +#define ET024006DHU_EBI_ADDR_21 AVR32_EBI_ADDR_21_1 + +#define ET024006DHU_EBI_NWE AVR32_EBI_NWE0_0 +#define ET024006DHU_EBI_NRD AVR32_EBI_NRD_0 +#define ET024006DHU_EBI_NCS AVR32_EBI_NCS_0_1 +//! @} + + +#endif // !EVK1105_REVA + +#endif // _EVK1105_H_ diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/led.c b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/led.c new file mode 100644 index 0000000..561652a --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/led.c @@ -0,0 +1,346 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief AT32UC3A EVK1105 board LEDs support package. + * + * This file contains definitions and services related to the LED features of + * the EVK1105 board. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 AT32UC3A devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#include +#include "preprocessor.h" +#include "compiler.h" +#include "evk1105.h" +#include "led.h" + + +//! Structure describing LED hardware connections. +typedef const struct +{ + struct + { + U32 PORT; //!< LED GPIO port. + U32 PIN_MASK; //!< Bit-mask of LED pin in GPIO port. + } GPIO; //!< LED GPIO descriptor. + struct + { + S32 CHANNEL; //!< LED PWM channel (< 0 if N/A). + S32 FUNCTION; //!< LED pin PWM function (< 0 if N/A). + } PWM; //!< LED PWM descriptor. +} tLED_DESCRIPTOR; + + +//! Hardware descriptors of all LEDs. +static tLED_DESCRIPTOR LED_DESCRIPTOR[LED_COUNT] = +{ +#define INSERT_LED_DESCRIPTOR(LED_NO, unused) \ + { \ + {LED##LED_NO##_GPIO / 32, 1 << (LED##LED_NO##_GPIO % 32)},\ + {LED##LED_NO##_PWM, LED##LED_NO##_PWM_FUNCTION } \ + }, + MREPEAT(LED_COUNT, INSERT_LED_DESCRIPTOR, ~) +#undef INSERT_LED_DESCRIPTOR +}; + + +//! Saved state of all LEDs. +static volatile U32 LED_State = (1 << LED_COUNT) - 1; + + +U32 LED_Read_Display(void) +{ + return LED_State; +} + + +void LED_Display(U32 leds) +{ + // Use the LED descriptors to get the connections of a given LED to the MCU. + tLED_DESCRIPTOR *led_descriptor; + volatile avr32_gpio_port_t *led_gpio_port; + + // Make sure only existing LEDs are specified. + leds &= (1 << LED_COUNT) - 1; + + // Update the saved state of all LEDs with the requested changes. + LED_State = leds; + + // For all LEDs... + for (led_descriptor = &LED_DESCRIPTOR[0]; + led_descriptor < LED_DESCRIPTOR + LED_COUNT; + led_descriptor++) + { + // Set the LED to the requested state. + led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; + if (leds & 1) + { + led_gpio_port->ovrc = led_descriptor->GPIO.PIN_MASK; + } + else + { + led_gpio_port->ovrs = led_descriptor->GPIO.PIN_MASK; + } + led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; + led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; + leds >>= 1; + } +} + + +U32 LED_Read_Display_Mask(U32 mask) +{ + return Rd_bits(LED_State, mask); +} + + +void LED_Display_Mask(U32 mask, U32 leds) +{ + // Use the LED descriptors to get the connections of a given LED to the MCU. + tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; + volatile avr32_gpio_port_t *led_gpio_port; + U8 led_shift; + + // Make sure only existing LEDs are specified. + mask &= (1 << LED_COUNT) - 1; + + // Update the saved state of all LEDs with the requested changes. + Wr_bits(LED_State, mask, leds); + + // While there are specified LEDs left to manage... + while (mask) + { + // Select the next specified LED and set it to the requested state. + led_shift = 1 + ctz(mask); + led_descriptor += led_shift; + led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; + leds >>= led_shift - 1; + if (leds & 1) + { + led_gpio_port->ovrc = led_descriptor->GPIO.PIN_MASK; + } + else + { + led_gpio_port->ovrs = led_descriptor->GPIO.PIN_MASK; + } + led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; + led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; + leds >>= 1; + mask >>= led_shift; + } +} + + +Bool LED_Test(U32 leds) +{ + return Tst_bits(LED_State, leds); +} + + +void LED_Off(U32 leds) +{ + // Use the LED descriptors to get the connections of a given LED to the MCU. + tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; + volatile avr32_gpio_port_t *led_gpio_port; + U8 led_shift; + + // Make sure only existing LEDs are specified. + leds &= (1 << LED_COUNT) - 1; + + // Update the saved state of all LEDs with the requested changes. + Clr_bits(LED_State, leds); + + // While there are specified LEDs left to manage... + while (leds) + { + // Select the next specified LED and turn it off. + led_shift = 1 + ctz(leds); + led_descriptor += led_shift; + led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; + led_gpio_port->ovrs = led_descriptor->GPIO.PIN_MASK; + led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; + led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; + leds >>= led_shift; + } +} + + +void LED_On(U32 leds) +{ + // Use the LED descriptors to get the connections of a given LED to the MCU. + tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; + volatile avr32_gpio_port_t *led_gpio_port; + U8 led_shift; + + // Make sure only existing LEDs are specified. + leds &= (1 << LED_COUNT) - 1; + + // Update the saved state of all LEDs with the requested changes. + Set_bits(LED_State, leds); + + // While there are specified LEDs left to manage... + while (leds) + { + // Select the next specified LED and turn it on. + led_shift = 1 + ctz(leds); + led_descriptor += led_shift; + led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; + led_gpio_port->ovrc = led_descriptor->GPIO.PIN_MASK; + led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; + led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; + leds >>= led_shift; + } +} + + +void LED_Toggle(U32 leds) +{ + // Use the LED descriptors to get the connections of a given LED to the MCU. + tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; + volatile avr32_gpio_port_t *led_gpio_port; + U8 led_shift; + + // Make sure only existing LEDs are specified. + leds &= (1 << LED_COUNT) - 1; + + // Update the saved state of all LEDs with the requested changes. + Tgl_bits(LED_State, leds); + + // While there are specified LEDs left to manage... + while (leds) + { + // Select the next specified LED and toggle it. + led_shift = 1 + ctz(leds); + led_descriptor += led_shift; + led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; + led_gpio_port->ovrt = led_descriptor->GPIO.PIN_MASK; + led_gpio_port->oders = led_descriptor->GPIO.PIN_MASK; + led_gpio_port->gpers = led_descriptor->GPIO.PIN_MASK; + leds >>= led_shift; + } +} + + +U32 LED_Read_Display_Field(U32 field) +{ + return Rd_bitfield(LED_State, field); +} + + +void LED_Display_Field(U32 field, U32 leds) +{ + // Move the bit-field to the appropriate position for the bit-mask. + LED_Display_Mask(field, leds << ctz(field)); +} + + +U8 LED_Get_Intensity(U32 led) +{ + tLED_DESCRIPTOR *led_descriptor; + + // Check that the argument value is valid. + led = ctz(led); + led_descriptor = &LED_DESCRIPTOR[led]; + if (led >= LED_COUNT || led_descriptor->PWM.CHANNEL < 0) return 0; + + // Return the duty cycle value if the LED PWM channel is enabled, else 0. + return (AVR32_PWM.sr & (1 << led_descriptor->PWM.CHANNEL)) ? + AVR32_PWM.channel[led_descriptor->PWM.CHANNEL].cdty : 0; +} + + +void LED_Set_Intensity(U32 leds, U8 intensity) +{ + tLED_DESCRIPTOR *led_descriptor = &LED_DESCRIPTOR[0] - 1; + volatile avr32_pwm_channel_t *led_pwm_channel; + volatile avr32_gpio_port_t *led_gpio_port; + U8 led_shift; + + // For each specified LED... + for (leds &= (1 << LED_COUNT) - 1; leds; leds >>= led_shift) + { + // Select the next specified LED and check that it has a PWM channel. + led_shift = 1 + ctz(leds); + led_descriptor += led_shift; + if (led_descriptor->PWM.CHANNEL < 0) continue; + + // Initialize or update the LED PWM channel. + led_pwm_channel = &AVR32_PWM.channel[led_descriptor->PWM.CHANNEL]; + if (!(AVR32_PWM.sr & (1 << led_descriptor->PWM.CHANNEL))) + { + led_pwm_channel->cmr = (AVR32_PWM_CPRE_MCK << AVR32_PWM_CPRE_OFFSET) & + ~(AVR32_PWM_CALG_MASK | + AVR32_PWM_CPOL_MASK | + AVR32_PWM_CPD_MASK); + led_pwm_channel->cprd = 0x000000FF; + led_pwm_channel->cdty = intensity; + AVR32_PWM.ena = 1 << led_descriptor->PWM.CHANNEL; + } + else + { + AVR32_PWM.isr; + while (!(AVR32_PWM.isr & (1 << led_descriptor->PWM.CHANNEL))); + led_pwm_channel->cupd = intensity; + } + + // Switch the LED pin to its PWM function. + led_gpio_port = &AVR32_GPIO.port[led_descriptor->GPIO.PORT]; + if (led_descriptor->PWM.FUNCTION & 0x1) + { + led_gpio_port->pmr0s = led_descriptor->GPIO.PIN_MASK; + } + else + { + led_gpio_port->pmr0c = led_descriptor->GPIO.PIN_MASK; + } + if (led_descriptor->PWM.FUNCTION & 0x2) + { + led_gpio_port->pmr1s = led_descriptor->GPIO.PIN_MASK; + } + else + { + led_gpio_port->pmr1c = led_descriptor->GPIO.PIN_MASK; + } + led_gpio_port->gperc = led_descriptor->GPIO.PIN_MASK; + } +} diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/led.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/led.h new file mode 100644 index 0000000..7766b6a --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/EVK1105/led.h @@ -0,0 +1,187 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief AT32UC3A EVK1105 board LEDs support package. + * + * This file contains definitions and services related to the LED features of + * the EVK1105 board. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 AT32UC3A devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _LED_H_ +#define _LED_H_ + +#include "compiler.h" + + +/*! \name Identifiers of LEDs to Use with LED Functions + */ +//! @{ +#define LED0 0x01 +#define LED1 0x02 +#define LED2 0x04 +#define LED3 0x08 +//! @} + + +/*! \brief Gets the last state of all LEDs set through the LED API. + * + * \return State of all LEDs (1 bit per LED). + * + * \note The GPIO pin configuration of all LEDs is left unchanged. + */ +extern U32 LED_Read_Display(void); + +/*! \brief Sets the state of all LEDs. + * + * \param leds New state of all LEDs (1 bit per LED). + * + * \note The pins of all LEDs are set to GPIO output mode. + */ +extern void LED_Display(U32 leds); + +/*! \brief Gets the last state of the specified LEDs set through the LED API. + * + * \param mask LEDs of which to get the state (1 bit per LED). + * + * \return State of the specified LEDs (1 bit per LED). + * + * \note The GPIO pin configuration of all LEDs is left unchanged. + */ +extern U32 LED_Read_Display_Mask(U32 mask); + +/*! \brief Sets the state of the specified LEDs. + * + * \param mask LEDs of which to set the state (1 bit per LED). + * + * \param leds New state of the specified LEDs (1 bit per LED). + * + * \note The pins of the specified LEDs are set to GPIO output mode. + */ +extern void LED_Display_Mask(U32 mask, U32 leds); + +/*! \brief Tests the last state of the specified LEDs set through the LED API. + * + * \param leds LEDs of which to test the state (1 bit per LED). + * + * \return \c TRUE if at least one of the specified LEDs has a state on, else + * \c FALSE. + * + * \note The GPIO pin configuration of all LEDs is left unchanged. + */ +extern Bool LED_Test(U32 leds); + +/*! \brief Turns off the specified LEDs. + * + * \param leds LEDs to turn off (1 bit per LED). + * + * \note The pins of the specified LEDs are set to GPIO output mode. + */ +extern void LED_Off(U32 leds); + +/*! \brief Turns on the specified LEDs. + * + * \param leds LEDs to turn on (1 bit per LED). + * + * \note The pins of the specified LEDs are set to GPIO output mode. + */ +extern void LED_On(U32 leds); + +/*! \brief Toggles the specified LEDs. + * + * \param leds LEDs to toggle (1 bit per LED). + * + * \note The pins of the specified LEDs are set to GPIO output mode. + */ +extern void LED_Toggle(U32 leds); + +/*! \brief Gets as a bit-field the last state of the specified LEDs set through + * the LED API. + * + * \param field LEDs of which to get the state (1 bit per LED). + * + * \return State of the specified LEDs (1 bit per LED, beginning with the first + * specified LED). + * + * \note The GPIO pin configuration of all LEDs is left unchanged. + */ +extern U32 LED_Read_Display_Field(U32 field); + +/*! \brief Sets as a bit-field the state of the specified LEDs. + * + * \param field LEDs of which to set the state (1 bit per LED). + * \param leds New state of the specified LEDs (1 bit per LED, beginning with + * the first specified LED). + * + * \note The pins of the specified LEDs are set to GPIO output mode. + */ +extern void LED_Display_Field(U32 field, U32 leds); + +/*! \brief Gets the intensity of the specified LED. + * + * \param led LED of which to get the intensity (1 bit per LED; only the least + * significant set bit is used). + * + * \return Intensity of the specified LED (0x00 to 0xFF). + * + * \warning The PWM channel of the specified LED is supposed to be used only by + * this module. + * + * \note The GPIO pin configuration of all LEDs is left unchanged. + */ +extern U8 LED_Get_Intensity(U32 led); + +/*! \brief Sets the intensity of the specified LEDs. + * + * \param leds LEDs of which to set the intensity (1 bit per LED). + * \param intensity New intensity of the specified LEDs (0x00 to 0xFF). + * + * \warning The PWM channels of the specified LEDs are supposed to be used only + * by this module. + * + * \note The pins of the specified LEDs are set to PWM output mode. + */ +extern void LED_Set_Intensity(U32 leds, U8 intensity); + + +#endif // _LED_H_ diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/board.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/board.h new file mode 100644 index 0000000..78ee91e --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/board.h @@ -0,0 +1,120 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Standard board header file. + * + * This file includes the appropriate board header file according to the + * defined board. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include + +/*! \name Base Boards + */ +//! @{ +#define EVK1100 1 //!< AT32UC3A EVK1100 board. +#define EVK1101 2 //!< AT32UC3B EVK1101 board. +#define UC3C_EK 3 //!< AT32UC3C UC3C_EK board. +#define EVK1104 4 //!< AT32UC3A3 EVK1104 board. +#define EVK1105 5 //!< AT32UC3A EVK1105 board. +#define STK1000 6 //!< AT32AP7000 STK1000 board. +#define NGW100 7 //!< AT32AP7000 NGW100 board. +#define STK600_RCUC3L0 8 //!< STK600 RCUC3L0 board. +#define UC3L_EK 9 //!< AT32UC3L-EK board. +#define USER_BOARD 99 //!< User-reserved board (if any). +//! @} + +/*! \name Extension Boards + */ +//! @{ +#define EXT1102 1 //!< AT32UC3B EXT1102 board. +#define MC300 2 //!< AT32UC3 MC300 board. +#define USER_EXT_BOARD 99 //!< User-reserved extension board (if any). +//! @} + +#if BOARD == EVK1100 + #include "EVK1100/evk1100.h" +#elif BOARD == EVK1101 + #include "EVK1101/evk1101.h" +#elif BOARD == UC3C_EK + #include "UC3C_EK/uc3c_ek.h" +#elif BOARD == EVK1104 + #include "EVK1104/evk1104.h" +#elif BOARD == EVK1105 + #include "EVK1105/evk1105.h" +#elif BOARD == STK1000 + #include "STK1000/stk1000.h" +#elif BOARD == NGW100 + #include "NGW100/ngw100.h" +#elif BOARD == STK600_RCUC3L0 + #include "STK600/RCUC3L0/stk600_rcuc3l0.h" +#elif BOARD == UC3L_EK + #include "UC3L_EK/uc3l_ek.h" +#elif BOARD == ARDUINO + #include "ARDUINO/arduino.h" +#else + #error No known AVR32 board defined +#endif + +#if (defined EXT_BOARD) + #if EXT_BOARD == EXT1102 + #include "EXT1102/ext1102.h" + #elif EXT_BOARD == MC300 + #include "MC300/mc300.h" + #elif EXT_BOARD == USER_EXT_BOARD + // User-reserved area: #include the header file of your extension board here + // (if any). + #endif +#endif + + +#ifndef FRCOSC + #define FRCOSC AVR32_PM_RCOSC_FREQUENCY //!< Default RCOsc frequency. +#endif + + +#endif // _BOARD_H_ diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/board.h.ori b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/board.h.ori new file mode 100644 index 0000000..30052c8 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/BOARDS/board.h.ori @@ -0,0 +1,121 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Standard board header file. + * + * This file includes the appropriate board header file according to the + * defined board. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _BOARD_H_ +#define _BOARD_H_ + +#include + +/*! \name Base Boards + */ +//! @{ +#define EVK1100 1 //!< AT32UC3A EVK1100 board. +#define EVK1101 2 //!< AT32UC3B EVK1101 board. +#define UC3C_EK 3 //!< AT32UC3C UC3C_EK board. +#define EVK1104 4 //!< AT32UC3A3 EVK1104 board. +#define EVK1105 5 //!< AT32UC3A EVK1105 board. +#define STK1000 6 //!< AT32AP7000 STK1000 board. +#define NGW100 7 //!< AT32AP7000 NGW100 board. +#define STK600_RCUC3L0 8 //!< STK600 RCUC3L0 board. +#define UC3L_EK 9 //!< AT32UC3L-EK board. +#define USER_BOARD 99 //!< User-reserved board (if any). +//! @} + +/*! \name Extension Boards + */ +//! @{ +#define EXT1102 1 //!< AT32UC3B EXT1102 board. +#define MC300 2 //!< AT32UC3 MC300 board. +#define USER_EXT_BOARD 99 //!< User-reserved extension board (if any). +//! @} + +#if BOARD == EVK1100 + #include "EVK1100/evk1100.h" +#elif BOARD == EVK1101 + #include "EVK1101/evk1101.h" +#elif BOARD == UC3C_EK + #include "UC3C_EK/uc3c_ek.h" +#elif BOARD == EVK1104 + #include "EVK1104/evk1104.h" +#elif BOARD == EVK1105 + #include "EVK1105/evk1105.h" +#elif BOARD == STK1000 + #include "STK1000/stk1000.h" +#elif BOARD == NGW100 + #include "NGW100/ngw100.h" +#elif BOARD == STK600_RCUC3L0 + #include "STK600/RCUC3L0/stk600_rcuc3l0.h" +#elif BOARD == UC3L_EK + #include "UC3L_EK/uc3l_ek.h" +#elif BOARD == USER_BOARD + // User-reserved area: #include the header file of your board here (if any). + #include "user_board.h" +#else + #error No known AVR32 board defined +#endif + +#if (defined EXT_BOARD) + #if EXT_BOARD == EXT1102 + #include "EXT1102/ext1102.h" + #elif EXT_BOARD == MC300 + #include "MC300/mc300.h" + #elif EXT_BOARD == USER_EXT_BOARD + // User-reserved area: #include the header file of your extension board here + // (if any). + #endif +#endif + + +#ifndef FRCOSC + #define FRCOSC AVR32_PM_RCOSC_FREQUENCY //!< Default RCOsc frequency. +#endif + + +#endif // _BOARD_H_ diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx.c b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx.c new file mode 100644 index 0000000..d4b1b73 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx.c @@ -0,0 +1,672 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Management of the AT45DBX data flash controller through SPI. + * + * This file manages the accesses to the AT45DBX data flash components. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with an SPI module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +//_____ I N C L U D E S ___________________________________________________ + +#include "conf_access.h" + + +#if AT45DBX_MEM == ENABLE + +#include "compiler.h" +#include "board.h" +#include "gpio.h" +#include "spi.h" +#include "conf_at45dbx.h" +#include "at45dbx.h" +#include "printf-stdarg.h" + +#if AT45DBX_MEM_CNT > 4 + #error AT45DBX_MEM_CNT must not exceed 4 +#endif + + +//_____ D E F I N I T I O N S ______________________________________________ + +/*! \name AT45DBX Group A Commands + */ +//! @{ +#define AT45DBX_CMDA_RD_PAGE 0xD2 //!< Main Memory Page Read (Serial/8-bit Mode). +#define AT45DBX_CMDA_RD_ARRAY_LEG 0xE8 //!< Continuous Array Read, Legacy Command (Serial/8-bit Mode). +#define AT45DBX_CMDA_RD_ARRAY_LF_SM 0x03 //!< Continuous Array Read, Low-Frequency Mode (Serial Mode). +#define AT45DBX_CMDA_RD_ARRAY_AF_SM 0x0B //!< Continuous Array Read, Any-Frequency Mode (Serial Mode). +#define AT45DBX_CMDA_RD_SECTOR_PROT_REG 0x32 //!< Read Sector Protection Register (Serial/8-bit Mode). +#define AT45DBX_CMDA_RD_SECTOR_LKDN_REG 0x35 //!< Read Sector Lockdown Register (Serial/8-bit Mode). +#define AT45DBX_CMDA_RD_SECURITY_REG 0x77 //!< Read Security Register (Serial/8-bit Mode). +//! @} + +/*! \name AT45DBX Group B Commands + */ +//! @{ +#define AT45DBX_CMDB_ER_PAGE 0x81 //!< Page Erase (Serial/8-bit Mode). +#define AT45DBX_CMDB_ER_BLOCK 0x50 //!< Block Erase (Serial/8-bit Mode). +#define AT45DBX_CMDB_ER_SECTOR 0x7C //!< Sector Erase (Serial/8-bit Mode). +#define AT45DBX_CMDB_ER_CHIP 0xC794809A //!< Chip Erase (Serial/8-bit Mode). +#define AT45DBX_CMDB_XFR_PAGE_TO_BUF1 0x53 //!< Main Memory Page to Buffer 1 Transfer (Serial/8-bit Mode). +#define AT45DBX_CMDB_XFR_PAGE_TO_BUF2 0x55 //!< Main Memory Page to Buffer 2 Transfer (Serial/8-bit Mode). +#define AT45DBX_CMDB_CMP_PAGE_TO_BUF1 0x60 //!< Main Memory Page to Buffer 1 Compare (Serial/8-bit Mode). +#define AT45DBX_CMDB_CMP_PAGE_TO_BUF2 0x61 //!< Main Memory Page to Buffer 2 Compare (Serial/8-bit Mode). +#define AT45DBX_CMDB_PR_BUF1_TO_PAGE_ER 0x83 //!< Buffer 1 to Main Memory Page Program with Built-in Erase (Serial/8-bit Mode). +#define AT45DBX_CMDB_PR_BUF2_TO_PAGE_ER 0x86 //!< Buffer 2 to Main Memory Page Program with Built-in Erase (Serial/8-bit Mode). +#define AT45DBX_CMDB_PR_BUF1_TO_PAGE 0x88 //!< Buffer 1 to Main Memory Page Program without Built-in Erase (Serial/8-bit Mode). +#define AT45DBX_CMDB_PR_BUF2_TO_PAGE 0x89 //!< Buffer 2 to Main Memory Page Program without Built-in Erase (Serial/8-bit Mode). +#define AT45DBX_CMDB_PR_PAGE_TH_BUF1 0x82 //!< Main Memory Page Program through Buffer 1 (Serial/8-bit Mode). +#define AT45DBX_CMDB_PR_PAGE_TH_BUF2 0x85 //!< Main Memory Page Program through Buffer 2 (Serial/8-bit Mode). +#define AT45DBX_CMDB_RWR_PAGE_TH_BUF1 0x58 //!< Auto Page Rewrite through Buffer 1 (Serial/8-bit Mode). +#define AT45DBX_CMDB_RWR_PAGE_TH_BUF2 0x59 //!< Auto Page Rewrite through Buffer 2 (Serial/8-bit Mode). +//! @} + +/*! \name AT45DBX Group C Commands + */ +//! @{ +#define AT45DBX_CMDC_RD_BUF1_LF_SM 0xD1 //!< Buffer 1 Read, Low-Frequency Mode (Serial Mode). +#define AT45DBX_CMDC_RD_BUF2_LF_SM 0xD3 //!< Buffer 2 Read, Low-Frequency Mode (Serial Mode). +#define AT45DBX_CMDC_RD_BUF1_AF_SM 0xD4 //!< Buffer 1 Read, Any-Frequency Mode (Serial Mode). +#define AT45DBX_CMDC_RD_BUF2_AF_SM 0xD6 //!< Buffer 2 Read, Any-Frequency Mode (Serial Mode). +#define AT45DBX_CMDC_RD_BUF1_AF_8M 0x54 //!< Buffer 1 Read, Any-Frequency Mode (8-bit Mode). +#define AT45DBX_CMDC_RD_BUF2_AF_8M 0x56 //!< Buffer 2 Read, Any-Frequency Mode (8-bit Mode). +#define AT45DBX_CMDC_WR_BUF1 0x84 //!< Buffer 1 Write (Serial/8-bit Mode). +#define AT45DBX_CMDC_WR_BUF2 0x87 //!< Buffer 2 Write (Serial/8-bit Mode). +#define AT45DBX_CMDC_RD_STATUS_REG 0xD7 //!< Status Register Read (Serial/8-bit Mode). +#define AT45DBX_CMDC_RD_MNFCT_DEV_ID_SM 0x9F //!< Manufacturer and Device ID Read (Serial Mode). +//! @} + +/*! \name AT45DBX Group D Commands + */ +//! @{ +#define AT45DBX_CMDD_EN_SECTOR_PROT 0x3D2A7FA9 //!< Enable Sector Protection (Serial/8-bit Mode). +#define AT45DBX_CMDD_DIS_SECTOR_PROT 0x3D2A7F9A //!< Disable Sector Protection (Serial/8-bit Mode). +#define AT45DBX_CMDD_ER_SECTOR_PROT_REG 0x3D2A7FCF //!< Erase Sector Protection Register (Serial/8-bit Mode). +#define AT45DBX_CMDD_PR_SECTOR_PROT_REG 0x3D2A7FFC //!< Program Sector Protection Register (Serial/8-bit Mode). +#define AT45DBX_CMDD_LKDN_SECTOR 0x3D2A7F30 //!< Sector Lockdown (Serial/8-bit Mode). +#define AT45DBX_CMDD_PR_SECURITY_REG 0x9B000000 //!< Program Security Register (Serial/8-bit Mode). +#define AT45DBX_CMDD_PR_CONF_REG 0x3D2A80A6 //!< Program Configuration Register (Serial/8-bit Mode). +#define AT45DBX_CMDD_DEEP_PWR_DN 0xB9 //!< Deep Power-down (Serial/8-bit Mode). +#define AT45DBX_CMDD_RSM_DEEP_PWR_DN 0xAB //!< Resume from Deep Power-down (Serial/8-bit Mode). +//! @} + + +/*! \name Bit-Masks and Values for the Status Register + */ +//! @{ +#define AT45DBX_MSK_BUSY 0x80 //!< Busy status bit-mask. +#define AT45DBX_BUSY 0x00 //!< Busy status value (0x00 when busy, 0x80 when ready). +#define AT45DBX_MSK_DENSITY 0x3C //!< Device density bit-mask. +//! @} +#if AT45DBX_MEM_SIZE == AT45DBX_1MB + +/*! \name AT45DB081 Memories + */ +//! @{ +#define AT45DB021D_DENSITY 0x14 //!< Device density value. +#define AT45DBX_DENSITY 0x24 //!< Device density value. +#define AT45DBX_BYTE_ADDR_BITS 9 //!< Address bits for byte position within buffer. + +//! @} +#elif AT45DBX_MEM_SIZE == AT45DBX_2MB +/*! \name AT45DB021D Memories + */ +//! @{ +#define AT45DBX_DENSITY 0x21 //!< Device density value. +#define AT45DBX_BYTE_ADDR_BITS 10 //!< Address bits for byte position within buffer. + +//! @} +#if 0 +/*! \name AT45DB161 Memories + */ +//! @{ +#define AT45DBX_DENSITY 0x2C //!< Device density value. +#define AT45DBX_BYTE_ADDR_BITS 10 //!< Address bits for byte position within buffer. + +//! @} +#endif + +#elif AT45DBX_MEM_SIZE == AT45DBX_4MB + +/*! \name AT45DB321 Memories + */ +//! @{ +#define AT45DBX_DENSITY 0x34 //!< Device density value. +#define AT45DBX_BYTE_ADDR_BITS 10 //!< Address bits for byte position within buffer. + +//! @} + +#elif AT45DBX_MEM_SIZE == AT45DBX_8MB + +/*! \name AT45DB642 Memories + */ +//! @{ +#define AT45DBX_DENSITY 0x3C //!< Device density value. +#define AT45DBX_BYTE_ADDR_BITS 11 //!< Address bits for byte position within buffer. + + +//! @} + +#else + #error AT45DBX_MEM_SIZE is not defined to a supported value +#endif + + + +//! Address bits for page selection. +#define AT45DBX_PAGE_ADDR_BITS (AT45DBX_MEM_SIZE - AT45DBX_PAGE_BITS) + +//! Number of bits for addresses within pages. +#define AT45DBX_PAGE_BITS (AT45DBX_BYTE_ADDR_BITS - 1) + +//! Page size in bytes. +#define AT45DBX_PAGE_SIZE (1 << AT45DBX_PAGE_BITS) + +//! Bit-mask for byte position within buffer in \ref gl_ptr_mem. +#define AT45DBX_MSK_PTR_BYTE ((1 << AT45DBX_PAGE_BITS) - 1) + +//! Bit-mask for page selection in \ref gl_ptr_mem. +#define AT45DBX_MSK_PTR_PAGE (((1 << AT45DBX_PAGE_ADDR_BITS) - 1) << AT45DBX_PAGE_BITS) + +//! Bit-mask for byte position within sector in \ref gl_ptr_mem. +#define AT45DBX_MSK_PTR_SECTOR ((1 << AT45DBX_SECTOR_BITS) - 1) + + +/*! \brief Sends a dummy byte through SPI. + */ +#define spi_write_dummy() spi_write(AT45DBX_SPI, 0xFF) + + +//! Boolean indicating whether memory is in busy state. +static Bool at45dbx_busy; + +//! Memory data pointer. +static U32 gl_ptr_mem; + +//! Sector buffer. +static U8 sector_buf[AT45DBX_SECTOR_SIZE]; + + +/*! \name Control Functions + */ +//! @{ + + +Bool at45dbx_init(spi_options_t spiOptions, unsigned int pba_hz) +{ + // Setup SPI registers according to spiOptions. + for (spiOptions.reg = AT45DBX_SPI_FIRST_NPCS; + spiOptions.reg < AT45DBX_SPI_FIRST_NPCS + AT45DBX_MEM_CNT; + spiOptions.reg++) + { + if (spi_setupChipReg(AT45DBX_SPI, &spiOptions, pba_hz) != SPI_OK) return KO; + } + + // Memory ready. + at45dbx_busy = FALSE; + + return OK; +} + + +/*! \brief Selects or unselects a DF memory. + * + * \param memidx Memory ID of DF to select or unselect. + * \param bSelect Boolean indicating whether the DF memory has to be selected. + */ +static void at45dbx_chipselect_df(U8 memidx, Bool bSelect) +{ + if (bSelect) + { + // Select SPI chip. + spi_selectChip(AT45DBX_SPI, AT45DBX_SPI_FIRST_NPCS + memidx); + } + else + { + // Unselect SPI chip. + spi_unselectChip(AT45DBX_SPI, AT45DBX_SPI_FIRST_NPCS + memidx); + } +} + + +Bool at45dbx_mem_check(void) +{ + U8 df; + U16 status = 0; + + // DF memory check. + for (df = 0; df < AT45DBX_MEM_CNT; df++) + { + // Select the DF memory to check. + at45dbx_chipselect_df(df, TRUE); + + // Send the Status Register Read command. + spi_write(AT45DBX_SPI, AT45DBX_CMDC_RD_STATUS_REG); + + // Send a dummy byte to read the status register. + spi_write_dummy(); + spi_read(AT45DBX_SPI, &status); + + // Unselect the checked DF memory. + at45dbx_chipselect_df(df, FALSE); + + // Unexpected device density value. + if ((status & AT45DBX_MSK_DENSITY) < AT45DB021D_DENSITY) + { + printk("Unexpected device density value: %d (0x%x)\n", (status & AT45DBX_MSK_DENSITY), status); + return KO; + } + } + + return OK; +} + + +/*! \brief Waits until the DF is ready. + */ +static void at45dbx_wait_ready(void) +{ + U16 status; + + // Select the DF memory gl_ptr_mem points to. + at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, TRUE); + + // Send the Status Register Read command. + spi_write(AT45DBX_SPI, AT45DBX_CMDC_RD_STATUS_REG); + + // Read the status register until the DF is ready. + do + { + // Send a dummy byte to read the status register. + spi_write_dummy(); + spi_read(AT45DBX_SPI, &status); + } while ((status & AT45DBX_MSK_BUSY) == AT45DBX_BUSY); + + // Unselect the DF memory gl_ptr_mem points to. + at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE); +} + + +Bool at45dbx_read_open(U32 sector) +{ + U32 addr; + + // Set the global memory pointer to a byte address. + gl_ptr_mem = sector << AT45DBX_SECTOR_BITS; // gl_ptr_mem = sector * AT45DBX_SECTOR_SIZE. + + // If the DF memory is busy, wait until it's ready. + if (at45dbx_busy) at45dbx_wait_ready(); + at45dbx_busy = FALSE; + + // Select the DF memory gl_ptr_mem points to. + at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, TRUE); + + // Initiate a page read at a given sector. + + // Send the Main Memory Page Read command. + spi_write(AT45DBX_SPI, AT45DBX_CMDA_RD_PAGE); + + // Send the three address bytes, which comprise: + // - (24 - (AT45DBX_PAGE_ADDR_BITS + AT45DBX_BYTE_ADDR_BITS)) reserved bits; + // - then AT45DBX_PAGE_ADDR_BITS bits specifying the page in main memory to be read; + // - then AT45DBX_BYTE_ADDR_BITS bits specifying the starting byte address within that page. + // NOTE: The bits of gl_ptr_mem above the AT45DBX_MEM_SIZE bits are useless for the local + // DF addressing. They are used for DF discrimination when there are several DFs. + addr = (Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_PAGE) << AT45DBX_BYTE_ADDR_BITS) | + Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_BYTE); + spi_write(AT45DBX_SPI, LSB2W(addr)); + spi_write(AT45DBX_SPI, LSB1W(addr)); + spi_write(AT45DBX_SPI, LSB0W(addr)); + + // Send 32 don't care clock cycles to initialize the read operation. + spi_write_dummy(); + spi_write_dummy(); + spi_write_dummy(); + spi_write_dummy(); + + return OK; +} + + +void at45dbx_read_close(void) +{ + // Unselect the DF memory gl_ptr_mem points to. + at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE); + + // Memory ready. + at45dbx_busy = FALSE; +} + + +Bool at45dbx_write_open(U32 sector) +{ + U32 addr; + + // Set the global memory pointer to a byte address. + gl_ptr_mem = sector << AT45DBX_SECTOR_BITS; // gl_ptr_mem = sector * AT45DBX_SECTOR_SIZE. + + // If the DF memory is busy, wait until it's ready. + if (at45dbx_busy) at45dbx_wait_ready(); + at45dbx_busy = FALSE; + +#if AT45DBX_PAGE_SIZE > AT45DBX_SECTOR_SIZE + // Select the DF memory gl_ptr_mem points to. + at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, TRUE); + + // Transfer the content of the current page to buffer 1. + + // Send the Main Memory Page to Buffer 1 Transfer command. + spi_write(AT45DBX_SPI, AT45DBX_CMDB_XFR_PAGE_TO_BUF1); + + // Send the three address bytes, which comprise: + // - (24 - (AT45DBX_PAGE_ADDR_BITS + AT45DBX_BYTE_ADDR_BITS)) reserved bits; + // - then AT45DBX_PAGE_ADDR_BITS bits specifying the page in main memory to be read; + // - then AT45DBX_BYTE_ADDR_BITS don't care bits. + // NOTE: The bits of gl_ptr_mem above the AT45DBX_MEM_SIZE bits are useless for the local + // DF addressing. They are used for DF discrimination when there are several DFs. + addr = Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_PAGE) << AT45DBX_BYTE_ADDR_BITS; + spi_write(AT45DBX_SPI, LSB2W(addr)); + spi_write(AT45DBX_SPI, LSB1W(addr)); + spi_write(AT45DBX_SPI, LSB0W(addr)); + + // Unselect the DF memory gl_ptr_mem points to. + at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE); + + // Wait for end of page transfer. + at45dbx_wait_ready(); +#endif + + // Select the DF memory gl_ptr_mem points to. + at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, TRUE); + + // Initiate a page write at a given sector. + + // Send the Main Memory Page Program through Buffer 1 command. + spi_write(AT45DBX_SPI, AT45DBX_CMDB_PR_PAGE_TH_BUF1); + + // Send the three address bytes, which comprise: + // - (24 - (AT45DBX_PAGE_ADDR_BITS + AT45DBX_BYTE_ADDR_BITS)) reserved bits; + // - then AT45DBX_PAGE_ADDR_BITS bits specifying the page in main memory to be written; + // - then AT45DBX_BYTE_ADDR_BITS bits specifying the starting byte address within that page. + // NOTE: The bits of gl_ptr_mem above the AT45DBX_MEM_SIZE bits are useless for the local + // DF addressing. They are used for DF discrimination when there are several DFs. + addr = (Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_PAGE) << AT45DBX_BYTE_ADDR_BITS) | + Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_BYTE); + spi_write(AT45DBX_SPI, LSB2W(addr)); + spi_write(AT45DBX_SPI, LSB1W(addr)); + spi_write(AT45DBX_SPI, LSB0W(addr)); + + return OK; +} + + +void at45dbx_write_close(void) +{ + // While end of logical sector not reached, zero-fill remaining memory bytes. + while (Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_SECTOR)) + { + spi_write(AT45DBX_SPI, 0x00); + gl_ptr_mem++; + } + + // Unselect the DF memory gl_ptr_mem points to. + at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE); + + // Memory busy. + at45dbx_busy = TRUE; +} + + +//! @} + + +/*! \name Single-Byte Access Functions + */ +//! @{ + + +U8 at45dbx_read_byte(void) +{ + U16 data; + + // Memory busy. + if (at45dbx_busy) + { + // Being here, we know that we previously finished a page read. + // => We have to access the next page. + + // Memory ready. + at45dbx_busy = FALSE; + + // Eventually select the next DF and open the next page. + // NOTE: at45dbx_read_open input parameter is a sector. + at45dbx_read_open(gl_ptr_mem >> AT45DBX_SECTOR_BITS); // gl_ptr_mem / AT45DBX_SECTOR_SIZE. + } + + // Send a dummy byte to read the next data byte. + spi_write_dummy(); + spi_read(AT45DBX_SPI, &data); + gl_ptr_mem++; + + // If end of page reached, + if (!Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_BYTE)) + { + // unselect the DF memory gl_ptr_mem points to. + at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE); + + // Memory busy. + at45dbx_busy = TRUE; + } + + return data; +} + + +Bool at45dbx_write_byte(U8 b) +{ + // Memory busy. + if (at45dbx_busy) + { + // Being here, we know that we previously launched a page programming. + // => We have to access the next page. + + // Eventually select the next DF and open the next page. + // NOTE: at45dbx_write_open input parameter is a sector. + at45dbx_write_open(gl_ptr_mem >> AT45DBX_SECTOR_BITS); // gl_ptr_mem / AT45DBX_SECTOR_SIZE. + } + + // Write the next data byte. + spi_write(AT45DBX_SPI, b); + gl_ptr_mem++; + + // If end of page reached, + if (!Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_BYTE)) + { + // unselect the DF memory gl_ptr_mem points to in order to program the page. + at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE); + + // Memory busy. + at45dbx_busy = TRUE; + } + + return OK; +} + + +//! @} + + +/*! \name Multiple-Sector Access Functions + */ +//! @{ + + +Bool at45dbx_read_multiple_sector(U16 nb_sector) +{ + while (nb_sector--) + { + // Read the next sector. + at45dbx_read_sector_2_ram(sector_buf); + at45dbx_read_multiple_sector_callback(sector_buf); + } + + return OK; +} + + +Bool at45dbx_write_multiple_sector(U16 nb_sector) +{ + while (nb_sector--) + { + // Write the next sector. + at45dbx_write_multiple_sector_callback(sector_buf); + at45dbx_write_sector_from_ram(sector_buf); + } + + return OK; +} + + +//! @} + + +/*! \name Single-Sector Access Functions + */ +//! @{ + + +Bool at45dbx_read_sector_2_ram(void *ram) +{ + U8 *_ram = ram; + U16 i; + U16 data; + + // Memory busy. + if (at45dbx_busy) + { + // Being here, we know that we previously finished a page read. + // => We have to access the next page. + + // Memory ready. + at45dbx_busy = FALSE; + + // Eventually select the next DF and open the next page. + // NOTE: at45dbx_read_open input parameter is a sector. + at45dbx_read_open(gl_ptr_mem >> AT45DBX_SECTOR_BITS); // gl_ptr_mem / AT45DBX_SECTOR_SIZE. + } + + // Read the next sector. + for (i = AT45DBX_SECTOR_SIZE; i; i--) + { + // Send a dummy byte to read the next data byte. + spi_write_dummy(); + spi_read(AT45DBX_SPI, &data); + *_ram++ = data; + } + + // Update the memory pointer. + gl_ptr_mem += AT45DBX_SECTOR_SIZE; + +#if AT45DBX_PAGE_SIZE > AT45DBX_SECTOR_SIZE + // If end of page reached, + if (!Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_BYTE)) +#endif + { + // unselect the DF memory gl_ptr_mem points to. + at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE); + + // Memory busy. + at45dbx_busy = TRUE; + } + + return OK; +} + + +Bool at45dbx_write_sector_from_ram(const void *ram) +{ + const U8 *_ram = ram; + U16 i; + + // Memory busy. + if (at45dbx_busy) + { + // Being here, we know that we previously launched a page programming. + // => We have to access the next page. + + // Eventually select the next DF and open the next page. + // NOTE: at45dbx_write_open input parameter is a sector. + at45dbx_write_open(gl_ptr_mem >> AT45DBX_SECTOR_BITS); // gl_ptr_mem / AT45DBX_SECTOR_SIZE. + } + + // Write the next sector. + for (i = AT45DBX_SECTOR_SIZE; i; i--) + { + // Write the next data byte. + spi_write(AT45DBX_SPI, *_ram++); + } + + // Update the memory pointer. + gl_ptr_mem += AT45DBX_SECTOR_SIZE; + +#if AT45DBX_PAGE_SIZE > AT45DBX_SECTOR_SIZE + // If end of page reached, + if (!Rd_bitfield(gl_ptr_mem, AT45DBX_MSK_PTR_BYTE)) +#endif + { + // unselect the DF memory gl_ptr_mem points to in order to program the page. + at45dbx_chipselect_df(gl_ptr_mem >> AT45DBX_MEM_SIZE, FALSE); + + // Memory busy. + at45dbx_busy = TRUE; + } + + return OK; +} + + +//! @} + + +#endif // AT45DBX_MEM == ENABLE diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx.h new file mode 100644 index 0000000..5816b61 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx.h @@ -0,0 +1,269 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Management of the AT45DBX data flash controller through SPI. + * + * This file manages the accesses to the AT45DBX data flash components. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with an SPI module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _AT45DBX_H_ +#define _AT45DBX_H_ + + +#include "conf_access.h" + +#if AT45DBX_MEM == DISABLE + #error at45dbx.h is #included although AT45DBX_MEM is disabled +#endif + + +#include "spi.h" + + +//_____ D E F I N I T I O N S ______________________________________________ + +/*! \name Available AT45DBX Sizes + * + * Number of address bits of available AT45DBX data flash memories. + * + * \note Only memories with page sizes of at least 512 bytes (sector size) are + * supported. + */ +//! @{ +#define AT45DBX_1MB 20 +#define AT45DBX_2MB 21 +#define AT45DBX_4MB 22 +#define AT45DBX_8MB 23 +//! @} + +// AT45DBX_1MB +#define AT45DBX_SECTOR_BITS 8 //! Number of bits for addresses within sectors. +// AT45DBX_2MB AT45DBX_4MB AT45DBX_8MB +//#define AT45DBX_SECTOR_BITS 9 //! Number of bits for addresses within sectors. + +//! Sector size in bytes. +#define AT45DBX_SECTOR_SIZE (1 << AT45DBX_SECTOR_BITS) + +//_____ D E C L A R A T I O N S ____________________________________________ + +/*! \name Control Functions + */ +//! @{ + +/*! \brief Initializes the data flash controller and the SPI channel by which + * the DF is controlled. + * + * \param spiOptions Initialization options of the DF SPI channel. + * \param pba_hz SPI module input clock frequency (PBA clock, Hz). + * + * \retval OK Success. + * \retval KO Failure. + */ +extern Bool at45dbx_init(spi_options_t spiOptions, unsigned int pba_hz); + +/*! \brief Performs a memory check on all DFs. + * + * \retval OK Success. + * \retval KO Failure. + */ +extern Bool at45dbx_mem_check(void); + +/*! \brief Opens a DF memory in read mode at a given sector. + * + * \param sector Start sector. + * + * \retval OK Success. + * \retval KO Failure. + * + * \note Sector may be page-unaligned (depending on the DF page size). + */ +extern Bool at45dbx_read_open(U32 sector); + +/*! \brief Unselects the current DF memory. + */ +extern void at45dbx_read_close(void); + +/*! \brief This function opens a DF memory in write mode at a given sector. + * + * \param sector Start sector. + * + * \retval OK Success. + * \retval KO Failure. + * + * \note Sector may be page-unaligned (depending on the DF page size). + * + * \note If \ref AT45DBX_PAGE_SIZE > \ref AT45DBX_SECTOR_SIZE, page content is + * first loaded in buffer to then be partially updated by write byte or + * write sector functions. + */ +extern Bool at45dbx_write_open(U32 sector); + +/*! \brief Fills the end of the current logical sector and launches page programming. + */ +extern void at45dbx_write_close(void); + +//! @} + + +/*! \name Single-Byte Access Functions + */ +//! @{ + +/*! \brief Performs a single byte read from DF memory. + * + * \return The read byte. + * + * \note First call must be preceded by a call to the \ref at45dbx_read_open + * function. + */ +extern U8 at45dbx_read_byte(void); + +/*! \brief Performs a single byte write to DF memory. + * + * \param b The byte to write. + * + * \retval OK Success. + * \retval KO Failure. + * + * \note First call must be preceded by a call to the \ref at45dbx_write_open + * function. + */ +extern Bool at45dbx_write_byte(U8 b); + +//! @} + + +/*! \name Multiple-Sector Access Functions + */ +//! @{ + +/*! \brief Reads \a nb_sector sectors from DF memory. + * + * Data flow is: DF -> callback. + * + * \param nb_sector Number of contiguous sectors to read. + * + * \retval OK Success. + * \retval KO Failure. + * + * \note First call must be preceded by a call to the \ref at45dbx_read_open + * function. + * + * \note As \ref AT45DBX_PAGE_SIZE is always a multiple of + * \ref AT45DBX_SECTOR_SIZE, there is no need to check page end for each + * byte. + */ +extern Bool at45dbx_read_multiple_sector(U16 nb_sector); + +/*! \brief Callback function invoked after each sector read during + * \ref at45dbx_read_multiple_sector. + * + * \param psector Pointer to read sector. + */ +extern void at45dbx_read_multiple_sector_callback(const void *psector); + +/*! \brief Writes \a nb_sector sectors to DF memory. + * + * Data flow is: callback -> DF. + * + * \param nb_sector Number of contiguous sectors to write. + * + * \retval OK Success. + * \retval KO Failure. + * + * \note First call must be preceded by a call to the \ref at45dbx_write_open + * function. + * + * \note As \ref AT45DBX_PAGE_SIZE is always a multiple of + * \ref AT45DBX_SECTOR_SIZE, there is no need to check page end for each + * byte. + */ +extern Bool at45dbx_write_multiple_sector(U16 nb_sector); + +/*! \brief Callback function invoked before each sector write during + * \ref at45dbx_write_multiple_sector. + * + * \param psector Pointer to sector to write. + */ +extern void at45dbx_write_multiple_sector_callback(void *psector); + +//! @} + + +/*! \name Single-Sector Access Functions + */ +//! @{ + +/*! \brief Reads 1 DF sector to a RAM buffer. + * + * Data flow is: DF -> RAM. + * + * \param ram Pointer to RAM buffer. + * + * \retval OK Success. + * \retval KO Failure. + * + * \note First call must be preceded by a call to the \ref at45dbx_read_open + * function. + */ +extern Bool at45dbx_read_sector_2_ram(void *ram); + +/*! \brief Writes 1 DF sector from a RAM buffer. + * + * Data flow is: RAM -> DF. + * + * \param ram Pointer to RAM buffer. + * + * \retval OK Success. + * \retval KO Failure. + * + * \note First call must be preceded by a call to the \ref at45dbx_write_open + * function. + */ +extern Bool at45dbx_write_sector_from_ram(const void *ram); + +//! @} + + +#endif // _AT45DBX_H_ diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx_mem.c b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx_mem.c new file mode 100644 index 0000000..4c0ace2 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx_mem.c @@ -0,0 +1,234 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief CTRL_ACCESS interface for the AT45DBX data flash controller. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with an SPI module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +//_____ I N C L U D E S ___________________________________________________ + +#include "conf_access.h" + + +#if AT45DBX_MEM == ENABLE + +#include "conf_at45dbx.h" +#include "at45dbx.h" +#include "at45dbx_mem.h" + + +//_____ D E F I N I T I O N S ______________________________________________ + +//! Whether to detect write accesses to the memory. +#define AT45DBX_MEM_TEST_CHANGE_STATE ENABLED + + +#if (ACCESS_USB == ENABLED || ACCESS_MEM_TO_RAM == ENABLED) && AT45DBX_MEM_TEST_CHANGE_STATE == ENABLED + +//! Memory data modified flag. +static volatile Bool s_b_data_modify = FALSE; + +#endif + + +/*! \name Control Interface + */ +//! @{ + + +Ctrl_status at45dbx_test_unit_ready(void) +{ + return (at45dbx_mem_check() == OK) ? CTRL_GOOD : CTRL_NO_PRESENT; +} + + +Ctrl_status at45dbx_read_capacity(U32 *u32_nb_sector) +{ + *u32_nb_sector = (AT45DBX_MEM_CNT << (AT45DBX_MEM_SIZE - AT45DBX_SECTOR_BITS)) - 1; + + return CTRL_GOOD; +} + + +Bool at45dbx_wr_protect(void) +{ + return FALSE; +} + + +Bool at45dbx_removal(void) +{ + return FALSE; +} + + +//! @} + + +#if ACCESS_USB == ENABLED + +#include "usb_drv.h" +#include "scsi_decoder.h" + + +/*! \name MEM <-> USB Interface + */ +//! @{ + + +Ctrl_status at45dbx_usb_read_10(U32 addr, U16 nb_sector) +{ + if (addr + nb_sector > AT45DBX_MEM_CNT << (AT45DBX_MEM_SIZE - AT45DBX_SECTOR_BITS)) return CTRL_FAIL; + + at45dbx_read_open(addr); + at45dbx_read_multiple_sector(nb_sector); + at45dbx_read_close(); + + return CTRL_GOOD; +} + + +void at45dbx_read_multiple_sector_callback(const void *psector) +{ + U16 data_to_transfer = AT45DBX_SECTOR_SIZE; + + // Transfer read sector to the USB interface. + while (data_to_transfer) + { + while (!Is_usb_in_ready(g_scsi_ep_ms_in)) + { + if(!Is_usb_endpoint_enabled(g_scsi_ep_ms_in)) + return; // USB Reset + } + + Usb_reset_endpoint_fifo_access(g_scsi_ep_ms_in); + data_to_transfer = usb_write_ep_txpacket(g_scsi_ep_ms_in, psector, + data_to_transfer, &psector); + Usb_ack_in_ready_send(g_scsi_ep_ms_in); + } +} + + +Ctrl_status at45dbx_usb_write_10(U32 addr, U16 nb_sector) +{ + if (addr + nb_sector > AT45DBX_MEM_CNT << (AT45DBX_MEM_SIZE - AT45DBX_SECTOR_BITS)) return CTRL_FAIL; + +#if AT45DBX_MEM_TEST_CHANGE_STATE == ENABLED + if (nb_sector) s_b_data_modify = TRUE; +#endif + + at45dbx_write_open(addr); + at45dbx_write_multiple_sector(nb_sector); + at45dbx_write_close(); + + return CTRL_GOOD; +} + + +void at45dbx_write_multiple_sector_callback(void *psector) +{ + U16 data_to_transfer = AT45DBX_SECTOR_SIZE; + + // Transfer sector to write from the USB interface. + while (data_to_transfer) + { + while (!Is_usb_out_received(g_scsi_ep_ms_out)) + { + if(!Is_usb_endpoint_enabled(g_scsi_ep_ms_out)) + return; // USB Reset + } + + Usb_reset_endpoint_fifo_access(g_scsi_ep_ms_out); + data_to_transfer = usb_read_ep_rxpacket(g_scsi_ep_ms_out, psector, + data_to_transfer, &psector); + Usb_ack_out_received_free(g_scsi_ep_ms_out); + } +} + + +//! @} + +#endif // ACCESS_USB == ENABLED + + +#if ACCESS_MEM_TO_RAM == ENABLED + +/*! \name MEM <-> RAM Interface + */ +//! @{ + + +Ctrl_status at45dbx_df_2_ram(U32 addr, void *ram) +{ + if (addr + 1 > AT45DBX_MEM_CNT << (AT45DBX_MEM_SIZE - AT45DBX_SECTOR_BITS)) return CTRL_FAIL; + + at45dbx_read_open(addr); + at45dbx_read_sector_2_ram(ram); + at45dbx_read_close(); + + return CTRL_GOOD; +} + + +Ctrl_status at45dbx_ram_2_df(U32 addr, const void *ram) +{ + if (addr + 1 > AT45DBX_MEM_CNT << (AT45DBX_MEM_SIZE - AT45DBX_SECTOR_BITS)) return CTRL_FAIL; + +#if AT45DBX_MEM_TEST_CHANGE_STATE == ENABLED + s_b_data_modify = TRUE; +#endif + + at45dbx_write_open(addr); + at45dbx_write_sector_from_ram(ram); + at45dbx_write_close(); + + return CTRL_GOOD; +} + + +//! @} + +#endif // ACCESS_MEM_TO_RAM == ENABLED + + +#endif // AT45DBX_MEM == ENABLE diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx_mem.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx_mem.h new file mode 100644 index 0000000..de24fa3 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX/at45dbx_mem.h @@ -0,0 +1,164 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief CTRL_ACCESS interface for the AT45DBX data flash controller. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with an SPI module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _AT45DBX_MEM_H_ +#define _AT45DBX_MEM_H_ + + +#include "conf_access.h" + +#if AT45DBX_MEM == DISABLE + #error at45dbx_mem.h is #included although AT45DBX_MEM is disabled +#endif + + +#include "ctrl_access.h" + + +//_____ D E C L A R A T I O N S ____________________________________________ + +/*! \name Control Interface + */ +//! @{ + +/*! \brief Tests the memory state and initializes the memory if required. + * + * The TEST UNIT READY SCSI primary command allows an application client to poll + * a LUN until it is ready without having to allocate memory for returned data. + * + * This command may be used to check the media status of LUNs with removable + * media. + * + * \return Status. + */ +extern Ctrl_status at45dbx_test_unit_ready(void); + +/*! \brief Returns the address of the last valid sector in the memory. + * + * \param u32_nb_sector Pointer to the address of the last valid sector. + * + * \return Status. + */ +extern Ctrl_status at45dbx_read_capacity(U32 *u32_nb_sector); + +/*! \brief Returns the write-protection state of the memory. + * + * \return \c TRUE if the memory is write-protected, else \c FALSE. + * + * \note Only used by removable memories with hardware-specific write + * protection. + */ +extern Bool at45dbx_wr_protect(void); + +/*! \brief Tells whether the memory is removable. + * + * \return \c TRUE if the memory is removable, else \c FALSE. + */ +extern Bool at45dbx_removal(void); + +//! @} + + +#if ACCESS_USB == ENABLED + +/*! \name MEM <-> USB Interface + */ +//! @{ + +/*! \brief Tranfers data from the memory to USB. + * + * \param addr Address of first memory sector to read. + * \param nb_sector Number of sectors to transfer. + * + * \return Status. + */ +extern Ctrl_status at45dbx_usb_read_10(U32 addr, U16 nb_sector); + +/*! \brief Tranfers data from USB to the memory. + * + * \param addr Address of first memory sector to write. + * \param nb_sector Number of sectors to transfer. + * + * \return Status. + */ +extern Ctrl_status at45dbx_usb_write_10(U32 addr, U16 nb_sector); + +//! @} + +#endif + + +#if ACCESS_MEM_TO_RAM == ENABLED + +/*! \name MEM <-> RAM Interface + */ +//! @{ + +/*! \brief Copies 1 data sector from the memory to RAM. + * + * \param addr Address of first memory sector to read. + * \param ram Pointer to RAM buffer to write. + * + * \return Status. + */ +extern Ctrl_status at45dbx_df_2_ram(U32 addr, void *ram); + +/*! \brief Copies 1 data sector from RAM to the memory. + * + * \param addr Address of first memory sector to write. + * \param ram Pointer to RAM buffer to read. + * + * \return Status. + */ +extern Ctrl_status at45dbx_ram_2_df(U32 addr, const void *ram); + +//! @} + +#endif + + +#endif // _AT45DBX_MEM_H_ diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC/flashc.c b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC/flashc.c new file mode 100644 index 0000000..2eee15c --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC/flashc.c @@ -0,0 +1,1117 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief FLASHC driver for AVR32 UC3. + * + * AVR32 Flash Controller driver module. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with a FLASHC module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#include +#include +#include "compiler.h" +#include "flashc.h" + + +/*! \name FLASHC Writable Bit-Field Registers + */ +//! @{ + +typedef union +{ + unsigned long fcr; + avr32_flashc_fcr_t FCR; +} u_avr32_flashc_fcr_t; + +typedef union +{ + unsigned long fcmd; + avr32_flashc_fcmd_t FCMD; +} u_avr32_flashc_fcmd_t; + +//! @} + + +/*! \name Flash Properties + */ +//! @{ + + +unsigned int flashc_get_flash_size(void) +{ +#if (defined AVR32_FLASHC_300_H_INCLUDED) + static const unsigned int FLASH_SIZE[1 << AVR32_FLASHC_PR_FSZ_SIZE] = + { + 32 << 10, + 64 << 10, + 128 << 10, + 256 << 10, + 384 << 10, + 512 << 10, + 768 << 10, + 1024 << 10 + }; + return FLASH_SIZE[(AVR32_FLASHC.pr & AVR32_FLASHC_PR_FSZ_MASK) >> AVR32_FLASHC_PR_FSZ_OFFSET]; +#else + static const unsigned int FLASH_SIZE[1 << AVR32_FLASHC_FSR_FSZ_SIZE] = + { + 32 << 10, + 64 << 10, + 128 << 10, + 256 << 10, + 384 << 10, + 512 << 10, + 768 << 10, + 1024 << 10 + }; + return FLASH_SIZE[(AVR32_FLASHC.fsr & AVR32_FLASHC_FSR_FSZ_MASK) >> AVR32_FLASHC_FSR_FSZ_OFFSET]; +#endif +} + + +unsigned int flashc_get_page_count(void) +{ + return flashc_get_flash_size() / AVR32_FLASHC_PAGE_SIZE; +} + + +unsigned int flashc_get_page_count_per_region(void) +{ + return flashc_get_page_count() / AVR32_FLASHC_REGIONS; +} + + +unsigned int flashc_get_page_region(int page_number) +{ + return ((page_number >= 0) ? page_number : flashc_get_page_number()) / flashc_get_page_count_per_region(); +} + + +unsigned int flashc_get_region_first_page_number(unsigned int region) +{ + return region * flashc_get_page_count_per_region(); +} + + +//! @} + + +/*! \name FLASHC Control + */ +//! @{ + + +unsigned int flashc_get_wait_state(void) +{ + return (AVR32_FLASHC.fcr & AVR32_FLASHC_FCR_FWS_MASK) >> AVR32_FLASHC_FCR_FWS_OFFSET; +} + + +void flashc_set_wait_state(unsigned int wait_state) +{ + u_avr32_flashc_fcr_t u_avr32_flashc_fcr = {AVR32_FLASHC.fcr}; + u_avr32_flashc_fcr.FCR.fws = wait_state; + AVR32_FLASHC.fcr = u_avr32_flashc_fcr.fcr; +} + + +Bool flashc_is_ready_int_enabled(void) +{ + return ((AVR32_FLASHC.fcr & AVR32_FLASHC_FCR_FRDY_MASK) != 0); +} + + +void flashc_enable_ready_int(Bool enable) +{ + u_avr32_flashc_fcr_t u_avr32_flashc_fcr = {AVR32_FLASHC.fcr}; + u_avr32_flashc_fcr.FCR.frdy = (enable != FALSE); + AVR32_FLASHC.fcr = u_avr32_flashc_fcr.fcr; +} + + +Bool flashc_is_lock_error_int_enabled(void) +{ + return ((AVR32_FLASHC.fcr & AVR32_FLASHC_FCR_LOCKE_MASK) != 0); +} + + +void flashc_enable_lock_error_int(Bool enable) +{ + u_avr32_flashc_fcr_t u_avr32_flashc_fcr = {AVR32_FLASHC.fcr}; + u_avr32_flashc_fcr.FCR.locke = (enable != FALSE); + AVR32_FLASHC.fcr = u_avr32_flashc_fcr.fcr; +} + + +Bool flashc_is_prog_error_int_enabled(void) +{ + return ((AVR32_FLASHC.fcr & AVR32_FLASHC_FCR_PROGE_MASK) != 0); +} + + +void flashc_enable_prog_error_int(Bool enable) +{ + u_avr32_flashc_fcr_t u_avr32_flashc_fcr = {AVR32_FLASHC.fcr}; + u_avr32_flashc_fcr.FCR.proge = (enable != FALSE); + AVR32_FLASHC.fcr = u_avr32_flashc_fcr.fcr; +} + + +//! @} + + +/*! \name FLASHC Status + */ +//! @{ + + +Bool flashc_is_ready(void) +{ + return ((AVR32_FLASHC.fsr & AVR32_FLASHC_FSR_FRDY_MASK) != 0); +} + + +void flashc_default_wait_until_ready(void) +{ + while (!flashc_is_ready()); +} + + +void (*volatile flashc_wait_until_ready)(void) = flashc_default_wait_until_ready; + + +/*! \brief Gets the error status of the FLASHC. + * + * \return The error status of the FLASHC built up from + * \c AVR32_FLASHC_FSR_LOCKE_MASK and \c AVR32_FLASHC_FSR_PROGE_MASK. + * + * \warning This hardware error status is cleared by all functions reading the + * Flash Status Register (FSR). This function is therefore not part of + * the driver's API which instead presents \ref flashc_is_lock_error + * and \ref flashc_is_programming_error. + */ +static unsigned int flashc_get_error_status(void) +{ + return AVR32_FLASHC.fsr & (AVR32_FLASHC_FSR_LOCKE_MASK | + AVR32_FLASHC_FSR_PROGE_MASK); +} + + +//! Sticky error status of the FLASHC. +//! This variable is updated by functions that issue FLASHC commands. It +//! contains the cumulated FLASHC error status of all the FLASHC commands issued +//! by a function. +static unsigned int flashc_error_status = 0; + + +Bool flashc_is_lock_error(void) +{ + return ((flashc_error_status & AVR32_FLASHC_FSR_LOCKE_MASK) != 0); +} + + +Bool flashc_is_programming_error(void) +{ + return ((flashc_error_status & AVR32_FLASHC_FSR_PROGE_MASK) != 0); +} + + +//! @} + + +/*! \name FLASHC Command Control + */ +//! @{ + + +unsigned int flashc_get_command(void) +{ + return (AVR32_FLASHC.fcmd & AVR32_FLASHC_FCMD_CMD_MASK) >> AVR32_FLASHC_FCMD_CMD_OFFSET; +} + + +unsigned int flashc_get_page_number(void) +{ + return (AVR32_FLASHC.fcmd & AVR32_FLASHC_FCMD_PAGEN_MASK) >> AVR32_FLASHC_FCMD_PAGEN_OFFSET; +} + + +void flashc_issue_command(unsigned int command, int page_number) +{ + u_avr32_flashc_fcmd_t u_avr32_flashc_fcmd; + flashc_wait_until_ready(); + u_avr32_flashc_fcmd.fcmd = AVR32_FLASHC.fcmd; + u_avr32_flashc_fcmd.FCMD.cmd = command; + if (page_number >= 0) u_avr32_flashc_fcmd.FCMD.pagen = page_number; + u_avr32_flashc_fcmd.FCMD.key = AVR32_FLASHC_FCMD_KEY_KEY; + AVR32_FLASHC.fcmd = u_avr32_flashc_fcmd.fcmd; + flashc_error_status = flashc_get_error_status(); + flashc_wait_until_ready(); +} + + +//! @} + + +/*! \name FLASHC Global Commands + */ +//! @{ + + +void flashc_no_operation(void) +{ + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_NOP, -1); +} + + +void flashc_erase_all(void) +{ + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_EA, -1); +} + + +//! @} + + +/*! \name FLASHC Protection Mechanisms + */ +//! @{ + + +Bool flashc_is_security_bit_active(void) +{ + return ((AVR32_FLASHC.fsr & AVR32_FLASHC_FSR_SECURITY_MASK) != 0); +} + + +void flashc_activate_security_bit(void) +{ + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_SSB, -1); +} + + +unsigned int flashc_get_bootloader_protected_size(void) +{ + unsigned int bootprot = (1 << AVR32_FLASHC_FGPFRLO_BOOTPROT_SIZE) - 1 - + flashc_read_gp_fuse_bitfield(AVR32_FLASHC_FGPFRLO_BOOTPROT_OFFSET, + AVR32_FLASHC_FGPFRLO_BOOTPROT_SIZE); + return (bootprot) ? AVR32_FLASHC_PAGE_SIZE << bootprot : 0; +} + + +unsigned int flashc_set_bootloader_protected_size(unsigned int bootprot_size) +{ + flashc_set_gp_fuse_bitfield(AVR32_FLASHC_FGPFRLO_BOOTPROT_OFFSET, + AVR32_FLASHC_FGPFRLO_BOOTPROT_SIZE, + (1 << AVR32_FLASHC_FGPFRLO_BOOTPROT_SIZE) - 1 - + ((bootprot_size) ? + 32 - clz((((min(max(bootprot_size, AVR32_FLASHC_PAGE_SIZE << 1), + AVR32_FLASHC_PAGE_SIZE << + ((1 << AVR32_FLASHC_FGPFRLO_BOOTPROT_SIZE) - 1)) + + AVR32_FLASHC_PAGE_SIZE - 1) / + AVR32_FLASHC_PAGE_SIZE) << 1) - 1) - 1 : + 0)); + return flashc_get_bootloader_protected_size(); +} + + +Bool flashc_is_external_privileged_fetch_locked(void) +{ + return (!flashc_read_gp_fuse_bit(AVR32_FLASHC_FGPFRLO_EPFL_OFFSET)); +} + + +void flashc_lock_external_privileged_fetch(Bool lock) +{ + flashc_set_gp_fuse_bit(AVR32_FLASHC_FGPFRLO_EPFL_OFFSET, !lock); +} + + +Bool flashc_is_page_region_locked(int page_number) +{ + return flashc_is_region_locked(flashc_get_page_region(page_number)); +} + + +Bool flashc_is_region_locked(unsigned int region) +{ + return ((AVR32_FLASHC.fsr & AVR32_FLASHC_FSR_LOCK0_MASK << (region & (AVR32_FLASHC_REGIONS - 1))) != 0); +} + + +void flashc_lock_page_region(int page_number, Bool lock) +{ + flashc_issue_command((lock) ? AVR32_FLASHC_FCMD_CMD_LP : AVR32_FLASHC_FCMD_CMD_UP, page_number); +} + + +void flashc_lock_region(unsigned int region, Bool lock) +{ + flashc_lock_page_region(flashc_get_region_first_page_number(region), lock); +} + + +void flashc_lock_all_regions(Bool lock) +{ + unsigned int error_status = 0; + unsigned int region = AVR32_FLASHC_REGIONS; + while (region) + { + flashc_lock_region(--region, lock); + error_status |= flashc_error_status; + } + flashc_error_status = error_status; +} + + +//! @} + + +/*! \name Access to General-Purpose Fuses + */ +//! @{ + + +Bool flashc_read_gp_fuse_bit(unsigned int gp_fuse_bit) +{ + return ((flashc_read_all_gp_fuses() & 1ULL << (gp_fuse_bit & 0x3F)) != 0); +} + + +U64 flashc_read_gp_fuse_bitfield(unsigned int pos, unsigned int width) +{ + return flashc_read_all_gp_fuses() >> (pos & 0x3F) & ((1ULL << min(width, 64)) - 1); +} + + +U8 flashc_read_gp_fuse_byte(unsigned int gp_fuse_byte) +{ + return flashc_read_all_gp_fuses() >> ((gp_fuse_byte & 0x07) << 3); +} + + +U64 flashc_read_all_gp_fuses(void) +{ + return AVR32_FLASHC.fgpfrlo | (U64)AVR32_FLASHC.fgpfrhi << 32; +} + + +Bool flashc_erase_gp_fuse_bit(unsigned int gp_fuse_bit, Bool check) +{ + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_EGPB, gp_fuse_bit & 0x3F); + return (check) ? flashc_read_gp_fuse_bit(gp_fuse_bit) : TRUE; +} + + +Bool flashc_erase_gp_fuse_bitfield(unsigned int pos, unsigned int width, Bool check) +{ + unsigned int error_status = 0; + unsigned int gp_fuse_bit; + pos &= 0x3F; + width = min(width, 64); + for (gp_fuse_bit = pos; gp_fuse_bit < pos + width; gp_fuse_bit++) + { + flashc_erase_gp_fuse_bit(gp_fuse_bit, FALSE); + error_status |= flashc_error_status; + } + flashc_error_status = error_status; + return (check) ? (flashc_read_gp_fuse_bitfield(pos, width) == (1ULL << width) - 1) : TRUE; +} + + +Bool flashc_erase_gp_fuse_byte(unsigned int gp_fuse_byte, Bool check) +{ + unsigned int error_status; + unsigned int current_gp_fuse_byte; + U64 value = flashc_read_all_gp_fuses(); + flashc_erase_all_gp_fuses(FALSE); + error_status = flashc_error_status; + for (current_gp_fuse_byte = 0; current_gp_fuse_byte < 8; current_gp_fuse_byte++, value >>= 8) + { + if (current_gp_fuse_byte != gp_fuse_byte) + { + flashc_write_gp_fuse_byte(current_gp_fuse_byte, value); + error_status |= flashc_error_status; + } + } + flashc_error_status = error_status; + return (check) ? (flashc_read_gp_fuse_byte(gp_fuse_byte) == 0xFF) : TRUE; +} + + +Bool flashc_erase_all_gp_fuses(Bool check) +{ + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_EAGPF, -1); + return (check) ? (flashc_read_all_gp_fuses() == 0xFFFFFFFFFFFFFFFFULL) : TRUE; +} + + +void flashc_write_gp_fuse_bit(unsigned int gp_fuse_bit, Bool value) +{ + if (!value) + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_WGPB, gp_fuse_bit & 0x3F); +} + + +void flashc_write_gp_fuse_bitfield(unsigned int pos, unsigned int width, U64 value) +{ + unsigned int error_status = 0; + unsigned int gp_fuse_bit; + pos &= 0x3F; + width = min(width, 64); + for (gp_fuse_bit = pos; gp_fuse_bit < pos + width; gp_fuse_bit++, value >>= 1) + { + flashc_write_gp_fuse_bit(gp_fuse_bit, value & 0x01); + error_status |= flashc_error_status; + } + flashc_error_status = error_status; +} + + +void flashc_write_gp_fuse_byte(unsigned int gp_fuse_byte, U8 value) +{ + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_PGPFB, (gp_fuse_byte & 0x07) | value << 3); +} + + +void flashc_write_all_gp_fuses(U64 value) +{ + unsigned int error_status = 0; + unsigned int gp_fuse_byte; + for (gp_fuse_byte = 0; gp_fuse_byte < 8; gp_fuse_byte++, value >>= 8) + { + flashc_write_gp_fuse_byte(gp_fuse_byte, value); + error_status |= flashc_error_status; + } + flashc_error_status = error_status; +} + + +void flashc_set_gp_fuse_bit(unsigned int gp_fuse_bit, Bool value) +{ + if (value) + flashc_erase_gp_fuse_bit(gp_fuse_bit, FALSE); + else + flashc_write_gp_fuse_bit(gp_fuse_bit, FALSE); +} + + +void flashc_set_gp_fuse_bitfield(unsigned int pos, unsigned int width, U64 value) +{ + unsigned int error_status = 0; + unsigned int gp_fuse_bit; + pos &= 0x3F; + width = min(width, 64); + for (gp_fuse_bit = pos; gp_fuse_bit < pos + width; gp_fuse_bit++, value >>= 1) + { + flashc_set_gp_fuse_bit(gp_fuse_bit, value & 0x01); + error_status |= flashc_error_status; + } + flashc_error_status = error_status; +} + + +void flashc_set_gp_fuse_byte(unsigned int gp_fuse_byte, U8 value) +{ + unsigned int error_status; + switch (value) + { + case 0xFF: + flashc_erase_gp_fuse_byte(gp_fuse_byte, FALSE); + break; + case 0x00: + flashc_write_gp_fuse_byte(gp_fuse_byte, 0x00); + break; + default: + flashc_erase_gp_fuse_byte(gp_fuse_byte, FALSE); + error_status = flashc_error_status; + flashc_write_gp_fuse_byte(gp_fuse_byte, value); + flashc_error_status |= error_status; + } +} + + +void flashc_set_all_gp_fuses(U64 value) +{ + unsigned int error_status; + switch (value) + { + case 0xFFFFFFFFFFFFFFFFULL: + flashc_erase_all_gp_fuses(FALSE); + break; + case 0x0000000000000000ULL: + flashc_write_all_gp_fuses(0x0000000000000000ULL); + break; + default: + flashc_erase_all_gp_fuses(FALSE); + error_status = flashc_error_status; + flashc_write_all_gp_fuses(value); + flashc_error_status |= error_status; + } +} + + +//! @} + + +/*! \name Access to Flash Pages + */ +//! @{ + + +void flashc_clear_page_buffer(void) +{ + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_CPB, -1); +} + + +Bool flashc_is_page_erased(void) +{ + return ((AVR32_FLASHC.fsr & AVR32_FLASHC_FSR_QPRR_MASK) != 0); +} + + +Bool flashc_quick_page_read(int page_number) +{ + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_QPR, page_number); + return flashc_is_page_erased(); +} + + +Bool flashc_erase_page(int page_number, Bool check) +{ + Bool page_erased = TRUE; + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_EP, page_number); + if (check) + { + unsigned int error_status = flashc_error_status; + page_erased = flashc_quick_page_read(-1); + flashc_error_status |= error_status; + } + return page_erased; +} + + +Bool flashc_erase_all_pages(Bool check) +{ + Bool all_pages_erased = TRUE; + unsigned int error_status = 0; + unsigned int page_number = flashc_get_page_count(); + while (page_number) + { + all_pages_erased &= flashc_erase_page(--page_number, check); + error_status |= flashc_error_status; + } + flashc_error_status = error_status; + return all_pages_erased; +} + + +void flashc_write_page(int page_number) +{ + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_WP, page_number); +} + + +Bool flashc_quick_user_page_read(void) +{ + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_QPRUP, -1); + return flashc_is_page_erased(); +} + + +Bool flashc_erase_user_page(Bool check) +{ + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_EUP, -1); + return (check) ? flashc_quick_user_page_read() : TRUE; +} + + +void flashc_write_user_page(void) +{ + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_WUP, -1); +} + + +volatile void *flashc_memset8(volatile void *dst, U8 src, size_t nbytes, Bool erase) +{ + return flashc_memset16(dst, src | (U16)src << 8, nbytes, erase); +} + + +volatile void *flashc_memset16(volatile void *dst, U16 src, size_t nbytes, Bool erase) +{ + return flashc_memset32(dst, src | (U32)src << 16, nbytes, erase); +} + + +volatile void *flashc_memset32(volatile void *dst, U32 src, size_t nbytes, Bool erase) +{ + return flashc_memset64(dst, src | (U64)src << 32, nbytes, erase); +} + + +volatile void *flashc_memset64(volatile void *dst, U64 src, size_t nbytes, Bool erase) +{ + // Use aggregated pointers to have several alignments available for a same address. + UnionCVPtr flash_array_end; + UnionVPtr dest; + Union64 source = {0}; + StructCVPtr dest_end; + UnionCVPtr flash_page_source_end; + Bool incomplete_flash_page_end; + Union64 flash_dword; + UnionVPtr tmp; + unsigned int error_status = 0; + unsigned int i; + + // Reformat arguments. + flash_array_end.u8ptr = AVR32_FLASH + flashc_get_flash_size(); + dest.u8ptr = dst; + for (i = (Get_align((U32)dest.u8ptr, sizeof(U64)) - 1) & (sizeof(U64) - 1); + src; i = (i - 1) & (sizeof(U64) - 1)) + { + source.u8[i] = src; + src >>= 8; + } + dest_end.u8ptr = dest.u8ptr + nbytes; + + // If destination is outside flash, go to next flash page if any. + if (dest.u8ptr < AVR32_FLASH) + { + dest.u8ptr = AVR32_FLASH; + } + else if (flash_array_end.u8ptr <= dest.u8ptr && dest.u8ptr < AVR32_FLASHC_USER_PAGE) + { + dest.u8ptr = AVR32_FLASHC_USER_PAGE; + } + + // If end of destination is outside flash, move it to the end of the previous flash page if any. + if (dest_end.u8ptr > AVR32_FLASHC_USER_PAGE + AVR32_FLASHC_USER_PAGE_SIZE) + { + dest_end.u8ptr = AVR32_FLASHC_USER_PAGE + AVR32_FLASHC_USER_PAGE_SIZE; + } + else if (AVR32_FLASHC_USER_PAGE >= dest_end.u8ptr && dest_end.u8ptr > flash_array_end.u8ptr) + { + dest_end.u8ptr = flash_array_end.u8ptr; + } + + // Align each end of destination pointer with its natural boundary. + dest_end.u16ptr = (U16 *)Align_down((U32)dest_end.u8ptr, sizeof(U16)); + dest_end.u32ptr = (U32 *)Align_down((U32)dest_end.u16ptr, sizeof(U32)); + dest_end.u64ptr = (U64 *)Align_down((U32)dest_end.u32ptr, sizeof(U64)); + + // While end of destination is not reached... + while (dest.u8ptr < dest_end.u8ptr) + { + // Clear the page buffer in order to prepare data for a flash page write. + flashc_clear_page_buffer(); + error_status |= flashc_error_status; + + // Determine where the source data will end in the current flash page. + flash_page_source_end.u64ptr = + (U64 *)min((U32)dest_end.u64ptr, + Align_down((U32)dest.u8ptr, AVR32_FLASHC_PAGE_SIZE) + AVR32_FLASHC_PAGE_SIZE); + + // Determine if the current destination page has an incomplete end. + incomplete_flash_page_end = (Align_down((U32)dest.u8ptr, AVR32_FLASHC_PAGE_SIZE) >= + Align_down((U32)dest_end.u8ptr, AVR32_FLASHC_PAGE_SIZE)); + + // Use a flash double-word buffer to manage unaligned accesses. + flash_dword.u64 = source.u64; + + // If destination does not point to the beginning of the current flash page... + if (!Test_align((U32)dest.u8ptr, AVR32_FLASHC_PAGE_SIZE)) + { + // Fill the beginning of the page buffer with the current flash page data. + // This is required by the hardware, even if page erase is not requested, + // in order to be able to write successfully to erased parts of flash + // pages that have already been written to. + for (tmp.u8ptr = (U8 *)Align_down((U32)dest.u8ptr, AVR32_FLASHC_PAGE_SIZE); + tmp.u64ptr < (U64 *)Align_down((U32)dest.u8ptr, sizeof(U64)); + tmp.u64ptr++) + *tmp.u64ptr = *tmp.u64ptr; + + // If destination is not 64-bit aligned... + if (!Test_align((U32)dest.u8ptr, sizeof(U64))) + { + // Fill the beginning of the flash double-word buffer with the current + // flash page data. + // This is required by the hardware, even if page erase is not + // requested, in order to be able to write successfully to erased parts + // of flash pages that have already been written to. + for (i = 0; i < Get_align((U32)dest.u8ptr, sizeof(U64)); i++) + flash_dword.u8[i] = *tmp.u8ptr++; + + // Align the destination pointer with its 64-bit boundary. + dest.u64ptr = (U64 *)Align_down((U32)dest.u8ptr, sizeof(U64)); + + // If the current destination double-word is not the last one... + if (dest.u64ptr < dest_end.u64ptr) + { + // Write the flash double-word buffer to the page buffer and reinitialize it. + *dest.u64ptr++ = flash_dword.u64; + flash_dword.u64 = source.u64; + } + } + } + + // Write the source data to the page buffer with 64-bit alignment. + for (i = flash_page_source_end.u64ptr - dest.u64ptr; i; i--) + *dest.u64ptr++ = source.u64; + + // If the current destination page has an incomplete end... + if (incomplete_flash_page_end) + { + // This is required by the hardware, even if page erase is not requested, + // in order to be able to write successfully to erased parts of flash + // pages that have already been written to. + { + tmp.u8ptr = (volatile U8 *)dest_end.u8ptr; + + // If end of destination is not 64-bit aligned... + if (!Test_align((U32)dest_end.u8ptr, sizeof(U64))) + { + // Fill the end of the flash double-word buffer with the current flash page data. + for (i = Get_align((U32)dest_end.u8ptr, sizeof(U64)); i < sizeof(U64); i++) + flash_dword.u8[i] = *tmp.u8ptr++; + + // Write the flash double-word buffer to the page buffer. + *dest.u64ptr++ = flash_dword.u64; + } + + // Fill the end of the page buffer with the current flash page data. + for (; !Test_align((U32)tmp.u64ptr, AVR32_FLASHC_PAGE_SIZE); tmp.u64ptr++) + *tmp.u64ptr = *tmp.u64ptr; + } + } + + // If the current flash page is in the flash array... + if (dest.u8ptr <= AVR32_FLASHC_USER_PAGE) + { + // Erase the current page if requested and write it from the page buffer. + if (erase) + { + flashc_erase_page(-1, FALSE); + error_status |= flashc_error_status; + } + flashc_write_page(-1); + error_status |= flashc_error_status; + + // If the end of the flash array is reached, go to the User page. + if (dest.u8ptr >= flash_array_end.u8ptr) + dest.u8ptr = AVR32_FLASHC_USER_PAGE; + } + // If the current flash page is the User page... + else + { + // Erase the User page if requested and write it from the page buffer. + if (erase) + { + flashc_erase_user_page(FALSE); + error_status |= flashc_error_status; + } + flashc_write_user_page(); + error_status |= flashc_error_status; + } + } + + // Update the FLASHC error status. + flashc_error_status = error_status; + + // Return the initial destination pointer as the standard memset function does. + return dst; +} + + +volatile void *flashc_memcpy(volatile void *dst, const void *src, size_t nbytes, Bool erase) +{ + // Use aggregated pointers to have several alignments available for a same address. + UnionCVPtr flash_array_end; + UnionVPtr dest; + UnionCPtr source; + StructCVPtr dest_end; + UnionCVPtr flash_page_source_end; + Bool incomplete_flash_page_end; + Union64 flash_dword; + Bool flash_dword_pending = FALSE; + UnionVPtr tmp; + unsigned int error_status = 0; + unsigned int i, j; + + // Reformat arguments. + flash_array_end.u8ptr = AVR32_FLASH + flashc_get_flash_size(); + dest.u8ptr = dst; + source.u8ptr = src; + dest_end.u8ptr = dest.u8ptr + nbytes; + + // If destination is outside flash, go to next flash page if any. + if (dest.u8ptr < AVR32_FLASH) + { + source.u8ptr += AVR32_FLASH - dest.u8ptr; + dest.u8ptr = AVR32_FLASH; + } + else if (flash_array_end.u8ptr <= dest.u8ptr && dest.u8ptr < AVR32_FLASHC_USER_PAGE) + { + source.u8ptr += AVR32_FLASHC_USER_PAGE - dest.u8ptr; + dest.u8ptr = AVR32_FLASHC_USER_PAGE; + } + + // If end of destination is outside flash, move it to the end of the previous flash page if any. + if (dest_end.u8ptr > AVR32_FLASHC_USER_PAGE + AVR32_FLASHC_USER_PAGE_SIZE) + { + dest_end.u8ptr = AVR32_FLASHC_USER_PAGE + AVR32_FLASHC_USER_PAGE_SIZE; + } + else if (AVR32_FLASHC_USER_PAGE >= dest_end.u8ptr && dest_end.u8ptr > flash_array_end.u8ptr) + { + dest_end.u8ptr = flash_array_end.u8ptr; + } + + // Align each end of destination pointer with its natural boundary. + dest_end.u16ptr = (U16 *)Align_down((U32)dest_end.u8ptr, sizeof(U16)); + dest_end.u32ptr = (U32 *)Align_down((U32)dest_end.u16ptr, sizeof(U32)); + dest_end.u64ptr = (U64 *)Align_down((U32)dest_end.u32ptr, sizeof(U64)); + + // While end of destination is not reached... + while (dest.u8ptr < dest_end.u8ptr) + { + // Clear the page buffer in order to prepare data for a flash page write. + flashc_clear_page_buffer(); + error_status |= flashc_error_status; + + // Determine where the source data will end in the current flash page. + flash_page_source_end.u64ptr = + (U64 *)min((U32)dest_end.u64ptr, + Align_down((U32)dest.u8ptr, AVR32_FLASHC_PAGE_SIZE) + AVR32_FLASHC_PAGE_SIZE); + + // Determine if the current destination page has an incomplete end. + incomplete_flash_page_end = (Align_down((U32)dest.u8ptr, AVR32_FLASHC_PAGE_SIZE) >= + Align_down((U32)dest_end.u8ptr, AVR32_FLASHC_PAGE_SIZE)); + + // If destination does not point to the beginning of the current flash page... + if (!Test_align((U32)dest.u8ptr, AVR32_FLASHC_PAGE_SIZE)) + { + // Fill the beginning of the page buffer with the current flash page data. + // This is required by the hardware, even if page erase is not requested, + // in order to be able to write successfully to erased parts of flash + // pages that have already been written to. + for (tmp.u8ptr = (U8 *)Align_down((U32)dest.u8ptr, AVR32_FLASHC_PAGE_SIZE); + tmp.u64ptr < (U64 *)Align_down((U32)dest.u8ptr, sizeof(U64)); + tmp.u64ptr++) + *tmp.u64ptr = *tmp.u64ptr; + + // If destination is not 64-bit aligned... + if (!Test_align((U32)dest.u8ptr, sizeof(U64))) + { + // Fill the beginning of the flash double-word buffer with the current + // flash page data. + // This is required by the hardware, even if page erase is not + // requested, in order to be able to write successfully to erased parts + // of flash pages that have already been written to. + for (i = 0; i < Get_align((U32)dest.u8ptr, sizeof(U64)); i++) + flash_dword.u8[i] = *tmp.u8ptr++; + + // Fill the end of the flash double-word buffer with the source data. + for (; i < sizeof(U64); i++) + flash_dword.u8[i] = *source.u8ptr++; + + // Align the destination pointer with its 64-bit boundary. + dest.u64ptr = (U64 *)Align_down((U32)dest.u8ptr, sizeof(U64)); + + // If the current destination double-word is not the last one... + if (dest.u64ptr < dest_end.u64ptr) + { + // Write the flash double-word buffer to the page buffer. + *dest.u64ptr++ = flash_dword.u64; + } + // If the current destination double-word is the last one, the flash + // double-word buffer must be kept for later. + else flash_dword_pending = TRUE; + } + } + + // Read the source data with the maximal possible alignment and write it to + // the page buffer with 64-bit alignment. + switch (Get_align((U32)source.u8ptr, sizeof(U32))) + { + case 0: + for (i = flash_page_source_end.u64ptr - dest.u64ptr; i; i--) + *dest.u64ptr++ = *source.u64ptr++; + break; + + case sizeof(U16): + for (i = flash_page_source_end.u64ptr - dest.u64ptr; i; i--) + { + for (j = 0; j < sizeof(U64) / sizeof(U16); j++) flash_dword.u16[j] = *source.u16ptr++; + *dest.u64ptr++ = flash_dword.u64; + } + break; + + default: + for (i = flash_page_source_end.u64ptr - dest.u64ptr; i; i--) + { + for (j = 0; j < sizeof(U64); j++) flash_dword.u8[j] = *source.u8ptr++; + *dest.u64ptr++ = flash_dword.u64; + } + } + + // If the current destination page has an incomplete end... + if (incomplete_flash_page_end) + { + // If the flash double-word buffer is in use, do not initialize it. + if (flash_dword_pending) i = Get_align((U32)dest_end.u8ptr, sizeof(U64)); + // If the flash double-word buffer is free... + else + { + // Fill the beginning of the flash double-word buffer with the source data. + for (i = 0; i < Get_align((U32)dest_end.u8ptr, sizeof(U64)); i++) + flash_dword.u8[i] = *source.u8ptr++; + } + + // This is required by the hardware, even if page erase is not requested, + // in order to be able to write successfully to erased parts of flash + // pages that have already been written to. + { + tmp.u8ptr = (volatile U8 *)dest_end.u8ptr; + + // If end of destination is not 64-bit aligned... + if (!Test_align((U32)dest_end.u8ptr, sizeof(U64))) + { + // Fill the end of the flash double-word buffer with the current flash page data. + for (; i < sizeof(U64); i++) + flash_dword.u8[i] = *tmp.u8ptr++; + + // Write the flash double-word buffer to the page buffer. + *dest.u64ptr++ = flash_dword.u64; + } + + // Fill the end of the page buffer with the current flash page data. + for (; !Test_align((U32)tmp.u64ptr, AVR32_FLASHC_PAGE_SIZE); tmp.u64ptr++) + *tmp.u64ptr = *tmp.u64ptr; + } + } + + // If the current flash page is in the flash array... + if (dest.u8ptr <= AVR32_FLASHC_USER_PAGE) + { + // Erase the current page if requested and write it from the page buffer. + if (erase) + { + flashc_erase_page(-1, FALSE); + error_status |= flashc_error_status; + } + flashc_write_page(-1); + error_status |= flashc_error_status; + + // If the end of the flash array is reached, go to the User page. + if (dest.u8ptr >= flash_array_end.u8ptr) + { + source.u8ptr += AVR32_FLASHC_USER_PAGE - dest.u8ptr; + dest.u8ptr = AVR32_FLASHC_USER_PAGE; + } + } + // If the current flash page is the User page... + else + { + // Erase the User page if requested and write it from the page buffer. + if (erase) + { + flashc_erase_user_page(FALSE); + error_status |= flashc_error_status; + } + flashc_write_user_page(); + error_status |= flashc_error_status; + } + } + + // Update the FLASHC error status. + flashc_error_status = error_status; + + // Return the initial destination pointer as the standard memcpy function does. + return dst; +} + + +#if UC3C +void flashc_set_flash_waitstate_and_readmode(unsigned long cpu_f_hz) +{ + //! Device-specific data + #undef AVR32_FLASHC_FWS_0_MAX_FREQ + #undef AVR32_FLASHC_FWS_1_MAX_FREQ + #undef AVR32_FLASHC_HSEN_FWS_0_MAX_FREQ + #undef AVR32_FLASHC_HSEN_FWS_1_MAX_FREQ + #define AVR32_FLASHC_FWS_0_MAX_FREQ 33000000 + #define AVR32_FLASHC_FWS_1_MAX_FREQ 66000000 + #define AVR32_FLASHC_HSEN_FWS_0_MAX_FREQ 33000000 + #define AVR32_FLASHC_HSEN_FWS_1_MAX_FREQ 72000000 + // These defines are missing from or wrong in the toolchain header files uc3cxxx.h + // Put a Bugzilla + + if(cpu_f_hz > AVR32_FLASHC_HSEN_FWS_0_MAX_FREQ) // > 33MHz + { + // Set a wait-state + flashc_set_wait_state(1); + if(cpu_f_hz <= AVR32_FLASHC_FWS_1_MAX_FREQ) // <= 66MHz and >33Mhz + { + // Disable the high-speed read mode. + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_HSDIS, -1); + } + else // > 66Mhz + { + // Enable the high-speed read mode. + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_HSEN, -1); + } + } + else // <= 33 MHz + { + // Disable wait-state + flashc_set_wait_state(0); + + // Disable the high-speed read mode. + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_HSDIS, -1); + + } +} +#endif // UC3C device-specific implementation + +//! @} diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC/flashc.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC/flashc.h new file mode 100644 index 0000000..9f2547a --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC/flashc.h @@ -0,0 +1,1002 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief FLASHC driver for AVR32 UC3. + * + * AVR32 Flash Controller driver module. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with a FLASHC module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _FLASHC_H_ +#define _FLASHC_H_ + +#include +#include +#include "compiler.h" + +//! Number of flash regions defined by the FLASHC. +#define AVR32_FLASHC_REGIONS (AVR32_FLASHC_FLASH_SIZE /\ + (AVR32_FLASHC_PAGES_PR_REGION * AVR32_FLASHC_PAGE_SIZE)) + + +/*! \name Flash Properties + */ +//! @{ + +/*! \brief Gets the size of the whole flash array. + * + * \return The size of the whole flash array in bytes. + */ +extern unsigned int flashc_get_flash_size(void); + +/*! \brief Gets the total number of pages in the flash array. + * + * \return The total number of pages in the flash array. + */ +extern unsigned int flashc_get_page_count(void); + +/*! \brief Gets the number of pages in each flash region. + * + * \return The number of pages in each flash region. + */ +extern unsigned int flashc_get_page_count_per_region(void); + +/*! \brief Gets the region number of a page. + * + * \param page_number The page number: + * \arg \c 0 to (flashc_get_page_count() - 1): a page number within + * the flash array; + * \arg < 0: the current page number. + * + * \return The region number of the specified page. + */ +extern unsigned int flashc_get_page_region(int page_number); + +/*! \brief Gets the number of the first page of a region. + * + * \param region The region number: \c 0 to (AVR32_FLASHC_REGIONS - 1). + * + * \return The number of the first page of the specified region. + */ +extern unsigned int flashc_get_region_first_page_number(unsigned int region); + +//! @} + + +/*! \name FLASHC Control + */ +//! @{ + +/*! \brief Gets the number of wait states of flash read accesses. + * + * \return The number of wait states of flash read accesses. + */ +extern unsigned int flashc_get_wait_state(void); + +/*! \brief Sets the number of wait states of flash read accesses. + * + * \param wait_state The number of wait states of flash read accesses: \c 0 to + * \c 1. + */ +extern void flashc_set_wait_state(unsigned int wait_state); + +/*! \brief Tells whether the Flash Ready interrupt is enabled. + * + * \return Whether the Flash Ready interrupt is enabled. + */ +extern Bool flashc_is_ready_int_enabled(void); + +/*! \brief Enables or disables the Flash Ready interrupt. + * + * \param enable Whether to enable the Flash Ready interrupt: \c TRUE or + * \c FALSE. + */ +extern void flashc_enable_ready_int(Bool enable); + +/*! \brief Tells whether the Lock Error interrupt is enabled. + * + * \return Whether the Lock Error interrupt is enabled. + */ +extern Bool flashc_is_lock_error_int_enabled(void); + +/*! \brief Enables or disables the Lock Error interrupt. + * + * \param enable Whether to enable the Lock Error interrupt: \c TRUE or + * \c FALSE. + */ +extern void flashc_enable_lock_error_int(Bool enable); + +/*! \brief Tells whether the Programming Error interrupt is enabled. + * + * \return Whether the Programming Error interrupt is enabled. + */ +extern Bool flashc_is_prog_error_int_enabled(void); + +/*! \brief Enables or disables the Programming Error interrupt. + * + * \param enable Whether to enable the Programming Error interrupt: \c TRUE or + * \c FALSE. + */ +extern void flashc_enable_prog_error_int(Bool enable); + +//! @} + + +/*! \name FLASHC Status + */ +//! @{ + +/*! \brief Tells whether the FLASHC is ready to run a new command. + * + * \return Whether the FLASHC is ready to run a new command. + */ +extern Bool flashc_is_ready(void); + +/*! \brief Waits actively until the FLASHC is ready to run a new command. + * + * This is the default function assigned to \ref flashc_wait_until_ready. + */ +extern void flashc_default_wait_until_ready(void); + +//! Pointer to the function used by the driver when it needs to wait until the +//! FLASHC is ready to run a new command. +//! The default function is \ref flashc_default_wait_until_ready. +//! The user may change this pointer to use another implementation. +extern void (*volatile flashc_wait_until_ready)(void); + +/*! \brief Tells whether a Lock Error has occurred during the last function + * called that issued one or more FLASHC commands. + * + * \return Whether a Lock Error has occurred during the last function called + * that issued one or more FLASHC commands. + */ +extern Bool flashc_is_lock_error(void); + +/*! \brief Tells whether a Programming Error has occurred during the last + * function called that issued one or more FLASHC commands. + * + * \return Whether a Programming Error has occurred during the last function + * called that issued one or more FLASHC commands. + */ +extern Bool flashc_is_programming_error(void); + +//! @} + + +/*! \name FLASHC Command Control + */ +//! @{ + +/*! \brief Gets the last issued FLASHC command. + * + * \return The last issued FLASHC command. + */ +extern unsigned int flashc_get_command(void); + +/*! \brief Gets the current FLASHC page number. + * + * \return The current FLASHC page number. + */ +extern unsigned int flashc_get_page_number(void); + +/*! \brief Issues a FLASHC command. + * + * \param command The command: \c AVR32_FLASHC_FCMD_CMD_x. + * \param page_number The page number to apply the command to: + * \arg \c 0 to (flashc_get_page_count() - 1): a page number within + * the flash array; + * \arg < 0: use this to apply the command to the current page number + * or if the command does not apply to any page number; + * \arg this argument may have other meanings according to the command. See + * the FLASHC chapter of the MCU datasheet. + * + * \warning A Lock Error is issued if the command violates the protection + * mechanism. + * + * \warning A Programming Error is issued if the command is invalid. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +extern void flashc_issue_command(unsigned int command, int page_number); + +//! @} + + +/*! \name FLASHC Global Commands + */ +//! @{ + +/*! \brief Issues a No Operation command to the FLASHC. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +extern void flashc_no_operation(void); + +/*! \brief Issues an Erase All command to the FLASHC. + * + * This command erases all bits in the flash array, the general-purpose fuse + * bits and the Security bit. The User page is not erased. + * + * This command also ensures that all volatile memories, such as register file + * and RAMs, are erased before the Security bit is erased, i.e. deactivated. + * + * \warning A Lock Error is issued if at least one region is locked or the + * bootloader protection is active. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note An erase operation can only set bits. + */ +extern void flashc_erase_all(void); + +//! @} + + +/*! \name FLASHC Protection Mechanisms + */ +//! @{ + +/*! \brief Tells whether the Security bit is active. + * + * \return Whether the Security bit is active. + */ +extern Bool flashc_is_security_bit_active(void); + +/*! \brief Activates the Security bit. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +extern void flashc_activate_security_bit(void); + +/*! \brief Gets the bootloader protected size. + * + * \return The bootloader protected size in bytes. + */ +extern unsigned int flashc_get_bootloader_protected_size(void); + +/*! \brief Sets the bootloader protected size. + * + * \param bootprot_size The wanted bootloader protected size in bytes. If this + * size is not supported, the actual size will be the + * nearest greater available size or the maximal possible + * size if the requested size is too large. + * + * \return The actual bootloader protected size in bytes. + * + * \warning A Lock Error is issued if the Security bit is active. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +extern unsigned int flashc_set_bootloader_protected_size(unsigned int bootprot_size); + +/*! \brief Tells whether external privileged fetch is locked. + * + * \return Whether external privileged fetch is locked. + */ +extern Bool flashc_is_external_privileged_fetch_locked(void); + +/*! \brief Locks or unlocks external privileged fetch. + * + * \param lock Whether to lock external privileged fetch: \c TRUE or \c FALSE. + * + * \warning A Lock Error is issued if the Security bit is active. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +extern void flashc_lock_external_privileged_fetch(Bool lock); + +/*! \brief Tells whether the region of a page is locked. + * + * \param page_number The page number: + * \arg \c 0 to (flashc_get_page_count() - 1): a page number within + * the flash array; + * \arg < 0: the current page number. + * + * \return Whether the region of the specified page is locked. + */ +extern Bool flashc_is_page_region_locked(int page_number); + +/*! \brief Tells whether a region is locked. + * + * \param region The region number: \c 0 to (AVR32_FLASHC_REGIONS - 1). + * + * \return Whether the specified region is locked. + */ +extern Bool flashc_is_region_locked(unsigned int region); + +/*! \brief Locks or unlocks the region of a page. + * + * \param page_number The page number: + * \arg \c 0 to (flashc_get_page_count() - 1): a page number within + * the flash array; + * \arg < 0: the current page number. + * \param lock Whether to lock the region of the specified page: \c TRUE or + * \c FALSE. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +extern void flashc_lock_page_region(int page_number, Bool lock); + +/*! \brief Locks or unlocks a region. + * + * \param region The region number: \c 0 to (AVR32_FLASHC_REGIONS - 1). + * \param lock Whether to lock the specified region: \c TRUE or \c FALSE. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +extern void flashc_lock_region(unsigned int region, Bool lock); + +/*! \brief Locks or unlocks all regions. + * + * \param lock Whether to lock the regions: \c TRUE or \c FALSE. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +extern void flashc_lock_all_regions(Bool lock); + +//! @} + + +/*! \name Access to General-Purpose Fuses + */ +//! @{ + +/*! \brief Reads a general-purpose fuse bit. + * + * \param gp_fuse_bit The general-purpose fuse bit: \c 0 to \c 63. + * + * \return The value of the specified general-purpose fuse bit. + * + * \note The actual number of general-purpose fuse bits implemented by hardware + * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are + * fixed at 1 by hardware. + */ +extern Bool flashc_read_gp_fuse_bit(unsigned int gp_fuse_bit); + +/*! \brief Reads a general-purpose fuse bit-field. + * + * \param pos The bit-position of the general-purpose fuse bit-field: \c 0 to + * \c 63. + * \param width The bit-width of the general-purpose fuse bit-field: \c 0 to + * \c 64. + * + * \return The value of the specified general-purpose fuse bit-field. + * + * \note The actual number of general-purpose fuse bits implemented by hardware + * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are + * fixed at 1 by hardware. + */ +extern U64 flashc_read_gp_fuse_bitfield(unsigned int pos, unsigned int width); + +/*! \brief Reads a general-purpose fuse byte. + * + * \param gp_fuse_byte The general-purpose fuse byte: \c 0 to \c 7. + * + * \return The value of the specified general-purpose fuse byte. + * + * \note The actual number of general-purpose fuse bits implemented by hardware + * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are + * fixed at 1 by hardware. + */ +extern U8 flashc_read_gp_fuse_byte(unsigned int gp_fuse_byte); + +/*! \brief Reads all general-purpose fuses. + * + * \return The value of all general-purpose fuses as a word. + * + * \note The actual number of general-purpose fuse bits implemented by hardware + * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are + * fixed at 1 by hardware. + */ +extern U64 flashc_read_all_gp_fuses(void); + +/*! \brief Erases a general-purpose fuse bit. + * + * \param gp_fuse_bit The general-purpose fuse bit: \c 0 to \c 63. + * \param check Whether to check erase: \c TRUE or \c FALSE. + * + * \return Whether the erase succeeded or always \c TRUE if erase check was not + * requested. + * + * \warning A Lock Error is issued if the Security bit is active and the command + * is applied to BOOTPROT or EPFL fuses. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note An erase operation can only set bits. + * + * \note The actual number of general-purpose fuse bits implemented by hardware + * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are + * fixed at 1 by hardware. + */ +extern Bool flashc_erase_gp_fuse_bit(unsigned int gp_fuse_bit, Bool check); + +/*! \brief Erases a general-purpose fuse bit-field. + * + * \param pos The bit-position of the general-purpose fuse bit-field: \c 0 to + * \c 63. + * \param width The bit-width of the general-purpose fuse bit-field: \c 0 to + * \c 64. + * \param check Whether to check erase: \c TRUE or \c FALSE. + * + * \return Whether the erase succeeded or always \c TRUE if erase check was not + * requested. + * + * \warning A Lock Error is issued if the Security bit is active and the command + * is applied to BOOTPROT or EPFL fuses. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note An erase operation can only set bits. + * + * \note The actual number of general-purpose fuse bits implemented by hardware + * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are + * fixed at 1 by hardware. + */ +extern Bool flashc_erase_gp_fuse_bitfield(unsigned int pos, unsigned int width, Bool check); + +/*! \brief Erases a general-purpose fuse byte. + * + * \param gp_fuse_byte The general-purpose fuse byte: \c 0 to \c 7. + * \param check Whether to check erase: \c TRUE or \c FALSE. + * + * \return Whether the erase succeeded or always \c TRUE if erase check was not + * requested. + * + * \warning A Lock Error is issued if the Security bit is active. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note An erase operation can only set bits. + * + * \note The actual number of general-purpose fuse bits implemented by hardware + * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are + * fixed at 1 by hardware. + */ +extern Bool flashc_erase_gp_fuse_byte(unsigned int gp_fuse_byte, Bool check); + +/*! \brief Erases all general-purpose fuses. + * + * \param check Whether to check erase: \c TRUE or \c FALSE. + * + * \return Whether the erase succeeded or always \c TRUE if erase check was not + * requested. + * + * \warning A Lock Error is issued if the Security bit is active. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note An erase operation can only set bits. + * + * \note The actual number of general-purpose fuse bits implemented by hardware + * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are + * fixed at 1 by hardware. + */ +extern Bool flashc_erase_all_gp_fuses(Bool check); + +/*! \brief Writes a general-purpose fuse bit. + * + * \param gp_fuse_bit The general-purpose fuse bit: \c 0 to \c 63. + * \param value The value of the specified general-purpose fuse bit. + * + * \warning A Lock Error is issued if the Security bit is active and the command + * is applied to BOOTPROT or EPFL fuses. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note A write operation can only clear bits. + * + * \note The actual number of general-purpose fuse bits implemented by hardware + * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are + * fixed at 1 by hardware. + */ +extern void flashc_write_gp_fuse_bit(unsigned int gp_fuse_bit, Bool value); + +/*! \brief Writes a general-purpose fuse bit-field. + * + * \param pos The bit-position of the general-purpose fuse bit-field: \c 0 to + * \c 63. + * \param width The bit-width of the general-purpose fuse bit-field: \c 0 to + * \c 64. + * \param value The value of the specified general-purpose fuse bit-field. + * + * \warning A Lock Error is issued if the Security bit is active and the command + * is applied to BOOTPROT or EPFL fuses. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note A write operation can only clear bits. + * + * \note The actual number of general-purpose fuse bits implemented by hardware + * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are + * fixed at 1 by hardware. + */ +extern void flashc_write_gp_fuse_bitfield(unsigned int pos, unsigned int width, U64 value); + +/*! \brief Writes a general-purpose fuse byte. + * + * \param gp_fuse_byte The general-purpose fuse byte: \c 0 to \c 7. + * \param value The value of the specified general-purpose fuse byte. + * + * \warning A Lock Error is issued if the Security bit is active. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note A write operation can only clear bits. + * + * \note The actual number of general-purpose fuse bits implemented by hardware + * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are + * fixed at 1 by hardware. + */ +extern void flashc_write_gp_fuse_byte(unsigned int gp_fuse_byte, U8 value); + +/*! \brief Writes all general-purpose fuses. + * + * \param value The value of all general-purpose fuses as a word. + * + * \warning A Lock Error is issued if the Security bit is active. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note A write operation can only clear bits. + * + * \note The actual number of general-purpose fuse bits implemented by hardware + * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are + * fixed at 1 by hardware. + */ +extern void flashc_write_all_gp_fuses(U64 value); + +/*! \brief Sets a general-purpose fuse bit with the appropriate erase and write + * operations. + * + * \param gp_fuse_bit The general-purpose fuse bit: \c 0 to \c 63. + * \param value The value of the specified general-purpose fuse bit. + * + * \warning A Lock Error is issued if the Security bit is active and the command + * is applied to BOOTPROT or EPFL fuses. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note The actual number of general-purpose fuse bits implemented by hardware + * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are + * fixed at 1 by hardware. + */ +extern void flashc_set_gp_fuse_bit(unsigned int gp_fuse_bit, Bool value); + +/*! \brief Sets a general-purpose fuse bit-field with the appropriate erase and + * write operations. + * + * \param pos The bit-position of the general-purpose fuse bit-field: \c 0 to + * \c 63. + * \param width The bit-width of the general-purpose fuse bit-field: \c 0 to + * \c 64. + * \param value The value of the specified general-purpose fuse bit-field. + * + * \warning A Lock Error is issued if the Security bit is active and the command + * is applied to BOOTPROT or EPFL fuses. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note The actual number of general-purpose fuse bits implemented by hardware + * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are + * fixed at 1 by hardware. + */ +extern void flashc_set_gp_fuse_bitfield(unsigned int pos, unsigned int width, U64 value); + +/*! \brief Sets a general-purpose fuse byte with the appropriate erase and write + * operations. + * + * \param gp_fuse_byte The general-purpose fuse byte: \c 0 to \c 7. + * \param value The value of the specified general-purpose fuse byte. + * + * \warning A Lock Error is issued if the Security bit is active. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note The actual number of general-purpose fuse bits implemented by hardware + * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are + * fixed at 1 by hardware. + */ +extern void flashc_set_gp_fuse_byte(unsigned int gp_fuse_byte, U8 value); + +/*! \brief Sets all general-purpose fuses with the appropriate erase and write + * operations. + * + * \param value The value of all general-purpose fuses as a word. + * + * \warning A Lock Error is issued if the Security bit is active. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note The actual number of general-purpose fuse bits implemented by hardware + * is given by \c AVR32_FLASHC_GPF_NUM. The other bits among the 64 are + * fixed at 1 by hardware. + */ +extern void flashc_set_all_gp_fuses(U64 value); + +//! @} + + +/*! \name Access to Flash Pages + */ +//! @{ + +/*! \brief Clears the page buffer. + * + * This command resets all bits in the page buffer to one. Write accesses to the + * page buffer can only change page buffer bits from one to zero. + * + * \warning The page buffer is not automatically reset after a page write. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +extern void flashc_clear_page_buffer(void); + +/*! \brief Tells whether the page to which the last Quick Page Read or Quick + * Page Read User Page command was applied was erased. + * + * \return Whether the page to which the last Quick Page Read or Quick Page Read + * User Page command was applied was erased. + */ +extern Bool flashc_is_page_erased(void); + +/*! \brief Applies the Quick Page Read command to a page. + * + * \param page_number The page number: + * \arg \c 0 to (flashc_get_page_count() - 1): a page number within + * the flash array; + * \arg < 0: the current page number. + * + * \return Whether the specified page is erased. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +extern Bool flashc_quick_page_read(int page_number); + +/*! \brief Erases a page. + * + * \param page_number The page number: + * \arg \c 0 to (flashc_get_page_count() - 1): a page number within + * the flash array; + * \arg < 0: the current page number. + * \param check Whether to check erase: \c TRUE or \c FALSE. + * + * \return Whether the erase succeeded or always \c TRUE if erase check was not + * requested. + * + * \warning A Lock Error is issued if the command is applied to a page belonging + * to a locked region or to the bootloader protected area. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note An erase operation can only set bits. + */ +extern Bool flashc_erase_page(int page_number, Bool check); + +/*! \brief Erases all pages within the flash array. + * + * \param check Whether to check erase: \c TRUE or \c FALSE. + * + * \return Whether the erase succeeded or always \c TRUE if erase check was not + * requested. + * + * \warning A Lock Error is issued if at least one region is locked or the + * bootloader protection is active. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note An erase operation can only set bits. + */ +extern Bool flashc_erase_all_pages(Bool check); + +/*! \brief Writes a page from the page buffer. + * + * \param page_number The page number: + * \arg \c 0 to (flashc_get_page_count() - 1): a page number within + * the flash array; + * \arg < 0: the current page number. + * + * \warning A Lock Error is issued if the command is applied to a page belonging + * to a locked region or to the bootloader protected area. + * + * \warning The page buffer is not automatically reset after a page write. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note A write operation can only clear bits. + */ +extern void flashc_write_page(int page_number); + +/*! \brief Issues a Quick Page Read User Page command to the FLASHC. + * + * \return Whether the User page is erased. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +extern Bool flashc_quick_user_page_read(void); + +/*! \brief Erases the User page. + * + * \param check Whether to check erase: \c TRUE or \c FALSE. + * + * \return Whether the erase succeeded or always \c TRUE if erase check was not + * requested. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note An erase operation can only set bits. + */ +extern Bool flashc_erase_user_page(Bool check); + +/*! \brief Writes the User page from the page buffer. + * + * \warning The page buffer is not automatically reset after a page write. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + * + * \note A write operation can only clear bits. + */ +extern void flashc_write_user_page(void); + +/*! \brief Copies \a nbytes bytes to the flash destination pointed to by \a dst + * from the repeated \a src source byte. + * + * The destination areas that are not within the flash array or the User page + * are ignored. + * + * All pointer and size alignments are supported. + * + * \param dst Pointer to flash destination. + * \param src Source byte. + * \param nbytes Number of bytes to set. + * \param erase Whether to erase before writing: \c TRUE or \c FALSE. + * + * \return The value of \a dst. + * + * \warning This function may be called with \a erase set to \c FALSE only if + * the destination consists only of erased words, i.e. this function + * can not be used to write only one bit of a previously written word. + * E.g., if \c 0x00000001 then \c 0xFFFFFFFE are written to a word, the + * resulting value in flash may be different from \c 0x00000000. + * + * \warning A Lock Error is issued if the command is applied to pages belonging + * to a locked region or to the bootloader protected area. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +extern volatile void *flashc_memset8(volatile void *dst, U8 src, size_t nbytes, Bool erase); + +/*! \brief Copies \a nbytes bytes to the flash destination pointed to by \a dst + * from the repeated \a src big-endian source half-word. + * + * The destination areas that are not within the flash array or the User page + * are ignored. + * + * All pointer and size alignments are supported. + * + * \param dst Pointer to flash destination. + * \param src Source half-word. + * \param nbytes Number of bytes to set. + * \param erase Whether to erase before writing: \c TRUE or \c FALSE. + * + * \return The value of \a dst. + * + * \warning This function may be called with \a erase set to \c FALSE only if + * the destination consists only of erased words, i.e. this function + * can not be used to write only one bit of a previously written word. + * E.g., if \c 0x00000001 then \c 0xFFFFFFFE are written to a word, the + * resulting value in flash may be different from \c 0x00000000. + * + * \warning A Lock Error is issued if the command is applied to pages belonging + * to a locked region or to the bootloader protected area. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +extern volatile void *flashc_memset16(volatile void *dst, U16 src, size_t nbytes, Bool erase); + +/*! \brief Copies \a nbytes bytes to the flash destination pointed to by \a dst + * from the repeated \a src big-endian source word. + * + * The destination areas that are not within the flash array or the User page + * are ignored. + * + * All pointer and size alignments are supported. + * + * \param dst Pointer to flash destination. + * \param src Source word. + * \param nbytes Number of bytes to set. + * \param erase Whether to erase before writing: \c TRUE or \c FALSE. + * + * \return The value of \a dst. + * + * \warning This function may be called with \a erase set to \c FALSE only if + * the destination consists only of erased words, i.e. this function + * can not be used to write only one bit of a previously written word. + * E.g., if \c 0x00000001 then \c 0xFFFFFFFE are written to a word, the + * resulting value in flash may be different from \c 0x00000000. + * + * \warning A Lock Error is issued if the command is applied to pages belonging + * to a locked region or to the bootloader protected area. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +extern volatile void *flashc_memset32(volatile void *dst, U32 src, size_t nbytes, Bool erase); + +/*! \brief Copies \a nbytes bytes to the flash destination pointed to by \a dst + * from the repeated \a src big-endian source double-word. + * + * The destination areas that are not within the flash array or the User page + * are ignored. + * + * All pointer and size alignments are supported. + * + * \param dst Pointer to flash destination. + * \param src Source double-word. + * \param nbytes Number of bytes to set. + * \param erase Whether to erase before writing: \c TRUE or \c FALSE. + * + * \return The value of \a dst. + * + * \warning This function may be called with \a erase set to \c FALSE only if + * the destination consists only of erased words, i.e. this function + * can not be used to write only one bit of a previously written word. + * E.g., if \c 0x00000001 then \c 0xFFFFFFFE are written to a word, the + * resulting value in flash may be different from \c 0x00000000. + * + * \warning A Lock Error is issued if the command is applied to pages belonging + * to a locked region or to the bootloader protected area. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +extern volatile void *flashc_memset64(volatile void *dst, U64 src, size_t nbytes, Bool erase); + +/*! \brief Copies \a nbytes bytes to the flash destination pointed to by \a dst + * from the repeated \a src big-endian source pattern. + * + * The destination areas that are not within the flash array or the User page + * are ignored. + * + * All pointer and size alignments are supported. + * + * \param dst Pointer to flash destination. + * \param src Source double-word. + * \param src_width \a src width in bits: 8, 16, 32 or 64. + * \param nbytes Number of bytes to set. + * \param erase Whether to erase before writing: \c TRUE or \c FALSE. + * + * \return The value of \a dst. + * + * \warning This function may be called with \a erase set to \c FALSE only if + * the destination consists only of erased words, i.e. this function + * can not be used to write only one bit of a previously written word. + * E.g., if \c 0x00000001 then \c 0xFFFFFFFE are written to a word, the + * resulting value in flash may be different from \c 0x00000000. + * + * \warning A Lock Error is issued if the command is applied to pages belonging + * to a locked region or to the bootloader protected area. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +#define flashc_memset(dst, src, src_width, nbytes, erase) \ + TPASTE2(flashc_memset, src_width)((dst), (src), (nbytes), (erase)) + +/*! \brief Copies \a nbytes bytes to the flash destination pointed to by \a dst + * from the source pointed to by \a src. + * + * The destination areas that are not within the flash array or the User page + * are ignored. + * + * All pointer and size alignments are supported. + * + * \param dst Pointer to flash destination. + * \param src Pointer to source data. + * \param nbytes Number of bytes to copy. + * \param erase Whether to erase before writing: \c TRUE or \c FALSE. + * + * \return The value of \a dst. + * + * \warning If copying takes place between areas that overlap, the behavior is + * undefined. + * + * \warning This function may be called with \a erase set to \c FALSE only if + * the destination consists only of erased words, i.e. this function + * can not be used to write only one bit of a previously written word. + * E.g., if \c 0x00000001 then \c 0xFFFFFFFE are written to a word, the + * resulting value in flash may be different from \c 0x00000000. + * + * \warning A Lock Error is issued if the command is applied to pages belonging + * to a locked region or to the bootloader protected area. + * + * \note The FLASHC error status returned by \ref flashc_is_lock_error and + * \ref flashc_is_programming_error is updated. + */ +extern volatile void *flashc_memcpy(volatile void *dst, const void *src, size_t nbytes, Bool erase); + +#if UC3C + +/*! \brief Depednding to the CPU frequency, set the wait states of flash read + * accesses and enable or disable the High speed read mode. + * + * \param cpu_f_hz The CPU frequency + */ +void flashc_set_flash_waitstate_and_readmode(unsigned long cpu_f_hz); +#endif // UC3C device-specific implementation + +//! @} + + +#endif // _FLASHC_H_ diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO/gpio.c b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO/gpio.c new file mode 100644 index 0000000..b6b83c7 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO/gpio.c @@ -0,0 +1,458 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file has been prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief GPIO driver for AVR32 UC3. + * + * This file defines a useful set of functions for the GPIO. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with a GPIO module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + *****************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#include "gpio.h" + +//! GPIO module instance. +#define GPIO AVR32_GPIO + + +/*! \name Peripheral Bus Interface + */ +//! @{ + + +int gpio_enable_module(const gpio_map_t gpiomap, unsigned int size) +{ + int status = GPIO_SUCCESS; + unsigned int i; + + for (i = 0; i < size; i++) + { + status |= gpio_enable_module_pin(gpiomap->pin, gpiomap->function); + gpiomap++; + } + + return status; +} + + +int gpio_enable_module_pin(unsigned int pin, unsigned int function) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + + // Enable the correct function. + switch (function) + { + case 0: // A function. + gpio_port->pmr0c = 1 << (pin & 0x1F); + gpio_port->pmr1c = 1 << (pin & 0x1F); +#if defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED) + gpio_port->pmr2c = 1 << (pin & 0x1F); +#endif + break; + + case 1: // B function. + gpio_port->pmr0s = 1 << (pin & 0x1F); + gpio_port->pmr1c = 1 << (pin & 0x1F); +#if defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED) + gpio_port->pmr2c = 1 << (pin & 0x1F); +#endif + break; + + case 2: // C function. + gpio_port->pmr0c = 1 << (pin & 0x1F); + gpio_port->pmr1s = 1 << (pin & 0x1F); +#if defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED) + gpio_port->pmr2c = 1 << (pin & 0x1F); +#endif + break; + + case 3: // D function. + gpio_port->pmr0s = 1 << (pin & 0x1F); + gpio_port->pmr1s = 1 << (pin & 0x1F); +#if defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED) + gpio_port->pmr2c = 1 << (pin & 0x1F); +#endif + break; + +#if defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED) + case 4: // E function. + gpio_port->pmr0c = 1 << (pin & 0x1F); + gpio_port->pmr1c = 1 << (pin & 0x1F); + gpio_port->pmr2s = 1 << (pin & 0x1F); + break; + + case 5: // F function. + gpio_port->pmr0s = 1 << (pin & 0x1F); + gpio_port->pmr1c = 1 << (pin & 0x1F); + gpio_port->pmr2s = 1 << (pin & 0x1F); + break; + + case 6: // G function. + gpio_port->pmr0c = 1 << (pin & 0x1F); + gpio_port->pmr1s = 1 << (pin & 0x1F); + gpio_port->pmr2s = 1 << (pin & 0x1F); + break; + + case 7: // H function. + gpio_port->pmr0s = 1 << (pin & 0x1F); + gpio_port->pmr1s = 1 << (pin & 0x1F); + gpio_port->pmr2s = 1 << (pin & 0x1F); + break; +#endif + + default: + return GPIO_INVALID_ARGUMENT; + } + + // Disable GPIO control. + gpio_port->gperc = 1 << (pin & 0x1F); + + return GPIO_SUCCESS; +} + + +void gpio_enable_gpio(const gpio_map_t gpiomap, unsigned int size) +{ + unsigned int i; + + for (i = 0; i < size; i++) + { + gpio_enable_gpio_pin(gpiomap->pin); + gpiomap++; + } +} + + +void gpio_enable_gpio_pin(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + gpio_port->oderc = 1 << (pin & 0x1F); + gpio_port->gpers = 1 << (pin & 0x1F); +} + + +// The open-drain mode is not synthesized on the current AVR32 products. +// If one day some AVR32 products have this feature, the corresponding part +// numbers should be listed in the #if below. +// Note that other functions are available in this driver to use pins with open +// drain in GPIO mode. The advantage of the open-drain mode functions over these +// other functions is that they can be used not only in GPIO mode but also in +// module mode. +#if 0 + + +void gpio_enable_pin_open_drain(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + gpio_port->odmers = 1 << (pin & 0x1F); +} + + +void gpio_disable_pin_open_drain(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + gpio_port->odmerc = 1 << (pin & 0x1F); +} + + +#endif + + +void gpio_enable_pin_pull_up(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + gpio_port->puers = 1 << (pin & 0x1F); +#if defined(AVR32_GPIO_200_H_INCLUDED) || defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED) + gpio_port->pderc = 1 << (pin & 0x1F); +#endif +} + + +void gpio_disable_pin_pull_up(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + gpio_port->puerc = 1 << (pin & 0x1F); +} + +#if defined(AVR32_GPIO_200_H_INCLUDED) || defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED) +// Added support of Pull-up Resistor, Pull-down Resistor and Buskeeper Control. + +/*! \brief Enables the pull-down resistor of a pin. + * + * \param pin The pin number. + */ +void gpio_enable_pin_pull_down(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + gpio_port->puerc = 1 << (pin & 0x1F); + gpio_port->pders = 1 << (pin & 0x1F); +} + +/*! \brief Disables the pull-down resistor of a pin. + * + * \param pin The pin number. + */ +void gpio_disable_pin_pull_down(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + gpio_port->pderc = 1 << (pin & 0x1F); +} + +/*! \brief Enables the buskeeper functionality on a pin. + * + * \param pin The pin number. + */ +void gpio_enable_pin_buskeeper(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + gpio_port->puers = 1 << (pin & 0x1F); + gpio_port->pders = 1 << (pin & 0x1F); +} + +/*! \brief Disables the buskeeper functionality on a pin. + * + * \param pin The pin number. + */ +void gpio_disable_pin_buskeeper(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + gpio_port->puerc = 1 << (pin & 0x1F); + gpio_port->pderc = 1 << (pin & 0x1F); +} + +#endif + +int gpio_get_pin_value(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + return (gpio_port->pvr >> (pin & 0x1F)) & 1; +} + + +int gpio_get_gpio_pin_output_value(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + return (gpio_port->ovr >> (pin & 0x1F)) & 1; +} + + +int gpio_get_gpio_open_drain_pin_output_value(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + return ((gpio_port->oder >> (pin & 0x1F)) & 1) ^ 1; +} + + +void gpio_set_gpio_pin(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + + gpio_port->ovrs = 1 << (pin & 0x1F); // Value to be driven on the I/O line: 1. + gpio_port->oders = 1 << (pin & 0x1F); // The GPIO output driver is enabled for that pin. + gpio_port->gpers = 1 << (pin & 0x1F); // The GPIO module controls that pin. +} + + +void gpio_clr_gpio_pin(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + + gpio_port->ovrc = 1 << (pin & 0x1F); // Value to be driven on the I/O line: 0. + gpio_port->oders = 1 << (pin & 0x1F); // The GPIO output driver is enabled for that pin. + gpio_port->gpers = 1 << (pin & 0x1F); // The GPIO module controls that pin. +} + + +void gpio_tgl_gpio_pin(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + + gpio_port->ovrt = 1 << (pin & 0x1F); // Toggle the I/O line. + gpio_port->oders = 1 << (pin & 0x1F); // The GPIO output driver is enabled for that pin. + gpio_port->gpers = 1 << (pin & 0x1F); // The GPIO module controls that pin. +} + + +void gpio_set_gpio_open_drain_pin(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + + gpio_port->oderc = 1 << (pin & 0x1F); // The GPIO output driver is disabled for that pin. + gpio_port->gpers = 1 << (pin & 0x1F); // The GPIO module controls that pin. +} + + +void gpio_clr_gpio_open_drain_pin(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + + gpio_port->ovrc = 1 << (pin & 0x1F); // Value to be driven on the I/O line: 0. + gpio_port->oders = 1 << (pin & 0x1F); // The GPIO output driver is enabled for that pin. + gpio_port->gpers = 1 << (pin & 0x1F); // The GPIO module controls that pin. +} + + +void gpio_tgl_gpio_open_drain_pin(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + + gpio_port->ovrc = 1 << (pin & 0x1F); // Value to be driven on the I/O line if the GPIO output driver is enabled: 0. + gpio_port->odert = 1 << (pin & 0x1F); // The GPIO output driver is toggled for that pin. + gpio_port->gpers = 1 << (pin & 0x1F); // The GPIO module controls that pin. +} + + +void gpio_enable_pin_glitch_filter(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + gpio_port->gfers = 1 << (pin & 0x1F); +} + + +void gpio_disable_pin_glitch_filter(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + gpio_port->gferc = 1 << (pin & 0x1F); +} + +/*! \brief Configure the edge detector of an input pin + * + * \param pin The pin number. + * \param mode The edge detection mode (\ref GPIO_PIN_CHANGE, \ref GPIO_RISING_EDGE + * or \ref GPIO_FALLING_EDGE). + * + * \return \ref GPIO_SUCCESS or \ref GPIO_INVALID_ARGUMENT. + */ +static int gpio_configure_edge_detector(unsigned int pin, unsigned int mode) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + + // Configure the edge detector. + switch (mode) + { + case GPIO_PIN_CHANGE: + gpio_port->imr0c = 1 << (pin & 0x1F); + gpio_port->imr1c = 1 << (pin & 0x1F); + break; + + case GPIO_RISING_EDGE: + gpio_port->imr0s = 1 << (pin & 0x1F); + gpio_port->imr1c = 1 << (pin & 0x1F); + break; + + case GPIO_FALLING_EDGE: + gpio_port->imr0c = 1 << (pin & 0x1F); + gpio_port->imr1s = 1 << (pin & 0x1F); + break; + + default: + return GPIO_INVALID_ARGUMENT; + } + + return GPIO_SUCCESS; +} + + +int gpio_enable_pin_interrupt(unsigned int pin, unsigned int mode) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + + // Enable the glitch filter. + gpio_port->gfers = 1 << (pin & 0x1F); + + // Configure the edge detector. + if(GPIO_INVALID_ARGUMENT == gpio_configure_edge_detector(pin, mode)) + return(GPIO_INVALID_ARGUMENT); + + // Enable interrupt. + gpio_port->iers = 1 << (pin & 0x1F); + + return GPIO_SUCCESS; +} + + +void gpio_disable_pin_interrupt(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + gpio_port->ierc = 1 << (pin & 0x1F); +} + + +int gpio_get_pin_interrupt_flag(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + return (gpio_port->ifr >> (pin & 0x1F)) & 1; +} + + +void gpio_clear_pin_interrupt_flag(unsigned int pin) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + gpio_port->ifrc = 1 << (pin & 0x1F); +} + + +//# +//# Peripheral Event System Support. +//# +#if UC3L +int gpio_configure_pin_periph_event_mode(unsigned int pin, unsigned int mode, unsigned int use_igf) +{ + volatile avr32_gpio_port_t *gpio_port = &GPIO.port[pin >> 5]; + + if(TRUE == use_igf) + { + // Enable the glitch filter. + gpio_port->gfers = 1 << (pin & 0x1F); + } + else + { + // Disable the glitch filter. + gpio_port->gferc = 1 << (pin & 0x1F); + } + + // Configure the edge detector. + return(gpio_configure_edge_detector(pin, mode)); +} + +#endif + +//! @} diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO/gpio.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO/gpio.h new file mode 100644 index 0000000..f0b5fd8 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO/gpio.h @@ -0,0 +1,583 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file has been prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief GPIO header for AVR32 UC3. + * + * This file contains basic GPIO driver functions. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with a GPIO module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + *****************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _GPIO_H_ +#define _GPIO_H_ + +#include +#include "compiler.h" + +/*! \name Return Values of the GPIO API + */ +//! @{ +#define GPIO_SUCCESS 0 //!< Function successfully completed. +#define GPIO_INVALID_ARGUMENT 1 //!< Input parameters are out of range. +//! @} + + +/*! \name Interrupt Trigger Modes + */ +//! @{ +#define GPIO_PIN_CHANGE 0 //!< Interrupt triggered upon pin change. +#define GPIO_RISING_EDGE 1 //!< Interrupt triggered upon rising edge. +#define GPIO_FALLING_EDGE 2 //!< Interrupt triggered upon falling edge. +//! @} + + +//! A type definition of pins and modules connectivity. +typedef struct +{ + unsigned char pin; //!< Module pin. + unsigned char function; //!< Module function. +} gpio_map_t[]; + + +/*! \name Peripheral Bus Interface + * + * Low-speed interface with a non-deterministic number of clock cycles per + * access. + * + * This interface operates with lower clock frequencies (fPB <= fCPU), and its + * timing is not deterministic since it needs to access a shared bus which may + * be heavily loaded. + * + * \note This interface is immediately available without initialization. + */ +//! @{ + +/*! \brief Enables specific module modes for a set of pins. + * + * \param gpiomap The pin map. + * \param size The number of pins in \a gpiomap. + * + * \return \ref GPIO_SUCCESS or \ref GPIO_INVALID_ARGUMENT. + */ +extern int gpio_enable_module(const gpio_map_t gpiomap, unsigned int size); + +/*! \brief Enables a specific module mode for a pin. + * + * \param pin The pin number.\n + * Refer to the product header file `uc3x.h' (where x is the part + * number; e.g. x = a0512) for module pins. E.g., to enable a PWM + * channel output, the pin number can be AVR32_PWM_3_PIN for PWM + * channel 3. + * \param function The pin function.\n + * Refer to the product header file `uc3x.h' (where x is the + * part number; e.g. x = a0512) for module pin functions. E.g., + * to enable a PWM channel output, the pin function can be + * AVR32_PWM_3_FUNCTION for PWM channel 3. + * + * \return \ref GPIO_SUCCESS or \ref GPIO_INVALID_ARGUMENT. + */ +extern int gpio_enable_module_pin(unsigned int pin, unsigned int function); + +/*! \brief Enables the GPIO mode of a set of pins. + * + * \param gpiomap The pin map. + * \param size The number of pins in \a gpiomap. + */ +extern void gpio_enable_gpio(const gpio_map_t gpiomap, unsigned int size); + +/*! \brief Enables the GPIO mode of a pin. + * + * \param pin The pin number.\n + * Refer to the product header file `uc3x.h' (where x is the part + * number; e.g. x = a0512) for pin definitions. E.g., to enable the + * GPIO mode of PX21, AVR32_PIN_PX21 can be used. Module pins such as + * AVR32_PWM_3_PIN for PWM channel 3 can also be used to release + * module pins for GPIO. + */ +extern void gpio_enable_gpio_pin(unsigned int pin); + +// The open-drain mode is not synthesized on the current AVR32 products. +// If one day some AVR32 products have this feature, the corresponding part +// numbers should be listed in the #if below. +// Note that other functions are available in this driver to use pins with open +// drain in GPIO mode. The advantage of the open-drain mode functions over these +// other functions is that they can be used not only in GPIO mode but also in +// module mode. +#if 0 + +/*! \brief Enables the open-drain mode of a pin. + * + * \param pin The pin number. + */ +extern void gpio_enable_pin_open_drain(unsigned int pin); + +/*! \brief Disables the open-drain mode of a pin. + * + * \param pin The pin number. + */ +extern void gpio_disable_pin_open_drain(unsigned int pin); + +#endif + +/*! \brief Enables the pull-up resistor of a pin. + * + * \param pin The pin number. + */ +extern void gpio_enable_pin_pull_up(unsigned int pin); + +/*! \brief Disables the pull-up resistor of a pin. + * + * \param pin The pin number. + */ +extern void gpio_disable_pin_pull_up(unsigned int pin); + +#if defined(AVR32_GPIO_200_H_INCLUDED) || defined(AVR32_GPIO_210_H_INCLUDED) || defined(AVR32_GPIO_211_H_INCLUDED) +// Added support of Pull-up Resistor, Pull-down Resistor and Buskeeper Control. + +/*! \brief Enables the pull-down resistor of a pin. + * + * \param pin The pin number. + */ +extern void gpio_enable_pin_pull_down(unsigned int pin); + +/*! \brief Disables the pull-down resistor of a pin. + * + * \param pin The pin number. + */ +extern void gpio_disable_pin_pull_down(unsigned int pin); + +/*! \brief Enables the buskeeper functionality on a pin. + * + * \param pin The pin number. + */ +extern void gpio_enable_pin_buskeeper(unsigned int pin); + +/*! \brief Disables the buskeeper functionality on a pin. + * + * \param pin The pin number. + */ +extern void gpio_disable_pin_buskeeper(unsigned int pin); + +#endif + +/*! \brief Returns the value of a pin. + * + * \param pin The pin number. + * + * \return The pin value. + */ +extern int gpio_get_pin_value(unsigned int pin); + +/*! \brief Returns the output value set for a GPIO pin. + * + * \param pin The pin number. + * + * \return The pin output value. + * + * \note This function must be used in conjunction with \ref gpio_set_gpio_pin, + * \ref gpio_clr_gpio_pin and \ref gpio_tgl_gpio_pin. + */ +extern int gpio_get_gpio_pin_output_value(unsigned int pin); + +/*! \brief Returns the output value set for a GPIO pin using open drain. + * + * \param pin The pin number. + * + * \return The pin output value. + * + * \note This function must be used in conjunction with + * \ref gpio_set_gpio_open_drain_pin, \ref gpio_clr_gpio_open_drain_pin + * and \ref gpio_tgl_gpio_open_drain_pin. + */ +extern int gpio_get_gpio_open_drain_pin_output_value(unsigned int pin); + +/*! \brief Drives a GPIO pin to 1. + * + * \param pin The pin number. + */ +extern void gpio_set_gpio_pin(unsigned int pin); + +/*! \brief Drives a GPIO pin to 0. + * + * \param pin The pin number. + */ +extern void gpio_clr_gpio_pin(unsigned int pin); + +/*! \brief Toggles a GPIO pin. + * + * \param pin The pin number. + */ +extern void gpio_tgl_gpio_pin(unsigned int pin); + +/*! \brief Drives a GPIO pin to 1 using open drain. + * + * \param pin The pin number. + */ +extern void gpio_set_gpio_open_drain_pin(unsigned int pin); + +/*! \brief Drives a GPIO pin to 0 using open drain. + * + * \param pin The pin number. + */ +extern void gpio_clr_gpio_open_drain_pin(unsigned int pin); + +/*! \brief Toggles a GPIO pin using open drain. + * + * \param pin The pin number. + */ +extern void gpio_tgl_gpio_open_drain_pin(unsigned int pin); + +/*! \brief Enables the glitch filter of a pin. + * + * When the glitch filter is enabled, a glitch with duration of less than 1 + * clock cycle is automatically rejected, while a pulse with duration of 2 clock + * cycles or more is accepted. For pulse durations between 1 clock cycle and 2 + * clock cycles, the pulse may or may not be taken into account, depending on + * the precise timing of its occurrence. Thus for a pulse to be guaranteed + * visible it must exceed 2 clock cycles, whereas for a glitch to be reliably + * filtered out, its duration must not exceed 1 clock cycle. The filter + * introduces 2 clock cycles latency. + * + * \param pin The pin number. + */ +extern void gpio_enable_pin_glitch_filter(unsigned int pin); + +/*! \brief Disables the glitch filter of a pin. + * + * \param pin The pin number. + */ +extern void gpio_disable_pin_glitch_filter(unsigned int pin); + +/*! \brief Enables the interrupt of a pin with the specified settings. + * + * \param pin The pin number. + * \param mode The trigger mode (\ref GPIO_PIN_CHANGE, \ref GPIO_RISING_EDGE or + * \ref GPIO_FALLING_EDGE). + * + * \return \ref GPIO_SUCCESS or \ref GPIO_INVALID_ARGUMENT. + */ +extern int gpio_enable_pin_interrupt(unsigned int pin, unsigned int mode); + +/*! \brief Disables the interrupt of a pin. + * + * \param pin The pin number. + */ +extern void gpio_disable_pin_interrupt(unsigned int pin); + +/*! \brief Gets the interrupt flag of a pin. + * + * \param pin The pin number. + * + * \return The pin interrupt flag. + */ +extern int gpio_get_pin_interrupt_flag(unsigned int pin); + +/*! \brief Clears the interrupt flag of a pin. + * + * \param pin The pin number. + */ +extern void gpio_clear_pin_interrupt_flag(unsigned int pin); + +//! @} + + +#if (defined AVR32_GPIO_LOCAL_ADDRESS) +/*! \name Local Bus Interface + * + * High-speed interface with only one clock cycle per access. + * + * This interface operates with high clock frequency (fCPU), and its timing is + * deterministic since it does not need to access a shared bus which may be + * heavily loaded. + * + * \warning To use this interface, the clock frequency of the peripheral bus on + * which the GPIO peripheral is connected must be set to the CPU clock + * frequency (fPB = fCPU). + * + * \note This interface has to be initialized in order to be available. + */ +//! @{ + +/*! \brief Enables the local bus interface for GPIO. + * + * \note This function must have been called at least once before using other + * functions in this interface. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void gpio_local_init(void) +{ + Set_system_register(AVR32_CPUCR, + Get_system_register(AVR32_CPUCR) | AVR32_CPUCR_LOCEN_MASK); +} + +/*! \brief Enables the output driver of a pin. + * + * \param pin The pin number. + * + * \note \ref gpio_local_init must have been called beforehand. + * + * \note This function does not enable the GPIO mode of the pin. + * \ref gpio_enable_gpio_pin can be called for this purpose. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void gpio_local_enable_pin_output_driver(unsigned int pin) +{ + AVR32_GPIO_LOCAL.port[pin >> 5].oders = 1 << (pin & 0x1F); +} + +/*! \brief Disables the output driver of a pin. + * + * \param pin The pin number. + * + * \note \ref gpio_local_init must have been called beforehand. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void gpio_local_disable_pin_output_driver(unsigned int pin) +{ + AVR32_GPIO_LOCAL.port[pin >> 5].oderc = 1 << (pin & 0x1F); +} + +/*! \brief Returns the value of a pin. + * + * \param pin The pin number. + * + * \return The pin value. + * + * \note \ref gpio_local_init must have been called beforehand. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ int gpio_local_get_pin_value(unsigned int pin) +{ + return (AVR32_GPIO_LOCAL.port[pin >> 5].pvr >> (pin & 0x1F)) & 1; +} + +/*! \brief Drives a GPIO pin to 1. + * + * \param pin The pin number. + * + * \note \ref gpio_local_init must have been called beforehand. + * + * \note This function does not enable the GPIO mode of the pin nor its output + * driver. \ref gpio_enable_gpio_pin and + * \ref gpio_local_enable_pin_output_driver can be called for this + * purpose. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void gpio_local_set_gpio_pin(unsigned int pin) +{ + AVR32_GPIO_LOCAL.port[pin >> 5].ovrs = 1 << (pin & 0x1F); +} + +/*! \brief Drives a GPIO pin to 0. + * + * \param pin The pin number. + * + * \note \ref gpio_local_init must have been called beforehand. + * + * \note This function does not enable the GPIO mode of the pin nor its output + * driver. \ref gpio_enable_gpio_pin and + * \ref gpio_local_enable_pin_output_driver can be called for this + * purpose. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void gpio_local_clr_gpio_pin(unsigned int pin) +{ + AVR32_GPIO_LOCAL.port[pin >> 5].ovrc = 1 << (pin & 0x1F); +} + +/*! \brief Toggles a GPIO pin. + * + * \param pin The pin number. + * + * \note \ref gpio_local_init must have been called beforehand. + * + * \note This function does not enable the GPIO mode of the pin nor its output + * driver. \ref gpio_enable_gpio_pin and + * \ref gpio_local_enable_pin_output_driver can be called for this + * purpose. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void gpio_local_tgl_gpio_pin(unsigned int pin) +{ + AVR32_GPIO_LOCAL.port[pin >> 5].ovrt = 1 << (pin & 0x1F); +} + +/*! \brief Initializes the configuration of a GPIO pin so that it can be used + * with GPIO open-drain functions. + * + * \note This function must have been called at least once before using + * \ref gpio_local_set_gpio_open_drain_pin, + * \ref gpio_local_clr_gpio_open_drain_pin or + * \ref gpio_local_tgl_gpio_open_drain_pin. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void gpio_local_init_gpio_open_drain_pin(unsigned int pin) +{ + AVR32_GPIO_LOCAL.port[pin >> 5].ovrc = 1 << (pin & 0x1F); +} + +/*! \brief Drives a GPIO pin to 1 using open drain. + * + * \param pin The pin number. + * + * \note \ref gpio_local_init and \ref gpio_local_init_gpio_open_drain_pin must + * have been called beforehand. + * + * \note This function does not enable the GPIO mode of the pin. + * \ref gpio_enable_gpio_pin can be called for this purpose. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void gpio_local_set_gpio_open_drain_pin(unsigned int pin) +{ + AVR32_GPIO_LOCAL.port[pin >> 5].oderc = 1 << (pin & 0x1F); +} + +/*! \brief Drives a GPIO pin to 0 using open drain. + * + * \param pin The pin number. + * + * \note \ref gpio_local_init and \ref gpio_local_init_gpio_open_drain_pin must + * have been called beforehand. + * + * \note This function does not enable the GPIO mode of the pin. + * \ref gpio_enable_gpio_pin can be called for this purpose. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void gpio_local_clr_gpio_open_drain_pin(unsigned int pin) +{ + AVR32_GPIO_LOCAL.port[pin >> 5].oders = 1 << (pin & 0x1F); +} + +/*! \brief Toggles a GPIO pin using open drain. + * + * \param pin The pin number. + * + * \note \ref gpio_local_init and \ref gpio_local_init_gpio_open_drain_pin must + * have been called beforehand. + * + * \note This function does not enable the GPIO mode of the pin. + * \ref gpio_enable_gpio_pin can be called for this purpose. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void gpio_local_tgl_gpio_open_drain_pin(unsigned int pin) +{ + AVR32_GPIO_LOCAL.port[pin >> 5].odert = 1 << (pin & 0x1F); +} + +//! @} +#endif // AVR32_GPIO_LOCAL_ADDRESS + +#if UC3L +//! @{ +/*! \name Peripheral Event System support + * + * The GPIO can be programmed to output peripheral events whenever an interrupt + * condition is detected, such as pin value change, or only when a rising or + * falling edge is detected. + * + */ + +/*! \brief Enables the peripheral event generation of a pin. + * + * \param pin The pin number. + * + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void gpio_enable_pin_periph_event(unsigned int pin) +{ + AVR32_GPIO.port[pin >> 5].oderc = 1 << (pin & 0x1F); // The GPIO output driver is disabled for that pin. + AVR32_GPIO.port[pin >> 5].evers = 1 << (pin & 0x1F); +} + +/*! \brief Disables the peripheral event generation of a pin. + * + * \param pin The pin number. + * + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void gpio_disable_pin_periph_event(unsigned int pin) +{ + AVR32_GPIO.port[pin >> 5].everc = 1 << (pin & 0x1F); +} + +/*! \brief Configure the peripheral event trigger mode of a pin + * + * \param pin The pin number. + * \param mode The trigger mode (\ref GPIO_PIN_CHANGE, \ref GPIO_RISING_EDGE or + * \ref GPIO_FALLING_EDGE). + * \param use_igf use the Input Glitch Filter (TRUE) or not (FALSE). + * + * \return \ref GPIO_SUCCESS or \ref GPIO_INVALID_ARGUMENT. + */ +extern int gpio_configure_pin_periph_event_mode(unsigned int pin, unsigned int mode, unsigned int use_igf); + +//! @} +#endif + + +#endif // _GPIO_H_ diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/exception.x b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/exception.x new file mode 100644 index 0000000..ec4109d --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/exception.x @@ -0,0 +1,239 @@ +/* This file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Exception and interrupt vectors. + * + * This file maps all events supported by an AVR32. + * + * - Compiler: GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with an INTC module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#if !__AVR32_UC__ && !__AVR32_AP__ + #error Implementation of the AVR32 architecture not supported by the INTC driver. +#endif + + +#include + + +//! @{ +//! \verbatim + + + .section .exception, "ax", @progbits + + +// Start of Exception Vector Table. + + // EVBA must be aligned with a power of two strictly greater than the EVBA- + // relative offset of the last vector. + .balign 0x200 + + // Export symbol. + .global _evba + .type _evba, @function +_evba: + + .org 0x000 + // Unrecoverable Exception. +_handle_Unrecoverable_Exception: + rjmp $ + + .org 0x004 + // TLB Multiple Hit. +_handle_TLB_Multiple_Hit: + rjmp $ + + .org 0x008 + // Bus Error Data Fetch. +_handle_Bus_Error_Data_Fetch: + rjmp $ + + .org 0x00C + // Bus Error Instruction Fetch. +_handle_Bus_Error_Instruction_Fetch: + rjmp $ + + .org 0x010 + // NMI. +_handle_NMI: + rjmp $ + + .org 0x014 + // Instruction Address. +_handle_Instruction_Address: + rjmp $ + + .org 0x018 + // ITLB Protection. +_handle_ITLB_Protection: + rjmp $ + + .org 0x01C + // Breakpoint. +_handle_Breakpoint: + rjmp $ + + .org 0x020 + // Illegal Opcode. +_handle_Illegal_Opcode: + rjmp $ + + .org 0x024 + // Unimplemented Instruction. +_handle_Unimplemented_Instruction: + rjmp $ + + .org 0x028 + // Privilege Violation. +_handle_Privilege_Violation: + rjmp $ + + .org 0x02C + // Floating-Point: UNUSED IN AVR32UC and AVR32AP. +_handle_Floating_Point: + rjmp $ + + .org 0x030 + // Coprocessor Absent: UNUSED IN AVR32UC. +_handle_Coprocessor_Absent: + rjmp $ + + .org 0x034 + // Data Address (Read). +_handle_Data_Address_Read: + rjmp $ + + .org 0x038 + // Data Address (Write). +_handle_Data_Address_Write: + rjmp $ + + .org 0x03C + // DTLB Protection (Read). +_handle_DTLB_Protection_Read: + rjmp $ + + .org 0x040 + // DTLB Protection (Write). +_handle_DTLB_Protection_Write: + rjmp $ + + .org 0x044 + // DTLB Modified: UNUSED IN AVR32UC. +_handle_DTLB_Modified: + rjmp $ + + .org 0x050 + // ITLB Miss. +_handle_ITLB_Miss: + rjmp $ + + .org 0x060 + // DTLB Miss (Read). +_handle_DTLB_Miss_Read: + rjmp $ + + .org 0x070 + // DTLB Miss (Write). +_handle_DTLB_Miss_Write: + rjmp $ + + .org 0x100 + // Supervisor Call. +_handle_Supervisor_Call: + rjmp $ + + +// Interrupt support. +// The interrupt controller must provide the offset address relative to EVBA. +// Important note: +// All interrupts call a C function named _get_interrupt_handler. +// This function will read group and interrupt line number to then return in +// R12 a pointer to a user-provided interrupt handler. + + .balign 4 + + .irp priority, 0, 1, 2, 3 +_int\priority: +#if __AVR32_UC__ + // R8-R12, LR, PC and SR are automatically pushed onto the system stack by the + // CPU upon interrupt entry. No other register is saved by hardware. +#elif __AVR32_AP__ + // PC and SR are automatically saved in respectively RAR_INTx and RSR_INTx by + // the CPU upon interrupt entry. No other register is saved by hardware. + pushm r8-r12, lr +#endif + mov r12, \priority // Pass the int_level parameter to the _get_interrupt_handler function. + call _get_interrupt_handler + cp.w r12, 0 // Get the pointer to the interrupt handler returned by the function. +#if __AVR32_UC__ + movne pc, r12 // If this was not a spurious interrupt (R12 != NULL), jump to the handler. +#elif __AVR32_AP__ + breq spint\priority // If this was a spurious interrupt (R12 == NULL), branch. + st.w --sp, r12 // Push the pointer to the interrupt handler onto the system stack since no register may be altered. + popm r8-r12, lr, pc // Restore registers and jump to the handler. +spint\priority: + popm r8-r12, lr +#endif + rete // If this was a spurious interrupt (R12 == NULL), return from event handler. + .endr + + +// Constant data area. + + .balign 4 + + // Values to store in the interrupt priority registers for the various interrupt priority levels. + // The interrupt priority registers contain the interrupt priority level and + // the EVBA-relative interrupt vector offset. + .global ipr_val + .type ipr_val, @object +ipr_val: + .word (AVR32_INTC_INT0 << AVR32_INTC_IPR_INTLEVEL_OFFSET) | (_int0 - _evba),\ + (AVR32_INTC_INT1 << AVR32_INTC_IPR_INTLEVEL_OFFSET) | (_int1 - _evba),\ + (AVR32_INTC_INT2 << AVR32_INTC_IPR_INTLEVEL_OFFSET) | (_int2 - _evba),\ + (AVR32_INTC_INT3 << AVR32_INTC_IPR_INTLEVEL_OFFSET) | (_int3 - _evba) + + +//! \endverbatim +//! @} diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/intc.c b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/intc.c new file mode 100644 index 0000000..84d498d --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/intc.c @@ -0,0 +1,214 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief INTC driver for AVR32 UC3. + * + * AVR32 Interrupt Controller driver module. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with an INTC module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#include +#include "compiler.h" +#include "preprocessor.h" +#include "intc.h" + +// define _evba from exception.S +extern void _evba; + +//! Values to store in the interrupt priority registers for the various interrupt priority levels. +extern const unsigned int ipr_val[AVR32_INTC_NUM_INT_LEVELS]; + +//! Creates a table of interrupt line handlers per interrupt group in order to optimize RAM space. +//! Each line handler table contains a set of pointers to interrupt handlers. +#if (defined __GNUC__) +#define DECL_INT_LINE_HANDLER_TABLE(GRP, unused) \ +static volatile __int_handler _int_line_handler_table_##GRP[Max(AVR32_INTC_NUM_IRQS_PER_GRP##GRP, 1)]; +#elif (defined __ICCAVR32__) +#define DECL_INT_LINE_HANDLER_TABLE(GRP, unused) \ +static volatile __no_init __int_handler _int_line_handler_table_##GRP[Max(AVR32_INTC_NUM_IRQS_PER_GRP##GRP, 1)]; +#endif +MREPEAT(AVR32_INTC_NUM_INT_GRPS, DECL_INT_LINE_HANDLER_TABLE, ~); +#undef DECL_INT_LINE_HANDLER_TABLE + +//! Table containing for each interrupt group the number of interrupt request +//! lines and a pointer to the table of interrupt line handlers. +static const struct +{ + unsigned int num_irqs; + volatile __int_handler *_int_line_handler_table; +} _int_handler_table[AVR32_INTC_NUM_INT_GRPS] = +{ +#define INSERT_INT_LINE_HANDLER_TABLE(GRP, unused) \ + {AVR32_INTC_NUM_IRQS_PER_GRP##GRP, _int_line_handler_table_##GRP}, + MREPEAT(AVR32_INTC_NUM_INT_GRPS, INSERT_INT_LINE_HANDLER_TABLE, ~) +#undef INSERT_INT_LINE_HANDLER_TABLE +}; + + +/*! \brief Default interrupt handler. + * + * \note Taken and adapted from Newlib. + */ +#if (defined __GNUC__) +__attribute__((__interrupt__)) +#elif (defined __ICCAVR32__) +__interrupt +#endif +static void _unhandled_interrupt(void) +{ + // Catch unregistered interrupts. + while (TRUE); +} + + +/*! \brief Gets the interrupt handler of the current event at the \a int_level + * interrupt priority level (called from exception.S). + * + * \param int_level Interrupt priority level to handle. + * + * \return Interrupt handler to execute. + * + * \note Taken and adapted from Newlib. + */ +__int_handler _get_interrupt_handler(unsigned int int_level) +{ + // ICR3 is mapped first, ICR0 last. + // Code in exception.S puts int_level in R12 which is used by AVR32-GCC to + // pass a single argument to a function. + unsigned int int_grp = AVR32_INTC.icr[AVR32_INTC_INT3 - int_level]; + unsigned int int_req = AVR32_INTC.irr[int_grp]; + + // As an interrupt may disappear while it is being fetched by the CPU + // (spurious interrupt caused by a delayed response from an MCU peripheral to + // an interrupt flag clear or interrupt disable instruction), check if there + // are remaining interrupt lines to process. + // If a spurious interrupt occurs, the status register (SR) contains an + // execution mode and interrupt level masks corresponding to a level 0 + // interrupt, whatever the interrupt priority level causing the spurious + // event. This behavior has been chosen because a spurious interrupt has not + // to be a priority one and because it may not cause any trouble to other + // interrupts. + // However, these spurious interrupts place the hardware in an unstable state + // and could give problems in other/future versions of the CPU, so the + // software has to be written so that they never occur. The only safe way of + // achieving this is to always clear or disable peripheral interrupts with the + // following sequence: + // 1: Mask the interrupt in the CPU by setting GM (or IxM) in SR. + // 2: Perform the bus access to the peripheral register that clears or + // disables the interrupt. + // 3: Wait until the interrupt has actually been cleared or disabled by the + // peripheral. This is usually performed by reading from a register in the + // same peripheral (it DOES NOT have to be the same register that was + // accessed in step 2, but it MUST be in the same peripheral), what takes + // bus system latencies into account, but peripheral internal latencies + // (generally 0 cycle) also have to be considered. + // 4: Unmask the interrupt in the CPU by clearing GM (or IxM) in SR. + // Note that steps 1 and 4 are useless inside interrupt handlers as the + // corresponding interrupt level is automatically masked by IxM (unless IxM is + // explicitly cleared by the software). + // + // Get the right IRQ handler. + // + // If several interrupt lines are active in the group, the interrupt line with + // the highest number is selected. This is to be coherent with the + // prioritization of interrupt groups performed by the hardware interrupt + // controller. + // + // If no handler has been registered for the pending interrupt, + // _unhandled_interrupt will be selected thanks to the initialization of + // _int_line_handler_table_x by INTC_init_interrupts. + // + // exception.S will provide the interrupt handler with a clean interrupt stack + // frame, with nothing more pushed onto the stack. The interrupt handler must + // manage the `rete' instruction, what can be done thanks to pure assembly, + // inline assembly or the `__attribute__((__interrupt__))' C function + // attribute. + return (int_req) ? _int_handler_table[int_grp]._int_line_handler_table[32 - clz(int_req) - 1] : NULL; +} + +//! Init EVBA address. This sequence might also be done in the UTILS/STARTUP/GCC/crt0.S +static __inline__ void INTC_init_evba(void) +{ + Set_system_register(AVR32_EVBA, (int)&_evba ); +} + +void INTC_init_interrupts(void) +{ + unsigned int int_grp, int_req; + + INTC_init_evba(); + + // For all interrupt groups, + for (int_grp = 0; int_grp < AVR32_INTC_NUM_INT_GRPS; int_grp++) + { + // For all interrupt request lines of each group, + for (int_req = 0; int_req < _int_handler_table[int_grp].num_irqs; int_req++) + { + // Assign _unhandled_interrupt as default interrupt handler. + _int_handler_table[int_grp]._int_line_handler_table[int_req] = &_unhandled_interrupt; + } + + // Set the interrupt group priority register to its default value. + // By default, all interrupt groups are linked to the interrupt priority + // level 0 and to the interrupt vector _int0. + AVR32_INTC.ipr[int_grp] = ipr_val[AVR32_INTC_INT0]; + } +} + + +void INTC_register_interrupt(__int_handler handler, unsigned int irq, unsigned int int_level) +{ + // Determine the group of the IRQ. + unsigned int int_grp = irq / AVR32_INTC_MAX_NUM_IRQS_PER_GRP; + + // Store in _int_line_handler_table_x the pointer to the interrupt handler, so + // that _get_interrupt_handler can retrieve it when the interrupt is vectored. + _int_handler_table[int_grp]._int_line_handler_table[irq % AVR32_INTC_MAX_NUM_IRQS_PER_GRP] = handler; + + // Program the corresponding IPRX register to set the interrupt priority level + // and the interrupt vector offset that will be fetched by the core interrupt + // system. + // NOTE: The _intx functions are intermediate assembly functions between the + // core interrupt system and the user interrupt handler. + AVR32_INTC.ipr[int_grp] = ipr_val[int_level & (AVR32_INTC_IPR_INTLEVEL_MASK >> AVR32_INTC_IPR_INTLEVEL_OFFSET)]; +} diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/intc.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/intc.h new file mode 100644 index 0000000..31a4fc1 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/INTC/intc.h @@ -0,0 +1,100 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief INTC driver for AVR32 UC3. + * + * AVR32 Interrupt Controller driver module. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with an INTC module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _INTC_H_ +#define _INTC_H_ + +#include "compiler.h" + + +//! Maximal number of interrupt request lines per group. +#define AVR32_INTC_MAX_NUM_IRQS_PER_GRP 32 + +//! Number of interrupt priority levels. +#define AVR32_INTC_NUM_INT_LEVELS (1 << AVR32_INTC_IPR_INTLEVEL_SIZE) + + +#ifdef __AVR32_ABI_COMPILER__ // Automatically defined when compiling for AVR32, not when assembling. + +//! Pointer to interrupt handler. +#if (defined __GNUC__) +typedef void (*__int_handler)(void); +#elif (defined __ICCAVR32__) +typedef void (__interrupt *__int_handler)(void); +#endif + + +/*! \brief Initializes the hardware interrupt controller driver. + * + * \note Taken and adapted from Newlib. + */ +extern void INTC_init_interrupts(void); + +/*! \brief Registers an interrupt handler. + * + * \param handler Interrupt handler to register. + * \param irq IRQ of the interrupt handler to register. + * \param int_level Interrupt priority level to assign to the group of this IRQ. + * + * \warning The interrupt handler must manage the `rete' instruction, what can + * be done thanks to pure assembly, inline assembly or the + * `__attribute__((__interrupt__))' C function attribute. + * + * \warning If several interrupt handlers of a same group are registered with + * different priority levels, only the latest priority level set will + * be effective. + * + * \note Taken and adapted from Newlib. + */ +extern void INTC_register_interrupt(__int_handler handler, unsigned int irq, unsigned int int_level); + +#endif // __AVR32_ABI_COMPILER__ + + +#endif // _INTC_H_ diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm.c b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm.c new file mode 100644 index 0000000..76d9268 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm.c @@ -0,0 +1,546 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file has been prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Power Manager driver. + * + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + *****************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#include "compiler.h" +#include "pm.h" + + +/*! \name PM Writable Bit-Field Registers + */ +//! @{ + +typedef union +{ + unsigned long mcctrl; + avr32_pm_mcctrl_t MCCTRL; +} u_avr32_pm_mcctrl_t; + +typedef union +{ + unsigned long cksel; + avr32_pm_cksel_t CKSEL; +} u_avr32_pm_cksel_t; + +typedef union +{ + unsigned long pll; + avr32_pm_pll_t PLL; +} u_avr32_pm_pll_t; + +typedef union +{ + unsigned long oscctrl0; + avr32_pm_oscctrl0_t OSCCTRL0; +} u_avr32_pm_oscctrl0_t; + +typedef union +{ + unsigned long oscctrl1; + avr32_pm_oscctrl1_t OSCCTRL1; +} u_avr32_pm_oscctrl1_t; + +typedef union +{ + unsigned long oscctrl32; + avr32_pm_oscctrl32_t OSCCTRL32; +} u_avr32_pm_oscctrl32_t; + +typedef union +{ + unsigned long ier; + avr32_pm_ier_t IER; +} u_avr32_pm_ier_t; + +typedef union +{ + unsigned long idr; + avr32_pm_idr_t IDR; +} u_avr32_pm_idr_t; + +typedef union +{ + unsigned long icr; + avr32_pm_icr_t ICR; +} u_avr32_pm_icr_t; + +typedef union +{ + unsigned long gcctrl; + avr32_pm_gcctrl_t GCCTRL; +} u_avr32_pm_gcctrl_t; + +typedef union +{ + unsigned long rccr; + avr32_pm_rccr_t RCCR; +} u_avr32_pm_rccr_t; + +typedef union +{ + unsigned long bgcr; + avr32_pm_bgcr_t BGCR; +} u_avr32_pm_bgcr_t; + +typedef union +{ + unsigned long vregcr; + avr32_pm_vregcr_t VREGCR; +} u_avr32_pm_vregcr_t; + +typedef union +{ + unsigned long bod; + avr32_pm_bod_t BOD; +} u_avr32_pm_bod_t; + +//! @} + + +/*! \brief Sets the mode of the oscillator 0. + * + * \param pm Base address of the Power Manager (i.e. &AVR32_PM). + * \param mode Oscillator 0 mode (i.e. AVR32_PM_OSCCTRL0_MODE_x). + */ +static void pm_set_osc0_mode(volatile avr32_pm_t *pm, unsigned int mode) +{ + // Read + u_avr32_pm_oscctrl0_t u_avr32_pm_oscctrl0 = {pm->oscctrl0}; + // Modify + u_avr32_pm_oscctrl0.OSCCTRL0.mode = mode; + // Write + pm->oscctrl0 = u_avr32_pm_oscctrl0.oscctrl0; +} + + +void pm_enable_osc0_ext_clock(volatile avr32_pm_t *pm) +{ + pm_set_osc0_mode(pm, AVR32_PM_OSCCTRL0_MODE_EXT_CLOCK); +} + + +void pm_enable_osc0_crystal(volatile avr32_pm_t *pm, unsigned int fosc0) +{ + pm_set_osc0_mode(pm, (fosc0 < 900000) ? AVR32_PM_OSCCTRL0_MODE_CRYSTAL_G0 : + (fosc0 < 3000000) ? AVR32_PM_OSCCTRL0_MODE_CRYSTAL_G1 : + (fosc0 < 8000000) ? AVR32_PM_OSCCTRL0_MODE_CRYSTAL_G2 : + AVR32_PM_OSCCTRL0_MODE_CRYSTAL_G3); +} + + +void pm_enable_clk0(volatile avr32_pm_t *pm, unsigned int startup) +{ + pm_enable_clk0_no_wait(pm, startup); + pm_wait_for_clk0_ready(pm); +} + + +void pm_disable_clk0(volatile avr32_pm_t *pm) +{ + pm->mcctrl &= ~AVR32_PM_MCCTRL_OSC0EN_MASK; +} + + +void pm_enable_clk0_no_wait(volatile avr32_pm_t *pm, unsigned int startup) +{ + // Read register + u_avr32_pm_oscctrl0_t u_avr32_pm_oscctrl0 = {pm->oscctrl0}; + // Modify + u_avr32_pm_oscctrl0.OSCCTRL0.startup = startup; + // Write back + pm->oscctrl0 = u_avr32_pm_oscctrl0.oscctrl0; + + pm->mcctrl |= AVR32_PM_MCCTRL_OSC0EN_MASK; +} + + +void pm_wait_for_clk0_ready(volatile avr32_pm_t *pm) +{ + while (!(pm->poscsr & AVR32_PM_POSCSR_OSC0RDY_MASK)); +} + + +/*! \brief Sets the mode of the oscillator 1. + * + * \param pm Base address of the Power Manager (i.e. &AVR32_PM). + * \param mode Oscillator 1 mode (i.e. AVR32_PM_OSCCTRL1_MODE_x). + */ +static void pm_set_osc1_mode(volatile avr32_pm_t *pm, unsigned int mode) +{ + // Read + u_avr32_pm_oscctrl1_t u_avr32_pm_oscctrl1 = {pm->oscctrl1}; + // Modify + u_avr32_pm_oscctrl1.OSCCTRL1.mode = mode; + // Write + pm->oscctrl1 = u_avr32_pm_oscctrl1.oscctrl1; +} + + +void pm_enable_osc1_ext_clock(volatile avr32_pm_t *pm) +{ + pm_set_osc1_mode(pm, AVR32_PM_OSCCTRL1_MODE_EXT_CLOCK); +} + + +void pm_enable_osc1_crystal(volatile avr32_pm_t *pm, unsigned int fosc1) +{ + pm_set_osc1_mode(pm, (fosc1 < 900000) ? AVR32_PM_OSCCTRL1_MODE_CRYSTAL_G0 : + (fosc1 < 3000000) ? AVR32_PM_OSCCTRL1_MODE_CRYSTAL_G1 : + (fosc1 < 8000000) ? AVR32_PM_OSCCTRL1_MODE_CRYSTAL_G2 : + AVR32_PM_OSCCTRL1_MODE_CRYSTAL_G3); +} + + +void pm_enable_clk1(volatile avr32_pm_t *pm, unsigned int startup) +{ + pm_enable_clk1_no_wait(pm, startup); + pm_wait_for_clk1_ready(pm); +} + + +void pm_disable_clk1(volatile avr32_pm_t *pm) +{ + pm->mcctrl &= ~AVR32_PM_MCCTRL_OSC1EN_MASK; +} + + +void pm_enable_clk1_no_wait(volatile avr32_pm_t *pm, unsigned int startup) +{ + // Read register + u_avr32_pm_oscctrl1_t u_avr32_pm_oscctrl1 = {pm->oscctrl1}; + // Modify + u_avr32_pm_oscctrl1.OSCCTRL1.startup = startup; + // Write back + pm->oscctrl1 = u_avr32_pm_oscctrl1.oscctrl1; + + pm->mcctrl |= AVR32_PM_MCCTRL_OSC1EN_MASK; +} + + +void pm_wait_for_clk1_ready(volatile avr32_pm_t *pm) +{ + while (!(pm->poscsr & AVR32_PM_POSCSR_OSC1RDY_MASK)); +} + + +/*! \brief Sets the mode of the 32-kHz oscillator. + * + * \param pm Base address of the Power Manager (i.e. &AVR32_PM). + * \param mode 32-kHz oscillator mode (i.e. AVR32_PM_OSCCTRL32_MODE_x). + */ +static void pm_set_osc32_mode(volatile avr32_pm_t *pm, unsigned int mode) +{ + // Read + u_avr32_pm_oscctrl32_t u_avr32_pm_oscctrl32 = {pm->oscctrl32}; + // Modify + u_avr32_pm_oscctrl32.OSCCTRL32.mode = mode; + // Write + pm->oscctrl32 = u_avr32_pm_oscctrl32.oscctrl32; +} + + +void pm_enable_osc32_ext_clock(volatile avr32_pm_t *pm) +{ + pm_set_osc32_mode(pm, AVR32_PM_OSCCTRL32_MODE_EXT_CLOCK); +} + + +void pm_enable_osc32_crystal(volatile avr32_pm_t *pm) +{ + pm_set_osc32_mode(pm, AVR32_PM_OSCCTRL32_MODE_CRYSTAL); +} + + +void pm_enable_clk32(volatile avr32_pm_t *pm, unsigned int startup) +{ + pm_enable_clk32_no_wait(pm, startup); + pm_wait_for_clk32_ready(pm); +} + + +void pm_disable_clk32(volatile avr32_pm_t *pm) +{ + pm->oscctrl32 &= ~AVR32_PM_OSCCTRL32_OSC32EN_MASK; +} + + +void pm_enable_clk32_no_wait(volatile avr32_pm_t *pm, unsigned int startup) +{ + // Read register + u_avr32_pm_oscctrl32_t u_avr32_pm_oscctrl32 = {pm->oscctrl32}; + // Modify + u_avr32_pm_oscctrl32.OSCCTRL32.osc32en = 1; + u_avr32_pm_oscctrl32.OSCCTRL32.startup = startup; + // Write back + pm->oscctrl32 = u_avr32_pm_oscctrl32.oscctrl32; +} + + +void pm_wait_for_clk32_ready(volatile avr32_pm_t *pm) +{ + while (!(pm->poscsr & AVR32_PM_POSCSR_OSC32RDY_MASK)); +} + + +void pm_cksel(volatile avr32_pm_t *pm, + unsigned int pbadiv, + unsigned int pbasel, + unsigned int pbbdiv, + unsigned int pbbsel, + unsigned int hsbdiv, + unsigned int hsbsel) +{ + u_avr32_pm_cksel_t u_avr32_pm_cksel = {0}; + + u_avr32_pm_cksel.CKSEL.cpusel = hsbsel; + u_avr32_pm_cksel.CKSEL.cpudiv = hsbdiv; + u_avr32_pm_cksel.CKSEL.hsbsel = hsbsel; + u_avr32_pm_cksel.CKSEL.hsbdiv = hsbdiv; + u_avr32_pm_cksel.CKSEL.pbasel = pbasel; + u_avr32_pm_cksel.CKSEL.pbadiv = pbadiv; + u_avr32_pm_cksel.CKSEL.pbbsel = pbbsel; + u_avr32_pm_cksel.CKSEL.pbbdiv = pbbdiv; + + pm->cksel = u_avr32_pm_cksel.cksel; + + // Wait for ckrdy bit and then clear it + while (!(pm->poscsr & AVR32_PM_POSCSR_CKRDY_MASK)); +} + + +void pm_gc_setup(volatile avr32_pm_t *pm, + unsigned int gc, + unsigned int osc_or_pll, // Use Osc (=0) or PLL (=1) + unsigned int pll_osc, // Sel Osc0/PLL0 or Osc1/PLL1 + unsigned int diven, + unsigned int div) +{ + u_avr32_pm_gcctrl_t u_avr32_pm_gcctrl = {0}; + + u_avr32_pm_gcctrl.GCCTRL.oscsel = pll_osc; + u_avr32_pm_gcctrl.GCCTRL.pllsel = osc_or_pll; + u_avr32_pm_gcctrl.GCCTRL.diven = diven; + u_avr32_pm_gcctrl.GCCTRL.div = div; + + pm->gcctrl[gc] = u_avr32_pm_gcctrl.gcctrl; +} + + +void pm_gc_enable(volatile avr32_pm_t *pm, + unsigned int gc) +{ + pm->gcctrl[gc] |= AVR32_PM_GCCTRL_CEN_MASK; +} + + +void pm_gc_disable(volatile avr32_pm_t *pm, + unsigned int gc) +{ + pm->gcctrl[gc] &= ~AVR32_PM_GCCTRL_CEN_MASK; +} + + +void pm_pll_setup(volatile avr32_pm_t *pm, + unsigned int pll, + unsigned int mul, + unsigned int div, + unsigned int osc, + unsigned int lockcount) +{ + u_avr32_pm_pll_t u_avr32_pm_pll = {0}; + + u_avr32_pm_pll.PLL.pllosc = osc; + u_avr32_pm_pll.PLL.plldiv = div; + u_avr32_pm_pll.PLL.pllmul = mul; + u_avr32_pm_pll.PLL.pllcount = lockcount; + + pm->pll[pll] = u_avr32_pm_pll.pll; +} + + +void pm_pll_set_option(volatile avr32_pm_t *pm, + unsigned int pll, + unsigned int pll_freq, + unsigned int pll_div2, + unsigned int pll_wbwdisable) +{ + u_avr32_pm_pll_t u_avr32_pm_pll = {pm->pll[pll]}; + u_avr32_pm_pll.PLL.pllopt = pll_freq | (pll_div2 << 1) | (pll_wbwdisable << 2); + pm->pll[pll] = u_avr32_pm_pll.pll; +} + + +unsigned int pm_pll_get_option(volatile avr32_pm_t *pm, + unsigned int pll) +{ + return (pm->pll[pll] & AVR32_PM_PLLOPT_MASK) >> AVR32_PM_PLLOPT_OFFSET; +} + + +void pm_pll_enable(volatile avr32_pm_t *pm, + unsigned int pll) +{ + pm->pll[pll] |= AVR32_PM_PLLEN_MASK; +} + + +void pm_pll_disable(volatile avr32_pm_t *pm, + unsigned int pll) +{ + pm->pll[pll] &= ~AVR32_PM_PLLEN_MASK; +} + + +void pm_wait_for_pll0_locked(volatile avr32_pm_t *pm) +{ + while (!(pm->poscsr & AVR32_PM_POSCSR_LOCK0_MASK)); +} + + +void pm_wait_for_pll1_locked(volatile avr32_pm_t *pm) +{ + while (!(pm->poscsr & AVR32_PM_POSCSR_LOCK1_MASK)); +} + + +void pm_switch_to_clock(volatile avr32_pm_t *pm, unsigned long clock) +{ + // Read + u_avr32_pm_mcctrl_t u_avr32_pm_mcctrl = {pm->mcctrl}; + // Modify + u_avr32_pm_mcctrl.MCCTRL.mcsel = clock; + // Write back + pm->mcctrl = u_avr32_pm_mcctrl.mcctrl; +} + + +void pm_switch_to_osc0(volatile avr32_pm_t *pm, unsigned int fosc0, unsigned int startup) +{ + pm_enable_osc0_crystal(pm, fosc0); // Enable the Osc0 in crystal mode + pm_enable_clk0(pm, startup); // Crystal startup time - This parameter is critical and depends on the characteristics of the crystal + pm_switch_to_clock(pm, AVR32_PM_MCSEL_OSC0); // Then switch main clock to Osc0 +} + + +void pm_bod_enable_irq(volatile avr32_pm_t *pm) +{ + pm->ier = AVR32_PM_IER_BODDET_MASK; +} + + +void pm_bod_disable_irq(volatile avr32_pm_t *pm) +{ + Bool global_interrupt_enabled = Is_global_interrupt_enabled(); + + if (global_interrupt_enabled) Disable_global_interrupt(); + pm->idr = AVR32_PM_IDR_BODDET_MASK; + pm->isr; + if (global_interrupt_enabled) Enable_global_interrupt(); +} + + +void pm_bod_clear_irq(volatile avr32_pm_t *pm) +{ + pm->icr = AVR32_PM_ICR_BODDET_MASK; +} + + +unsigned long pm_bod_get_irq_status(volatile avr32_pm_t *pm) +{ + return ((pm->isr & AVR32_PM_ISR_BODDET_MASK) != 0); +} + + +unsigned long pm_bod_get_irq_enable_bit(volatile avr32_pm_t *pm) +{ + return ((pm->imr & AVR32_PM_IMR_BODDET_MASK) != 0); +} + + +unsigned long pm_bod_get_level(volatile avr32_pm_t *pm) +{ + return (pm->bod & AVR32_PM_BOD_LEVEL_MASK) >> AVR32_PM_BOD_LEVEL_OFFSET; +} + + +unsigned long pm_read_gplp(volatile avr32_pm_t *pm, unsigned long gplp) +{ + return pm->gplp[gplp]; +} + + +void pm_write_gplp(volatile avr32_pm_t *pm, unsigned long gplp, unsigned long value) +{ + pm->gplp[gplp] = value; +} + + +long pm_enable_module(volatile avr32_pm_t *pm, unsigned long module) +{ + unsigned long domain = module>>5; + unsigned long *regptr = (unsigned long*)(&(pm->cpumask) + domain); + + // Implementation-specific shortcut: the ckMASK registers are contiguous and + // memory-mapped in that order: CPUMASK, HSBMASK, PBAMASK, PBBMASK. + + *regptr |= (1<<(module%32)); + + return PASS; +} + +long pm_disable_module(volatile avr32_pm_t *pm, unsigned long module) +{ + unsigned long domain = module>>5; + unsigned long *regptr = (unsigned long*)(&(pm->cpumask) + domain); + + // Implementation-specific shortcut: the ckMASK registers are contiguous and + // memory-mapped in that order: CPUMASK, HSBMASK, PBAMASK, PBBMASK. + + *regptr &= ~(1<<(module%32)); + + return PASS; +} diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm.h new file mode 100644 index 0000000..ca679f7 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm.h @@ -0,0 +1,493 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file has been prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Power Manager driver. + * + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + *****************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _PM_H_ +#define _PM_H_ + +#include +#include "compiler.h" +#include "preprocessor.h" + + +/*! \brief Sets the MCU in the specified sleep mode. + * + * \param mode Sleep mode: + * \arg \c AVR32_PM_SMODE_IDLE: Idle; + * \arg \c AVR32_PM_SMODE_FROZEN: Frozen; + * \arg \c AVR32_PM_SMODE_STANDBY: Standby; + * \arg \c AVR32_PM_SMODE_STOP: Stop; + * \arg \c AVR32_PM_SMODE_DEEP_STOP: DeepStop; + * \arg \c AVR32_PM_SMODE_STATIC: Static. + */ +#define SLEEP(mode) {__asm__ __volatile__ ("sleep "STRINGZ(mode));} + + +//! Input and output parameters when initializing PM clocks using pm_configure_clocks(). +typedef struct +{ + //! CPU frequency (input/output argument). + unsigned long cpu_f; + + //! PBA frequency (input/output argument). + unsigned long pba_f; + + //! Oscillator 0's external crystal(or external clock) frequency (board dependant) (input argument). + unsigned long osc0_f; + + //! Oscillator 0's external crystal(or external clock) startup time: AVR32_PM_OSCCTRL0_STARTUP_x_RCOSC (input argument). + unsigned long osc0_startup; +} pm_freq_param_t; + +#define PM_FREQ_STATUS_FAIL (-1) +#define PM_FREQ_STATUS_OK (0) + + +/*! \brief Gets the MCU reset cause. + * + * \param pm Base address of the Power Manager instance (i.e. &AVR32_PM). + * + * \return The MCU reset cause which can be masked with the + * \c AVR32_PM_RCAUSE_x_MASK bit-masks to isolate specific causes. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ unsigned int pm_get_reset_cause(volatile avr32_pm_t *pm) +{ + return pm->rcause; +} + + +/*! + * \brief This function will enable the external clock mode of the oscillator 0. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + */ +extern void pm_enable_osc0_ext_clock(volatile avr32_pm_t *pm); + + +/*! + * \brief This function will enable the crystal mode of the oscillator 0. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param fosc0 Oscillator 0 crystal frequency (Hz) + */ +extern void pm_enable_osc0_crystal(volatile avr32_pm_t *pm, unsigned int fosc0); + + +/*! + * \brief This function will enable the oscillator 0 to be used with a startup time. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param startup Clock 0 startup time. AVR32_PM_OSCCTRL0_STARTUP_x_RCOSC. + */ +extern void pm_enable_clk0(volatile avr32_pm_t *pm, unsigned int startup); + + +/*! + * \brief This function will disable the oscillator 0. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + */ +extern void pm_disable_clk0(volatile avr32_pm_t *pm); + + +/*! + * \brief This function will enable the oscillator 0 to be used with no startup time. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param startup Clock 0 startup time, for which the function does not wait. AVR32_PM_OSCCTRL0_STARTUP_x_RCOSC. + */ +extern void pm_enable_clk0_no_wait(volatile avr32_pm_t *pm, unsigned int startup); + + +/*! + * \brief This function will wait until the Osc0 clock is ready. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + */ +extern void pm_wait_for_clk0_ready(volatile avr32_pm_t *pm); + + +/*! + * \brief This function will enable the external clock mode of the oscillator 1. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + */ +extern void pm_enable_osc1_ext_clock(volatile avr32_pm_t *pm); + + +/*! + * \brief This function will enable the crystal mode of the oscillator 1. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param fosc1 Oscillator 1 crystal frequency (Hz) + */ +extern void pm_enable_osc1_crystal(volatile avr32_pm_t *pm, unsigned int fosc1); + + +/*! + * \brief This function will enable the oscillator 1 to be used with a startup time. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param startup Clock 1 startup time. AVR32_PM_OSCCTRL1_STARTUP_x_RCOSC. + */ +extern void pm_enable_clk1(volatile avr32_pm_t *pm, unsigned int startup); + + +/*! + * \brief This function will disable the oscillator 1. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + */ +extern void pm_disable_clk1(volatile avr32_pm_t *pm); + + +/*! + * \brief This function will enable the oscillator 1 to be used with no startup time. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param startup Clock 1 startup time, for which the function does not wait. AVR32_PM_OSCCTRL1_STARTUP_x_RCOSC. + */ +extern void pm_enable_clk1_no_wait(volatile avr32_pm_t *pm, unsigned int startup); + + +/*! + * \brief This function will wait until the Osc1 clock is ready. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + */ +extern void pm_wait_for_clk1_ready(volatile avr32_pm_t *pm); + + +/*! + * \brief This function will enable the external clock mode of the 32-kHz oscillator. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + */ +extern void pm_enable_osc32_ext_clock(volatile avr32_pm_t *pm); + + +/*! + * \brief This function will enable the crystal mode of the 32-kHz oscillator. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + */ +extern void pm_enable_osc32_crystal(volatile avr32_pm_t *pm); + + +/*! + * \brief This function will enable the oscillator 32 to be used with a startup time. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param startup Clock 32 kHz startup time. AVR32_PM_OSCCTRL32_STARTUP_x_RCOSC. + */ +extern void pm_enable_clk32(volatile avr32_pm_t *pm, unsigned int startup); + + +/*! + * \brief This function will disable the oscillator 32. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + */ +extern void pm_disable_clk32(volatile avr32_pm_t *pm); + + +/*! + * \brief This function will enable the oscillator 32 to be used with no startup time. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param startup Clock 32 kHz startup time, for which the function does not wait. AVR32_PM_OSCCTRL32_STARTUP_x_RCOSC. + */ +extern void pm_enable_clk32_no_wait(volatile avr32_pm_t *pm, unsigned int startup); + + +/*! + * \brief This function will wait until the osc32 clock is ready. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + */ +extern void pm_wait_for_clk32_ready(volatile avr32_pm_t *pm); + + +/*! + * \brief This function will select all the power manager clocks. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param pbadiv Peripheral Bus A clock divisor enable + * \param pbasel Peripheral Bus A select + * \param pbbdiv Peripheral Bus B clock divisor enable + * \param pbbsel Peripheral Bus B select + * \param hsbdiv High Speed Bus clock divisor enable (CPU clock = HSB clock) + * \param hsbsel High Speed Bus select (CPU clock = HSB clock ) + */ +extern void pm_cksel(volatile avr32_pm_t *pm, unsigned int pbadiv, unsigned int pbasel, unsigned int pbbdiv, unsigned int pbbsel, unsigned int hsbdiv, unsigned int hsbsel); + + +/*! + * \brief This function will setup a generic clock. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param gc generic clock number (0 for gc0...) + * \param osc_or_pll Use OSC (=0) or PLL (=1) + * \param pll_osc Select Osc0/PLL0 or Osc1/PLL1 + * \param diven Generic clock divisor enable + * \param div Generic clock divisor + */ +extern void pm_gc_setup(volatile avr32_pm_t *pm, unsigned int gc, unsigned int osc_or_pll, unsigned int pll_osc, unsigned int diven, unsigned int div); + + +/*! + * \brief This function will enable a generic clock. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param gc generic clock number (0 for gc0...) + */ +extern void pm_gc_enable(volatile avr32_pm_t *pm, unsigned int gc); + + +/*! + * \brief This function will disable a generic clock. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param gc generic clock number (0 for gc0...) + */ +extern void pm_gc_disable(volatile avr32_pm_t *pm, unsigned int gc); + + +/*! + * \brief This function will setup a PLL. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param pll PLL number(0 for PLL0, 1 for PLL1) + * \param mul PLL MUL in the PLL formula + * \param div PLL DIV in the PLL formula + * \param osc OSC number (0 for osc0, 1 for osc1) + * \param lockcount PLL lockount + */ +extern void pm_pll_setup(volatile avr32_pm_t *pm, unsigned int pll, unsigned int mul, unsigned int div, unsigned int osc, unsigned int lockcount); + + +/*! + * \brief This function will set a PLL option. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param pll PLL number(0 for PLL0, 1 for PLL1) + * \param pll_freq Set to 1 for VCO frequency range 80-180MHz, set to 0 for VCO frequency range 160-240Mhz. + * \param pll_div2 Divide the PLL output frequency by 2 (this settings does not change the FVCO value) + * \param pll_wbwdisable 1 Disable the Wide-Bandith Mode (Wide-Bandwith mode allow a faster startup time and out-of-lock time). 0 to enable the Wide-Bandith Mode. + */ +extern void pm_pll_set_option(volatile avr32_pm_t *pm, unsigned int pll, unsigned int pll_freq, unsigned int pll_div2, unsigned int pll_wbwdisable); + + +/*! + * \brief This function will get a PLL option. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param pll PLL number(0 for PLL0, 1 for PLL1) + * \return Option + */ +extern unsigned int pm_pll_get_option(volatile avr32_pm_t *pm, unsigned int pll); + + +/*! + * \brief This function will enable a PLL. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param pll PLL number(0 for PLL0, 1 for PLL1) + */ +extern void pm_pll_enable(volatile avr32_pm_t *pm, unsigned int pll); + + +/*! + * \brief This function will disable a PLL. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param pll PLL number(0 for PLL0, 1 for PLL1) + */ +extern void pm_pll_disable(volatile avr32_pm_t *pm, unsigned int pll); + + +/*! + * \brief This function will wait for PLL0 locked + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + */ +extern void pm_wait_for_pll0_locked(volatile avr32_pm_t *pm); + + +/*! + * \brief This function will wait for PLL1 locked + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + */ +extern void pm_wait_for_pll1_locked(volatile avr32_pm_t *pm); + + +/*! + * \brief This function will switch the power manager main clock. + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param clock Clock to be switched on. AVR32_PM_MCSEL_SLOW for RCOsc, AVR32_PM_MCSEL_OSC0 for Osc0, AVR32_PM_MCSEL_PLL0 for PLL0. + */ +extern void pm_switch_to_clock(volatile avr32_pm_t *pm, unsigned long clock); + + +/*! + * \brief Switch main clock to clock Osc0 (crystal mode) + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param fosc0 Oscillator 0 crystal frequency (Hz) + * \param startup Crystal 0 startup time. AVR32_PM_OSCCTRL0_STARTUP_x_RCOSC. + */ +extern void pm_switch_to_osc0(volatile avr32_pm_t *pm, unsigned int fosc0, unsigned int startup); + + +/*! \brief Enables the Brown-Out Detector interrupt. + * + * \param pm Base address of the Power Manager (i.e. &AVR32_PM). + */ +extern void pm_bod_enable_irq(volatile avr32_pm_t *pm); + + +/*! \brief Disables the Brown-Out Detector interrupt. + * + * \param pm Base address of the Power Manager (i.e. &AVR32_PM). + */ +extern void pm_bod_disable_irq(volatile avr32_pm_t *pm); + + +/*! \brief Clears the Brown-Out Detector interrupt flag. + * + * \param pm Base address of the Power Manager (i.e. &AVR32_PM). + */ +extern void pm_bod_clear_irq(volatile avr32_pm_t *pm); + + +/*! \brief Gets the Brown-Out Detector interrupt flag. + * + * \param pm Base address of the Power Manager (i.e. &AVR32_PM). + * + * \retval 0 No BOD interrupt. + * \retval 1 BOD interrupt pending. + */ +extern unsigned long pm_bod_get_irq_status(volatile avr32_pm_t *pm); + + +/*! \brief Gets the Brown-Out Detector interrupt enable status. + * + * \param pm Base address of the Power Manager (i.e. &AVR32_PM). + * + * \retval 0 BOD interrupt disabled. + * \retval 1 BOD interrupt enabled. + */ +extern unsigned long pm_bod_get_irq_enable_bit(volatile avr32_pm_t *pm); + + +/*! \brief Gets the triggering threshold of the Brown-Out Detector. + * + * \param pm Base address of the Power Manager (i.e. &AVR32_PM). + * + * \return Triggering threshold of the BOD. See the electrical characteristics + * in the part datasheet for actual voltage levels. + */ +extern unsigned long pm_bod_get_level(volatile avr32_pm_t *pm); + + +/*! + * \brief Read the content of the PM GPLP registers + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param gplp GPLP register index (0,1,... depending on the number of GPLP registers for a given part) + * + * \return The content of the chosen GPLP register. + */ +extern unsigned long pm_read_gplp(volatile avr32_pm_t *pm, unsigned long gplp); + + +/*! + * \brief Write into the PM GPLP registers + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param gplp GPLP register index (0,1,... depending on the number of GPLP registers for a given part) + * \param value Value to write + */ +extern void pm_write_gplp(volatile avr32_pm_t *pm, unsigned long gplp, unsigned long value); + + +/*! \brief Enable the clock of a module. + * + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param module The module to clock (use one of the defines in the part-specific + * header file under "toolchain folder"/avr32/inc(lude)/avr32/; depending on the + * clock domain, look for the sections "CPU clocks", "HSB clocks", "PBx clocks") + * + * \return Status. + * \retval 0 Success. + * \retval <0 An error occured. + */ +extern long pm_enable_module(volatile avr32_pm_t *pm, unsigned long module); + +/*! \brief Disable the clock of a module. + * + * \param pm Base address of the Power Manager (i.e. &AVR32_PM) + * \param module The module to shut down (use one of the defines in the part-specific + * header file under "toolchain folder"/avr32/inc(lude)/avr32/; depending on the + * clock domain, look for the sections "CPU clocks", "HSB clocks", "PBx clocks") + * + * \return Status. + * \retval 0 Success. + * \retval <0 An error occured. + */ +extern long pm_disable_module(volatile avr32_pm_t *pm, unsigned long module); + + + +/*! \brief Automatically configure the CPU, PBA, PBB, and HSB clocks + * according to the user wishes. + * + * This function needs some parameters stored in a pm_freq_param_t structure: + * - cpu_f and pba_f are the wanted frequencies, + * - osc0_f is the oscillator 0 on-board frequency (e.g. FOSC0), + * - osc0_startup is the oscillator 0 startup time (e.g. OSC0_STARTUP). + * + * The function will then configure the clocks using the following rules: + * - It first try to find a valid PLL frequency (the highest possible value to avoid jitter) in order + * to satisfy the CPU frequency, + * - It optimizes the configuration depending the various divide stages, + * - Then, the PBA frequency is configured from the CPU freq. + * - Note that HSB and PBB are configured with the same frequency as CPU. + * - Note also that the number of wait states of the flash read accesses is automatically set-up depending + * the CPU frequency. As a consequence, the application needs the FLASHC driver to compile. + * + * The CPU, HSB and PBA frequencies programmed after configuration are stored back into cpu_f and pba_f. + * + * \param param pointer on the configuration structure. + * + * \retval PM_FREQ_STATUS_OK Mode successfully initialized. + * \retval PM_FREQ_STATUS_FAIL The configuration can not be done. + */ +extern int pm_configure_clocks(pm_freq_param_t *param); + + +/*! \brief Automatically configure the USB clock. + * + * USB clock is configured to 48MHz, using the PLL1 from the Oscillator0, assuming + * a 12 MHz crystal is connected to it. + */ +extern void pm_configure_usb_clock(void); + + +#endif // _PM_H_ diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm_conf_clocks.c b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm_conf_clocks.c new file mode 100644 index 0000000..8beb83b --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/pm_conf_clocks.c @@ -0,0 +1,268 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file has been prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Power Manager clocks configuration helper. + * + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + *****************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#include +#include "compiler.h" +#include "pm.h" + +extern void flashc_set_wait_state(unsigned int wait_state); +#if (defined AVR32_FLASHC_210_H_INCLUDED) +extern void flashc_issue_command(unsigned int command, int page_number); +#endif + + +#define PM_MAX_MUL ((1 << AVR32_PM_PLL0_PLLMUL_SIZE) - 1) + + +int pm_configure_clocks(pm_freq_param_t *param) +{ + // Supported frequencies: + // Fosc0 mul div PLL div2_en cpu_f pba_f Comment + // 12 15 1 192 1 12 12 + // 12 9 3 40 1 20 20 PLL out of spec + // 12 15 1 192 1 24 12 + // 12 9 1 120 1 30 15 + // 12 9 3 40 0 40 20 PLL out of spec + // 12 15 1 192 1 48 12 + // 12 15 1 192 1 48 24 + // 12 8 1 108 1 54 27 + // 12 9 1 120 1 60 15 + // 12 9 1 120 1 60 30 + // 12 10 1 132 1 66 16.5 + // + unsigned long in_cpu_f = param->cpu_f; + unsigned long in_osc0_f = param->osc0_f; + unsigned long mul, div, div2_en = 0, div2_cpu = 0, div2_pba = 0; + unsigned long pll_freq, rest; + Bool b_div2_pba, b_div2_cpu; + + // Switch to external Oscillator 0 + pm_switch_to_osc0(&AVR32_PM, in_osc0_f, param->osc0_startup); + + // Start with CPU freq config + if (in_cpu_f == in_osc0_f) + { + param->cpu_f = in_osc0_f; + param->pba_f = in_osc0_f; + return PM_FREQ_STATUS_OK; + } + else if (in_cpu_f < in_osc0_f) + { + // TBD + } + + rest = in_cpu_f % in_osc0_f; + + for (div = 1; div < 32; div++) + { + if ((div * rest) % in_osc0_f == 0) + break; + } + if (div == 32) + return PM_FREQ_STATUS_FAIL; + + mul = (in_cpu_f * div) / in_osc0_f; + + if (mul > PM_MAX_MUL) + return PM_FREQ_STATUS_FAIL; + + // export 2power from PLL div to div2_cpu + while (!(div % 2)) + { + div /= 2; + div2_cpu++; + } + + // Here we know the mul and div parameter of the PLL config. + // . Check out if the PLL has a valid in_cpu_f. + // . Try to have for the PLL frequency (VCO output) the highest possible value + // to reduce jitter. + while (in_osc0_f * 2 * mul / div < AVR32_PM_PLL_VCO_RANGE0_MAX_FREQ) + { + if (2 * mul > PM_MAX_MUL) + break; + mul *= 2; + div2_cpu++; + } + + if (div2_cpu != 0) + { + div2_cpu--; + div2_en = 1; + } + + pll_freq = in_osc0_f * mul / (div * (1 << div2_en)); + + // Update real CPU Frequency + param->cpu_f = pll_freq / (1 << div2_cpu); + mul--; + + pm_pll_setup(&AVR32_PM + , 0 // pll + , mul // mul + , div // div + , 0 // osc + , 16 // lockcount + ); + + pm_pll_set_option(&AVR32_PM + , 0 // pll + // PLL clock is lower than 160MHz: need to set pllopt. + , (pll_freq < AVR32_PM_PLL_VCO_RANGE0_MIN_FREQ) ? 1 : 0 // pll_freq + , div2_en // pll_div2 + , 0 // pll_wbwdisable + ); + + rest = pll_freq; + while (rest > AVR32_PM_PBA_MAX_FREQ || + rest != param->pba_f) + { + div2_pba++; + rest = pll_freq / (1 << div2_pba); + if (rest < param->pba_f) + break; + } + + // Update real PBA Frequency + param->pba_f = pll_freq / (1 << div2_pba); + + // Enable PLL0 + pm_pll_enable(&AVR32_PM, 0); + + // Wait for PLL0 locked + pm_wait_for_pll0_locked(&AVR32_PM); + + if (div2_cpu) + { + b_div2_cpu = TRUE; + div2_cpu--; + } + else + b_div2_cpu = FALSE; + + if (div2_pba) + { + b_div2_pba = TRUE; + div2_pba--; + } + else + b_div2_pba = FALSE; + + pm_cksel(&AVR32_PM + , b_div2_pba, div2_pba // PBA + , b_div2_cpu, div2_cpu // PBB + , b_div2_cpu, div2_cpu // HSB + ); + + if (param->cpu_f > AVR32_FLASHC_FWS_0_MAX_FREQ) + { + flashc_set_wait_state(1); +#if (defined AVR32_FLASHC_210_H_INCLUDED) + if (param->cpu_f > AVR32_FLASHC_HSEN_FWS_1_MAX_FREQ) + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_HSEN, -1); + else + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_HSDIS, -1); +#endif + } + else + { + flashc_set_wait_state(0); +#if (defined AVR32_FLASHC_210_H_INCLUDED) + if (param->cpu_f > AVR32_FLASHC_HSEN_FWS_0_MAX_FREQ) + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_HSEN, -1); + else + flashc_issue_command(AVR32_FLASHC_FCMD_CMD_HSDIS, -1); +#endif + } + + pm_switch_to_clock(&AVR32_PM, AVR32_PM_MCCTRL_MCSEL_PLL0); + + return PM_FREQ_STATUS_OK; +} + + +void pm_configure_usb_clock(void) +{ +#if UC3A3 + + // Setup USB GCLK. + pm_gc_setup(&AVR32_PM, AVR32_PM_GCLK_USBB, // gc + 0, // osc_or_pll: use Osc (if 0) or PLL (if 1) + 0, // pll_osc: select Osc0/PLL0 or Osc1/PLL1 + 0, // diven + 0); // div + + // Enable USB GCLK. + pm_gc_enable(&AVR32_PM, AVR32_PM_GCLK_USBB); +#else + // Use 12MHz from OSC0 and generate 96 MHz + pm_pll_setup(&AVR32_PM, 1, // pll. + 7, // mul. + 1, // div. + 0, // osc. + 16); // lockcount. + + pm_pll_set_option(&AVR32_PM, 1, // pll. + 1, // pll_freq: choose the range 80-180MHz. + 1, // pll_div2. + 0); // pll_wbwdisable. + + // start PLL1 and wait forl lock + pm_pll_enable(&AVR32_PM, 1); + + // Wait for PLL1 locked. + pm_wait_for_pll1_locked(&AVR32_PM); + + pm_gc_setup(&AVR32_PM, AVR32_PM_GCLK_USBB, // gc. + 1, // osc_or_pll: use Osc (if 0) or PLL (if 1). + 1, // pll_osc: select Osc0/PLL0 or Osc1/PLL1. + 0, // diven. + 0); // div. + pm_gc_enable(&AVR32_PM, AVR32_PM_GCLK_USBB); +#endif +} diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/power_clocks_lib.c b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/power_clocks_lib.c new file mode 100644 index 0000000..f5fc155 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/power_clocks_lib.c @@ -0,0 +1,566 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file has been prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief High-level library abstracting features such as oscillators/pll/dfll + * configuration, clock configuration, System-sensible parameters + * configuration, buses clocks configuration, sleep mode, reset. + * + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + *****************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ +#include "power_clocks_lib.h" + + +//! Device-specific data +#if UC3L +static long int pcl_configure_clocks_uc3l(pcl_freq_param_t *param); // FORWARD declaration +#endif + +#if UC3C +static long int pcl_configure_clocks_uc3c(pcl_freq_param_t *param); // FORWARD declaration +#endif + +long int pcl_configure_clocks(pcl_freq_param_t *param) +{ +#ifndef AVR32_PM_VERSION_RESETVALUE + // Implementation for UC3A, UC3A3, UC3B parts. + return(pm_configure_clocks(param)); +#else + #ifdef AVR32_PM_410_H_INCLUDED + // Implementation for UC3C parts. + return(pcl_configure_clocks_uc3c(param)); + #else + // Implementation for UC3L parts. + return(pcl_configure_clocks_uc3l(param)); + #endif +#endif +} + + +//! Device-specific implementation +#if UC3L +// FORWARD declaration +static long int pcl_configure_synchronous_clocks( pm_clk_src_t main_clk_src, + unsigned long main_clock_freq_hz, + pcl_freq_param_t *param); + +long int pcl_configure_clocks_rcsys(pcl_freq_param_t *param) +{ + // Supported main clock sources: PCL_MC_RCSYS + + // Supported synchronous clocks frequencies if RCSYS is the main clock source: + // 115200Hz, 57600Hz, 28800Hz, 14400Hz, 7200Hz, 3600Hz, 1800Hz, 900Hz, 450Hz. + + // NOTE: by default, this implementation doesn't perform thorough checks on the + // input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. + +#ifdef AVR32SFW_INPUT_CHECK + // Verify that fCPU >= fPBx + if((param->cpu_f < param->pba_f) || (param->cpu_f < param->pbb_f)) + return(-1); +#endif + +#ifdef AVR32SFW_INPUT_CHECK + // Verify that the target frequencies are reachable. + if((param->cpu_f > SCIF_SLOWCLOCK_FREQ_HZ) || (param->pba_f > SCIF_SLOWCLOCK_FREQ_HZ) + || (param->pbb_f > SCIF_SLOWCLOCK_FREQ_HZ)) + return(-1); +#endif + + return(pcl_configure_synchronous_clocks(PM_CLK_SRC_SLOW, SCIF_SLOWCLOCK_FREQ_HZ, param)); +} + + +long int pcl_configure_clocks_rc120m(pcl_freq_param_t *param) +{ + // Supported main clock sources: PCL_MC_RC120M + + // Supported synchronous clocks frequencies if RC120M is the main clock source: + // 30MHz, 15MHz, 7.5MHz, 3.75MHz, 1.875MHz, 937.5kHz, 468.75kHz. + + // NOTE: by default, this implementation doesn't perform thorough checks on the + // input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. + +#ifdef AVR32SFW_INPUT_CHECK + // Verify that fCPU >= fPBx + if((param->cpu_f < param->pba_f) || (param->cpu_f < param->pbb_f)) + return(-1); +#endif + +#ifdef AVR32SFW_INPUT_CHECK + // Verify that the target frequencies are reachable. + if((param->cpu_f > SCIF_RC120M_FREQ_HZ) || (param->pba_f > SCIF_RC120M_FREQ_HZ) + || (param->pbb_f > SCIF_RC120M_FREQ_HZ)) + return(-1); +#endif + + // Start the 120MHz internal RCosc (RC120M) clock + scif_start_rc120M(); + + return(pcl_configure_synchronous_clocks(PM_CLK_SRC_RC120M, SCIF_RC120M_FREQ_HZ, param)); +} + + +long int pcl_configure_clocks_osc0(pcl_freq_param_t *param) +{ + // Supported main clock sources: PCL_MC_OSC0 + + // Supported synchronous clocks frequencies if OSC0 is the main clock source: + // (these obviously depend on the OSC0 frequency; we'll take 16MHz as an example) + // 16MHz, 8MHz, 4MHz, 2MHz, 1MHz, 500kHz, 250kHz, 125kHz, 62.5kHz. + + // NOTE: by default, this implementation doesn't perform thorough checks on the + // input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. + + unsigned long main_clock_freq; + + +#ifdef AVR32SFW_INPUT_CHECK + // Verify that fCPU >= fPBx + if((param->cpu_f < param->pba_f) || (param->cpu_f < param->pbb_f)) + return(-1); +#endif + + main_clock_freq = param->osc0_f; +#ifdef AVR32SFW_INPUT_CHECK + // Verify that the target frequencies are reachable. + if((param->cpu_f > main_clock_freq) || (param->pba_f > main_clock_freq) + || (param->pbb_f > main_clock_freq)) + return(-1); +#endif + // Configure OSC0 in crystal mode, external crystal with a fcrystal Hz frequency. + scif_configure_osc_crystalmode(SCIF_OSC0, main_clock_freq); + // Enable the OSC0 + scif_enable_osc(SCIF_OSC0, param->osc0_startup, true); + + return(pcl_configure_synchronous_clocks(PM_CLK_SRC_OSC0, main_clock_freq, param)); +} + + +long int pcl_configure_clocks_dfll0(pcl_freq_param_t *param) +{ + // Supported main clock sources: PCL_MC_DFLL + + // Supported synchronous clocks frequencies if DFLL is the main clock source: + // (these obviously depend on the DFLL target frequency; we'll take 100MHz as an example) + // 50MHz, 25MHz, 12.5MHz, 6.25MHz, 3.125MHz, 1562.5kHz, 781.25kHz, 390.625kHz. + + // NOTE: by default, this implementation doesn't perform thorough checks on the + // input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. + + unsigned long main_clock_freq; + scif_gclk_opt_t *pgc_dfllif_ref_opt; + + +#ifdef AVR32SFW_INPUT_CHECK + // Verify that fCPU >= fPBx + if((param->cpu_f < param->pba_f) || (param->cpu_f < param->pbb_f)) + return(-1); +#endif + + main_clock_freq = param->dfll_f; +#ifdef AVR32SFW_INPUT_CHECK + // Verify that the target DFLL output frequency is in the correct range. + if((main_clock_freq > SCIF_DFLL_MAXFREQ_HZ) || (main_clock_freq < SCIF_DFLL_MINFREQ_HZ)) + return(-1); + // Verify that the target frequencies are reachable. + if((param->cpu_f > main_clock_freq) || (param->pba_f > main_clock_freq) + || (param->pbb_f > main_clock_freq)) + return(-1); +#endif + pgc_dfllif_ref_opt = (scif_gclk_opt_t *)param->pextra_params; + // Implementation note: this implementation configures the DFLL in closed-loop + // mode (because it gives the best accuracy) which enables the generic clock CLK_DFLLIF_REF + // as a reference (RCSYS being used as the generic clock source, undivided). + scif_dfll0_closedloop_configure_and_start(pgc_dfllif_ref_opt, main_clock_freq, TRUE); + + return(pcl_configure_synchronous_clocks(PM_CLK_SRC_DFLL0, main_clock_freq, param)); +} + + +static long int pcl_configure_clocks_uc3l(pcl_freq_param_t *param) +{ + // Supported main clock sources: PCL_MC_RCSYS, PCL_MC_OSC0, PCL_MC_DFLL0, PCL_MC_RC120M + + // Supported synchronous clocks frequencies if RCSYS is the main clock source: + // 115200Hz, 57600Hz, 28800Hz, 14400Hz, 7200Hz, 3600Hz, 1800Hz, 900Hz, 450Hz. + + // Supported synchronous clocks frequencies if RC120M is the main clock source: + // 30MHz, 15MHz, 7.5MHz, 3.75MHz, 1.875MHz, 937.5kHz, 468.75kHz. + + // Supported synchronous clocks frequencies if OSC0 is the main clock source: + // (these obviously depend on the OSC0 frequency; we'll take 16MHz as an example) + // 16MHz, 8MHz, 4MHz, 2MHz, 1MHz, 500kHz, 250kHz, 125kHz, 62.5kHz. + + // Supported synchronous clocks frequencies if DFLL is the main clock source: + // (these obviously depend on the DFLL target frequency; we'll take 100MHz as an example) + // 50MHz, 25MHz, 12.5MHz, 6.25MHz, 3.125MHz, 1562.5kHz, 781.25kHz, 390.625kHz. + + // NOTE: by default, this implementation doesn't perform thorough checks on the + // input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. + + +#ifdef AVR32SFW_INPUT_CHECK + // Verify that fCPU >= fPBx + if((param->cpu_f < param->pba_f) || (param->cpu_f < param->pbb_f)) + return(-1); +#endif + + if(PCL_MC_RCSYS == param->main_clk_src) + { + return(pcl_configure_clocks_rcsys(param)); + } + else if(PCL_MC_RC120M == param->main_clk_src) + { + return(pcl_configure_clocks_rc120m(param)); + } + else if(PCL_MC_OSC0 == param->main_clk_src) + { + return(pcl_configure_clocks_osc0(param)); + } + else // PCL_MC_DFLL0 == param->main_clk_src + { + return(pcl_configure_clocks_dfll0(param)); + } +} + +static long int pcl_configure_synchronous_clocks(pm_clk_src_t main_clk_src, unsigned long main_clock_freq_hz, pcl_freq_param_t *param) +{ + //# + //# Set the Synchronous clock division ratio for each clock domain + //# + pm_set_all_cksel(main_clock_freq_hz, param->cpu_f, param->pba_f, param->pbb_f); + + //# + //# Set the Flash wait state and the speed read mode (depending on the target CPU frequency). + //# +#if UC3L + flashcdw_set_flash_waitstate_and_readmode(param->cpu_f); +#elif UC3C + flashc_set_flash_waitstate_and_readmode(param->cpu_f); +#endif + + + //# + //# Switch the main clock source to the selected clock. + //# + pm_set_mclk_source(main_clk_src); + + return PASS; +} + +#endif // UC3L device-specific implementation + +//! UC3C Device-specific implementation +#if UC3C +static long int pcl_configure_clocks_uc3c(pcl_freq_param_t *param) +{ + #define PM_MAX_MUL ((1 << AVR32_SCIF_PLLMUL_SIZE) - 1) + #define AVR32_PM_PBA_MAX_FREQ 66000000 + #define AVR32_PM_PLL_VCO_RANGE0_MAX_FREQ 240000000 + #define AVR32_PM_PLL_VCO_RANGE0_MIN_FREQ 160000000 + + // Implementation for UC3C parts. + // Supported frequencies: + // Fosc0 mul div PLL div2_en cpu_f pba_f Comment + // 12 15 1 192 1 12 12 + // 12 9 3 40 1 20 20 PLL out of spec + // 12 15 1 192 1 24 12 + // 12 9 1 120 1 30 15 + // 12 9 3 40 0 40 20 PLL out of spec + // 12 15 1 192 1 48 12 + // 12 15 1 192 1 48 24 + // 12 8 1 108 1 54 27 + // 12 9 1 120 1 60 15 + // 12 9 1 120 1 60 30 + // 12 10 1 132 1 66 16.5 + // + unsigned long in_cpu_f = param->cpu_f; + unsigned long in_osc0_f = param->osc0_f; + unsigned long mul, div, div2_en = 0, div2_cpu = 0, div2_pba = 0; + unsigned long pll_freq, rest; + Bool b_div2_pba, b_div2_cpu; + + // Configure OSC0 in crystal mode, external crystal with a FOSC0 Hz frequency. + scif_configure_osc_crystalmode(SCIF_OSC0, in_osc0_f); + // Enable the OSC0 + scif_enable_osc(SCIF_OSC0, param->osc0_startup, true); + // Set the main clock source as being OSC0. + pm_set_mclk_source(PM_CLK_SRC_OSC0); + + // Start with CPU freq config + if (in_cpu_f == in_osc0_f) + { + param->cpu_f = in_osc0_f; + param->pba_f = in_osc0_f; + return PASS; + } + else if (in_cpu_f < in_osc0_f) + { + // TBD + } + + rest = in_cpu_f % in_osc0_f; + + for (div = 1; div < 32; div++) + { + if ((div * rest) % in_osc0_f == 0) + break; + } + if (div == 32) + return FAIL; + + mul = (in_cpu_f * div) / in_osc0_f; + + if (mul > PM_MAX_MUL) + return FAIL; + + // export 2power from PLL div to div2_cpu + while (!(div % 2)) + { + div /= 2; + div2_cpu++; + } + + // Here we know the mul and div parameter of the PLL config. + // . Check out if the PLL has a valid in_cpu_f. + // . Try to have for the PLL frequency (VCO output) the highest possible value + // to reduce jitter. + while (in_osc0_f * 2 * mul / div < AVR32_PM_PLL_VCO_RANGE0_MAX_FREQ) + { + if (2 * mul > PM_MAX_MUL) + break; + mul *= 2; + div2_cpu++; + } + + if (div2_cpu != 0) + { + div2_cpu--; + div2_en = 1; + } + + pll_freq = in_osc0_f * mul / (div * (1 << div2_en)); + + // Update real CPU Frequency + param->cpu_f = pll_freq / (1 << div2_cpu); + mul--; + + scif_pll_opt_t opt; + + opt.osc = SCIF_OSC0, // Sel Osc0 or Osc1 + opt.lockcount = 16, // lockcount in main clock for the PLL wait lock + opt.div = div, // DIV=1 in the formula + opt.mul = mul, // MUL=7 in the formula + opt.pll_div2 = div2_en, // pll_div2 Divide the PLL output frequency by 2 (this settings does not change the FVCO value) + opt.pll_wbwdisable = 0, //pll_wbwdisable 1 Disable the Wide-Bandith Mode (Wide-Bandwith mode allow a faster startup time and out-of-lock time). 0 to enable the Wide-Bandith Mode. + opt.pll_freq = (pll_freq < AVR32_PM_PLL_VCO_RANGE0_MIN_FREQ) ? 1 : 0, // Set to 1 for VCO frequency range 80-180MHz, set to 0 for VCO frequency range 160-240Mhz. + + + scif_pll_setup(SCIF_PLL0, opt); // lockcount in main clock for the PLL wait lock + + /* Enable PLL0 */ + scif_pll_enable(SCIF_PLL0); + + /* Wait for PLL0 locked */ + scif_wait_for_pll_locked(SCIF_PLL0) ; + + rest = pll_freq; + while (rest > AVR32_PM_PBA_MAX_FREQ || + rest != param->pba_f) + { + div2_pba++; + rest = pll_freq / (1 << div2_pba); + if (rest < param->pba_f) + break; + } + + // Update real PBA Frequency + param->pba_f = pll_freq / (1 << div2_pba); + + + if (div2_cpu) + { + b_div2_cpu = TRUE; + div2_cpu--; + } + else + b_div2_cpu = FALSE; + + if (div2_pba) + { + b_div2_pba = TRUE; + div2_pba--; + } + else + b_div2_pba = FALSE; + + if (b_div2_cpu == TRUE ) + { + pm_set_clk_domain_div(PM_CLK_DOMAIN_0, (pm_divratio_t) div2_cpu); // CPU + pm_set_clk_domain_div(PM_CLK_DOMAIN_1, (pm_divratio_t) div2_cpu); // HSB + pm_set_clk_domain_div(PM_CLK_DOMAIN_3, (pm_divratio_t) div2_cpu); // PBB + } + if (b_div2_pba == TRUE ) + { + pm_set_clk_domain_div(PM_CLK_DOMAIN_2, (pm_divratio_t) div2_pba); // PBA + pm_set_clk_domain_div(PM_CLK_DOMAIN_4, (pm_divratio_t) div2_pba); // PBC + } + + // Set Flashc Wait State + flashc_set_flash_waitstate_and_readmode(param->cpu_f); + + // Set the main clock source as being PLL0. + pm_set_mclk_source(PM_CLK_SRC_PLL0); + + return PASS; +} +#endif // UC3C device-specific implementation + +long int pcl_switch_to_osc(pcl_osc_t osc, unsigned int fcrystal, unsigned int startup) +{ +#ifndef AVR32_PM_VERSION_RESETVALUE +// Implementation for UC3A, UC3A3, UC3B parts. + if(PCL_OSC0 == osc) + { + // Configure OSC0 in crystal mode, external crystal with a FOSC0 Hz frequency, + // enable the OSC0, set the main clock source as being OSC0. + pm_switch_to_osc0(&AVR32_PM, fcrystal, startup); + } + else + { + return PCL_NOT_SUPPORTED; + } +#else +// Implementation for UC3C, UC3L parts. + #if AVR32_PM_VERSION_RESETVALUE < 0x400 + return PCL_NOT_SUPPORTED; + #else + if(PCL_OSC0 == osc) + { + // Configure OSC0 in crystal mode, external crystal with a fcrystal Hz frequency. + scif_configure_osc_crystalmode(SCIF_OSC0, fcrystal); + // Enable the OSC0 + scif_enable_osc(SCIF_OSC0, startup, true); + // Set the Flash wait state and the speed read mode (depending on the target CPU frequency). +#if UC3L + flashcdw_set_flash_waitstate_and_readmode(fcrystal); +#elif UC3C + flashc_set_flash_waitstate_and_readmode(fcrystal); +#endif + // Set the main clock source as being OSC0. + pm_set_mclk_source(PM_CLK_SRC_OSC0); + } + else + { + return PCL_NOT_SUPPORTED; + } + #endif +#endif + return PASS; +} + +long int pcl_configure_usb_clock(void) +{ +#ifndef AVR32_PM_VERSION_RESETVALUE +// Implementation for UC3A, UC3A3, UC3B parts. + pm_configure_usb_clock(); + return PASS; +#else + #ifdef AVR32_PM_410_H_INCLUDED + const scif_pll_opt_t opt = { + .osc = SCIF_OSC0, // Sel Osc0 or Osc1 + .lockcount = 16, // lockcount in main clock for the PLL wait lock + .div = 1, // DIV=1 in the formula + .mul = 5, // MUL=7 in the formula + .pll_div2 = 1, // pll_div2 Divide the PLL output frequency by 2 (this settings does not change the FVCO value) + .pll_wbwdisable = 0, //pll_wbwdisable 1 Disable the Wide-Bandith Mode (Wide-Bandwith mode allow a faster startup time and out-of-lock time). 0 to enable the Wide-Bandith Mode. + .pll_freq = 1, // Set to 1 for VCO frequency range 80-180MHz, set to 0 for VCO frequency range 160-240Mhz. + }; + + /* Setup PLL1 on Osc0, mul=7 ,no divisor, lockcount=16, ie. 16Mhzx6 = 96MHz output */ + scif_pll_setup(SCIF_PLL1, opt); // lockcount in main clock for the PLL wait lock + + /* Enable PLL1 */ + scif_pll_enable(SCIF_PLL1); + + /* Wait for PLL1 locked */ + scif_wait_for_pll_locked(SCIF_PLL1) ; + + // Implementation for UC3C parts. + // Setup the generic clock for USB + scif_gc_setup(AVR32_SCIF_GCLK_USB, + SCIF_GCCTRL_PLL1, + AVR32_SCIF_GC_NO_DIV_CLOCK, + 0); + // Now enable the generic clock + scif_gc_enable(AVR32_SCIF_GCLK_USB); + return PASS; + #else + return PCL_NOT_SUPPORTED; + #endif +#endif +} + + +#if UC3L +#else +void pcl_write_gplp(unsigned long gplp, unsigned long value) +{ +#ifndef AVR32_PM_VERSION_RESETVALUE +// Implementation for UC3A, UC3A3, UC3B parts. + pm_write_gplp(&AVR32_PM,gplp,value); +#else + scif_write_gplp(gplp,value); +#endif +} + +unsigned long pcl_read_gplp(unsigned long gplp) +{ +#ifndef AVR32_PM_VERSION_RESETVALUE +// Implementation for UC3A, UC3A3, UC3B parts. + return pm_read_gplp(&AVR32_PM,gplp); +#else + return scif_read_gplp(gplp); +#endif +} +#endif diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/power_clocks_lib.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/power_clocks_lib.h new file mode 100644 index 0000000..28c5888 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/PM/power_clocks_lib.h @@ -0,0 +1,379 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file has been prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief High-level library abstracting features such as oscillators/pll/dfll + * configuration, clock configuration, System-sensible parameters + * configuration, buses clocks configuration, sleep mode, reset. + * + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + *****************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _POWER_CLOCKS_LIB_H_ +#define _POWER_CLOCKS_LIB_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include "compiler.h" + +#ifndef AVR32_PM_VERSION_RESETVALUE +// Support for UC3A, UC3A3, UC3B parts. + #include "pm.h" +#else +//! Device-specific data +#if UC3L + #include "pm_uc3l.h" + #include "scif_uc3l.h" + #include "flashcdw.h" +#elif UC3C + #include "pm_uc3c.h" + #include "scif_uc3c.h" + #include "flashc.h" +#endif +#endif + +/*! \name Clocks Management + */ +//! @{ + +//! The different oscillators +typedef enum +{ + PCL_OSC0 = 0, + PCL_OSC1 = 1 +} pcl_osc_t; + +//! The different DFLLs +typedef enum +{ + PCL_DFLL0 = 0, + PCL_DFLL1 = 1 +} pcl_dfll_t; + +//! Possible Main Clock Sources +typedef enum +{ + PCL_MC_RCSYS, // Default main clock source, supported by all (aka Slow Clock) + PCL_MC_OSC0, // Supported by all + PCL_MC_OSC1, // Supported by UC3C only + PCL_MC_OSC0_PLL0, // Supported by UC3A, UC3B, UC3A3, UC3C (the main clock source is PLL0 with OSC0 as reference) + PCL_MC_OSC1_PLL0, // Supported by UC3A, UC3B, UC3A3, UC3C (the main clock source is PLL0 with OSC1 as reference) + PCL_MC_OSC0_PLL1, // Supported by UC3C (the main clock source is PLL1 with OSC0 as reference) + PCL_MC_OSC1_PLL1, // Supported by UC3C (the main clock source is PLL1 with OSC1 as reference) + PCL_MC_DFLL0, // Supported by UC3L + PCL_MC_DFLL1, // Not supported yet + PCL_MC_RC120M, // Supported by UC3L, UC3C + PCL_MC_RC8M, // Supported by UC3C + PCL_MC_CRIPOSC // Supported by UC3C +} pcl_mainclk_t; + +//! Input and output parameters to configure clocks with pcl_configure_clocks(). +// NOTE: regarding the frequency settings, always abide by the datasheet rules and min & max supported frequencies. +#ifndef AVR32_PM_VERSION_RESETVALUE +// Support for UC3A, UC3A3, UC3B parts. +#define pcl_freq_param_t pm_freq_param_t // See pm.h +#else +// Support for UC3C, UC3L parts. +typedef struct +{ + //! Main clock source selection (input argument). + pcl_mainclk_t main_clk_src; + + //! Target CPU frequency (input/output argument). + unsigned long cpu_f; + + //! Target PBA frequency (input/output argument). + unsigned long pba_f; + + //! Target PBB frequency (input/output argument). + unsigned long pbb_f; + + //! Target PBC frequency (input/output argument). + unsigned long pbc_f; + + //! Oscillator 0's external crystal(or external clock) frequency (board dependant) (input argument). + unsigned long osc0_f; + + //! Oscillator 0's external crystal(or external clock) startup time: AVR32_PM_OSCCTRL0_STARTUP_x_RCOSC (input argument). + unsigned long osc0_startup; + + //! DFLL target frequency (input/output argument) (NOTE: the bigger, the most stable the frequency) + unsigned long dfll_f; + + //! Other parameters that might be necessary depending on the device (implementation-dependent). + // For the UC3L DFLL setup, this parameter should be pointing to a structure of + // type (scif_gclk_opt_t *). + void *pextra_params; +} pcl_freq_param_t; +#endif + +//! Define "not supported" for the lib. +#define PCL_NOT_SUPPORTED (-10000) + +/*! \brief Automatically configure the CPU, PBA, PBB, and HSB clocks + * + * This function needs some parameters stored in a pcl_freq_param_t structure: + * - main_clk_src is the id of the main clock source to use, + * - cpu_f and pba_f and pbb_f are the wanted frequencies, + * - osc0_f is the oscillator 0's external crystal (or external clock) on-board frequency (e.g. FOSC0), + * - osc0_startup is the oscillator 0's external crystal (or external clock) startup time (e.g. OSC0_STARTUP). + * - dfll_f is the target DFLL frequency to set-up if main_clk_src is the dfll. + * + * The CPU, HSB and PBA frequencies programmed after configuration are stored back into cpu_f and pba_f. + * + * \note: since it is dynamically computing the appropriate field values of the + * configuration registers from the parameters structure, this function is not + * optimal in terms of code size. For a code size optimal solution, it is better + * to create a new function from pcl_configure_clocks() and modify it to use + * preprocessor computation from pre-defined target frequencies. + * + * \param param pointer on the configuration structure. + * + * \retval 0 Success. + * \retval <0 The configuration cannot be performed. + */ +extern long int pcl_configure_clocks(pcl_freq_param_t *param); + +/*! \brief Automatically configure the CPU, PBA, PBB, and HSB clocks using the RCSYS osc as main source clock. + * + * This function needs some parameters stored in a pcl_freq_param_t structure: + * - cpu_f and pba_f and pbb_f are the wanted frequencies + * + * Supported main clock sources: PCL_MC_RCSYS + * + * Supported synchronous clocks frequencies: + * 115200Hz, 57600Hz, 28800Hz, 14400Hz, 7200Hz, 3600Hz, 1800Hz, 900Hz, 450Hz. + * + * \note: by default, this implementation doesn't perform thorough checks on the + * input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. + * + * \note: since it is dynamically computing the appropriate field values of the + * configuration registers from the parameters structure, this function is not + * optimal in terms of code size. For a code size optimal solution, it is better + * to create a new function from pcl_configure_clocks_rcsys() and modify it to use + * preprocessor computation from pre-defined target frequencies. + * + * \param param pointer on the configuration structure. + * + * \retval 0 Success. + * \retval <0 The configuration cannot be performed. + */ +extern long int pcl_configure_clocks_rcsys(pcl_freq_param_t *param); + +/*! \brief Automatically configure the CPU, PBA, PBB, and HSB clocks using the RC120M osc as main source clock. + * + * This function needs some parameters stored in a pcl_freq_param_t structure: + * - cpu_f and pba_f and pbb_f are the wanted frequencies + * + * Supported main clock sources: PCL_MC_RC120M + * + * Supported synchronous clocks frequencies: + * 30MHz, 15MHz, 7.5MHz, 3.75MHz, 1.875MHz, 937.5kHz, 468.75kHz. + * + * \note: by default, this implementation doesn't perform thorough checks on the + * input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. + * + * \note: since it is dynamically computing the appropriate field values of the + * configuration registers from the parameters structure, this function is not + * optimal in terms of code size. For a code size optimal solution, it is better + * to create a new function from pcl_configure_clocks_rc120m() and modify it to + * use preprocessor computation from pre-defined target frequencies. + * + * \param param pointer on the configuration structure. + * + * \retval 0 Success. + * \retval <0 The configuration cannot be performed. + */ +extern long int pcl_configure_clocks_rc120m(pcl_freq_param_t *param); + +/*! \brief Automatically configure the CPU, PBA, PBB, and HSB clocks using the OSC0 osc as main source clock + * + * This function needs some parameters stored in a pcl_freq_param_t structure: + * - cpu_f and pba_f and pbb_f are the wanted frequencies, + * - osc0_f is the oscillator 0's external crystal (or external clock) on-board frequency (e.g. FOSC0), + * - osc0_startup is the oscillator 0's external crystal (or external clock) startup time (e.g. OSC0_STARTUP). + * + * Supported main clock sources: PCL_MC_OSC0 + * + * Supported synchronous clocks frequencies: + * (these obviously depend on the OSC0 frequency; we'll take 16MHz as an example) + * 16MHz, 8MHz, 4MHz, 2MHz, 1MHz, 500kHz, 250kHz, 125kHz, 62.5kHz. + * + * \note: by default, this implementation doesn't perform thorough checks on the + * input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. + * + * \note: since it is dynamically computing the appropriate field values of the + * configuration registers from the parameters structure, this function is not + * optimal in terms of code size. For a code size optimal solution, it is better + * to create a new function from pcl_configure_clocks_osc0() and modify it to use + * preprocessor computation from pre-defined target frequencies. + * + * \param param pointer on the configuration structure. + * + * \retval 0 Success. + * \retval <0 The configuration cannot be performed. + */ +extern long int pcl_configure_clocks_osc0(pcl_freq_param_t *param); + +/*! \brief Automatically configure the CPU, PBA, PBB, and HSB clocks using the DFLL0 as main source clock + * + * This function needs some parameters stored in a pcl_freq_param_t structure: + * - cpu_f and pba_f and pbb_f are the wanted frequencies, + * - dfll_f is the target DFLL frequency to set-up + * + * \note: when the DFLL0 is to be used as main source clock for the synchronous clocks, + * the target frequency of the DFLL should be chosen to be as high as possible + * within the specification range (for stability reasons); the target cpu and pbx + * frequencies will then be reached by appropriate division ratio. + * + * Supported main clock sources: PCL_MC_DFLL0 + * + * Supported synchronous clocks frequencies: + * (these obviously depend on the DFLL target frequency; we'll take 100MHz as an example) + * 50MHz, 25MHz, 12.5MHz, 6.25MHz, 3.125MHz, 1562.5kHz, 781.25kHz, 390.625kHz. + * + * \note: by default, this implementation doesn't perform thorough checks on the + * input parameters. To enable the checks, define AVR32SFW_INPUT_CHECK. + * + * \note: since it is dynamically computing the appropriate field values of the + * configuration registers from the parameters structure, this function is not + * optimal in terms of code size. For a code size optimal solution, it is better + * to create a new function from pcl_configure_clocks_dfll0() and modify it to + * use preprocessor computation from pre-defined target frequencies. + * + * \param param pointer on the configuration structure. + * + * \retval 0 Success. + * \retval <0 The configuration cannot be performed. + */ +extern long int pcl_configure_clocks_dfll0(pcl_freq_param_t *param); + +/*! \brief Switch the main clock source to Osc0 configured in crystal mode + * + * \param osc The oscillator to enable and switch to. + * \param fcrystal Oscillator external crystal frequency (Hz) + * \param startup Oscillator startup time. + * + * \return Status. + * \retval 0 Success. + * \retval <0 An error occured. + */ +extern long int pcl_switch_to_osc(pcl_osc_t osc, unsigned int fcrystal, unsigned int startup); + +/*! \brief Enable the clock of a module. + * + * \param module The module to clock (use one of the defines in the part-specific + * header file under "toolchain folder"/avr32/inc(lude)/avr32/; depending on the + * clock domain, look for the sections "CPU clocks", "HSB clocks", "PBx clocks" + * or look in the module section). + * + * \return Status. + * \retval 0 Success. + * \retval <0 An error occured. + */ +#ifndef AVR32_PM_VERSION_RESETVALUE +// Implementation for UC3A, UC3A3, UC3B parts. +#define pcl_enable_module(module) pm_enable_module(&AVR32_PM, module) +#else +// Implementation for UC3C, UC3L parts. +#define pcl_enable_module(module) pm_enable_module(module) +#endif + +/*! \brief Disable the clock of a module. + * + * \param module The module to shut down (use one of the defines in the part-specific + * header file under "toolchain folder"/avr32/inc(lude)/avr32/; depending on the + * clock domain, look for the sections "CPU clocks", "HSB clocks", "PBx clocks" + * or look in the module section). + * + * \return Status. + * \retval 0 Success. + * \retval <0 An error occured. + */ +#ifndef AVR32_PM_VERSION_RESETVALUE +// Implementation for UC3A, UC3A3, UC3B parts. +#define pcl_disable_module(module) pm_disable_module(&AVR32_PM, module) +#else +// Implementation for UC3C, UC3L parts. +#define pcl_disable_module(module) pm_disable_module(module) +#endif + +/*! \brief Configure the USB Clock + * + * + * \return Status. + * \retval 0 Success. + * \retval <0 An error occured. + */ +extern long int pcl_configure_usb_clock(void); + +//! @} + +/*! \name Power Management + */ +//! @{ +/*! + * \brief Read the content of the GPLP registers + * \param gplp GPLP register index (0,1,... depending on the number of GPLP registers for a given part) + * + * \return The content of the chosen GPLP register. + */ +extern unsigned long pcl_read_gplp(unsigned long gplp); + + +/*! + * \brief Write into the GPLP registers + * \param gplp GPLP register index (0,1,... depending on the number of GPLP registers for a given part) + * \param value Value to write + */ +extern void pcl_write_gplp(unsigned long gplp, unsigned long value); + +//! @} + +#ifdef __cplusplus +} +#endif + +#endif // _POWER_CLOCKS_LIB_H_ diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/SPI/spi.c b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/SPI/spi.c new file mode 100644 index 0000000..cadb8b1 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/SPI/spi.c @@ -0,0 +1,443 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief SPI driver for AVR32 UC3. + * + * This file defines a useful set of functions for the SPI interface on AVR32 + * devices. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with an SPI module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#include "spi.h" + +#ifdef FREERTOS_USED + +#include "FreeRTOS.h" +#include "semphr.h" + +#endif + + +/*! \name SPI Writable Bit-Field Registers + */ +//! @{ + +typedef union +{ + unsigned long cr; + avr32_spi_cr_t CR; +} u_avr32_spi_cr_t; + +typedef union +{ + unsigned long mr; + avr32_spi_mr_t MR; +} u_avr32_spi_mr_t; + +typedef union +{ + unsigned long tdr; + avr32_spi_tdr_t TDR; +} u_avr32_spi_tdr_t; + +typedef union +{ + unsigned long ier; + avr32_spi_ier_t IER; +} u_avr32_spi_ier_t; + +typedef union +{ + unsigned long idr; + avr32_spi_idr_t IDR; +} u_avr32_spi_idr_t; + +typedef union +{ + unsigned long csr; + avr32_spi_csr0_t CSR; +} u_avr32_spi_csr_t; + +//! @} + + +#ifdef FREERTOS_USED + +//! The SPI mutex. +static xSemaphoreHandle xSPIMutex; + +#endif + + +/*! \brief Calculates the baudrate divider. + * + * \param options Pointer to a structure containing initialization options for + * an SPI channel. + * \param pba_hz SPI module input clock frequency (PBA clock, Hz). + * + * \return Divider or error code. + * \retval >=0 Success. + * \retval <0 Error. + */ +static int getBaudDiv(const spi_options_t *options, unsigned int pba_hz) +{ + int baudDiv = (pba_hz + options->baudrate / 2) / options->baudrate; + + if (baudDiv <= 0 || baudDiv > 255) { + return -1; + } + + return baudDiv; +} + + +void spi_reset(volatile avr32_spi_t *spi) +{ + spi->cr = AVR32_SPI_CR_SWRST_MASK; +} + + +spi_status_t spi_initSlave(volatile avr32_spi_t *spi, + unsigned char bits, + unsigned char spi_mode) +{ + if (spi_mode > 3 || + bits < 8 || bits > 16) { + return SPI_ERROR_ARGUMENT; + } + + // Reset. + spi->cr = AVR32_SPI_CR_SWRST_MASK; + + // Will use CSR0 offsets; these are the same for CSR0 to CSR3. + spi->csr0 = ((spi_mode >> 1) << AVR32_SPI_CSR0_CPOL_OFFSET) | + (((spi_mode & 0x1) ^ 0x1) << AVR32_SPI_CSR0_NCPHA_OFFSET) | + ((bits - 8) << AVR32_SPI_CSR0_BITS_OFFSET); + + return SPI_OK; +} + + +spi_status_t spi_initTest(volatile avr32_spi_t *spi) +{ + // Reset. + spi->cr = AVR32_SPI_CR_SWRST_MASK; + spi->mr |= AVR32_SPI_MR_MSTR_MASK | // Master Mode. + AVR32_SPI_MR_LLB_MASK; // Local Loopback. + + return SPI_OK; +} + + +spi_status_t spi_initMaster(volatile avr32_spi_t *spi, const spi_options_t *options) +{ + u_avr32_spi_mr_t u_avr32_spi_mr; + + if (options->modfdis > 1) { + return SPI_ERROR_ARGUMENT; + } + + // Reset. + spi->cr = AVR32_SPI_CR_SWRST_MASK; + + // Master Mode. + u_avr32_spi_mr.mr = spi->mr; + u_avr32_spi_mr.MR.mstr = 1; + u_avr32_spi_mr.MR.modfdis = options->modfdis; + u_avr32_spi_mr.MR.llb = 0; + u_avr32_spi_mr.MR.pcs = (1 << AVR32_SPI_MR_PCS_SIZE) - 1; + spi->mr = u_avr32_spi_mr.mr; + + return SPI_OK; +} + + +spi_status_t spi_selectionMode(volatile avr32_spi_t *spi, + unsigned char variable_ps, + unsigned char pcs_decode, + unsigned char delay) +{ + u_avr32_spi_mr_t u_avr32_spi_mr; + + if (variable_ps > 1 || + pcs_decode > 1) { + return SPI_ERROR_ARGUMENT; + } + + u_avr32_spi_mr.mr = spi->mr; + u_avr32_spi_mr.MR.ps = variable_ps; + u_avr32_spi_mr.MR.pcsdec = pcs_decode; + u_avr32_spi_mr.MR.dlybcs = delay; + spi->mr = u_avr32_spi_mr.mr; + + return SPI_OK; +} + + +spi_status_t spi_selectChip(volatile avr32_spi_t *spi, unsigned char chip) +{ +#ifdef FREERTOS_USED + while (pdFALSE == xSemaphoreTake(xSPIMutex, 20)); +#endif + + // Assert all lines; no peripheral is selected. + spi->mr |= AVR32_SPI_MR_PCS_MASK; + + if (spi->mr & AVR32_SPI_MR_PCSDEC_MASK) { + // The signal is decoded; allow up to 15 chips. + if (chip > 14) { + return SPI_ERROR_ARGUMENT; + } + + spi->mr &= ~AVR32_SPI_MR_PCS_MASK | (chip << AVR32_SPI_MR_PCS_OFFSET); + } else { + if (chip > 3) { + return SPI_ERROR_ARGUMENT; + } + + spi->mr &= ~(1 << (AVR32_SPI_MR_PCS_OFFSET + chip)); + } + + return SPI_OK; +} + + +spi_status_t spi_unselectChip(volatile avr32_spi_t *spi, unsigned char chip) +{ + unsigned int timeout = SPI_TIMEOUT; + + while (!(spi->sr & AVR32_SPI_SR_TXEMPTY_MASK)) { + if (!timeout--) { + return SPI_ERROR_TIMEOUT; + } + } + + // Assert all lines; no peripheral is selected. + spi->mr |= AVR32_SPI_MR_PCS_MASK; + + // Last transfer, so deassert the current NPCS if CSAAT is set. + spi->cr = AVR32_SPI_CR_LASTXFER_MASK; + +#ifdef FREERTOS_USED + xSemaphoreGive(xSPIMutex); +#endif + + return SPI_OK; +} + + +spi_status_t spi_setupChipReg(volatile avr32_spi_t *spi, + const spi_options_t *options, + unsigned int pba_hz) +{ + u_avr32_spi_csr_t u_avr32_spi_csr; + + if (options->spi_mode > 3 || + options->stay_act > 1 || + options->bits < 8 || options->bits > 16) { + return SPI_ERROR_ARGUMENT; + } + + int baudDiv = getBaudDiv(options, pba_hz); + + if (baudDiv < 0) { + return SPI_ERROR_ARGUMENT; + } + + // Will use CSR0 offsets; these are the same for CSR0 to CSR3. + u_avr32_spi_csr.csr = 0; + u_avr32_spi_csr.CSR.cpol = options->spi_mode >> 1; + u_avr32_spi_csr.CSR.ncpha = (options->spi_mode & 0x1) ^ 0x1; + u_avr32_spi_csr.CSR.csaat = options->stay_act; + u_avr32_spi_csr.CSR.bits = options->bits - 8; + u_avr32_spi_csr.CSR.scbr = baudDiv; + u_avr32_spi_csr.CSR.dlybs = options->spck_delay; + u_avr32_spi_csr.CSR.dlybct = options->trans_delay; + + switch(options->reg) { + case 0: + spi->csr0 = u_avr32_spi_csr.csr; + break; + case 1: + spi->csr1 = u_avr32_spi_csr.csr; + break; + case 2: + spi->csr2 = u_avr32_spi_csr.csr; + break; + case 3: + spi->csr3 = u_avr32_spi_csr.csr; + break; + default: + return SPI_ERROR_ARGUMENT; + } + +#ifdef FREERTOS_USED + if (!xSPIMutex) + { + // Create the SPI mutex. + vSemaphoreCreateBinary(xSPIMutex); + if (!xSPIMutex) + { + while(1); + } + } +#endif + + return SPI_OK; +} + + +void spi_enable(volatile avr32_spi_t *spi) +{ + spi->cr = AVR32_SPI_CR_SPIEN_MASK; +} + + +void spi_disable(volatile avr32_spi_t *spi) +{ + spi->cr = AVR32_SPI_CR_SPIDIS_MASK; +} + + +int spi_is_enabled(volatile avr32_spi_t *spi) +{ + return (spi->sr & AVR32_SPI_SR_SPIENS_MASK) != 0; +} + + +unsigned char spi_writeRegisterEmptyCheck(volatile avr32_spi_t *spi) +{ + return ((spi->sr & AVR32_SPI_SR_TDRE_MASK) != 0); +} + + +spi_status_t spi_write(volatile avr32_spi_t *spi, unsigned short data) +{ + unsigned int timeout = SPI_TIMEOUT; + + while (!(spi->sr & AVR32_SPI_SR_TDRE_MASK)) { + if (!timeout--) { + return SPI_ERROR_TIMEOUT; + } + } + + spi->tdr = data << AVR32_SPI_TDR_TD_OFFSET; + + return SPI_OK; +} + + +spi_status_t spi_variableSlaveWrite(volatile avr32_spi_t *spi, unsigned short data, + unsigned char pcs, unsigned char lastxfer) +{ + unsigned int timeout = SPI_TIMEOUT; + + if (pcs > 14 || lastxfer > 1) { + return SPI_ERROR_ARGUMENT; + } + + while (!(spi->sr & AVR32_SPI_SR_TDRE_MASK)) { + if (!timeout--) { + return SPI_ERROR_TIMEOUT; + } + } + + spi->tdr = (data << AVR32_SPI_TDR_TD_OFFSET) | + (pcs << AVR32_SPI_TDR_PCS_OFFSET) | + (lastxfer << AVR32_SPI_TDR_LASTXFER_OFFSET); + + return SPI_OK; +} + + +unsigned char spi_writeEndCheck(volatile avr32_spi_t *spi) +{ + return ((spi->sr & AVR32_SPI_SR_TXEMPTY_MASK) != 0); +} + + +unsigned char spi_readRegisterFullCheck(volatile avr32_spi_t *spi) +{ + return ((spi->sr & AVR32_SPI_SR_RDRF_MASK) != 0); +} + + +spi_status_t spi_read(volatile avr32_spi_t *spi, unsigned short *data) +{ + unsigned int timeout = SPI_TIMEOUT; + + while ((spi->sr & (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK)) != + (AVR32_SPI_SR_RDRF_MASK | AVR32_SPI_SR_TXEMPTY_MASK)) { + if (!timeout--) { + return SPI_ERROR_TIMEOUT; + } + } + + *data = spi->rdr >> AVR32_SPI_RDR_RD_OFFSET; + + return SPI_OK; +} + + +unsigned char spi_getStatus(volatile avr32_spi_t *spi) +{ + spi_status_t ret = SPI_OK; + unsigned long sr = spi->sr; + + if (sr & AVR32_SPI_SR_OVRES_MASK) { + ret = SPI_ERROR_OVERRUN; + } + + if (sr & AVR32_SPI_SR_MODF_MASK) { + ret += SPI_ERROR_MODE_FAULT; + } + + if (ret == (SPI_ERROR_OVERRUN + SPI_ERROR_MODE_FAULT)) { + return SPI_ERROR_OVERRUN_AND_MODE_FAULT; + } + else if (ret > 0) { + return ret; + } else { + return SPI_OK; + } +} diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/SPI/spi.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/SPI/spi.h new file mode 100644 index 0000000..6dcc928 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/SPI/spi.h @@ -0,0 +1,342 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief SPI driver for AVR32 UC3. + * + * This file defines a useful set of functions for the SPI interface on AVR32 + * devices. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with an SPI module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _SPI_H_ +#define _SPI_H_ + +#include + + +//! Time-out value (number of attempts). +#define SPI_TIMEOUT 10000 + + +//! Status codes used by the SPI driver. +typedef enum +{ + SPI_ERROR = -1, + SPI_OK = 0, + SPI_ERROR_TIMEOUT = 1, + SPI_ERROR_ARGUMENT, + SPI_ERROR_OVERRUN, + SPI_ERROR_MODE_FAULT, + SPI_ERROR_OVERRUN_AND_MODE_FAULT +} spi_status_t; + +//! Option structure for SPI channels. +typedef struct +{ + //! The SPI channel to set up. + unsigned char reg; + + //! Preferred baudrate for the SPI. + unsigned int baudrate; + + //! Number of bits in each character (8 to 16). + unsigned char bits; + + //! Delay before first clock pulse after selecting slave (in PBA clock periods). + unsigned char spck_delay; + + //! Delay between each transfer/character (in PBA clock periods). + unsigned char trans_delay; + + //! Sets this chip to stay active after last transfer to it. + unsigned char stay_act; + + //! Which SPI mode to use when transmitting. + unsigned char spi_mode; + + //! Disables the mode fault detection. + //! With this bit cleared, the SPI master mode will disable itself if another + //! master tries to address it. + unsigned char modfdis; +} spi_options_t; + + +/*! \brief Resets the SPI controller. + * + * \param spi Base address of the SPI instance. + */ +extern void spi_reset(volatile avr32_spi_t *spi); + +/*! \brief Initializes the SPI in slave mode. + * + * \param spi Base address of the SPI instance. + * \param bits Number of bits in each transmitted character (8 to 16). + * \param spi_mode Clock polarity and phase. + * + * \return Status. + * \retval SPI_OK Success. + * \retval SPI_ERROR_ARGUMENT Invalid argument(s) passed. + */ +extern spi_status_t spi_initSlave(volatile avr32_spi_t *spi, + unsigned char bits, + unsigned char spi_mode); + +/*! \brief Sets up the SPI in a test mode where the transmitter is connected to + * the receiver (local loopback). + * + * \param spi Base address of the SPI instance. + * + * \return Status. + * \retval SPI_OK Success. + */ +extern spi_status_t spi_initTest(volatile avr32_spi_t *spi); + +/*! \brief Initializes the SPI in master mode. + * + * \param spi Base address of the SPI instance. + * \param options Pointer to a structure containing initialization options. + * + * \return Status. + * \retval SPI_OK Success. + * \retval SPI_ERROR_ARGUMENT Invalid argument(s) passed. + */ +extern spi_status_t spi_initMaster(volatile avr32_spi_t *spi, const spi_options_t *options); + +/*! \brief Sets up how and when the slave chips are selected (master mode only). + * + * \param spi Base address of the SPI instance. + * \param variable_ps Target slave is selected in transfer register for every + * character to transmit. + * \param pcs_decode The four chip select lines are decoded externally. Values + * 0 to 14 can be given to \ref spi_selectChip. + * \param delay Delay in PBA periods between chip selects. + * + * \return Status. + * \retval SPI_OK Success. + * \retval SPI_ERROR_ARGUMENT Invalid argument(s) passed. + */ +extern spi_status_t spi_selectionMode(volatile avr32_spi_t *spi, + unsigned char variable_ps, + unsigned char pcs_decode, + unsigned char delay); + +/*! \brief Selects slave chip. + * + * \param spi Base address of the SPI instance. + * \param chip Slave chip number (normal: 0 to 3, extarnally decoded signal: 0 + * to 14). + * + * \return Status. + * \retval SPI_OK Success. + * \retval SPI_ERROR_ARGUMENT Invalid argument(s) passed. + */ +extern spi_status_t spi_selectChip(volatile avr32_spi_t *spi, unsigned char chip); + +/*! \brief Unselects slave chip. + * + * \param spi Base address of the SPI instance. + * \param chip Slave chip number (normal: 0 to 3, extarnally decoded signal: 0 + * to 14). + * + * \return Status. + * \retval SPI_OK Success. + * \retval SPI_ERROR_TIMEOUT Time-out. + * + * \note Will block program execution until time-out occurs if last transmission + * is not complete. Invoke \ref spi_writeEndCheck beforehand if needed. + */ +extern spi_status_t spi_unselectChip(volatile avr32_spi_t *spi, unsigned char chip); + +/*! \brief Sets options for a specific slave chip. + * + * The baudrate field has to be written before transfer in master mode. Four + * similar registers exist, one for each slave. When using encoded slave + * addressing, reg=0 sets options for slaves 0 to 3, reg=1 for slaves 4 to 7 and + * so on. + * + * \param spi Base address of the SPI instance. + * \param options Pointer to a structure containing initialization options for + * an SPI channel. + * \param pba_hz SPI module input clock frequency (PBA clock, Hz). + * + * \return Status. + * \retval SPI_OK Success. + * \retval SPI_ERROR_ARGUMENT Invalid argument(s) passed. + */ +extern spi_status_t spi_setupChipReg(volatile avr32_spi_t *spi, + const spi_options_t *options, + unsigned int pba_hz); + +/*! \brief Enables the SPI. + * + * \param spi Base address of the SPI instance. + */ +extern void spi_enable(volatile avr32_spi_t *spi); + +/*! \brief Disables the SPI. + * + * Ensures that nothing is transferred while setting up buffers. + * + * \param spi Base address of the SPI instance. + * + * \warning This may cause data loss if used on a slave SPI. + */ +extern void spi_disable(volatile avr32_spi_t *spi); + +/*! \brief Tests if the SPI is enabled. + * + * \param spi Base address of the SPI instance. + * + * \return \c 1 if the SPI is enabled, otherwise \c 0. + */ +extern int spi_is_enabled(volatile avr32_spi_t *spi); + +/*! \brief Checks if there is no data in the transmit register. + * + * \param spi Base address of the SPI instance. + * + * \return Status. + * \retval 1 No data in TDR. + * \retval 0 Some data in TDR. + */ +extern unsigned char spi_writeRegisterEmptyCheck(volatile avr32_spi_t *spi); + +/*! \brief Writes one data word in master fixed peripheral select mode or in + * slave mode. + * + * \param spi Base address of the SPI instance. + * \param data The data word to write. + * + * \return Status. + * \retval SPI_OK Success. + * \retval SPI_ERROR_TIMEOUT Time-out. + * + * \note Will block program execution until time-out occurs if transmitter is + * busy and transmit buffer is full. Invoke + * \ref spi_writeRegisterEmptyCheck beforehand if needed. + * + * \note Once the data has been written to the transmit buffer, the end of + * transmission is not waited for. Invoke \ref spi_writeEndCheck if + * needed. + */ +extern spi_status_t spi_write(volatile avr32_spi_t *spi, unsigned short data); + +/*! \brief Selects a slave in master variable peripheral select mode and writes + * one data word to it. + * + * \param spi Base address of the SPI instance. + * \param data The data word to write. + * \param pcs Slave selector (bit 0 -> nCS line 0, bit 1 -> nCS line 1, + * etc.). + * \param lastxfer Boolean indicating whether this is the last data word + * transfer. + * + * \return Status. + * \retval SPI_OK Success. + * \retval SPI_ERROR_TIMEOUT Time-out. + * \retval SPI_ERROR_ARGUMENT Invalid argument(s) passed. + * + * \note Will block program execution until time-out occurs if transmitter is + * busy and transmit buffer is full. Invoke + * \ref spi_writeRegisterEmptyCheck beforehand if needed. + * + * \note Once the data has been written to the transmit buffer, the end of + * transmission is not waited for. Invoke \ref spi_writeEndCheck if + * needed. + */ +extern spi_status_t spi_variableSlaveWrite(volatile avr32_spi_t *spi, + unsigned short data, + unsigned char pcs, + unsigned char lastxfer); + +/*! \brief Checks if all transmissions are complete. + * + * \param spi Base address of the SPI instance. + * + * \return Status. + * \retval 1 All transmissions complete. + * \retval 0 Transmissions not complete. + */ +extern unsigned char spi_writeEndCheck(volatile avr32_spi_t *spi); + +/*! \brief Checks if there is data in the receive register. + * + * \param spi Base address of the SPI instance. + * + * \return Status. + * \retval 1 Some data in RDR. + * \retval 0 No data in RDR. + */ +extern unsigned char spi_readRegisterFullCheck(volatile avr32_spi_t *spi); + +/*! \brief Reads one data word in master mode or in slave mode. + * + * \param spi Base address of the SPI instance. + * \param data Pointer to the location where to store the received data word. + * + * \return Status. + * \retval SPI_OK Success. + * \retval SPI_ERROR_TIMEOUT Time-out. + * + * \note Will block program execution until time-out occurs if no data is + * received or last transmission is not complete. Invoke + * \ref spi_writeEndCheck or \ref spi_readRegisterFullCheck beforehand if + * needed. + */ +extern spi_status_t spi_read(volatile avr32_spi_t *spi, unsigned short *data); + +/*! \brief Gets status information from the SPI. + * + * \param spi Base address of the SPI instance. + * + * \return Status. + * \retval SPI_OK Success. + * \retval SPI_ERROR_OVERRUN Overrun error. + * \retval SPI_ERROR_MODE_FAULT Mode fault (SPI addressed as slave + * while in master mode). + * \retval SPI_ERROR_OVERRUN_AND_MODE_FAULT Overrun error and mode fault. + */ +extern unsigned char spi_getStatus(volatile avr32_spi_t *spi); + + +#endif // _SPI_H_ diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/USART/usart.c b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/USART/usart.c new file mode 100644 index 0000000..b95882a --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/USART/usart.c @@ -0,0 +1,914 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief USART driver for AVR32 UC3. + * + * This file contains basic functions for the AVR32 USART, with support for all + * modes, settings and clock speeds. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with a USART module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#include "compiler.h" +#include "usart.h" + + +//------------------------------------------------------------------------------ +/*! \name Private Functions + */ +//! @{ + + +/*! \brief Checks if the USART is in multidrop mode. + * + * \param usart Base address of the USART instance. + * + * \return \c 1 if the USART is in multidrop mode, otherwise \c 0. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +static __inline__ int usart_mode_is_multidrop(volatile avr32_usart_t *usart) +{ + return ((usart->mr >> AVR32_USART_MR_PAR_OFFSET) & AVR32_USART_MR_PAR_MULTI) == AVR32_USART_MR_PAR_MULTI; +} + + +/*! \brief Calculates a clock divider (\e CD) and a fractional part (\e FP) for + * the USART asynchronous modes to generate a baud rate as close as + * possible to the baud rate set point. + * + * Baud rate calculation: + * \f$ Baudrate = \frac{SelectedClock}{Over \times (CD + \frac{FP}{8})} \f$, \e Over being 16 or 8. + * The maximal oversampling is selected if it allows to generate a baud rate close to the set point. + * + * \param usart Base address of the USART instance. + * \param baudrate Baud rate set point. + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * + * \retval USART_SUCCESS Baud rate successfully initialized. + * \retval USART_INVALID_INPUT Baud rate set point is out of range for the given input clock frequency. + */ +static int usart_set_async_baudrate(volatile avr32_usart_t *usart, unsigned int baudrate, unsigned long pba_hz) +{ + unsigned int over = (pba_hz >= 16 * baudrate) ? 16 : 8; + unsigned int cd_fp = ((1 << AVR32_USART_BRGR_FP_SIZE) * pba_hz + (over * baudrate) / 2) / (over * baudrate); + unsigned int cd = cd_fp >> AVR32_USART_BRGR_FP_SIZE; + unsigned int fp = cd_fp & ((1 << AVR32_USART_BRGR_FP_SIZE) - 1); + + if (cd < 1 || cd > (1 << AVR32_USART_BRGR_CD_SIZE) - 1) + return USART_INVALID_INPUT; + + usart->mr = (usart->mr & ~(AVR32_USART_MR_USCLKS_MASK | + AVR32_USART_MR_SYNC_MASK | + AVR32_USART_MR_OVER_MASK)) | + AVR32_USART_MR_USCLKS_MCK << AVR32_USART_MR_USCLKS_OFFSET | + ((over == 16) ? AVR32_USART_MR_OVER_X16 : AVR32_USART_MR_OVER_X8) << AVR32_USART_MR_OVER_OFFSET; + + usart->brgr = cd << AVR32_USART_BRGR_CD_OFFSET | + fp << AVR32_USART_BRGR_FP_OFFSET; + + return USART_SUCCESS; +} + + +/*! \brief Calculates a clock divider (\e CD) for the USART synchronous master + * modes to generate a baud rate as close as possible to the baud rate + * set point. + * + * Baud rate calculation: + * \f$ Baudrate = \frac{SelectedClock}{CD} \f$. + * + * \param usart Base address of the USART instance. + * \param baudrate Baud rate set point. + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * + * \retval USART_SUCCESS Baud rate successfully initialized. + * \retval USART_INVALID_INPUT Baud rate set point is out of range for the given input clock frequency. + */ +static int usart_set_sync_master_baudrate(volatile avr32_usart_t *usart, unsigned int baudrate, unsigned long pba_hz) +{ + unsigned int cd = (pba_hz + baudrate / 2) / baudrate; + + if (cd < 1 || cd > (1 << AVR32_USART_BRGR_CD_SIZE) - 1) + return USART_INVALID_INPUT; + + usart->mr = (usart->mr & ~AVR32_USART_MR_USCLKS_MASK) | + AVR32_USART_MR_USCLKS_MCK << AVR32_USART_MR_USCLKS_OFFSET | + AVR32_USART_MR_SYNC_MASK; + + usart->brgr = cd << AVR32_USART_BRGR_CD_OFFSET; + + return USART_SUCCESS; +} + + +/*! \brief Selects the SCK pin as the source of baud rate for the USART + * synchronous slave modes. + * + * \param usart Base address of the USART instance. + * + * \retval USART_SUCCESS Baud rate successfully initialized. + */ +static int usart_set_sync_slave_baudrate(volatile avr32_usart_t *usart) +{ + usart->mr = (usart->mr & ~AVR32_USART_MR_USCLKS_MASK) | + AVR32_USART_MR_USCLKS_SCK << AVR32_USART_MR_USCLKS_OFFSET | + AVR32_USART_MR_SYNC_MASK; + + return USART_SUCCESS; +} + + +/*! \brief Calculates a clock divider (\e CD) for the USART ISO7816 mode to + * generate an ISO7816 clock as close as possible to the clock set point. + * + * ISO7816 clock calculation: + * \f$ Clock = \frac{SelectedClock}{CD} \f$. + * + * \param usart Base address of the USART instance. + * \param clock ISO7816 clock set point. + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * + * \retval USART_SUCCESS ISO7816 clock successfully initialized. + * \retval USART_INVALID_INPUT ISO7816 clock set point is out of range for the given input clock frequency. + */ +static int usart_set_iso7816_clock(volatile avr32_usart_t *usart, unsigned int clock, unsigned long pba_hz) +{ + unsigned int cd = (pba_hz + clock / 2) / clock; + + if (cd < 1 || cd > (1 << AVR32_USART_BRGR_CD_SIZE) - 1) + return USART_INVALID_INPUT; + + usart->mr = (usart->mr & ~(AVR32_USART_MR_USCLKS_MASK | + AVR32_USART_MR_SYNC_MASK | + AVR32_USART_MR_OVER_MASK)) | + AVR32_USART_MR_USCLKS_MCK << AVR32_USART_MR_USCLKS_OFFSET | + AVR32_USART_MR_OVER_X16 << AVR32_USART_MR_OVER_OFFSET; + + usart->brgr = cd << AVR32_USART_BRGR_CD_OFFSET; + + return USART_SUCCESS; +} + + +#if defined(AVR32_USART_400_H_INCLUDED) || \ + defined(AVR32_USART_410_H_INCLUDED) || \ + defined(AVR32_USART_420_H_INCLUDED) || \ + defined(AVR32_USART_440_H_INCLUDED) || \ + defined(AVR32_USART_602_H_INCLUDED) + + +/*! \brief Calculates a clock divider (\e CD) for the USART SPI master mode to + * generate a baud rate as close as possible to the baud rate set point. + * + * Baud rate calculation: + * \f$ Baudrate = \frac{SelectedClock}{CD} \f$. + * + * \param usart Base address of the USART instance. + * \param baudrate Baud rate set point. + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * + * \retval USART_SUCCESS Baud rate successfully initialized. + * \retval USART_INVALID_INPUT Baud rate set point is out of range for the given input clock frequency. + */ +static int usart_set_spi_master_baudrate(volatile avr32_usart_t *usart, unsigned int baudrate, unsigned long pba_hz) +{ + unsigned int cd = (pba_hz + baudrate / 2) / baudrate; + + if (cd < 4 || cd > (1 << AVR32_USART_BRGR_CD_SIZE) - 1) + return USART_INVALID_INPUT; + + usart->mr = (usart->mr & ~AVR32_USART_MR_USCLKS_MASK) | + AVR32_USART_MR_USCLKS_MCK << AVR32_USART_MR_USCLKS_OFFSET; + + usart->brgr = cd << AVR32_USART_BRGR_CD_OFFSET; + + return USART_SUCCESS; +} + + +/*! \brief Selects the SCK pin as the source of baud rate for the USART SPI + * slave mode. + * + * \param usart Base address of the USART instance. + * + * \retval USART_SUCCESS Baud rate successfully initialized. + */ +static int usart_set_spi_slave_baudrate(volatile avr32_usart_t *usart) +{ + usart->mr = (usart->mr & ~AVR32_USART_MR_USCLKS_MASK) | + AVR32_USART_MR_USCLKS_SCK << AVR32_USART_MR_USCLKS_OFFSET; + + return USART_SUCCESS; +} + + +#endif // USART rev. >= 4.0.0 + + +//! @} + + +//------------------------------------------------------------------------------ +/*! \name Initialization Functions + */ +//! @{ + + +void usart_reset(volatile avr32_usart_t *usart) +{ + Bool global_interrupt_enabled = Is_global_interrupt_enabled(); + + // Disable all USART interrupts. + // Interrupts needed should be set explicitly on every reset. + if (global_interrupt_enabled) Disable_global_interrupt(); + usart->idr = 0xFFFFFFFF; + usart->csr; + if (global_interrupt_enabled) Enable_global_interrupt(); + + // Reset mode and other registers that could cause unpredictable behavior after reset. + usart->mr = 0; + usart->rtor = 0; + usart->ttgr = 0; + + // Shutdown TX and RX (will be re-enabled when setup has successfully completed), + // reset status bits and turn off DTR and RTS. + usart->cr = AVR32_USART_CR_RSTRX_MASK | + AVR32_USART_CR_RSTTX_MASK | + AVR32_USART_CR_RSTSTA_MASK | + AVR32_USART_CR_RSTIT_MASK | + AVR32_USART_CR_RSTNACK_MASK | +#ifndef AVR32_USART_440_H_INCLUDED +// Note: Modem Signal Management DTR-DSR-DCD-RI are not included in USART rev.440. + AVR32_USART_CR_DTRDIS_MASK | +#endif + AVR32_USART_CR_RTSDIS_MASK; +} + + +int usart_init_rs232(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz) +{ + // Reset the USART and shutdown TX and RX. + usart_reset(usart); + + // Check input values. + if (!opt || // Null pointer. + opt->charlength < 5 || opt->charlength > 9 || + opt->paritytype > 7 || + opt->stopbits > 2 + 255 || + opt->channelmode > 3 || + usart_set_async_baudrate(usart, opt->baudrate, pba_hz) == USART_INVALID_INPUT) + return USART_INVALID_INPUT; + + if (opt->charlength == 9) + { + // Character length set to 9 bits. MODE9 dominates CHRL. + usart->mr |= AVR32_USART_MR_MODE9_MASK; + } + else + { + // CHRL gives the character length (- 5) when MODE9 = 0. + usart->mr |= (opt->charlength - 5) << AVR32_USART_MR_CHRL_OFFSET; + } + + usart->mr |= opt->paritytype << AVR32_USART_MR_PAR_OFFSET | + opt->channelmode << AVR32_USART_MR_CHMODE_OFFSET; + + if (opt->stopbits > USART_2_STOPBITS) + { + // Set two stop bits + usart->mr |= AVR32_USART_MR_NBSTOP_2 << AVR32_USART_MR_NBSTOP_OFFSET; + // and a timeguard period gives the rest. + usart->ttgr = opt->stopbits - USART_2_STOPBITS; + } + else + // Insert 1, 1.5 or 2 stop bits. + usart->mr |= opt->stopbits << AVR32_USART_MR_NBSTOP_OFFSET; + + // Set normal mode. + usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) | + AVR32_USART_MR_MODE_NORMAL << AVR32_USART_MR_MODE_OFFSET; + + // Setup complete; enable communication. + // Enable input and output. + usart->cr = AVR32_USART_CR_RXEN_MASK | + AVR32_USART_CR_TXEN_MASK; + + return USART_SUCCESS; +} + + +int usart_init_rs232_tx_only(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz) +{ + // Reset the USART and shutdown TX and RX. + usart_reset(usart); + + // Check input values. + if (!opt || // Null pointer. + opt->charlength < 5 || opt->charlength > 9 || + opt->paritytype > 7 || + opt->stopbits == 1 || opt->stopbits > 2 + 255 || + opt->channelmode > 3 || + usart_set_sync_master_baudrate(usart, opt->baudrate, pba_hz) == USART_INVALID_INPUT) + return USART_INVALID_INPUT; + + if (opt->charlength == 9) + { + // Character length set to 9 bits. MODE9 dominates CHRL. + usart->mr |= AVR32_USART_MR_MODE9_MASK; + } + else + { + // CHRL gives the character length (- 5) when MODE9 = 0. + usart->mr |= (opt->charlength - 5) << AVR32_USART_MR_CHRL_OFFSET; + } + + usart->mr |= opt->paritytype << AVR32_USART_MR_PAR_OFFSET | + opt->channelmode << AVR32_USART_MR_CHMODE_OFFSET; + + if (opt->stopbits > USART_2_STOPBITS) + { + // Set two stop bits + usart->mr |= AVR32_USART_MR_NBSTOP_2 << AVR32_USART_MR_NBSTOP_OFFSET; + // and a timeguard period gives the rest. + usart->ttgr = opt->stopbits - USART_2_STOPBITS; + } + else + // Insert 1 or 2 stop bits. + usart->mr |= opt->stopbits << AVR32_USART_MR_NBSTOP_OFFSET; + + // Set normal mode. + usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) | + AVR32_USART_MR_MODE_NORMAL << AVR32_USART_MR_MODE_OFFSET; + + // Setup complete; enable communication. + // Enable only output as input is not possible in synchronous mode without + // transferring clock. + usart->cr = AVR32_USART_CR_TXEN_MASK; + + return USART_SUCCESS; +} + + +int usart_init_hw_handshaking(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz) +{ + // First: Setup standard RS232. + if (usart_init_rs232(usart, opt, pba_hz) == USART_INVALID_INPUT) + return USART_INVALID_INPUT; + + // Set hardware handshaking mode. + usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) | + AVR32_USART_MR_MODE_HARDWARE << AVR32_USART_MR_MODE_OFFSET; + + return USART_SUCCESS; +} + + +int usart_init_modem(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz) +{ + // First: Setup standard RS232. + if (usart_init_rs232(usart, opt, pba_hz) == USART_INVALID_INPUT) + return USART_INVALID_INPUT; + + // Set modem mode. + usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) | + AVR32_USART_MR_MODE_MODEM << AVR32_USART_MR_MODE_OFFSET; + + return USART_SUCCESS; +} + + +int usart_init_sync_master(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz) +{ + // Reset the USART and shutdown TX and RX. + usart_reset(usart); + + // Check input values. + if (!opt || // Null pointer. + opt->charlength < 5 || opt->charlength > 9 || + opt->paritytype > 7 || + opt->stopbits == 1 || opt->stopbits > 2 + 255 || + opt->channelmode > 3 || + usart_set_sync_master_baudrate(usart, opt->baudrate, pba_hz) == USART_INVALID_INPUT) + return USART_INVALID_INPUT; + + if (opt->charlength == 9) + { + // Character length set to 9 bits. MODE9 dominates CHRL. + usart->mr |= AVR32_USART_MR_MODE9_MASK; + } + else + { + // CHRL gives the character length (- 5) when MODE9 = 0. + usart->mr |= (opt->charlength - 5) << AVR32_USART_MR_CHRL_OFFSET; + } + + usart->mr |= opt->paritytype << AVR32_USART_MR_PAR_OFFSET | + opt->channelmode << AVR32_USART_MR_CHMODE_OFFSET; + + if (opt->stopbits > USART_2_STOPBITS) + { + // Set two stop bits + usart->mr |= AVR32_USART_MR_NBSTOP_2 << AVR32_USART_MR_NBSTOP_OFFSET; + // and a timeguard period gives the rest. + usart->ttgr = opt->stopbits - USART_2_STOPBITS; + } + else + // Insert 1 or 2 stop bits. + usart->mr |= opt->stopbits << AVR32_USART_MR_NBSTOP_OFFSET; + + // Set normal mode. + usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) | + AVR32_USART_MR_MODE_NORMAL << AVR32_USART_MR_MODE_OFFSET | + AVR32_USART_MR_CLKO_MASK; + + // Setup complete; enable communication. + // Enable input and output. + usart->cr = AVR32_USART_CR_RXEN_MASK | + AVR32_USART_CR_TXEN_MASK; + + return USART_SUCCESS; +} + + +int usart_init_sync_slave(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz) +{ + // Reset the USART and shutdown TX and RX. + usart_reset(usart); + + // Check input values. + if (!opt || // Null pointer. + opt->charlength < 5 || opt->charlength > 9 || + opt->paritytype > 7 || + opt->stopbits == 1 || opt->stopbits > 2 + 255 || + opt->channelmode > 3 || + usart_set_sync_slave_baudrate(usart) == USART_INVALID_INPUT) + return USART_INVALID_INPUT; + + if (opt->charlength == 9) + { + // Character length set to 9 bits. MODE9 dominates CHRL. + usart->mr |= AVR32_USART_MR_MODE9_MASK; + } + else + { + // CHRL gives the character length (- 5) when MODE9 = 0. + usart->mr |= (opt->charlength - 5) << AVR32_USART_MR_CHRL_OFFSET; + } + + usart->mr |= opt->paritytype << AVR32_USART_MR_PAR_OFFSET | + opt->channelmode << AVR32_USART_MR_CHMODE_OFFSET; + + if (opt->stopbits > USART_2_STOPBITS) + { + // Set two stop bits + usart->mr |= AVR32_USART_MR_NBSTOP_2 << AVR32_USART_MR_NBSTOP_OFFSET; + // and a timeguard period gives the rest. + usart->ttgr = opt->stopbits - USART_2_STOPBITS; + } + else + // Insert 1 or 2 stop bits. + usart->mr |= opt->stopbits << AVR32_USART_MR_NBSTOP_OFFSET; + + // Set normal mode. + usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) | + AVR32_USART_MR_MODE_NORMAL << AVR32_USART_MR_MODE_OFFSET; + + // Setup complete; enable communication. + // Enable input and output. + usart->cr = AVR32_USART_CR_RXEN_MASK | + AVR32_USART_CR_TXEN_MASK; + + return USART_SUCCESS; +} + + +int usart_init_rs485(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz) +{ + // First: Setup standard RS232. + if (usart_init_rs232(usart, opt, pba_hz) == USART_INVALID_INPUT) + return USART_INVALID_INPUT; + + // Set RS485 mode. + usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) | + AVR32_USART_MR_MODE_RS485 << AVR32_USART_MR_MODE_OFFSET; + + return USART_SUCCESS; +} + + +int usart_init_IrDA(volatile avr32_usart_t *usart, const usart_options_t *opt, + long pba_hz, unsigned char irda_filter) +{ + // First: Setup standard RS232. + if (usart_init_rs232(usart, opt, pba_hz) == USART_INVALID_INPUT) + return USART_INVALID_INPUT; + + // Set IrDA filter. + usart->ifr = irda_filter; + + // Set IrDA mode and activate filtering of input. + usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) | + AVR32_USART_MODE_IRDA << AVR32_USART_MR_MODE_OFFSET | + AVR32_USART_MR_FILTER_MASK; + + return USART_SUCCESS; +} + + +int usart_init_iso7816(volatile avr32_usart_t *usart, const usart_iso7816_options_t *opt, int t, long pba_hz) +{ + // Reset the USART and shutdown TX and RX. + usart_reset(usart); + + // Check input values. + if (!opt || // Null pointer. + opt->paritytype > 1) + return USART_INVALID_INPUT; + + if (t == 0) + { + // Set USART mode to ISO7816, T=0. + // The T=0 protocol always uses 2 stop bits. + usart->mr = AVR32_USART_MR_MODE_ISO7816_T0 << AVR32_USART_MR_MODE_OFFSET | + AVR32_USART_MR_NBSTOP_2 << AVR32_USART_MR_NBSTOP_OFFSET | + opt->bit_order << AVR32_USART_MR_MSBF_OFFSET; // Allow MSBF in T=0. + } + else if (t == 1) + { + // Only LSB first in the T=1 protocol. + // max_iterations field is only used in T=0 mode. + if (opt->bit_order != 0 || + opt->max_iterations != 0) + return USART_INVALID_INPUT; + + // Set USART mode to ISO7816, T=1. + // The T=1 protocol always uses 1 stop bit. + usart->mr = AVR32_USART_MR_MODE_ISO7816_T1 << AVR32_USART_MR_MODE_OFFSET | + AVR32_USART_MR_NBSTOP_1 << AVR32_USART_MR_NBSTOP_OFFSET; + } + else + return USART_INVALID_INPUT; + + if (usart_set_iso7816_clock(usart, opt->iso7816_hz, pba_hz) == USART_INVALID_INPUT) + return USART_INVALID_INPUT; + + // Set FIDI register: bit rate = selected clock/FI_DI_ratio/16. + usart->fidi = opt->fidi_ratio; + + // Set ISO7816 spesific options in the MODE register. + usart->mr |= opt->paritytype << AVR32_USART_MR_PAR_OFFSET | + AVR32_USART_MR_CLKO_MASK | // Enable clock output. + opt->inhibit_nack << AVR32_USART_MR_INACK_OFFSET | + opt->dis_suc_nack << AVR32_USART_MR_DSNACK_OFFSET | + opt->max_iterations << AVR32_USART_MR_MAX_ITERATION_OFFSET; + + // Setup complete; enable the receiver by default. + usart_iso7816_enable_receiver(usart); + + return USART_SUCCESS; +} + + +#if defined(AVR32_USART_400_H_INCLUDED) || \ + defined(AVR32_USART_410_H_INCLUDED) || \ + defined(AVR32_USART_420_H_INCLUDED) || \ + defined(AVR32_USART_440_H_INCLUDED) || \ + defined(AVR32_USART_602_H_INCLUDED) + + +int usart_init_lin_master(volatile avr32_usart_t *usart, unsigned long baudrate, long pba_hz) +{ + // Reset the USART and shutdown TX and RX. + usart_reset(usart); + + // Check input values. + if (usart_set_async_baudrate(usart, baudrate, pba_hz) == USART_INVALID_INPUT) + return USART_INVALID_INPUT; + + usart->mr |= AVR32_USART_MR_MODE_LIN_MASTER << AVR32_USART_MR_MODE_OFFSET; // LIN master mode. + + // Setup complete; enable communication. + // Enable input and output. + usart->cr = AVR32_USART_CR_RXEN_MASK | + AVR32_USART_CR_TXEN_MASK; + + return USART_SUCCESS; +} + + +int usart_init_lin_slave(volatile avr32_usart_t *usart, unsigned long baudrate, long pba_hz) +{ + // Reset the USART and shutdown TX and RX. + usart_reset(usart); + + // Check input values. + if (usart_set_async_baudrate(usart, baudrate, pba_hz) == USART_INVALID_INPUT) + return USART_INVALID_INPUT; + + usart->mr |= AVR32_USART_MR_MODE_LIN_SLAVE << AVR32_USART_MR_MODE_OFFSET; // LIN slave mode. + + // Setup complete; enable communication. + // Enable input and output. + usart->cr = AVR32_USART_CR_RXEN_MASK | + AVR32_USART_CR_TXEN_MASK; + + return USART_SUCCESS; +} + + +int usart_init_spi_master(volatile avr32_usart_t *usart, const usart_spi_options_t *opt, long pba_hz) +{ + // Reset the USART and shutdown TX and RX. + usart_reset(usart); + + // Check input values. + if (!opt || // Null pointer. + opt->charlength < 5 || opt->charlength > 9 || + opt->spimode > 3 || + opt->channelmode > 3 || + usart_set_spi_master_baudrate(usart, opt->baudrate, pba_hz) == USART_INVALID_INPUT) + return USART_INVALID_INPUT; + + if (opt->charlength == 9) + { + // Character length set to 9 bits. MODE9 dominates CHRL. + usart->mr |= AVR32_USART_MR_MODE9_MASK; + } + else + { + // CHRL gives the character length (- 5) when MODE9 = 0. + usart->mr |= (opt->charlength - 5) << AVR32_USART_MR_CHRL_OFFSET; + } + + usart->mr |= AVR32_USART_MR_MODE_SPI_MASTER << AVR32_USART_MR_MODE_OFFSET | // SPI master mode. + ((opt->spimode & 0x1) ^ 0x1) << AVR32_USART_MR_SYNC_OFFSET | // SPI clock phase. + opt->channelmode << AVR32_USART_MR_CHMODE_OFFSET | // Channel mode. + (opt->spimode >> 1) << AVR32_USART_MR_MSBF_OFFSET | // SPI clock polarity. + AVR32_USART_MR_CLKO_MASK; // Drive SCK pin. + + // Setup complete; enable communication. + // Enable input and output. + usart->cr = AVR32_USART_CR_RXEN_MASK | + AVR32_USART_CR_TXEN_MASK; + + return USART_SUCCESS; +} + + +int usart_init_spi_slave(volatile avr32_usart_t *usart, const usart_spi_options_t *opt, long pba_hz) +{ + // Reset the USART and shutdown TX and RX. + usart_reset(usart); + + // Check input values. + if (!opt || // Null pointer. + opt->charlength < 5 || opt->charlength > 9 || + opt->spimode > 3 || + opt->channelmode > 3 || + usart_set_spi_slave_baudrate(usart) == USART_INVALID_INPUT) + return USART_INVALID_INPUT; + + if (opt->charlength == 9) + { + // Character length set to 9 bits. MODE9 dominates CHRL. + usart->mr |= AVR32_USART_MR_MODE9_MASK; + } + else + { + // CHRL gives the character length (- 5) when MODE9 = 0. + usart->mr |= (opt->charlength - 5) << AVR32_USART_MR_CHRL_OFFSET; + } + + usart->mr |= AVR32_USART_MR_MODE_SPI_SLAVE << AVR32_USART_MR_MODE_OFFSET | // SPI slave mode. + ((opt->spimode & 0x1) ^ 0x1) << AVR32_USART_MR_SYNC_OFFSET | // SPI clock phase. + opt->channelmode << AVR32_USART_MR_CHMODE_OFFSET | // Channel mode. + (opt->spimode >> 1) << AVR32_USART_MR_MSBF_OFFSET; // SPI clock polarity. + + // Setup complete; enable communication. + // Enable input and output. + usart->cr = AVR32_USART_CR_RXEN_MASK | + AVR32_USART_CR_TXEN_MASK; + + return USART_SUCCESS; +} + + +#endif // USART rev. >= 4.0.0 + + +//! @} + + +//------------------------------------------------------------------------------ +#if defined(AVR32_USART_400_H_INCLUDED) || \ + defined(AVR32_USART_410_H_INCLUDED) || \ + defined(AVR32_USART_420_H_INCLUDED) || \ + defined(AVR32_USART_440_H_INCLUDED) || \ + defined(AVR32_USART_602_H_INCLUDED) + + +/*! \name SPI Control Functions + */ +//! @{ + + +int usart_spi_selectChip(volatile avr32_usart_t *usart) +{ + // Force the SPI chip select. + usart->cr = AVR32_USART_CR_RTSEN_MASK; + + return USART_SUCCESS; +} + + +int usart_spi_unselectChip(volatile avr32_usart_t *usart) +{ + int timeout = USART_DEFAULT_TIMEOUT; + + do + { + if (!timeout--) return USART_FAILURE; + } while (!usart_tx_empty(usart)); + + // Release the SPI chip select. + usart->cr = AVR32_USART_CR_RTSDIS_MASK; + + return USART_SUCCESS; +} + + +//! @} + + +#endif // USART rev. >= 4.0.0 + + +//------------------------------------------------------------------------------ +/*! \name Transmit/Receive Functions + */ +//! @{ + + +int usart_send_address(volatile avr32_usart_t *usart, int address) +{ + // Check if USART is in multidrop / RS485 mode. + if (!usart_mode_is_multidrop(usart)) return USART_MODE_FAULT; + + // Prepare to send an address. + usart->cr = AVR32_USART_CR_SENDA_MASK; + + // Write the address to TX. + usart_bw_write_char(usart, address); + + return USART_SUCCESS; +} + + +int usart_write_char(volatile avr32_usart_t *usart, int c) +{ + if (usart_tx_ready(usart)) + { + usart->thr = (c << AVR32_USART_THR_TXCHR_OFFSET) & AVR32_USART_THR_TXCHR_MASK; + return USART_SUCCESS; + } + else + return USART_TX_BUSY; +} + + +int usart_putchar(volatile avr32_usart_t *usart, int c) +{ + int timeout = USART_DEFAULT_TIMEOUT; + + if (c == '\n') + { + do + { + if (!timeout--) return USART_FAILURE; + } while (usart_write_char(usart, '\r') != USART_SUCCESS); + + timeout = USART_DEFAULT_TIMEOUT; + } + + do + { + if (!timeout--) return USART_FAILURE; + } while (usart_write_char(usart, c) != USART_SUCCESS); + + return USART_SUCCESS; +} + + +int usart_read_char(volatile avr32_usart_t *usart, int *c) +{ + // Check for errors: frame, parity and overrun. In RS485 mode, a parity error + // would mean that an address char has been received. + if (usart->csr & (AVR32_USART_CSR_OVRE_MASK | + AVR32_USART_CSR_FRAME_MASK | + AVR32_USART_CSR_PARE_MASK)) + return USART_RX_ERROR; + + // No error; if we really did receive a char, read it and return SUCCESS. + if (usart_test_hit(usart)) + { + *c = (usart->rhr & AVR32_USART_RHR_RXCHR_MASK) >> AVR32_USART_RHR_RXCHR_OFFSET; + return USART_SUCCESS; + } + else + return USART_RX_EMPTY; +} + + +int usart_getchar(volatile avr32_usart_t *usart) +{ + int c, ret; + + while ((ret = usart_read_char(usart, &c)) == USART_RX_EMPTY); + + if (ret == USART_RX_ERROR) + return USART_FAILURE; + + return c; +} + + +void usart_write_line(volatile avr32_usart_t *usart, const char *string) +{ + while (*string != '\0') + usart_putchar(usart, *string++); +} + + +int usart_get_echo_line(volatile avr32_usart_t *usart) +{ + int rx_char; + int retval = USART_SUCCESS; + + while (1) + { + rx_char = usart_getchar(usart); + if (rx_char == USART_FAILURE) + { + usart_write_line(usart, "Error!!!\n"); + retval = USART_FAILURE; + break; + } + if (rx_char == '\x03') + { + retval = USART_FAILURE; + break; + } + usart_putchar(usart, rx_char); + if (rx_char == '\r') + { + usart_putchar(usart, '\n'); + break; + } + } + + return retval; +} + + +//! @} diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/USART/usart.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/USART/usart.h new file mode 100644 index 0000000..bc1c100 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/DRIVERS/USART/usart.h @@ -0,0 +1,889 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief USART driver for AVR32 UC3. + * + * This file contains basic functions for the AVR32 USART, with support for all + * modes, settings and clock speeds. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with a USART module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _USART_H_ +#define _USART_H_ + +#include +#include "compiler.h" + + +/*! \name Return Values + */ +//! @{ +#define USART_SUCCESS 0 //!< Successful completion. +#define USART_FAILURE -1 //!< Failure because of some unspecified reason. +#define USART_INVALID_INPUT 1 //!< Input value out of range. +#define USART_INVALID_ARGUMENT -1 //!< Argument value out of range. +#define USART_TX_BUSY 2 //!< Transmitter was busy. +#define USART_RX_EMPTY 3 //!< Nothing was received. +#define USART_RX_ERROR 4 //!< Transmission error occurred. +#define USART_MODE_FAULT 5 //!< USART not in the appropriate mode. +//! @} + +//! Default time-out value (number of attempts). +#define USART_DEFAULT_TIMEOUT 10000 + +/*! \name Parity Settings + */ +//! @{ +#define USART_EVEN_PARITY AVR32_USART_MR_PAR_EVEN //!< Use even parity on character transmission. +#define USART_ODD_PARITY AVR32_USART_MR_PAR_ODD //!< Use odd parity on character transmission. +#define USART_SPACE_PARITY AVR32_USART_MR_PAR_SPACE //!< Use a space as parity bit. +#define USART_MARK_PARITY AVR32_USART_MR_PAR_MARK //!< Use a mark as parity bit. +#define USART_NO_PARITY AVR32_USART_MR_PAR_NONE //!< Don't use a parity bit. +#define USART_MULTIDROP_PARITY AVR32_USART_MR_PAR_MULTI //!< Parity bit is used to flag address characters. +//! @} + +/*! \name Stop Bits Settings + */ +//! @{ +#define USART_1_STOPBIT AVR32_USART_MR_NBSTOP_1 //!< Use 1 stop bit. +#define USART_1_5_STOPBITS AVR32_USART_MR_NBSTOP_1_5 //!< Use 1.5 stop bits. +#define USART_2_STOPBITS AVR32_USART_MR_NBSTOP_2 //!< Use 2 stop bits (for more, just give the number of bits). +//! @} + +/*! \name Channel Modes + */ +//! @{ +#define USART_NORMAL_CHMODE AVR32_USART_MR_CHMODE_NORMAL //!< Normal communication. +#define USART_AUTO_ECHO AVR32_USART_MR_CHMODE_ECHO //!< Echo data. +#define USART_LOCAL_LOOPBACK AVR32_USART_MR_CHMODE_LOCAL_LOOP //!< Local loopback. +#define USART_REMOTE_LOOPBACK AVR32_USART_MR_CHMODE_REMOTE_LOOP //!< Remote loopback. +//! @} + +#if defined(AVR32_USART_400_H_INCLUDED) || \ + defined(AVR32_USART_410_H_INCLUDED) || \ + defined(AVR32_USART_420_H_INCLUDED) || \ + defined(AVR32_USART_440_H_INCLUDED) || \ + defined(AVR32_USART_602_H_INCLUDED) + +/*! \name LIN Node Actions + */ +//! @{ +#define USART_LIN_PUBLISH_ACTION AVR32_USART_LINMR_NACT_PUBLISH //!< The USART transmits the response. +#define USART_LIN_SUBSCRIBE_ACTION AVR32_USART_LINMR_NACT_SUBSCRIBE //!< The USART receives the response. +#define USART_LIN_IGNORE_ACTION AVR32_USART_LINMR_NACT_IGNORE //!< The USART does not transmit and does not receive the reponse. +//! @} + +/*! \name LIN Checksum Types + */ +//! @{ +#define USART_LIN_ENHANCED_CHECKSUM 0 //!< LIN 2.0 "enhanced" checksum. +#define USART_LIN_CLASSIC_CHECKSUM 1 //!< LIN 1.3 "classic" checksum. +//! @} + +#endif // USART rev. >= 4.0.0 + + +//! Input parameters when initializing RS232 and similar modes. +typedef struct +{ + //! Set baud rate of the USART (unused in slave modes). + unsigned long baudrate; + + //! Number of bits to transmit as a character (5 to 9). + unsigned char charlength; + + //! How to calculate the parity bit: \ref USART_EVEN_PARITY, \ref USART_ODD_PARITY, + //! \ref USART_SPACE_PARITY, \ref USART_MARK_PARITY, \ref USART_NO_PARITY or + //! \ref USART_MULTIDROP_PARITY. + unsigned char paritytype; + + //! Number of stop bits between two characters: \ref USART_1_STOPBIT, + //! \ref USART_1_5_STOPBITS, \ref USART_2_STOPBITS or any number from 3 to 257 + //! which will result in a time guard period of that length between characters. + //! \note \ref USART_1_5_STOPBITS is supported in asynchronous modes only. + unsigned short stopbits; + + //! Run the channel in testmode: \ref USART_NORMAL_CHMODE, \ref USART_AUTO_ECHO, + //! \ref USART_LOCAL_LOOPBACK or \ref USART_REMOTE_LOOPBACK. + unsigned char channelmode; +} usart_options_t; + +//! Input parameters when initializing ISO7816 mode. +typedef struct +{ + //! Set the frequency of the ISO7816 clock. + unsigned long iso7816_hz; + + //! The number of ISO7816 clock ticks in every bit period (1 to 2047, 0 = disable clock). + //! Bit rate = \ref iso7816_hz / \ref fidi_ratio. + unsigned short fidi_ratio; + + //! How to calculate the parity bit: \ref USART_EVEN_PARITY for normal mode or + //! \ref USART_ODD_PARITY for inverse mode. + unsigned char paritytype; + + //! Inhibit Non Acknowledge:\n + //! - 0: the NACK is generated;\n + //! - 1: the NACK is not generated. + //! + //! \note This bit will be used only in ISO7816 mode, protocol T = 0 receiver. + int inhibit_nack; + + //! Disable successive NACKs. + //! Successive parity errors are counted up to the value in the \ref max_iterations field. + //! These parity errors generate a NACK on the ISO line. As soon as this value is reached, + //! no addititional NACK is sent on the ISO line. The ITERATION flag is asserted. + int dis_suc_nack; + + //! Max number of repetitions (0 to 7). + unsigned char max_iterations; + + //! Bit order in transmitted characters:\n + //! - 0: LSB first;\n + //! - 1: MSB first. + int bit_order; +} usart_iso7816_options_t; + +#if defined(AVR32_USART_400_H_INCLUDED) || \ + defined(AVR32_USART_410_H_INCLUDED) || \ + defined(AVR32_USART_420_H_INCLUDED) || \ + defined(AVR32_USART_440_H_INCLUDED) || \ + defined(AVR32_USART_602_H_INCLUDED) + +//! Input parameters when initializing SPI mode. +typedef struct +{ + //! Set the frequency of the SPI clock (unused in slave mode). + unsigned long baudrate; + + //! Number of bits to transmit as a character (5 to 9). + unsigned char charlength; + + //! Which SPI mode to use. + unsigned char spimode; + + //! Run the channel in testmode: \ref USART_NORMAL_CHMODE, \ref USART_AUTO_ECHO, + //! \ref USART_LOCAL_LOOPBACK or \ref USART_REMOTE_LOOPBACK. + unsigned char channelmode; +} usart_spi_options_t; + +#endif // USART rev. >= 4.0.0 + + +//------------------------------------------------------------------------------ +/*! \name Initialization Functions + */ +//! @{ + +/*! \brief Resets the USART and disables TX and RX. + * + * \param usart Base address of the USART instance. + */ +extern void usart_reset(volatile avr32_usart_t *usart); + +/*! \brief Sets up the USART to use the standard RS232 protocol. + * + * \param usart Base address of the USART instance. + * \param opt Options needed to set up RS232 communication (see \ref usart_options_t). + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * + * \retval USART_SUCCESS Mode successfully initialized. + * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. + */ +extern int usart_init_rs232(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz); + +/*! \brief Sets up the USART to use the standard RS232 protocol in TX-only mode. + * + * Compared to \ref usart_init_rs232, this function allows very high baud rates + * (up to \a pba_hz instead of \a pba_hz / \c 8) at the expense of full duplex. + * + * \param usart Base address of the USART instance. + * \param opt Options needed to set up RS232 communication (see \ref usart_options_t). + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * + * \retval USART_SUCCESS Mode successfully initialized. + * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. + * + * \note The \c 1.5 stop bit is not supported in this mode. + */ +extern int usart_init_rs232_tx_only(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz); + +/*! \brief Sets up the USART to use hardware handshaking. + * + * \param usart Base address of the USART instance. + * \param opt Options needed to set up RS232 communication (see \ref usart_options_t). + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * + * \retval USART_SUCCESS Mode successfully initialized. + * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. + * + * \note \ref usart_init_rs232 does not need to be invoked before this function. + */ +extern int usart_init_hw_handshaking(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz); + +/*! \brief Sets up the USART to use the modem protocol, activating dedicated inputs/outputs. + * + * \param usart Base address of the USART instance. + * \param opt Options needed to set up RS232 communication (see \ref usart_options_t). + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * + * \retval USART_SUCCESS Mode successfully initialized. + * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. + */ +extern int usart_init_modem(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz); + +/*! \brief Sets up the USART to use a synchronous RS232-like protocol in master mode. + * + * \param usart Base address of the USART instance. + * \param opt Options needed to set up RS232 communication (see \ref usart_options_t). + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * + * \retval USART_SUCCESS Mode successfully initialized. + * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. + */ +extern int usart_init_sync_master(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz); + +/*! \brief Sets up the USART to use a synchronous RS232-like protocol in slave mode. + * + * \param usart Base address of the USART instance. + * \param opt Options needed to set up RS232 communication (see \ref usart_options_t). + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * + * \retval USART_SUCCESS Mode successfully initialized. + * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. + */ +extern int usart_init_sync_slave(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz); + +/*! \brief Sets up the USART to use the RS485 protocol. + * + * \param usart Base address of the USART instance. + * \param opt Options needed to set up RS232 communication (see \ref usart_options_t). + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * + * \retval USART_SUCCESS Mode successfully initialized. + * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. + */ +extern int usart_init_rs485(volatile avr32_usart_t *usart, const usart_options_t *opt, long pba_hz); + +/*! \brief Sets up the USART to use the IrDA protocol. + * + * \param usart Base address of the USART instance. + * \param opt Options needed to set up RS232 communication (see \ref usart_options_t). + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * \param irda_filter Counter used to distinguish received ones from zeros. + * + * \retval USART_SUCCESS Mode successfully initialized. + * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. + */ +extern int usart_init_IrDA(volatile avr32_usart_t *usart, const usart_options_t *opt, + long pba_hz, unsigned char irda_filter); + +/*! \brief Sets up the USART to use the ISO7816 T=0 or T=1 smartcard protocols. + * + * The receiver is enabled by default. \ref usart_iso7816_enable_receiver and + * \ref usart_iso7816_enable_transmitter can be called to change the half-duplex + * communication direction. + * + * \param usart Base address of the USART instance. + * \param opt Options needed to set up ISO7816 communication (see \ref usart_iso7816_options_t). + * \param t ISO7816 mode to use (T=0 or T=1). + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * + * \retval USART_SUCCESS Mode successfully initialized. + * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. + */ +extern int usart_init_iso7816(volatile avr32_usart_t *usart, const usart_iso7816_options_t *opt, int t, long pba_hz); + +#if defined(AVR32_USART_400_H_INCLUDED) || \ + defined(AVR32_USART_410_H_INCLUDED) || \ + defined(AVR32_USART_420_H_INCLUDED) || \ + defined(AVR32_USART_440_H_INCLUDED) || \ + defined(AVR32_USART_602_H_INCLUDED) + +/*! \brief Sets up the USART to use the LIN master mode. + * + * \param usart Base address of the USART instance. + * \param baudrate Baud rate. + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * + */ +extern int usart_init_lin_master(volatile avr32_usart_t *usart, unsigned long baudrate, long pba_hz); + +/*! \brief Sets up the USART to use the LIN slave mode. + * + * \param usart Base address of the USART instance. + * \param baudrate Baud rate. + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * + */ +extern int usart_init_lin_slave(volatile avr32_usart_t *usart, unsigned long baudrate, long pba_hz); + +/*! \brief Sets up the USART to use the SPI master mode. + * + * \ref usart_spi_selectChip and \ref usart_spi_unselectChip can be called to + * select or unselect the SPI slave chip. + * + * \param usart Base address of the USART instance. + * \param opt Options needed to set up SPI mode (see \ref usart_spi_options_t). + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * + * \retval USART_SUCCESS Mode successfully initialized. + * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. + */ +extern int usart_init_spi_master(volatile avr32_usart_t *usart, const usart_spi_options_t *opt, long pba_hz); + +/*! \brief Sets up the USART to use the SPI slave mode. + * + * \param usart Base address of the USART instance. + * \param opt Options needed to set up SPI mode (see \ref usart_spi_options_t). + * \param pba_hz USART module input clock frequency (PBA clock, Hz). + * + * \retval USART_SUCCESS Mode successfully initialized. + * \retval USART_INVALID_INPUT One or more of the arguments is out of valid range. + */ +extern int usart_init_spi_slave(volatile avr32_usart_t *usart, const usart_spi_options_t *opt, long pba_hz); + +#endif // USART rev. >= 4.0.0 + +//! @} + + +//------------------------------------------------------------------------------ +/*! \name Read and Reset Error Status Bits + */ +//! @{ + +/*! \brief Resets the error status. + * + * This function resets the status bits indicating that a parity error, + * framing error or overrun has occurred. The RXBRK bit, indicating + * a start/end of break condition on the RX line, is also reset. + * + * \param usart Base address of the USART instance. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void usart_reset_status(volatile avr32_usart_t *usart) +{ + usart->cr = AVR32_USART_CR_RSTSTA_MASK; +} + +/*! \brief Checks if a parity error has occurred since last status reset. + * + * \param usart Base address of the USART instance. + * + * \return \c 1 if a parity error has been detected, otherwise \c 0. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ int usart_parity_error(volatile avr32_usart_t *usart) +{ + return (usart->csr & AVR32_USART_CSR_PARE_MASK) != 0; +} + +/*! \brief Checks if a framing error has occurred since last status reset. + * + * \param usart Base address of the USART instance. + * + * \return \c 1 if a framing error has been detected, otherwise \c 0. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ int usart_framing_error(volatile avr32_usart_t *usart) +{ + return (usart->csr & AVR32_USART_CSR_FRAME_MASK) != 0; +} + +/*! \brief Checks if an overrun error has occurred since last status reset. + * + * \param usart Base address of the USART instance. + * + * \return \c 1 if a overrun error has been detected, otherwise \c 0. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ int usart_overrun_error(volatile avr32_usart_t *usart) +{ + return (usart->csr & AVR32_USART_CSR_OVRE_MASK) != 0; +} + +#if defined(AVR32_USART_400_H_INCLUDED) || \ + defined(AVR32_USART_410_H_INCLUDED) || \ + defined(AVR32_USART_420_H_INCLUDED) || \ + defined(AVR32_USART_440_H_INCLUDED) || \ + defined(AVR32_USART_602_H_INCLUDED) + +/*! \brief Get LIN Error Status + * + * \param usart Base address of the USART instance. + * + * \retval The binary value of the error field. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ int usart_lin_get_error(volatile avr32_usart_t *usart) +{ + return (usart->csr & (AVR32_USART_CSR_LINSNRE_MASK | + AVR32_USART_CSR_LINCE_MASK | + AVR32_USART_CSR_LINIPE_MASK | + AVR32_USART_CSR_LINISFE_MASK | + AVR32_USART_CSR_LINBE_MASK)) >> AVR32_USART_CSR_LINBE_OFFSET; +} + +#endif // USART rev. >= 4.0.0 + +//! @} + + +//------------------------------------------------------------------------------ +/*! \name ISO7816 Control Functions + */ +//! @{ + +/*! \brief Enables the ISO7816 receiver. + * + * The ISO7816 transmitter is disabled. + * + * \param usart Base address of the USART instance. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void usart_iso7816_enable_receiver(volatile avr32_usart_t *usart) +{ + usart->cr = AVR32_USART_CR_TXDIS_MASK | AVR32_USART_CR_RXEN_MASK; +} + +/*! \brief Enables the ISO7816 transmitter. + * + * The ISO7816 receiver is disabled. + * + * \param usart Base address of the USART instance. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void usart_iso7816_enable_transmitter(volatile avr32_usart_t *usart) +{ + usart->cr = AVR32_USART_CR_RXDIS_MASK | AVR32_USART_CR_TXEN_MASK; +} + +//! @} + + +//------------------------------------------------------------------------------ +#if defined(AVR32_USART_400_H_INCLUDED) || \ + defined(AVR32_USART_410_H_INCLUDED) || \ + defined(AVR32_USART_420_H_INCLUDED) || \ + defined(AVR32_USART_440_H_INCLUDED) || \ + defined(AVR32_USART_602_H_INCLUDED) + +/*! \name LIN Control Functions + */ +//! @{ + +/*! \brief Sets the node action. + * + * \param usart Base address of the USART instance. + * \param action The node action: \ref USART_LIN_PUBLISH_ACTION, + * \ref USART_LIN_SUBSCRIBE_ACTION or + * \ref USART_LIN_IGNORE_ACTION. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void usart_lin_set_node_action(volatile avr32_usart_t *usart, unsigned char action) +{ + usart->linmr = (usart->linmr & ~AVR32_USART_LINMR_NACT_MASK) | + action << AVR32_USART_LINMR_NACT_OFFSET; +} + +/*! \brief Enables or disables the Identifier parity. + * + * \param usart Base address of the USART instance. + * \param parity Whether to enable the Identifier parity: \c TRUE or \c FALSE. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void usart_lin_enable_parity(volatile avr32_usart_t *usart, unsigned char parity) +{ + usart->linmr = (usart->linmr & ~AVR32_USART_LINMR_PARDIS_MASK) | + !parity << AVR32_USART_LINMR_PARDIS_OFFSET; +} + +/*! \brief Enables or disables the checksum. + * + * \param usart Base address of the USART instance. + * \param parity Whether to enable the checksum: \c TRUE or \c FALSE. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void usart_lin_enable_checksum(volatile avr32_usart_t *usart, unsigned char checksum) +{ + usart->linmr = (usart->linmr & ~AVR32_USART_LINMR_CHKDIS_MASK) | + !checksum << AVR32_USART_LINMR_CHKDIS_OFFSET; +} + +/*! \brief Sets the checksum type. + * + * \param usart Base address of the USART instance. + * \param chktyp The checksum type: \ref USART_LIN_ENHANCED_CHEKSUM or + * \ref USART_LIN_CLASSIC_CHECKSUM. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void usart_lin_set_checksum(volatile avr32_usart_t *usart, unsigned char chktyp) +{ + usart->linmr = (usart->linmr & ~AVR32_USART_LINMR_CHKTYP_MASK) | + chktyp << AVR32_USART_LINMR_CHKTYP_OFFSET; +} + +/*! \brief Gets the response data length. + * + * \param usart Base address of the USART instance. + * + * \return The response data length. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ unsigned char usart_lin_get_data_length(volatile avr32_usart_t *usart) +{ + if (usart->linmr & AVR32_USART_LINMR_DLM_MASK) + { + unsigned char data_length = 1 << ((usart->linir >> (AVR32_USART_LINIR_IDCHR_OFFSET + 4)) & 0x03); + if (data_length == 1) + data_length = 2; + return data_length; + } + else + return ((usart->linmr & AVR32_USART_LINMR_DLC_MASK) >> AVR32_USART_LINMR_DLC_OFFSET) + 1; +} + +/*! \brief Sets the response data length for LIN 1.x. + * + * \param usart Base address of the USART instance. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void usart_lin_set_data_length_lin1x(volatile avr32_usart_t *usart) +{ + usart->linmr |= AVR32_USART_LINMR_DLM_MASK; +} + +/*! \brief Sets the response data length for LIN 2.x. + * + * \param usart Base address of the USART instance. + * \param data_length The response data length. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void usart_lin_set_data_length_lin2x(volatile avr32_usart_t *usart, unsigned char data_length) +{ + usart->linmr = (usart->linmr & ~(AVR32_USART_LINMR_DLC_MASK | + AVR32_USART_LINMR_DLM_MASK)) | + (data_length - 1) << AVR32_USART_LINMR_DLC_OFFSET; +} + +/*! \brief Enables or disables the frame slot mode. + * + * \param usart Base address of the USART instance. + * \param frameslot Whether to enable the frame slot mode: \c TRUE or + * \c FALSE. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void usart_lin_enable_frameslot(volatile avr32_usart_t *usart, unsigned char frameslot) +{ + usart->linmr = (usart->linmr & ~AVR32_USART_LINMR_FSDIS_MASK) | + !frameslot << AVR32_USART_LINMR_FSDIS_OFFSET; +} + +/*! \brief Gets the Identifier character. + * + * \param usart Base address of the USART instance. + * + * \return The Identifier character. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ unsigned char usart_lin_get_id_char(volatile avr32_usart_t *usart) +{ + return (usart->linir & AVR32_USART_LINIR_IDCHR_MASK) >> AVR32_USART_LINIR_IDCHR_OFFSET; +} + +/*! \brief Sets the Identifier character. + * + * \param usart Base address of the USART instance. + * \param id_char The Identifier character. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void usart_lin_set_id_char(volatile avr32_usart_t *usart, unsigned char id_char) +{ + usart->linir = (usart->linir & ~AVR32_USART_LINIR_IDCHR_MASK) | + id_char << AVR32_USART_LINIR_IDCHR_OFFSET; +} + +//! @} + +#endif // USART rev. >= 4.0.0 + + +//------------------------------------------------------------------------------ +#if defined(AVR32_USART_400_H_INCLUDED) || \ + defined(AVR32_USART_410_H_INCLUDED) || \ + defined(AVR32_USART_420_H_INCLUDED) || \ + defined(AVR32_USART_440_H_INCLUDED) || \ + defined(AVR32_USART_602_H_INCLUDED) + +/*! \name SPI Control Functions + */ +//! @{ + +/*! \brief Selects SPI slave chip. + * + * \param usart Base address of the USART instance. + * + * \retval USART_SUCCESS Success. + */ +extern int usart_spi_selectChip(volatile avr32_usart_t *usart); + +/*! \brief Unselects SPI slave chip. + * + * \param usart Base address of the USART instance. + * + * \retval USART_SUCCESS Success. + * \retval USART_FAILURE Time-out. + */ +extern int usart_spi_unselectChip(volatile avr32_usart_t *usart); + +//! @} + +#endif // USART rev. >= 4.0.0 + + +//------------------------------------------------------------------------------ +/*! \name Transmit/Receive Functions + */ +//! @{ + +/*! \brief Addresses a receiver. + * + * While in RS485 mode, receivers only accept data addressed to them. + * A packet/char with the address tag set has to precede any data. + * This function is used to address a receiver. This receiver should read + * all the following data, until an address packet addresses another receiver. + * + * \param usart Base address of the USART instance. + * \param address Address of the target device. + * + * \retval USART_SUCCESS Address successfully sent (if current mode is RS485). + * \retval USART_MODE_FAULT Wrong operating mode. + */ +extern int usart_send_address(volatile avr32_usart_t *usart, int address); + +/*! \brief Tests if the USART is ready to transmit a character. + * + * \param usart Base address of the USART instance. + * + * \return \c 1 if the USART Transmit Holding Register is free, otherwise \c 0. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ int usart_tx_ready(volatile avr32_usart_t *usart) +{ + return (usart->csr & AVR32_USART_CSR_TXRDY_MASK) != 0; +} + +/*! \brief Writes the given character to the TX buffer if the transmitter is ready. + * + * \param usart Base address of the USART instance. + * \param c The character (up to 9 bits) to transmit. + * + * \retval USART_SUCCESS The transmitter was ready. + * \retval USART_TX_BUSY The transmitter was busy. + */ +extern int usart_write_char(volatile avr32_usart_t *usart, int c); + +/*! \brief An active wait writing a character to the USART. + * + * \param usart Base address of the USART instance. + * \param c The character (up to 9 bits) to transmit. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void usart_bw_write_char(volatile avr32_usart_t *usart, int c) +{ + while (usart_write_char(usart, c) != USART_SUCCESS); +} + +/*! \brief Sends a character with the USART. + * + * \param usart Base address of the USART instance. + * \param c Character to write. + * + * \retval USART_SUCCESS The character was written. + * \retval USART_FAILURE The function timed out before the USART transmitter became ready to send. + */ +extern int usart_putchar(volatile avr32_usart_t *usart, int c); + +/*! \brief Tests if all requested USART transmissions are over. + * + * \param usart Base address of the USART instance. + * + * \return \c 1 if the USART Transmit Shift Register and the USART Transmit + * Holding Register are free, otherwise \c 0. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ int usart_tx_empty(volatile avr32_usart_t *usart) +{ + return (usart->csr & AVR32_USART_CSR_TXEMPTY_MASK) != 0; +} + +/*! \brief Tests if the USART contains a received character. + * + * \param usart Base address of the USART instance. + * + * \return \c 1 if the USART Receive Holding Register is full, otherwise \c 0. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ int usart_test_hit(volatile avr32_usart_t *usart) +{ + return (usart->csr & AVR32_USART_CSR_RXRDY_MASK) != 0; +} + +/*! \brief Checks the RX buffer for a received character, and stores it at the + * given memory location. + * + * \param usart Base address of the USART instance. + * \param c Pointer to the where the read character should be stored + * (must be at least short in order to accept 9-bit characters). + * + * \retval USART_SUCCESS The character was read successfully. + * \retval USART_RX_EMPTY The RX buffer was empty. + * \retval USART_RX_ERROR An error was deteceted. + */ +extern int usart_read_char(volatile avr32_usart_t *usart, int *c); + +/*! \brief Waits until a character is received, and returns it. + * + * \param usart Base address of the USART instance. + * + * \return The received character, or \ref USART_FAILURE upon error. + */ +extern int usart_getchar(volatile avr32_usart_t *usart); + +/*! \brief Writes one character string to the USART. + * + * \param usart Base address of the USART instance. + * \param string String to be written. + */ +extern void usart_write_line(volatile avr32_usart_t *usart, const char *string); + +/*! \brief Gets and echoes characters until end of line. + * + * \param usart Base address of the USART instance. + * + * \retval USART_SUCCESS Success. + * \retval USART_FAILURE Low-level error detected or ETX character received. + */ +extern int usart_get_echo_line(volatile avr32_usart_t *usart); + +#if defined(AVR32_USART_400_H_INCLUDED) || \ + defined(AVR32_USART_410_H_INCLUDED) || \ + defined(AVR32_USART_420_H_INCLUDED) || \ + defined(AVR32_USART_440_H_INCLUDED) || \ + defined(AVR32_USART_602_H_INCLUDED) + +/*! \brief Abort LIN transmission. + * + * \param usart Base address of the USART instance. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ void usart_lin_abort(volatile avr32_usart_t *usart) +{ + usart->cr = AVR32_USART_LINABT_MASK; +} + +/*! \brief Tests if a LIN transfer has been completed. + * + * \param usart Base address of the USART instance. + * + * \return \c 1 if a LIN transfer has been completed, otherwise \c 0. + */ +#if (defined __GNUC__) +__attribute__((__always_inline__)) +#endif +extern __inline__ int usart_lin_transfer_completed(volatile avr32_usart_t *usart) +{ + return (usart->csr & AVR32_USART_CSR_LINTC_MASK) != 0; +} + +#endif // USART rev. >= 4.0.0 + +//! @} + + +#endif // _USART_H_ diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS/ctrl_access.c b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS/ctrl_access.c new file mode 100644 index 0000000..09790c2 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS/ctrl_access.c @@ -0,0 +1,571 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Abstraction layer for memory interfaces. + * + * This module contains the interfaces: + * - MEM <-> USB; + * - MEM <-> RAM; + * - MEM <-> MEM. + * + * This module may be configured and expanded to support the following features: + * - write-protected globals; + * - password-protected data; + * - specific features; + * - etc. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +//_____ I N C L U D E S ____________________________________________________ + +#include "compiler.h" +#include "preprocessor.h" +#ifdef FREERTOS_USED +#include "FreeRTOS.h" +#include "semphr.h" +#endif +#include "ctrl_access.h" + + +//_____ D E F I N I T I O N S ______________________________________________ + +#ifdef FREERTOS_USED + +/*! \name LUN Access Protection Macros + */ +//! @{ + +/*! \brief Locks accesses to LUNs. + * + * \return \c TRUE if the access was successfully locked, else \c FALSE. + */ +#define Ctrl_access_lock() ctrl_access_lock() + +/*! \brief Unlocks accesses to LUNs. + */ +#define Ctrl_access_unlock() xSemaphoreGive(ctrl_access_semphr) + +//! @} + +//! Handle to the semaphore protecting accesses to LUNs. +static xSemaphoreHandle ctrl_access_semphr = NULL; + +#else + +/*! \name LUN Access Protection Macros + */ +//! @{ + +/*! \brief Locks accesses to LUNs. + * + * \return \c TRUE if the access was successfully locked, else \c FALSE. + */ +#define Ctrl_access_lock() TRUE + +/*! \brief Unlocks accesses to LUNs. + */ +#define Ctrl_access_unlock() + +//! @} + +#endif // FREERTOS_USED + + +#if MAX_LUN + +/*! \brief Initializes an entry of the LUN descriptor table. + * + * \param lun Logical Unit Number. + * + * \return LUN descriptor table entry initializer. + */ +#if ACCESS_USB == ENABLED && ACCESS_MEM_TO_RAM == ENABLED +#define Lun_desc_entry(lun) \ + {\ + TPASTE3(Lun_, lun, _test_unit_ready),\ + TPASTE3(Lun_, lun, _read_capacity),\ + TPASTE3(Lun_, lun, _wr_protect),\ + TPASTE3(Lun_, lun, _removal),\ + TPASTE3(Lun_, lun, _usb_read_10),\ + TPASTE3(Lun_, lun, _usb_write_10),\ + TPASTE3(Lun_, lun, _mem_2_ram),\ + TPASTE3(Lun_, lun, _ram_2_mem),\ + TPASTE3(LUN_, lun, _NAME)\ + } +#elif ACCESS_USB == ENABLED +#define Lun_desc_entry(lun) \ + {\ + TPASTE3(Lun_, lun, _test_unit_ready),\ + TPASTE3(Lun_, lun, _read_capacity),\ + TPASTE3(Lun_, lun, _wr_protect),\ + TPASTE3(Lun_, lun, _removal),\ + TPASTE3(Lun_, lun, _usb_read_10),\ + TPASTE3(Lun_, lun, _usb_write_10),\ + TPASTE3(LUN_, lun, _NAME)\ + } +#elif ACCESS_MEM_TO_RAM == ENABLED +#define Lun_desc_entry(lun) \ + {\ + TPASTE3(Lun_, lun, _test_unit_ready),\ + TPASTE3(Lun_, lun, _read_capacity),\ + TPASTE3(Lun_, lun, _wr_protect),\ + TPASTE3(Lun_, lun, _removal),\ + TPASTE3(Lun_, lun, _mem_2_ram),\ + TPASTE3(Lun_, lun, _ram_2_mem),\ + TPASTE3(LUN_, lun, _NAME)\ + } +#else +#define Lun_desc_entry(lun) \ + {\ + TPASTE3(Lun_, lun, _test_unit_ready),\ + TPASTE3(Lun_, lun, _read_capacity),\ + TPASTE3(Lun_, lun, _wr_protect),\ + TPASTE3(Lun_, lun, _removal),\ + TPASTE3(LUN_, lun, _NAME)\ + } +#endif + +//! LUN descriptor table. +static const struct +{ + Ctrl_status (*test_unit_ready)(void); + Ctrl_status (*read_capacity)(U32 *); + Bool (*wr_protect)(void); + Bool (*removal)(void); +#if ACCESS_USB == ENABLED + Ctrl_status (*usb_read_10)(U32, U16); + Ctrl_status (*usb_write_10)(U32, U16); +#endif +#if ACCESS_MEM_TO_RAM == ENABLED + Ctrl_status (*mem_2_ram)(U32, void *); + Ctrl_status (*ram_2_mem)(U32, const void *); +#endif + const char *name; +} lun_desc[MAX_LUN] = +{ +#if LUN_0 == ENABLE + Lun_desc_entry(0), +#endif +#if LUN_1 == ENABLE + Lun_desc_entry(1), +#endif +#if LUN_2 == ENABLE + Lun_desc_entry(2), +#endif +#if LUN_3 == ENABLE + Lun_desc_entry(3), +#endif +#if LUN_4 == ENABLE + Lun_desc_entry(4), +#endif +#if LUN_5 == ENABLE + Lun_desc_entry(5), +#endif +#if LUN_6 == ENABLE + Lun_desc_entry(6), +#endif +#if LUN_7 == ENABLE + Lun_desc_entry(7) +#endif +}; + +#endif + + +#if GLOBAL_WR_PROTECT == ENABLED +Bool g_wr_protect; +#endif + + +/*! \name Control Interface + */ +//! @{ + + +#ifdef FREERTOS_USED + +Bool ctrl_access_init(void) +{ + // If the handle to the protecting semaphore is not valid, + if (!ctrl_access_semphr) + { + // try to create the semaphore. + vSemaphoreCreateBinary(ctrl_access_semphr); + + // If the semaphore could not be created, there is no backup solution. + if (!ctrl_access_semphr) return FALSE; + } + + return TRUE; +} + + +/*! \brief Locks accesses to LUNs. + * + * \return \c TRUE if the access was successfully locked, else \c FALSE. + */ +static Bool ctrl_access_lock(void) +{ + // If the semaphore could not be created, there is no backup solution. + if (!ctrl_access_semphr) return FALSE; + + // Wait for the semaphore. + while (!xSemaphoreTake(ctrl_access_semphr, portMAX_DELAY)); + + return TRUE; +} + +#endif // FREERTOS_USED + + +U8 get_nb_lun(void) +{ +#if MEM_USB == ENABLE + U8 nb_lun; + + if (!Ctrl_access_lock()) return MAX_LUN; + + nb_lun = MAX_LUN + host_get_lun(); + + Ctrl_access_unlock(); + + return nb_lun; +#else + return MAX_LUN; +#endif +} + + +U8 get_cur_lun(void) +{ + return LUN_ID_0; +} + + +Ctrl_status mem_test_unit_ready(U8 lun) +{ + Ctrl_status status; + + if (!Ctrl_access_lock()) return CTRL_FAIL; + + status = +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].test_unit_ready() : +#endif +#if LUN_USB == ENABLE + Lun_usb_test_unit_ready(lun - LUN_ID_USB); +#else + CTRL_FAIL; +#endif + + Ctrl_access_unlock(); + + return status; +} + + +Ctrl_status mem_read_capacity(U8 lun, U32 *u32_nb_sector) +{ + Ctrl_status status; + + if (!Ctrl_access_lock()) return CTRL_FAIL; + + status = +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].read_capacity(u32_nb_sector) : +#endif +#if LUN_USB == ENABLE + Lun_usb_read_capacity(lun - LUN_ID_USB, u32_nb_sector); +#else + CTRL_FAIL; +#endif + + Ctrl_access_unlock(); + + return status; +} + + +U8 mem_sector_size(U8 lun) +{ + U8 sector_size; + + if (!Ctrl_access_lock()) return 0; + + sector_size = +#if MAX_LUN + (lun < MAX_LUN) ? 1 : +#endif +#if LUN_USB == ENABLE + Lun_usb_read_sector_size(lun - LUN_ID_USB); +#else + 0; +#endif + + Ctrl_access_unlock(); + + return sector_size; +} + + +Bool mem_wr_protect(U8 lun) +{ + Bool wr_protect; + + if (!Ctrl_access_lock()) return TRUE; + + wr_protect = +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].wr_protect() : +#endif +#if LUN_USB == ENABLE + Lun_usb_wr_protect(lun - LUN_ID_USB); +#else + TRUE; +#endif + + Ctrl_access_unlock(); + + return wr_protect; +} + + +Bool mem_removal(U8 lun) +{ + Bool removal; + + if (!Ctrl_access_lock()) return TRUE; + + removal = +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].removal() : +#endif +#if LUN_USB == ENABLE + Lun_usb_removal(); +#else + TRUE; +#endif + + Ctrl_access_unlock(); + + return removal; +} + + +const char *mem_name(U8 lun) +{ + return +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].name : +#endif +#if LUN_USB == ENABLE + LUN_USB_NAME; +#else + NULL; +#endif +} + + +//! @} + + +#if ACCESS_USB == ENABLED + +/*! \name MEM <-> USB Interface + */ +//! @{ + + +Ctrl_status memory_2_usb(U8 lun, U32 addr, U16 nb_sector) +{ + Ctrl_status status; + + if (!Ctrl_access_lock()) return CTRL_FAIL; + + memory_start_read_action(nb_sector); + status = +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].usb_read_10(addr, nb_sector) : +#endif + CTRL_FAIL; + memory_stop_read_action(); + + Ctrl_access_unlock(); + + return status; +} + + +Ctrl_status usb_2_memory(U8 lun, U32 addr, U16 nb_sector) +{ + Ctrl_status status; + + if (!Ctrl_access_lock()) return CTRL_FAIL; + + memory_start_write_action(nb_sector); + status = +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].usb_write_10(addr, nb_sector) : +#endif + CTRL_FAIL; + memory_stop_write_action(); + + Ctrl_access_unlock(); + + return status; +} + + +//! @} + +#endif // ACCESS_USB == ENABLED + + +#if ACCESS_MEM_TO_RAM == ENABLED + +/*! \name MEM <-> RAM Interface + */ +//! @{ + + +Ctrl_status memory_2_ram(U8 lun, U32 addr, void *ram) +{ + Ctrl_status status; + + if (!Ctrl_access_lock()) return CTRL_FAIL; + + memory_start_read_action(1); + status = +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].mem_2_ram(addr, ram) : +#endif +#if LUN_USB == ENABLE + Lun_usb_mem_2_ram(addr, ram); +#else + CTRL_FAIL; +#endif + memory_stop_read_action(); + + Ctrl_access_unlock(); + + return status; +} + + +Ctrl_status ram_2_memory(U8 lun, U32 addr, const void *ram) +{ + Ctrl_status status; + + if (!Ctrl_access_lock()) return CTRL_FAIL; + + memory_start_write_action(1); + status = +#if MAX_LUN + (lun < MAX_LUN) ? lun_desc[lun].ram_2_mem(addr, ram) : +#endif +#if LUN_USB == ENABLE + Lun_usb_ram_2_mem(addr, ram); +#else + CTRL_FAIL; +#endif + memory_stop_write_action(); + + Ctrl_access_unlock(); + + return status; +} + + +//! @} + +#endif // ACCESS_MEM_TO_RAM == ENABLED + + +#if ACCESS_STREAM == ENABLED + +/*! \name Streaming MEM <-> MEM Interface + */ +//! @{ + + + #if ACCESS_MEM_TO_MEM == ENABLED + +#include "fat.h" + +Ctrl_status stream_mem_to_mem(U8 src_lun, U32 src_addr, U8 dest_lun, U32 dest_addr, U16 nb_sector) +{ +#if (defined __GNUC__) && (defined __AVR32__) + __attribute__((__aligned__(4))) +#elif (defined __ICCAVR32__) + #pragma data_alignment = 4 +#endif + static U8 sector_buf[FS_512B]; + Ctrl_status status = CTRL_GOOD; + + while (nb_sector--) + { + if ((status = memory_2_ram(src_lun, src_addr++, sector_buf)) != CTRL_GOOD) break; + if ((status = ram_2_memory(dest_lun, dest_addr++, sector_buf)) != CTRL_GOOD) break; + } + + return status; +} + + #endif // ACCESS_MEM_TO_MEM == ENABLED + + +Ctrl_status stream_state(U8 id) +{ + return CTRL_GOOD; +} + + +U16 stream_stop(U8 id) +{ + return 0; +} + + +//! @} + +#endif // ACCESS_STREAM == ENABLED diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS/ctrl_access.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS/ctrl_access.h new file mode 100644 index 0000000..358bf65 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS/ctrl_access.h @@ -0,0 +1,369 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Abstraction layer for memory interfaces. + * + * This module contains the interfaces: + * - MEM <-> USB; + * - MEM <-> RAM; + * - MEM <-> MEM. + * + * This module may be configured and expanded to support the following features: + * - write-protected globals; + * - password-protected data; + * - specific features; + * - etc. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _CTRL_ACCESS_H_ +#define _CTRL_ACCESS_H_ + +#include "compiler.h" +#include "conf_access.h" + + +//! Status returned by CTRL_ACCESS interfaces. +typedef enum +{ + CTRL_GOOD = PASS, //!< Success, memory ready. + CTRL_FAIL = FAIL, //!< An error occurred. + CTRL_NO_PRESENT = FAIL + 1, //!< Memory unplugged. + CTRL_BUSY = FAIL + 2 //!< Memory not initialized or changed. +} Ctrl_status; + + +// FYI: Each Logical Unit Number (LUN) corresponds to a memory. + +// Check LUN defines. +#ifndef LUN_0 + #error LUN_0 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_1 + #error LUN_1 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_2 + #error LUN_2 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_3 + #error LUN_3 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_4 + #error LUN_4 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_5 + #error LUN_5 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_6 + #error LUN_6 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_7 + #error LUN_7 must be defined as ENABLE or DISABLE in conf_access.h +#endif +#ifndef LUN_USB + #error LUN_USB must be defined as ENABLE or DISABLE in conf_access.h +#endif + +/*! \name LUN IDs + */ +//! @{ +#define LUN_ID_0 (0) //!< First static LUN. +#define LUN_ID_1 (LUN_ID_0 + LUN_0) +#define LUN_ID_2 (LUN_ID_1 + LUN_1) +#define LUN_ID_3 (LUN_ID_2 + LUN_2) +#define LUN_ID_4 (LUN_ID_3 + LUN_3) +#define LUN_ID_5 (LUN_ID_4 + LUN_4) +#define LUN_ID_6 (LUN_ID_5 + LUN_5) +#define LUN_ID_7 (LUN_ID_6 + LUN_6) +#define MAX_LUN (LUN_ID_7 + LUN_7) //!< Number of static LUNs. +#define LUN_ID_USB (MAX_LUN) //!< First dynamic LUN (USB host mass storage). +//! @} + + +// Include LUN header files. +#if LUN_0 == ENABLE + #include LUN_0_INCLUDE +#endif +#if LUN_1 == ENABLE + #include LUN_1_INCLUDE +#endif +#if LUN_2 == ENABLE + #include LUN_2_INCLUDE +#endif +#if LUN_3 == ENABLE + #include LUN_3_INCLUDE +#endif +#if LUN_4 == ENABLE + #include LUN_4_INCLUDE +#endif +#if LUN_5 == ENABLE + #include LUN_5_INCLUDE +#endif +#if LUN_6 == ENABLE + #include LUN_6_INCLUDE +#endif +#if LUN_7 == ENABLE + #include LUN_7_INCLUDE +#endif +#if LUN_USB == ENABLE + #include LUN_USB_INCLUDE +#endif + + +// Check the configuration of write protection in conf_access.h. +#ifndef GLOBAL_WR_PROTECT + #error GLOBAL_WR_PROTECT must be defined as ENABLED or DISABLED in conf_access.h +#endif + + +#if GLOBAL_WR_PROTECT == ENABLED + +//! Write protect. +extern Bool g_wr_protect; + +#endif + + +/*! \name Control Interface + */ +//! @{ + +#ifdef FREERTOS_USED + +/*! \brief Initializes the LUN access locker. + * + * \return \c TRUE if the locker was successfully initialized, else \c FALSE. + */ +extern Bool ctrl_access_init(void); + +#endif // FREERTOS_USED + +/*! \brief Returns the number of LUNs. + * + * \return Number of LUNs in the system. + */ +extern U8 get_nb_lun(void); + +/*! \brief Returns the current LUN. + * + * \return Current LUN. + * + * \todo Implement. + */ +extern U8 get_cur_lun(void); + +/*! \brief Tests the memory state and initializes the memory if required. + * + * The TEST UNIT READY SCSI primary command allows an application client to poll + * a LUN until it is ready without having to allocate memory for returned data. + * + * This command may be used to check the media status of LUNs with removable + * media. + * + * \param lun Logical Unit Number. + * + * \return Status. + */ +extern Ctrl_status mem_test_unit_ready(U8 lun); + +/*! \brief Returns the address of the last valid sector (512 bytes) in the + * memory. + * + * \param lun Logical Unit Number. + * \param u32_nb_sector Pointer to the address of the last valid sector. + * + * \return Status. + */ +extern Ctrl_status mem_read_capacity(U8 lun, U32 *u32_nb_sector); + +/*! \brief Returns the size of the physical sector. + * + * \param lun Logical Unit Number. + * + * \return Sector size (unit: 512 bytes). + */ +extern U8 mem_sector_size(U8 lun); + +/*! \brief Returns the write-protection state of the memory. + * + * \param lun Logical Unit Number. + * + * \return \c TRUE if the memory is write-protected, else \c FALSE. + * + * \note Only used by removable memories with hardware-specific write + * protection. + */ +extern Bool mem_wr_protect(U8 lun); + +/*! \brief Tells whether the memory is removable. + * + * \param lun Logical Unit Number. + * + * \return \c TRUE if the memory is removable, else \c FALSE. + */ +extern Bool mem_removal(U8 lun); + +/*! \brief Returns a pointer to the LUN name. + * + * \param lun Logical Unit Number. + * + * \return Pointer to the LUN name string. + */ +extern const char *mem_name(U8 lun); + +//! @} + + +#if ACCESS_USB == ENABLED + +/*! \name MEM <-> USB Interface + */ +//! @{ + +/*! \brief Tranfers data from the memory to USB. + * + * \param lun Logical Unit Number. + * \param addr Address of first memory sector to read. + * \param nb_sector Number of sectors to transfer. + * + * \return Status. + */ +extern Ctrl_status memory_2_usb(U8 lun, U32 addr, U16 nb_sector); + +/*! \brief Tranfers data from USB to the memory. + * + * \param lun Logical Unit Number. + * \param addr Address of first memory sector to write. + * \param nb_sector Number of sectors to transfer. + * + * \return Status. + */ +extern Ctrl_status usb_2_memory(U8 lun, U32 addr, U16 nb_sector); + +//! @} + +#endif // ACCESS_USB == ENABLED + + +#if ACCESS_MEM_TO_RAM == ENABLED + +/*! \name MEM <-> RAM Interface + */ +//! @{ + +/*! \brief Copies 1 data sector from the memory to RAM. + * + * \param lun Logical Unit Number. + * \param addr Address of first memory sector to read. + * \param ram Pointer to RAM buffer to write. + * + * \return Status. + */ +extern Ctrl_status memory_2_ram(U8 lun, U32 addr, void *ram); + +/*! \brief Copies 1 data sector from RAM to the memory. + * + * \param lun Logical Unit Number. + * \param addr Address of first memory sector to write. + * \param ram Pointer to RAM buffer to read. + * + * \return Status. + */ +extern Ctrl_status ram_2_memory(U8 lun, U32 addr, const void *ram); + +//! @} + +#endif // ACCESS_MEM_TO_RAM == ENABLED + + +#if ACCESS_STREAM == ENABLED + +/*! \name Streaming MEM <-> MEM Interface + */ +//! @{ + +//! Erroneous streaming data transfer ID. +#define ID_STREAM_ERR 0xFF + + #if ACCESS_MEM_TO_MEM == ENABLED + +/*! \brief Copies data from one memory to another. + * + * \param src_lun Source Logical Unit Number. + * \param src_addr Source address of first memory sector to read. + * \param dest_lun Destination Logical Unit Number. + * \param dest_addr Destination address of first memory sector to write. + * \param nb_sector Number of sectors to copy. + * + * \return Status. + */ +extern Ctrl_status stream_mem_to_mem(U8 src_lun, U32 src_addr, U8 dest_lun, U32 dest_addr, U16 nb_sector); + + #endif // ACCESS_MEM_TO_MEM == ENABLED + +/*! \brief Returns the state of a streaming data transfer. + * + * \param id Transfer ID. + * + * \return Status. + * + * \todo Implement. + */ +extern Ctrl_status stream_state(U8 id); + +/*! \brief Stops a streaming data transfer. + * + * \param id Transfer ID. + * + * \return Number of remaining sectors. + * + * \todo Implement. + */ +extern U16 stream_stop(U8 id); + +//! @} + +#endif // ACCESS_STREAM == ENABLED + + +#endif // _CTRL_ACCESS_H_ diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/debug.c b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/debug.c new file mode 100644 index 0000000..c7c0a03 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/debug.c @@ -0,0 +1,119 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Macros and functions dedicated to debug purposes. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with a USART module can be used. + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#include "compiler.h" +#include "debug.h" + + +#if (defined __GNUC__) +# include "malloc.h" + +U32 get_heap_curr_used_size( void ) +{ + struct mallinfo my_info=mallinfo(); + return my_info.uordblks; +} + +U32 get_heap_total_used_size( void ) +{ + struct mallinfo my_info=mallinfo(); + return my_info.arena; +} +#endif + +U32 get_heap_free_size( void ) +{ + U32 high_mark= AVR32_SRAM_SIZE; + U32 low_mark = 0; + U32 size ; + void* p_mem; + + size = (high_mark + low_mark)/2; + + do + { + p_mem = malloc(size); + if( p_mem != NULL) + { // Can allocate memory + free(p_mem); + low_mark = size; + } + else + { // Can not allocate memory + high_mark = size; + } + + size = (high_mark + low_mark)/2; + } + while( (high_mark-low_mark) >1 ); + + return size; +} + +static void* round_trace_pbuf; +static U32 round_trace_size; + +void uc3_round_trace_init(void* buf, U32 size) +{ + round_trace_pbuf = buf; + (*(U32*)round_trace_pbuf)=(U32)buf+4; + round_trace_size = size; +} + +void uc3_round_trace(U32 val) +{ + //Disable_global_interrupt(); + + U32* p_wr = (U32*)(*(U32*)round_trace_pbuf); + *p_wr = val; + p_wr++; + if( ((U32)p_wr % round_trace_size) ==0 ) + p_wr= (U32*)round_trace_pbuf+1; + *p_wr = 0xdeadbeef; + *(U32*)round_trace_pbuf = (U32)p_wr; + + //Enable_global_interrupt(); +} diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/debug.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/debug.h new file mode 100644 index 0000000..a832d7c --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/debug.h @@ -0,0 +1,116 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Macros and functions dedicated to debug purposes. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with a USART module can be used. + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _DEBUG_H_ +#define _DEBUG_H_ + +#include "stringz.h" + +/*! \brief These macros are used to add traces memory. + * + * First, initialise the trace with Uc3_trace_init(pointer), giving the start address + * of the memory location where will be stored the trace. + * Use Uc3_trace(something) to store "something" into the memory. The end of the trace + * is signaled by the "0xdeadbeef" pattern. + */ +#define Uc3_trace_init(debug_addr) \ + *(U32*)(debug_addr)=debug_addr+4 + +#define Uc3_trace(debug_addr, x) \ + *(U32*)(*(U32*)(debug_addr) ) = (U32)(x) ;\ + *(U32*)(*(U32*)(debug_addr)+4) = 0xdeadbeef ;\ + *(U32*)(debug_addr ) = *(U32*)(debug_addr)+4 + +/*! \brief This macro is used to insert labels into assembly output. + * + */ +#define Insert_label(name) \ + __asm__ __volatile__ (STRINGZ(name)":"); + +#if (defined __GNUC__) +/*! \brief Returns the number of total of used bytes allocated from the HEAP. + * + * \retval total number of used bytes. + */ +U32 get_heap_total_used_size( void ); + +/*! \brief Returns the number of bytes currently used from the HEAP. + * + * \retval total number of used bytes. + */ +U32 get_heap_curr_used_size( void ); +#endif + +/*! \brief Returns the number of free bytes in the HEAP. + * + * This funtion tries to allocate the maximum number of bytes by dichotomical method. + * + * \retval number of free bytes. + */ +extern U32 get_heap_free_size( void ); + +/*! \name Traces function using a round buffer + */ +//! @{ + +/*! \brief Initialize the trace using a round buffer. + * + * \param buf Base address of the buffer used for the trace. + * \param size Size of the round buffer. Must be a power of 2. + */ +void uc3_round_trace_init(void* buf, U32 size); + +/*! \brief Trace a data in the round buffer. + * + * The end of the trace is signaled by the "0xdeadbeef" pattern. + * \param val Data to trace; + */ +void uc3_round_trace(U32 val); + +//! @} + + +#endif // _DEBUG_H_ diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/print_funcs.c b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/print_funcs.c new file mode 100644 index 0000000..99e9274 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/print_funcs.c @@ -0,0 +1,215 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Strings and integers print module for debug purposes. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with a USART module can be used. + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#include "compiler.h" +#include "gpio.h" +#include "usart.h" +#include "print_funcs.h" + + +//! ASCII representation of hexadecimal digits. +static const char HEX_DIGITS[16] = "0123456789ABCDEF"; + + +void init_dbg_rs232(long pba_hz) +{ + init_dbg_rs232_ex(DBG_USART_BAUDRATE, pba_hz); +} + + +void init_dbg_rs232_ex(unsigned long baudrate, long pba_hz) +{ + static const gpio_map_t DBG_USART_GPIO_MAP = + { + {DBG_USART_RX_PIN, DBG_USART_RX_FUNCTION}, + {DBG_USART_TX_PIN, DBG_USART_TX_FUNCTION} + }; + + // Options for debug USART. + usart_options_t dbg_usart_options = + { + .baudrate = baudrate, + .charlength = 8, + .paritytype = USART_NO_PARITY, + .stopbits = USART_1_STOPBIT, + .channelmode = USART_NORMAL_CHMODE + }; + + // Setup GPIO for debug USART. + gpio_enable_module(DBG_USART_GPIO_MAP, + sizeof(DBG_USART_GPIO_MAP) / sizeof(DBG_USART_GPIO_MAP[0])); + + // Initialize it in RS232 mode. + usart_init_rs232(DBG_USART, &dbg_usart_options, pba_hz); +} + + +void print_dbg(const char *str) +{ + // Redirection to the debug USART. + print(DBG_USART, str); +} + + +void print_dbg_char(int c) +{ + // Redirection to the debug USART. + print_char(DBG_USART, c); +} + + +void print_dbg_ulong(unsigned long n) +{ + // Redirection to the debug USART. + print_ulong(DBG_USART, n); +} + + +void print_dbg_char_hex(unsigned char n) +{ + // Redirection to the debug USART. + print_char_hex(DBG_USART, n); +} + + +void print_dbg_short_hex(unsigned short n) +{ + // Redirection to the debug USART. + print_short_hex(DBG_USART, n); +} + + +void print_dbg_hex(unsigned long n) +{ + // Redirection to the debug USART. + print_hex(DBG_USART, n); +} + + +void print(volatile avr32_usart_t *usart, const char *str) +{ + // Invoke the USART driver to transmit the input string with the given USART. + usart_write_line(usart, str); +} + + +void print_char(volatile avr32_usart_t *usart, int c) +{ + // Invoke the USART driver to transmit the input character with the given USART. + usart_putchar(usart, c); +} + + +void print_ulong(volatile avr32_usart_t *usart, unsigned long n) +{ + char tmp[11]; + int i = sizeof(tmp) - 1; + + // Convert the given number to an ASCII decimal representation. + tmp[i] = '\0'; + do + { + tmp[--i] = '0' + n % 10; + n /= 10; + } while (n); + + // Transmit the resulting string with the given USART. + print(usart, tmp + i); +} + + +void print_char_hex(volatile avr32_usart_t *usart, unsigned char n) +{ + char tmp[3]; + int i; + + // Convert the given number to an ASCII hexadecimal representation. + tmp[2] = '\0'; + for (i = 1; i >= 0; i--) + { + tmp[i] = HEX_DIGITS[n & 0xF]; + n >>= 4; + } + + // Transmit the resulting string with the given USART. + print(usart, tmp); +} + + +void print_short_hex(volatile avr32_usart_t *usart, unsigned short n) +{ + char tmp[5]; + int i; + + // Convert the given number to an ASCII hexadecimal representation. + tmp[4] = '\0'; + for (i = 3; i >= 0; i--) + { + tmp[i] = HEX_DIGITS[n & 0xF]; + n >>= 4; + } + + // Transmit the resulting string with the given USART. + print(usart, tmp); +} + + +void print_hex(volatile avr32_usart_t *usart, unsigned long n) +{ + char tmp[9]; + int i; + + // Convert the given number to an ASCII hexadecimal representation. + tmp[8] = '\0'; + for (i = 7; i >= 0; i--) + { + tmp[i] = HEX_DIGITS[n & 0xF]; + n >>= 4; + } + + // Transmit the resulting string with the given USART. + print(usart, tmp); +} diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/print_funcs.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/print_funcs.h new file mode 100644 index 0000000..38f931d --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/DEBUG/print_funcs.h @@ -0,0 +1,294 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Strings and integers print module for debug purposes. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with a USART module can be used. + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _PRINT_FUNCS_H_ +#define _PRINT_FUNCS_H_ + +#include +#include "board.h" + + +/*! \name USART Settings for the Debug Module + */ +//! @{ +#if BOARD == EVK1100 +# define DBG_USART (&AVR32_USART1) +# define DBG_USART_RX_PIN AVR32_USART1_RXD_0_0_PIN +# define DBG_USART_RX_FUNCTION AVR32_USART1_RXD_0_0_FUNCTION +# define DBG_USART_TX_PIN AVR32_USART1_TXD_0_0_PIN +# define DBG_USART_TX_FUNCTION AVR32_USART1_TXD_0_0_FUNCTION +# define DBG_USART_BAUDRATE 57600 +#elif BOARD == EVK1101 +# define DBG_USART (&AVR32_USART1) +# define DBG_USART_RX_PIN AVR32_USART1_RXD_0_0_PIN +# define DBG_USART_RX_FUNCTION AVR32_USART1_RXD_0_0_FUNCTION +# define DBG_USART_TX_PIN AVR32_USART1_TXD_0_0_PIN +# define DBG_USART_TX_FUNCTION AVR32_USART1_TXD_0_0_FUNCTION +# define DBG_USART_BAUDRATE 57600 +#elif BOARD == UC3C_EK +# define DBG_USART (&AVR32_USART2) +# define DBG_USART_RX_PIN AVR32_USART2_RXD_0_1_PIN +# define DBG_USART_RX_FUNCTION AVR32_USART2_RXD_0_1_FUNCTION +# define DBG_USART_TX_PIN AVR32_USART2_TXD_0_1_PIN +# define DBG_USART_TX_FUNCTION AVR32_USART2_TXD_0_1_FUNCTION +# define DBG_USART_BAUDRATE 57600 +#elif BOARD == EVK1104 +# define DBG_USART (&AVR32_USART1) +# define DBG_USART_RX_PIN AVR32_USART1_RXD_0_0_PIN +# define DBG_USART_RX_FUNCTION AVR32_USART1_RXD_0_0_FUNCTION +# define DBG_USART_TX_PIN AVR32_USART1_TXD_0_0_PIN +# define DBG_USART_TX_FUNCTION AVR32_USART1_TXD_0_0_FUNCTION +# define DBG_USART_BAUDRATE 57600 +#elif BOARD == EVK1105 +# define DBG_USART (&AVR32_USART0) +# define DBG_USART_RX_PIN AVR32_USART0_RXD_0_0_PIN +# define DBG_USART_RX_FUNCTION AVR32_USART0_RXD_0_0_FUNCTION +# define DBG_USART_TX_PIN AVR32_USART0_TXD_0_0_PIN +# define DBG_USART_TX_FUNCTION AVR32_USART0_TXD_0_0_FUNCTION +# define DBG_USART_BAUDRATE 57600 +#elif BOARD == STK1000 +# define DBG_USART (&AVR32_USART1) +# define DBG_USART_RX_PIN AVR32_USART1_RXD_0_PIN +# define DBG_USART_RX_FUNCTION AVR32_USART1_RXD_0_FUNCTION +# define DBG_USART_TX_PIN AVR32_USART1_TXD_0_PIN +# define DBG_USART_TX_FUNCTION AVR32_USART1_TXD_0_FUNCTION +# define DBG_USART_BAUDRATE 115200 +#elif BOARD == NGW100 +# define DBG_USART (&AVR32_USART1) +# define DBG_USART_RX_PIN AVR32_USART1_RXD_0_PIN +# define DBG_USART_RX_FUNCTION AVR32_USART1_RXD_0_FUNCTION +# define DBG_USART_TX_PIN AVR32_USART1_TXD_0_PIN +# define DBG_USART_TX_FUNCTION AVR32_USART1_TXD_0_FUNCTION +# define DBG_USART_BAUDRATE 115200 +#elif BOARD == STK600_RCUC3L0 +# define DBG_USART (&AVR32_USART1) +# define DBG_USART_RX_PIN AVR32_USART1_RXD_0_1_PIN +# define DBG_USART_RX_FUNCTION AVR32_USART1_RXD_0_1_FUNCTION +// For the RX pin, connect STK600.PORTE.PE3 to STK600.RS232 SPARE.RXD +# define DBG_USART_TX_PIN AVR32_USART1_TXD_0_1_PIN +# define DBG_USART_TX_FUNCTION AVR32_USART1_TXD_0_1_FUNCTION +// For the TX pin, connect STK600.PORTE.PE2 to STK600.RS232 SPARE.TXD +# define DBG_USART_BAUDRATE 57600 +# define DBG_USART_CLOCK_MASK AVR32_USART1_CLK_PBA +#elif BOARD == UC3L_EK +# define DBG_USART (&AVR32_USART3) +# define DBG_USART_RX_PIN AVR32_USART3_RXD_0_0_PIN +# define DBG_USART_RX_FUNCTION AVR32_USART3_RXD_0_0_FUNCTION +# define DBG_USART_TX_PIN AVR32_USART3_TXD_0_0_PIN +# define DBG_USART_TX_FUNCTION AVR32_USART3_TXD_0_0_FUNCTION +# define DBG_USART_BAUDRATE 57600 +# define DBG_USART_CLOCK_MASK AVR32_USART3_CLK_PBA +#elif BOARD == ARDUINO +# define DBG_USART (&AVR32_USART1) +# define DBG_USART_RX_PIN AVR32_USART1_RXD_0_0_PIN +# define DBG_USART_RX_FUNCTION AVR32_USART1_RXD_0_0_FUNCTION +# define DBG_USART_TX_PIN AVR32_USART1_TXD_0_0_PIN +# define DBG_USART_TX_FUNCTION AVR32_USART1_TXD_0_0_FUNCTION +# define DBG_USART_BAUDRATE 57600 +# define DBG_USART_CLOCK_MASK AVR32_USART1_CLK_PBA +#endif + +#if !defined(DBG_USART) || \ + !defined(DBG_USART_RX_PIN) || \ + !defined(DBG_USART_RX_FUNCTION) || \ + !defined(DBG_USART_TX_PIN) || \ + !defined(DBG_USART_TX_FUNCTION) || \ + !defined(DBG_USART_BAUDRATE) +# error The USART configuration to use for debug on your board is missing +#endif +//! @} + +/*! \name VT100 Common Commands + */ +//! @{ +#define CLEARSCR "\x1B[2J\x1B[;H" //!< Clear screen. +#define CLEAREOL "\x1B[K" //!< Clear end of line. +#define CLEAREOS "\x1B[J" //!< Clear end of screen. +#define CLEARLCR "\x1B[0K" //!< Clear line cursor right. +#define CLEARLCL "\x1B[1K" //!< Clear line cursor left. +#define CLEARELN "\x1B[2K" //!< Clear entire line. +#define CLEARCDW "\x1B[0J" //!< Clear cursor down. +#define CLEARCUP "\x1B[1J" //!< Clear cursor up. +#define GOTOYX "\x1B[%.2d;%.2dH" //!< Set cursor to (y, x). +#define INSERTMOD "\x1B[4h" //!< Insert mode. +#define OVERWRITEMOD "\x1B[4l" //!< Overwrite mode. +#define DELAFCURSOR "\x1B[K" //!< Erase from cursor to end of line. +#define CRLF "\r\n" //!< Carriage Return + Line Feed. +//! @} + +/*! \name VT100 Cursor Commands + */ +//! @{ +#define CURSON "\x1B[?25h" //!< Show cursor. +#define CURSOFF "\x1B[?25l" //!< Hide cursor. +//! @} + +/*! \name VT100 Character Commands + */ +//! @{ +#define NORMAL "\x1B[0m" //!< Normal. +#define BOLD "\x1B[1m" //!< Bold. +#define UNDERLINE "\x1B[4m" //!< Underline. +#define BLINKING "\x1B[5m" //!< Blink. +#define INVVIDEO "\x1B[7m" //!< Inverse video. +//! @} + +/*! \name VT100 Color Commands + */ +//! @{ +#define CL_BLACK "\033[22;30m" //!< Black. +#define CL_RED "\033[22;31m" //!< Red. +#define CL_GREEN "\033[22;32m" //!< Green. +#define CL_BROWN "\033[22;33m" //!< Brown. +#define CL_BLUE "\033[22;34m" //!< Blue. +#define CL_MAGENTA "\033[22;35m" //!< Magenta. +#define CL_CYAN "\033[22;36m" //!< Cyan. +#define CL_GRAY "\033[22;37m" //!< Gray. +#define CL_DARKGRAY "\033[01;30m" //!< Dark gray. +#define CL_LIGHTRED "\033[01;31m" //!< Light red. +#define CL_LIGHTGREEN "\033[01;32m" //!< Light green. +#define CL_YELLOW "\033[01;33m" //!< Yellow. +#define CL_LIGHTBLUE "\033[01;34m" //!< Light blue. +#define CL_LIGHTMAGENTA "\033[01;35m" //!< Light magenta. +#define CL_LIGHTCYAN "\033[01;36m" //!< Light cyan. +#define CL_WHITE "\033[01;37m" //!< White. +//! @} + + +/*! \brief Sets up DBG_USART with 8N1 at DBG_USART_BAUDRATE. + * + * \param pba_hz PBA clock frequency (Hz). + */ +extern void init_dbg_rs232(long pba_hz); + +/*! \brief Sets up DBG_USART with 8N1 at a given baud rate. + * + * \param baudrate Baud rate to set DBG_USART to. + * \param pba_hz PBA clock frequency (Hz). + */ +extern void init_dbg_rs232_ex(unsigned long baudrate, long pba_hz); + +/*! \brief Prints a string of characters to DBG_USART. + * + * \param str The string of characters to print. + */ +extern void print_dbg(const char *str); + +/*! \brief Prints a character to DBG_USART. + * + * \param c The character to print. + */ +extern void print_dbg_char(int c); + +/*! \brief Prints an integer to DBG_USART in a decimal representation. + * + * \param n The integer to print. + */ +extern void print_dbg_ulong(unsigned long n); + +/*! \brief Prints a char to DBG_USART in an hexadecimal representation. + * + * \param n The char to print. + */ +extern void print_dbg_char_hex(unsigned char n); + +/*! \brief Prints a short integer to DBG_USART in an hexadecimal representation. + * + * \param n The short integer to print. + */ +extern void print_dbg_short_hex(unsigned short n); + +/*! \brief Prints an integer to DBG_USART in an hexadecimal representation. + * + * \param n The integer to print. + */ +extern void print_dbg_hex(unsigned long n); + +/*! \brief Prints a string of characters to a given USART. + * + * \param usart Base address of the USART instance to print to. + * \param str The string of characters to print. + */ +extern void print(volatile avr32_usart_t *usart, const char *str); + +/*! \brief Prints a character to a given USART. + * + * \param usart Base address of the USART instance to print to. + * \param c The character to print. + */ +extern void print_char(volatile avr32_usart_t *usart, int c); + +/*! \brief Prints an integer to a given USART in a decimal representation. + * + * \param usart Base address of the USART instance to print to. + * \param n The integer to print. + */ +extern void print_ulong(volatile avr32_usart_t *usart, unsigned long n); + +/*! \brief Prints a char to a given USART in an hexadecimal representation. + * + * \param usart Base address of the USART instance to print to. + * \param n The char to print. + */ +extern void print_char_hex(volatile avr32_usart_t *usart, unsigned char n); + +/*! \brief Prints a short integer to a given USART in an hexadecimal + * representation. + * + * \param usart Base address of the USART instance to print to. + * \param n The short integer to print. + */ +extern void print_short_hex(volatile avr32_usart_t *usart, unsigned short n); + +/*! \brief Prints an integer to a given USART in an hexadecimal representation. + * + * \param usart Base address of the USART instance to print to. + * \param n The integer to print. + */ +extern void print_hex(volatile avr32_usart_t *usart, unsigned long n); + + +#endif // _PRINT_FUNCS_H_ diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_cpu.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_cpu.h new file mode 100644 index 0000000..e3ebea7 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_cpu.h @@ -0,0 +1,63 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief NEWLIB_ADDONS CPU include file for AVR32. + * + * - Compiler: GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef __AVR32_NEWLIB_ADDONS_CPU_H__ +#define __AVR32_NEWLIB_ADDONS_CPU_H__ + +#include <_ansi.h> + +_BEGIN_STD_C + +#define CPU_HZ get_cpu_hz() + +void udelay(unsigned long usec); +void set_cpu_hz(unsigned int clk_hz); +unsigned int get_cpu_hz(); + +_END_STD_C + +#endif diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_exceptions.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_exceptions.h new file mode 100644 index 0000000..31caf13 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_exceptions.h @@ -0,0 +1,120 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief NEWLIB_ADDONS exceptions include file for AVR32. + * + * - Compiler: GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef __AVR32_NEWLIB_ADDONS_EXCEPTIONS_H__ +#define __AVR32_NEWLIB_ADDONS_EXCEPTIONS_H__ + +#include <_ansi.h> + +_BEGIN_STD_C + +/* + Exception vector offsets +*/ +#define EVBA_UNRECOVERABLE 0x000 +#define EVBA_TLB_MULTIPLE 0x004 +#define EVBA_BUS_ERROR_DATA 0x008 +#define EVBA_BUS_ERROR_INSTR 0x00C +#define EVBA_NMI 0x010 +#define EVBA_INSTR_ADDR 0x014 +#define EVBA_ITLB_MISS 0x050 +#define EVBA_ITLB_PROT 0x018 +#define EVBA_BREAKPOINT 0x01C +#define EVBA_ILLEGAL_OPCODE 0x020 +#define EVBA_UNIMPLEMENTED 0x024 +#define EVBA_PRIVILEGE_VIOL 0x028 +#define EVBA_FLOATING_POINT 0x02C +#define EVBA_COP_ABSENT 0x030 +#define EVBA_SCALL 0x100 +#define EVBA_DATA_ADDR_R 0x034 +#define EVBA_DATA_ADDR_W 0x038 +#define EVBA_DTLB_MISS_R 0x060 +#define EVBA_DTLB_MISS_W 0x070 +#define EVBA_DTLB_PROT_R 0x03C +#define EVBA_DTLB_PROT_W 0x040 +#define EVBA_DTLB_MODIFIED 0x044 + + +/* + Define the form of the function used when registering exceptions. + The function should return the address which the exception should + return to after the exception processing. +*/ + +typedef unsigned int (*__exception_handler)(int /*evba_offset*/, int /*return address*/); + +/* + Define the form of the function used when registering a scall handler. +*/ + +typedef void (*__scall_handler)(int /*code*/, int /*p1*/, int /*p2*/ + , int /*p3*/, int /*p4*/); + +/* + Function for registering an exception handler for the exception with + offset given by evba_offset. +*/ +void _register_exception_handler(__exception_handler handler, int evba_offset); + +/* + Function for registering a scall handler which can be a arbirary + function which uses r8-r12 for parameters. +*/ +void _register_scall_handler(__scall_handler handler); + +/* + Initialize exceptions. Must be called before registering exception handlers + and needed to enable exceptions. 'evba' is the pointer to the exception + vector. 'handler_table' is a pointer to an array where the pointers to + the exception handlers are stored. This array must be at least 0x104 bytes + and word aligned. +*/ +void init_exceptions(void *evba, void *handler_table); + +_END_STD_C + +#endif diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_interrupts.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_interrupts.h new file mode 100644 index 0000000..76d81f7 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_interrupts.h @@ -0,0 +1,82 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief NEWLIB_ADDONS interrupts include file for AVR32. + * + * - Compiler: GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef __AVR32_NEWLIB_ADDONS_INTERRUPTS_H__ +#define __AVR32_NEWLIB_ADDONS_INTERRUPTS_H__ + +#include <_ansi.h> + +_BEGIN_STD_C + +#define INT_GRPS 64 +#define INT_LINES 32 +#define INTPR_BASE (__intc_base__ + 0x0000) +#define INTREQ_BASE (__intc_base__ + 64*4) +#define INTCAUSE_BASE (__intc_base__ + 2*64*4) + +//Register offsets +#define INTLEVEL 30 +#define AUTOVECTOR 0 +#define AUTOVECTOR_BITS 14 + +//Priorities +#define INT0 0 +#define INT1 1 +#define INT2 2 +#define INT3 3 + + +typedef void (*__newlib_int_handler)(int /* int_grp*/, void */*user_handle*/); + +__newlib_int_handler register_interrupt(__newlib_int_handler handler, int int_grp, int line, int priority, + .../* void *user_handle*/); +void init_interrupts(); +void set_interrupts_base(void *base); + +_END_STD_C + +#endif diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_io.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_io.h new file mode 100644 index 0000000..a725769 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_io.h @@ -0,0 +1,174 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief NEWLIB_ADDONS miscellaneous macros include file for AVR32. + * + * - Compiler: GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef __AVR32_NEWLIB_ADDONS_IO_H__ +#define __AVR32_NEWLIB_ADDONS_IO_H__ + +#include <_ansi.h> + +_BEGIN_STD_C + +typedef char u8; +typedef unsigned int u32; + +#define __raw_writeb(v,a) (*(volatile unsigned char *)(a) = (v)) +#define __raw_writew(v,a) (*(volatile unsigned short *)(a) = (v)) +#define __raw_writel(v,a) (*(volatile unsigned int *)(a) = (v)) + +#define __raw_readb(a) (*(volatile unsigned char *)(a)) +#define __raw_readw(a) (*(volatile unsigned short *)(a)) +#define __raw_readl(a) (*(volatile unsigned int *)(a)) + +/* As long as I/O is only performed in P4 (or possibly P3), we're safe */ +#define writeb(v,a) __raw_writeb(v,a) +#define writew(v,a) __raw_writew(v,a) +#define writel(v,a) __raw_writel(v,a) + +#define readb(a) __raw_readb(a) +#define readw(a) __raw_readw(a) +#define readl(a) __raw_readl(a) + +/* Memory segments when segmentation is enabled */ +#define P0SEG 0x00000000 +#define P1SEG 0x80000000 +#define P2SEG 0xa0000000 +#define P3SEG 0xc0000000 +#define P4SEG 0xe0000000 + +/* Returns the privileged segment base of a given address */ +#define PXSEG(a) (((unsigned long)(a)) & 0xe0000000) + +/* Returns the physical address of a PnSEG (n=1,2) address */ +#define PHYSADDR(a) (((unsigned long)(a)) & 0x1fffffff) + +/* + * Map an address to a certain privileged segment + */ +#define P1SEGADDR(a) ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P1SEG)) +#define P2SEGADDR(a) ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P2SEG)) +#define P3SEGADDR(a) ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P3SEG)) +#define P4SEGADDR(a) ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P4SEG)) + + +#define cached(addr) P1SEGADDR(addr) +#define uncached(addr) P2SEGADDR(addr) +#define physaddr(addr) PHYSADDR(addr) + +#define BF(field, value) \ + ({ union { \ + struct { \ + unsigned : 32 - field ## _OFFSET - field ## _SIZE ; \ + unsigned long __val: field ## _SIZE ; \ + }; \ + unsigned long __ul; \ + } __tmp; \ + __tmp.__ul = 0; \ + __tmp.__val = value; \ + __tmp.__ul;}) + +#define BF_D(field, value) \ + ({ union { \ + struct { \ + unsigned long long : 64 - field ## _OFFSET - field ## _SIZE ; \ + unsigned long long __val: field ## _SIZE ; \ + }; \ + unsigned long long __ul; \ + } __tmp; \ + __tmp.__ul = 0; \ + __tmp.__val = value; \ + __tmp.__ul;}) + +#define BFINS(var, field, value) \ + { union {\ + struct { \ + unsigned : 32 - field ## _OFFSET - field ## _SIZE ; \ + unsigned long __val: field ## _SIZE ; \ + }; \ + unsigned long __ul; \ + } __tmp; \ + __tmp.__ul = var; \ + __tmp.__val = value; \ + var = __tmp.__ul;} + +#define BFEXT(var, field) \ + ({ union {\ + struct { \ + unsigned : 32 - field ## _OFFSET - field ## _SIZE ; \ + unsigned long __val: field ## _SIZE ; \ + }; \ + unsigned long __ul; \ + } __tmp; \ + __tmp.__ul = var; \ + __tmp.__val; }) + +#define BFINS_D(var, field, value) \ + { union {\ + struct { \ + unsigned long long : 64 - field ## _OFFSET - field ## _SIZE ; \ + unsigned long long __val: field ## _SIZE ; \ + }; \ + unsigned long long __ul; \ + } __tmp; \ + __tmp.__ul = var; \ + __tmp.__val = value; \ + var = __tmp.__ul;} + +#define BFEXT_D(var, field) \ + ({ union {\ + struct { \ + unsigned long long : 64 - field ## _OFFSET - field ## _SIZE ; \ + unsigned long long __val: field ## _SIZE ; \ + }; \ + unsigned long long __ul; \ + } __tmp; \ + __tmp.__ul = var; \ + __tmp.__val; }) + + +_END_STD_C + +#endif diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_usart.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_usart.h new file mode 100644 index 0000000..6c4697d --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE/nlao_usart.h @@ -0,0 +1,208 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief NEWLIB_ADDONS USART include file for AVR32. + * + * - Compiler: GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef __AVR32_NEWLIB_ADDONS_USART_H__ +#define __AVR32_NEWLIB_ADDONS_USART_H__ + +#include <_ansi.h> + +#include "nlao_io.h" + +_BEGIN_STD_C + +struct usart3 { + volatile u32 us_cr; + volatile u32 us_mr; + volatile u32 us_ier; + volatile u32 us_idr; + volatile u32 us_imr; + volatile u32 us_csr; + volatile u32 us_rhr; + volatile u32 us_thr; + volatile u32 us_brgr; + volatile u32 us_rtor; + volatile u32 us_ttgr; + volatile u32 us_reserved[5]; + volatile u32 us_fidi; + volatile u32 us_ner; + volatile u32 us_xxr; + volatile u32 us_if; +}; + +/* Register offsets */ +#define US_CR 0x0000 +#define US_MR 0x0004 +#define US_IER 0x0008 +#define US_IDR 0x000c +#define US_IMR 0x0010 +#define US_CSR 0x0014 +#define US_RHR 0x0018 +#define US_THR 0x001c +#define US_BRGR 0x0020 +#define US_RTOR 0x0024 +#define US_TTGR 0x0028 + +#define US_FIDI 0x0040 +#define US_NER 0x0044 +#define US_XXR 0x0048 +#define US_IF 0x004c + +#define US_RPR 0x0100 +#define US_RCR 0x0104 +#define US_TPR 0x0108 +#define US_TCR 0x010c +#define US_RNPR 0x0110 +#define US_RNCR 0x0114 +#define US_TNPR 0x0118 +#define US_TNCR 0x011c +#define US_PTCR 0x0120 +#define US_PTSR 0x0124 + + + + +/* USART3 Control Register */ +#define US_CR_RSTRX (1 << 2) +#define US_CR_RSTTX (1 << 3) +#define US_CR_RXEN (1 << 4) +#define US_CR_RXDIS (1 << 5) +#define US_CR_TXEN (1 << 6) +#define US_CR_TXDIS (1 << 7) +#define US_CR_RSTSTA (1 << 8) +#define US_CR_STTBRK (1 << 9) +#define US_CR_STPBRK (1 << 10) + +#define US_CR_DTREN (1 << 16) +#define US_CR_DTRDIS (1 << 17) +#define US_CR_RTSEN (1 << 18) +#define US_CR_RTSDIS (1 << 19) + +/* USART3 Mode Register */ +#define US_MR_MODE (15 << 0) +#define US_MR_MODE_NORMAL ( 0 << 0) +#define US_MR_MODE_HWFLOW ( 2 << 0) +#define US_MR_CLKS ( 3 << 4) +#define US_MR_CLKS_CLOCK ( 0 << 4) +#define US_MR_CLKS_FDIV1 ( 1 << 4) +#define US_MR_CLKS_SLOW ( 2 << 4) +#define US_MR_CLKS_EXT ( 3 << 4) +#define US_MR_CHRL_5BITS ( 0 << 6) +#define US_MR_CHRL_6BITS ( 1 << 6) +#define US_MR_CHRL_7BITS ( 2 << 6) +#define US_MR_CHRL_8BITS ( 3 << 6) +#define US_MR_SYNC ( 1 << 8) +#define US_MR_PAR_EVEN ( 0 << 9) +#define US_MR_PAR_ODD ( 1 << 9) +#define US_MR_PAR_SPACE ( 2 << 9) +#define US_MR_PAR_MARK ( 3 << 9) +#define US_MR_PAR_NONE ( 4 << 9) +#define US_MR_PAR_MDROP ( 6 << 9) +#define US_MR_NBSTOP_1BIT ( 0 << 12) +#define US_MR_NBSTOP_1_5BIT ( 1 << 12) +#define US_MR_NBSTOP_2BITS ( 2 << 12) +#define US_MR_OVER ( 1 << 19) +#define US_MR_OVER_X16 ( 0 << 19) +#define US_MR_OVER_X8 ( 1 << 19) + +/* USART3 Channel Status Register */ +#define US_CSR_RXRDY (1 << 0) +#define US_CSR_TXRDY (1 << 1) +#define US_CSR_RXBRK (1 << 2) +#define US_CSR_ENDRX (1 << 3) +#define US_CSR_ENDTX (1 << 4) + + +#define US_CSR_OVRE (1 << 5) +#define US_CSR_FRAME (1 << 6) +#define US_CSR_PARE (1 << 7) + +#define US_CSR_TXEMPTY (1 << 9) + +#define US_CSR_TXBUFE (1 << 11) +#define US_CSR_RXBUFF (1 << 12) +#define US_CSR_RIIC (1 << 16) +#define US_CSR_DSRIC (1 << 17) +#define US_CSR_DCDIC (1 << 18) +#define US_CSR_CTSIC (1 << 19) +#define US_CSR_RI (1 << 20) +#define US_CSR_DSR (1 << 21) +#define US_CSR_DCD (1 << 22) +#define US_CSR_CTS (1 << 23) + +/* USART3 Baud Rate Generator Register */ +#define US_BRGR_CD_OFFSET 0 +#define US_BRGR_FP_OFFSET 16 + +#define US_BRGR_CD_SIZE 16 +#define US_BRGR_FP_SIZE 3 + +#define US_BRGR_CD (0xFFFF << 0) +#define US_BRGR_FP ( 7 << 16) + +/*USART3 PDC Transfer Control Register */ +#define US_PTCR_RXTEN (1 << 0) +#define US_PTCR_RXTDIS (1 << 1) +#define US_PTCR_TXTEN (1 << 8) +#define US_PTCR_TXTDIS (1 << 9) + +/*USART3 PDC Transfer Status Register */ +#define US_PTSR_RXTEN (1 << 0) +#define US_PTSR_TXTEN (1 << 8) + + +int usart_init(int baudrate); +void usart_putc(char c); +void usart_puts(const char *s); +int usart_getc(void); +int usart_tstc(void); +void usart_setbrg(int baudrate, int cpu_clock); +void set_usart_base(void *usart_base); + + +_END_STD_C + +#endif /* MERLIN_USART3_H */ diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/libnewlib_addons-at32ucr2-speed_opt.a b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/libnewlib_addons-at32ucr2-speed_opt.a new file mode 100644 index 0000000..aa673ec Binary files /dev/null and b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/libnewlib_addons-at32ucr2-speed_opt.a differ diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LINKER_SCRIPTS/AT32UC3A/0512/GCC/link_uc3a0512.lds b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LINKER_SCRIPTS/AT32UC3A/0512/GCC/link_uc3a0512.lds new file mode 100644 index 0000000..59152ac --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LINKER_SCRIPTS/AT32UC3A/0512/GCC/link_uc3a0512.lds @@ -0,0 +1,266 @@ +/****************************************************************************** + * AVR32 AT32UC3A0512 GNU LD script file. + * + * - Compiler: GNU GCC for AVR32 + * - Supported devices: AVR32 AT32UC3A0512 + * + * - author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +OUTPUT_FORMAT("elf32-avr32", "elf32-avr32", "elf32-avr32") + +OUTPUT_ARCH(avr32:uc) + +ENTRY(_start) + +MEMORY +{ + FLASH (rxai!w) : ORIGIN = 0x80000000, LENGTH = 0x00080000 + INTRAM (wxa!ri) : ORIGIN = 0x00000004, LENGTH = 0x0000FFFC + USERPAGE : ORIGIN = 0x80800000, LENGTH = 0x00000200 +} + +PHDRS +{ + FLASH PT_LOAD; + INTRAM_ALIGN PT_NULL; + INTRAM_AT_FLASH PT_LOAD; + INTRAM PT_NULL; + USERPAGE PT_LOAD; +} + +SECTIONS +{ + /* If this heap size is selected, all the INTRAM space from the end of the + data area to the beginning of the stack will be allocated for the heap. */ + __max_heap_size__ = -1; + + /* Use a default heap size if heap size was not defined. */ + __heap_size__ = DEFINED(__heap_size__) ? __heap_size__ : __max_heap_size__; + + /* Use a default stack size if stack size was not defined. */ + __stack_size__ = DEFINED(__stack_size__) ? __stack_size__ : 4K; + + /* Read-only sections, merged into text segment: */ + PROVIDE (__executable_start = 0x80000000); . = 0x80000000; + .interp : { *(.interp) } >FLASH AT>FLASH :FLASH + .reset : { *(.reset) } >FLASH AT>FLASH :FLASH + .hash : { *(.hash) } >FLASH AT>FLASH :FLASH + .dynsym : { *(.dynsym) } >FLASH AT>FLASH :FLASH + .dynstr : { *(.dynstr) } >FLASH AT>FLASH :FLASH + .gnu.version : { *(.gnu.version) } >FLASH AT>FLASH :FLASH + .gnu.version_d : { *(.gnu.version_d) } >FLASH AT>FLASH :FLASH + .gnu.version_r : { *(.gnu.version_r) } >FLASH AT>FLASH :FLASH + .rel.init : { *(.rel.init) } >FLASH AT>FLASH :FLASH + .rela.init : { *(.rela.init) } >FLASH AT>FLASH :FLASH + .rel.text : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) } >FLASH AT>FLASH :FLASH + .rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) } >FLASH AT>FLASH :FLASH + .rel.fini : { *(.rel.fini) } >FLASH AT>FLASH :FLASH + .rela.fini : { *(.rela.fini) } >FLASH AT>FLASH :FLASH + .rel.rodata : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) } >FLASH AT>FLASH :FLASH + .rela.rodata : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) } >FLASH AT>FLASH :FLASH + .rel.data.rel.ro : { *(.rel.data.rel.ro*) } >FLASH AT>FLASH :FLASH + .rela.data.rel.ro : { *(.rel.data.rel.ro*) } >FLASH AT>FLASH :FLASH + .rel.data : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) } >FLASH AT>FLASH :FLASH + .rela.data : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) } >FLASH AT>FLASH :FLASH + .rel.tdata : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) } >FLASH AT>FLASH :FLASH + .rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) } >FLASH AT>FLASH :FLASH + .rel.tbss : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) } >FLASH AT>FLASH :FLASH + .rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) } >FLASH AT>FLASH :FLASH + .rel.ctors : { *(.rel.ctors) } >FLASH AT>FLASH :FLASH + .rela.ctors : { *(.rela.ctors) } >FLASH AT>FLASH :FLASH + .rel.dtors : { *(.rel.dtors) } >FLASH AT>FLASH :FLASH + .rela.dtors : { *(.rela.dtors) } >FLASH AT>FLASH :FLASH + .rel.got : { *(.rel.got) } >FLASH AT>FLASH :FLASH + .rela.got : { *(.rela.got) } >FLASH AT>FLASH :FLASH + .rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) } >FLASH AT>FLASH :FLASH + .rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) } >FLASH AT>FLASH :FLASH + .rel.plt : { *(.rel.plt) } >FLASH AT>FLASH :FLASH + .rela.plt : { *(.rela.plt) } >FLASH AT>FLASH :FLASH + .init : + { + KEEP (*(.init)) + } >FLASH AT>FLASH :FLASH =0xd703d703 + .plt : { *(.plt) } >FLASH AT>FLASH :FLASH + .text : + { + *(.text .stub .text.* .gnu.linkonce.t.*) + KEEP (*(.text.*personality*)) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + } >FLASH AT>FLASH :FLASH =0xd703d703 + .fini : + { + KEEP (*(.fini)) + } >FLASH AT>FLASH :FLASH =0xd703d703 + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } >FLASH AT>FLASH :FLASH + .rodata1 : { *(.rodata1) } >FLASH AT>FLASH :FLASH + .eh_frame_hdr : { *(.eh_frame_hdr) } >FLASH AT>FLASH :FLASH + .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) } >FLASH AT>FLASH :FLASH + .gcc_except_table : ONLY_IF_RO { KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) } >FLASH AT>FLASH :FLASH + .lalign : { . = ALIGN(8); PROVIDE(_data_lma = .); } >FLASH AT>FLASH :FLASH + . = ORIGIN(INTRAM); + .dalign : { . = ALIGN(8); PROVIDE(_data = .); } >INTRAM AT>INTRAM :INTRAM_ALIGN + /* Exception handling */ + .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .gcc_except_table : ONLY_IF_RW { KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + /* Thread Local Storage sections */ + .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + /* Ensure the __preinit_array_start label is properly aligned. We + could instead move the label definition inside the section, but + the linker would then create the section even if it turns out to + be empty, which isn't pretty. */ + PROVIDE (__preinit_array_start = ALIGN(32 / 8)); + .preinit_array : { KEEP (*(.preinit_array)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + PROVIDE (__preinit_array_end = .); + PROVIDE (__init_array_start = .); + .init_array : { KEEP (*(.init_array)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + PROVIDE (__init_array_end = .); + PROVIDE (__fini_array_start = .); + .fini_array : { KEEP (*(.fini_array)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + PROVIDE (__fini_array_end = .); + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin*.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .dtors : + { + KEEP (*crtbegin*.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .jcr : { KEEP (*(.jcr)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .data.rel.ro : { *(.data.rel.ro.local) *(.data.rel.ro*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .dynamic : { *(.dynamic) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .got : { *(.got.plt) *(.got) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .ramtext : { *(.ramtext .ramtext.*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .ddalign : { . = ALIGN(8); } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .data : + { + *(.data .data.* .gnu.linkonce.d.*) + KEEP (*(.gnu.linkonce.d.*personality*)) + SORT(CONSTRUCTORS) + } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .data1 : { *(.data1) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .balign : { . = ALIGN(8); PROVIDE(_edata = .); } >INTRAM AT>FLASH :INTRAM_AT_FLASH + PROVIDE (edata = .); + __bss_start = .; + .bss : + { + *(.dynbss) + *(.bss .bss.* .gnu.linkonce.b.*) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. */ + . = ALIGN(8); + } >INTRAM AT>INTRAM :INTRAM + . = ALIGN(8); + _end = .; + PROVIDE (end = .); + __heap_start__ = ALIGN(8); + .heap : + { + *(.heap) + . = (__heap_size__ == __max_heap_size__) ? + ORIGIN(INTRAM) + LENGTH(INTRAM) - __stack_size__ - ABSOLUTE(.) : + __heap_size__; + } >INTRAM AT>INTRAM :INTRAM + __heap_end__ = .; + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + .stack ORIGIN(INTRAM) + LENGTH(INTRAM) - __stack_size__ : + { + _stack = .; + *(.stack) + . = __stack_size__; + _estack = .; + } >INTRAM AT>INTRAM :INTRAM + .userpage : { *(.userpage .userpage.*) } >USERPAGE AT>USERPAGE :USERPAGE + /DISCARD/ : { *(.note.GNU-stack) } +} diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LINKER_SCRIPTS/AT32UC3A/1256/GCC/link_uc3a1256.lds b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LINKER_SCRIPTS/AT32UC3A/1256/GCC/link_uc3a1256.lds new file mode 100644 index 0000000..a5926d8 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/LINKER_SCRIPTS/AT32UC3A/1256/GCC/link_uc3a1256.lds @@ -0,0 +1,266 @@ +/****************************************************************************** + * AVR32 AT32UC3A1256 GNU LD script file. + * + * - Compiler: GNU GCC for AVR32 + * - Supported devices: AVR32 AT32UC3A1256 + * + * - author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +OUTPUT_FORMAT("elf32-avr32", "elf32-avr32", "elf32-avr32") + +OUTPUT_ARCH(avr32:uc) + +ENTRY(_start) + +MEMORY +{ + FLASH (rxai!w) : ORIGIN = 0x80000000, LENGTH = 0x00040000 + INTRAM (wxa!ri) : ORIGIN = 0x00000004, LENGTH = 0x0000FFFC + USERPAGE : ORIGIN = 0x80800000, LENGTH = 0x00000200 +} + +PHDRS +{ + FLASH PT_LOAD; + INTRAM_ALIGN PT_NULL; + INTRAM_AT_FLASH PT_LOAD; + INTRAM PT_NULL; + USERPAGE PT_LOAD; +} + +SECTIONS +{ + /* If this heap size is selected, all the INTRAM space from the end of the + data area to the beginning of the stack will be allocated for the heap. */ + __max_heap_size__ = -1; + + /* Use a default heap size if heap size was not defined. */ + __heap_size__ = DEFINED(__heap_size__) ? __heap_size__ : __max_heap_size__; + + /* Use a default stack size if stack size was not defined. */ + __stack_size__ = DEFINED(__stack_size__) ? __stack_size__ : 4K; + + /* Read-only sections, merged into text segment: */ + PROVIDE (__executable_start = 0x80000000); . = 0x80000000; + .interp : { *(.interp) } >FLASH AT>FLASH :FLASH + .reset : { *(.reset) } >FLASH AT>FLASH :FLASH + .hash : { *(.hash) } >FLASH AT>FLASH :FLASH + .dynsym : { *(.dynsym) } >FLASH AT>FLASH :FLASH + .dynstr : { *(.dynstr) } >FLASH AT>FLASH :FLASH + .gnu.version : { *(.gnu.version) } >FLASH AT>FLASH :FLASH + .gnu.version_d : { *(.gnu.version_d) } >FLASH AT>FLASH :FLASH + .gnu.version_r : { *(.gnu.version_r) } >FLASH AT>FLASH :FLASH + .rel.init : { *(.rel.init) } >FLASH AT>FLASH :FLASH + .rela.init : { *(.rela.init) } >FLASH AT>FLASH :FLASH + .rel.text : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) } >FLASH AT>FLASH :FLASH + .rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) } >FLASH AT>FLASH :FLASH + .rel.fini : { *(.rel.fini) } >FLASH AT>FLASH :FLASH + .rela.fini : { *(.rela.fini) } >FLASH AT>FLASH :FLASH + .rel.rodata : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) } >FLASH AT>FLASH :FLASH + .rela.rodata : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) } >FLASH AT>FLASH :FLASH + .rel.data.rel.ro : { *(.rel.data.rel.ro*) } >FLASH AT>FLASH :FLASH + .rela.data.rel.ro : { *(.rel.data.rel.ro*) } >FLASH AT>FLASH :FLASH + .rel.data : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) } >FLASH AT>FLASH :FLASH + .rela.data : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) } >FLASH AT>FLASH :FLASH + .rel.tdata : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) } >FLASH AT>FLASH :FLASH + .rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) } >FLASH AT>FLASH :FLASH + .rel.tbss : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) } >FLASH AT>FLASH :FLASH + .rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) } >FLASH AT>FLASH :FLASH + .rel.ctors : { *(.rel.ctors) } >FLASH AT>FLASH :FLASH + .rela.ctors : { *(.rela.ctors) } >FLASH AT>FLASH :FLASH + .rel.dtors : { *(.rel.dtors) } >FLASH AT>FLASH :FLASH + .rela.dtors : { *(.rela.dtors) } >FLASH AT>FLASH :FLASH + .rel.got : { *(.rel.got) } >FLASH AT>FLASH :FLASH + .rela.got : { *(.rela.got) } >FLASH AT>FLASH :FLASH + .rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) } >FLASH AT>FLASH :FLASH + .rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) } >FLASH AT>FLASH :FLASH + .rel.plt : { *(.rel.plt) } >FLASH AT>FLASH :FLASH + .rela.plt : { *(.rela.plt) } >FLASH AT>FLASH :FLASH + .init : + { + KEEP (*(.init)) + } >FLASH AT>FLASH :FLASH =0xd703d703 + .plt : { *(.plt) } >FLASH AT>FLASH :FLASH + .text : + { + *(.text .stub .text.* .gnu.linkonce.t.*) + KEEP (*(.text.*personality*)) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + } >FLASH AT>FLASH :FLASH =0xd703d703 + .fini : + { + KEEP (*(.fini)) + } >FLASH AT>FLASH :FLASH =0xd703d703 + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } >FLASH AT>FLASH :FLASH + .rodata1 : { *(.rodata1) } >FLASH AT>FLASH :FLASH + .eh_frame_hdr : { *(.eh_frame_hdr) } >FLASH AT>FLASH :FLASH + .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) } >FLASH AT>FLASH :FLASH + .gcc_except_table : ONLY_IF_RO { KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) } >FLASH AT>FLASH :FLASH + .lalign : { . = ALIGN(8); PROVIDE(_data_lma = .); } >FLASH AT>FLASH :FLASH + . = ORIGIN(INTRAM); + .dalign : { . = ALIGN(8); PROVIDE(_data = .); } >INTRAM AT>INTRAM :INTRAM_ALIGN + /* Exception handling */ + .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .gcc_except_table : ONLY_IF_RW { KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + /* Thread Local Storage sections */ + .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + /* Ensure the __preinit_array_start label is properly aligned. We + could instead move the label definition inside the section, but + the linker would then create the section even if it turns out to + be empty, which isn't pretty. */ + PROVIDE (__preinit_array_start = ALIGN(32 / 8)); + .preinit_array : { KEEP (*(.preinit_array)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + PROVIDE (__preinit_array_end = .); + PROVIDE (__init_array_start = .); + .init_array : { KEEP (*(.init_array)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + PROVIDE (__init_array_end = .); + PROVIDE (__fini_array_start = .); + .fini_array : { KEEP (*(.fini_array)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + PROVIDE (__fini_array_end = .); + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin*.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .dtors : + { + KEEP (*crtbegin*.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .jcr : { KEEP (*(.jcr)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .data.rel.ro : { *(.data.rel.ro.local) *(.data.rel.ro*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .dynamic : { *(.dynamic) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .got : { *(.got.plt) *(.got) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .ramtext : { *(.ramtext .ramtext.*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .ddalign : { . = ALIGN(8); } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .data : + { + *(.data .data.* .gnu.linkonce.d.*) + KEEP (*(.gnu.linkonce.d.*personality*)) + SORT(CONSTRUCTORS) + } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .data1 : { *(.data1) } >INTRAM AT>FLASH :INTRAM_AT_FLASH + .balign : { . = ALIGN(8); PROVIDE(_edata = .); } >INTRAM AT>FLASH :INTRAM_AT_FLASH + PROVIDE (edata = .); + __bss_start = .; + .bss : + { + *(.dynbss) + *(.bss .bss.* .gnu.linkonce.b.*) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. */ + . = ALIGN(8); + } >INTRAM AT>INTRAM :INTRAM + . = ALIGN(8); + _end = .; + PROVIDE (end = .); + __heap_start__ = ALIGN(8); + .heap : + { + *(.heap) + . = (__heap_size__ == __max_heap_size__) ? + ORIGIN(INTRAM) + LENGTH(INTRAM) - __stack_size__ - ABSOLUTE(.) : + __heap_size__; + } >INTRAM AT>INTRAM :INTRAM + __heap_end__ = .; + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + .stack ORIGIN(INTRAM) + LENGTH(INTRAM) - __stack_size__ : + { + _stack = .; + *(.stack) + . = __stack_size__; + _estack = .; + } >INTRAM AT>INTRAM :INTRAM + .userpage : { *(.userpage .userpage.*) } >USERPAGE AT>USERPAGE :USERPAGE + /DISCARD/ : { *(.note.GNU-stack) } +} diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/mrepeat.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/mrepeat.h new file mode 100644 index 0000000..41163b6 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/mrepeat.h @@ -0,0 +1,328 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Preprocessor macro repeating utils. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _MREPEAT_H_ +#define _MREPEAT_H_ + +#include "preprocessor.h" + + +//! Maximal number of repetitions supported by MREPEAT. +#define MREPEAT_LIMIT 256 + +/*! \brief Macro repeat. + * + * This macro represents a horizontal repetition construct. + * + * \param count The number of repetitious calls to macro. Valid values range from 0 to MREPEAT_LIMIT. + * \param macro A binary operation of the form macro(n, data). This macro is expanded by MREPEAT with + * the current repetition number and the auxiliary data argument. + * \param data Auxiliary data passed to macro. + * + * \return macro(0, data) macro(1, data) ... macro(count - 1, data) + */ +#define MREPEAT(count, macro, data) TPASTE2(MREPEAT, count)(macro, data) + +#define MREPEAT0( macro, data) +#define MREPEAT1( macro, data) MREPEAT0( macro, data) macro( 0, data) +#define MREPEAT2( macro, data) MREPEAT1( macro, data) macro( 1, data) +#define MREPEAT3( macro, data) MREPEAT2( macro, data) macro( 2, data) +#define MREPEAT4( macro, data) MREPEAT3( macro, data) macro( 3, data) +#define MREPEAT5( macro, data) MREPEAT4( macro, data) macro( 4, data) +#define MREPEAT6( macro, data) MREPEAT5( macro, data) macro( 5, data) +#define MREPEAT7( macro, data) MREPEAT6( macro, data) macro( 6, data) +#define MREPEAT8( macro, data) MREPEAT7( macro, data) macro( 7, data) +#define MREPEAT9( macro, data) MREPEAT8( macro, data) macro( 8, data) +#define MREPEAT10( macro, data) MREPEAT9( macro, data) macro( 9, data) +#define MREPEAT11( macro, data) MREPEAT10( macro, data) macro( 10, data) +#define MREPEAT12( macro, data) MREPEAT11( macro, data) macro( 11, data) +#define MREPEAT13( macro, data) MREPEAT12( macro, data) macro( 12, data) +#define MREPEAT14( macro, data) MREPEAT13( macro, data) macro( 13, data) +#define MREPEAT15( macro, data) MREPEAT14( macro, data) macro( 14, data) +#define MREPEAT16( macro, data) MREPEAT15( macro, data) macro( 15, data) +#define MREPEAT17( macro, data) MREPEAT16( macro, data) macro( 16, data) +#define MREPEAT18( macro, data) MREPEAT17( macro, data) macro( 17, data) +#define MREPEAT19( macro, data) MREPEAT18( macro, data) macro( 18, data) +#define MREPEAT20( macro, data) MREPEAT19( macro, data) macro( 19, data) +#define MREPEAT21( macro, data) MREPEAT20( macro, data) macro( 20, data) +#define MREPEAT22( macro, data) MREPEAT21( macro, data) macro( 21, data) +#define MREPEAT23( macro, data) MREPEAT22( macro, data) macro( 22, data) +#define MREPEAT24( macro, data) MREPEAT23( macro, data) macro( 23, data) +#define MREPEAT25( macro, data) MREPEAT24( macro, data) macro( 24, data) +#define MREPEAT26( macro, data) MREPEAT25( macro, data) macro( 25, data) +#define MREPEAT27( macro, data) MREPEAT26( macro, data) macro( 26, data) +#define MREPEAT28( macro, data) MREPEAT27( macro, data) macro( 27, data) +#define MREPEAT29( macro, data) MREPEAT28( macro, data) macro( 28, data) +#define MREPEAT30( macro, data) MREPEAT29( macro, data) macro( 29, data) +#define MREPEAT31( macro, data) MREPEAT30( macro, data) macro( 30, data) +#define MREPEAT32( macro, data) MREPEAT31( macro, data) macro( 31, data) +#define MREPEAT33( macro, data) MREPEAT32( macro, data) macro( 32, data) +#define MREPEAT34( macro, data) MREPEAT33( macro, data) macro( 33, data) +#define MREPEAT35( macro, data) MREPEAT34( macro, data) macro( 34, data) +#define MREPEAT36( macro, data) MREPEAT35( macro, data) macro( 35, data) +#define MREPEAT37( macro, data) MREPEAT36( macro, data) macro( 36, data) +#define MREPEAT38( macro, data) MREPEAT37( macro, data) macro( 37, data) +#define MREPEAT39( macro, data) MREPEAT38( macro, data) macro( 38, data) +#define MREPEAT40( macro, data) MREPEAT39( macro, data) macro( 39, data) +#define MREPEAT41( macro, data) MREPEAT40( macro, data) macro( 40, data) +#define MREPEAT42( macro, data) MREPEAT41( macro, data) macro( 41, data) +#define MREPEAT43( macro, data) MREPEAT42( macro, data) macro( 42, data) +#define MREPEAT44( macro, data) MREPEAT43( macro, data) macro( 43, data) +#define MREPEAT45( macro, data) MREPEAT44( macro, data) macro( 44, data) +#define MREPEAT46( macro, data) MREPEAT45( macro, data) macro( 45, data) +#define MREPEAT47( macro, data) MREPEAT46( macro, data) macro( 46, data) +#define MREPEAT48( macro, data) MREPEAT47( macro, data) macro( 47, data) +#define MREPEAT49( macro, data) MREPEAT48( macro, data) macro( 48, data) +#define MREPEAT50( macro, data) MREPEAT49( macro, data) macro( 49, data) +#define MREPEAT51( macro, data) MREPEAT50( macro, data) macro( 50, data) +#define MREPEAT52( macro, data) MREPEAT51( macro, data) macro( 51, data) +#define MREPEAT53( macro, data) MREPEAT52( macro, data) macro( 52, data) +#define MREPEAT54( macro, data) MREPEAT53( macro, data) macro( 53, data) +#define MREPEAT55( macro, data) MREPEAT54( macro, data) macro( 54, data) +#define MREPEAT56( macro, data) MREPEAT55( macro, data) macro( 55, data) +#define MREPEAT57( macro, data) MREPEAT56( macro, data) macro( 56, data) +#define MREPEAT58( macro, data) MREPEAT57( macro, data) macro( 57, data) +#define MREPEAT59( macro, data) MREPEAT58( macro, data) macro( 58, data) +#define MREPEAT60( macro, data) MREPEAT59( macro, data) macro( 59, data) +#define MREPEAT61( macro, data) MREPEAT60( macro, data) macro( 60, data) +#define MREPEAT62( macro, data) MREPEAT61( macro, data) macro( 61, data) +#define MREPEAT63( macro, data) MREPEAT62( macro, data) macro( 62, data) +#define MREPEAT64( macro, data) MREPEAT63( macro, data) macro( 63, data) +#define MREPEAT65( macro, data) MREPEAT64( macro, data) macro( 64, data) +#define MREPEAT66( macro, data) MREPEAT65( macro, data) macro( 65, data) +#define MREPEAT67( macro, data) MREPEAT66( macro, data) macro( 66, data) +#define MREPEAT68( macro, data) MREPEAT67( macro, data) macro( 67, data) +#define MREPEAT69( macro, data) MREPEAT68( macro, data) macro( 68, data) +#define MREPEAT70( macro, data) MREPEAT69( macro, data) macro( 69, data) +#define MREPEAT71( macro, data) MREPEAT70( macro, data) macro( 70, data) +#define MREPEAT72( macro, data) MREPEAT71( macro, data) macro( 71, data) +#define MREPEAT73( macro, data) MREPEAT72( macro, data) macro( 72, data) +#define MREPEAT74( macro, data) MREPEAT73( macro, data) macro( 73, data) +#define MREPEAT75( macro, data) MREPEAT74( macro, data) macro( 74, data) +#define MREPEAT76( macro, data) MREPEAT75( macro, data) macro( 75, data) +#define MREPEAT77( macro, data) MREPEAT76( macro, data) macro( 76, data) +#define MREPEAT78( macro, data) MREPEAT77( macro, data) macro( 77, data) +#define MREPEAT79( macro, data) MREPEAT78( macro, data) macro( 78, data) +#define MREPEAT80( macro, data) MREPEAT79( macro, data) macro( 79, data) +#define MREPEAT81( macro, data) MREPEAT80( macro, data) macro( 80, data) +#define MREPEAT82( macro, data) MREPEAT81( macro, data) macro( 81, data) +#define MREPEAT83( macro, data) MREPEAT82( macro, data) macro( 82, data) +#define MREPEAT84( macro, data) MREPEAT83( macro, data) macro( 83, data) +#define MREPEAT85( macro, data) MREPEAT84( macro, data) macro( 84, data) +#define MREPEAT86( macro, data) MREPEAT85( macro, data) macro( 85, data) +#define MREPEAT87( macro, data) MREPEAT86( macro, data) macro( 86, data) +#define MREPEAT88( macro, data) MREPEAT87( macro, data) macro( 87, data) +#define MREPEAT89( macro, data) MREPEAT88( macro, data) macro( 88, data) +#define MREPEAT90( macro, data) MREPEAT89( macro, data) macro( 89, data) +#define MREPEAT91( macro, data) MREPEAT90( macro, data) macro( 90, data) +#define MREPEAT92( macro, data) MREPEAT91( macro, data) macro( 91, data) +#define MREPEAT93( macro, data) MREPEAT92( macro, data) macro( 92, data) +#define MREPEAT94( macro, data) MREPEAT93( macro, data) macro( 93, data) +#define MREPEAT95( macro, data) MREPEAT94( macro, data) macro( 94, data) +#define MREPEAT96( macro, data) MREPEAT95( macro, data) macro( 95, data) +#define MREPEAT97( macro, data) MREPEAT96( macro, data) macro( 96, data) +#define MREPEAT98( macro, data) MREPEAT97( macro, data) macro( 97, data) +#define MREPEAT99( macro, data) MREPEAT98( macro, data) macro( 98, data) +#define MREPEAT100(macro, data) MREPEAT99( macro, data) macro( 99, data) +#define MREPEAT101(macro, data) MREPEAT100(macro, data) macro(100, data) +#define MREPEAT102(macro, data) MREPEAT101(macro, data) macro(101, data) +#define MREPEAT103(macro, data) MREPEAT102(macro, data) macro(102, data) +#define MREPEAT104(macro, data) MREPEAT103(macro, data) macro(103, data) +#define MREPEAT105(macro, data) MREPEAT104(macro, data) macro(104, data) +#define MREPEAT106(macro, data) MREPEAT105(macro, data) macro(105, data) +#define MREPEAT107(macro, data) MREPEAT106(macro, data) macro(106, data) +#define MREPEAT108(macro, data) MREPEAT107(macro, data) macro(107, data) +#define MREPEAT109(macro, data) MREPEAT108(macro, data) macro(108, data) +#define MREPEAT110(macro, data) MREPEAT109(macro, data) macro(109, data) +#define MREPEAT111(macro, data) MREPEAT110(macro, data) macro(110, data) +#define MREPEAT112(macro, data) MREPEAT111(macro, data) macro(111, data) +#define MREPEAT113(macro, data) MREPEAT112(macro, data) macro(112, data) +#define MREPEAT114(macro, data) MREPEAT113(macro, data) macro(113, data) +#define MREPEAT115(macro, data) MREPEAT114(macro, data) macro(114, data) +#define MREPEAT116(macro, data) MREPEAT115(macro, data) macro(115, data) +#define MREPEAT117(macro, data) MREPEAT116(macro, data) macro(116, data) +#define MREPEAT118(macro, data) MREPEAT117(macro, data) macro(117, data) +#define MREPEAT119(macro, data) MREPEAT118(macro, data) macro(118, data) +#define MREPEAT120(macro, data) MREPEAT119(macro, data) macro(119, data) +#define MREPEAT121(macro, data) MREPEAT120(macro, data) macro(120, data) +#define MREPEAT122(macro, data) MREPEAT121(macro, data) macro(121, data) +#define MREPEAT123(macro, data) MREPEAT122(macro, data) macro(122, data) +#define MREPEAT124(macro, data) MREPEAT123(macro, data) macro(123, data) +#define MREPEAT125(macro, data) MREPEAT124(macro, data) macro(124, data) +#define MREPEAT126(macro, data) MREPEAT125(macro, data) macro(125, data) +#define MREPEAT127(macro, data) MREPEAT126(macro, data) macro(126, data) +#define MREPEAT128(macro, data) MREPEAT127(macro, data) macro(127, data) +#define MREPEAT129(macro, data) MREPEAT128(macro, data) macro(128, data) +#define MREPEAT130(macro, data) MREPEAT129(macro, data) macro(129, data) +#define MREPEAT131(macro, data) MREPEAT130(macro, data) macro(130, data) +#define MREPEAT132(macro, data) MREPEAT131(macro, data) macro(131, data) +#define MREPEAT133(macro, data) MREPEAT132(macro, data) macro(132, data) +#define MREPEAT134(macro, data) MREPEAT133(macro, data) macro(133, data) +#define MREPEAT135(macro, data) MREPEAT134(macro, data) macro(134, data) +#define MREPEAT136(macro, data) MREPEAT135(macro, data) macro(135, data) +#define MREPEAT137(macro, data) MREPEAT136(macro, data) macro(136, data) +#define MREPEAT138(macro, data) MREPEAT137(macro, data) macro(137, data) +#define MREPEAT139(macro, data) MREPEAT138(macro, data) macro(138, data) +#define MREPEAT140(macro, data) MREPEAT139(macro, data) macro(139, data) +#define MREPEAT141(macro, data) MREPEAT140(macro, data) macro(140, data) +#define MREPEAT142(macro, data) MREPEAT141(macro, data) macro(141, data) +#define MREPEAT143(macro, data) MREPEAT142(macro, data) macro(142, data) +#define MREPEAT144(macro, data) MREPEAT143(macro, data) macro(143, data) +#define MREPEAT145(macro, data) MREPEAT144(macro, data) macro(144, data) +#define MREPEAT146(macro, data) MREPEAT145(macro, data) macro(145, data) +#define MREPEAT147(macro, data) MREPEAT146(macro, data) macro(146, data) +#define MREPEAT148(macro, data) MREPEAT147(macro, data) macro(147, data) +#define MREPEAT149(macro, data) MREPEAT148(macro, data) macro(148, data) +#define MREPEAT150(macro, data) MREPEAT149(macro, data) macro(149, data) +#define MREPEAT151(macro, data) MREPEAT150(macro, data) macro(150, data) +#define MREPEAT152(macro, data) MREPEAT151(macro, data) macro(151, data) +#define MREPEAT153(macro, data) MREPEAT152(macro, data) macro(152, data) +#define MREPEAT154(macro, data) MREPEAT153(macro, data) macro(153, data) +#define MREPEAT155(macro, data) MREPEAT154(macro, data) macro(154, data) +#define MREPEAT156(macro, data) MREPEAT155(macro, data) macro(155, data) +#define MREPEAT157(macro, data) MREPEAT156(macro, data) macro(156, data) +#define MREPEAT158(macro, data) MREPEAT157(macro, data) macro(157, data) +#define MREPEAT159(macro, data) MREPEAT158(macro, data) macro(158, data) +#define MREPEAT160(macro, data) MREPEAT159(macro, data) macro(159, data) +#define MREPEAT161(macro, data) MREPEAT160(macro, data) macro(160, data) +#define MREPEAT162(macro, data) MREPEAT161(macro, data) macro(161, data) +#define MREPEAT163(macro, data) MREPEAT162(macro, data) macro(162, data) +#define MREPEAT164(macro, data) MREPEAT163(macro, data) macro(163, data) +#define MREPEAT165(macro, data) MREPEAT164(macro, data) macro(164, data) +#define MREPEAT166(macro, data) MREPEAT165(macro, data) macro(165, data) +#define MREPEAT167(macro, data) MREPEAT166(macro, data) macro(166, data) +#define MREPEAT168(macro, data) MREPEAT167(macro, data) macro(167, data) +#define MREPEAT169(macro, data) MREPEAT168(macro, data) macro(168, data) +#define MREPEAT170(macro, data) MREPEAT169(macro, data) macro(169, data) +#define MREPEAT171(macro, data) MREPEAT170(macro, data) macro(170, data) +#define MREPEAT172(macro, data) MREPEAT171(macro, data) macro(171, data) +#define MREPEAT173(macro, data) MREPEAT172(macro, data) macro(172, data) +#define MREPEAT174(macro, data) MREPEAT173(macro, data) macro(173, data) +#define MREPEAT175(macro, data) MREPEAT174(macro, data) macro(174, data) +#define MREPEAT176(macro, data) MREPEAT175(macro, data) macro(175, data) +#define MREPEAT177(macro, data) MREPEAT176(macro, data) macro(176, data) +#define MREPEAT178(macro, data) MREPEAT177(macro, data) macro(177, data) +#define MREPEAT179(macro, data) MREPEAT178(macro, data) macro(178, data) +#define MREPEAT180(macro, data) MREPEAT179(macro, data) macro(179, data) +#define MREPEAT181(macro, data) MREPEAT180(macro, data) macro(180, data) +#define MREPEAT182(macro, data) MREPEAT181(macro, data) macro(181, data) +#define MREPEAT183(macro, data) MREPEAT182(macro, data) macro(182, data) +#define MREPEAT184(macro, data) MREPEAT183(macro, data) macro(183, data) +#define MREPEAT185(macro, data) MREPEAT184(macro, data) macro(184, data) +#define MREPEAT186(macro, data) MREPEAT185(macro, data) macro(185, data) +#define MREPEAT187(macro, data) MREPEAT186(macro, data) macro(186, data) +#define MREPEAT188(macro, data) MREPEAT187(macro, data) macro(187, data) +#define MREPEAT189(macro, data) MREPEAT188(macro, data) macro(188, data) +#define MREPEAT190(macro, data) MREPEAT189(macro, data) macro(189, data) +#define MREPEAT191(macro, data) MREPEAT190(macro, data) macro(190, data) +#define MREPEAT192(macro, data) MREPEAT191(macro, data) macro(191, data) +#define MREPEAT193(macro, data) MREPEAT192(macro, data) macro(192, data) +#define MREPEAT194(macro, data) MREPEAT193(macro, data) macro(193, data) +#define MREPEAT195(macro, data) MREPEAT194(macro, data) macro(194, data) +#define MREPEAT196(macro, data) MREPEAT195(macro, data) macro(195, data) +#define MREPEAT197(macro, data) MREPEAT196(macro, data) macro(196, data) +#define MREPEAT198(macro, data) MREPEAT197(macro, data) macro(197, data) +#define MREPEAT199(macro, data) MREPEAT198(macro, data) macro(198, data) +#define MREPEAT200(macro, data) MREPEAT199(macro, data) macro(199, data) +#define MREPEAT201(macro, data) MREPEAT200(macro, data) macro(200, data) +#define MREPEAT202(macro, data) MREPEAT201(macro, data) macro(201, data) +#define MREPEAT203(macro, data) MREPEAT202(macro, data) macro(202, data) +#define MREPEAT204(macro, data) MREPEAT203(macro, data) macro(203, data) +#define MREPEAT205(macro, data) MREPEAT204(macro, data) macro(204, data) +#define MREPEAT206(macro, data) MREPEAT205(macro, data) macro(205, data) +#define MREPEAT207(macro, data) MREPEAT206(macro, data) macro(206, data) +#define MREPEAT208(macro, data) MREPEAT207(macro, data) macro(207, data) +#define MREPEAT209(macro, data) MREPEAT208(macro, data) macro(208, data) +#define MREPEAT210(macro, data) MREPEAT209(macro, data) macro(209, data) +#define MREPEAT211(macro, data) MREPEAT210(macro, data) macro(210, data) +#define MREPEAT212(macro, data) MREPEAT211(macro, data) macro(211, data) +#define MREPEAT213(macro, data) MREPEAT212(macro, data) macro(212, data) +#define MREPEAT214(macro, data) MREPEAT213(macro, data) macro(213, data) +#define MREPEAT215(macro, data) MREPEAT214(macro, data) macro(214, data) +#define MREPEAT216(macro, data) MREPEAT215(macro, data) macro(215, data) +#define MREPEAT217(macro, data) MREPEAT216(macro, data) macro(216, data) +#define MREPEAT218(macro, data) MREPEAT217(macro, data) macro(217, data) +#define MREPEAT219(macro, data) MREPEAT218(macro, data) macro(218, data) +#define MREPEAT220(macro, data) MREPEAT219(macro, data) macro(219, data) +#define MREPEAT221(macro, data) MREPEAT220(macro, data) macro(220, data) +#define MREPEAT222(macro, data) MREPEAT221(macro, data) macro(221, data) +#define MREPEAT223(macro, data) MREPEAT222(macro, data) macro(222, data) +#define MREPEAT224(macro, data) MREPEAT223(macro, data) macro(223, data) +#define MREPEAT225(macro, data) MREPEAT224(macro, data) macro(224, data) +#define MREPEAT226(macro, data) MREPEAT225(macro, data) macro(225, data) +#define MREPEAT227(macro, data) MREPEAT226(macro, data) macro(226, data) +#define MREPEAT228(macro, data) MREPEAT227(macro, data) macro(227, data) +#define MREPEAT229(macro, data) MREPEAT228(macro, data) macro(228, data) +#define MREPEAT230(macro, data) MREPEAT229(macro, data) macro(229, data) +#define MREPEAT231(macro, data) MREPEAT230(macro, data) macro(230, data) +#define MREPEAT232(macro, data) MREPEAT231(macro, data) macro(231, data) +#define MREPEAT233(macro, data) MREPEAT232(macro, data) macro(232, data) +#define MREPEAT234(macro, data) MREPEAT233(macro, data) macro(233, data) +#define MREPEAT235(macro, data) MREPEAT234(macro, data) macro(234, data) +#define MREPEAT236(macro, data) MREPEAT235(macro, data) macro(235, data) +#define MREPEAT237(macro, data) MREPEAT236(macro, data) macro(236, data) +#define MREPEAT238(macro, data) MREPEAT237(macro, data) macro(237, data) +#define MREPEAT239(macro, data) MREPEAT238(macro, data) macro(238, data) +#define MREPEAT240(macro, data) MREPEAT239(macro, data) macro(239, data) +#define MREPEAT241(macro, data) MREPEAT240(macro, data) macro(240, data) +#define MREPEAT242(macro, data) MREPEAT241(macro, data) macro(241, data) +#define MREPEAT243(macro, data) MREPEAT242(macro, data) macro(242, data) +#define MREPEAT244(macro, data) MREPEAT243(macro, data) macro(243, data) +#define MREPEAT245(macro, data) MREPEAT244(macro, data) macro(244, data) +#define MREPEAT246(macro, data) MREPEAT245(macro, data) macro(245, data) +#define MREPEAT247(macro, data) MREPEAT246(macro, data) macro(246, data) +#define MREPEAT248(macro, data) MREPEAT247(macro, data) macro(247, data) +#define MREPEAT249(macro, data) MREPEAT248(macro, data) macro(248, data) +#define MREPEAT250(macro, data) MREPEAT249(macro, data) macro(249, data) +#define MREPEAT251(macro, data) MREPEAT250(macro, data) macro(250, data) +#define MREPEAT252(macro, data) MREPEAT251(macro, data) macro(251, data) +#define MREPEAT253(macro, data) MREPEAT252(macro, data) macro(252, data) +#define MREPEAT254(macro, data) MREPEAT253(macro, data) macro(253, data) +#define MREPEAT255(macro, data) MREPEAT254(macro, data) macro(254, data) +#define MREPEAT256(macro, data) MREPEAT255(macro, data) macro(255, data) + + +#endif // _MREPEAT_H_ diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/preprocessor.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/preprocessor.h new file mode 100644 index 0000000..5b996ba --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/preprocessor.h @@ -0,0 +1,55 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Preprocessor utils. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _PREPROCESSOR_H_ +#define _PREPROCESSOR_H_ + +#include "tpaste.h" +#include "stringz.h" +#include "mrepeat.h" + + +#endif // _PREPROCESSOR_H_ diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/stringz.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/stringz.h new file mode 100644 index 0000000..3528ea0 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/stringz.h @@ -0,0 +1,75 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Preprocessor stringizing utils. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _STRINGZ_H_ +#define _STRINGZ_H_ + + +/*! \brief Stringize. + * + * Stringize a preprocessing token, this token being allowed to be \#defined. + * + * May be used only within macros with the token passed as an argument if the token is \#defined. + * + * For example, writing STRINGZ(PIN) within a macro \#defined by PIN_NAME(PIN) + * and invoked as PIN_NAME(PIN0) with PIN0 \#defined as A0 is equivalent to + * writing "A0". + */ +#define STRINGZ(x) #x + +/*! \brief Absolute stringize. + * + * Stringize a preprocessing token, this token being allowed to be \#defined. + * + * No restriction of use if the token is \#defined. + * + * For example, writing ASTRINGZ(PIN0) anywhere with PIN0 \#defined as A0 is + * equivalent to writing "A0". + */ +#define ASTRINGZ(x) STRINGZ(x) + + +#endif // _STRINGZ_H_ diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/tpaste.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/tpaste.h new file mode 100644 index 0000000..a5d7bee --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR/tpaste.h @@ -0,0 +1,95 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Preprocessor token pasting utils. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _TPASTE_H_ +#define _TPASTE_H_ + + +/*! \name Token Paste + * + * Paste N preprocessing tokens together, these tokens being allowed to be \#defined. + * + * May be used only within macros with the tokens passed as arguments if the tokens are \#defined. + * + * For example, writing TPASTE2(U, WIDTH) within a macro \#defined by + * UTYPE(WIDTH) and invoked as UTYPE(UL_WIDTH) with UL_WIDTH \#defined as 32 is + * equivalent to writing U32. + */ +//! @{ +#define TPASTE2( a, b) a##b +#define TPASTE3( a, b, c) a##b##c +#define TPASTE4( a, b, c, d) a##b##c##d +#define TPASTE5( a, b, c, d, e) a##b##c##d##e +#define TPASTE6( a, b, c, d, e, f) a##b##c##d##e##f +#define TPASTE7( a, b, c, d, e, f, g) a##b##c##d##e##f##g +#define TPASTE8( a, b, c, d, e, f, g, h) a##b##c##d##e##f##g##h +#define TPASTE9( a, b, c, d, e, f, g, h, i) a##b##c##d##e##f##g##h##i +#define TPASTE10(a, b, c, d, e, f, g, h, i, j) a##b##c##d##e##f##g##h##i##j +//! @} + +/*! \name Absolute Token Paste + * + * Paste N preprocessing tokens together, these tokens being allowed to be \#defined. + * + * No restriction of use if the tokens are \#defined. + * + * For example, writing ATPASTE2(U, UL_WIDTH) anywhere with UL_WIDTH \#defined + * as 32 is equivalent to writing U32. + */ +//! @{ +#define ATPASTE2( a, b) TPASTE2( a, b) +#define ATPASTE3( a, b, c) TPASTE3( a, b, c) +#define ATPASTE4( a, b, c, d) TPASTE4( a, b, c, d) +#define ATPASTE5( a, b, c, d, e) TPASTE5( a, b, c, d, e) +#define ATPASTE6( a, b, c, d, e, f) TPASTE6( a, b, c, d, e, f) +#define ATPASTE7( a, b, c, d, e, f, g) TPASTE7( a, b, c, d, e, f, g) +#define ATPASTE8( a, b, c, d, e, f, g, h) TPASTE8( a, b, c, d, e, f, g, h) +#define ATPASTE9( a, b, c, d, e, f, g, h, i) TPASTE9( a, b, c, d, e, f, g, h, i) +#define ATPASTE10(a, b, c, d, e, f, g, h, i, j) TPASTE10(a, b, c, d, e, f, g, h, i, j) +//! @} + + +#endif // _TPASTE_H_ diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/STARTUP_FILES/GCC/crt0.x b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/STARTUP_FILES/GCC/crt0.x new file mode 100644 index 0000000..23b658b --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/STARTUP_FILES/GCC/crt0.x @@ -0,0 +1,121 @@ +/* This file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief AVR32UC C runtime startup file. + * + * This file has been built from the Newlib crt0.S. + * + * - Compiler: GNU GCC for AVR32 + * - Supported devices: All AVR32UC devices can be used. + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#include + + +//! @{ +//! \verbatim + + + // This must be linked @ 0x80000000 if it is to be run upon reset. + .section .reset, "ax", @progbits + + + .global _start + .type _start, @function +_start: + // Jump to the C runtime startup routine. + lda.w pc, _stext + + + // _stext is placed outside the .reset section so that the program entry point + // can be changed without affecting the C runtime startup. + .section .text._stext, "ax", @progbits + + + .global _stext + .type _stext, @function +_stext: + // Set initial stack pointer. + lda.w sp, _estack + + // Set up EVBA so interrupts can be enabled. + lda.w r0, _evba + mtsr AVR32_EVBA, r0 + + // Enable the exception processing. + csrf AVR32_SR_EM_OFFSET + + // Load initialized data having a global lifetime from the data LMA. + lda.w r0, _data + lda.w r1, _edata + cp r0, r1 + brhs idata_load_loop_end + lda.w r2, _data_lma +idata_load_loop: + ld.d r4, r2++ + st.d r0++, r4 + cp r0, r1 + brlo idata_load_loop +idata_load_loop_end: + + // Clear uninitialized data having a global lifetime in the blank static storage section. + lda.w r0, __bss_start + lda.w r1, _end + cp r0, r1 + brhs udata_clear_loop_end + mov r2, 0 + mov r3, 0 +udata_clear_loop: + st.d r0++, r2 + cp r0, r1 + brlo udata_clear_loop +udata_clear_loop_end: + +#ifdef CONFIG_FRAME_POINTER + // Safety: Set the default "return" @ to the exit routine address. + lda.w lr, exit +#endif + + // Start the show. + lda.w pc, main + + +//! \endverbatim +//! @} diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/compiler.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/compiler.h new file mode 100644 index 0000000..885be7f --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/compiler.h @@ -0,0 +1,1145 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Compiler file for AVR32. + * + * This file defines commonly used types and macros. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _COMPILER_H_ +#define _COMPILER_H_ + +#if ((defined __GNUC__) && (defined __AVR32__)) || (defined __ICCAVR32__ || defined __AAVR32__) +# include +#endif +#if (defined __ICCAVR32__) +# include +#endif +#include "preprocessor.h" + +#include "parts.h" + + +//_____ D E C L A R A T I O N S ____________________________________________ + +#ifdef __AVR32_ABI_COMPILER__ // Automatically defined when compiling for AVR32, not when assembling. + +#include +#include + + +#if (defined __ICCAVR32__) + +/*! \name Compiler Keywords + * + * Port of some keywords from GNU GCC for AVR32 to IAR Embedded Workbench for Atmel AVR32. + */ +//! @{ +#define __asm__ asm +#define __inline__ inline +#define __volatile__ +//! @} + +#endif + + +/*! \name Usual Types + */ +//! @{ +typedef unsigned char Bool; //!< Boolean. +#ifndef __cplusplus +#if !defined(__bool_true_false_are_defined) +typedef unsigned char bool; //!< Boolean. +#endif +#endif +typedef signed char S8 ; //!< 8-bit signed integer. +typedef unsigned char U8 ; //!< 8-bit unsigned integer. +typedef signed short int S16; //!< 16-bit signed integer. +typedef unsigned short int U16; //!< 16-bit unsigned integer. +typedef signed long int S32; //!< 32-bit signed integer. +typedef unsigned long int U32; //!< 32-bit unsigned integer. +typedef signed long long int S64; //!< 64-bit signed integer. +typedef unsigned long long int U64; //!< 64-bit unsigned integer. +typedef float F32; //!< 32-bit floating-point number. +typedef double F64; //!< 64-bit floating-point number. +//! @} + + +/*! \name Status Types + */ +//! @{ +typedef Bool Status_bool_t; //!< Boolean status. +typedef U8 Status_t; //!< 8-bit-coded status. +//! @} + + +/*! \name Aliasing Aggregate Types + */ +//! @{ + +//! 16-bit union. +typedef union +{ + S16 s16 ; + U16 u16 ; + S8 s8 [2]; + U8 u8 [2]; +} Union16; + +//! 32-bit union. +typedef union +{ + S32 s32 ; + U32 u32 ; + S16 s16[2]; + U16 u16[2]; + S8 s8 [4]; + U8 u8 [4]; +} Union32; + +//! 64-bit union. +typedef union +{ + S64 s64 ; + U64 u64 ; + S32 s32[2]; + U32 u32[2]; + S16 s16[4]; + U16 u16[4]; + S8 s8 [8]; + U8 u8 [8]; +} Union64; + +//! Union of pointers to 64-, 32-, 16- and 8-bit unsigned integers. +typedef union +{ + S64 *s64ptr; + U64 *u64ptr; + S32 *s32ptr; + U32 *u32ptr; + S16 *s16ptr; + U16 *u16ptr; + S8 *s8ptr ; + U8 *u8ptr ; +} UnionPtr; + +//! Union of pointers to volatile 64-, 32-, 16- and 8-bit unsigned integers. +typedef union +{ + volatile S64 *s64ptr; + volatile U64 *u64ptr; + volatile S32 *s32ptr; + volatile U32 *u32ptr; + volatile S16 *s16ptr; + volatile U16 *u16ptr; + volatile S8 *s8ptr ; + volatile U8 *u8ptr ; +} UnionVPtr; + +//! Union of pointers to constant 64-, 32-, 16- and 8-bit unsigned integers. +typedef union +{ + const S64 *s64ptr; + const U64 *u64ptr; + const S32 *s32ptr; + const U32 *u32ptr; + const S16 *s16ptr; + const U16 *u16ptr; + const S8 *s8ptr ; + const U8 *u8ptr ; +} UnionCPtr; + +//! Union of pointers to constant volatile 64-, 32-, 16- and 8-bit unsigned integers. +typedef union +{ + const volatile S64 *s64ptr; + const volatile U64 *u64ptr; + const volatile S32 *s32ptr; + const volatile U32 *u32ptr; + const volatile S16 *s16ptr; + const volatile U16 *u16ptr; + const volatile S8 *s8ptr ; + const volatile U8 *u8ptr ; +} UnionCVPtr; + +//! Structure of pointers to 64-, 32-, 16- and 8-bit unsigned integers. +typedef struct +{ + S64 *s64ptr; + U64 *u64ptr; + S32 *s32ptr; + U32 *u32ptr; + S16 *s16ptr; + U16 *u16ptr; + S8 *s8ptr ; + U8 *u8ptr ; +} StructPtr; + +//! Structure of pointers to volatile 64-, 32-, 16- and 8-bit unsigned integers. +typedef struct +{ + volatile S64 *s64ptr; + volatile U64 *u64ptr; + volatile S32 *s32ptr; + volatile U32 *u32ptr; + volatile S16 *s16ptr; + volatile U16 *u16ptr; + volatile S8 *s8ptr ; + volatile U8 *u8ptr ; +} StructVPtr; + +//! Structure of pointers to constant 64-, 32-, 16- and 8-bit unsigned integers. +typedef struct +{ + const S64 *s64ptr; + const U64 *u64ptr; + const S32 *s32ptr; + const U32 *u32ptr; + const S16 *s16ptr; + const U16 *u16ptr; + const S8 *s8ptr ; + const U8 *u8ptr ; +} StructCPtr; + +//! Structure of pointers to constant volatile 64-, 32-, 16- and 8-bit unsigned integers. +typedef struct +{ + const volatile S64 *s64ptr; + const volatile U64 *u64ptr; + const volatile S32 *s32ptr; + const volatile U32 *u32ptr; + const volatile S16 *s16ptr; + const volatile U16 *u16ptr; + const volatile S8 *s8ptr ; + const volatile U8 *u8ptr ; +} StructCVPtr; + +//! @} + +#endif // __AVR32_ABI_COMPILER__ + + +//_____ M A C R O S ________________________________________________________ + +/*! \name Usual Constants + */ +//! @{ +#define DISABLE 0 +#define ENABLE 1 +#define DISABLED 0 +#define ENABLED 1 +#define OFF 0 +#define ON 1 +#define FALSE 0 +#define TRUE 1 +#ifndef __cplusplus +#if !defined(__bool_true_false_are_defined) +#define false FALSE +#define true TRUE +#endif +#endif +#define KO 0 +#define OK 1 +#define PASS 0 +#define FAIL 1 +#define LOW 0 +#define HIGH 1 +#define CLR 0 +#define SET 1 +//! @} + + +#ifdef __AVR32_ABI_COMPILER__ // Automatically defined when compiling for AVR32, not when assembling. + +/*! \name Bit-Field Handling + */ +//! @{ + +/*! \brief Reads the bits of a value specified by a given bit-mask. + * + * \param value Value to read bits from. + * \param mask Bit-mask indicating bits to read. + * + * \return Read bits. + */ +#define Rd_bits( value, mask) ((value) & (mask)) + +/*! \brief Writes the bits of a C lvalue specified by a given bit-mask. + * + * \param lvalue C lvalue to write bits to. + * \param mask Bit-mask indicating bits to write. + * \param bits Bits to write. + * + * \return Resulting value with written bits. + */ +#define Wr_bits(lvalue, mask, bits) ((lvalue) = ((lvalue) & ~(mask)) |\ + ((bits ) & (mask))) + +/*! \brief Tests the bits of a value specified by a given bit-mask. + * + * \param value Value of which to test bits. + * \param mask Bit-mask indicating bits to test. + * + * \return \c 1 if at least one of the tested bits is set, else \c 0. + */ +#define Tst_bits( value, mask) (Rd_bits(value, mask) != 0) + +/*! \brief Clears the bits of a C lvalue specified by a given bit-mask. + * + * \param lvalue C lvalue of which to clear bits. + * \param mask Bit-mask indicating bits to clear. + * + * \return Resulting value with cleared bits. + */ +#define Clr_bits(lvalue, mask) ((lvalue) &= ~(mask)) + +/*! \brief Sets the bits of a C lvalue specified by a given bit-mask. + * + * \param lvalue C lvalue of which to set bits. + * \param mask Bit-mask indicating bits to set. + * + * \return Resulting value with set bits. + */ +#define Set_bits(lvalue, mask) ((lvalue) |= (mask)) + +/*! \brief Toggles the bits of a C lvalue specified by a given bit-mask. + * + * \param lvalue C lvalue of which to toggle bits. + * \param mask Bit-mask indicating bits to toggle. + * + * \return Resulting value with toggled bits. + */ +#define Tgl_bits(lvalue, mask) ((lvalue) ^= (mask)) + +/*! \brief Reads the bit-field of a value specified by a given bit-mask. + * + * \param value Value to read a bit-field from. + * \param mask Bit-mask indicating the bit-field to read. + * + * \return Read bit-field. + */ +#define Rd_bitfield( value, mask) (Rd_bits( value, mask) >> ctz(mask)) + +/*! \brief Writes the bit-field of a C lvalue specified by a given bit-mask. + * + * \param lvalue C lvalue to write a bit-field to. + * \param mask Bit-mask indicating the bit-field to write. + * \param bitfield Bit-field to write. + * + * \return Resulting value with written bit-field. + */ +#define Wr_bitfield(lvalue, mask, bitfield) (Wr_bits(lvalue, mask, (U32)(bitfield) << ctz(mask))) + +//! @} + + +/*! \brief This macro is used to test fatal errors. + * + * The macro tests if the expression is FALSE. If it is, a fatal error is + * detected and the application hangs up. + * + * \param expr Expression to evaluate and supposed to be nonzero. + */ +#ifdef _ASSERT_ENABLE_ + #define Assert(expr) \ + {\ + if (!(expr)) while (TRUE);\ + } +#else + #define Assert(expr) +#endif + + +/*! \name Zero-Bit Counting + * + * Under AVR32-GCC, __builtin_clz and __builtin_ctz behave like macros when + * applied to constant expressions (values known at compile time), so they are + * more optimized than the use of the corresponding assembly instructions and + * they can be used as constant expressions e.g. to initialize objects having + * static storage duration, and like the corresponding assembly instructions + * when applied to non-constant expressions (values unknown at compile time), so + * they are more optimized than an assembly periphrasis. Hence, clz and ctz + * ensure a possible and optimized behavior for both constant and non-constant + * expressions. + */ +//! @{ + +/*! \brief Counts the leading zero bits of the given value considered as a 32-bit integer. + * + * \param u Value of which to count the leading zero bits. + * + * \return The count of leading zero bits in \a u. + */ +#if (defined __GNUC__) + #define clz(u) __builtin_clz(u) +#elif (defined __ICCAVR32__) + #define clz(u) __count_leading_zeros(u) +#endif + +/*! \brief Counts the trailing zero bits of the given value considered as a 32-bit integer. + * + * \param u Value of which to count the trailing zero bits. + * + * \return The count of trailing zero bits in \a u. + */ +#if (defined __GNUC__) + #define ctz(u) __builtin_ctz(u) +#elif (defined __ICCAVR32__) + #define ctz(u) __count_trailing_zeros(u) +#endif + +//! @} + + +/*! \name Bit Reversing + */ +//! @{ + +/*! \brief Reverses the bits of \a u8. + * + * \param u8 U8 of which to reverse the bits. + * + * \return Value resulting from \a u8 with reversed bits. + */ +#define bit_reverse8(u8) ((U8)(bit_reverse32((U8)(u8)) >> 24)) + +/*! \brief Reverses the bits of \a u16. + * + * \param u16 U16 of which to reverse the bits. + * + * \return Value resulting from \a u16 with reversed bits. + */ +#define bit_reverse16(u16) ((U16)(bit_reverse32((U16)(u16)) >> 16)) + +/*! \brief Reverses the bits of \a u32. + * + * \param u32 U32 of which to reverse the bits. + * + * \return Value resulting from \a u32 with reversed bits. + */ +#if (defined __GNUC__) + #define bit_reverse32(u32) \ + (\ + {\ + unsigned int __value = (U32)(u32);\ + __asm__ ("brev\t%0" : "+r" (__value) : : "cc");\ + (U32)__value;\ + }\ + ) +#elif (defined __ICCAVR32__) + #define bit_reverse32(u32) ((U32)__bit_reverse((U32)(u32))) +#endif + +/*! \brief Reverses the bits of \a u64. + * + * \param u64 U64 of which to reverse the bits. + * + * \return Value resulting from \a u64 with reversed bits. + */ +#define bit_reverse64(u64) ((U64)(((U64)bit_reverse32((U64)(u64) >> 32)) |\ + ((U64)bit_reverse32((U64)(u64)) << 32))) + +//! @} + + +/*! \name Alignment + */ +//! @{ + +/*! \brief Tests alignment of the number \a val with the \a n boundary. + * + * \param val Input value. + * \param n Boundary. + * + * \return \c 1 if the number \a val is aligned with the \a n boundary, else \c 0. + */ +#define Test_align(val, n ) (!Tst_bits( val, (n) - 1 ) ) + +/*! \brief Gets alignment of the number \a val with respect to the \a n boundary. + * + * \param val Input value. + * \param n Boundary. + * + * \return Alignment of the number \a val with respect to the \a n boundary. + */ +#define Get_align( val, n ) ( Rd_bits( val, (n) - 1 ) ) + +/*! \brief Sets alignment of the lvalue number \a lval to \a alg with respect to the \a n boundary. + * + * \param lval Input/output lvalue. + * \param n Boundary. + * \param alg Alignment. + * + * \return New value of \a lval resulting from its alignment set to \a alg with respect to the \a n boundary. + */ +#define Set_align(lval, n, alg) ( Wr_bits(lval, (n) - 1, alg) ) + +/*! \brief Aligns the number \a val with the upper \a n boundary. + * + * \param val Input value. + * \param n Boundary. + * + * \return Value resulting from the number \a val aligned with the upper \a n boundary. + */ +#define Align_up( val, n ) (((val) + ((n) - 1)) & ~((n) - 1)) + +/*! \brief Aligns the number \a val with the lower \a n boundary. + * + * \param val Input value. + * \param n Boundary. + * + * \return Value resulting from the number \a val aligned with the lower \a n boundary. + */ +#define Align_down(val, n ) ( (val) & ~((n) - 1)) + +//! @} + + +/*! \name Mathematics + * + * The same considerations as for clz and ctz apply here but AVR32-GCC does not + * provide built-in functions to access the assembly instructions abs, min and + * max and it does not produce them by itself in most cases, so two sets of + * macros are defined here: + * - Abs, Min and Max to apply to constant expressions (values known at + * compile time); + * - abs, min and max to apply to non-constant expressions (values unknown at + * compile time). + */ +//! @{ + +/*! \brief Takes the absolute value of \a a. + * + * \param a Input value. + * + * \return Absolute value of \a a. + * + * \note More optimized if only used with values known at compile time. + */ +#define Abs(a) (((a) < 0 ) ? -(a) : (a)) + +/*! \brief Takes the minimal value of \a a and \a b. + * + * \param a Input value. + * \param b Input value. + * + * \return Minimal value of \a a and \a b. + * + * \note More optimized if only used with values known at compile time. + */ +#define Min(a, b) (((a) < (b)) ? (a) : (b)) + +/*! \brief Takes the maximal value of \a a and \a b. + * + * \param a Input value. + * \param b Input value. + * + * \return Maximal value of \a a and \a b. + * + * \note More optimized if only used with values known at compile time. + */ +#define Max(a, b) (((a) > (b)) ? (a) : (b)) + +/*! \brief Takes the absolute value of \a a. + * + * \param a Input value. + * + * \return Absolute value of \a a. + * + * \note More optimized if only used with values unknown at compile time. + */ +#if (defined __GNUC__) + #define abs(a) \ + (\ + {\ + int __value = (a);\ + __asm__ ("abs\t%0" : "+r" (__value) : : "cc");\ + __value;\ + }\ + ) +#elif (defined __ICCAVR32__) + #define abs(a) Abs(a) +#endif + +/*! \brief Takes the minimal value of \a a and \a b. + * + * \param a Input value. + * \param b Input value. + * + * \return Minimal value of \a a and \a b. + * + * \note More optimized if only used with values unknown at compile time. + */ +#if (defined __GNUC__) + #define min(a, b) \ + (\ + {\ + int __value, __arg_a = (a), __arg_b = (b);\ + __asm__ ("min\t%0, %1, %2" : "=r" (__value) : "r" (__arg_a), "r" (__arg_b));\ + __value;\ + }\ + ) +#elif (defined __ICCAVR32__) + #define min(a, b) __min(a, b) +#endif + +/*! \brief Takes the maximal value of \a a and \a b. + * + * \param a Input value. + * \param b Input value. + * + * \return Maximal value of \a a and \a b. + * + * \note More optimized if only used with values unknown at compile time. + */ +#if (defined __GNUC__) + #define max(a, b) \ + (\ + {\ + int __value, __arg_a = (a), __arg_b = (b);\ + __asm__ ("max\t%0, %1, %2" : "=r" (__value) : "r" (__arg_a), "r" (__arg_b));\ + __value;\ + }\ + ) +#elif (defined __ICCAVR32__) + #define max(a, b) __max(a, b) +#endif + +//! @} + + +/*! \brief Calls the routine at address \a addr. + * + * It generates a long call opcode. + * + * For example, `Long_call(0x80000000)' generates a software reset on a UC3 if + * it is invoked from the CPU supervisor mode. + * + * \param addr Address of the routine to call. + * + * \note It may be used as a long jump opcode in some special cases. + */ +#define Long_call(addr) ((*(void (*)(void))(addr))()) + +/*! \brief Resets the CPU by software. + * + * \warning It shall not be called from the CPU application mode. + */ +#if (defined __GNUC__) + #define Reset_CPU() \ + (\ + {\ + __asm__ __volatile__ (\ + "lddpc r9, 3f\n\t"\ + "mfsr r8, %[SR]\n\t"\ + "bfextu r8, r8, %[SR_M_OFFSET], %[SR_M_SIZE]\n\t"\ + "cp.w r8, 0b001\n\t"\ + "breq 0f\n\t"\ + "sub r8, pc, $ - 1f\n\t"\ + "pushm r8-r9\n\t"\ + "rete\n"\ + "0:\n\t"\ + "mtsr %[SR], r9\n"\ + "1:\n\t"\ + "mov r0, 0\n\t"\ + "mov r1, 0\n\t"\ + "mov r2, 0\n\t"\ + "mov r3, 0\n\t"\ + "mov r4, 0\n\t"\ + "mov r5, 0\n\t"\ + "mov r6, 0\n\t"\ + "mov r7, 0\n\t"\ + "mov r8, 0\n\t"\ + "mov r9, 0\n\t"\ + "mov r10, 0\n\t"\ + "mov r11, 0\n\t"\ + "mov r12, 0\n\t"\ + "mov sp, 0\n\t"\ + "stdsp sp[0], sp\n\t"\ + "ldmts sp, sp\n\t"\ + "mov lr, 0\n\t"\ + "lddpc pc, 2f\n\t"\ + ".balign 4\n"\ + "2:\n\t"\ + ".word _start\n"\ + "3:\n\t"\ + ".word %[RESET_SR]"\ + :\ + : [SR] "i" (AVR32_SR),\ + [SR_M_OFFSET] "i" (AVR32_SR_M_OFFSET),\ + [SR_M_SIZE] "i" (AVR32_SR_M_SIZE),\ + [RESET_SR] "i" (AVR32_SR_GM_MASK | AVR32_SR_EM_MASK | (AVR32_SR_M_SUP << AVR32_SR_M_OFFSET))\ + );\ + }\ + ) +#elif (defined __ICCAVR32__) + #define Reset_CPU() \ + {\ + extern void *volatile __program_start;\ + __asm__ __volatile__ (\ + "mov r7, LWRD(__program_start)\n\t"\ + "orh r7, HWRD(__program_start)\n\t"\ + "mov r9, LWRD("ASTRINGZ(AVR32_SR_GM_MASK | AVR32_SR_EM_MASK | (AVR32_SR_M_SUP << AVR32_SR_M_OFFSET))")\n\t"\ + "orh r9, HWRD("ASTRINGZ(AVR32_SR_GM_MASK | AVR32_SR_EM_MASK | (AVR32_SR_M_SUP << AVR32_SR_M_OFFSET))")\n\t"\ + "mfsr r8, "ASTRINGZ(AVR32_SR)"\n\t"\ + "bfextu r8, r8, "ASTRINGZ(AVR32_SR_M_OFFSET)", "ASTRINGZ(AVR32_SR_M_SIZE)"\n\t"\ + "cp.w r8, 001b\n\t"\ + "breq $ + 10\n\t"\ + "sub r8, pc, -12\n\t"\ + "pushm r8-r9\n\t"\ + "rete\n\t"\ + "mtsr "ASTRINGZ(AVR32_SR)", r9\n\t"\ + "mov r0, 0\n\t"\ + "mov r1, 0\n\t"\ + "mov r2, 0\n\t"\ + "mov r3, 0\n\t"\ + "mov r4, 0\n\t"\ + "mov r5, 0\n\t"\ + "mov r6, 0\n\t"\ + "st.w r0[4], r7\n\t"\ + "mov r7, 0\n\t"\ + "mov r8, 0\n\t"\ + "mov r9, 0\n\t"\ + "mov r10, 0\n\t"\ + "mov r11, 0\n\t"\ + "mov r12, 0\n\t"\ + "mov sp, 0\n\t"\ + "stdsp sp[0], sp\n\t"\ + "ldmts sp, sp\n\t"\ + "mov lr, 0\n\t"\ + "ld.w pc, lr[4]"\ + );\ + __program_start;\ + } +#endif + + +/*! \name System Register Access + */ +//! @{ + +/*! \brief Gets the value of the \a sysreg system register. + * + * \param sysreg Address of the system register of which to get the value. + * + * \return Value of the \a sysreg system register. + */ +#if (defined __GNUC__) + #define Get_system_register(sysreg) __builtin_mfsr(sysreg) +#elif (defined __ICCAVR32__) + #define Get_system_register(sysreg) __get_system_register(sysreg) +#endif + +/*! \brief Sets the value of the \a sysreg system register to \a value. + * + * \param sysreg Address of the system register of which to set the value. + * \param value Value to set the \a sysreg system register to. + */ +#if (defined __GNUC__) + #define Set_system_register(sysreg, value) __builtin_mtsr(sysreg, value) +#elif (defined __ICCAVR32__) + #define Set_system_register(sysreg, value) __set_system_register(sysreg, value) +#endif + +//! @} + + +/*! \name CPU Status Register Access + */ +//! @{ + +/*! \brief Tells whether exceptions are globally enabled. + * + * \return \c 1 if exceptions are globally enabled, else \c 0. + */ +#define Is_global_exception_enabled() (!Tst_bits(Get_system_register(AVR32_SR), AVR32_SR_EM_MASK)) + +/*! \brief Disables exceptions globally. + */ +#if (defined __GNUC__) + #define Disable_global_exception() ({__asm__ __volatile__ ("ssrf\t%0" : : "i" (AVR32_SR_EM_OFFSET));}) +#elif (defined __ICCAVR32__) + #define Disable_global_exception() (__set_status_flag(AVR32_SR_EM_OFFSET)) +#endif + +/*! \brief Enables exceptions globally. + */ +#if (defined __GNUC__) + #define Enable_global_exception() ({__asm__ __volatile__ ("csrf\t%0" : : "i" (AVR32_SR_EM_OFFSET));}) +#elif (defined __ICCAVR32__) + #define Enable_global_exception() (__clear_status_flag(AVR32_SR_EM_OFFSET)) +#endif + +/*! \brief Tells whether interrupts are globally enabled. + * + * \return \c 1 if interrupts are globally enabled, else \c 0. + */ +#define Is_global_interrupt_enabled() (!Tst_bits(Get_system_register(AVR32_SR), AVR32_SR_GM_MASK)) + +/*! \brief Disables interrupts globally. + */ +#if (defined __GNUC__) + #define Disable_global_interrupt() ({__asm__ __volatile__ ("ssrf\t%0" : : "i" (AVR32_SR_GM_OFFSET));}) +#elif (defined __ICCAVR32__) + #define Disable_global_interrupt() (__disable_interrupt()) +#endif + +/*! \brief Enables interrupts globally. + */ +#if (defined __GNUC__) + #define Enable_global_interrupt() ({__asm__ __volatile__ ("csrf\t%0" : : "i" (AVR32_SR_GM_OFFSET));}) +#elif (defined __ICCAVR32__) + #define Enable_global_interrupt() (__enable_interrupt()) +#endif + +/*! \brief Tells whether interrupt level \a int_level is enabled. + * + * \param int_level Interrupt level (0 to 3). + * + * \return \c 1 if interrupt level \a int_level is enabled, else \c 0. + */ +#define Is_interrupt_level_enabled(int_level) (!Tst_bits(Get_system_register(AVR32_SR), TPASTE3(AVR32_SR_I, int_level, M_MASK))) + +/*! \brief Disables interrupt level \a int_level. + * + * \param int_level Interrupt level to disable (0 to 3). + */ +#if (defined __GNUC__) + #define Disable_interrupt_level(int_level) ({__asm__ __volatile__ ("ssrf\t%0" : : "i" (TPASTE3(AVR32_SR_I, int_level, M_OFFSET)));}) +#elif (defined __ICCAVR32__) + #define Disable_interrupt_level(int_level) (__set_status_flag(TPASTE3(AVR32_SR_I, int_level, M_OFFSET))) +#endif + +/*! \brief Enables interrupt level \a int_level. + * + * \param int_level Interrupt level to enable (0 to 3). + */ +#if (defined __GNUC__) + #define Enable_interrupt_level(int_level) ({__asm__ __volatile__ ("csrf\t%0" : : "i" (TPASTE3(AVR32_SR_I, int_level, M_OFFSET)));}) +#elif (defined __ICCAVR32__) + #define Enable_interrupt_level(int_level) (__clear_status_flag(TPASTE3(AVR32_SR_I, int_level, M_OFFSET))) +#endif + +/*! \brief Protects subsequent code from interrupts. + */ +#define AVR32_ENTER_CRITICAL_REGION( ) \ + { \ + Bool global_interrupt_enabled = Is_global_interrupt_enabled(); \ + Disable_global_interrupt(); // Disable the appropriate interrupts. + +/*! \brief This macro must always be used in conjunction with AVR32_ENTER_CRITICAL_REGION + * so that interrupts are enabled again. + */ +#define AVR32_LEAVE_CRITICAL_REGION( ) \ + if (global_interrupt_enabled) Enable_global_interrupt(); \ + } + +//! @} + + +/*! \name Debug Register Access + */ +//! @{ + +/*! \brief Gets the value of the \a dbgreg debug register. + * + * \param dbgreg Address of the debug register of which to get the value. + * + * \return Value of the \a dbgreg debug register. + */ +#if (defined __GNUC__) + #define Get_debug_register(dbgreg) __builtin_mfdr(dbgreg) +#elif (defined __ICCAVR32__) + #define Get_debug_register(dbgreg) __get_debug_register(dbgreg) +#endif + +/*! \brief Sets the value of the \a dbgreg debug register to \a value. + * + * \param dbgreg Address of the debug register of which to set the value. + * \param value Value to set the \a dbgreg debug register to. + */ +#if (defined __GNUC__) + #define Set_debug_register(dbgreg, value) __builtin_mtdr(dbgreg, value) +#elif (defined __ICCAVR32__) + #define Set_debug_register(dbgreg, value) __set_debug_register(dbgreg, value) +#endif + +//! @} + +#endif // __AVR32_ABI_COMPILER__ + + +//! Boolean evaluating MCU little endianism. +#if ((defined __GNUC__) && (defined __AVR32__)) || ((defined __ICCAVR32__) || (defined __AAVR32__)) + #define LITTLE_ENDIAN_MCU FALSE +#else + #error If you are here, you should check what is exactly the processor you are using... + #define LITTLE_ENDIAN_MCU FALSE +#endif + +// Check that MCU endianism is correctly defined. +#ifndef LITTLE_ENDIAN_MCU + #error YOU MUST define the MCU endianism with LITTLE_ENDIAN_MCU: either FALSE or TRUE +#endif + +//! Boolean evaluating MCU big endianism. +#define BIG_ENDIAN_MCU (!LITTLE_ENDIAN_MCU) + + +#ifdef __AVR32_ABI_COMPILER__ // Automatically defined when compiling for AVR32, not when assembling. + +/*! \name MCU Endianism Handling + */ +//! @{ + +#if (LITTLE_ENDIAN_MCU==TRUE) + #define LSB(u16) (((U8 *)&(u16))[0]) //!< Least significant byte of \a u16. + #define MSB(u16) (((U8 *)&(u16))[1]) //!< Most significant byte of \a u16. + + #define LSH(u32) (((U16 *)&(u32))[0]) //!< Least significant half-word of \a u32. + #define MSH(u32) (((U16 *)&(u32))[1]) //!< Most significant half-word of \a u32. + #define LSB0W(u32) (((U8 *)&(u32))[0]) //!< Least significant byte of 1st rank of \a u32. + #define LSB1W(u32) (((U8 *)&(u32))[1]) //!< Least significant byte of 2nd rank of \a u32. + #define LSB2W(u32) (((U8 *)&(u32))[2]) //!< Least significant byte of 3rd rank of \a u32. + #define LSB3W(u32) (((U8 *)&(u32))[3]) //!< Least significant byte of 4th rank of \a u32. + #define MSB3W(u32) LSB0W(u32) //!< Most significant byte of 4th rank of \a u32. + #define MSB2W(u32) LSB1W(u32) //!< Most significant byte of 3rd rank of \a u32. + #define MSB1W(u32) LSB2W(u32) //!< Most significant byte of 2nd rank of \a u32. + #define MSB0W(u32) LSB3W(u32) //!< Most significant byte of 1st rank of \a u32. + + #define LSW(u64) (((U32 *)&(u64))[0]) //!< Least significant word of \a u64. + #define MSW(u64) (((U32 *)&(u64))[1]) //!< Most significant word of \a u64. + #define LSH0(u64) (((U16 *)&(u64))[0]) //!< Least significant half-word of 1st rank of \a u64. + #define LSH1(u64) (((U16 *)&(u64))[1]) //!< Least significant half-word of 2nd rank of \a u64. + #define LSH2(u64) (((U16 *)&(u64))[2]) //!< Least significant half-word of 3rd rank of \a u64. + #define LSH3(u64) (((U16 *)&(u64))[3]) //!< Least significant half-word of 4th rank of \a u64. + #define MSH3(u64) LSH0(u64) //!< Most significant half-word of 4th rank of \a u64. + #define MSH2(u64) LSH1(u64) //!< Most significant half-word of 3rd rank of \a u64. + #define MSH1(u64) LSH2(u64) //!< Most significant half-word of 2nd rank of \a u64. + #define MSH0(u64) LSH3(u64) //!< Most significant half-word of 1st rank of \a u64. + #define LSB0D(u64) (((U8 *)&(u64))[0]) //!< Least significant byte of 1st rank of \a u64. + #define LSB1D(u64) (((U8 *)&(u64))[1]) //!< Least significant byte of 2nd rank of \a u64. + #define LSB2D(u64) (((U8 *)&(u64))[2]) //!< Least significant byte of 3rd rank of \a u64. + #define LSB3D(u64) (((U8 *)&(u64))[3]) //!< Least significant byte of 4th rank of \a u64. + #define LSB4D(u64) (((U8 *)&(u64))[4]) //!< Least significant byte of 5th rank of \a u64. + #define LSB5D(u64) (((U8 *)&(u64))[5]) //!< Least significant byte of 6th rank of \a u64. + #define LSB6D(u64) (((U8 *)&(u64))[6]) //!< Least significant byte of 7th rank of \a u64. + #define LSB7D(u64) (((U8 *)&(u64))[7]) //!< Least significant byte of 8th rank of \a u64. + #define MSB7D(u64) LSB0D(u64) //!< Most significant byte of 8th rank of \a u64. + #define MSB6D(u64) LSB1D(u64) //!< Most significant byte of 7th rank of \a u64. + #define MSB5D(u64) LSB2D(u64) //!< Most significant byte of 6th rank of \a u64. + #define MSB4D(u64) LSB3D(u64) //!< Most significant byte of 5th rank of \a u64. + #define MSB3D(u64) LSB4D(u64) //!< Most significant byte of 4th rank of \a u64. + #define MSB2D(u64) LSB5D(u64) //!< Most significant byte of 3rd rank of \a u64. + #define MSB1D(u64) LSB6D(u64) //!< Most significant byte of 2nd rank of \a u64. + #define MSB0D(u64) LSB7D(u64) //!< Most significant byte of 1st rank of \a u64. + +#elif (BIG_ENDIAN_MCU==TRUE) + #define MSB(u16) (((U8 *)&(u16))[0]) //!< Most significant byte of \a u16. + #define LSB(u16) (((U8 *)&(u16))[1]) //!< Least significant byte of \a u16. + + #define MSH(u32) (((U16 *)&(u32))[0]) //!< Most significant half-word of \a u32. + #define LSH(u32) (((U16 *)&(u32))[1]) //!< Least significant half-word of \a u32. + #define MSB0W(u32) (((U8 *)&(u32))[0]) //!< Most significant byte of 1st rank of \a u32. + #define MSB1W(u32) (((U8 *)&(u32))[1]) //!< Most significant byte of 2nd rank of \a u32. + #define MSB2W(u32) (((U8 *)&(u32))[2]) //!< Most significant byte of 3rd rank of \a u32. + #define MSB3W(u32) (((U8 *)&(u32))[3]) //!< Most significant byte of 4th rank of \a u32. + #define LSB3W(u32) MSB0W(u32) //!< Least significant byte of 4th rank of \a u32. + #define LSB2W(u32) MSB1W(u32) //!< Least significant byte of 3rd rank of \a u32. + #define LSB1W(u32) MSB2W(u32) //!< Least significant byte of 2nd rank of \a u32. + #define LSB0W(u32) MSB3W(u32) //!< Least significant byte of 1st rank of \a u32. + + #define MSW(u64) (((U32 *)&(u64))[0]) //!< Most significant word of \a u64. + #define LSW(u64) (((U32 *)&(u64))[1]) //!< Least significant word of \a u64. + #define MSH0(u64) (((U16 *)&(u64))[0]) //!< Most significant half-word of 1st rank of \a u64. + #define MSH1(u64) (((U16 *)&(u64))[1]) //!< Most significant half-word of 2nd rank of \a u64. + #define MSH2(u64) (((U16 *)&(u64))[2]) //!< Most significant half-word of 3rd rank of \a u64. + #define MSH3(u64) (((U16 *)&(u64))[3]) //!< Most significant half-word of 4th rank of \a u64. + #define LSH3(u64) MSH0(u64) //!< Least significant half-word of 4th rank of \a u64. + #define LSH2(u64) MSH1(u64) //!< Least significant half-word of 3rd rank of \a u64. + #define LSH1(u64) MSH2(u64) //!< Least significant half-word of 2nd rank of \a u64. + #define LSH0(u64) MSH3(u64) //!< Least significant half-word of 1st rank of \a u64. + #define MSB0D(u64) (((U8 *)&(u64))[0]) //!< Most significant byte of 1st rank of \a u64. + #define MSB1D(u64) (((U8 *)&(u64))[1]) //!< Most significant byte of 2nd rank of \a u64. + #define MSB2D(u64) (((U8 *)&(u64))[2]) //!< Most significant byte of 3rd rank of \a u64. + #define MSB3D(u64) (((U8 *)&(u64))[3]) //!< Most significant byte of 4th rank of \a u64. + #define MSB4D(u64) (((U8 *)&(u64))[4]) //!< Most significant byte of 5th rank of \a u64. + #define MSB5D(u64) (((U8 *)&(u64))[5]) //!< Most significant byte of 6th rank of \a u64. + #define MSB6D(u64) (((U8 *)&(u64))[6]) //!< Most significant byte of 7th rank of \a u64. + #define MSB7D(u64) (((U8 *)&(u64))[7]) //!< Most significant byte of 8th rank of \a u64. + #define LSB7D(u64) MSB0D(u64) //!< Least significant byte of 8th rank of \a u64. + #define LSB6D(u64) MSB1D(u64) //!< Least significant byte of 7th rank of \a u64. + #define LSB5D(u64) MSB2D(u64) //!< Least significant byte of 6th rank of \a u64. + #define LSB4D(u64) MSB3D(u64) //!< Least significant byte of 5th rank of \a u64. + #define LSB3D(u64) MSB4D(u64) //!< Least significant byte of 4th rank of \a u64. + #define LSB2D(u64) MSB5D(u64) //!< Least significant byte of 3rd rank of \a u64. + #define LSB1D(u64) MSB6D(u64) //!< Least significant byte of 2nd rank of \a u64. + #define LSB0D(u64) MSB7D(u64) //!< Least significant byte of 1st rank of \a u64. + +#else + #error Unknown endianism. +#endif + +//! @} + + +/*! \name Endianism Conversion + * + * The same considerations as for clz and ctz apply here but AVR32-GCC's + * __builtin_bswap_16 and __builtin_bswap_32 do not behave like macros when + * applied to constant expressions, so two sets of macros are defined here: + * - Swap16, Swap32 and Swap64 to apply to constant expressions (values known + * at compile time); + * - swap16, swap32 and swap64 to apply to non-constant expressions (values + * unknown at compile time). + */ +//! @{ + +/*! \brief Toggles the endianism of \a u16 (by swapping its bytes). + * + * \param u16 U16 of which to toggle the endianism. + * + * \return Value resulting from \a u16 with toggled endianism. + * + * \note More optimized if only used with values known at compile time. + */ +#define Swap16(u16) ((U16)(((U16)(u16) >> 8) |\ + ((U16)(u16) << 8))) + +/*! \brief Toggles the endianism of \a u32 (by swapping its bytes). + * + * \param u32 U32 of which to toggle the endianism. + * + * \return Value resulting from \a u32 with toggled endianism. + * + * \note More optimized if only used with values known at compile time. + */ +#define Swap32(u32) ((U32)(((U32)Swap16((U32)(u32) >> 16)) |\ + ((U32)Swap16((U32)(u32)) << 16))) + +/*! \brief Toggles the endianism of \a u64 (by swapping its bytes). + * + * \param u64 U64 of which to toggle the endianism. + * + * \return Value resulting from \a u64 with toggled endianism. + * + * \note More optimized if only used with values known at compile time. + */ +#define Swap64(u64) ((U64)(((U64)Swap32((U64)(u64) >> 32)) |\ + ((U64)Swap32((U64)(u64)) << 32))) + +/*! \brief Toggles the endianism of \a u16 (by swapping its bytes). + * + * \param u16 U16 of which to toggle the endianism. + * + * \return Value resulting from \a u16 with toggled endianism. + * + * \note More optimized if only used with values unknown at compile time. + */ +#if (defined __GNUC__) + #define swap16(u16) ((U16)__builtin_bswap_16((U16)(u16))) +#elif (defined __ICCAVR32__) + #define swap16(u16) ((U16)__swap_bytes_in_halfwords((U16)(u16))) +#endif + +/*! \brief Toggles the endianism of \a u32 (by swapping its bytes). + * + * \param u32 U32 of which to toggle the endianism. + * + * \return Value resulting from \a u32 with toggled endianism. + * + * \note More optimized if only used with values unknown at compile time. + */ +#if (defined __GNUC__) + #define swap32(u32) ((U32)__builtin_bswap_32((U32)(u32))) +#elif (defined __ICCAVR32__) + #define swap32(u32) ((U32)__swap_bytes((U32)(u32))) +#endif + +/*! \brief Toggles the endianism of \a u64 (by swapping its bytes). + * + * \param u64 U64 of which to toggle the endianism. + * + * \return Value resulting from \a u64 with toggled endianism. + * + * \note More optimized if only used with values unknown at compile time. + */ +#define swap64(u64) ((U64)(((U64)swap32((U64)(u64) >> 32)) |\ + ((U64)swap32((U64)(u64)) << 32))) + +//! @} + + +/*! \name Target Abstraction + */ +//! @{ + +#define _GLOBEXT_ extern //!< extern storage-class specifier. +#define _CONST_TYPE_ const //!< const type qualifier. +#define _MEM_TYPE_SLOW_ //!< Slow memory type. +#define _MEM_TYPE_MEDFAST_ //!< Fairly fast memory type. +#define _MEM_TYPE_FAST_ //!< Fast memory type. + +typedef U8 Byte; //!< 8-bit unsigned integer. + +#define memcmp_ram2ram memcmp //!< Target-specific memcmp of RAM to RAM. +#define memcmp_code2ram memcmp //!< Target-specific memcmp of RAM to NVRAM. +#define memcpy_ram2ram memcpy //!< Target-specific memcpy from RAM to RAM. +#define memcpy_code2ram memcpy //!< Target-specific memcpy from NVRAM to RAM. + +#define LSB0(u32) LSB0W(u32) //!< Least significant byte of 1st rank of \a u32. +#define LSB1(u32) LSB1W(u32) //!< Least significant byte of 2nd rank of \a u32. +#define LSB2(u32) LSB2W(u32) //!< Least significant byte of 3rd rank of \a u32. +#define LSB3(u32) LSB3W(u32) //!< Least significant byte of 4th rank of \a u32. +#define MSB3(u32) MSB3W(u32) //!< Most significant byte of 4th rank of \a u32. +#define MSB2(u32) MSB2W(u32) //!< Most significant byte of 3rd rank of \a u32. +#define MSB1(u32) MSB1W(u32) //!< Most significant byte of 2nd rank of \a u32. +#define MSB0(u32) MSB0W(u32) //!< Most significant byte of 1st rank of \a u32. + +//! @} + +#endif // __AVR32_ABI_COMPILER__ + + +#endif // _COMPILER_H_ diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/conf_isp.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/conf_isp.h new file mode 100644 index 0000000..ca516ee --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/conf_isp.h @@ -0,0 +1,136 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ****************************************************************** + * + * \brief ISP configuration file. + * + * This file contains the possible external configuration of the ISP. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices with a USB module can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ***************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _CONF_ISP_H_ +#define _CONF_ISP_H_ + +#include +#include "compiler.h" + + +//_____ D E F I N I T I O N S ______________________________________________ + +#define PRODUCT_MANUFACTURER_ID 0x58 +#define PRODUCT_FAMILY_ID 0x20 + +#define ISP_VERSION 0x10 +#define ISP_ID0 0x00 +#define ISP_ID1 0x00 + +#define ISP_CFG1 (*(volatile U32 *)ISP_CFG1_ADDRESS) +#define ISP_CFG1_ADDRESS (AVR32_FLASHC_USER_PAGE_ADDRESS + ISP_CFG1_OFFSET) +#define ISP_CFG1_OFFSET 0x000001FC +#define ISP_CFG1_SIZE 4 + +#define ISP_CFG1_BOOT_KEY1 16 +#define ISP_CFG1_BOOT_KEY1_MASK 0xFFFF0000 +#define ISP_CFG1_BOOT_KEY1_OFFSET 16 +#define ISP_CFG1_BOOT_KEY1_SIZE 16 +#define ISP_CFG1_BOOT_KEY1_VALUE 0xE11E + +#define ISP_CFG1_FORCE 9 +#define ISP_CFG1_FORCE_MASK 0x00000200 +#define ISP_CFG1_FORCE_OFFSET 9 +#define ISP_CFG1_FORCE_SIZE 1 + +#define ISP_CFG1_IO_COND_EN 8 +#define ISP_CFG1_IO_COND_EN_MASK 0x00000100 +#define ISP_CFG1_IO_COND_EN_OFFSET 8 +#define ISP_CFG1_IO_COND_EN_SIZE 1 + +#define ISP_CFG1_CRC8 0 +#define ISP_CFG1_CRC8_MASK 0x000000FF +#define ISP_CFG1_CRC8_OFFSET 0 +#define ISP_CFG1_CRC8_SIZE 8 +#define ISP_CFG1_CRC8_POLYNOMIAL 0x107 + +#define ISP_CFG2 (*(volatile U32 *)ISP_CFG2_ADDRESS) +#define ISP_CFG2_ADDRESS (AVR32_FLASHC_USER_PAGE_ADDRESS + ISP_CFG2_OFFSET) +#define ISP_CFG2_OFFSET 0x000001F8 +#define ISP_CFG2_SIZE 4 + +#define ISP_CFG2_BOOT_KEY 17 +#define ISP_CFG2_BOOT_KEY_MASK 0xFFFE0000 +#define ISP_CFG2_BOOT_KEY_OFFSET 17 +#define ISP_CFG2_BOOT_KEY_SIZE 15 +#define ISP_CFG2_BOOT_KEY_VALUE 0x494F + +#define ISP_CFG2_IO_COND_LEVEL 16 +#define ISP_CFG2_IO_COND_LEVEL_MASK 0x00010000 +#define ISP_CFG2_IO_COND_LEVEL_OFFSET 16 +#define ISP_CFG2_IO_COND_LEVEL_SIZE 1 + +#define ISP_CFG2_IO_COND_PIN 8 +#define ISP_CFG2_IO_COND_PIN_MASK 0x0000FF00 +#define ISP_CFG2_IO_COND_PIN_OFFSET 8 +#define ISP_CFG2_IO_COND_PIN_SIZE 8 + +#define ISP_CFG2_CRC8 0 +#define ISP_CFG2_CRC8_MASK 0x000000FF +#define ISP_CFG2_CRC8_OFFSET 0 +#define ISP_CFG2_CRC8_SIZE 8 +#define ISP_CFG2_CRC8_POLYNOMIAL 0x107 + +#define ISP_KEY (*(volatile U32 *)ISP_KEY_ADDRESS) +#define ISP_KEY_ADDRESS (AVR32_SRAM_ADDRESS + ISP_KEY_OFFSET) +#define ISP_KEY_OFFSET 0x00000000 +#define ISP_KEY_SIZE 4 +#define ISP_KEY_VALUE ('I' << 24 | 'S' << 16 | 'P' << 8 | 'K') + +#ifndef ISP_OSC + #define ISP_OSC 0 +#endif + +#define DFU_FRAME_LENGTH 2048 + +#define PROGRAM_START_ADDRESS (AVR32_FLASH_ADDRESS + PROGRAM_START_OFFSET) +#define PROGRAM_START_OFFSET 0x00002000 + + +#endif // _CONF_ISP_H_ diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/parts.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/parts.h new file mode 100644 index 0000000..6637b2f --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/SOFTWARE_FRAMEWORK/UTILS/parts.h @@ -0,0 +1,203 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*This file is prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief Arch file for AVR32. + * + * This file defines common AVR32 UC3 series. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + ******************************************************************************/ + +/* Copyright (c) 2009 Atmel Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of Atmel may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * 4. This software may only be redistributed and used in connection with an Atmel + * AVR product. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE + * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE + * + */ + +#ifndef _ARCH_H_ +#define _ARCH_H_ + +// UC3 A Series +#define UC3A0 ( defined (__GNUC__) && \ + ( defined (__AVR32_UC3A0128__) || \ + defined (__AVR32_UC3A0256__) || \ + defined (__AVR32_UC3A0512__) || \ + defined (__AVR32_UC3A0512ES__))) \ + ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ + ( defined (__AT32UC3A0128__) || \ + defined (__AT32UC3A0256__) || \ + defined (__AT32UC3A0512__) || \ + defined (__AT32UC3A0512ES__))) + +#define UC3A1 ( defined (__GNUC__) && \ + ( defined (__AVR32_UC3A1128__) || \ + defined (__AVR32_UC3A1256__) || \ + defined (__AVR32_UC3A1512__) || \ + defined (__AVR32_UC3A1512ES__))) \ + ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ + ( defined (__AT32UC3A1128__) || \ + defined (__AT32UC3A1256__) || \ + defined (__AT32UC3A1512__) || \ + defined (__AT32UC3A1512ES__))) + +#define UC3A3 ( defined (__GNUC__) && \ + ( defined (__AVR32_UC3A364__) || \ + defined (__AVR32_UC3A364S__) || \ + defined (__AVR32_UC3A3128__) || \ + defined (__AVR32_UC3A3128S__) || \ + defined (__AVR32_UC3A3256__) || \ + defined (__AVR32_UC3A3256S__))) \ + ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ + ( defined (__AT32UC3A364__) || \ + defined (__AT32UC3A364S__) || \ + defined (__AT32UC3A3128__) || \ + defined (__AT32UC3A3128S__) || \ + defined (__AT32UC3A3256__) || \ + defined (__AT32UC3A3256S__))) + +#define UC3A (UC3A0 || UC3A1 || UC3A3) + +// UC3 B Series +#define UC3B0 ( defined (__GNUC__) && \ + ( defined (__AVR32_UC3B064__) || \ + defined (__AVR32_UC3B0128__) || \ + defined (__AVR32_UC3B0256__) || \ + defined (__AVR32_UC3B0256ES__) || \ + defined (__AVR32_UC3B0512__) || \ + defined (__AVR32_UC3B0512REVC_))) \ + ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ + ( defined (__AT32UC3B064__) || \ + defined (__AT32UC3B0128__) || \ + defined (__AT32UC3B0256__) || \ + defined (__AT32UC3B0256ES__) || \ + defined (__AT32UC3B0512__) || \ + defined (__AT32UC3B0512REVC__))) + +#define UC3B1 ( defined (__GNUC__) && \ + ( defined (__AVR32_UC3B164__) || \ + defined (__AVR32_UC3B1128__) || \ + defined (__AVR32_UC3B1256__) || \ + defined (__AVR32_UC3B1256ES__) || \ + defined (__AVR32_UC3B1512__) || \ + defined (__AVR32_UC3B1512ES__))) \ + ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ + ( defined (__AT32UC3B164__) || \ + defined (__AT32UC3B1128__) || \ + defined (__AT32UC3B1256__) || \ + defined (__AT32UC3B1256ES__) || \ + defined (__AT32UC3B1512__) || \ + defined (__AT32UC3B1512REVC__))) + +#define UC3B (UC3B0 || UC3B1 ) + +// UC3 C Series +#define UC3C0 ( defined (__GNUC__) && \ + ( defined (__AVR32_UC3C064C__) || \ + defined (__AVR32_UC3C0128C__) || \ + defined (__AVR32_UC3C0256C__) || \ + defined (__AVR32_UC3C0512CREVC__))) \ + ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ + ( defined (__AT32UC3C064C__) || \ + defined (__AT32UC3C0128C__) || \ + defined (__AT32UC3C0256C__) || \ + defined (__AT32UC3C0512C__))) + +#define UC3C1 ( defined (__GNUC__) && \ + ( defined (__AVR32_UC3C164C__) || \ + defined (__AVR32_UC3C1128C__) || \ + defined (__AVR32_UC3C1256C__) || \ + defined (__AVR32_UC3C1512CREVC__))) \ + ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ + ( defined (__AT32UC3C164C__) || \ + defined (__AT32UC3C1128C__) || \ + defined (__AT32UC3C1256C__) || \ + defined (__AT32UC3C1512C__))) + +#define UC3C2 ( defined (__GNUC__) && \ + ( defined (__AVR32_UC3C264C__) || \ + defined (__AVR32_UC3C2128C__) || \ + defined (__AVR32_UC3C2256C__) || \ + defined (__AVR32_UC3C2512CREVC__))) \ + ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ + ( defined (__AT32UC3C264C__) || \ + defined (__AT32UC3C2128C__) || \ + defined (__AT32UC3C2256C__) || \ + defined (__AT32UC3C2512C__))) + +#define UC3C (UC3C0 || UC3C1 || UC3C2) + +// UC3 L Device series +#define UC3L0 ( defined (__GNUC__) && \ + ( defined (__AVR32_UC3L016__) || \ + defined (__AVR32_UC3L032__) || \ + defined (__AVR32_UC3L064__) || \ + defined (__AVR32_UC3L064REVB__))) \ + ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ + ( defined (__AT32UC3L016__) || \ + defined (__AT32UC3L032__) || \ + defined (__AT32UC3L064__) || \ + defined (__AT32UC3L064REVB__))) + +#define UC3L1 ( defined (__GNUC__) && \ + ( defined (__AVR32_UC3L116__) || \ + defined (__AVR32_UC3L132__) || \ + defined (__AVR32_UC3L164__))) \ + ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ + ( defined (__AT32UC3L116__) || \ + defined (__AT32UC3L132__) || \ + defined (__AT32UC3L164__))) + +#define UC3L2 ( defined (__GNUC__) && \ + ( defined (__AVR32_UC3L216__) || \ + defined (__AVR32_UC3L232__) || \ + defined (__AVR32_UC3L264__))) \ + ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ + ( defined (__AT32UC3L216__) || \ + defined (__AT32UC3L232__) || \ + defined (__AT32UC3L264__))) + +#define UC3L3 ( defined (__GNUC__) && \ + ( defined (__AVR32_UC3L316__) || \ + defined (__AVR32_UC3L332__) || \ + defined (__AVR32_UC3L364__))) \ + ||((defined(__ICCAVR32__) || defined(__AAVR32__)) && \ + ( defined (__AT32UC3L316__) || \ + defined (__AT32UC3L332__) || \ + defined (__AT32UC3L364__))) + +#define UC3L (UC3L0 || UC3L1 || UC3L2 || UC3L3) + +#endif // _ARCH_H_ diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/clocks.c b/firmware/libraries/WiFi/extras/wifi_dnld/src/clocks.c new file mode 100644 index 0000000..cdd07fa --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/clocks.c @@ -0,0 +1,101 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*! \page License + * Copyright (C) 2009, H&D Wireless AB All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +#include +#include "board.h" +#include "clocks.h" +#include "pm.h" +#include "flashc.h" +#include "gpio.h" + +/** + * Initializes the MCU system clocks. + */ +void +init_sys_clocks(void) +{ + /* switch to OSC0 to speed up the booting */ + pm_switch_to_osc0(&AVR32_PM, FOSC0, OSC0_STARTUP); + +#ifndef USE_PLL + return; +#endif + + /* For audio, ee have to use OSC1 on to generate the correct clockrate + * for the SSC + */ +#if OSC == 1 + /* start oscillator1 */ + pm_enable_osc1_crystal(&AVR32_PM, FOSC1); + pm_enable_clk1(&AVR32_PM, OSC1_STARTUP); +#endif + + /* configure pll multipliers */ + pm_pll_setup(&AVR32_PM, + 0, /* pll */ + PLL_MUL, /* mul */ + 1, /* div */ + OSC, /* osc */ + 16); /* lockcount */ + + /* set PLL operating range and divider (fpll = fvco/2) + * this gives PLL output = 66 MHz (62.0928 MHz for EVK1105/OSC1) + */ + pm_pll_set_option(&AVR32_PM, + 0, /* pll */ + 1, /* pll_freq */ + 1, /* pll_div2 */ + 0); /* pll_wbwdisable. */ + + + /* start PLL0 and wait for the lock */ + pm_pll_enable(&AVR32_PM, 0); + pm_wait_for_pll0_locked(&AVR32_PM); + + /* Set all peripheral clocks torun at master clock rate */ + pm_cksel(&AVR32_PM, + 0, /* pbadiv */ + 0, /* pbasel */ + 0, /* pbbdiv */ + 0, /* pbbsel */ + 0, /* hsbdiv */ + 0); /* hsbsel */ + + /* Set one waitstate for the flash */ + flashc_set_wait_state(1); + + /* Switch to PLL0 as the master clock */ + pm_switch_to_clock(&AVR32_PM, AVR32_PM_MCCTRL_MCSEL_PLL0); + +#if OSC == 1 + pm_configure_usb_clock(); +#endif +} diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/clocks.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/clocks.h new file mode 100644 index 0000000..cceda29 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/clocks.h @@ -0,0 +1,78 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*! \page License + * Copyright (C) 2009, H&D Wireless AB All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef CLOCKS_H +#define CLOCKS_H + +#include "board.h" + + +#if BOARD == EVK1100 +# define USE_PLL +# define OSC 0 +# define PLL_MUL 10 +#elif BOARD == EVK1101 +# define USE_PLL +# define OSC 0 +# define PLL_MUL 9 +#elif BOARD == EVK1104 +# define USE_PLL +# define OSC 0 +# define PLL_MUL 9 /* for some reason we cant use 66 MHz */ +#elif BOARD == EVK1105 +# define USE_PLL +# define OSC 1 +# define PLL_MUL 10 +#elif BOARD == ARDUINO +# define USE_PLL +# define OSC 0 +# define PLL_MUL 8 +#endif + +#if OSC == 0 +# define FOSC FOSC0 /* 12 MHz */ +#else +# define FOSC FOSC1 /* 11.2896 MHz */ +#endif + +#ifdef USE_PLL +# define FMCK_HZ ((FOSC * (PLL_MUL + 1)) / 2) +#else +# define FMCK_HZ FOSC +#endif + +#define FCPU_HZ FMCK_HZ +#define FHSB_HZ FCPU_HZ +#define FPBB_HZ FMCK_HZ +#define FPBA_HZ FMCK_HZ + +void init_sys_clocks(void); + +#endif diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/flash_fw.c b/firmware/libraries/WiFi/extras/wifi_dnld/src/flash_fw.c new file mode 100644 index 0000000..75d35f6 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/flash_fw.c @@ -0,0 +1,125 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*! \page License + * Copyright (C) 2009, H&D Wireless AB All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include + +#include "printf-stdarg.h" +#include "wl_fw.h" +#include "startup.h" +#include "nor_flash.h" +#include "gpio.h" + +#define GREEN_OFF() gpio_set_gpio_pin(LED0_GPIO) +#define GREEN_ON() gpio_clr_gpio_pin(LED0_GPIO) +#define GREEN_BLINK() gpio_tgl_gpio_pin(LED0_GPIO) +#define RED_OFF() gpio_set_gpio_pin(LED1_GPIO) +#define RED_ON() gpio_clr_gpio_pin(LED1_GPIO) +#define RED_BLINK() gpio_tgl_gpio_pin(LED1_GPIO) +#define BLUE_OFF() gpio_set_gpio_pin(LED2_GPIO) +#define BLUE_ON() gpio_clr_gpio_pin(LED2_GPIO) +#define BLUE_BLINK() gpio_tgl_gpio_pin(LED2_GPIO) + + +/** + * + */ +void +led_init(void) +{ + gpio_enable_gpio_pin(LED0_GPIO); + gpio_enable_gpio_pin(LED1_GPIO); + gpio_enable_gpio_pin(LED2_GPIO); + GREEN_OFF(); + RED_OFF(); + BLUE_OFF(); +} + + +int main(void) +{ + U32 pos, len; + + startup_init(); + printk("*** HD chip firmware upgrade ver 2.7 ***\n"); + led_init(); + flash_init(); + GREEN_ON(); + if (at45dbx_mem_check() == OK) + { + printk("Memory check... [ OK ]\n"); + } + else + { + RED_ON(); + GREEN_OFF(); + printk("Memory check... [FAIL]\n"); + return 0; + } + printk("Writing firmware data to flash\n"); + pos = 0; + while (pos < fw_len) { + if (fw_len - pos > SECTOR_SIZE) + len = SECTOR_SIZE; + else + len = fw_len - pos; + + flash_write(pos, fw_buf + pos, len); + pos += len; + } + + printk("Verifying firmware data\n"); + pos = 0; + while (pos < fw_len) { + static U8 page_buf[SECTOR_SIZE]; + U32 i; + + if (fw_len - pos > SECTOR_SIZE) + len = SECTOR_SIZE; + else + len = fw_len - pos; + + flash_read(pos, page_buf, len); + + for (i = 0; i < len; i++) + if (*(page_buf + i) != *(fw_buf + pos + i)) { + RED_ON(); + GREEN_OFF(); + printk("Verify failed at byte %d, 0x%02x != 0x%02x\n", + pos + i, *(page_buf + i), *(fw_buf + pos + i)); + return 0; + } + + + pos += len; + } + GREEN_OFF(); + BLUE_ON(); + printk("Firmware successfully stored in flash!\n"); + return 0; +} diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/license.txt b/firmware/libraries/WiFi/extras/wifi_dnld/src/license.txt new file mode 100644 index 0000000..e57439f --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/license.txt @@ -0,0 +1,42 @@ + Copyright (C) 2009, H&D Wireless AB All rights reserved. + + The license to use this software in whole and in part and to + redistribute it in any form follows with the WiFi HW module from H&D + Wireless and is granted under the following restrictions: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. The name of H&D Wireless AB may not be used to endorse or promote + products derived from this software without specific prior written + permission. + + 4. The software may only be used together with hardware from H&D + Wireless all other use is prohibited. + + 5. The license to use and redistribute the software is granted + together with the purchase of a hardware platform on a one to one + basis + + 6. The binary code may not be reversed engineered or by other means + copied to circumvent this license. + + THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE ARE EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT + SHALL HD WIRELESS AB BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + OF THE POSSIBILITY OF SUCH DAMAGE. + + For more information regarding this software license Contact H&D + Wireless AB (support@hd-wireless.se). diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/nor_flash.c b/firmware/libraries/WiFi/extras/wifi_dnld/src/nor_flash.c new file mode 100644 index 0000000..0115949 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/nor_flash.c @@ -0,0 +1,99 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*! \page License + * Copyright (C) 2009, H&D Wireless AB All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include +#include "compiler.h" +#include "preprocessor.h" +#include "board.h" +#include "power_clocks_lib.h" +#include "gpio.h" +#include "spi.h" +#include "conf_at45dbx.h" +#include "at45dbx.h" +#include "clocks.h" + + +void flash_init(void) +{ + static const gpio_map_t AT45DBX_SPI_GPIO_MAP = { + { AT45DBX_SPI_SCK_PIN, AT45DBX_SPI_SCK_FUNCTION }, + { AT45DBX_SPI_MISO_PIN, AT45DBX_SPI_MISO_FUNCTION }, + { AT45DBX_SPI_MOSI_PIN, AT45DBX_SPI_MOSI_FUNCTION }, + { AT45DBX_SPI_NPCS2_PIN, AT45DBX_SPI_NPCS2_FUNCTION }, + }; + + spi_options_t spiOptions = { + .reg = AT45DBX_SPI_FIRST_NPCS, + .baudrate = AT45DBX_SPI_MASTER_SPEED, + .bits = AT45DBX_SPI_BITS, + .spck_delay = 0, + .trans_delay = 0, + .stay_act = 1, + .spi_mode = 0, + .modfdis = 1 + }; + + gpio_enable_module(AT45DBX_SPI_GPIO_MAP, + sizeof(AT45DBX_SPI_GPIO_MAP) / + sizeof(AT45DBX_SPI_GPIO_MAP[0])); + + spi_initMaster(AT45DBX_SPI, &spiOptions); + + spi_selectionMode(AT45DBX_SPI, 0, 0, 0); + spi_enable(AT45DBX_SPI); + + /* put up flash reset pin */ + gpio_set_gpio_pin(AT45DBX_CHIP_RESET); + + at45dbx_init(spiOptions, FPBA_HZ); +} + +void flash_write(U32 addr, const U8* buf, U32 len) +{ + U32 sector = addr / AT45DBX_SECTOR_SIZE; + U32 i; + Assert(addr % AT45DBX_SECTOR_SIZE == 0); + + at45dbx_write_open(sector); + for (i = 0; i < len; i++) + at45dbx_write_byte(buf[i]); + at45dbx_write_close(); +} + +void flash_read(U32 addr, U8* buf, U32 len) +{ + U32 sector = addr / AT45DBX_SECTOR_SIZE; + U32 i; + Assert(addr % AT45DBX_SECTOR_SIZE == 0); + + at45dbx_read_open(sector); + for (i = 0; i < len; i++) + buf[i] = at45dbx_read_byte(); + at45dbx_read_close(); +} diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/nor_flash.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/nor_flash.h new file mode 100644 index 0000000..52a4a20 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/nor_flash.h @@ -0,0 +1,41 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*! \page License + * Copyright (C) 2009, H&D Wireless AB All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef NOR_FLASH_H +#define NOR_FLASH_H + +#include "at45dbx.h" + +#define SECTOR_SIZE AT45DBX_SECTOR_SIZE + +void flash_init(void); +void flash_write(U32 addr, const U8* buf, U32 len); +void flash_read(U32 addr, U8* buf, U32 len); + +#endif diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/printf-stdarg.c b/firmware/libraries/WiFi/extras/wifi_dnld/src/printf-stdarg.c new file mode 100644 index 0000000..86ab88e --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/printf-stdarg.c @@ -0,0 +1,323 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/* This source file is part of the ATMEL AVR32-SoftwareFramework-AT32UC3A-1.4.0 Release */ + +/*This file has been prepared for Doxygen automatic documentation generation.*/ +/*! \file ********************************************************************* + * + * \brief sprintf functions to replace newlib for AVR32 UC3. + * + * - Compiler: IAR EWAVR32 and GNU GCC for AVR32 + * - Supported devices: All AVR32 devices can be used. + * - AppNote: + * + * \author Atmel Corporation: http://www.atmel.com \n + * Support and FAQ: http://support.atmel.no/ + * + *****************************************************************************/ + +/* Copyright (C) 2006-2008, Atmel Corporation All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of ATMEL may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY ATMEL ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + Copyright 2001, 2002 Georges Menie (www.menie.org) + stdarg version contributed by Christian Ettinger + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser 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 +*/ + +/* + putchar is the only external dependency for this file, + if you have a working putchar, leave it commented out. + If not, uncomment the define below and + replace outbyte(c) by your own function call. + +*/ + + +#include +#include + +#define putchar(c) print_dbg_char(c) + +static void printchar(char **str, int c) +{ + extern int putchar(int c); + + if (str) { + **str = c; + ++(*str); + } + else (void)putchar(c); +} + +#define PAD_RIGHT 1 +#define PAD_ZERO 2 + +static int prints(char **out, const char *string, int width, int pad) +{ + register int pc = 0, padchar = ' '; + + if (width > 0) { + register int len = 0; + register const char *ptr; + for (ptr = string; *ptr; ++ptr) ++len; + if (len >= width) width = 0; + else width -= len; + if (pad & PAD_ZERO) padchar = '0'; + } + if (!(pad & PAD_RIGHT)) { + for ( ; width > 0; --width) { + printchar (out, padchar); + ++pc; + } + } + for ( ; *string ; ++string) { + printchar (out, *string); + ++pc; + } + for ( ; width > 0; --width) { + printchar (out, padchar); + ++pc; + } + + return pc; +} + +/* the following should be enough for 32 bit int */ +#define PRINT_BUF_LEN 12 + +static int printi(char **out, int i, int b, int sg, int width, int pad, int letbase) +{ + char print_buf[PRINT_BUF_LEN]; + register char *s; + register int t, neg = 0, pc = 0; + register unsigned int u = i; + + if (i == 0) { + print_buf[0] = '0'; + print_buf[1] = '\0'; + return prints (out, print_buf, width, pad); + } + + if (sg && b == 10 && i < 0) { + neg = 1; + u = -i; + } + + s = print_buf + PRINT_BUF_LEN-1; + *s = '\0'; + + while (u) { + t = u % b; + if( t >= 10 ) + t += letbase - '0' - 10; + *--s = t + '0'; + u /= b; + } + + if (neg) { + if( width && (pad & PAD_ZERO) ) { + printchar (out, '-'); + ++pc; + --width; + } + else { + *--s = '-'; + } + } + + return pc + prints (out, s, width, pad); +} + +int fprintf(__FILE *stream, const char *format, ...) +{ +return 0; +} +int printk_va(char **out, const char *format, va_list args ) +{ + register int width, pad; + register int pc = 0; + char scr[2]; + + for (; *format != 0; ++format) { + if (*format == '%') { + ++format; + width = pad = 0; + if (*format == '\0') break; + if (*format == '%') goto out; + if (*format == '-') { + ++format; + pad = PAD_RIGHT; + } + while (*format == '0') { + ++format; + pad |= PAD_ZERO; + } + for ( ; *format >= '0' && *format <= '9'; ++format) { + width *= 10; + width += *format - '0'; + } + if( *format == 's' ) { + register char *s = (char *)va_arg( args, int ); + pc += prints (out, s?s:"(null)", width, pad); + continue; + } + if( *format == 'd' ) { + pc += printi (out, va_arg( args, int ), 10, 1, width, pad, 'a'); + continue; + } + if( *format == 'p' ) { + pad = 8; + pc += printi (out, va_arg( args, int ), 16, 0, width, pad, 'a'); + continue; + } + if( *format == 'x' ) { + pc += printi (out, va_arg( args, int ), 16, 0, width, pad, 'a'); + continue; + } + if( *format == 'X' ) { + pc += printi (out, va_arg( args, int ), 16, 0, width, pad, 'A'); + continue; + } + if( *format == 'u' ) { + pc += printi (out, va_arg( args, int ), 10, 0, width, pad, 'a'); + continue; + } + if( *format == 'c' ) { + /* char are converted to int then pushed on the stack */ + scr[0] = (char)va_arg( args, int ); + scr[1] = '\0'; + pc += prints (out, scr, width, pad); + continue; + } + } + else { + out: + printchar (out, *format); + ++pc; + } + } + if (out) **out = '\0'; + va_end( args ); + return pc; +} + +int printk(const char *format, ...) +{ + va_list args; + + va_start( args, format ); + return printk_va( 0, format, args ); +} + +int sprintf(char *out, const char *format, ...) +{ + va_list args; + + va_start( args, format ); + return printk_va( &out, format, args ); +} + +#ifdef TEST_PRINTF +int main(void) +{ + char *ptr = "Hello world!"; + char *np = 0; + int i = 5; + unsigned int bs = sizeof(int)*8; + int mi; + char buf[80]; + + mi = (1 << (bs-1)) + 1; + printf("%s\n", ptr); + printf("printf test\n"); + printf("%s is null pointer\n", np); + printf("%d = 5\n", i); + printf("%d = - max int\n", mi); + printf("char %c = 'a'\n", 'a'); + printf("hex %x = ff\n", 0xff); + printf("hex %02x = 00\n", 0); + printf("signed %d = unsigned %u = hex %x\n", -3, -3, -3); + printf("%d %s(s)%", 0, "message"); + printf("\n"); + printf("%d %s(s) with %%\n", 0, "message"); + sprintf(buf, "justif: \"%-10s\"\n", "left"); printf("%s", buf); + sprintf(buf, "justif: \"%10s\"\n", "right"); printf("%s", buf); + sprintf(buf, " 3: %04d zero padded\n", 3); printf("%s", buf); + sprintf(buf, " 3: %-4d left justif.\n", 3); printf("%s", buf); + sprintf(buf, " 3: %4d right justif.\n", 3); printf("%s", buf); + sprintf(buf, "-3: %04d zero padded\n", -3); printf("%s", buf); + sprintf(buf, "-3: %-4d left justif.\n", -3); printf("%s", buf); + sprintf(buf, "-3: %4d right justif.\n", -3); printf("%s", buf); + + return 0; +} + +/* + * if you compile this file with + * gcc -Wall $(YOUR_C_OPTIONS) -DTEST_PRINTF -c printf.c + * you will get a normal warning: + * printf.c:214: warning: spurious trailing `%' in format + * this line is testing an invalid % at the end of the format string. + * + * this should display (on 32bit int machine) : + * + * Hello world! + * printf test + * (null) is null pointer + * 5 = 5 + * -2147483647 = - max int + * char a = 'a' + * hex ff = ff + * hex 00 = 00 + * signed -3 = unsigned 4294967293 = hex fffffffd + * 0 message(s) + * 0 message(s) with % + * justif: "left " + * justif: " right" + * 3: 0003 zero padded + * 3: 3 left justif. + * 3: 3 right justif. + * -3: -003 zero padded + * -3: -3 left justif. + * -3: -3 right justif. + */ + +#endif diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/printf-stdarg.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/printf-stdarg.h new file mode 100644 index 0000000..f6bd664 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/printf-stdarg.h @@ -0,0 +1,36 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*! \page License + * Copyright (C) 2009, H&D Wireless AB All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef PRINTF_STDARG_H +#define PRINTF_STDARG_H +#include + +int printk(const char *format, ...); +int printk_va(char **out, const char *format, va_list args ); +#endif diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/startup.c b/firmware/libraries/WiFi/extras/wifi_dnld/src/startup.c new file mode 100644 index 0000000..fa2a8c0 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/startup.c @@ -0,0 +1,75 @@ +/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*! \page License + * Copyright (C) 2009, H&D Wireless AB All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "startup.h" +#include "pm.h" +#include "intc.h" +#include "board.h" +#include "print_funcs.h" +#include "clocks.h" + + +static void init_exceptions(void) +{ + extern void _evba; + Set_system_register(AVR32_EVBA, (int)&_evba); + Enable_global_exception(); +} + +static void init_hmatrix(void) +{ + union { + unsigned long scfg; + avr32_hmatrix_scfg_t SCFG; + } u_avr32_hmatrix_scfg = { + AVR32_HMATRIX.scfg[AVR32_HMATRIX_SLAVE_FLASH] + }; + u_avr32_hmatrix_scfg.SCFG.defmstr_type = + AVR32_HMATRIX_DEFMSTR_TYPE_LAST_DEFAULT; + AVR32_HMATRIX.scfg[AVR32_HMATRIX_SLAVE_FLASH] = + u_avr32_hmatrix_scfg.scfg; +} + +static void init_interrupts(void) +{ + INTC_init_interrupts(); + + //initExtInt(); + + Enable_global_interrupt(); +} + +void startup_init(void) +{ + init_exceptions(); + init_hmatrix(); + init_sys_clocks(); + init_interrupts(); + init_dbg_rs232(FPBA_HZ); +} diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/startup.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/startup.h new file mode 100644 index 0000000..a9adc60 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/startup.h @@ -0,0 +1,35 @@ +/* This header file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */ + +/*! \page License + * Copyright (C) 2009, H&D Wireless AB All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND + * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef STARTUP_H +#define STARTUP_H + +void startup_init(void); + +#endif diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/src/wl_fw.h b/firmware/libraries/WiFi/extras/wifi_dnld/src/wl_fw.h new file mode 100644 index 0000000..5be5f37 --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/src/wl_fw.h @@ -0,0 +1,19287 @@ +/* + * Programming interface for wl_api. + * Copyright (C) 2010 HD Wireless AB + * + * You should have received a copy of the license along with this library. + */ + +#ifndef WITHOUT_STDINT +#include +#endif +const uint8_t fw_buf[154188] = { + 0x10, 0x61, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x00, 0x00, 0x00, 0x10, 0x61, 0x04, 0x00, + 0x38, 0x61, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x20, 0x61, 0x04, 0x00, + 0x30, 0x61, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x30, 0x61, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x61, 0x04, 0x00, + 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0xee, 0xee, + 0xee, 0xee, 0x18, 0xf0, 0x9f, 0xe5, 0x18, 0xf0, + 0x9f, 0xe5, 0x18, 0xf0, 0x9f, 0xe5, 0x18, 0xf0, + 0x9f, 0xe5, 0x00, 0x00, 0xa0, 0xe1, 0x18, 0xf0, + 0x9f, 0xe5, 0x18, 0xf0, 0x9f, 0xe5, 0x44, 0x00, + 0x00, 0x00, 0xb4, 0x08, 0x00, 0x00, 0xb4, 0x08, + 0x00, 0x00, 0xb4, 0x08, 0x00, 0x00, 0xb4, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x08, + 0x00, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x00, 0x00, + 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0f, 0xe1, 0x1f, 0x00, 0xc0, 0xe3, + 0x13, 0x00, 0x80, 0xe3, 0xc0, 0x00, 0x80, 0xe3, + 0x00, 0xf0, 0x2f, 0xe1, 0x1c, 0xf0, 0x9f, 0xe5, + 0x3d, 0x02, 0x00, 0xeb, 0x5a, 0x02, 0x00, 0xeb, + 0x8d, 0x02, 0x00, 0xeb, 0x01, 0x00, 0x8f, 0xe2, + 0x10, 0xff, 0x2f, 0xe1, 0x41, 0xf0, 0xde, 0xfb, + 0x01, 0xf0, 0xdc, 0xfd, 0x3c, 0x00, 0x78, 0x00, + 0x00, 0x00, 0xfe, 0xe7, 0x00, 0x00, 0x5c, 0x00, + 0x00, 0x00, 0x78, 0x47, 0xc0, 0x46, 0x01, 0x00, + 0x00, 0xea, 0x78, 0x47, 0xc0, 0x46, 0x17, 0x00, + 0x00, 0xea, 0x8c, 0x11, 0x9f, 0xe5, 0x00, 0x20, + 0x91, 0xe5, 0x00, 0x30, 0x0f, 0xe1, 0x84, 0x11, + 0x9f, 0xe5, 0xfd, 0x20, 0xa1, 0xe8, 0x80, 0x01, + 0x9f, 0xe5, 0x80, 0x21, 0x9f, 0xe5, 0x01, 0x20, + 0x42, 0xe0, 0x0d, 0x00, 0x40, 0xe0, 0x3c, 0x00, + 0xb4, 0x00, 0x00, 0x00, 0x02, 0x00, 0x50, 0xe1, + 0x28, 0x00, 0x00, 0xaa, 0x68, 0x01, 0x9f, 0xe5, + 0x0d, 0x00, 0x50, 0xe1, 0x02, 0x00, 0x00, 0xba, + 0x04, 0x20, 0x10, 0xe4, 0x04, 0x20, 0x81, 0xe4, + 0xfa, 0xff, 0xff, 0xea, 0x58, 0x11, 0x9f, 0xe5, + 0x58, 0x01, 0x9f, 0xe5, 0x00, 0x00, 0x81, 0xe5, + 0x3c, 0x11, 0x9f, 0xe5, 0x50, 0x01, 0x9f, 0xe5, + 0x00, 0x00, 0x81, 0xe5, 0x1e, 0xff, 0x2f, 0xe1, + 0x3c, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x48, 0x11, + 0x9f, 0xe5, 0x00, 0x00, 0x91, 0xe5, 0x24, 0x11, + 0x9f, 0xe5, 0x00, 0x00, 0x81, 0xe5, 0x2c, 0x11, + 0x9f, 0xe5, 0x38, 0x01, 0x9f, 0xe5, 0x00, 0x00, + 0x81, 0xe5, 0x1e, 0xff, 0x2f, 0xe1, 0x74, 0x02, + 0x00, 0xeb, 0x10, 0x01, 0x9f, 0xe5, 0x28, 0x11, + 0x9f, 0xe5, 0x04, 0x20, 0x91, 0xe4, 0x04, 0x20, + 0x00, 0xe4, 0x04, 0x21, 0x9f, 0xe5, 0x02, 0x00, + 0x51, 0xe1, 0x3c, 0x00, 0x2c, 0x01, 0x00, 0x00, + 0xfa, 0xff, 0xff, 0x1a, 0xf0, 0x10, 0x9f, 0xe5, + 0xfd, 0x20, 0xb1, 0xe8, 0x03, 0xf0, 0x2f, 0xe1, + 0xe0, 0x10, 0x9f, 0xe5, 0x00, 0x20, 0x81, 0xe5, + 0xe8, 0x10, 0x9f, 0xe5, 0xf4, 0x20, 0x9f, 0xe5, + 0x00, 0x20, 0x81, 0xe5, 0x02, 0x10, 0x80, 0xe2, + 0x00, 0x00, 0x20, 0xe0, 0x01, 0x00, 0x40, 0xe2, + 0x11, 0xff, 0x2f, 0xe1, 0x01, 0x00, 0x8f, 0xe2, + 0x10, 0xff, 0x2f, 0xe1, 0x3c, 0x00, 0x68, 0x01, + 0x00, 0x00, 0x01, 0xf0, 0x9c, 0xf8, 0x78, 0x47, + 0x00, 0x00, 0x01, 0x00, 0x8f, 0xe2, 0x10, 0xff, + 0x2f, 0xe1, 0x01, 0xf0, 0x94, 0xf8, 0x78, 0x47, + 0x00, 0x00, 0x03, 0x00, 0x2d, 0xe9, 0x00, 0x10, + 0x0f, 0xe1, 0x00, 0x10, 0x80, 0xe5, 0xb8, 0x10, + 0x9f, 0xe5, 0x04, 0x10, 0x80, 0xe5, 0x00, 0x10, + 0xa0, 0xe1, 0x10, 0x00, 0x80, 0xe2, 0xfc, 0x1f, + 0xa0, 0xe8, 0x00, 0x20, 0xa0, 0xe1, 0x3c, 0x00, + 0xa4, 0x01, 0x00, 0x00, 0x01, 0x30, 0xa0, 0xe1, + 0x03, 0x00, 0xbd, 0xe8, 0x08, 0x00, 0x83, 0xe5, + 0x0c, 0x10, 0x83, 0xe5, 0xd3, 0x00, 0xa0, 0xe3, + 0x00, 0xf0, 0x21, 0xe1, 0x00, 0x60, 0xa2, 0xe8, + 0x00, 0x10, 0x4f, 0xe1, 0x04, 0x10, 0x82, 0xe4, + 0xd2, 0x00, 0xa0, 0xe3, 0x00, 0xf0, 0x21, 0xe1, + 0x00, 0x60, 0xa2, 0xe8, 0x00, 0x10, 0x4f, 0xe1, + 0x04, 0x10, 0x82, 0xe4, 0xd1, 0x00, 0xa0, 0xe3, + 0x3c, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, 0xf0, + 0x21, 0xe1, 0x00, 0x7f, 0xa2, 0xe8, 0x00, 0x10, + 0x4f, 0xe1, 0x04, 0x10, 0x82, 0xe4, 0xd7, 0x00, + 0xa0, 0xe3, 0x00, 0xf0, 0x21, 0xe1, 0x00, 0x60, + 0xa2, 0xe8, 0x00, 0x10, 0x4f, 0xe1, 0x04, 0x10, + 0x82, 0xe4, 0xdb, 0x00, 0xa0, 0xe3, 0x00, 0xf0, + 0x21, 0xe1, 0x00, 0x60, 0xa2, 0xe8, 0x00, 0x10, + 0x4f, 0xe1, 0x00, 0x10, 0x82, 0xe5, 0x00, 0x00, + 0x93, 0xe5, 0x3c, 0x00, 0x1c, 0x02, 0x00, 0x00, + 0x00, 0xf0, 0x2f, 0xe1, 0x1e, 0xff, 0x2f, 0xe1, + 0x20, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x00, + 0x20, 0xee, 0x01, 0x00, 0xd8, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x18, 0xf0, 0x9f, 0xe5, + 0x10, 0x01, 0x00, 0x00, 0x08, 0x03, 0x00, 0x00, + 0xee, 0xee, 0xee, 0xee, 0x24, 0x03, 0x00, 0x00, + 0x20, 0x02, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, + 0x63, 0x1c, 0x0b, 0x4d, 0x3c, 0x00, 0x58, 0x02, + 0x00, 0x00, 0x01, 0xd1, 0x6c, 0x69, 0x10, 0xe0, + 0x00, 0xf0, 0x6c, 0xfb, 0x09, 0x48, 0xff, 0xf7, + 0x0c, 0xff, 0xec, 0x60, 0x08, 0x4a, 0x51, 0x68, + 0x50, 0x68, 0x88, 0x42, 0xfc, 0xd0, 0x02, 0x20, + 0x28, 0x70, 0x01, 0x21, 0x8a, 0x20, 0x01, 0xf0, + 0x12, 0xf8, 0x20, 0x1c, 0xb0, 0xbd, 0x30, 0x00, + 0x07, 0x00, 0x51, 0x02, 0x00, 0x00, 0x00, 0x03, + 0x07, 0x00, 0xb0, 0xb5, 0x05, 0x1c, 0x3c, 0x00, + 0x94, 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0xf0, + 0x50, 0xfb, 0x14, 0x48, 0xff, 0xf7, 0xf0, 0xfe, + 0x13, 0x49, 0x14, 0x48, 0xc1, 0x60, 0x01, 0x21, + 0x13, 0x4a, 0x49, 0x03, 0x91, 0x60, 0x13, 0x49, + 0xca, 0x78, 0x08, 0x23, 0x9a, 0x43, 0xca, 0x70, + 0xca, 0x78, 0x04, 0x23, 0x1a, 0x43, 0xca, 0x70, + 0x6b, 0x1c, 0x0d, 0xd0, 0x0e, 0x4b, 0x5a, 0x68, + 0x59, 0x68, 0x91, 0x42, 0xfc, 0xd0, 0xbe, 0x21, + 0x3c, 0x00, 0xd0, 0x02, 0x00, 0x00, 0x19, 0x73, + 0x19, 0x7a, 0x11, 0x22, 0x91, 0x43, 0x19, 0x72, + 0x19, 0x7a, 0xc9, 0x07, 0xfc, 0xd4, 0x02, 0x21, + 0x01, 0x70, 0xff, 0xf7, 0xd0, 0xfe, 0x20, 0x1c, + 0xb0, 0xbd, 0x91, 0x02, 0x00, 0x00, 0xff, 0xff, + 0xff, 0x00, 0x30, 0x00, 0x07, 0x00, 0x00, 0x10, + 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x03, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x0c, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x84, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, + 0x08, 0x47, 0x10, 0x47, 0x18, 0x47, 0x20, 0x47, + 0x28, 0x47, 0x30, 0x47, 0x38, 0x47, 0x10, 0xb5, + 0x04, 0x1c, 0x10, 0x1c, 0x00, 0xf0, 0x23, 0xf9, + 0x03, 0xc4, 0x10, 0xbc, 0x08, 0xbc, 0x18, 0x47, + 0x00, 0x00, 0x3c, 0x00, 0xfc, 0x03, 0x00, 0x00, + 0x10, 0xb4, 0x04, 0x2a, 0x0e, 0xd3, 0x03, 0x1c, + 0x0b, 0x43, 0x9b, 0x07, 0x0a, 0xd1, 0x08, 0xc8, + 0x10, 0xc9, 0xa3, 0x42, 0x02, 0xd1, 0x04, 0x3a, + 0x04, 0x2a, 0xf8, 0xd2, 0xa3, 0x42, 0x01, 0xd0, + 0x04, 0x38, 0x04, 0x39, 0x00, 0x2a, 0x02, 0xd1, + 0x00, 0x20, 0x10, 0xbc, 0x70, 0x47, 0xd3, 0x07, + 0x01, 0xd5, 0x01, 0x32, 0x05, 0xe0, 0x03, 0x78, + 0x0c, 0x78, 0x01, 0x31, 0x3c, 0x00, 0x38, 0x04, + 0x00, 0x00, 0x01, 0x30, 0xa3, 0x42, 0x07, 0xd1, + 0x03, 0x78, 0x0c, 0x78, 0x01, 0x31, 0x01, 0x30, + 0xa3, 0x42, 0x01, 0xd1, 0x02, 0x3a, 0xf1, 0xd1, + 0x18, 0x1b, 0xe9, 0xe7, 0x00, 0x00, 0x78, 0x47, + 0x00, 0x00, 0x00, 0x20, 0xa0, 0xe3, 0x04, 0x00, + 0x51, 0xe3, 0x08, 0x00, 0x00, 0x3a, 0x03, 0xc0, + 0x10, 0xe2, 0x0d, 0x00, 0x00, 0x0a, 0x04, 0xc0, + 0x6c, 0xe2, 0x02, 0x00, 0x5c, 0xe3, 0x3c, 0x00, + 0x74, 0x04, 0x00, 0x00, 0x01, 0x20, 0xc0, 0xe4, + 0x01, 0x20, 0xc0, 0xa4, 0x01, 0x20, 0xc0, 0xc4, + 0x0c, 0x10, 0x41, 0xe0, 0x06, 0x00, 0x00, 0xea, + 0x81, 0xcf, 0xb0, 0xe1, 0x01, 0x20, 0xc0, 0x24, + 0x01, 0x20, 0xc0, 0x24, 0x01, 0x20, 0xc0, 0x44, + 0x1e, 0xff, 0x2f, 0xe1, 0x78, 0x47, 0x00, 0x00, + 0x00, 0x20, 0xa0, 0xe3, 0x00, 0x40, 0x2d, 0xe9, + 0x02, 0x30, 0xa0, 0xe1, 0x02, 0xc0, 0xa0, 0xe1, + 0x3c, 0x00, 0xb0, 0x04, 0x00, 0x00, 0x02, 0xe0, + 0xa0, 0xe1, 0x20, 0x10, 0x51, 0xe2, 0x0c, 0x50, + 0xa0, 0x28, 0x0c, 0x50, 0xa0, 0x28, 0x20, 0x10, + 0x51, 0x22, 0xfb, 0xff, 0xff, 0x2a, 0x01, 0x1e, + 0xb0, 0xe1, 0x0c, 0x50, 0xa0, 0x28, 0x0c, 0x00, + 0xa0, 0x48, 0x00, 0x40, 0xbd, 0xe8, 0x01, 0x11, + 0xb0, 0xe1, 0x04, 0x20, 0x80, 0x24, 0x1e, 0xff, + 0x2f, 0x01, 0x01, 0x20, 0xc0, 0x44, 0x01, 0x20, + 0xc0, 0x44, 0x3c, 0x00, 0xec, 0x04, 0x00, 0x00, + 0x40, 0x04, 0x11, 0xe3, 0x01, 0x20, 0xc0, 0x14, + 0x1e, 0xff, 0x2f, 0xe1, 0x78, 0x47, 0x00, 0x00, + 0x03, 0x00, 0x52, 0xe3, 0x3e, 0x00, 0x00, 0x9a, + 0x03, 0xc0, 0x10, 0xe2, 0x08, 0x00, 0x00, 0x0a, + 0x01, 0x30, 0xd1, 0xe4, 0x02, 0x00, 0x5c, 0xe3, + 0x0c, 0x20, 0x82, 0xe0, 0x01, 0xc0, 0xd1, 0x94, + 0x01, 0x30, 0xc0, 0xe4, 0x01, 0x30, 0xd1, 0x34, + 0x04, 0x20, 0x42, 0xe2, 0x3c, 0x00, 0x28, 0x05, + 0x00, 0x00, 0x01, 0xc0, 0xc0, 0x94, 0x01, 0x30, + 0xc0, 0x34, 0x03, 0x30, 0x11, 0xe2, 0x1e, 0x00, + 0x00, 0x0a, 0x04, 0x20, 0x52, 0xe2, 0x2f, 0x00, + 0x00, 0x3a, 0x03, 0xc0, 0x31, 0xe7, 0x02, 0x00, + 0x53, 0xe3, 0x08, 0x00, 0x00, 0x0a, 0x0f, 0x00, + 0x00, 0x8a, 0x2c, 0x34, 0xa0, 0xe1, 0x04, 0xc0, + 0xb1, 0xe5, 0x04, 0x20, 0x52, 0xe2, 0x0c, 0x3c, + 0x83, 0xe1, 0x04, 0x30, 0x80, 0xe4, 0x3c, 0x00, + 0x64, 0x05, 0x00, 0x00, 0xf9, 0xff, 0xff, 0x2a, + 0x01, 0x10, 0x81, 0xe2, 0x23, 0x00, 0x00, 0xea, + 0x2c, 0x38, 0xa0, 0xe1, 0x04, 0xc0, 0xb1, 0xe5, + 0x04, 0x20, 0x52, 0xe2, 0x0c, 0x38, 0x83, 0xe1, + 0x04, 0x30, 0x80, 0xe4, 0xf9, 0xff, 0xff, 0x2a, + 0x02, 0x10, 0x81, 0xe2, 0x1b, 0x00, 0x00, 0xea, + 0x2c, 0x3c, 0xa0, 0xe1, 0x04, 0xc0, 0xb1, 0xe5, + 0x04, 0x20, 0x52, 0xe2, 0x0c, 0x34, 0x83, 0xe1, + 0x3c, 0x00, 0xa0, 0x05, 0x00, 0x00, 0x04, 0x30, + 0x80, 0xe4, 0xf9, 0xff, 0xff, 0x2a, 0x03, 0x10, + 0x81, 0xe2, 0x13, 0x00, 0x00, 0xea, 0x78, 0x47, + 0x00, 0x00, 0x10, 0x40, 0x2d, 0xe9, 0x20, 0x20, + 0x52, 0xe2, 0x05, 0x00, 0x00, 0x3a, 0x18, 0x50, + 0xb1, 0x28, 0x18, 0x50, 0xa0, 0x28, 0x18, 0x50, + 0xb1, 0x28, 0x18, 0x50, 0xa0, 0x28, 0x20, 0x20, + 0x52, 0x22, 0xf9, 0xff, 0xff, 0x2a, 0x02, 0xce, + 0xb0, 0xe1, 0x3c, 0x00, 0xdc, 0x05, 0x00, 0x00, + 0x18, 0x50, 0xb1, 0x28, 0x18, 0x50, 0xa0, 0x28, + 0x18, 0x00, 0xb1, 0x48, 0x18, 0x00, 0xa0, 0x48, + 0x10, 0x40, 0xbd, 0xe8, 0x02, 0xcf, 0xb0, 0xe1, + 0x04, 0x30, 0x91, 0x24, 0x04, 0x30, 0x80, 0x24, + 0x1e, 0xff, 0x2f, 0x01, 0x82, 0x2f, 0xb0, 0xe1, + 0x01, 0x20, 0xd1, 0x44, 0x01, 0x30, 0xd1, 0x24, + 0x01, 0xc0, 0xd1, 0x24, 0x01, 0x20, 0xc0, 0x44, + 0x01, 0x30, 0xc0, 0x24, 0x3c, 0x00, 0x18, 0x06, + 0x00, 0x00, 0x01, 0xc0, 0xc0, 0x24, 0x1e, 0xff, + 0x2f, 0xe1, 0x78, 0x47, 0x00, 0x00, 0xff, 0x30, + 0x01, 0xe2, 0x02, 0x10, 0xa0, 0xe1, 0x03, 0x24, + 0x83, 0xe1, 0x02, 0x28, 0x82, 0xe1, 0x88, 0xff, + 0xff, 0xea, 0x78, 0x47, 0x00, 0x00, 0x80, 0x24, + 0x10, 0xe2, 0x00, 0x00, 0x60, 0x42, 0x41, 0x30, + 0x32, 0xe0, 0x00, 0x10, 0x61, 0x22, 0xa1, 0xc1, + 0x70, 0xe0, 0x20, 0x00, 0x00, 0x3a, 0x3c, 0x00, + 0x54, 0x06, 0x00, 0x00, 0x21, 0xc4, 0x70, 0xe0, + 0x0f, 0x00, 0x00, 0x3a, 0x00, 0x04, 0xa0, 0xe1, + 0xff, 0x24, 0x82, 0xe3, 0x21, 0xc2, 0x70, 0xe0, + 0x17, 0x00, 0x00, 0x3a, 0x21, 0xc4, 0x70, 0xe0, + 0x09, 0x00, 0x00, 0x3a, 0x00, 0x04, 0xa0, 0xe1, + 0xff, 0x28, 0x82, 0xe3, 0x21, 0xc4, 0x70, 0xe0, + 0x00, 0x04, 0xa0, 0x21, 0xff, 0x2c, 0x82, 0x23, + 0x21, 0xc2, 0x70, 0xe0, 0x0e, 0x00, 0x00, 0x3a, + 0x3c, 0x00, 0x90, 0x06, 0x00, 0x00, 0x00, 0xc0, + 0x70, 0xe2, 0x83, 0x00, 0x00, 0x2a, 0x20, 0x04, + 0xa0, 0x21, 0xa1, 0xc3, 0x70, 0xe0, 0x80, 0x13, + 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0x21, 0xc3, + 0x70, 0xe0, 0x00, 0x13, 0x41, 0x20, 0x02, 0x20, + 0xa2, 0xe0, 0xa1, 0xc2, 0x70, 0xe0, 0x80, 0x12, + 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0x21, 0xc2, + 0x70, 0xe0, 0x00, 0x12, 0x41, 0x20, 0x02, 0x20, + 0xa2, 0xe0, 0x3c, 0x00, 0xcc, 0x06, 0x00, 0x00, + 0xa1, 0xc1, 0x70, 0xe0, 0x80, 0x11, 0x41, 0x20, + 0x02, 0x20, 0xa2, 0xe0, 0x21, 0xc1, 0x70, 0xe0, + 0x00, 0x11, 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, + 0xa1, 0xc0, 0x70, 0xe0, 0x80, 0x10, 0x41, 0x20, + 0x02, 0x20, 0xa2, 0xe0, 0x01, 0xc0, 0x70, 0xe0, + 0x00, 0x10, 0x41, 0x20, 0x02, 0x20, 0xb2, 0xe0, + 0xe5, 0xff, 0xff, 0x2a, 0xc3, 0x0f, 0x32, 0xe0, + 0xa3, 0x0f, 0x80, 0xe0, 0x3c, 0x00, 0x08, 0x07, + 0x00, 0x00, 0x00, 0x10, 0x61, 0x22, 0x1e, 0xff, + 0x2f, 0xe1, 0x78, 0x47, 0x00, 0x00, 0x00, 0x20, + 0xa0, 0xe3, 0xa1, 0xc1, 0x70, 0xe0, 0x20, 0x00, + 0x00, 0x3a, 0x21, 0xc4, 0x70, 0xe0, 0x0f, 0x00, + 0x00, 0x3a, 0x00, 0x04, 0xa0, 0xe1, 0xff, 0x24, + 0x82, 0xe3, 0x21, 0xc2, 0x70, 0xe0, 0x17, 0x00, + 0x00, 0x3a, 0x21, 0xc4, 0x70, 0xe0, 0x09, 0x00, + 0x00, 0x3a, 0x00, 0x04, 0xa0, 0xe1, 0x3c, 0x00, + 0x44, 0x07, 0x00, 0x00, 0xff, 0x28, 0x82, 0xe3, + 0x21, 0xc4, 0x70, 0xe0, 0x00, 0x04, 0xa0, 0x21, + 0xff, 0x2c, 0x82, 0x23, 0x21, 0xc2, 0x70, 0xe0, + 0x0e, 0x00, 0x00, 0x3a, 0x00, 0xc0, 0x70, 0xe2, + 0x50, 0x00, 0x00, 0x2a, 0x20, 0x04, 0xa0, 0x21, + 0xa1, 0xc3, 0x70, 0xe0, 0x80, 0x13, 0x41, 0x20, + 0x02, 0x20, 0xa2, 0xe0, 0x21, 0xc3, 0x70, 0xe0, + 0x00, 0x13, 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, + 0x3c, 0x00, 0x80, 0x07, 0x00, 0x00, 0xa1, 0xc2, + 0x70, 0xe0, 0x80, 0x12, 0x41, 0x20, 0x02, 0x20, + 0xa2, 0xe0, 0x21, 0xc2, 0x70, 0xe0, 0x00, 0x12, + 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0xa1, 0xc1, + 0x70, 0xe0, 0x80, 0x11, 0x41, 0x20, 0x02, 0x20, + 0xa2, 0xe0, 0x21, 0xc1, 0x70, 0xe0, 0x00, 0x11, + 0x41, 0x20, 0x02, 0x20, 0xa2, 0xe0, 0xa1, 0xc0, + 0x70, 0xe0, 0x80, 0x10, 0x41, 0x20, 0x02, 0x20, + 0xa2, 0xe0, 0x3c, 0x00, 0xbc, 0x07, 0x00, 0x00, + 0x01, 0xc0, 0x70, 0xe0, 0x00, 0x10, 0x41, 0x20, + 0x02, 0x20, 0xb2, 0xe0, 0xe5, 0xff, 0xff, 0x2a, + 0x02, 0x00, 0xa0, 0xe1, 0x1e, 0xff, 0x2f, 0xe1, + 0x78, 0x47, 0x00, 0x00, 0x0a, 0x10, 0x40, 0xe2, + 0x20, 0x01, 0x40, 0xe0, 0x20, 0x02, 0x80, 0xe0, + 0x20, 0x04, 0x80, 0xe0, 0x20, 0x08, 0x80, 0xe0, + 0xa0, 0x01, 0xa0, 0xe1, 0x00, 0x21, 0x80, 0xe0, + 0x82, 0x10, 0x51, 0xe0, 0x3c, 0x00, 0xf8, 0x07, + 0x00, 0x00, 0x01, 0x00, 0x80, 0x52, 0x0a, 0x10, + 0x81, 0x42, 0x1e, 0xff, 0x2f, 0xe1, 0x30, 0xb4, + 0x44, 0x1c, 0x81, 0x07, 0x08, 0xd0, 0x01, 0x78, + 0x01, 0x30, 0x00, 0x29, 0x02, 0xd1, 0x00, 0x1b, + 0x30, 0xbc, 0x70, 0x47, 0x81, 0x07, 0xf6, 0xd1, + 0x0b, 0x4a, 0xd5, 0x01, 0x02, 0xc8, 0x8b, 0x1a, + 0x8b, 0x43, 0x2b, 0x40, 0xfa, 0xd0, 0x00, 0x1b, + 0x0a, 0x06, 0x01, 0xd1, 0x03, 0x38, 0x3c, 0x00, + 0x34, 0x08, 0x00, 0x00, 0xef, 0xe7, 0x0a, 0x04, + 0x12, 0x0e, 0x01, 0xd1, 0x02, 0x38, 0xea, 0xe7, + 0x09, 0x02, 0x09, 0x0e, 0xe7, 0xd1, 0x01, 0x38, + 0xe5, 0xe7, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, + 0xf0, 0xb4, 0x03, 0x1c, 0x04, 0x1c, 0x0c, 0x43, + 0xa4, 0x07, 0x0c, 0xd1, 0x10, 0x4d, 0xef, 0x01, + 0x02, 0xe0, 0x04, 0x31, 0x04, 0x3a, 0x10, 0xc3, + 0x04, 0x2a, 0x04, 0xd3, 0x0c, 0x68, 0x66, 0x1b, + 0x3c, 0x00, 0x70, 0x08, 0x00, 0x00, 0xa6, 0x43, + 0x3e, 0x40, 0xf5, 0xd0, 0x00, 0x2a, 0x07, 0xd0, + 0x0c, 0x78, 0x01, 0x31, 0x1c, 0x70, 0x01, 0x33, + 0x00, 0x2c, 0x03, 0xd0, 0x01, 0x3a, 0xf7, 0xd1, + 0xf0, 0xbc, 0x70, 0x47, 0x01, 0x2a, 0xfb, 0xd9, + 0x51, 0x1e, 0x00, 0x22, 0x1a, 0x70, 0x01, 0x33, + 0x01, 0x39, 0xfb, 0xd1, 0xf4, 0xe7, 0x01, 0x01, + 0x01, 0x01, 0x78, 0x47, 0x00, 0x00, 0x02, 0x00, + 0xa0, 0xe3, 0x3c, 0x00, 0xac, 0x08, 0x00, 0x00, + 0x02, 0x10, 0xa0, 0xe3, 0x2e, 0xfe, 0xff, 0xea, + 0x1f, 0x40, 0x2d, 0xe9, 0x00, 0x00, 0x0f, 0xe1, + 0xc0, 0x00, 0x80, 0xe3, 0x00, 0xf0, 0x2f, 0xe1, + 0x81, 0x00, 0xa0, 0xe3, 0x02, 0x10, 0xa0, 0xe3, + 0x01, 0x20, 0x8f, 0xe2, 0x12, 0xff, 0x2f, 0xe1, + 0x00, 0xf0, 0xe6, 0xfc, 0x78, 0x47, 0x00, 0x00, + 0x1f, 0x40, 0xbd, 0xe8, 0xfe, 0xff, 0xff, 0xea, + 0x1f, 0x50, 0x2d, 0xe9, 0x3c, 0x00, 0xe8, 0x08, + 0x00, 0x00, 0x01, 0x00, 0x8f, 0xe2, 0x10, 0xff, + 0x2f, 0xe1, 0x00, 0xf0, 0x40, 0xfb, 0x78, 0x47, + 0x00, 0x00, 0x1f, 0x50, 0xbd, 0xe8, 0x04, 0xf0, + 0x5e, 0xe2, 0x1f, 0x50, 0x2d, 0xe9, 0x01, 0x00, + 0x8f, 0xe2, 0x10, 0xff, 0x2f, 0xe1, 0x00, 0xf0, + 0x18, 0xfb, 0x78, 0x47, 0x00, 0x00, 0x1f, 0x50, + 0xbd, 0xe8, 0x04, 0xf0, 0x5e, 0xe2, 0x00, 0xbd, + 0x01, 0xb5, 0x00, 0xa0, 0x00, 0x47, 0x3c, 0x00, + 0x24, 0x09, 0x00, 0x00, 0x00, 0x30, 0x0f, 0xe1, + 0xc0, 0x30, 0xc3, 0xe3, 0x03, 0xf0, 0x21, 0xe1, + 0x01, 0x00, 0x8f, 0xe2, 0x10, 0xff, 0x2f, 0xe1, + 0x01, 0xbd, 0x01, 0xb5, 0x00, 0xa0, 0x00, 0x47, + 0x00, 0x30, 0x0f, 0xe1, 0xc0, 0x30, 0x83, 0xe3, + 0x03, 0xf0, 0x21, 0xe1, 0x01, 0x00, 0x8f, 0xe2, + 0x10, 0xff, 0x2f, 0xe1, 0x01, 0xbd, 0x00, 0x00, + 0x18, 0x00, 0x9f, 0xe5, 0x04, 0x10, 0x90, 0xe4, + 0x3c, 0x00, 0x60, 0x09, 0x00, 0x00, 0x00, 0x00, + 0x51, 0xe3, 0x02, 0x00, 0x00, 0x0a, 0x04, 0x20, + 0x90, 0xe4, 0x00, 0x20, 0x81, 0xe5, 0xf9, 0xff, + 0xff, 0xea, 0x0e, 0xf0, 0xa0, 0xe1, 0x7c, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, + 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0xd8, 0x03, + 0x00, 0x00, 0xd8, 0x03, 0x00, 0x00, 0xd8, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x9c, 0x09, 0x00, 0x00, + 0x44, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, + 0x44, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, + 0x00, 0x80, 0x01, 0x00, 0x10, 0x8e, 0x01, 0x00, + 0x10, 0x8e, 0x01, 0x00, 0x88, 0xf8, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04, 0x00, + 0xc4, 0x33, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0e, 0x50, 0xa0, 0xe1, + 0x58, 0x40, 0x9f, 0xe5, 0x3c, 0x00, 0xd8, 0x09, + 0x00, 0x00, 0x04, 0x00, 0x94, 0xe4, 0x01, 0x00, + 0x50, 0xe3, 0x05, 0xf0, 0xa0, 0x01, 0x04, 0x10, + 0x94, 0xe4, 0x04, 0x20, 0x94, 0xe4, 0x03, 0x00, + 0x00, 0xeb, 0x04, 0x00, 0x94, 0xe4, 0x04, 0x10, + 0x94, 0xe4, 0x07, 0x00, 0x00, 0xeb, 0xf5, 0xff, + 0xff, 0xea, 0x01, 0x00, 0x50, 0xe1, 0x0e, 0xf0, + 0xa0, 0x01, 0x02, 0x00, 0x51, 0xe1, 0x04, 0x30, + 0x90, 0x14, 0x04, 0x30, 0x81, 0x14, 0x3c, 0x00, + 0x14, 0x0a, 0x00, 0x00, 0xfb, 0xff, 0xff, 0x1a, + 0x0e, 0xf0, 0xa0, 0xe1, 0x14, 0x20, 0x9f, 0xe5, + 0x00, 0x20, 0x92, 0xe5, 0x01, 0x00, 0x50, 0xe1, + 0x04, 0x20, 0x80, 0x14, 0xfc, 0xff, 0xff, 0x1a, + 0x0e, 0xf0, 0xa0, 0xe1, 0x80, 0x09, 0x00, 0x00, + 0xcc, 0x09, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, + 0x20, 0xe6, 0x01, 0x00, 0x13, 0x00, 0x00, 0x00, + 0x53, 0x56, 0x43, 0x5f, 0x00, 0x04, 0x00, 0x00, + 0x3c, 0x00, 0x50, 0x0a, 0x00, 0x00, 0x20, 0xee, + 0x01, 0x00, 0x12, 0x00, 0x00, 0x00, 0x49, 0x52, + 0x51, 0x5f, 0x00, 0x02, 0x00, 0x00, 0x20, 0xf2, + 0x01, 0x00, 0x11, 0x00, 0x00, 0x00, 0x46, 0x49, + 0x51, 0x5f, 0x80, 0x00, 0x00, 0x00, 0x20, 0xf4, + 0x01, 0x00, 0x17, 0x00, 0x00, 0x00, 0x41, 0x42, + 0x54, 0x5f, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xf4, + 0x01, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x55, 0x4e, + 0x44, 0x5f, 0x3c, 0x00, 0x8c, 0x0a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xa0, 0xf4, 0x01, 0x00, + 0x1f, 0x00, 0x00, 0x00, 0x55, 0x53, 0x52, 0x5f, + 0x01, 0x00, 0x00, 0x00, 0x0e, 0x50, 0xa0, 0xe1, + 0x00, 0x60, 0x0f, 0xe1, 0x8c, 0x40, 0x9f, 0xe5, + 0x04, 0x10, 0x94, 0xe4, 0x01, 0x00, 0x51, 0xe3, + 0x09, 0x00, 0x00, 0x0a, 0x04, 0x00, 0x94, 0xe4, + 0x01, 0x10, 0x80, 0xe0, 0x03, 0x10, 0xc1, 0xe3, + 0x04, 0x20, 0x94, 0xe4, 0x3c, 0x00, 0xc8, 0x0a, + 0x00, 0x00, 0xc0, 0x20, 0x82, 0xe3, 0x02, 0xf0, + 0x2f, 0xe1, 0x04, 0xd0, 0x41, 0xe2, 0x04, 0x20, + 0x94, 0xe4, 0x13, 0x00, 0x00, 0xeb, 0xf2, 0xff, + 0xff, 0xea, 0x06, 0xf0, 0x2f, 0xe1, 0x05, 0xf0, + 0xa0, 0xe1, 0x0e, 0x50, 0xa0, 0xe1, 0x00, 0x60, + 0x0f, 0xe1, 0x44, 0x40, 0x9f, 0xe5, 0x04, 0x10, + 0x94, 0xe4, 0x01, 0x00, 0x51, 0xe3, 0x08, 0x00, + 0x00, 0x0a, 0x04, 0x00, 0x94, 0xe4, 0x3c, 0x00, + 0x04, 0x0b, 0x00, 0x00, 0x01, 0x10, 0x80, 0xe0, + 0x03, 0x10, 0xc1, 0xe3, 0x04, 0x20, 0x94, 0xe4, + 0xc0, 0x20, 0x82, 0xe3, 0x02, 0xf0, 0x2f, 0xe1, + 0x04, 0xd0, 0x41, 0xe2, 0x04, 0x20, 0x94, 0xe4, + 0xf3, 0xff, 0xff, 0xea, 0x06, 0xf0, 0x2f, 0xe1, + 0x05, 0xf0, 0xa0, 0xe1, 0x01, 0x00, 0x50, 0xe1, + 0x04, 0x20, 0x80, 0x14, 0xfc, 0xff, 0xff, 0x1a, + 0x0e, 0xf0, 0xa0, 0xe1, 0x3c, 0x0a, 0x00, 0x00, + 0x3c, 0x00, 0x40, 0x0b, 0x00, 0x00, 0x01, 0x60, + 0xc0, 0x46, 0xc0, 0x46, 0xc0, 0x46, 0x70, 0x47, + 0x00, 0x00, 0x10, 0x1e, 0x10, 0xee, 0x02, 0x00, + 0x11, 0xe3, 0xfc, 0xff, 0xff, 0x1a, 0x10, 0x0e, + 0x01, 0xee, 0x10, 0x1e, 0x10, 0xee, 0x02, 0x00, + 0x11, 0xe3, 0xfc, 0xff, 0xff, 0x1a, 0x1e, 0xff, + 0x2f, 0xe1, 0x10, 0x1e, 0x10, 0xee, 0x01, 0x00, + 0x11, 0xe3, 0x03, 0x00, 0x00, 0x0a, 0x10, 0x1e, + 0x11, 0xee, 0x3c, 0x00, 0x7c, 0x0b, 0x00, 0x00, + 0x00, 0x10, 0x80, 0xe5, 0x01, 0x00, 0xa0, 0xe3, + 0x1e, 0xff, 0x2f, 0xe1, 0x00, 0x00, 0x20, 0xe0, + 0x1e, 0xff, 0x2f, 0xe1, 0x8d, 0x46, 0x97, 0x46, + 0x78, 0x47, 0xc0, 0x46, 0x78, 0xfd, 0xff, 0xea, + 0x10, 0xb5, 0x04, 0x1c, 0x03, 0x28, 0x01, 0xd9, + 0x00, 0xf0, 0xac, 0xfb, 0x0c, 0x48, 0x40, 0x68, + 0x00, 0x28, 0x00, 0xd0, 0x03, 0x24, 0x0b, 0x48, + 0x01, 0x68, 0x09, 0x48, 0x3c, 0x00, 0xb8, 0x0b, + 0x00, 0x00, 0x12, 0x30, 0x00, 0x29, 0x05, 0xd0, + 0x06, 0x21, 0x61, 0x43, 0x40, 0x5c, 0xc3, 0x00, + 0x18, 0x18, 0x04, 0xe0, 0x06, 0x21, 0x61, 0x43, + 0x40, 0x5c, 0x14, 0x23, 0x58, 0x43, 0x0a, 0x30, + 0x00, 0x06, 0x00, 0x0e, 0x10, 0xbd, 0xd4, 0x7a, + 0x01, 0x00, 0xa8, 0x69, 0x01, 0x00, 0x80, 0xb5, + 0x09, 0x4a, 0x09, 0x49, 0x03, 0x20, 0x00, 0xf0, + 0xf2, 0xf9, 0x08, 0x49, 0x08, 0x20, 0x3c, 0x00, + 0xf4, 0x0b, 0x00, 0x00, 0x08, 0x60, 0x48, 0x60, + 0x07, 0x49, 0x1d, 0x20, 0x01, 0xf0, 0xb2, 0xfc, + 0x06, 0x49, 0x1e, 0x20, 0x01, 0xf0, 0xae, 0xfc, + 0x80, 0xbd, 0x00, 0x00, 0x00, 0x6c, 0x01, 0x00, + 0x31, 0x27, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, + 0x29, 0x25, 0x00, 0x00, 0x31, 0x25, 0x00, 0x00, + 0x05, 0x49, 0x80, 0xb5, 0x08, 0x20, 0x88, 0x60, + 0x1d, 0x20, 0x01, 0xf0, 0xbf, 0xfc, 0x1e, 0x20, + 0x3c, 0x00, 0x30, 0x0c, 0x00, 0x00, 0x01, 0xf0, + 0xbc, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x10, + 0x07, 0x00, 0x02, 0x1c, 0x08, 0x1c, 0xd1, 0x2a, + 0x80, 0xb5, 0x01, 0xd1, 0x05, 0xf0, 0x19, 0xfc, + 0x80, 0xbd, 0x03, 0x49, 0x80, 0xb5, 0x00, 0x20, + 0x08, 0x80, 0x05, 0x20, 0x05, 0xf0, 0xd5, 0xfb, + 0x80, 0xbd, 0xb0, 0x74, 0x01, 0x00, 0x80, 0xb5, + 0x54, 0x28, 0x01, 0xd1, 0x06, 0xf0, 0xcd, 0xf8, + 0x80, 0xbd, 0x3c, 0x00, 0x6c, 0x0c, 0x00, 0x00, + 0xb0, 0xb5, 0x10, 0x4d, 0x02, 0x1c, 0x01, 0x24, + 0x01, 0x2a, 0x0d, 0x48, 0x29, 0x68, 0x06, 0xd0, + 0xc4, 0x2a, 0x03, 0xd1, 0x6a, 0x68, 0x00, 0x2a, + 0x05, 0xd0, 0xac, 0x60, 0xb0, 0xbd, 0x0e, 0xf0, + 0x89, 0xfb, 0x6c, 0x60, 0x08, 0xe0, 0x00, 0x22, + 0xaa, 0x60, 0x6c, 0x60, 0x0e, 0xf0, 0x82, 0xfb, + 0x00, 0x21, 0x04, 0x20, 0x12, 0xf0, 0xc8, 0xfc, + 0x06, 0xf0, 0xd8, 0xf8, 0x3c, 0x00, 0xa8, 0x0c, + 0x00, 0x00, 0xb0, 0xbd, 0x00, 0x00, 0xc4, 0x60, + 0x01, 0x00, 0xbc, 0x74, 0x01, 0x00, 0x05, 0x4a, + 0x51, 0x69, 0x08, 0x1a, 0x11, 0x69, 0x09, 0x68, + 0x10, 0x31, 0x81, 0x42, 0x01, 0xd8, 0x50, 0x61, + 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x8c, 0x6e, + 0x01, 0x00, 0x01, 0x49, 0x49, 0x68, 0x40, 0x1a, + 0x70, 0x47, 0x8c, 0x6e, 0x01, 0x00, 0x01, 0x48, + 0x40, 0x69, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, + 0xe4, 0x0c, 0x00, 0x00, 0x8c, 0x6e, 0x01, 0x00, + 0x02, 0x4a, 0x51, 0x69, 0x08, 0x18, 0x50, 0x61, + 0x70, 0x47, 0x00, 0x00, 0x8c, 0x6e, 0x01, 0x00, + 0x0e, 0x49, 0x0f, 0x48, 0x10, 0xb5, 0x19, 0x22, + 0x92, 0x01, 0x41, 0x60, 0x89, 0x18, 0xc1, 0x60, + 0x0b, 0x49, 0x00, 0x22, 0x0c, 0x31, 0x01, 0x60, + 0x0a, 0x49, 0x82, 0x60, 0x09, 0x68, 0x01, 0x23, + 0xdb, 0x03, 0xc9, 0x18, 0x08, 0x4c, 0x41, 0x61, + 0x3c, 0x00, 0x20, 0x0d, 0x00, 0x00, 0x21, 0x68, + 0x00, 0x29, 0x02, 0xd0, 0x07, 0x49, 0x01, 0x61, + 0x01, 0xe0, 0x00, 0xf0, 0x0c, 0xf8, 0x22, 0x60, + 0x10, 0xbd, 0x44, 0xdc, 0x01, 0x00, 0x8c, 0x6e, + 0x01, 0x00, 0xc8, 0x09, 0x00, 0x00, 0x34, 0x58, + 0x01, 0x00, 0xc4, 0x09, 0x00, 0x00, 0x01, 0x48, + 0x02, 0x49, 0x08, 0x61, 0x70, 0x47, 0xc8, 0x09, + 0x00, 0x00, 0x8c, 0x6e, 0x01, 0x00, 0x08, 0x28, + 0x05, 0xd2, 0x3c, 0x00, 0x5c, 0x0d, 0x00, 0x00, + 0x03, 0x4b, 0x80, 0x00, 0x19, 0x50, 0x02, 0x49, + 0x20, 0x31, 0x0a, 0x50, 0x70, 0x47, 0x00, 0x00, + 0x64, 0x6d, 0x01, 0x00, 0x70, 0xb5, 0x06, 0x1c, + 0x0d, 0x48, 0x0d, 0x1c, 0x00, 0x68, 0x14, 0x1c, + 0x00, 0x28, 0x03, 0xd1, 0x20, 0x1c, 0x00, 0xf0, + 0x09, 0xfc, 0x70, 0xbd, 0x28, 0x06, 0x01, 0xd5, + 0x00, 0xf0, 0x22, 0xfe, 0x22, 0x1c, 0x29, 0x1c, + 0x30, 0x1c, 0x08, 0xf0, 0x3c, 0x00, 0x98, 0x0d, + 0x00, 0x00, 0xdd, 0xfd, 0x01, 0x1c, 0x03, 0x48, + 0x54, 0x30, 0x43, 0x69, 0x32, 0x1c, 0xff, 0xf7, + 0x1b, 0xfb, 0x70, 0xbd, 0x00, 0x00, 0x50, 0x6d, + 0x01, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x0d, 0x48, + 0x1f, 0x1c, 0x00, 0x68, 0x15, 0x1c, 0x0c, 0x1c, + 0x00, 0x28, 0x02, 0xd1, 0x28, 0x1c, 0x00, 0xf0, + 0xe8, 0xfb, 0x20, 0x06, 0x01, 0xd5, 0x00, 0xf0, + 0x02, 0xfe, 0x2a, 0x1c, 0x21, 0x1c, 0x3c, 0x00, + 0xd4, 0x0d, 0x00, 0x00, 0x30, 0x1c, 0x08, 0xf0, + 0xbd, 0xfd, 0x01, 0x1c, 0x03, 0x48, 0x54, 0x30, + 0x43, 0x69, 0x3a, 0x1c, 0xff, 0xf7, 0xfb, 0xfa, + 0xf8, 0xbd, 0x00, 0x00, 0x50, 0x6d, 0x01, 0x00, + 0xf8, 0xb5, 0xf1, 0x28, 0x4e, 0xd1, 0x2a, 0x48, + 0x69, 0x46, 0x82, 0x69, 0xff, 0xf7, 0xee, 0xfa, + 0x27, 0x49, 0x00, 0x26, 0x54, 0x39, 0xc8, 0x68, + 0x8b, 0x68, 0xc2, 0x00, 0x01, 0x30, 0xd5, 0x18, + 0x3c, 0x00, 0x10, 0x0e, 0x00, 0x00, 0x07, 0x28, + 0xc8, 0x60, 0x00, 0xd1, 0xce, 0x60, 0x22, 0x48, + 0x6c, 0x68, 0x00, 0x68, 0x00, 0x28, 0x03, 0xd0, + 0x00, 0x21, 0x20, 0x1c, 0x08, 0xf0, 0x3b, 0xfb, + 0x6e, 0x60, 0x25, 0x68, 0x20, 0x89, 0xa9, 0x78, + 0x02, 0x39, 0x40, 0x1a, 0xe9, 0x78, 0x40, 0x1a, + 0x20, 0x81, 0xa8, 0x78, 0x28, 0x18, 0x02, 0x38, + 0x20, 0x60, 0x6e, 0x78, 0x28, 0x78, 0x08, 0x28, + 0x17, 0xd2, 0x3c, 0x00, 0x4c, 0x0e, 0x00, 0x00, + 0x30, 0x06, 0x07, 0xd5, 0x27, 0x1c, 0x20, 0x1c, + 0x00, 0xf0, 0x7a, 0xfc, 0x04, 0x1c, 0x38, 0x1c, + 0x00, 0xf0, 0x9c, 0xfb, 0x28, 0x78, 0x0f, 0x49, + 0x40, 0x39, 0x80, 0x00, 0x0a, 0x58, 0x00, 0x2a, + 0x04, 0xd0, 0x31, 0x1c, 0x20, 0x1c, 0xff, 0xf7, + 0xb3, 0xfa, 0x08, 0xe0, 0x05, 0x21, 0x00, 0xe0, + 0x04, 0x21, 0x06, 0x20, 0x00, 0xf0, 0x10, 0xfa, + 0x20, 0x1c, 0x00, 0xf0, 0x3c, 0x00, 0x88, 0x0e, + 0x00, 0x00, 0x87, 0xfb, 0x30, 0x06, 0x01, 0xd5, + 0x00, 0xf0, 0xa1, 0xfd, 0xf8, 0xbd, 0x01, 0x21, + 0x06, 0x20, 0x00, 0xf0, 0x04, 0xfa, 0xf9, 0xe7, + 0x00, 0x00, 0xa4, 0x6d, 0x01, 0x00, 0xcc, 0x5c, + 0x01, 0x00, 0xf8, 0xb5, 0x1a, 0x4d, 0x19, 0x4f, + 0x01, 0x24, 0x54, 0x35, 0x29, 0x1c, 0x03, 0x20, + 0x7c, 0x60, 0x17, 0x4b, 0x18, 0x4a, 0x05, 0xf0, + 0xf4, 0xfb, 0x00, 0x28, 0x02, 0xd0, 0x3c, 0x00, + 0xc4, 0x0e, 0x00, 0x00, 0x00, 0x20, 0x38, 0x60, + 0x1f, 0xe0, 0x3c, 0x60, 0x07, 0x21, 0x28, 0x1c, + 0xea, 0x69, 0xff, 0xf7, 0x83, 0xfa, 0x38, 0x20, + 0x00, 0xf0, 0x80, 0xfc, 0x00, 0x24, 0xb8, 0x60, + 0xb8, 0x68, 0xe6, 0x00, 0x35, 0x18, 0x68, 0x46, + 0x02, 0x21, 0x00, 0xf0, 0x75, 0xfb, 0x28, 0x60, + 0x28, 0x1c, 0x00, 0xf0, 0xa5, 0xfd, 0xb8, 0x68, + 0x81, 0x59, 0x06, 0x48, 0x54, 0x30, 0x02, 0x6a, + 0x3c, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xff, 0xf7, + 0x6c, 0xfa, 0x01, 0x34, 0x07, 0x2c, 0xea, 0xdb, + 0x00, 0x20, 0xf8, 0x60, 0x38, 0x61, 0xf8, 0xbd, + 0x00, 0x00, 0x50, 0x6d, 0x01, 0x00, 0x81, 0x9a, + 0x00, 0x00, 0x61, 0x9a, 0x00, 0x00, 0x05, 0x48, + 0x80, 0xb5, 0x00, 0x68, 0x00, 0x28, 0x05, 0xd0, + 0x03, 0x48, 0x54, 0x30, 0x42, 0x6a, 0x00, 0x21, + 0xff, 0xf7, 0x53, 0xfa, 0x80, 0xbd, 0x50, 0x6d, + 0x01, 0x00, 0x3c, 0x00, 0x3c, 0x0f, 0x00, 0x00, + 0x70, 0x47, 0x00, 0x00, 0x70, 0xb5, 0x0a, 0x4e, + 0x09, 0x4d, 0x08, 0x4c, 0x08, 0x3e, 0xa1, 0x69, + 0x00, 0x29, 0x07, 0xd0, 0x30, 0x68, 0x41, 0x60, + 0x00, 0x7b, 0x81, 0x00, 0x69, 0x58, 0xff, 0xf7, + 0x3e, 0xfa, 0xf4, 0xe7, 0x03, 0x49, 0x02, 0x20, + 0x08, 0x70, 0x70, 0xbd, 0x00, 0x10, 0x07, 0x00, + 0xe0, 0x7e, 0x01, 0x00, 0x00, 0x02, 0x07, 0x00, + 0x70, 0xb5, 0x0a, 0x4e, 0x3c, 0x00, 0x78, 0x0f, + 0x00, 0x00, 0x09, 0x4d, 0x08, 0x4c, 0x08, 0x3e, + 0xe1, 0x69, 0x00, 0x29, 0x07, 0xd0, 0x70, 0x68, + 0x41, 0x60, 0x00, 0x7b, 0x81, 0x00, 0x69, 0x58, + 0xff, 0xf7, 0x24, 0xfa, 0xf4, 0xe7, 0x03, 0x49, + 0x02, 0x20, 0x08, 0x70, 0x70, 0xbd, 0x00, 0x10, + 0x07, 0x00, 0xe0, 0x7e, 0x01, 0x00, 0x00, 0x02, + 0x07, 0x00, 0xb0, 0xb5, 0x09, 0x4d, 0x04, 0x1c, + 0x28, 0x1c, 0x20, 0x22, 0x40, 0x30, 0x3c, 0x00, + 0xb4, 0x0f, 0x00, 0x00, 0x05, 0x49, 0xff, 0xf7, + 0x9f, 0xfa, 0xe0, 0x68, 0xe8, 0x60, 0x20, 0x69, + 0x28, 0x61, 0xa0, 0x6a, 0xa8, 0x62, 0x60, 0x68, + 0x68, 0x60, 0xb0, 0xbd, 0x70, 0x52, 0x01, 0x00, + 0x00, 0x10, 0x07, 0x00, 0xf8, 0xb5, 0x00, 0x24, + 0x00, 0x23, 0x20, 0x28, 0x01, 0xdb, 0x01, 0x24, + 0x07, 0xe0, 0x08, 0x4e, 0x80, 0x00, 0x35, 0x58, + 0x07, 0x4f, 0xbd, 0x42, 0x00, 0xd0, 0x2b, 0x1c, + 0x3c, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x31, 0x50, + 0x13, 0x60, 0x00, 0x2c, 0x03, 0xd0, 0x21, 0x1c, + 0x82, 0x20, 0x00, 0xf0, 0x52, 0xf9, 0x20, 0x1c, + 0xf8, 0xbd, 0xe0, 0x7e, 0x01, 0x00, 0x75, 0x75, + 0x00, 0x00, 0xb0, 0xb5, 0x0b, 0x4d, 0x04, 0x1c, + 0x28, 0x68, 0x00, 0x28, 0x0f, 0xd0, 0x20, 0x1c, + 0x12, 0xf0, 0xb7, 0xfd, 0x00, 0x28, 0x0a, 0xd0, + 0x21, 0x7a, 0x28, 0x7a, 0x0a, 0x07, 0x00, 0x07, + 0x00, 0x0f, 0x3c, 0x00, 0x2c, 0x10, 0x00, 0x00, + 0x12, 0x0f, 0x90, 0x42, 0x29, 0x72, 0x01, 0xd0, + 0x01, 0x20, 0xb0, 0xbd, 0x00, 0x20, 0xb0, 0xbd, + 0x70, 0x78, 0x01, 0x00, 0xf0, 0xb5, 0x42, 0x4e, + 0x05, 0x1c, 0x30, 0x68, 0x85, 0xb0, 0x00, 0x28, + 0x63, 0xd0, 0x00, 0x24, 0x00, 0x20, 0x00, 0x2d, + 0x06, 0xd0, 0x69, 0x78, 0x18, 0x29, 0x03, 0xd1, + 0xe9, 0x79, 0x01, 0x29, 0x00, 0xd1, 0x01, 0x20, + 0x00, 0x28, 0x45, 0xd0, 0x3c, 0x00, 0x68, 0x10, + 0x00, 0x00, 0x00, 0x20, 0xb0, 0x72, 0x81, 0x00, + 0x4a, 0x19, 0x93, 0x7a, 0x59, 0x06, 0x89, 0x0f, + 0xdb, 0x06, 0x04, 0xd5, 0xb3, 0x7a, 0x01, 0x27, + 0x8f, 0x40, 0x3b, 0x43, 0xb3, 0x72, 0xd2, 0x7a, + 0x13, 0x09, 0x12, 0x07, 0x12, 0x0f, 0x93, 0x42, + 0x05, 0xd3, 0x01, 0x22, 0x8a, 0x40, 0x14, 0x43, + 0x01, 0xaa, 0x89, 0x00, 0x50, 0x50, 0x01, 0x30, + 0x04, 0x28, 0xe4, 0xdb, 0xb0, 0x7a, 0x3c, 0x00, + 0xa4, 0x10, 0x00, 0x00, 0x20, 0x40, 0x01, 0x07, + 0x0d, 0xd5, 0x41, 0x07, 0x09, 0xd5, 0xc1, 0x07, + 0x05, 0xd5, 0x81, 0x07, 0x01, 0xd5, 0x00, 0x24, + 0x05, 0xe0, 0x02, 0x99, 0x02, 0xe0, 0x01, 0x99, + 0x00, 0xe0, 0x03, 0x99, 0x04, 0x91, 0x41, 0x07, + 0x09, 0xd5, 0xc1, 0x07, 0x05, 0xd5, 0x81, 0x07, + 0x01, 0xd5, 0x00, 0x24, 0x03, 0xe0, 0x02, 0x99, + 0x00, 0xe0, 0x01, 0x99, 0x03, 0x91, 0xc1, 0x07, + 0x3c, 0x00, 0xe0, 0x10, 0x00, 0x00, 0x05, 0xd5, + 0x81, 0x07, 0x01, 0xd5, 0x00, 0x24, 0x01, 0xe0, + 0x02, 0x99, 0x01, 0x91, 0x80, 0x07, 0x01, 0xd5, + 0x00, 0x24, 0x22, 0xe0, 0x0f, 0x2c, 0x20, 0xd1, + 0x70, 0x68, 0x00, 0x28, 0x0b, 0xd0, 0x04, 0x9a, + 0x02, 0xab, 0x00, 0x92, 0x0a, 0xcb, 0x01, 0x9a, + 0x28, 0x1c, 0x0b, 0xf0, 0x8a, 0xfb, 0x00, 0x20, + 0x70, 0x60, 0x10, 0xe0, 0x17, 0xe0, 0x30, 0x7a, + 0x29, 0x7a, 0x3c, 0x00, 0x1c, 0x11, 0x00, 0x00, + 0x00, 0x07, 0x09, 0x07, 0x09, 0x0f, 0x00, 0x0f, + 0x88, 0x42, 0x07, 0xd0, 0x04, 0x9a, 0x02, 0xab, + 0x00, 0x92, 0x0a, 0xcb, 0x01, 0x9a, 0x28, 0x1c, + 0x0b, 0xf0, 0x76, 0xfb, 0x28, 0x7a, 0x30, 0x72, + 0x01, 0x20, 0x0f, 0x2c, 0x00, 0xd0, 0x00, 0x20, + 0x05, 0xb0, 0xf0, 0xbd, 0x01, 0x20, 0xfb, 0xe7, + 0x70, 0x78, 0x01, 0x00, 0x0d, 0x4a, 0x70, 0xb5, + 0x11, 0x68, 0x00, 0x20, 0x3c, 0x00, 0x58, 0x11, + 0x00, 0x00, 0x00, 0x29, 0x0e, 0xd0, 0x11, 0x7a, + 0x09, 0x06, 0x0b, 0xd5, 0x53, 0x7a, 0x94, 0x7a, + 0x03, 0x21, 0x01, 0x25, 0x2a, 0x1c, 0x8a, 0x40, + 0x1e, 0x1c, 0x16, 0x40, 0x03, 0xd0, 0x22, 0x40, + 0x01, 0xd1, 0x01, 0x20, 0x70, 0xbd, 0xff, 0x31, + 0x09, 0x06, 0x09, 0x16, 0xf2, 0xd5, 0x70, 0xbd, + 0x00, 0x00, 0x70, 0x78, 0x01, 0x00, 0x10, 0xb5, + 0x08, 0x4c, 0x20, 0x68, 0x00, 0x28, 0x3c, 0x00, + 0x94, 0x11, 0x00, 0x00, 0x04, 0xd0, 0x60, 0x68, + 0x00, 0x28, 0x01, 0xd1, 0x0b, 0xf0, 0xc0, 0xfb, + 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x07, 0xc4, + 0x0c, 0x3c, 0x01, 0x20, 0x60, 0x60, 0x10, 0xbd, + 0x70, 0x78, 0x01, 0x00, 0x01, 0x49, 0x01, 0x20, + 0x08, 0x60, 0x70, 0x47, 0x70, 0x78, 0x01, 0x00, + 0xf8, 0xb5, 0x0e, 0x4d, 0x04, 0x1c, 0x00, 0x20, + 0x68, 0x72, 0x20, 0x1c, 0x12, 0xf0, 0xde, 0xfc, + 0x3c, 0x00, 0xd0, 0x11, 0x00, 0x00, 0x00, 0x28, + 0x12, 0xd0, 0x00, 0x20, 0x03, 0x21, 0x01, 0x22, + 0x0f, 0x1a, 0x16, 0x1c, 0x23, 0x7a, 0xbe, 0x40, + 0x33, 0x40, 0x04, 0xd0, 0x6b, 0x7a, 0x16, 0x1c, + 0x86, 0x40, 0x33, 0x43, 0x6b, 0x72, 0x01, 0x30, + 0x00, 0x06, 0x00, 0x0e, 0x03, 0x28, 0xef, 0xd9, + 0xf8, 0xbd, 0x70, 0x78, 0x01, 0x00, 0x92, 0x00, + 0x51, 0x18, 0x8a, 0x7a, 0x12, 0x07, 0x12, 0x0f, + 0x02, 0x70, 0x3c, 0x00, 0x0c, 0x12, 0x00, 0x00, + 0xca, 0x7a, 0x12, 0x07, 0x12, 0x0f, 0x42, 0x70, + 0xca, 0x7a, 0x12, 0x09, 0x82, 0x70, 0x09, 0x7b, + 0x81, 0x80, 0x70, 0x47, 0x03, 0x4a, 0x0f, 0x21, + 0x52, 0x7a, 0x01, 0x20, 0x91, 0x43, 0x00, 0xd0, + 0x00, 0x20, 0x70, 0x47, 0x70, 0x78, 0x01, 0x00, + 0x40, 0x07, 0x05, 0x49, 0x40, 0x0f, 0x05, 0x4a, + 0x09, 0x56, 0x52, 0x7a, 0x01, 0x20, 0x0a, 0x40, + 0x00, 0xd1, 0x00, 0x20, 0x3c, 0x00, 0x48, 0x12, + 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x5e, 0x46, + 0x01, 0x00, 0x70, 0x78, 0x01, 0x00, 0x12, 0x4a, + 0x70, 0xb5, 0x53, 0x7a, 0x94, 0x7a, 0xff, 0x20, + 0x03, 0x21, 0x01, 0x25, 0x2a, 0x1c, 0x8a, 0x40, + 0x1e, 0x1c, 0x16, 0x40, 0x14, 0xd0, 0x22, 0x40, + 0x12, 0xd1, 0x08, 0x06, 0x00, 0x0e, 0x07, 0xd0, + 0x01, 0x28, 0x07, 0xd0, 0x02, 0x28, 0x07, 0xd0, + 0x03, 0x28, 0x07, 0xd1, 0x07, 0x20, 0x3c, 0x00, + 0x84, 0x12, 0x00, 0x00, 0x70, 0xbd, 0x03, 0x20, + 0x70, 0xbd, 0x01, 0x20, 0x70, 0xbd, 0x05, 0x20, + 0x70, 0xbd, 0xff, 0x20, 0x70, 0xbd, 0xff, 0x31, + 0x09, 0x06, 0x09, 0x16, 0xe1, 0xd5, 0x70, 0xbd, + 0x70, 0x78, 0x01, 0x00, 0xf8, 0xb5, 0x04, 0x1c, + 0x13, 0x48, 0x0d, 0x1c, 0x81, 0x68, 0x00, 0x29, + 0x05, 0xd0, 0x01, 0x7b, 0x00, 0x29, 0x01, 0xd1, + 0x04, 0x73, 0x45, 0x73, 0xf8, 0xbd, 0x0f, 0x4e, + 0x3c, 0x00, 0xc0, 0x12, 0x00, 0x00, 0x31, 0x1c, + 0x20, 0x31, 0x8a, 0x79, 0x00, 0xab, 0x1a, 0x70, + 0xc9, 0x79, 0x59, 0x70, 0x42, 0x68, 0x00, 0x2a, + 0x07, 0xd0, 0x20, 0x02, 0x28, 0x43, 0x01, 0x1c, + 0x00, 0x20, 0xff, 0xf7, 0x7e, 0xf8, 0x00, 0x28, + 0x04, 0xd1, 0x2a, 0x1c, 0x21, 0x1c, 0x00, 0x20, + 0x11, 0xf0, 0x0f, 0xf8, 0x00, 0xab, 0x18, 0x88, + 0xf0, 0x84, 0xe2, 0xe7, 0x00, 0x00, 0x88, 0x5a, + 0x01, 0x00, 0x3c, 0x00, 0xfc, 0x12, 0x00, 0x00, + 0x00, 0x10, 0x07, 0x00, 0x80, 0xb5, 0x01, 0x21, + 0x81, 0x20, 0xff, 0xf7, 0xcd, 0xff, 0x80, 0xbd, + 0x01, 0x49, 0x01, 0x20, 0x88, 0x60, 0x70, 0x47, + 0x88, 0x5a, 0x01, 0x00, 0x05, 0x49, 0x80, 0xb5, + 0x00, 0x20, 0x88, 0x60, 0x08, 0x7b, 0x00, 0x28, + 0x02, 0xd0, 0x49, 0x7b, 0xff, 0xf7, 0xbc, 0xff, + 0x80, 0xbd, 0x00, 0x00, 0x88, 0x5a, 0x01, 0x00, + 0x02, 0x4a, 0x01, 0x1c, 0x3c, 0x00, 0x38, 0x13, + 0x00, 0x00, 0x50, 0x68, 0x51, 0x60, 0x70, 0x47, + 0x00, 0x00, 0x88, 0x5a, 0x01, 0x00, 0x10, 0xb5, + 0x0c, 0x1c, 0x07, 0xf0, 0x64, 0xfa, 0x04, 0x61, + 0x00, 0x20, 0x10, 0xbd, 0x00, 0x00, 0xff, 0xb5, + 0x0e, 0x1c, 0x1f, 0x1c, 0x38, 0x20, 0x81, 0xb0, + 0x00, 0xf0, 0x3d, 0xfa, 0x1d, 0x49, 0x04, 0x1c, + 0x48, 0x69, 0x00, 0x28, 0x01, 0xd1, 0x4c, 0x61, + 0x00, 0xe0, 0x04, 0x60, 0x30, 0x01, 0x3c, 0x00, + 0x74, 0x13, 0x00, 0x00, 0x00, 0x90, 0x00, 0x04, + 0x00, 0x0c, 0x00, 0xf0, 0x15, 0xfa, 0x05, 0x1c, + 0x00, 0x99, 0xff, 0xf7, 0x8b, 0xf8, 0x00, 0x20, + 0x73, 0x1e, 0x04, 0xe0, 0x01, 0x01, 0x4a, 0x19, + 0x10, 0x32, 0x6a, 0x50, 0x01, 0x30, 0x98, 0x42, + 0xf8, 0xd3, 0x00, 0x01, 0x2d, 0x50, 0x38, 0x21, + 0x20, 0x1c, 0xff, 0xf7, 0x7b, 0xf8, 0xa5, 0x60, + 0x65, 0x60, 0xe6, 0x85, 0x0c, 0x20, 0x60, 0x86, + 0x3c, 0x00, 0xb0, 0x13, 0x00, 0x00, 0xaf, 0x20, + 0x80, 0x01, 0xe0, 0x61, 0x0e, 0x20, 0xe0, 0x86, + 0x00, 0x20, 0x20, 0x60, 0x01, 0x98, 0xe0, 0x60, + 0x38, 0x68, 0x60, 0x61, 0x03, 0x99, 0x04, 0x48, + 0x08, 0x60, 0x04, 0x48, 0x38, 0x60, 0x05, 0xb0, + 0x00, 0x20, 0xf0, 0xbd, 0x00, 0x00, 0xfc, 0x5a, + 0x01, 0x00, 0xdd, 0x15, 0x01, 0x00, 0xfd, 0x16, + 0x01, 0x00, 0x02, 0x1c, 0x08, 0x1c, 0xf0, 0x2a, + 0x80, 0xb5, 0x3c, 0x00, 0xec, 0x13, 0x00, 0x00, + 0x04, 0xd0, 0xf1, 0x2a, 0x07, 0xd1, 0x06, 0xf0, + 0x09, 0xfb, 0x80, 0xbd, 0x07, 0xf0, 0x0c, 0xfa, + 0x0d, 0xf0, 0xa8, 0xfa, 0x80, 0xbd, 0x01, 0x21, + 0x02, 0x20, 0xff, 0xf7, 0x4d, 0xff, 0x80, 0xbd, + 0x01, 0x49, 0x00, 0x20, 0x48, 0x61, 0x70, 0x47, + 0xfc, 0x5a, 0x01, 0x00, 0x00, 0x28, 0x02, 0xd0, + 0x00, 0x29, 0x00, 0xd0, 0xc1, 0x60, 0x70, 0x47, + 0xf8, 0xb5, 0x17, 0x1c, 0x3c, 0x00, 0x28, 0x14, + 0x00, 0x00, 0x0e, 0x1c, 0x05, 0x1c, 0x1c, 0x1c, + 0x1c, 0x30, 0x07, 0xf0, 0xc8, 0xf8, 0x01, 0x69, + 0x42, 0x69, 0x80, 0x68, 0x89, 0x19, 0x89, 0x1a, + 0x81, 0x42, 0x06, 0xd2, 0x23, 0x1c, 0x3a, 0x1c, + 0x31, 0x1c, 0x28, 0x1c, 0x00, 0xf0, 0x05, 0xf8, + 0xf8, 0xbd, 0x00, 0x20, 0x38, 0x60, 0x20, 0x60, + 0xfa, 0xe7, 0xff, 0xb5, 0x85, 0xb0, 0x05, 0x98, + 0x01, 0x27, 0x0e, 0x1c, 0x1c, 0x30, 0x3c, 0x00, + 0x64, 0x14, 0x00, 0x00, 0x07, 0xf0, 0xae, 0xf8, + 0x04, 0x1c, 0x80, 0x88, 0x04, 0x30, 0x03, 0x90, + 0x2c, 0x48, 0x04, 0x90, 0x80, 0x79, 0x02, 0x90, + 0xa0, 0x69, 0xb0, 0x42, 0x17, 0xd2, 0x35, 0x1a, + 0x11, 0xe0, 0x03, 0x98, 0xff, 0xf7, 0x16, 0xfc, + 0x00, 0x28, 0x06, 0xd1, 0x01, 0x21, 0x8e, 0x20, + 0xff, 0xf7, 0x08, 0xff, 0x00, 0x25, 0x00, 0x27, + 0x05, 0xe0, 0x21, 0x68, 0x01, 0x60, 0x20, 0x60, + 0x3c, 0x00, 0xa0, 0x14, 0x00, 0x00, 0xa0, 0x69, + 0x01, 0x30, 0xa0, 0x61, 0x01, 0x3d, 0xeb, 0xd2, + 0x00, 0x2f, 0x35, 0xd0, 0xa0, 0x69, 0x80, 0x1b, + 0xa0, 0x61, 0x20, 0x69, 0x80, 0x19, 0x20, 0x61, + 0x61, 0x69, 0x40, 0x1a, 0xe1, 0x68, 0x88, 0x42, + 0x03, 0xd9, 0x07, 0x21, 0x8e, 0x20, 0xff, 0xf7, + 0xec, 0xfe, 0x25, 0x68, 0x2f, 0x1c, 0x70, 0x1e, + 0x01, 0x95, 0x00, 0xe0, 0x3f, 0x68, 0x01, 0x38, + 0xfc, 0xd2, 0x3c, 0x00, 0xdc, 0x14, 0x00, 0x00, + 0x38, 0x68, 0x20, 0x60, 0x02, 0x98, 0x04, 0x99, + 0x88, 0x71, 0x2e, 0x68, 0x2c, 0x60, 0x32, 0x1d, + 0x00, 0x92, 0x29, 0x1c, 0x20, 0x31, 0x01, 0x22, + 0x28, 0x1d, 0x05, 0x9b, 0x08, 0xf0, 0x7a, 0xfc, + 0xbd, 0x42, 0x01, 0xd0, 0x35, 0x1c, 0xf0, 0xe7, + 0x00, 0x20, 0x38, 0x61, 0x01, 0x98, 0x07, 0x99, + 0x04, 0x30, 0x08, 0x60, 0x08, 0x98, 0x04, 0x37, + 0x07, 0x60, 0x09, 0xb0, 0x3c, 0x00, 0x18, 0x15, + 0x00, 0x00, 0xf0, 0xbd, 0x02, 0x98, 0x04, 0x99, + 0x88, 0x71, 0xf9, 0xe7, 0x00, 0x00, 0x20, 0x10, + 0x07, 0x00, 0x38, 0xb5, 0x04, 0x1c, 0x15, 0x1c, + 0x00, 0x20, 0x0c, 0x60, 0x09, 0xe0, 0xe2, 0x68, + 0x20, 0x1c, 0x00, 0x92, 0xa3, 0x8a, 0x21, 0x68, + 0xa2, 0x69, 0x08, 0xf0, 0x56, 0xfc, 0x20, 0x1c, + 0xe4, 0x68, 0x00, 0x2c, 0xf3, 0xd1, 0x28, 0x60, + 0x38, 0xbd, 0x80, 0xb5, 0x0c, 0xe0, 0x3c, 0x00, + 0x54, 0x15, 0x00, 0x00, 0xc2, 0x68, 0x8a, 0x42, + 0x08, 0xd1, 0x00, 0x21, 0xc1, 0x60, 0x00, 0x28, + 0x03, 0xd1, 0x06, 0x21, 0x8e, 0x20, 0xff, 0xf7, + 0x9d, 0xfe, 0x80, 0xbd, 0x10, 0x1c, 0x00, 0x28, + 0xf7, 0xd0, 0xef, 0xe7, 0x10, 0xb5, 0x04, 0x1c, + 0x0c, 0xd0, 0xa0, 0x69, 0x00, 0x28, 0x06, 0xd1, + 0x20, 0x69, 0x00, 0x28, 0x03, 0xd0, 0x06, 0xf0, + 0xf7, 0xfd, 0x00, 0x20, 0x20, 0x61, 0x20, 0x1c, + 0x3c, 0x00, 0x90, 0x15, 0x00, 0x00, 0x06, 0xf0, + 0xf2, 0xfd, 0x10, 0xbd, 0x00, 0x00, 0x10, 0xb5, + 0x00, 0x28, 0x09, 0xd0, 0xc4, 0x68, 0x03, 0xe0, + 0xff, 0xf7, 0xe7, 0xff, 0x20, 0x1c, 0xf9, 0xe7, + 0x00, 0x2c, 0xf9, 0xd1, 0xff, 0xf7, 0xe1, 0xff, + 0x10, 0xbd, 0x01, 0x1c, 0x00, 0x20, 0x04, 0xe0, + 0x0a, 0x89, 0xc9, 0x68, 0x10, 0x18, 0x00, 0x04, + 0x00, 0x0c, 0x00, 0x29, 0xf8, 0xd1, 0x70, 0x47, + 0x00, 0x00, 0x3c, 0x00, 0xcc, 0x15, 0x00, 0x00, + 0x00, 0xe0, 0x08, 0x1c, 0xc1, 0x68, 0x00, 0x29, + 0xfb, 0xd1, 0x70, 0x47, 0xf8, 0xb5, 0x06, 0x1c, + 0x0c, 0x1c, 0x1c, 0x20, 0x00, 0xf0, 0x68, 0xfa, + 0x05, 0x1c, 0x00, 0x2e, 0x01, 0xd1, 0x00, 0x2c, + 0x02, 0xd1, 0x30, 0x1c, 0x01, 0x21, 0x03, 0xe0, + 0x20, 0x1c, 0x00, 0xf0, 0x5d, 0xfa, 0x00, 0x21, + 0x00, 0x22, 0x00, 0x92, 0x0a, 0x1c, 0x01, 0x1c, + 0x23, 0x1c, 0x28, 0x1c, 0x3c, 0x00, 0x08, 0x16, + 0x00, 0x00, 0x08, 0xf0, 0xf2, 0xfb, 0x28, 0x1c, + 0xf8, 0xbd, 0xb0, 0xb5, 0x03, 0x32, 0x92, 0x08, + 0x92, 0x00, 0x14, 0x04, 0x24, 0x0c, 0x09, 0x19, + 0x1d, 0x1c, 0xc9, 0x18, 0x09, 0x04, 0x09, 0x0c, + 0xff, 0xf7, 0xd7, 0xff, 0x01, 0x89, 0x02, 0x68, + 0x12, 0x19, 0x09, 0x1b, 0x49, 0x1b, 0x02, 0x60, + 0x01, 0x81, 0xb0, 0xbd, 0x00, 0x00, 0xf8, 0xb5, + 0x0a, 0x4c, 0xa0, 0x21, 0x20, 0x1c, 0x3c, 0x00, + 0x44, 0x16, 0x00, 0x00, 0xfe, 0xf7, 0x2a, 0xff, + 0x00, 0x20, 0x26, 0x1c, 0xa0, 0x36, 0x07, 0x4d, + 0x07, 0xe0, 0x0c, 0x21, 0x41, 0x43, 0x49, 0x19, + 0x0e, 0xc9, 0x27, 0x1d, 0x0e, 0xc7, 0x20, 0x34, + 0x01, 0x30, 0xa6, 0x42, 0xf5, 0xd1, 0xf8, 0xbd, + 0xd0, 0x5c, 0x01, 0x00, 0xc8, 0x3f, 0x01, 0x00, + 0xf7, 0xb5, 0xc4, 0x68, 0x06, 0x1c, 0x00, 0x25, + 0x00, 0x2c, 0x82, 0xb0, 0x23, 0xd0, 0x20, 0x89, + 0x3c, 0x00, 0x80, 0x16, 0x00, 0x00, 0x90, 0x42, + 0x20, 0xd3, 0xe1, 0x68, 0x87, 0x1a, 0x01, 0x91, + 0x00, 0x21, 0xe1, 0x60, 0x03, 0x99, 0x00, 0x20, + 0xff, 0xf7, 0xa1, 0xff, 0x05, 0x1c, 0x20, 0x89, + 0xc0, 0x1b, 0x20, 0x81, 0x2a, 0x68, 0x03, 0x99, + 0x30, 0x1c, 0x00, 0xf0, 0x16, 0xf8, 0x20, 0x89, + 0xc0, 0x19, 0x20, 0x81, 0x01, 0x99, 0x20, 0x1c, + 0xff, 0xf7, 0xb1, 0xfe, 0x21, 0x1c, 0x28, 0x1c, + 0xff, 0xf7, 0x3c, 0x00, 0xbc, 0x16, 0x00, 0x00, + 0xad, 0xfe, 0x29, 0x1c, 0x30, 0x1c, 0xff, 0xf7, + 0xa9, 0xfe, 0x01, 0x20, 0x00, 0x2d, 0x00, 0xd1, + 0x00, 0x20, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, + 0xf7, 0xb5, 0x04, 0x1c, 0x0e, 0x1c, 0x00, 0x20, + 0x01, 0xe0, 0x20, 0x1c, 0x0c, 0x1c, 0xe1, 0x68, + 0x00, 0x29, 0xfa, 0xd1, 0x27, 0x89, 0xb7, 0x42, + 0x0a, 0xd3, 0xb8, 0x1b, 0x00, 0x04, 0x00, 0x0c, + 0x20, 0x81, 0x21, 0x68, 0x3c, 0x00, 0xf8, 0x16, + 0x00, 0x00, 0x09, 0x18, 0x02, 0x98, 0x32, 0x1c, + 0xfe, 0xf7, 0xfb, 0xfe, 0xfe, 0xbd, 0xf1, 0x1b, + 0x0d, 0x04, 0x2d, 0x0c, 0x00, 0x28, 0x19, 0xd0, + 0x01, 0x89, 0xa9, 0x42, 0x16, 0xd3, 0x49, 0x1b, + 0x09, 0x04, 0x09, 0x0c, 0x01, 0x81, 0x00, 0x68, + 0x41, 0x18, 0x02, 0x98, 0x2a, 0x1c, 0xfe, 0xf7, + 0xe8, 0xfe, 0x21, 0x68, 0x02, 0x98, 0x72, 0x1b, + 0x40, 0x19, 0xfe, 0xf7, 0xe2, 0xfe, 0x3c, 0x00, + 0x34, 0x17, 0x00, 0x00, 0x20, 0x89, 0xc0, 0x1b, + 0x20, 0x81, 0x20, 0x68, 0xc0, 0x19, 0x20, 0x60, + 0xdf, 0xe7, 0x03, 0x21, 0x8e, 0x20, 0xff, 0xf7, + 0xad, 0xfd, 0xda, 0xe7, 0xf8, 0xb5, 0x04, 0x1c, + 0x00, 0x26, 0x13, 0xe0, 0x21, 0x89, 0x00, 0x20, + 0xff, 0xf7, 0x3e, 0xff, 0x05, 0x1c, 0x22, 0x89, + 0x21, 0x68, 0x00, 0x68, 0xfe, 0xf7, 0xc8, 0xfe, + 0x00, 0x2e, 0x01, 0xd1, 0x2e, 0x1c, 0x03, 0xe0, + 0x3c, 0x00, 0x70, 0x17, 0x00, 0x00, 0x29, 0x1c, + 0x38, 0x1c, 0xff, 0xf7, 0x50, 0xfe, 0xe4, 0x68, + 0x2f, 0x1c, 0x00, 0x2c, 0xe9, 0xd1, 0x30, 0x1c, + 0xf8, 0xbd, 0xb0, 0xb5, 0x04, 0x1c, 0x00, 0x89, + 0x40, 0x1a, 0x05, 0x04, 0x20, 0x68, 0x2d, 0x0c, + 0x40, 0x18, 0x29, 0x1c, 0xff, 0xf7, 0x1f, 0xff, + 0x21, 0x89, 0x49, 0x1b, 0x21, 0x81, 0xe1, 0x68, + 0xc1, 0x60, 0xe0, 0x60, 0xb0, 0xbd, 0x10, 0xb5, + 0x03, 0x30, 0x3c, 0x00, 0xac, 0x17, 0x00, 0x00, + 0x09, 0x4a, 0x81, 0x08, 0x10, 0x68, 0x3d, 0x24, + 0x08, 0x4b, 0x64, 0x01, 0x89, 0x00, 0x09, 0x18, + 0x1b, 0x19, 0x99, 0x42, 0x01, 0xd8, 0x11, 0x60, + 0x10, 0xbd, 0x0f, 0x21, 0x80, 0x20, 0xff, 0xf7, + 0x6b, 0xfd, 0x00, 0x20, 0x10, 0xbd, 0x00, 0x00, + 0xb4, 0xcf, 0x01, 0x00, 0x14, 0xc8, 0x01, 0x00, + 0x10, 0xb5, 0x11, 0xf0, 0x61, 0xff, 0x04, 0x1c, + 0x03, 0xd1, 0x0d, 0x21, 0x3c, 0x00, 0xe8, 0x17, + 0x00, 0x00, 0x80, 0x20, 0xff, 0xf7, 0x5b, 0xfd, + 0x20, 0x1c, 0x10, 0xbd, 0x00, 0x00, 0xb0, 0xb5, + 0x01, 0x1f, 0x0b, 0x68, 0x0d, 0x48, 0x00, 0x22, + 0x83, 0x42, 0x04, 0xd0, 0x01, 0x32, 0x10, 0x30, + 0x03, 0x2a, 0xf9, 0xd3, 0x01, 0xe0, 0x03, 0x2a, + 0x06, 0xd3, 0x09, 0x24, 0x21, 0x1c, 0x80, 0x20, + 0xff, 0xf7, 0x45, 0xfd, 0x20, 0x1c, 0xb0, 0xbd, + 0x05, 0x4b, 0x00, 0x24, 0x9a, 0x79, 0x3c, 0x00, + 0x24, 0x18, 0x00, 0x00, 0x85, 0x68, 0x0d, 0x60, + 0x81, 0x60, 0x9a, 0x71, 0xf5, 0xe7, 0x00, 0x00, + 0x20, 0x57, 0x01, 0x00, 0x20, 0x10, 0x07, 0x00, + 0xb0, 0xb5, 0x00, 0x21, 0x10, 0x4a, 0x00, 0x23, + 0xd4, 0x68, 0x84, 0x42, 0x04, 0xd2, 0x01, 0x33, + 0x10, 0x32, 0x03, 0x2b, 0xf8, 0xd3, 0x01, 0xe0, + 0x03, 0x2b, 0x01, 0xd3, 0x04, 0x21, 0x0e, 0xe0, + 0x0a, 0x4c, 0xa3, 0x79, 0x90, 0x68, 0x00, 0x28, + 0x3c, 0x00, 0x60, 0x18, 0x00, 0x00, 0x02, 0xd1, + 0xa3, 0x71, 0x03, 0x21, 0x06, 0xe0, 0x05, 0x68, + 0x95, 0x60, 0xa3, 0x71, 0x00, 0x29, 0x01, 0xd1, + 0x04, 0xc0, 0xb0, 0xbd, 0x80, 0x20, 0xff, 0xf7, + 0x14, 0xfd, 0x00, 0x20, 0xb0, 0xbd, 0x20, 0x57, + 0x01, 0x00, 0x20, 0x10, 0x07, 0x00, 0xa0, 0x30, + 0x00, 0x8a, 0x40, 0x07, 0x40, 0x0f, 0x08, 0x28, + 0x0f, 0xd2, 0x01, 0xa3, 0x1b, 0x5c, 0x5b, 0x00, + 0x9f, 0x44, 0x3c, 0x00, 0x9c, 0x18, 0x00, 0x00, + 0x05, 0x03, 0x03, 0x05, 0x07, 0x07, 0x09, 0x09, + 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, + 0x02, 0x20, 0x70, 0x47, 0x03, 0x20, 0x70, 0x47, + 0x04, 0x20, 0x70, 0x47, 0xb0, 0xb5, 0x10, 0x4d, + 0x68, 0x69, 0x00, 0x28, 0x07, 0xd0, 0x0e, 0x49, + 0x00, 0x22, 0x2c, 0x31, 0x03, 0xc9, 0x01, 0x43, + 0x03, 0x20, 0x06, 0xf0, 0xcf, 0xff, 0x0b, 0x4c, + 0x00, 0x22, 0x03, 0xcc, 0x3c, 0x00, 0xd8, 0x18, + 0x00, 0x00, 0x08, 0x3c, 0x01, 0x43, 0x03, 0x20, + 0x06, 0xf0, 0xaf, 0xff, 0x03, 0xcc, 0x08, 0x43, + 0x07, 0x49, 0x4a, 0x68, 0x02, 0x43, 0x4a, 0x60, + 0x8a, 0x68, 0x10, 0x43, 0x88, 0x60, 0x01, 0x20, + 0x68, 0x61, 0xb0, 0xbd, 0x00, 0x00, 0x64, 0x73, + 0x01, 0x00, 0xb0, 0x58, 0x01, 0x00, 0x10, 0x00, + 0x07, 0x00, 0xb0, 0xb5, 0x0c, 0x1c, 0x0f, 0xf0, + 0xa8, 0xfa, 0x05, 0x4d, 0xe8, 0x6a, 0x3c, 0x00, + 0x14, 0x19, 0x00, 0x00, 0x00, 0x28, 0x06, 0xd1, + 0x00, 0x2c, 0x04, 0xd0, 0x20, 0x1c, 0x0f, 0xf0, + 0xb7, 0xfd, 0x01, 0x20, 0x28, 0x70, 0xb0, 0xbd, + 0xf4, 0x6e, 0x01, 0x00, 0x05, 0x49, 0x80, 0xb5, + 0x88, 0x6a, 0x00, 0x28, 0x04, 0xda, 0x00, 0x20, + 0x88, 0x62, 0x01, 0x21, 0x0d, 0xf0, 0x42, 0xfd, + 0x80, 0xbd, 0x00, 0x00, 0xac, 0x7e, 0x01, 0x00, + 0xf8, 0xb5, 0x1e, 0x4d, 0x04, 0x1c, 0x00, 0x20, + 0x3c, 0x00, 0x50, 0x19, 0x00, 0x00, 0x68, 0x62, + 0xa8, 0x70, 0x1c, 0x48, 0x00, 0x78, 0xc0, 0x07, + 0x22, 0xd5, 0xb8, 0x20, 0x03, 0x59, 0x1a, 0x48, + 0x00, 0x78, 0x0e, 0x28, 0x09, 0xd1, 0x0a, 0x1c, + 0x80, 0x32, 0x06, 0xd0, 0x18, 0x4e, 0x0d, 0x20, + 0x32, 0x5c, 0x8a, 0x42, 0x01, 0xdd, 0x01, 0x38, + 0xfa, 0xd1, 0x59, 0x1e, 0x0b, 0x06, 0x1b, 0x0e, + 0xab, 0x70, 0xab, 0x62, 0x0e, 0x28, 0x0b, 0xd2, + 0x08, 0xe0, 0x3c, 0x00, 0x8c, 0x19, 0x00, 0x00, + 0x62, 0x18, 0xb0, 0x32, 0x12, 0x7b, 0x82, 0x42, + 0x02, 0xd8, 0x58, 0x1a, 0xa8, 0x62, 0x02, 0xe0, + 0x01, 0x39, 0x00, 0x29, 0xf4, 0xda, 0x0e, 0xf0, + 0x35, 0xf9, 0x00, 0x90, 0x00, 0xab, 0x18, 0x78, + 0x59, 0x78, 0x81, 0x42, 0x00, 0xd9, 0x58, 0x78, + 0xed, 0x30, 0xe8, 0x70, 0x01, 0x21, 0x20, 0x1c, + 0x0d, 0xf0, 0x02, 0xfd, 0xf8, 0xbd, 0x00, 0x00, + 0xac, 0x7e, 0x01, 0x00, 0x3c, 0x00, 0xc8, 0x19, + 0x00, 0x00, 0x1d, 0x75, 0x01, 0x00, 0x11, 0x67, + 0x01, 0x00, 0xc7, 0x52, 0x01, 0x00, 0x0e, 0x49, + 0x10, 0xb5, 0x08, 0x69, 0x8b, 0x68, 0xc2, 0x00, + 0xd4, 0x18, 0x62, 0x68, 0x00, 0x2a, 0x0f, 0xd1, + 0x01, 0x30, 0x08, 0x61, 0x07, 0x28, 0x01, 0xd1, + 0x00, 0x20, 0x08, 0x61, 0x20, 0x1c, 0x00, 0xf0, + 0x24, 0xf8, 0x05, 0x48, 0x21, 0x68, 0x54, 0x30, + 0x02, 0x6a, 0xfe, 0xf7, 0xec, 0xfc, 0x3c, 0x00, + 0x04, 0x1a, 0x00, 0x00, 0x10, 0xbd, 0x06, 0x21, + 0x06, 0x20, 0xff, 0xf7, 0x4b, 0xfc, 0x10, 0xbd, + 0x50, 0x6d, 0x01, 0x00, 0x08, 0x49, 0x09, 0x79, + 0xc9, 0x07, 0x08, 0x4a, 0x08, 0xd4, 0x00, 0xe0, + 0x08, 0x1c, 0xc1, 0x68, 0x00, 0x29, 0xfb, 0xd1, + 0x01, 0x89, 0x04, 0x31, 0x01, 0x81, 0x00, 0xe0, + 0x00, 0x20, 0xd0, 0x62, 0x70, 0x47, 0x00, 0x00, + 0x60, 0x80, 0x07, 0x00, 0x04, 0x6c, 0x01, 0x00, + 0x3c, 0x00, 0x40, 0x1a, 0x00, 0x00, 0x10, 0xb5, + 0x04, 0x1c, 0x19, 0x21, 0x89, 0x01, 0x00, 0x20, + 0xff, 0xf7, 0xc5, 0xfd, 0x01, 0x1c, 0x60, 0x60, + 0x20, 0x68, 0xff, 0xf7, 0xe0, 0xfc, 0x60, 0x68, + 0x21, 0x68, 0x08, 0x30, 0x08, 0x60, 0x10, 0xbd, + 0x00, 0x00, 0x0a, 0x28, 0x01, 0xda, 0x04, 0x20, + 0x04, 0xe0, 0x50, 0x28, 0x01, 0xda, 0x05, 0x20, + 0x00, 0xe0, 0x07, 0x20, 0x04, 0x4a, 0x11, 0x78, + 0x38, 0x23, 0x3c, 0x00, 0x7c, 0x1a, 0x00, 0x00, + 0xc0, 0x00, 0x18, 0x40, 0x99, 0x43, 0x08, 0x43, + 0x10, 0x70, 0x70, 0x47, 0x88, 0x00, 0x07, 0x00, + 0xb0, 0xb5, 0x05, 0x1c, 0x07, 0x48, 0x40, 0x68, + 0x08, 0xe0, 0x01, 0x69, 0xa9, 0x42, 0x04, 0xd1, + 0x44, 0x68, 0x05, 0xf0, 0xc7, 0xfd, 0x20, 0x1c, + 0x00, 0xe0, 0x40, 0x68, 0x00, 0x28, 0xf4, 0xd1, + 0xb0, 0xbd, 0x00, 0x00, 0x58, 0x75, 0x01, 0x00, + 0xf8, 0xb5, 0x00, 0x25, 0x3c, 0x00, 0xb8, 0x1a, + 0x00, 0x00, 0x06, 0xf0, 0x84, 0xfd, 0x11, 0x4f, + 0x04, 0x1c, 0xbe, 0x79, 0x20, 0x68, 0x00, 0x28, + 0x07, 0xd1, 0xa0, 0x88, 0x04, 0x30, 0xff, 0xf7, + 0xf2, 0xf8, 0x00, 0x28, 0x06, 0xd1, 0x01, 0x21, + 0x0f, 0xe0, 0x01, 0x68, 0x21, 0x60, 0xa1, 0x69, + 0x01, 0x39, 0xa1, 0x61, 0x10, 0xc0, 0x05, 0x1c, + 0x20, 0x69, 0x01, 0x30, 0x20, 0x61, 0x61, 0x69, + 0x40, 0x1a, 0xe1, 0x68, 0x88, 0x42, 0x3c, 0x00, + 0xf4, 0x1a, 0x00, 0x00, 0x03, 0xd9, 0x07, 0x21, + 0x8e, 0x20, 0xff, 0xf7, 0xd3, 0xfb, 0xbe, 0x71, + 0x28, 0x1c, 0xf8, 0xbd, 0x20, 0x10, 0x07, 0x00, + 0xb0, 0xb5, 0x09, 0xf0, 0xbb, 0xff, 0x2f, 0x4c, + 0x00, 0x28, 0x20, 0x74, 0x03, 0xd0, 0x01, 0x21, + 0x01, 0x20, 0x0a, 0xf0, 0x71, 0xfc, 0x2b, 0x4d, + 0x14, 0x35, 0x28, 0x68, 0x00, 0x28, 0x4d, 0xd0, + 0x01, 0x21, 0x0f, 0x20, 0x11, 0xf0, 0x82, 0xfd, + 0x3c, 0x00, 0x30, 0x1b, 0x00, 0x00, 0x28, 0x89, + 0x08, 0xf0, 0xfb, 0xff, 0x01, 0x1c, 0x01, 0x22, + 0x0f, 0x20, 0x11, 0xf0, 0x40, 0xfd, 0xe0, 0x78, + 0x01, 0x25, 0x02, 0x28, 0x36, 0xd1, 0x0a, 0xf0, + 0xc6, 0xf8, 0x00, 0x28, 0x0a, 0xd0, 0x0b, 0xf0, + 0x92, 0xfb, 0x1e, 0x49, 0x09, 0x68, 0x40, 0x18, + 0x11, 0xf0, 0x5f, 0xf8, 0x00, 0x28, 0x01, 0xd1, + 0x02, 0x20, 0x2f, 0xe0, 0xe0, 0x78, 0x02, 0x28, + 0x24, 0xd1, 0x3c, 0x00, 0x6c, 0x1b, 0x00, 0x00, + 0x60, 0x70, 0x25, 0x70, 0x60, 0x68, 0x01, 0x28, + 0x1c, 0xd0, 0x15, 0x48, 0x10, 0x38, 0x81, 0x7b, + 0x00, 0x29, 0x04, 0xd1, 0x85, 0x73, 0x0f, 0x20, + 0x13, 0x49, 0x10, 0xf0, 0x01, 0xfc, 0x08, 0xf0, + 0x4f, 0xfe, 0x00, 0x28, 0x07, 0xd0, 0x0e, 0x48, + 0x01, 0x21, 0x98, 0x38, 0x00, 0x69, 0x01, 0xf0, + 0xb7, 0xfd, 0x00, 0x28, 0x05, 0xd0, 0x01, 0x20, + 0x0e, 0xf0, 0x0c, 0xfd, 0x3c, 0x00, 0xa8, 0x1b, + 0x00, 0x00, 0x01, 0x20, 0x0e, 0xf0, 0x1d, 0xfc, + 0xb0, 0xbd, 0x05, 0xf0, 0xdc, 0xfe, 0xb0, 0xbd, + 0xe0, 0x78, 0x00, 0x28, 0x01, 0xd1, 0x25, 0x70, + 0xf7, 0xe7, 0x03, 0x20, 0x00, 0xe0, 0x04, 0x20, + 0x0d, 0xf0, 0x8d, 0xfa, 0xb0, 0xbd, 0x84, 0x66, + 0x01, 0x00, 0x6c, 0x57, 0x01, 0x00, 0xe9, 0x03, + 0x01, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0x00, 0x21, + 0x00, 0x20, 0x0a, 0x4d, 0x00, 0xe0, 0x3c, 0x00, + 0xe4, 0x1b, 0x00, 0x00, 0x01, 0x31, 0xcb, 0x00, + 0x5a, 0x19, 0x16, 0x79, 0x01, 0x2e, 0x02, 0xd0, + 0x52, 0x79, 0xa2, 0x42, 0x02, 0xd0, 0x0b, 0x29, + 0xf4, 0xd3, 0x70, 0xbd, 0x0b, 0x29, 0xfc, 0xd2, + 0xc8, 0x00, 0x01, 0x21, 0x5a, 0x19, 0x28, 0x58, + 0x11, 0x71, 0x70, 0xbd, 0x38, 0x58, 0x01, 0x00, + 0x05, 0x48, 0x80, 0xb5, 0x00, 0x7f, 0x24, 0x23, + 0x04, 0x49, 0x58, 0x43, 0x40, 0x18, 0x00, 0x6a, + 0x3c, 0x00, 0x20, 0x1c, 0x00, 0x00, 0xfe, 0xf7, + 0xda, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0xd4, 0x79, + 0x01, 0x00, 0x94, 0x46, 0x01, 0x00, 0x80, 0xb5, + 0x04, 0xf0, 0x37, 0xff, 0x00, 0x20, 0x11, 0xf0, + 0x84, 0xfc, 0x00, 0x20, 0x80, 0xbd, 0xb0, 0xb5, + 0x05, 0x4c, 0x05, 0x1c, 0x20, 0x6b, 0xe1, 0x6a, + 0x02, 0xf0, 0xe3, 0xfd, 0x29, 0x1c, 0xa0, 0x6a, + 0x02, 0xf0, 0x11, 0xfb, 0xb0, 0xbd, 0xa4, 0x6c, + 0x01, 0x00, 0x3c, 0x00, 0x5c, 0x1c, 0x00, 0x00, + 0xb0, 0xb5, 0x03, 0x1c, 0x08, 0x1c, 0x14, 0x1c, + 0x00, 0x2b, 0x0c, 0x4d, 0x09, 0xd0, 0x69, 0x69, + 0x89, 0x00, 0x01, 0x31, 0x0a, 0x04, 0x12, 0x0c, + 0x22, 0x80, 0x29, 0x1c, 0xfe, 0xf7, 0x3e, 0xfc, + 0x0a, 0xe0, 0x01, 0x1c, 0x28, 0x1c, 0x22, 0x88, + 0xfe, 0xf7, 0x38, 0xfc, 0x20, 0x88, 0x01, 0x28, + 0x02, 0xd9, 0x80, 0x08, 0x01, 0x38, 0x68, 0x61, + 0x01, 0x20, 0xb0, 0xbd, 0x3c, 0x00, 0x98, 0x1c, + 0x00, 0x00, 0x20, 0x6e, 0x01, 0x00, 0xf1, 0xb5, + 0x00, 0x98, 0x00, 0x26, 0xc1, 0x68, 0x08, 0x68, + 0x09, 0x89, 0x1c, 0x29, 0x34, 0xd3, 0xc1, 0x88, + 0xff, 0x23, 0x01, 0x33, 0x99, 0x42, 0x2f, 0xd1, + 0x01, 0x88, 0xc9, 0x1a, 0x2c, 0xd1, 0x41, 0x88, + 0x08, 0x29, 0x29, 0xd1, 0x01, 0x79, 0x06, 0x29, + 0x26, 0xd1, 0x41, 0x79, 0x04, 0x29, 0x23, 0xd1, + 0x00, 0x25, 0x00, 0x24, 0x07, 0x1c, 0x3c, 0x00, + 0xd4, 0x1c, 0x00, 0x00, 0x18, 0x37, 0x0b, 0xe0, + 0xa0, 0x00, 0x41, 0x18, 0x04, 0x31, 0x04, 0x22, + 0x38, 0x1c, 0xfe, 0xf7, 0x8b, 0xfb, 0x00, 0x28, + 0x01, 0xd1, 0x01, 0x25, 0x04, 0xe0, 0x01, 0x34, + 0x0a, 0x49, 0x48, 0x69, 0xa0, 0x42, 0xef, 0xd8, + 0x08, 0x49, 0x08, 0x78, 0x00, 0x28, 0x0a, 0xd0, + 0x01, 0x28, 0x01, 0xd0, 0x02, 0x28, 0x06, 0xd1, + 0x00, 0x2d, 0x04, 0xd1, 0x00, 0x98, 0xc0, 0x68, + 0x3c, 0x00, 0x10, 0x1d, 0x00, 0x00, 0xff, 0xf7, + 0x42, 0xfc, 0x01, 0x26, 0x30, 0x1c, 0xf8, 0xbd, + 0x00, 0x00, 0x20, 0x6e, 0x01, 0x00, 0x01, 0x48, + 0x40, 0x68, 0x70, 0x47, 0x00, 0x00, 0x20, 0x6e, + 0x01, 0x00, 0x02, 0x49, 0x48, 0x60, 0x01, 0x20, + 0x48, 0x61, 0x70, 0x47, 0x00, 0x00, 0x20, 0x6e, + 0x01, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0x01, 0x26, + 0x03, 0xf0, 0xef, 0xfa, 0x25, 0x1c, 0x10, 0x35, + 0x00, 0x28, 0x3c, 0x00, 0x4c, 0x1d, 0x00, 0x00, + 0x04, 0xd0, 0x00, 0x20, 0x20, 0x77, 0x03, 0xf0, + 0xf1, 0xfb, 0x07, 0xe0, 0x03, 0xf0, 0x38, 0xfd, + 0x00, 0x28, 0x09, 0xd0, 0x01, 0x20, 0x20, 0x77, + 0x03, 0xf0, 0xce, 0xfc, 0x01, 0x1c, 0x06, 0x22, + 0x28, 0x1c, 0xfe, 0xf7, 0xc3, 0xfb, 0x02, 0xe0, + 0x02, 0x20, 0x20, 0x77, 0x00, 0x26, 0x30, 0x1c, + 0x70, 0xbd, 0x00, 0x00, 0x03, 0x48, 0x80, 0x7a, + 0xc0, 0x07, 0x03, 0x49, 0x3c, 0x00, 0x88, 0x1d, + 0x00, 0x00, 0xc0, 0x0f, 0x88, 0x62, 0x70, 0x47, + 0x00, 0x00, 0x40, 0x90, 0x07, 0x00, 0xa4, 0x6c, + 0x01, 0x00, 0x01, 0x49, 0x01, 0x20, 0x88, 0x62, + 0x70, 0x47, 0xa4, 0x6c, 0x01, 0x00, 0x06, 0x48, + 0x80, 0x7a, 0xc1, 0x07, 0x06, 0x4a, 0xc9, 0x0f, + 0x91, 0x62, 0x20, 0x21, 0x80, 0x07, 0x00, 0xd4, + 0x00, 0x21, 0xa0, 0x32, 0x11, 0x70, 0x70, 0x47, + 0x00, 0x00, 0x40, 0x90, 0x07, 0x00, 0x3c, 0x00, + 0xc4, 0x1d, 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, + 0x07, 0x4a, 0x12, 0x68, 0x07, 0x4b, 0x9b, 0x69, + 0x1a, 0x40, 0x01, 0xd0, 0x01, 0x22, 0x00, 0xe0, + 0x00, 0x22, 0x0a, 0x60, 0x01, 0x21, 0x00, 0x2a, + 0x00, 0xd0, 0x00, 0x21, 0x01, 0x60, 0x70, 0x47, + 0x10, 0x00, 0x07, 0x00, 0xa4, 0x6c, 0x01, 0x00, + 0x01, 0x22, 0x02, 0x60, 0x0a, 0x60, 0x70, 0x47, + 0xb0, 0xb5, 0x0d, 0x1c, 0x01, 0x1c, 0x58, 0x31, + 0x3c, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x04, 0x1c, + 0x06, 0x22, 0x28, 0x1d, 0xfe, 0xf7, 0x77, 0xfb, + 0x21, 0x1c, 0x5e, 0x31, 0x06, 0x22, 0x28, 0x1c, + 0x0a, 0x30, 0xfe, 0xf7, 0x70, 0xfb, 0x21, 0x1c, + 0x64, 0x31, 0x06, 0x22, 0x28, 0x1c, 0x10, 0x30, + 0xfe, 0xf7, 0x69, 0xfb, 0xb0, 0xbd, 0xfe, 0xb5, + 0x00, 0x25, 0x1d, 0x72, 0x17, 0x1c, 0x0e, 0x1c, + 0xb2, 0x6d, 0x00, 0x21, 0x92, 0x19, 0x50, 0x32, + 0xd2, 0x7a, 0x3c, 0x00, 0x3c, 0x1e, 0x00, 0x00, + 0x1c, 0x1c, 0x5a, 0x72, 0x00, 0x78, 0x32, 0x1c, + 0x80, 0x32, 0xc0, 0x07, 0xc0, 0x17, 0x01, 0x30, + 0x01, 0x90, 0x08, 0x98, 0x02, 0x92, 0x00, 0x28, + 0x01, 0xd1, 0x30, 0x7f, 0x2b, 0xe0, 0x37, 0x48, + 0x00, 0x68, 0x00, 0x28, 0x00, 0xdd, 0x01, 0x1c, + 0x01, 0x98, 0x00, 0x28, 0x02, 0xd0, 0x08, 0x98, + 0x01, 0x28, 0x10, 0xd1, 0x02, 0x9a, 0x90, 0x6b, + 0x00, 0x28, 0x06, 0xd0, 0x3c, 0x00, 0x78, 0x1e, + 0x00, 0x00, 0x88, 0x42, 0x01, 0xd9, 0x45, 0x1a, + 0x01, 0x3d, 0x70, 0x19, 0xb0, 0x30, 0x03, 0xe0, + 0xb5, 0x6d, 0x01, 0x3d, 0x70, 0x19, 0x50, 0x30, + 0x00, 0x7b, 0x0f, 0xe0, 0x02, 0x9a, 0x10, 0x6a, + 0x00, 0x28, 0x07, 0xd0, 0x88, 0x42, 0x01, 0xd9, + 0x45, 0x1a, 0x01, 0x3d, 0x70, 0x19, 0xa0, 0x30, + 0x00, 0x79, 0x03, 0xe0, 0xbd, 0x69, 0x01, 0x3d, + 0x78, 0x19, 0x00, 0x7f, 0xa0, 0x72, 0x3c, 0x00, + 0xb4, 0x1e, 0x00, 0x00, 0x0e, 0xf0, 0x0c, 0xf8, + 0x0e, 0x28, 0x11, 0xd1, 0xa0, 0x7a, 0x08, 0xf0, + 0x67, 0xff, 0x00, 0x28, 0x0c, 0xd0, 0x78, 0x68, + 0x00, 0x28, 0x05, 0xd1, 0x1b, 0x48, 0x00, 0x25, + 0x00, 0x78, 0x08, 0xf0, 0x4b, 0xff, 0x02, 0xe0, + 0x45, 0x1e, 0x78, 0x19, 0x00, 0x7a, 0xa0, 0x72, + 0x02, 0x9a, 0x50, 0x69, 0x00, 0x28, 0x17, 0xd0, + 0x08, 0x98, 0x01, 0x28, 0x14, 0xd0, 0xa0, 0x7a, + 0x3c, 0x00, 0xf0, 0x1e, 0x00, 0x00, 0x08, 0xf0, + 0x4e, 0xff, 0x00, 0x28, 0x0f, 0xd0, 0x01, 0x98, + 0x00, 0x28, 0x07, 0xd0, 0x02, 0x20, 0x20, 0x72, + 0x70, 0x6c, 0x80, 0x19, 0x40, 0x30, 0xc0, 0x79, + 0x60, 0x72, 0x04, 0xe0, 0x7d, 0x68, 0x01, 0x3d, + 0x78, 0x19, 0x00, 0x7a, 0xa0, 0x72, 0x02, 0x9a, + 0xa0, 0x7a, 0x91, 0x69, 0x08, 0xf0, 0x51, 0xff, + 0x20, 0x60, 0x02, 0x9a, 0x60, 0x7a, 0x91, 0x69, + 0x08, 0xf0, 0x3c, 0x00, 0x2c, 0x1f, 0x00, 0x00, + 0x4b, 0xff, 0x60, 0x60, 0xa0, 0x7a, 0xe0, 0x72, + 0x25, 0x73, 0xfe, 0xbd, 0xd4, 0x7e, 0x01, 0x00, + 0x90, 0x57, 0x01, 0x00, 0x00, 0x06, 0x00, 0x0e, + 0x00, 0x2a, 0x8c, 0xb5, 0x01, 0xd0, 0x8a, 0x22, + 0x00, 0xe0, 0x88, 0x22, 0x00, 0xab, 0x1a, 0x80, + 0x0c, 0xf0, 0xc2, 0xf8, 0x01, 0x90, 0x68, 0x46, + 0x0b, 0xf0, 0xbc, 0xfa, 0x8c, 0xbd, 0x00, 0x00, + 0x01, 0x1c, 0x08, 0x48, 0x3c, 0x00, 0x68, 0x1f, + 0x00, 0x00, 0x80, 0xb5, 0x00, 0x68, 0x00, 0x28, + 0x09, 0xd0, 0x49, 0x68, 0x02, 0x20, 0x00, 0x29, + 0x00, 0xd1, 0x01, 0x20, 0x01, 0x06, 0x09, 0x0e, + 0x00, 0x20, 0x06, 0xf0, 0xd8, 0xff, 0x80, 0xbd, + 0x00, 0x00, 0x20, 0x67, 0x01, 0x00, 0x1c, 0xb5, + 0x01, 0x90, 0x04, 0x1c, 0x44, 0x30, 0x01, 0xaa, + 0x69, 0x46, 0x11, 0xf0, 0xb8, 0xfd, 0x00, 0x28, + 0x0b, 0xd0, 0xa0, 0x69, 0x00, 0x21, 0x3c, 0x00, + 0xa4, 0x1f, 0x00, 0x00, 0xc2, 0x07, 0xd2, 0x0f, + 0x02, 0x20, 0xff, 0xf7, 0xc9, 0xff, 0x00, 0x21, + 0x20, 0x1c, 0x0f, 0xf0, 0xd9, 0xfe, 0x1c, 0xbd, + 0x04, 0x21, 0x98, 0x20, 0xff, 0xf7, 0x72, 0xf9, + 0xf9, 0xe7, 0x00, 0x00, 0x8c, 0xb5, 0x00, 0xab, + 0x84, 0x21, 0x19, 0x80, 0x05, 0x4b, 0x02, 0x1c, + 0x18, 0x1c, 0x99, 0x8a, 0x0c, 0xf0, 0x8e, 0xf8, + 0x01, 0x90, 0x68, 0x46, 0x0b, 0xf0, 0x7c, 0xfa, + 0x3c, 0x00, 0xe0, 0x1f, 0x00, 0x00, 0x8c, 0xbd, + 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0x70, 0x47, + 0x00, 0x00, 0x06, 0x49, 0x80, 0xb5, 0xc9, 0x68, + 0x14, 0x23, 0x40, 0x31, 0x89, 0x7a, 0x04, 0x4a, + 0x59, 0x43, 0x89, 0x18, 0x80, 0x00, 0x08, 0x58, + 0xfe, 0xf7, 0xe9, 0xf9, 0x80, 0xbd, 0x70, 0x7c, + 0x01, 0x00, 0x54, 0x47, 0x01, 0x00, 0x80, 0xb5, + 0x00, 0x20, 0xff, 0xf7, 0xd6, 0xff, 0x80, 0xbd, + 0x00, 0x00, 0x3c, 0x00, 0x1c, 0x20, 0x00, 0x00, + 0x80, 0xb5, 0x12, 0x48, 0x11, 0x49, 0x80, 0x8a, + 0x0a, 0x8b, 0x00, 0x21, 0x00, 0x28, 0xc2, 0xb0, + 0x0c, 0xd1, 0x01, 0x2a, 0x05, 0xd0, 0x02, 0x2a, + 0x15, 0xd0, 0x00, 0xab, 0x5a, 0x80, 0x0e, 0x22, + 0x07, 0xe0, 0x02, 0x22, 0x00, 0xab, 0x5a, 0x80, + 0x99, 0x80, 0x04, 0xe0, 0x00, 0xab, 0x5a, 0x80, + 0x0d, 0x22, 0x00, 0xab, 0x9a, 0x80, 0x00, 0xab, + 0x18, 0x80, 0xff, 0x20, 0x3c, 0x00, 0x58, 0x20, + 0x00, 0x00, 0x98, 0x71, 0xd9, 0x71, 0x68, 0x46, + 0x00, 0xf0, 0xd1, 0xf9, 0x42, 0xb0, 0x80, 0xbd, + 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0x10, 0xb5, + 0x09, 0xf0, 0x5f, 0xfc, 0x00, 0x20, 0x05, 0xf0, + 0x2a, 0xf9, 0x03, 0x4c, 0xe0, 0x8a, 0x05, 0xf0, + 0x36, 0xf9, 0x20, 0x1c, 0x0f, 0xf0, 0xb3, 0xfe, + 0x10, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x1c, 0xb5, + 0x09, 0xf0, 0x4f, 0xfc, 0x07, 0x20, 0x3c, 0x00, + 0x94, 0x20, 0x00, 0x00, 0x00, 0xab, 0x07, 0x4c, + 0x18, 0x80, 0xe1, 0x8a, 0x20, 0x1c, 0x0c, 0xf0, + 0x0b, 0xf8, 0x01, 0x90, 0x68, 0x46, 0x0b, 0xf0, + 0x17, 0xfa, 0x20, 0x1c, 0x0f, 0xf0, 0x9e, 0xfe, + 0x1c, 0xbd, 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, + 0x80, 0xb5, 0x02, 0x21, 0x98, 0x20, 0xff, 0xf7, + 0xf1, 0xf8, 0x80, 0xbd, 0x10, 0xb5, 0x15, 0x4c, + 0xc2, 0xb0, 0xa0, 0x8a, 0x00, 0x28, 0x03, 0xd0, + 0x3c, 0x00, 0xd0, 0x20, 0x00, 0x00, 0x01, 0x28, + 0x1e, 0xd1, 0x02, 0x20, 0x00, 0xe0, 0x01, 0x20, + 0xe1, 0x68, 0x40, 0x31, 0x88, 0x72, 0x20, 0x69, + 0x08, 0xf0, 0x23, 0xfd, 0x02, 0x1c, 0x0c, 0x48, + 0x18, 0x38, 0x80, 0x88, 0xe1, 0x68, 0x0f, 0xf0, + 0xa4, 0xfe, 0xa0, 0x8a, 0x00, 0xab, 0x18, 0x80, + 0x01, 0x20, 0x58, 0x80, 0x00, 0x20, 0x98, 0x80, + 0xff, 0x21, 0x99, 0x71, 0xd8, 0x71, 0x68, 0x46, + 0x00, 0xf0, 0x3c, 0x00, 0x0c, 0x21, 0x00, 0x00, + 0x7b, 0xf9, 0x42, 0xb0, 0x10, 0xbd, 0x03, 0x21, + 0x98, 0x20, 0xff, 0xf7, 0xc5, 0xf8, 0xf8, 0xe7, + 0x70, 0x7c, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x80, 0xb5, 0x03, 0x48, 0x0f, 0xf0, 0x60, 0xfe, + 0x00, 0x20, 0x05, 0xf0, 0xcd, 0xf8, 0x80, 0xbd, + 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x48, + 0x0f, 0xf0, 0x56, 0xfe, 0x80, 0xbd, 0x00, 0x00, + 0x70, 0x7c, 0x01, 0x00, 0x3c, 0x00, 0x48, 0x21, + 0x00, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x98, 0x20, + 0xff, 0xf7, 0xa9, 0xf8, 0x80, 0xbd, 0x80, 0xb5, + 0x03, 0x20, 0xff, 0xf7, 0x34, 0xff, 0x80, 0xbd, + 0x00, 0x00, 0xf0, 0xb5, 0x21, 0x4e, 0x00, 0x27, + 0xb1, 0x8a, 0x30, 0x1c, 0x00, 0x25, 0x04, 0x24, + 0x00, 0x29, 0x00, 0x8b, 0xc3, 0xb0, 0x1e, 0xd1, + 0x01, 0x28, 0x07, 0xd0, 0x31, 0x1c, 0x49, 0x8b, + 0x02, 0x28, 0x12, 0xd1, 0x00, 0x29, 0x3c, 0x00, + 0x84, 0x21, 0x00, 0x00, 0x07, 0xd1, 0x00, 0x24, + 0x05, 0xe0, 0x00, 0x24, 0x01, 0x25, 0x02, 0x20, + 0x00, 0xab, 0xd8, 0x80, 0x1f, 0x81, 0x0f, 0xf0, + 0x7f, 0xff, 0x00, 0x2c, 0x10, 0xd1, 0xf1, 0x68, + 0x05, 0x20, 0x40, 0x31, 0x88, 0x72, 0x0e, 0xe0, + 0x00, 0x29, 0x1a, 0xd1, 0x00, 0xab, 0xd8, 0x80, + 0x0e, 0x20, 0x02, 0xe0, 0x00, 0xab, 0xd8, 0x80, + 0x0d, 0x20, 0x00, 0xab, 0x18, 0x81, 0x07, 0xe0, + 0x3c, 0x00, 0xc0, 0x21, 0x00, 0x00, 0x30, 0x1c, + 0x0f, 0xf0, 0x13, 0xfe, 0x20, 0x1c, 0xff, 0xf7, + 0xfc, 0xfe, 0x00, 0x2d, 0x08, 0xd0, 0xb0, 0x8a, + 0x00, 0xab, 0x98, 0x80, 0xff, 0x20, 0x98, 0x72, + 0xdf, 0x72, 0x01, 0xa8, 0x00, 0xf0, 0x11, 0xf9, + 0x43, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0x70, 0x7c, + 0x01, 0x00, 0x10, 0xb5, 0x00, 0x20, 0x05, 0xf0, + 0x6c, 0xf8, 0x04, 0x4c, 0xe0, 0x8a, 0x05, 0xf0, + 0x78, 0xf8, 0x3c, 0x00, 0xfc, 0x21, 0x00, 0x00, + 0x0f, 0xf0, 0x4c, 0xff, 0x20, 0x1c, 0x0f, 0xf0, + 0xf3, 0xfd, 0x10, 0xbd, 0x70, 0x7c, 0x01, 0x00, + 0x80, 0xb5, 0x04, 0x20, 0xff, 0xf7, 0xd8, 0xfe, + 0x01, 0x48, 0x0f, 0xf0, 0xe9, 0xfd, 0x80, 0xbd, + 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x20, + 0xff, 0xf7, 0xce, 0xfe, 0x01, 0x20, 0x05, 0xf0, + 0x5f, 0xf8, 0x02, 0x48, 0x0f, 0xf0, 0xdc, 0xfd, + 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x38, 0x22, + 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, + 0x03, 0x20, 0xff, 0xf7, 0xc0, 0xfe, 0x80, 0xbd, + 0x00, 0x00, 0xb0, 0xb5, 0x1d, 0x4d, 0xc2, 0xb0, + 0x28, 0x8b, 0x00, 0xab, 0xff, 0x21, 0x58, 0x80, + 0x99, 0x71, 0x00, 0x21, 0xd9, 0x71, 0xaa, 0x8a, + 0x00, 0x24, 0x01, 0x2a, 0x18, 0xd1, 0x2a, 0x1c, + 0x52, 0x8b, 0x02, 0x28, 0x0f, 0xd1, 0x00, 0x2a, + 0x16, 0xd1, 0x03, 0x20, 0x58, 0x80, 0x3c, 0x00, + 0x74, 0x22, 0x00, 0x00, 0x99, 0x80, 0x2c, 0x1c, + 0xff, 0x22, 0x98, 0x1d, 0xe9, 0x69, 0xfe, 0xf7, + 0x3b, 0xf9, 0xe1, 0x68, 0x04, 0x20, 0x40, 0x31, + 0x88, 0x72, 0x10, 0xe0, 0x00, 0x2a, 0x06, 0xd1, + 0x01, 0x24, 0x0e, 0x20, 0x01, 0xe0, 0x01, 0x24, + 0x0d, 0x20, 0x00, 0xab, 0x98, 0x80, 0x28, 0x1c, + 0x0f, 0xf0, 0xa4, 0xfd, 0x04, 0x20, 0xff, 0xf7, + 0x8d, 0xfe, 0x00, 0x2c, 0x05, 0xd0, 0xa8, 0x8a, + 0x3c, 0x00, 0xb0, 0x22, 0x00, 0x00, 0x00, 0xab, + 0x18, 0x80, 0x68, 0x46, 0x00, 0xf0, 0xa5, 0xf8, + 0x42, 0xb0, 0xb0, 0xbd, 0x00, 0x00, 0x70, 0x7c, + 0x01, 0x00, 0x10, 0xb5, 0x00, 0x20, 0x05, 0xf0, + 0x00, 0xf8, 0x03, 0x4c, 0xe0, 0x8a, 0x05, 0xf0, + 0x0c, 0xf8, 0x20, 0x1c, 0x0f, 0xf0, 0x89, 0xfd, + 0x10, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, + 0x04, 0x20, 0xff, 0xf7, 0x6e, 0xfe, 0x01, 0x48, + 0x0f, 0xf0, 0x3c, 0x00, 0xec, 0x22, 0x00, 0x00, + 0x7f, 0xfd, 0x80, 0xbd, 0x70, 0x7c, 0x01, 0x00, + 0x80, 0xb5, 0x02, 0x20, 0xff, 0xf7, 0x64, 0xfe, + 0x01, 0x20, 0x04, 0xf0, 0xf5, 0xff, 0x02, 0x48, + 0x0f, 0xf0, 0x72, 0xfd, 0x80, 0xbd, 0x00, 0x00, + 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x03, 0x20, + 0xff, 0xf7, 0x56, 0xfe, 0x80, 0xbd, 0x00, 0x00, + 0xb0, 0xb5, 0x19, 0x4d, 0x04, 0x24, 0xa9, 0x8a, + 0x28, 0x1c, 0x02, 0x8b, 0x3c, 0x00, 0x28, 0x23, + 0x00, 0x00, 0xc2, 0xb0, 0x01, 0x29, 0x14, 0xd1, + 0x40, 0x8b, 0x04, 0x2a, 0x0b, 0xd1, 0x00, 0x28, + 0x00, 0xd1, 0x00, 0x24, 0x0f, 0xf0, 0xad, 0xfe, + 0x00, 0x2c, 0x19, 0xd1, 0xe9, 0x68, 0x05, 0x20, + 0x40, 0x31, 0x88, 0x72, 0x17, 0xe0, 0x00, 0x28, + 0x10, 0xd1, 0x00, 0xab, 0x5a, 0x80, 0x0e, 0x20, + 0x02, 0xe0, 0x00, 0xab, 0x5a, 0x80, 0x0d, 0x20, + 0x00, 0xab, 0x98, 0x80, 0x19, 0x80, 0x3c, 0x00, + 0x64, 0x23, 0x00, 0x00, 0xff, 0x20, 0x98, 0x71, + 0x00, 0x20, 0xd8, 0x71, 0x68, 0x46, 0x00, 0xf0, + 0x49, 0xf8, 0x42, 0xb0, 0xb0, 0xbd, 0x28, 0x1c, + 0x0f, 0xf0, 0x38, 0xfd, 0x20, 0x1c, 0xff, 0xf7, + 0x21, 0xfe, 0xf6, 0xe7, 0x70, 0x7c, 0x01, 0x00, + 0x10, 0xb5, 0x00, 0x20, 0x04, 0xf0, 0x9e, 0xff, + 0x03, 0x4c, 0xe0, 0x8a, 0x04, 0xf0, 0xaa, 0xff, + 0x20, 0x1c, 0x0f, 0xf0, 0x27, 0xfd, 0x10, 0xbd, + 0x3c, 0x00, 0xa0, 0x23, 0x00, 0x00, 0x70, 0x7c, + 0x01, 0x00, 0x80, 0xb5, 0x04, 0x20, 0xff, 0xf7, + 0x0c, 0xfe, 0x01, 0x48, 0x0f, 0xf0, 0x1d, 0xfd, + 0x80, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, + 0x02, 0x20, 0xff, 0xf7, 0x02, 0xfe, 0x01, 0x20, + 0x04, 0xf0, 0x93, 0xff, 0x02, 0x48, 0x0f, 0xf0, + 0x10, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0x70, 0x7c, + 0x01, 0x00, 0xb0, 0xb5, 0x0a, 0x4d, 0x01, 0x1c, + 0x44, 0x31, 0x3c, 0x00, 0xdc, 0x23, 0x00, 0x00, + 0x04, 0x1c, 0x06, 0x22, 0x28, 0x1c, 0xfe, 0xf7, + 0x89, 0xf8, 0xec, 0x60, 0x20, 0x69, 0x03, 0xf0, + 0x97, 0xf8, 0x01, 0x1c, 0x06, 0x22, 0xa8, 0x18, + 0xfe, 0xf7, 0x80, 0xf8, 0x04, 0x20, 0xff, 0xf7, + 0xf7, 0xfd, 0xb0, 0xbd, 0x70, 0x7c, 0x01, 0x00, + 0x90, 0xb5, 0x04, 0x1c, 0x80, 0x88, 0x93, 0xb0, + 0x00, 0x28, 0x06, 0xd0, 0x15, 0x49, 0x06, 0x22, + 0x48, 0x80, 0x18, 0x31, 0x3c, 0x00, 0x18, 0x24, + 0x00, 0x00, 0x88, 0x1f, 0xfe, 0xf7, 0x6d, 0xf8, + 0x68, 0x46, 0x0c, 0xf0, 0x14, 0xf8, 0x20, 0x88, + 0x01, 0x28, 0x08, 0xd1, 0x60, 0x88, 0x03, 0x28, + 0x05, 0xd1, 0xa0, 0x88, 0x00, 0x28, 0x02, 0xd1, + 0x06, 0x20, 0x0c, 0xa9, 0x08, 0x70, 0xa0, 0x79, + 0x06, 0x21, 0xff, 0x28, 0x04, 0xd0, 0xe0, 0x79, + 0x00, 0x28, 0x01, 0xd0, 0x01, 0x1c, 0x08, 0x31, + 0x0b, 0x20, 0x08, 0xaa, 0x50, 0x72, 0x3c, 0x00, + 0x54, 0x24, 0x00, 0x00, 0x20, 0x1c, 0x08, 0xf0, + 0x3b, 0xff, 0x03, 0x90, 0x68, 0x46, 0x0b, 0xf0, + 0x31, 0xf8, 0x13, 0xb0, 0x90, 0xbd, 0x00, 0x00, + 0x58, 0x7c, 0x01, 0x00, 0x07, 0x4b, 0x1a, 0x78, + 0x82, 0x42, 0x01, 0xd0, 0x00, 0x29, 0x07, 0xd0, + 0xff, 0x20, 0x18, 0x70, 0x04, 0x48, 0x01, 0x88, + 0x01, 0x22, 0x52, 0x03, 0x91, 0x43, 0x01, 0x80, + 0x70, 0x47, 0x00, 0x00, 0x4c, 0x7b, 0x01, 0x00, + 0x3c, 0x00, 0x90, 0x24, 0x00, 0x00, 0x32, 0x80, + 0x07, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x0c, 0x23, + 0x07, 0x49, 0x58, 0x43, 0x40, 0x18, 0x00, 0x79, + 0x0a, 0xf0, 0x4f, 0xf9, 0x01, 0x20, 0x03, 0x49, + 0xa0, 0x40, 0x08, 0x39, 0x0a, 0x78, 0x10, 0x43, + 0x08, 0x70, 0x10, 0xbd, 0x00, 0x00, 0x74, 0x7a, + 0x01, 0x00, 0x03, 0x4a, 0x00, 0x21, 0x11, 0x54, + 0x80, 0x00, 0x30, 0x32, 0x10, 0x58, 0x01, 0x70, + 0x70, 0x47, 0x3c, 0x00, 0xcc, 0x24, 0x00, 0x00, + 0xe0, 0x7a, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, + 0x05, 0x28, 0x01, 0xd3, 0xfe, 0xf7, 0x12, 0xff, + 0x20, 0x1c, 0xff, 0xf7, 0xed, 0xff, 0x00, 0x21, + 0x20, 0x1c, 0x0e, 0xf0, 0x89, 0xfb, 0x10, 0xbd, + 0x05, 0x49, 0x80, 0xb5, 0x88, 0x60, 0x08, 0x7f, + 0x24, 0x23, 0x04, 0x49, 0x58, 0x43, 0x08, 0x58, + 0xfd, 0xf7, 0x6c, 0xff, 0x80, 0xbd, 0x00, 0x00, + 0xd4, 0x79, 0x01, 0x00, 0x3c, 0x00, 0x08, 0x25, + 0x00, 0x00, 0x94, 0x46, 0x01, 0x00, 0x80, 0xb5, + 0x01, 0x21, 0x91, 0x20, 0xfe, 0xf7, 0xc7, 0xfe, + 0x80, 0xbd, 0x02, 0x4a, 0x11, 0x68, 0x81, 0x43, + 0x11, 0x60, 0x70, 0x47, 0x00, 0x00, 0x78, 0x6e, + 0x01, 0x00, 0x80, 0xb5, 0xfe, 0xf7, 0xe9, 0xfe, + 0x80, 0xbd, 0x80, 0xb5, 0xfe, 0xf7, 0xe5, 0xfe, + 0x80, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0x31, 0xfa, + 0x80, 0xbd, 0x03, 0x49, 0x80, 0xb5, 0x3c, 0x00, + 0x44, 0x25, 0x00, 0x00, 0x04, 0x20, 0x88, 0x60, + 0x00, 0xf0, 0xd0, 0xf9, 0x80, 0xbd, 0x00, 0x00, + 0x00, 0x30, 0x07, 0x00, 0x80, 0xb5, 0x00, 0xf0, + 0x99, 0xfa, 0x80, 0xbd, 0x80, 0xb5, 0x00, 0xf0, + 0x99, 0xfb, 0x80, 0xbd, 0x38, 0xb5, 0x20, 0x28, + 0x15, 0xd2, 0x0d, 0x4c, 0x22, 0x1c, 0x20, 0x32, + 0x95, 0x79, 0x00, 0xab, 0x1d, 0x70, 0xd2, 0x79, + 0x5a, 0x70, 0x0a, 0x4b, 0x82, 0x00, 0x99, 0x50, + 0x3c, 0x00, 0x80, 0x25, 0x00, 0x00, 0x01, 0x21, + 0x81, 0x40, 0x08, 0x48, 0x01, 0x60, 0x42, 0x68, + 0x11, 0x43, 0x41, 0x60, 0x00, 0xab, 0x18, 0x88, + 0xe0, 0x84, 0x38, 0xbd, 0x01, 0x21, 0xff, 0x20, + 0xfe, 0xf7, 0x83, 0xfe, 0xf9, 0xe7, 0x00, 0x10, + 0x07, 0x00, 0x30, 0x74, 0x01, 0x00, 0x00, 0x40, + 0x07, 0x00, 0x20, 0x28, 0x09, 0xd2, 0x05, 0x49, + 0x06, 0x4b, 0x82, 0x00, 0x99, 0x50, 0x05, 0x4a, + 0x51, 0x68, 0x3c, 0x00, 0xbc, 0x25, 0x00, 0x00, + 0x01, 0x23, 0x83, 0x40, 0x99, 0x43, 0x51, 0x60, + 0x70, 0x47, 0x00, 0x00, 0xa9, 0x75, 0x00, 0x00, + 0x30, 0x74, 0x01, 0x00, 0x00, 0x40, 0x07, 0x00, + 0x02, 0x4a, 0x11, 0x68, 0x08, 0x43, 0x10, 0x60, + 0x70, 0x47, 0x00, 0x00, 0x78, 0x6e, 0x01, 0x00, + 0x0b, 0x48, 0x01, 0x68, 0x03, 0x22, 0x12, 0x04, + 0x11, 0x43, 0x01, 0x60, 0x01, 0x68, 0x07, 0x22, + 0x12, 0x06, 0x91, 0x43, 0x3c, 0x00, 0xf8, 0x25, + 0x00, 0x00, 0x01, 0x22, 0x52, 0x06, 0x89, 0x18, + 0x01, 0x60, 0x01, 0x68, 0x12, 0x0c, 0x11, 0x43, + 0x01, 0x60, 0x01, 0x68, 0x52, 0x08, 0x11, 0x43, + 0x01, 0x60, 0x70, 0x47, 0x00, 0x00, 0x80, 0x00, + 0x07, 0x00, 0xfe, 0xb5, 0x1c, 0x4e, 0x05, 0x1c, + 0xb0, 0x8a, 0xf2, 0x68, 0x12, 0xd0, 0x01, 0x24, + 0x00, 0x29, 0x09, 0xd1, 0x11, 0x6d, 0x02, 0xaa, + 0x01, 0xab, 0xfe, 0xf7, 0xf8, 0xfe, 0x3c, 0x00, + 0x34, 0x26, 0x00, 0x00, 0x02, 0x98, 0x00, 0x28, + 0x01, 0xd0, 0x00, 0x24, 0x0b, 0xe0, 0x01, 0xaa, + 0x02, 0xa9, 0x28, 0x1c, 0xfe, 0xf7, 0x70, 0xff, + 0x05, 0xe0, 0x11, 0x6d, 0x02, 0xaa, 0x00, 0x24, + 0x01, 0xab, 0xfe, 0xf7, 0x01, 0xff, 0x0e, 0x49, + 0x08, 0x1c, 0x20, 0x30, 0x82, 0x79, 0x00, 0xab, + 0x1a, 0x70, 0xc0, 0x79, 0x58, 0x70, 0x30, 0x68, + 0x00, 0x28, 0x02, 0xd1, 0x02, 0x98, 0x30, 0x60, + 0x3c, 0x00, 0x70, 0x26, 0x00, 0x00, 0x02, 0xe0, + 0x02, 0x98, 0x72, 0x68, 0xd0, 0x60, 0x01, 0x98, + 0x00, 0xab, 0x70, 0x60, 0x18, 0x88, 0xc8, 0x84, + 0xf0, 0x68, 0xc0, 0x6c, 0xf0, 0x60, 0x20, 0x1c, + 0xfe, 0xbd, 0x24, 0x7e, 0x01, 0x00, 0x00, 0x10, + 0x07, 0x00, 0xf8, 0xb5, 0x04, 0x1c, 0x54, 0x27, + 0x1d, 0x4e, 0x00, 0x20, 0x30, 0x60, 0x70, 0x60, + 0x67, 0x43, 0x38, 0x04, 0x15, 0x1c, 0x00, 0x0c, + 0xb1, 0x82, 0x3c, 0x00, 0xac, 0x26, 0x00, 0x00, + 0xff, 0xf7, 0x96, 0xf8, 0x08, 0x21, 0x30, 0x61, + 0x00, 0x26, 0x17, 0x4a, 0x14, 0xe0, 0x03, 0x1c, + 0x24, 0x33, 0x42, 0x61, 0x03, 0x61, 0xc6, 0x61, + 0x01, 0x83, 0x08, 0x33, 0x03, 0x60, 0xb1, 0x23, + 0x43, 0x60, 0x03, 0x1c, 0x64, 0x33, 0xc3, 0x60, + 0x0c, 0x23, 0x03, 0x81, 0x03, 0x1c, 0x54, 0x33, + 0x4c, 0x30, 0x28, 0xc0, 0x01, 0x3c, 0x18, 0x1c, + 0x00, 0x2c, 0xe8, 0xd1, 0x3c, 0x00, 0xe8, 0x26, + 0x00, 0x00, 0x09, 0x4e, 0x07, 0x22, 0x30, 0x69, + 0xd2, 0x43, 0xc1, 0x19, 0x50, 0x50, 0x02, 0x1c, + 0x10, 0x32, 0x80, 0x39, 0x8a, 0x63, 0xf0, 0x60, + 0xb0, 0x60, 0x00, 0x21, 0x00, 0x20, 0xff, 0xf7, + 0x88, 0xff, 0x30, 0x69, 0xf0, 0x60, 0xb0, 0x60, + 0xf8, 0xbd, 0x24, 0x7e, 0x01, 0x00, 0x91, 0x00, + 0x05, 0x00, 0x01, 0x48, 0x40, 0x6a, 0x70, 0x47, + 0x00, 0x00, 0xe8, 0x7d, 0x01, 0x00, 0x3c, 0x00, + 0x24, 0x27, 0x00, 0x00, 0x01, 0x48, 0x00, 0x88, + 0x70, 0x47, 0x00, 0x00, 0xfc, 0x6b, 0x01, 0x00, + 0x06, 0x49, 0x80, 0xb5, 0x08, 0x88, 0x01, 0x30, + 0x08, 0x80, 0x05, 0x49, 0x08, 0x20, 0x08, 0x60, + 0x04, 0x49, 0x88, 0x69, 0x88, 0x61, 0x00, 0xf0, + 0x21, 0xf8, 0x80, 0xbd, 0xfc, 0x6b, 0x01, 0x00, + 0x00, 0x10, 0x07, 0x00, 0x00, 0x30, 0x07, 0x00, + 0x03, 0x4a, 0x01, 0x20, 0x12, 0x1d, 0x06, 0xca, + 0x3c, 0x00, 0x60, 0x27, 0x00, 0x00, 0x91, 0x42, + 0x00, 0xd1, 0x00, 0x20, 0x70, 0x47, 0xe8, 0x7d, + 0x01, 0x00, 0x06, 0x48, 0x00, 0xb5, 0xc0, 0x7c, + 0x00, 0x28, 0x03, 0xd1, 0xff, 0xf7, 0xef, 0xff, + 0x00, 0x28, 0x01, 0xd0, 0x01, 0x20, 0x00, 0xbd, + 0x00, 0x20, 0x00, 0xbd, 0x00, 0x00, 0xa0, 0x80, + 0x07, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x80, 0x07, + 0x02, 0xd5, 0x06, 0xf0, 0x3e, 0xfd, 0x03, 0xe0, + 0xe0, 0x07, 0x3c, 0x00, 0x9c, 0x27, 0x00, 0x00, + 0x01, 0xd5, 0x06, 0xf0, 0xe3, 0xfd, 0x60, 0x07, + 0x01, 0xd5, 0xfe, 0xf7, 0xab, 0xfd, 0x10, 0xbd, + 0x02, 0x4a, 0x01, 0x1c, 0x10, 0x68, 0x11, 0x60, + 0x70, 0x47, 0x00, 0x00, 0xe8, 0x7d, 0x01, 0x00, + 0x38, 0xb5, 0x20, 0x4d, 0x2c, 0x1c, 0x20, 0x34, + 0xa0, 0x79, 0x00, 0xab, 0x18, 0x70, 0xe0, 0x79, + 0x58, 0x70, 0xfe, 0xf7, 0x27, 0xfa, 0x00, 0xab, + 0x18, 0x88, 0xe8, 0x84, 0x3c, 0x00, 0xd8, 0x27, + 0x00, 0x00, 0x1a, 0x48, 0x81, 0x78, 0x08, 0x22, + 0x91, 0x43, 0x81, 0x70, 0x81, 0x78, 0x11, 0x43, + 0x81, 0x70, 0x17, 0x48, 0x41, 0x68, 0x80, 0x22, + 0x91, 0x43, 0x41, 0x60, 0x01, 0x68, 0x11, 0x43, + 0x01, 0x60, 0x00, 0x20, 0x01, 0x30, 0x64, 0x28, + 0xfc, 0xd3, 0xa0, 0x79, 0x0f, 0x4d, 0x00, 0xab, + 0x18, 0x70, 0xe0, 0x79, 0x10, 0x4c, 0x58, 0x70, + 0x20, 0x1c, 0x10, 0x30, 0x00, 0xf0, 0x3c, 0x00, + 0x14, 0x28, 0x00, 0x00, 0xdf, 0xfb, 0x00, 0x20, + 0xc0, 0x43, 0xa0, 0x61, 0xff, 0xf7, 0x9c, 0xff, + 0x00, 0x28, 0x09, 0xd0, 0x0a, 0x49, 0x08, 0x69, + 0x01, 0x30, 0x08, 0x61, 0x00, 0x20, 0x3c, 0x31, + 0x89, 0x68, 0x48, 0x63, 0x06, 0xf0, 0xee, 0xfc, + 0x00, 0xab, 0x18, 0x88, 0xe8, 0x84, 0x38, 0xbd, + 0x00, 0x10, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, + 0xf4, 0x00, 0x07, 0x00, 0x00, 0x30, 0x07, 0x00, + 0x3c, 0x00, 0x50, 0x28, 0x00, 0x00, 0xe8, 0x7d, + 0x01, 0x00, 0x0a, 0x48, 0x80, 0xb5, 0x00, 0x6a, + 0x00, 0x28, 0x01, 0xd0, 0xfe, 0xf7, 0xc1, 0xf9, + 0x07, 0x48, 0x07, 0x49, 0x3c, 0x30, 0x80, 0x68, + 0x10, 0x30, 0x48, 0x61, 0x01, 0x20, 0x08, 0x61, + 0x05, 0x49, 0x08, 0x68, 0x80, 0x22, 0x90, 0x43, + 0x08, 0x60, 0x80, 0xbd, 0x00, 0x00, 0xe8, 0x7d, + 0x01, 0x00, 0x00, 0x30, 0x07, 0x00, 0xf4, 0x00, + 0x07, 0x00, 0x3c, 0x00, 0x8c, 0x28, 0x00, 0x00, + 0x80, 0xb5, 0x0c, 0xf0, 0xcb, 0xfe, 0x06, 0xf0, + 0xbf, 0xfc, 0x80, 0xbd, 0x01, 0x49, 0xc8, 0x62, + 0x70, 0x47, 0x00, 0x00, 0xe8, 0x7d, 0x01, 0x00, + 0x02, 0x4a, 0x91, 0x6a, 0x08, 0x43, 0x90, 0x62, + 0x70, 0x47, 0x00, 0x00, 0xe8, 0x7d, 0x01, 0x00, + 0x18, 0x23, 0x06, 0x49, 0x58, 0x43, 0x40, 0x18, + 0x00, 0x21, 0x02, 0x79, 0x03, 0x68, 0x1a, 0x70, + 0x01, 0x31, 0x08, 0x30, 0x3c, 0x00, 0xc8, 0x28, + 0x00, 0x00, 0x03, 0x29, 0xf8, 0xd3, 0x70, 0x47, + 0x00, 0x00, 0x28, 0x52, 0x01, 0x00, 0x03, 0x49, + 0x00, 0x28, 0x00, 0xd0, 0x01, 0x1c, 0x02, 0x48, + 0x81, 0x62, 0x70, 0x47, 0x00, 0x00, 0x85, 0x75, + 0x00, 0x00, 0x04, 0x6c, 0x01, 0x00, 0xf8, 0xb5, + 0xff, 0xf7, 0x33, 0xff, 0x28, 0x4f, 0x00, 0x28, + 0x04, 0xd0, 0xff, 0xf7, 0xc8, 0xff, 0x38, 0x6a, + 0x01, 0x30, 0x38, 0x62, 0xf8, 0x6a, 0x3c, 0x00, + 0x04, 0x29, 0x00, 0x00, 0x00, 0x28, 0x02, 0xd0, + 0x01, 0x89, 0x04, 0x39, 0x01, 0x81, 0x38, 0x6b, + 0x00, 0x25, 0x00, 0x28, 0x08, 0xd0, 0x0b, 0x20, + 0x3d, 0x63, 0x10, 0xf0, 0xe5, 0xfa, 0x1e, 0x49, + 0x08, 0x68, 0x21, 0x22, 0x90, 0x43, 0x08, 0x60, + 0x38, 0x78, 0x3c, 0x21, 0x1b, 0x4a, 0x41, 0x43, + 0x8c, 0x18, 0xff, 0x22, 0x79, 0x6a, 0x3a, 0x70, + 0x00, 0x29, 0x0c, 0xd0, 0xb9, 0x69, 0x01, 0x31, + 0x3c, 0x00, 0x40, 0x29, 0x00, 0x00, 0xb9, 0x61, + 0x7d, 0x62, 0xbd, 0x68, 0x00, 0x2d, 0x04, 0xd0, + 0x63, 0x6b, 0x7a, 0x6b, 0x00, 0x21, 0xfd, 0xf7, + 0x47, 0xfd, 0xf8, 0xbd, 0x04, 0x28, 0x03, 0xd3, + 0x01, 0x21, 0x84, 0x20, 0xfe, 0xf7, 0xa1, 0xfc, + 0x38, 0x69, 0x26, 0x1c, 0x01, 0x30, 0x38, 0x61, + 0x20, 0x36, 0x30, 0x78, 0x02, 0x28, 0x03, 0xd0, + 0x0c, 0x21, 0x84, 0x20, 0xfe, 0xf7, 0x95, 0xfc, + 0x35, 0x70, 0x3c, 0x00, 0x7c, 0x29, 0x00, 0x00, + 0xa1, 0x69, 0x00, 0x29, 0xe8, 0xd0, 0x63, 0x6b, + 0x30, 0x34, 0x20, 0x78, 0x0c, 0x1c, 0x00, 0x21, + 0x7a, 0x6b, 0xfd, 0xf7, 0x27, 0xfd, 0xdf, 0xe7, + 0x04, 0x6c, 0x01, 0x00, 0xf4, 0x00, 0x07, 0x00, + 0x18, 0xdb, 0x01, 0x00, 0x10, 0xb5, 0x0b, 0x4c, + 0x60, 0x6a, 0x00, 0x28, 0x0e, 0xd0, 0x0a, 0x48, + 0x00, 0xf0, 0x12, 0xfb, 0x00, 0x20, 0x60, 0x62, + 0xa4, 0x68, 0x00, 0x2c, 0x3c, 0x00, 0xb8, 0x29, + 0x00, 0x00, 0x05, 0xd0, 0x7e, 0x23, 0xdb, 0x43, + 0x00, 0x22, 0x01, 0x21, 0xfd, 0xf7, 0x0d, 0xfd, + 0x10, 0xbd, 0xe0, 0x69, 0x01, 0x30, 0xe0, 0x61, + 0x10, 0xbd, 0x04, 0x6c, 0x01, 0x00, 0x00, 0x30, + 0x07, 0x00, 0x09, 0x48, 0x41, 0x68, 0x3f, 0x22, + 0x12, 0x04, 0x91, 0x43, 0x0d, 0x22, 0x12, 0x04, + 0x89, 0x18, 0x41, 0x60, 0x41, 0x68, 0x01, 0x22, + 0x52, 0x02, 0x91, 0x43, 0x41, 0x60, 0x3c, 0x00, + 0xf4, 0x29, 0x00, 0x00, 0x03, 0x48, 0x81, 0x78, + 0x81, 0x70, 0x81, 0x78, 0x81, 0x70, 0x70, 0x47, + 0x80, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, + 0xf0, 0xb5, 0x01, 0x25, 0x08, 0x24, 0x00, 0x20, + 0x0e, 0x4a, 0x0f, 0x49, 0x00, 0x26, 0x3c, 0x23, + 0x43, 0x43, 0xd1, 0x52, 0x9b, 0x18, 0x5d, 0x71, + 0x9b, 0x60, 0x5e, 0x61, 0x1c, 0x82, 0xc0, 0x27, + 0xdf, 0x60, 0x20, 0x27, 0xfe, 0x54, 0x9e, 0x61, + 0x3c, 0x00, 0x30, 0x2a, 0x00, 0x00, 0x30, 0x27, + 0xfe, 0x54, 0x07, 0x4f, 0x3f, 0x18, 0x20, 0x37, + 0x01, 0x30, 0x05, 0x28, 0x9f, 0x63, 0xe9, 0xd3, + 0x05, 0x48, 0xff, 0x32, 0x01, 0x32, 0x90, 0x62, + 0xf0, 0xbd, 0x18, 0xdb, 0x01, 0x00, 0xbe, 0xba, + 0x00, 0x00, 0x30, 0x80, 0x07, 0x00, 0x06, 0x6c, + 0x01, 0x00, 0x01, 0x49, 0x48, 0x60, 0x70, 0x47, + 0x00, 0x00, 0x04, 0x6c, 0x01, 0x00, 0x05, 0x49, + 0x08, 0x5c, 0x3c, 0x00, 0x6c, 0x2a, 0x00, 0x00, + 0x05, 0x49, 0x49, 0x68, 0x40, 0x18, 0xc0, 0x06, + 0xc0, 0x0e, 0x04, 0x49, 0x20, 0x30, 0x48, 0x72, + 0x70, 0x47, 0x00, 0x00, 0xa0, 0x57, 0x01, 0x00, + 0x04, 0x6c, 0x01, 0x00, 0x00, 0x80, 0x07, 0x00, + 0x80, 0xb5, 0x15, 0x21, 0x84, 0x20, 0xfe, 0xf7, + 0x07, 0xfc, 0x80, 0xbd, 0xf8, 0xb5, 0x43, 0x48, + 0x84, 0x68, 0x03, 0x34, 0x42, 0x4d, 0x04, 0xe0, + 0x20, 0x1c, 0x10, 0xf0, 0x3c, 0x00, 0xa8, 0x2a, + 0x00, 0x00, 0xb9, 0xf8, 0x00, 0x28, 0x71, 0xd1, + 0x28, 0x69, 0xc0, 0x07, 0xf7, 0xd5, 0x3e, 0x48, + 0x28, 0x60, 0x3e, 0x4a, 0x14, 0x1c, 0x20, 0x34, + 0x20, 0x79, 0x00, 0x90, 0x3c, 0x23, 0x3c, 0x49, + 0x58, 0x43, 0x45, 0x18, 0x28, 0x79, 0xff, 0xf7, + 0xcc, 0xff, 0x28, 0x1c, 0x3a, 0x49, 0x08, 0x30, + 0x48, 0x60, 0x01, 0x26, 0x08, 0x1c, 0x06, 0x60, + 0x68, 0x6a, 0x00, 0x28, 0x0d, 0xd0, 0x3c, 0x00, + 0xe4, 0x2a, 0x00, 0x00, 0xa9, 0x6a, 0x92, 0x6a, + 0x35, 0x4b, 0x9f, 0x68, 0xd7, 0x1b, 0x1a, 0x68, + 0x51, 0x18, 0x79, 0x18, 0x8a, 0x42, 0x5a, 0x68, + 0x00, 0xd8, 0x00, 0xe0, 0x01, 0x32, 0x06, 0xc0, + 0xe8, 0x6a, 0xfe, 0xf7, 0x87, 0xff, 0x2d, 0x49, + 0xe8, 0x6a, 0x48, 0x60, 0x30, 0x1c, 0x0e, 0x60, + 0x66, 0x79, 0x1f, 0xe0, 0x2b, 0x48, 0x46, 0x61, + 0x04, 0x7f, 0x29, 0x49, 0x20, 0x1c, 0x50, 0x39, + 0x3c, 0x00, 0x20, 0x2b, 0x00, 0x00, 0x89, 0x6a, + 0xfd, 0xf7, 0x5a, 0xfc, 0x00, 0x98, 0x84, 0x42, + 0x10, 0xd0, 0x3c, 0x20, 0x22, 0x49, 0x60, 0x43, + 0x40, 0x18, 0x87, 0x69, 0x00, 0x2f, 0x09, 0xd0, + 0x00, 0x21, 0x20, 0x30, 0x01, 0x70, 0x7e, 0x23, + 0xdb, 0x43, 0x02, 0x21, 0x00, 0x22, 0x20, 0x1c, + 0xfd, 0xf7, 0x4c, 0xfc, 0x01, 0x20, 0xa0, 0x40, + 0x86, 0x43, 0x00, 0x2e, 0xdd, 0xd1, 0xe9, 0x69, + 0x00, 0x29, 0x3c, 0x00, 0x5c, 0x2b, 0x00, 0x00, + 0x03, 0xd0, 0x30, 0x20, 0x40, 0x5d, 0xfd, 0xf7, + 0x3a, 0xfc, 0x16, 0x4c, 0x50, 0x3c, 0x60, 0x6a, + 0x00, 0x28, 0x03, 0xd0, 0x0a, 0x21, 0x84, 0x20, + 0xfe, 0xf7, 0x96, 0xfb, 0x20, 0x35, 0x28, 0x78, + 0x01, 0x28, 0x03, 0xd0, 0x0b, 0x21, 0x84, 0x20, + 0xfe, 0xf7, 0x8e, 0xfb, 0x02, 0x20, 0x28, 0x70, + 0xe0, 0x68, 0x01, 0x30, 0x00, 0xe0, 0x07, 0xe0, + 0xe0, 0x60, 0x00, 0x98, 0x3c, 0x00, 0x98, 0x2b, + 0x00, 0x00, 0x20, 0x70, 0x00, 0x98, 0x60, 0x70, + 0x0a, 0x48, 0x00, 0x68, 0x60, 0x63, 0xf8, 0xbd, + 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x40, + 0x07, 0x00, 0x01, 0x00, 0x00, 0x01, 0x30, 0x80, + 0x07, 0x00, 0x18, 0xdb, 0x01, 0x00, 0x00, 0x30, + 0x07, 0x00, 0x54, 0x6c, 0x01, 0x00, 0x00, 0xa0, + 0x07, 0x00, 0x78, 0x6e, 0x01, 0x00, 0x3c, 0x22, + 0x3c, 0x23, 0x4a, 0x43, 0x09, 0x49, 0x3c, 0x00, + 0xd4, 0x2b, 0x00, 0x00, 0xb0, 0xb5, 0x54, 0x18, + 0x58, 0x43, 0x45, 0x18, 0x21, 0x1c, 0x38, 0x22, + 0x28, 0x1c, 0xfd, 0xf7, 0xe5, 0xfc, 0xa0, 0x6b, + 0x00, 0x78, 0xa9, 0x6b, 0x08, 0x70, 0x00, 0x20, + 0x20, 0x34, 0x20, 0x70, 0xb0, 0xbd, 0x00, 0x00, + 0x18, 0xdb, 0x01, 0x00, 0x3c, 0x23, 0x07, 0x49, + 0x58, 0x43, 0x10, 0xb5, 0x44, 0x18, 0x20, 0x34, + 0x20, 0x78, 0x02, 0x28, 0x03, 0xd1, 0x0d, 0x21, + 0x3c, 0x00, 0x10, 0x2c, 0x00, 0x00, 0x84, 0x20, + 0xfe, 0xf7, 0x47, 0xfb, 0x00, 0x20, 0x20, 0x70, + 0x10, 0xbd, 0x18, 0xdb, 0x01, 0x00, 0xff, 0xb5, + 0x3c, 0x20, 0x48, 0x43, 0x1a, 0x49, 0x81, 0xb0, + 0x44, 0x18, 0x26, 0x1c, 0x20, 0x36, 0x30, 0x78, + 0x15, 0x1c, 0x0f, 0x9f, 0x02, 0x28, 0x03, 0xd1, + 0x04, 0x21, 0x84, 0x20, 0xfe, 0xf7, 0x31, 0xfb, + 0x01, 0x20, 0x30, 0x70, 0x25, 0x71, 0x0b, 0x99, + 0x30, 0x22, 0x3c, 0x00, 0x4c, 0x2c, 0x00, 0x00, + 0x61, 0x80, 0x0a, 0x99, 0xe1, 0x62, 0x0d, 0x99, + 0xa1, 0x61, 0x0c, 0x99, 0xe1, 0x61, 0x0e, 0x99, + 0x61, 0x62, 0xa7, 0x62, 0x01, 0x99, 0x11, 0x55, + 0x7e, 0x21, 0xc9, 0x43, 0x61, 0x63, 0x04, 0x99, + 0x00, 0x29, 0x00, 0xd1, 0x00, 0x20, 0x06, 0x1c, + 0x28, 0x1c, 0x08, 0xf0, 0x8b, 0xf8, 0x00, 0x28, + 0x01, 0xd0, 0x02, 0x20, 0x00, 0xe0, 0x00, 0x20, + 0xa1, 0x6b, 0x30, 0x43, 0x3c, 0x00, 0x88, 0x2c, + 0x00, 0x00, 0x08, 0x70, 0x05, 0xb0, 0xf0, 0xbd, + 0x00, 0x00, 0x18, 0xdb, 0x01, 0x00, 0x80, 0xb5, + 0x14, 0x21, 0x84, 0x20, 0xfe, 0xf7, 0x03, 0xfb, + 0x80, 0xbd, 0x01, 0x48, 0x40, 0x78, 0x70, 0x47, + 0x00, 0x00, 0x04, 0x6c, 0x01, 0x00, 0x02, 0x48, + 0x00, 0x69, 0xc0, 0x07, 0xc0, 0x0f, 0x70, 0x47, + 0x00, 0x00, 0x00, 0x40, 0x07, 0x00, 0x01, 0x1c, + 0x3c, 0x23, 0x04, 0x4a, 0x59, 0x43, 0x3c, 0x00, + 0xc4, 0x2c, 0x00, 0x00, 0x89, 0x18, 0x20, 0x31, + 0x09, 0x78, 0x01, 0x20, 0x00, 0x29, 0x00, 0xd0, + 0x00, 0x20, 0x70, 0x47, 0x18, 0xdb, 0x01, 0x00, + 0x08, 0x48, 0x40, 0x6a, 0x00, 0x28, 0x0a, 0xd1, + 0x07, 0x4a, 0x00, 0x21, 0x20, 0x23, 0x9b, 0x5c, + 0x02, 0x2b, 0x04, 0xd0, 0x01, 0x31, 0x3c, 0x32, + 0x05, 0x29, 0xf7, 0xd3, 0x70, 0x47, 0x01, 0x20, + 0x70, 0x47, 0x00, 0x00, 0x04, 0x6c, 0x01, 0x00, + 0x3c, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x18, 0xdb, + 0x01, 0x00, 0xf8, 0xb5, 0x0e, 0x1c, 0x04, 0x1c, + 0x17, 0x1c, 0xfe, 0xf7, 0x82, 0xfe, 0x20, 0x1c, + 0x11, 0x4c, 0x60, 0x60, 0x01, 0x20, 0x20, 0x60, + 0x10, 0x4d, 0x68, 0x69, 0x01, 0x30, 0x68, 0x61, + 0x68, 0x6a, 0x00, 0x28, 0x03, 0xd0, 0x07, 0x21, + 0x84, 0x20, 0xfe, 0xf7, 0xba, 0xfa, 0xa0, 0x68, + 0x40, 0x07, 0x03, 0xd5, 0x06, 0x21, 0x84, 0x20, + 0xfe, 0xf7, 0x3c, 0x00, 0x3c, 0x2d, 0x00, 0x00, + 0xb3, 0xfa, 0x08, 0x48, 0x00, 0x69, 0x00, 0x28, + 0x03, 0xda, 0xaa, 0x21, 0x84, 0x20, 0xfe, 0xf7, + 0xab, 0xfa, 0x02, 0x20, 0x68, 0x62, 0xae, 0x60, + 0x2f, 0x70, 0xf8, 0xbd, 0x00, 0x30, 0x07, 0x00, + 0x04, 0x6c, 0x01, 0x00, 0x00, 0x40, 0x07, 0x00, + 0x04, 0x4a, 0x51, 0x80, 0x10, 0x71, 0x03, 0x48, + 0x03, 0x49, 0x08, 0x30, 0x48, 0x60, 0x01, 0x20, + 0x08, 0x60, 0x70, 0x47, 0x3c, 0x00, 0x78, 0x2d, + 0x00, 0x00, 0x3c, 0x6c, 0x01, 0x00, 0x00, 0x30, + 0x07, 0x00, 0x00, 0x21, 0x00, 0x23, 0x05, 0xe0, + 0x02, 0x89, 0x43, 0x60, 0xc0, 0x68, 0x51, 0x18, + 0x09, 0x04, 0x09, 0x0c, 0x00, 0x28, 0xf7, 0xd1, + 0x04, 0x31, 0x08, 0x04, 0x00, 0x0c, 0x70, 0x47, + 0x00, 0x00, 0x02, 0x4a, 0x51, 0x6b, 0x08, 0x43, + 0x50, 0x63, 0x70, 0x47, 0x00, 0x00, 0x04, 0x6c, + 0x01, 0x00, 0x38, 0xb5, 0x0a, 0x4c, 0x3c, 0x00, + 0xb4, 0x2d, 0x00, 0x00, 0x22, 0x1c, 0x20, 0x32, + 0x95, 0x79, 0x00, 0xab, 0x1d, 0x70, 0xd2, 0x79, + 0x5a, 0x70, 0x03, 0x68, 0x40, 0x68, 0x06, 0x4a, + 0x50, 0x65, 0x05, 0x48, 0x13, 0x65, 0x50, 0x30, + 0x81, 0x60, 0x00, 0xab, 0x18, 0x88, 0xe0, 0x84, + 0x38, 0xbd, 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, + 0x04, 0x6c, 0x01, 0x00, 0x98, 0xb5, 0x0d, 0x4c, + 0x20, 0x1c, 0x20, 0x30, 0x81, 0x79, 0x00, 0xab, + 0x3c, 0x00, 0xf0, 0x2d, 0x00, 0x00, 0x19, 0x70, + 0xc0, 0x79, 0x58, 0x70, 0x0a, 0x48, 0x00, 0xf0, + 0xec, 0xf8, 0x09, 0x49, 0x00, 0x20, 0x48, 0x62, + 0xff, 0xf7, 0x69, 0xff, 0x00, 0x28, 0x03, 0xd0, + 0x12, 0x21, 0x84, 0x20, 0xfe, 0xf7, 0x49, 0xfa, + 0x00, 0xab, 0x18, 0x88, 0xe0, 0x84, 0x98, 0xbd, + 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x00, 0x30, + 0x07, 0x00, 0x04, 0x6c, 0x01, 0x00, 0x03, 0x48, + 0x01, 0x7a, 0x3c, 0x00, 0x2c, 0x2e, 0x00, 0x00, + 0xfe, 0x22, 0x91, 0x43, 0x0a, 0x31, 0x01, 0x72, + 0x70, 0x47, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, + 0x90, 0xb5, 0x0e, 0x4c, 0x85, 0xb0, 0xa0, 0x78, + 0x02, 0x28, 0x14, 0xd1, 0x03, 0x20, 0xa0, 0x70, + 0x0b, 0x49, 0x00, 0x20, 0x00, 0x22, 0x04, 0x92, + 0x02, 0x90, 0x03, 0x91, 0xe1, 0x88, 0x01, 0x22, + 0x01, 0x92, 0x00, 0x91, 0x61, 0x78, 0x20, 0x78, + 0x22, 0x69, 0xe3, 0x68, 0x3c, 0x00, 0x68, 0x2e, + 0x00, 0x00, 0x08, 0xf0, 0x94, 0xfd, 0x04, 0x48, + 0x09, 0xf0, 0x7f, 0xf9, 0x05, 0xb0, 0x90, 0xbd, + 0x00, 0x00, 0xb4, 0x79, 0x01, 0x00, 0xad, 0xb6, + 0x00, 0x00, 0x71, 0xb6, 0x00, 0x00, 0xb0, 0xb5, + 0x0c, 0x4d, 0xac, 0x79, 0x0c, 0x49, 0x09, 0x78, + 0x00, 0x29, 0x03, 0xd0, 0x01, 0x29, 0x0e, 0xd0, + 0x02, 0x29, 0x08, 0xd1, 0xc2, 0x88, 0x00, 0x2a, + 0x09, 0xd0, 0x01, 0x23, 0x81, 0x68, 0x3c, 0x00, + 0xa4, 0x2e, 0x00, 0x00, 0x02, 0x20, 0x0f, 0xf0, + 0xc1, 0xf8, 0x03, 0xe0, 0x02, 0x21, 0x86, 0x20, + 0xfe, 0xf7, 0xf8, 0xf9, 0xac, 0x71, 0xb0, 0xbd, + 0x20, 0x10, 0x07, 0x00, 0xa0, 0x79, 0x01, 0x00, + 0x80, 0xb5, 0x02, 0x68, 0x07, 0x49, 0x4a, 0x60, + 0x03, 0x79, 0xca, 0x78, 0xcb, 0x70, 0x00, 0x79, + 0x90, 0x42, 0x06, 0xd0, 0x03, 0x48, 0x14, 0x30, + 0x00, 0x89, 0x07, 0xf0, 0x27, 0xfe, 0x06, 0xf0, + 0x3c, 0x00, 0xe0, 0x2e, 0x00, 0x00, 0xab, 0xfa, + 0x80, 0xbd, 0x84, 0x66, 0x01, 0x00, 0x70, 0xb5, + 0x16, 0x4c, 0x15, 0x4d, 0xa0, 0x78, 0x00, 0x26, + 0x98, 0x3d, 0x01, 0x28, 0x03, 0xd1, 0x28, 0x69, + 0x08, 0xf0, 0xfb, 0xfc, 0xa6, 0x70, 0x60, 0x68, + 0x01, 0x28, 0x03, 0xd0, 0x00, 0x21, 0x28, 0x69, + 0x00, 0xf0, 0xff, 0xfb, 0x0e, 0x48, 0x29, 0x69, + 0x0c, 0xf0, 0x31, 0xfa, 0x01, 0x20, 0x0c, 0xf0, + 0xe4, 0xf8, 0x3c, 0x00, 0x1c, 0x2f, 0x00, 0x00, + 0xe0, 0x78, 0x01, 0x28, 0x02, 0xd0, 0x01, 0x20, + 0x60, 0x70, 0x00, 0xe0, 0x66, 0x70, 0x06, 0x48, + 0x14, 0x30, 0x41, 0x68, 0x01, 0x29, 0x06, 0xd1, + 0x06, 0x60, 0x41, 0x6f, 0x00, 0x29, 0x02, 0xd0, + 0x00, 0x20, 0xfd, 0xf7, 0x4c, 0xfa, 0x70, 0xbd, + 0x84, 0x66, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, + 0x30, 0xb5, 0x00, 0x22, 0x00, 0x23, 0x01, 0x25, + 0x2c, 0x1c, 0x94, 0x40, 0x3c, 0x00, 0x58, 0x2f, + 0x00, 0x00, 0x04, 0x40, 0x01, 0xd0, 0xca, 0x54, + 0x01, 0x33, 0x01, 0x32, 0x0e, 0x2a, 0xf6, 0xdb, + 0x18, 0x1c, 0x30, 0xbd, 0x00, 0x00, 0xff, 0xb5, + 0x01, 0x27, 0x00, 0x26, 0x05, 0x1c, 0x02, 0x20, + 0x81, 0xb0, 0x00, 0x90, 0x00, 0x2d, 0x18, 0xd0, + 0x28, 0x78, 0xff, 0x28, 0x15, 0xd0, 0x00, 0x24, + 0x10, 0xe0, 0x28, 0x19, 0x80, 0x78, 0x0a, 0x99, + 0x00, 0x29, 0x01, 0xd0, 0x01, 0x06, 0x3c, 0x00, + 0x94, 0x2f, 0x00, 0x00, 0x08, 0xd5, 0x07, 0xf0, + 0xe9, 0xfe, 0x0e, 0x28, 0x03, 0xd0, 0x01, 0x21, + 0x81, 0x40, 0x0e, 0x43, 0x00, 0xe0, 0x00, 0x27, + 0x01, 0x34, 0x68, 0x78, 0xa0, 0x42, 0xeb, 0xdc, + 0x00, 0x98, 0x02, 0x9d, 0x01, 0x38, 0x00, 0x90, + 0xdf, 0xd1, 0x03, 0x98, 0x31, 0x1c, 0x81, 0x43, + 0x02, 0xd0, 0x03, 0x98, 0x06, 0x40, 0x00, 0x27, + 0x04, 0x98, 0x06, 0x60, 0x05, 0xb0, 0x38, 0x1c, + 0x3c, 0x00, 0xd0, 0x2f, 0x00, 0x00, 0xf0, 0xbd, + 0x00, 0x00, 0x02, 0x21, 0x01, 0x60, 0x64, 0x21, + 0x01, 0xe0, 0x01, 0x39, 0x02, 0xd0, 0x02, 0x68, + 0x92, 0x07, 0xfa, 0xd4, 0x01, 0x20, 0x00, 0x29, + 0x00, 0xd1, 0x00, 0x20, 0x70, 0x47, 0x10, 0xb5, + 0x00, 0x20, 0xc4, 0x43, 0x05, 0x4b, 0x02, 0x22, + 0x01, 0x01, 0x5a, 0x50, 0xc9, 0x18, 0x8c, 0x60, + 0x01, 0x30, 0x08, 0x28, 0xf8, 0xdb, 0x10, 0xbd, + 0x00, 0x00, 0x3c, 0x00, 0x0c, 0x30, 0x00, 0x00, + 0x00, 0x30, 0x07, 0x00, 0xf0, 0xb5, 0x05, 0x1c, + 0x60, 0x35, 0xc7, 0x6a, 0x04, 0x1c, 0x28, 0x7b, + 0x00, 0x2f, 0x8b, 0xb0, 0x15, 0xd0, 0x08, 0x28, + 0x15, 0xd2, 0x02, 0xa3, 0x1b, 0x5c, 0x5b, 0x00, + 0x9f, 0x44, 0x00, 0x00, 0x07, 0x04, 0x04, 0x07, + 0x09, 0x09, 0x0c, 0x0c, 0x01, 0x26, 0x00, 0x21, + 0x09, 0xe0, 0x00, 0x26, 0x06, 0xe0, 0x02, 0x26, + 0x02, 0x21, 0x04, 0xe0, 0x3c, 0x00, 0x48, 0x30, + 0x00, 0x00, 0x03, 0x26, 0x03, 0x21, 0x01, 0xe0, + 0x04, 0x26, 0x01, 0x21, 0x8c, 0x22, 0x12, 0x59, + 0x07, 0x91, 0x26, 0x49, 0x06, 0x90, 0x04, 0x91, + 0x00, 0x20, 0x03, 0x90, 0x05, 0x97, 0x08, 0x92, + 0xe0, 0x69, 0x22, 0x69, 0x21, 0x1c, 0x70, 0x31, + 0x01, 0x91, 0x21, 0x49, 0x00, 0x90, 0x70, 0x00, + 0x40, 0x18, 0x60, 0x30, 0x02, 0x92, 0x03, 0x88, + 0x59, 0x1c, 0x01, 0x80, 0x1e, 0x48, 0x3c, 0x00, + 0x84, 0x30, 0x00, 0x00, 0x02, 0x88, 0xa1, 0x68, + 0x0a, 0xa8, 0x09, 0xf0, 0xe1, 0xff, 0x60, 0x60, + 0xe8, 0x7a, 0xa1, 0x6a, 0xc9, 0x07, 0x00, 0x07, + 0x00, 0x0e, 0xc9, 0x0d, 0x08, 0x43, 0x61, 0x6a, + 0x22, 0x69, 0xc9, 0x07, 0x89, 0x0d, 0x01, 0x43, + 0x01, 0x20, 0x00, 0x2a, 0x00, 0xd1, 0x00, 0x20, + 0x80, 0x03, 0x08, 0x43, 0x21, 0x6a, 0xc9, 0x03, + 0x08, 0x43, 0x08, 0x21, 0x08, 0x43, 0x0a, 0x99, + 0x3c, 0x00, 0xc0, 0x30, 0x00, 0x00, 0x08, 0x80, + 0x20, 0x1c, 0xfe, 0xf7, 0x98, 0xfe, 0x20, 0x69, + 0x00, 0x28, 0x04, 0xd1, 0x20, 0x1c, 0x0a, 0xf0, + 0x82, 0xf9, 0x0b, 0xb0, 0xf0, 0xbd, 0x80, 0x79, + 0x06, 0x28, 0x01, 0xd9, 0xfe, 0xf7, 0x0f, 0xf9, + 0x20, 0x69, 0x06, 0x49, 0x80, 0x79, 0x80, 0x00, + 0x09, 0x58, 0x20, 0x1c, 0xfd, 0xf7, 0x74, 0xf9, + 0xef, 0xe7, 0x79, 0x2f, 0x01, 0x00, 0xc4, 0x69, + 0x01, 0x00, 0x3c, 0x00, 0xfc, 0x30, 0x00, 0x00, + 0x08, 0x61, 0x01, 0x00, 0x74, 0x57, 0x01, 0x00, + 0x10, 0xb5, 0x04, 0x1c, 0x58, 0x30, 0x8a, 0xb0, + 0x0e, 0xf0, 0x7c, 0xfe, 0x22, 0x1c, 0x80, 0x32, + 0x51, 0x68, 0x00, 0x29, 0x01, 0xd0, 0x11, 0x7a, + 0x07, 0xe0, 0x00, 0x28, 0x04, 0xd0, 0x80, 0x69, + 0x80, 0x07, 0x01, 0xd5, 0x03, 0x21, 0x00, 0xe0, + 0x01, 0x21, 0xd2, 0x68, 0x07, 0x91, 0x22, 0x49, + 0x00, 0x20, 0x08, 0x92, 0x3c, 0x00, 0x38, 0x31, + 0x00, 0x00, 0x04, 0x91, 0x00, 0x22, 0x05, 0x92, + 0x06, 0x90, 0x03, 0x90, 0xe0, 0x69, 0x22, 0x69, + 0x00, 0x90, 0x21, 0x1c, 0x70, 0x31, 0x1c, 0x48, + 0x01, 0x91, 0x02, 0x92, 0x03, 0x89, 0x59, 0x1c, + 0x01, 0x81, 0x1a, 0x48, 0x02, 0x88, 0xa1, 0x68, + 0x09, 0xa8, 0x09, 0xf0, 0x76, 0xff, 0x60, 0x60, + 0x6b, 0x20, 0x00, 0x5d, 0xa1, 0x6a, 0x22, 0x69, + 0xc9, 0x07, 0x00, 0x07, 0x00, 0x0e, 0x3c, 0x00, + 0x74, 0x31, 0x00, 0x00, 0xc9, 0x0d, 0x01, 0x43, + 0x01, 0x20, 0x00, 0x2a, 0x00, 0xd1, 0x00, 0x20, + 0x80, 0x03, 0x08, 0x43, 0x09, 0x99, 0x08, 0x80, + 0x20, 0x1c, 0xfe, 0xf7, 0x35, 0xfe, 0x20, 0x69, + 0x00, 0x28, 0x04, 0xd1, 0x20, 0x1c, 0x0a, 0xf0, + 0x1f, 0xf9, 0x0a, 0xb0, 0x10, 0xbd, 0x80, 0x79, + 0x06, 0x28, 0x01, 0xd9, 0xfe, 0xf7, 0xac, 0xf8, + 0x20, 0x69, 0x07, 0x49, 0x80, 0x79, 0x80, 0x00, + 0x3c, 0x00, 0xb0, 0x31, 0x00, 0x00, 0x09, 0x58, + 0x20, 0x1c, 0xfd, 0xf7, 0x11, 0xf9, 0xef, 0xe7, + 0x00, 0x00, 0xbd, 0x2f, 0x01, 0x00, 0x24, 0x6a, + 0x01, 0x00, 0x08, 0x61, 0x01, 0x00, 0x74, 0x57, + 0x01, 0x00, 0x3e, 0xb5, 0x05, 0x1c, 0x00, 0x69, + 0x04, 0x21, 0x07, 0xf0, 0xd2, 0xfa, 0x00, 0x28, + 0x09, 0xd0, 0x42, 0x78, 0x02, 0x32, 0x01, 0x1c, + 0x68, 0x46, 0xfd, 0xf7, 0x88, 0xf9, 0xe8, 0x6a, + 0x6c, 0x46, 0x3c, 0x00, 0xec, 0x31, 0x00, 0x00, + 0x02, 0x90, 0x00, 0xe0, 0x00, 0x24, 0x28, 0x1c, + 0x14, 0x30, 0x02, 0xf0, 0x03, 0xfb, 0x00, 0x28, + 0x04, 0xd0, 0x21, 0x1c, 0x28, 0x1c, 0x05, 0xf0, + 0xa5, 0xfe, 0x3e, 0xbd, 0x00, 0x2c, 0xfc, 0xd0, + 0x02, 0x49, 0x20, 0x1c, 0x49, 0x69, 0xfd, 0xf7, + 0xe2, 0xf8, 0xf6, 0xe7, 0x44, 0x7d, 0x01, 0x00, + 0x70, 0xb5, 0x1e, 0x1c, 0x18, 0x23, 0x58, 0x43, + 0x06, 0x4b, 0x04, 0x9d, 0x3c, 0x00, 0x28, 0x32, + 0x00, 0x00, 0x19, 0x50, 0xc4, 0x18, 0x00, 0x20, + 0x60, 0x61, 0x62, 0x60, 0xa6, 0x60, 0xe5, 0x60, + 0x0f, 0xf0, 0xb9, 0xfd, 0x20, 0x61, 0x70, 0xbd, + 0x00, 0x00, 0xb8, 0x7d, 0x01, 0x00, 0x02, 0x4a, + 0x01, 0x1c, 0x90, 0x69, 0x91, 0x61, 0x70, 0x47, + 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x01, 0x48, + 0x40, 0x6b, 0x70, 0x47, 0x00, 0x00, 0x44, 0x7d, + 0x01, 0x00, 0x04, 0x49, 0x04, 0x4b, 0x3c, 0x00, + 0x64, 0x32, 0x00, 0x00, 0xca, 0x68, 0x09, 0x69, + 0x5c, 0x3b, 0x5b, 0x68, 0xc9, 0x1a, 0x41, 0x43, + 0x50, 0x18, 0x70, 0x47, 0xa0, 0x7d, 0x01, 0x00, + 0x01, 0x48, 0x00, 0x78, 0x70, 0x47, 0x00, 0x00, + 0x78, 0x69, 0x01, 0x00, 0x80, 0xb5, 0x06, 0x22, + 0x01, 0x49, 0xfd, 0xf7, 0x35, 0xf9, 0x80, 0xbd, + 0xfe, 0x67, 0x01, 0x00, 0xf0, 0xb5, 0x89, 0xb0, + 0x00, 0x93, 0x16, 0x4f, 0x13, 0x1c, 0x0e, 0x1c, + 0x3c, 0x00, 0xa0, 0x32, 0x00, 0x00, 0x04, 0x1c, + 0x3a, 0x1c, 0x01, 0xf0, 0x62, 0xff, 0x01, 0xa9, + 0x06, 0xa8, 0xa2, 0x68, 0x02, 0xf0, 0x0b, 0xf9, + 0x01, 0xaa, 0x06, 0xa9, 0x38, 0x1c, 0x63, 0x6a, + 0x02, 0xf0, 0x81, 0xfc, 0x05, 0x1c, 0x01, 0x28, + 0x14, 0xd1, 0x0c, 0x48, 0xfc, 0x21, 0xc8, 0x51, + 0x38, 0x1c, 0x02, 0xf0, 0x0c, 0xf8, 0x03, 0x21, + 0x30, 0x1c, 0x07, 0xf0, 0x52, 0xfa, 0x00, 0x28, + 0x07, 0xd0, 0x3c, 0x00, 0xdc, 0x32, 0x00, 0x00, + 0x80, 0x78, 0x00, 0xf0, 0x33, 0xfc, 0x20, 0x1c, + 0x10, 0x30, 0x0e, 0xf0, 0x47, 0xfd, 0x00, 0xe0, + 0x00, 0x25, 0x28, 0x1c, 0x09, 0xb0, 0xf0, 0xbd, + 0xf4, 0x67, 0x01, 0x00, 0xc1, 0x38, 0x00, 0x00, + 0x10, 0xb5, 0x07, 0x4c, 0x06, 0x48, 0x06, 0x22, + 0x21, 0x1d, 0x08, 0x38, 0xfd, 0xf7, 0xf6, 0xf8, + 0x01, 0xf0, 0xfc, 0xff, 0x00, 0xf0, 0x42, 0xfc, + 0x20, 0x1c, 0x02, 0xf0, 0x3c, 0x00, 0x18, 0x33, + 0x00, 0x00, 0x27, 0xfc, 0x10, 0xbd, 0xf4, 0x67, + 0x01, 0x00, 0x08, 0x49, 0xc9, 0x68, 0x00, 0x29, + 0x0a, 0xd0, 0x06, 0x4a, 0x01, 0x32, 0x51, 0x78, + 0x12, 0x78, 0x48, 0x43, 0x00, 0x2a, 0x01, 0xd1, + 0x08, 0x18, 0x70, 0x47, 0x10, 0x18, 0x70, 0x47, + 0x01, 0x30, 0x70, 0x47, 0x00, 0x00, 0x44, 0x7d, + 0x01, 0x00, 0x04, 0x4b, 0x05, 0x49, 0x00, 0x28, + 0x5a, 0x69, 0x00, 0xd0, 0x01, 0x1c, 0x3c, 0x00, + 0x54, 0x33, 0x00, 0x00, 0x10, 0x1c, 0x59, 0x61, + 0x70, 0x47, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, + 0xb9, 0x75, 0x00, 0x00, 0x07, 0x49, 0x00, 0x20, + 0x0a, 0x78, 0x02, 0x2a, 0x09, 0xd1, 0x0a, 0x7c, + 0x00, 0x2a, 0x05, 0xd1, 0xca, 0x68, 0x00, 0x2a, + 0x03, 0xd0, 0x49, 0x69, 0x00, 0x29, 0x00, 0xd0, + 0x01, 0x20, 0x70, 0x47, 0x78, 0x69, 0x01, 0x00, + 0x0c, 0x4a, 0x80, 0xb5, 0x01, 0x21, 0x51, 0x60, + 0x3c, 0x00, 0x90, 0x33, 0x00, 0x00, 0x09, 0xf0, + 0x6a, 0xf8, 0x09, 0x48, 0x1c, 0x30, 0x81, 0x69, + 0x00, 0x29, 0x07, 0xd0, 0x00, 0x23, 0x83, 0x61, + 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, 0x00, 0xf0, + 0xd2, 0xf8, 0x80, 0xbd, 0x00, 0x22, 0x00, 0x21, + 0x03, 0x48, 0x00, 0xf0, 0x5c, 0xf9, 0x80, 0xbd, + 0x00, 0x00, 0x5c, 0x69, 0x01, 0x00, 0x51, 0x35, + 0x00, 0x00, 0xb0, 0xb5, 0x0c, 0x1c, 0x01, 0x28, + 0x16, 0xd1, 0x3c, 0x00, 0xcc, 0x33, 0x00, 0x00, + 0x0e, 0x4d, 0x02, 0x2c, 0x09, 0xd1, 0x00, 0xf0, + 0x2b, 0xfa, 0x00, 0x28, 0x0e, 0xd0, 0x68, 0x69, + 0x00, 0x28, 0x0b, 0xd1, 0x21, 0x1c, 0x13, 0x20, + 0x0c, 0xe0, 0x03, 0x2c, 0xfa, 0xd1, 0x00, 0xf0, + 0xf9, 0xf9, 0x00, 0x28, 0x02, 0xd0, 0x28, 0x7c, + 0x00, 0x28, 0xf3, 0xd0, 0xb0, 0xbd, 0x21, 0x1c, + 0x00, 0x06, 0x00, 0x0e, 0x04, 0xf0, 0x62, 0xfc, + 0xb0, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x08, 0x34, + 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0xb0, 0xb5, + 0x0c, 0x4c, 0x00, 0x25, 0x25, 0x74, 0x65, 0x61, + 0xe5, 0x60, 0x00, 0xf0, 0x3c, 0xfa, 0x00, 0xf0, + 0x34, 0xfa, 0x07, 0x48, 0x1c, 0x38, 0x05, 0x61, + 0x09, 0xf0, 0x33, 0xff, 0x20, 0x78, 0x00, 0x28, + 0x02, 0xd1, 0x04, 0xf0, 0x6e, 0xfa, 0xb0, 0xbd, + 0x02, 0x28, 0xfc, 0xd1, 0x04, 0xf0, 0xa5, 0xfb, + 0xb0, 0xbd, 0x78, 0x69, 0x01, 0x00, 0x3c, 0x00, + 0x44, 0x34, 0x00, 0x00, 0x0c, 0x48, 0x80, 0xb5, + 0x01, 0x78, 0x00, 0x29, 0x12, 0xd0, 0xc0, 0x68, + 0x00, 0x28, 0x0f, 0xd1, 0x08, 0x48, 0x1c, 0x38, + 0x40, 0x69, 0x00, 0x28, 0x0a, 0xd1, 0x07, 0x48, + 0x00, 0x68, 0x00, 0x28, 0x06, 0xd0, 0x00, 0x22, + 0x07, 0x21, 0x10, 0x20, 0x10, 0xf0, 0xa0, 0xf9, + 0x02, 0xf0, 0x2c, 0xfc, 0x80, 0xbd, 0x00, 0x00, + 0x78, 0x69, 0x01, 0x00, 0xd4, 0x67, 0x01, 0x00, + 0x3c, 0x00, 0x80, 0x34, 0x00, 0x00, 0xf8, 0xb5, + 0x1d, 0x4e, 0x1c, 0x4d, 0x04, 0x1c, 0xf0, 0x68, + 0x02, 0x27, 0x1c, 0x3d, 0x00, 0x28, 0x07, 0xd0, + 0xe8, 0x68, 0x00, 0x28, 0x04, 0xd0, 0xfd, 0xf7, + 0xc2, 0xfe, 0x00, 0x28, 0x00, 0xd0, 0xbc, 0x43, + 0x00, 0x2c, 0x14, 0xd0, 0x37, 0x70, 0xf0, 0x68, + 0x14, 0x4f, 0x00, 0x28, 0x10, 0xd0, 0xe0, 0x07, + 0x17, 0xd4, 0xfd, 0xf7, 0xb4, 0xfe, 0x00, 0x28, + 0x13, 0xd0, 0x3c, 0x00, 0xbc, 0x34, 0x00, 0x00, + 0x70, 0x69, 0x00, 0x28, 0x06, 0xd1, 0xe8, 0x68, + 0x00, 0x28, 0x01, 0xd0, 0xfd, 0xf7, 0x1a, 0xff, + 0x0d, 0xf0, 0x0a, 0xfa, 0xf8, 0xbd, 0x68, 0x69, + 0x00, 0x28, 0x05, 0xd1, 0x09, 0x48, 0x00, 0x68, + 0x00, 0x28, 0x01, 0xd0, 0x01, 0x2c, 0x04, 0xd1, + 0x39, 0x1c, 0x20, 0x1c, 0x0e, 0xf0, 0x52, 0xfd, + 0xf0, 0xe7, 0x04, 0xf0, 0x1d, 0xfb, 0x02, 0xf0, + 0xeb, 0xfb, 0xeb, 0xe7, 0x3c, 0x00, 0xf8, 0x34, + 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x50, 0xc3, + 0x00, 0x00, 0xd4, 0x67, 0x01, 0x00, 0x05, 0x48, + 0x41, 0x69, 0x00, 0x29, 0x04, 0xd0, 0x40, 0x6a, + 0x00, 0x28, 0x01, 0xd0, 0x01, 0x20, 0x70, 0x47, + 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x78, 0x69, + 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x06, 0x49, + 0x00, 0x20, 0x48, 0x60, 0x08, 0x60, 0x88, 0x60, + 0x08, 0xf0, 0x9b, 0xff, 0x07, 0x21, 0x3c, 0x00, + 0x34, 0x35, 0x00, 0x00, 0x12, 0x20, 0x22, 0x79, + 0x10, 0xf0, 0x3a, 0xf9, 0x10, 0xbd, 0x00, 0x00, + 0x5c, 0x69, 0x01, 0x00, 0x01, 0x49, 0x01, 0x20, + 0x08, 0x60, 0x70, 0x47, 0xe8, 0x67, 0x01, 0x00, + 0xf8, 0xb5, 0x07, 0x1c, 0x0e, 0x1c, 0x08, 0xf0, + 0xa3, 0xfa, 0x13, 0x4d, 0x04, 0x1c, 0x68, 0x68, + 0x00, 0x28, 0x17, 0xd0, 0x00, 0x2f, 0x02, 0xd0, + 0xa8, 0x68, 0x03, 0x28, 0x13, 0xd3, 0x00, 0x20, + 0x3c, 0x00, 0x70, 0x35, 0x00, 0x00, 0xa8, 0x60, + 0x68, 0x60, 0x21, 0x1c, 0x0f, 0x20, 0x0e, 0xf0, + 0xf0, 0xfe, 0x28, 0x68, 0x00, 0x28, 0x03, 0xd0, + 0x00, 0x2c, 0x06, 0xd1, 0x01, 0x20, 0x02, 0xe0, + 0x01, 0x2c, 0x02, 0xd1, 0x00, 0x20, 0xff, 0xf7, + 0xfa, 0xfe, 0xf8, 0xbd, 0x72, 0x1c, 0x00, 0x21, + 0x04, 0x48, 0x00, 0xf0, 0x68, 0xf8, 0xa8, 0x68, + 0x01, 0x30, 0xa8, 0x60, 0xf5, 0xe7, 0x5c, 0x69, + 0x01, 0x00, 0x3c, 0x00, 0xac, 0x35, 0x00, 0x00, + 0x51, 0x35, 0x00, 0x00, 0x0a, 0x49, 0x80, 0xb5, + 0xca, 0x68, 0x00, 0x2a, 0x0b, 0xd0, 0x42, 0x68, + 0x00, 0x2a, 0x09, 0xd0, 0x00, 0x22, 0x4a, 0x62, + 0x02, 0x68, 0x0a, 0x62, 0x02, 0x68, 0x07, 0x21, + 0x17, 0x20, 0x10, 0xf0, 0xef, 0xf8, 0x80, 0xbd, + 0x01, 0x20, 0x48, 0x62, 0x80, 0xbd, 0x00, 0x00, + 0x78, 0x69, 0x01, 0x00, 0x70, 0xb5, 0x14, 0x4d, + 0x84, 0x6c, 0xe9, 0x68, 0x3c, 0x00, 0xe8, 0x35, + 0x00, 0x00, 0x00, 0x29, 0x17, 0xd0, 0x40, 0x30, + 0xec, 0x61, 0x40, 0x78, 0x00, 0x28, 0x01, 0xd1, + 0x01, 0x20, 0x68, 0x62, 0x28, 0x6a, 0x0e, 0x4e, + 0x00, 0x1b, 0xb0, 0x42, 0x0c, 0xd2, 0x08, 0xf0, + 0x3a, 0xfe, 0x29, 0x6a, 0x40, 0x1a, 0xb0, 0x42, + 0x03, 0xd2, 0x02, 0x22, 0x07, 0x21, 0x13, 0x20, + 0x09, 0xe0, 0x04, 0xf0, 0xb6, 0xfa, 0x70, 0xbd, + 0x07, 0x48, 0xa9, 0x68, 0x0b, 0xf0, 0x3c, 0x00, + 0x24, 0x36, 0x00, 0x00, 0xbd, 0xfe, 0x22, 0x1c, + 0x07, 0x21, 0x16, 0x20, 0x10, 0xf0, 0xc0, 0xf8, + 0x70, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, + 0xa0, 0x86, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, + 0x0a, 0x49, 0x80, 0xb5, 0x00, 0x20, 0x88, 0x61, + 0x08, 0x69, 0x00, 0x28, 0x0c, 0xd0, 0x07, 0x48, + 0x1c, 0x30, 0x00, 0x78, 0x00, 0x28, 0x07, 0xd0, + 0x01, 0xf0, 0xd2, 0xff, 0x02, 0x28, 0x03, 0xd1, + 0x3c, 0x00, 0x60, 0x36, 0x00, 0x00, 0x00, 0xf0, + 0x12, 0xf9, 0x00, 0xf0, 0xbc, 0xf8, 0x80, 0xbd, + 0x00, 0x00, 0x5c, 0x69, 0x01, 0x00, 0xf0, 0xb5, + 0x06, 0x1c, 0x0c, 0x1c, 0x15, 0x1c, 0x91, 0xb0, + 0x01, 0xa8, 0x40, 0x21, 0xfc, 0xf7, 0x0d, 0xff, + 0x00, 0x21, 0x68, 0x46, 0xfd, 0xf7, 0xa7, 0xff, + 0x04, 0x90, 0x01, 0xa8, 0x06, 0x22, 0x08, 0x49, + 0xfc, 0xf7, 0x31, 0xff, 0x06, 0x22, 0x02, 0xa8, + 0x02, 0x30, 0x3c, 0x00, 0x9c, 0x36, 0x00, 0x00, + 0x06, 0x49, 0xfc, 0xf7, 0x2b, 0xff, 0x00, 0xab, + 0xdc, 0x76, 0x0c, 0x95, 0x31, 0x1c, 0x01, 0xa8, + 0x07, 0xf0, 0x4e, 0xf8, 0x11, 0xb0, 0xf0, 0xbd, + 0x12, 0x61, 0x01, 0x00, 0xf8, 0x67, 0x01, 0x00, + 0x03, 0x1c, 0x08, 0x1c, 0x19, 0x1c, 0x11, 0x4b, + 0x80, 0xb5, 0x06, 0xd0, 0x04, 0x21, 0x11, 0x80, + 0x04, 0x22, 0x19, 0x1c, 0xfc, 0xf7, 0x12, 0xff, + 0x16, 0xe0, 0x04, 0x22, 0x3c, 0x00, 0xd8, 0x36, + 0x00, 0x00, 0x01, 0x1c, 0x18, 0x1c, 0xfc, 0xf7, + 0x0c, 0xff, 0x09, 0x48, 0x10, 0x38, 0x00, 0x69, + 0x00, 0x28, 0x0c, 0xd0, 0x07, 0x48, 0x0c, 0x30, + 0x00, 0x78, 0x00, 0x28, 0x07, 0xd0, 0x01, 0xf0, + 0x84, 0xff, 0x02, 0x28, 0x03, 0xd1, 0x00, 0xf0, + 0xc4, 0xf8, 0x00, 0xf0, 0x6e, 0xf8, 0x01, 0x20, + 0x80, 0xbd, 0x6c, 0x69, 0x01, 0x00, 0xf8, 0xb5, + 0x04, 0x1c, 0x0f, 0x1c, 0x00, 0x25, 0x3c, 0x00, + 0x14, 0x37, 0x00, 0x00, 0x00, 0x26, 0x01, 0xf0, + 0x73, 0xff, 0x02, 0x28, 0x2f, 0xd1, 0x19, 0x49, + 0x01, 0x2f, 0x08, 0x68, 0x07, 0xd1, 0x02, 0x1c, + 0x22, 0x40, 0x0a, 0xd1, 0x20, 0x43, 0x08, 0x60, + 0xa0, 0x42, 0x06, 0xd1, 0x04, 0xe0, 0x00, 0x28, + 0x03, 0xd0, 0xa0, 0x43, 0x08, 0x60, 0x00, 0xd1, + 0x01, 0x25, 0x48, 0x68, 0x00, 0x28, 0x1a, 0xd1, + 0x00, 0x2d, 0x17, 0xd0, 0x01, 0x20, 0x48, 0x60, + 0x3c, 0x00, 0x50, 0x37, 0x00, 0x00, 0x38, 0x1c, + 0x08, 0xf0, 0x89, 0xfe, 0x0b, 0x48, 0x1c, 0x30, + 0x81, 0x69, 0x00, 0x29, 0x07, 0xd0, 0x00, 0x23, + 0x83, 0x61, 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, + 0xff, 0xf7, 0xf1, 0xfe, 0x06, 0xe0, 0x00, 0x22, + 0x00, 0x21, 0x04, 0x48, 0xff, 0xf7, 0x7b, 0xff, + 0x00, 0xe0, 0x01, 0x26, 0x30, 0x1c, 0xf8, 0xbd, + 0x00, 0x00, 0x5c, 0x69, 0x01, 0x00, 0x51, 0x35, + 0x00, 0x00, 0x3c, 0x00, 0x8c, 0x37, 0x00, 0x00, + 0x03, 0x1c, 0x08, 0x1c, 0x19, 0x1c, 0x12, 0x4b, + 0x80, 0xb5, 0x06, 0xd0, 0x04, 0x21, 0x11, 0x80, + 0x04, 0x22, 0x19, 0x1c, 0xfc, 0xf7, 0xaa, 0xfe, + 0x18, 0xe0, 0x04, 0x22, 0x01, 0x1c, 0x18, 0x1c, + 0xfc, 0xf7, 0xa4, 0xfe, 0x0a, 0x48, 0x10, 0x30, + 0xc1, 0x68, 0x00, 0x29, 0x0e, 0xd0, 0x00, 0x78, + 0x00, 0x28, 0x0b, 0xd0, 0x01, 0xf0, 0x1e, 0xff, + 0x02, 0x28, 0x07, 0xd1, 0x3c, 0x00, 0xc8, 0x37, + 0x00, 0x00, 0x00, 0xf0, 0x64, 0xf8, 0x00, 0xf0, + 0x2e, 0xf8, 0x00, 0x28, 0x01, 0xd1, 0x09, 0xf0, + 0x7a, 0xfd, 0x01, 0x20, 0x80, 0xbd, 0x68, 0x69, + 0x01, 0x00, 0x10, 0xb5, 0x0a, 0x4c, 0x20, 0x69, + 0x00, 0x28, 0x09, 0xd0, 0xa1, 0x69, 0x00, 0x29, + 0x06, 0xd1, 0x7d, 0x21, 0xc9, 0x00, 0x41, 0x43, + 0x03, 0x22, 0x07, 0x20, 0x0f, 0xf0, 0xe1, 0xfe, + 0x21, 0x69, 0x01, 0x20, 0x00, 0x29, 0x3c, 0x00, + 0x04, 0x38, 0x00, 0x00, 0x00, 0xd1, 0x00, 0x20, + 0x10, 0xbd, 0x00, 0x00, 0x5c, 0x69, 0x01, 0x00, + 0x10, 0xb5, 0x05, 0x4c, 0x00, 0x28, 0x03, 0xd0, + 0xfd, 0xf7, 0x9a, 0xfc, 0xe0, 0x60, 0x10, 0xbd, + 0x01, 0x20, 0x00, 0x21, 0xe1, 0x60, 0x10, 0xbd, + 0x78, 0x69, 0x01, 0x00, 0x0a, 0x48, 0x0a, 0x49, + 0x10, 0xb5, 0xc0, 0x68, 0x1c, 0x39, 0xc9, 0x68, + 0x00, 0x28, 0x03, 0xd0, 0x00, 0x29, 0x01, 0xd0, + 0x3c, 0x00, 0x40, 0x38, 0x00, 0x00, 0x01, 0x24, + 0x00, 0xe0, 0x00, 0x24, 0x00, 0x2c, 0x03, 0xd0, + 0x02, 0x22, 0x07, 0x20, 0x0f, 0xf0, 0xb7, 0xfe, + 0x20, 0x1c, 0x10, 0xbd, 0x00, 0x00, 0x78, 0x69, + 0x01, 0x00, 0x10, 0xb5, 0x09, 0x4c, 0x00, 0x20, + 0x21, 0x69, 0x00, 0x29, 0x0c, 0xd0, 0x06, 0x49, + 0x1c, 0x31, 0x09, 0x78, 0x00, 0x29, 0x07, 0xd0, + 0x00, 0xf0, 0x09, 0xf8, 0x01, 0x20, 0xa0, 0x61, + 0x20, 0x69, 0x3c, 0x00, 0x7c, 0x38, 0x00, 0x00, + 0x7d, 0x23, 0xdb, 0x00, 0x58, 0x43, 0x10, 0xbd, + 0x5c, 0x69, 0x01, 0x00, 0x80, 0xb5, 0x03, 0x21, + 0x07, 0x20, 0x0f, 0xf0, 0xd1, 0xfe, 0x80, 0xbd, + 0x80, 0xb5, 0x02, 0x21, 0x07, 0x20, 0x0f, 0xf0, + 0xcb, 0xfe, 0x80, 0xbd, 0x06, 0x48, 0x80, 0xb5, + 0x00, 0x78, 0x00, 0x28, 0x01, 0xd0, 0xfd, 0xf7, + 0x29, 0xfd, 0x00, 0x22, 0x07, 0x21, 0x11, 0x20, + 0x0f, 0xf0, 0x7c, 0xff, 0x3c, 0x00, 0xb8, 0x38, + 0x00, 0x00, 0x80, 0xbd, 0x00, 0x00, 0x78, 0x69, + 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x10, 0x1c, + 0x06, 0x4a, 0x51, 0x61, 0x00, 0xf0, 0xa3, 0xf8, + 0x10, 0x20, 0x00, 0x2c, 0x00, 0xd1, 0x11, 0x20, + 0x00, 0x22, 0x07, 0x21, 0x0f, 0xf0, 0x69, 0xff, + 0x10, 0xbd, 0x5c, 0x69, 0x01, 0x00, 0x01, 0x49, + 0x48, 0x62, 0x70, 0x47, 0x00, 0x00, 0x44, 0x7d, + 0x01, 0x00, 0x10, 0xb5, 0x09, 0x4c, 0x3c, 0x00, + 0xf4, 0x38, 0x00, 0x00, 0xe0, 0x69, 0x00, 0x28, + 0x0c, 0xd1, 0xe0, 0x62, 0x01, 0x20, 0xe0, 0x61, + 0x0b, 0xf0, 0x08, 0xfd, 0x0b, 0xf0, 0x74, 0xfe, + 0x01, 0x20, 0x00, 0xf0, 0xb5, 0xf8, 0x0f, 0xf0, + 0x4d, 0xfa, 0x60, 0x63, 0x10, 0xbd, 0x00, 0x00, + 0x44, 0x7d, 0x01, 0x00, 0x05, 0x49, 0x80, 0xb5, + 0x00, 0x20, 0xc8, 0x61, 0x88, 0x63, 0x00, 0xf0, + 0x89, 0xf8, 0x00, 0xf0, 0x01, 0xf9, 0x02, 0xf0, + 0x3c, 0x00, 0x30, 0x39, 0x00, 0x00, 0x91, 0xfb, + 0x80, 0xbd, 0x44, 0x7d, 0x01, 0x00, 0x10, 0xb5, + 0x01, 0x28, 0x38, 0xd1, 0x08, 0x06, 0x00, 0x0e, + 0x05, 0x28, 0x32, 0xd1, 0x1d, 0x4c, 0x20, 0x78, + 0x01, 0x28, 0x09, 0xd0, 0x02, 0x28, 0x1b, 0xd0, + 0x03, 0x28, 0x2a, 0xd1, 0x02, 0xf0, 0x7d, 0xfb, + 0x00, 0xf0, 0x6f, 0xf8, 0x01, 0x20, 0x10, 0xe0, + 0x17, 0x48, 0x21, 0x6b, 0x0b, 0xf0, 0x1b, 0xfd, + 0x0b, 0xf0, 0x3c, 0x00, 0x6c, 0x39, 0x00, 0x00, + 0x41, 0xfe, 0x15, 0x48, 0x00, 0x69, 0x03, 0x28, + 0x01, 0xd3, 0xc0, 0x07, 0x03, 0xd5, 0x01, 0x21, + 0x20, 0x6b, 0x07, 0xf0, 0x19, 0xff, 0x02, 0x20, + 0x00, 0xf0, 0x78, 0xf8, 0x10, 0xbd, 0x0f, 0x48, + 0x00, 0x68, 0x20, 0x64, 0x0a, 0x48, 0x5c, 0x30, + 0xc1, 0x68, 0x02, 0x69, 0x89, 0x18, 0xc1, 0x60, + 0x03, 0xf0, 0xcc, 0xfc, 0x03, 0x20, 0x00, 0xf0, + 0x69, 0xf8, 0x01, 0x20, 0x3c, 0x00, 0xa8, 0x39, + 0x00, 0x00, 0xe0, 0x62, 0x10, 0xbd, 0x09, 0x21, + 0x00, 0xe0, 0x08, 0x21, 0x09, 0x20, 0xfd, 0xf7, + 0x76, 0xfc, 0x10, 0xbd, 0x00, 0x00, 0x44, 0x7d, + 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0xf4, 0x68, + 0x01, 0x00, 0x78, 0x6e, 0x01, 0x00, 0xb0, 0xb5, + 0x0f, 0x4c, 0x20, 0x78, 0x65, 0x1e, 0x01, 0x28, + 0x0f, 0xd1, 0x00, 0x20, 0xff, 0xf7, 0xa1, 0xfc, + 0x0c, 0x49, 0x09, 0x88, 0x49, 0x08, 0x3c, 0x00, + 0xe4, 0x39, 0x00, 0x00, 0x40, 0x1a, 0x0f, 0xf0, + 0x19, 0xf9, 0x00, 0x28, 0x04, 0xd0, 0x28, 0x78, + 0x01, 0x28, 0x07, 0xd0, 0x02, 0x28, 0x05, 0xd0, + 0x20, 0x78, 0x00, 0x28, 0x04, 0xd1, 0x28, 0x78, + 0x03, 0x28, 0x01, 0xd1, 0x01, 0x20, 0xb0, 0xbd, + 0x00, 0x20, 0xb0, 0xbd, 0x45, 0x7d, 0x01, 0x00, + 0xf4, 0x67, 0x01, 0x00, 0x01, 0x49, 0xc8, 0x64, + 0x70, 0x47, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, + 0x3c, 0x00, 0x20, 0x3a, 0x00, 0x00, 0x04, 0x49, + 0x05, 0x4a, 0x89, 0x68, 0x12, 0x6d, 0x01, 0x20, + 0x91, 0x42, 0x00, 0xd3, 0x00, 0x20, 0x70, 0x47, + 0x00, 0x00, 0xf4, 0x68, 0x01, 0x00, 0x44, 0x7d, + 0x01, 0x00, 0x10, 0xb5, 0x06, 0x4c, 0x20, 0x6b, + 0x07, 0xf0, 0xf9, 0xfe, 0xa0, 0x6b, 0x00, 0x28, + 0x03, 0xd1, 0x03, 0x48, 0x21, 0x6b, 0x0b, 0xf0, + 0x92, 0xfc, 0x10, 0xbd, 0x00, 0x00, 0x44, 0x7d, + 0x01, 0x00, 0x3c, 0x00, 0x5c, 0x3a, 0x00, 0x00, + 0x34, 0x63, 0x01, 0x00, 0x04, 0x48, 0x00, 0x78, + 0x02, 0x28, 0x01, 0xd0, 0x03, 0x28, 0x01, 0xd1, + 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, + 0x44, 0x7d, 0x01, 0x00, 0xf8, 0xb5, 0x07, 0x1c, + 0xff, 0xf7, 0xd0, 0xff, 0x06, 0x1c, 0x01, 0x2f, + 0x26, 0x4d, 0x1f, 0xd0, 0x02, 0x2f, 0x45, 0xd0, + 0x03, 0x2f, 0x12, 0xd1, 0x24, 0x48, 0x25, 0x4b, + 0x00, 0x69, 0x6a, 0x69, 0x3c, 0x00, 0x98, 0x3a, + 0x00, 0x00, 0x41, 0x08, 0x5a, 0x43, 0x23, 0x4b, + 0xd4, 0x18, 0x8c, 0x42, 0x00, 0xd9, 0x0c, 0x1c, + 0x00, 0x2e, 0x05, 0xd0, 0x1e, 0x49, 0x5b, 0x39, + 0x09, 0x78, 0x00, 0x29, 0x00, 0xd1, 0x04, 0x1c, + 0x05, 0x22, 0x21, 0x1c, 0x09, 0x20, 0x0f, 0xf0, + 0x80, 0xfd, 0x18, 0x4a, 0x5c, 0x3a, 0x17, 0x70, + 0xf8, 0xbd, 0xff, 0xf7, 0xd6, 0xfb, 0x00, 0x28, + 0x02, 0xd0, 0x28, 0x69, 0x00, 0x28, 0x3c, 0x00, + 0xd4, 0x3a, 0x00, 0x00, 0x0e, 0xd0, 0x04, 0xf0, + 0xcf, 0xfb, 0x13, 0x4b, 0x69, 0x69, 0x11, 0x4a, + 0x59, 0x43, 0x5c, 0x3a, 0xd2, 0x6b, 0x89, 0x18, + 0x88, 0x42, 0x01, 0xd9, 0x44, 0x1a, 0x04, 0xe0, + 0x00, 0x24, 0x02, 0xe0, 0x04, 0xf0, 0xae, 0xfd, + 0x04, 0x1c, 0x00, 0x2e, 0xdb, 0xd0, 0x09, 0x48, + 0x5b, 0x38, 0x00, 0x78, 0x01, 0x28, 0xd6, 0xd1, + 0x08, 0x4b, 0x9c, 0x42, 0x02, 0xd9, 0x58, 0x42, + 0x3c, 0x00, 0x10, 0x3b, 0x00, 0x00, 0x24, 0x18, + 0xd0, 0xe7, 0x00, 0x24, 0xce, 0xe7, 0x04, 0xf0, + 0xae, 0xfb, 0xca, 0xe7, 0x00, 0x00, 0xf4, 0x68, + 0x01, 0x00, 0xa0, 0x7d, 0x01, 0x00, 0x98, 0x3a, + 0x00, 0x00, 0x88, 0x13, 0x00, 0x00, 0x80, 0xb5, + 0x05, 0x21, 0x09, 0x20, 0x0f, 0xf0, 0x7d, 0xfd, + 0x02, 0x49, 0x00, 0x20, 0x08, 0x70, 0x80, 0xbd, + 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0x70, 0xb5, + 0x06, 0x1c, 0x3c, 0x00, 0x4c, 0x3b, 0x00, 0x00, + 0x0d, 0xf0, 0xbc, 0xfa, 0xff, 0xf7, 0xce, 0xfe, + 0x09, 0x4c, 0x0a, 0x48, 0x21, 0x6b, 0x0b, 0xf0, + 0x21, 0xfc, 0x01, 0x25, 0x01, 0x21, 0x30, 0x06, + 0x00, 0x0e, 0xa5, 0x63, 0x07, 0xf0, 0x3a, 0xfe, + 0x05, 0x48, 0x29, 0x02, 0x09, 0x58, 0x00, 0x29, + 0x00, 0xd1, 0x05, 0x61, 0x70, 0xbd, 0x00, 0x00, + 0x44, 0x7d, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, + 0xf4, 0x67, 0x01, 0x00, 0x3c, 0x00, 0x88, 0x3b, + 0x00, 0x00, 0x02, 0x4a, 0x11, 0x6c, 0x08, 0x43, + 0x10, 0x64, 0x70, 0x47, 0x00, 0x00, 0x44, 0x7d, + 0x01, 0x00, 0x80, 0xb5, 0xff, 0xf7, 0xbf, 0xfe, + 0x0b, 0xf0, 0xa1, 0xfb, 0x80, 0xbd, 0x02, 0x4a, + 0x01, 0x1c, 0x10, 0x69, 0x11, 0x61, 0x70, 0x47, + 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, 0xf3, 0xb5, + 0x06, 0x1c, 0x00, 0x20, 0x89, 0xb0, 0xf8, 0x4c, + 0x08, 0x90, 0xe2, 0x69, 0x08, 0x25, 0x3c, 0x00, + 0xc4, 0x3b, 0x00, 0x00, 0x00, 0x2a, 0x03, 0xd0, + 0x06, 0xa9, 0x07, 0xa8, 0xfc, 0xf7, 0x06, 0xfc, + 0x30, 0x1c, 0xf3, 0x4e, 0x00, 0x27, 0x20, 0x36, + 0x82, 0x28, 0x6f, 0xd0, 0x15, 0xdc, 0x01, 0x28, + 0x18, 0xd0, 0x80, 0x28, 0x6b, 0xd1, 0xee, 0x4d, + 0x80, 0x3d, 0xa8, 0x68, 0x01, 0x28, 0x67, 0xd1, + 0x68, 0x68, 0x0f, 0xf0, 0x1b, 0xf8, 0x00, 0x28, + 0x63, 0xd1, 0x01, 0x21, 0x01, 0x20, 0x0d, 0xf0, + 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x9d, 0xf8, + 0x08, 0xf0, 0xdb, 0xfd, 0x0b, 0xb0, 0xf0, 0xbd, + 0x83, 0x28, 0x6d, 0xd0, 0x84, 0x28, 0x55, 0xd1, + 0xe7, 0xe0, 0x0a, 0x98, 0x0a, 0x28, 0x04, 0xd2, + 0x03, 0xa3, 0x1b, 0x18, 0x1b, 0x5a, 0x5b, 0x00, + 0x9f, 0x44, 0xf6, 0xe0, 0x00, 0x00, 0xee, 0x00, + 0x0b, 0x00, 0xf7, 0x00, 0xf7, 0x00, 0xf7, 0x00, + 0xf7, 0x00, 0x2f, 0x00, 0x88, 0x00, 0x8b, 0x00, + 0xad, 0x00, 0x3c, 0x00, 0x3c, 0x3c, 0x00, 0x00, + 0x00, 0xf0, 0x56, 0xfe, 0x00, 0x28, 0x17, 0xd0, + 0xd6, 0x4a, 0x80, 0x3a, 0xd1, 0x6a, 0x06, 0x98, + 0x81, 0x42, 0x16, 0xd0, 0x06, 0x21, 0x00, 0x28, + 0x00, 0xd1, 0x07, 0x21, 0x0d, 0x06, 0x2d, 0x0e, + 0x00, 0x28, 0x0e, 0xd0, 0xcf, 0x4a, 0x01, 0x20, + 0x80, 0x3a, 0x50, 0x65, 0x0f, 0xf0, 0xa0, 0xf8, + 0xcc, 0x4a, 0x80, 0x3a, 0x50, 0x66, 0x04, 0xe0, + 0x00, 0x21, 0x16, 0x20, 0x3c, 0x00, 0x78, 0x3c, + 0x00, 0x00, 0x0f, 0xf0, 0xdc, 0xfc, 0x01, 0x25, + 0x02, 0x20, 0x05, 0x90, 0x2e, 0xe2, 0xc6, 0x48, + 0x80, 0x38, 0x40, 0x6d, 0x00, 0x28, 0x2e, 0xd0, + 0xc6, 0x49, 0x20, 0x69, 0xc4, 0x4d, 0x40, 0x18, + 0x0e, 0xf0, 0xc1, 0xff, 0x00, 0x28, 0x12, 0xd0, + 0x0f, 0xf0, 0x85, 0xf8, 0xc1, 0x49, 0x49, 0x42, + 0x40, 0x18, 0xbd, 0x49, 0x20, 0x61, 0x80, 0x39, + 0x48, 0x6e, 0x40, 0x19, 0x0e, 0xf0, 0x3c, 0x00, + 0xb4, 0x3c, 0x00, 0x00, 0xbb, 0xff, 0x00, 0x28, + 0x11, 0xd0, 0x0a, 0xe0, 0xf7, 0xe0, 0x17, 0xe2, + 0xb2, 0xe0, 0xb0, 0xe0, 0xb6, 0x49, 0x20, 0x69, + 0x80, 0x39, 0x49, 0x6e, 0x40, 0x1a, 0xa8, 0x42, + 0x05, 0xdb, 0xb3, 0x49, 0xb5, 0x4d, 0x80, 0x39, + 0x4f, 0x65, 0x03, 0xf0, 0x27, 0xfb, 0x06, 0x22, + 0x29, 0x1c, 0x16, 0x20, 0x0f, 0xf0, 0x72, 0xfc, + 0x47, 0xe0, 0x95, 0xe0, 0x00, 0xf0, 0xfe, 0xfd, + 0x3c, 0x00, 0xf0, 0x3c, 0x00, 0x00, 0x00, 0x28, + 0x42, 0xd1, 0xaa, 0x4d, 0xc4, 0x3d, 0xef, 0x60, + 0x08, 0xf0, 0x19, 0xfd, 0x03, 0xf0, 0x15, 0xfb, + 0xa8, 0x6a, 0x00, 0x28, 0x02, 0xd0, 0xff, 0xf7, + 0x4c, 0xff, 0xaf, 0x62, 0xa4, 0x48, 0x80, 0x38, + 0x00, 0x68, 0x00, 0x21, 0xff, 0xf7, 0xf9, 0xfc, + 0x08, 0xf0, 0x3f, 0xf9, 0x09, 0x21, 0x16, 0x20, + 0x0f, 0xf0, 0x87, 0xfc, 0x00, 0x22, 0x16, 0x21, + 0x83, 0x20, 0x3c, 0x00, 0x2c, 0x3d, 0x00, 0x00, + 0x0f, 0xf0, 0x40, 0xfd, 0xff, 0xf7, 0x86, 0xfc, + 0x21, 0xe0, 0x00, 0xf0, 0x1b, 0xfe, 0x1e, 0xe0, + 0x06, 0xf0, 0x54, 0xfa, 0x97, 0x4d, 0x80, 0x3d, + 0xa9, 0x6f, 0x40, 0x1a, 0x04, 0x90, 0x06, 0x98, + 0x00, 0x28, 0x01, 0xd0, 0xaf, 0x65, 0x02, 0xe0, + 0xa8, 0x6d, 0x00, 0x28, 0x08, 0xd1, 0x91, 0x48, + 0xc4, 0x38, 0x00, 0x78, 0x80, 0x07, 0x03, 0xd5, + 0x92, 0x48, 0x47, 0x60, 0x3c, 0x00, 0x68, 0x3d, + 0x00, 0x00, 0x00, 0xf0, 0x02, 0xfe, 0x04, 0x98, + 0xff, 0x38, 0x23, 0x38, 0x14, 0x28, 0x02, 0xd2, + 0x01, 0x20, 0xe8, 0x63, 0x53, 0xe0, 0xef, 0x63, + 0x51, 0xe0, 0x87, 0x4a, 0xb5, 0x7a, 0x80, 0x3a, + 0x00, 0x2d, 0x4c, 0xd0, 0x0d, 0xf0, 0x71, 0xff, + 0x00, 0xf0, 0xad, 0xfd, 0x07, 0x1c, 0x82, 0x48, + 0x80, 0x38, 0x40, 0x6f, 0xff, 0x30, 0x5f, 0x30, + 0x0e, 0xf0, 0x3d, 0xff, 0x02, 0x1c, 0x3c, 0x00, + 0xa4, 0x3d, 0x00, 0x00, 0x7e, 0x48, 0x80, 0x38, + 0x40, 0x6d, 0x00, 0x28, 0x1a, 0xd1, 0x00, 0xf0, + 0xf1, 0xfd, 0x00, 0x28, 0x16, 0xd1, 0x04, 0x2d, + 0x02, 0xd1, 0x00, 0x2f, 0x12, 0xd1, 0x1b, 0xe0, + 0x00, 0x2f, 0x06, 0xd0, 0x02, 0x2d, 0x14, 0xd0, + 0x79, 0x48, 0x40, 0x68, 0x00, 0x28, 0x09, 0xd0, + 0x12, 0xe0, 0x00, 0x2a, 0x10, 0xd1, 0x4b, 0x21, + 0xc9, 0x00, 0x01, 0x23, 0x09, 0x22, 0x16, 0x20, + 0x3c, 0x00, 0xe0, 0x3d, 0x00, 0x00, 0x0f, 0xf0, + 0xd6, 0xfc, 0x6e, 0x4a, 0x73, 0x48, 0x80, 0x3a, + 0x11, 0x68, 0x0b, 0xf0, 0xd8, 0xfa, 0x18, 0xe0, + 0x01, 0x21, 0x00, 0x20, 0x01, 0xe0, 0x01, 0x21, + 0x01, 0x20, 0x00, 0xf0, 0x2a, 0xfe, 0x10, 0xe0, + 0x67, 0x4a, 0x6c, 0x49, 0x80, 0x3a, 0x90, 0x6e, + 0x40, 0x18, 0x90, 0x66, 0x01, 0x25, 0x08, 0x95, + 0x8b, 0xe1, 0x04, 0x21, 0x6c, 0xe1, 0x61, 0x4a, + 0x66, 0x48, 0x3c, 0x00, 0x1c, 0x3e, 0x00, 0x00, + 0x80, 0x3a, 0x11, 0x68, 0x0b, 0xf0, 0xaa, 0xfa, + 0x88, 0xe1, 0xaf, 0x60, 0xa8, 0x6f, 0xe8, 0x67, + 0x63, 0x48, 0x01, 0x6d, 0xa9, 0x67, 0x07, 0x9a, + 0x14, 0x20, 0x00, 0x2a, 0x00, 0xd1, 0x00, 0x20, + 0x08, 0x18, 0x12, 0x30, 0xa8, 0x66, 0x70, 0x78, + 0xb0, 0x70, 0x30, 0x78, 0x70, 0x70, 0x02, 0x20, + 0x30, 0x70, 0xa0, 0x69, 0xfc, 0xf7, 0xc2, 0xfa, + 0xef, 0x64, 0xa8, 0x6f, 0x3c, 0x00, 0x58, 0x3e, + 0x00, 0x00, 0xe9, 0x6f, 0x59, 0x4b, 0x40, 0x1a, + 0x98, 0x42, 0x12, 0xd2, 0x68, 0x6d, 0x06, 0x99, + 0x88, 0x42, 0x0e, 0xd0, 0x30, 0x78, 0x02, 0x28, + 0x0b, 0xd8, 0x0e, 0xf0, 0x9c, 0xff, 0xa9, 0x6f, + 0x08, 0x22, 0x40, 0x1a, 0x52, 0x49, 0x09, 0x1a, + 0x3b, 0x1c, 0x16, 0x20, 0x0f, 0xf0, 0x85, 0xfc, + 0x00, 0xe0, 0xaf, 0x65, 0x01, 0x20, 0x05, 0x90, + 0x08, 0x90, 0x43, 0x48, 0x02, 0x25, 0x3c, 0x00, + 0x94, 0x3e, 0x00, 0x00, 0xc4, 0x38, 0xc1, 0x68, + 0x00, 0x29, 0x72, 0xd1, 0x01, 0x21, 0xc1, 0x60, + 0x49, 0x48, 0x00, 0x6b, 0x00, 0x28, 0x6c, 0xd0, + 0x08, 0xf0, 0x66, 0xfc, 0x69, 0xe0, 0x3c, 0x48, + 0x00, 0x22, 0x01, 0x92, 0x80, 0x38, 0x80, 0x68, + 0x01, 0x28, 0x04, 0xd1, 0x38, 0x48, 0x80, 0x38, + 0x87, 0x60, 0x01, 0x20, 0x48, 0xe1, 0x3a, 0x48, + 0x01, 0x23, 0x43, 0x60, 0x34, 0x48, 0xc4, 0x38, + 0x3c, 0x00, 0xd0, 0x3e, 0x00, 0x00, 0x00, 0x78, + 0x00, 0x28, 0x0a, 0xd1, 0x00, 0xf0, 0x25, 0xfe, + 0x00, 0x28, 0x06, 0xd0, 0xff, 0x21, 0x91, 0x31, + 0x01, 0x23, 0x09, 0x22, 0x16, 0x20, 0x0f, 0xf0, + 0x52, 0xfc, 0x2c, 0x49, 0x80, 0x39, 0x48, 0x6f, + 0x89, 0x6f, 0x42, 0x1a, 0x03, 0x92, 0x06, 0xf0, + 0x76, 0xf9, 0x28, 0x49, 0x80, 0x39, 0x89, 0x6f, + 0x03, 0x9a, 0x40, 0x1a, 0x02, 0x90, 0x37, 0x20, + 0x00, 0x01, 0x3c, 0x00, 0x0c, 0x3f, 0x00, 0x00, + 0x10, 0x1a, 0x50, 0x28, 0x0d, 0xd2, 0x23, 0x48, + 0x80, 0x38, 0x40, 0x6d, 0x00, 0x28, 0x04, 0xd1, + 0x02, 0x98, 0xff, 0x38, 0x55, 0x38, 0x14, 0x28, + 0x01, 0xd2, 0x01, 0x22, 0x00, 0xe0, 0x00, 0x22, + 0x01, 0x92, 0x03, 0x9a, 0x01, 0x20, 0xff, 0x3a, + 0x0b, 0x3a, 0x50, 0x2a, 0x00, 0xd3, 0x00, 0x20, + 0x04, 0x90, 0x00, 0x28, 0x0a, 0xd0, 0x17, 0x48, + 0x80, 0x38, 0xc0, 0x6f, 0x3c, 0x00, 0x48, 0x3f, + 0x00, 0x00, 0x08, 0x1a, 0x9b, 0x21, 0xc9, 0x00, + 0x40, 0x1a, 0x14, 0x28, 0x01, 0xd2, 0x01, 0x22, + 0x00, 0xe0, 0x00, 0x22, 0x00, 0x92, 0x00, 0x2a, + 0x11, 0xd0, 0x0f, 0x4d, 0x01, 0x20, 0x80, 0x3d, + 0x68, 0x65, 0x0e, 0xf0, 0x20, 0xff, 0x68, 0x66, + 0x01, 0x25, 0x01, 0x21, 0x16, 0x20, 0x0f, 0xf0, + 0x5e, 0xfb, 0x00, 0x21, 0x16, 0x20, 0x0f, 0xf0, + 0x5a, 0xfb, 0x00, 0xe0, 0xba, 0xe0, 0x3c, 0x00, + 0x84, 0x3f, 0x00, 0x00, 0xf0, 0x79, 0x02, 0x28, + 0x3c, 0xd8, 0x05, 0x4a, 0x80, 0x3a, 0x51, 0x6c, + 0x00, 0x29, 0x37, 0xd1, 0x13, 0x6c, 0x11, 0x1c, + 0x00, 0x2b, 0x33, 0xd1, 0x16, 0xe0, 0x00, 0x00, + 0x24, 0x6d, 0x01, 0x00, 0x50, 0xc3, 0x00, 0x00, + 0xc0, 0x5c, 0x15, 0x00, 0x70, 0x99, 0x14, 0x00, + 0xb0, 0x57, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, + 0xe2, 0x04, 0x00, 0x00, 0x00, 0x90, 0x07, 0x00, + 0x3c, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x53, 0x07, + 0x00, 0x00, 0x1e, 0x02, 0x00, 0x00, 0xc8, 0x57, + 0x01, 0x00, 0x4a, 0x6d, 0x00, 0x2a, 0x02, 0xd0, + 0xb2, 0x7a, 0x02, 0x2a, 0x15, 0xd1, 0x00, 0x9a, + 0x00, 0x2a, 0x03, 0xd0, 0xca, 0x6d, 0x01, 0x32, + 0xca, 0x65, 0x00, 0xe0, 0xcf, 0x65, 0x01, 0x9a, + 0x00, 0x2a, 0x0b, 0xd0, 0x8a, 0x6f, 0xcb, 0x6f, + 0xd2, 0x1a, 0x5a, 0x4b, 0x9a, 0x42, 0x02, 0xd2, + 0x8a, 0x6d, 0x3c, 0x00, 0xfc, 0x3f, 0x00, 0x00, + 0x01, 0x32, 0x00, 0xe0, 0x01, 0x22, 0x8a, 0x65, + 0x00, 0xe0, 0x8f, 0x65, 0x04, 0x99, 0x00, 0x29, + 0x01, 0xd1, 0x02, 0x28, 0x0b, 0xd9, 0x54, 0x4a, + 0x02, 0x28, 0x1e, 0xd9, 0xd0, 0x6f, 0x61, 0x68, + 0x88, 0x42, 0x1a, 0xd1, 0x91, 0x6f, 0x08, 0x1a, + 0x50, 0x49, 0x88, 0x42, 0x15, 0xdd, 0x4e, 0x4b, + 0x98, 0x6f, 0xe1, 0x68, 0x40, 0x1a, 0x7d, 0x21, + 0xc9, 0x00, 0x88, 0x42, 0x3c, 0x00, 0x38, 0x40, + 0x00, 0x00, 0x0b, 0xdd, 0x61, 0x69, 0x40, 0x1a, + 0x00, 0x28, 0x04, 0xdd, 0x02, 0x11, 0x40, 0x11, + 0x10, 0x18, 0x40, 0x18, 0x01, 0xe0, 0x80, 0x10, + 0x08, 0x18, 0x60, 0x61, 0x58, 0x6f, 0xe0, 0x60, + 0x03, 0x98, 0xff, 0x38, 0x23, 0x38, 0x14, 0x28, + 0x09, 0xd2, 0x02, 0x98, 0xff, 0x38, 0x23, 0x38, + 0x14, 0x28, 0x04, 0xd2, 0x3e, 0x4a, 0x90, 0x6f, + 0x50, 0x64, 0x90, 0x6a, 0x90, 0x64, 0x3c, 0x00, + 0x74, 0x40, 0x00, 0x00, 0x0e, 0xf0, 0x9a, 0xfe, + 0x3a, 0x49, 0x49, 0x6c, 0x40, 0x1a, 0x3b, 0x49, + 0x88, 0x42, 0x01, 0xd9, 0x37, 0x49, 0x4f, 0x64, + 0x39, 0x49, 0x03, 0x98, 0x40, 0x18, 0x14, 0x28, + 0x07, 0xd2, 0x34, 0x49, 0xc8, 0x6b, 0x00, 0x28, + 0x03, 0xd0, 0x88, 0x6f, 0x08, 0x64, 0x88, 0x6a, + 0x88, 0x64, 0x0e, 0xf0, 0x83, 0xfe, 0x2f, 0x49, + 0x09, 0x6c, 0x40, 0x1a, 0x31, 0x49, 0x88, 0x42, + 0x3c, 0x00, 0xb0, 0x40, 0x00, 0x00, 0x01, 0xd9, + 0x2c, 0x48, 0x07, 0x64, 0x04, 0x20, 0x05, 0x90, + 0x08, 0x21, 0x16, 0x20, 0x0f, 0xf0, 0xb9, 0xfa, + 0x28, 0x48, 0x40, 0x6d, 0x00, 0x28, 0x02, 0xd0, + 0x04, 0x99, 0x00, 0x29, 0x08, 0xd0, 0x29, 0x49, + 0x00, 0x28, 0x00, 0xd1, 0x29, 0x49, 0x3b, 0x1c, + 0x06, 0x22, 0x16, 0x20, 0x0f, 0xf0, 0x57, 0xfb, + 0x02, 0x2d, 0x09, 0xd0, 0x06, 0x2d, 0x0a, 0xd0, + 0x07, 0x2d, 0x3c, 0x00, 0xec, 0x40, 0x00, 0x00, + 0x13, 0xd1, 0x07, 0xe0, 0x01, 0x21, 0x16, 0x20, + 0xfd, 0xf7, 0xd6, 0xf8, 0x1e, 0xe0, 0x1a, 0x4a, + 0x57, 0x63, 0x97, 0x63, 0x18, 0x4a, 0x06, 0x98, + 0xd0, 0x62, 0x07, 0x99, 0x11, 0x63, 0x53, 0x6b, + 0x18, 0x43, 0x50, 0x63, 0x90, 0x6b, 0x08, 0x43, + 0x90, 0x63, 0x05, 0x98, 0x00, 0x28, 0x05, 0xd0, + 0x05, 0x98, 0x0c, 0xf0, 0x5f, 0xfa, 0x05, 0x98, + 0x0c, 0xf0, 0xd2, 0xf9, 0x3c, 0x00, 0x28, 0x41, + 0x00, 0x00, 0x08, 0x2d, 0x05, 0xd0, 0x0d, 0x48, + 0x44, 0x38, 0x85, 0x70, 0x28, 0x1c, 0x03, 0xf0, + 0xdc, 0xfd, 0x11, 0x49, 0xe0, 0x69, 0x88, 0x42, + 0x00, 0xd1, 0x61, 0xe5, 0x08, 0x98, 0x00, 0x28, + 0xfb, 0xd0, 0xb0, 0x7a, 0x02, 0x28, 0xf8, 0xd1, + 0x01, 0x21, 0x16, 0x20, 0x0f, 0xf0, 0x6f, 0xfa, + 0x02, 0x20, 0x0d, 0xf0, 0xe8, 0xfe, 0x53, 0xe5, + 0x00, 0x00, 0x53, 0x07, 0x00, 0x00, 0x3c, 0x00, + 0x64, 0x41, 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, + 0x20, 0xa1, 0x07, 0x00, 0x20, 0x4e, 0x00, 0x00, + 0x3f, 0xfb, 0xff, 0xff, 0xa0, 0x86, 0x01, 0x00, + 0x50, 0xc3, 0x00, 0x00, 0xc0, 0x5c, 0x15, 0x00, + 0xf1, 0x1d, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x70, 0x47, 0x00, 0x00, 0xf8, 0xb5, 0x21, 0x48, + 0x00, 0x68, 0x21, 0x4d, 0x69, 0x69, 0x08, 0x40, + 0x01, 0xd1, 0x01, 0x27, 0x00, 0xe0, 0x00, 0x27, + 0x3c, 0x00, 0xa0, 0x41, 0x00, 0x00, 0x1d, 0x4d, + 0x01, 0x26, 0x69, 0x6a, 0x00, 0x29, 0x00, 0xd0, + 0x00, 0x26, 0x1b, 0x4d, 0x1a, 0x48, 0x2c, 0x1c, + 0xa0, 0x30, 0x02, 0x7a, 0x28, 0x1c, 0x40, 0x30, + 0x80, 0x34, 0x10, 0x23, 0xb7, 0x42, 0x10, 0xd1, + 0x01, 0x25, 0xc5, 0x80, 0x00, 0x29, 0x00, 0xd0, + 0x00, 0x23, 0x1a, 0x43, 0x11, 0x1c, 0x01, 0x73, + 0x01, 0x20, 0x0e, 0xf0, 0x88, 0xfe, 0x08, 0x20, + 0x20, 0x70, 0x3c, 0x00, 0xdc, 0x41, 0x00, 0x00, + 0x00, 0x22, 0x16, 0x21, 0x80, 0x20, 0x13, 0xe0, + 0x11, 0x27, 0xc7, 0x80, 0x2e, 0x1c, 0x0b, 0x4d, + 0x00, 0x29, 0x00, 0xd1, 0x00, 0x23, 0x1a, 0x43, + 0x11, 0x1c, 0x01, 0x73, 0x01, 0x20, 0x0e, 0xf0, + 0x75, 0xfe, 0x08, 0x20, 0x20, 0x70, 0x30, 0x6d, + 0x00, 0x22, 0x16, 0x21, 0x68, 0x67, 0x82, 0x20, + 0x0f, 0xf0, 0xd0, 0xfa, 0xf8, 0xbd, 0x00, 0x00, + 0x10, 0x00, 0x07, 0x00, 0x3c, 0x00, 0x18, 0x42, + 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x00, 0x90, + 0x07, 0x00, 0xb0, 0xb5, 0x0f, 0x4d, 0x04, 0x1c, + 0xaa, 0x7a, 0x01, 0x21, 0x08, 0x1c, 0x00, 0x2a, + 0x00, 0xd0, 0x00, 0x20, 0x00, 0x2c, 0x00, 0xd0, + 0x00, 0x21, 0x88, 0x42, 0x0a, 0xd0, 0x00, 0x2c, + 0x04, 0xd1, 0x00, 0xf0, 0x42, 0xfb, 0x00, 0xf0, + 0xd6, 0xfa, 0x03, 0xe0, 0x00, 0xf0, 0xd9, 0xfa, + 0x00, 0xf0, 0x09, 0xf8, 0xa8, 0x7a, 0x3c, 0x00, + 0x54, 0x42, 0x00, 0x00, 0x02, 0x49, 0xe4, 0x39, + 0x48, 0x71, 0xac, 0x72, 0xb0, 0xbd, 0x00, 0x00, + 0x44, 0x6d, 0x01, 0x00, 0x80, 0xb5, 0x3e, 0xf0, + 0x55, 0xf8, 0x02, 0x49, 0x01, 0x20, 0x08, 0x70, + 0x80, 0xbd, 0x00, 0x00, 0x68, 0x7e, 0x01, 0x00, + 0xf3, 0xb5, 0x01, 0x20, 0x8d, 0xb0, 0x0f, 0x1c, + 0x01, 0x24, 0x08, 0x90, 0x0e, 0xf0, 0x92, 0xfd, + 0x06, 0x1c, 0x00, 0xf0, 0xb5, 0xfa, 0x09, 0x90, + 0x3c, 0x00, 0x90, 0x42, 0x00, 0x00, 0x00, 0xf0, + 0x80, 0xfb, 0x07, 0x90, 0xfe, 0xf7, 0x3f, 0xfa, + 0x05, 0x1c, 0x00, 0x21, 0x0c, 0x91, 0x08, 0xf0, + 0xf0, 0xfb, 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, + 0x00, 0xe0, 0x00, 0x20, 0x0a, 0x90, 0xfe, 0xf7, + 0x12, 0xfd, 0x05, 0xf0, 0xe0, 0xfe, 0x0b, 0x90, + 0x00, 0x2d, 0x23, 0xd0, 0x28, 0x88, 0x41, 0x07, + 0x20, 0xd4, 0x29, 0x1d, 0x04, 0x91, 0x0a, 0x35, + 0x00, 0x06, 0x3c, 0x00, 0xcc, 0x42, 0x00, 0x00, + 0x80, 0x0e, 0x01, 0x21, 0x20, 0x28, 0x03, 0x95, + 0x00, 0xd0, 0x00, 0x21, 0x0d, 0x1c, 0x04, 0x98, + 0x06, 0xf0, 0x38, 0xfd, 0x0c, 0x90, 0x04, 0x98, + 0x06, 0xf0, 0x10, 0xfd, 0x00, 0x28, 0x08, 0xd0, + 0x03, 0x98, 0x01, 0xf0, 0x87, 0xfa, 0x00, 0x28, + 0x03, 0xd0, 0x00, 0x2d, 0x01, 0xd1, 0x01, 0x20, + 0x00, 0xe0, 0x00, 0x20, 0x0c, 0x99, 0x01, 0x43, + 0x0c, 0x91, 0xfc, 0xf7, 0x3c, 0x00, 0x08, 0x43, + 0x00, 0x00, 0x23, 0xff, 0x00, 0x28, 0x2f, 0xd0, + 0x07, 0xf0, 0x99, 0xff, 0x05, 0x1c, 0x07, 0xf0, + 0xb2, 0xff, 0x04, 0x90, 0xff, 0xf7, 0xf3, 0xf8, + 0x0c, 0x99, 0x01, 0x43, 0x00, 0x2d, 0x06, 0xd0, + 0x04, 0x98, 0xf0, 0x4a, 0x30, 0x1a, 0x90, 0x42, + 0x01, 0xd2, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, + 0x08, 0x43, 0x0c, 0x90, 0x0b, 0x98, 0x0a, 0x9b, + 0x18, 0x43, 0x01, 0x1c, 0x0b, 0x91, 0x3c, 0x00, + 0x44, 0x43, 0x00, 0x00, 0x05, 0xf0, 0xce, 0xfe, + 0x00, 0x28, 0x1a, 0xd1, 0x00, 0x2d, 0x06, 0xd0, + 0x04, 0x98, 0xe7, 0x49, 0x30, 0x1a, 0x88, 0x42, + 0x01, 0xd2, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, + 0x0c, 0x99, 0x08, 0x43, 0x05, 0x1c, 0x00, 0xf0, + 0x1f, 0xfb, 0x28, 0x43, 0x03, 0xe0, 0x00, 0xf0, + 0x1b, 0xfb, 0x0c, 0x99, 0x08, 0x43, 0x0c, 0x90, + 0x00, 0xf0, 0xd4, 0xfb, 0x0b, 0x99, 0x01, 0x43, + 0x3c, 0x00, 0x80, 0x43, 0x00, 0x00, 0x0b, 0x91, + 0xdc, 0x49, 0xc8, 0x68, 0x00, 0x28, 0x01, 0xd0, + 0x01, 0x38, 0xc8, 0x60, 0x08, 0xf0, 0xe7, 0xfb, + 0x06, 0x90, 0x08, 0xf0, 0x90, 0xfd, 0x31, 0x1a, + 0x05, 0x91, 0x06, 0x99, 0xd6, 0x48, 0x81, 0x42, + 0x08, 0xd8, 0x00, 0x2f, 0x08, 0xd1, 0x05, 0x99, + 0x40, 0x08, 0x81, 0x42, 0x04, 0xd9, 0x06, 0x99, + 0x81, 0x42, 0x01, 0xd9, 0x00, 0x24, 0x8b, 0xe0, + 0xd0, 0x48, 0x3c, 0x00, 0xbc, 0x43, 0x00, 0x00, + 0x05, 0x99, 0xd0, 0x4d, 0x81, 0x42, 0x26, 0xd2, + 0xe8, 0x79, 0x10, 0x28, 0x06, 0xd2, 0x00, 0x2f, + 0x21, 0xd1, 0xcc, 0x48, 0xa0, 0x38, 0x80, 0x6a, + 0x00, 0x28, 0x1c, 0xd1, 0x09, 0xf0, 0x62, 0xff, + 0x04, 0x90, 0x00, 0x28, 0x02, 0xd1, 0x00, 0x20, + 0xc3, 0x49, 0x13, 0xe0, 0x09, 0xf0, 0x10, 0xfe, + 0x00, 0x28, 0x03, 0xd0, 0xc4, 0x48, 0xc0, 0x69, + 0x00, 0x28, 0xf4, 0xd0, 0x3c, 0x00, 0xf8, 0x43, + 0x00, 0x00, 0x04, 0x98, 0x05, 0x28, 0x03, 0xd0, + 0xc1, 0x48, 0x00, 0x6a, 0x00, 0x28, 0x65, 0xd1, + 0xbb, 0x49, 0x48, 0x6a, 0x00, 0x28, 0x23, 0xd0, + 0x01, 0x38, 0x48, 0x62, 0x00, 0xf0, 0x87, 0xff, + 0x00, 0x28, 0x11, 0xd0, 0xbb, 0x48, 0x05, 0x99, + 0x81, 0x42, 0x0d, 0xd2, 0x01, 0xf0, 0x9b, 0xf8, + 0x04, 0x30, 0x0d, 0xf0, 0xee, 0xfc, 0x40, 0x30, + 0xc1, 0x7a, 0x01, 0x29, 0x4e, 0xd0, 0x3c, 0x00, + 0x34, 0x44, 0x00, 0x00, 0x80, 0x7a, 0x00, 0x28, + 0x01, 0xd0, 0x05, 0x28, 0x49, 0xd3, 0x01, 0xf0, + 0xdf, 0xf8, 0x02, 0x28, 0x10, 0xd0, 0x00, 0x2f, + 0x02, 0xd1, 0x06, 0x98, 0x00, 0x28, 0x40, 0xd1, + 0x00, 0x20, 0x08, 0x90, 0x82, 0xe1, 0xaa, 0x48, + 0xa0, 0x38, 0xc0, 0x68, 0x00, 0x28, 0x38, 0xd0, + 0xa8, 0x48, 0x80, 0x69, 0x48, 0x62, 0x34, 0xe0, + 0x0a, 0xa9, 0x03, 0xc9, 0x08, 0x43, 0x45, 0xd0, + 0x3c, 0x00, 0x70, 0x44, 0x00, 0x00, 0xa3, 0x48, + 0x29, 0x78, 0xa0, 0x38, 0x02, 0x29, 0x40, 0xd8, + 0x40, 0x6d, 0x00, 0x28, 0x0a, 0xd0, 0x9f, 0x48, + 0xa2, 0x49, 0x20, 0x38, 0xc0, 0x68, 0x40, 0x18, + 0x0e, 0xf0, 0xc7, 0xfb, 0x00, 0x28, 0x01, 0xd0, + 0x01, 0x21, 0x00, 0xe0, 0x00, 0x21, 0x96, 0x4a, + 0x90, 0x6a, 0x00, 0x28, 0x02, 0xda, 0x64, 0x08, + 0x64, 0x00, 0x2a, 0xe0, 0x00, 0x29, 0x09, 0xd1, + 0x95, 0x4b, 0x3c, 0x00, 0xac, 0x44, 0x00, 0x00, + 0xa0, 0x3b, 0x5b, 0x6d, 0x00, 0x2b, 0x02, 0xd0, + 0x05, 0x28, 0x0d, 0xdb, 0x01, 0xe0, 0x07, 0x28, + 0x0a, 0xdb, 0x01, 0x20, 0xc0, 0x43, 0x90, 0x62, + 0x64, 0x08, 0x8e, 0x49, 0x64, 0x00, 0x00, 0x20, + 0xa0, 0x39, 0x88, 0x65, 0x14, 0xe0, 0xd1, 0xe0, + 0x39, 0x43, 0x11, 0xd1, 0x89, 0x49, 0xa0, 0x39, + 0xcb, 0x6d, 0x00, 0x2b, 0x02, 0xd1, 0x89, 0x6d, + 0x01, 0x29, 0x09, 0xd9, 0x3c, 0x00, 0xe8, 0x44, + 0x00, 0x00, 0x07, 0x9b, 0x00, 0x2b, 0x01, 0xd1, + 0x07, 0x28, 0x01, 0xdb, 0x64, 0x08, 0x64, 0x00, + 0x01, 0x30, 0x90, 0x62, 0xbd, 0xe0, 0x7d, 0x49, + 0x88, 0x69, 0x04, 0x90, 0x00, 0x20, 0x88, 0x61, + 0x0c, 0x98, 0x00, 0x28, 0x2c, 0xd0, 0x07, 0xf0, + 0x66, 0xfc, 0x00, 0x28, 0x02, 0xd0, 0x02, 0x20, + 0x04, 0x43, 0x25, 0xe0, 0x7a, 0x48, 0xc0, 0x6a, + 0x00, 0x28, 0x04, 0xd1, 0x77, 0x48, 0x3c, 0x00, + 0x24, 0x45, 0x00, 0x00, 0xa0, 0x38, 0xc0, 0x68, + 0x00, 0x28, 0x1c, 0xd1, 0x04, 0x98, 0x00, 0x28, + 0x0d, 0xd1, 0x28, 0x78, 0x10, 0x28, 0x02, 0xd3, + 0xe8, 0x78, 0x02, 0x28, 0x02, 0xd9, 0x28, 0x79, + 0x10, 0x28, 0x04, 0xd3, 0x04, 0x24, 0x6b, 0x49, + 0x01, 0x22, 0x8a, 0x61, 0x94, 0xe0, 0x6c, 0x48, + 0xa0, 0x38, 0x40, 0x6d, 0x00, 0x28, 0x71, 0xd0, + 0x05, 0xf0, 0xa2, 0xfd, 0x00, 0x28, 0x6d, 0xd0, + 0x3c, 0x00, 0x60, 0x45, 0x00, 0x00, 0x64, 0x08, + 0x64, 0x00, 0x88, 0xe0, 0xff, 0xf7, 0x5b, 0xfa, + 0x00, 0x28, 0x1a, 0xd0, 0x68, 0x48, 0x00, 0x78, + 0x02, 0x28, 0x01, 0xd1, 0x00, 0x2f, 0x14, 0xd1, + 0x00, 0x20, 0xfe, 0xf7, 0x70, 0xfe, 0x30, 0x1a, + 0x04, 0x90, 0xff, 0xf7, 0x6c, 0xfa, 0x00, 0x28, + 0x07, 0xd0, 0xff, 0xf7, 0x1e, 0xfa, 0x00, 0x28, + 0x03, 0xd0, 0x5d, 0x49, 0x04, 0x98, 0x88, 0x42, + 0x4f, 0xd3, 0x3c, 0x00, 0x9c, 0x45, 0x00, 0x00, + 0x05, 0xf0, 0x6c, 0xfd, 0x00, 0x28, 0x4b, 0xd1, + 0x53, 0x49, 0x08, 0x78, 0x03, 0x28, 0x08, 0xd1, + 0x88, 0x68, 0x01, 0x22, 0xd2, 0x07, 0x30, 0x1a, + 0x90, 0x42, 0x41, 0xd2, 0x01, 0x22, 0x0a, 0x70, + 0x57, 0xe0, 0x54, 0x48, 0x00, 0x78, 0x02, 0x28, + 0x01, 0xd1, 0x00, 0x2f, 0x51, 0xd1, 0x4a, 0x49, + 0x88, 0x68, 0x51, 0x49, 0x80, 0x1b, 0x88, 0x42, + 0x07, 0xd9, 0x01, 0x20, 0x3c, 0x00, 0xd8, 0x45, + 0x00, 0x00, 0xfe, 0xf7, 0x42, 0xfe, 0x7d, 0x21, + 0x09, 0x01, 0x40, 0x18, 0x44, 0x49, 0x88, 0x60, + 0x4a, 0x48, 0x00, 0x78, 0x02, 0x28, 0x04, 0xd1, + 0x07, 0x9b, 0x00, 0x2b, 0x01, 0xd1, 0x01, 0x20, + 0x00, 0xe0, 0x00, 0x20, 0x47, 0x4b, 0x47, 0x49, + 0x58, 0x43, 0x40, 0x18, 0x3c, 0x49, 0x89, 0x68, + 0x89, 0x1b, 0x88, 0x42, 0x30, 0xd9, 0x07, 0x9b, + 0x00, 0x20, 0x03, 0x93, 0x00, 0xf0, 0x3c, 0x00, + 0x14, 0x46, 0x00, 0x00, 0x79, 0xff, 0x02, 0x90, + 0xff, 0xf7, 0xd8, 0xf9, 0x04, 0x90, 0x01, 0xf0, + 0x57, 0xf8, 0x04, 0x99, 0x02, 0x9a, 0x51, 0x43, + 0x48, 0x43, 0x01, 0x90, 0x00, 0xf0, 0xdc, 0xff, + 0x41, 0x1c, 0x01, 0x98, 0x01, 0x22, 0x48, 0x43, + 0x11, 0x1c, 0x00, 0xe0, 0x1b, 0xe0, 0x31, 0x4b, + 0x5b, 0x6a, 0x83, 0x42, 0x00, 0xd3, 0x00, 0x21, + 0x03, 0x9b, 0x01, 0x22, 0x00, 0x2b, 0x00, 0xd0, + 0x3c, 0x00, 0x50, 0x46, 0x00, 0x00, 0x00, 0x22, + 0x2c, 0x4b, 0x51, 0x43, 0x9b, 0x6a, 0x01, 0x22, + 0x83, 0x42, 0x00, 0xd3, 0x00, 0x22, 0x50, 0x00, + 0x08, 0x18, 0x03, 0xd0, 0x23, 0x49, 0x03, 0x20, + 0x08, 0x70, 0x03, 0xe0, 0x09, 0x98, 0xc0, 0x68, + 0x06, 0x28, 0x08, 0xd9, 0x02, 0x24, 0x08, 0x98, + 0x00, 0x28, 0x6e, 0xd0, 0x1d, 0x49, 0x00, 0x20, + 0xc8, 0x61, 0x48, 0x61, 0xa5, 0xe0, 0x1a, 0x49, + 0x48, 0x69, 0x3c, 0x00, 0x8c, 0x46, 0x00, 0x00, + 0x00, 0x28, 0x0a, 0xd1, 0x00, 0x2f, 0x05, 0xd0, + 0x01, 0x22, 0x4a, 0x61, 0xc8, 0x69, 0x80, 0x18, + 0xc8, 0x61, 0x0a, 0xe0, 0x00, 0x20, 0xc8, 0x61, + 0x03, 0xe0, 0x00, 0x2f, 0x05, 0xd1, 0x00, 0x20, + 0x48, 0x61, 0x0d, 0x98, 0x00, 0x28, 0x00, 0xd1, + 0xc8, 0x68, 0x00, 0x20, 0x08, 0x90, 0x08, 0x78, + 0x01, 0x28, 0x2f, 0xd0, 0x02, 0x28, 0x4b, 0xd1, + 0x00, 0x2f, 0x08, 0xd1, 0x3c, 0x00, 0xc8, 0x46, + 0x00, 0x00, 0xe8, 0x78, 0x00, 0x28, 0x02, 0xd1, + 0x28, 0x78, 0x10, 0x28, 0x43, 0xd2, 0x28, 0x79, + 0x10, 0x28, 0x40, 0xd2, 0x48, 0x68, 0x0a, 0x69, + 0x30, 0x1a, 0x90, 0x42, 0x67, 0xd3, 0x01, 0x22, + 0x0a, 0x70, 0x38, 0xe0, 0x00, 0x00, 0xe2, 0x04, + 0x00, 0x00, 0x10, 0x27, 0x00, 0x00, 0x68, 0x7e, + 0x01, 0x00, 0xa0, 0x86, 0x01, 0x00, 0x88, 0x13, + 0x00, 0x00, 0x44, 0x6d, 0x01, 0x00, 0x3c, 0x00, + 0x04, 0x47, 0x00, 0x00, 0xc8, 0x57, 0x01, 0x00, + 0x50, 0xc3, 0x00, 0x00, 0x98, 0x3a, 0x00, 0x00, + 0xc0, 0x57, 0x01, 0x00, 0x40, 0x0d, 0x03, 0x00, + 0xc4, 0x09, 0x00, 0x00, 0xb2, 0x0c, 0x00, 0x00, + 0x00, 0x20, 0x0b, 0x9a, 0x0a, 0x9b, 0xc0, 0x43, + 0x1a, 0x43, 0x37, 0xd0, 0x00, 0x2f, 0x35, 0xd1, + 0x07, 0x9b, 0x00, 0x2b, 0x08, 0xd0, 0x6a, 0x78, + 0x02, 0x2a, 0x2f, 0xd9, 0x2a, 0x78, 0x10, 0x2a, + 0x3c, 0x00, 0x40, 0x47, 0x00, 0x00, 0x2c, 0xd2, + 0x2a, 0x79, 0x10, 0x2a, 0x29, 0xd2, 0x25, 0x4b, + 0x1a, 0x6c, 0x00, 0x2a, 0x06, 0xd0, 0x9a, 0x6a, + 0x9f, 0x6c, 0xba, 0x42, 0x02, 0xd1, 0x1f, 0x20, + 0x1f, 0xe0, 0x2e, 0xe0, 0x20, 0x4b, 0x5a, 0x6c, + 0x00, 0x2a, 0x03, 0xd0, 0x1f, 0x4f, 0xb3, 0x1a, + 0xbb, 0x42, 0x16, 0xd3, 0x1c, 0x4b, 0x00, 0x2a, + 0x05, 0xd0, 0x9a, 0x6a, 0x9f, 0x6c, 0xba, 0x42, + 0x01, 0xd1, 0x3c, 0x00, 0x7c, 0x47, 0x00, 0x00, + 0x0f, 0x20, 0x0d, 0xe0, 0x07, 0x9a, 0x00, 0x2a, + 0x04, 0xd0, 0xea, 0x79, 0x20, 0x2a, 0x01, 0xd1, + 0x00, 0x20, 0x05, 0xe0, 0xea, 0x79, 0x10, 0x2a, + 0x01, 0xd3, 0x03, 0x20, 0x00, 0xe0, 0x9a, 0x6a, + 0x12, 0x4a, 0x12, 0x68, 0x02, 0x40, 0x0b, 0xd1, + 0x01, 0x20, 0x08, 0x90, 0x02, 0x20, 0x08, 0x70, + 0x0f, 0x48, 0x08, 0x61, 0x4e, 0x60, 0x64, 0xe7, + 0xff, 0xe7, 0x01, 0x20, 0x3c, 0x00, 0xb8, 0x47, + 0x00, 0x00, 0x08, 0x90, 0x60, 0xe7, 0x0c, 0x49, + 0x88, 0x6a, 0x00, 0x28, 0x01, 0xda, 0x01, 0x30, + 0x02, 0xe0, 0x00, 0x28, 0x01, 0xdd, 0x00, 0x20, + 0x88, 0x62, 0x00, 0x20, 0x08, 0x62, 0x08, 0x99, + 0x20, 0x04, 0x08, 0x43, 0x0f, 0xb0, 0xf0, 0xbd, + 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x71, 0x02, + 0x00, 0x00, 0x08, 0x20, 0x07, 0x00, 0x53, 0x07, + 0x00, 0x00, 0x68, 0x7e, 0x01, 0x00, 0x3c, 0x00, + 0xf4, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x00, 0x48, 0x70, 0x47, 0x50, 0x7e, 0x01, 0x00, + 0x80, 0xb5, 0x3d, 0xf0, 0x7f, 0xfd, 0x02, 0x49, + 0x01, 0x20, 0x08, 0x70, 0x80, 0xbd, 0x00, 0x00, + 0x3c, 0x7e, 0x01, 0x00, 0xf8, 0xb5, 0x0d, 0x1c, + 0x0e, 0xf0, 0xc8, 0xfa, 0x26, 0x49, 0x04, 0x1c, + 0x88, 0x6a, 0x26, 0x4e, 0x00, 0x28, 0x01, 0xd0, + 0x04, 0x20, 0x03, 0xe0, 0x70, 0x6a, 0x00, 0x28, + 0x3c, 0x00, 0x30, 0x48, 0x00, 0x00, 0x01, 0xd0, + 0x01, 0x38, 0x70, 0x62, 0x00, 0x27, 0x00, 0x2d, + 0x02, 0xd0, 0xb7, 0x61, 0xf7, 0x61, 0x0a, 0xe0, + 0xb0, 0x69, 0x1c, 0x49, 0x01, 0x30, 0xb0, 0x61, + 0x49, 0x6d, 0x00, 0x29, 0x03, 0xd0, 0x03, 0x28, + 0x01, 0xd9, 0x01, 0x20, 0xf0, 0x61, 0xb4, 0x60, + 0xf1, 0x68, 0x00, 0x91, 0x08, 0xf0, 0xf7, 0xfc, + 0xf0, 0x60, 0x00, 0x99, 0x88, 0x42, 0x02, 0xd0, + 0x30, 0x62, 0x3c, 0x00, 0x6c, 0x48, 0x00, 0x00, + 0x34, 0x61, 0x0b, 0xe0, 0x00, 0xf0, 0x90, 0xf8, + 0x00, 0x28, 0x01, 0xd0, 0x11, 0x48, 0x00, 0xe0, + 0x11, 0x48, 0x31, 0x69, 0x61, 0x1a, 0x81, 0x42, + 0x00, 0xd9, 0x37, 0x62, 0x0b, 0x4a, 0x0c, 0x48, + 0xd1, 0x6c, 0x20, 0x30, 0x00, 0x29, 0x01, 0xd0, + 0x0a, 0x21, 0x03, 0xe0, 0x01, 0x7a, 0x00, 0x29, + 0x01, 0xd0, 0xff, 0x31, 0x01, 0x72, 0x00, 0x2d, + 0x03, 0xd1, 0x01, 0x7a, 0x3c, 0x00, 0xa8, 0x48, + 0x00, 0x00, 0x00, 0x29, 0x00, 0xd0, 0x91, 0x6a, + 0x00, 0x7a, 0x00, 0x28, 0x00, 0xd1, 0x17, 0x65, + 0xf8, 0xbd, 0xa4, 0x6c, 0x01, 0x00, 0x3c, 0x7e, + 0x01, 0x00, 0xa6, 0x0e, 0x00, 0x00, 0xa8, 0x61, + 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x06, 0x49, + 0x80, 0xb5, 0x89, 0x68, 0x00, 0x29, 0x07, 0xd0, + 0x05, 0x21, 0x00, 0x28, 0x00, 0xd1, 0x04, 0x21, + 0x08, 0x06, 0x00, 0x0e, 0x03, 0xf0, 0x3c, 0x00, + 0xe4, 0x48, 0x00, 0x00, 0x05, 0xfa, 0x80, 0xbd, + 0x60, 0x6c, 0x01, 0x00, 0x07, 0x48, 0x00, 0x68, + 0x07, 0x49, 0x4a, 0x69, 0x10, 0x40, 0x01, 0xd0, + 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x49, 0x6a, + 0x88, 0x42, 0x01, 0xd1, 0x01, 0x20, 0x70, 0x47, + 0x00, 0x20, 0x70, 0x47, 0x10, 0x00, 0x07, 0x00, + 0xa4, 0x6c, 0x01, 0x00, 0x70, 0xb5, 0x0e, 0xf0, + 0x49, 0xfa, 0x02, 0x1c, 0x00, 0xf0, 0x3a, 0xf8, + 0x3c, 0x00, 0x20, 0x49, 0x00, 0x00, 0x10, 0x49, + 0x00, 0x28, 0x0e, 0xd0, 0x08, 0x1c, 0xa0, 0x31, + 0x0e, 0x78, 0x0e, 0x4b, 0x10, 0x2e, 0x01, 0xd3, + 0x80, 0x6f, 0x03, 0xe0, 0x49, 0x78, 0x10, 0x29, + 0x0e, 0xd3, 0xc0, 0x6f, 0xc0, 0x18, 0x84, 0x1a, + 0x0a, 0xe0, 0x08, 0x1c, 0x80, 0x30, 0x45, 0x69, + 0x08, 0x49, 0x8d, 0x42, 0x01, 0xd9, 0x0c, 0x1c, + 0x05, 0xe0, 0xc0, 0x68, 0x10, 0x1a, 0x2c, 0x1a, + 0x00, 0x2c, 0x3c, 0x00, 0x5c, 0x49, 0x00, 0x00, + 0x00, 0xda, 0x64, 0x19, 0x20, 0x1c, 0x70, 0xbd, + 0xa4, 0x6c, 0x01, 0x00, 0xa6, 0x0e, 0x00, 0x00, + 0x50, 0xc3, 0x00, 0x00, 0x80, 0xb5, 0x05, 0xf0, + 0xb7, 0xfb, 0x00, 0x28, 0x02, 0xd0, 0x07, 0xf0, + 0x1f, 0xff, 0x80, 0xbd, 0x03, 0x48, 0x00, 0x78, + 0x00, 0x28, 0xfa, 0xd0, 0x07, 0xf0, 0x70, 0xfb, + 0x80, 0xbd, 0x00, 0x00, 0x60, 0x6c, 0x01, 0x00, + 0x03, 0x49, 0x01, 0x20, 0x3c, 0x00, 0x98, 0x49, + 0x00, 0x00, 0x49, 0x69, 0x03, 0x29, 0x00, 0xd8, + 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x60, 0x6c, + 0x01, 0x00, 0xb0, 0xb5, 0x0a, 0x4d, 0x00, 0x24, + 0x28, 0x78, 0x01, 0x28, 0x03, 0xd0, 0x05, 0xf0, + 0x6a, 0xfb, 0x04, 0x06, 0x24, 0x0e, 0xfe, 0xf7, + 0xd2, 0xfc, 0x00, 0x02, 0x20, 0x43, 0x02, 0xd1, + 0x68, 0x6a, 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, + 0xb0, 0xbd, 0x00, 0x20, 0xb0, 0xbd, 0x3c, 0x00, + 0xd4, 0x49, 0x00, 0x00, 0x60, 0x6c, 0x01, 0x00, + 0x01, 0x21, 0x01, 0x28, 0x00, 0xd0, 0x00, 0x21, + 0x01, 0x48, 0x41, 0x62, 0x70, 0x47, 0x00, 0x00, + 0x60, 0x6c, 0x01, 0x00, 0x15, 0x48, 0x10, 0xb5, + 0x04, 0x68, 0x15, 0x48, 0x00, 0x6a, 0x00, 0x28, + 0x14, 0xd0, 0xff, 0xf7, 0xcb, 0xff, 0x00, 0x28, + 0x0e, 0xd1, 0x11, 0x48, 0x11, 0x49, 0xc4, 0x30, + 0x40, 0x69, 0x88, 0x42, 0x08, 0xd2, 0xcc, 0x08, + 0x3c, 0x00, 0x10, 0x4a, 0x00, 0x00, 0xa0, 0x42, + 0x05, 0xd3, 0xff, 0xf7, 0x7e, 0xff, 0xa0, 0x42, + 0x01, 0xda, 0x0c, 0x4c, 0x01, 0xe0, 0xff, 0x24, + 0x91, 0x34, 0x7d, 0x20, 0x00, 0x01, 0x84, 0x42, + 0x04, 0xd9, 0x00, 0x22, 0x16, 0x21, 0x83, 0x20, + 0x0e, 0xf0, 0xbd, 0xfe, 0x01, 0x23, 0x09, 0x22, + 0x21, 0x1c, 0x16, 0x20, 0x0e, 0xf0, 0xa7, 0xfe, + 0x10, 0xbd, 0xb0, 0x57, 0x01, 0x00, 0x60, 0x6c, + 0x01, 0x00, 0x3c, 0x00, 0x4c, 0x4a, 0x00, 0x00, + 0xc0, 0x5d, 0x00, 0x00, 0x10, 0x27, 0x00, 0x00, + 0x70, 0xb5, 0x05, 0x1c, 0x0e, 0x1c, 0x00, 0xf0, + 0x43, 0xf8, 0x00, 0x28, 0x0f, 0xd0, 0x08, 0x4c, + 0x20, 0x78, 0xc0, 0x07, 0x03, 0xd4, 0x05, 0xf0, + 0xab, 0xf9, 0x09, 0xf0, 0x31, 0xfe, 0x00, 0x2d, + 0x05, 0xd0, 0x20, 0x78, 0x80, 0x07, 0x02, 0xd4, + 0x30, 0x1c, 0x02, 0xf0, 0xfd, 0xfe, 0x70, 0xbd, + 0x60, 0x6c, 0x01, 0x00, 0x3c, 0x00, 0x88, 0x4a, + 0x00, 0x00, 0xb0, 0xb5, 0x00, 0x28, 0x18, 0xd0, + 0x11, 0x48, 0x81, 0x42, 0x15, 0xd2, 0x10, 0x48, + 0x0c, 0x1c, 0x0d, 0x18, 0x07, 0xf0, 0xdf, 0xfa, + 0x81, 0x00, 0x09, 0x18, 0xa1, 0x42, 0x01, 0xd2, + 0x40, 0x00, 0x03, 0xe0, 0x41, 0x00, 0x09, 0x18, + 0xa1, 0x42, 0x01, 0xd2, 0x24, 0x1a, 0x06, 0xe0, + 0x41, 0x00, 0xa1, 0x42, 0x03, 0xd2, 0x40, 0x08, + 0xf8, 0xe7, 0x06, 0x4d, 0x07, 0x4c, 0x3c, 0x00, + 0xc4, 0x4a, 0x00, 0x00, 0x0e, 0xf0, 0x72, 0xf9, + 0x00, 0x19, 0x29, 0x1c, 0x07, 0xf0, 0xdc, 0xfa, + 0xb0, 0xbd, 0x00, 0x00, 0x80, 0xb9, 0x2a, 0x00, + 0x53, 0x07, 0x00, 0x00, 0x4c, 0x1d, 0x00, 0x00, + 0x88, 0x13, 0x00, 0x00, 0xb0, 0xb5, 0x05, 0xf0, + 0xfd, 0xfa, 0x00, 0x28, 0x13, 0xd1, 0xfe, 0xf7, + 0xb5, 0xfe, 0x0a, 0x4c, 0x0a, 0x4d, 0x00, 0x28, + 0x60, 0x63, 0x00, 0xd0, 0x28, 0x60, 0x0e, 0xf0, + 0x3c, 0x00, 0x00, 0x4b, 0x00, 0x00, 0x55, 0xf9, + 0x21, 0x6a, 0x00, 0x29, 0x04, 0xd1, 0xe1, 0x69, + 0x40, 0x1a, 0x29, 0x68, 0x88, 0x42, 0x01, 0xd9, + 0x01, 0x20, 0xb0, 0xbd, 0x00, 0x20, 0xb0, 0xbd, + 0x00, 0x00, 0x60, 0x6c, 0x01, 0x00, 0xb0, 0x57, + 0x01, 0x00, 0x80, 0xb5, 0xff, 0xf7, 0xdd, 0xff, + 0x00, 0x28, 0x05, 0xd0, 0x05, 0xf0, 0xb7, 0xfa, + 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, 0x80, 0xbd, + 0x00, 0x20, 0x3c, 0x00, 0x3c, 0x4b, 0x00, 0x00, + 0x80, 0xbd, 0x00, 0x00, 0x10, 0xb5, 0x0a, 0x4c, + 0x00, 0x21, 0xa2, 0x68, 0x00, 0x2a, 0x03, 0xd0, + 0xa1, 0x60, 0x02, 0xf0, 0x83, 0xf9, 0x10, 0xbd, + 0x61, 0x60, 0x01, 0x1c, 0x00, 0x22, 0x04, 0x20, + 0x0e, 0xf0, 0x36, 0xfd, 0x03, 0x48, 0x21, 0x68, + 0x0a, 0xf0, 0x08, 0xfc, 0x10, 0xbd, 0x00, 0x00, + 0xbc, 0x74, 0x01, 0x00, 0xc4, 0x60, 0x01, 0x00, + 0x70, 0xb5, 0x05, 0x1c, 0x3c, 0x00, 0x78, 0x4b, + 0x00, 0x00, 0x01, 0xd1, 0xfc, 0xf7, 0xc1, 0xfb, + 0x20, 0x4c, 0xe0, 0x6a, 0x00, 0x28, 0x15, 0xd0, + 0x1f, 0x4b, 0xa0, 0x69, 0x58, 0x43, 0xc6, 0x0b, + 0x20, 0x88, 0x46, 0x43, 0xf0, 0x00, 0x80, 0x19, + 0xe6, 0x60, 0xfb, 0xf7, 0x1c, 0xfe, 0xa8, 0x42, + 0x05, 0xd8, 0x30, 0x1c, 0xfb, 0xf7, 0x17, 0xfe, + 0x80, 0x19, 0xa8, 0x42, 0x02, 0xd2, 0x00, 0x20, + 0xe0, 0x60, 0x20, 0xe0, 0xe5, 0x60, 0x3c, 0x00, + 0xb4, 0x4b, 0x00, 0x00, 0x00, 0x2d, 0x1d, 0xd0, + 0x26, 0x88, 0xa0, 0x69, 0x70, 0x43, 0xc1, 0x03, + 0x28, 0x1c, 0xfb, 0xf7, 0xa5, 0xfd, 0x60, 0x61, + 0x0d, 0x48, 0x32, 0x1c, 0x29, 0x1c, 0x30, 0x30, + 0xfb, 0xf7, 0x0a, 0xfc, 0x0c, 0x4b, 0x60, 0x69, + 0x58, 0x43, 0xc0, 0x0b, 0x60, 0x62, 0x01, 0xf0, + 0xb7, 0xfd, 0xa0, 0x62, 0xe0, 0x68, 0x00, 0x28, + 0x04, 0xd0, 0x20, 0x69, 0xa1, 0x68, 0xfb, 0xf7, + 0x3c, 0x00, 0xf0, 0x4b, 0x00, 0x00, 0xf4, 0xfb, + 0x70, 0xbd, 0x05, 0x48, 0xa1, 0x68, 0xfb, 0xf7, + 0xef, 0xfb, 0x70, 0xbd, 0x00, 0x00, 0xc8, 0x74, + 0x01, 0x00, 0x40, 0x42, 0x0f, 0x00, 0xc0, 0xc6, + 0x2d, 0x00, 0x88, 0x13, 0x00, 0x00, 0xf1, 0xb5, + 0x3e, 0x48, 0x00, 0xab, 0x81, 0x78, 0xc0, 0x78, + 0x3e, 0x4f, 0x0a, 0x07, 0x04, 0x07, 0x58, 0x78, + 0x3b, 0x49, 0x12, 0x0f, 0x08, 0x5c, 0x14, 0x39, + 0x24, 0x0f, 0x3c, 0x00, 0x2c, 0x4c, 0x00, 0x00, + 0x80, 0x18, 0x78, 0x60, 0x01, 0x30, 0xb8, 0x60, + 0x18, 0x78, 0x35, 0x4d, 0x08, 0x5c, 0x00, 0x19, + 0xb8, 0x61, 0x01, 0x30, 0xf8, 0x61, 0xeb, 0x78, + 0x33, 0x48, 0x1e, 0x09, 0x33, 0x4b, 0x18, 0x38, + 0x81, 0x78, 0x5e, 0x43, 0xab, 0x78, 0x1d, 0x09, + 0xc8, 0x23, 0x6b, 0x43, 0x00, 0x29, 0x08, 0xd1, + 0x2b, 0x4d, 0x2d, 0x78, 0x3d, 0x60, 0xc5, 0x60, + 0x7d, 0x25, 0xed, 0x00, 0x3c, 0x00, 0x68, 0x4c, + 0x00, 0x00, 0x5d, 0x1b, 0x2c, 0x4b, 0x07, 0xe0, + 0x27, 0x4d, 0x6d, 0x78, 0x3d, 0x60, 0xc5, 0x60, + 0x4b, 0x25, 0x2d, 0x01, 0x5d, 0x1b, 0x28, 0x4b, + 0xf6, 0x18, 0x02, 0x20, 0x00, 0xf0, 0x57, 0xf8, + 0x28, 0x1a, 0xf8, 0x60, 0x22, 0x48, 0x22, 0x1c, + 0x18, 0x38, 0x81, 0x78, 0x03, 0x20, 0x00, 0xf0, + 0x4e, 0xf8, 0x30, 0x1a, 0x38, 0x62, 0x39, 0x68, + 0x00, 0xab, 0x79, 0x61, 0x5a, 0x78, 0x3c, 0x00, + 0xa4, 0x4c, 0x00, 0x00, 0x56, 0x23, 0xf9, 0x68, + 0x5a, 0x43, 0x89, 0x1a, 0xf9, 0x60, 0xc8, 0x31, + 0x39, 0x61, 0x18, 0x49, 0x18, 0x39, 0x89, 0x78, + 0x00, 0x29, 0xb9, 0x69, 0x11, 0xd1, 0x00, 0xab, + 0x1a, 0x78, 0x13, 0x4b, 0x14, 0x3b, 0x9a, 0x5c, + 0x53, 0x1c, 0x59, 0x43, 0x0a, 0x23, 0x59, 0x43, + 0x14, 0x4b, 0x59, 0x1a, 0x51, 0x43, 0x0a, 0x23, + 0x59, 0x43, 0x40, 0x1a, 0x38, 0x62, 0x12, 0x49, + 0x3c, 0x00, 0xe0, 0x4c, 0x00, 0x00, 0x10, 0xe0, + 0x00, 0xab, 0x1a, 0x78, 0x0a, 0x4b, 0x14, 0x3b, + 0x9a, 0x5c, 0x53, 0x1c, 0x59, 0x43, 0x0a, 0x23, + 0x59, 0x43, 0x0d, 0x4b, 0x59, 0x1a, 0x51, 0x43, + 0x0a, 0x23, 0x59, 0x43, 0x40, 0x1a, 0x0b, 0x49, + 0x38, 0x62, 0x40, 0x18, 0x78, 0x62, 0xf8, 0xbd, + 0x00, 0x00, 0x0c, 0x5a, 0x01, 0x00, 0x66, 0x5a, + 0x01, 0x00, 0x94, 0x78, 0x01, 0x00, 0xa0, 0x86, + 0x01, 0x00, 0x3c, 0x00, 0x1c, 0x4d, 0x00, 0x00, + 0x00, 0x48, 0x71, 0x00, 0xb0, 0xd6, 0x8c, 0x00, + 0x88, 0x10, 0x00, 0x00, 0x80, 0x38, 0x01, 0x00, + 0x58, 0x12, 0x00, 0x00, 0x70, 0x11, 0x01, 0x00, + 0x30, 0xb5, 0x19, 0x4b, 0x02, 0x28, 0xdd, 0x68, + 0x06, 0xd1, 0x00, 0x29, 0x04, 0xd1, 0x2b, 0x1c, + 0x0c, 0x33, 0x9c, 0x1a, 0x64, 0x23, 0x5c, 0x43, + 0x02, 0x28, 0x09, 0xd1, 0x01, 0x29, 0x07, 0xd1, + 0x64, 0x23, 0x7d, 0x24, 0x3c, 0x00, 0x58, 0x4d, + 0x00, 0x00, 0xe4, 0x00, 0x6b, 0x43, 0x1c, 0x19, + 0xa0, 0x23, 0x53, 0x43, 0xe4, 0x1a, 0x0a, 0x23, + 0x5a, 0x43, 0x03, 0x28, 0x09, 0xd1, 0x00, 0x29, + 0x07, 0xd1, 0x13, 0x23, 0xff, 0x24, 0xe4, 0x00, + 0x6b, 0x43, 0x1b, 0x19, 0x9b, 0x1a, 0x1c, 0x1c, + 0x5c, 0x43, 0x03, 0x28, 0x08, 0xd1, 0x01, 0x29, + 0x06, 0xd1, 0x0e, 0x20, 0x05, 0x49, 0x68, 0x43, + 0x40, 0x18, 0x80, 0x1a, 0x04, 0x1c, 0x3c, 0x00, + 0x94, 0x4d, 0x00, 0x00, 0x44, 0x43, 0x20, 0x1c, + 0x30, 0xbd, 0x00, 0x00, 0x7c, 0x78, 0x01, 0x00, + 0x84, 0x08, 0x00, 0x00, 0x10, 0xb5, 0x07, 0x4c, + 0x0c, 0x23, 0x60, 0x78, 0x05, 0x49, 0x14, 0x31, + 0x58, 0x43, 0x40, 0x18, 0x40, 0x68, 0x01, 0xf0, + 0x4f, 0xfc, 0x00, 0x21, 0x60, 0x78, 0x02, 0xf0, + 0x4b, 0xff, 0x10, 0xbd, 0x4c, 0x7b, 0x01, 0x00, + 0x0c, 0x48, 0xf8, 0xb5, 0x40, 0x78, 0x0c, 0x23, + 0x3c, 0x00, 0xd0, 0x4d, 0x00, 0x00, 0x0a, 0x49, + 0x58, 0x43, 0x14, 0x31, 0x44, 0x18, 0x26, 0x1d, + 0x60, 0xce, 0x30, 0x1c, 0x0b, 0xf0, 0x0b, 0xfd, + 0x00, 0x27, 0x41, 0x20, 0x47, 0x55, 0x05, 0x48, + 0x29, 0x1c, 0x02, 0xf0, 0xf0, 0xfe, 0x28, 0x1c, + 0x01, 0xf0, 0x31, 0xfc, 0x04, 0x34, 0xc0, 0xc4, + 0xf8, 0xbd, 0x4c, 0x7b, 0x01, 0x00, 0x55, 0x80, + 0x00, 0x00, 0xb0, 0xb5, 0x0a, 0x4d, 0x4c, 0x21, + 0x28, 0x78, 0x3c, 0x00, 0x0c, 0x4e, 0x00, 0x00, + 0x09, 0x4a, 0x41, 0x43, 0x8c, 0x18, 0x22, 0x68, + 0x01, 0x21, 0xfb, 0xf7, 0xe1, 0xfa, 0x28, 0x78, + 0x01, 0xf0, 0xfa, 0xfb, 0x3c, 0x23, 0xe0, 0x56, + 0x41, 0x1e, 0x01, 0x20, 0x07, 0xf0, 0x34, 0xfb, + 0xb0, 0xbd, 0x00, 0x00, 0x3c, 0x7c, 0x01, 0x00, + 0x58, 0xe3, 0x01, 0x00, 0x0c, 0x23, 0x07, 0x49, + 0x58, 0x43, 0x40, 0x18, 0x80, 0xb5, 0x40, 0x68, + 0x41, 0x6b, 0x00, 0x29, 0x3c, 0x00, 0x48, 0x4e, + 0x00, 0x00, 0x02, 0xd0, 0x0b, 0xf0, 0xfb, 0xfd, + 0x80, 0xbd, 0x0b, 0xf0, 0x2c, 0xfd, 0x80, 0xbd, + 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, 0x38, 0x22, + 0x0a, 0x4b, 0x42, 0x43, 0xd2, 0x18, 0x00, 0x29, + 0x80, 0xb5, 0x04, 0xd0, 0x02, 0x29, 0x07, 0xd1, + 0x0b, 0xf0, 0xfb, 0xfc, 0x80, 0xbd, 0xd2, 0x6a, + 0x01, 0x21, 0xfb, 0xf7, 0xb0, 0xfa, 0x80, 0xbd, + 0x03, 0x21, 0x86, 0x20, 0xfc, 0xf7, 0x3c, 0x00, + 0x84, 0x4e, 0x00, 0x00, 0x0f, 0xfa, 0x80, 0xbd, + 0xd4, 0xe4, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x06, + 0x24, 0x0e, 0x0c, 0x20, 0x0e, 0x49, 0x60, 0x43, + 0x40, 0x18, 0x45, 0x68, 0xa8, 0x6b, 0x00, 0x28, + 0x03, 0xd1, 0x00, 0x21, 0x20, 0x1c, 0xfd, 0xf7, + 0xe1, 0xfa, 0x20, 0x1c, 0x07, 0xf0, 0xf2, 0xff, + 0x00, 0x28, 0x08, 0xd0, 0x28, 0x1c, 0x60, 0x30, + 0xc1, 0x79, 0x01, 0x29, 0x03, 0xd9, 0xff, 0x31, + 0x3c, 0x00, 0xc0, 0x4e, 0x00, 0x00, 0xc1, 0x71, + 0xff, 0x31, 0x81, 0x71, 0x01, 0x21, 0x20, 0x1c, + 0x02, 0xf0, 0xc5, 0xfe, 0xb0, 0xbd, 0x60, 0x7b, + 0x01, 0x00, 0x70, 0xb5, 0x00, 0x06, 0x00, 0x0e, + 0x05, 0x1c, 0x4c, 0x23, 0x0a, 0x49, 0x58, 0x43, + 0x44, 0x18, 0x3c, 0x20, 0x00, 0x5d, 0xff, 0x30, + 0x06, 0x06, 0x36, 0x16, 0x28, 0x1c, 0x01, 0xf0, + 0x90, 0xfb, 0x00, 0x21, 0x28, 0x1c, 0x22, 0x68, + 0xfb, 0xf7, 0x3c, 0x00, 0xfc, 0x4e, 0x00, 0x00, + 0x6f, 0xfa, 0x31, 0x1c, 0x00, 0x20, 0x07, 0xf0, + 0xc7, 0xfa, 0x70, 0xbd, 0x58, 0xe3, 0x01, 0x00, + 0x0c, 0x22, 0x0f, 0x4b, 0x42, 0x43, 0xd2, 0x18, + 0x10, 0xb5, 0x54, 0x68, 0x00, 0x29, 0x0d, 0xd0, + 0x02, 0x29, 0x0f, 0xd1, 0x2c, 0x20, 0x00, 0x5d, + 0x00, 0x28, 0x03, 0xd0, 0x07, 0x21, 0x0c, 0x20, + 0xfc, 0xf7, 0xba, 0xf9, 0x20, 0x1c, 0x0b, 0xf0, + 0xbb, 0xfc, 0x10, 0xbd, 0x3c, 0x00, 0x38, 0x4f, + 0x00, 0x00, 0x00, 0x21, 0x02, 0xf0, 0x8d, 0xfe, + 0x10, 0xbd, 0x04, 0x21, 0x0c, 0x20, 0xfc, 0xf7, + 0xae, 0xf9, 0x10, 0xbd, 0x00, 0x00, 0x60, 0x7b, + 0x01, 0x00, 0x80, 0xb5, 0x00, 0x29, 0x07, 0xd0, + 0x0c, 0x23, 0x05, 0x49, 0x58, 0x43, 0x40, 0x18, + 0x40, 0x68, 0x0b, 0xf0, 0x4a, 0xfc, 0x80, 0xbd, + 0x01, 0x21, 0x02, 0xf0, 0x76, 0xfe, 0x80, 0xbd, + 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, 0x3c, 0x00, + 0x74, 0x4f, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x1c, + 0x00, 0x29, 0x05, 0xd0, 0x02, 0x29, 0x1a, 0xd1, + 0x20, 0x1c, 0x0b, 0xf0, 0xeb, 0xfc, 0x10, 0xbd, + 0x0d, 0x48, 0x04, 0x70, 0x0d, 0x48, 0x07, 0xf0, + 0x07, 0xf9, 0x0d, 0x48, 0x01, 0x88, 0x01, 0x22, + 0x12, 0x03, 0x11, 0x43, 0x01, 0x80, 0x4c, 0x20, + 0x0a, 0x49, 0x60, 0x43, 0x40, 0x18, 0x40, 0x30, + 0x00, 0x78, 0xfd, 0xf7, 0x5d, 0xfd, 0x20, 0x1c, + 0x3c, 0x00, 0xb0, 0x4f, 0x00, 0x00, 0x0a, 0xf0, + 0xd4, 0xf8, 0x10, 0xbd, 0x03, 0x21, 0x86, 0x20, + 0xfc, 0xf7, 0x73, 0xf9, 0x10, 0xbd, 0x3c, 0x7c, + 0x01, 0x00, 0x05, 0x4e, 0x00, 0x00, 0x32, 0x80, + 0x07, 0x00, 0x58, 0xe3, 0x01, 0x00, 0xff, 0xb5, + 0x05, 0x1c, 0x01, 0x20, 0x83, 0xb0, 0x01, 0x90, + 0x0c, 0x20, 0x5d, 0x4a, 0x68, 0x43, 0x86, 0x18, + 0x01, 0x27, 0x00, 0x29, 0x74, 0x68, 0x0e, 0xd0, + 0x02, 0x29, 0x3c, 0x00, 0xec, 0x4f, 0x00, 0x00, + 0x6a, 0xd1, 0x2c, 0x20, 0x00, 0x5d, 0x00, 0x28, + 0x03, 0xd0, 0x06, 0x21, 0x0c, 0x20, 0xfc, 0xf7, + 0x53, 0xf9, 0x20, 0x1c, 0x0b, 0xf0, 0x20, 0xfd, + 0x07, 0xb0, 0xf0, 0xbd, 0x52, 0x48, 0x14, 0x38, + 0x45, 0x70, 0xa0, 0x6b, 0x00, 0x28, 0x07, 0xd0, + 0x50, 0x48, 0x07, 0xf0, 0x7f, 0xf8, 0x01, 0x21, + 0x28, 0x1c, 0xfd, 0xf7, 0x25, 0xfa, 0x1c, 0xe0, + 0x4d, 0x48, 0x07, 0xf0, 0x3c, 0x00, 0x28, 0x50, + 0x00, 0x00, 0x77, 0xf8, 0x4a, 0x48, 0x14, 0x38, + 0x05, 0x70, 0x4b, 0x48, 0x01, 0x88, 0x01, 0x22, + 0x52, 0x03, 0x11, 0x43, 0x01, 0x80, 0x40, 0x20, + 0x00, 0x5d, 0xfd, 0xf7, 0x12, 0xfd, 0xb0, 0x68, + 0x00, 0x28, 0x09, 0xd1, 0x28, 0x1c, 0x07, 0xf0, + 0x64, 0xff, 0xb0, 0x60, 0x00, 0x28, 0x03, 0xd1, + 0x09, 0x21, 0x0c, 0x20, 0xfc, 0xf7, 0x23, 0xf9, + 0x05, 0x98, 0x00, 0x28, 0x03, 0xd0, 0x3c, 0x00, + 0x64, 0x50, 0x00, 0x00, 0xe0, 0x6c, 0x01, 0x30, + 0xe0, 0x64, 0x0e, 0xe0, 0x67, 0x20, 0x00, 0x5d, + 0x00, 0x28, 0x07, 0xd1, 0xe0, 0x6c, 0x00, 0x28, + 0x04, 0xd1, 0x39, 0x48, 0x02, 0x38, 0xc0, 0x6a, + 0xa0, 0x64, 0x09, 0xe0, 0x20, 0x6d, 0x00, 0x28, + 0x01, 0xd0, 0x00, 0x27, 0x04, 0xe0, 0x28, 0x1c, + 0x07, 0xf0, 0x00, 0xff, 0x00, 0x28, 0xe5, 0xd1, + 0x05, 0x98, 0x20, 0x65, 0x20, 0x1c, 0x20, 0x30, + 0x3c, 0x00, 0xa0, 0x50, 0x00, 0x00, 0x62, 0x6a, + 0x02, 0x90, 0x81, 0x7b, 0x28, 0x1c, 0x07, 0xf0, + 0x78, 0xff, 0x00, 0x2f, 0x19, 0xd0, 0x20, 0x1c, + 0x60, 0x30, 0xc1, 0x79, 0x4a, 0x1c, 0xc2, 0x71, + 0x80, 0x79, 0x81, 0x42, 0x02, 0xd2, 0x01, 0x20, + 0x01, 0xe0, 0x40, 0xe0, 0x00, 0x20, 0x01, 0x90, + 0x00, 0x28, 0x0a, 0xd0, 0x25, 0x48, 0x00, 0x78, + 0x80, 0x07, 0x06, 0xd5, 0x00, 0xf0, 0x0d, 0xfb, + 0x01, 0x1c, 0x3c, 0x00, 0xdc, 0x50, 0x00, 0x00, + 0x20, 0x1c, 0x0b, 0xf0, 0x15, 0xfd, 0x01, 0x90, + 0x01, 0x98, 0x00, 0x28, 0x0f, 0xd0, 0x02, 0x98, + 0x00, 0x7b, 0x02, 0x28, 0x03, 0xd1, 0x20, 0x1c, + 0x04, 0xf0, 0xd0, 0xfe, 0x84, 0xe7, 0x01, 0x28, + 0x00, 0xd0, 0x7e, 0xe7, 0x21, 0x1c, 0x30, 0x1c, + 0x04, 0xf0, 0xe2, 0xfe, 0x7c, 0xe7, 0x25, 0x1c, + 0x60, 0x35, 0xe8, 0x79, 0xff, 0x30, 0xa8, 0x71, + 0x68, 0x7a, 0x06, 0xf0, 0x3c, 0x00, 0x18, 0x51, + 0x00, 0x00, 0x9d, 0xfc, 0x0d, 0xf0, 0x47, 0xfe, + 0x07, 0x1c, 0x05, 0xf0, 0x12, 0xff, 0x3f, 0x18, + 0x02, 0x98, 0x81, 0x7b, 0x20, 0x69, 0x04, 0x30, + 0x00, 0xf0, 0x35, 0xfa, 0x61, 0x6a, 0x05, 0xf0, + 0xea, 0xfe, 0x39, 0x18, 0x6b, 0x7a, 0x30, 0x88, + 0x80, 0x31, 0x09, 0x4a, 0x0d, 0xf0, 0x91, 0xfe, + 0x5d, 0xe7, 0x03, 0x21, 0x0c, 0x20, 0xfc, 0xf7, + 0xaa, 0xf8, 0x58, 0xe7, 0x00, 0x00, 0x3c, 0x00, + 0x54, 0x51, 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, + 0xa5, 0x4d, 0x00, 0x00, 0xc9, 0x4d, 0x00, 0x00, + 0x32, 0x80, 0x07, 0x00, 0x1d, 0x75, 0x01, 0x00, + 0x8d, 0x4e, 0x00, 0x00, 0xff, 0xb5, 0x81, 0xb0, + 0x1f, 0x1c, 0x05, 0x1c, 0x14, 0x1c, 0x10, 0x1c, + 0x0a, 0x9e, 0x00, 0xf0, 0xf5, 0xfc, 0x29, 0x1c, + 0x10, 0x31, 0x20, 0x1d, 0x06, 0x22, 0xfb, 0xf7, + 0xb7, 0xf9, 0xa8, 0x8e, 0x20, 0x80, 0xe8, 0x8e, + 0x3c, 0x00, 0x90, 0x51, 0x00, 0x00, 0x60, 0x80, + 0x02, 0x99, 0x20, 0x1c, 0x00, 0xf0, 0x07, 0xf9, + 0xff, 0x34, 0x01, 0x34, 0x66, 0x60, 0x27, 0x60, + 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xf8, 0xb5, + 0x0f, 0x1c, 0x1e, 0x1c, 0x05, 0x1c, 0x14, 0x1c, + 0x10, 0x1c, 0x00, 0xf0, 0xd8, 0xfc, 0xa8, 0x88, + 0x39, 0x1c, 0x20, 0x80, 0x28, 0x89, 0x60, 0x80, + 0x20, 0x1c, 0x00, 0xf0, 0xf0, 0xf8, 0xff, 0x34, + 0x01, 0x34, 0x3c, 0x00, 0xcc, 0x51, 0x00, 0x00, + 0x66, 0x60, 0xf8, 0xbd, 0x70, 0xb5, 0x04, 0x1c, + 0xc0, 0x68, 0x05, 0x68, 0x20, 0x1c, 0x14, 0x30, + 0x06, 0x1c, 0x00, 0xf0, 0x0f, 0xfb, 0x00, 0x28, + 0x16, 0xd0, 0x01, 0x22, 0x02, 0x21, 0x20, 0x69, + 0x05, 0xf0, 0xf8, 0xfa, 0x00, 0x28, 0x01, 0xd0, + 0xfb, 0xf7, 0x24, 0xff, 0x00, 0x22, 0x02, 0x21, + 0x20, 0x69, 0x05, 0xf0, 0xef, 0xfa, 0x00, 0x28, + 0x06, 0xd0, 0xfb, 0xf7, 0x3c, 0x00, 0x08, 0x52, + 0x00, 0x00, 0x01, 0xff, 0x00, 0x28, 0x02, 0xd0, + 0x30, 0x1c, 0x0b, 0xf0, 0x7c, 0xfb, 0x68, 0x89, + 0x80, 0x07, 0xc0, 0x0f, 0x03, 0xf0, 0xa7, 0xf8, + 0x18, 0x23, 0x04, 0x49, 0x58, 0x43, 0x40, 0x18, + 0xc1, 0x68, 0x00, 0x29, 0x02, 0xd0, 0x20, 0x1c, + 0xfb, 0xf7, 0xd4, 0xf8, 0x70, 0xbd, 0x94, 0x67, + 0x01, 0x00, 0xf8, 0xb5, 0x04, 0x1c, 0x10, 0x1c, + 0x0d, 0x1c, 0x19, 0x1c, 0xff, 0x22, 0x3c, 0x00, + 0x44, 0x52, 0x00, 0x00, 0x00, 0x27, 0xff, 0x2d, + 0x25, 0xd0, 0x00, 0x29, 0x05, 0xd0, 0x4b, 0x88, + 0x00, 0x2b, 0x02, 0xd0, 0x00, 0xf0, 0x50, 0xfc, + 0x15, 0xe0, 0x00, 0x21, 0x10, 0x4e, 0x4b, 0x00, + 0x9e, 0x19, 0x02, 0x23, 0xf6, 0x5e, 0x86, 0x42, + 0x01, 0xdd, 0x0a, 0x1c, 0x04, 0xe0, 0x01, 0x31, + 0x09, 0x06, 0x09, 0x0e, 0x26, 0x29, 0xf1, 0xd3, + 0x09, 0x4e, 0x50, 0x00, 0x80, 0x19, 0x4e, 0x23, + 0x3c, 0x00, 0x80, 0x52, 0x00, 0x00, 0xc0, 0x5e, + 0x27, 0x2a, 0x07, 0xd2, 0x06, 0x49, 0x20, 0x39, + 0x49, 0x57, 0x47, 0x31, 0x40, 0x1a, 0x20, 0x60, + 0x01, 0x27, 0x02, 0xe0, 0x7e, 0x20, 0xc0, 0x43, + 0x20, 0x60, 0x38, 0x1c, 0xf8, 0xbd, 0xfa, 0x47, + 0x01, 0x00, 0xb0, 0xb5, 0x0c, 0x1c, 0x7e, 0x21, + 0x05, 0x1c, 0x00, 0x20, 0xc9, 0x43, 0x00, 0x2c, + 0x0f, 0xd0, 0x10, 0x1c, 0x05, 0xf0, 0x6b, 0xfd, + 0x00, 0x28, 0x3c, 0x00, 0xbc, 0x52, 0x00, 0x00, + 0x02, 0xd0, 0x21, 0x1c, 0xc9, 0x39, 0x01, 0xe0, + 0x21, 0x1c, 0x86, 0x39, 0x02, 0x20, 0xc0, 0x43, + 0xfb, 0xf7, 0xb4, 0xf9, 0x01, 0x1c, 0x01, 0x20, + 0x29, 0x60, 0xb0, 0xbd, 0x98, 0xb5, 0x14, 0x1c, + 0x00, 0x22, 0x00, 0x92, 0x22, 0x1c, 0xfd, 0xf7, + 0x43, 0xfe, 0x98, 0xbd, 0x05, 0x49, 0x80, 0xb5, + 0x08, 0x60, 0x05, 0x49, 0x01, 0x20, 0xc8, 0x61, + 0x01, 0x21, 0x00, 0x20, 0x3c, 0x00, 0xf8, 0x52, + 0x00, 0x00, 0x03, 0xf0, 0x1c, 0xfe, 0x80, 0xbd, + 0x00, 0x00, 0x20, 0x67, 0x01, 0x00, 0xac, 0x7c, + 0x01, 0x00, 0x80, 0xb5, 0x00, 0x21, 0x00, 0x20, + 0x03, 0xf0, 0x11, 0xfe, 0x06, 0xf0, 0x0d, 0xfb, + 0x02, 0x49, 0x00, 0x20, 0x08, 0x60, 0x80, 0xbd, + 0x00, 0x00, 0x20, 0x67, 0x01, 0x00, 0x03, 0x49, + 0x01, 0x20, 0x09, 0x69, 0x00, 0x29, 0x00, 0xd1, + 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, + 0x34, 0x53, 0x00, 0x00, 0x10, 0x67, 0x01, 0x00, + 0x03, 0x48, 0x00, 0x69, 0x00, 0x28, 0x01, 0xd0, + 0x40, 0x69, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, + 0x10, 0x67, 0x01, 0x00, 0x70, 0xb5, 0x16, 0x1c, + 0x0d, 0x1c, 0x04, 0x1c, 0x00, 0x28, 0x01, 0xd0, + 0x01, 0x2c, 0x07, 0xd1, 0x00, 0xf0, 0x36, 0xfa, + 0x00, 0x28, 0x05, 0xd0, 0x13, 0xf0, 0xca, 0xf9, + 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, 0x70, 0xbd, + 0x3c, 0x00, 0x70, 0x53, 0x00, 0x00, 0x01, 0x20, + 0x00, 0x2c, 0x00, 0xd0, 0x00, 0x20, 0x0a, 0x4c, + 0x04, 0x34, 0x61, 0xc4, 0x10, 0x3c, 0x00, 0xf0, + 0x24, 0xfa, 0x00, 0x28, 0x02, 0xd0, 0x00, 0xf0, + 0xc6, 0xf9, 0x01, 0xe0, 0x00, 0xf0, 0xe5, 0xf8, + 0xc0, 0x30, 0xc3, 0x6b, 0x22, 0x1d, 0x07, 0xca, + 0xfb, 0xf7, 0x20, 0xf8, 0x00, 0x20, 0x70, 0xbd, + 0x00, 0x00, 0xd4, 0x67, 0x01, 0x00, 0xf8, 0xb5, + 0x0d, 0x1c, 0x3c, 0x00, 0xac, 0x53, 0x00, 0x00, + 0x00, 0x21, 0x04, 0x1c, 0x28, 0x1c, 0x05, 0xf0, + 0xe3, 0xf9, 0x23, 0x1c, 0xff, 0x33, 0x21, 0x33, + 0xff, 0x27, 0x00, 0x28, 0x05, 0xd0, 0x22, 0x22, + 0x01, 0x1c, 0x18, 0x1c, 0xfb, 0xf7, 0x96, 0xf8, + 0x00, 0xe0, 0x1f, 0x70, 0x03, 0x21, 0x28, 0x1c, + 0x05, 0xf0, 0xd2, 0xf9, 0x26, 0x1c, 0xff, 0x36, + 0x41, 0x36, 0x00, 0x28, 0x05, 0xd0, 0x03, 0x22, + 0x01, 0x1c, 0xb0, 0x1c, 0x3c, 0x00, 0xe8, 0x53, + 0x00, 0x00, 0xfb, 0xf7, 0x86, 0xf8, 0x00, 0xe0, + 0xb7, 0x70, 0x01, 0x21, 0x28, 0x1c, 0x05, 0xf0, + 0xc2, 0xf9, 0x00, 0x28, 0x07, 0xd0, 0x01, 0x1c, + 0x20, 0x1c, 0xff, 0x30, 0x0a, 0x22, 0x46, 0x30, + 0xfb, 0xf7, 0x77, 0xf8, 0x00, 0xe0, 0x77, 0x71, + 0x32, 0x21, 0x28, 0x1c, 0x05, 0xf0, 0xb3, 0xf9, + 0x00, 0x28, 0x07, 0xd0, 0x01, 0x1c, 0x20, 0x1c, + 0xff, 0x30, 0x12, 0x22, 0x50, 0x30, 0x3c, 0x00, + 0x24, 0x54, 0x00, 0x00, 0xfb, 0xf7, 0x68, 0xf8, + 0x00, 0xe0, 0xf7, 0x73, 0x06, 0x21, 0x28, 0x1c, + 0x05, 0xf0, 0xa4, 0xf9, 0x00, 0x28, 0x07, 0xd0, + 0x01, 0x1c, 0x20, 0x1c, 0xff, 0x30, 0x04, 0x22, + 0x63, 0x30, 0xfb, 0xf7, 0x59, 0xf8, 0xf8, 0xbd, + 0xff, 0x34, 0x61, 0x34, 0xa7, 0x70, 0xfa, 0xe7, + 0x08, 0x49, 0x80, 0xb5, 0x09, 0x68, 0x00, 0x28, + 0x01, 0xd1, 0x07, 0x48, 0x01, 0x68, 0x08, 0x1c, + 0x3c, 0x00, 0x60, 0x54, 0x00, 0x00, 0x05, 0xd1, + 0x03, 0x21, 0x90, 0x20, 0xfb, 0xf7, 0x1d, 0xff, + 0x00, 0x20, 0x80, 0xbd, 0x01, 0xf0, 0xd7, 0xfb, + 0x80, 0xbd, 0x1c, 0x67, 0x01, 0x00, 0x20, 0x67, + 0x01, 0x00, 0x80, 0xb5, 0xff, 0xf7, 0xe7, 0xff, + 0x80, 0xbd, 0xf0, 0xb5, 0x00, 0x24, 0x84, 0x46, + 0x00, 0x20, 0x0b, 0xe0, 0x87, 0x40, 0x17, 0x40, + 0x07, 0xd0, 0x14, 0x23, 0x0b, 0x4d, 0x43, 0x43, + 0x5b, 0x19, 0x3c, 0x00, 0x9c, 0x54, 0x00, 0x00, + 0x1b, 0x7c, 0x65, 0x46, 0x2b, 0x55, 0x01, 0x34, + 0x01, 0x30, 0x01, 0x27, 0x3b, 0x1c, 0x0e, 0x28, + 0x00, 0xd3, 0x00, 0x23, 0x0e, 0x88, 0x3d, 0x1c, + 0xa6, 0x42, 0x00, 0xdc, 0x00, 0x25, 0x2b, 0x40, + 0xe7, 0xd1, 0x0c, 0x80, 0xf0, 0xbd, 0x00, 0x00, + 0x74, 0x40, 0x01, 0x00, 0x78, 0xb5, 0x04, 0x1c, + 0x01, 0x20, 0x20, 0x70, 0x08, 0x20, 0x00, 0xab, + 0x0d, 0x1c, 0x18, 0x80, 0x3c, 0x00, 0xd8, 0x54, + 0x00, 0x00, 0x16, 0x1c, 0xa0, 0x1c, 0x69, 0x46, + 0xff, 0xf7, 0xd1, 0xff, 0x00, 0xab, 0x00, 0x22, + 0xd2, 0x43, 0x19, 0x88, 0x82, 0x40, 0x61, 0x70, + 0x32, 0x20, 0x28, 0x70, 0x10, 0x20, 0x18, 0x80, + 0x32, 0x40, 0xa8, 0x1c, 0x69, 0x46, 0xff, 0xf7, + 0xc2, 0xff, 0x00, 0xab, 0x18, 0x88, 0x68, 0x70, + 0x78, 0xbd, 0x80, 0xb5, 0x02, 0xf0, 0x35, 0xff, + 0x00, 0x21, 0x00, 0x28, 0x00, 0xd0, 0x3c, 0x00, + 0x14, 0x55, 0x00, 0x00, 0x01, 0x69, 0x08, 0x1c, + 0x80, 0xbd, 0x00, 0x00, 0x05, 0x49, 0x00, 0x28, + 0x01, 0xd0, 0xc8, 0x68, 0x00, 0xe0, 0x08, 0x69, + 0x00, 0x28, 0x01, 0xd0, 0x04, 0x30, 0x70, 0x47, + 0x00, 0x20, 0x70, 0x47, 0x10, 0x67, 0x01, 0x00, + 0x03, 0x48, 0x00, 0x69, 0x00, 0x28, 0x01, 0xd0, + 0x04, 0x30, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, + 0x10, 0x67, 0x01, 0x00, 0x02, 0x48, 0x00, 0x69, + 0x3c, 0x00, 0x50, 0x55, 0x00, 0x00, 0x00, 0x28, + 0xff, 0xd1, 0x70, 0x47, 0x00, 0x00, 0x10, 0x67, + 0x01, 0x00, 0x10, 0xb5, 0x05, 0x4c, 0x20, 0x69, + 0x00, 0x28, 0x03, 0xd1, 0x04, 0x21, 0x90, 0x20, + 0xfb, 0xf7, 0x9b, 0xfe, 0x20, 0x69, 0x10, 0xbd, + 0x00, 0x00, 0x10, 0x67, 0x01, 0x00, 0x10, 0xb5, + 0x04, 0x1c, 0x00, 0xf0, 0x40, 0xf9, 0x00, 0x28, + 0x01, 0xd0, 0x00, 0x20, 0x10, 0xbd, 0x20, 0x1c, + 0x00, 0xf0, 0x3c, 0x00, 0x8c, 0x55, 0x00, 0x00, + 0x57, 0xf9, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x20, + 0x10, 0xbd, 0x02, 0x20, 0x10, 0xbd, 0x00, 0x00, + 0x70, 0xb5, 0x0f, 0x4e, 0x04, 0x1c, 0x30, 0x68, + 0x0d, 0x1c, 0x00, 0x28, 0x07, 0xd0, 0x21, 0x1c, + 0x04, 0x30, 0x05, 0xf0, 0xc1, 0xfb, 0x00, 0x28, + 0x01, 0xd0, 0x30, 0x68, 0x0b, 0xe0, 0x09, 0x4a, + 0x10, 0x68, 0x00, 0x28, 0x09, 0xd0, 0x21, 0x1c, + 0x14, 0x1c, 0x04, 0x30, 0x3c, 0x00, 0xc8, 0x55, + 0x00, 0x00, 0x05, 0xf0, 0xb4, 0xfb, 0x00, 0x28, + 0x02, 0xd0, 0x20, 0x68, 0x9c, 0x30, 0x00, 0xe0, + 0x03, 0x48, 0x40, 0x5d, 0x70, 0xbd, 0x20, 0x67, + 0x01, 0x00, 0x1c, 0x67, 0x01, 0x00, 0xcc, 0x47, + 0x01, 0x00, 0x04, 0x49, 0x00, 0x20, 0x09, 0x69, + 0x00, 0x29, 0x02, 0xd0, 0xff, 0x31, 0x01, 0x31, + 0x88, 0x69, 0x70, 0x47, 0x00, 0x00, 0x10, 0x67, + 0x01, 0x00, 0x01, 0x48, 0x00, 0x7a, 0x3c, 0x00, + 0x04, 0x56, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, + 0xac, 0x7c, 0x01, 0x00, 0xfe, 0xb5, 0x06, 0x1c, + 0x00, 0x20, 0x1f, 0x1c, 0x14, 0x1c, 0x00, 0x29, + 0x02, 0x90, 0x19, 0xd0, 0x01, 0x29, 0x26, 0xd0, + 0x02, 0x29, 0x47, 0xd1, 0x26, 0x48, 0x00, 0x78, + 0x05, 0xf0, 0xa0, 0xfb, 0xa0, 0x72, 0x0a, 0xf0, + 0x4f, 0xfc, 0x0e, 0x28, 0x09, 0xd1, 0xa0, 0x7a, + 0x05, 0xf0, 0xaa, 0xfb, 0x00, 0x28, 0x04, 0xd0, + 0x3c, 0x00, 0x40, 0x56, 0x00, 0x00, 0x20, 0x48, + 0x00, 0x78, 0x05, 0xf0, 0x92, 0xfb, 0xa0, 0x72, + 0x00, 0x20, 0x20, 0x72, 0x2f, 0xe0, 0x1d, 0x4d, + 0x28, 0x68, 0x00, 0x28, 0x01, 0xd1, 0xfb, 0xf7, + 0x52, 0xfe, 0x00, 0x97, 0x2a, 0x68, 0x23, 0x1c, + 0x18, 0x32, 0x11, 0x1c, 0x30, 0x1c, 0xfc, 0xf7, + 0xde, 0xfb, 0x26, 0xe0, 0x30, 0x1c, 0x0c, 0xf0, + 0xca, 0xfb, 0x05, 0x1c, 0x02, 0xd0, 0xa8, 0x68, + 0x00, 0x28, 0x3c, 0x00, 0x7c, 0x56, 0x00, 0x00, + 0x08, 0xd1, 0x13, 0x48, 0x00, 0x68, 0x00, 0x28, + 0x01, 0xd1, 0xfb, 0xf7, 0x3b, 0xfe, 0x10, 0x48, + 0x00, 0x68, 0x18, 0x30, 0x02, 0x1c, 0x0e, 0x48, + 0x00, 0x97, 0x01, 0x68, 0x23, 0x1c, 0x18, 0x31, + 0x30, 0x1c, 0xfc, 0xf7, 0xc3, 0xfb, 0x00, 0x2d, + 0x0a, 0xd0, 0x40, 0x35, 0x28, 0x88, 0x80, 0x06, + 0x06, 0xd4, 0x00, 0x20, 0x20, 0x60, 0x03, 0xe0, + 0x01, 0x21, 0x90, 0x20, 0x3c, 0x00, 0xb8, 0x56, + 0x00, 0x00, 0xfb, 0xf7, 0xf4, 0xfd, 0x02, 0x98, + 0xfe, 0xbd, 0xb0, 0x69, 0x01, 0x00, 0x90, 0x57, + 0x01, 0x00, 0x20, 0x67, 0x01, 0x00, 0x1c, 0x67, + 0x01, 0x00, 0x80, 0xb5, 0x00, 0x20, 0x02, 0xf0, + 0x4a, 0xfe, 0x18, 0x23, 0x05, 0x4a, 0x58, 0x43, + 0x80, 0x18, 0x40, 0x69, 0x01, 0x21, 0x00, 0x28, + 0x00, 0xd0, 0x41, 0x78, 0x08, 0x1c, 0x80, 0xbd, + 0x00, 0x00, 0x94, 0x67, 0x01, 0x00, 0x3c, 0x00, + 0xf4, 0x56, 0x00, 0x00, 0x02, 0x49, 0x08, 0x69, + 0x00, 0x28, 0x00, 0xd1, 0xc8, 0x68, 0x70, 0x47, + 0x10, 0x67, 0x01, 0x00, 0x03, 0x48, 0xc0, 0x68, + 0x00, 0x28, 0x01, 0xd0, 0x04, 0x30, 0x70, 0x47, + 0x00, 0x20, 0x70, 0x47, 0x10, 0x67, 0x01, 0x00, + 0x10, 0xb5, 0x05, 0x4c, 0xe0, 0x68, 0x00, 0x28, + 0x03, 0xd1, 0x05, 0x21, 0x90, 0x20, 0xfb, 0xf7, + 0xbd, 0xfd, 0xe0, 0x68, 0x10, 0xbd, 0x00, 0x00, + 0x3c, 0x00, 0x30, 0x57, 0x00, 0x00, 0x10, 0x67, + 0x01, 0x00, 0xf8, 0xb5, 0x0d, 0x1c, 0x00, 0x2a, + 0x03, 0xd0, 0x11, 0x49, 0x12, 0x4f, 0x0e, 0x78, + 0x01, 0xe0, 0x11, 0x4f, 0x0c, 0x26, 0x08, 0x2e, + 0x01, 0xd2, 0x34, 0x1c, 0x00, 0xe0, 0x08, 0x24, + 0x01, 0x21, 0x01, 0x70, 0x44, 0x70, 0x39, 0x1c, + 0x22, 0x1c, 0x02, 0x30, 0xfa, 0xf7, 0xcb, 0xfe, + 0x32, 0x1b, 0x00, 0x2a, 0x07, 0xdd, 0x32, 0x20, + 0x28, 0x70, 0x3c, 0x00, 0x6c, 0x57, 0x00, 0x00, + 0x39, 0x19, 0xa8, 0x1c, 0x6a, 0x70, 0xfa, 0xf7, + 0xc1, 0xfe, 0xf8, 0xbd, 0xff, 0x20, 0x28, 0x70, + 0x00, 0x20, 0x68, 0x70, 0xf9, 0xe7, 0x00, 0x00, + 0xa4, 0x69, 0x01, 0x00, 0xb0, 0x69, 0x01, 0x00, + 0x90, 0x57, 0x01, 0x00, 0x01, 0x49, 0x48, 0x62, + 0x70, 0x47, 0x00, 0x00, 0x94, 0x67, 0x01, 0x00, + 0x03, 0x49, 0x80, 0xb5, 0x08, 0x60, 0x01, 0x21, + 0x01, 0x20, 0x03, 0xf0, 0x3c, 0x00, 0xa8, 0x57, + 0x00, 0x00, 0xc5, 0xfb, 0x80, 0xbd, 0x1c, 0x67, + 0x01, 0x00, 0x80, 0xb5, 0x00, 0x21, 0x01, 0x20, + 0x03, 0xf0, 0xbd, 0xfb, 0x06, 0xf0, 0xb9, 0xf8, + 0x02, 0x49, 0x00, 0x20, 0x08, 0x60, 0x80, 0xbd, + 0x00, 0x00, 0x1c, 0x67, 0x01, 0x00, 0x03, 0x49, + 0x01, 0x20, 0xc9, 0x68, 0x00, 0x29, 0x00, 0xd1, + 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x10, 0x67, + 0x01, 0x00, 0x03, 0x48, 0xc0, 0x68, 0x3c, 0x00, + 0xe4, 0x57, 0x00, 0x00, 0x00, 0x28, 0x01, 0xd0, + 0x40, 0x69, 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, + 0x10, 0x67, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, + 0x01, 0x20, 0x03, 0xf0, 0x9b, 0xfb, 0x80, 0xbd, + 0x05, 0x4a, 0x80, 0xb5, 0x12, 0x69, 0x00, 0x21, + 0x00, 0x2a, 0x03, 0xd0, 0x11, 0x1d, 0x05, 0xf0, + 0x91, 0xfa, 0x01, 0x1c, 0x08, 0x1c, 0x80, 0xbd, + 0x10, 0x67, 0x01, 0x00, 0x06, 0x4a, 0x80, 0xb5, + 0x3c, 0x00, 0x20, 0x58, 0x00, 0x00, 0x12, 0x69, + 0x00, 0x21, 0x00, 0x2a, 0x05, 0xd0, 0x11, 0x1c, + 0xff, 0x31, 0x21, 0x31, 0x05, 0xf0, 0x8b, 0xfa, + 0x01, 0x1c, 0x08, 0x1c, 0x80, 0xbd, 0x10, 0x67, + 0x01, 0x00, 0x05, 0x4a, 0x80, 0xb5, 0xd2, 0x68, + 0x00, 0x21, 0x00, 0x2a, 0x03, 0xd0, 0x11, 0x1d, + 0x05, 0xf0, 0x73, 0xfa, 0x01, 0x1c, 0x08, 0x1c, + 0x80, 0xbd, 0x10, 0x67, 0x01, 0x00, 0x06, 0x4a, + 0x80, 0xb5, 0x3c, 0x00, 0x5c, 0x58, 0x00, 0x00, + 0xd2, 0x68, 0x00, 0x21, 0x00, 0x2a, 0x05, 0xd0, + 0x11, 0x1c, 0xff, 0x31, 0x21, 0x31, 0x05, 0xf0, + 0x6d, 0xfa, 0x01, 0x1c, 0x08, 0x1c, 0x80, 0xbd, + 0x10, 0x67, 0x01, 0x00, 0xff, 0xb5, 0x0d, 0x1c, + 0x1f, 0x1c, 0x87, 0xb0, 0x10, 0x9e, 0x00, 0x24, + 0x02, 0xf0, 0x72, 0xfd, 0x18, 0x23, 0x13, 0x49, + 0x58, 0x43, 0x08, 0x58, 0x00, 0x28, 0x19, 0xd0, + 0x04, 0x1c, 0x33, 0x1c, 0x3c, 0x00, 0x98, 0x58, + 0x00, 0x00, 0x3a, 0x1c, 0x28, 0x1c, 0x09, 0x99, + 0xfa, 0xf7, 0x9f, 0xfd, 0x04, 0x1c, 0x14, 0xd0, + 0x18, 0x20, 0x00, 0xab, 0x18, 0x80, 0xaa, 0x68, + 0x01, 0xa8, 0x69, 0x46, 0xff, 0xf7, 0xe7, 0xfd, + 0x6a, 0x46, 0x01, 0xa9, 0x00, 0x20, 0x07, 0xf0, + 0x44, 0xfe, 0x00, 0x28, 0x05, 0xd1, 0x0a, 0x21, + 0x00, 0xe0, 0x0f, 0x21, 0x90, 0x20, 0xfb, 0xf7, + 0xea, 0xfc, 0x20, 0x1c, 0x0b, 0xb0, 0x3c, 0x00, + 0xd4, 0x58, 0x00, 0x00, 0xf0, 0xbd, 0x00, 0x00, + 0x94, 0x67, 0x01, 0x00, 0x10, 0xb5, 0x00, 0x24, + 0x02, 0xf0, 0x44, 0xfd, 0x18, 0x23, 0x05, 0x49, + 0x58, 0x43, 0x40, 0x18, 0x80, 0x68, 0x00, 0x28, + 0x02, 0xd0, 0xfa, 0xf7, 0x71, 0xfd, 0x01, 0x24, + 0x20, 0x1c, 0x10, 0xbd, 0x94, 0x67, 0x01, 0x00, + 0x80, 0xb5, 0x02, 0x4b, 0x00, 0xf0, 0x4e, 0xf8, + 0x80, 0xbd, 0x00, 0x00, 0x10, 0x67, 0x01, 0x00, + 0x3c, 0x00, 0x10, 0x59, 0x00, 0x00, 0x80, 0xb5, + 0x02, 0x4b, 0x00, 0xf0, 0x46, 0xf8, 0x80, 0xbd, + 0x00, 0x00, 0x11, 0x67, 0x01, 0x00, 0xf8, 0xb5, + 0x0e, 0x1c, 0x15, 0x1c, 0x00, 0x28, 0x1c, 0x49, + 0x10, 0xd0, 0x48, 0x68, 0x1c, 0x4a, 0x28, 0x80, + 0x00, 0x20, 0x07, 0xe0, 0x0b, 0x18, 0x1c, 0x7a, + 0x14, 0x23, 0x63, 0x43, 0x9b, 0x18, 0x1b, 0x7c, + 0x33, 0x54, 0x01, 0x30, 0x2b, 0x88, 0x83, 0x42, + 0xf4, 0xdc, 0x3c, 0x00, 0x4c, 0x59, 0x00, 0x00, + 0x24, 0xe0, 0x00, 0x20, 0x0f, 0x1c, 0x00, 0x24, + 0x08, 0x60, 0x0f, 0xe0, 0x30, 0x5d, 0x05, 0xf0, + 0x07, 0xfa, 0x0e, 0x28, 0x01, 0xd1, 0x00, 0x20, + 0xf8, 0xbd, 0x39, 0x19, 0x08, 0x72, 0x01, 0x22, + 0x39, 0x68, 0x82, 0x40, 0x11, 0x43, 0x08, 0x1c, + 0x38, 0x60, 0x01, 0x34, 0x28, 0x88, 0xa0, 0x42, + 0xec, 0xdc, 0x28, 0x88, 0x78, 0x60, 0xff, 0xf7, + 0xb7, 0xfe, 0x00, 0x28, 0x3c, 0x00, 0x88, 0x59, + 0x00, 0x00, 0x06, 0xd0, 0x01, 0x69, 0x00, 0x29, + 0x03, 0xd0, 0x7f, 0x21, 0xc9, 0x43, 0x0b, 0xf0, + 0x52, 0xfb, 0x01, 0x20, 0xe3, 0xe7, 0x2c, 0x7d, + 0x01, 0x00, 0x74, 0x40, 0x01, 0x00, 0x10, 0xb5, + 0x1c, 0x1c, 0x00, 0x28, 0x0b, 0xd0, 0x20, 0x78, + 0x0e, 0x28, 0x05, 0xd2, 0x14, 0x23, 0x0c, 0x4a, + 0x58, 0x43, 0x80, 0x18, 0x00, 0x7c, 0x00, 0xe0, + 0x00, 0x20, 0x08, 0x70, 0x0e, 0xe0, 0x3c, 0x00, + 0xc4, 0x59, 0x00, 0x00, 0x08, 0x78, 0x05, 0xf0, + 0xd1, 0xf9, 0x20, 0x70, 0xff, 0xf7, 0x92, 0xfe, + 0x00, 0x28, 0x06, 0xd0, 0x01, 0x69, 0x00, 0x29, + 0x03, 0xd0, 0x7f, 0x21, 0xc9, 0x43, 0x0b, 0xf0, + 0x2d, 0xfb, 0x01, 0x20, 0x10, 0xbd, 0x00, 0x00, + 0x74, 0x40, 0x01, 0x00, 0x80, 0xb5, 0x27, 0x20, + 0xc0, 0x43, 0x09, 0xf0, 0x31, 0xfc, 0x80, 0xbd, + 0x80, 0xb5, 0x27, 0x20, 0xc0, 0x43, 0x09, 0xf0, + 0x3c, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x39, 0xfc, + 0x80, 0xbd, 0x80, 0xb5, 0x28, 0x20, 0x09, 0xf0, + 0x42, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, + 0x28, 0x20, 0x09, 0xf0, 0x4a, 0xfc, 0x80, 0xbd, + 0x00, 0x00, 0xb0, 0xb5, 0x01, 0x28, 0x28, 0xd1, + 0x01, 0x29, 0x01, 0xd0, 0xfb, 0xf7, 0x6b, 0xfc, + 0xff, 0xf7, 0xe9, 0xfd, 0x02, 0x28, 0x1a, 0xd1, + 0x07, 0xf0, 0x13, 0xfc, 0x12, 0x4c, 0x21, 0x69, + 0x88, 0x42, 0x3c, 0x00, 0x3c, 0x5a, 0x00, 0x00, + 0x15, 0xd0, 0x07, 0xf0, 0x0d, 0xfc, 0x20, 0x61, + 0x20, 0x68, 0x7d, 0x24, 0xe4, 0x00, 0x44, 0x43, + 0x0d, 0xf0, 0xae, 0xf9, 0x05, 0x1c, 0x07, 0xf0, + 0x0b, 0xfc, 0x28, 0x1a, 0x84, 0x42, 0x00, 0xd9, + 0x24, 0x1a, 0x01, 0x22, 0x21, 0x1c, 0x0a, 0x20, + 0x0d, 0xf0, 0xb2, 0xfd, 0xb0, 0xbd, 0x00, 0x21, + 0x09, 0x20, 0x0c, 0xf0, 0x75, 0xfc, 0xb0, 0xbd, + 0x07, 0x21, 0x0a, 0x20, 0x3c, 0x00, 0x78, 0x5a, + 0x00, 0x00, 0xfb, 0xf7, 0x14, 0xfc, 0xb0, 0xbd, + 0x00, 0x00, 0xd4, 0x67, 0x01, 0x00, 0x7d, 0x20, + 0x02, 0x49, 0x00, 0x01, 0x08, 0x60, 0x70, 0x47, + 0x00, 0x00, 0xd4, 0x67, 0x01, 0x00, 0x10, 0xb5, + 0x81, 0x6d, 0x04, 0x1c, 0xff, 0x30, 0x46, 0x30, + 0x0c, 0xf0, 0xd1, 0xfc, 0x20, 0x1c, 0xff, 0x30, + 0x50, 0x30, 0xa1, 0x6d, 0x0c, 0xf0, 0xcb, 0xfc, + 0x10, 0xbd, 0xb0, 0xb5, 0x04, 0x1c, 0x3c, 0x00, + 0xb4, 0x5a, 0x00, 0x00, 0x0d, 0x1c, 0x02, 0xf0, + 0x59, 0xfc, 0x20, 0x1c, 0x02, 0xf0, 0x56, 0xfc, + 0x18, 0x23, 0x04, 0x49, 0x58, 0x43, 0x40, 0x18, + 0x18, 0x22, 0x29, 0x1c, 0xfa, 0xf7, 0x70, 0xfd, + 0xb0, 0xbd, 0x00, 0x00, 0x94, 0x67, 0x01, 0x00, + 0x10, 0xb5, 0x04, 0x1c, 0x09, 0xf0, 0xbc, 0xfb, + 0x20, 0x1c, 0x09, 0xf0, 0xc7, 0xfb, 0x10, 0xbd, + 0x10, 0xb5, 0x04, 0x1c, 0x09, 0xf0, 0xd0, 0xfb, + 0x3c, 0x00, 0xf0, 0x5a, 0x00, 0x00, 0x20, 0x1c, + 0x09, 0xf0, 0xdb, 0xfb, 0x10, 0xbd, 0x70, 0xb5, + 0x0c, 0x78, 0x06, 0x1c, 0x48, 0x88, 0x4d, 0x78, + 0xe2, 0x00, 0x80, 0x1a, 0xe9, 0x00, 0x40, 0x1a, + 0x01, 0x1c, 0x41, 0x43, 0x12, 0x31, 0x24, 0x20, + 0xfa, 0xf7, 0x91, 0xfd, 0x21, 0x1c, 0x61, 0x43, + 0xc9, 0x00, 0x40, 0x18, 0x29, 0x1c, 0x69, 0x43, + 0xc9, 0x00, 0x42, 0x18, 0x0c, 0x49, 0x88, 0x79, + 0x0c, 0x4b, 0x3c, 0x00, 0x2c, 0x5b, 0x00, 0x00, + 0x53, 0x43, 0x0c, 0x4a, 0x13, 0x60, 0x53, 0x7b, + 0x34, 0x02, 0x14, 0x60, 0x52, 0x7b, 0x88, 0x71, + 0x01, 0x33, 0x58, 0x10, 0x08, 0x4b, 0x80, 0x1a, + 0x01, 0x21, 0x49, 0x02, 0x58, 0x43, 0x00, 0x28, + 0x00, 0xda, 0x49, 0x42, 0x08, 0x18, 0x80, 0x12, + 0x21, 0x38, 0x70, 0xbd, 0x20, 0x10, 0x07, 0x00, + 0xec, 0x04, 0x00, 0x00, 0x00, 0xa0, 0x07, 0x00, + 0x03, 0x03, 0x00, 0x00, 0x3c, 0x00, 0x68, 0x5b, + 0x00, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x06, 0x21, + 0x04, 0x30, 0xfa, 0xf7, 0x70, 0xfc, 0xff, 0x20, + 0x21, 0x30, 0xff, 0x21, 0x01, 0x55, 0x20, 0x1c, + 0xff, 0x30, 0x41, 0x30, 0x81, 0x70, 0x41, 0x71, + 0xc1, 0x73, 0xff, 0x20, 0x63, 0x30, 0x01, 0x55, + 0x00, 0x20, 0x20, 0x61, 0x60, 0x61, 0xff, 0x34, + 0x01, 0x34, 0xa0, 0x60, 0xe0, 0x60, 0x10, 0xbd, + 0x00, 0x00, 0x70, 0xb5, 0x06, 0x1c, 0x3c, 0x00, + 0xa4, 0x5b, 0x00, 0x00, 0x08, 0x1c, 0x58, 0x60, + 0x9a, 0x60, 0x1c, 0x1c, 0x1e, 0x60, 0x15, 0x1c, + 0x9b, 0x8a, 0xe2, 0x8a, 0x31, 0x1c, 0x02, 0xf0, + 0xa1, 0xfc, 0x28, 0x1a, 0xe0, 0x60, 0x70, 0xbd, + 0x70, 0xb5, 0x04, 0x1c, 0x08, 0x1c, 0x11, 0x1c, + 0x1e, 0x1c, 0x00, 0x25, 0xeb, 0x43, 0x22, 0x1c, + 0x18, 0x32, 0x0b, 0xf0, 0xf7, 0xfb, 0x22, 0x1c, + 0xff, 0x32, 0x50, 0x32, 0x11, 0x1c, 0x0a, 0x39, + 0x3c, 0x00, 0xe0, 0x5b, 0x00, 0x00, 0x01, 0x23, + 0x20, 0x1c, 0x00, 0xf0, 0xc6, 0xf8, 0x0c, 0x28, + 0x10, 0xd0, 0x01, 0x25, 0x20, 0x1c, 0x0b, 0xf0, + 0xac, 0xfa, 0x20, 0x1c, 0x00, 0xf0, 0x19, 0xf8, + 0x20, 0x1c, 0x00, 0xf0, 0x0a, 0xf8, 0x20, 0x1c, + 0x00, 0xf0, 0x29, 0xf8, 0x31, 0x1c, 0x20, 0x1c, + 0x0b, 0xf0, 0x17, 0xfa, 0x28, 0x1c, 0x70, 0xbd, + 0x00, 0x00, 0xff, 0x21, 0x1d, 0x31, 0x09, 0x58, + 0x80, 0x30, 0x3c, 0x00, 0x1c, 0x5c, 0x00, 0x00, + 0x89, 0x07, 0x00, 0x29, 0x01, 0xda, 0x01, 0x21, + 0x00, 0xe0, 0x00, 0x21, 0xc1, 0x62, 0x70, 0x47, + 0x01, 0x1c, 0x80, 0x31, 0x00, 0x22, 0x0a, 0x63, + 0x07, 0x4a, 0x12, 0x68, 0x00, 0x2a, 0x09, 0xd0, + 0x42, 0x88, 0x92, 0x06, 0x06, 0xd5, 0xff, 0x30, + 0x01, 0x30, 0xc0, 0x69, 0x40, 0x07, 0x01, 0xd4, + 0x01, 0x20, 0x08, 0x63, 0x70, 0x47, 0x00, 0x00, + 0xac, 0x69, 0x01, 0x00, 0x3c, 0x00, 0x58, 0x5c, + 0x00, 0x00, 0x80, 0xb5, 0x01, 0x1c, 0x4a, 0x88, + 0x00, 0x20, 0x52, 0x05, 0x05, 0xd5, 0xff, 0x31, + 0x01, 0x31, 0xc9, 0x69, 0x49, 0x07, 0x00, 0xd4, + 0x01, 0x20, 0x06, 0xf0, 0xec, 0xfb, 0x80, 0xbd, + 0x00, 0x00, 0xf8, 0xb5, 0x05, 0x1c, 0x98, 0x68, + 0x17, 0x1c, 0x0e, 0x1c, 0x1c, 0x1c, 0x00, 0x28, + 0x02, 0xd1, 0x20, 0x1c, 0x0c, 0xf0, 0x31, 0xf8, + 0xab, 0x69, 0x39, 0x1c, 0x30, 0x1c, 0x3c, 0x00, + 0x94, 0x5c, 0x00, 0x00, 0xa2, 0x68, 0x0b, 0xf0, + 0x95, 0xfb, 0xf8, 0xbd, 0xf8, 0xb5, 0x16, 0x1c, + 0x0d, 0x1c, 0x1f, 0x1c, 0x00, 0x24, 0x02, 0xf0, + 0x61, 0xfb, 0x18, 0x23, 0x06, 0x49, 0x58, 0x43, + 0x40, 0x18, 0x43, 0x68, 0x00, 0x2b, 0x05, 0xd0, + 0x3a, 0x1c, 0x31, 0x1c, 0x28, 0x1c, 0xfa, 0xf7, + 0x8e, 0xfb, 0x01, 0x24, 0x20, 0x1c, 0xf8, 0xbd, + 0x94, 0x67, 0x01, 0x00, 0x80, 0xb5, 0x07, 0xf0, + 0x3c, 0x00, 0xd0, 0x5c, 0x00, 0x00, 0xc5, 0xfa, + 0x09, 0x49, 0x08, 0x61, 0x08, 0x68, 0x00, 0x28, + 0x02, 0xd1, 0x7d, 0x20, 0x00, 0x01, 0x08, 0x60, + 0x08, 0x68, 0x7d, 0x21, 0xc9, 0x00, 0x41, 0x43, + 0x00, 0x23, 0x01, 0x22, 0x0a, 0x20, 0x0d, 0xf0, + 0x4e, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0xd4, 0x67, + 0x01, 0x00, 0x80, 0xb5, 0x01, 0x21, 0x0a, 0x20, + 0x0d, 0xf0, 0x97, 0xfc, 0x80, 0xbd, 0xf8, 0xb5, + 0x0e, 0x1c, 0x3c, 0x00, 0x0c, 0x5d, 0x00, 0x00, + 0x51, 0x68, 0x14, 0x1c, 0x12, 0x68, 0xa5, 0x68, + 0x0b, 0x1c, 0x75, 0x1b, 0x57, 0x19, 0x97, 0x42, + 0x00, 0xd2, 0x01, 0x31, 0x42, 0x68, 0x00, 0x25, + 0x8a, 0x42, 0x02, 0xdd, 0x01, 0x25, 0x62, 0x60, + 0x05, 0xe0, 0x9a, 0x42, 0x03, 0xd1, 0x01, 0x68, + 0xb9, 0x42, 0x00, 0xd9, 0x01, 0x25, 0x00, 0x2d, + 0x09, 0xd0, 0x01, 0x68, 0x21, 0x60, 0xa6, 0x60, + 0xa3, 0x8a, 0xe2, 0x8a, 0x3c, 0x00, 0x48, 0x5d, + 0x00, 0x00, 0x60, 0x68, 0x02, 0xf0, 0xd7, 0xfb, + 0x30, 0x1a, 0xe0, 0x60, 0x28, 0x1c, 0xf8, 0xbd, + 0x00, 0x00, 0x80, 0xb5, 0x02, 0xf0, 0x07, 0xfb, + 0x18, 0x23, 0x03, 0x49, 0x58, 0x43, 0x40, 0x18, + 0x18, 0x21, 0xfa, 0xf7, 0x98, 0xfb, 0x80, 0xbd, + 0x00, 0x00, 0x94, 0x67, 0x01, 0x00, 0xfe, 0xb5, + 0x04, 0x1c, 0x08, 0x1c, 0x11, 0x1c, 0x1e, 0x1c, + 0x0c, 0x25, 0x01, 0x22, 0x00, 0x92, 0x3c, 0x00, + 0x84, 0x5d, 0x00, 0x00, 0xa2, 0x69, 0x02, 0xab, + 0xfd, 0xf7, 0xf0, 0xf8, 0x00, 0x28, 0x45, 0xd0, + 0x02, 0x98, 0x27, 0x21, 0x02, 0x1c, 0x0a, 0x40, + 0x01, 0xd1, 0x08, 0x43, 0x02, 0x90, 0x21, 0x49, + 0xa0, 0x69, 0x08, 0x40, 0x06, 0xd0, 0x02, 0x98, + 0x01, 0x40, 0x03, 0xd1, 0x49, 0x21, 0xc9, 0x00, + 0x08, 0x43, 0x02, 0x90, 0xa0, 0x6d, 0x02, 0x99, + 0x88, 0x42, 0x30, 0xd0, 0x00, 0x2e, 0x2d, 0xd0, + 0x3c, 0x00, 0xc0, 0x5d, 0x00, 0x00, 0x40, 0x21, + 0x20, 0x1c, 0x58, 0x30, 0xfa, 0xf7, 0x69, 0xfb, + 0x02, 0x98, 0x00, 0x25, 0x00, 0x26, 0x37, 0x1c, + 0xa0, 0x65, 0x19, 0xe0, 0xc0, 0x07, 0x11, 0xd5, + 0xf0, 0x19, 0x00, 0x19, 0x70, 0x30, 0x05, 0x71, + 0x28, 0x1c, 0x04, 0xf0, 0xd4, 0xff, 0x00, 0x28, + 0x04, 0xd0, 0xa0, 0x19, 0x80, 0x30, 0x05, 0x72, + 0x01, 0x36, 0x03, 0xe0, 0xe0, 0x19, 0x60, 0x30, + 0x05, 0x70, 0x3c, 0x00, 0xfc, 0x5d, 0x00, 0x00, + 0x01, 0x37, 0x01, 0x35, 0x2d, 0x06, 0x02, 0x98, + 0x2d, 0x0e, 0x40, 0x08, 0x02, 0x90, 0x02, 0x98, + 0x00, 0x28, 0xe2, 0xd1, 0x84, 0x20, 0x06, 0x51, + 0xf0, 0x19, 0x20, 0x67, 0xe7, 0x65, 0x00, 0x25, + 0x00, 0xe0, 0x0b, 0x25, 0x28, 0x1c, 0xfe, 0xbd, + 0xd8, 0x3a, 0x00, 0x00, 0x38, 0xb5, 0x05, 0x1c, + 0x08, 0x1c, 0x11, 0x1c, 0x00, 0x24, 0xe2, 0x43, + 0x6b, 0x46, 0xff, 0xf7, 0x3c, 0x00, 0x38, 0x5e, + 0x00, 0x00, 0x4f, 0xfa, 0x00, 0x28, 0x05, 0xd0, + 0xa8, 0x69, 0x00, 0x99, 0x01, 0x40, 0x81, 0x42, + 0x00, 0xd1, 0x01, 0x24, 0x20, 0x1c, 0x38, 0xbd, + 0x00, 0x00, 0x7c, 0xb5, 0x05, 0x6a, 0x86, 0x69, + 0x04, 0x1c, 0xc0, 0x68, 0xfb, 0xf7, 0xb7, 0xfb, + 0xe1, 0x69, 0xfb, 0xf7, 0xda, 0xfa, 0x20, 0x1c, + 0xe2, 0x69, 0x40, 0x30, 0xc1, 0x8b, 0x12, 0x89, + 0x89, 0x18, 0xc1, 0x83, 0x06, 0x49, 0x3c, 0x00, + 0x74, 0x5e, 0x00, 0x00, 0x01, 0x94, 0x00, 0x91, + 0x28, 0x69, 0x33, 0x1c, 0x82, 0x88, 0x01, 0x68, + 0xe0, 0x68, 0xc0, 0x68, 0x00, 0xf0, 0xf2, 0xf9, + 0x7c, 0xbd, 0x00, 0x00, 0x91, 0x5e, 0x00, 0x00, + 0xb0, 0xb5, 0xd1, 0x68, 0x55, 0x69, 0xc8, 0x68, + 0x14, 0x1c, 0x14, 0x4b, 0x0c, 0xe0, 0x02, 0x68, + 0x9a, 0x42, 0x07, 0xd1, 0xc2, 0x68, 0xca, 0x60, + 0x00, 0x21, 0xc1, 0x60, 0x01, 0x60, 0xfb, 0xf7, + 0x3c, 0x00, 0xb0, 0x5e, 0x00, 0x00, 0x73, 0xfb, + 0x03, 0xe0, 0x01, 0x1c, 0xc0, 0x68, 0x00, 0x28, + 0xf0, 0xd1, 0xe0, 0x68, 0xc0, 0x68, 0xe8, 0x60, + 0xe0, 0x68, 0xc5, 0x60, 0x20, 0x1c, 0x40, 0x30, + 0xc1, 0x8b, 0x2a, 0x89, 0x89, 0x18, 0xc1, 0x83, + 0x20, 0x68, 0x00, 0x28, 0x02, 0xd0, 0xff, 0xf7, + 0xba, 0xff, 0xb0, 0xbd, 0x04, 0x48, 0x04, 0xf0, + 0x4e, 0xf9, 0x00, 0x6a, 0x07, 0xf0, 0x77, 0xfa, + 0xb0, 0xbd, 0x3c, 0x00, 0xec, 0x5e, 0x00, 0x00, + 0xa0, 0x7e, 0x01, 0x00, 0xa0, 0x6a, 0x01, 0x00, + 0xf1, 0xb5, 0x82, 0xb0, 0x02, 0x98, 0x06, 0x69, + 0x01, 0x1c, 0x08, 0x36, 0x60, 0x31, 0x45, 0x68, + 0x01, 0x91, 0x82, 0xe0, 0x10, 0x21, 0x00, 0x20, + 0x2f, 0x69, 0xfb, 0xf7, 0x63, 0xfb, 0x68, 0x61, + 0x01, 0x89, 0x08, 0x39, 0x09, 0x04, 0x09, 0x0c, + 0x01, 0x81, 0x68, 0x69, 0x00, 0x68, 0x40, 0x18, + 0x08, 0x21, 0xfb, 0xf7, 0x3c, 0x00, 0x28, 0x5f, + 0x00, 0x00, 0x57, 0xfb, 0xe8, 0x61, 0x68, 0x69, + 0x71, 0x88, 0x00, 0x68, 0x20, 0x22, 0x01, 0x80, + 0x71, 0x68, 0x41, 0x60, 0x01, 0x99, 0x49, 0x7b, + 0x89, 0x01, 0x11, 0x43, 0xc1, 0x70, 0x00, 0x21, + 0x81, 0x70, 0x28, 0x20, 0xfb, 0xf7, 0x75, 0xfc, + 0x39, 0x88, 0x04, 0x1c, 0xc1, 0x81, 0xa8, 0x6b, + 0x00, 0x28, 0x03, 0xd1, 0x01, 0x20, 0x80, 0x02, + 0x08, 0x43, 0xe0, 0x81, 0x06, 0x22, 0x3c, 0x00, + 0x64, 0x5f, 0x00, 0x00, 0x39, 0x1d, 0x20, 0x1c, + 0x10, 0x30, 0xfa, 0xf7, 0xc5, 0xfa, 0x39, 0x1c, + 0x0a, 0x31, 0x06, 0x22, 0x20, 0x1c, 0x16, 0x30, + 0x00, 0x90, 0xfa, 0xf7, 0xbd, 0xfa, 0x39, 0x1c, + 0x10, 0x31, 0x06, 0x22, 0x20, 0x1c, 0x1c, 0x30, + 0xfa, 0xf7, 0xb6, 0xfa, 0xe1, 0x89, 0x25, 0x4a, + 0x5c, 0x20, 0x11, 0x40, 0x01, 0x22, 0x92, 0x03, + 0x11, 0x43, 0x40, 0x5b, 0xe1, 0x81, 0x0f, 0x21, + 0x3c, 0x00, 0xa0, 0x5f, 0x00, 0x00, 0x08, 0x40, + 0x60, 0x84, 0x20, 0x1c, 0x20, 0x30, 0x16, 0x21, + 0x81, 0x71, 0x00, 0x21, 0x21, 0x70, 0xe9, 0x6b, + 0x00, 0x29, 0x07, 0xd0, 0x29, 0x69, 0x09, 0x8b, + 0x09, 0x07, 0x09, 0x0f, 0x21, 0x70, 0xa1, 0x84, + 0x18, 0x21, 0x81, 0x71, 0x06, 0x22, 0x60, 0x1c, + 0x00, 0x99, 0xfa, 0xf7, 0x94, 0xfa, 0x70, 0x68, + 0x00, 0x0e, 0xe0, 0x71, 0x70, 0x68, 0x00, 0x02, + 0x00, 0x0e, 0x3c, 0x00, 0xdc, 0x5f, 0x00, 0x00, + 0x20, 0x72, 0x70, 0x68, 0x00, 0x04, 0x00, 0x0e, + 0x60, 0x72, 0x70, 0x68, 0xa0, 0x72, 0x70, 0x88, + 0x00, 0x0a, 0xe0, 0x72, 0x70, 0x88, 0x20, 0x73, + 0x70, 0x88, 0x01, 0x30, 0x00, 0x04, 0x00, 0x0c, + 0x70, 0x80, 0x02, 0xd1, 0x70, 0x68, 0x01, 0x30, + 0x70, 0x60, 0xac, 0x61, 0x02, 0x98, 0x28, 0x62, + 0x2d, 0x68, 0x00, 0x2d, 0x00, 0xd0, 0x79, 0xe7, + 0x02, 0x98, 0x04, 0x49, 0x3c, 0x00, 0x18, 0x60, + 0x00, 0x00, 0x42, 0x68, 0x04, 0x48, 0x04, 0xf0, + 0x74, 0xf8, 0xfe, 0xbd, 0x00, 0x00, 0x8f, 0xc7, + 0xff, 0xff, 0x3d, 0xda, 0x00, 0x00, 0xa0, 0x6a, + 0x01, 0x00, 0xb0, 0xb5, 0x07, 0x4d, 0x28, 0x78, + 0x03, 0x28, 0x08, 0xd0, 0x00, 0x24, 0x2c, 0x70, + 0x69, 0x68, 0x00, 0x29, 0x03, 0xd0, 0x01, 0x20, + 0xfa, 0xf7, 0xc8, 0xf9, 0x6c, 0x60, 0xb0, 0xbd, + 0x00, 0x00, 0x9c, 0x73, 0x01, 0x00, 0x3c, 0x00, + 0x54, 0x60, 0x00, 0x00, 0xf8, 0xb5, 0x2b, 0x4b, + 0xd8, 0x6a, 0x00, 0x28, 0x50, 0xd0, 0x2a, 0x48, + 0x01, 0x1c, 0xff, 0x31, 0x01, 0x31, 0xca, 0x68, + 0x01, 0x32, 0xca, 0x60, 0x1a, 0x6c, 0x00, 0x2a, + 0x02, 0xd1, 0x4a, 0x69, 0x01, 0x32, 0x4a, 0x61, + 0x0a, 0x69, 0x01, 0x32, 0x0a, 0x61, 0xda, 0x68, + 0x00, 0x2a, 0x04, 0xd0, 0x1f, 0x4a, 0x01, 0x32, + 0x12, 0x78, 0x00, 0x2a, 0x02, 0xd1, 0x8a, 0x69, + 0x3c, 0x00, 0x90, 0x60, 0x00, 0x00, 0x01, 0x32, + 0x8a, 0x61, 0x00, 0x25, 0x07, 0x1d, 0x18, 0x26, + 0x1a, 0x4a, 0x6e, 0x43, 0x74, 0x32, 0x90, 0x59, + 0x00, 0x28, 0x29, 0xd0, 0xb4, 0x18, 0x60, 0x69, + 0x00, 0x28, 0x25, 0xd1, 0x60, 0x68, 0x00, 0x28, + 0x02, 0xd0, 0x01, 0x68, 0x00, 0x29, 0x05, 0xd1, + 0xa1, 0x68, 0x00, 0x29, 0x1c, 0xd0, 0x09, 0x68, + 0x00, 0x29, 0x19, 0xd0, 0x00, 0x28, 0x05, 0xd0, + 0xe1, 0x68, 0x3c, 0x00, 0xcc, 0x60, 0x00, 0x00, + 0x01, 0x31, 0xe1, 0x60, 0x00, 0x68, 0x81, 0x42, + 0x11, 0xd3, 0xa0, 0x68, 0x00, 0x28, 0x06, 0xd0, + 0x21, 0x69, 0x00, 0x68, 0x08, 0x18, 0x0c, 0xf0, + 0xa3, 0xfd, 0x00, 0x28, 0x07, 0xd0, 0x06, 0x4a, + 0x01, 0x20, 0x60, 0x61, 0x74, 0x32, 0x91, 0x59, + 0x38, 0x1c, 0xfa, 0xf7, 0x70, 0xf9, 0x01, 0x35, + 0x02, 0x2d, 0xcb, 0xdb, 0xf8, 0xbd, 0x00, 0x00, + 0x44, 0x7d, 0x01, 0x00, 0x3c, 0x00, 0x08, 0x61, + 0x00, 0x00, 0xf4, 0x67, 0x01, 0x00, 0xf8, 0xb5, + 0x0f, 0x1c, 0x00, 0x25, 0x04, 0x1c, 0x00, 0x28, + 0x25, 0xd0, 0x20, 0x1c, 0x04, 0xf0, 0x03, 0xfe, + 0x00, 0x28, 0x06, 0xd0, 0xff, 0xf7, 0xff, 0xf8, + 0x04, 0x1c, 0xff, 0xf7, 0x50, 0xfb, 0x06, 0x1c, + 0x07, 0xe0, 0x20, 0x1c, 0xff, 0xf7, 0x91, 0xfb, + 0x06, 0x1c, 0x20, 0x1c, 0xff, 0xf7, 0x6f, 0xfb, + 0x04, 0x1c, 0x00, 0x2e, 0x06, 0xd0, 0x3c, 0x00, + 0x44, 0x61, 0x00, 0x00, 0xff, 0xf7, 0x4c, 0xfb, + 0x00, 0x28, 0x02, 0xd0, 0x01, 0x25, 0x01, 0x20, + 0x07, 0xe0, 0x00, 0x2c, 0x06, 0xd0, 0xff, 0xf7, + 0xef, 0xf8, 0x00, 0x28, 0x02, 0xd0, 0x01, 0x25, + 0x00, 0x20, 0x38, 0x60, 0x28, 0x1c, 0xf8, 0xbd, + 0xb0, 0xb5, 0xc5, 0x68, 0x04, 0x1c, 0x0d, 0xf0, + 0x8f, 0xfc, 0x20, 0x7e, 0xc1, 0x07, 0x08, 0xd5, + 0xe1, 0x68, 0xa9, 0x42, 0x05, 0xd9, 0x22, 0x69, + 0x3c, 0x00, 0x80, 0x61, 0x00, 0x00, 0x91, 0x42, + 0x02, 0xd3, 0xe1, 0x8a, 0x01, 0x31, 0xe1, 0x82, + 0x81, 0x07, 0x08, 0xd5, 0xe1, 0x68, 0xa9, 0x42, + 0x05, 0xd2, 0x22, 0x69, 0x91, 0x42, 0x02, 0xd8, + 0xe1, 0x8a, 0x01, 0x31, 0xe1, 0x82, 0x40, 0x07, + 0x06, 0xd5, 0xe0, 0x68, 0x21, 0x69, 0x88, 0x42, + 0x02, 0xd1, 0xe0, 0x8a, 0x01, 0x30, 0xe0, 0x82, + 0xe0, 0x8a, 0xa1, 0x8a, 0x88, 0x42, 0x0d, 0xd3, + 0x60, 0x7e, 0x3c, 0x00, 0xbc, 0x61, 0x00, 0x00, + 0x02, 0x28, 0x0b, 0xd0, 0x20, 0x68, 0xe1, 0x68, + 0x04, 0x22, 0x07, 0xf0, 0x65, 0xfb, 0x60, 0x7e, + 0x00, 0x28, 0x03, 0xd1, 0x20, 0x68, 0x08, 0xf0, + 0xab, 0xff, 0xb0, 0xbd, 0x00, 0x20, 0xe0, 0x82, + 0xb0, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x06, 0x1c, + 0x0c, 0x23, 0x20, 0x49, 0x58, 0x43, 0x45, 0x18, + 0x00, 0x20, 0xa8, 0x60, 0x30, 0x1c, 0x06, 0xf0, + 0x91, 0xfe, 0x04, 0x1c, 0x3c, 0x00, 0xf8, 0x61, + 0x00, 0x00, 0x68, 0x60, 0x33, 0xd0, 0x01, 0x20, + 0xa8, 0x70, 0x2c, 0x20, 0x00, 0x5d, 0x02, 0x28, + 0x03, 0xd1, 0x20, 0x1c, 0x03, 0xf0, 0x45, 0xfe, + 0x10, 0xe0, 0x61, 0x6b, 0x00, 0x29, 0x0a, 0xd0, + 0x01, 0x28, 0x04, 0xd1, 0x21, 0x1c, 0x28, 0x1c, + 0x03, 0xf0, 0x55, 0xfe, 0x06, 0xe0, 0x20, 0x1c, + 0x0a, 0xf0, 0x0d, 0xfc, 0x02, 0xe0, 0x20, 0x1c, + 0x0a, 0xf0, 0x3d, 0xfb, 0x0d, 0x48, 0x3c, 0x00, + 0x34, 0x62, 0x00, 0x00, 0x14, 0x38, 0x41, 0x68, + 0x00, 0x29, 0x10, 0xd0, 0x20, 0x1c, 0x40, 0x30, + 0x02, 0x8b, 0x12, 0x07, 0x92, 0x0f, 0x01, 0x2a, + 0x09, 0xd0, 0x80, 0x8b, 0x32, 0x02, 0x00, 0x09, + 0x00, 0x04, 0x10, 0x43, 0x81, 0x22, 0x02, 0x43, + 0x0c, 0x20, 0x0d, 0xf0, 0xb7, 0xf9, 0x0c, 0xf0, + 0xa5, 0xfd, 0x60, 0x64, 0x70, 0xbd, 0x00, 0x00, + 0x60, 0x7b, 0x01, 0x00, 0xff, 0xb5, 0x08, 0x1c, + 0x3c, 0x00, 0x70, 0x62, 0x00, 0x00, 0x11, 0x1c, + 0x0c, 0x32, 0x20, 0x24, 0x14, 0x43, 0x0c, 0x4a, + 0x83, 0xb0, 0x0c, 0xae, 0x52, 0x68, 0x60, 0xce, + 0x94, 0x70, 0x00, 0x24, 0xd4, 0x70, 0x93, 0x63, + 0x0d, 0x23, 0x40, 0x27, 0xbb, 0x52, 0x94, 0x61, + 0x14, 0x84, 0x01, 0x22, 0x02, 0x92, 0x32, 0x1c, + 0x00, 0x90, 0x01, 0x91, 0x23, 0x1c, 0x29, 0x1c, + 0x03, 0x98, 0x00, 0xf0, 0x66, 0xf9, 0x07, 0xb0, + 0xf0, 0xbd, 0x3c, 0x00, 0xac, 0x62, 0x00, 0x00, + 0xa0, 0x7e, 0x01, 0x00, 0xf8, 0xb5, 0x04, 0x1c, + 0x00, 0x27, 0x11, 0x4e, 0x1d, 0xe0, 0xe0, 0x68, + 0x00, 0x28, 0x70, 0x68, 0x0c, 0xd1, 0x80, 0x88, + 0x00, 0x07, 0x0d, 0xd1, 0x01, 0x21, 0x0c, 0x48, + 0xfb, 0xf7, 0x84, 0xf9, 0xc4, 0x60, 0xe8, 0x60, + 0x70, 0x68, 0x81, 0x88, 0x01, 0x31, 0x02, 0xe0, + 0x81, 0x88, 0x22, 0x89, 0x89, 0x18, 0x81, 0x80, + 0xe0, 0x68, 0x39, 0x1c, 0x3c, 0x00, 0xe8, 0x62, + 0x00, 0x00, 0x00, 0x28, 0x01, 0xd1, 0x71, 0x68, + 0xc9, 0x6d, 0x25, 0x1c, 0x61, 0x60, 0x04, 0x1c, + 0x00, 0x2c, 0xdf, 0xd1, 0xf8, 0xbd, 0xa0, 0x7e, + 0x01, 0x00, 0x06, 0x49, 0x10, 0xb5, 0x49, 0x68, + 0x00, 0x23, 0x05, 0xe0, 0x8a, 0x88, 0x04, 0x89, + 0x12, 0x19, 0x8a, 0x80, 0x43, 0x60, 0xc0, 0x68, + 0x00, 0x28, 0xf7, 0xd1, 0x10, 0xbd, 0xa0, 0x7e, + 0x01, 0x00, 0x10, 0xb5, 0x09, 0x49, 0x3c, 0x00, + 0x24, 0x63, 0x00, 0x00, 0x00, 0x24, 0x49, 0x68, + 0x0a, 0xe0, 0x8a, 0x88, 0x03, 0x89, 0xd2, 0x18, + 0x8a, 0x80, 0xc3, 0x68, 0x22, 0x1c, 0x00, 0x2b, + 0x00, 0xd1, 0xca, 0x6d, 0x42, 0x60, 0x18, 0x1c, + 0x00, 0x28, 0xf2, 0xd1, 0x10, 0xbd, 0x00, 0x00, + 0xa0, 0x7e, 0x01, 0x00, 0x01, 0x1c, 0x13, 0x48, + 0x10, 0xb5, 0x40, 0x68, 0x00, 0x23, 0x09, 0xe0, + 0x82, 0x88, 0x0c, 0x89, 0x12, 0x19, 0x82, 0x80, + 0x3c, 0x00, 0x60, 0x63, 0x00, 0x00, 0x4b, 0x60, + 0xca, 0x68, 0x00, 0x2a, 0x00, 0xd1, 0x41, 0x66, + 0xc9, 0x68, 0x00, 0x29, 0xf3, 0xd1, 0x01, 0x1c, + 0x68, 0x31, 0x81, 0x64, 0xc3, 0x64, 0x43, 0x65, + 0x82, 0x88, 0x08, 0x23, 0x11, 0x1c, 0x08, 0x31, + 0x89, 0x07, 0x89, 0x0f, 0x59, 0x1a, 0x50, 0x23, + 0x19, 0x52, 0x51, 0x18, 0x81, 0x80, 0x01, 0x1c, + 0x40, 0x6e, 0x48, 0x31, 0xc1, 0x60, 0x10, 0xbd, + 0x00, 0x00, 0x3c, 0x00, 0x9c, 0x63, 0x00, 0x00, + 0xa0, 0x7e, 0x01, 0x00, 0x10, 0xb5, 0x07, 0x49, + 0x00, 0x24, 0x4b, 0x68, 0x06, 0xe0, 0xc2, 0x68, + 0x21, 0x1c, 0x00, 0x2a, 0x00, 0xd1, 0xd9, 0x6d, + 0x41, 0x60, 0x10, 0x1c, 0x00, 0x28, 0xf6, 0xd1, + 0x10, 0xbd, 0x00, 0x00, 0xa0, 0x7e, 0x01, 0x00, + 0x70, 0x47, 0x00, 0x00, 0xfe, 0xb5, 0x06, 0x1c, + 0x0c, 0x48, 0x0c, 0x1c, 0x40, 0x68, 0x80, 0x21, + 0x81, 0x70, 0x00, 0x21, 0x3c, 0x00, 0xd8, 0x63, + 0x00, 0x00, 0xc1, 0x70, 0x15, 0x1c, 0x40, 0x22, + 0x81, 0x63, 0x11, 0x52, 0x81, 0x61, 0x01, 0x84, + 0x00, 0x20, 0x04, 0x22, 0x02, 0x92, 0x00, 0x90, + 0x01, 0x91, 0x29, 0x1c, 0x20, 0x1c, 0x1a, 0x1c, + 0x33, 0x1c, 0x00, 0xf0, 0xbc, 0xf8, 0xfe, 0xbd, + 0x00, 0x00, 0xa0, 0x7e, 0x01, 0x00, 0x70, 0xb5, + 0x06, 0x1c, 0x17, 0x48, 0x80, 0x78, 0x02, 0x21, + 0x16, 0x4a, 0x88, 0x43, 0x90, 0x70, 0x3c, 0x00, + 0x14, 0x64, 0x00, 0x00, 0x10, 0x1c, 0x80, 0x78, + 0x08, 0x43, 0x11, 0x1c, 0x88, 0x70, 0x13, 0x48, + 0x00, 0x24, 0xc4, 0x70, 0x70, 0x20, 0xfb, 0xf7, + 0xd9, 0xf9, 0x11, 0x4d, 0x70, 0x21, 0x68, 0x60, + 0xfa, 0xf7, 0x34, 0xf8, 0x30, 0x07, 0x00, 0x0f, + 0x69, 0x68, 0x90, 0x30, 0xc8, 0x65, 0x0d, 0x48, + 0x68, 0x22, 0x08, 0x80, 0x08, 0x1c, 0x28, 0x30, + 0x89, 0x60, 0x48, 0x61, 0x08, 0x20, 0x08, 0x82, + 0x3c, 0x00, 0x50, 0x64, 0x00, 0x00, 0x08, 0x1c, + 0x38, 0x30, 0x48, 0x63, 0x20, 0x38, 0x48, 0x64, + 0x5a, 0x20, 0x50, 0x54, 0x06, 0x48, 0x08, 0x31, + 0x41, 0x64, 0x44, 0x65, 0x70, 0xbd, 0x00, 0x00, + 0x07, 0x00, 0x58, 0x00, 0x07, 0x00, 0xa0, 0x7e, + 0x01, 0x00, 0xde, 0xc0, 0x00, 0x00, 0x00, 0x30, + 0x07, 0x00, 0x0a, 0x4b, 0x10, 0xb5, 0x58, 0x6d, + 0x0a, 0x49, 0x00, 0x22, 0x49, 0x68, 0x00, 0x24, + 0x4a, 0x62, 0x3c, 0x00, 0x8c, 0x64, 0x00, 0x00, + 0x5c, 0x65, 0x4b, 0x6e, 0x00, 0x2b, 0x01, 0xd0, + 0xda, 0x60, 0x4a, 0x66, 0x8b, 0x6d, 0x00, 0x2b, + 0x03, 0xd0, 0x0a, 0x6e, 0x00, 0x21, 0xf9, 0xf7, + 0x9c, 0xff, 0x10, 0xbd, 0x00, 0x30, 0x07, 0x00, + 0xa0, 0x7e, 0x01, 0x00, 0x09, 0x49, 0x10, 0xb5, + 0x08, 0x88, 0x01, 0x30, 0x08, 0x80, 0x01, 0x20, + 0x07, 0x49, 0x80, 0x02, 0x08, 0x60, 0x07, 0x4c, + 0xa2, 0x6d, 0x00, 0x2a, 0x3c, 0x00, 0xc8, 0x64, + 0x00, 0x00, 0x05, 0xd0, 0x05, 0x21, 0xd1, 0x20, + 0x0d, 0xf0, 0x6f, 0xf9, 0x01, 0x20, 0xa0, 0x65, + 0x10, 0xbd, 0xb0, 0x74, 0x01, 0x00, 0x00, 0x10, + 0x07, 0x00, 0x00, 0x30, 0x07, 0x00, 0xff, 0xb5, + 0x83, 0xb0, 0x0c, 0xae, 0x86, 0x46, 0x8c, 0x46, + 0x0e, 0x4a, 0x43, 0xce, 0x0f, 0xad, 0x0f, 0x1c, + 0x52, 0x68, 0x0c, 0x37, 0x30, 0xcd, 0x97, 0x70, + 0xd3, 0x70, 0x96, 0x63, 0x0d, 0x26, 0x3c, 0x00, + 0x04, 0x65, 0x00, 0x00, 0x40, 0x27, 0xbe, 0x52, + 0x05, 0x9e, 0x96, 0x61, 0x13, 0x84, 0x00, 0x22, + 0x02, 0x92, 0x2a, 0x1c, 0x00, 0x90, 0x01, 0x91, + 0x21, 0x1c, 0x60, 0x46, 0x73, 0x46, 0x00, 0xf0, + 0x29, 0xf8, 0x07, 0xb0, 0xf0, 0xbd, 0x00, 0x00, + 0xa0, 0x7e, 0x01, 0x00, 0xff, 0xb5, 0x10, 0x1c, + 0x1a, 0x1c, 0x0c, 0x1c, 0x19, 0x1c, 0x60, 0x23, + 0xff, 0x32, 0x13, 0x43, 0x0c, 0x4a, 0x83, 0xb0, + 0x3c, 0x00, 0x40, 0x65, 0x00, 0x00, 0x0c, 0xae, + 0x52, 0x68, 0x60, 0xce, 0x93, 0x70, 0x00, 0x23, + 0xd3, 0x70, 0x93, 0x63, 0x40, 0x27, 0xbb, 0x52, + 0x93, 0x61, 0x13, 0x84, 0x03, 0x22, 0x02, 0x92, + 0x01, 0x91, 0x29, 0x1c, 0x32, 0x1c, 0x00, 0x90, + 0x20, 0x1c, 0x03, 0x9b, 0x00, 0xf0, 0x05, 0xf8, + 0x07, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xa0, 0x7e, + 0x01, 0x00, 0xf8, 0xb5, 0x05, 0x1c, 0x11, 0x48, + 0x1c, 0x1c, 0x3c, 0x00, 0x7c, 0x65, 0x00, 0x00, + 0x08, 0x9b, 0x07, 0x9f, 0x40, 0x68, 0xde, 0x00, + 0x81, 0x65, 0x02, 0x66, 0x00, 0x21, 0x81, 0x80, + 0x0d, 0x48, 0x81, 0x59, 0x20, 0x1c, 0xf9, 0xf7, + 0x22, 0xff, 0x0b, 0x48, 0x30, 0x18, 0x41, 0x68, + 0x28, 0x1c, 0xf9, 0xf7, 0x1c, 0xff, 0x07, 0x49, + 0x06, 0x98, 0x49, 0x68, 0x00, 0x2c, 0x88, 0x62, + 0x0f, 0x86, 0x00, 0xd1, 0x2c, 0x1c, 0x05, 0x48, + 0x4c, 0x62, 0x45, 0x65, 0x3c, 0x00, 0xb8, 0x65, + 0x00, 0x00, 0x01, 0x21, 0x01, 0x65, 0x01, 0x64, + 0xf8, 0xbd, 0xa0, 0x7e, 0x01, 0x00, 0x90, 0x52, + 0x01, 0x00, 0x00, 0x30, 0x07, 0x00, 0xff, 0xb5, + 0x83, 0xb0, 0x0d, 0xae, 0x60, 0xce, 0x0c, 0x9f, + 0x08, 0x1c, 0x11, 0x1c, 0xd2, 0x19, 0xff, 0x32, + 0x40, 0x24, 0x14, 0x43, 0x0b, 0x4a, 0x52, 0x68, + 0x94, 0x70, 0x00, 0x24, 0xd4, 0x70, 0x93, 0x63, + 0x40, 0x23, 0x9f, 0x52, 0x94, 0x61, 0x3c, 0x00, + 0xf4, 0x65, 0x00, 0x00, 0x14, 0x84, 0x02, 0x22, + 0x02, 0x92, 0x32, 0x1c, 0x00, 0x90, 0x01, 0x91, + 0x23, 0x1c, 0x29, 0x1c, 0x03, 0x98, 0xff, 0xf7, + 0xb5, 0xff, 0x07, 0xb0, 0xf0, 0xbd, 0x00, 0x00, + 0xa0, 0x7e, 0x01, 0x00, 0x4c, 0x21, 0x0d, 0x4a, + 0x41, 0x43, 0x10, 0xb5, 0x8c, 0x18, 0x0c, 0x49, + 0x09, 0x78, 0x88, 0x42, 0x07, 0xd1, 0x05, 0xf0, + 0xc7, 0xfd, 0x0a, 0x48, 0x01, 0x88, 0x01, 0x22, + 0x3c, 0x00, 0x30, 0x66, 0x00, 0x00, 0x12, 0x03, + 0x91, 0x43, 0x01, 0x80, 0x20, 0x1c, 0x30, 0x30, + 0x0c, 0x23, 0xc1, 0x56, 0x40, 0x7b, 0x81, 0x42, + 0x02, 0xdd, 0x20, 0x8d, 0x0c, 0xf0, 0xe5, 0xfb, + 0x10, 0xbd, 0x58, 0xe3, 0x01, 0x00, 0x3c, 0x7c, + 0x01, 0x00, 0x32, 0x80, 0x07, 0x00, 0x01, 0x1c, + 0x60, 0x31, 0x80, 0xb5, 0xca, 0x79, 0x8b, 0x79, + 0x9a, 0x42, 0x07, 0xd9, 0x48, 0x7a, 0x0c, 0x23, + 0x07, 0x49, 0x3c, 0x00, 0x6c, 0x66, 0x00, 0x00, + 0x58, 0x43, 0x08, 0x5a, 0x0c, 0xf0, 0xd0, 0xfb, + 0x80, 0xbd, 0x20, 0x30, 0x00, 0x7b, 0x01, 0x28, + 0xfa, 0xd1, 0x48, 0x7a, 0x05, 0xf0, 0x40, 0xfd, + 0x80, 0xbd, 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, + 0x10, 0xb5, 0x04, 0x1c, 0x1c, 0x21, 0xf9, 0xf7, + 0x03, 0xff, 0x03, 0x48, 0xa0, 0x80, 0xe0, 0x80, + 0x20, 0x81, 0x60, 0x81, 0xa0, 0x81, 0x10, 0xbd, + 0xff, 0xff, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0x66, + 0x00, 0x00, 0xff, 0xb5, 0x04, 0x1c, 0x00, 0x20, + 0x83, 0xb0, 0x0d, 0x1c, 0x06, 0x2c, 0x02, 0x90, + 0x38, 0xd2, 0x1f, 0x4a, 0xff, 0x26, 0xc1, 0x00, + 0x89, 0x18, 0x89, 0x78, 0xa1, 0x42, 0x03, 0xd1, + 0xc0, 0x00, 0x80, 0x18, 0x46, 0x78, 0x04, 0xe0, + 0x01, 0x30, 0x00, 0x06, 0x00, 0x16, 0x06, 0x28, + 0xf1, 0xdb, 0xff, 0x2e, 0x24, 0xd0, 0x01, 0x93, + 0x20, 0x1c, 0x0d, 0xf0, 0xe8, 0xf9, 0x3c, 0x00, + 0xe4, 0x66, 0x00, 0x00, 0x00, 0x28, 0x05, 0xd0, + 0x24, 0x21, 0x28, 0x1c, 0x01, 0xab, 0x02, 0xaa, + 0xfa, 0xf7, 0x30, 0xfe, 0x10, 0x49, 0xf0, 0x00, + 0x30, 0x39, 0x0f, 0x58, 0x31, 0x06, 0x09, 0x16, + 0x28, 0x1c, 0x05, 0x9a, 0x01, 0x9b, 0xf9, 0xf7, + 0x6e, 0xfe, 0x06, 0x1c, 0x10, 0xd1, 0x20, 0x1c, + 0x0d, 0xf0, 0xd0, 0xf9, 0x00, 0x28, 0x0b, 0xd0, + 0x28, 0x1c, 0x69, 0x69, 0xfa, 0xf7, 0x12, 0xfe, + 0x3c, 0x00, 0x20, 0x67, 0x00, 0x00, 0x02, 0x98, + 0x68, 0x61, 0x04, 0xe0, 0x06, 0x2c, 0x01, 0xd3, + 0x07, 0x26, 0x00, 0xe0, 0x08, 0x26, 0x30, 0x1c, + 0x07, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xcc, 0x5a, + 0x01, 0x00, 0x10, 0xb5, 0x0c, 0x1c, 0x09, 0xf0, + 0x86, 0xf8, 0x00, 0x28, 0x02, 0xd0, 0x20, 0x1c, + 0x09, 0xf0, 0xb5, 0xf8, 0x10, 0xbd, 0xfe, 0xb5, + 0x13, 0x4d, 0x04, 0x1c, 0xae, 0x69, 0x00, 0x2e, + 0x1c, 0xd0, 0x3c, 0x00, 0x5c, 0x67, 0x00, 0x00, + 0x10, 0x4f, 0x30, 0x37, 0x78, 0x68, 0x60, 0x43, + 0x01, 0x1c, 0x28, 0x88, 0xf9, 0xf7, 0xd2, 0xff, + 0x39, 0x68, 0x61, 0x43, 0x41, 0x18, 0x01, 0xa8, + 0x32, 0x1c, 0xf9, 0xf7, 0x37, 0xfe, 0x02, 0x98, + 0x29, 0x6a, 0x40, 0x18, 0x28, 0x62, 0x0b, 0xd4, + 0xe9, 0x69, 0x88, 0x42, 0x08, 0xd9, 0xa9, 0x69, + 0x40, 0x1a, 0x28, 0x62, 0x01, 0x98, 0x01, 0x30, + 0x01, 0xe0, 0x00, 0x20, 0x3c, 0x00, 0x98, 0x67, + 0x00, 0x00, 0x02, 0x90, 0x01, 0x90, 0x01, 0x98, + 0xfe, 0xbd, 0xc8, 0x74, 0x01, 0x00, 0xf8, 0xb5, + 0x00, 0x28, 0x28, 0xd0, 0x00, 0x24, 0x14, 0x4d, + 0x00, 0xe0, 0x01, 0x34, 0x61, 0x00, 0x09, 0x19, + 0x49, 0x19, 0x49, 0x78, 0x00, 0x29, 0xf8, 0xd1, + 0x63, 0x00, 0x1b, 0x19, 0x03, 0x33, 0x07, 0x22, + 0x69, 0x46, 0x03, 0xf0, 0xd4, 0xfb, 0x00, 0x2c, + 0x0f, 0xd0, 0x00, 0x20, 0x00, 0x99, 0x3c, 0x00, + 0xd4, 0x67, 0x00, 0x00, 0x0a, 0xe0, 0x42, 0x00, + 0x12, 0x18, 0xae, 0x5c, 0x53, 0x18, 0x52, 0x19, + 0x5e, 0x71, 0x56, 0x78, 0x01, 0x30, 0x9e, 0x71, + 0x92, 0x78, 0xda, 0x71, 0xa0, 0x42, 0xf2, 0xdb, + 0x00, 0x98, 0x03, 0x22, 0x02, 0x30, 0x03, 0x49, + 0xf9, 0xf7, 0x7e, 0xfe, 0xf8, 0xbd, 0x00, 0x00, + 0xeb, 0x62, 0x01, 0x00, 0xe8, 0x62, 0x01, 0x00, + 0xb0, 0xb5, 0x05, 0x1c, 0x08, 0x1c, 0xfa, 0xf7, + 0x3c, 0x00, 0x10, 0x68, 0x00, 0x00, 0x9d, 0xff, + 0x04, 0x1c, 0x28, 0x1c, 0xfa, 0xf7, 0xd9, 0xfe, + 0x21, 0x1c, 0xfa, 0xf7, 0xfc, 0xfd, 0x20, 0x1c, + 0xb0, 0xbd, 0xf3, 0xb5, 0x44, 0x48, 0x0c, 0x1c, + 0x00, 0x78, 0x81, 0xb0, 0x01, 0x28, 0x72, 0xd1, + 0xfa, 0xf7, 0x82, 0xf8, 0x41, 0x4d, 0xe8, 0x6a, + 0x41, 0x49, 0x08, 0x60, 0xe8, 0x6b, 0x48, 0x60, + 0x40, 0x48, 0xfa, 0xf7, 0xa6, 0xf9, 0xe8, 0x6a, + 0x00, 0x28, 0x3c, 0x00, 0x4c, 0x68, 0x00, 0x00, + 0xfc, 0xda, 0x22, 0x1c, 0x0f, 0x20, 0x01, 0x99, + 0x0a, 0xf0, 0xa4, 0xf8, 0x38, 0x4d, 0x02, 0x27, + 0x2f, 0x63, 0x38, 0x4a, 0x64, 0x26, 0x00, 0x20, + 0xaa, 0x21, 0x08, 0x32, 0x13, 0x18, 0x01, 0x30, + 0x00, 0x04, 0x00, 0x0c, 0x64, 0x28, 0x19, 0x74, + 0xf8, 0xd3, 0x16, 0x81, 0x00, 0x20, 0x50, 0x60, + 0x10, 0x1c, 0x10, 0x30, 0x10, 0x60, 0x00, 0x25, + 0x17, 0x1c, 0xd2, 0x60, 0x3c, 0x00, 0x88, 0x68, + 0x00, 0x00, 0x08, 0xe0, 0x28, 0x1c, 0xf9, 0xf7, + 0xa2, 0xff, 0x41, 0x31, 0x78, 0x19, 0x01, 0x35, + 0x2d, 0x04, 0x2d, 0x0c, 0x01, 0x74, 0xb5, 0x42, + 0xf4, 0xd3, 0x26, 0x4d, 0x6f, 0x63, 0x01, 0x20, + 0x28, 0x63, 0x24, 0x4d, 0xe8, 0x6a, 0x00, 0x28, + 0xfb, 0xda, 0x0b, 0x22, 0x3b, 0x1c, 0x24, 0x4e, + 0x03, 0xe0, 0x01, 0x32, 0x64, 0x2a, 0x00, 0xd1, + 0x00, 0x22, 0x10, 0x1c, 0x0c, 0x21, 0x3c, 0x00, + 0xc4, 0x68, 0x00, 0x00, 0x01, 0x39, 0x75, 0x5c, + 0x1f, 0x18, 0x3f, 0x7c, 0xbd, 0x42, 0xf3, 0xd1, + 0x01, 0x38, 0x00, 0xd5, 0x63, 0x20, 0x00, 0x29, + 0xf4, 0xd1, 0x18, 0x4e, 0x50, 0x1c, 0xf1, 0x6b, + 0x1a, 0x4a, 0x10, 0x1c, 0x01, 0x38, 0xfd, 0xd1, + 0xf0, 0x6b, 0x88, 0x42, 0x01, 0xd0, 0x01, 0x1c, + 0xf7, 0xe7, 0x02, 0x27, 0x37, 0x63, 0x16, 0x4d, + 0x90, 0x21, 0x28, 0x1c, 0xf9, 0xf7, 0xce, 0xfd, + 0x3c, 0x00, 0x00, 0x69, 0x00, 0x00, 0x28, 0x1c, + 0x28, 0x30, 0x28, 0x60, 0x28, 0x1c, 0x10, 0x30, + 0x2f, 0x81, 0xe8, 0x60, 0x28, 0x1c, 0x20, 0x30, + 0x28, 0x61, 0x04, 0x21, 0x00, 0xe0, 0x0c, 0xe0, + 0x29, 0x83, 0xe8, 0x61, 0xed, 0x62, 0x75, 0x63, + 0x01, 0x20, 0x30, 0x63, 0x22, 0x1c, 0x89, 0x20, + 0x01, 0x99, 0x0a, 0xf0, 0x38, 0xf8, 0x00, 0x20, + 0x28, 0x63, 0xfe, 0xbd, 0x00, 0x00, 0x08, 0x57, + 0x01, 0x00, 0x3c, 0x00, 0x3c, 0x69, 0x00, 0x00, + 0x00, 0x30, 0x07, 0x00, 0x10, 0x8e, 0x01, 0x00, + 0x74, 0xff, 0x01, 0x00, 0x09, 0x57, 0x01, 0x00, + 0x20, 0x4e, 0x00, 0x00, 0xe4, 0xfe, 0x01, 0x00, + 0x80, 0xb5, 0x13, 0x28, 0x1e, 0xd0, 0xf0, 0x28, + 0x16, 0xd1, 0x09, 0xf0, 0xb5, 0xf9, 0x00, 0x28, + 0x13, 0xd1, 0x0d, 0xf0, 0xbf, 0xfa, 0x11, 0xf0, + 0x0d, 0xfc, 0x00, 0x22, 0x04, 0x21, 0xc4, 0x20, + 0x0c, 0xf0, 0x1c, 0xff, 0x3c, 0x00, 0x78, 0x69, + 0x00, 0x00, 0x09, 0x48, 0x00, 0x21, 0x00, 0x78, + 0x05, 0xf0, 0x3f, 0xfd, 0x05, 0xf0, 0x93, 0xf8, + 0x07, 0x49, 0x01, 0x20, 0x08, 0x60, 0x80, 0xbd, + 0x01, 0x1c, 0x01, 0x20, 0xfa, 0xf7, 0x87, 0xfc, + 0x80, 0xbd, 0x00, 0xf0, 0x32, 0xf8, 0x80, 0xbd, + 0x00, 0x00, 0x6a, 0x57, 0x01, 0x00, 0x3c, 0xd9, + 0x01, 0x00, 0xb0, 0xb5, 0x0c, 0xf0, 0xff, 0xf9, + 0x0b, 0x49, 0x02, 0x24, 0x48, 0x60, 0x3c, 0x00, + 0xb4, 0x69, 0x00, 0x00, 0x0a, 0x48, 0x04, 0x61, + 0x01, 0x20, 0x77, 0x21, 0x09, 0x03, 0x08, 0x61, + 0x08, 0x4d, 0x68, 0x68, 0x80, 0x07, 0x02, 0xd4, + 0x68, 0x68, 0x20, 0x43, 0x68, 0x60, 0x09, 0xf0, + 0xc7, 0xf9, 0x68, 0x68, 0xa0, 0x43, 0x68, 0x60, + 0x00, 0x20, 0xb0, 0xbd, 0xe0, 0x60, 0x01, 0x00, + 0x00, 0x30, 0x07, 0x00, 0x00, 0x01, 0x07, 0x00, + 0x80, 0xb5, 0x01, 0x23, 0x03, 0x22, 0x00, 0x21, + 0x3c, 0x00, 0xf0, 0x69, 0x00, 0x00, 0x02, 0x20, + 0x3c, 0xf0, 0xf1, 0xfa, 0x00, 0x28, 0x01, 0xd0, + 0xfa, 0xf7, 0x81, 0xfc, 0x80, 0xbd, 0x1c, 0xb5, + 0xfc, 0xf7, 0xf5, 0xfa, 0xfa, 0xf7, 0x19, 0xfe, + 0x01, 0xf0, 0x03, 0xf9, 0x00, 0x24, 0x21, 0x1c, + 0x68, 0x46, 0x01, 0xf0, 0xe2, 0xfb, 0x00, 0xab, + 0x18, 0x78, 0x01, 0x28, 0x03, 0xd0, 0x02, 0x28, + 0x01, 0xd0, 0x03, 0x28, 0x01, 0xd1, 0x0c, 0xf0, + 0xb2, 0xfc, 0x3c, 0x00, 0x2c, 0x6a, 0x00, 0x00, + 0x01, 0x34, 0x24, 0x06, 0x24, 0x16, 0x06, 0x2c, + 0xec, 0xdb, 0xfa, 0xf7, 0x09, 0xf9, 0xfa, 0xf7, + 0xe7, 0xfc, 0xfa, 0xf7, 0x33, 0xfa, 0xfa, 0xf7, + 0x6d, 0xfa, 0xfb, 0xf7, 0xdf, 0xff, 0x05, 0xf0, + 0x4d, 0xfb, 0x06, 0xf0, 0x81, 0xfc, 0x0b, 0xf0, + 0x7d, 0xf9, 0x07, 0xf0, 0x29, 0xfc, 0x11, 0x48, + 0x10, 0x21, 0x01, 0x60, 0x09, 0x01, 0x01, 0x60, + 0xc9, 0x02, 0x01, 0x60, 0x3c, 0x00, 0x68, 0x6a, + 0x00, 0x00, 0x89, 0x00, 0x01, 0x60, 0x20, 0x21, + 0x01, 0x60, 0x04, 0x21, 0x01, 0x60, 0x08, 0x21, + 0x01, 0x60, 0x40, 0x21, 0x01, 0x60, 0x80, 0x21, + 0x01, 0x60, 0x89, 0x00, 0x01, 0x60, 0x49, 0x00, + 0x01, 0x60, 0x49, 0x00, 0x01, 0x60, 0x49, 0x00, + 0x01, 0x60, 0xc9, 0x03, 0x01, 0x60, 0x89, 0x0b, + 0x01, 0x60, 0xf9, 0xf7, 0x41, 0xff, 0x1c, 0xbd, + 0x00, 0x00, 0x00, 0x10, 0x07, 0x00, 0x3c, 0x00, + 0xa4, 0x6a, 0x00, 0x00, 0x80, 0xb5, 0x3b, 0xf0, + 0x4f, 0xf8, 0x3b, 0xf0, 0x7d, 0xf9, 0xfa, 0xf7, + 0x4b, 0xf9, 0x80, 0xbd, 0xf8, 0xb5, 0x00, 0x25, + 0x00, 0x24, 0x00, 0x22, 0x00, 0x28, 0x71, 0xd0, + 0x43, 0x4f, 0xb9, 0x68, 0x0b, 0x1a, 0xbb, 0x60, + 0xf8, 0x68, 0x39, 0x1c, 0x01, 0x30, 0xf8, 0x60, + 0x89, 0x6a, 0x00, 0x2b, 0x1e, 0xdc, 0x02, 0x24, + 0x00, 0x29, 0x06, 0xda, 0xfb, 0x69, 0x98, 0x42, + 0x3c, 0x00, 0xe0, 0x6a, 0x00, 0x00, 0x06, 0xdd, + 0x3b, 0x69, 0x98, 0x42, 0x09, 0xdd, 0x07, 0xe0, + 0xbb, 0x69, 0x98, 0x42, 0x01, 0xdc, 0x01, 0x24, + 0x03, 0xe0, 0x7b, 0x69, 0x98, 0x42, 0x00, 0xdd, + 0x03, 0x24, 0x78, 0x6a, 0x00, 0x28, 0x08, 0xd0, + 0x00, 0x20, 0x78, 0x62, 0x03, 0x2c, 0x01, 0xd1, + 0x02, 0x24, 0x02, 0xe0, 0x02, 0x2c, 0x00, 0xd1, + 0x01, 0x24, 0x2e, 0x48, 0x01, 0x2c, 0x00, 0x79, + 0x18, 0xd1, 0x3c, 0x00, 0x1c, 0x6b, 0x00, 0x00, + 0xbb, 0x78, 0x99, 0x42, 0x15, 0xda, 0x3b, 0x78, + 0x7b, 0x70, 0x39, 0x70, 0x01, 0x31, 0xb9, 0x62, + 0x01, 0xd5, 0x01, 0x31, 0xb9, 0x62, 0xb9, 0x6a, + 0x01, 0x25, 0x99, 0x42, 0x03, 0xd1, 0x04, 0x28, + 0x04, 0xd2, 0x01, 0x30, 0x00, 0xe0, 0x00, 0x20, + 0x38, 0x71, 0x01, 0x22, 0x00, 0x29, 0x33, 0xda, + 0x27, 0xe0, 0x03, 0x2c, 0x35, 0xd1, 0x00, 0x26, + 0x00, 0x28, 0x07, 0xd0, 0x3c, 0x00, 0x58, 0x6b, + 0x00, 0x00, 0x1e, 0x49, 0x81, 0x40, 0x38, 0x6a, + 0x08, 0x18, 0x0c, 0xf0, 0x5c, 0xf8, 0x00, 0x28, + 0x2c, 0xd0, 0x1b, 0x48, 0x00, 0x78, 0x40, 0x07, + 0x05, 0xd5, 0xf8, 0x68, 0x39, 0x69, 0x88, 0x42, + 0x01, 0xdb, 0x03, 0x23, 0xfe, 0x56, 0xb8, 0x6a, + 0xb0, 0x42, 0x12, 0xdd, 0x01, 0x21, 0x79, 0x62, + 0x39, 0x78, 0x01, 0x25, 0x79, 0x70, 0x38, 0x70, + 0x01, 0x38, 0xb8, 0x62, 0x88, 0x42, 0x3c, 0x00, + 0x94, 0x6b, 0x00, 0x00, 0x01, 0xd0, 0x00, 0x21, + 0x39, 0x71, 0x00, 0x28, 0x0c, 0xda, 0x07, 0x20, + 0x38, 0x71, 0x00, 0xe0, 0x12, 0xe0, 0x07, 0xe0, + 0x38, 0x79, 0x00, 0x28, 0x09, 0xd0, 0xff, 0x30, + 0x38, 0x71, 0x06, 0xe0, 0x00, 0x2a, 0x02, 0xd0, + 0x0c, 0xf0, 0xf8, 0xf8, 0x38, 0x62, 0x00, 0x2c, + 0x04, 0xd0, 0xfe, 0xf7, 0x97, 0xfd, 0x29, 0x1c, + 0x08, 0xf0, 0xfc, 0xfb, 0xf8, 0xbd, 0x00, 0x00, + 0x3c, 0x00, 0xd0, 0x6b, 0x00, 0x00, 0xac, 0x7e, + 0x01, 0x00, 0x50, 0xc3, 0x00, 0x00, 0x1d, 0x75, + 0x01, 0x00, 0x80, 0xb5, 0x10, 0x68, 0x00, 0x28, + 0x02, 0xd0, 0x00, 0xf0, 0x0a, 0xf8, 0x80, 0xbd, + 0x03, 0x48, 0xc0, 0x69, 0x80, 0x68, 0x08, 0xf0, + 0xb2, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x84, 0x6a, + 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0xc0, 0x68, + 0xc0, 0x68, 0x00, 0x28, 0x01, 0xd1, 0xfa, 0xf7, + 0x7a, 0xfb, 0x3c, 0x00, 0x0c, 0x6c, 0x00, 0x00, + 0xe0, 0x68, 0xe1, 0x69, 0xc0, 0x68, 0x23, 0x1c, + 0x01, 0x4a, 0xff, 0xf7, 0xd7, 0xfb, 0x10, 0xbd, + 0xdd, 0x6b, 0x00, 0x00, 0xb0, 0xb5, 0x05, 0x1c, + 0x0c, 0x21, 0x00, 0x20, 0xfa, 0xf7, 0xd6, 0xfc, + 0x04, 0x1c, 0x00, 0x68, 0x00, 0x21, 0x41, 0x60, + 0x01, 0x60, 0x29, 0x88, 0x01, 0x81, 0x69, 0x88, + 0x41, 0x81, 0x29, 0x1c, 0xff, 0x31, 0x21, 0x31, + 0x20, 0x1c, 0x03, 0xf0, 0x3c, 0x00, 0x48, 0x6c, + 0x00, 0x00, 0x77, 0xf9, 0x29, 0x1c, 0xff, 0x31, + 0x46, 0x31, 0x20, 0x1c, 0x03, 0xf0, 0x71, 0xf9, + 0x29, 0x1c, 0xff, 0x31, 0x50, 0x31, 0x20, 0x1c, + 0x03, 0xf0, 0x6b, 0xf9, 0x29, 0x1c, 0xff, 0x31, + 0x43, 0x31, 0x20, 0x1c, 0x03, 0xf0, 0x65, 0xf9, + 0x29, 0x1c, 0xff, 0x31, 0x63, 0x31, 0x20, 0x1c, + 0x03, 0xf0, 0x5f, 0xf9, 0x04, 0x48, 0x00, 0x68, + 0x00, 0x28, 0x02, 0xd0, 0x20, 0x1c, 0x3c, 0x00, + 0x84, 0x6c, 0x00, 0x00, 0xff, 0xf7, 0x8e, 0xfd, + 0x20, 0x1c, 0xb0, 0xbd, 0xe4, 0x62, 0x01, 0x00, + 0xf8, 0xb5, 0x05, 0x1c, 0x0c, 0x1c, 0x04, 0xd1, + 0x05, 0x21, 0x18, 0x20, 0xfa, 0xf7, 0x02, 0xfb, + 0x4d, 0xe0, 0x29, 0x1c, 0x12, 0x31, 0x06, 0x22, + 0x60, 0x1c, 0xf9, 0xf7, 0x25, 0xfc, 0x22, 0x1c, + 0x30, 0x32, 0x00, 0x26, 0x00, 0x21, 0x00, 0x20, + 0x16, 0x70, 0x34, 0x4b, 0x1b, 0x5c, 0x2f, 0x8a, + 0x3c, 0x00, 0xc0, 0x6c, 0x00, 0x00, 0xdf, 0x40, + 0xff, 0x07, 0x07, 0xd5, 0x17, 0x78, 0x01, 0x33, + 0x01, 0x37, 0x17, 0x70, 0x67, 0x18, 0x30, 0x37, + 0x7b, 0x70, 0x01, 0x31, 0x01, 0x30, 0x0e, 0x28, + 0xee, 0xdb, 0xa8, 0x7b, 0x60, 0x72, 0x10, 0x78, + 0x00, 0x28, 0x2b, 0xd0, 0x2a, 0x48, 0x1e, 0x21, + 0x09, 0x5c, 0x27, 0x1c, 0x10, 0x37, 0x21, 0x72, + 0x01, 0x68, 0x61, 0x81, 0xc1, 0x89, 0x21, 0x77, + 0x81, 0x89, 0x3c, 0x00, 0xfc, 0x6c, 0x00, 0x00, + 0x79, 0x73, 0xc1, 0x8a, 0xa1, 0x81, 0x01, 0x8b, + 0xe1, 0x81, 0x42, 0x8a, 0x21, 0x1c, 0x60, 0x31, + 0x4a, 0x80, 0x82, 0x8a, 0x8a, 0x80, 0x1f, 0x49, + 0x2c, 0x31, 0x09, 0x7a, 0x00, 0x29, 0x09, 0xd0, + 0x02, 0x29, 0x0a, 0xd1, 0x01, 0x22, 0x62, 0x62, + 0x62, 0x72, 0x42, 0x8b, 0xa2, 0x81, 0x80, 0x8b, + 0xe0, 0x81, 0x03, 0xe0, 0x01, 0x21, 0x66, 0x62, + 0x00, 0xe0, 0x00, 0x21, 0x3c, 0x00, 0x38, 0x6d, + 0x00, 0x00, 0xe8, 0x7b, 0x08, 0x40, 0x01, 0xd1, + 0x00, 0x20, 0xf8, 0xbd, 0xa8, 0x68, 0x43, 0x1c, + 0x09, 0xd0, 0x22, 0x1c, 0x12, 0x32, 0x00, 0x92, + 0x93, 0x1d, 0x02, 0x32, 0x21, 0x1c, 0x01, 0xf0, + 0x9c, 0xfa, 0xa0, 0x62, 0x00, 0xe0, 0xa6, 0x62, + 0x68, 0x7b, 0x29, 0x1c, 0x1d, 0x31, 0x20, 0x74, + 0x0b, 0x48, 0x20, 0x22, 0x20, 0x62, 0x20, 0x1c, + 0x42, 0x30, 0xbe, 0x73, 0xf9, 0xf7, 0x3c, 0x00, + 0x74, 0x6d, 0x00, 0x00, 0xc1, 0xfb, 0x40, 0x34, + 0x26, 0x70, 0x68, 0x7e, 0x04, 0x49, 0x60, 0x70, + 0x68, 0x68, 0x2c, 0x31, 0x48, 0x60, 0x01, 0x20, + 0xda, 0xe7, 0x00, 0x00, 0x90, 0x58, 0x01, 0x00, + 0xc8, 0x6e, 0x01, 0x00, 0x91, 0x02, 0x01, 0x00, + 0x70, 0xb5, 0x16, 0x1c, 0x0d, 0x1c, 0x04, 0x1c, + 0x00, 0x28, 0x06, 0xd0, 0x0c, 0x20, 0xfa, 0xf7, + 0x47, 0xfd, 0x30, 0xc0, 0x08, 0x38, 0x06, 0x72, + 0x3c, 0x00, 0xb0, 0x6d, 0x00, 0x00, 0x70, 0xbd, + 0x00, 0x20, 0x70, 0xbd, 0x00, 0x00, 0x01, 0x1c, + 0x05, 0x48, 0x80, 0xb5, 0x00, 0x68, 0x01, 0xd0, + 0x01, 0x21, 0x00, 0xe0, 0x00, 0x21, 0xfc, 0xf7, + 0xa0, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x0c, 0x79, + 0x01, 0x00, 0x70, 0xb5, 0x0e, 0x1c, 0x04, 0x1c, + 0x00, 0x28, 0x01, 0xd1, 0xfa, 0xf7, 0x8f, 0xfa, + 0x06, 0x4d, 0x28, 0x68, 0x00, 0x28, 0x01, 0xd0, + 0xfa, 0xf7, 0x3c, 0x00, 0xec, 0x6d, 0x00, 0x00, + 0x89, 0xfa, 0x04, 0x48, 0x2e, 0x60, 0xc4, 0x60, + 0x01, 0x21, 0x01, 0x70, 0x70, 0xbd, 0x00, 0x00, + 0xa8, 0x7e, 0x01, 0x00, 0x30, 0x00, 0x07, 0x00, + 0x10, 0xb5, 0x07, 0x4c, 0x20, 0x68, 0x00, 0x28, + 0x01, 0xd1, 0xfa, 0xf7, 0x77, 0xfa, 0x05, 0x48, + 0x00, 0x69, 0x21, 0x68, 0xf9, 0xf7, 0xdf, 0xfa, + 0x00, 0x20, 0x20, 0x60, 0x10, 0xbd, 0x00, 0x00, + 0xa8, 0x7e, 0x01, 0x00, 0x3c, 0x00, 0x28, 0x6e, + 0x00, 0x00, 0x30, 0x00, 0x07, 0x00, 0x01, 0x20, + 0x05, 0x49, 0xc0, 0x06, 0x80, 0xb5, 0x08, 0x60, + 0x00, 0x22, 0x03, 0x21, 0x54, 0x20, 0x0c, 0xf0, + 0xb8, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x10, + 0x07, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x04, 0x21, + 0xc4, 0x20, 0x0c, 0xf0, 0xae, 0xfc, 0x80, 0xbd, + 0x00, 0x00, 0x04, 0x48, 0x80, 0xb5, 0x00, 0x88, + 0x02, 0x49, 0xff, 0xf7, 0xb8, 0xff, 0x3c, 0x00, + 0x64, 0x6e, 0x00, 0x00, 0x80, 0xbd, 0x00, 0x00, + 0x75, 0x4b, 0x00, 0x00, 0xc8, 0x74, 0x01, 0x00, + 0xf8, 0xb5, 0x06, 0x1c, 0x31, 0x48, 0x00, 0x25, + 0xc0, 0x68, 0x0c, 0x1c, 0x00, 0x28, 0x30, 0xd0, + 0x2e, 0x48, 0x2f, 0x4f, 0x04, 0x30, 0x00, 0x78, + 0x38, 0x76, 0x2c, 0x48, 0x04, 0x30, 0x40, 0x78, + 0x38, 0x81, 0x00, 0x2a, 0x0b, 0xd0, 0xf9, 0xf7, + 0xa5, 0xfa, 0x1f, 0x20, 0xb8, 0x76, 0x20, 0x1c, + 0x3c, 0x00, 0xa0, 0x6e, 0x00, 0x00, 0xf9, 0xf7, + 0xf6, 0xf9, 0x25, 0x48, 0x04, 0x30, 0x80, 0x78, + 0xb8, 0x76, 0x43, 0xe0, 0x25, 0x48, 0x22, 0x49, + 0x84, 0x42, 0x4d, 0x69, 0x02, 0xd2, 0x6c, 0x43, + 0xe4, 0x0b, 0x0f, 0xe0, 0x1f, 0x48, 0x21, 0x1c, + 0x80, 0x6a, 0x00, 0x90, 0xf9, 0xf7, 0x23, 0xfc, + 0x00, 0x99, 0x02, 0x1c, 0x4a, 0x43, 0xa1, 0x1a, + 0x1a, 0x4a, 0x69, 0x43, 0x52, 0x6a, 0xc9, 0x0b, + 0x50, 0x43, 0x3c, 0x00, 0xdc, 0x6e, 0x00, 0x00, + 0x44, 0x18, 0x02, 0x2c, 0x01, 0xd8, 0x00, 0x20, + 0xf8, 0xbd, 0xf9, 0xf7, 0x7d, 0xfa, 0x1f, 0x20, + 0xb8, 0x76, 0x20, 0x1c, 0xf9, 0xf7, 0xae, 0xf9, + 0x04, 0x1c, 0x11, 0x48, 0x04, 0x30, 0x80, 0x78, + 0xb8, 0x76, 0x0f, 0x4f, 0x7d, 0x6a, 0xac, 0x42, + 0x04, 0xd2, 0x20, 0x1c, 0xff, 0xf7, 0x22, 0xfc, + 0x05, 0x1c, 0x12, 0xe0, 0x21, 0x1c, 0x28, 0x1c, + 0xf9, 0xf7, 0xfc, 0xfb, 0x3c, 0x00, 0x18, 0x6f, + 0x00, 0x00, 0x06, 0x1c, 0x68, 0x43, 0x20, 0x1a, + 0xff, 0xf7, 0x17, 0xfc, 0x05, 0x1c, 0x00, 0x24, + 0x04, 0xe0, 0x78, 0x6a, 0xff, 0xf7, 0x11, 0xfc, + 0x45, 0x19, 0x01, 0x34, 0xb4, 0x42, 0xf8, 0xd3, + 0x28, 0x1c, 0xd4, 0xe7, 0x00, 0x00, 0xc8, 0x74, + 0x01, 0x00, 0x30, 0x00, 0x07, 0x00, 0xc0, 0xc6, + 0x2d, 0x00, 0x01, 0x1c, 0x7d, 0x20, 0x80, 0xb5, + 0xc0, 0x00, 0xf9, 0xf7, 0x72, 0xfb, 0x3c, 0x00, + 0x54, 0x6f, 0x00, 0x00, 0x02, 0x49, 0x88, 0x61, + 0x40, 0x08, 0xc8, 0x61, 0x80, 0xbd, 0x00, 0x00, + 0xc8, 0x74, 0x01, 0x00, 0x10, 0xb5, 0x06, 0x4c, + 0x21, 0x1c, 0x00, 0x20, 0x0b, 0xf0, 0x42, 0xfa, + 0x21, 0x1c, 0x00, 0x20, 0x0b, 0xf0, 0x0a, 0xfa, + 0x00, 0xf0, 0x68, 0xfe, 0x10, 0xbd, 0x00, 0x00, + 0x85, 0x6f, 0x00, 0x00, 0x30, 0xb5, 0x0f, 0x4d, + 0x2a, 0x78, 0x04, 0x2a, 0x19, 0xd8, 0x00, 0x2a, + 0x3c, 0x00, 0x90, 0x6f, 0x00, 0x00, 0x17, 0xd0, + 0x00, 0x21, 0x07, 0xe0, 0x4b, 0x00, 0x5b, 0x18, + 0x5c, 0x19, 0x01, 0x23, 0xe4, 0x56, 0x84, 0x42, + 0x02, 0xda, 0x01, 0x31, 0x8a, 0x42, 0xf5, 0xdc, + 0x8a, 0x42, 0x00, 0xd1, 0x01, 0x39, 0x48, 0x00, + 0x40, 0x18, 0x40, 0x19, 0x81, 0x78, 0x02, 0x4a, + 0x34, 0x3a, 0x11, 0x70, 0xc0, 0x78, 0x50, 0x70, + 0x30, 0xbd, 0x00, 0x75, 0x01, 0x00, 0x30, 0xb5, + 0x11, 0x1c, 0x3c, 0x00, 0xcc, 0x6f, 0x00, 0x00, + 0x38, 0x31, 0x85, 0xb0, 0x91, 0x62, 0x08, 0x21, + 0x11, 0x86, 0x00, 0x23, 0x14, 0x1c, 0x01, 0x1c, + 0x53, 0x63, 0xc0, 0x68, 0x15, 0x4d, 0x0b, 0xe0, + 0x02, 0x68, 0xaa, 0x42, 0x06, 0xd1, 0xc2, 0x68, + 0xca, 0x60, 0xc3, 0x60, 0x03, 0x60, 0xfa, 0xf7, + 0xd1, 0xfa, 0x03, 0xe0, 0x01, 0x1c, 0xc0, 0x68, + 0x00, 0x28, 0xf1, 0xd1, 0x22, 0x1c, 0x40, 0x32, + 0x08, 0x21, 0x20, 0x68, 0x3c, 0x00, 0x08, 0x70, + 0x00, 0x00, 0xfa, 0xf7, 0x64, 0xfb, 0x0b, 0x49, + 0x20, 0x1c, 0x48, 0x30, 0x02, 0x90, 0x04, 0x94, + 0x03, 0x91, 0xe0, 0x69, 0x82, 0x88, 0x01, 0x68, + 0x6e, 0x20, 0x01, 0x92, 0x00, 0x91, 0x22, 0x1c, + 0x56, 0x32, 0x03, 0x5d, 0x21, 0x1c, 0x28, 0x31, + 0x20, 0x68, 0xff, 0xf7, 0x58, 0xfa, 0x05, 0xb0, + 0x30, 0xbd, 0xa0, 0x7e, 0x01, 0x00, 0xd5, 0x70, + 0x00, 0x00, 0x1c, 0xb5, 0x07, 0x49, 0x3c, 0x00, + 0x44, 0x70, 0x00, 0x00, 0x02, 0x1c, 0x01, 0x90, + 0x00, 0x91, 0xc0, 0x69, 0x13, 0x1c, 0x84, 0x88, + 0x01, 0x68, 0x10, 0x68, 0x48, 0x33, 0x22, 0x1c, + 0xff, 0xf7, 0x08, 0xf9, 0x1c, 0xbd, 0x00, 0x00, + 0xc9, 0x6f, 0x00, 0x00, 0x10, 0xb5, 0x14, 0x1c, + 0x18, 0x48, 0x03, 0xf0, 0x89, 0xf8, 0xa0, 0x42, + 0x01, 0xd0, 0xfa, 0xf7, 0x45, 0xf9, 0x04, 0x22, + 0x20, 0x1c, 0x40, 0x30, 0xa1, 0x6a, 0xf9, 0xf7, + 0x3c, 0x00, 0x80, 0x70, 0x00, 0x00, 0xbd, 0xf9, + 0x00, 0x28, 0x02, 0xd1, 0x01, 0x20, 0x20, 0x62, + 0x05, 0xe0, 0x00, 0x20, 0x20, 0x62, 0x84, 0x20, + 0x00, 0x5d, 0x00, 0x28, 0x03, 0xd1, 0x20, 0x1c, + 0x09, 0xf0, 0x23, 0xfb, 0x05, 0xe0, 0x20, 0x68, + 0xfa, 0xf7, 0x79, 0xfa, 0x20, 0x1c, 0xfa, 0xf7, + 0xa4, 0xfb, 0xe0, 0x69, 0x80, 0x79, 0x06, 0x28, + 0x06, 0xd1, 0x20, 0x6a, 0x06, 0x49, 0x00, 0x28, + 0x03, 0xd0, 0x3c, 0x00, 0xbc, 0x70, 0x00, 0x00, + 0x08, 0x69, 0x01, 0x30, 0x08, 0x61, 0x10, 0xbd, + 0x48, 0x69, 0x01, 0x30, 0x48, 0x61, 0x10, 0xbd, + 0xa0, 0x6a, 0x01, 0x00, 0x28, 0x61, 0x01, 0x00, + 0x1c, 0xb5, 0x14, 0x1c, 0x15, 0x48, 0x03, 0xf0, + 0x51, 0xf8, 0xa0, 0x42, 0x01, 0xd0, 0xfa, 0xf7, + 0x0d, 0xf9, 0x20, 0x1c, 0x4f, 0x30, 0x02, 0x79, + 0x41, 0x79, 0x00, 0xab, 0x12, 0x02, 0x11, 0x43, + 0xc2, 0x78, 0x12, 0x04, 0x3c, 0x00, 0xf8, 0x70, + 0x00, 0x00, 0x11, 0x43, 0x82, 0x78, 0x12, 0x06, + 0x11, 0x43, 0x00, 0x91, 0x01, 0x78, 0x40, 0x78, + 0x09, 0x02, 0x08, 0x43, 0x98, 0x80, 0x20, 0x1c, + 0x69, 0x46, 0x06, 0xf0, 0x3c, 0xf9, 0x00, 0x28, + 0x03, 0xd1, 0x20, 0x1c, 0x09, 0xf0, 0xe3, 0xfa, + 0x1c, 0xbd, 0x20, 0x68, 0xfa, 0xf7, 0x39, 0xfa, + 0x20, 0x1c, 0xfa, 0xf7, 0x64, 0xfb, 0xf7, 0xe7, + 0x00, 0x00, 0xa0, 0x6a, 0x01, 0x00, 0x3c, 0x00, + 0x34, 0x71, 0x00, 0x00, 0xbc, 0xb5, 0x1f, 0x4d, + 0x14, 0x1c, 0x28, 0x1c, 0xdc, 0x30, 0x03, 0xf0, + 0x1f, 0xf8, 0xa0, 0x42, 0x01, 0xd0, 0xfa, 0xf7, + 0xdb, 0xf8, 0xa0, 0x6c, 0x00, 0xab, 0x02, 0x78, + 0x81, 0x78, 0x12, 0x02, 0x11, 0x43, 0x02, 0x79, + 0x12, 0x04, 0x11, 0x43, 0x42, 0x79, 0x12, 0x06, + 0x11, 0x43, 0x00, 0x91, 0x81, 0x79, 0xc0, 0x79, + 0x00, 0x02, 0x08, 0x43, 0x98, 0x80, 0x20, 0x1c, + 0x3c, 0x00, 0x70, 0x71, 0x00, 0x00, 0x69, 0x46, + 0x06, 0xf0, 0x0b, 0xf9, 0x00, 0x28, 0x17, 0xd0, + 0x01, 0x28, 0x0e, 0xd1, 0xed, 0x6c, 0x00, 0x2d, + 0x0b, 0xd0, 0x80, 0x20, 0x02, 0x5d, 0xe0, 0x6c, + 0x01, 0x21, 0x00, 0x28, 0x00, 0xd1, 0x00, 0x21, + 0x60, 0x68, 0x6b, 0x46, 0x0a, 0x30, 0xf9, 0xf7, + 0x23, 0xf9, 0x20, 0x68, 0xfa, 0xf7, 0xfb, 0xf9, + 0x20, 0x1c, 0xfa, 0xf7, 0x26, 0xfb, 0xbc, 0xbd, + 0x20, 0x1c, 0x3c, 0x00, 0xac, 0x71, 0x00, 0x00, + 0x00, 0xf0, 0x8e, 0xfe, 0xfa, 0xe7, 0x00, 0x00, + 0xc4, 0x69, 0x01, 0x00, 0xbc, 0xb5, 0x04, 0x1c, + 0x40, 0x6a, 0x00, 0x25, 0x00, 0x28, 0x03, 0xd0, + 0x60, 0x68, 0x00, 0x8b, 0x05, 0x07, 0x2d, 0x0f, + 0x22, 0x1c, 0x40, 0x32, 0x08, 0x21, 0x20, 0x68, + 0xfa, 0xf7, 0x7e, 0xfa, 0xa1, 0x68, 0x01, 0x95, + 0x00, 0x91, 0x21, 0x1c, 0x22, 0x1c, 0x60, 0x32, + 0x20, 0x68, 0x50, 0x31, 0x3c, 0x00, 0xe8, 0x71, + 0x00, 0x00, 0x0d, 0x1c, 0xe3, 0x68, 0x09, 0xf0, + 0xe2, 0xff, 0xe0, 0x69, 0x80, 0x6b, 0x00, 0x28, + 0x03, 0xd1, 0xfe, 0xf7, 0xe8, 0xfa, 0x00, 0x28, + 0x01, 0xd0, 0x18, 0x20, 0x00, 0xe0, 0x10, 0x20, + 0x06, 0x49, 0x01, 0x94, 0x00, 0x91, 0xe1, 0x69, + 0x08, 0x23, 0x09, 0x68, 0x0a, 0x18, 0x21, 0x1c, + 0x28, 0x31, 0x28, 0x1c, 0xff, 0xf7, 0x87, 0xf9, + 0xbc, 0xbd, 0x35, 0x71, 0x00, 0x00, 0x3c, 0x00, + 0x24, 0x72, 0x00, 0x00, 0x10, 0xb5, 0x10, 0x1c, + 0x38, 0x30, 0x90, 0x62, 0x04, 0x20, 0x10, 0x86, + 0x00, 0x20, 0x50, 0x63, 0x10, 0x68, 0x14, 0x1c, + 0x40, 0x32, 0x04, 0x21, 0xfa, 0xf7, 0x4a, 0xfa, + 0x23, 0x1c, 0x21, 0x1c, 0x28, 0x31, 0x02, 0x4a, + 0x20, 0x68, 0xff, 0xf7, 0xbd, 0xf8, 0x10, 0xbd, + 0x65, 0x70, 0x00, 0x00, 0x0e, 0xb5, 0xc3, 0x69, + 0x02, 0x1c, 0x98, 0x88, 0x05, 0x49, 0x02, 0x92, + 0x3c, 0x00, 0x60, 0x72, 0x00, 0x00, 0x01, 0x91, + 0x00, 0x90, 0x1b, 0x68, 0x10, 0x68, 0x91, 0x69, + 0x03, 0x22, 0xff, 0xf7, 0xae, 0xf9, 0x0e, 0xbd, + 0x00, 0x00, 0x25, 0x72, 0x00, 0x00, 0x0e, 0xb5, + 0x02, 0x1c, 0x06, 0x49, 0x10, 0x20, 0x00, 0x90, + 0x02, 0x92, 0x13, 0x1c, 0x01, 0x91, 0x10, 0x68, + 0x00, 0x22, 0x70, 0x33, 0x00, 0x21, 0xff, 0xf7, + 0x9c, 0xf9, 0x0e, 0xbd, 0x00, 0x00, 0x25, 0x72, + 0x00, 0x00, 0x3c, 0x00, 0x9c, 0x72, 0x00, 0x00, + 0x10, 0xb5, 0x03, 0x1c, 0x00, 0x21, 0x00, 0x20, + 0x08, 0x4c, 0x00, 0xe0, 0x01, 0x31, 0xca, 0x00, + 0xa2, 0x58, 0x9a, 0x42, 0x02, 0xd0, 0x0b, 0x29, + 0xf8, 0xd3, 0x10, 0xbd, 0x0b, 0x29, 0xfc, 0xd2, + 0xc9, 0x00, 0x09, 0x19, 0x00, 0x20, 0x08, 0x71, + 0x01, 0x20, 0x10, 0xbd, 0x38, 0x58, 0x01, 0x00, + 0x8c, 0xb5, 0x00, 0xab, 0x86, 0x21, 0x19, 0x80, + 0x01, 0x1c, 0x04, 0x48, 0x3c, 0x00, 0xd8, 0x72, + 0x00, 0x00, 0x06, 0xf0, 0xee, 0xfe, 0x01, 0x90, + 0x68, 0x46, 0x06, 0xf0, 0xfa, 0xf8, 0x8c, 0xbd, + 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0x10, 0xb5, + 0x04, 0x1c, 0x0d, 0x48, 0x0d, 0x49, 0x94, 0xb0, + 0x04, 0x80, 0x06, 0x22, 0x18, 0x31, 0x0c, 0x30, + 0xf9, 0xf7, 0xfb, 0xf8, 0x01, 0xa8, 0x07, 0xf0, + 0xa2, 0xf8, 0x0c, 0x20, 0x09, 0xa9, 0x48, 0x72, + 0x00, 0xab, 0x1c, 0x80, 0x02, 0x21, 0x3c, 0x00, + 0x14, 0x73, 0x00, 0x00, 0x68, 0x46, 0x03, 0xf0, + 0xdb, 0xff, 0x04, 0x90, 0x01, 0xa8, 0x06, 0xf0, + 0xd1, 0xf8, 0x14, 0xb0, 0x10, 0xbd, 0x00, 0x00, + 0x58, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x04, 0xf0, + 0x45, 0xfe, 0x05, 0xf0, 0x53, 0xfa, 0x80, 0xbd, + 0x10, 0xb5, 0x19, 0x4c, 0xe0, 0x68, 0x00, 0x28, + 0x06, 0xd0, 0x61, 0x1c, 0x08, 0x78, 0x00, 0x28, + 0x03, 0xd1, 0x48, 0x78, 0xff, 0x30, 0x08, 0x70, + 0x3c, 0x00, 0x50, 0x73, 0x00, 0x00, 0x10, 0xbd, + 0xff, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x08, 0x70, + 0xa1, 0x68, 0x00, 0x29, 0xf7, 0xd0, 0x00, 0x28, + 0xf5, 0xd1, 0x0e, 0x48, 0x54, 0x30, 0x81, 0x78, + 0x00, 0x29, 0x03, 0xd1, 0xc1, 0x78, 0xff, 0x31, + 0x81, 0x70, 0x10, 0xbd, 0xff, 0x31, 0x09, 0x06, + 0x09, 0x0e, 0x81, 0x70, 0xf9, 0xd1, 0xa1, 0x69, + 0x00, 0x29, 0xf6, 0xd0, 0x80, 0x88, 0x03, 0xf0, + 0xd0, 0xfb, 0x3c, 0x00, 0x8c, 0x73, 0x00, 0x00, + 0x04, 0x4a, 0x01, 0x1c, 0x5c, 0x32, 0x0c, 0x32, + 0x05, 0xca, 0x80, 0x1a, 0xa2, 0x69, 0xf9, 0xf7, + 0x1f, 0xf8, 0x10, 0xbd, 0x44, 0x7d, 0x01, 0x00, + 0xf0, 0xb5, 0x04, 0x1c, 0x40, 0x68, 0x00, 0x25, + 0x01, 0x79, 0x00, 0x22, 0x85, 0xb0, 0xc9, 0x07, + 0xcb, 0x17, 0x69, 0x49, 0x01, 0x33, 0x89, 0x6a, + 0x10, 0x29, 0x05, 0xd3, 0x66, 0x49, 0xc0, 0x39, + 0x08, 0x6b, 0x01, 0x30, 0x3c, 0x00, 0xc8, 0x73, + 0x00, 0x00, 0x08, 0x63, 0x8e, 0xe0, 0x21, 0x68, + 0x0e, 0x68, 0xf6, 0x78, 0xb7, 0x06, 0xff, 0x0f, + 0xb6, 0x09, 0x00, 0x2b, 0x04, 0x97, 0x06, 0xd0, + 0x63, 0x69, 0x1f, 0x1c, 0x1b, 0x6a, 0x50, 0x37, + 0x9f, 0x42, 0x00, 0xd1, 0x01, 0x25, 0x00, 0x2d, + 0x02, 0xd0, 0x63, 0x69, 0x1b, 0x6a, 0x04, 0xe0, + 0x3c, 0x23, 0x59, 0x4f, 0x73, 0x43, 0xdb, 0x19, + 0x04, 0x33, 0xe3, 0x61, 0x9f, 0x88, 0x3c, 0x00, + 0x04, 0x74, 0x00, 0x00, 0x00, 0x2f, 0x70, 0xd0, + 0x9b, 0x79, 0x02, 0x2b, 0x6e, 0xd0, 0x04, 0x2b, + 0x17, 0xd0, 0x06, 0x2b, 0x69, 0xd1, 0x08, 0x68, + 0xa0, 0x61, 0x08, 0x89, 0x04, 0x38, 0x08, 0x81, + 0x20, 0x68, 0x01, 0x68, 0x04, 0x31, 0x01, 0x60, + 0x4e, 0x49, 0x00, 0x29, 0x5d, 0xd0, 0x04, 0x9f, + 0xba, 0x42, 0x5a, 0xd1, 0x49, 0x48, 0x22, 0x1c, + 0x1c, 0x30, 0x02, 0xf0, 0x65, 0xfe, 0x05, 0xb0, + 0x3c, 0x00, 0x40, 0x74, 0x00, 0x00, 0xf0, 0xbd, + 0x09, 0x68, 0x25, 0x1c, 0xca, 0x79, 0x40, 0x35, + 0x26, 0x1c, 0xea, 0x73, 0x8b, 0x79, 0x22, 0x1c, + 0x50, 0x32, 0x13, 0x70, 0x4b, 0x79, 0x60, 0x36, + 0x53, 0x70, 0x0b, 0x79, 0x93, 0x70, 0x4b, 0x78, + 0xd3, 0x70, 0x09, 0x78, 0x11, 0x71, 0x00, 0x21, + 0x29, 0x72, 0x16, 0x21, 0xb1, 0x73, 0x61, 0x6a, + 0x00, 0x29, 0x06, 0xd0, 0x01, 0x8b, 0x09, 0x07, + 0x09, 0x0f, 0x3c, 0x00, 0x7c, 0x74, 0x00, 0x00, + 0x29, 0x72, 0xb1, 0x81, 0x18, 0x21, 0xb1, 0x73, + 0x01, 0x1c, 0x0a, 0x31, 0x20, 0x1c, 0x06, 0x22, + 0x49, 0x30, 0xf9, 0xf7, 0x33, 0xf8, 0x60, 0x68, + 0x14, 0x22, 0x01, 0x88, 0xe9, 0x82, 0x01, 0x1d, + 0x20, 0x1c, 0x58, 0x30, 0xf9, 0xf7, 0x2a, 0xf8, + 0xe8, 0x8a, 0x30, 0x49, 0x08, 0x40, 0x01, 0x21, + 0x89, 0x03, 0x08, 0x43, 0xe8, 0x82, 0x70, 0x89, + 0x0f, 0x21, 0x08, 0x40, 0x3c, 0x00, 0xb8, 0x74, + 0x00, 0x00, 0x70, 0x81, 0x20, 0x68, 0x01, 0x89, + 0x08, 0x39, 0x01, 0x81, 0x20, 0x68, 0x01, 0x68, + 0x08, 0x31, 0x01, 0x60, 0x08, 0x21, 0x00, 0x20, + 0xfa, 0xf7, 0x83, 0xf8, 0x05, 0x1c, 0x02, 0x68, + 0x20, 0x68, 0x08, 0x21, 0xfa, 0xf7, 0xfb, 0xf8, + 0x20, 0x68, 0xfa, 0xf7, 0x74, 0xf8, 0x21, 0x49, + 0xc5, 0x60, 0x2f, 0xe0, 0x30, 0xe0, 0xff, 0xe7, + 0x21, 0x68, 0x60, 0x68, 0x0a, 0x68, 0x3c, 0x00, + 0xf4, 0x74, 0x00, 0x00, 0x80, 0x23, 0xa2, 0x64, + 0x1e, 0x55, 0xe5, 0x64, 0x55, 0x79, 0x13, 0x79, + 0x2d, 0x02, 0x5b, 0x19, 0x95, 0x79, 0x2d, 0x04, + 0x5b, 0x19, 0xd5, 0x79, 0x2d, 0x06, 0x5b, 0x19, + 0x95, 0x78, 0x12, 0x78, 0x12, 0x02, 0xaa, 0x18, + 0x15, 0x04, 0x0a, 0x89, 0x2d, 0x0c, 0x08, 0x3a, + 0x0a, 0x81, 0x21, 0x68, 0x0a, 0x68, 0x08, 0x32, + 0x0a, 0x60, 0xe1, 0x69, 0x02, 0x1c, 0x0a, 0x32, + 0x3c, 0x00, 0x30, 0x75, 0x00, 0x00, 0x01, 0xa8, + 0x09, 0x68, 0x0b, 0xf0, 0x3e, 0xf9, 0xe0, 0x69, + 0x2b, 0x1c, 0x01, 0x68, 0x20, 0x1c, 0x70, 0x30, + 0x01, 0xaa, 0x0b, 0xf0, 0x86, 0xf9, 0x09, 0x49, + 0x01, 0x22, 0x6d, 0xe7, 0x20, 0x68, 0xfa, 0xf7, + 0x22, 0xf8, 0x20, 0x1c, 0xfa, 0xf7, 0x4d, 0xf9, + 0x70, 0xe7, 0x84, 0x6a, 0x01, 0x00, 0x68, 0x61, + 0x01, 0x00, 0x55, 0x72, 0x00, 0x00, 0x8f, 0xc7, + 0xff, 0xff, 0x3c, 0x00, 0x6c, 0x75, 0x00, 0x00, + 0x41, 0x70, 0x00, 0x00, 0x79, 0x72, 0x00, 0x00, + 0x80, 0xb5, 0x02, 0x21, 0x82, 0x20, 0xf9, 0xf7, + 0x93, 0xfe, 0x80, 0xbd, 0x70, 0x47, 0x00, 0x00, + 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x80, 0xb5, 0xc0, 0x68, 0xf9, 0xf7, 0xfa, 0xff, + 0x01, 0x20, 0x80, 0xbd, 0x3c, 0x00, 0xa8, 0x75, + 0x00, 0x00, 0x80, 0xb5, 0x00, 0x21, 0xff, 0x20, + 0xf9, 0xf7, 0x79, 0xfe, 0x80, 0xbd, 0x70, 0x47, + 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x01, 0x20, + 0x70, 0x47, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, + 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, + 0x00, 0x00, 0x80, 0xb5, 0x06, 0x21, 0x99, 0x20, + 0xf9, 0xf7, 0x65, 0xfe, 0x80, 0xbd, 0xb0, 0xb5, + 0x00, 0x25, 0x01, 0x29, 0x12, 0x4c, 0x3c, 0x00, + 0xe4, 0x75, 0x00, 0x00, 0x0f, 0xd1, 0x0a, 0xf0, + 0x0f, 0xfc, 0x00, 0x28, 0x1d, 0xd0, 0x61, 0x78, + 0x3c, 0x23, 0x59, 0x43, 0x09, 0x19, 0x04, 0x31, + 0x01, 0x62, 0x61, 0x1c, 0x41, 0x62, 0x84, 0x62, + 0x04, 0x1c, 0x50, 0x34, 0x06, 0xe0, 0x00, 0x29, + 0x0f, 0xd1, 0x3c, 0x20, 0x50, 0x43, 0x25, 0x70, + 0x04, 0x19, 0x04, 0x34, 0x00, 0x2c, 0x08, 0xd0, + 0x20, 0x68, 0x00, 0x28, 0x02, 0xd0, 0x20, 0x21, + 0x3c, 0x00, 0x20, 0x76, 0x00, 0x00, 0xf8, 0xf7, + 0x18, 0xff, 0xa5, 0x80, 0x07, 0x20, 0xa0, 0x71, + 0xb0, 0xbd, 0x68, 0x61, 0x01, 0x00, 0x70, 0xb5, + 0x04, 0x1c, 0x00, 0x21, 0x01, 0xf0, 0x41, 0xfc, + 0x60, 0x68, 0x00, 0x28, 0x01, 0xd0, 0x21, 0x68, + 0x01, 0x60, 0x20, 0x68, 0x00, 0x28, 0x01, 0xd0, + 0x61, 0x68, 0x41, 0x60, 0x12, 0x4e, 0x70, 0x68, + 0xa0, 0x42, 0x01, 0xd1, 0x60, 0x68, 0x70, 0x60, + 0xe0, 0x68, 0x3c, 0x00, 0x5c, 0x76, 0x00, 0x00, + 0x00, 0x28, 0x0b, 0xd0, 0x00, 0x25, 0x06, 0xe0, + 0xe0, 0x68, 0xe9, 0x00, 0x41, 0x18, 0x14, 0x20, + 0x0b, 0xf0, 0xe2, 0xff, 0x01, 0x35, 0x30, 0x88, + 0x85, 0x42, 0xf5, 0xdb, 0x06, 0x21, 0x20, 0x1c, + 0x44, 0x30, 0xf8, 0xf7, 0xe9, 0xfe, 0x20, 0x6b, + 0x00, 0x28, 0x01, 0xd0, 0xf9, 0xf7, 0x86, 0xff, + 0xe0, 0x69, 0x00, 0x28, 0x01, 0xd0, 0xfa, 0xf7, + 0xaf, 0xf8, 0x70, 0xbd, 0x3c, 0x00, 0x98, 0x76, + 0x00, 0x00, 0x58, 0x75, 0x01, 0x00, 0xf0, 0xb5, + 0x1d, 0x4f, 0x05, 0x9d, 0x3f, 0x68, 0x01, 0x26, + 0x1c, 0x1c, 0x33, 0x1c, 0x00, 0x2f, 0x00, 0xd0, + 0x2b, 0x1c, 0x1d, 0x06, 0x2d, 0x0e, 0x00, 0x29, + 0x06, 0xd0, 0x11, 0x78, 0x0e, 0x23, 0x16, 0x4f, + 0x09, 0x18, 0x09, 0x7a, 0x6b, 0x43, 0x10, 0xe0, + 0x21, 0x78, 0x00, 0x29, 0x13, 0xd0, 0xff, 0x31, + 0x0d, 0xe0, 0x01, 0x29, 0x01, 0xd9, 0x3c, 0x00, + 0xd4, 0x76, 0x00, 0x00, 0x01, 0x31, 0x11, 0x70, + 0x11, 0x78, 0x0e, 0x23, 0x0f, 0x4f, 0x49, 0x08, + 0x11, 0x70, 0x09, 0x18, 0x09, 0x7a, 0x6b, 0x43, + 0xdb, 0x19, 0x59, 0x5c, 0x21, 0x70, 0x21, 0x78, + 0x00, 0x29, 0x02, 0xd1, 0x11, 0x78, 0x00, 0x29, + 0xea, 0xd1, 0x09, 0x48, 0xc0, 0x68, 0x00, 0x28, + 0x05, 0xd0, 0x21, 0x78, 0x30, 0x1c, 0x00, 0x29, + 0x00, 0xd1, 0x00, 0x20, 0xf0, 0xbd, 0x01, 0x20, + 0x3c, 0x00, 0x10, 0x77, 0x00, 0x00, 0xf0, 0xbd, + 0x00, 0x00, 0x18, 0x67, 0x01, 0x00, 0x24, 0x67, + 0x01, 0x00, 0x5c, 0x67, 0x01, 0x00, 0xac, 0x7c, + 0x01, 0x00, 0x84, 0x46, 0x00, 0x20, 0xf0, 0xb5, + 0x00, 0x29, 0x09, 0xd0, 0x11, 0x78, 0x1a, 0x4e, + 0xb1, 0x70, 0x19, 0x4e, 0xb1, 0x78, 0x71, 0x70, + 0x31, 0x70, 0x01, 0x21, 0x31, 0x61, 0x27, 0xe0, + 0x16, 0x4e, 0x01, 0x23, 0xf1, 0x56, 0x63, 0x46, + 0x5f, 0x68, 0x3c, 0x00, 0x4c, 0x77, 0x00, 0x00, + 0x00, 0x23, 0xf6, 0x56, 0x01, 0x25, 0xcc, 0x0f, + 0xb7, 0x42, 0x00, 0xd9, 0x00, 0x25, 0x00, 0x2c, + 0x01, 0xd0, 0x00, 0x2d, 0xe8, 0xd1, 0x0e, 0x4f, + 0x3b, 0x69, 0x00, 0x2b, 0x03, 0xd0, 0x00, 0x2d, + 0x01, 0xd1, 0x16, 0x70, 0x02, 0xe0, 0x1c, 0x43, + 0x01, 0xd1, 0x11, 0x70, 0x01, 0x20, 0x01, 0x24, + 0x00, 0x2b, 0x00, 0xd0, 0x00, 0x24, 0x3c, 0x61, + 0x00, 0x2c, 0x02, 0xd0, 0x3c, 0x00, 0x88, 0x77, + 0x00, 0x00, 0x71, 0x1c, 0x39, 0x70, 0x01, 0xe0, + 0xff, 0x31, 0x79, 0x70, 0x00, 0x28, 0xd5, 0xd0, + 0x01, 0x20, 0xf0, 0xbd, 0x00, 0x00, 0xac, 0x7c, + 0x01, 0x00, 0x90, 0xb5, 0x0a, 0x4c, 0x00, 0x20, + 0x93, 0xb0, 0x20, 0x61, 0x03, 0x90, 0x68, 0x46, + 0x00, 0x21, 0x08, 0xf0, 0x84, 0xfd, 0x20, 0x7a, + 0x02, 0x28, 0x01, 0xd1, 0xe0, 0x6b, 0x00, 0xe0, + 0x20, 0x6c, 0xe0, 0x61, 0x01, 0x20, 0x3c, 0x00, + 0xc4, 0x77, 0x00, 0x00, 0x08, 0xf0, 0x8a, 0xfd, + 0x13, 0xb0, 0x90, 0xbd, 0xf4, 0x6e, 0x01, 0x00, + 0xf7, 0xb5, 0x05, 0x1c, 0x88, 0x88, 0x0c, 0x1c, + 0x82, 0xb0, 0x1f, 0x4f, 0x00, 0x28, 0x00, 0xd1, + 0x00, 0x27, 0x04, 0x98, 0x00, 0x28, 0x01, 0xd1, + 0xf9, 0xf7, 0x8a, 0xfd, 0x1b, 0x48, 0x3b, 0x1c, + 0x00, 0x68, 0x21, 0x1c, 0x02, 0x68, 0x28, 0x1c, + 0x00, 0x92, 0x04, 0x9a, 0xfe, 0xf7, 0x3c, 0xf8, + 0x3c, 0x00, 0x00, 0x78, 0x00, 0x00, 0x06, 0x1c, + 0x22, 0xd0, 0x03, 0x21, 0x04, 0x98, 0x02, 0xf0, + 0xb8, 0xff, 0x00, 0x28, 0x1b, 0xd0, 0x80, 0x78, + 0x01, 0x21, 0x03, 0xf0, 0xe4, 0xff, 0xa0, 0x88, + 0xa1, 0x8e, 0x48, 0x43, 0x00, 0x04, 0x0f, 0x49, + 0x00, 0x0c, 0x08, 0x80, 0x03, 0xf0, 0x81, 0xf9, + 0x01, 0x22, 0x00, 0x2d, 0x00, 0xd1, 0x00, 0x22, + 0x01, 0x1c, 0x0e, 0x20, 0x0b, 0xf0, 0xc9, 0xfe, + 0x00, 0x2f, 0x3c, 0x00, 0x3c, 0x78, 0x00, 0x00, + 0x08, 0xd1, 0x00, 0x21, 0x28, 0x1c, 0x02, 0xf0, + 0xbd, 0xfc, 0x03, 0xe0, 0x00, 0x26, 0x28, 0x1c, + 0x00, 0xf0, 0x0a, 0xf8, 0x30, 0x1c, 0x05, 0xb0, + 0xf0, 0xbd, 0x00, 0x00, 0xc1, 0xa1, 0x00, 0x00, + 0xe4, 0x65, 0x01, 0x00, 0xa8, 0x7c, 0x01, 0x00, + 0x10, 0xb5, 0x04, 0x1c, 0xfe, 0xf7, 0x38, 0xf8, + 0x01, 0x21, 0x00, 0x2c, 0x00, 0xd1, 0x00, 0x21, + 0x0e, 0x20, 0x0b, 0xf0, 0x3c, 0x00, 0x78, 0x78, + 0x00, 0x00, 0xdd, 0xfe, 0x10, 0xbd, 0xf8, 0xb5, + 0x07, 0x1c, 0x0b, 0xf0, 0x94, 0xfa, 0xfd, 0xf7, + 0xbc, 0xfe, 0x00, 0x26, 0x02, 0x28, 0x1e, 0x4d, + 0x01, 0xd0, 0x2e, 0x70, 0xf8, 0xbd, 0xfd, 0xf7, + 0x3e, 0xf8, 0x04, 0x1c, 0xf9, 0xf7, 0x59, 0xfc, + 0x00, 0x28, 0x14, 0xd0, 0xfd, 0xf7, 0x77, 0xf8, + 0x00, 0x28, 0x10, 0xd0, 0x02, 0xf0, 0xf9, 0xfb, + 0x00, 0x28, 0x01, 0xd0, 0x00, 0x24, 0x3c, 0x00, + 0xb4, 0x78, 0x00, 0x00, 0x00, 0xe0, 0x15, 0x4c, + 0x33, 0x1c, 0x21, 0x1c, 0x07, 0x22, 0x16, 0x20, + 0x0b, 0xf0, 0x66, 0xff, 0x68, 0x78, 0x80, 0x21, + 0x08, 0x43, 0x68, 0x70, 0x02, 0xf0, 0x0a, 0xfc, + 0x00, 0x28, 0xde, 0xd1, 0x28, 0x78, 0x80, 0x07, + 0xdb, 0xd4, 0xfd, 0xf7, 0x23, 0xf9, 0x00, 0x28, + 0x05, 0xd1, 0x28, 0x78, 0xc0, 0x07, 0x02, 0xd5, + 0xfd, 0xf7, 0x42, 0xf8, 0xd1, 0xe7, 0x02, 0xf0, + 0x3c, 0x00, 0xf0, 0x78, 0x00, 0x00, 0xcd, 0xfb, + 0x00, 0x28, 0xcd, 0xd0, 0x28, 0x78, 0x02, 0x21, + 0x08, 0x43, 0x28, 0x70, 0x21, 0x1c, 0x38, 0x1c, + 0xfd, 0xf7, 0xc1, 0xf8, 0xc4, 0xe7, 0x60, 0x6c, + 0x01, 0x00, 0x71, 0x02, 0x00, 0x00, 0x10, 0xb5, + 0x12, 0x4c, 0x01, 0x20, 0x20, 0x70, 0xfe, 0xf7, + 0xf0, 0xf9, 0x01, 0x21, 0xa0, 0x68, 0xfb, 0xf7, + 0xf4, 0xfe, 0xa0, 0x68, 0x03, 0xf0, 0x87, 0xff, + 0x0d, 0x48, 0x3c, 0x00, 0x2c, 0x79, 0x00, 0x00, + 0xa1, 0x68, 0x07, 0xf0, 0x23, 0xfd, 0xfb, 0xf7, + 0x55, 0xff, 0xe0, 0x68, 0x00, 0x28, 0x0d, 0xd0, + 0x09, 0x49, 0x06, 0x20, 0x0a, 0xf0, 0x24, 0xfd, + 0x08, 0x49, 0x05, 0x20, 0x0a, 0xf0, 0x20, 0xfd, + 0xfb, 0xf7, 0x6e, 0xff, 0x00, 0x28, 0x01, 0xd0, + 0x05, 0xf0, 0xf8, 0xfc, 0x10, 0xbd, 0x00, 0x00, + 0x78, 0x69, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, + 0xe1, 0x35, 0x00, 0x00, 0x3c, 0x00, 0x68, 0x79, + 0x00, 0x00, 0xb1, 0x35, 0x00, 0x00, 0xf0, 0xb5, + 0x24, 0x4d, 0x23, 0x4c, 0x68, 0x7c, 0x20, 0x3c, + 0x9b, 0xb0, 0x00, 0x28, 0x08, 0xd0, 0x02, 0x28, + 0x03, 0xd8, 0x20, 0x89, 0x01, 0x38, 0x20, 0x81, + 0x37, 0xe0, 0x00, 0x27, 0x6f, 0x74, 0x34, 0xe0, + 0x1c, 0x4e, 0x68, 0x22, 0x14, 0x36, 0x31, 0x1c, + 0x0c, 0x31, 0x01, 0xa8, 0xf8, 0xf7, 0x09, 0xfe, + 0x18, 0x48, 0x33, 0x89, 0x01, 0x21, 0x3c, 0x00, + 0xa4, 0x79, 0x00, 0x00, 0x44, 0x30, 0x0a, 0x1c, + 0x00, 0x2b, 0x00, 0x7b, 0x00, 0xd1, 0x02, 0x1c, + 0x12, 0x06, 0x12, 0x0e, 0x0d, 0xaf, 0x3a, 0x70, + 0x94, 0x46, 0xaa, 0x7b, 0x93, 0x19, 0x30, 0x33, + 0x5b, 0x7b, 0x7b, 0x70, 0xea, 0x73, 0x01, 0x32, + 0x12, 0x06, 0x12, 0x0e, 0x00, 0x27, 0x82, 0x42, + 0xaa, 0x73, 0x01, 0xd3, 0xaf, 0x73, 0x04, 0xe0, + 0x62, 0x46, 0x01, 0x2a, 0x01, 0xd1, 0x77, 0x60, + 0x3c, 0x00, 0xe0, 0x79, 0x00, 0x00, 0x00, 0xe0, + 0x71, 0x60, 0x06, 0x48, 0x07, 0x4a, 0x80, 0x38, + 0x81, 0x67, 0x42, 0x67, 0x68, 0x22, 0x01, 0xa9, + 0xf8, 0xf7, 0xdd, 0xfd, 0x27, 0x81, 0x08, 0xf0, + 0x12, 0xfd, 0x1b, 0xb0, 0xf0, 0xbd, 0x84, 0x66, + 0x01, 0x00, 0xe9, 0x2e, 0x00, 0x00, 0xf1, 0xb5, + 0x86, 0xb0, 0x06, 0x99, 0x00, 0x20, 0x88, 0x61, + 0x06, 0x98, 0x84, 0x68, 0x80, 0x8d, 0x65, 0x68, + 0x01, 0x28, 0x3c, 0x00, 0x1c, 0x7a, 0x00, 0x00, + 0x4c, 0xd9, 0x35, 0x49, 0x49, 0x68, 0x05, 0x91, + 0x00, 0x29, 0x47, 0xd0, 0x00, 0x22, 0x00, 0x21, + 0x00, 0x23, 0x03, 0x90, 0x28, 0x1c, 0x96, 0x46, + 0x94, 0x46, 0x06, 0x68, 0x04, 0x96, 0xf2, 0x78, + 0x80, 0x26, 0xb2, 0x43, 0x3f, 0x2a, 0x2e, 0xd8, + 0xd7, 0x06, 0xff, 0x0e, 0x01, 0x26, 0xbe, 0x40, + 0x37, 0x1c, 0x04, 0x9e, 0x52, 0x09, 0xb6, 0x78, + 0x76, 0x00, 0xb2, 0x18, 0x3c, 0x00, 0x58, 0x7a, + 0x00, 0x00, 0x26, 0x4e, 0x92, 0x00, 0x1c, 0x36, + 0xb2, 0x58, 0x3a, 0x40, 0x1e, 0xd0, 0x03, 0xe0, + 0x02, 0x90, 0x02, 0x89, 0xc0, 0x68, 0x51, 0x18, + 0x00, 0x28, 0xf9, 0xd1, 0x05, 0x98, 0x81, 0x42, + 0x14, 0xd8, 0x70, 0x46, 0x01, 0x30, 0x86, 0x46, + 0x00, 0x2b, 0x04, 0xd0, 0x60, 0x46, 0xd8, 0x60, + 0x01, 0x98, 0x62, 0x46, 0xd0, 0x60, 0x03, 0x98, + 0x01, 0x38, 0x03, 0x90, 0x06, 0xd0, 0x3c, 0x00, + 0x94, 0x7a, 0x00, 0x00, 0x23, 0x1c, 0x24, 0x68, + 0x60, 0x68, 0x02, 0x9a, 0x01, 0x90, 0x94, 0x46, + 0xc9, 0xe7, 0x70, 0x46, 0x01, 0x28, 0x07, 0xd9, + 0x2a, 0x1c, 0x00, 0x21, 0x3f, 0x20, 0x01, 0xf0, + 0x51, 0xff, 0x05, 0x1c, 0x06, 0x98, 0x85, 0x61, + 0x28, 0x1c, 0x01, 0xf0, 0xb3, 0xff, 0x0e, 0x48, + 0x00, 0x68, 0x00, 0x28, 0x07, 0xd0, 0x28, 0x68, + 0x01, 0x88, 0x40, 0x79, 0x02, 0x31, 0x09, 0x1a, + 0x3c, 0x00, 0xd0, 0x7a, 0x00, 0x00, 0x28, 0x1c, + 0x01, 0xf0, 0xe5, 0xfc, 0xa2, 0x68, 0x06, 0x98, + 0xc0, 0x68, 0x06, 0x99, 0x0b, 0x69, 0x29, 0x1c, + 0xf8, 0xf7, 0x7c, 0xfc, 0x03, 0x49, 0x08, 0x69, + 0x01, 0x30, 0x08, 0x61, 0x07, 0xb0, 0xf0, 0xbd, + 0x00, 0x00, 0xfc, 0x5a, 0x01, 0x00, 0xcc, 0x5c, + 0x01, 0x00, 0x10, 0xb5, 0x09, 0x4a, 0x80, 0x00, + 0x12, 0x58, 0xd0, 0x06, 0xc0, 0x0e, 0x01, 0x30, + 0x07, 0x4b, 0x3c, 0x00, 0x0c, 0x7b, 0x00, 0x00, + 0x1c, 0x68, 0x00, 0x2c, 0xfc, 0xdb, 0x5a, 0x60, + 0x20, 0x22, 0x12, 0x1a, 0x91, 0x40, 0x19, 0x60, + 0x19, 0x68, 0x00, 0x29, 0xfc, 0xdb, 0x10, 0xbd, + 0xe8, 0x60, 0x01, 0x00, 0x30, 0x20, 0x07, 0x00, + 0xb0, 0xb5, 0x12, 0x4c, 0x00, 0x25, 0x25, 0x70, + 0xa1, 0x68, 0x11, 0x48, 0x07, 0xf0, 0x32, 0xfc, + 0x65, 0x61, 0xfb, 0xf7, 0xa3, 0xfe, 0xe0, 0x68, + 0x00, 0x28, 0x0d, 0xd0, 0x3c, 0x00, 0x48, 0x7b, + 0x00, 0x00, 0xfb, 0xf7, 0xa4, 0xfe, 0x01, 0x21, + 0x07, 0x20, 0x0b, 0xf0, 0x70, 0xfd, 0x0a, 0x49, + 0x06, 0x20, 0x0a, 0xf0, 0x4c, 0xfc, 0x09, 0x49, + 0x05, 0x20, 0x0a, 0xf0, 0x48, 0xfc, 0xa0, 0x68, + 0x03, 0xf0, 0x67, 0xfe, 0x00, 0x21, 0xa0, 0x68, + 0xfb, 0xf7, 0xcd, 0xfd, 0x05, 0xf0, 0xab, 0xfb, + 0xb0, 0xbd, 0x78, 0x69, 0x01, 0x00, 0x34, 0x63, + 0x01, 0x00, 0xe1, 0x35, 0x00, 0x00, 0x3c, 0x00, + 0x84, 0x7b, 0x00, 0x00, 0xb1, 0x35, 0x00, 0x00, + 0x10, 0xb5, 0x0f, 0x4c, 0x20, 0x7c, 0x00, 0x28, + 0x19, 0xd1, 0x60, 0x69, 0x00, 0x28, 0x16, 0xd1, + 0xe0, 0x68, 0x00, 0x28, 0x06, 0xd0, 0x0a, 0x48, + 0x1c, 0x38, 0xc0, 0x68, 0x00, 0x28, 0x01, 0xd0, + 0x05, 0xf0, 0xce, 0xfb, 0x01, 0x21, 0x07, 0x20, + 0x0b, 0xf0, 0x40, 0xfd, 0xa0, 0x68, 0x03, 0xf0, + 0x3f, 0xfe, 0x04, 0x48, 0xa1, 0x68, 0x07, 0xf0, + 0x3c, 0x00, 0xc0, 0x7b, 0x00, 0x00, 0xdb, 0xfb, + 0x01, 0x20, 0x20, 0x70, 0x10, 0xbd, 0x78, 0x69, + 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x70, 0xb5, + 0x0e, 0x4c, 0x01, 0x22, 0xa3, 0x68, 0xe5, 0x68, + 0x26, 0x8a, 0x5d, 0x1b, 0xb5, 0x42, 0x01, 0xd1, + 0x00, 0x22, 0x06, 0xe0, 0x25, 0x68, 0x01, 0x33, + 0x2e, 0x68, 0xa3, 0x60, 0x26, 0x60, 0x04, 0x35, + 0x03, 0xc5, 0x00, 0x2a, 0x04, 0xd1, 0x01, 0x21, + 0x9d, 0x20, 0x3c, 0x00, 0xfc, 0x7b, 0x00, 0x00, + 0xf9, 0xf7, 0x52, 0xfb, 0x70, 0xbd, 0x03, 0x49, + 0x02, 0x20, 0x08, 0x60, 0x70, 0xbd, 0x00, 0x00, + 0x44, 0xe3, 0x01, 0x00, 0x40, 0x20, 0x07, 0x00, + 0x80, 0xb5, 0x02, 0xf0, 0xb9, 0xf8, 0x80, 0xbd, + 0x80, 0xb5, 0x02, 0x21, 0x2d, 0x20, 0xf9, 0xf7, + 0x3f, 0xfb, 0x00, 0x20, 0x80, 0xbd, 0x00, 0x00, + 0x80, 0xb5, 0x02, 0x21, 0x2a, 0x20, 0xf9, 0xf7, + 0x37, 0xfb, 0x00, 0x20, 0x3c, 0x00, 0x38, 0x7c, + 0x00, 0x00, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, + 0x01, 0x21, 0x2b, 0x20, 0xf9, 0xf7, 0x2f, 0xfb, + 0x02, 0x20, 0x80, 0xbd, 0x00, 0x00, 0x01, 0x49, + 0x01, 0x20, 0x08, 0x61, 0x70, 0x47, 0x7c, 0x78, + 0x01, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x0c, 0x23, + 0x0f, 0x1c, 0x17, 0x49, 0x58, 0x43, 0x45, 0x18, + 0x6c, 0x68, 0x30, 0x1c, 0x0b, 0xf0, 0x3f, 0xfe, + 0x00, 0x2f, 0x09, 0xd1, 0x30, 0x1c, 0x3c, 0x00, + 0x74, 0x7c, 0x00, 0x00, 0x03, 0xf0, 0xee, 0xfe, + 0x41, 0x20, 0x07, 0x55, 0x11, 0x48, 0x21, 0x1c, + 0xff, 0xf7, 0xa6, 0xff, 0xf8, 0xbd, 0x41, 0x20, + 0x07, 0x55, 0xa0, 0x6b, 0x00, 0x28, 0x03, 0xd0, + 0x20, 0x1c, 0x00, 0xf0, 0xdf, 0xf9, 0xf5, 0xe7, + 0x20, 0x1c, 0x00, 0xf0, 0xdb, 0xf9, 0xac, 0x68, + 0x00, 0x2c, 0x02, 0xd0, 0x00, 0x20, 0xa8, 0x60, + 0xed, 0xe7, 0x30, 0x1c, 0x05, 0xf0, 0x34, 0xf9, + 0x3c, 0x00, 0xb0, 0x7c, 0x00, 0x00, 0x04, 0x1c, + 0xe8, 0xd1, 0x08, 0x21, 0x0c, 0x20, 0xf9, 0xf7, + 0xf4, 0xfa, 0xe3, 0xe7, 0x00, 0x00, 0x60, 0x7b, + 0x01, 0x00, 0x55, 0x80, 0x00, 0x00, 0x07, 0x4a, + 0x80, 0xb5, 0x50, 0x70, 0x51, 0x60, 0x12, 0x78, + 0x06, 0x4b, 0x80, 0x00, 0x52, 0x01, 0xd2, 0x18, + 0x10, 0x18, 0x40, 0x38, 0x02, 0x68, 0x08, 0x1c, + 0xf8, 0xf7, 0x7b, 0xfb, 0x80, 0xbd, 0x78, 0x69, + 0x01, 0x00, 0x3c, 0x00, 0xec, 0x7c, 0x00, 0x00, + 0xfc, 0x42, 0x01, 0x00, 0xb0, 0xb5, 0x0a, 0x49, + 0x04, 0x1c, 0xc8, 0x70, 0x08, 0x4d, 0xe4, 0x35, + 0xa8, 0x7a, 0x08, 0x71, 0x08, 0x2c, 0x01, 0xd3, + 0xf9, 0xf7, 0xfc, 0xfa, 0xa8, 0x7a, 0x05, 0x49, + 0x40, 0x01, 0x40, 0x18, 0xa1, 0x00, 0x40, 0x58, + 0xf8, 0xf7, 0x60, 0xfb, 0xb0, 0xbd, 0x00, 0x00, + 0x60, 0x6c, 0x01, 0x00, 0x80, 0x43, 0x01, 0x00, + 0x80, 0xb5, 0x00, 0x28, 0x3c, 0x00, 0x28, 0x7d, + 0x00, 0x00, 0x01, 0xd0, 0x09, 0xf0, 0x1d, 0xf9, + 0x80, 0xbd, 0xb0, 0xb5, 0x05, 0x1c, 0x0c, 0x1c, + 0x00, 0x20, 0x08, 0x60, 0x68, 0x68, 0x09, 0xf0, + 0x36, 0xfb, 0x6c, 0x60, 0xb0, 0xbd, 0x10, 0xb5, + 0x04, 0x1c, 0x09, 0xf0, 0x34, 0xfb, 0x21, 0x68, + 0x00, 0x29, 0x00, 0xd1, 0x64, 0x60, 0x10, 0xbd, + 0x00, 0x00, 0x00, 0x21, 0x01, 0x60, 0x40, 0x60, + 0x70, 0x47, 0xf8, 0xb5, 0x46, 0x68, 0x3c, 0x00, + 0x64, 0x7d, 0x00, 0x00, 0x04, 0x1c, 0x40, 0x6a, + 0x35, 0x1c, 0x0a, 0x35, 0x00, 0x28, 0x04, 0xd0, + 0x20, 0x1c, 0xf9, 0xf7, 0x89, 0xfd, 0x07, 0x1c, + 0x00, 0xe0, 0x04, 0x27, 0x29, 0x1c, 0x60, 0x69, + 0x00, 0xf0, 0xf6, 0xfc, 0x79, 0x00, 0x0f, 0x18, + 0xba, 0x88, 0xf1, 0x8a, 0x05, 0x1c, 0x8a, 0x42, + 0x05, 0xd1, 0x30, 0x88, 0x00, 0x05, 0x02, 0xd5, + 0x04, 0xf0, 0xbe, 0xfb, 0x3c, 0xe0, 0x28, 0x68, + 0x3c, 0x00, 0xa0, 0x7d, 0x00, 0x00, 0x00, 0x28, + 0x0f, 0xd0, 0x01, 0x32, 0x8a, 0x42, 0x04, 0xd1, + 0xf9, 0xf7, 0x0f, 0xfc, 0x21, 0x68, 0xc1, 0x60, + 0x0b, 0xe0, 0xf9, 0xf7, 0xf0, 0xfb, 0xf0, 0x8a, + 0x00, 0x07, 0x04, 0xd0, 0x00, 0x21, 0x29, 0x60, + 0x29, 0xe0, 0x08, 0x07, 0x27, 0xd1, 0x20, 0x68, + 0x28, 0x60, 0xf0, 0x8a, 0xb8, 0x80, 0x13, 0x48, + 0x01, 0x68, 0x01, 0x31, 0x01, 0x60, 0x31, 0x88, + 0x49, 0x05, 0x3c, 0x00, 0xdc, 0x7d, 0x00, 0x00, + 0x18, 0xd4, 0x29, 0x68, 0x21, 0x60, 0x00, 0x21, + 0x29, 0x60, 0xe1, 0x69, 0x00, 0x29, 0x0d, 0xd0, + 0x89, 0x79, 0x02, 0x29, 0x0a, 0xd1, 0x08, 0x21, + 0x21, 0x86, 0x21, 0x1c, 0x38, 0x31, 0xa1, 0x62, + 0x22, 0x1c, 0xdc, 0x30, 0x08, 0x49, 0x02, 0xf0, + 0x81, 0xf9, 0xf8, 0xbd, 0x20, 0x1c, 0x00, 0xf0, + 0x5f, 0xf8, 0xfa, 0xe7, 0x20, 0x1c, 0xf9, 0xf7, + 0xef, 0xfc, 0xf6, 0xe7, 0x3c, 0x00, 0x18, 0x7e, + 0x00, 0x00, 0x20, 0x68, 0xf9, 0xf7, 0xbd, 0xfb, + 0xf7, 0xe7, 0xc4, 0x69, 0x01, 0x00, 0xb9, 0x71, + 0x00, 0x00, 0xf8, 0xb5, 0x0f, 0x1c, 0x09, 0x78, + 0x01, 0x24, 0xc9, 0x07, 0x21, 0xd5, 0x02, 0xf0, + 0x8c, 0xff, 0x00, 0x28, 0x01, 0xd0, 0x00, 0x24, + 0x1b, 0xe0, 0x0e, 0x4e, 0x75, 0x6e, 0x00, 0x2d, + 0x17, 0xd0, 0x34, 0x6e, 0x06, 0x22, 0x31, 0x1c, + 0x38, 0x1c, 0xf8, 0xf7, 0xd4, 0xfa, 0x3c, 0x00, + 0x54, 0x7e, 0x00, 0x00, 0x00, 0x28, 0x05, 0xd1, + 0x01, 0x20, 0x00, 0x2c, 0x00, 0xd0, 0x00, 0x20, + 0x04, 0x1c, 0x03, 0xe0, 0x01, 0x3d, 0x06, 0x36, + 0x00, 0x2d, 0xee, 0xd1, 0x00, 0x2c, 0x03, 0xd1, + 0x02, 0x4e, 0xb0, 0x6e, 0x01, 0x30, 0xb0, 0x66, + 0x20, 0x1c, 0xf8, 0xbd, 0x10, 0x79, 0x01, 0x00, + 0x30, 0xb5, 0x05, 0x1c, 0x00, 0x20, 0x06, 0x49, + 0x00, 0x22, 0x1c, 0x23, 0xcc, 0x56, 0xac, 0x42, + 0x3c, 0x00, 0x90, 0x7e, 0x00, 0x00, 0x01, 0xd1, + 0x08, 0x1c, 0x30, 0xbd, 0x01, 0x32, 0x48, 0x31, + 0x01, 0x2a, 0xf5, 0xd3, 0x30, 0xbd, 0xcc, 0x6d, + 0x01, 0x00, 0x10, 0xb5, 0x08, 0x4c, 0x00, 0x22, + 0x1c, 0x23, 0x53, 0x43, 0xe3, 0x58, 0x83, 0x42, + 0x04, 0xd1, 0x1c, 0x20, 0x50, 0x43, 0x00, 0x19, + 0x0a, 0x60, 0x10, 0xbd, 0x01, 0x32, 0x0e, 0x2a, + 0xf2, 0xd3, 0x00, 0x20, 0x10, 0xbd, 0xdc, 0x71, + 0x01, 0x00, 0x3c, 0x00, 0xcc, 0x7e, 0x00, 0x00, + 0xf0, 0xb5, 0x41, 0x68, 0x95, 0xb0, 0x07, 0x1c, + 0x90, 0x37, 0x13, 0x91, 0x04, 0x1c, 0xf8, 0x78, + 0x25, 0x1c, 0x80, 0x35, 0xc6, 0x07, 0x28, 0x79, + 0xf6, 0x0f, 0x4a, 0x49, 0x02, 0x28, 0x4d, 0xd1, + 0x0a, 0x6d, 0x00, 0x2a, 0x4a, 0xd0, 0x48, 0x68, + 0x01, 0x30, 0x48, 0x60, 0x0a, 0xf0, 0x58, 0xff, + 0x44, 0x49, 0x08, 0x61, 0x48, 0x61, 0x13, 0x99, + 0x09, 0x79, 0xc9, 0x07, 0x3c, 0x00, 0x08, 0x7f, + 0x00, 0x00, 0x01, 0xd4, 0x41, 0x49, 0x88, 0x61, + 0x20, 0x68, 0x06, 0x22, 0x06, 0x90, 0xa1, 0x68, + 0x03, 0xa8, 0xf8, 0xf7, 0xee, 0xfa, 0x06, 0x22, + 0x04, 0xa8, 0x02, 0x30, 0xe1, 0x68, 0xf8, 0xf7, + 0xe8, 0xfa, 0x07, 0xa8, 0x06, 0x22, 0x21, 0x69, + 0xf8, 0xf7, 0xe3, 0xfa, 0xb8, 0x78, 0x08, 0xab, + 0x00, 0x21, 0x98, 0x70, 0x0c, 0x96, 0x63, 0x6a, + 0x20, 0x1c, 0xa0, 0x30, 0x0a, 0x1c, 0x3c, 0x00, + 0x44, 0x7f, 0x00, 0x00, 0x00, 0x2b, 0x02, 0xd0, + 0x02, 0x8a, 0x52, 0x07, 0x52, 0x0f, 0x08, 0xab, + 0xda, 0x70, 0x00, 0xab, 0x99, 0x84, 0x13, 0x99, + 0x09, 0x88, 0xc9, 0x0b, 0xd9, 0x84, 0x69, 0x6b, + 0x10, 0xab, 0x10, 0x91, 0xa9, 0x6b, 0x11, 0x91, + 0x80, 0x8b, 0x29, 0x49, 0x18, 0x81, 0x09, 0x6d, + 0x03, 0xa8, 0xf8, 0xf7, 0x32, 0xfa, 0x29, 0x79, + 0x68, 0x6b, 0x0b, 0xf0, 0x4d, 0xfd, 0x29, 0x79, + 0x3c, 0x00, 0x80, 0x7f, 0x00, 0x00, 0xa8, 0x6b, + 0x0b, 0xf0, 0x67, 0xfd, 0x3d, 0xe0, 0x00, 0x28, + 0x38, 0xd1, 0x48, 0x6d, 0x14, 0x90, 0x00, 0x28, + 0x34, 0xd0, 0x20, 0x68, 0x06, 0x22, 0x03, 0x90, + 0xa1, 0x68, 0x68, 0x46, 0xf8, 0xf7, 0xab, 0xfa, + 0x06, 0x22, 0x68, 0x46, 0x80, 0x18, 0xe1, 0x68, + 0xf8, 0xf7, 0xa5, 0xfa, 0x05, 0xa8, 0x06, 0x22, + 0x21, 0x69, 0xf8, 0xf7, 0xa0, 0xfa, 0x00, 0x21, + 0x04, 0x91, 0x3c, 0x00, 0xbc, 0x7f, 0x00, 0x00, + 0xb9, 0x78, 0x08, 0xa8, 0x10, 0xab, 0x01, 0x72, + 0x08, 0x96, 0xe9, 0x68, 0x0b, 0x91, 0x69, 0x79, + 0x41, 0x72, 0x68, 0x6b, 0x0e, 0x90, 0xa8, 0x6b, + 0x10, 0x90, 0x28, 0x8d, 0xd8, 0x80, 0x68, 0x8d, + 0x18, 0x81, 0xe1, 0x69, 0x0c, 0xa8, 0x00, 0x29, + 0x04, 0xd0, 0x89, 0x79, 0x01, 0x70, 0x20, 0x6a, + 0x0d, 0x90, 0x01, 0xe0, 0x07, 0x21, 0x01, 0x70, + 0x68, 0x46, 0x14, 0x99, 0x3c, 0x00, 0xf8, 0x7f, + 0x00, 0x00, 0xf8, 0xf7, 0xef, 0xf9, 0x02, 0xe0, + 0x20, 0x68, 0xf9, 0xf7, 0xca, 0xfa, 0x20, 0x1c, + 0xf9, 0xf7, 0xf5, 0xfb, 0x15, 0xb0, 0xf0, 0xbd, + 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0xb0, 0xb5, + 0x04, 0x1c, 0xc0, 0x68, 0x06, 0x22, 0x01, 0x89, + 0x0c, 0x31, 0x01, 0x81, 0x05, 0x68, 0x21, 0x1c, + 0x0c, 0x3d, 0x05, 0x60, 0xa8, 0x18, 0xf8, 0xf7, + 0x64, 0xfa, 0x06, 0x22, 0xa1, 0x18, 0x3c, 0x00, + 0x34, 0x80, 0x00, 0x00, 0x28, 0x1c, 0xf8, 0xf7, + 0x5f, 0xfa, 0xa0, 0x8f, 0x00, 0x09, 0xe0, 0x62, + 0x20, 0x63, 0x03, 0x48, 0x01, 0x69, 0x20, 0x1c, + 0xf8, 0xf7, 0xc7, 0xf9, 0xb0, 0xbd, 0x00, 0x00, + 0x7c, 0x79, 0x01, 0x00, 0xf8, 0xb5, 0x06, 0x1c, + 0x60, 0x36, 0x05, 0x1c, 0x70, 0x7a, 0x0c, 0x23, + 0x25, 0x49, 0x58, 0x43, 0x44, 0x18, 0xa8, 0x6b, + 0x00, 0x27, 0x00, 0x28, 0x06, 0xd0, 0xa0, 0x78, + 0x3c, 0x00, 0x70, 0x80, 0x00, 0x00, 0x01, 0x28, + 0x03, 0xd1, 0xa7, 0x70, 0x70, 0x7a, 0x0a, 0xf0, + 0xb6, 0xfd, 0x2a, 0x1c, 0x0c, 0x21, 0x80, 0x20, + 0x0b, 0xf0, 0x95, 0xfb, 0xa8, 0x6b, 0x00, 0x28, + 0x33, 0xd0, 0xa0, 0x78, 0x02, 0x28, 0x0b, 0xd0, + 0x04, 0x28, 0x22, 0xd1, 0xa7, 0x70, 0x2f, 0x1c, + 0x40, 0x37, 0x78, 0x78, 0x02, 0x28, 0x0c, 0xd1, + 0x70, 0x7a, 0x0a, 0xf0, 0xa0, 0xfd, 0x18, 0xe0, + 0x03, 0x20, 0x3c, 0x00, 0xac, 0x80, 0x00, 0x00, + 0xa0, 0x70, 0x12, 0x49, 0x00, 0x20, 0x14, 0x39, + 0x09, 0x69, 0xf8, 0xf7, 0x90, 0xf9, 0x0f, 0xe0, + 0x2c, 0x1c, 0x07, 0xe0, 0x78, 0x78, 0x41, 0x21, + 0x22, 0x1c, 0x08, 0x55, 0x0c, 0x21, 0x80, 0x20, + 0x0b, 0xf0, 0x70, 0xfb, 0x60, 0x34, 0x60, 0x7a, + 0x04, 0xf0, 0x20, 0xff, 0x04, 0x1c, 0xf1, 0xd1, + 0x70, 0x7a, 0x40, 0x35, 0xa9, 0x8b, 0x00, 0x02, + 0x09, 0x09, 0x09, 0x04, 0x3c, 0x00, 0xe8, 0x80, + 0x00, 0x00, 0x08, 0x43, 0x81, 0x21, 0x01, 0x43, + 0x0c, 0x20, 0x0b, 0xf0, 0xa0, 0xfa, 0xf8, 0xbd, + 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, 0xf8, 0xb5, + 0x1c, 0x49, 0x05, 0x1c, 0x88, 0x6a, 0x01, 0x30, + 0x88, 0x62, 0x28, 0x1c, 0x0b, 0xf0, 0x7d, 0xfd, + 0x04, 0x1c, 0x11, 0xd0, 0x2b, 0x1c, 0x20, 0x33, + 0x1e, 0x1c, 0x5a, 0x79, 0x20, 0x1c, 0xb4, 0x30, + 0x19, 0x79, 0x14, 0x4f, 0xfd, 0xf7, 0x3c, 0x00, + 0x24, 0x81, 0x00, 0x00, 0x89, 0xf8, 0xaa, 0x7a, + 0x20, 0x1c, 0xb8, 0x30, 0xb1, 0x79, 0xfd, 0xf7, + 0xb9, 0xf8, 0x00, 0x2f, 0x04, 0xd1, 0x01, 0x21, + 0x28, 0x68, 0xfa, 0xf7, 0x6d, 0xfa, 0xf8, 0xbd, + 0x60, 0x68, 0xbc, 0x21, 0xc0, 0x8a, 0x08, 0x53, + 0x28, 0x68, 0x00, 0x21, 0xfa, 0xf7, 0x64, 0xfa, + 0x00, 0x28, 0x09, 0xd0, 0x06, 0x49, 0xc8, 0x6a, + 0x01, 0x30, 0xc8, 0x62, 0x00, 0x2c, 0xee, 0xd0, + 0x3c, 0x00, 0x60, 0x81, 0x00, 0x00, 0x20, 0x1c, + 0xf9, 0xf7, 0x47, 0xfb, 0xea, 0xe7, 0x20, 0x1c, + 0xf8, 0xf7, 0x3c, 0xf9, 0xe6, 0xe7, 0xc4, 0x69, + 0x01, 0x00, 0xa1, 0xff, 0x00, 0x00, 0xf8, 0xb5, + 0x16, 0x4c, 0x05, 0x1f, 0x00, 0x22, 0x21, 0x1c, + 0xa0, 0x31, 0x03, 0xe0, 0x28, 0x68, 0xa0, 0x42, + 0x09, 0xd0, 0x20, 0x34, 0xa1, 0x42, 0xf9, 0xd1, + 0x00, 0x2a, 0x04, 0xd1, 0x02, 0x21, 0x8e, 0x20, + 0xf9, 0xf7, 0x3c, 0x00, 0x9c, 0x81, 0x00, 0x00, + 0x83, 0xf8, 0xf8, 0xbd, 0x0d, 0x4f, 0xbe, 0x79, + 0x60, 0x69, 0x01, 0x30, 0x60, 0x61, 0xf8, 0xf7, + 0x97, 0xfd, 0xa8, 0x42, 0x07, 0xd1, 0xa0, 0x88, + 0x04, 0x30, 0xf8, 0xf7, 0x97, 0xfd, 0xe0, 0x69, + 0x01, 0x30, 0xe0, 0x61, 0x05, 0xe0, 0x20, 0x68, + 0x28, 0x60, 0x25, 0x60, 0xa0, 0x69, 0x01, 0x30, + 0xa0, 0x61, 0xbe, 0x71, 0xe5, 0xe7, 0x00, 0x00, + 0xd0, 0x5c, 0x01, 0x00, 0x3c, 0x00, 0xd8, 0x81, + 0x00, 0x00, 0x20, 0x10, 0x07, 0x00, 0x00, 0x29, + 0x01, 0xdb, 0x06, 0x29, 0x01, 0xdb, 0x02, 0x20, + 0x70, 0x47, 0x06, 0x4b, 0xc9, 0x00, 0x5a, 0x5c, + 0xc9, 0x18, 0x02, 0x70, 0x4a, 0x78, 0x42, 0x70, + 0x8a, 0x78, 0x82, 0x70, 0x49, 0x68, 0x41, 0x60, + 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0xcc, 0x5a, + 0x01, 0x00, 0xb0, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, + 0x05, 0x28, 0x01, 0xd3, 0xf9, 0xf7, 0x3c, 0x00, + 0x14, 0x82, 0x00, 0x00, 0x75, 0xf8, 0x10, 0x48, + 0x40, 0x68, 0x00, 0x28, 0x00, 0xd0, 0x03, 0x24, + 0x10, 0x2d, 0x00, 0xd3, 0x0f, 0x25, 0x06, 0x20, + 0x0b, 0x49, 0x60, 0x43, 0x12, 0x31, 0x40, 0x18, + 0x41, 0x78, 0x80, 0x78, 0x49, 0x19, 0x09, 0x06, + 0x09, 0x0e, 0x88, 0x42, 0x00, 0xd2, 0x01, 0x1c, + 0x01, 0x20, 0x88, 0x40, 0x05, 0x49, 0x01, 0x38, + 0x09, 0x68, 0x08, 0x40, 0x00, 0x04, 0x00, 0x0c, + 0x3c, 0x00, 0x50, 0x82, 0x00, 0x00, 0x02, 0xf0, + 0x44, 0xfe, 0xb0, 0xbd, 0x00, 0x00, 0xd4, 0x7a, + 0x01, 0x00, 0x08, 0x20, 0x07, 0x00, 0xb0, 0xb5, + 0x04, 0x1c, 0x0d, 0x1c, 0x09, 0xf0, 0xcf, 0xfd, + 0x00, 0x28, 0x03, 0xd1, 0x20, 0x1c, 0x09, 0xf0, + 0x82, 0xfd, 0x05, 0x61, 0xb0, 0xbd, 0x80, 0xb5, + 0x0a, 0xf0, 0x97, 0xfd, 0x03, 0x4a, 0x0c, 0x32, + 0x06, 0xca, 0x89, 0x18, 0x08, 0x1a, 0x80, 0xbd, + 0x00, 0x00, 0x3c, 0x00, 0x8c, 0x82, 0x00, 0x00, + 0xa0, 0x7d, 0x01, 0x00, 0x70, 0xb5, 0x0b, 0x4c, + 0x04, 0x9e, 0x64, 0x68, 0x0d, 0xe0, 0x65, 0x68, + 0x85, 0x42, 0x09, 0xd1, 0x20, 0x7a, 0x08, 0x70, + 0xe0, 0x68, 0x10, 0x60, 0x20, 0x69, 0x18, 0x60, + 0x20, 0x7d, 0x30, 0x80, 0x01, 0x20, 0x70, 0xbd, + 0x24, 0x68, 0x00, 0x2c, 0xef, 0xd1, 0x00, 0x20, + 0x70, 0xbd, 0x00, 0x00, 0xa4, 0x6e, 0x01, 0x00, + 0x10, 0xb5, 0x04, 0x1c, 0x3c, 0x00, 0xc8, 0x82, + 0x00, 0x00, 0x20, 0x30, 0x81, 0x7b, 0x20, 0x69, + 0x04, 0x30, 0xfd, 0xf7, 0x64, 0xf9, 0x01, 0x1c, + 0x62, 0x20, 0x02, 0x5b, 0x63, 0x6a, 0x40, 0x34, + 0x20, 0x78, 0x02, 0xf0, 0xce, 0xfd, 0x10, 0xbd, + 0x00, 0x00, 0x0b, 0x49, 0x10, 0xb5, 0x08, 0x88, + 0x8a, 0x69, 0x0a, 0x23, 0x50, 0x43, 0x58, 0x43, + 0x0e, 0xd0, 0x08, 0x4a, 0x53, 0x89, 0x94, 0x88, + 0xd2, 0x88, 0x1b, 0x19, 0x52, 0x04, 0x3c, 0x00, + 0x04, 0x83, 0x00, 0x00, 0x52, 0x0c, 0x9a, 0x18, + 0xc9, 0x68, 0x06, 0x32, 0x4a, 0x43, 0x0a, 0x21, + 0x51, 0x43, 0xf8, 0xf7, 0xfd, 0xf9, 0x10, 0xbd, + 0xc8, 0x74, 0x01, 0x00, 0x30, 0x00, 0x07, 0x00, + 0x10, 0xb5, 0x43, 0x1c, 0x01, 0xd1, 0x10, 0x48, + 0x10, 0xbd, 0x0f, 0x4a, 0x0e, 0x4b, 0x94, 0x3a, + 0x12, 0x68, 0x44, 0x3b, 0x1b, 0x7a, 0x10, 0xe0, + 0x54, 0x68, 0x84, 0x42, 0x0c, 0xd1, 0x00, 0x29, + 0x3c, 0x00, 0x40, 0x83, 0x00, 0x00, 0x0f, 0xd1, + 0x02, 0x2b, 0x03, 0xd1, 0xd4, 0x7b, 0x02, 0x2c, + 0x0a, 0xd2, 0x04, 0xe0, 0x00, 0x2b, 0x05, 0xd1, + 0xd4, 0x7b, 0xe4, 0x07, 0x04, 0xd4, 0x12, 0x68, + 0x00, 0x2a, 0xec, 0xd1, 0x00, 0x20, 0x10, 0xbd, + 0x10, 0x1c, 0x10, 0xbd, 0x00, 0x00, 0x38, 0x6f, + 0x01, 0x00, 0x01, 0x1c, 0x01, 0x20, 0x01, 0x29, + 0x00, 0xd0, 0x00, 0x20, 0x70, 0x47, 0x00, 0xb5, + 0x02, 0x1c, 0x3c, 0x00, 0x7c, 0x83, 0x00, 0x00, + 0xfd, 0xf7, 0xce, 0xf8, 0x00, 0x28, 0x08, 0xd0, + 0x10, 0x1c, 0xff, 0xf7, 0xf1, 0xff, 0x18, 0x23, + 0x03, 0x49, 0x58, 0x43, 0x40, 0x18, 0x00, 0x69, + 0x00, 0xbd, 0x00, 0x20, 0x00, 0xbd, 0x00, 0x00, + 0x94, 0x67, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x28, + 0x00, 0xd1, 0x08, 0x48, 0x07, 0x49, 0x00, 0x68, + 0x50, 0x31, 0x09, 0x7a, 0x00, 0x29, 0x02, 0xd0, + 0x02, 0x29, 0x04, 0xd1, 0x3c, 0x00, 0xb8, 0x83, + 0x00, 0x00, 0x00, 0xe0, 0x01, 0x21, 0x00, 0xf0, + 0x06, 0xf8, 0x80, 0xbd, 0x00, 0x20, 0x80, 0xbd, + 0x00, 0x00, 0xa4, 0x6e, 0x01, 0x00, 0x12, 0x4a, + 0x12, 0x4b, 0x12, 0x7a, 0x2c, 0x3b, 0x00, 0x2a, + 0x03, 0xd1, 0x5a, 0x68, 0x00, 0x2a, 0x18, 0xd1, + 0x04, 0xe0, 0x02, 0x2a, 0x02, 0xd1, 0x9a, 0x68, + 0x00, 0x2a, 0x12, 0xd1, 0x00, 0x20, 0x70, 0x47, + 0xc2, 0x7b, 0x8a, 0x42, 0x01, 0xd0, 0x3c, 0x00, + 0xf4, 0x83, 0x00, 0x00, 0x03, 0x2a, 0x0a, 0xd1, + 0x82, 0x7e, 0x01, 0x2a, 0x07, 0xd1, 0x02, 0x7f, + 0x01, 0x32, 0x12, 0x06, 0x12, 0x0e, 0x02, 0x77, + 0xc3, 0x7e, 0x9a, 0x42, 0xee, 0xd2, 0x00, 0x68, + 0x00, 0x28, 0xec, 0xd1, 0x70, 0x47, 0x00, 0x00, + 0xf4, 0x6e, 0x01, 0x00, 0xf7, 0xb5, 0x84, 0x46, + 0x00, 0x20, 0x01, 0x27, 0x00, 0x24, 0x00, 0x25, + 0x88, 0xb0, 0x07, 0xe0, 0x62, 0x46, 0x52, 0x5d, + 0x3c, 0x00, 0x30, 0x84, 0x00, 0x00, 0x00, 0x2a, + 0x05, 0xd0, 0xab, 0x00, 0x6e, 0x46, 0xf2, 0x50, + 0x01, 0x35, 0x8d, 0x42, 0xf5, 0xd3, 0x00, 0x2d, + 0x00, 0xd0, 0x01, 0x20, 0x00, 0x28, 0x28, 0xd0, + 0x00, 0x27, 0x16, 0x4c, 0x6e, 0x46, 0x22, 0xe0, + 0x20, 0x1c, 0x00, 0xf0, 0x30, 0xf8, 0x01, 0x28, + 0x01, 0xd0, 0x07, 0x28, 0x06, 0xd1, 0x00, 0x21, + 0x20, 0x1c, 0x00, 0xf0, 0x34, 0xf8, 0x31, 0x68, + 0x88, 0x42, 0x3c, 0x00, 0x6c, 0x84, 0x00, 0x00, + 0x01, 0xd2, 0x02, 0x27, 0x14, 0xe0, 0x20, 0x68, + 0xc9, 0x00, 0x0c, 0x18, 0x08, 0x3c, 0x20, 0x1c, + 0x00, 0xf0, 0x1c, 0xf8, 0x07, 0x28, 0x07, 0xd1, + 0x01, 0x20, 0x01, 0x2d, 0x00, 0xd0, 0x00, 0x20, + 0x24, 0x68, 0x00, 0x28, 0x00, 0xd1, 0x08, 0x34, + 0x01, 0x3d, 0x04, 0x36, 0x00, 0x2d, 0xda, 0xd1, + 0x0a, 0x98, 0x04, 0x60, 0x0b, 0xb0, 0x38, 0x1c, + 0xf0, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0x84, + 0x00, 0x00, 0x20, 0x52, 0x01, 0x00, 0x00, 0x68, + 0x00, 0x29, 0x01, 0xd0, 0x80, 0x02, 0x80, 0x0a, + 0x70, 0x47, 0x10, 0xb5, 0x40, 0x68, 0x80, 0x00, + 0x44, 0x0f, 0x08, 0x2c, 0x03, 0xd3, 0x02, 0x21, + 0x87, 0x20, 0xf8, 0xf7, 0xec, 0xfe, 0x20, 0x1c, + 0x10, 0xbd, 0x00, 0x29, 0x02, 0xd0, 0x00, 0x68, + 0x80, 0x0d, 0x70, 0x47, 0x40, 0x68, 0x80, 0x05, + 0x80, 0x0d, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, + 0xe4, 0x84, 0x00, 0x00, 0x10, 0xb5, 0x40, 0x68, + 0x40, 0x01, 0x44, 0x0f, 0x05, 0x2c, 0x03, 0xd3, + 0x05, 0x21, 0x87, 0x20, 0xf8, 0xf7, 0xd6, 0xfe, + 0x20, 0x1c, 0x10, 0xbd, 0xf8, 0xb5, 0x05, 0x1c, + 0x88, 0x0a, 0x00, 0x90, 0x1c, 0x48, 0x8e, 0x05, + 0xc0, 0x69, 0xb6, 0x0d, 0x17, 0x1c, 0x1c, 0x1c, + 0x00, 0x28, 0x05, 0xd1, 0x18, 0x48, 0x81, 0x69, + 0x8d, 0x42, 0x1d, 0xd0, 0x85, 0x61, 0x11, 0xe0, + 0x3c, 0x00, 0x20, 0x85, 0x00, 0x00, 0xfd, 0xf7, + 0xe8, 0xf8, 0x15, 0x49, 0x09, 0x78, 0x0e, 0x29, + 0x07, 0xd1, 0x00, 0x28, 0x05, 0xd0, 0x11, 0x49, + 0x50, 0x31, 0x06, 0x23, 0xc9, 0x56, 0xf9, 0xf7, + 0x06, 0xfa, 0x0e, 0x49, 0x00, 0x20, 0xc8, 0x61, + 0x8d, 0x61, 0x29, 0x1c, 0x20, 0x1c, 0xf8, 0xf7, + 0xe2, 0xf8, 0x79, 0x43, 0x20, 0x1c, 0xf8, 0xf7, + 0xde, 0xf8, 0x08, 0x48, 0x41, 0x61, 0x20, 0x1c, + 0x00, 0x99, 0x3c, 0x00, 0x5c, 0x85, 0x00, 0x00, + 0xf8, 0xf7, 0xd8, 0xf8, 0x05, 0x48, 0x40, 0x69, + 0x0a, 0x18, 0xa2, 0x42, 0x01, 0xd2, 0x40, 0x18, + 0x01, 0xe0, 0x40, 0x18, 0x00, 0x1b, 0x80, 0x02, + 0x80, 0x19, 0xf8, 0xbd, 0xac, 0x7c, 0x01, 0x00, + 0x11, 0x67, 0x01, 0x00, 0xf8, 0xb5, 0x0f, 0x1c, + 0x06, 0x1c, 0x14, 0x1c, 0x1d, 0x1c, 0x07, 0xf0, + 0xa1, 0xfc, 0x0e, 0x28, 0x09, 0xd1, 0x20, 0x1c, + 0x02, 0xf0, 0xfc, 0xfb, 0x3c, 0x00, 0x98, 0x85, + 0x00, 0x00, 0x00, 0x28, 0x04, 0xd0, 0x08, 0x48, + 0x00, 0x78, 0x02, 0xf0, 0xe4, 0xfb, 0x04, 0x1c, + 0x01, 0x21, 0x00, 0x2e, 0xac, 0x72, 0x00, 0xd0, + 0x39, 0x1c, 0x20, 0x1c, 0x02, 0xf0, 0x07, 0xfc, + 0x28, 0x60, 0x00, 0x20, 0x28, 0x72, 0x6c, 0x72, + 0xf8, 0xbd, 0x90, 0x57, 0x01, 0x00, 0x03, 0x1c, + 0x0a, 0x48, 0x10, 0xb5, 0x00, 0x24, 0x02, 0x1c, + 0xa0, 0x32, 0x03, 0xe0, 0x81, 0x88, 0x3c, 0x00, + 0xd4, 0x85, 0x00, 0x00, 0x99, 0x42, 0x09, 0xd2, + 0x20, 0x30, 0x82, 0x42, 0xf9, 0xd1, 0x00, 0x2c, + 0x04, 0xd1, 0x02, 0x21, 0x8e, 0x20, 0xf8, 0xf7, + 0x5d, 0xfe, 0x00, 0x20, 0x10, 0xbd, 0x00, 0x00, + 0xd0, 0x5c, 0x01, 0x00, 0xff, 0xb5, 0x06, 0x1c, + 0x00, 0x20, 0x81, 0xb0, 0x10, 0x60, 0x1f, 0x1c, + 0x01, 0x25, 0x14, 0x1c, 0x30, 0x1c, 0xff, 0xf7, + 0x6d, 0xff, 0x05, 0x28, 0x12, 0xd2, 0x02, 0xa3, + 0x3c, 0x00, 0x10, 0x86, 0x00, 0x00, 0x1b, 0x5c, + 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x00, 0x03, 0x03, + 0x03, 0x03, 0x08, 0x00, 0x39, 0x1c, 0x30, 0x1c, + 0xff, 0xf7, 0x55, 0xff, 0x03, 0xe0, 0x02, 0x98, + 0xf8, 0xf7, 0xeb, 0xf8, 0x01, 0x30, 0x20, 0x60, + 0x04, 0xe0, 0x05, 0x21, 0x87, 0x20, 0xf8, 0xf7, + 0x34, 0xfe, 0x00, 0x25, 0x20, 0x68, 0x80, 0x28, + 0x04, 0xd9, 0x06, 0x21, 0x87, 0x20, 0xf8, 0xf7, + 0x2c, 0xfe, 0x3c, 0x00, 0x4c, 0x86, 0x00, 0x00, + 0x00, 0x25, 0x28, 0x1c, 0x05, 0xb0, 0xf0, 0xbd, + 0x70, 0xb5, 0x17, 0x4c, 0x60, 0x6c, 0x00, 0x28, + 0x01, 0xd0, 0x01, 0x20, 0x1d, 0xe0, 0x16, 0x4e, + 0x14, 0x4d, 0x31, 0x88, 0xa0, 0x6c, 0x00, 0x28, + 0x08, 0xd0, 0x28, 0x78, 0x81, 0x42, 0x05, 0xd9, + 0xf8, 0xf7, 0x4c, 0xf8, 0x01, 0x38, 0xfa, 0xf7, + 0x51, 0xfe, 0x0e, 0xe0, 0xe0, 0x6c, 0x00, 0x28, + 0x0a, 0xd0, 0x00, 0x20, 0x3c, 0x00, 0x88, 0x86, + 0x00, 0x00, 0xfa, 0xf7, 0x4a, 0xfe, 0x29, 0x78, + 0x32, 0x88, 0x91, 0x42, 0x04, 0xd9, 0x90, 0x42, + 0x02, 0xd9, 0x10, 0x1c, 0x00, 0xe0, 0x08, 0x1c, + 0xfa, 0xf7, 0xdf, 0xfd, 0xe1, 0x6b, 0x44, 0x1a, + 0x0a, 0xf0, 0x81, 0xfb, 0x20, 0x1a, 0x00, 0xd5, + 0x00, 0x20, 0x70, 0xbd, 0x00, 0x00, 0x44, 0x7d, + 0x01, 0x00, 0xf8, 0x60, 0x01, 0x00, 0xfc, 0x60, + 0x01, 0x00, 0xff, 0xb5, 0x27, 0x4e, 0x3c, 0x00, + 0xc4, 0x86, 0x00, 0x00, 0x04, 0x1c, 0xb0, 0x79, + 0x0f, 0x1c, 0x15, 0x1c, 0x81, 0xb0, 0x00, 0x90, + 0x0a, 0xf0, 0x6c, 0xfb, 0xc1, 0x19, 0x23, 0x48, + 0x07, 0x68, 0x00, 0x2f, 0x05, 0xd1, 0x0a, 0x21, + 0x80, 0x20, 0xf8, 0xf7, 0xdf, 0xfd, 0x05, 0xb0, + 0xf0, 0xbd, 0x1e, 0x48, 0x40, 0x68, 0x84, 0x46, + 0x00, 0x28, 0x01, 0xd1, 0x00, 0x22, 0x0e, 0xe0, + 0x82, 0x68, 0x03, 0x68, 0xab, 0x42, 0x07, 0xd1, + 0x3c, 0x00, 0x00, 0x87, 0x00, 0x00, 0x03, 0x79, + 0xa3, 0x42, 0x04, 0xd1, 0x0b, 0x21, 0x80, 0x20, + 0xf8, 0xf7, 0xcb, 0xfd, 0x23, 0xe0, 0xc0, 0x68, + 0x00, 0x28, 0xf1, 0xd1, 0x13, 0x4b, 0xf8, 0x68, + 0x18, 0x60, 0x3d, 0x60, 0x3c, 0x71, 0xb9, 0x60, + 0x04, 0x98, 0x8d, 0x1a, 0x38, 0x61, 0x60, 0x46, + 0x00, 0x23, 0x05, 0xe0, 0x84, 0x68, 0xa4, 0x1a, + 0xac, 0x42, 0x03, 0xda, 0x03, 0x1c, 0xc0, 0x68, + 0x00, 0x28, 0x3c, 0x00, 0x3c, 0x87, 0x00, 0x00, + 0xf7, 0xd1, 0xf8, 0x60, 0x00, 0x2b, 0x08, 0xd1, + 0x07, 0x48, 0x3b, 0x1c, 0x47, 0x60, 0x08, 0x48, + 0x06, 0x4a, 0x00, 0x88, 0x0a, 0xf0, 0x8a, 0xfb, + 0x00, 0xe0, 0xdf, 0x60, 0x00, 0x98, 0xb0, 0x71, + 0xc3, 0xe7, 0x00, 0x00, 0x20, 0x10, 0x07, 0x00, + 0x7c, 0x5d, 0x01, 0x00, 0x21, 0x38, 0x01, 0x00, + 0x2c, 0x74, 0x01, 0x00, 0xf3, 0xb5, 0x83, 0xb0, + 0x04, 0x1c, 0x09, 0xd0, 0x3c, 0x00, 0x78, 0x87, + 0x00, 0x00, 0x20, 0x1c, 0x04, 0x99, 0x09, 0xf0, + 0x8e, 0xfb, 0x00, 0x28, 0x03, 0xd0, 0x20, 0x1c, + 0x30, 0x30, 0x05, 0xb0, 0xf0, 0xbd, 0x0a, 0xf0, + 0x0e, 0xfb, 0x1e, 0x4a, 0x00, 0x26, 0x04, 0x9f, + 0x01, 0x96, 0x00, 0x90, 0x02, 0x92, 0x02, 0x9c, + 0x00, 0x25, 0x39, 0x1c, 0x20, 0x1c, 0x14, 0x30, + 0x02, 0xf0, 0xc5, 0xfa, 0x00, 0x28, 0x01, 0xd0, + 0x26, 0x1c, 0x03, 0xe0, 0x01, 0x35, 0x3c, 0x00, + 0xb4, 0x87, 0x00, 0x00, 0x1c, 0x34, 0x04, 0x2d, + 0xf2, 0xd3, 0x00, 0x2e, 0x22, 0xd1, 0x01, 0x98, + 0x13, 0x4f, 0x01, 0x30, 0x01, 0x90, 0x02, 0x28, + 0xe8, 0xd3, 0x01, 0x21, 0xc9, 0x06, 0x02, 0x9a, + 0x00, 0x20, 0x13, 0x69, 0x00, 0x9c, 0xe3, 0x1a, + 0x8b, 0x42, 0x01, 0xdd, 0x19, 0x1c, 0x16, 0x1c, + 0x01, 0x30, 0x1c, 0x32, 0x04, 0x28, 0xf4, 0xd3, + 0x30, 0x68, 0x00, 0x28, 0x01, 0xd0, 0xf8, 0xf7, + 0x3c, 0x00, 0xf0, 0x87, 0x00, 0x00, 0xd3, 0xfe, + 0x30, 0x1c, 0xfd, 0xf7, 0x4a, 0xff, 0x30, 0x1c, + 0x14, 0x30, 0x06, 0x22, 0x04, 0x99, 0xf7, 0xf7, + 0x7a, 0xfe, 0x00, 0x9c, 0x30, 0x1c, 0x34, 0x61, + 0xbd, 0xe7, 0x30, 0x6a, 0x01, 0x00, 0x34, 0x42, + 0x01, 0x00, 0x09, 0x49, 0x10, 0xb5, 0x4c, 0x69, + 0x03, 0xe0, 0xe1, 0x68, 0x81, 0x42, 0x03, 0xd0, + 0x24, 0x68, 0x00, 0x2c, 0xf9, 0xd1, 0x01, 0xe0, + 0x00, 0x2c, 0x3c, 0x00, 0x2c, 0x88, 0x00, 0x00, + 0x03, 0xd1, 0x02, 0x21, 0x02, 0x20, 0xf8, 0xf7, + 0x37, 0xfd, 0x20, 0x1c, 0x10, 0xbd, 0x00, 0x00, + 0xfc, 0x5a, 0x01, 0x00, 0x10, 0xb5, 0xc3, 0x07, + 0x06, 0xd5, 0x08, 0x4b, 0x5c, 0x69, 0x0c, 0x43, + 0x5c, 0x61, 0x1c, 0x7e, 0x14, 0x43, 0x1c, 0x76, + 0x80, 0x07, 0x06, 0xd5, 0x04, 0x48, 0x43, 0x69, + 0x19, 0x43, 0x41, 0x61, 0x01, 0x7e, 0x11, 0x43, + 0x01, 0x76, 0x10, 0xbd, 0x3c, 0x00, 0x68, 0x88, + 0x00, 0x00, 0xfc, 0x57, 0x01, 0x00, 0x18, 0x58, + 0x01, 0x00, 0x70, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, + 0x16, 0x1c, 0x00, 0xf0, 0x08, 0xf8, 0xa0, 0x07, + 0xc0, 0x17, 0x01, 0x30, 0x32, 0x1c, 0x29, 0x1c, + 0x00, 0xf0, 0x21, 0xf8, 0x70, 0xbd, 0x10, 0xb5, + 0xc3, 0x07, 0x06, 0xd5, 0x08, 0x4b, 0x5c, 0x69, + 0x8c, 0x43, 0x5c, 0x61, 0x1c, 0x7e, 0x94, 0x43, + 0x1c, 0x76, 0x80, 0x07, 0x06, 0xd5, 0x3c, 0x00, + 0xa4, 0x88, 0x00, 0x00, 0x04, 0x48, 0x43, 0x69, + 0x8b, 0x43, 0x43, 0x61, 0x01, 0x7e, 0x91, 0x43, + 0x01, 0x76, 0x10, 0xbd, 0xfc, 0x57, 0x01, 0x00, + 0x18, 0x58, 0x01, 0x00, 0x03, 0x22, 0x11, 0x1f, + 0x80, 0xb5, 0x01, 0x20, 0x00, 0xf0, 0x02, 0xf8, + 0x80, 0xbd, 0x00, 0x00, 0x30, 0xb5, 0x15, 0x1c, + 0x0c, 0x1c, 0x00, 0x28, 0x87, 0xb0, 0x02, 0xd0, + 0x1c, 0x22, 0x22, 0x49, 0x01, 0xe0, 0x22, 0x49, + 0x3c, 0x00, 0xe0, 0x88, 0x00, 0x00, 0x1c, 0x22, + 0x68, 0x46, 0xf7, 0xf7, 0x64, 0xfe, 0x05, 0x99, + 0x00, 0xab, 0x1a, 0x7e, 0x8c, 0x43, 0x20, 0x1c, + 0x95, 0x43, 0x02, 0x9a, 0x29, 0x1c, 0x02, 0x40, + 0x02, 0x92, 0x01, 0x9a, 0x02, 0x40, 0x01, 0x92, + 0x00, 0x9a, 0x02, 0x40, 0x00, 0x92, 0x03, 0x9a, + 0x02, 0x40, 0x03, 0x92, 0x98, 0x7c, 0x08, 0x40, + 0x98, 0x74, 0x58, 0x7c, 0x08, 0x40, 0x58, 0x74, + 0x18, 0x7c, 0x3c, 0x00, 0x1c, 0x89, 0x00, 0x00, + 0x08, 0x40, 0x18, 0x74, 0xd8, 0x7c, 0x08, 0x40, + 0xd8, 0x74, 0x02, 0x99, 0x10, 0x48, 0x41, 0x61, + 0x01, 0xaa, 0x06, 0xca, 0x91, 0x43, 0x81, 0x61, + 0x81, 0x68, 0x01, 0x9a, 0x11, 0x43, 0x81, 0x60, + 0x81, 0x68, 0x00, 0x9a, 0x91, 0x43, 0x81, 0x60, + 0x00, 0xaa, 0x06, 0xca, 0x11, 0x43, 0x42, 0x68, + 0x11, 0x43, 0x41, 0x60, 0x41, 0x68, 0x03, 0x9a, + 0x91, 0x43, 0x41, 0x60, 0x3c, 0x00, 0x58, 0x89, + 0x00, 0x00, 0x04, 0xa8, 0x0b, 0xf0, 0x01, 0xf8, + 0x07, 0xb0, 0x30, 0xbd, 0x00, 0x00, 0xfc, 0x57, + 0x01, 0x00, 0x18, 0x58, 0x01, 0x00, 0x10, 0x00, + 0x07, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x01, 0x1c, + 0x01, 0x20, 0x08, 0xf0, 0xe0, 0xf9, 0x00, 0x2c, + 0x02, 0xd0, 0x03, 0xf0, 0x1c, 0xff, 0x10, 0xbd, + 0xfe, 0xf7, 0xd1, 0xfc, 0x10, 0xbd, 0xf0, 0xb5, + 0x0c, 0x1c, 0x01, 0x0e, 0x01, 0x23, 0x3c, 0x00, + 0x94, 0x89, 0x00, 0x00, 0x1b, 0x06, 0x09, 0x06, + 0x99, 0x42, 0x9f, 0xb0, 0x28, 0xd1, 0x17, 0x49, + 0x08, 0x40, 0x00, 0x21, 0x1a, 0x28, 0x00, 0xd3, + 0x02, 0x21, 0x00, 0x29, 0x19, 0xd1, 0xc5, 0x00, + 0x13, 0x4f, 0x10, 0xa8, 0xee, 0x19, 0xb2, 0x88, + 0x21, 0x68, 0xf7, 0xf7, 0x9d, 0xfd, 0x20, 0x1c, + 0xf8, 0xf7, 0xea, 0xfd, 0x7a, 0x59, 0x01, 0xa9, + 0x10, 0xa8, 0xf7, 0xf7, 0x07, 0xfd, 0x00, 0x28, + 0x3c, 0x00, 0xd0, 0x89, 0x00, 0x00, 0x05, 0xd0, + 0x10, 0x98, 0x01, 0xa9, 0x01, 0x90, 0xb0, 0x79, + 0x00, 0xf0, 0x9d, 0xf8, 0x1f, 0xb0, 0xf0, 0xbd, + 0x2a, 0x20, 0xf8, 0xf7, 0x5e, 0xfc, 0x20, 0x1c, + 0xf8, 0xf7, 0xd5, 0xfd, 0xf6, 0xe7, 0x03, 0x21, + 0x2a, 0x20, 0xf8, 0xf7, 0x56, 0xfc, 0xf1, 0xe7, + 0x00, 0x00, 0x7f, 0xff, 0xff, 0x00, 0x24, 0x45, + 0x01, 0x00, 0x10, 0xb5, 0x0c, 0x1c, 0x80, 0x28, + 0x02, 0xd0, 0x3c, 0x00, 0x0c, 0x8a, 0x00, 0x00, + 0x81, 0x28, 0x08, 0xd1, 0x03, 0xe0, 0x20, 0x1c, + 0x00, 0xf0, 0x06, 0xf9, 0x10, 0xbd, 0x20, 0x1c, + 0xf8, 0xf7, 0xbc, 0xfd, 0x10, 0xbd, 0x03, 0x21, + 0x2c, 0x20, 0xf8, 0xf7, 0x3d, 0xfc, 0xf6, 0xe7, + 0xf0, 0xb5, 0x0c, 0x1c, 0x00, 0x21, 0x8b, 0xb0, + 0x0a, 0x91, 0x01, 0x0e, 0x01, 0x23, 0x1b, 0x06, + 0x09, 0x06, 0x99, 0x42, 0x2a, 0xd1, 0x18, 0x49, + 0x08, 0x40, 0x06, 0x1c, 0x3c, 0x00, 0x48, 0x8a, + 0x00, 0x00, 0x06, 0x2e, 0x01, 0xd3, 0x07, 0x21, + 0x24, 0xe0, 0x20, 0x89, 0xf8, 0xf7, 0xf1, 0xfe, + 0x22, 0x89, 0x21, 0x68, 0x05, 0x1c, 0xf7, 0xf7, + 0x4c, 0xfd, 0x20, 0x1c, 0xf8, 0xf7, 0x99, 0xfd, + 0xf4, 0x00, 0x0f, 0x4e, 0x28, 0x1c, 0x0a, 0xaa, + 0x69, 0x46, 0x33, 0x59, 0xf7, 0xf7, 0xb4, 0xfc, + 0x00, 0x28, 0x01, 0xd0, 0x01, 0x28, 0x07, 0xd1, + 0x28, 0x68, 0x69, 0x46, 0x00, 0x90, 0x3c, 0x00, + 0x84, 0x8a, 0x00, 0x00, 0xa0, 0x19, 0x00, 0x79, + 0x0a, 0x9a, 0x00, 0xf0, 0x09, 0xf9, 0x28, 0x1c, + 0xf8, 0xf7, 0xb0, 0xfe, 0x0b, 0xb0, 0xf0, 0xbd, + 0x01, 0x21, 0x2b, 0x20, 0xf8, 0xf7, 0x02, 0xfc, + 0xf8, 0xe7, 0x00, 0x00, 0x7f, 0xff, 0xff, 0x00, + 0x28, 0x46, 0x01, 0x00, 0x0a, 0x1c, 0x01, 0x0e, + 0x01, 0x23, 0x1b, 0x06, 0x09, 0x06, 0x99, 0x42, + 0x80, 0xb5, 0x08, 0xd0, 0x5b, 0x00, 0x99, 0x42, + 0x3c, 0x00, 0xc0, 0x8a, 0x00, 0x00, 0x0b, 0xd1, + 0x00, 0x06, 0x00, 0x0e, 0x11, 0x1c, 0x00, 0xf0, + 0x0e, 0xf9, 0x80, 0xbd, 0x05, 0x49, 0x01, 0x40, + 0x10, 0x1c, 0x05, 0xf0, 0xa2, 0xf9, 0x80, 0xbd, + 0x01, 0x21, 0x2d, 0x20, 0xf8, 0xf7, 0xe1, 0xfb, + 0x80, 0xbd, 0x7f, 0xff, 0xff, 0x00, 0x80, 0xb5, + 0x01, 0x1c, 0x0f, 0x20, 0x00, 0xf0, 0x13, 0xf8, + 0x80, 0xbd, 0x80, 0xb5, 0x01, 0x1c, 0x04, 0x20, + 0x00, 0xf0, 0x3c, 0x00, 0xfc, 0x8a, 0x00, 0x00, + 0x0d, 0xf8, 0x80, 0xbd, 0x80, 0xb5, 0x01, 0x1c, + 0x17, 0x20, 0x00, 0xf0, 0x07, 0xf8, 0x80, 0xbd, + 0x80, 0xb5, 0x01, 0x1c, 0x01, 0x20, 0x00, 0xf0, + 0x01, 0xf8, 0x80, 0xbd, 0xf8, 0xb5, 0x04, 0x1c, + 0x06, 0x1c, 0x80, 0x20, 0x84, 0x43, 0x0f, 0x1c, + 0x19, 0x2c, 0x01, 0xd3, 0xf8, 0xf7, 0xea, 0xfb, + 0x08, 0x48, 0x04, 0x5d, 0x21, 0x1c, 0x00, 0x20, + 0xf8, 0xf7, 0x50, 0xfd, 0x3c, 0x00, 0x38, 0x8b, + 0x00, 0x00, 0x05, 0x1c, 0x22, 0x1c, 0x39, 0x1c, + 0x00, 0x68, 0xf7, 0xf7, 0xda, 0xfc, 0x2a, 0x1c, + 0x31, 0x1c, 0x07, 0x20, 0xf8, 0xf7, 0x11, 0xf9, + 0xf8, 0xbd, 0xf4, 0x45, 0x01, 0x00, 0xf8, 0xb5, + 0x0d, 0x1c, 0x16, 0x1c, 0x04, 0x1c, 0x1f, 0x1c, + 0x08, 0x21, 0x00, 0x20, 0xf8, 0xf7, 0x39, 0xfd, + 0x14, 0x22, 0x01, 0x68, 0x0e, 0x4b, 0x72, 0x43, + 0xd2, 0x18, 0x0c, 0x71, 0x12, 0x7c, 0x3c, 0x00, + 0x74, 0x8b, 0x00, 0x00, 0x4a, 0x71, 0x0d, 0x60, + 0x0b, 0x4a, 0x8f, 0x71, 0x12, 0x68, 0x7f, 0x2a, + 0x03, 0xd9, 0x52, 0x05, 0x52, 0x0e, 0x80, 0x23, + 0x1a, 0x43, 0xca, 0x71, 0x07, 0x4a, 0x00, 0x23, + 0x51, 0x68, 0x01, 0x31, 0x51, 0x60, 0x02, 0x1c, + 0x81, 0x21, 0x00, 0x20, 0xf8, 0xf7, 0x08, 0xf9, + 0xf8, 0xbd, 0x00, 0x00, 0x74, 0x40, 0x01, 0x00, + 0xfc, 0x5a, 0x01, 0x00, 0x80, 0x6e, 0x01, 0x00, + 0x3c, 0x00, 0xb0, 0x8b, 0x00, 0x00, 0xb0, 0xb5, + 0x04, 0x1c, 0x08, 0x21, 0x00, 0x20, 0xf8, 0xf7, + 0x0e, 0xfd, 0x21, 0x8b, 0xe2, 0x7d, 0x05, 0x1c, + 0x09, 0x05, 0x52, 0x07, 0x52, 0x0f, 0x49, 0x0c, + 0x00, 0x68, 0x11, 0x43, 0x81, 0x80, 0xa1, 0x7d, + 0x14, 0x23, 0x0e, 0x4a, 0x59, 0x43, 0x89, 0x18, + 0x09, 0x7c, 0xc1, 0x71, 0xe1, 0x6a, 0x01, 0x60, + 0xe1, 0x68, 0x28, 0x1c, 0xf8, 0xf7, 0x17, 0xfc, + 0x0a, 0x48, 0x3c, 0x00, 0xec, 0x8b, 0x00, 0x00, + 0x00, 0x68, 0x00, 0x28, 0x01, 0xd0, 0xf7, 0xf7, + 0xf1, 0xfb, 0x07, 0x49, 0x04, 0x31, 0x88, 0x68, + 0x01, 0x30, 0x88, 0x60, 0x00, 0x21, 0x2a, 0x1c, + 0x00, 0x20, 0x23, 0x6b, 0xf8, 0xf7, 0xd2, 0xf8, + 0x01, 0x20, 0xb0, 0xbd, 0x74, 0x40, 0x01, 0x00, + 0x7c, 0x6e, 0x01, 0x00, 0x01, 0x48, 0x80, 0x68, + 0x70, 0x47, 0x00, 0x00, 0x80, 0x6e, 0x01, 0x00, + 0x10, 0xb5, 0x04, 0x1c, 0x3c, 0x00, 0x28, 0x8c, + 0x00, 0x00, 0x92, 0xb0, 0x01, 0x68, 0x68, 0x46, + 0x08, 0x22, 0xf7, 0xf7, 0x62, 0xfc, 0x00, 0xab, + 0x98, 0x88, 0x40, 0x07, 0x40, 0x0f, 0xd8, 0x77, + 0x98, 0x88, 0x40, 0x04, 0x00, 0x0d, 0x18, 0x84, + 0xd8, 0x88, 0x58, 0x84, 0x00, 0x98, 0x0d, 0x90, + 0x05, 0x94, 0x20, 0x89, 0x08, 0x38, 0x20, 0x81, + 0x05, 0x98, 0x01, 0x68, 0x08, 0x31, 0x01, 0x60, + 0x00, 0x20, 0x0a, 0x90, 0x0c, 0x90, 0x3c, 0x00, + 0x64, 0x8c, 0x00, 0x00, 0x00, 0x21, 0x11, 0x20, + 0x09, 0xf0, 0x78, 0xfb, 0x05, 0x49, 0x06, 0x4a, + 0x08, 0x68, 0x01, 0x30, 0x08, 0x60, 0x02, 0x21, + 0x02, 0xa8, 0x01, 0xf0, 0xcd, 0xfc, 0x12, 0xb0, + 0x10, 0xbd, 0x00, 0x00, 0x80, 0x6e, 0x01, 0x00, + 0x55, 0x8b, 0x00, 0x00, 0x02, 0x1c, 0x01, 0x20, + 0x00, 0x06, 0x08, 0x43, 0x80, 0xb5, 0x2b, 0x21, + 0x0a, 0xf0, 0x8a, 0xfd, 0x80, 0xbd, 0x00, 0x00, + 0x3c, 0x00, 0xa0, 0x8c, 0x00, 0x00, 0xf7, 0xb5, + 0x04, 0x1c, 0x06, 0x1c, 0x80, 0x20, 0x84, 0x43, + 0x17, 0x1c, 0x06, 0x2c, 0x01, 0xd3, 0xf8, 0xf7, + 0x26, 0xfb, 0x0b, 0x48, 0x05, 0x5d, 0x29, 0x1c, + 0x00, 0x20, 0xf8, 0xf7, 0x8c, 0xfc, 0x04, 0x1c, + 0x00, 0x68, 0x01, 0x99, 0x2a, 0x1c, 0xf7, 0xf7, + 0x16, 0xfc, 0x39, 0x1c, 0x20, 0x1c, 0xf8, 0xf7, + 0xa2, 0xfb, 0x22, 0x1c, 0x31, 0x1c, 0x00, 0x23, + 0x02, 0x20, 0x3c, 0x00, 0xdc, 0x8c, 0x00, 0x00, + 0xf8, 0xf7, 0x68, 0xf8, 0xfe, 0xbd, 0x00, 0x00, + 0x20, 0x46, 0x01, 0x00, 0x0a, 0x1c, 0x01, 0x1c, + 0x80, 0xb5, 0x00, 0x23, 0x01, 0x20, 0xf8, 0xf7, + 0x5d, 0xf8, 0x80, 0xbd, 0xff, 0xb5, 0x9f, 0xb0, + 0x1f, 0x1c, 0x05, 0x1c, 0x0a, 0x30, 0x1e, 0x90, + 0x1c, 0xaa, 0x1d, 0xa9, 0x0a, 0xf0, 0x00, 0xff, + 0x00, 0x28, 0x71, 0xd0, 0x00, 0x2f, 0x09, 0xd0, + 0x0a, 0x21, 0x00, 0x20, 0x3c, 0x00, 0x18, 0x8d, + 0x00, 0x00, 0xf8, 0xf7, 0x5e, 0xfc, 0x06, 0x68, + 0x04, 0x1c, 0x30, 0x1d, 0xfa, 0xf7, 0xaf, 0xfa, + 0x05, 0xe0, 0x04, 0x21, 0x00, 0x20, 0xf8, 0xf7, + 0x54, 0xfc, 0x06, 0x68, 0x04, 0x1c, 0x28, 0x89, + 0x36, 0x49, 0x01, 0x22, 0x08, 0x80, 0x70, 0x80, + 0xe8, 0x88, 0x14, 0xa9, 0x30, 0x80, 0x19, 0xa8, + 0xfc, 0xf7, 0xf5, 0xfc, 0xfc, 0xf7, 0xff, 0xfb, + 0x01, 0x1c, 0xff, 0x31, 0x21, 0x31, 0x3c, 0x00, + 0x54, 0x8d, 0x00, 0x00, 0x20, 0x1c, 0x01, 0xf0, + 0xef, 0xf8, 0x19, 0xa9, 0x20, 0x1c, 0x01, 0xf0, + 0xeb, 0xf8, 0x14, 0xa9, 0x20, 0x1c, 0x01, 0xf0, + 0xe7, 0xf8, 0x20, 0x1c, 0x20, 0x99, 0xfd, 0xf7, + 0x4b, 0xfd, 0x00, 0x22, 0x02, 0x21, 0x01, 0xf0, + 0x33, 0xfd, 0x06, 0x1c, 0x1c, 0x99, 0x00, 0x20, + 0x88, 0x61, 0x30, 0x1c, 0xf8, 0xf7, 0x1c, 0xfa, + 0x00, 0x2e, 0x0b, 0xd0, 0x30, 0x7a, 0x00, 0x28, + 0x3c, 0x00, 0x90, 0x8d, 0x00, 0x00, 0x02, 0xd0, + 0x40, 0x21, 0x08, 0x43, 0x30, 0x72, 0x1c, 0x98, + 0x02, 0x22, 0x81, 0x69, 0x11, 0x43, 0x81, 0x61, + 0x04, 0xe0, 0x1c, 0x99, 0x02, 0x22, 0x88, 0x69, + 0x90, 0x43, 0x88, 0x61, 0x1d, 0xaa, 0x06, 0xca, + 0x01, 0xa8, 0x05, 0xf0, 0x58, 0xfb, 0x09, 0xa8, + 0x00, 0x2f, 0x02, 0xd0, 0x02, 0x22, 0x42, 0x72, + 0x01, 0xe0, 0x00, 0x21, 0x41, 0x72, 0x04, 0x94, + 0x01, 0xa8, 0x3c, 0x00, 0xcc, 0x8d, 0x00, 0x00, + 0x04, 0xf0, 0x7a, 0xfb, 0x01, 0x21, 0x1c, 0x98, + 0x08, 0xf0, 0xc8, 0xff, 0x00, 0x2f, 0x04, 0xd0, + 0x1c, 0x98, 0x01, 0x22, 0x81, 0x69, 0x11, 0x43, + 0x81, 0x61, 0xa8, 0x88, 0x1c, 0x9c, 0x01, 0xf0, + 0x9f, 0xfe, 0x02, 0x1c, 0x21, 0x1c, 0x00, 0xe0, + 0x04, 0xe0, 0x07, 0x48, 0x40, 0x88, 0x09, 0xf0, + 0x1f, 0xf8, 0x04, 0xe0, 0x3a, 0x1c, 0x00, 0x21, + 0x05, 0x20, 0xf9, 0xf7, 0x3c, 0x00, 0x08, 0x8e, + 0x00, 0x00, 0x9b, 0xf8, 0x00, 0x20, 0x23, 0xb0, + 0xf0, 0xbd, 0xfc, 0x60, 0x01, 0x00, 0x98, 0x7c, + 0x01, 0x00, 0xf8, 0xb5, 0x04, 0x1c, 0xc0, 0x68, + 0x05, 0x68, 0xa0, 0x1d, 0x01, 0xf0, 0x95, 0xff, + 0x00, 0x28, 0x45, 0xd0, 0x21, 0x1c, 0x14, 0x31, + 0x20, 0x1c, 0x6a, 0x46, 0x0a, 0xf0, 0x55, 0xfe, + 0x00, 0x28, 0x3d, 0xd0, 0xfc, 0xf7, 0x7d, 0xfa, + 0x00, 0x28, 0x39, 0xd1, 0x00, 0x98, 0x3c, 0x00, + 0x44, 0x8e, 0x00, 0x00, 0x4b, 0x21, 0x09, 0x5c, + 0x01, 0x29, 0x34, 0xd1, 0x04, 0x26, 0x09, 0xf0, + 0x19, 0xf9, 0x68, 0x88, 0x00, 0x28, 0x1b, 0xd1, + 0xa8, 0x88, 0x03, 0x21, 0x89, 0x03, 0x88, 0x43, + 0x15, 0x49, 0x00, 0x26, 0x08, 0x80, 0x01, 0x22, + 0x02, 0x21, 0x20, 0x69, 0x01, 0xf0, 0xb8, 0xfc, + 0x04, 0x1c, 0x14, 0xd0, 0x00, 0x98, 0x80, 0x69, + 0x80, 0x07, 0x10, 0xd5, 0xf8, 0xf7, 0x9a, 0xf9, + 0x3c, 0x00, 0x80, 0x8e, 0x00, 0x00, 0x20, 0x1c, + 0xf8, 0xf7, 0xdd, 0xf8, 0x00, 0x28, 0x09, 0xd1, + 0xf8, 0xf7, 0x7f, 0xf9, 0x01, 0x26, 0x00, 0x98, + 0x02, 0x22, 0x81, 0x69, 0x91, 0x43, 0x81, 0x61, + 0x00, 0x21, 0x01, 0xe0, 0x00, 0x98, 0x02, 0x21, + 0x08, 0xf0, 0x61, 0xff, 0x00, 0x98, 0x80, 0x69, + 0xa9, 0x88, 0xc2, 0x07, 0xd2, 0x0f, 0x30, 0x1c, + 0xf9, 0xf7, 0x45, 0xf8, 0xf8, 0xbd, 0xfa, 0x60, + 0x01, 0x00, 0x3c, 0x00, 0xbc, 0x8e, 0x00, 0x00, + 0x1c, 0xb5, 0x04, 0x69, 0x00, 0x23, 0x00, 0x22, + 0x00, 0x2c, 0x13, 0xd1, 0x4b, 0x24, 0x24, 0x5c, + 0x02, 0x2c, 0x03, 0xd1, 0x02, 0x29, 0x05, 0xd0, + 0x01, 0x22, 0x03, 0xe0, 0x02, 0x29, 0x01, 0xd1, + 0x01, 0x22, 0x01, 0x23, 0x00, 0x2a, 0x05, 0xd0, + 0x00, 0x90, 0x04, 0x20, 0x01, 0x93, 0x69, 0x46, + 0x09, 0xf0, 0x36, 0xfa, 0x1c, 0xbd, 0x00, 0x00, + 0xb0, 0xb5, 0x04, 0x1c, 0x3c, 0x00, 0xf8, 0x8e, + 0x00, 0x00, 0xf2, 0x21, 0x0f, 0x20, 0x0c, 0x4d, + 0x0a, 0xf0, 0x99, 0xfb, 0x28, 0x78, 0x08, 0x28, + 0x0b, 0xd2, 0x01, 0xa3, 0x1b, 0x5c, 0x5b, 0x00, + 0x9f, 0x44, 0x07, 0x03, 0x03, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x00, 0x2c, 0x01, 0xd1, 0x05, 0xf0, + 0xbc, 0xfb, 0xb0, 0xbd, 0x01, 0x2c, 0xfc, 0xd1, + 0xff, 0x20, 0x07, 0xf0, 0x38, 0xfa, 0xb0, 0xbd, + 0x00, 0x00, 0x74, 0x66, 0x01, 0x00, 0x3c, 0x00, + 0x34, 0x8f, 0x00, 0x00, 0x8c, 0xb5, 0x05, 0x4a, + 0x00, 0xab, 0x11, 0x72, 0x00, 0x90, 0x19, 0x71, + 0x69, 0x46, 0x08, 0x20, 0x09, 0xf0, 0x0a, 0xfa, + 0x8c, 0xbd, 0x00, 0x00, 0xac, 0x7c, 0x01, 0x00, + 0xf3, 0xb5, 0x04, 0x1c, 0xc0, 0x68, 0x06, 0x27, + 0x85, 0xb0, 0x06, 0x68, 0x09, 0xf0, 0x26, 0xff, + 0x98, 0x49, 0x48, 0x63, 0x20, 0x69, 0x03, 0x21, + 0x01, 0xf0, 0x08, 0xfc, 0x96, 0x4d, 0x00, 0x28, + 0x3c, 0x00, 0x70, 0x8f, 0x00, 0x00, 0x4d, 0xd0, + 0x95, 0x49, 0x40, 0x31, 0x09, 0x79, 0x80, 0x78, + 0x81, 0x42, 0x47, 0xd1, 0x01, 0x21, 0x20, 0x69, + 0x01, 0xf0, 0xfb, 0xfb, 0x02, 0x90, 0x20, 0x69, + 0x32, 0x21, 0x01, 0xf0, 0xf6, 0xfb, 0x01, 0x90, + 0x02, 0x1c, 0x8d, 0x48, 0x02, 0x99, 0xfc, 0xf7, + 0x46, 0xff, 0x00, 0x28, 0x36, 0xd0, 0x00, 0x23, + 0x8a, 0x48, 0x02, 0x99, 0x01, 0x9a, 0xfc, 0xf7, + 0xe4, 0xfe, 0x3c, 0x00, 0xac, 0x8f, 0x00, 0x00, + 0x0b, 0x28, 0x2e, 0xd1, 0x86, 0x4a, 0x51, 0x88, + 0x70, 0x89, 0x41, 0x40, 0x03, 0x91, 0x0b, 0x1c, + 0x84, 0x49, 0x0b, 0x40, 0x25, 0xd1, 0x50, 0x80, + 0x03, 0x99, 0x17, 0x1c, 0x00, 0x29, 0x0b, 0xd0, + 0x03, 0x99, 0x48, 0x05, 0x02, 0xd5, 0x38, 0x1c, + 0xfc, 0xf7, 0x40, 0xfe, 0x03, 0x99, 0x88, 0x06, + 0x02, 0xd5, 0x38, 0x1c, 0xfc, 0xf7, 0x24, 0xfe, + 0x2a, 0x21, 0x20, 0x69, 0x3c, 0x00, 0xe8, 0x8f, + 0x00, 0x00, 0x01, 0xf0, 0xc8, 0xfb, 0x00, 0x28, + 0x0d, 0xd0, 0x80, 0x78, 0xe9, 0x69, 0x81, 0x42, + 0x09, 0xd0, 0xe8, 0x61, 0x38, 0x1c, 0xfc, 0xf7, + 0x16, 0xfe, 0x38, 0x1c, 0xfc, 0xf7, 0x07, 0xfe, + 0x38, 0x1c, 0xfc, 0xf7, 0x26, 0xfe, 0x00, 0x27, + 0x20, 0x1c, 0x20, 0x30, 0x04, 0x90, 0x40, 0x7a, + 0x08, 0x28, 0x71, 0xd1, 0x0a, 0xf0, 0xd1, 0xfc, + 0x00, 0x20, 0x68, 0x61, 0x00, 0x23, 0x3c, 0x00, + 0x24, 0x90, 0x00, 0x00, 0x2b, 0x61, 0xa8, 0x68, + 0x66, 0x49, 0x01, 0x30, 0xa8, 0x60, 0x30, 0x89, + 0x5c, 0x31, 0x88, 0x82, 0x01, 0xf0, 0x7a, 0xfd, + 0x62, 0x49, 0x5c, 0x31, 0x08, 0x61, 0x22, 0x6a, + 0x04, 0x98, 0x18, 0x21, 0x00, 0x7a, 0x01, 0xf0, + 0x33, 0xfe, 0xe1, 0x6a, 0x40, 0x18, 0x03, 0x90, + 0x5c, 0x48, 0x00, 0x6a, 0x00, 0x28, 0x0d, 0xd0, + 0x00, 0x2f, 0x0b, 0xd1, 0x59, 0x48, 0x01, 0x23, + 0x3c, 0x00, 0x60, 0x90, 0x00, 0x00, 0x5c, 0x30, + 0x01, 0x68, 0x1b, 0x07, 0x00, 0x22, 0x30, 0x68, + 0x09, 0xf0, 0x49, 0xff, 0x00, 0x28, 0x00, 0xd1, + 0x05, 0x27, 0x00, 0x21, 0xa0, 0x6b, 0x0a, 0xf0, + 0xce, 0xfc, 0x00, 0x21, 0x20, 0x6c, 0x0a, 0xf0, + 0xe8, 0xfc, 0x4f, 0x4b, 0x03, 0xce, 0x03, 0x9a, + 0x5c, 0x33, 0xfc, 0xf7, 0x88, 0xfd, 0x00, 0x20, + 0x4c, 0x4e, 0x05, 0x21, 0xb0, 0x63, 0x20, 0x69, + 0x01, 0xf0, 0x3c, 0x00, 0x9c, 0x90, 0x00, 0x00, + 0x6f, 0xfb, 0x01, 0x1c, 0x01, 0xd1, 0xf0, 0x60, + 0x1c, 0xe0, 0x01, 0x20, 0xf0, 0x60, 0x88, 0x78, + 0x45, 0x4a, 0x01, 0x32, 0x10, 0x70, 0xc8, 0x78, + 0x50, 0x70, 0x47, 0x4a, 0x10, 0x70, 0x30, 0x69, + 0x00, 0x28, 0x0a, 0xd0, 0x4a, 0x78, 0x08, 0x79, + 0x05, 0x31, 0x09, 0xf0, 0xdd, 0xfa, 0x31, 0x69, + 0xf7, 0xf7, 0x85, 0xf9, 0xf0, 0x68, 0x00, 0x28, + 0x04, 0xd0, 0x3b, 0x4a, 0x3c, 0x00, 0xd8, 0x90, + 0x00, 0x00, 0x01, 0x32, 0x10, 0x78, 0x00, 0x28, + 0x08, 0xd1, 0x00, 0x20, 0xa8, 0x61, 0x71, 0x6a, + 0x00, 0x29, 0x03, 0xd0, 0x20, 0x1c, 0x14, 0x30, + 0xf7, 0xf7, 0x74, 0xf9, 0x34, 0x4a, 0x5c, 0x32, + 0x10, 0x69, 0x31, 0x6a, 0x41, 0x18, 0x00, 0xe0, + 0x20, 0xe0, 0x0a, 0x23, 0xd0, 0x68, 0x0a, 0x22, + 0x09, 0xf0, 0xfb, 0xfe, 0x00, 0x28, 0x07, 0xd0, + 0x2d, 0x4a, 0x31, 0x6a, 0x5c, 0x32, 0x3c, 0x00, + 0x14, 0x91, 0x00, 0x00, 0xd0, 0x68, 0x40, 0x1a, + 0x11, 0x69, 0x40, 0x1a, 0x70, 0x60, 0x29, 0x4a, + 0x5c, 0x32, 0xd0, 0x68, 0x30, 0x62, 0xf0, 0x69, + 0x00, 0x28, 0x04, 0xd0, 0xfa, 0xf7, 0x00, 0xfd, + 0x01, 0x20, 0xfa, 0xf7, 0xa1, 0xfc, 0xfa, 0xf7, + 0x81, 0xfc, 0x27, 0x48, 0x00, 0x68, 0x03, 0xf0, + 0x07, 0xf9, 0x06, 0x98, 0x00, 0x28, 0x03, 0xd1, + 0x1e, 0x4e, 0x00, 0x23, 0xb3, 0x60, 0x16, 0xe0, + 0x3c, 0x00, 0x50, 0x91, 0x00, 0x00, 0x1c, 0x4e, + 0x01, 0x20, 0xb0, 0x60, 0x06, 0x98, 0x01, 0x68, + 0x40, 0x68, 0xb0, 0x65, 0x19, 0x48, 0x71, 0x65, + 0x54, 0x30, 0xc0, 0x88, 0x00, 0x28, 0x09, 0xd0, + 0xb1, 0x69, 0x00, 0x29, 0x06, 0xd0, 0x01, 0xf0, + 0xdc, 0xfc, 0x01, 0x1c, 0xe0, 0x6a, 0xb2, 0x69, + 0xf7, 0xf7, 0x2f, 0xf9, 0x00, 0x2f, 0x15, 0xd1, + 0x12, 0x48, 0x01, 0x69, 0x00, 0x29, 0x08, 0xd1, + 0x01, 0x21, 0x3c, 0x00, 0x8c, 0x91, 0x00, 0x00, + 0x01, 0x61, 0x2a, 0x68, 0x00, 0x2a, 0x03, 0xd0, + 0x00, 0x21, 0x00, 0x20, 0xf7, 0xf7, 0x20, 0xf9, + 0x09, 0x49, 0x00, 0x23, 0xcb, 0x62, 0x2b, 0x61, + 0x6b, 0x61, 0x06, 0xf0, 0xb5, 0xf8, 0x07, 0xb0, + 0xf0, 0xbd, 0x6b, 0x68, 0x06, 0x48, 0x00, 0x2b, + 0xf9, 0xd0, 0x02, 0x1d, 0x11, 0x1c, 0x38, 0x1c, + 0xf7, 0xf7, 0x0f, 0xf9, 0xf3, 0xe7, 0x00, 0x00, + 0x44, 0x7d, 0x01, 0x00, 0x3c, 0x00, 0xc8, 0x91, + 0x00, 0x00, 0xf4, 0x68, 0x01, 0x00, 0xf4, 0x67, + 0x01, 0x00, 0x03, 0x08, 0x00, 0x00, 0xf8, 0x60, + 0x01, 0x00, 0xc4, 0x67, 0x01, 0x00, 0x08, 0xb5, + 0xf8, 0xf7, 0x2f, 0xfd, 0x00, 0x90, 0x00, 0xab, + 0x18, 0x88, 0x00, 0x28, 0x0c, 0xd0, 0x05, 0xf0, + 0x50, 0xff, 0x00, 0xab, 0x59, 0x88, 0x18, 0x88, + 0x05, 0xf0, 0x6d, 0xf9, 0xfe, 0xf7, 0x97, 0xf8, + 0x03, 0x20, 0xfb, 0xf7, 0x0e, 0xf8, 0x3c, 0x00, + 0x04, 0x92, 0x00, 0x00, 0x08, 0xbd, 0x01, 0x20, + 0xff, 0xf7, 0xb2, 0xfb, 0x00, 0x20, 0x08, 0xf0, + 0x8d, 0xfe, 0xf7, 0xe7, 0xf8, 0xb5, 0x4f, 0x49, + 0x8c, 0x68, 0x20, 0x6a, 0x00, 0x68, 0x05, 0x78, + 0xfc, 0xf7, 0x68, 0xfa, 0x00, 0x28, 0x12, 0xd0, + 0x2a, 0x07, 0x92, 0x0f, 0x01, 0x21, 0x01, 0x2a, + 0x00, 0xd0, 0x00, 0x21, 0x00, 0x29, 0x03, 0xd0, + 0x29, 0x06, 0x09, 0x0f, 0x0b, 0x29, 0x06, 0xd1, + 0x3c, 0x00, 0x40, 0x92, 0x00, 0x00, 0x2a, 0x21, + 0x09, 0x5d, 0x08, 0x18, 0x90, 0x30, 0x00, 0x7b, + 0xf9, 0xf7, 0x0d, 0xfc, 0x41, 0x4f, 0x3c, 0x3f, + 0xb8, 0x6b, 0x79, 0x6b, 0xf7, 0xf7, 0xc0, 0xf8, + 0xa0, 0x6c, 0x00, 0x26, 0xc6, 0x60, 0x60, 0x6b, + 0x80, 0x08, 0x04, 0xd0, 0xb8, 0x69, 0x01, 0x30, + 0xb8, 0x61, 0x06, 0xf0, 0xdc, 0xf9, 0x39, 0x4d, + 0x28, 0x69, 0x80, 0x05, 0x80, 0x0f, 0x08, 0xd1, + 0x78, 0x69, 0x3c, 0x00, 0x7c, 0x92, 0x00, 0x00, + 0x04, 0x21, 0x01, 0x30, 0x78, 0x61, 0x60, 0x6b, + 0x40, 0x08, 0x40, 0x00, 0x08, 0x43, 0x60, 0x63, + 0xb8, 0x6a, 0x00, 0x28, 0x03, 0xd0, 0x60, 0x6b, + 0x08, 0x21, 0x08, 0x43, 0x60, 0x63, 0x20, 0x1c, + 0x20, 0x30, 0x00, 0x90, 0x39, 0x68, 0xf7, 0xf7, + 0x9a, 0xf8, 0x03, 0x20, 0x00, 0x02, 0x28, 0x60, + 0x2b, 0x49, 0x88, 0x68, 0xa0, 0x63, 0xc8, 0x68, + 0xe0, 0x63, 0x08, 0x79, 0x3c, 0x00, 0xb8, 0x92, + 0x00, 0x00, 0xc0, 0x06, 0xc0, 0x0e, 0x25, 0x1c, + 0x40, 0x35, 0x28, 0x71, 0x48, 0x79, 0x68, 0x71, + 0x23, 0x48, 0x3c, 0x38, 0x46, 0x62, 0x00, 0x98, + 0x80, 0x7a, 0x01, 0xf0, 0x5e, 0xfd, 0x00, 0x21, + 0x00, 0x28, 0x21, 0x4a, 0x01, 0xd0, 0x11, 0x78, + 0x03, 0xe0, 0x93, 0x78, 0xdb, 0x07, 0x00, 0xd5, + 0x51, 0x78, 0xa9, 0x71, 0x00, 0x28, 0x04, 0xd0, + 0x1b, 0x49, 0x14, 0x31, 0x08, 0x68, 0x3c, 0x00, + 0xf4, 0x92, 0x00, 0x00, 0x20, 0x64, 0x00, 0xe0, + 0x6e, 0x80, 0xb8, 0x6a, 0xc0, 0x07, 0x02, 0xd5, + 0xff, 0x20, 0x28, 0x71, 0xae, 0x71, 0xe6, 0x61, + 0xb8, 0x68, 0x01, 0x30, 0xb8, 0x60, 0x79, 0x68, + 0x88, 0x42, 0x03, 0xd0, 0x0b, 0x21, 0x85, 0x20, + 0xf7, 0xf7, 0xc4, 0xff, 0x0d, 0x49, 0x88, 0x68, + 0xc0, 0x6c, 0x88, 0x60, 0xfb, 0x6a, 0x00, 0x2b, + 0x0c, 0xd0, 0x0e, 0x4a, 0xd4, 0x7b, 0x00, 0x2b, + 0x3c, 0x00, 0x30, 0x93, 0x00, 0x00, 0x02, 0xdd, + 0x7f, 0x2c, 0x05, 0xd2, 0x01, 0xe0, 0x00, 0x2c, + 0x02, 0xd0, 0xd4, 0x7b, 0xe3, 0x18, 0xd3, 0x73, + 0xfe, 0x62, 0xc9, 0x68, 0x88, 0x42, 0x03, 0xd1, + 0x05, 0x21, 0x85, 0x20, 0xf7, 0xf7, 0xa9, 0xff, + 0xf8, 0xbd, 0x24, 0x7e, 0x01, 0x00, 0x00, 0x40, + 0x07, 0x00, 0xa0, 0x80, 0x07, 0x00, 0xe8, 0x80, + 0x07, 0x00, 0x40, 0x00, 0x07, 0x00, 0xfe, 0xb5, + 0x30, 0x4c, 0x3c, 0x00, 0x6c, 0x93, 0x00, 0x00, + 0xa0, 0x6b, 0x21, 0x6b, 0xf7, 0xf7, 0x33, 0xf8, + 0x2d, 0x49, 0x3c, 0x31, 0x8e, 0x68, 0x70, 0x8b, + 0x06, 0x28, 0x04, 0xd2, 0xe0, 0x69, 0x01, 0x30, + 0xe0, 0x61, 0x0e, 0x20, 0x30, 0x85, 0x28, 0x49, + 0x3c, 0x31, 0x0d, 0x68, 0x00, 0x2d, 0x03, 0xd1, + 0x03, 0x21, 0x85, 0x20, 0xf7, 0xf7, 0x84, 0xff, + 0x24, 0x48, 0x45, 0x61, 0x35, 0x62, 0x31, 0x8d, + 0xef, 0x68, 0x04, 0x39, 0x3c, 0x00, 0xa8, 0x93, + 0x00, 0x00, 0x0c, 0x04, 0x01, 0x21, 0x02, 0x91, + 0x24, 0x0c, 0x00, 0x21, 0x01, 0x91, 0x1d, 0x48, + 0x3c, 0x30, 0x80, 0x8a, 0xa0, 0x42, 0x03, 0xd3, + 0x2c, 0x81, 0xee, 0x60, 0x00, 0x24, 0x0b, 0xe0, + 0x00, 0x2f, 0x04, 0xd1, 0x03, 0x21, 0x85, 0x20, + 0xf7, 0xf7, 0x69, 0xff, 0x04, 0xe0, 0x3d, 0x1c, + 0x20, 0x1a, 0x04, 0x04, 0xff, 0x68, 0x24, 0x0c, + 0x02, 0x98, 0x00, 0x28, 0x04, 0xd0, 0x3c, 0x00, + 0xe4, 0x93, 0x00, 0x00, 0x12, 0x49, 0x01, 0x20, + 0x08, 0x61, 0x00, 0x20, 0x02, 0x90, 0x01, 0x98, + 0x01, 0x30, 0x01, 0x90, 0x00, 0x2c, 0xdd, 0xd1, + 0x0c, 0x48, 0x0c, 0x4c, 0x3c, 0x30, 0x07, 0x60, + 0x01, 0x98, 0x30, 0x65, 0xb5, 0x64, 0x30, 0x6a, + 0x00, 0x68, 0x60, 0x62, 0x60, 0x68, 0x01, 0x30, + 0x60, 0x60, 0xa1, 0x68, 0x01, 0x31, 0x88, 0x42, + 0x03, 0xd0, 0x0a, 0x21, 0x85, 0x20, 0xf7, 0xf7, + 0x3c, 0x00, 0x20, 0x94, 0x00, 0x00, 0x41, 0xff, + 0x04, 0x48, 0x00, 0x68, 0xa0, 0x62, 0xfe, 0xbd, + 0x00, 0x00, 0xe8, 0x7d, 0x01, 0x00, 0x00, 0x30, + 0x07, 0x00, 0x78, 0x6e, 0x01, 0x00, 0xb0, 0xb5, + 0x05, 0x1c, 0x01, 0x21, 0x0f, 0x20, 0x0a, 0xf0, + 0xf8, 0xf8, 0xf2, 0x21, 0x0f, 0x20, 0x0a, 0xf0, + 0xf4, 0xf8, 0x0c, 0x48, 0x0c, 0x4c, 0x00, 0x68, + 0x14, 0x3c, 0x00, 0x28, 0x0c, 0xd0, 0xe0, 0x78, + 0x01, 0x28, 0x3c, 0x00, 0x5c, 0x94, 0x00, 0x00, + 0x09, 0xd0, 0x01, 0x22, 0x29, 0x1c, 0x0f, 0x20, + 0x0a, 0xf0, 0xac, 0xf8, 0x60, 0x78, 0x02, 0x28, + 0x06, 0xd0, 0x01, 0x20, 0x03, 0xe0, 0x60, 0x78, + 0x02, 0x28, 0x01, 0xd0, 0x00, 0x20, 0x60, 0x70, + 0xb0, 0xbd, 0x00, 0x00, 0x98, 0x66, 0x01, 0x00, + 0x02, 0x22, 0x00, 0x28, 0x80, 0xb5, 0x00, 0xd1, + 0x03, 0x22, 0x03, 0x49, 0x0e, 0x20, 0x0a, 0xf0, + 0x9b, 0xf8, 0x00, 0x20, 0x3c, 0x00, 0x98, 0x94, + 0x00, 0x00, 0x80, 0xbd, 0x00, 0x00, 0x50, 0xc3, + 0x00, 0x00, 0xf8, 0xb5, 0x00, 0x23, 0x00, 0x22, + 0x00, 0x28, 0x2e, 0xd0, 0x06, 0x89, 0x04, 0x68, + 0x75, 0x1e, 0x2d, 0x04, 0xb6, 0x1a, 0xf6, 0x07, + 0x2d, 0x0c, 0xf6, 0x0f, 0xb4, 0x46, 0x0e, 0xe0, + 0xa7, 0x5c, 0xa6, 0x18, 0x02, 0x33, 0x00, 0x97, + 0x77, 0x78, 0xa7, 0x54, 0x02, 0x32, 0x12, 0x04, + 0x00, 0x9f, 0x12, 0x0c, 0x00, 0x29, 0x3c, 0x00, + 0xd4, 0x94, 0x00, 0x00, 0x77, 0x70, 0x01, 0xdd, + 0x8b, 0x42, 0x15, 0xda, 0xaa, 0x42, 0xee, 0xd3, + 0xc0, 0x68, 0x00, 0x28, 0x10, 0xd0, 0x02, 0x89, + 0x00, 0x2a, 0xf9, 0xd0, 0x62, 0x46, 0x00, 0x2a, + 0x0b, 0xd0, 0x02, 0x68, 0x66, 0x5d, 0x17, 0x78, + 0x02, 0x33, 0x67, 0x55, 0x16, 0x70, 0x01, 0x22, + 0x00, 0x29, 0xd2, 0xdd, 0x8b, 0x42, 0xd0, 0xdb, + 0xf8, 0xbd, 0x00, 0x22, 0xcd, 0xe7, 0x00, 0x00, + 0x3c, 0x00, 0x10, 0x95, 0x00, 0x00, 0xb0, 0xb5, + 0x04, 0x1c, 0x0d, 0x1c, 0x01, 0x20, 0xf8, 0xf7, + 0x5e, 0xfb, 0x0d, 0x49, 0x00, 0x28, 0xc8, 0x61, + 0x14, 0xd0, 0x62, 0x68, 0x42, 0x60, 0xa2, 0x7c, + 0x02, 0x72, 0xa2, 0x68, 0xc2, 0x60, 0xe2, 0x68, + 0x02, 0x61, 0x22, 0x8a, 0x02, 0x75, 0x0a, 0x1d, + 0x0a, 0x62, 0x12, 0x68, 0x00, 0x2a, 0xff, 0xd1, + 0x02, 0x60, 0x48, 0x60, 0x00, 0x20, 0xa8, 0x60, + 0x01, 0x20, 0x3c, 0x00, 0x4c, 0x95, 0x00, 0x00, + 0xb0, 0xbd, 0x01, 0x20, 0xfa, 0xe7, 0x00, 0x00, + 0xa4, 0x6e, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, + 0x40, 0x68, 0x0d, 0x1c, 0x43, 0x1c, 0x02, 0xd1, + 0x21, 0x1c, 0x09, 0x48, 0x08, 0xe0, 0x00, 0x20, + 0xf8, 0xf7, 0x34, 0xfb, 0x06, 0x49, 0x94, 0x39, + 0x08, 0x61, 0x00, 0x28, 0x03, 0xd0, 0x21, 0x1c, + 0x00, 0xf0, 0x48, 0xfe, 0x00, 0xe0, 0x01, 0x20, + 0xa8, 0x60, 0x01, 0x20, 0x3c, 0x00, 0x88, 0x95, + 0x00, 0x00, 0xb0, 0xbd, 0x00, 0x00, 0x38, 0x6f, + 0x01, 0x00, 0x80, 0xb5, 0x01, 0x21, 0x97, 0x20, + 0xf7, 0xf7, 0x85, 0xfe, 0x00, 0x20, 0x80, 0xbd, + 0x00, 0x00, 0x38, 0xb5, 0x0a, 0x1c, 0x14, 0x32, + 0x00, 0x92, 0x13, 0x1f, 0x05, 0x1c, 0x08, 0x3a, + 0x0c, 0x1c, 0x16, 0x31, 0x40, 0x68, 0xfe, 0xf7, + 0x6c, 0xfe, 0x00, 0x28, 0x01, 0xd0, 0x00, 0x20, + 0x00, 0xe0, 0x01, 0x20, 0x69, 0x68, 0x3c, 0x00, + 0xc4, 0x95, 0x00, 0x00, 0xa0, 0x60, 0x61, 0x60, + 0x01, 0x20, 0x38, 0xbd, 0x10, 0xb5, 0x0c, 0x1c, + 0x01, 0x7a, 0x00, 0x29, 0x0f, 0xd0, 0x01, 0x29, + 0x09, 0xd0, 0x02, 0x29, 0x03, 0xd1, 0x00, 0x21, + 0x00, 0x20, 0x0a, 0xf0, 0x73, 0xfc, 0x00, 0x20, + 0x20, 0x71, 0x01, 0x20, 0x10, 0xbd, 0x41, 0x68, + 0x01, 0x20, 0x0a, 0xf0, 0x6b, 0xfc, 0x00, 0xf0, + 0x0d, 0xf9, 0xf4, 0xe7, 0x80, 0xb5, 0x04, 0x49, + 0x3c, 0x00, 0x00, 0x96, 0x00, 0x00, 0x48, 0x68, + 0x01, 0x38, 0x48, 0x60, 0x01, 0xd1, 0x07, 0xf0, + 0x6e, 0xfb, 0x00, 0x20, 0x80, 0xbd, 0xac, 0x79, + 0x01, 0x00, 0xb0, 0xb5, 0x05, 0x1c, 0x0c, 0x1c, + 0x00, 0xf0, 0x4f, 0xfe, 0xa0, 0x60, 0x68, 0x68, + 0x60, 0x60, 0x01, 0x20, 0xb0, 0xbd, 0xb0, 0xb5, + 0x05, 0x1c, 0x0c, 0x1c, 0x00, 0xf0, 0x6f, 0xfe, + 0xa0, 0x60, 0x68, 0x68, 0x60, 0x60, 0x01, 0x20, + 0xb0, 0xbd, 0x3c, 0x00, 0x3c, 0x96, 0x00, 0x00, + 0x08, 0x1c, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, + 0x0e, 0xc0, 0x08, 0xc0, 0x01, 0x20, 0x70, 0x47, + 0xf8, 0xb5, 0x0f, 0x1c, 0x04, 0x1c, 0x20, 0x79, + 0x20, 0x28, 0x01, 0xd2, 0x20, 0x20, 0x20, 0x71, + 0x66, 0x79, 0x00, 0x2e, 0x02, 0xd1, 0x25, 0x79, + 0x00, 0x22, 0x0d, 0xe0, 0x25, 0x79, 0x29, 0x1c, + 0x30, 0x1c, 0xf7, 0xf7, 0x4f, 0xf8, 0x00, 0x29, + 0x01, 0xd1, 0x32, 0x1c, 0x3c, 0x00, 0x78, 0x96, + 0x00, 0x00, 0x04, 0xe0, 0x70, 0x43, 0x80, 0x19, + 0x05, 0x06, 0x2d, 0x0e, 0x32, 0x1c, 0xe0, 0x79, + 0x29, 0x1c, 0x00, 0xf0, 0xf2, 0xf9, 0x20, 0x7a, + 0x2f, 0x49, 0xc0, 0x07, 0xc0, 0x0f, 0x08, 0x60, + 0x2e, 0x48, 0x00, 0x78, 0xc0, 0x07, 0x43, 0xd5, + 0xa1, 0x79, 0x2c, 0x4a, 0xc8, 0x07, 0x48, 0xd4, + 0x2c, 0x4e, 0x16, 0x60, 0x8b, 0x07, 0x2b, 0x48, + 0x08, 0xd5, 0xcc, 0x08, 0x01, 0x23, 0x3c, 0x00, + 0xb4, 0x96, 0x00, 0x00, 0xa3, 0x40, 0x03, 0x60, + 0x49, 0x07, 0x04, 0xd5, 0x28, 0x49, 0x11, 0x60, + 0x01, 0xe0, 0x40, 0x21, 0x01, 0x60, 0x13, 0x68, + 0x26, 0x4a, 0xb3, 0x42, 0x10, 0xd1, 0x54, 0x68, + 0x01, 0x68, 0x0c, 0x43, 0x54, 0x60, 0x14, 0x68, + 0x0c, 0x40, 0x01, 0xd0, 0x51, 0x61, 0x00, 0xe0, + 0x91, 0x61, 0x54, 0x68, 0x0c, 0x43, 0x54, 0x60, + 0x94, 0x68, 0x21, 0x43, 0x91, 0x60, 0x13, 0xe0, + 0x3c, 0x00, 0xf0, 0x96, 0x00, 0x00, 0x54, 0x7c, + 0x01, 0x68, 0x0c, 0x43, 0x54, 0x74, 0x14, 0x7c, + 0x0c, 0x40, 0x03, 0xd0, 0x14, 0x7c, 0x0c, 0x43, + 0x14, 0x74, 0x02, 0xe0, 0x14, 0x7c, 0x8c, 0x43, + 0x14, 0x74, 0x54, 0x7c, 0x0c, 0x43, 0x54, 0x74, + 0x94, 0x7c, 0x21, 0x43, 0x91, 0x74, 0xb3, 0x42, + 0x05, 0xd1, 0x00, 0x22, 0x01, 0x68, 0x03, 0x20, + 0xff, 0xf7, 0x8d, 0xf8, 0x09, 0xe0, 0x00, 0x68, + 0x00, 0x21, 0x3c, 0x00, 0x2c, 0x97, 0x00, 0x00, + 0x02, 0x06, 0x12, 0x0e, 0x03, 0x20, 0xff, 0xf7, + 0x85, 0xf8, 0x01, 0xe0, 0x0b, 0x48, 0x10, 0x60, + 0x00, 0x20, 0x38, 0x71, 0x7d, 0x71, 0xf7, 0xf7, + 0xe9, 0xfd, 0x01, 0x20, 0xf8, 0xbd, 0x00, 0x00, + 0xcc, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x07, 0x00, + 0x5c, 0x5b, 0x01, 0x00, 0xb9, 0x9b, 0x00, 0x00, + 0x58, 0x5b, 0x01, 0x00, 0x95, 0x9b, 0x00, 0x00, + 0x10, 0x00, 0x07, 0x00, 0x3c, 0x00, 0x68, 0x97, + 0x00, 0x00, 0x55, 0x9b, 0x00, 0x00, 0xb0, 0xb5, + 0x0d, 0x1c, 0x04, 0x30, 0x00, 0x24, 0xfe, 0xf7, + 0xd6, 0xfa, 0x01, 0x20, 0x6c, 0x60, 0xb0, 0xbd, + 0x00, 0x00, 0xf0, 0xb5, 0x07, 0x7a, 0x43, 0x68, + 0x04, 0x1c, 0x0e, 0x48, 0x0e, 0x1c, 0x00, 0x68, + 0x01, 0x25, 0x01, 0x1c, 0x9b, 0xb0, 0x06, 0xe0, + 0x4a, 0x68, 0x9a, 0x42, 0x02, 0xd1, 0x8f, 0x76, + 0x00, 0x25, 0x02, 0xe0, 0x09, 0x68, 0x3c, 0x00, + 0xa4, 0x97, 0x00, 0x00, 0x00, 0x29, 0xf6, 0xd1, + 0x00, 0x2d, 0x05, 0xd1, 0x21, 0x7a, 0x01, 0x29, + 0x02, 0xd1, 0x01, 0xa9, 0xf8, 0xf7, 0xa8, 0xf8, + 0x60, 0x68, 0x04, 0x36, 0x21, 0xc6, 0x1b, 0xb0, + 0x01, 0x20, 0xf0, 0xbd, 0xa4, 0x6e, 0x01, 0x00, + 0x10, 0xb5, 0x0c, 0x1c, 0x08, 0xf0, 0xae, 0xfc, + 0x60, 0x60, 0x01, 0x20, 0x10, 0xbd, 0x00, 0x00, + 0x10, 0xb5, 0x0c, 0x1c, 0x07, 0xf0, 0x84, 0xfa, + 0x3c, 0x00, 0xe0, 0x97, 0x00, 0x00, 0x04, 0xf0, + 0x54, 0xff, 0x00, 0x20, 0x60, 0x60, 0x01, 0x20, + 0x10, 0xbd, 0x00, 0x20, 0xc0, 0x43, 0x48, 0x60, + 0x01, 0x20, 0x70, 0x47, 0x00, 0x00, 0x10, 0xb5, + 0x0c, 0x1c, 0x00, 0x79, 0xfa, 0xf7, 0x07, 0xf8, + 0x00, 0x28, 0x01, 0xd0, 0x00, 0x20, 0x00, 0xe0, + 0x02, 0x20, 0x60, 0x60, 0x01, 0x20, 0x10, 0xbd, + 0x00, 0x00, 0x1c, 0xb5, 0x06, 0x4c, 0x20, 0x68, + 0x00, 0x28, 0x3c, 0x00, 0x1c, 0x98, 0x00, 0x00, + 0x07, 0xd0, 0x09, 0xf0, 0xc5, 0xfa, 0x01, 0x90, + 0x20, 0x68, 0x41, 0x68, 0x68, 0x46, 0xf6, 0xf7, + 0xd6, 0xfd, 0x1c, 0xbd, 0xac, 0x79, 0x01, 0x00, + 0x01, 0x49, 0x08, 0x60, 0x70, 0x47, 0x00, 0x00, + 0xac, 0x79, 0x01, 0x00, 0x0e, 0xb5, 0x06, 0x4b, + 0x1b, 0x68, 0x00, 0x2b, 0x06, 0xd0, 0x02, 0x90, + 0x00, 0x91, 0x01, 0x92, 0x68, 0x46, 0xd9, 0x68, + 0xf6, 0xf7, 0xc1, 0xfd, 0x3c, 0x00, 0x58, 0x98, + 0x00, 0x00, 0x0e, 0xbd, 0x00, 0x00, 0xac, 0x79, + 0x01, 0x00, 0x1c, 0xb5, 0x04, 0x1c, 0x07, 0xf0, + 0x4c, 0xfa, 0x06, 0x48, 0x41, 0x68, 0x01, 0x31, + 0x41, 0x60, 0x00, 0x94, 0x00, 0x21, 0x01, 0x91, + 0x00, 0x68, 0x01, 0x68, 0x68, 0x46, 0xf6, 0xf7, + 0xad, 0xfd, 0x1c, 0xbd, 0x00, 0x00, 0xac, 0x79, + 0x01, 0x00, 0x80, 0xb5, 0xf8, 0xf7, 0xa3, 0xf8, + 0x80, 0xbd, 0x80, 0xb5, 0x02, 0x1c, 0x3c, 0x00, + 0x94, 0x98, 0x00, 0x00, 0x80, 0x21, 0x03, 0x20, + 0x00, 0xf0, 0x5c, 0xf8, 0x01, 0x1c, 0x03, 0x48, + 0x00, 0x22, 0x43, 0x69, 0xf6, 0xf7, 0x9b, 0xfd, + 0x80, 0xbd, 0x00, 0x00, 0xa4, 0x6d, 0x01, 0x00, + 0xf8, 0xb5, 0x0c, 0x1c, 0x13, 0x49, 0x05, 0x1c, + 0x08, 0x68, 0x16, 0x1c, 0x01, 0x30, 0x08, 0x60, + 0x00, 0x20, 0x20, 0x61, 0x22, 0x1c, 0x10, 0x32, + 0x28, 0x1d, 0x00, 0x21, 0x07, 0x1c, 0x00, 0x92, + 0x3c, 0x00, 0xd0, 0x98, 0x00, 0x00, 0x03, 0xf0, + 0xde, 0xfe, 0x20, 0x71, 0x20, 0x69, 0x00, 0x28, + 0x10, 0xd0, 0x01, 0x04, 0x09, 0x0c, 0x00, 0x20, + 0xf7, 0xf7, 0x79, 0xfe, 0x30, 0x60, 0x29, 0x1d, + 0x03, 0xc9, 0xa0, 0x60, 0xe1, 0x60, 0x30, 0x68, + 0x01, 0x68, 0x00, 0x9a, 0x38, 0x1c, 0x03, 0xf0, + 0xca, 0xfe, 0x20, 0x71, 0x01, 0x20, 0xf8, 0xbd, + 0x00, 0x00, 0x10, 0x75, 0x01, 0x00, 0x80, 0xb5, + 0x02, 0x1c, 0x3c, 0x00, 0x0c, 0x99, 0x00, 0x00, + 0x08, 0x21, 0x04, 0x20, 0x09, 0xf0, 0x4e, 0xff, + 0x03, 0x20, 0x80, 0xbd, 0x10, 0xb5, 0x07, 0x4a, + 0x0c, 0x1c, 0x51, 0x68, 0x01, 0x31, 0x51, 0x60, + 0x01, 0x1c, 0x10, 0x31, 0xc2, 0x68, 0x04, 0x30, + 0x03, 0xf0, 0xf0, 0xfe, 0x20, 0x71, 0x00, 0x20, + 0x10, 0xbd, 0x00, 0x00, 0x10, 0x75, 0x01, 0x00, + 0x04, 0x49, 0x80, 0xb5, 0x81, 0x61, 0x08, 0x21, + 0x02, 0x1c, 0x03, 0x20, 0x3c, 0x00, 0x48, 0x99, + 0x00, 0x00, 0x09, 0xf0, 0x32, 0xff, 0x03, 0x20, + 0x80, 0xbd, 0x95, 0xd8, 0x00, 0x00, 0xf7, 0xb5, + 0x07, 0x1c, 0x16, 0x1c, 0x06, 0x21, 0x00, 0x20, + 0x82, 0xb0, 0xf7, 0xf7, 0x3a, 0xfe, 0x05, 0x1c, + 0x20, 0x48, 0x00, 0x78, 0x06, 0x28, 0x00, 0xd9, + 0x28, 0x81, 0x2c, 0x68, 0x00, 0x20, 0xa7, 0x70, + 0x03, 0x99, 0xe1, 0x70, 0x31, 0x1c, 0x03, 0xe0, + 0x0a, 0x89, 0x10, 0x18, 0x0f, 0x1c, 0x3c, 0x00, + 0x84, 0x99, 0x00, 0x00, 0xc9, 0x68, 0x00, 0x29, + 0xf9, 0xd1, 0x6b, 0x46, 0x01, 0xaa, 0x21, 0x1d, + 0x00, 0xf0, 0x34, 0xf8, 0x00, 0xab, 0x18, 0x78, + 0x60, 0x71, 0x18, 0x78, 0x00, 0x28, 0x17, 0xd0, + 0x11, 0x48, 0x40, 0x68, 0x00, 0x28, 0x08, 0xd0, + 0x19, 0x78, 0x00, 0x20, 0xf7, 0xf7, 0x14, 0xfe, + 0x01, 0x1c, 0x38, 0x1c, 0xf7, 0xf7, 0x30, 0xfd, + 0x0a, 0xe0, 0x38, 0x68, 0x00, 0x28, 0x02, 0xd1, + 0x3c, 0x00, 0xc0, 0x99, 0x00, 0x00, 0x3f, 0x60, + 0x01, 0x20, 0xb8, 0x61, 0x00, 0xab, 0x19, 0x78, + 0x38, 0x89, 0x40, 0x18, 0x38, 0x81, 0x00, 0xab, + 0x98, 0x88, 0x31, 0x1c, 0x02, 0x38, 0x20, 0x80, + 0x28, 0x1c, 0xf7, 0xf7, 0x1c, 0xfd, 0x28, 0x1c, + 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xc8, 0x5c, + 0x01, 0x00, 0x01, 0x79, 0x42, 0x79, 0x00, 0x88, + 0x89, 0x18, 0x02, 0x39, 0x40, 0x1a, 0x70, 0x47, + 0x00, 0x00, 0x3c, 0x00, 0xfc, 0x99, 0x00, 0x00, + 0x70, 0xb5, 0x08, 0x4d, 0x2c, 0x78, 0xad, 0x78, + 0x20, 0x18, 0x06, 0x1c, 0x00, 0x2d, 0x03, 0xd0, + 0x70, 0x19, 0x01, 0x38, 0x01, 0x3d, 0xa8, 0x43, + 0x10, 0x80, 0x80, 0x1b, 0x18, 0x70, 0x0c, 0x70, + 0x70, 0xbd, 0x00, 0x00, 0xc8, 0x5c, 0x01, 0x00, + 0xb0, 0xb5, 0x04, 0x68, 0x0c, 0x4a, 0x21, 0x88, + 0x52, 0x78, 0x02, 0x31, 0x91, 0x42, 0x11, 0xd2, + 0x55, 0x1a, 0xf7, 0xf7, 0x3c, 0x00, 0x38, 0x9a, + 0x00, 0x00, 0xc9, 0xfd, 0x01, 0x68, 0x00, 0x29, + 0x02, 0xd1, 0x00, 0x60, 0x01, 0x21, 0x81, 0x61, + 0x01, 0x89, 0x49, 0x19, 0x01, 0x81, 0x20, 0x88, + 0x40, 0x19, 0x20, 0x80, 0x60, 0x79, 0x40, 0x19, + 0x60, 0x71, 0xb0, 0xbd, 0x00, 0x00, 0xc8, 0x5c, + 0x01, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x06, 0x21, + 0xf1, 0x20, 0x09, 0xf0, 0xa2, 0xfe, 0x80, 0xbd, + 0x00, 0x00, 0x03, 0x1c, 0x02, 0x48, 0x3c, 0x00, + 0x74, 0x9a, 0x00, 0x00, 0x03, 0x70, 0x41, 0x70, + 0x82, 0x70, 0x70, 0x47, 0xc8, 0x5c, 0x01, 0x00, + 0xb0, 0xb5, 0x08, 0x1c, 0x09, 0x68, 0x15, 0x1c, + 0x8c, 0x78, 0xf7, 0xf7, 0x85, 0xfd, 0x04, 0x49, + 0xa0, 0x00, 0x09, 0x58, 0x00, 0x29, 0x02, 0xd0, + 0x28, 0x1c, 0xf6, 0xf7, 0x9e, 0xfc, 0xb0, 0xbd, + 0x84, 0x6d, 0x01, 0x00, 0xfe, 0xb5, 0x04, 0x1c, + 0xc0, 0x7a, 0xa1, 0x7a, 0xc6, 0x07, 0xf6, 0x0f, + 0x3c, 0x00, 0xb0, 0x9a, 0x00, 0x00, 0x32, 0x1c, + 0x20, 0x1d, 0x01, 0xf0, 0x3c, 0xf8, 0x60, 0x69, + 0x25, 0x4f, 0xc1, 0x07, 0x37, 0xd5, 0xb8, 0x69, + 0x00, 0x28, 0x01, 0xd0, 0xf6, 0xf7, 0x87, 0xfc, + 0x20, 0x68, 0x05, 0x68, 0x28, 0x88, 0x80, 0x07, + 0x34, 0xd1, 0x01, 0xaa, 0x02, 0xa9, 0x28, 0x1c, + 0x01, 0xf0, 0x0b, 0xfc, 0x28, 0x1c, 0x01, 0xf0, + 0x12, 0xfc, 0x00, 0x78, 0xc0, 0x07, 0x0a, 0xd4, + 0x60, 0x69, 0x3c, 0x00, 0xec, 0x9a, 0x00, 0x00, + 0x80, 0x07, 0x26, 0xd4, 0x33, 0x1c, 0x29, 0x1c, + 0xa2, 0x7a, 0x20, 0x69, 0x7d, 0x69, 0xf6, 0xf7, + 0x72, 0xfc, 0x1e, 0xe0, 0x00, 0xab, 0x18, 0x7a, + 0x00, 0x28, 0x03, 0xd0, 0x01, 0x28, 0x06, 0xd0, + 0x02, 0x28, 0x16, 0xd1, 0x28, 0x1c, 0x79, 0x6a, + 0xf6, 0xf7, 0x61, 0xfc, 0x11, 0xe0, 0x00, 0xab, + 0x18, 0x79, 0x0e, 0x28, 0x01, 0xd0, 0x0f, 0x28, + 0x0b, 0xd1, 0x28, 0x1c, 0x3c, 0x00, 0x28, 0x9b, + 0x00, 0x00, 0x39, 0x6a, 0xf6, 0xf7, 0x56, 0xfc, + 0x06, 0xe0, 0x00, 0x07, 0x80, 0x0f, 0x03, 0xd1, + 0x20, 0x69, 0xf9, 0x69, 0xf6, 0xf7, 0x4e, 0xfc, + 0x78, 0x6b, 0x21, 0x21, 0x01, 0x30, 0x78, 0x63, + 0x22, 0x1c, 0x80, 0x20, 0x09, 0xf0, 0x31, 0xfe, + 0xfe, 0xbd, 0x28, 0x7a, 0x01, 0x00, 0x0b, 0x49, + 0x18, 0xb5, 0x08, 0x78, 0xc0, 0x07, 0x11, 0xd5, + 0x0a, 0x4a, 0x10, 0x1c, 0x20, 0x30, 0x3c, 0x00, + 0x64, 0x9b, 0x00, 0x00, 0x84, 0x79, 0x00, 0xab, + 0x1c, 0x70, 0xc0, 0x79, 0x58, 0x70, 0x08, 0x78, + 0x40, 0x23, 0x18, 0x43, 0x08, 0x70, 0x05, 0x48, + 0x00, 0x78, 0x08, 0x70, 0x00, 0xab, 0x18, 0x88, + 0xd0, 0x84, 0x18, 0xbd, 0x04, 0x00, 0x07, 0x00, + 0x00, 0x10, 0x07, 0x00, 0xe0, 0x60, 0x01, 0x00, + 0x70, 0x47, 0x00, 0x00, 0x05, 0x49, 0x10, 0xb5, + 0x88, 0x79, 0x05, 0x4b, 0x1a, 0x7c, 0x05, 0x4c, + 0x3c, 0x00, 0xa0, 0x9b, 0x00, 0x00, 0x24, 0x68, + 0x62, 0x40, 0x1a, 0x74, 0x88, 0x71, 0x10, 0xbd, + 0x00, 0x00, 0x20, 0x10, 0x07, 0x00, 0x10, 0x00, + 0x07, 0x00, 0x58, 0x5b, 0x01, 0x00, 0x04, 0x49, + 0x0a, 0x68, 0x04, 0x48, 0x00, 0x68, 0x02, 0x40, + 0x01, 0xd0, 0x88, 0x61, 0x70, 0x47, 0x48, 0x61, + 0x70, 0x47, 0x10, 0x00, 0x07, 0x00, 0x58, 0x5b, + 0x01, 0x00, 0x02, 0x1c, 0x01, 0x20, 0x00, 0x06, + 0x08, 0x43, 0x3c, 0x00, 0xdc, 0x9b, 0x00, 0x00, + 0x80, 0xb5, 0x2a, 0x21, 0x09, 0xf0, 0xe6, 0xfd, + 0x80, 0xbd, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x1c, + 0x00, 0x29, 0x03, 0xd0, 0x81, 0x29, 0x07, 0xd1, + 0x81, 0x20, 0x00, 0xe0, 0x80, 0x20, 0x22, 0x1c, + 0x2c, 0x21, 0x09, 0xf0, 0xd7, 0xfd, 0x10, 0xbd, + 0x02, 0x21, 0x2c, 0x20, 0xf7, 0xf7, 0x4c, 0xfb, + 0x20, 0x1c, 0xf7, 0xf7, 0xc3, 0xfc, 0x10, 0xbd, + 0x80, 0xb5, 0xb4, 0xb0, 0x3c, 0x00, 0x18, 0x9c, + 0x00, 0x00, 0x01, 0x28, 0x06, 0xd0, 0x82, 0x28, + 0x1c, 0xd1, 0x1a, 0xa8, 0x07, 0xf0, 0x35, 0xfc, + 0x34, 0xb0, 0x80, 0xbd, 0x81, 0x29, 0x13, 0xd1, + 0x0d, 0x48, 0x0c, 0x4a, 0x81, 0x69, 0x00, 0x68, + 0x50, 0x32, 0x81, 0x42, 0x02, 0xd0, 0xd1, 0x6a, + 0x01, 0x29, 0x02, 0xd0, 0x11, 0x78, 0x02, 0x29, + 0x02, 0xd1, 0x07, 0xf0, 0x0a, 0xf9, 0xeb, 0xe7, + 0x69, 0x46, 0xf7, 0xf7, 0x5a, 0xfe, 0x3c, 0x00, + 0x54, 0x9c, 0x00, 0x00, 0xe7, 0xe7, 0x01, 0x21, + 0x00, 0xe0, 0x02, 0x21, 0x18, 0x20, 0xf7, 0xf7, + 0x21, 0xfb, 0xe0, 0xe7, 0xa4, 0x6e, 0x01, 0x00, + 0xb0, 0xb5, 0x04, 0x1c, 0x00, 0x68, 0x17, 0x4d, + 0x9a, 0xb0, 0x68, 0x63, 0x08, 0xf0, 0x3e, 0xfa, + 0x20, 0x79, 0x14, 0x49, 0x13, 0x4a, 0x50, 0x39, + 0x2c, 0x3a, 0x02, 0x28, 0x0a, 0xd1, 0x90, 0x68, + 0x80, 0x02, 0xa8, 0x61, 0xc8, 0x68, 0xe8, 0x61, + 0x3c, 0x00, 0x90, 0x9c, 0x00, 0x00, 0x02, 0x20, + 0x28, 0x72, 0x07, 0xf0, 0xe4, 0xf8, 0x1a, 0xb0, + 0xb0, 0xbd, 0x03, 0x1c, 0x00, 0x20, 0x00, 0x2b, + 0x0b, 0xd1, 0x52, 0x68, 0x92, 0x02, 0xaa, 0x61, + 0x0a, 0x1c, 0x89, 0x68, 0xe9, 0x61, 0x28, 0x72, + 0x10, 0x68, 0x69, 0x46, 0xf7, 0xf7, 0x27, 0xfe, + 0xed, 0xe7, 0xa8, 0x61, 0x01, 0x20, 0x28, 0x72, + 0x28, 0x70, 0x00, 0x20, 0x06, 0xf0, 0x7d, 0xfa, + 0xe5, 0xe7, 0x3c, 0x00, 0xcc, 0x9c, 0x00, 0x00, + 0xf4, 0x6e, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, 0x01, 0x21, + 0x07, 0x20, 0xf7, 0xf7, 0xe1, 0xfa, 0x80, 0xbd, + 0x70, 0x47, 0x00, 0x00, 0xf8, 0xb5, 0x00, 0x24, + 0x19, 0x4a, 0x00, 0x26, 0xd5, 0x68, 0x11, 0x68, + 0x04, 0x35, 0x08, 0x1c, 0x91, 0x60, 0x02, 0xe0, + 0x01, 0x1c, 0x40, 0x19, 0x08, 0x60, 0x53, 0x68, + 0x83, 0x42, 0xf9, 0xd8, 0x3c, 0x00, 0x08, 0x9d, + 0x00, 0x00, 0x01, 0x34, 0x10, 0x32, 0x03, 0x2c, + 0x0e, 0x60, 0xee, 0xd3, 0xf6, 0xf7, 0xf1, 0xff, + 0x10, 0x48, 0x10, 0x49, 0x12, 0x4c, 0x08, 0x60, + 0x10, 0x49, 0x00, 0x20, 0x01, 0x22, 0x19, 0x23, + 0x5b, 0x01, 0x0c, 0x25, 0x43, 0x43, 0x1b, 0x19, + 0x45, 0x43, 0x4a, 0x51, 0x1f, 0x1c, 0x6d, 0x18, + 0xab, 0x60, 0x6b, 0x60, 0x00, 0x25, 0x1e, 0x1c, + 0x14, 0x36, 0x9e, 0x60, 0x33, 0x1c, 0x3c, 0x00, + 0x44, 0x9d, 0x00, 0x00, 0x01, 0x35, 0x27, 0x2d, + 0xf8, 0xdb, 0x01, 0x30, 0x03, 0x28, 0x9f, 0x60, + 0xe8, 0xdb, 0xf8, 0xbd, 0x20, 0x57, 0x01, 0x00, + 0x14, 0xc8, 0x01, 0x00, 0xb4, 0xcf, 0x01, 0x00, + 0x18, 0xd9, 0x01, 0x00, 0xb8, 0xcf, 0x01, 0x00, + 0xb0, 0xb5, 0x07, 0x4c, 0x25, 0x1c, 0xc0, 0x35, + 0x28, 0x6b, 0x1e, 0x21, 0x00, 0xf0, 0xf2, 0xf9, + 0xa2, 0x6b, 0x20, 0x1c, 0xdc, 0x30, 0x29, 0x6b, + 0x3c, 0x00, 0x80, 0x9d, 0x00, 0x00, 0x00, 0xf0, + 0xb6, 0xf9, 0xb0, 0xbd, 0x00, 0x00, 0xc4, 0x69, + 0x01, 0x00, 0x00, 0x20, 0x10, 0x22, 0x10, 0xb5, + 0x0a, 0x49, 0x05, 0xe0, 0x0c, 0x23, 0x43, 0x43, + 0x5c, 0x18, 0x0c, 0x34, 0xcc, 0x50, 0x01, 0x30, + 0x0f, 0x28, 0xf7, 0xd3, 0x0c, 0x23, 0x58, 0x43, + 0x09, 0x50, 0x04, 0x48, 0x41, 0x60, 0x01, 0x60, + 0x02, 0x82, 0x00, 0x21, 0x81, 0x60, 0xc1, 0x60, + 0x10, 0xbd, 0x3c, 0x00, 0xbc, 0x9d, 0x00, 0x00, + 0x84, 0xe2, 0x01, 0x00, 0x44, 0xe3, 0x01, 0x00, + 0x10, 0xb5, 0x08, 0x4c, 0xa0, 0x6a, 0x00, 0x28, + 0x03, 0xd1, 0x07, 0x48, 0xf9, 0xf7, 0xe8, 0xfe, + 0xa0, 0x62, 0x04, 0x48, 0x44, 0x30, 0x00, 0x68, + 0x01, 0x21, 0xf9, 0xf7, 0x95, 0xfc, 0x60, 0x62, + 0x10, 0xbd, 0x00, 0x00, 0x60, 0x6c, 0x01, 0x00, + 0xcd, 0x26, 0x01, 0x00, 0xff, 0xb5, 0x0d, 0x1c, + 0x04, 0x1c, 0x1e, 0x1c, 0x3c, 0x00, 0xf8, 0x9d, + 0x00, 0x00, 0x81, 0xb0, 0x0a, 0x9f, 0x1c, 0x21, + 0xf6, 0xf7, 0x4d, 0xfb, 0x03, 0x98, 0xa0, 0x61, + 0x25, 0x60, 0x25, 0x61, 0x26, 0x81, 0xa6, 0x82, + 0xe7, 0x60, 0x05, 0xb0, 0xf0, 0xbd, 0x70, 0xb5, + 0x0d, 0x1c, 0xa4, 0x21, 0x04, 0x1c, 0x08, 0x30, + 0xf6, 0xf7, 0x3d, 0xfb, 0x20, 0x1c, 0x44, 0x30, + 0x06, 0x22, 0x29, 0x1c, 0xf6, 0xf7, 0x65, 0xfb, + 0x18, 0x48, 0x3c, 0x23, 0x41, 0x1c, 0x3c, 0x00, + 0x34, 0x9e, 0x00, 0x00, 0x61, 0x62, 0x41, 0x78, + 0x59, 0x43, 0x09, 0x18, 0x89, 0x7a, 0x06, 0x29, + 0x01, 0xd1, 0xa0, 0x62, 0x02, 0xe0, 0x21, 0x1c, + 0x4d, 0x31, 0xa1, 0x62, 0x41, 0x78, 0x3c, 0x23, + 0x59, 0x43, 0x08, 0x18, 0x04, 0x30, 0x0f, 0x49, + 0x20, 0x62, 0x0b, 0x88, 0x00, 0x2b, 0x15, 0xd0, + 0xac, 0x20, 0x00, 0x5d, 0x0b, 0x4a, 0x18, 0x32, + 0x00, 0x02, 0x80, 0x18, 0xb0, 0x30, 0xe0, 0x60, + 0x3c, 0x00, 0x70, 0x9e, 0x00, 0x00, 0x8d, 0x68, + 0x00, 0x20, 0x08, 0xe0, 0xe2, 0x68, 0xc1, 0x00, + 0x54, 0x50, 0xe6, 0x68, 0x82, 0x00, 0x52, 0x19, + 0x71, 0x18, 0x4a, 0x60, 0x01, 0x30, 0x98, 0x42, + 0xf4, 0xdb, 0x70, 0xbd, 0x00, 0x00, 0x68, 0x61, + 0x01, 0x00, 0x58, 0x75, 0x01, 0x00, 0x1f, 0xb5, + 0x04, 0x1c, 0x60, 0x34, 0x61, 0x7a, 0x03, 0x1c, + 0x80, 0x6a, 0x08, 0x4a, 0x02, 0x91, 0x01, 0x90, + 0x03, 0x92, 0x3c, 0x00, 0xac, 0x9e, 0x00, 0x00, + 0xe2, 0x79, 0x18, 0x1c, 0x20, 0x30, 0x00, 0x92, + 0x44, 0x7b, 0x82, 0x7b, 0x5e, 0x20, 0xc1, 0x5a, + 0x18, 0x69, 0x04, 0x30, 0x23, 0x1c, 0x02, 0xf0, + 0x7f, 0xfe, 0x1f, 0xbd, 0x39, 0x4e, 0x00, 0x00, + 0xb0, 0xb5, 0x0b, 0x1c, 0x01, 0x88, 0x69, 0x20, + 0xc0, 0x5c, 0x86, 0xb0, 0x0e, 0x4a, 0x04, 0x91, + 0x03, 0x90, 0x05, 0x92, 0x0d, 0x4d, 0x59, 0x6a, + 0x9a, 0x6a, 0x2d, 0x68, 0x3c, 0x00, 0xe8, 0x9e, + 0x00, 0x00, 0x01, 0x24, 0x00, 0x2d, 0x00, 0xd0, + 0x04, 0x1c, 0x0a, 0x48, 0x00, 0x5d, 0x01, 0x91, + 0x02, 0x92, 0x00, 0x90, 0x18, 0x1c, 0x20, 0x30, + 0x44, 0x7b, 0x82, 0x7b, 0x5e, 0x20, 0xc1, 0x5a, + 0x18, 0x69, 0x04, 0x30, 0x23, 0x1c, 0x02, 0xf0, + 0xa4, 0xfe, 0x06, 0xb0, 0xb0, 0xbd, 0x51, 0x4f, + 0x00, 0x00, 0x18, 0x67, 0x01, 0x00, 0x0a, 0x61, + 0x01, 0x00, 0x01, 0x89, 0x8a, 0x1c, 0x3c, 0x00, + 0x24, 0x9f, 0x00, 0x00, 0x02, 0x81, 0x02, 0x68, + 0x02, 0x3a, 0x02, 0x60, 0x08, 0x0a, 0x09, 0x02, + 0x08, 0x43, 0x10, 0x80, 0x70, 0x47, 0x00, 0x00, + 0x70, 0xb5, 0x05, 0x1c, 0x08, 0x78, 0x0e, 0x1c, + 0xff, 0x28, 0x14, 0xd0, 0x71, 0x78, 0x02, 0x31, + 0x00, 0x20, 0xf7, 0xf7, 0x45, 0xfb, 0x04, 0x1c, + 0x02, 0x89, 0x00, 0x68, 0x31, 0x1c, 0xf6, 0xf7, + 0xcf, 0xfa, 0x00, 0x2d, 0x06, 0xd0, 0x28, 0x1c, + 0x3c, 0x00, 0x60, 0x9f, 0x00, 0x00, 0xf7, 0xf7, + 0x34, 0xfb, 0x21, 0x1c, 0xf7, 0xf7, 0x57, 0xfa, + 0x00, 0xe0, 0x25, 0x1c, 0x28, 0x1c, 0x70, 0xbd, + 0x00, 0x00, 0xff, 0xb5, 0x0f, 0x1c, 0x1e, 0x1c, + 0x04, 0x1c, 0x98, 0x1c, 0x01, 0x04, 0x09, 0x0c, + 0x00, 0x20, 0x81, 0xb0, 0xf7, 0xf7, 0x27, 0xfb, + 0x05, 0x1c, 0x00, 0x68, 0x00, 0x2c, 0x38, 0x60, + 0x03, 0x99, 0x01, 0x70, 0x38, 0x68, 0x46, 0x70, + 0x06, 0xd0, 0x3c, 0x00, 0x9c, 0x9f, 0x00, 0x00, + 0x20, 0x1c, 0xf7, 0xf7, 0x15, 0xfb, 0x29, 0x1c, + 0xf7, 0xf7, 0x38, 0xfa, 0x00, 0xe0, 0x2c, 0x1c, + 0x20, 0x1c, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, + 0x70, 0xb5, 0x10, 0x48, 0x04, 0x68, 0x04, 0x60, + 0x0f, 0x49, 0x20, 0x20, 0x08, 0x60, 0xa0, 0x05, + 0x0e, 0x4e, 0x02, 0xd5, 0x70, 0x6a, 0xf6, 0xf7, + 0x05, 0xfa, 0xe0, 0x01, 0x02, 0xd5, 0x30, 0x6e, + 0xf6, 0xf7, 0x00, 0xfa, 0x3c, 0x00, 0xd8, 0x9f, + 0x00, 0x00, 0x0a, 0x48, 0x04, 0x40, 0x00, 0x25, + 0x07, 0xe0, 0xe0, 0x07, 0x03, 0xd5, 0xa8, 0x00, + 0x30, 0x58, 0xf6, 0xf7, 0xf6, 0xf9, 0x01, 0x35, + 0x64, 0x08, 0x00, 0x2c, 0xf5, 0xd1, 0x70, 0xbd, + 0x00, 0x00, 0x00, 0x40, 0x07, 0x00, 0x00, 0x10, + 0x07, 0x00, 0x30, 0x74, 0x01, 0x00, 0xff, 0xfd, + 0xff, 0xfe, 0x80, 0xb5, 0x07, 0x21, 0x80, 0x20, + 0xf7, 0xf7, 0x49, 0xf9, 0x80, 0xbd, 0x3c, 0x00, + 0x14, 0xa0, 0x00, 0x00, 0xf8, 0xb5, 0x14, 0x4b, + 0x82, 0x00, 0x9c, 0x58, 0xca, 0x06, 0x01, 0x27, + 0x39, 0x1c, 0xd2, 0x0e, 0x91, 0x40, 0x11, 0x4a, + 0x11, 0x60, 0x11, 0x4e, 0x40, 0x00, 0x85, 0x19, + 0x15, 0xe0, 0x60, 0x60, 0x20, 0x7b, 0xc1, 0x00, + 0x89, 0x19, 0x10, 0x31, 0x0a, 0x78, 0x0d, 0x23, + 0x9a, 0x43, 0x0a, 0x70, 0x39, 0x1c, 0x81, 0x40, + 0x31, 0x73, 0x07, 0x49, 0x00, 0x01, 0x08, 0x31, + 0x3c, 0x00, 0x50, 0xa0, 0x00, 0x00, 0x40, 0x18, + 0x08, 0x4a, 0x41, 0x68, 0x42, 0x60, 0x80, 0x68, + 0xf6, 0xf7, 0xbe, 0xf9, 0x28, 0x7b, 0x00, 0x28, + 0xe6, 0xd1, 0xf8, 0xbd, 0x00, 0x00, 0xa4, 0x73, + 0x01, 0x00, 0x00, 0x10, 0x07, 0x00, 0x00, 0x60, + 0x07, 0x00, 0xd1, 0x75, 0x00, 0x00, 0x03, 0x49, + 0x01, 0x20, 0x09, 0x7a, 0x00, 0x29, 0x00, 0xd1, + 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x04, 0x7a, + 0x01, 0x00, 0x3c, 0x00, 0x8c, 0xa0, 0x00, 0x00, + 0x03, 0x49, 0x01, 0x20, 0x89, 0x7a, 0x00, 0x29, + 0x00, 0xd1, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, + 0x14, 0x7a, 0x01, 0x00, 0xb0, 0xb5, 0x00, 0x24, + 0xfa, 0xf7, 0x76, 0xfc, 0x00, 0x28, 0x14, 0xd0, + 0x01, 0x24, 0x08, 0xf0, 0x7d, 0xfe, 0x0a, 0x4d, + 0x0a, 0x4b, 0x00, 0x21, 0x5a, 0x18, 0xa0, 0x32, + 0x12, 0x78, 0x10, 0x2a, 0x06, 0xd3, 0x8a, 0x00, + 0xd2, 0x18, 0x92, 0x6f, 0x3c, 0x00, 0xc8, 0xa0, + 0x00, 0x00, 0x82, 0x1a, 0xaa, 0x42, 0x00, 0xd2, + 0x00, 0x24, 0x01, 0x31, 0x03, 0x29, 0xf0, 0xd3, + 0x20, 0x1c, 0xb0, 0xbd, 0x00, 0x00, 0x8b, 0x08, + 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x01, 0x48, + 0xc0, 0x68, 0x70, 0x47, 0x00, 0x00, 0x78, 0x69, + 0x01, 0x00, 0x70, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, + 0x16, 0x1c, 0xfd, 0xf7, 0x2e, 0xfe, 0x00, 0x20, + 0xe0, 0x60, 0x26, 0x61, 0xa5, 0x60, 0x3c, 0x00, + 0x04, 0xa1, 0x00, 0x00, 0x70, 0xbd, 0x00, 0x00, + 0xf8, 0xb5, 0x17, 0x1c, 0x0e, 0x1c, 0x04, 0x1c, + 0x00, 0x28, 0x01, 0xd0, 0x00, 0x2e, 0x01, 0xd1, + 0xf7, 0xf7, 0xf2, 0xf8, 0xa0, 0x68, 0x07, 0xf0, + 0x49, 0xf9, 0x05, 0x1c, 0x01, 0xd1, 0xf7, 0xf7, + 0xeb, 0xf8, 0x29, 0x1c, 0x6e, 0x60, 0xaf, 0x60, + 0x20, 0x1c, 0xfd, 0xf7, 0xfd, 0xfd, 0xe0, 0x68, + 0x41, 0x1c, 0xe1, 0x60, 0x00, 0x28, 0x03, 0xd1, + 0x3c, 0x00, 0x40, 0xa1, 0x00, 0x00, 0x05, 0x48, + 0x21, 0x69, 0x05, 0xf0, 0x2c, 0xf9, 0x20, 0x68, + 0xa8, 0x42, 0x02, 0xd1, 0x38, 0x1c, 0xf6, 0xf7, + 0x48, 0xf9, 0xf8, 0xbd, 0x00, 0x00, 0xc4, 0x60, + 0x01, 0x00, 0x00, 0x22, 0x01, 0x39, 0x10, 0xb5, + 0x05, 0xe0, 0x0c, 0x23, 0x53, 0x43, 0x1c, 0x18, + 0x0c, 0x34, 0xc4, 0x50, 0x01, 0x32, 0x8a, 0x42, + 0xf7, 0xd3, 0x00, 0x21, 0x0c, 0x23, 0x5a, 0x43, + 0x81, 0x50, 0x3c, 0x00, 0x7c, 0xa1, 0x00, 0x00, + 0x10, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, + 0x01, 0xd1, 0xf7, 0xf7, 0xbb, 0xf8, 0x20, 0x1c, + 0xfd, 0xf7, 0xda, 0xfd, 0x01, 0x1c, 0x85, 0x68, + 0xa0, 0x68, 0x07, 0xf0, 0x09, 0xf9, 0xe0, 0x68, + 0x01, 0x38, 0xe0, 0x60, 0x03, 0xd1, 0x06, 0x48, + 0x21, 0x69, 0x05, 0xf0, 0xe7, 0xf8, 0x21, 0x68, + 0x00, 0x29, 0x03, 0xd0, 0x88, 0x68, 0x49, 0x68, + 0xf6, 0xf7, 0x11, 0xf9, 0x3c, 0x00, 0xb8, 0xa1, + 0x00, 0x00, 0x28, 0x1c, 0xb0, 0xbd, 0xc4, 0x60, + 0x01, 0x00, 0x01, 0x21, 0x00, 0x28, 0x8c, 0xb5, + 0x00, 0xd1, 0x00, 0x21, 0x0e, 0x20, 0x09, 0xf0, + 0x32, 0xfa, 0x83, 0x20, 0x00, 0xab, 0x18, 0x80, + 0x00, 0x20, 0x04, 0xf0, 0x0c, 0xf8, 0x01, 0x90, + 0x68, 0x46, 0x03, 0xf0, 0x7a, 0xf9, 0x8c, 0xbd, + 0x00, 0x00, 0x80, 0xb5, 0x08, 0xf0, 0xdf, 0xfd, + 0x06, 0x49, 0x0a, 0x89, 0x06, 0x49, 0x3c, 0x00, + 0xf4, 0xa1, 0x00, 0x00, 0x09, 0x6e, 0x41, 0x1a, + 0x0b, 0x0c, 0x59, 0x18, 0x89, 0x1a, 0x09, 0x04, + 0x09, 0x0c, 0x40, 0x1a, 0x80, 0xbd, 0x00, 0x00, + 0x00, 0x90, 0x07, 0x00, 0xa4, 0x6c, 0x01, 0x00, + 0x70, 0xb5, 0x04, 0x1c, 0x88, 0x7e, 0x0d, 0x1c, + 0x20, 0x28, 0x03, 0xd9, 0x03, 0x21, 0x18, 0x20, + 0xf7, 0xf7, 0x40, 0xf8, 0x00, 0x26, 0x26, 0x76, + 0xa8, 0x7e, 0x29, 0x1c, 0x1b, 0x31, 0x60, 0x76, + 0x3c, 0x00, 0x30, 0xa2, 0x00, 0x00, 0x20, 0x1c, + 0x1d, 0x30, 0xaa, 0x7e, 0xf6, 0xf7, 0x5f, 0xf9, + 0x68, 0x68, 0x29, 0x1c, 0x60, 0x60, 0xa8, 0x68, + 0x13, 0x31, 0xa0, 0x60, 0xa8, 0x7b, 0x06, 0x22, + 0x20, 0x73, 0xe8, 0x7b, 0x60, 0x73, 0x28, 0x7c, + 0xa0, 0x73, 0x68, 0x7c, 0xe0, 0x73, 0xa8, 0x89, + 0x20, 0x82, 0xa8, 0x7c, 0xe0, 0x76, 0x26, 0x77, + 0x20, 0x1c, 0x12, 0x30, 0xa6, 0x76, 0xf6, 0xf7, + 0x46, 0xf9, 0x3c, 0x00, 0x6c, 0xa2, 0x00, 0x00, + 0x60, 0x68, 0x43, 0x1c, 0x1d, 0xd0, 0x11, 0x4d, + 0x6d, 0x61, 0x28, 0x68, 0x00, 0x28, 0x1a, 0xd0, + 0x22, 0x7b, 0x01, 0x1c, 0x0b, 0x7b, 0x9a, 0x42, + 0x01, 0xd3, 0x20, 0x60, 0x14, 0xe0, 0x0b, 0x1c, + 0x09, 0x68, 0x00, 0x29, 0x0b, 0xd0, 0x0e, 0x7b, + 0xb2, 0x42, 0x08, 0xd2, 0x0b, 0x68, 0x00, 0x2b, + 0xf0, 0xd0, 0x1e, 0x7b, 0xb2, 0x42, 0xed, 0xd3, + 0x23, 0x60, 0x0c, 0x60, 0x3c, 0x00, 0xa8, 0xa2, + 0x00, 0x00, 0x01, 0xe0, 0x21, 0x60, 0x1c, 0x60, + 0x00, 0x20, 0x70, 0xbd, 0x26, 0x60, 0x2c, 0x60, + 0xfa, 0xe7, 0xa4, 0x6e, 0x01, 0x00, 0x13, 0x4a, + 0xb0, 0xb5, 0x51, 0x68, 0x01, 0x24, 0x00, 0x29, + 0x1e, 0xd0, 0x13, 0x1d, 0xd1, 0x61, 0x13, 0x62, + 0x43, 0x68, 0x04, 0xe0, 0x10, 0x62, 0x00, 0x68, + 0xd0, 0x61, 0x00, 0x28, 0x14, 0xd0, 0xd0, 0x69, + 0x45, 0x68, 0x9d, 0x42, 0xf6, 0xd1, 0x3c, 0x00, + 0xe4, 0xa2, 0x00, 0x00, 0x10, 0x6a, 0x81, 0x42, + 0x04, 0xd1, 0x51, 0x60, 0xd0, 0x69, 0x00, 0x68, + 0x08, 0x60, 0x02, 0xe0, 0xd1, 0x69, 0x09, 0x68, + 0x01, 0x60, 0xd0, 0x69, 0xfc, 0xf7, 0xce, 0xff, + 0x00, 0x28, 0x00, 0xd0, 0x00, 0x24, 0x20, 0x1c, + 0xb0, 0xbd, 0x00, 0x00, 0xa4, 0x6e, 0x01, 0x00, + 0xb0, 0xb5, 0x17, 0x4d, 0x01, 0x24, 0x29, 0x68, + 0x00, 0x29, 0x27, 0xd0, 0x6d, 0x61, 0x29, 0x61, + 0x3c, 0x00, 0x20, 0xa3, 0x00, 0x00, 0x43, 0x68, + 0x04, 0xe0, 0x68, 0x61, 0x00, 0x68, 0x28, 0x61, + 0x00, 0x28, 0x1d, 0xd0, 0x28, 0x69, 0x42, 0x68, + 0x9a, 0x42, 0xf6, 0xd1, 0xaa, 0x69, 0x2b, 0x69, + 0x9a, 0x42, 0x00, 0xd1, 0xa9, 0x61, 0x6a, 0x69, + 0x91, 0x42, 0x03, 0xd1, 0x29, 0x60, 0x00, 0x68, + 0x08, 0x60, 0x06, 0xe0, 0x00, 0x68, 0x10, 0x60, + 0x28, 0x68, 0x00, 0x28, 0x01, 0xd1, 0x07, 0xf0, + 0xcc, 0xfe, 0x3c, 0x00, 0x5c, 0xa3, 0x00, 0x00, + 0x28, 0x69, 0xfc, 0xf7, 0x9d, 0xff, 0x00, 0x28, + 0x02, 0xd0, 0x00, 0x24, 0x00, 0xe0, 0x01, 0x24, + 0x20, 0x1c, 0xb0, 0xbd, 0xa4, 0x6e, 0x01, 0x00, + 0xb0, 0xb5, 0x05, 0x1c, 0x07, 0x48, 0x44, 0x68, + 0x07, 0xe0, 0x21, 0x1c, 0x44, 0x31, 0x28, 0x1c, + 0x00, 0xf0, 0xd6, 0xfc, 0x00, 0x28, 0x02, 0xd1, + 0x64, 0x68, 0x00, 0x2c, 0xf5, 0xd1, 0x20, 0x1c, + 0xb0, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xa3, + 0x00, 0x00, 0x58, 0x75, 0x01, 0x00, 0x70, 0xb5, + 0x0d, 0x1c, 0x14, 0x1c, 0x00, 0x28, 0x0b, 0x4e, + 0x08, 0xd0, 0x70, 0x6e, 0x06, 0x23, 0x58, 0x43, + 0x02, 0x04, 0x12, 0x0c, 0x31, 0x1c, 0x28, 0x1c, + 0x22, 0x80, 0x07, 0xe0, 0x21, 0x88, 0x06, 0x20, + 0xf6, 0xf7, 0xa7, 0xf9, 0x70, 0x66, 0x22, 0x88, + 0x29, 0x1c, 0x30, 0x1c, 0xf6, 0xf7, 0x95, 0xf8, + 0x01, 0x20, 0x70, 0xbd, 0x00, 0x00, 0x3c, 0x00, + 0xd4, 0xa3, 0x00, 0x00, 0x10, 0x79, 0x01, 0x00, + 0x80, 0xb5, 0x03, 0x28, 0x03, 0xd8, 0x04, 0x4a, + 0xc0, 0x00, 0x11, 0x50, 0x80, 0xbd, 0x01, 0x21, + 0x26, 0x20, 0xf6, 0xf7, 0x5b, 0xff, 0x80, 0xbd, + 0x7c, 0x79, 0x01, 0x00, 0xb0, 0xb5, 0x05, 0x1c, + 0xc0, 0x68, 0x01, 0x89, 0x39, 0x29, 0x39, 0xd3, + 0x04, 0x68, 0xa0, 0x79, 0x88, 0x28, 0x35, 0xd1, + 0xe0, 0x79, 0x8e, 0x28, 0x32, 0xd1, 0x20, 0x7a, + 0x3c, 0x00, 0x10, 0xa4, 0x00, 0x00, 0x01, 0x28, + 0x2f, 0xd1, 0x60, 0x7a, 0x03, 0x28, 0x2c, 0xd1, + 0x20, 0x7b, 0x02, 0x28, 0x01, 0xd0, 0xfe, 0x28, + 0x27, 0xd1, 0x60, 0x7b, 0x1d, 0x21, 0x08, 0x40, + 0x01, 0x28, 0x22, 0xd1, 0xa0, 0x7b, 0xc8, 0x21, + 0x08, 0x40, 0x08, 0x28, 0x1d, 0xd1, 0xa8, 0x1d, + 0xfb, 0xf7, 0xe1, 0xf9, 0x00, 0x28, 0x18, 0xd0, + 0x19, 0x20, 0x21, 0x5c, 0x00, 0x29, 0x14, 0xd1, + 0x01, 0x30, 0x3c, 0x00, 0x4c, 0xa4, 0x00, 0x00, + 0x39, 0x28, 0xf9, 0xdb, 0x68, 0x8b, 0x04, 0x21, + 0x08, 0x43, 0x68, 0x83, 0x03, 0xf0, 0xd6, 0xfe, + 0x00, 0x28, 0x09, 0xd1, 0x00, 0x23, 0x00, 0x22, + 0x26, 0x20, 0x04, 0x49, 0x09, 0xf0, 0x92, 0xf9, + 0x03, 0x48, 0x00, 0x68, 0x01, 0xf0, 0x84, 0xf9, + 0xb0, 0xbd, 0x00, 0x00, 0x50, 0xc3, 0x00, 0x00, + 0x0c, 0x79, 0x01, 0x00, 0xb0, 0xb5, 0x08, 0x4c, + 0xa3, 0x68, 0x01, 0x33, 0x3c, 0x00, 0x88, 0xa4, + 0x00, 0x00, 0xa3, 0x60, 0x0c, 0x1c, 0x09, 0xd0, + 0x25, 0x68, 0x00, 0x2d, 0x03, 0xd0, 0x23, 0x7a, + 0x61, 0x68, 0xf5, 0xf7, 0xa3, 0xff, 0x20, 0x1c, + 0xf7, 0xf7, 0xa9, 0xf9, 0xb0, 0xbd, 0x94, 0x79, + 0x01, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0xc0, 0x68, + 0x01, 0x89, 0x05, 0x68, 0x08, 0x29, 0x53, 0xd3, + 0x06, 0x22, 0x28, 0x1c, 0x55, 0x49, 0xf5, 0xf7, + 0x9e, 0xff, 0x00, 0x28, 0x37, 0xd1, 0x3c, 0x00, + 0xc4, 0xa4, 0x00, 0x00, 0xe9, 0x88, 0x52, 0x4e, + 0x04, 0x3e, 0x81, 0x29, 0x24, 0xd1, 0xe5, 0x68, + 0x29, 0x68, 0x08, 0x7a, 0x4a, 0x7a, 0x00, 0x02, + 0x80, 0x18, 0x00, 0x04, 0x00, 0x0c, 0x42, 0x0b, + 0x00, 0x05, 0x00, 0x0d, 0xe2, 0x75, 0x20, 0x83, + 0x4b, 0x89, 0x00, 0x20, 0x42, 0x00, 0xb2, 0x5a, + 0x9a, 0x42, 0x06, 0xd1, 0x28, 0x89, 0x0c, 0x38, + 0x02, 0x0a, 0x00, 0x02, 0x10, 0x43, 0x48, 0x81, + 0x3c, 0x00, 0x00, 0xa5, 0x00, 0x00, 0x02, 0xe0, + 0x01, 0x30, 0x02, 0x28, 0xf1, 0xd3, 0xe0, 0x68, + 0x01, 0x89, 0x0a, 0x39, 0x01, 0x81, 0xe0, 0x68, + 0x01, 0x68, 0x0a, 0x31, 0x1c, 0xe0, 0x00, 0x22, + 0x00, 0x20, 0x43, 0x00, 0xf3, 0x5a, 0x8b, 0x42, + 0x01, 0xd1, 0x01, 0x22, 0x02, 0xe0, 0x01, 0x30, + 0x02, 0x28, 0xf6, 0xd3, 0x00, 0x2a, 0x11, 0xd1, + 0x07, 0xe0, 0x36, 0x49, 0x06, 0x22, 0x06, 0x31, + 0x28, 0x1c, 0x3c, 0x00, 0x3c, 0xa5, 0x00, 0x00, + 0xf5, 0xf7, 0x5e, 0xff, 0x00, 0x28, 0x08, 0xd1, + 0xe0, 0x68, 0x01, 0x89, 0x06, 0x39, 0x01, 0x81, + 0xe0, 0x68, 0x01, 0x68, 0x06, 0x31, 0x01, 0x60, + 0x10, 0xe0, 0xe0, 0x68, 0xff, 0xf7, 0xe2, 0xfc, + 0x0c, 0xe0, 0x02, 0x31, 0x01, 0x81, 0xe0, 0x68, + 0x01, 0x68, 0x02, 0x39, 0x01, 0x60, 0xe0, 0x68, + 0x00, 0x89, 0x02, 0x38, 0x02, 0x0a, 0x00, 0x02, + 0x10, 0x43, 0x08, 0x80, 0x3c, 0x00, 0x78, 0xa5, + 0x00, 0x00, 0xe0, 0x68, 0x03, 0x25, 0x02, 0x89, + 0x01, 0x68, 0x24, 0x4e, 0x02, 0x2a, 0x10, 0xd9, + 0x09, 0x88, 0x08, 0x29, 0x05, 0xd0, 0xc1, 0x23, + 0xdb, 0x00, 0x99, 0x42, 0x03, 0xd1, 0x01, 0x25, + 0x02, 0xe0, 0x00, 0x25, 0x00, 0xe0, 0x02, 0x25, + 0xe9, 0x00, 0x71, 0x58, 0x00, 0x29, 0x00, 0xd1, + 0x02, 0x25, 0xf7, 0xf7, 0x04, 0xf8, 0xe9, 0x00, + 0x89, 0x19, 0x89, 0x88, 0x88, 0x42, 0x3c, 0x00, + 0xb4, 0xa5, 0x00, 0x00, 0x00, 0xd9, 0x03, 0x25, + 0xa1, 0x1d, 0x20, 0x1c, 0xfd, 0xf7, 0x34, 0xfc, + 0x00, 0x28, 0x00, 0xd1, 0x03, 0x25, 0x02, 0x2d, + 0x05, 0xd0, 0x03, 0x2d, 0x07, 0xd1, 0xe0, 0x68, + 0xf6, 0xf7, 0xe2, 0xff, 0x70, 0xbd, 0x20, 0x1c, + 0xfd, 0xf7, 0x1c, 0xfd, 0x70, 0xbd, 0xe0, 0x68, + 0x01, 0x89, 0x02, 0x39, 0x01, 0x81, 0xe0, 0x68, + 0x01, 0x68, 0x02, 0x31, 0x01, 0x60, 0xe8, 0x00, + 0x3c, 0x00, 0xf0, 0xa5, 0x00, 0x00, 0x31, 0x58, + 0x20, 0x1c, 0xf5, 0xf7, 0xf1, 0xfe, 0x00, 0x28, + 0xef, 0xd1, 0xe0, 0x68, 0x01, 0x89, 0x02, 0x31, + 0x01, 0x81, 0xe0, 0x68, 0x01, 0x68, 0x02, 0x39, + 0x01, 0x60, 0xe3, 0xe7, 0x00, 0x00, 0x6a, 0x46, + 0x01, 0x00, 0x7c, 0x79, 0x01, 0x00, 0x70, 0xb5, + 0x0e, 0x1c, 0x04, 0x1c, 0x15, 0x1c, 0xf7, 0xf7, + 0x8c, 0xfb, 0x00, 0x28, 0x2a, 0xd0, 0x1b, 0x49, + 0x08, 0x68, 0x3c, 0x00, 0x2c, 0xa6, 0x00, 0x00, + 0x01, 0x30, 0x08, 0x60, 0x00, 0x2e, 0x0a, 0xd0, + 0x01, 0x2e, 0x0b, 0xd0, 0x02, 0x2e, 0x0f, 0xd1, + 0x20, 0x1c, 0x04, 0xf0, 0xcd, 0xf8, 0x20, 0x1c, + 0xff, 0xf7, 0xd6, 0xfe, 0x0c, 0xe0, 0x08, 0x21, + 0xe0, 0x68, 0x02, 0xe0, 0xc1, 0x21, 0xe0, 0x68, + 0xc9, 0x00, 0x04, 0xf0, 0x35, 0xf9, 0x03, 0xe0, + 0x02, 0x21, 0x26, 0x20, 0xf6, 0xf7, 0x20, 0xfe, + 0xe2, 0x7d, 0xe1, 0x6a, 0x3c, 0x00, 0x68, 0xa6, + 0x00, 0x00, 0x28, 0x1c, 0xfc, 0xf7, 0x95, 0xfb, + 0x20, 0x63, 0x00, 0x20, 0x20, 0x62, 0xa0, 0x62, + 0x20, 0x1c, 0x00, 0xf0, 0x6c, 0xfe, 0x70, 0xbd, + 0xe0, 0x68, 0xf6, 0xf7, 0x8a, 0xff, 0x00, 0x2d, + 0xf9, 0xd0, 0xe3, 0x7d, 0x00, 0x22, 0x01, 0x20, + 0xe1, 0x6a, 0xf5, 0xf7, 0xa7, 0xfe, 0x70, 0xbd, + 0x00, 0x00, 0x94, 0x79, 0x01, 0x00, 0x80, 0xb5, + 0x01, 0x28, 0x04, 0xd1, 0x05, 0x48, 0x3c, 0x00, + 0xa4, 0xa6, 0x00, 0x00, 0x00, 0x68, 0x01, 0xf0, + 0x09, 0xf9, 0x80, 0xbd, 0x03, 0x21, 0x26, 0x20, + 0xf6, 0xf7, 0xf8, 0xfd, 0x80, 0xbd, 0x00, 0x00, + 0x0c, 0x79, 0x01, 0x00, 0xf8, 0xb5, 0x06, 0x1c, + 0x80, 0x79, 0x00, 0x24, 0xc0, 0x07, 0x2d, 0xd5, + 0xf0, 0x68, 0x00, 0x68, 0x41, 0x7a, 0x11, 0x29, + 0x28, 0xd1, 0xc1, 0x88, 0x0a, 0x0a, 0x09, 0x02, + 0x11, 0x43, 0xc9, 0x04, 0x22, 0xd1, 0x01, 0x78, + 0x3c, 0x00, 0xe0, 0xa6, 0x00, 0x00, 0x11, 0x4f, + 0x09, 0x07, 0x89, 0x0e, 0x08, 0x18, 0x41, 0x88, + 0x0a, 0x0a, 0x09, 0x02, 0x11, 0x43, 0x0d, 0x04, + 0x2d, 0x0c, 0x43, 0x2d, 0x39, 0x68, 0x01, 0xd1, + 0xca, 0x07, 0x0e, 0xd4, 0x44, 0x2d, 0x06, 0xd1, + 0xc9, 0x07, 0x04, 0xd5, 0x24, 0x30, 0x00, 0xf0, + 0x22, 0xfb, 0x00, 0x28, 0x05, 0xd0, 0x06, 0x48, + 0x85, 0x42, 0x06, 0xd1, 0x38, 0x68, 0x80, 0x07, + 0x03, 0xd5, 0x3c, 0x00, 0x1c, 0xa7, 0x00, 0x00, + 0x01, 0x24, 0xf0, 0x68, 0xf6, 0xf7, 0x3a, 0xff, + 0x20, 0x1c, 0xf8, 0xbd, 0x7c, 0x5a, 0x01, 0x00, + 0x6c, 0x07, 0x00, 0x00, 0x80, 0xb5, 0x00, 0x28, + 0x07, 0xd0, 0x00, 0x21, 0x26, 0x20, 0x08, 0xf0, + 0x7b, 0xff, 0x02, 0x48, 0x00, 0x68, 0x01, 0xf0, + 0xbb, 0xf8, 0x80, 0xbd, 0x0c, 0x79, 0x01, 0x00, + 0x10, 0xb5, 0x04, 0x1c, 0x09, 0x4a, 0x08, 0x1c, + 0x51, 0x68, 0x01, 0x31, 0x3c, 0x00, 0x58, 0xa7, + 0x00, 0x00, 0x51, 0x60, 0x00, 0x21, 0x21, 0x62, + 0xa1, 0x62, 0xe2, 0x7d, 0xe1, 0x6a, 0xfc, 0xf7, + 0x18, 0xfb, 0x20, 0x63, 0x20, 0x1c, 0xf7, 0xf7, + 0xe6, 0xfa, 0x20, 0x1c, 0x00, 0xf0, 0xef, 0xfd, + 0x10, 0xbd, 0x94, 0x79, 0x01, 0x00, 0x0c, 0xb5, + 0x02, 0x1c, 0x08, 0x1c, 0x00, 0x21, 0x01, 0x91, + 0x00, 0x92, 0x6a, 0x46, 0x01, 0xa9, 0x00, 0xf0, + 0x02, 0xf8, 0x0c, 0xbd, 0x00, 0x00, 0x3c, 0x00, + 0x94, 0xa7, 0x00, 0x00, 0x70, 0xb5, 0x13, 0x68, + 0x00, 0x2b, 0x1e, 0xd0, 0x00, 0x26, 0x0b, 0x68, + 0x00, 0x2b, 0x02, 0xd1, 0x13, 0x68, 0x1b, 0x68, + 0x0b, 0x60, 0x13, 0x68, 0x1c, 0x68, 0x1b, 0x89, + 0xe5, 0x18, 0x08, 0xe0, 0x5c, 0x78, 0x1c, 0x19, + 0x02, 0x34, 0x0c, 0x60, 0x1c, 0x78, 0x84, 0x42, + 0x01, 0xd1, 0x18, 0x1c, 0x70, 0xbd, 0x0b, 0x68, + 0xab, 0x42, 0xf3, 0xd3, 0x13, 0x68, 0xdb, 0x68, + 0x3c, 0x00, 0xd0, 0xa7, 0x00, 0x00, 0x13, 0x60, + 0x0e, 0x60, 0x13, 0x68, 0x00, 0x2b, 0xe1, 0xd1, + 0x00, 0x20, 0x70, 0xbd, 0x00, 0x00, 0x70, 0xb5, + 0x03, 0x1c, 0x20, 0xd0, 0x18, 0x68, 0x1e, 0x89, + 0x05, 0x1c, 0x16, 0xe0, 0x04, 0x78, 0xdd, 0x2c, + 0x10, 0xd1, 0x84, 0x78, 0x00, 0x2c, 0x0d, 0xd1, + 0xc4, 0x78, 0x50, 0x2c, 0x0a, 0xd1, 0x04, 0x79, + 0xf2, 0x2c, 0x07, 0xd1, 0x44, 0x79, 0x8c, 0x42, + 0x04, 0xd1, 0x3c, 0x00, 0x0c, 0xa8, 0x00, 0x00, + 0x02, 0x29, 0x0c, 0xd1, 0x84, 0x79, 0x94, 0x42, + 0x09, 0xd0, 0x44, 0x78, 0x20, 0x18, 0x02, 0x30, + 0x44, 0x1b, 0xb4, 0x42, 0xe5, 0xdb, 0xdb, 0x68, + 0x00, 0x2b, 0xde, 0xd1, 0x00, 0x20, 0x70, 0xbd, + 0x04, 0x49, 0x80, 0xb5, 0x0a, 0x78, 0x0a, 0x20, + 0x00, 0x2a, 0x00, 0xd0, 0x48, 0x6a, 0x00, 0xf0, + 0xd1, 0xf8, 0x80, 0xbd, 0x1c, 0x75, 0x01, 0x00, + 0xb0, 0xb5, 0x17, 0x4c, 0x3c, 0x00, 0x48, 0xa8, + 0x00, 0x00, 0x20, 0x68, 0x00, 0x28, 0x29, 0xd0, + 0x16, 0x4d, 0xe8, 0x69, 0x00, 0x28, 0x25, 0xd1, + 0x01, 0xf0, 0x3f, 0xfa, 0x00, 0x28, 0x21, 0xd1, + 0xff, 0xf7, 0x41, 0xfc, 0x00, 0x28, 0x1d, 0xd1, + 0x20, 0x68, 0xa9, 0x69, 0x40, 0x18, 0x08, 0xf0, + 0xd6, 0xf9, 0x00, 0x28, 0x16, 0xd0, 0x02, 0xf0, + 0x06, 0xfd, 0x21, 0x68, 0x40, 0x18, 0x08, 0xf0, + 0xce, 0xf9, 0x00, 0x28, 0x0e, 0xd0, 0x3c, 0x00, + 0x84, 0xa8, 0x00, 0x00, 0x01, 0x20, 0xe8, 0x61, + 0x00, 0x22, 0x25, 0x21, 0x80, 0x20, 0x08, 0xf0, + 0x8f, 0xff, 0x06, 0x48, 0x29, 0x6a, 0x04, 0xf0, + 0x83, 0xfd, 0x01, 0x21, 0x28, 0x6a, 0x00, 0xf0, + 0x89, 0xff, 0xb0, 0xbd, 0xe8, 0x59, 0x01, 0x00, + 0x1c, 0x75, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, + 0x70, 0xb5, 0x05, 0x1c, 0x00, 0x24, 0xfa, 0xf7, + 0x0b, 0xff, 0x18, 0x4e, 0x71, 0x6a, 0x40, 0x18, + 0x3c, 0x00, 0xc0, 0xa8, 0x00, 0x00, 0x00, 0xf0, + 0x8e, 0xf8, 0x00, 0x28, 0x0b, 0xd1, 0x04, 0xf0, + 0xfe, 0xfb, 0x00, 0x21, 0x25, 0x20, 0x08, 0xf0, + 0xb0, 0xfe, 0x03, 0x22, 0x29, 0x1c, 0x28, 0x1c, + 0x00, 0xf0, 0xaf, 0xf8, 0x18, 0xe0, 0x70, 0x6a, + 0x44, 0x1e, 0x00, 0xf0, 0x7c, 0xf8, 0x00, 0x28, + 0x12, 0xd1, 0x0c, 0x48, 0x31, 0x6a, 0x04, 0xf0, + 0x56, 0xfd, 0x01, 0x21, 0x30, 0x6a, 0x00, 0xf0, + 0x5c, 0xff, 0x3c, 0x00, 0xfc, 0xa8, 0x00, 0x00, + 0x00, 0x20, 0xfa, 0xf7, 0x0d, 0xfe, 0x06, 0xf0, + 0x03, 0xf8, 0x00, 0x23, 0x00, 0x22, 0x25, 0x20, + 0x05, 0x49, 0x08, 0xf0, 0x3f, 0xff, 0x20, 0x1c, + 0x07, 0xf0, 0xfc, 0xfa, 0x70, 0xbd, 0x00, 0x00, + 0x1c, 0x75, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, + 0x10, 0x27, 0x00, 0x00, 0x80, 0xb5, 0x01, 0x28, + 0x07, 0xd0, 0x80, 0x28, 0x0d, 0xd1, 0x00, 0x22, + 0x00, 0x21, 0x08, 0x48, 0x3c, 0x00, 0x38, 0xa9, + 0x00, 0x00, 0xf8, 0xf7, 0x9a, 0xfe, 0x80, 0xbd, + 0x01, 0x29, 0x02, 0xd1, 0x06, 0x49, 0x00, 0x20, + 0xc8, 0x61, 0x04, 0xf0, 0xbe, 0xfb, 0x80, 0xbd, + 0x05, 0x21, 0x25, 0x20, 0xf6, 0xf7, 0xa7, 0xfc, + 0x80, 0xbd, 0x61, 0xa9, 0x00, 0x00, 0x1c, 0x75, + 0x01, 0x00, 0x00, 0x21, 0x00, 0x28, 0x80, 0xb5, + 0x01, 0xd1, 0x03, 0x48, 0x41, 0x68, 0x01, 0x22, + 0x25, 0x20, 0x08, 0xf0, 0x2c, 0xfe, 0x3c, 0x00, + 0x74, 0xa9, 0x00, 0x00, 0x80, 0xbd, 0x00, 0x00, + 0xe8, 0x59, 0x01, 0x00, 0x02, 0x49, 0xc8, 0x68, + 0x01, 0x38, 0x48, 0x62, 0x70, 0x47, 0x00, 0x00, + 0x1c, 0x75, 0x01, 0x00, 0x38, 0xb5, 0x03, 0x1c, + 0x08, 0x1c, 0x19, 0x1c, 0x11, 0x4b, 0x06, 0xd0, + 0x01, 0x21, 0x11, 0x80, 0x0a, 0x1c, 0x19, 0x1c, + 0xf5, 0xf7, 0xaa, 0xfd, 0x17, 0xe0, 0x0d, 0x4d, + 0x01, 0x1c, 0x2c, 0x78, 0x12, 0x88, 0x18, 0x1c, + 0x3c, 0x00, 0xb0, 0xa9, 0x00, 0x00, 0xf5, 0xf7, + 0xa2, 0xfd, 0x28, 0x78, 0x84, 0x42, 0x0d, 0xd0, + 0x00, 0x23, 0x6b, 0x61, 0x00, 0x28, 0x03, 0xd0, + 0x00, 0x20, 0x07, 0xf0, 0xa4, 0xfa, 0x05, 0xe0, + 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, 0x00, 0x92, + 0xf8, 0xf7, 0x23, 0xfc, 0x01, 0x20, 0x38, 0xbd, + 0x00, 0x00, 0x1c, 0x75, 0x01, 0x00, 0x70, 0xb5, + 0x04, 0x1c, 0x01, 0x26, 0x08, 0xf0, 0xe1, 0xf9, + 0x05, 0x1c, 0x3c, 0x00, 0xec, 0xa9, 0x00, 0x00, + 0x00, 0x20, 0xfa, 0xf7, 0x8b, 0xfd, 0x44, 0x43, + 0x02, 0xf0, 0x40, 0xfc, 0x02, 0xf0, 0x3e, 0xfc, + 0x01, 0x1c, 0x23, 0x1c, 0x00, 0x22, 0x28, 0x1c, + 0x08, 0xf0, 0x7c, 0xfa, 0x00, 0x28, 0x13, 0xd1, + 0x0a, 0x48, 0x23, 0x1c, 0x00, 0x22, 0x81, 0x69, + 0x28, 0x1c, 0x08, 0xf0, 0x73, 0xfa, 0x00, 0x28, + 0x0a, 0xd1, 0xf8, 0xf7, 0x19, 0xfc, 0x01, 0x1c, + 0x23, 0x1c, 0x00, 0x22, 0x3c, 0x00, 0x28, 0xaa, + 0x00, 0x00, 0x28, 0x1c, 0x08, 0xf0, 0x69, 0xfa, + 0x00, 0x28, 0x00, 0xd1, 0x00, 0x26, 0x30, 0x1c, + 0x70, 0xbd, 0x1c, 0x75, 0x01, 0x00, 0x70, 0xb5, + 0x0d, 0x1c, 0x04, 0x1c, 0x16, 0x1c, 0x07, 0xf0, + 0x76, 0xf9, 0x00, 0x28, 0x0d, 0xd0, 0xfa, 0xf7, + 0x52, 0xfe, 0x00, 0x28, 0x09, 0xd0, 0xff, 0x30, + 0x01, 0x30, 0x43, 0x68, 0x00, 0x2b, 0x04, 0xd0, + 0x22, 0x1c, 0x29, 0x1c, 0x30, 0x1c, 0x3c, 0x00, + 0x64, 0xaa, 0x00, 0x00, 0xf5, 0xf7, 0xbb, 0xfc, + 0x70, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x01, 0x21, + 0x1d, 0x20, 0x08, 0xf0, 0xdf, 0xfd, 0x07, 0x4a, + 0x07, 0x48, 0x11, 0x69, 0x01, 0x60, 0x51, 0x69, + 0x41, 0x60, 0x06, 0x49, 0x49, 0x68, 0x81, 0x60, + 0x00, 0x21, 0xc1, 0x60, 0x03, 0xf0, 0x74, 0xfc, + 0x80, 0xbd, 0x00, 0x00, 0x28, 0x61, 0x01, 0x00, + 0x48, 0x75, 0x01, 0x00, 0x90, 0x5c, 0x01, 0x00, + 0x3c, 0x00, 0xa0, 0xaa, 0x00, 0x00, 0x70, 0xb5, + 0x04, 0x1c, 0x40, 0x6b, 0x00, 0x28, 0x35, 0xd0, + 0x1d, 0x4d, 0x00, 0x26, 0x28, 0x78, 0x00, 0x28, + 0x24, 0xd0, 0x41, 0x20, 0x00, 0x5d, 0x00, 0x28, + 0x03, 0xd1, 0x08, 0xf0, 0x76, 0xf9, 0xa8, 0x61, + 0x1b, 0xe0, 0x69, 0x69, 0x01, 0x31, 0x69, 0x61, + 0xa8, 0x68, 0x00, 0x28, 0x08, 0xd0, 0x81, 0x42, + 0x06, 0xd1, 0x20, 0x69, 0x01, 0x1c, 0x10, 0x31, + 0x04, 0x30, 0x3c, 0x00, 0xdc, 0xaa, 0x00, 0x00, + 0x82, 0x22, 0xff, 0xf7, 0xad, 0xff, 0x68, 0x68, + 0x00, 0x28, 0x0a, 0xd0, 0x69, 0x69, 0x81, 0x42, + 0x07, 0xd1, 0x20, 0x69, 0x01, 0x1c, 0x10, 0x31, + 0x04, 0x30, 0x02, 0x22, 0xff, 0xf7, 0xa0, 0xff, + 0x6e, 0x61, 0x68, 0x78, 0x05, 0x21, 0x08, 0x40, + 0x08, 0xd0, 0x07, 0x48, 0x00, 0x78, 0x0e, 0x28, + 0x03, 0xd3, 0x60, 0x34, 0xe0, 0x79, 0xfb, 0xf7, + 0xcf, 0xff, 0x70, 0xbd, 0x3c, 0x00, 0x18, 0xab, + 0x00, 0x00, 0x03, 0x48, 0x06, 0x60, 0x70, 0xbd, + 0x00, 0x00, 0x1c, 0x75, 0x01, 0x00, 0x10, 0x67, + 0x01, 0x00, 0xd4, 0x7e, 0x01, 0x00, 0x80, 0x02, + 0x70, 0x47, 0x14, 0x23, 0x30, 0xb5, 0x09, 0x4d, + 0x4b, 0x43, 0x5b, 0x19, 0x5b, 0x68, 0x08, 0x24, + 0x00, 0x2b, 0x00, 0xd1, 0x02, 0x24, 0x38, 0x23, + 0x5a, 0x43, 0x05, 0x4b, 0x89, 0x00, 0xd2, 0x18, + 0x51, 0x5a, 0x02, 0x68, 0x09, 0x19, 0x3c, 0x00, + 0x54, 0xab, 0x00, 0x00, 0x51, 0x1a, 0x01, 0x60, + 0x30, 0xbd, 0x00, 0x00, 0x74, 0x40, 0x01, 0x00, + 0x8c, 0x41, 0x01, 0x00, 0xf8, 0xb5, 0x07, 0x1c, + 0x2c, 0x48, 0x14, 0x1c, 0x2c, 0x4a, 0x48, 0x43, + 0x86, 0x46, 0x80, 0x18, 0x80, 0x0d, 0x84, 0x46, + 0x2b, 0x48, 0x2a, 0x4a, 0x06, 0x26, 0x1d, 0x1c, + 0x48, 0x43, 0x4a, 0x43, 0x0e, 0x2f, 0x40, 0xd2, + 0x01, 0xa3, 0xdb, 0x5d, 0x5b, 0x00, 0x9f, 0x44, + 0x3c, 0x00, 0x90, 0xab, 0x00, 0x00, 0x06, 0x08, + 0x0a, 0x0f, 0x14, 0x18, 0x1d, 0x20, 0x27, 0x24, + 0x27, 0x2b, 0x2f, 0x31, 0xc8, 0x00, 0x1f, 0xe0, + 0x88, 0x00, 0x1d, 0xe0, 0x21, 0x49, 0x70, 0x46, + 0x40, 0x18, 0x00, 0x0d, 0x18, 0xe0, 0x1f, 0x4a, + 0x80, 0x18, 0x80, 0x0d, 0x40, 0x18, 0x21, 0xe0, + 0x1e, 0x48, 0x10, 0x18, 0x00, 0x0d, 0x1d, 0xe0, + 0x1d, 0x49, 0x70, 0x46, 0x40, 0x18, 0x40, 0x0d, + 0x0a, 0xe0, 0x3c, 0x00, 0xcc, 0xab, 0x00, 0x00, + 0x1b, 0x49, 0x40, 0x18, 0x01, 0xe0, 0x1b, 0x48, + 0x10, 0x18, 0x40, 0x0d, 0x11, 0xe0, 0x1a, 0x49, + 0x40, 0x18, 0x05, 0xe0, 0x60, 0x46, 0x20, 0x80, + 0x00, 0x20, 0x16, 0xe0, 0x17, 0x48, 0x10, 0x18, + 0x80, 0x0d, 0x06, 0xe0, 0x16, 0x49, 0x02, 0xe0, + 0x16, 0x48, 0x48, 0x43, 0x16, 0x49, 0x40, 0x18, + 0xc0, 0x0d, 0x03, 0x30, 0x80, 0x08, 0x80, 0x00, + 0x20, 0x80, 0x2e, 0x80, 0x3c, 0x00, 0x08, 0xac, + 0x00, 0x00, 0xf8, 0xbd, 0xff, 0x21, 0xff, 0x20, + 0xf6, 0xf7, 0x49, 0xfb, 0x00, 0x20, 0x20, 0x80, + 0x28, 0x80, 0xf6, 0xe7, 0x00, 0x00, 0xd1, 0x45, + 0x17, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xe3, 0x38, + 0x0e, 0x00, 0x55, 0x55, 0x15, 0x00, 0xff, 0xff, + 0x0f, 0x00, 0xa9, 0xaa, 0x2a, 0x01, 0x70, 0x1c, + 0x37, 0x00, 0xff, 0xff, 0x1f, 0x00, 0xcb, 0xcc, + 0x4c, 0x00, 0x70, 0x1c, 0x47, 0x00, 0x3c, 0x00, + 0x44, 0xac, 0x00, 0x00, 0xa9, 0xaa, 0x7a, 0x00, + 0x70, 0x1c, 0x67, 0x00, 0xa9, 0xaa, 0xba, 0x00, + 0x84, 0xf6, 0x12, 0x00, 0xec, 0x25, 0xb4, 0x00, + 0x04, 0x49, 0x00, 0x28, 0x01, 0xd0, 0x09, 0x22, + 0x00, 0xe0, 0x14, 0x22, 0x4a, 0x80, 0x48, 0x60, + 0x70, 0x47, 0x00, 0x00, 0xa4, 0x69, 0x01, 0x00, + 0x80, 0xb5, 0x06, 0x22, 0xf5, 0xf7, 0x40, 0xfc, + 0x80, 0xbd, 0x00, 0x00, 0xbc, 0xb5, 0x15, 0x1c, + 0x3c, 0x00, 0x80, 0xac, 0x00, 0x00, 0x04, 0x1c, + 0x04, 0x31, 0x09, 0x04, 0x09, 0x0c, 0x01, 0xaa, + 0x6b, 0x46, 0xff, 0xf7, 0x6a, 0xff, 0x38, 0x20, + 0x06, 0x49, 0x68, 0x43, 0x40, 0x18, 0xa1, 0x00, + 0x40, 0x5a, 0x00, 0xab, 0x99, 0x88, 0x40, 0x18, + 0x19, 0x88, 0x40, 0x18, 0x00, 0x04, 0x00, 0x0c, + 0xbc, 0xbd, 0x8c, 0x41, 0x01, 0x00, 0xbc, 0xb5, + 0x04, 0x1c, 0x15, 0x1c, 0x01, 0xaa, 0x6b, 0x46, + 0xff, 0xf7, 0x3c, 0x00, 0xbc, 0xac, 0x00, 0x00, + 0x53, 0xff, 0x38, 0x20, 0x05, 0x49, 0x68, 0x43, + 0x40, 0x18, 0xa1, 0x00, 0x40, 0x5a, 0x00, 0xab, + 0x99, 0x88, 0x40, 0x18, 0x00, 0x04, 0x00, 0x0c, + 0xbc, 0xbd, 0x00, 0x00, 0x8c, 0x41, 0x01, 0x00, + 0x80, 0xb5, 0x00, 0x28, 0x0f, 0xd0, 0x00, 0x29, + 0x0d, 0xd0, 0x02, 0x78, 0x0b, 0x78, 0x9a, 0x42, + 0x09, 0xd1, 0xff, 0x2a, 0x05, 0xd0, 0x42, 0x78, + 0x02, 0x32, 0xf5, 0xf7, 0x3c, 0x00, 0xf8, 0xac, + 0x00, 0x00, 0x81, 0xfb, 0x00, 0x28, 0x01, 0xd1, + 0x01, 0x20, 0x80, 0xbd, 0x00, 0x20, 0x80, 0xbd, + 0x00, 0x00, 0x80, 0xb5, 0x06, 0x22, 0x04, 0x49, + 0xf5, 0xf7, 0x75, 0xfb, 0x00, 0x28, 0x01, 0xd1, + 0x01, 0x20, 0x80, 0xbd, 0x00, 0x20, 0x80, 0xbd, + 0x00, 0x00, 0x5e, 0x40, 0x01, 0x00, 0x01, 0x1c, + 0x49, 0x78, 0x01, 0x20, 0x00, 0x29, 0x00, 0xd0, + 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, + 0x34, 0xad, 0x00, 0x00, 0x80, 0xb5, 0x06, 0x22, + 0xf5, 0xf7, 0x60, 0xfb, 0x00, 0x28, 0x01, 0xd1, + 0x01, 0x20, 0x80, 0xbd, 0x00, 0x20, 0x80, 0xbd, + 0x80, 0xb5, 0xff, 0xf7, 0xc7, 0xff, 0x80, 0xbd, + 0x80, 0xb5, 0x06, 0x22, 0x04, 0x49, 0xf5, 0xf7, + 0x51, 0xfb, 0x00, 0x28, 0x01, 0xd1, 0x01, 0x20, + 0x80, 0xbd, 0x00, 0x20, 0x80, 0xbd, 0x00, 0x00, + 0x12, 0x61, 0x01, 0x00, 0x01, 0x1c, 0x80, 0x20, + 0x3c, 0x00, 0x70, 0xad, 0x00, 0x00, 0x81, 0x43, + 0x8a, 0x08, 0x0e, 0x20, 0x1c, 0x2a, 0x10, 0xb5, + 0x06, 0xd2, 0x03, 0x4c, 0x52, 0x00, 0xa3, 0x5c, + 0x8b, 0x42, 0x01, 0xd1, 0x10, 0x19, 0x40, 0x78, + 0x10, 0xbd, 0xfc, 0x41, 0x01, 0x00, 0x14, 0x23, + 0x02, 0x49, 0x58, 0x43, 0x40, 0x18, 0x40, 0x68, + 0x70, 0x47, 0x74, 0x40, 0x01, 0x00, 0x20, 0x22, + 0x01, 0x1c, 0x80, 0xb5, 0x02, 0x48, 0xf5, 0xf7, + 0x52, 0xfd, 0x3c, 0x00, 0xac, 0xad, 0x00, 0x00, + 0x80, 0xbd, 0x00, 0x00, 0x48, 0x61, 0x01, 0x00, + 0x08, 0x06, 0x00, 0x0e, 0x02, 0x28, 0x01, 0xd1, + 0x00, 0x20, 0x70, 0x47, 0x01, 0x20, 0x70, 0x47, + 0x00, 0x29, 0x0c, 0xd0, 0x07, 0x49, 0x09, 0x68, + 0x00, 0x29, 0x08, 0xd0, 0x14, 0x23, 0x06, 0x49, + 0x58, 0x43, 0x40, 0x18, 0xc0, 0x68, 0x00, 0x28, + 0x01, 0xd0, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, + 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0xad, + 0x00, 0x00, 0xac, 0x69, 0x01, 0x00, 0x74, 0x40, + 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x06, 0x22, + 0x01, 0x1c, 0x04, 0x48, 0xf5, 0xf7, 0x7d, 0xfb, + 0x06, 0x22, 0x21, 0x1c, 0x03, 0x48, 0xf5, 0xf7, + 0x78, 0xfb, 0x10, 0xbd, 0x00, 0x00, 0x12, 0x61, + 0x01, 0x00, 0x40, 0x80, 0x07, 0x00, 0x00, 0x29, + 0x01, 0xd1, 0x00, 0x20, 0x70, 0x47, 0x38, 0x23, + 0x5a, 0x43, 0x07, 0x4b, 0xd2, 0x18, 0x3c, 0x00, + 0x24, 0xae, 0x00, 0x00, 0x83, 0x00, 0xd2, 0x5a, + 0x14, 0x23, 0x58, 0x43, 0x05, 0x4b, 0xc0, 0x18, + 0x40, 0x88, 0x10, 0x18, 0x08, 0x1a, 0x0a, 0x38, + 0x00, 0x04, 0x00, 0x0c, 0x70, 0x47, 0x00, 0x00, + 0x8c, 0x41, 0x01, 0x00, 0x74, 0x40, 0x01, 0x00, + 0xf8, 0xb5, 0x07, 0x1c, 0x08, 0x1c, 0x16, 0x1c, + 0x1c, 0x1c, 0x19, 0x1c, 0x00, 0xf0, 0x5a, 0xf8, + 0x05, 0x1c, 0x14, 0x35, 0x22, 0x1c, 0x31, 0x1c, + 0x3c, 0x00, 0x60, 0xae, 0x00, 0x00, 0x38, 0x1c, + 0xff, 0xf7, 0x0b, 0xff, 0x28, 0x18, 0x00, 0x04, + 0x00, 0x0c, 0xf8, 0xbd, 0x00, 0x00, 0x00, 0xb5, + 0x00, 0xf0, 0x4b, 0xf8, 0x0a, 0x30, 0x00, 0x04, + 0x00, 0x0c, 0x00, 0xbd, 0x00, 0x00, 0xf8, 0xb5, + 0x07, 0x1c, 0x08, 0x1c, 0x16, 0x1c, 0x1c, 0x1c, + 0x19, 0x1c, 0x00, 0xf0, 0x3e, 0xf8, 0x45, 0x00, + 0x1e, 0x35, 0x22, 0x1c, 0x31, 0x1c, 0x38, 0x1c, + 0xff, 0xf7, 0x3c, 0x00, 0x9c, 0xae, 0x00, 0x00, + 0xef, 0xfe, 0x28, 0x18, 0x00, 0x04, 0x00, 0x0c, + 0xf8, 0xbd, 0x00, 0x00, 0xff, 0xb5, 0x0f, 0x1c, + 0x81, 0xb0, 0x0a, 0xa9, 0x14, 0x1c, 0x1e, 0x1c, + 0x03, 0xc9, 0x00, 0xf0, 0x29, 0xf8, 0x05, 0x1c, + 0x1e, 0x35, 0x21, 0x1c, 0x30, 0x1c, 0x00, 0xf0, + 0x23, 0xf8, 0x2d, 0x18, 0x22, 0x1c, 0x39, 0x1c, + 0x01, 0x98, 0xff, 0xf7, 0xd5, 0xfe, 0x28, 0x18, + 0x00, 0x04, 0x00, 0x0c, 0x3c, 0x00, 0xd8, 0xae, + 0x00, 0x00, 0x05, 0xb0, 0xf0, 0xbd, 0x0a, 0x49, + 0x80, 0xb5, 0x09, 0x88, 0x09, 0x29, 0x04, 0xd0, + 0x14, 0x29, 0x07, 0xd1, 0x01, 0x01, 0x80, 0x00, + 0x00, 0xe0, 0xc1, 0x00, 0x08, 0x18, 0x00, 0x04, + 0x00, 0x0c, 0x80, 0xbd, 0xff, 0x21, 0xff, 0x20, + 0xf6, 0xf7, 0xd1, 0xf9, 0x00, 0x20, 0x80, 0xbd, + 0x00, 0x00, 0xa6, 0x69, 0x01, 0x00, 0x38, 0x23, + 0x59, 0x43, 0x06, 0x4a, 0x14, 0x23, 0x3c, 0x00, + 0x14, 0xaf, 0x00, 0x00, 0x89, 0x18, 0x82, 0x00, + 0x89, 0x5a, 0x05, 0x4a, 0x58, 0x43, 0x80, 0x18, + 0x40, 0x88, 0x08, 0x18, 0x00, 0x04, 0x00, 0x0c, + 0x70, 0x47, 0x00, 0x00, 0x8c, 0x41, 0x01, 0x00, + 0x74, 0x40, 0x01, 0x00, 0x02, 0x48, 0x03, 0x49, + 0x00, 0x68, 0x40, 0x00, 0x08, 0x5a, 0x70, 0x47, + 0xa8, 0x69, 0x01, 0x00, 0x54, 0x40, 0x01, 0x00, + 0x0a, 0x20, 0x70, 0x47, 0x10, 0xb5, 0x04, 0x1c, + 0x3c, 0x00, 0x50, 0xaf, 0x00, 0x00, 0xfd, 0xf7, + 0x62, 0xff, 0x20, 0x1c, 0x10, 0xbd, 0xb0, 0xb5, + 0x04, 0x1c, 0xc0, 0x68, 0x05, 0x68, 0xa0, 0x1d, + 0xff, 0xf7, 0xf5, 0xfe, 0x00, 0x28, 0x18, 0xd0, + 0x21, 0x1c, 0x14, 0x31, 0x20, 0x1c, 0x08, 0xf0, + 0xe2, 0xfd, 0x00, 0x28, 0x11, 0xd0, 0x29, 0x88, + 0x09, 0x48, 0x20, 0x22, 0x81, 0x82, 0x69, 0x88, + 0x01, 0x83, 0xa9, 0x88, 0x06, 0x35, 0x41, 0x83, + 0xc5, 0x61, 0x3c, 0x00, 0x8c, 0xaf, 0x00, 0x00, + 0x30, 0x21, 0x09, 0x5d, 0x11, 0x54, 0x61, 0x6b, + 0x41, 0x62, 0x01, 0x20, 0xf7, 0xf7, 0x28, 0xf8, + 0x20, 0x1c, 0xb0, 0xbd, 0x70, 0x7c, 0x01, 0x00, + 0x70, 0xb5, 0x04, 0x1c, 0xc0, 0x68, 0x21, 0x1c, + 0x14, 0x31, 0x05, 0x68, 0x20, 0x1c, 0x08, 0xf0, + 0xc1, 0xfd, 0x00, 0x28, 0x08, 0xd0, 0x05, 0x4e, + 0xf0, 0x68, 0x02, 0xf0, 0xcf, 0xfd, 0x28, 0x88, + 0xf0, 0x82, 0x03, 0x20, 0x3c, 0x00, 0xc8, 0xaf, + 0x00, 0x00, 0xf7, 0xf7, 0x10, 0xf8, 0x20, 0x1c, + 0x70, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x3e, 0xb5, + 0x04, 0x1c, 0xc0, 0x68, 0x05, 0x68, 0xa0, 0x1d, + 0xff, 0xf7, 0xb7, 0xfe, 0x00, 0x28, 0x21, 0xd0, + 0x21, 0x1c, 0x14, 0x31, 0x20, 0x1c, 0x02, 0xaa, + 0x08, 0xf0, 0x77, 0xfd, 0x00, 0x28, 0x19, 0xd0, + 0x02, 0x98, 0x4b, 0x21, 0x09, 0x5c, 0x00, 0x29, + 0x10, 0xd0, 0x01, 0x29, 0x14, 0xd0, 0x3c, 0x00, + 0x04, 0xb0, 0x00, 0x00, 0x02, 0x29, 0x0c, 0xd1, + 0x29, 0x88, 0x0d, 0x20, 0x00, 0xab, 0x18, 0x80, + 0x20, 0x1c, 0x03, 0xf0, 0x51, 0xf8, 0x01, 0x90, + 0x68, 0x46, 0x02, 0xf0, 0x5d, 0xfa, 0xf6, 0xf7, + 0xb5, 0xf8, 0x00, 0x21, 0x02, 0x98, 0x06, 0xf0, + 0x9f, 0xfe, 0x20, 0x1c, 0x3e, 0xbd, 0x07, 0xf0, + 0x29, 0xf8, 0x02, 0x98, 0x00, 0x21, 0x80, 0x69, + 0xc2, 0x07, 0xd2, 0x0f, 0x04, 0x20, 0xf6, 0xf7, + 0x3c, 0x00, 0x40, 0xb0, 0x00, 0x00, 0x7f, 0xff, + 0xee, 0xe7, 0x10, 0xb5, 0x04, 0x1c, 0xfd, 0xf7, + 0xe6, 0xfe, 0x20, 0x1c, 0x10, 0xbd, 0x3e, 0xb5, + 0x05, 0x1c, 0x00, 0xf0, 0x40, 0xfe, 0x00, 0x28, + 0x15, 0xd1, 0x28, 0x1c, 0x14, 0x30, 0xfa, 0xf7, + 0xce, 0xfb, 0x00, 0x28, 0x0f, 0xd0, 0x05, 0x21, + 0x28, 0x69, 0xff, 0xf7, 0x86, 0xfb, 0x04, 0x1c, + 0x09, 0xd0, 0x05, 0x22, 0x21, 0x1c, 0x68, 0x46, + 0xf5, 0xf7, 0x3c, 0x00, 0x7c, 0xb0, 0x00, 0x00, + 0x3d, 0xfa, 0x05, 0x34, 0x02, 0x94, 0x68, 0x46, + 0x03, 0xf0, 0x1a, 0xfb, 0x2a, 0x1c, 0x0d, 0x21, + 0x8f, 0x20, 0x08, 0xf0, 0x8f, 0xfb, 0x00, 0x20, + 0x3e, 0xbd, 0x00, 0x00, 0x10, 0xb5, 0x04, 0x1c, + 0xfa, 0xf7, 0x98, 0xf8, 0x20, 0x1c, 0x05, 0xf0, + 0xe5, 0xf8, 0x20, 0x1c, 0x10, 0xbd, 0x00, 0x00, + 0xb0, 0xb5, 0x04, 0x1c, 0x00, 0x69, 0x00, 0x21, + 0x94, 0xb0, 0xff, 0xf7, 0x3c, 0x00, 0xb8, 0xb0, + 0x00, 0x00, 0x61, 0xfb, 0x69, 0x46, 0xfb, 0xf7, + 0x26, 0xf8, 0x00, 0x28, 0x1e, 0xd0, 0x00, 0x98, + 0xfa, 0xf7, 0x29, 0xfa, 0x01, 0x1c, 0x01, 0xa8, + 0x02, 0xf0, 0xd7, 0xf9, 0x00, 0x98, 0xfa, 0xf7, + 0xd2, 0xf9, 0x04, 0x90, 0x05, 0x20, 0x09, 0xad, + 0x68, 0x72, 0x02, 0xa8, 0x21, 0x1c, 0x06, 0x22, + 0x02, 0x30, 0xf5, 0xf7, 0x06, 0xfa, 0x01, 0x20, + 0x08, 0x90, 0x21, 0x6a, 0x0a, 0x90, 0x3c, 0x00, + 0xf4, 0xb0, 0x00, 0x00, 0x28, 0x20, 0x09, 0x91, + 0x00, 0x5d, 0x28, 0x72, 0x01, 0xa8, 0x00, 0xf0, + 0x69, 0xf8, 0x20, 0x1c, 0x14, 0xb0, 0xb0, 0xbd, + 0xff, 0xb5, 0x16, 0x1c, 0x1f, 0x1c, 0x81, 0xb0, + 0x0a, 0x9d, 0x4c, 0x20, 0xf6, 0xf7, 0x90, 0xfb, + 0x04, 0x1c, 0x14, 0x30, 0x06, 0x22, 0x02, 0x99, + 0xf5, 0xf7, 0xea, 0xf9, 0x20, 0x1c, 0x06, 0x22, + 0x01, 0x99, 0xf5, 0xf7, 0xe5, 0xf9, 0x28, 0x20, + 0x3c, 0x00, 0x30, 0xb1, 0x00, 0x00, 0x00, 0x21, + 0x06, 0x55, 0xe1, 0x60, 0x27, 0x62, 0x00, 0x2d, + 0x01, 0xd0, 0x8e, 0x20, 0x00, 0xe0, 0x8d, 0x20, + 0x22, 0x1c, 0x0d, 0x21, 0x08, 0xf0, 0x33, 0xfb, + 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xb0, 0xb5, + 0x05, 0x1c, 0x4c, 0x20, 0xf6, 0xf7, 0x6f, 0xfb, + 0x04, 0x1c, 0x4c, 0x22, 0x29, 0x1c, 0xf5, 0xf7, + 0x26, 0xfa, 0x29, 0x20, 0x40, 0x5d, 0x0d, 0x28, + 0x2c, 0xd2, 0x3c, 0x00, 0x6c, 0xb1, 0x00, 0x00, + 0x01, 0xa3, 0x1b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, + 0x28, 0x1a, 0x28, 0x1e, 0x06, 0x0a, 0x28, 0x28, + 0x0e, 0x28, 0x22, 0x12, 0x16, 0x00, 0x22, 0x1c, + 0x0d, 0x21, 0x8c, 0x20, 0x1a, 0xe0, 0x22, 0x1c, + 0x0d, 0x21, 0x83, 0x20, 0x16, 0xe0, 0x22, 0x1c, + 0x0d, 0x21, 0x84, 0x20, 0x12, 0xe0, 0x22, 0x1c, + 0x0d, 0x21, 0x85, 0x20, 0x0e, 0xe0, 0x22, 0x1c, + 0x0d, 0x21, 0x86, 0x20, 0x3c, 0x00, 0xa8, 0xb1, + 0x00, 0x00, 0x0a, 0xe0, 0x22, 0x1c, 0x0d, 0x21, + 0x87, 0x20, 0x06, 0xe0, 0x22, 0x1c, 0x0d, 0x21, + 0x89, 0x20, 0x02, 0xe0, 0x22, 0x1c, 0x0d, 0x21, + 0x8b, 0x20, 0x08, 0xf0, 0xf6, 0xfa, 0xb0, 0xbd, + 0xe8, 0x68, 0xf6, 0xf7, 0xe6, 0xf9, 0x20, 0x1c, + 0xf6, 0xf7, 0x11, 0xfb, 0xb0, 0xbd, 0xfe, 0xb5, + 0x05, 0x1c, 0x90, 0x20, 0xf6, 0xf7, 0x2d, 0xfb, + 0x04, 0x1c, 0x90, 0x21, 0xf5, 0xf7, 0x3c, 0x00, + 0xe4, 0xb1, 0x00, 0x00, 0x5b, 0xf9, 0x37, 0x4e, + 0x01, 0x27, 0xf0, 0x69, 0x04, 0x28, 0x03, 0xd9, + 0x70, 0x6b, 0x01, 0x30, 0x70, 0x63, 0x4d, 0xe0, + 0x33, 0x48, 0xb1, 0x6b, 0x04, 0xf0, 0xd0, 0xf8, + 0x01, 0x20, 0x20, 0x62, 0xa8, 0x7e, 0x21, 0x1c, + 0x80, 0x31, 0x02, 0x91, 0x08, 0x70, 0x22, 0x1c, + 0x60, 0x32, 0x01, 0x92, 0x00, 0x20, 0x2f, 0x1c, + 0x20, 0x37, 0x90, 0x72, 0x78, 0x7a, 0x2b, 0x1c, + 0x3c, 0x00, 0x20, 0xb2, 0x00, 0x00, 0x14, 0x33, + 0xd0, 0x72, 0xe8, 0x68, 0xaa, 0x1d, 0xa0, 0x60, + 0xe8, 0x6b, 0x48, 0x60, 0x44, 0x20, 0x40, 0x5d, + 0x08, 0x72, 0x29, 0x1c, 0x20, 0x1c, 0x05, 0xf0, + 0xaa, 0xfc, 0x68, 0x6a, 0x00, 0x28, 0x0a, 0xd1, + 0x01, 0x9a, 0x20, 0x1c, 0x93, 0x7a, 0x02, 0x99, + 0x22, 0x1c, 0x70, 0x32, 0x58, 0x30, 0x09, 0x78, + 0xfa, 0xf7, 0xdb, 0xf9, 0x06, 0xe0, 0x3a, 0x7a, + 0x23, 0x1c, 0x3c, 0x00, 0x5c, 0xb2, 0x00, 0x00, + 0xe8, 0x69, 0x29, 0x6a, 0x70, 0x33, 0xfd, 0xf7, + 0x8d, 0xf9, 0x30, 0x20, 0x40, 0x5d, 0x18, 0x49, + 0x07, 0x28, 0x0b, 0xd1, 0x58, 0x20, 0x00, 0x5d, + 0xc0, 0x07, 0xc0, 0x17, 0x01, 0x30, 0xe0, 0x61, + 0x00, 0x20, 0x20, 0x61, 0x20, 0x1c, 0xf7, 0xf7, + 0x3f, 0xff, 0x18, 0xe0, 0x01, 0x22, 0x20, 0x1c, + 0x05, 0xf0, 0xac, 0xff, 0x07, 0x1c, 0x12, 0xd0, + 0x03, 0xf0, 0x06, 0xff, 0x3c, 0x00, 0x98, 0xb2, + 0x00, 0x00, 0xf3, 0x6d, 0x00, 0x2b, 0x06, 0xd0, + 0x60, 0x68, 0x20, 0x30, 0x82, 0x7b, 0x61, 0x6b, + 0x38, 0x1c, 0xf5, 0xf7, 0x99, 0xf8, 0xe8, 0x68, + 0xf6, 0xf7, 0x73, 0xf9, 0x20, 0x1c, 0xf6, 0xf7, + 0x9e, 0xfa, 0xfe, 0xbd, 0xf0, 0x69, 0x01, 0x30, + 0xf0, 0x61, 0xfa, 0xe7, 0x00, 0x00, 0xc4, 0x69, + 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x05, 0x31, + 0x00, 0x00, 0x70, 0xb5, 0x06, 0x1c, 0x3c, 0x00, + 0xd4, 0xb2, 0x00, 0x00, 0x0d, 0x1c, 0x09, 0x04, + 0x09, 0x0c, 0x00, 0x20, 0xf6, 0xf7, 0x7c, 0xf9, + 0x04, 0x1c, 0x2a, 0x1c, 0x31, 0x1c, 0x00, 0x68, + 0xf5, 0xf7, 0x06, 0xf9, 0x20, 0x1c, 0x70, 0xbd, + 0x40, 0x88, 0x70, 0x47, 0x03, 0x78, 0x1b, 0x07, + 0x9b, 0x0f, 0x0b, 0x70, 0x00, 0x78, 0x00, 0x09, + 0x10, 0x70, 0x70, 0x47, 0x04, 0x30, 0x70, 0x47, + 0x04, 0x30, 0x70, 0x47, 0xd4, 0x21, 0x01, 0x70, + 0x3c, 0x00, 0x10, 0xb3, 0x00, 0x00, 0x00, 0x21, + 0x41, 0x70, 0x70, 0x47, 0x00, 0x00, 0xc4, 0x21, + 0x01, 0x70, 0x00, 0x21, 0x41, 0x70, 0x70, 0x47, + 0x00, 0x00, 0xb4, 0x21, 0x01, 0x70, 0x00, 0x21, + 0x41, 0x70, 0x70, 0x47, 0x00, 0x00, 0x01, 0x49, + 0x48, 0x65, 0x70, 0x47, 0x00, 0x00, 0xc4, 0x69, + 0x01, 0x00, 0x01, 0x49, 0x08, 0x65, 0x70, 0x47, + 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x01, 0x49, + 0x88, 0x65, 0x3c, 0x00, 0x4c, 0xb3, 0x00, 0x00, + 0x70, 0x47, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, + 0xf8, 0xb5, 0x5f, 0x4f, 0x05, 0x1c, 0xb8, 0x68, + 0x01, 0x30, 0xb8, 0x60, 0x07, 0xf0, 0x24, 0xfd, + 0x38, 0x61, 0x90, 0x20, 0xf6, 0xf7, 0x66, 0xfa, + 0x04, 0x1c, 0x90, 0x21, 0xf5, 0xf7, 0x94, 0xf8, + 0x28, 0x6b, 0x27, 0x1c, 0x60, 0x63, 0x68, 0x8b, + 0x80, 0x37, 0x26, 0x1c, 0xc0, 0x07, 0xc0, 0x0f, + 0x20, 0x62, 0x68, 0x8b, 0x3c, 0x00, 0x88, 0xb3, + 0x00, 0x00, 0x60, 0x36, 0x02, 0x21, 0x40, 0x07, + 0xc0, 0x0f, 0x20, 0x63, 0x68, 0x8b, 0x80, 0x07, + 0xc0, 0x0f, 0xf8, 0x60, 0x28, 0x7f, 0x38, 0x70, + 0xb1, 0x72, 0x00, 0x28, 0x08, 0xd1, 0xf9, 0xf7, + 0xc8, 0xff, 0x00, 0x28, 0x02, 0xd0, 0x01, 0x20, + 0x60, 0x62, 0x01, 0xe0, 0x01, 0x20, 0xa0, 0x62, + 0xf8, 0x68, 0x00, 0x28, 0x03, 0xd0, 0x00, 0x21, + 0x02, 0x20, 0x06, 0xf0, 0xcc, 0xff, 0x3c, 0x00, + 0xc4, 0xb3, 0x00, 0x00, 0x2b, 0x1c, 0x10, 0x33, + 0xaa, 0x1d, 0x29, 0x1c, 0x20, 0x1c, 0x05, 0xf0, + 0xdf, 0xfb, 0xa8, 0x6a, 0x00, 0x28, 0x0c, 0xd1, + 0x39, 0x78, 0x02, 0x29, 0x07, 0xd0, 0x22, 0x1c, + 0x70, 0x32, 0x20, 0x1c, 0x58, 0x30, 0xb3, 0x7a, + 0xfa, 0xf7, 0x10, 0xf9, 0x08, 0xe0, 0x01, 0x26, + 0x5e, 0xe0, 0xaa, 0x7d, 0x23, 0x1c, 0x28, 0x6a, + 0x69, 0x6a, 0x70, 0x33, 0xfd, 0xf7, 0xc0, 0xf8, + 0x3c, 0x00, 0x00, 0xb4, 0x00, 0x00, 0xe9, 0x68, + 0x00, 0x20, 0x09, 0x89, 0x00, 0x29, 0x00, 0xd1, + 0x04, 0x20, 0xf0, 0x72, 0x38, 0x78, 0x01, 0x28, + 0x14, 0xd1, 0x00, 0x27, 0x00, 0x90, 0x00, 0x20, + 0x06, 0xe0, 0x29, 0x69, 0x01, 0x29, 0x03, 0xd1, + 0xa9, 0x69, 0x01, 0x27, 0x89, 0x07, 0x1a, 0xd5, + 0x06, 0xf0, 0x79, 0xfc, 0x00, 0x28, 0xf4, 0xd1, + 0x01, 0x2f, 0x14, 0xd1, 0x00, 0x98, 0x01, 0x28, + 0x11, 0xd1, 0x3c, 0x00, 0x3c, 0xb4, 0x00, 0x00, + 0x08, 0xe0, 0x20, 0x1c, 0x58, 0x30, 0x06, 0xf0, + 0xe1, 0xfc, 0x00, 0x28, 0x0a, 0xd0, 0x80, 0x69, + 0x80, 0x07, 0x07, 0xd5, 0xf0, 0x7a, 0x08, 0x21, + 0x08, 0x43, 0xf0, 0x72, 0x01, 0x20, 0xe0, 0x62, + 0xe8, 0x7d, 0x30, 0x73, 0xe8, 0x68, 0xa0, 0x60, + 0xe0, 0x6a, 0x00, 0x28, 0x12, 0xd0, 0x1a, 0x4f, + 0xf8, 0x6b, 0x00, 0x28, 0x0e, 0xd0, 0x30, 0x7b, + 0xf5, 0xf7, 0xde, 0xfe, 0x3c, 0x00, 0x78, 0xb4, + 0x00, 0x00, 0x00, 0x28, 0x09, 0xd0, 0x21, 0x1c, + 0x38, 0x1c, 0x40, 0x30, 0xfc, 0xf7, 0x55, 0xfc, + 0x14, 0x48, 0xb9, 0x6b, 0x03, 0xf0, 0x89, 0xff, + 0xf8, 0xbd, 0x10, 0x4f, 0x12, 0x48, 0xb9, 0x6b, + 0x03, 0xf0, 0x83, 0xff, 0x00, 0x22, 0x20, 0x1c, + 0x10, 0x49, 0x05, 0xf0, 0xa2, 0xfe, 0x06, 0x1c, + 0x03, 0xd1, 0x38, 0x6a, 0x01, 0x30, 0x38, 0x62, + 0xee, 0xe7, 0x20, 0x1c, 0xf6, 0xf7, 0x3c, 0x00, + 0xb4, 0xb4, 0x00, 0x00, 0x9f, 0xf9, 0xe8, 0x68, + 0xf6, 0xf7, 0x6e, 0xf8, 0x03, 0xf0, 0xf2, 0xfd, + 0x04, 0x48, 0x83, 0x6d, 0x00, 0x2b, 0xe2, 0xd0, + 0x00, 0x22, 0x30, 0x1c, 0x29, 0x6b, 0xf4, 0xf7, + 0x86, 0xff, 0xdc, 0xe7, 0xc4, 0x69, 0x01, 0x00, + 0xc4, 0x60, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, + 0x11, 0x30, 0x00, 0x00, 0x10, 0xb5, 0x0a, 0x20, + 0x07, 0xf0, 0xfe, 0xfc, 0x07, 0xf0, 0x5e, 0xfc, + 0x3c, 0x00, 0xf0, 0xb4, 0x00, 0x00, 0x0b, 0x49, + 0x44, 0x18, 0x0c, 0xe0, 0x20, 0x1c, 0x07, 0xf0, + 0x90, 0xfb, 0x00, 0x28, 0x07, 0xd0, 0xf7, 0xf7, + 0x34, 0xf9, 0x00, 0x28, 0x03, 0xd0, 0x12, 0x21, + 0x86, 0x20, 0xf5, 0xf7, 0xca, 0xfe, 0xf7, 0xf7, + 0x2c, 0xf9, 0x00, 0x28, 0xee, 0xd1, 0x01, 0xf0, + 0x80, 0xfd, 0x10, 0xbd, 0x00, 0x00, 0x40, 0x9c, + 0x00, 0x00, 0x10, 0xb5, 0x0c, 0x1c, 0x01, 0x1c, + 0x17, 0x4a, 0x3c, 0x00, 0x2c, 0xb5, 0x00, 0x00, + 0x01, 0x29, 0x50, 0x69, 0x04, 0xd0, 0x80, 0x29, + 0x1d, 0xd0, 0x81, 0x29, 0x21, 0xd1, 0x1c, 0xe0, + 0x91, 0x78, 0x01, 0x29, 0x15, 0xd1, 0x02, 0x21, + 0x91, 0x70, 0x14, 0x1c, 0x01, 0x1c, 0x10, 0x48, + 0x03, 0xf0, 0x28, 0xff, 0x01, 0x21, 0x60, 0x69, + 0x00, 0xf0, 0x2e, 0xf9, 0x60, 0x69, 0x01, 0xf0, + 0x5f, 0xfc, 0x20, 0x70, 0xa0, 0x88, 0xa1, 0x69, + 0x00, 0x23, 0x0a, 0x4a, 0x3c, 0x00, 0x68, 0xb5, + 0x00, 0x00, 0x07, 0xf0, 0x7e, 0xfc, 0x10, 0xbd, + 0x22, 0x21, 0x06, 0xe0, 0x01, 0xf0, 0x1d, 0xfc, + 0x20, 0x1c, 0x00, 0xf0, 0x4a, 0xf8, 0x10, 0xbd, + 0x1c, 0x21, 0x20, 0x20, 0xf5, 0xf7, 0x8f, 0xfe, + 0x10, 0xbd, 0xb4, 0x79, 0x01, 0x00, 0x34, 0x63, + 0x01, 0x00, 0x3d, 0x2e, 0x00, 0x00, 0x70, 0xb5, + 0x1c, 0x4c, 0xa0, 0x78, 0x00, 0x28, 0x32, 0xd0, + 0x05, 0x28, 0x30, 0xd0, 0x60, 0x69, 0x3c, 0x00, + 0xa4, 0xb5, 0x00, 0x00, 0x00, 0xf0, 0xea, 0xf8, + 0x18, 0x4e, 0xb5, 0x79, 0xa0, 0x78, 0x01, 0x28, + 0x0b, 0xd0, 0x02, 0x28, 0x0e, 0xd0, 0x03, 0x28, + 0x10, 0xd0, 0x04, 0x28, 0x17, 0xd1, 0x42, 0x1f, + 0x80, 0x21, 0x20, 0x20, 0x08, 0xf0, 0x08, 0xf8, + 0x0e, 0xe0, 0x00, 0x21, 0x20, 0x20, 0x08, 0xf0, + 0x31, 0xf8, 0x0c, 0xe0, 0xa0, 0x88, 0x07, 0xf0, + 0x1d, 0xfc, 0x05, 0xe0, 0x20, 0x78, 0x00, 0xf0, + 0x3c, 0x00, 0xe0, 0xb5, 0x00, 0x00, 0x39, 0xfa, + 0x00, 0x20, 0x00, 0xf0, 0xc4, 0xfd, 0x60, 0x69, + 0x01, 0xf0, 0xe1, 0xfb, 0x05, 0x20, 0xa0, 0x70, + 0xb5, 0x71, 0x60, 0x69, 0x00, 0xf0, 0x61, 0xf9, + 0x00, 0x22, 0x20, 0x21, 0x81, 0x20, 0x08, 0xf0, + 0xd6, 0xf8, 0x70, 0xbd, 0x00, 0x00, 0xb4, 0x79, + 0x01, 0x00, 0x20, 0x10, 0x07, 0x00, 0xb0, 0xb5, + 0x0d, 0x4d, 0x04, 0x1c, 0xa8, 0x78, 0x00, 0x28, + 0x14, 0xd0, 0x3c, 0x00, 0x1c, 0xb6, 0x00, 0x00, + 0x68, 0x69, 0x00, 0xf0, 0x0b, 0xf9, 0x0a, 0x48, + 0x69, 0x69, 0x03, 0xf0, 0xa7, 0xfe, 0xa8, 0x88, + 0x07, 0xf0, 0x9e, 0xfb, 0x00, 0x2c, 0x02, 0xd0, + 0x68, 0x78, 0x00, 0xf0, 0x79, 0xff, 0x00, 0x20, + 0xa8, 0x70, 0xa9, 0x68, 0x20, 0x1c, 0xf4, 0xf7, + 0xca, 0xfe, 0xb0, 0xbd, 0xb4, 0x79, 0x01, 0x00, + 0x34, 0x63, 0x01, 0x00, 0x06, 0x4b, 0x80, 0xb5, + 0x99, 0x78, 0x03, 0x29, 0x3c, 0x00, 0x58, 0xb6, + 0x00, 0x00, 0x06, 0xd1, 0x04, 0x21, 0x99, 0x70, + 0x20, 0x21, 0x02, 0x1c, 0x80, 0x20, 0x08, 0xf0, + 0xa4, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0xb4, 0x79, + 0x01, 0x00, 0x10, 0xb5, 0x0c, 0x4c, 0xa1, 0x78, + 0x03, 0x29, 0x0f, 0xd1, 0x10, 0x30, 0xfa, 0xf7, + 0xde, 0xf8, 0x00, 0x28, 0x09, 0xd0, 0x20, 0x78, + 0x00, 0xf0, 0xe5, 0xf9, 0x00, 0x20, 0x00, 0xf0, + 0x70, 0xfd, 0x00, 0x21, 0x05, 0x48, 0x3c, 0x00, + 0x94, 0xb6, 0x00, 0x00, 0xfc, 0xf7, 0x9c, 0xfa, + 0x10, 0xbd, 0x1b, 0x21, 0x20, 0x20, 0xf5, 0xf7, + 0x01, 0xfe, 0x10, 0xbd, 0xb4, 0x79, 0x01, 0x00, + 0x51, 0xb6, 0x00, 0x00, 0x09, 0x49, 0x80, 0xb5, + 0x89, 0x78, 0x03, 0x29, 0x09, 0xd1, 0x00, 0xf0, + 0xcd, 0xf9, 0x00, 0x20, 0x00, 0xf0, 0x58, 0xfd, + 0x01, 0x21, 0x05, 0x48, 0xfc, 0xf7, 0x84, 0xfa, + 0x80, 0xbd, 0x17, 0x21, 0x20, 0x20, 0xf5, 0xf7, + 0x3c, 0x00, 0xd0, 0xb6, 0x00, 0x00, 0xe9, 0xfd, + 0x80, 0xbd, 0xb4, 0x79, 0x01, 0x00, 0x51, 0xb6, + 0x00, 0x00, 0x70, 0xb5, 0x10, 0x4c, 0x1d, 0x1c, + 0xa3, 0x78, 0x06, 0x1c, 0x04, 0x98, 0x00, 0x2b, + 0x18, 0xd1, 0x01, 0x23, 0xa3, 0x70, 0x22, 0x61, + 0xe6, 0x60, 0x61, 0x70, 0xa0, 0x60, 0xa5, 0x61, + 0x00, 0x20, 0x07, 0xf0, 0xac, 0xfa, 0xa0, 0x80, + 0x30, 0x1c, 0xf7, 0xf7, 0x3c, 0xfb, 0xe0, 0x80, + 0x07, 0xf0, 0x3c, 0x00, 0x0c, 0xb7, 0x00, 0x00, + 0x4f, 0xfb, 0xc7, 0x21, 0xc9, 0x00, 0x28, 0x1a, + 0x41, 0x1a, 0x00, 0x22, 0x20, 0x20, 0x07, 0xf0, + 0x57, 0xff, 0x70, 0xbd, 0xb4, 0x79, 0x01, 0x00, + 0xb0, 0xb5, 0x04, 0x1c, 0x0d, 0x1c, 0x00, 0xf0, + 0x09, 0xf8, 0x20, 0x1c, 0x00, 0xf0, 0x24, 0xf8, + 0x00, 0x2d, 0x01, 0xd0, 0xff, 0xf7, 0xd4, 0xfe, + 0xb0, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x0c, 0x4c, + 0x05, 0x1c, 0xa0, 0x68, 0x3c, 0x00, 0x48, 0xb7, + 0x00, 0x00, 0x00, 0x28, 0x0f, 0xd1, 0x0a, 0x48, + 0x01, 0x7e, 0x02, 0x22, 0x11, 0x40, 0x61, 0x60, + 0x01, 0x7e, 0x11, 0x43, 0x01, 0x76, 0x07, 0x20, + 0x03, 0xf0, 0x49, 0xfc, 0x20, 0x60, 0x03, 0xf0, + 0x98, 0xff, 0x03, 0xf0, 0xee, 0xff, 0xa0, 0x68, + 0x28, 0x43, 0xa0, 0x60, 0xb0, 0xbd, 0x40, 0x7c, + 0x01, 0x00, 0x0c, 0x80, 0x07, 0x00, 0x0a, 0x49, + 0x38, 0xb5, 0x0a, 0x1c, 0x20, 0x32, 0x3c, 0x00, + 0x84, 0xb7, 0x00, 0x00, 0x94, 0x79, 0x00, 0xab, + 0x1c, 0x70, 0xd2, 0x79, 0x07, 0x4c, 0x5a, 0x70, + 0xe2, 0x68, 0x00, 0x2a, 0x02, 0xd1, 0x06, 0x4d, + 0x01, 0x23, 0x6b, 0x70, 0x10, 0x43, 0xe0, 0x60, + 0x00, 0xab, 0x18, 0x88, 0xc8, 0x84, 0x38, 0xbd, + 0x00, 0x10, 0x07, 0x00, 0x40, 0x7c, 0x01, 0x00, + 0x00, 0x50, 0x07, 0x00, 0xb0, 0xb5, 0x05, 0x1c, + 0x00, 0x29, 0x01, 0xd0, 0x00, 0xf0, 0x28, 0xf8, + 0x3c, 0x00, 0xc0, 0xb7, 0x00, 0x00, 0x06, 0x4c, + 0x60, 0x78, 0x21, 0x69, 0x08, 0x43, 0x03, 0xd1, + 0x01, 0x21, 0x0e, 0x20, 0x06, 0xf0, 0xc5, 0xfd, + 0x20, 0x69, 0x28, 0x43, 0x20, 0x61, 0xb0, 0xbd, + 0x00, 0x00, 0x18, 0x63, 0x01, 0x00, 0xb0, 0xb5, + 0x0a, 0x4c, 0x05, 0x1c, 0x22, 0x69, 0x00, 0x20, + 0x00, 0x2a, 0x0c, 0xd1, 0x00, 0x29, 0x00, 0xd0, + 0x04, 0xe0, 0x60, 0x78, 0x00, 0x28, 0x02, 0xd1, + 0x04, 0xf0, 0x3c, 0x00, 0xfc, 0xb7, 0x00, 0x00, + 0x69, 0xfb, 0x60, 0x70, 0x28, 0x1c, 0x06, 0xf0, + 0xef, 0xfc, 0x01, 0x20, 0xb0, 0xbd, 0x00, 0x00, + 0x18, 0x63, 0x01, 0x00, 0x10, 0xb5, 0x08, 0x4c, + 0x60, 0x78, 0x00, 0x28, 0x0a, 0xd0, 0x06, 0xf0, + 0xe3, 0xfc, 0x00, 0x20, 0x60, 0x70, 0x20, 0x69, + 0x00, 0x28, 0x03, 0xd0, 0x01, 0x21, 0x0e, 0x20, + 0x06, 0xf0, 0x96, 0xfd, 0x10, 0xbd, 0x00, 0x00, + 0x18, 0x63, 0x01, 0x00, 0x3c, 0x00, 0x38, 0xb8, + 0x00, 0x00, 0x09, 0x49, 0x80, 0xb5, 0x0b, 0x69, + 0x83, 0x42, 0x04, 0xd1, 0x4a, 0x78, 0x00, 0x2a, + 0x01, 0xd1, 0x01, 0x22, 0x00, 0xe0, 0x00, 0x22, + 0x83, 0x43, 0x0b, 0x61, 0x00, 0x2a, 0x03, 0xd0, + 0x00, 0x21, 0x0e, 0x20, 0x06, 0xf0, 0x7f, 0xfd, + 0x80, 0xbd, 0x18, 0x63, 0x01, 0x00, 0x80, 0xb5, + 0x01, 0x20, 0xf6, 0xf7, 0x56, 0xfe, 0x80, 0xbd, + 0x00, 0x00, 0x10, 0xb5, 0x04, 0x1c, 0x3c, 0x00, + 0x74, 0xb8, 0x00, 0x00, 0x00, 0xf0, 0x04, 0xf8, + 0x20, 0x1c, 0x00, 0xf0, 0x1f, 0xf8, 0x10, 0xbd, + 0xb0, 0xb5, 0x0c, 0x4d, 0x04, 0x1c, 0xa8, 0x68, + 0xa0, 0x42, 0x0f, 0xd1, 0x07, 0x20, 0x29, 0x68, + 0x08, 0xf0, 0x8c, 0xfb, 0x68, 0x68, 0x02, 0x22, + 0x07, 0x49, 0x00, 0x28, 0x08, 0x7e, 0x01, 0xd0, + 0x10, 0x43, 0x00, 0xe0, 0x90, 0x43, 0x08, 0x76, + 0x04, 0xf0, 0xc4, 0xf8, 0xa8, 0x68, 0xa0, 0x43, + 0x3c, 0x00, 0xb0, 0xb8, 0x00, 0x00, 0xa8, 0x60, + 0xb0, 0xbd, 0x40, 0x7c, 0x01, 0x00, 0x0c, 0x80, + 0x07, 0x00, 0x0a, 0x49, 0x38, 0xb5, 0x0a, 0x1c, + 0x20, 0x32, 0x94, 0x79, 0x00, 0xab, 0x1c, 0x70, + 0xd2, 0x79, 0x07, 0x4c, 0x5a, 0x70, 0xe2, 0x68, + 0x82, 0x42, 0x02, 0xd1, 0x06, 0x4d, 0x00, 0x23, + 0x6b, 0x70, 0x82, 0x43, 0xe2, 0x60, 0x00, 0xab, + 0x18, 0x88, 0xc8, 0x84, 0x38, 0xbd, 0x00, 0x10, + 0x07, 0x00, 0x3c, 0x00, 0xec, 0xb8, 0x00, 0x00, + 0x40, 0x7c, 0x01, 0x00, 0x00, 0x50, 0x07, 0x00, + 0xb0, 0xb5, 0x05, 0x1c, 0x0a, 0x4c, 0x00, 0x21, + 0x60, 0x69, 0xff, 0xf7, 0x11, 0xff, 0x04, 0x20, + 0x01, 0xf0, 0x46, 0xf9, 0x01, 0xf0, 0x88, 0xfb, + 0x00, 0x22, 0x04, 0x21, 0x04, 0x20, 0x01, 0xf0, + 0x8b, 0xf8, 0x28, 0x1c, 0x01, 0xf0, 0x4a, 0xfa, + 0x60, 0x69, 0xff, 0xf7, 0xa7, 0xff, 0xb0, 0xbd, + 0x40, 0x7c, 0x01, 0x00, 0x3c, 0x00, 0x28, 0xb9, + 0x00, 0x00, 0x80, 0xb5, 0x01, 0xf0, 0x77, 0xfa, + 0x80, 0xbd, 0xb0, 0xb5, 0x0d, 0x4d, 0x01, 0x21, + 0x28, 0x69, 0xff, 0xf7, 0xf4, 0xfe, 0xff, 0xf7, + 0x2a, 0xfe, 0x00, 0xf0, 0x2c, 0xfb, 0x00, 0xf0, + 0x84, 0xfa, 0x00, 0x24, 0x00, 0x22, 0x04, 0x21, + 0x20, 0x1c, 0x01, 0xf0, 0x6c, 0xf8, 0x01, 0x34, + 0x24, 0x06, 0x24, 0x0e, 0x04, 0x2c, 0xf5, 0xd3, + 0x28, 0x69, 0xff, 0xf7, 0x86, 0xff, 0x3c, 0x00, + 0x64, 0xb9, 0x00, 0x00, 0xb0, 0xbd, 0x00, 0x00, + 0x40, 0x7c, 0x01, 0x00, 0xf8, 0xb5, 0x05, 0x1c, + 0x0e, 0x1c, 0x07, 0x4c, 0x17, 0x1c, 0x01, 0x21, + 0x20, 0x69, 0xff, 0xf7, 0xd3, 0xfe, 0x3a, 0x1c, + 0x31, 0x1c, 0x28, 0x1c, 0x01, 0xf0, 0x52, 0xf8, + 0x20, 0x69, 0xff, 0xf7, 0x71, 0xff, 0xf8, 0xbd, + 0x40, 0x7c, 0x01, 0x00, 0xff, 0xb5, 0x89, 0xb0, + 0x06, 0x1c, 0x16, 0x98, 0x1d, 0x1c, 0x00, 0x28, + 0x3c, 0x00, 0xa0, 0xb9, 0x00, 0x00, 0x01, 0xd0, + 0x29, 0x48, 0x14, 0x90, 0x28, 0x68, 0x00, 0x88, + 0x00, 0x06, 0x80, 0x0e, 0x20, 0x28, 0x01, 0xd0, + 0x14, 0x28, 0x17, 0xd1, 0x0a, 0xaa, 0x18, 0x24, + 0x18, 0x21, 0x05, 0xca, 0xff, 0xf7, 0x77, 0xf9, + 0x07, 0x1c, 0x28, 0x1c, 0x01, 0x89, 0xa1, 0x42, + 0x02, 0xdd, 0x00, 0x68, 0x01, 0x19, 0x0b, 0xe0, + 0xc0, 0x68, 0x64, 0x1a, 0x00, 0x28, 0xf5, 0xd1, + 0x0f, 0x21, 0x3c, 0x00, 0xdc, 0xb9, 0x00, 0x00, + 0x86, 0x20, 0xf5, 0xf7, 0x61, 0xfc, 0x00, 0x21, + 0x01, 0xe0, 0x00, 0x21, 0x00, 0x27, 0x18, 0x48, + 0x08, 0x90, 0x80, 0x79, 0x07, 0x90, 0x0c, 0x20, + 0x16, 0x4a, 0x70, 0x43, 0x80, 0x18, 0x04, 0x79, + 0x04, 0x91, 0x12, 0x99, 0x15, 0x98, 0x14, 0x9a, + 0x01, 0x91, 0x03, 0x90, 0x05, 0x97, 0x00, 0x95, + 0x0a, 0xab, 0x02, 0x92, 0x21, 0x1c, 0x30, 0x1c, + 0x0c, 0xcb, 0xf7, 0xf7, 0x3c, 0x00, 0x18, 0xba, + 0x00, 0x00, 0x03, 0xf9, 0x01, 0x25, 0xb5, 0x40, + 0x0c, 0x4e, 0x08, 0x3e, 0x30, 0x78, 0x28, 0x40, + 0x06, 0xd0, 0x20, 0x1c, 0x00, 0xf0, 0xc9, 0xfd, + 0x30, 0x78, 0xa8, 0x43, 0x30, 0x70, 0x03, 0xe0, + 0x20, 0x1c, 0x13, 0x99, 0x00, 0xf0, 0x43, 0xff, + 0x07, 0xa9, 0x03, 0xc9, 0x88, 0x71, 0x0d, 0xb0, + 0xf0, 0xbd, 0x95, 0x24, 0x00, 0x00, 0x20, 0x10, + 0x07, 0x00, 0x74, 0x7a, 0x01, 0x00, 0x3c, 0x00, + 0x54, 0xba, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, + 0x0c, 0x23, 0x09, 0x49, 0x58, 0x43, 0x40, 0x18, + 0x00, 0x79, 0x05, 0x1c, 0x00, 0xf0, 0x92, 0xfe, + 0x28, 0x1c, 0xf7, 0xf7, 0xc7, 0xf8, 0x01, 0x20, + 0x03, 0x4a, 0xa0, 0x40, 0x08, 0x3a, 0x11, 0x78, + 0x81, 0x43, 0x11, 0x70, 0xb0, 0xbd, 0x00, 0x00, + 0x74, 0x7a, 0x01, 0x00, 0x10, 0xb5, 0x05, 0x4c, + 0x20, 0x78, 0x00, 0x28, 0x03, 0xd1, 0x1a, 0x21, + 0x3c, 0x00, 0x90, 0xba, 0x00, 0x00, 0x86, 0x20, + 0xf5, 0xf7, 0x07, 0xfc, 0x20, 0x78, 0x10, 0xbd, + 0x00, 0x00, 0x18, 0x63, 0x01, 0x00, 0x01, 0x48, + 0x40, 0x78, 0x70, 0x47, 0x00, 0x00, 0x2c, 0x63, + 0x01, 0x00, 0x80, 0xb5, 0xf6, 0xf7, 0xd1, 0xfe, + 0x00, 0xf0, 0x1b, 0xf9, 0x80, 0xbd, 0xfe, 0xb5, + 0x01, 0x68, 0x05, 0x1c, 0x0c, 0x68, 0x0e, 0x1c, + 0x21, 0x78, 0x88, 0x07, 0x71, 0xd1, 0x68, 0x69, + 0xc2, 0x07, 0x3c, 0x00, 0xcc, 0xba, 0x00, 0x00, + 0x6e, 0xd5, 0x80, 0x07, 0x6d, 0xd5, 0xe8, 0x7a, + 0xc2, 0x07, 0x08, 0x07, 0x09, 0x09, 0x02, 0x91, + 0x45, 0x49, 0x80, 0x0f, 0xd2, 0x0f, 0x00, 0x28, + 0x4f, 0x68, 0x05, 0xd0, 0x01, 0x28, 0x09, 0xd0, + 0x02, 0x28, 0x21, 0xd0, 0x03, 0x28, 0x5b, 0xd1, + 0xff, 0x23, 0x20, 0x1c, 0xa9, 0x7a, 0xf4, 0xf7, + 0x74, 0xfc, 0x55, 0xe0, 0x02, 0x98, 0x0b, 0x28, + 0x0a, 0xd0, 0x0c, 0x28, 0x3c, 0x00, 0x08, 0xbb, + 0x00, 0x00, 0x0f, 0xd0, 0x0d, 0x28, 0x4e, 0xd1, + 0x39, 0x4f, 0xf8, 0x68, 0xf4, 0xf7, 0x61, 0xfc, + 0x00, 0x20, 0xc0, 0x43, 0x5a, 0xe0, 0x35, 0x4f, + 0xa9, 0x7a, 0xbb, 0x68, 0x20, 0x1c, 0xf4, 0xf7, + 0x5b, 0xfc, 0x40, 0xe0, 0x32, 0x4f, 0x38, 0x69, + 0xf4, 0xf7, 0x53, 0xfc, 0x3b, 0xe0, 0x00, 0x21, + 0x01, 0x91, 0x02, 0x99, 0x00, 0x20, 0xff, 0x23, + 0x09, 0x07, 0x01, 0xd4, 0x01, 0x20, 0x3c, 0x00, + 0x44, 0xbb, 0x00, 0x00, 0x13, 0xe0, 0x31, 0x89, + 0x19, 0x29, 0x01, 0xd3, 0x26, 0x7e, 0x07, 0xe0, + 0x15, 0x29, 0x04, 0xd3, 0x18, 0x26, 0x71, 0x1a, + 0x49, 0x19, 0x0e, 0x7b, 0x00, 0xe0, 0x00, 0x26, + 0xb1, 0x06, 0x02, 0xd4, 0x01, 0x20, 0x73, 0x07, + 0x5b, 0x0f, 0x01, 0x21, 0x01, 0x91, 0x00, 0x28, + 0x03, 0xd0, 0xa9, 0x7a, 0x20, 0x1c, 0xf4, 0xf7, + 0x36, 0xfc, 0x01, 0x99, 0x01, 0x29, 0x15, 0xd1, + 0x3c, 0x00, 0x80, 0xbb, 0x00, 0x00, 0xf0, 0x06, + 0xc6, 0x0f, 0x20, 0x88, 0x1b, 0x4f, 0xe4, 0x8a, + 0xf9, 0x6b, 0x00, 0x05, 0xc0, 0x0f, 0x00, 0x29, + 0x1a, 0xd0, 0x4b, 0x1c, 0x18, 0xd0, 0x00, 0x2e, + 0x0a, 0xd0, 0x00, 0x28, 0x08, 0xd0, 0x38, 0x88, + 0x84, 0x42, 0x13, 0xd0, 0x02, 0x98, 0x0c, 0x28, + 0x01, 0xe0, 0x1d, 0xe0, 0x12, 0xe0, 0x0d, 0xd0, + 0x08, 0x1c, 0x01, 0xf0, 0x76, 0xf9, 0x00, 0x28, + 0x03, 0xd1, 0x3c, 0x00, 0xbc, 0xbb, 0x00, 0x00, + 0x00, 0xf0, 0xa6, 0xfa, 0xf4, 0xf7, 0x0a, 0xfc, + 0x00, 0x20, 0xc0, 0x43, 0xf8, 0x63, 0x00, 0x2e, + 0x0d, 0xd0, 0x3c, 0x80, 0x00, 0x20, 0xf8, 0x63, + 0x09, 0xe0, 0x20, 0x88, 0x00, 0x06, 0x80, 0x0e, + 0x20, 0x28, 0x04, 0xd1, 0x04, 0x4f, 0x20, 0x1c, + 0xb9, 0x6a, 0xf4, 0xf7, 0xf8, 0xfb, 0x29, 0x1c, + 0x02, 0x48, 0xfb, 0xf7, 0xef, 0xff, 0xfe, 0xbd, + 0x28, 0x7a, 0x01, 0x00, 0x3c, 0x00, 0xf8, 0xbb, + 0x00, 0x00, 0xa5, 0x9a, 0x00, 0x00, 0x03, 0x48, + 0x80, 0xb5, 0x00, 0x78, 0x00, 0x21, 0x00, 0xf0, + 0xfc, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x18, 0x63, + 0x01, 0x00, 0x04, 0x4b, 0x05, 0x49, 0x00, 0x28, + 0x1a, 0x68, 0x00, 0xd0, 0x01, 0x1c, 0x10, 0x1c, + 0x19, 0x60, 0x70, 0x47, 0x00, 0x00, 0xd4, 0x79, + 0x01, 0x00, 0x95, 0x75, 0x00, 0x00, 0x05, 0x48, + 0x80, 0xb5, 0x00, 0x7f, 0x24, 0x23, 0x3c, 0x00, + 0x34, 0xbc, 0x00, 0x00, 0x04, 0x49, 0x58, 0x43, + 0x40, 0x18, 0xc0, 0x69, 0xf4, 0xf7, 0xcc, 0xfb, + 0x80, 0xbd, 0x00, 0x00, 0xd4, 0x79, 0x01, 0x00, + 0x94, 0x46, 0x01, 0x00, 0x02, 0x1c, 0x06, 0x48, + 0x80, 0xb5, 0x81, 0x62, 0x82, 0x60, 0x00, 0x7f, + 0x24, 0x23, 0x04, 0x49, 0x58, 0x43, 0x40, 0x18, + 0x80, 0x69, 0xf4, 0xf7, 0xb9, 0xfb, 0x80, 0xbd, + 0xd4, 0x79, 0x01, 0x00, 0x94, 0x46, 0x01, 0x00, + 0x3c, 0x00, 0x70, 0xbc, 0x00, 0x00, 0x80, 0xb5, + 0x00, 0x20, 0x00, 0xf0, 0x3c, 0xfb, 0x00, 0x20, + 0x00, 0xf0, 0x6d, 0xfa, 0x00, 0xf0, 0x65, 0xfa, + 0x04, 0x49, 0xc8, 0x6a, 0x01, 0x30, 0xc8, 0x62, + 0x08, 0x1f, 0x00, 0x88, 0x07, 0xf0, 0xc1, 0xf8, + 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x06, 0x48, + 0x80, 0xb5, 0x00, 0x21, 0x01, 0x77, 0xc1, 0x6a, + 0x01, 0x31, 0xc1, 0x62, 0x04, 0x38, 0x00, 0x88, + 0x07, 0xf0, 0x3c, 0x00, 0xac, 0xbc, 0x00, 0x00, + 0xb3, 0xf8, 0x03, 0xf0, 0xd1, 0xf9, 0x80, 0xbd, + 0xd4, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x05, 0xf0, + 0xe9, 0xfa, 0x80, 0xbd, 0x80, 0xb5, 0x00, 0x28, + 0x03, 0xd1, 0x01, 0x20, 0x04, 0xf0, 0x22, 0xfa, + 0x80, 0xbd, 0x01, 0x20, 0x03, 0xf0, 0xe6, 0xfb, + 0x80, 0xbd, 0x00, 0x00, 0x03, 0x49, 0x01, 0x20, + 0x49, 0x78, 0x00, 0x29, 0x00, 0xd0, 0x00, 0x20, + 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0xbc, + 0x00, 0x00, 0x2c, 0x63, 0x01, 0x00, 0x70, 0xb5, + 0x13, 0x4d, 0x28, 0x78, 0x00, 0x28, 0x20, 0xd1, + 0x01, 0x21, 0x2e, 0x1c, 0x70, 0x68, 0xff, 0xf7, + 0x12, 0xfd, 0x00, 0x21, 0x07, 0x20, 0x06, 0xf0, + 0x2a, 0xfb, 0x0d, 0x48, 0x00, 0x24, 0x04, 0x71, + 0x04, 0xf0, 0xed, 0xf8, 0x06, 0xf0, 0xd5, 0xf9, + 0x01, 0x20, 0x28, 0x70, 0x0a, 0x48, 0x04, 0x60, + 0x44, 0x60, 0xf6, 0xf7, 0x4c, 0xfd, 0x3c, 0x00, + 0x24, 0xbd, 0x00, 0x00, 0xf7, 0xf7, 0x5e, 0xf8, + 0xff, 0xf7, 0xa2, 0xff, 0x00, 0xf0, 0xa8, 0xfd, + 0x05, 0x48, 0x71, 0x68, 0x03, 0xf0, 0x20, 0xfb, + 0x01, 0x20, 0x70, 0xbd, 0x2c, 0x63, 0x01, 0x00, + 0x50, 0x00, 0x07, 0x00, 0x80, 0x00, 0x07, 0x00, + 0xc4, 0x60, 0x01, 0x00, 0xb0, 0xb5, 0x1e, 0x4c, + 0x20, 0x78, 0x01, 0x28, 0x35, 0xd1, 0x25, 0x1c, + 0x69, 0x68, 0x1c, 0x48, 0x03, 0xf0, 0x20, 0xfb, + 0x3c, 0x00, 0x60, 0xbd, 0x00, 0x00, 0x04, 0xf0, + 0xf0, 0xf8, 0x1a, 0x48, 0x01, 0x68, 0x49, 0x08, + 0x49, 0x00, 0x01, 0x60, 0x01, 0x68, 0x01, 0x22, + 0x11, 0x43, 0x01, 0x60, 0x00, 0xf0, 0x2b, 0xfe, + 0x00, 0xf0, 0x1b, 0xfc, 0x06, 0xf0, 0x99, 0xf8, + 0xf6, 0xf7, 0x29, 0xfe, 0xf6, 0xf7, 0x2d, 0xfc, + 0x00, 0x20, 0x20, 0x70, 0xff, 0xf7, 0x83, 0xff, + 0x00, 0xf0, 0x8b, 0xfd, 0x0f, 0x48, 0x81, 0x78, + 0x08, 0x22, 0x3c, 0x00, 0x9c, 0xbd, 0x00, 0x00, + 0x91, 0x43, 0x81, 0x70, 0x81, 0x78, 0x11, 0x43, + 0x81, 0x70, 0x0c, 0x49, 0x10, 0x20, 0x08, 0x71, + 0x68, 0x68, 0xff, 0xf7, 0x5f, 0xfd, 0xf7, 0xf7, + 0x39, 0xf8, 0xf6, 0xf7, 0x4d, 0xfd, 0x01, 0x21, + 0x07, 0x20, 0x06, 0xf0, 0xcd, 0xfa, 0x01, 0x20, + 0xb0, 0xbd, 0x00, 0x00, 0x2c, 0x63, 0x01, 0x00, + 0xc4, 0x60, 0x01, 0x00, 0xf0, 0x00, 0x07, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x3c, 0x00, 0xd8, 0xbd, + 0x00, 0x00, 0x50, 0x00, 0x07, 0x00, 0x03, 0x49, + 0x01, 0x20, 0x89, 0x7a, 0x01, 0x29, 0x00, 0xd0, + 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, 0x14, 0x7a, + 0x01, 0x00, 0xb0, 0xb5, 0x15, 0x4d, 0x04, 0x1c, + 0x28, 0x7a, 0x00, 0x28, 0x20, 0xd1, 0xf9, 0xf7, + 0x00, 0xfc, 0x02, 0x28, 0x1c, 0xd1, 0x01, 0x20, + 0x28, 0x72, 0xe8, 0x68, 0x00, 0x28, 0x10, 0xd0, + 0x20, 0x68, 0x29, 0x68, 0x08, 0x60, 0x3c, 0x00, + 0x14, 0xbe, 0x00, 0x00, 0x69, 0x68, 0x0d, 0x48, + 0x03, 0xf0, 0xc2, 0xfa, 0x01, 0x21, 0x68, 0x68, + 0xff, 0xf7, 0xc8, 0xfc, 0x00, 0x22, 0x24, 0x20, + 0x61, 0x68, 0x07, 0xf0, 0xcf, 0xfb, 0xb0, 0xbd, + 0x00, 0x20, 0x28, 0x72, 0x21, 0x68, 0x01, 0x20, + 0xf4, 0xf7, 0xcf, 0xfa, 0xb0, 0xbd, 0x00, 0x20, + 0x21, 0x68, 0xf4, 0xf7, 0xca, 0xfa, 0xb0, 0xbd, + 0x04, 0x7a, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, + 0x3c, 0x00, 0x50, 0xbe, 0x00, 0x00, 0x04, 0x48, + 0x80, 0xb5, 0x00, 0x7a, 0x01, 0x28, 0x02, 0xd1, + 0x00, 0x20, 0x02, 0xf0, 0xf0, 0xfe, 0x80, 0xbd, + 0x00, 0x00, 0x04, 0x7a, 0x01, 0x00, 0x80, 0xb5, + 0x01, 0x28, 0x07, 0xd0, 0x80, 0x28, 0x09, 0xd1, + 0x07, 0x48, 0x00, 0x7a, 0x00, 0x28, 0x04, 0xd0, + 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, 0x02, 0xf0, + 0xde, 0xfe, 0x80, 0xbd, 0x0e, 0x21, 0x24, 0x20, + 0xf5, 0xf7, 0x3c, 0x00, 0x8c, 0xbe, 0x00, 0x00, + 0x0b, 0xfa, 0x80, 0xbd, 0x04, 0x7a, 0x01, 0x00, + 0xf8, 0xb5, 0x3a, 0x4e, 0x05, 0x1c, 0xb0, 0x7a, + 0x00, 0x28, 0x69, 0xd1, 0xf9, 0xf7, 0xae, 0xfb, + 0x02, 0x28, 0x65, 0xd1, 0x36, 0x48, 0x00, 0x68, + 0x00, 0x28, 0x61, 0xd0, 0x35, 0x48, 0x71, 0x68, + 0x03, 0xf0, 0x74, 0xfa, 0x01, 0x21, 0x70, 0x68, + 0xff, 0xf7, 0x7a, 0xfc, 0x6c, 0x20, 0xf5, 0xf7, + 0xb9, 0xfc, 0x04, 0x1c, 0x3c, 0x00, 0xc8, 0xbe, + 0x00, 0x00, 0x6c, 0x21, 0xf4, 0xf7, 0xe7, 0xfa, + 0x30, 0x68, 0x2c, 0x22, 0x04, 0x60, 0x29, 0x68, + 0x81, 0x60, 0x69, 0x68, 0xc1, 0x60, 0x00, 0x21, + 0x11, 0x54, 0x81, 0x62, 0xa9, 0x68, 0x00, 0x29, + 0x02, 0xd0, 0xe9, 0x68, 0x01, 0x61, 0x05, 0xe0, + 0x06, 0xf0, 0x5d, 0xff, 0x69, 0x68, 0x40, 0x18, + 0x31, 0x68, 0x08, 0x61, 0x70, 0x68, 0xff, 0xf7, + 0x14, 0xfd, 0x69, 0x21, 0x08, 0x55, 0x3c, 0x00, + 0x04, 0xbf, 0x00, 0x00, 0x00, 0x20, 0xf9, 0xf7, + 0x09, 0xfb, 0x01, 0x27, 0x3b, 0x1c, 0x06, 0x1c, + 0x22, 0x1c, 0x24, 0x32, 0x00, 0x21, 0xf9, 0xf7, + 0x79, 0xfb, 0x1c, 0x48, 0x03, 0x21, 0x00, 0x88, + 0x89, 0x03, 0x08, 0x43, 0x21, 0x1c, 0x40, 0x31, + 0x00, 0x91, 0x48, 0x83, 0x18, 0x48, 0x10, 0x21, + 0x60, 0x60, 0x18, 0x48, 0xa0, 0x60, 0xa7, 0x63, + 0x67, 0x63, 0x00, 0x20, 0xf5, 0xf7, 0x4c, 0xfb, + 0x3c, 0x00, 0x40, 0xbf, 0x00, 0x00, 0xe0, 0x60, + 0x02, 0x89, 0x00, 0x99, 0xca, 0x83, 0x07, 0x68, + 0x31, 0x1c, 0x38, 0x1d, 0x27, 0x61, 0xfe, 0xf7, + 0x8e, 0xfe, 0x38, 0x1c, 0x0a, 0x30, 0x0f, 0x49, + 0xfe, 0xf7, 0x89, 0xfe, 0xa4, 0x20, 0x38, 0x80, + 0x00, 0x20, 0x04, 0xf0, 0xde, 0xfb, 0x00, 0x22, + 0x1f, 0x20, 0x69, 0x68, 0x07, 0xf0, 0x2d, 0xfb, + 0xf8, 0xbd, 0xff, 0xe7, 0x00, 0x20, 0x29, 0x68, + 0xf4, 0xf7, 0x3c, 0x00, 0x7c, 0xbf, 0x00, 0x00, + 0x2e, 0xfa, 0xf8, 0xe7, 0x14, 0x7a, 0x01, 0x00, + 0x80, 0x5a, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, + 0xfa, 0x60, 0x01, 0x00, 0x99, 0xec, 0x00, 0x00, + 0x15, 0xed, 0x00, 0x00, 0x12, 0x61, 0x01, 0x00, + 0x06, 0x48, 0x80, 0xb5, 0x81, 0x7a, 0x00, 0x29, + 0x07, 0xd0, 0x00, 0x68, 0x04, 0x22, 0x20, 0x30, + 0x01, 0x7b, 0x11, 0x43, 0x01, 0x73, 0x02, 0xf0, + 0x6b, 0xfd, 0x80, 0xbd, 0x3c, 0x00, 0xb8, 0xbf, + 0x00, 0x00, 0x14, 0x7a, 0x01, 0x00, 0x10, 0xb5, + 0x04, 0x4c, 0xa0, 0x7a, 0x01, 0x28, 0x03, 0xd1, + 0x06, 0xf0, 0xf1, 0xfe, 0x21, 0x68, 0x88, 0x61, + 0x10, 0xbd, 0x14, 0x7a, 0x01, 0x00, 0x03, 0x1c, + 0x08, 0x1c, 0x1f, 0x49, 0x70, 0xb5, 0x0a, 0x68, + 0x01, 0x2b, 0x1c, 0xd0, 0x80, 0x2b, 0x05, 0xd0, + 0x83, 0x2b, 0x30, 0xd1, 0x88, 0x7a, 0x00, 0x28, + 0x14, 0xd0, 0x29, 0xe0, 0x53, 0x69, 0x3c, 0x00, + 0xf4, 0xbf, 0x00, 0x00, 0x00, 0x2b, 0x0e, 0xd0, + 0x94, 0x69, 0xd5, 0x69, 0x2e, 0x1b, 0x0c, 0x69, + 0x5d, 0x1b, 0x36, 0x1b, 0xb6, 0x10, 0xa4, 0x19, + 0x0c, 0x61, 0xcc, 0x68, 0x2d, 0x1b, 0xad, 0x10, + 0x64, 0x19, 0xcc, 0x60, 0x93, 0x61, 0x02, 0xf0, + 0x81, 0xfd, 0x70, 0xbd, 0x02, 0x28, 0x12, 0xd1, + 0x90, 0x6a, 0x0c, 0x1c, 0x00, 0x28, 0xf8, 0xd0, + 0x07, 0xf0, 0x0e, 0xfa, 0xa0, 0x7a, 0x01, 0x28, + 0x3c, 0x00, 0x30, 0xc0, 0x00, 0x00, 0xf3, 0xd1, + 0x20, 0x68, 0x81, 0x6a, 0x00, 0x29, 0xef, 0xd1, + 0x20, 0x30, 0x01, 0x7b, 0x08, 0x22, 0x11, 0x43, + 0x01, 0x73, 0x70, 0xbd, 0x02, 0xf0, 0x21, 0xfd, + 0x70, 0xbd, 0x0e, 0x21, 0x1f, 0x20, 0xf5, 0xf7, + 0x28, 0xf9, 0x70, 0xbd, 0x00, 0x00, 0x14, 0x7a, + 0x01, 0x00, 0x02, 0x49, 0x0c, 0x31, 0x03, 0xc9, + 0x40, 0x18, 0x70, 0x47, 0x00, 0x00, 0x14, 0x7a, + 0x01, 0x00, 0x3c, 0x00, 0x6c, 0xc0, 0x00, 0x00, + 0x05, 0x48, 0x80, 0xb5, 0x00, 0x68, 0x04, 0x22, + 0x20, 0x30, 0x01, 0x7b, 0x11, 0x43, 0x01, 0x73, + 0x07, 0xf0, 0xe4, 0xf9, 0x80, 0xbd, 0x00, 0x00, + 0x14, 0x7a, 0x01, 0x00, 0x70, 0xb5, 0x16, 0x4c, + 0x0e, 0x1c, 0xa1, 0x7a, 0x00, 0x29, 0x1c, 0xd0, + 0x21, 0x68, 0x08, 0x61, 0x07, 0xf0, 0x32, 0xfa, + 0x00, 0x28, 0x17, 0xd0, 0x20, 0x68, 0x00, 0x25, + 0x05, 0x62, 0x00, 0x22, 0x3c, 0x00, 0xa8, 0xc0, + 0x00, 0x00, 0x83, 0x21, 0x1f, 0x20, 0x07, 0xf0, + 0x94, 0xfa, 0x60, 0x68, 0xff, 0xf7, 0x03, 0xfc, + 0x21, 0x68, 0x04, 0x22, 0x20, 0x31, 0x08, 0x7b, + 0x2b, 0x1c, 0x90, 0x43, 0x08, 0x73, 0x31, 0x1c, + 0x00, 0x22, 0x1f, 0x20, 0x07, 0xf0, 0x61, 0xfb, + 0x70, 0xbd, 0x20, 0x68, 0x08, 0x22, 0x20, 0x30, + 0x01, 0x7b, 0x11, 0x43, 0x01, 0x73, 0x02, 0xf0, + 0xd6, 0xfc, 0x70, 0xbd, 0x00, 0x00, 0x3c, 0x00, + 0xe4, 0xc0, 0x00, 0x00, 0x14, 0x7a, 0x01, 0x00, + 0x80, 0xb5, 0x00, 0xf0, 0x77, 0xfc, 0x00, 0xf0, + 0x6f, 0xfc, 0x00, 0xf0, 0x29, 0xff, 0x00, 0xf0, + 0x5d, 0xfa, 0x00, 0xf0, 0xc5, 0xf8, 0x00, 0xf0, + 0x85, 0xff, 0x80, 0xbd, 0x80, 0xb5, 0xfa, 0xf7, + 0x85, 0xfa, 0x80, 0xbd, 0x01, 0x48, 0xc0, 0x68, + 0x70, 0x47, 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, + 0x03, 0x49, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x1c, + 0x3c, 0x00, 0x20, 0xc1, 0x00, 0x00, 0x02, 0x48, + 0xc1, 0x60, 0x70, 0x47, 0x00, 0x00, 0x81, 0x75, + 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x01, 0x48, + 0x02, 0x49, 0xc8, 0x60, 0x70, 0x47, 0x81, 0x75, + 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x01, 0x49, + 0x88, 0x61, 0x70, 0x47, 0x00, 0x00, 0x28, 0x7a, + 0x01, 0x00, 0x01, 0x49, 0x00, 0x20, 0x88, 0x61, + 0x70, 0x47, 0x28, 0x7a, 0x01, 0x00, 0x03, 0x49, + 0x00, 0x28, 0x3c, 0x00, 0x5c, 0xc1, 0x00, 0x00, + 0x00, 0xd0, 0x01, 0x1c, 0x02, 0x48, 0xc1, 0x61, + 0x70, 0x47, 0x00, 0x00, 0x89, 0x75, 0x00, 0x00, + 0x28, 0x7a, 0x01, 0x00, 0x03, 0x49, 0x00, 0x28, + 0x00, 0xd0, 0x01, 0x1c, 0x02, 0x48, 0x81, 0x62, + 0x70, 0x47, 0x00, 0x00, 0x8d, 0x75, 0x00, 0x00, + 0x28, 0x7a, 0x01, 0x00, 0x03, 0x49, 0x00, 0x28, + 0x00, 0xd0, 0x01, 0x1c, 0x02, 0x48, 0x01, 0x62, + 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xc1, + 0x00, 0x00, 0x91, 0x75, 0x00, 0x00, 0x28, 0x7a, + 0x01, 0x00, 0x03, 0x49, 0x00, 0x28, 0x00, 0xd0, + 0x01, 0x1c, 0x02, 0x48, 0x01, 0x61, 0x70, 0x47, + 0x00, 0x00, 0x99, 0x75, 0x00, 0x00, 0x28, 0x7a, + 0x01, 0x00, 0x01, 0x48, 0x02, 0x49, 0x08, 0x61, + 0x70, 0x47, 0x81, 0x75, 0x00, 0x00, 0x28, 0x7a, + 0x01, 0x00, 0x02, 0x1c, 0x08, 0x1c, 0x80, 0x2a, + 0x80, 0xb5, 0x02, 0xd1, 0x00, 0xf0, 0x3c, 0x00, + 0xd4, 0xc1, 0x00, 0x00, 0x07, 0xf8, 0x80, 0xbd, + 0x1e, 0x21, 0x21, 0x20, 0xf5, 0xf7, 0x62, 0xf8, + 0x80, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x10, 0x4d, + 0x04, 0x1c, 0xa8, 0x6b, 0x01, 0x30, 0xa8, 0x63, + 0x69, 0x6b, 0x09, 0x1a, 0x28, 0x1c, 0x00, 0x6b, + 0x0c, 0x29, 0x03, 0xd9, 0x00, 0x21, 0xff, 0xf7, + 0x91, 0xfa, 0x03, 0xe0, 0x08, 0x29, 0x01, 0xd1, + 0xff, 0xf7, 0x32, 0xfb, 0x20, 0x1c, 0x00, 0xf0, + 0x3c, 0x00, 0x10, 0xc2, 0x00, 0x00, 0x4d, 0xf9, + 0x60, 0x69, 0x40, 0x07, 0x01, 0xd5, 0x03, 0xf0, + 0x0c, 0xfc, 0x20, 0x1c, 0xe9, 0x6a, 0xf4, 0xf7, + 0xdb, 0xf8, 0xb0, 0xbd, 0x00, 0x00, 0x28, 0x7a, + 0x01, 0x00, 0x03, 0x49, 0x00, 0x28, 0x00, 0xd0, + 0x01, 0x1c, 0x02, 0x48, 0x41, 0x62, 0x70, 0x47, + 0x00, 0x00, 0xb5, 0x75, 0x00, 0x00, 0x28, 0x7a, + 0x01, 0x00, 0x03, 0x49, 0x01, 0x20, 0x09, 0x6c, + 0x00, 0x29, 0x3c, 0x00, 0x4c, 0xc2, 0x00, 0x00, + 0x00, 0xd1, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, + 0x28, 0x7a, 0x01, 0x00, 0x10, 0xb5, 0x07, 0x4c, + 0xe1, 0x6b, 0x00, 0x29, 0x01, 0xd1, 0xe0, 0x63, + 0x04, 0xe0, 0x81, 0x42, 0x02, 0xd0, 0x00, 0x20, + 0xc0, 0x43, 0xf8, 0xe7, 0x06, 0xf0, 0x9c, 0xfd, + 0x20, 0x64, 0x10, 0xbd, 0x28, 0x7a, 0x01, 0x00, + 0x01, 0x48, 0x00, 0x6c, 0x70, 0x47, 0x00, 0x00, + 0x28, 0x7a, 0x01, 0x00, 0x3c, 0x00, 0x88, 0xc2, + 0x00, 0x00, 0x05, 0x49, 0x80, 0xb5, 0x00, 0x20, + 0x48, 0x63, 0x88, 0x63, 0xff, 0x21, 0x09, 0x31, + 0x15, 0x22, 0x10, 0x20, 0xf6, 0xf7, 0xfb, 0xf9, + 0x80, 0xbd, 0x28, 0x7a, 0x01, 0x00, 0x03, 0x49, + 0x00, 0x28, 0x00, 0xd0, 0x01, 0x1c, 0x02, 0x48, + 0x81, 0x60, 0x70, 0x47, 0x00, 0x00, 0xc1, 0x75, + 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x03, 0x49, + 0x00, 0x28, 0x00, 0xd0, 0x01, 0x1c, 0x3c, 0x00, + 0xc4, 0xc2, 0x00, 0x00, 0x02, 0x48, 0xc1, 0x62, + 0x70, 0x47, 0x00, 0x00, 0xc5, 0x75, 0x00, 0x00, + 0x28, 0x7a, 0x01, 0x00, 0x04, 0x4b, 0x05, 0x49, + 0x00, 0x28, 0x5a, 0x68, 0x00, 0xd0, 0x01, 0x1c, + 0x10, 0x1c, 0x59, 0x60, 0x70, 0x47, 0x00, 0x00, + 0x28, 0x7a, 0x01, 0x00, 0xc9, 0x75, 0x00, 0x00, + 0x03, 0x49, 0x00, 0x28, 0x00, 0xd0, 0x01, 0x1c, + 0x02, 0x48, 0x41, 0x61, 0x70, 0x47, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0xc3, 0x00, 0x00, 0xcd, 0x75, + 0x00, 0x00, 0x28, 0x7a, 0x01, 0x00, 0x0f, 0x4b, + 0x10, 0xb5, 0xd9, 0x68, 0x00, 0x29, 0x19, 0xd0, + 0x0e, 0x4c, 0x00, 0x21, 0xca, 0x00, 0x12, 0x19, + 0x40, 0x3a, 0xd2, 0x6b, 0x82, 0x42, 0x02, 0xda, + 0x01, 0x31, 0x03, 0x29, 0xf6, 0xd3, 0x48, 0x1c, + 0x1a, 0x78, 0x00, 0x06, 0x00, 0x0e, 0x90, 0x42, + 0x08, 0xd0, 0x18, 0x70, 0x08, 0x06, 0x00, 0x0e, + 0x04, 0x1c, 0x3c, 0x00, 0x3c, 0xc3, 0x00, 0x00, + 0xf6, 0xf7, 0xba, 0xfa, 0x20, 0x1c, 0x03, 0xf0, + 0x1b, 0xfd, 0x10, 0xbd, 0x18, 0x63, 0x01, 0x00, + 0x3c, 0x42, 0x01, 0x00, 0x10, 0xb5, 0x14, 0x4c, + 0xe1, 0x68, 0x00, 0x29, 0x22, 0xd0, 0x21, 0x78, + 0x12, 0x4b, 0xca, 0x00, 0xd2, 0x18, 0x40, 0x3a, + 0xd3, 0x6b, 0x83, 0x42, 0x02, 0xda, 0x48, 0x1c, + 0x20, 0x70, 0x0b, 0xe0, 0x92, 0x6b, 0x82, 0x42, + 0x14, 0xdd, 0xff, 0x31, 0x3c, 0x00, 0x78, 0xc3, + 0x00, 0x00, 0x08, 0x06, 0x00, 0x0e, 0x20, 0x70, + 0x03, 0xd1, 0x19, 0x21, 0x86, 0x20, 0xf4, 0xf7, + 0x8e, 0xff, 0x20, 0x78, 0xff, 0x30, 0x00, 0x06, + 0x00, 0x0e, 0xf6, 0xf7, 0x90, 0xfa, 0x20, 0x78, + 0xff, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x03, 0xf0, + 0xee, 0xfc, 0x10, 0xbd, 0x00, 0x00, 0x18, 0x63, + 0x01, 0x00, 0x3c, 0x42, 0x01, 0x00, 0x09, 0x48, + 0x00, 0x21, 0x01, 0x81, 0x41, 0x81, 0x3c, 0x00, + 0xb4, 0xc3, 0x00, 0x00, 0x81, 0x81, 0xc1, 0x81, + 0x07, 0x4a, 0x02, 0x80, 0x01, 0x23, 0xdb, 0x02, + 0x43, 0x80, 0x82, 0x80, 0xc2, 0x80, 0x41, 0x76, + 0x31, 0x21, 0x81, 0x76, 0x01, 0x21, 0x01, 0x76, + 0x70, 0x47, 0x00, 0x00, 0x30, 0x80, 0x07, 0x00, + 0xff, 0xff, 0x00, 0x00, 0x80, 0xb5, 0x01, 0x20, + 0xf6, 0xf7, 0xf8, 0xf8, 0x01, 0x20, 0xf6, 0xf7, + 0xdb, 0xfc, 0x01, 0x20, 0xf6, 0xf7, 0x5a, 0xfa, + 0x3c, 0x00, 0xf0, 0xc3, 0x00, 0x00, 0x01, 0x20, + 0x00, 0xf0, 0xf1, 0xfd, 0x01, 0x20, 0xf7, 0xf7, + 0xc6, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x10, 0xb5, + 0x11, 0x4c, 0x00, 0x29, 0x07, 0xd1, 0x00, 0x28, + 0x02, 0xd1, 0x01, 0x20, 0xe0, 0x60, 0x06, 0xe0, + 0x00, 0x21, 0xe1, 0x60, 0x03, 0xe0, 0x01, 0x29, + 0x07, 0xd1, 0x00, 0x28, 0x01, 0xd0, 0x20, 0x70, + 0x03, 0xe0, 0x18, 0x21, 0x86, 0x20, 0xf4, 0xf7, + 0x3c, 0xff, 0x3c, 0x00, 0x2c, 0xc4, 0x00, 0x00, + 0x20, 0x78, 0xff, 0x30, 0x00, 0x06, 0x00, 0x0e, + 0xf6, 0xf7, 0x3e, 0xfa, 0x20, 0x78, 0xff, 0x30, + 0x00, 0x06, 0x00, 0x0e, 0x03, 0xf0, 0x9c, 0xfc, + 0x10, 0xbd, 0x00, 0x00, 0x18, 0x63, 0x01, 0x00, + 0x05, 0x49, 0x80, 0xb5, 0x09, 0x68, 0x88, 0x42, + 0x05, 0xd0, 0xfe, 0xf7, 0xff, 0xfb, 0x00, 0xf0, + 0x87, 0xfa, 0xff, 0xf7, 0x2b, 0xfc, 0x80, 0xbd, + 0xa8, 0x69, 0x01, 0x00, 0x3c, 0x00, 0x68, 0xc4, + 0x00, 0x00, 0x01, 0x49, 0x48, 0x70, 0x70, 0x47, + 0x00, 0x00, 0x2c, 0x63, 0x01, 0x00, 0x01, 0x49, + 0xc8, 0x60, 0x70, 0x47, 0x00, 0x00, 0x4c, 0x7b, + 0x01, 0x00, 0x03, 0x49, 0x01, 0x20, 0x09, 0x78, + 0x00, 0x29, 0x00, 0xd0, 0x00, 0x20, 0x70, 0x47, + 0x00, 0x00, 0x2c, 0x63, 0x01, 0x00, 0x04, 0x4a, + 0x00, 0x28, 0x02, 0xd0, 0x90, 0x69, 0x01, 0x30, + 0x90, 0x61, 0xd0, 0x69, 0x40, 0x18, 0x3c, 0x00, + 0xa4, 0xc4, 0x00, 0x00, 0xd0, 0x61, 0x70, 0x47, + 0x90, 0x5c, 0x01, 0x00, 0xfe, 0xb5, 0x04, 0x1c, + 0x00, 0x68, 0x05, 0x68, 0x28, 0x1c, 0xfe, 0xf7, + 0x27, 0xff, 0x07, 0x1c, 0x60, 0x69, 0x15, 0x4e, + 0xc0, 0x07, 0xc0, 0x0f, 0x21, 0xd0, 0x01, 0xaa, + 0x02, 0xa9, 0x28, 0x1c, 0xfe, 0xf7, 0x12, 0xff, + 0x38, 0x78, 0xc0, 0x07, 0x0c, 0xd4, 0x60, 0x69, + 0x80, 0x07, 0x08, 0xd5, 0x00, 0xab, 0x18, 0x7a, + 0x3c, 0x00, 0xe0, 0xc4, 0x00, 0x00, 0x00, 0x28, + 0x01, 0xd0, 0x02, 0x28, 0x02, 0xd1, 0x70, 0x6a, + 0x01, 0x30, 0x70, 0x62, 0xfe, 0xbd, 0x00, 0xab, + 0x18, 0x7a, 0x00, 0x28, 0x01, 0xd0, 0x02, 0x28, + 0xf8, 0xd1, 0x70, 0x6a, 0x01, 0x30, 0x70, 0x62, + 0xb0, 0x6a, 0x01, 0x30, 0xb0, 0x62, 0xf1, 0xe7, + 0xf0, 0x6a, 0x01, 0x30, 0xf0, 0x62, 0xed, 0xe7, + 0x00, 0x00, 0x90, 0x5c, 0x01, 0x00, 0x02, 0x49, + 0x48, 0x69, 0x3c, 0x00, 0x1c, 0xc5, 0x00, 0x00, + 0x01, 0x30, 0x48, 0x61, 0x70, 0x47, 0x00, 0x00, + 0x90, 0x5c, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x70, 0x47, 0x00, 0x00, 0x01, 0x1c, 0x40, 0x31, + 0x10, 0xb5, 0x0a, 0x8b, 0x12, 0x07, 0x92, 0x0f, + 0x01, 0x2a, 0x33, 0xd0, 0x4a, 0x78, 0x1a, 0x49, + 0x04, 0x1c, 0x60, 0x34, 0x00, 0x2a, 0x0b, 0x6a, + 0x22, 0xd1, 0xe2, 0x79, 0x01, 0x2a, 0x02, 0xd9, + 0xcc, 0x68, 0x01, 0x34, 0x3c, 0x00, 0x58, 0xc5, + 0x00, 0x00, 0xcc, 0x60, 0x02, 0x2a, 0x02, 0xd9, + 0x0c, 0x69, 0x01, 0x34, 0x0c, 0x61, 0x0c, 0x68, + 0x01, 0x34, 0x0c, 0x60, 0x44, 0x6b, 0x00, 0x2c, + 0x03, 0xd0, 0x04, 0x69, 0x24, 0x7c, 0xe4, 0x07, + 0x02, 0xd5, 0x4c, 0x68, 0x01, 0x34, 0x4c, 0x60, + 0x80, 0x6b, 0x00, 0x28, 0x02, 0xd0, 0x08, 0x6b, + 0x01, 0x30, 0x08, 0x63, 0x00, 0x2a, 0x0c, 0xd0, + 0x98, 0x18, 0x01, 0x38, 0x08, 0xe0, 0x3c, 0x00, + 0x94, 0xc5, 0x00, 0x00, 0x01, 0x2a, 0x01, 0xd0, + 0x02, 0x2a, 0x02, 0xd1, 0x88, 0x68, 0x01, 0x30, + 0x88, 0x60, 0xe0, 0x79, 0x18, 0x18, 0x08, 0x62, + 0x10, 0xbd, 0x00, 0x00, 0x90, 0x5c, 0x01, 0x00, + 0x70, 0x47, 0x00, 0x00, 0x01, 0x49, 0x0a, 0x20, + 0x08, 0x81, 0x70, 0x47, 0xc4, 0x7a, 0x01, 0x00, + 0xf0, 0xb5, 0x32, 0x4f, 0x04, 0x1c, 0x78, 0x78, + 0x85, 0xb0, 0xc0, 0x07, 0xc0, 0x0f, 0x03, 0x90, + 0x3c, 0x00, 0xd0, 0xc5, 0x00, 0x00, 0xb8, 0x78, + 0x02, 0x90, 0x01, 0x20, 0xa0, 0x40, 0x04, 0x90, + 0x39, 0x1c, 0x88, 0x70, 0x2c, 0x48, 0x00, 0x88, + 0x06, 0xf0, 0x0b, 0xfc, 0x01, 0x90, 0xfe, 0xf7, + 0xae, 0xfc, 0x04, 0x30, 0x29, 0x4e, 0xa5, 0x00, + 0x71, 0x59, 0x09, 0x79, 0x88, 0x42, 0x06, 0xd0, + 0xfe, 0xf7, 0xa5, 0xfc, 0x71, 0x59, 0x04, 0x30, + 0x08, 0x71, 0x01, 0x20, 0x78, 0x70, 0x00, 0x20, + 0x78, 0x70, 0x3c, 0x00, 0x0c, 0xc6, 0x00, 0x00, + 0x21, 0x48, 0x01, 0x21, 0x20, 0x4e, 0x30, 0x38, + 0x01, 0x55, 0x71, 0x59, 0x03, 0x20, 0x08, 0x70, + 0x06, 0xf0, 0xc6, 0xfb, 0x06, 0x1c, 0xfe, 0xf7, + 0x91, 0xfc, 0x36, 0x18, 0x0e, 0x36, 0x09, 0xe0, + 0x30, 0x1c, 0x06, 0xf0, 0xf5, 0xfa, 0x00, 0x28, + 0x04, 0xd0, 0x23, 0x21, 0x86, 0x20, 0xf4, 0xf7, + 0x33, 0xfe, 0x03, 0xe0, 0xf6, 0xf7, 0x34, 0xfb, + 0x00, 0x28, 0xf1, 0xd0, 0x3c, 0x00, 0x48, 0xc6, + 0x00, 0x00, 0x12, 0x48, 0x13, 0x49, 0x3c, 0x38, + 0x00, 0x78, 0x08, 0x72, 0x20, 0x1c, 0xf4, 0xf7, + 0xa2, 0xfa, 0x0e, 0x4e, 0x71, 0x59, 0x08, 0x71, + 0x03, 0x98, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x21, + 0x79, 0x70, 0x09, 0x48, 0x00, 0x88, 0x01, 0x99, + 0x06, 0xf0, 0xbd, 0xfb, 0x02, 0x98, 0xb8, 0x70, + 0x09, 0x49, 0x49, 0x79, 0x04, 0x98, 0x88, 0x42, + 0x03, 0xd0, 0x24, 0x21, 0x86, 0x20, 0x3c, 0x00, + 0x84, 0xc6, 0x00, 0x00, 0xf4, 0xf7, 0x0e, 0xfe, + 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x50, 0x07, 0x00, + 0xd0, 0x79, 0x01, 0x00, 0x10, 0x7b, 0x01, 0x00, + 0x80, 0x80, 0x07, 0x00, 0x50, 0x80, 0x07, 0x00, + 0xb0, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, 0x05, 0x28, + 0x01, 0xd3, 0xf4, 0xf7, 0x29, 0xfe, 0x05, 0x2d, + 0x01, 0xd3, 0xf4, 0xf7, 0x25, 0xfe, 0x0b, 0x4a, + 0xa8, 0x00, 0x11, 0x58, 0xa0, 0x00, 0x10, 0x58, + 0x3c, 0x00, 0xc0, 0xc6, 0x00, 0x00, 0x0e, 0xc9, + 0x0e, 0xc0, 0x06, 0x21, 0x06, 0x22, 0x06, 0x48, + 0x69, 0x43, 0x2a, 0x38, 0x09, 0x18, 0x62, 0x43, + 0x10, 0x18, 0x06, 0x22, 0xf3, 0xf7, 0x0f, 0xff, + 0x02, 0x48, 0x30, 0x38, 0x41, 0x5d, 0x01, 0x55, + 0xb0, 0xbd, 0x10, 0x7b, 0x01, 0x00, 0xb0, 0xb5, + 0x04, 0x1c, 0x0e, 0x48, 0x0d, 0x1c, 0x80, 0x78, + 0x01, 0x21, 0xa1, 0x40, 0x08, 0x40, 0x03, 0xd0, + 0x01, 0x21, 0x3c, 0x00, 0xfc, 0xc6, 0x00, 0x00, + 0x86, 0x20, 0xf4, 0xf7, 0xd1, 0xfd, 0x06, 0x21, + 0x06, 0x22, 0x09, 0x48, 0x69, 0x43, 0x09, 0x18, + 0x62, 0x43, 0x10, 0x18, 0x06, 0x22, 0xf3, 0xf7, + 0xf1, 0xfe, 0x20, 0x1c, 0xf4, 0xf7, 0x40, 0xfa, + 0x03, 0x4a, 0xa1, 0x00, 0x2a, 0x32, 0x51, 0x58, + 0x08, 0x71, 0xb0, 0xbd, 0x00, 0x50, 0x07, 0x00, + 0xe6, 0x7a, 0x01, 0x00, 0x03, 0x49, 0x80, 0xb5, + 0x00, 0x20, 0x48, 0x60, 0x3c, 0x00, 0x38, 0xc7, + 0x00, 0x00, 0x07, 0xf0, 0x32, 0xf9, 0x80, 0xbd, + 0x00, 0x00, 0xd4, 0x7a, 0x01, 0x00, 0x10, 0xb5, + 0x04, 0x1c, 0x05, 0x28, 0x01, 0xd3, 0xf4, 0xf7, + 0xd8, 0xfd, 0x07, 0x49, 0x08, 0x7a, 0x07, 0x4a, + 0x10, 0x70, 0x01, 0x20, 0x08, 0x72, 0xfe, 0xf7, + 0xf4, 0xfb, 0x04, 0x4a, 0x04, 0x30, 0xa1, 0x00, + 0x3c, 0x32, 0x51, 0x58, 0x08, 0x71, 0x10, 0xbd, + 0x00, 0x00, 0x80, 0x80, 0x07, 0x00, 0x3c, 0x00, + 0x74, 0xc7, 0x00, 0x00, 0xd4, 0x7a, 0x01, 0x00, + 0x03, 0x49, 0x80, 0xb5, 0x01, 0x20, 0x48, 0x60, + 0x07, 0xf0, 0x0e, 0xf9, 0x80, 0xbd, 0x00, 0x00, + 0xd4, 0x7a, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, + 0x05, 0x28, 0x01, 0xd3, 0xf4, 0xf7, 0xb4, 0xfd, + 0x20, 0x1c, 0xf5, 0xf7, 0x8f, 0xfe, 0x00, 0x21, + 0x20, 0x1c, 0xfb, 0xf7, 0x31, 0xfd, 0x01, 0x21, + 0x00, 0x28, 0x00, 0xd0, 0x01, 0x1c, 0x09, 0x04, + 0x3c, 0x00, 0xb0, 0xc7, 0x00, 0x00, 0x09, 0x0c, + 0x20, 0x1c, 0x04, 0xf0, 0x22, 0xfa, 0x10, 0xbd, + 0x00, 0x00, 0x06, 0x49, 0x01, 0x20, 0x05, 0x4b, + 0x88, 0x60, 0x00, 0x20, 0x3c, 0x33, 0x00, 0x21, + 0x82, 0x00, 0x9a, 0x58, 0x11, 0x70, 0x01, 0x30, + 0x05, 0x28, 0xf9, 0xdb, 0x70, 0x47, 0xd4, 0x7a, + 0x01, 0x00, 0x0f, 0x49, 0x38, 0xb5, 0x00, 0x20, + 0x88, 0x60, 0x0e, 0x48, 0x01, 0x1c, 0x20, 0x31, + 0x8a, 0x79, 0x3c, 0x00, 0xec, 0xc7, 0x00, 0x00, + 0x00, 0xab, 0x1a, 0x70, 0xc9, 0x79, 0x0a, 0x4c, + 0x09, 0x4d, 0x59, 0x70, 0x0c, 0x34, 0x3c, 0x35, + 0x00, 0x21, 0x03, 0x22, 0x63, 0x5c, 0x00, 0x2b, + 0x02, 0xd0, 0x8b, 0x00, 0xeb, 0x58, 0x1a, 0x70, + 0x01, 0x31, 0x05, 0x29, 0xf6, 0xdb, 0x00, 0xab, + 0x19, 0x88, 0xc1, 0x84, 0x38, 0xbd, 0x00, 0x00, + 0xd4, 0x7a, 0x01, 0x00, 0x00, 0x10, 0x07, 0x00, + 0xff, 0xb5, 0x14, 0x4f, 0x3c, 0x00, 0x28, 0xc8, + 0x00, 0x00, 0x04, 0x1c, 0xbe, 0x79, 0x0d, 0x1c, + 0x81, 0xb0, 0x0f, 0x20, 0x00, 0xf0, 0xb9, 0xf8, + 0x2a, 0x1c, 0x10, 0x4d, 0x00, 0x90, 0x21, 0x1c, + 0x28, 0x1c, 0xf4, 0xf7, 0xde, 0xfc, 0x21, 0x1c, + 0xa8, 0x1d, 0x03, 0x9a, 0xf4, 0xf7, 0xd9, 0xfc, + 0x21, 0x1c, 0x28, 0x1c, 0x0c, 0x30, 0x04, 0x9a, + 0xf4, 0xf7, 0xd3, 0xfc, 0x21, 0x1c, 0x28, 0x1c, + 0x12, 0x30, 0x0a, 0x9a, 0xf4, 0xf7, 0x3c, 0x00, + 0x64, 0xc8, 0x00, 0x00, 0xcd, 0xfc, 0x07, 0xf0, + 0x9b, 0xf8, 0x00, 0x98, 0x00, 0xf0, 0x76, 0xf8, + 0xbe, 0x71, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, + 0x20, 0x10, 0x07, 0x00, 0xe6, 0x7a, 0x01, 0x00, + 0x10, 0xb5, 0x00, 0x20, 0xf6, 0xf7, 0x26, 0xf8, + 0x07, 0x49, 0x88, 0x78, 0x00, 0x09, 0x00, 0x01, + 0x88, 0x70, 0x00, 0x24, 0x20, 0x1c, 0xf5, 0xf7, + 0x11, 0xfe, 0x01, 0x34, 0x24, 0x06, 0x24, 0x0e, + 0x3c, 0x00, 0xa0, 0xc8, 0x00, 0x00, 0x04, 0x2c, + 0xf7, 0xd3, 0x10, 0xbd, 0x00, 0x00, 0x00, 0x50, + 0x07, 0x00, 0x80, 0xb5, 0x02, 0xf0, 0xe3, 0xfb, + 0x03, 0x48, 0x81, 0x78, 0x0f, 0x22, 0x11, 0x43, + 0x81, 0x70, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x50, + 0x07, 0x00, 0xf8, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, + 0x05, 0x28, 0x01, 0xd3, 0xf4, 0xf7, 0x17, 0xfd, + 0xa6, 0x00, 0x00, 0x2d, 0x11, 0x4f, 0x07, 0xd1, + 0xb8, 0x59, 0x3c, 0x00, 0xdc, 0xc8, 0x00, 0x00, + 0x81, 0x68, 0x00, 0x29, 0x0e, 0xd1, 0x40, 0x78, + 0x00, 0x28, 0x0b, 0xd0, 0x02, 0xe0, 0xff, 0x35, + 0x2d, 0x06, 0x2d, 0x0e, 0x29, 0x1c, 0x20, 0x1c, + 0xfb, 0xf7, 0x88, 0xfc, 0x01, 0x1c, 0x20, 0x1c, + 0x04, 0xf0, 0x7e, 0xf9, 0x06, 0x49, 0x01, 0x20, + 0x30, 0x39, 0x08, 0x55, 0x04, 0x48, 0x3c, 0x38, + 0x80, 0x68, 0x00, 0x28, 0x02, 0xd1, 0xb9, 0x59, + 0x03, 0x20, 0x08, 0x70, 0x3c, 0x00, 0x18, 0xc9, + 0x00, 0x00, 0xf8, 0xbd, 0x00, 0x00, 0x10, 0x7b, + 0x01, 0x00, 0x80, 0xb5, 0x04, 0xf0, 0xcd, 0xf9, + 0x80, 0xbd, 0x10, 0xb5, 0x04, 0x1c, 0x05, 0x28, + 0x01, 0xd3, 0xf4, 0xf7, 0xe6, 0xfc, 0x20, 0x1c, + 0xf5, 0xf7, 0xc1, 0xfd, 0x00, 0x20, 0x05, 0x4a, + 0xa1, 0x00, 0x51, 0x58, 0x88, 0x60, 0x04, 0x49, + 0x88, 0x78, 0x01, 0x22, 0xa2, 0x40, 0x10, 0x43, + 0x88, 0x70, 0x10, 0xbd, 0x00, 0x00, 0x3c, 0x00, + 0x54, 0xc9, 0x00, 0x00, 0x10, 0x7b, 0x01, 0x00, + 0x00, 0x50, 0x07, 0x00, 0x02, 0x4a, 0x91, 0x78, + 0x08, 0x43, 0x90, 0x70, 0x70, 0x47, 0x00, 0x00, + 0x00, 0x50, 0x07, 0x00, 0xf8, 0xb5, 0x0c, 0x4f, + 0xbe, 0x79, 0x0f, 0x20, 0x00, 0xf0, 0x18, 0xf8, + 0x05, 0x1c, 0x00, 0x24, 0x20, 0x1c, 0xf4, 0xf7, + 0x0d, 0xf9, 0x08, 0x4a, 0xa1, 0x00, 0x51, 0x58, + 0x08, 0x71, 0x01, 0x34, 0x24, 0x06, 0x24, 0x0e, + 0x3c, 0x00, 0x90, 0xc9, 0x00, 0x00, 0x04, 0x2c, + 0xf3, 0xd3, 0x28, 0x1c, 0xff, 0xf7, 0xe1, 0xff, + 0xbe, 0x71, 0xf8, 0xbd, 0x00, 0x00, 0x20, 0x10, + 0x07, 0x00, 0x10, 0x7b, 0x01, 0x00, 0xb0, 0xb5, + 0x08, 0x49, 0x8d, 0x78, 0x8a, 0x78, 0x05, 0x40, + 0x82, 0x43, 0x8a, 0x70, 0x06, 0xf0, 0xf9, 0xf9, + 0x04, 0x1c, 0x0a, 0x34, 0x20, 0x1c, 0x06, 0xf0, + 0x34, 0xf9, 0x00, 0x28, 0xfa, 0xd0, 0x28, 0x1c, + 0xb0, 0xbd, 0x3c, 0x00, 0xcc, 0xc9, 0x00, 0x00, + 0x00, 0x50, 0x07, 0x00, 0x01, 0x49, 0x0a, 0x20, + 0x08, 0x81, 0x70, 0x47, 0x38, 0x7b, 0x01, 0x00, + 0xf8, 0xb5, 0x10, 0x48, 0x04, 0x26, 0x04, 0x1c, + 0xe0, 0x34, 0x05, 0x1c, 0x38, 0x3d, 0x00, 0x27, + 0x20, 0x1c, 0x1c, 0x30, 0xe4, 0x60, 0xa0, 0x61, + 0x27, 0x61, 0x0b, 0x48, 0xa6, 0x82, 0xe0, 0x61, + 0x27, 0x62, 0xa7, 0x62, 0x06, 0x20, 0xa0, 0x84, + 0x20, 0x1c, 0xfe, 0xf7, 0x3c, 0x00, 0x08, 0xca, + 0x00, 0x00, 0x87, 0xfc, 0x20, 0x1c, 0x0c, 0x30, + 0xf6, 0xf7, 0xb7, 0xf9, 0x05, 0x49, 0x38, 0x3c, + 0xac, 0x42, 0x08, 0x80, 0xe7, 0xd1, 0xf8, 0xbd, + 0x00, 0x00, 0xd4, 0xe4, 0x01, 0x00, 0x12, 0x61, + 0x01, 0x00, 0x48, 0x7b, 0x01, 0x00, 0xf7, 0xb5, + 0x05, 0x1c, 0x0c, 0x23, 0x0f, 0x1c, 0x12, 0x49, + 0x58, 0x43, 0x44, 0x18, 0x20, 0x88, 0x06, 0xf0, + 0xea, 0xf9, 0xa0, 0x78, 0x01, 0x28, 0x3c, 0x00, + 0x44, 0xca, 0x00, 0x00, 0x1a, 0xd1, 0x66, 0x68, + 0x02, 0x2f, 0x05, 0xd1, 0x5c, 0x20, 0x80, 0x5b, + 0x02, 0x99, 0x00, 0x09, 0x88, 0x42, 0x11, 0xd1, + 0x28, 0x1c, 0xfe, 0xf7, 0xfb, 0xff, 0x30, 0x1c, + 0xf9, 0xf7, 0xfa, 0xfd, 0x04, 0x20, 0xa0, 0x70, + 0x39, 0x1c, 0x28, 0x1c, 0xfb, 0xf7, 0xf4, 0xf8, + 0x03, 0x4a, 0xe8, 0x00, 0x3c, 0x32, 0x11, 0x58, + 0x01, 0x31, 0x11, 0x50, 0xfe, 0xbd, 0x00, 0x00, + 0x3c, 0x00, 0x80, 0xca, 0x00, 0x00, 0x60, 0x7b, + 0x01, 0x00, 0x01, 0x20, 0x06, 0x4a, 0x00, 0x21, + 0x0c, 0x23, 0x4b, 0x43, 0x9b, 0x18, 0x9b, 0x78, + 0x00, 0x2b, 0x00, 0xd0, 0x00, 0x20, 0x01, 0x31, + 0x04, 0x29, 0xf5, 0xdb, 0x70, 0x47, 0x60, 0x7b, + 0x01, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0xff, 0xf7, + 0xea, 0xfc, 0x00, 0x28, 0x03, 0xd1, 0x20, 0x21, + 0x0c, 0x20, 0xf4, 0xf7, 0xf6, 0xfb, 0x26, 0x1c, + 0x60, 0x36, 0x3c, 0x00, 0xbc, 0xca, 0x00, 0x00, + 0x00, 0x21, 0xf1, 0x71, 0xe1, 0x64, 0x60, 0x6b, + 0x25, 0x1c, 0x40, 0x35, 0x00, 0x28, 0x31, 0xd0, + 0xff, 0xf7, 0x04, 0xf9, 0x01, 0x22, 0x12, 0x03, + 0x00, 0x28, 0x20, 0x69, 0x01, 0x88, 0x01, 0xd0, + 0x91, 0x43, 0x00, 0xe0, 0x11, 0x43, 0x01, 0x80, + 0x20, 0x69, 0x01, 0x22, 0x00, 0x88, 0xd2, 0x02, + 0x28, 0x83, 0x20, 0x1c, 0x58, 0x30, 0x01, 0x88, + 0x91, 0x43, 0x01, 0x80, 0x3c, 0x00, 0xf8, 0xca, + 0x00, 0x00, 0xa3, 0x6b, 0x52, 0x08, 0x00, 0x2b, + 0x10, 0xd0, 0x91, 0x43, 0x01, 0x80, 0x28, 0x8b, + 0x00, 0x07, 0x80, 0x0f, 0x01, 0x28, 0x15, 0xd0, + 0x2e, 0x20, 0x01, 0x5d, 0x20, 0x69, 0x04, 0x30, + 0xf8, 0xf7, 0x41, 0xfd, 0x61, 0x6a, 0xfe, 0xf7, + 0xa8, 0xf9, 0x04, 0xe0, 0x11, 0x43, 0x01, 0x80, + 0x20, 0x1c, 0xfb, 0xf7, 0xcc, 0xfb, 0x68, 0x83, + 0x04, 0xe0, 0x20, 0x69, 0x41, 0x80, 0x3c, 0x00, + 0x34, 0xcb, 0x00, 0x00, 0xa8, 0x8b, 0x21, 0x69, + 0xc8, 0x82, 0xe0, 0x68, 0xf6, 0xf7, 0x20, 0xf9, + 0x30, 0x80, 0x60, 0x6d, 0x00, 0x28, 0x04, 0xd0, + 0x00, 0x22, 0x03, 0x21, 0x70, 0x7a, 0xfe, 0xf7, + 0x0d, 0xff, 0x20, 0x1c, 0x00, 0xf0, 0xb6, 0xf9, + 0x70, 0x7a, 0x06, 0xf0, 0x45, 0xf8, 0x70, 0xbd, + 0xb0, 0xb5, 0x00, 0x24, 0x06, 0xf0, 0x22, 0xf9, + 0x09, 0x4a, 0x00, 0x21, 0x0c, 0x23, 0x4b, 0x43, + 0x3c, 0x00, 0x70, 0xcb, 0x00, 0x00, 0x9d, 0x18, + 0x6b, 0x68, 0x5b, 0x6c, 0xad, 0x78, 0xc3, 0x1a, + 0x01, 0x2d, 0x02, 0xd1, 0xa3, 0x42, 0x00, 0xdd, + 0x1c, 0x1c, 0x01, 0x31, 0x05, 0x29, 0xf0, 0xd3, + 0x20, 0x1c, 0xb0, 0xbd, 0x00, 0x00, 0x60, 0x7b, + 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x06, 0xf0, + 0xa8, 0xfe, 0x0c, 0x20, 0x08, 0x49, 0x60, 0x43, + 0x45, 0x18, 0x28, 0x88, 0x06, 0xf0, 0x35, 0xf9, + 0x68, 0x68, 0x3c, 0x00, 0xac, 0xcb, 0x00, 0x00, + 0x00, 0x28, 0x06, 0xd0, 0x20, 0x30, 0x00, 0x7b, + 0x01, 0x28, 0x02, 0xd1, 0x20, 0x1c, 0xff, 0xf7, + 0xa3, 0xfa, 0xb0, 0xbd, 0x60, 0x7b, 0x01, 0x00, + 0xff, 0xb5, 0x85, 0xb0, 0x0f, 0xae, 0x60, 0xce, + 0x38, 0x20, 0x1e, 0x49, 0x70, 0x43, 0x17, 0x1c, + 0x44, 0x18, 0xff, 0xf7, 0x7f, 0xf8, 0x01, 0x22, + 0x12, 0x03, 0x00, 0x28, 0x03, 0xd0, 0x20, 0x88, + 0x90, 0x43, 0x20, 0x80, 0x3c, 0x00, 0xe8, 0xcb, + 0x00, 0x00, 0x02, 0xe0, 0x21, 0x88, 0x11, 0x43, + 0x21, 0x80, 0x11, 0x98, 0x39, 0x1c, 0xe0, 0x62, + 0x05, 0x98, 0xf8, 0xf7, 0xd0, 0xfc, 0x01, 0x1c, + 0x2b, 0x1c, 0x38, 0x1c, 0x06, 0x9a, 0xfe, 0xf7, + 0x20, 0xf9, 0x60, 0x80, 0x06, 0x22, 0x20, 0x1d, + 0x0f, 0x49, 0xf3, 0xf7, 0x72, 0xfc, 0x23, 0x1c, + 0x08, 0x98, 0x30, 0x33, 0x18, 0x70, 0x0e, 0x98, + 0x0c, 0x49, 0x58, 0x70, 0x65, 0x63, 0x3c, 0x00, + 0x24, 0xcc, 0x00, 0x00, 0x00, 0x20, 0x02, 0x90, + 0x01, 0x22, 0x04, 0x92, 0x09, 0x48, 0x03, 0x91, + 0x5a, 0x78, 0x01, 0x88, 0x01, 0x92, 0x00, 0x91, + 0x19, 0x78, 0x24, 0x3b, 0x30, 0x1c, 0x62, 0x6b, + 0xfe, 0xf7, 0xa8, 0xfe, 0x09, 0xb0, 0xf0, 0xbd, + 0xd4, 0xe4, 0x01, 0x00, 0x12, 0x61, 0x01, 0x00, + 0x5d, 0x4e, 0x00, 0x00, 0x48, 0x7b, 0x01, 0x00, + 0xff, 0xb5, 0x87, 0xb0, 0x10, 0x98, 0x12, 0xaf, + 0x3c, 0x00, 0x60, 0xcc, 0x00, 0x00, 0x8c, 0x46, + 0xa2, 0xcf, 0x4c, 0x23, 0x30, 0x4c, 0x6b, 0x43, + 0x1c, 0x19, 0x16, 0x1c, 0x15, 0x9a, 0x27, 0x85, + 0x27, 0x1c, 0x30, 0x37, 0x06, 0x97, 0x05, 0x97, + 0x00, 0x23, 0x3b, 0x73, 0x05, 0x9f, 0x78, 0x73, + 0x11, 0x98, 0x27, 0x1c, 0x60, 0x64, 0x61, 0x60, + 0x22, 0x60, 0x40, 0x37, 0x3e, 0x70, 0x61, 0x46, + 0x61, 0x87, 0x07, 0x98, 0x31, 0x1c, 0xf8, 0xf7, + 0x80, 0xfc, 0x3c, 0x00, 0x9c, 0xcc, 0x00, 0x00, + 0x05, 0x99, 0xc8, 0x73, 0x0a, 0x98, 0x78, 0x70, + 0x30, 0x1c, 0xfe, 0xf7, 0x73, 0xf8, 0x00, 0x28, + 0x01, 0xd0, 0x01, 0x20, 0x00, 0xe0, 0x00, 0x20, + 0x41, 0x00, 0x02, 0x20, 0x01, 0x40, 0x11, 0x9a, + 0x01, 0x20, 0x00, 0x2a, 0x00, 0xd1, 0x00, 0x20, + 0x08, 0x43, 0x38, 0x72, 0x20, 0x1c, 0x2e, 0x30, + 0x07, 0x99, 0xfd, 0xf7, 0xcf, 0xff, 0x28, 0x1c, + 0x04, 0xf0, 0xae, 0xf8, 0x3c, 0x00, 0xd8, 0xcc, + 0x00, 0x00, 0xfe, 0xf7, 0xfe, 0xff, 0x4c, 0x22, + 0x12, 0x4b, 0x6a, 0x43, 0xd2, 0x18, 0x01, 0x21, + 0x09, 0x03, 0x2a, 0x32, 0x00, 0x28, 0x04, 0xd0, + 0x10, 0x1c, 0x12, 0x88, 0x8a, 0x43, 0x02, 0x80, + 0x02, 0xe0, 0x10, 0x88, 0x08, 0x43, 0x10, 0x80, + 0x0b, 0x49, 0x00, 0x20, 0x03, 0x91, 0x06, 0x99, + 0x02, 0x90, 0x00, 0x22, 0x04, 0x92, 0x08, 0x48, + 0x0a, 0x7b, 0x41, 0x88, 0x23, 0x1c, 0x3c, 0x00, + 0x14, 0xcd, 0x00, 0x00, 0x01, 0x92, 0x00, 0x91, + 0x79, 0x78, 0x08, 0x33, 0x28, 0x1c, 0x62, 0x68, + 0xfe, 0xf7, 0x38, 0xfe, 0x0b, 0xb0, 0xf0, 0xbd, + 0x58, 0xe3, 0x01, 0x00, 0x75, 0x4f, 0x00, 0x00, + 0x3c, 0x7c, 0x01, 0x00, 0xb0, 0xb5, 0x0c, 0x1c, + 0x01, 0x28, 0x27, 0xd0, 0x80, 0x28, 0x30, 0xd1, + 0xe0, 0x6c, 0x00, 0x28, 0x08, 0xd0, 0x69, 0x20, + 0x00, 0x5d, 0x18, 0x49, 0xc0, 0x00, 0x40, 0x18, + 0x3c, 0x00, 0x50, 0xcd, 0x00, 0x00, 0x04, 0x30, + 0x01, 0x68, 0x01, 0x31, 0x01, 0x60, 0x20, 0x1c, + 0xff, 0xf7, 0xe9, 0xfb, 0x13, 0x4d, 0x50, 0x3d, + 0xe8, 0x68, 0x00, 0x28, 0x05, 0xd0, 0x2e, 0x20, + 0x00, 0x5d, 0xfe, 0xf7, 0x10, 0xf8, 0x02, 0xf0, + 0x42, 0xfe, 0x20, 0x1c, 0x61, 0x68, 0xf3, 0xf7, + 0x2f, 0xfb, 0x40, 0x34, 0x60, 0x78, 0x00, 0x28, + 0x02, 0xd1, 0x06, 0xf0, 0x12, 0xf8, 0xa8, 0x60, + 0xb0, 0xbd, 0x3c, 0x00, 0x8c, 0xcd, 0x00, 0x00, + 0x20, 0x06, 0x00, 0x0e, 0x81, 0x28, 0xfa, 0xd1, + 0x22, 0x0c, 0x20, 0x04, 0x00, 0x0e, 0x02, 0x21, + 0xfe, 0xf7, 0xe6, 0xfd, 0xb0, 0xbd, 0x0a, 0x21, + 0x0c, 0x20, 0xf4, 0xf7, 0x7d, 0xfa, 0xb0, 0xbd, + 0x9c, 0x7b, 0x01, 0x00, 0xf8, 0xb5, 0x18, 0x4e, + 0x18, 0x4f, 0x05, 0x1c, 0x34, 0x79, 0xb8, 0x79, + 0x00, 0x90, 0x20, 0x1c, 0xf5, 0xf7, 0x7c, 0xff, + 0x00, 0x28, 0x06, 0xd0, 0x3c, 0x00, 0xc8, 0xcd, + 0x00, 0x00, 0x12, 0x48, 0x38, 0x38, 0x40, 0x68, + 0x85, 0x42, 0x01, 0xd1, 0x00, 0x2d, 0x03, 0xd1, + 0x10, 0x21, 0x86, 0x20, 0xf4, 0xf7, 0x63, 0xfa, + 0x0d, 0x49, 0x00, 0x20, 0x38, 0x39, 0x48, 0x60, + 0x04, 0x21, 0x20, 0x1c, 0xff, 0xf7, 0x59, 0xfc, + 0x04, 0x21, 0x20, 0x1c, 0xf5, 0xf7, 0xeb, 0xfe, + 0x0c, 0x21, 0x06, 0x4a, 0x61, 0x43, 0x30, 0x3a, + 0x89, 0x18, 0x0c, 0x71, 0x04, 0x20, 0x3c, 0x00, + 0x04, 0xce, 0x00, 0x00, 0x30, 0x71, 0x00, 0x98, + 0xb8, 0x71, 0x0f, 0x20, 0xff, 0xf7, 0xa6, 0xfd, + 0xf8, 0xbd, 0x00, 0x00, 0xa4, 0x7a, 0x01, 0x00, + 0x20, 0x10, 0x07, 0x00, 0xf8, 0xb5, 0x04, 0x1c, + 0x0f, 0x20, 0xff, 0xf7, 0xc1, 0xfd, 0xf5, 0xf7, + 0x3b, 0xff, 0x01, 0x25, 0x00, 0x28, 0x00, 0xd0, + 0x00, 0x25, 0x16, 0x4e, 0xb0, 0x79, 0x16, 0x4f, + 0x00, 0x90, 0x38, 0x79, 0x04, 0x28, 0x01, 0xd1, + 0x3c, 0x00, 0x40, 0xce, 0x00, 0x00, 0x00, 0x2c, + 0x03, 0xd1, 0x11, 0x21, 0x86, 0x20, 0xf4, 0xf7, + 0x2c, 0xfa, 0x10, 0x48, 0x29, 0x06, 0x38, 0x38, + 0x44, 0x60, 0x09, 0x0e, 0x0c, 0x1c, 0x04, 0x20, + 0xff, 0xf7, 0x21, 0xfc, 0x03, 0x21, 0x20, 0x1c, + 0xff, 0xf7, 0x41, 0xfc, 0x21, 0x1c, 0x04, 0x20, + 0xf5, 0xf7, 0xaf, 0xfe, 0x0c, 0x21, 0x07, 0x4a, + 0x69, 0x43, 0x04, 0x20, 0x30, 0x3a, 0x89, 0x18, + 0x08, 0x71, 0x3c, 0x00, 0x7c, 0xce, 0x00, 0x00, + 0x3c, 0x71, 0x00, 0x98, 0xb0, 0x71, 0x20, 0x1c, + 0xff, 0xf7, 0x50, 0xfd, 0x04, 0x20, 0xf8, 0xbd, + 0x20, 0x10, 0x07, 0x00, 0xa4, 0x7a, 0x01, 0x00, + 0x0c, 0x23, 0x02, 0x49, 0x58, 0x43, 0x40, 0x18, + 0x80, 0x68, 0x70, 0x47, 0x74, 0x7a, 0x01, 0x00, + 0x60, 0x30, 0xc1, 0x79, 0x80, 0x79, 0x81, 0x42, + 0x01, 0xd9, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, + 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xce, + 0x00, 0x00, 0x01, 0x48, 0x80, 0x68, 0x70, 0x47, + 0x00, 0x00, 0x4c, 0x7b, 0x01, 0x00, 0x38, 0xb5, + 0x69, 0x21, 0x09, 0x5c, 0x18, 0x23, 0x10, 0x4a, + 0x59, 0x43, 0x89, 0x18, 0x8a, 0x68, 0x01, 0x32, + 0x8a, 0x60, 0x4b, 0x69, 0xd2, 0x1a, 0xcb, 0x68, + 0x93, 0x42, 0x00, 0xd2, 0xca, 0x60, 0x00, 0x22, + 0x0b, 0x4c, 0x02, 0x60, 0x22, 0x1c, 0x20, 0x32, + 0x95, 0x79, 0x00, 0xab, 0x1d, 0x70, 0x3c, 0x00, + 0xf4, 0xce, 0x00, 0x00, 0xd2, 0x79, 0x5a, 0x70, + 0x0a, 0x68, 0x00, 0x2a, 0x01, 0xd1, 0x48, 0x60, + 0x00, 0xe0, 0x10, 0x60, 0x00, 0xab, 0x08, 0x60, + 0x18, 0x88, 0xe0, 0x84, 0x38, 0xbd, 0x00, 0x00, + 0xc4, 0x7b, 0x01, 0x00, 0x00, 0x10, 0x07, 0x00, + 0x18, 0x23, 0x0a, 0x49, 0x58, 0x43, 0x41, 0x18, + 0x08, 0x69, 0x01, 0x30, 0x08, 0x61, 0x48, 0x68, + 0x00, 0x28, 0x09, 0xd0, 0x48, 0x69, 0x01, 0x30, + 0x3c, 0x00, 0x30, 0xcf, 0x00, 0x00, 0x48, 0x61, + 0x48, 0x68, 0x02, 0x68, 0x4a, 0x60, 0x00, 0x2a, + 0x00, 0xd1, 0x0a, 0x60, 0x70, 0x47, 0x00, 0x20, + 0x70, 0x47, 0xc4, 0x7b, 0x01, 0x00, 0xf8, 0xb5, + 0x12, 0x4e, 0x10, 0x4d, 0x0f, 0x4c, 0x0a, 0x27, + 0x21, 0x1c, 0x00, 0x20, 0xe0, 0x60, 0x2a, 0x31, + 0x22, 0x1c, 0x18, 0x32, 0xa1, 0x60, 0x62, 0x61, + 0x27, 0x82, 0x0c, 0x4a, 0xe0, 0x61, 0xa2, 0x61, + 0x60, 0x62, 0x3c, 0x00, 0x6c, 0xcf, 0x00, 0x00, + 0x06, 0x20, 0x20, 0x84, 0x08, 0x1c, 0xfe, 0xf7, + 0xd7, 0xf9, 0x20, 0x1c, 0x08, 0x30, 0xf5, 0xf7, + 0x01, 0xff, 0x4c, 0x3c, 0xac, 0x42, 0x70, 0x80, + 0xe5, 0xd1, 0xff, 0x20, 0x30, 0x70, 0xf8, 0xbd, + 0x88, 0xe4, 0x01, 0x00, 0x0c, 0xe3, 0x01, 0x00, + 0x3c, 0x7c, 0x01, 0x00, 0x12, 0x61, 0x01, 0x00, + 0xf8, 0xb5, 0x04, 0x1c, 0x0b, 0x48, 0x0e, 0x1c, + 0x17, 0x1c, 0x44, 0x70, 0x3c, 0x00, 0xa8, 0xcf, + 0x00, 0x00, 0x05, 0xf0, 0x00, 0xff, 0x05, 0x1c, + 0x39, 0x1c, 0x30, 0x1c, 0xfd, 0xf7, 0xab, 0xff, + 0x0c, 0x21, 0x05, 0x4a, 0x28, 0x18, 0x0a, 0x30, + 0x61, 0x43, 0x08, 0x32, 0x50, 0x50, 0x03, 0x48, + 0x89, 0x18, 0x00, 0x68, 0x88, 0x60, 0xf8, 0xbd, + 0x00, 0x00, 0x6c, 0x7a, 0x01, 0x00, 0x78, 0x6e, + 0x01, 0x00, 0x70, 0xb5, 0x0b, 0x4e, 0x05, 0x1c, + 0x70, 0x78, 0xff, 0x28, 0x0f, 0xd0, 0x3c, 0x00, + 0xe4, 0xcf, 0x00, 0x00, 0x0c, 0x23, 0x08, 0x4c, + 0x58, 0x43, 0x08, 0x34, 0x20, 0x58, 0x05, 0xf0, + 0x1d, 0xfe, 0x00, 0x28, 0x06, 0xd1, 0x70, 0x78, + 0x0c, 0x23, 0x58, 0x43, 0x00, 0x19, 0x81, 0x68, + 0x29, 0x43, 0x81, 0x60, 0x70, 0xbd, 0x00, 0x00, + 0x6c, 0x7a, 0x01, 0x00, 0x80, 0xb5, 0x30, 0x21, + 0x01, 0x48, 0xf3, 0xf7, 0x43, 0xfa, 0x80, 0xbd, + 0xec, 0xe5, 0x01, 0x00, 0x10, 0xb5, 0x05, 0xf0, + 0x3c, 0x00, 0x20, 0xd0, 0x00, 0x00, 0xc5, 0xfe, + 0x0a, 0x49, 0x44, 0x18, 0x0c, 0xe0, 0x20, 0x1c, + 0x05, 0xf0, 0xf7, 0xfd, 0x00, 0x28, 0x07, 0xd0, + 0xf5, 0xf7, 0x51, 0xfe, 0x00, 0x28, 0x03, 0xd0, + 0x13, 0x21, 0x86, 0x20, 0xf4, 0xf7, 0x31, 0xf9, + 0xf5, 0xf7, 0x49, 0xfe, 0x00, 0x28, 0xee, 0xd1, + 0x10, 0xbd, 0xb0, 0x36, 0x00, 0x00, 0xff, 0xb5, + 0x8b, 0xb0, 0x19, 0x9b, 0x0d, 0x1c, 0x04, 0x1c, + 0x1a, 0x20, 0x3c, 0x00, 0x5c, 0xd0, 0x00, 0x00, + 0x00, 0x2b, 0x16, 0x99, 0x00, 0xd1, 0x18, 0x20, + 0x01, 0x90, 0x14, 0x98, 0x00, 0x28, 0x27, 0xd0, + 0xff, 0x20, 0x19, 0x9b, 0x01, 0x30, 0x00, 0x2b, + 0x01, 0xd1, 0x18, 0x23, 0x00, 0xe0, 0x1a, 0x23, + 0x04, 0x33, 0x82, 0x42, 0x04, 0xd3, 0xd0, 0x1a, + 0x40, 0x08, 0x40, 0x00, 0x00, 0x04, 0x00, 0x0c, + 0x0d, 0x90, 0x6a, 0x48, 0x00, 0x88, 0xc2, 0x1a, + 0x12, 0x04, 0x12, 0x0c, 0x3c, 0x00, 0x98, 0xd0, + 0x00, 0x00, 0x04, 0x92, 0x00, 0x29, 0x08, 0xd0, + 0x89, 0x79, 0x66, 0x4a, 0x49, 0x00, 0x51, 0x5a, + 0x04, 0x9a, 0x51, 0x1a, 0x0a, 0x04, 0x12, 0x0c, + 0x04, 0x92, 0x04, 0x9a, 0x82, 0x42, 0x05, 0xd9, + 0x00, 0x20, 0x04, 0x90, 0x02, 0xe0, 0x60, 0x48, + 0x04, 0x90, 0x0d, 0x90, 0x01, 0x98, 0x01, 0x04, + 0x09, 0x0c, 0x0a, 0x91, 0x00, 0x20, 0xf4, 0xf7, + 0x84, 0xfa, 0x00, 0x90, 0x00, 0x68, 0x3c, 0x00, + 0xd4, 0xd0, 0x00, 0x00, 0x00, 0x26, 0x06, 0x90, + 0x20, 0x60, 0x00, 0x20, 0x05, 0x90, 0x0e, 0x98, + 0x00, 0x24, 0x00, 0x05, 0x00, 0x0c, 0x09, 0x90, + 0x1a, 0x98, 0x0d, 0x9f, 0x40, 0x07, 0x40, 0x0f, + 0x08, 0x90, 0x07, 0x94, 0x03, 0x95, 0x00, 0x2d, + 0x0d, 0xd0, 0x28, 0x89, 0xb8, 0x42, 0x04, 0xd8, + 0x36, 0x18, 0x3f, 0x1a, 0x07, 0xd0, 0xed, 0x68, + 0xf5, 0xe7, 0x39, 0x04, 0x09, 0x0c, 0x28, 0x1c, + 0x3c, 0x00, 0x10, 0xd1, 0x00, 0x00, 0xf4, 0xf7, + 0x38, 0xfb, 0xef, 0xe7, 0x00, 0x2e, 0x02, 0xd1, + 0x07, 0x99, 0x00, 0x29, 0x71, 0xd1, 0x27, 0x1c, + 0x6c, 0x20, 0xf4, 0xf7, 0x88, 0xfb, 0x07, 0x99, + 0x04, 0x1c, 0x00, 0x29, 0x20, 0xd1, 0x07, 0x94, + 0x00, 0x20, 0xa0, 0x61, 0x18, 0x98, 0x27, 0x1c, + 0x60, 0x60, 0x17, 0x98, 0x24, 0x37, 0xa0, 0x60, + 0x06, 0x98, 0x20, 0x61, 0x15, 0x98, 0x0f, 0xc8, + 0x0f, 0xc7, 0x3c, 0x00, 0x4c, 0xd1, 0x00, 0x00, + 0x14, 0x98, 0x5c, 0x21, 0x60, 0x63, 0x09, 0x98, + 0x08, 0x53, 0x19, 0x98, 0x69, 0x21, 0xe0, 0x63, + 0x1b, 0x98, 0x08, 0x55, 0x1c, 0x98, 0x60, 0x65, + 0x19, 0x98, 0x00, 0x28, 0x23, 0xd0, 0x08, 0x98, + 0x06, 0x99, 0x08, 0x83, 0x1f, 0xe0, 0x6c, 0x22, + 0x20, 0x1c, 0x07, 0x99, 0xf3, 0xf7, 0x1a, 0xfa, + 0x3c, 0x60, 0x01, 0x98, 0x62, 0x21, 0x30, 0x18, + 0xc8, 0x53, 0x15, 0x98, 0x3c, 0x00, 0x88, 0xd1, + 0x00, 0x00, 0x40, 0x21, 0x80, 0x7a, 0xc8, 0x55, + 0x00, 0x20, 0xb8, 0x63, 0x06, 0x98, 0x0a, 0x99, + 0xf4, 0xf7, 0x1f, 0xfa, 0xf8, 0x60, 0x02, 0x99, + 0xf4, 0xf7, 0x3b, 0xf9, 0x20, 0x1c, 0x40, 0x30, + 0x81, 0x8b, 0x05, 0x9a, 0x12, 0x07, 0x12, 0x0f, + 0x11, 0x43, 0x81, 0x83, 0x03, 0x98, 0x5e, 0x21, + 0x02, 0x90, 0x01, 0x98, 0x22, 0x4a, 0x30, 0x18, + 0x08, 0x53, 0x12, 0x68, 0x01, 0x21, 0x3c, 0x00, + 0xc4, 0xd1, 0x00, 0x00, 0x08, 0x1c, 0x00, 0x2a, + 0x00, 0xd0, 0x1b, 0x98, 0x00, 0x06, 0x04, 0x9a, + 0x00, 0x0e, 0x96, 0x42, 0x03, 0xd9, 0x2c, 0x22, + 0x11, 0x55, 0x1b, 0x49, 0x04, 0xe0, 0x15, 0x99, + 0x2c, 0x22, 0x09, 0x7a, 0x11, 0x55, 0x19, 0x49, + 0x08, 0x5c, 0x66, 0x21, 0x08, 0x55, 0x1c, 0x98, + 0x00, 0x28, 0x01, 0xd0, 0x1f, 0x20, 0x08, 0x55, + 0x00, 0x2d, 0x03, 0xd0, 0xe8, 0x68, 0x03, 0x90, + 0x3c, 0x00, 0x00, 0xd2, 0x00, 0x00, 0x00, 0x20, + 0x00, 0xe0, 0x09, 0xe0, 0xe8, 0x60, 0x05, 0x98, + 0x00, 0x26, 0x01, 0x30, 0x00, 0x04, 0x00, 0x0c, + 0x0d, 0x9f, 0x05, 0x90, 0x03, 0x9d, 0x6d, 0xe7, + 0x00, 0x98, 0xe0, 0x60, 0x02, 0x99, 0xf4, 0xf7, + 0xfa, 0xf8, 0x00, 0x20, 0x20, 0x60, 0x01, 0x21, + 0xa1, 0x63, 0x60, 0x34, 0x60, 0x80, 0x07, 0x98, + 0x0f, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0x06, 0x61, + 0x01, 0x00, 0x3c, 0x00, 0x3c, 0xd2, 0x00, 0x00, + 0x5c, 0x43, 0x01, 0x00, 0x38, 0x09, 0x00, 0x00, + 0x18, 0x67, 0x01, 0x00, 0x0e, 0x61, 0x01, 0x00, + 0x0a, 0x61, 0x01, 0x00, 0x01, 0x48, 0x00, 0x68, + 0x70, 0x47, 0x00, 0x00, 0xc4, 0x6a, 0x01, 0x00, + 0x02, 0x49, 0x09, 0x1d, 0x03, 0xc9, 0x40, 0x18, + 0x70, 0x47, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, + 0x01, 0x48, 0x00, 0x69, 0x70, 0x47, 0x00, 0x00, + 0xc4, 0x69, 0x01, 0x00, 0x3c, 0x00, 0x78, 0xd2, + 0x00, 0x00, 0x01, 0x48, 0x40, 0x69, 0x70, 0x47, + 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x01, 0x48, + 0x80, 0x69, 0x70, 0x47, 0x00, 0x00, 0xc4, 0x69, + 0x01, 0x00, 0x70, 0xb5, 0x0d, 0x4e, 0x00, 0x20, + 0x35, 0x1c, 0x40, 0x35, 0xf0, 0x63, 0x0d, 0xe0, + 0xa0, 0x68, 0xf4, 0xf7, 0x7a, 0xf9, 0xb3, 0x6d, + 0x00, 0x2b, 0x04, 0xd0, 0x00, 0x22, 0x01, 0x20, + 0x61, 0x6b, 0xf3, 0xf7, 0x95, 0xf8, 0x3c, 0x00, + 0xb4, 0xd2, 0x00, 0x00, 0x20, 0x1c, 0xf4, 0xf7, + 0x9d, 0xfa, 0x28, 0x1c, 0xfa, 0xf7, 0x42, 0xfd, + 0x04, 0x1c, 0xec, 0xd1, 0x70, 0xbd, 0x00, 0x00, + 0xc4, 0x69, 0x01, 0x00, 0xf8, 0xb5, 0x1a, 0x4f, + 0x00, 0x26, 0xf8, 0x6b, 0x00, 0x28, 0x2c, 0xd0, + 0x38, 0x1c, 0x40, 0x30, 0x00, 0x90, 0x1d, 0xe0, + 0x16, 0x48, 0xb9, 0x6b, 0x02, 0xf0, 0x5c, 0xf8, + 0x00, 0x22, 0x20, 0x1c, 0x14, 0x49, 0x03, 0xf0, + 0x3c, 0x00, 0xf0, 0xd2, 0x00, 0x00, 0x7b, 0xff, + 0x05, 0x1c, 0x04, 0xd1, 0x38, 0x6a, 0x01, 0x30, + 0x38, 0x62, 0x01, 0x36, 0x0d, 0xe0, 0xa0, 0x68, + 0xf4, 0xf7, 0x49, 0xf9, 0xbb, 0x6d, 0x00, 0x2b, + 0x04, 0xd0, 0x00, 0x22, 0x28, 0x1c, 0x61, 0x6b, + 0xf3, 0xf7, 0x64, 0xf8, 0x20, 0x1c, 0xf4, 0xf7, + 0x6c, 0xfa, 0x00, 0x98, 0xfa, 0xf7, 0x11, 0xfd, + 0x04, 0x1c, 0xdc, 0xd1, 0x07, 0x48, 0xb9, 0x6b, + 0x02, 0xf0, 0x3c, 0x00, 0x2c, 0xd3, 0x00, 0x00, + 0x25, 0xf8, 0x00, 0x20, 0xf8, 0x63, 0x30, 0x1c, + 0xf8, 0xbd, 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, + 0x34, 0x63, 0x01, 0x00, 0x11, 0x30, 0x00, 0x00, + 0xc4, 0x60, 0x01, 0x00, 0x01, 0x49, 0x01, 0x20, + 0xc8, 0x63, 0x70, 0x47, 0xc4, 0x69, 0x01, 0x00, + 0x80, 0xb5, 0x00, 0x20, 0x05, 0x4a, 0x00, 0x21, + 0x1c, 0x23, 0x43, 0x43, 0x9b, 0x18, 0x01, 0x30, + 0x04, 0x28, 0xd9, 0x66, 0x3c, 0x00, 0x68, 0xd3, + 0x00, 0x00, 0xf8, 0xdb, 0xfc, 0xf7, 0xfd, 0xfc, + 0x80, 0xbd, 0xc4, 0x69, 0x01, 0x00, 0x01, 0x49, + 0xc8, 0x64, 0x70, 0x47, 0x00, 0x00, 0xc4, 0x69, + 0x01, 0x00, 0x01, 0x49, 0x88, 0x64, 0x70, 0x47, + 0x00, 0x00, 0xc4, 0x69, 0x01, 0x00, 0xb0, 0xb5, + 0x04, 0x1c, 0x0d, 0x1c, 0x21, 0x1c, 0x02, 0x8e, + 0x80, 0x6a, 0x40, 0x31, 0xf3, 0xf7, 0x2f, 0xf8, + 0x00, 0x28, 0x16, 0xd1, 0x02, 0x21, 0x3c, 0x00, + 0xa4, 0xd3, 0x00, 0x00, 0x20, 0x1c, 0xf4, 0xf7, + 0x6f, 0xfa, 0xe2, 0x69, 0xc0, 0x00, 0x10, 0x18, + 0x82, 0x8b, 0xab, 0x88, 0x9a, 0x42, 0x04, 0xd1, + 0x82, 0x69, 0x2b, 0x68, 0x9a, 0x42, 0x08, 0xd2, + 0x01, 0xe0, 0x9a, 0x42, 0x05, 0xd2, 0x00, 0x21, + 0x18, 0x30, 0x0c, 0xcd, 0x0c, 0xc0, 0x00, 0xe0, + 0x01, 0x21, 0x08, 0x1c, 0xb0, 0xbd, 0x00, 0x00, + 0xf8, 0xb5, 0x06, 0x1c, 0x00, 0x27, 0x44, 0x68, + 0x3c, 0x00, 0xe0, 0xd3, 0x00, 0x00, 0x0f, 0xe0, + 0x09, 0x49, 0x48, 0x6a, 0x01, 0x30, 0x48, 0x62, + 0xa0, 0x69, 0x00, 0x28, 0x02, 0xd0, 0xf4, 0xf7, + 0x00, 0xfa, 0xa7, 0x61, 0x26, 0x62, 0x25, 0x68, + 0x20, 0x1c, 0xff, 0xf7, 0x52, 0xfb, 0x2c, 0x1c, + 0x00, 0x2c, 0xed, 0xd1, 0xf8, 0xbd, 0xc4, 0x69, + 0x01, 0x00, 0x03, 0x30, 0x07, 0x4a, 0x81, 0x08, + 0x13, 0x68, 0x50, 0x68, 0x1b, 0x68, 0x89, 0x00, + 0x09, 0x18, 0x3c, 0x00, 0x1c, 0xd4, 0x00, 0x00, + 0x8b, 0x42, 0x01, 0xd3, 0x51, 0x60, 0x00, 0xe0, + 0x00, 0x20, 0x90, 0x60, 0x70, 0x47, 0x00, 0x00, + 0x8c, 0x6e, 0x01, 0x00, 0x70, 0xb5, 0x12, 0x4e, + 0x80, 0x38, 0xc5, 0x00, 0x70, 0x59, 0x0c, 0x1c, + 0x00, 0x28, 0x04, 0xd1, 0x01, 0x21, 0x0d, 0x20, + 0xf3, 0xf7, 0x2e, 0xff, 0x0d, 0xe0, 0x20, 0x69, + 0x00, 0x28, 0x05, 0xd1, 0xa8, 0x19, 0x81, 0x88, + 0xe0, 0x68, 0x01, 0xf0, 0x3c, 0x00, 0x58, 0xd4, + 0x00, 0x00, 0x47, 0xfa, 0x20, 0x61, 0x71, 0x59, + 0x20, 0x1c, 0xf2, 0xf7, 0xbb, 0xff, 0x04, 0x1c, + 0x00, 0x2c, 0x07, 0xd0, 0xe0, 0x68, 0x00, 0x28, + 0x01, 0xd0, 0xf4, 0xf7, 0x92, 0xf8, 0x20, 0x1c, + 0xf4, 0xf7, 0xbd, 0xf9, 0x70, 0xbd, 0x54, 0x42, + 0x01, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0x0d, 0x1c, + 0x0e, 0x49, 0x06, 0x22, 0xf3, 0xf7, 0x35, 0xf8, + 0x00, 0x26, 0xe6, 0x61, 0x66, 0x62, 0x3c, 0x00, + 0x94, 0xd4, 0x00, 0x00, 0x07, 0x20, 0x30, 0x21, + 0x08, 0x55, 0xe6, 0x63, 0x28, 0x1c, 0xf8, 0xf7, + 0x6b, 0xf8, 0xa0, 0x76, 0x20, 0x1c, 0x14, 0x30, + 0x06, 0x22, 0x29, 0x1c, 0xf3, 0xf7, 0x24, 0xf8, + 0x06, 0x22, 0x29, 0x1c, 0xa0, 0x18, 0xf3, 0xf7, + 0x1f, 0xf8, 0x26, 0x61, 0x70, 0xbd, 0x00, 0x00, + 0x12, 0x61, 0x01, 0x00, 0x80, 0xb5, 0xfd, 0xf7, + 0x85, 0xfe, 0x80, 0xbd, 0x01, 0x49, 0x48, 0x60, + 0x3c, 0x00, 0xd0, 0xd4, 0x00, 0x00, 0x70, 0x47, + 0x00, 0x00, 0xe4, 0x65, 0x01, 0x00, 0x02, 0x49, + 0x80, 0xb5, 0x49, 0x68, 0xf2, 0xf7, 0x7c, 0xff, + 0x80, 0xbd, 0xe4, 0x65, 0x01, 0x00, 0x80, 0xb5, + 0xf4, 0xf7, 0xe5, 0xf9, 0x07, 0x49, 0x07, 0x48, + 0x0e, 0xc9, 0x0e, 0xc0, 0x18, 0x38, 0x00, 0x68, + 0x00, 0x28, 0x02, 0xd0, 0x02, 0xf0, 0xb7, 0xfa, + 0x80, 0xbd, 0x02, 0xf0, 0x9e, 0xfa, 0x80, 0xbd, + 0x00, 0x00, 0x3c, 0x00, 0x0c, 0xd5, 0x00, 0x00, + 0xb0, 0x58, 0x01, 0x00, 0x90, 0x73, 0x01, 0x00, + 0x05, 0x49, 0x80, 0xb5, 0x89, 0x68, 0x00, 0x20, + 0x00, 0x29, 0x00, 0xd1, 0x03, 0x20, 0x00, 0x06, + 0x00, 0x0e, 0xfa, 0xf7, 0xe3, 0xfb, 0x80, 0xbd, + 0x60, 0x6c, 0x01, 0x00, 0x80, 0xb5, 0x03, 0x48, + 0x06, 0x22, 0x03, 0x49, 0xf2, 0xf7, 0xde, 0xff, + 0x80, 0xbd, 0x00, 0x00, 0x40, 0x80, 0x07, 0x00, + 0x12, 0x61, 0x01, 0x00, 0x3c, 0x00, 0x48, 0xd5, + 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x0c, 0x4d, + 0x0b, 0x1c, 0x21, 0x1c, 0x00, 0x20, 0x0c, 0x3d, + 0x00, 0x29, 0x09, 0x4c, 0x05, 0xd0, 0x28, 0x78, + 0x21, 0x1c, 0x10, 0x80, 0x02, 0x1c, 0x18, 0x1c, + 0x07, 0xe0, 0x11, 0x88, 0x0e, 0x29, 0x07, 0xd8, + 0x0a, 0x06, 0x12, 0x0e, 0x19, 0x1c, 0x20, 0x1c, + 0x2a, 0x70, 0xf2, 0xf7, 0xbe, 0xff, 0x01, 0x20, + 0xb0, 0xbd, 0xb0, 0x69, 0x01, 0x00, 0x3c, 0x00, + 0x84, 0xd5, 0x00, 0x00, 0x10, 0xb5, 0x00, 0x20, + 0x0a, 0x4a, 0x01, 0x21, 0x11, 0x60, 0x0a, 0x4c, + 0x0a, 0xe0, 0x02, 0x1c, 0x01, 0x6a, 0x50, 0x32, + 0x91, 0x42, 0x05, 0xd0, 0x61, 0x78, 0x3c, 0x23, + 0x59, 0x43, 0x09, 0x19, 0x04, 0x31, 0x01, 0x62, + 0x04, 0xf0, 0xba, 0xfb, 0x00, 0x28, 0xf0, 0xd1, + 0x10, 0xbd, 0x00, 0x00, 0xdc, 0x62, 0x01, 0x00, + 0x68, 0x61, 0x01, 0x00, 0x04, 0x48, 0x80, 0xb5, + 0x3c, 0x00, 0xc0, 0xd5, 0x00, 0x00, 0x00, 0x68, + 0x00, 0x28, 0x03, 0xd0, 0x01, 0x1c, 0x10, 0x20, + 0x04, 0xf0, 0xc7, 0xfe, 0x80, 0xbd, 0x28, 0x61, + 0x01, 0x00, 0x03, 0x22, 0x11, 0x1f, 0x80, 0xb5, + 0x00, 0x20, 0xfb, 0xf7, 0x76, 0xf9, 0x80, 0xbd, + 0x00, 0x00, 0x80, 0xb5, 0x0b, 0xf0, 0xb9, 0xfa, + 0x80, 0xbd, 0xff, 0xb5, 0x83, 0xb0, 0x16, 0x1c, + 0x00, 0x21, 0x01, 0x91, 0x1f, 0x1c, 0x08, 0x21, + 0x02, 0xaa, 0x3c, 0x00, 0xfc, 0xd5, 0x00, 0x00, + 0xfa, 0xf7, 0x0e, 0xff, 0x04, 0x1c, 0x2a, 0xd1, + 0x02, 0x98, 0x41, 0x68, 0x49, 0x00, 0x01, 0xd4, + 0x09, 0x24, 0x24, 0xe0, 0xfa, 0xf7, 0x52, 0xff, + 0x38, 0x60, 0x02, 0x98, 0x41, 0x68, 0x49, 0x02, + 0xcd, 0x0f, 0x29, 0x1c, 0xfa, 0xf7, 0x44, 0xff, + 0x01, 0x1c, 0x30, 0x60, 0x38, 0x68, 0x00, 0x06, + 0x00, 0x0e, 0x00, 0xf0, 0x1b, 0xf8, 0x00, 0x28, + 0x01, 0xd1, 0x0a, 0x24, 0x3c, 0x00, 0x38, 0xd6, + 0x00, 0x00, 0x0f, 0xe0, 0x31, 0x68, 0x02, 0x98, + 0x2b, 0x1c, 0x01, 0xaa, 0xfa, 0xf7, 0xd7, 0xff, + 0x00, 0x28, 0x06, 0xd0, 0x01, 0x98, 0x00, 0x28, + 0x04, 0xd0, 0x04, 0x99, 0x09, 0x68, 0x81, 0x42, + 0x00, 0xd2, 0x03, 0x24, 0x01, 0x98, 0x04, 0x99, + 0x08, 0x60, 0x07, 0xb0, 0x20, 0x1c, 0xf0, 0xbd, + 0x00, 0x00, 0x70, 0xb5, 0x05, 0x1c, 0x0e, 0x1c, + 0x01, 0x24, 0x00, 0xf0, 0x84, 0xff, 0x3c, 0x00, + 0x74, 0xd6, 0x00, 0x00, 0x00, 0x28, 0x08, 0xd0, + 0x03, 0x2d, 0x01, 0xd0, 0x04, 0x2d, 0x04, 0xd1, + 0x03, 0x20, 0xc0, 0x03, 0x86, 0x42, 0x00, 0xd3, + 0x00, 0x24, 0x20, 0x1c, 0x70, 0xbd, 0x00, 0x00, + 0x7c, 0xb5, 0x15, 0x1c, 0x06, 0x1c, 0x0c, 0x1c, + 0x29, 0x1c, 0x6a, 0x46, 0x01, 0xab, 0xff, 0xf7, + 0xa5, 0xff, 0x00, 0x28, 0x02, 0xd1, 0x00, 0x2c, + 0x01, 0xd1, 0x03, 0x20, 0x7c, 0xbd, 0x17, 0x48, + 0x3c, 0x00, 0xb0, 0xd6, 0x00, 0x00, 0x00, 0xab, + 0x06, 0x60, 0x18, 0x79, 0x07, 0x28, 0x21, 0xd2, + 0x02, 0xa3, 0x1b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, + 0x00, 0x00, 0x1d, 0x04, 0x04, 0x06, 0x10, 0x17, + 0x13, 0x00, 0x04, 0x20, 0xed, 0xe7, 0x2a, 0x1c, + 0x21, 0x1c, 0x01, 0x20, 0x00, 0x9b, 0xf2, 0xf7, + 0x81, 0xfe, 0x00, 0x28, 0x12, 0xd1, 0x06, 0x20, + 0xe3, 0xe7, 0x2a, 0x68, 0x00, 0x99, 0x05, 0xe0, + 0x00, 0x98, 0x3c, 0x00, 0xec, 0xd6, 0x00, 0x00, + 0x42, 0x78, 0x81, 0x1c, 0x01, 0xe0, 0x2a, 0x68, + 0x69, 0x46, 0x20, 0x1c, 0xf2, 0xf7, 0xfe, 0xfe, + 0x03, 0xe0, 0x04, 0x21, 0x87, 0x20, 0xf3, 0xf7, + 0xcf, 0xfd, 0x00, 0x20, 0xd0, 0xe7, 0x00, 0x00, + 0xf8, 0x6b, 0x01, 0x00, 0xf7, 0xb5, 0x86, 0xb0, + 0x0e, 0x1c, 0x08, 0x21, 0x05, 0xaa, 0x06, 0x98, + 0xfa, 0xf7, 0x7e, 0xfe, 0x04, 0x1c, 0x45, 0xd1, + 0x05, 0x98, 0x41, 0x68, 0x3c, 0x00, 0x28, 0xd7, + 0x00, 0x00, 0x02, 0x90, 0x49, 0x02, 0xc9, 0x0f, + 0x00, 0x25, 0x04, 0x95, 0x03, 0x91, 0x08, 0x9f, + 0xfa, 0xf7, 0xd5, 0xfe, 0x01, 0x90, 0x02, 0xa9, + 0x03, 0xc9, 0xfa, 0xf7, 0xc6, 0xfe, 0x01, 0x99, + 0x05, 0x29, 0x14, 0xd2, 0x02, 0xa3, 0x5b, 0x5c, + 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x00, 0x0e, 0x03, + 0x06, 0x0c, 0x03, 0x00, 0x87, 0x42, 0x0e, 0xd8, + 0x07, 0xe0, 0x87, 0x42, 0x0b, 0xd8, 0x3c, 0x00, + 0x64, 0xd7, 0x00, 0x00, 0x01, 0x25, 0xc0, 0x1b, + 0x04, 0x90, 0x07, 0xe0, 0x87, 0x42, 0x05, 0xd1, + 0x01, 0x25, 0x03, 0xe0, 0x05, 0x21, 0x87, 0x20, + 0xf3, 0xf7, 0x94, 0xfd, 0x00, 0x2d, 0x01, 0xd1, + 0x03, 0x24, 0x15, 0xe0, 0x05, 0x98, 0x41, 0x68, + 0x00, 0x29, 0x69, 0xda, 0x3a, 0x4a, 0x06, 0x99, + 0x11, 0x60, 0xfa, 0xf7, 0x91, 0xfe, 0x07, 0x1c, + 0x05, 0x98, 0x03, 0x99, 0xfa, 0xf7, 0x86, 0xfe, + 0x3c, 0x00, 0xa0, 0xd7, 0x00, 0x00, 0x05, 0x1c, + 0x01, 0x1c, 0x38, 0x1c, 0xff, 0xf7, 0x5f, 0xff, + 0x00, 0x28, 0x01, 0xd1, 0x0a, 0x24, 0x5e, 0xe0, + 0x07, 0x2f, 0x57, 0xd2, 0x02, 0xa3, 0xdb, 0x5d, + 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x00, 0x53, 0x04, + 0x04, 0x06, 0x2e, 0x50, 0x48, 0x00, 0x04, 0x24, + 0x51, 0xe0, 0x04, 0x98, 0x00, 0x28, 0x01, 0xd1, + 0x00, 0x27, 0x14, 0xe0, 0x08, 0x99, 0x08, 0x18, + 0x00, 0x04, 0x3c, 0x00, 0xdc, 0xd7, 0x00, 0x00, + 0x00, 0x0c, 0xf4, 0xf7, 0x2b, 0xf8, 0x07, 0x1c, + 0x31, 0x1c, 0x08, 0x9a, 0xf2, 0xf7, 0x86, 0xfe, + 0x08, 0x98, 0x04, 0x99, 0x38, 0x18, 0xf2, 0xf7, + 0x2f, 0xfe, 0x08, 0x98, 0x04, 0x99, 0x3e, 0x1c, + 0x40, 0x18, 0x08, 0x90, 0x31, 0x1c, 0x00, 0x20, + 0x08, 0xaa, 0xf2, 0xf7, 0xec, 0xfd, 0x00, 0x28, + 0x00, 0xd1, 0x05, 0x24, 0x00, 0x2f, 0x2d, 0xd0, + 0x38, 0x1c, 0xf3, 0xf7, 0x3c, 0x00, 0x18, 0xd8, + 0x00, 0x00, 0xed, 0xff, 0x29, 0xe0, 0x03, 0x99, + 0x00, 0x29, 0x04, 0xd0, 0x05, 0x98, 0x40, 0x68, + 0x87, 0x02, 0xbf, 0x0a, 0x00, 0xe0, 0x00, 0x27, + 0x31, 0x1c, 0x28, 0x1c, 0x08, 0x9a, 0xf2, 0xf7, + 0x60, 0xfe, 0x04, 0x99, 0x00, 0x29, 0x03, 0xd0, + 0x08, 0x98, 0x28, 0x18, 0xf2, 0xf7, 0x07, 0xfe, + 0x00, 0x2f, 0x12, 0xd0, 0xf2, 0xf7, 0xcc, 0xfd, + 0x0f, 0xe0, 0x31, 0x1c, 0xa8, 0x1c, 0x3c, 0x00, + 0x54, 0xd8, 0x00, 0x00, 0x08, 0x9a, 0xf2, 0xf7, + 0x4f, 0xfe, 0x08, 0x98, 0x68, 0x70, 0x07, 0xe0, + 0xff, 0xe7, 0x07, 0x24, 0x04, 0xe0, 0x08, 0x24, + 0x03, 0x21, 0x87, 0x20, 0xf3, 0xf7, 0x1a, 0xfd, + 0x20, 0x1c, 0x09, 0xb0, 0xf0, 0xbd, 0x00, 0x00, + 0xf8, 0x6b, 0x01, 0x00, 0x9e, 0xb5, 0x1c, 0x1c, + 0x00, 0xab, 0x19, 0x72, 0x00, 0x92, 0x00, 0x22, + 0x01, 0x94, 0x69, 0x46, 0xfb, 0xf7, 0x08, 0xfa, + 0x3c, 0x00, 0x90, 0xd8, 0x00, 0x00, 0x9e, 0xbd, + 0x00, 0x00, 0x8f, 0xb5, 0x02, 0x92, 0x00, 0x22, + 0x00, 0x90, 0x01, 0x90, 0x03, 0x91, 0x69, 0x46, + 0x04, 0x20, 0xfb, 0xf7, 0xfc, 0xf9, 0x8f, 0xbd, + 0x00, 0x00, 0xb0, 0xb5, 0x0c, 0x1c, 0x01, 0x28, + 0x0a, 0xd0, 0x03, 0x28, 0x19, 0xd0, 0x04, 0x28, + 0x2c, 0xd1, 0x60, 0x68, 0x01, 0xf0, 0x35, 0xfc, + 0x01, 0x1c, 0x83, 0x20, 0x0c, 0xcc, 0x22, 0xe0, + 0x1c, 0x20, 0x3c, 0x00, 0xcc, 0xd8, 0x00, 0x00, + 0x14, 0x49, 0x60, 0x43, 0x40, 0x18, 0x14, 0x49, + 0x45, 0x18, 0x28, 0x1c, 0xf8, 0xf7, 0x46, 0xfc, + 0xa9, 0x68, 0x00, 0x29, 0x03, 0xd0, 0x22, 0x1c, + 0x08, 0x20, 0x05, 0xf0, 0x71, 0xfe, 0xb0, 0xbd, + 0x20, 0x8c, 0xc8, 0x28, 0x01, 0xd3, 0x04, 0x20, + 0x04, 0xe0, 0x65, 0x28, 0x01, 0xd3, 0x02, 0x20, + 0x00, 0xe0, 0x01, 0x20, 0x20, 0x84, 0x20, 0x1c, + 0x03, 0xf0, 0xdc, 0xfa, 0x3c, 0x00, 0x08, 0xd9, + 0x00, 0x00, 0x22, 0x68, 0xe3, 0x68, 0x01, 0x1c, + 0x82, 0x20, 0xff, 0xf7, 0xb4, 0xff, 0xb0, 0xbd, + 0xa0, 0x21, 0x08, 0x20, 0xf3, 0xf7, 0xc3, 0xfc, + 0xb0, 0xbd, 0xdc, 0x71, 0x01, 0x00, 0x64, 0xee, + 0xff, 0xff, 0x03, 0x48, 0x04, 0x4a, 0x81, 0x68, + 0x51, 0x61, 0xc0, 0x68, 0x90, 0x61, 0x70, 0x47, + 0x00, 0x00, 0xf4, 0x68, 0x01, 0x00, 0xc0, 0x71, + 0x01, 0x00, 0x03, 0x49, 0x04, 0x4a, 0x3c, 0x00, + 0x44, 0xd9, 0x00, 0x00, 0x08, 0x6b, 0x90, 0x60, + 0x88, 0x68, 0xd0, 0x60, 0x70, 0x47, 0x00, 0x00, + 0x90, 0x5c, 0x01, 0x00, 0xc0, 0x71, 0x01, 0x00, + 0x00, 0xb5, 0xff, 0xf7, 0xf1, 0xff, 0xff, 0xf7, + 0xe3, 0xff, 0x00, 0xbd, 0xb0, 0xb5, 0x0d, 0x1c, + 0x00, 0x28, 0x14, 0xd0, 0x0b, 0x49, 0x0c, 0x4c, + 0x88, 0x68, 0x62, 0x69, 0xc9, 0x68, 0x80, 0x1a, + 0xa2, 0x69, 0x89, 0x1a, 0x40, 0x18, 0x04, 0xd0, + 0x3c, 0x00, 0x80, 0xd9, 0x00, 0x00, 0x64, 0x23, + 0x59, 0x43, 0xf2, 0xf7, 0xc4, 0xfe, 0x20, 0x61, + 0xff, 0xf7, 0xcd, 0xff, 0x20, 0x69, 0x28, 0x60, + 0x01, 0x20, 0xb0, 0xbd, 0x00, 0x20, 0xb0, 0xbd, + 0x00, 0x00, 0xf4, 0x68, 0x01, 0x00, 0xc0, 0x71, + 0x01, 0x00, 0xb0, 0xb5, 0x0d, 0x1c, 0x00, 0x28, + 0x17, 0xd0, 0x0c, 0x49, 0x0d, 0x4c, 0x08, 0x6b, + 0xa2, 0x68, 0x89, 0x68, 0x80, 0x1a, 0xe2, 0x68, + 0x89, 0x1a, 0x3c, 0x00, 0xbc, 0xd9, 0x00, 0x00, + 0x40, 0x18, 0x07, 0xd0, 0x22, 0x88, 0x90, 0x42, + 0x04, 0xd9, 0x64, 0x23, 0x59, 0x43, 0xf2, 0xf7, + 0xa1, 0xfe, 0x60, 0x60, 0xff, 0xf7, 0xb6, 0xff, + 0x60, 0x68, 0x28, 0x60, 0x01, 0x20, 0xb0, 0xbd, + 0x00, 0x20, 0xb0, 0xbd, 0x90, 0x5c, 0x01, 0x00, + 0xc0, 0x71, 0x01, 0x00, 0x7c, 0xb5, 0x10, 0x68, + 0x00, 0x28, 0x02, 0xd0, 0x00, 0xf0, 0x24, 0xf8, + 0x7c, 0xbd, 0x0f, 0x48, 0x3c, 0x00, 0xf8, 0xd9, + 0x00, 0x00, 0xc0, 0x69, 0x84, 0x68, 0xe0, 0x68, + 0x25, 0x6a, 0xa6, 0x69, 0xf3, 0xf7, 0xe3, 0xfd, + 0xe1, 0x69, 0xf3, 0xf7, 0x06, 0xfd, 0x20, 0x1c, + 0xe2, 0x69, 0x40, 0x30, 0xc1, 0x8b, 0x12, 0x89, + 0x89, 0x18, 0xc1, 0x83, 0x07, 0x49, 0x01, 0x94, + 0x00, 0x91, 0x28, 0x69, 0x33, 0x1c, 0x82, 0x88, + 0x01, 0x68, 0xe0, 0x68, 0xc0, 0x68, 0xf8, 0xf7, + 0x1e, 0xfc, 0xe0, 0xe7, 0x00, 0x00, 0x3c, 0x00, + 0x34, 0xda, 0x00, 0x00, 0x84, 0x6a, 0x01, 0x00, + 0x91, 0x5e, 0x00, 0x00, 0xf0, 0xb5, 0x85, 0x69, + 0x06, 0x6a, 0x04, 0x1c, 0xc0, 0x68, 0x85, 0xb0, + 0xc0, 0x68, 0x00, 0x28, 0x01, 0xd1, 0xf3, 0xf7, + 0x57, 0xfc, 0x0a, 0x49, 0x02, 0x95, 0x04, 0x94, + 0x03, 0x91, 0x30, 0x69, 0x82, 0x88, 0x01, 0x68, + 0x26, 0x20, 0x01, 0x92, 0x00, 0x91, 0x43, 0x5d, + 0xe0, 0x68, 0xe1, 0x69, 0x2a, 0x1c, 0x0e, 0x32, + 0x3c, 0x00, 0x70, 0xda, 0x00, 0x00, 0xc0, 0x68, + 0xf8, 0xf7, 0x37, 0xfd, 0x05, 0xb0, 0xf0, 0xbd, + 0x00, 0x00, 0xe9, 0xd9, 0x00, 0x00, 0x10, 0xb5, + 0x14, 0x1c, 0x05, 0x48, 0xfc, 0xf7, 0x7b, 0xfb, + 0xa0, 0x68, 0xf3, 0xf7, 0x9e, 0xfd, 0xe1, 0x68, + 0xc1, 0x60, 0x20, 0x1c, 0xf5, 0xf7, 0xbb, 0xfa, + 0x10, 0xbd, 0xa0, 0x6a, 0x01, 0x00, 0x7c, 0xb5, + 0x04, 0x1c, 0x60, 0x30, 0x02, 0x7b, 0xa1, 0x69, + 0x00, 0x91, 0x3c, 0x00, 0xac, 0xda, 0x00, 0x00, + 0x01, 0x92, 0x22, 0x1c, 0x21, 0x1c, 0x38, 0x31, + 0xa0, 0x68, 0x48, 0x32, 0x0d, 0x1c, 0x63, 0x69, + 0x03, 0xf0, 0x7a, 0xfb, 0x08, 0x21, 0x00, 0x20, + 0xf3, 0xf7, 0x88, 0xfd, 0xe0, 0x60, 0x26, 0x69, + 0xb1, 0x6b, 0x00, 0x29, 0x01, 0xd0, 0x10, 0x23, + 0x00, 0xe0, 0x18, 0x23, 0x05, 0x49, 0x01, 0x94, + 0x00, 0x91, 0x31, 0x68, 0xca, 0x18, 0x08, 0x23, + 0x01, 0x1c, 0x28, 0x1c, 0x3c, 0x00, 0xe8, 0xda, + 0x00, 0x00, 0xf8, 0xf7, 0x20, 0xfd, 0x7c, 0xbd, + 0x00, 0x00, 0x81, 0xda, 0x00, 0x00, 0xf0, 0xb5, + 0x46, 0x68, 0x17, 0x1c, 0x04, 0x1c, 0x01, 0x21, + 0x30, 0x1c, 0x9b, 0xb0, 0xfa, 0xf7, 0x0d, 0xfc, + 0x00, 0x25, 0x00, 0x28, 0x03, 0xd0, 0x13, 0x49, + 0x0a, 0x7a, 0x01, 0x2a, 0x01, 0xd1, 0x01, 0x25, + 0x1c, 0xe0, 0x88, 0x62, 0x4e, 0x61, 0x20, 0x89, + 0xc8, 0x61, 0x60, 0x89, 0x00, 0x28, 0x3c, 0x00, + 0x24, 0xdb, 0x00, 0x00, 0x03, 0xd0, 0x00, 0x20, + 0x08, 0x84, 0x48, 0x84, 0x04, 0xe0, 0xe0, 0x68, + 0x08, 0x84, 0x20, 0x8a, 0x48, 0x84, 0x60, 0x8a, + 0x88, 0x84, 0x08, 0x6b, 0x00, 0x28, 0x03, 0xd1, + 0x01, 0xa8, 0x03, 0xf0, 0x77, 0xfc, 0x04, 0xe0, + 0x01, 0x20, 0x08, 0x61, 0x00, 0x20, 0x02, 0xf0, + 0x39, 0xfb, 0x3d, 0x71, 0x1b, 0xb0, 0x01, 0x20, + 0xf0, 0xbd, 0x00, 0x00, 0xf4, 0x6e, 0x01, 0x00, + 0x3c, 0x00, 0x60, 0xdb, 0x00, 0x00, 0x10, 0xb5, + 0x04, 0x1c, 0xf7, 0xf7, 0xe8, 0xfb, 0x00, 0x28, + 0x11, 0xd1, 0x4b, 0x20, 0x00, 0x5d, 0x01, 0x28, + 0x0d, 0xd1, 0x20, 0x1c, 0x04, 0xf0, 0x85, 0xfa, + 0x00, 0x21, 0x20, 0x1c, 0x04, 0xf0, 0xf3, 0xf8, + 0xa0, 0x69, 0x00, 0x21, 0xc2, 0x07, 0xd2, 0x0f, + 0x04, 0x20, 0xf4, 0xf7, 0xd8, 0xf9, 0x10, 0xbd, + 0x00, 0x00, 0x38, 0xb5, 0x04, 0x1c, 0x04, 0xf0, + 0x36, 0xf9, 0x3c, 0x00, 0x9c, 0xdb, 0x00, 0x00, + 0x00, 0x28, 0x03, 0xd0, 0x40, 0x30, 0x80, 0x7a, + 0x00, 0x28, 0x25, 0xd1, 0x0c, 0x20, 0x29, 0x21, + 0x08, 0x55, 0x21, 0x1c, 0x06, 0x22, 0xa0, 0x18, + 0xf2, 0xf7, 0xa0, 0xfc, 0x20, 0x1c, 0x06, 0x22, + 0x0e, 0x49, 0xf2, 0xf7, 0x9b, 0xfc, 0x01, 0x20, + 0xe0, 0x61, 0x60, 0x62, 0x07, 0x20, 0x30, 0x21, + 0x08, 0x55, 0x00, 0x25, 0xe5, 0x63, 0x06, 0x20, + 0x00, 0xab, 0x18, 0x80, 0x3c, 0x00, 0xd8, 0xdb, + 0x00, 0x00, 0xe0, 0x68, 0x00, 0x28, 0x01, 0xd0, + 0xf3, 0xf7, 0xdb, 0xfc, 0x02, 0x21, 0x68, 0x46, + 0xfd, 0xf7, 0x73, 0xfb, 0xe0, 0x60, 0x20, 0x1c, + 0xff, 0xf7, 0x69, 0xfc, 0xe5, 0x60, 0x20, 0x1c, + 0x38, 0xbd, 0x12, 0x61, 0x01, 0x00, 0xfe, 0xb5, + 0x05, 0x1c, 0x0e, 0x1c, 0x15, 0x20, 0x00, 0xab, + 0x98, 0x80, 0x14, 0x21, 0x17, 0x1c, 0x00, 0x20, + 0xf3, 0xf7, 0xe3, 0xfc, 0x02, 0x90, 0x3c, 0x00, + 0x14, 0xdc, 0x00, 0x00, 0x04, 0x68, 0x06, 0x22, + 0x31, 0x1c, 0x60, 0x1d, 0x25, 0x71, 0xf2, 0xf7, + 0x6b, 0xfc, 0x06, 0x22, 0x39, 0x1c, 0x20, 0x1c, + 0x0b, 0x30, 0xf2, 0xf7, 0x65, 0xfc, 0x01, 0xa8, + 0xff, 0xf7, 0x52, 0xfc, 0xfe, 0xbd, 0x00, 0x00, + 0x80, 0xb5, 0x00, 0x23, 0xfb, 0xf7, 0x5c, 0xf8, + 0x80, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x05, 0x1c, + 0x08, 0x35, 0x0f, 0x4e, 0x29, 0x1c, 0x04, 0x1c, + 0x3c, 0x00, 0x50, 0xdc, 0x00, 0x00, 0x06, 0x22, + 0x30, 0x1c, 0xf2, 0xf7, 0x50, 0xfc, 0xa0, 0x88, + 0xb0, 0x82, 0x28, 0x1c, 0x05, 0xf0, 0xa1, 0xff, + 0x00, 0x28, 0x0b, 0xd0, 0xe0, 0x88, 0x30, 0x61, + 0x28, 0x1c, 0x04, 0xf0, 0xcc, 0xf8, 0xa1, 0x88, + 0x40, 0x30, 0x41, 0x80, 0x00, 0x20, 0xf4, 0xf7, + 0xb8, 0xf9, 0x02, 0xe0, 0x04, 0x20, 0xf4, 0xf7, + 0xa0, 0xf9, 0x00, 0x20, 0x70, 0xbd, 0x70, 0x7c, + 0x01, 0x00, 0x3c, 0x00, 0x8c, 0xdc, 0x00, 0x00, + 0x80, 0xb5, 0x00, 0x20, 0xfb, 0xf7, 0xf8, 0xfb, + 0x80, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x04, 0x1c, + 0x04, 0x30, 0x05, 0x1c, 0xfd, 0xf7, 0x32, 0xf8, + 0x00, 0x28, 0x09, 0xd0, 0x00, 0x20, 0xf7, 0xf7, + 0x37, 0xfc, 0x00, 0x28, 0x04, 0xd0, 0x06, 0x22, + 0x01, 0x1c, 0x28, 0x1c, 0xf2, 0xf7, 0x1e, 0xfc, + 0x0a, 0x4e, 0x06, 0x22, 0x29, 0x1c, 0x30, 0x1c, + 0xf2, 0xf7, 0x18, 0xfc, 0x3c, 0x00, 0xc8, 0xdc, + 0x00, 0x00, 0x60, 0x89, 0xf0, 0x82, 0x28, 0x1c, + 0x05, 0xf0, 0x69, 0xff, 0x00, 0x28, 0x03, 0xd0, + 0x02, 0x20, 0xf4, 0xf7, 0x88, 0xf9, 0x02, 0xe0, + 0x05, 0x20, 0xf9, 0xf7, 0xf4, 0xfa, 0x00, 0x20, + 0x70, 0xbd, 0x70, 0x7c, 0x01, 0x00, 0x10, 0xb5, + 0x04, 0x1c, 0x00, 0x79, 0x04, 0x28, 0x1c, 0xd2, + 0x60, 0x79, 0x01, 0x28, 0x01, 0xd0, 0x03, 0x28, + 0x04, 0xd1, 0x00, 0x22, 0x01, 0x21, 0x3c, 0x00, + 0x04, 0xdd, 0x00, 0x00, 0xa0, 0x1d, 0xf9, 0xf7, + 0x69, 0xfc, 0x60, 0x79, 0x00, 0x28, 0x04, 0xd1, + 0x22, 0x79, 0x00, 0x21, 0xf9, 0xf7, 0x62, 0xfc, + 0x0a, 0xe0, 0x03, 0x28, 0x08, 0xd1, 0x00, 0x24, + 0x22, 0x1c, 0x00, 0x21, 0x00, 0x20, 0xf9, 0xf7, + 0x59, 0xfc, 0x01, 0x34, 0x04, 0x2c, 0xf7, 0xdb, + 0x01, 0x20, 0x10, 0xbd, 0xf0, 0xb5, 0x97, 0xb0, + 0x17, 0x1c, 0x05, 0x1c, 0x04, 0x30, 0x04, 0x1c, + 0x3c, 0x00, 0x40, 0xdd, 0x00, 0x00, 0x15, 0xaa, + 0x16, 0xa9, 0x05, 0xf0, 0xe2, 0xfe, 0x00, 0x28, + 0x2e, 0xd0, 0x15, 0x98, 0x4b, 0x21, 0x09, 0x5c, + 0x00, 0x29, 0x23, 0xd0, 0x01, 0x29, 0x02, 0xd0, + 0x02, 0x29, 0x1f, 0xd1, 0x01, 0xe0, 0x04, 0xf0, + 0x90, 0xf9, 0xad, 0x7a, 0x13, 0x48, 0x16, 0x9e, + 0x05, 0x80, 0x06, 0x22, 0x21, 0x1c, 0x08, 0x30, + 0xf2, 0xf7, 0xc1, 0xfb, 0x22, 0x1c, 0x31, 0x1c, + 0x02, 0xa8, 0x3c, 0x00, 0x7c, 0xdd, 0x00, 0x00, + 0x00, 0xf0, 0x74, 0xfb, 0x0a, 0x20, 0x0a, 0xa9, + 0x48, 0x72, 0x00, 0xab, 0x9d, 0x80, 0x02, 0x21, + 0x01, 0xa8, 0xfd, 0xf7, 0x9f, 0xfa, 0x05, 0x90, + 0x02, 0xa8, 0xff, 0xf7, 0x95, 0xfb, 0xf3, 0xf7, + 0xf7, 0xf9, 0x00, 0x21, 0x15, 0x98, 0x03, 0xf0, + 0xe1, 0xff, 0x00, 0x20, 0x00, 0xe0, 0x01, 0x20, + 0x38, 0x71, 0x17, 0xb0, 0x01, 0x20, 0xf0, 0xbd, + 0x98, 0x7c, 0x01, 0x00, 0x3c, 0x00, 0xb8, 0xdd, + 0x00, 0x00, 0x80, 0xb5, 0x01, 0x20, 0xfb, 0xf7, + 0x62, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0xb0, 0xb5, + 0x04, 0x1c, 0x80, 0x7d, 0x15, 0x1c, 0x0a, 0x1c, + 0xc0, 0x07, 0xc0, 0x17, 0x01, 0x30, 0x21, 0x1c, + 0xf9, 0xf7, 0xfb, 0xfc, 0x00, 0x28, 0x03, 0xd1, + 0x04, 0x20, 0x28, 0x71, 0x01, 0x20, 0xb0, 0xbd, + 0x20, 0x6a, 0xf7, 0xf7, 0x76, 0xfe, 0x60, 0x6a, + 0xf7, 0xf7, 0x7b, 0xfe, 0x20, 0x6a, 0x3c, 0x00, + 0xf4, 0xdd, 0x00, 0x00, 0xfe, 0xf7, 0x88, 0xfa, + 0x00, 0x20, 0xb0, 0xbd, 0x10, 0xb5, 0x14, 0x1c, + 0xc2, 0x79, 0x81, 0x79, 0x80, 0x88, 0xf7, 0xf7, + 0xa1, 0xfa, 0x20, 0x71, 0x01, 0x20, 0x10, 0xbd, + 0x80, 0xb5, 0x01, 0x23, 0xfa, 0xf7, 0x70, 0xff, + 0x80, 0xbd, 0x00, 0x00, 0xf0, 0xb5, 0x04, 0x1c, + 0x08, 0x1c, 0x00, 0x21, 0x0f, 0x28, 0x91, 0xb0, + 0x00, 0xd3, 0x02, 0x21, 0x00, 0x29, 0x41, 0xd1, + 0x3c, 0x00, 0x30, 0xde, 0x00, 0x00, 0xc0, 0x00, + 0x24, 0x4f, 0x10, 0x90, 0xc6, 0x19, 0xb2, 0x88, + 0x21, 0x68, 0x02, 0xa8, 0xf2, 0xf7, 0x5b, 0xfb, + 0x21, 0x89, 0xb0, 0x88, 0x09, 0x1a, 0x00, 0x29, + 0x07, 0xdd, 0x09, 0x04, 0x22, 0x68, 0x09, 0x0c, + 0x10, 0x18, 0xf3, 0xf7, 0xc0, 0xfb, 0x05, 0x1c, + 0x00, 0xe0, 0x00, 0x25, 0xb0, 0x79, 0x80, 0x21, + 0x88, 0x43, 0x17, 0x49, 0x78, 0x31, 0x09, 0x5c, + 0x00, 0x20, 0x3c, 0x00, 0x6c, 0xde, 0x00, 0x00, + 0xf3, 0xf7, 0xb4, 0xfb, 0x07, 0x1c, 0x00, 0x68, + 0x13, 0x49, 0x01, 0x90, 0x10, 0x98, 0x0b, 0x58, + 0x01, 0x9a, 0x29, 0x1c, 0x02, 0xa8, 0xf2, 0xf7, + 0xac, 0xfa, 0x00, 0x90, 0x28, 0x1c, 0xf3, 0xf7, + 0x73, 0xfb, 0x20, 0x1c, 0xf3, 0xf7, 0x82, 0xfb, + 0x00, 0x98, 0x00, 0x28, 0x08, 0xd0, 0x02, 0x98, + 0x01, 0x99, 0x08, 0x60, 0xb0, 0x79, 0x39, 0x1c, + 0xfa, 0xf7, 0x20, 0xff, 0x3c, 0x00, 0xa8, 0xde, + 0x00, 0x00, 0x11, 0xb0, 0xf0, 0xbd, 0x38, 0x1c, + 0xf3, 0xf7, 0x61, 0xfb, 0xf9, 0xe7, 0x2d, 0x20, + 0xf3, 0xf7, 0xf5, 0xf9, 0x20, 0x1c, 0xf3, 0xf7, + 0x6c, 0xfb, 0xf2, 0xe7, 0x00, 0x00, 0x24, 0x44, + 0x01, 0x00, 0x70, 0xb5, 0x05, 0x1c, 0x20, 0x35, + 0x06, 0x1c, 0xa8, 0x79, 0x04, 0x28, 0x48, 0xd2, + 0xe9, 0x79, 0x01, 0x29, 0x13, 0xd1, 0x30, 0x1c, + 0x28, 0x30, 0x03, 0xf0, 0x92, 0xff, 0x3c, 0x00, + 0xe4, 0xde, 0x00, 0x00, 0x00, 0x28, 0x3f, 0xd0, + 0x01, 0x1c, 0x8c, 0x31, 0x01, 0x65, 0xa9, 0x79, + 0x4c, 0x22, 0x04, 0x1c, 0x11, 0x54, 0x81, 0x18, + 0x41, 0x62, 0x50, 0x34, 0x04, 0x62, 0xe1, 0x1e, + 0x81, 0x62, 0x0b, 0xe0, 0x00, 0x29, 0x2f, 0xd1, + 0x3c, 0x22, 0x18, 0x49, 0x42, 0x43, 0x54, 0x18, + 0x17, 0x4a, 0x04, 0x34, 0x12, 0x68, 0x00, 0x2a, + 0x00, 0xd1, 0x48, 0x70, 0x00, 0x2c, 0x23, 0xd0, + 0x3c, 0x00, 0x20, 0xdf, 0x00, 0x00, 0x35, 0x1c, + 0x30, 0x35, 0xe8, 0x79, 0x01, 0x28, 0x01, 0xd0, + 0x05, 0x28, 0x01, 0xd1, 0x06, 0x20, 0xe8, 0x71, + 0x20, 0x22, 0x31, 0x1d, 0x20, 0x68, 0xf2, 0xf7, + 0xde, 0xfa, 0xb0, 0x8c, 0xa0, 0x80, 0xe8, 0x79, + 0xa0, 0x71, 0xa8, 0x79, 0x00, 0x25, 0xa0, 0x63, + 0x01, 0x20, 0x60, 0x81, 0x00, 0x20, 0xe0, 0x60, + 0x2e, 0x36, 0xe8, 0x00, 0x00, 0x19, 0x18, 0x30, + 0x08, 0x22, 0x3c, 0x00, 0x5c, 0xdf, 0x00, 0x00, + 0x31, 0x1c, 0xf2, 0xf7, 0xcb, 0xfa, 0x01, 0x35, + 0x04, 0x2d, 0xf5, 0xd3, 0x01, 0x20, 0x70, 0xbd, + 0x68, 0x61, 0x01, 0x00, 0xdc, 0x62, 0x01, 0x00, + 0x10, 0xb5, 0x04, 0x1c, 0xc0, 0x7a, 0x01, 0x28, + 0x01, 0xd0, 0x03, 0x28, 0x07, 0xd1, 0x20, 0x1d, + 0x03, 0xf0, 0x40, 0xff, 0x00, 0x28, 0x02, 0xd0, + 0xa1, 0x7a, 0x40, 0x30, 0x41, 0x73, 0xe0, 0x7a, + 0x00, 0x28, 0x01, 0xd0, 0x3c, 0x00, 0x98, 0xdf, + 0x00, 0x00, 0x03, 0x28, 0x02, 0xd1, 0xa0, 0x7a, + 0x02, 0x49, 0x08, 0x70, 0x01, 0x20, 0x10, 0xbd, + 0x00, 0x00, 0x68, 0x61, 0x01, 0x00, 0x70, 0xb5, + 0x0e, 0x1c, 0x03, 0x21, 0x04, 0x1c, 0x30, 0x1c, + 0xfc, 0xf7, 0xe1, 0xfb, 0x00, 0x28, 0x01, 0xd0, + 0x85, 0x78, 0x00, 0xe0, 0x00, 0x25, 0x0b, 0x48, + 0x32, 0x1c, 0x00, 0x68, 0x03, 0x68, 0x20, 0x7c, + 0x80, 0x07, 0xc0, 0x0f, 0x21, 0x1c, 0x3c, 0x00, + 0xd4, 0xdf, 0x00, 0x00, 0xf7, 0xf7, 0x62, 0xfe, + 0x00, 0x28, 0x05, 0xd0, 0x01, 0x21, 0x28, 0x1c, + 0xfd, 0xf7, 0xfe, 0xfb, 0x00, 0x20, 0x00, 0xe0, + 0x08, 0x20, 0x03, 0xf0, 0xc5, 0xff, 0x00, 0x20, + 0x70, 0xbd, 0x00, 0x00, 0xe4, 0x65, 0x01, 0x00, + 0x80, 0xb5, 0x42, 0x68, 0x00, 0x88, 0x01, 0x21, + 0x49, 0x06, 0x08, 0x43, 0x2d, 0x21, 0x05, 0xf0, + 0xd3, 0xfb, 0x80, 0xbd, 0x03, 0x49, 0x01, 0x20, + 0x3c, 0x00, 0x10, 0xe0, 0x00, 0x00, 0x49, 0x78, + 0x02, 0x29, 0x00, 0xd0, 0x00, 0x20, 0x70, 0x47, + 0x00, 0x00, 0x84, 0x66, 0x01, 0x00, 0x8c, 0xb5, + 0x01, 0x28, 0x1f, 0xd1, 0x00, 0x29, 0x0d, 0xd0, + 0x01, 0x29, 0x0b, 0xd0, 0x02, 0x29, 0x01, 0xd0, + 0x03, 0x29, 0x16, 0xd1, 0x00, 0x20, 0xf9, 0xf7, + 0x14, 0xfc, 0x93, 0x20, 0x00, 0xab, 0x18, 0x80, + 0x00, 0x20, 0x08, 0xe0, 0x01, 0x29, 0x00, 0xd0, + 0x00, 0x20, 0x3c, 0x00, 0x4c, 0xe0, 0x00, 0x00, + 0xf9, 0xf7, 0x0a, 0xfc, 0x83, 0x20, 0x00, 0xab, + 0x18, 0x80, 0x02, 0x20, 0x00, 0xf0, 0xcc, 0xf8, + 0x01, 0x90, 0x68, 0x46, 0xff, 0xf7, 0x3a, 0xfa, + 0x8c, 0xbd, 0x01, 0x21, 0x0e, 0x20, 0xf3, 0xf7, + 0x1b, 0xf9, 0xf9, 0xe7, 0xff, 0xb5, 0x17, 0x1c, + 0x1e, 0x1c, 0x14, 0x21, 0x00, 0x20, 0x83, 0xb0, + 0xf3, 0xf7, 0xac, 0xfa, 0x05, 0x1c, 0x04, 0x68, + 0x12, 0x20, 0x00, 0xab, 0x3c, 0x00, 0x88, 0xe0, + 0x00, 0x00, 0x98, 0x80, 0x06, 0x22, 0x60, 0x1d, + 0x03, 0x99, 0xf2, 0xf7, 0x32, 0xfa, 0x00, 0x20, + 0x20, 0x71, 0x27, 0x73, 0x04, 0x99, 0x20, 0x1c, + 0xe1, 0x72, 0x31, 0x1c, 0x06, 0x22, 0x0d, 0x30, + 0xf2, 0xf7, 0x27, 0xfa, 0x02, 0x95, 0x01, 0xa8, + 0xff, 0xf7, 0x13, 0xfa, 0x07, 0xb0, 0xf0, 0xbd, + 0x00, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x0f, 0x1c, + 0x0c, 0x21, 0x00, 0x20, 0xf3, 0xf7, 0x3c, 0x00, + 0xc4, 0xe0, 0x00, 0x00, 0x89, 0xfa, 0x05, 0x68, + 0x04, 0x1c, 0x28, 0x1d, 0x06, 0x22, 0x31, 0x1c, + 0xf2, 0xf7, 0x12, 0xfa, 0x6f, 0x81, 0x20, 0x1c, + 0xf8, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, + 0x0d, 0x1c, 0x08, 0x21, 0x00, 0x20, 0xf3, 0xf7, + 0x77, 0xfa, 0x01, 0x68, 0x8c, 0x71, 0x8d, 0x80, + 0xb0, 0xbd, 0x00, 0x00, 0xf7, 0xb5, 0x0e, 0x1c, + 0x10, 0x21, 0x17, 0x1c, 0x00, 0x20, 0xf3, 0xf7, + 0x3c, 0x00, 0x00, 0xe1, 0x00, 0x00, 0x6b, 0xfa, + 0x04, 0x68, 0x05, 0x1c, 0x20, 0x1d, 0x06, 0x22, + 0x00, 0x99, 0xf2, 0xf7, 0xf4, 0xf9, 0x66, 0x81, + 0xa7, 0x81, 0x28, 0x1c, 0xfe, 0xbd, 0xf3, 0xb5, + 0x0c, 0x1c, 0x08, 0x21, 0x00, 0x20, 0x85, 0xb0, + 0xf3, 0xf7, 0x59, 0xfa, 0x06, 0x1c, 0x07, 0x68, + 0xe0, 0x68, 0x00, 0x28, 0x02, 0xd0, 0x05, 0x99, + 0x01, 0x29, 0x04, 0xd1, 0x05, 0x98, 0x38, 0x71, + 0x00, 0x20, 0x3c, 0x00, 0x3c, 0xe1, 0x00, 0x00, + 0x78, 0x71, 0x56, 0xe0, 0x03, 0x68, 0x01, 0x21, + 0x03, 0x93, 0x20, 0x69, 0x02, 0x90, 0xfc, 0xf7, + 0x17, 0xfb, 0x05, 0x1c, 0x02, 0x98, 0x32, 0x21, + 0xfc, 0xf7, 0x12, 0xfb, 0x00, 0x22, 0xd2, 0x43, + 0x01, 0x1c, 0x28, 0x1c, 0x04, 0xab, 0xf7, 0xf7, + 0xb9, 0xf8, 0x00, 0x28, 0x04, 0xd1, 0x30, 0x1c, + 0xf3, 0xf7, 0x02, 0xfa, 0x00, 0x26, 0x3c, 0xe0, + 0x00, 0x2d, 0x05, 0xd0, 0x3c, 0x00, 0x78, 0xe1, + 0x00, 0x00, 0x68, 0x78, 0x09, 0x38, 0x07, 0x28, + 0x01, 0xd8, 0x32, 0x20, 0x28, 0x70, 0x1c, 0x21, + 0x00, 0x20, 0xf3, 0xf7, 0x26, 0xfa, 0x01, 0x90, + 0x05, 0x68, 0x01, 0x1c, 0x30, 0x1c, 0xf3, 0xf7, + 0x40, 0xf9, 0xe0, 0x68, 0xf3, 0xf7, 0x0b, 0xfa, + 0xa8, 0x61, 0xe1, 0x68, 0x01, 0x98, 0xf3, 0xf7, + 0x38, 0xf9, 0x00, 0x20, 0xe0, 0x60, 0x05, 0x98, + 0x80, 0x21, 0x08, 0x43, 0x38, 0x71, 0x3c, 0x00, + 0xb4, 0xe1, 0x00, 0x00, 0x01, 0x20, 0x21, 0x1c, + 0x14, 0x31, 0x78, 0x71, 0x28, 0x1c, 0x06, 0x22, + 0xf2, 0xf7, 0x9a, 0xf9, 0x02, 0x9a, 0x29, 0x20, + 0x00, 0x92, 0x00, 0x5d, 0x01, 0x21, 0xe2, 0x6a, + 0x08, 0x28, 0x00, 0xd0, 0x00, 0x21, 0x28, 0x1c, + 0x03, 0x9b, 0x02, 0xf0, 0x9d, 0xff, 0xa0, 0x6b, + 0x28, 0x61, 0x20, 0x6c, 0x68, 0x61, 0x7f, 0x30, + 0x01, 0xd1, 0x0f, 0x20, 0x68, 0x61, 0x30, 0x1c, + 0x3c, 0x00, 0xf0, 0xe1, 0x00, 0x00, 0x07, 0xb0, + 0xf0, 0xbd, 0x10, 0xb5, 0x04, 0x1c, 0x08, 0x21, + 0x00, 0x20, 0xf3, 0xf7, 0xec, 0xf9, 0x01, 0x68, + 0x0c, 0x71, 0x10, 0xbd, 0x00, 0x00, 0x01, 0x48, + 0x00, 0x68, 0x70, 0x47, 0x00, 0x00, 0x28, 0x61, + 0x01, 0x00, 0x01, 0x49, 0x08, 0x60, 0x70, 0x47, + 0x00, 0x00, 0xe4, 0x65, 0x01, 0x00, 0x02, 0x1c, + 0x01, 0x20, 0x00, 0x06, 0x08, 0x43, 0x80, 0xb5, + 0x2d, 0x21, 0x3c, 0x00, 0x2c, 0xe2, 0x00, 0x00, + 0x05, 0xf0, 0xc0, 0xfa, 0x80, 0xbd, 0x00, 0x00, + 0x80, 0xb5, 0x01, 0x28, 0x07, 0xd0, 0xf1, 0x28, + 0x25, 0xd0, 0xf3, 0x28, 0x27, 0xd1, 0x02, 0x20, + 0x02, 0xf0, 0xbc, 0xf9, 0x80, 0xbd, 0x00, 0x29, + 0x1a, 0xd0, 0x01, 0x29, 0x03, 0xd0, 0xf2, 0x29, + 0xf8, 0xd1, 0x88, 0x21, 0x1c, 0xe0, 0x10, 0x48, + 0x01, 0x78, 0x00, 0x29, 0x05, 0xd1, 0x40, 0x78, + 0x01, 0x28, 0xef, 0xd1, 0x3c, 0x00, 0x68, 0xe2, + 0x00, 0x00, 0x00, 0xf0, 0x16, 0xfa, 0x80, 0xbd, + 0x0b, 0x48, 0x14, 0x30, 0x00, 0x89, 0xfc, 0xf7, + 0x5a, 0xfc, 0x01, 0x1c, 0x01, 0x22, 0x0f, 0x20, + 0x05, 0xf0, 0x9f, 0xf9, 0x80, 0xbd, 0x04, 0xf0, + 0x52, 0xfa, 0x80, 0xbd, 0x00, 0x20, 0xfa, 0xf7, + 0x32, 0xfe, 0x80, 0xbd, 0x02, 0x21, 0x0f, 0x20, + 0xf3, 0xf7, 0x05, 0xf8, 0x80, 0xbd, 0x84, 0x66, + 0x01, 0x00, 0x01, 0x48, 0x00, 0x78, 0x3c, 0x00, + 0xa4, 0xe2, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x74, 0x66, 0x01, 0x00, 0x01, 0x49, 0x00, 0x20, + 0x48, 0x60, 0x70, 0x47, 0xec, 0x65, 0x01, 0x00, + 0xf8, 0xb5, 0x0e, 0x1c, 0x13, 0x4d, 0x01, 0x1c, + 0x14, 0x1c, 0x68, 0x22, 0x28, 0x1c, 0x1f, 0x1c, + 0x0c, 0x30, 0xf2, 0xf7, 0x71, 0xf9, 0x0f, 0x49, + 0x00, 0x20, 0xac, 0x39, 0x48, 0x60, 0x01, 0x21, + 0x29, 0x60, 0x19, 0x21, 0x19, 0x2c, 0x6e, 0x67, + 0x3c, 0x00, 0xe0, 0xe2, 0x00, 0x00, 0x00, 0xd3, + 0x21, 0x1c, 0x29, 0x81, 0x09, 0x49, 0x14, 0x39, + 0x88, 0x73, 0x8f, 0x74, 0xc8, 0x78, 0x01, 0x28, + 0x08, 0xd0, 0x01, 0x21, 0x0f, 0x20, 0x05, 0xf0, + 0x9c, 0xf9, 0x19, 0x20, 0xfc, 0xf7, 0x15, 0xfc, + 0xfb, 0xf7, 0x99, 0xf8, 0x01, 0x20, 0xf8, 0xbd, + 0x00, 0x00, 0x98, 0x66, 0x01, 0x00, 0x80, 0xb5, + 0x01, 0x28, 0x02, 0xd1, 0x00, 0xf0, 0x2f, 0xf8, + 0x80, 0xbd, 0x3c, 0x00, 0x1c, 0xe3, 0x00, 0x00, + 0x01, 0x21, 0x1d, 0x20, 0xf2, 0xf7, 0xc0, 0xff, + 0x80, 0xbd, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x01, 0x20, 0x07, 0x49, 0x00, 0x05, 0x80, 0xb5, + 0x88, 0x60, 0x00, 0x22, 0x80, 0x21, 0x16, 0x20, + 0x05, 0xf0, 0x4c, 0xf9, 0x04, 0xf0, 0x34, 0xfd, + 0x02, 0x49, 0x08, 0x61, 0x80, 0xbd, 0x00, 0x00, + 0x00, 0x10, 0x07, 0x00, 0x24, 0x6d, 0x01, 0x00, + 0x06, 0x4a, 0x80, 0xb5, 0x3c, 0x00, 0x58, 0xe3, + 0x00, 0x00, 0xd1, 0x6a, 0x81, 0x42, 0x07, 0xd1, + 0x10, 0x7f, 0x24, 0x23, 0x04, 0x49, 0x58, 0x43, + 0x40, 0x18, 0xc0, 0x68, 0xf2, 0xf7, 0x35, 0xf8, + 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x94, 0x46, + 0x01, 0x00, 0x1d, 0x48, 0x1c, 0xb5, 0x00, 0x78, + 0x00, 0x28, 0x2d, 0xd0, 0x1c, 0x48, 0x00, 0x68, + 0x00, 0x28, 0x29, 0xd0, 0x1a, 0x4a, 0x1a, 0x4b, + 0x04, 0x32, 0x11, 0x68, 0x1c, 0x69, 0x3c, 0x00, + 0x94, 0xe3, 0x00, 0x00, 0xa1, 0x42, 0x22, 0xd1, + 0x51, 0x68, 0x5b, 0x69, 0x99, 0x42, 0x1f, 0xd1, + 0x16, 0x49, 0x49, 0x68, 0x93, 0x68, 0xc9, 0x1a, + 0x81, 0x42, 0x19, 0xd2, 0xd0, 0x68, 0x14, 0x49, + 0x01, 0x30, 0xd0, 0x60, 0x09, 0x68, 0x88, 0x42, + 0x0c, 0xd9, 0x06, 0x22, 0xff, 0x21, 0x68, 0x46, + 0xf2, 0xf7, 0x2e, 0xf9, 0xf3, 0xf7, 0xac, 0xfc, + 0x01, 0x1c, 0x00, 0x23, 0x00, 0x22, 0x68, 0x46, + 0x3c, 0x00, 0xd0, 0xe3, 0x00, 0x00, 0x02, 0xf0, + 0xce, 0xf9, 0x01, 0x22, 0x1d, 0x20, 0x0a, 0x49, + 0x05, 0xf0, 0xf7, 0xf8, 0x1c, 0xbd, 0xf7, 0xf7, + 0x88, 0xf9, 0x04, 0x22, 0x81, 0x18, 0x08, 0x1c, + 0xfc, 0xf7, 0x27, 0xfb, 0xf6, 0xe7, 0x1c, 0x75, + 0x01, 0x00, 0x44, 0x75, 0x01, 0x00, 0x28, 0x61, + 0x01, 0x00, 0x90, 0x5c, 0x01, 0x00, 0xf0, 0x59, + 0x01, 0x00, 0xa0, 0x86, 0x01, 0x00, 0x80, 0xb5, + 0x01, 0x68, 0x3c, 0x00, 0x0c, 0xe4, 0x00, 0x00, + 0x00, 0x29, 0x15, 0xd1, 0x00, 0x79, 0x02, 0x28, + 0x12, 0xd1, 0x08, 0x1c, 0xf7, 0xf7, 0x80, 0xf8, + 0x00, 0x28, 0x0d, 0xd0, 0x03, 0xf0, 0xf2, 0xfc, + 0x08, 0x30, 0x41, 0x8f, 0x00, 0x29, 0x07, 0xd1, + 0x80, 0x69, 0x00, 0x28, 0x04, 0xd0, 0x80, 0x79, + 0x06, 0x28, 0x01, 0xd1, 0xfc, 0xf7, 0x18, 0xfb, + 0x80, 0xbd, 0x00, 0x00, 0x01, 0x49, 0x00, 0x20, + 0x88, 0x62, 0x70, 0x47, 0x3c, 0x00, 0x48, 0xe4, + 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0xb0, 0xb5, + 0x05, 0x4d, 0x04, 0x1c, 0xa9, 0x1d, 0xff, 0xf7, + 0x14, 0xf8, 0x06, 0x22, 0x29, 0x1c, 0xa0, 0x18, + 0xf2, 0xf7, 0x4b, 0xf8, 0xb0, 0xbd, 0x70, 0x7c, + 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x15, 0x1c, + 0xff, 0xf7, 0x07, 0xf8, 0x06, 0x22, 0x29, 0x1c, + 0xa0, 0x18, 0xf2, 0xf7, 0x3e, 0xf8, 0xb0, 0xbd, + 0x00, 0x00, 0x80, 0xb5, 0x0a, 0x30, 0x3c, 0x00, + 0x84, 0xe4, 0x00, 0x00, 0xf7, 0xf7, 0xbc, 0xf9, + 0x01, 0x23, 0x00, 0x28, 0x03, 0xd0, 0x05, 0x48, + 0x00, 0x78, 0x01, 0x28, 0x04, 0xd1, 0x00, 0x22, + 0x00, 0x21, 0x00, 0x20, 0x03, 0xf0, 0xc6, 0xfd, + 0x80, 0xbd, 0x00, 0x00, 0xa0, 0x79, 0x01, 0x00, + 0x80, 0xb5, 0x00, 0x23, 0x00, 0x22, 0x00, 0x21, + 0x00, 0x20, 0x03, 0xf0, 0xbb, 0xfd, 0x80, 0xbd, + 0xb0, 0xb5, 0x05, 0x4d, 0xac, 0x79, 0x0a, 0x1c, + 0x3c, 0x00, 0xc0, 0xe4, 0x00, 0x00, 0x01, 0x1c, + 0x01, 0x23, 0x01, 0x20, 0x03, 0xf0, 0xb1, 0xfd, + 0xac, 0x71, 0xb0, 0xbd, 0x00, 0x00, 0x20, 0x10, + 0x07, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x0c, 0x1c, + 0x88, 0x07, 0x02, 0xd5, 0xf6, 0xf7, 0x47, 0xfa, + 0x10, 0xe0, 0x60, 0x07, 0x0e, 0xd5, 0x17, 0x4f, + 0xa3, 0x20, 0xc0, 0x5d, 0x15, 0x4d, 0x10, 0x28, + 0x00, 0xd3, 0x15, 0x4d, 0x04, 0xf0, 0x59, 0xfc, + 0xb9, 0x6f, 0x3c, 0x00, 0xfc, 0xe4, 0x00, 0x00, + 0x40, 0x1a, 0x29, 0x1a, 0x01, 0x20, 0xf6, 0xf7, + 0xc1, 0xfa, 0xe0, 0x07, 0x11, 0x49, 0xc0, 0x0f, + 0x48, 0x60, 0x0c, 0xd0, 0x0d, 0x4c, 0x44, 0x3c, + 0x20, 0x78, 0x03, 0x28, 0x0f, 0xd1, 0x00, 0x2e, + 0x06, 0xd0, 0xf6, 0xf7, 0xf9, 0xf9, 0x01, 0x1c, + 0x01, 0x20, 0xf6, 0xf7, 0xaf, 0xfa, 0xf8, 0xbd, + 0x09, 0x49, 0x01, 0x20, 0xf6, 0xf7, 0xaa, 0xfa, + 0x01, 0x20, 0x20, 0x70, 0x3c, 0x00, 0x38, 0xe5, + 0x00, 0x00, 0xf7, 0xe7, 0x01, 0x21, 0x30, 0x1c, + 0xf6, 0xf7, 0x89, 0xfa, 0xf2, 0xe7, 0xa6, 0x0e, + 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0xc4, 0x09, + 0x00, 0x00, 0xb0, 0x57, 0x01, 0x00, 0x40, 0x42, + 0x0f, 0x00, 0x80, 0xb5, 0x06, 0x28, 0x04, 0xdb, + 0x05, 0x21, 0xff, 0x20, 0xf2, 0xf7, 0x9f, 0xfe, + 0x80, 0xbd, 0x03, 0x4a, 0xc0, 0x00, 0x11, 0x50, + 0x01, 0x21, 0x80, 0x18, 0x01, 0x71, 0x3c, 0x00, + 0x74, 0xe5, 0x00, 0x00, 0x80, 0xbd, 0x00, 0x00, + 0x9c, 0x5a, 0x01, 0x00, 0x01, 0x48, 0x80, 0x68, + 0x70, 0x47, 0x00, 0x00, 0xd0, 0x60, 0x01, 0x00, + 0xb0, 0xb5, 0x08, 0x4c, 0x25, 0x1d, 0x28, 0x1c, + 0x21, 0x68, 0x00, 0xf0, 0xf1, 0xfe, 0x00, 0x28, + 0x03, 0xd1, 0x01, 0x21, 0x04, 0x48, 0xf2, 0xf7, + 0xcf, 0xfa, 0x28, 0x1c, 0x21, 0x68, 0x00, 0xf0, + 0xfb, 0xfe, 0xb0, 0xbd, 0xc0, 0x60, 0x01, 0x00, + 0x3c, 0x00, 0xb0, 0xe5, 0x00, 0x00, 0x2c, 0x10, + 0x07, 0x00, 0xb0, 0xb5, 0x10, 0x4d, 0x0c, 0x1c, + 0xa8, 0x68, 0x00, 0x28, 0x02, 0xd1, 0x04, 0xf0, + 0xf4, 0xfb, 0x28, 0x60, 0x20, 0x1c, 0x04, 0xf0, + 0x38, 0xfb, 0x01, 0x21, 0x03, 0x20, 0x03, 0xf0, + 0xc4, 0xfe, 0x04, 0xf0, 0xf0, 0xfb, 0xa8, 0x68, + 0x00, 0x28, 0x0b, 0xd1, 0x04, 0xf0, 0xe5, 0xfb, + 0x29, 0x68, 0x00, 0x1b, 0x40, 0x1a, 0x69, 0x68, + 0x40, 0x18, 0x3c, 0x00, 0xec, 0xe5, 0x00, 0x00, + 0x41, 0x08, 0x40, 0x18, 0x28, 0x60, 0x01, 0x20, + 0xa8, 0x60, 0xb0, 0xbd, 0xd0, 0x60, 0x01, 0x00, + 0xf8, 0xb5, 0x1f, 0x4e, 0x00, 0x24, 0xb0, 0x68, + 0x00, 0x28, 0x02, 0xd1, 0x04, 0xf0, 0xd0, 0xfb, + 0x70, 0x60, 0x05, 0xf0, 0x61, 0xf8, 0x04, 0xf0, + 0x8f, 0xfb, 0x05, 0x1c, 0xf9, 0xf7, 0x66, 0xfe, + 0x31, 0x68, 0x18, 0x4a, 0x41, 0x18, 0x12, 0x68, + 0xe8, 0x0b, 0x00, 0x2a, 0x3c, 0x00, 0x28, 0xe6, + 0x00, 0x00, 0x00, 0xd1, 0xa8, 0x0a, 0x40, 0x18, + 0x85, 0x42, 0x1f, 0xd9, 0x14, 0x4f, 0x2d, 0x1a, + 0x38, 0x1c, 0x20, 0x30, 0x81, 0x79, 0x00, 0xab, + 0x19, 0x70, 0xc0, 0x79, 0x58, 0x70, 0x05, 0xf0, + 0x6e, 0xf8, 0x00, 0x28, 0x03, 0xd1, 0x02, 0x21, + 0x8f, 0x20, 0xf2, 0xf7, 0x28, 0xfe, 0x29, 0x1c, + 0x0c, 0x48, 0xf2, 0x68, 0xf8, 0xf7, 0x09, 0xfc, + 0x00, 0x28, 0x04, 0xd0, 0x01, 0x1c, 0x3c, 0x00, + 0x64, 0xe6, 0x00, 0x00, 0x28, 0x1c, 0xff, 0xf7, + 0xa5, 0xff, 0x01, 0x24, 0x00, 0xab, 0x18, 0x88, + 0xf8, 0x84, 0x05, 0xf0, 0x47, 0xf8, 0x20, 0x1c, + 0xf8, 0xbd, 0x00, 0x00, 0xd0, 0x60, 0x01, 0x00, + 0xf4, 0x74, 0x01, 0x00, 0x00, 0x10, 0x07, 0x00, + 0x89, 0x13, 0x01, 0x00, 0x01, 0x49, 0x01, 0x20, + 0xc8, 0x60, 0x70, 0x47, 0xd0, 0x60, 0x01, 0x00, + 0x06, 0x48, 0x80, 0xb5, 0x00, 0x68, 0x01, 0x28, + 0x3c, 0x00, 0xa0, 0xe6, 0x00, 0x00, 0x07, 0xd1, + 0x04, 0x48, 0xac, 0x38, 0x01, 0x69, 0x03, 0x48, + 0x00, 0xf0, 0x79, 0xfe, 0xf3, 0xf7, 0x2b, 0xfa, + 0x80, 0xbd, 0x98, 0x66, 0x01, 0x00, 0x34, 0x63, + 0x01, 0x00, 0x80, 0xb5, 0x42, 0x78, 0x81, 0x68, + 0x00, 0x79, 0x03, 0xf0, 0xde, 0xff, 0x00, 0x28, + 0x01, 0xd1, 0xf5, 0xf7, 0xb6, 0xf9, 0x80, 0xbd, + 0x00, 0x00, 0x1f, 0xb5, 0x04, 0xf0, 0x69, 0xfb, + 0xf6, 0xf7, 0x3c, 0x00, 0xdc, 0xe6, 0x00, 0x00, + 0x91, 0xff, 0x16, 0x4c, 0x02, 0x28, 0x03, 0xd1, + 0xff, 0xf7, 0xdc, 0xfd, 0x04, 0x28, 0x02, 0xd3, + 0x00, 0x20, 0x20, 0x70, 0x1f, 0xbd, 0xfb, 0xf7, + 0xf7, 0xfc, 0x00, 0x28, 0xfa, 0xd1, 0x60, 0x6a, + 0x00, 0x28, 0xf7, 0xd0, 0x20, 0x78, 0x80, 0x07, + 0xf4, 0xd4, 0x09, 0x21, 0x16, 0x20, 0x04, 0xf0, + 0x93, 0xff, 0x01, 0x20, 0x20, 0x70, 0x0b, 0x4c, + 0x09, 0x49, 0x02, 0x90, 0x3c, 0x00, 0x18, 0xe7, + 0x00, 0x00, 0x01, 0x94, 0x00, 0x91, 0x04, 0xf0, + 0x46, 0xfb, 0x00, 0x19, 0x03, 0x90, 0x68, 0x46, + 0xfd, 0xf7, 0xb5, 0xfb, 0x00, 0x22, 0x16, 0x21, + 0x84, 0x20, 0x05, 0xf0, 0x3e, 0xf8, 0xdc, 0xe7, + 0x00, 0x00, 0x60, 0x6c, 0x01, 0x00, 0x61, 0xed, + 0x00, 0x00, 0x40, 0x42, 0x0f, 0x00, 0x23, 0x48, + 0x70, 0xb5, 0x80, 0x78, 0x9c, 0xb0, 0x01, 0x28, + 0x3e, 0xd1, 0x20, 0x4c, 0x09, 0xa8, 0x3c, 0x00, + 0x54, 0xe7, 0x00, 0x00, 0x80, 0x3c, 0x61, 0x1c, + 0xfe, 0xf7, 0x92, 0xfe, 0x04, 0x20, 0x11, 0xad, + 0x68, 0x72, 0xa0, 0x6f, 0x19, 0xa9, 0x18, 0x90, + 0x7c, 0x20, 0x00, 0x5d, 0x01, 0x26, 0x08, 0x71, + 0x1d, 0x20, 0x00, 0x5d, 0x00, 0x28, 0x06, 0xd0, + 0x10, 0x96, 0x12, 0x96, 0xfc, 0xf7, 0xf6, 0xfa, + 0x28, 0x72, 0x20, 0x7a, 0x11, 0x90, 0xf3, 0xf7, + 0xcd, 0xff, 0x6a, 0x21, 0x08, 0x53, 0x40, 0x34, + 0x3c, 0x00, 0x90, 0xe7, 0x00, 0x00, 0x00, 0x22, + 0x01, 0xa9, 0x06, 0xa8, 0xf6, 0xf7, 0xcd, 0xff, + 0x21, 0x1c, 0x00, 0x20, 0xfb, 0xf7, 0xcb, 0xfb, + 0x06, 0xa9, 0xfb, 0xf7, 0xc8, 0xfb, 0x01, 0xa9, + 0xfb, 0xf7, 0xc5, 0xfb, 0x0a, 0x49, 0x09, 0x68, + 0x00, 0x29, 0x07, 0xd0, 0x33, 0x1c, 0x0a, 0x22, + 0x69, 0x46, 0xfb, 0xf7, 0xda, 0xfb, 0x00, 0x9a, + 0x07, 0x21, 0x91, 0x70, 0x0c, 0x90, 0x09, 0xa8, + 0xfe, 0xf7, 0x3c, 0x00, 0xcc, 0xe7, 0x00, 0x00, + 0x7b, 0xfe, 0x1c, 0xb0, 0x70, 0xbd, 0x00, 0x00, + 0x84, 0x66, 0x01, 0x00, 0xe4, 0x62, 0x01, 0x00, + 0xf8, 0xb5, 0x04, 0x1c, 0xc0, 0x68, 0xff, 0x22, + 0x01, 0x68, 0x12, 0x02, 0x0e, 0x1c, 0x08, 0x7b, + 0x49, 0x7b, 0x09, 0x02, 0x11, 0x40, 0x08, 0x43, + 0x05, 0x1c, 0x31, 0x1c, 0x06, 0x22, 0xa0, 0x18, + 0xf1, 0xf7, 0x7c, 0xfe, 0x06, 0x22, 0xb1, 0x18, + 0x20, 0x1c, 0xf1, 0xf7, 0x3c, 0x00, 0x08, 0xe8, + 0x00, 0x00, 0x77, 0xfe, 0x28, 0x0a, 0x29, 0x02, + 0x08, 0x43, 0x00, 0x04, 0x03, 0x21, 0x49, 0x02, + 0x00, 0x0c, 0x88, 0x42, 0x08, 0xd2, 0xe0, 0x68, + 0x01, 0x89, 0x0e, 0x39, 0x01, 0x81, 0xe0, 0x68, + 0x01, 0x68, 0x0e, 0x31, 0x01, 0x60, 0xf8, 0xbd, + 0x00, 0x26, 0x20, 0x1c, 0x10, 0x30, 0x03, 0xf0, + 0xe8, 0xfa, 0x21, 0x8b, 0x00, 0x29, 0x05, 0xd1, + 0xe1, 0x7d, 0x00, 0x29, 0x0b, 0xd0, 0x3c, 0x00, + 0x44, 0xe8, 0x00, 0x00, 0x80, 0x69, 0x80, 0x07, + 0x08, 0xd4, 0xe0, 0x68, 0x01, 0x26, 0x01, 0x89, + 0x02, 0x39, 0x01, 0x81, 0xe0, 0x68, 0x01, 0x68, + 0x02, 0x31, 0x06, 0xe0, 0xe0, 0x68, 0x01, 0x89, + 0x06, 0x39, 0x01, 0x81, 0xe0, 0x68, 0x01, 0x68, + 0x06, 0x31, 0x01, 0x60, 0x14, 0x49, 0x00, 0x20, + 0x0b, 0x1f, 0x42, 0x00, 0x9a, 0x5a, 0xaa, 0x42, + 0x02, 0xd1, 0x11, 0x49, 0x06, 0x31, 0x02, 0xe0, + 0x3c, 0x00, 0x80, 0xe8, 0x00, 0x00, 0x01, 0x30, + 0x02, 0x28, 0xf5, 0xd3, 0xe0, 0x68, 0x06, 0x22, + 0x00, 0x68, 0xf1, 0xf7, 0x34, 0xfe, 0x01, 0x2e, + 0xcb, 0xd1, 0x81, 0x20, 0x00, 0xab, 0x18, 0x80, + 0xe1, 0x7d, 0x20, 0x8b, 0x49, 0x03, 0x08, 0x43, + 0x31, 0x03, 0x08, 0x43, 0x00, 0x04, 0x00, 0x0c, + 0x01, 0x0a, 0x00, 0x02, 0x08, 0x43, 0x58, 0x80, + 0xe0, 0x68, 0x19, 0x88, 0x00, 0x68, 0xc1, 0x80, + 0x59, 0x88, 0x3c, 0x00, 0xbc, 0xe8, 0x00, 0x00, + 0x01, 0x81, 0xb5, 0xe7, 0x6a, 0x46, 0x01, 0x00, + 0xb0, 0xb5, 0x0d, 0x1c, 0x01, 0x89, 0x06, 0x22, + 0x08, 0x31, 0x01, 0x81, 0x04, 0x68, 0x04, 0x49, + 0x08, 0x3c, 0x04, 0x60, 0x20, 0x1c, 0xf1, 0xf7, + 0x0d, 0xfe, 0xe5, 0x80, 0xb0, 0xbd, 0x00, 0x00, + 0x6a, 0x46, 0x01, 0x00, 0xf8, 0xb5, 0x00, 0x29, + 0x01, 0xd0, 0x00, 0x28, 0x01, 0xd1, 0x00, 0x20, + 0xf8, 0xbd, 0x09, 0x04, 0x3c, 0x00, 0xf8, 0xe8, + 0x00, 0x00, 0x09, 0x0c, 0xf2, 0xf7, 0x43, 0xff, + 0x06, 0x1c, 0x05, 0x1c, 0x00, 0x27, 0x20, 0xe0, + 0x2c, 0x89, 0x29, 0x68, 0x02, 0x2c, 0x01, 0xd2, + 0x02, 0x20, 0x01, 0xe0, 0x48, 0x78, 0x02, 0x30, + 0x84, 0x42, 0x02, 0xdd, 0x24, 0x1a, 0x09, 0x18, + 0xf4, 0xe7, 0x84, 0x42, 0x10, 0xd0, 0x01, 0x1b, + 0x0a, 0x04, 0x01, 0x04, 0x09, 0x0c, 0x12, 0x0c, + 0x28, 0x1c, 0xf2, 0xf7, 0x9e, 0xfe, 0x3c, 0x00, + 0x34, 0xe9, 0x00, 0x00, 0x00, 0x28, 0x06, 0xd1, + 0xe8, 0x68, 0xf2, 0xf7, 0x2d, 0xfe, 0xef, 0x60, + 0x28, 0x89, 0x00, 0x1b, 0x28, 0x81, 0xed, 0x68, + 0x00, 0x2d, 0xdc, 0xd1, 0x30, 0x1c, 0xd1, 0xe7, + 0xf8, 0xb5, 0x85, 0x68, 0x04, 0x1c, 0x80, 0x69, + 0x2e, 0x1c, 0x00, 0x28, 0x0d, 0xd0, 0x71, 0x68, + 0xf2, 0xf7, 0xf6, 0xfd, 0xa0, 0x69, 0xf2, 0xf7, + 0x17, 0xfe, 0x06, 0xe0, 0x00, 0x21, 0xc1, 0x60, + 0x3c, 0x00, 0x70, 0xe9, 0x00, 0x00, 0xf1, 0x60, + 0xa0, 0x8d, 0x36, 0x68, 0x01, 0x38, 0xa0, 0x85, + 0xf0, 0x68, 0x00, 0x28, 0xf5, 0xd1, 0x30, 0x68, + 0xa0, 0x60, 0xa0, 0x8d, 0x01, 0x38, 0x00, 0x04, + 0x00, 0x0c, 0xa0, 0x85, 0x02, 0xd0, 0x20, 0x1c, + 0xf9, 0xf7, 0x39, 0xf8, 0x2a, 0x4f, 0x2a, 0x48, + 0x00, 0x68, 0x00, 0x28, 0x03, 0xd0, 0x06, 0x21, + 0x68, 0x68, 0xfa, 0xf7, 0x7c, 0xfd, 0x68, 0x68, + 0x00, 0x68, 0x3c, 0x00, 0xac, 0xe9, 0x00, 0x00, + 0x81, 0x78, 0x00, 0x29, 0x2b, 0xd1, 0xc1, 0x78, + 0x00, 0x29, 0x30, 0xd1, 0x21, 0x8e, 0x01, 0x39, + 0x21, 0x86, 0xfb, 0xf7, 0x15, 0xf8, 0xa1, 0x6a, + 0x08, 0x1a, 0xa0, 0x62, 0xe1, 0x69, 0x88, 0x42, + 0x03, 0xd9, 0x04, 0x21, 0x02, 0x20, 0xf2, 0xf7, + 0x67, 0xfc, 0xb8, 0x68, 0x00, 0x28, 0x1e, 0xd0, + 0x1a, 0x49, 0x20, 0x8e, 0x49, 0x68, 0x0c, 0x22, + 0x52, 0x1a, 0x90, 0x42, 0x3c, 0x00, 0xe8, 0xe9, + 0x00, 0x00, 0x08, 0xd3, 0x19, 0x23, 0x9b, 0x01, + 0xaf, 0x22, 0x92, 0x01, 0x59, 0x43, 0xa0, 0x6a, + 0x51, 0x1a, 0x88, 0x42, 0x0e, 0xd2, 0x00, 0x21, + 0x0c, 0x20, 0x03, 0xf0, 0xac, 0xfc, 0x00, 0x20, + 0xb8, 0x60, 0x07, 0xe0, 0x01, 0x29, 0x05, 0xd1, + 0xc0, 0x78, 0x17, 0x28, 0x02, 0xd1, 0xa0, 0x8e, + 0x01, 0x38, 0xa0, 0x86, 0x2a, 0x1d, 0x06, 0xca, + 0xe0, 0x68, 0x63, 0x69, 0xf1, 0xf7, 0x3c, 0x00, + 0x24, 0xea, 0x00, 0x00, 0xdc, 0xfc, 0xb5, 0x42, + 0x01, 0xd0, 0x2d, 0x68, 0xb4, 0xe7, 0xa0, 0x8d, + 0x00, 0x28, 0x03, 0xd1, 0x05, 0x48, 0xb9, 0x69, + 0x00, 0xf0, 0x9e, 0xfc, 0xf8, 0xbd, 0x00, 0x00, + 0xfc, 0x5a, 0x01, 0x00, 0xcc, 0x5c, 0x01, 0x00, + 0x18, 0x57, 0x01, 0x00, 0xc4, 0x60, 0x01, 0x00, + 0x89, 0x07, 0x07, 0x4b, 0xca, 0x0f, 0x80, 0xb5, + 0x19, 0x7c, 0x00, 0x29, 0x06, 0xd0, 0x81, 0x43, + 0x3c, 0x00, 0x60, 0xea, 0x00, 0x00, 0x19, 0x74, + 0x03, 0xd1, 0x07, 0x21, 0x15, 0x20, 0x04, 0xf0, + 0xa2, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x78, 0x69, + 0x01, 0x00, 0x80, 0xb5, 0x01, 0x1c, 0x01, 0x20, + 0xff, 0xf7, 0xe9, 0xff, 0x80, 0xbd, 0x80, 0xb5, + 0x01, 0x1c, 0x02, 0x20, 0xff, 0xf7, 0xe3, 0xff, + 0x80, 0xbd, 0xb0, 0xb5, 0x1b, 0x4c, 0x60, 0x68, + 0xfc, 0xf7, 0x2f, 0xff, 0x20, 0x68, 0x00, 0x25, + 0x40, 0x68, 0x3c, 0x00, 0x9c, 0xea, 0x00, 0x00, + 0x00, 0x28, 0x03, 0xd0, 0xfd, 0xf7, 0x18, 0xfc, + 0x20, 0x68, 0x45, 0x60, 0x60, 0x68, 0xfc, 0xf7, + 0xc5, 0xfe, 0x14, 0x48, 0x61, 0x68, 0x00, 0xf0, + 0x61, 0xfc, 0xa0, 0x7a, 0x01, 0x28, 0x05, 0xd0, + 0x02, 0x28, 0x03, 0xd0, 0x20, 0x68, 0x00, 0x68, + 0x00, 0xf0, 0xde, 0xf8, 0x01, 0x21, 0x1f, 0x20, + 0x04, 0xf0, 0xb2, 0xfd, 0x00, 0x21, 0x1f, 0x20, + 0x04, 0xf0, 0xae, 0xfd, 0x3c, 0x00, 0xd8, 0xea, + 0x00, 0x00, 0x02, 0x21, 0x1f, 0x20, 0x04, 0xf0, + 0xaa, 0xfd, 0xa5, 0x72, 0x21, 0x68, 0x2c, 0x20, + 0x40, 0x5c, 0x89, 0x68, 0xf1, 0xf7, 0x76, 0xfc, + 0x60, 0x68, 0xfc, 0xf7, 0xe4, 0xfe, 0x20, 0x68, + 0x05, 0x62, 0xb0, 0xbd, 0x00, 0x00, 0x14, 0x7a, + 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, 0x04, 0x49, + 0x0a, 0x68, 0xc8, 0x68, 0x92, 0x6a, 0x00, 0x2a, + 0x01, 0xd0, 0x09, 0x69, 0x08, 0x18, 0x3c, 0x00, + 0x14, 0xeb, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x14, 0x7a, 0x01, 0x00, 0xb0, 0xb5, 0x13, 0x4c, + 0x05, 0x1c, 0xa0, 0x7a, 0x01, 0x38, 0x02, 0x28, + 0x19, 0xd8, 0x01, 0x21, 0x1f, 0x20, 0x04, 0xf0, + 0x81, 0xfd, 0x20, 0x68, 0xfc, 0x23, 0x01, 0x1c, + 0x20, 0x30, 0x02, 0x7b, 0x1a, 0x40, 0x02, 0x73, + 0x00, 0x2d, 0x0f, 0xd0, 0x01, 0x23, 0x1a, 0x43, + 0x02, 0x73, 0xa0, 0x7a, 0x03, 0x28, 0x07, 0xd1, + 0x3c, 0x00, 0x50, 0xeb, 0x00, 0x00, 0x01, 0x20, + 0x01, 0xf0, 0xe7, 0xfd, 0x00, 0x28, 0x01, 0xd1, + 0xff, 0xf7, 0x97, 0xff, 0xb0, 0xbd, 0x4b, 0x62, + 0xb0, 0xbd, 0x02, 0x21, 0x11, 0x43, 0x01, 0x73, + 0xf6, 0xe7, 0x14, 0x7a, 0x01, 0x00, 0x10, 0xb5, + 0x04, 0x1c, 0x0a, 0x30, 0xf6, 0xf7, 0x43, 0xfe, + 0x00, 0x28, 0x0c, 0xd0, 0x22, 0x88, 0x0a, 0x49, + 0x0b, 0x7a, 0x90, 0x04, 0xc0, 0x0f, 0x00, 0x2b, + 0x06, 0xd1, 0x3c, 0x00, 0x8c, 0xeb, 0x00, 0x00, + 0x12, 0x06, 0x92, 0x0e, 0x20, 0x2a, 0x00, 0xd1, + 0x01, 0x20, 0xc8, 0x60, 0x10, 0xbd, 0x00, 0x28, + 0xfc, 0xd1, 0x00, 0x22, 0x24, 0x21, 0x80, 0x20, + 0x04, 0xf0, 0x04, 0xfe, 0x10, 0xbd, 0x00, 0x00, + 0x04, 0x7a, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x1c, + 0x1f, 0x21, 0x80, 0x20, 0x04, 0xf0, 0xfa, 0xfd, + 0x80, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x1d, 0x4e, + 0x04, 0x1c, 0x30, 0x68, 0x3c, 0x00, 0xc8, 0xeb, + 0x00, 0x00, 0x1d, 0x1c, 0x47, 0x68, 0x20, 0x1c, + 0xf1, 0xf7, 0x0a, 0xfc, 0xfb, 0xf7, 0x87, 0xfa, + 0x00, 0x28, 0x04, 0xd0, 0x28, 0x1c, 0xf2, 0xf7, + 0x2a, 0xfb, 0x00, 0x28, 0x28, 0xd1, 0x20, 0x88, + 0x40, 0x05, 0x25, 0xd4, 0x30, 0x68, 0x00, 0x68, + 0xfe, 0xf7, 0x59, 0xf9, 0x00, 0x28, 0x03, 0xd1, + 0xfd, 0xf7, 0x89, 0xfa, 0xf1, 0xf7, 0xed, 0xfb, + 0x30, 0x68, 0x00, 0x25, 0x40, 0x68, 0x3c, 0x00, + 0x04, 0xec, 0x00, 0x00, 0x00, 0x28, 0x03, 0xd0, + 0xfd, 0xf7, 0x64, 0xfb, 0x30, 0x68, 0x45, 0x60, + 0x20, 0x88, 0x00, 0x09, 0x00, 0x07, 0x03, 0xd1, + 0x04, 0xf0, 0xc8, 0xf8, 0x61, 0x88, 0x45, 0x18, + 0x30, 0x68, 0x45, 0x61, 0x81, 0x6a, 0x01, 0x31, + 0x81, 0x62, 0x20, 0x88, 0x80, 0x04, 0xc1, 0x0f, + 0x02, 0x48, 0xf8, 0xf7, 0xcd, 0xff, 0xf8, 0xbd, + 0x14, 0x7a, 0x01, 0x00, 0xb1, 0xeb, 0x00, 0x00, + 0x3c, 0x00, 0x40, 0xec, 0x00, 0x00, 0xb0, 0xb5, + 0x0e, 0x4c, 0x05, 0x1c, 0x60, 0x68, 0xfc, 0xf7, + 0xf6, 0xfd, 0x0c, 0x48, 0x61, 0x68, 0x00, 0xf0, + 0x92, 0xfb, 0x00, 0x21, 0x24, 0x20, 0x04, 0xf0, + 0xec, 0xfc, 0x00, 0x22, 0xd2, 0x43, 0x80, 0x21, + 0x24, 0x20, 0x04, 0xf0, 0xb8, 0xfc, 0x00, 0x20, + 0xe0, 0x60, 0x20, 0x72, 0x20, 0x68, 0x01, 0x68, + 0x28, 0x06, 0x00, 0x0e, 0xf1, 0xf7, 0xb0, 0xfb, + 0xb0, 0xbd, 0x3c, 0x00, 0x7c, 0xec, 0x00, 0x00, + 0x04, 0x7a, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, + 0x10, 0xb5, 0x04, 0x1c, 0xc0, 0x68, 0xf2, 0xf7, + 0x85, 0xfc, 0x20, 0x1c, 0xf2, 0xf7, 0xb0, 0xfd, + 0x10, 0xbd, 0x00, 0x00, 0x70, 0xb5, 0x1c, 0x4e, + 0x05, 0x1c, 0xb0, 0x7a, 0x2c, 0x1c, 0x40, 0x34, + 0x02, 0x28, 0x26, 0xd1, 0xa0, 0x8b, 0x31, 0x89, + 0x88, 0x42, 0x22, 0xd1, 0x30, 0x68, 0x41, 0x6a, + 0x00, 0x29, 0x08, 0xd0, 0x3c, 0x00, 0xb8, 0xec, + 0x00, 0x00, 0x20, 0x30, 0x00, 0x7b, 0xc0, 0x07, + 0x04, 0xd5, 0x01, 0x20, 0x01, 0xf0, 0x2f, 0xfd, + 0x00, 0x28, 0x18, 0xd1, 0x60, 0x78, 0x00, 0x28, + 0x09, 0xd1, 0x30, 0x68, 0x02, 0x23, 0x20, 0x30, + 0x02, 0x7b, 0x0d, 0x49, 0x52, 0x08, 0x52, 0x00, + 0x1a, 0x43, 0x02, 0x73, 0x01, 0xe0, 0xff, 0x21, + 0xf5, 0x31, 0x01, 0x22, 0x1f, 0x20, 0x04, 0xf0, + 0x6e, 0xfc, 0x03, 0x20, 0xb0, 0x72, 0x3c, 0x00, + 0xf4, 0xec, 0x00, 0x00, 0x02, 0xe0, 0x28, 0x1c, + 0xff, 0xf7, 0xc4, 0xff, 0x60, 0x78, 0x00, 0x28, + 0x03, 0xd1, 0x29, 0x1c, 0x01, 0x20, 0x03, 0xf0, + 0x29, 0xfb, 0x70, 0xbd, 0x14, 0x7a, 0x01, 0x00, + 0x50, 0xc3, 0x00, 0x00, 0xb0, 0xb5, 0x04, 0x1c, + 0x60, 0x34, 0xe0, 0x79, 0x0e, 0x4d, 0x00, 0x28, + 0x0a, 0xd1, 0x02, 0x20, 0xa8, 0x72, 0x28, 0x68, + 0x40, 0x68, 0x00, 0x28, 0x04, 0xd1, 0x0b, 0x48, + 0x3c, 0x00, 0x30, 0xed, 0x00, 0x00, 0xfd, 0xf7, + 0xd0, 0xfa, 0x29, 0x68, 0x48, 0x60, 0x04, 0xf0, + 0x38, 0xf8, 0x29, 0x68, 0xc8, 0x61, 0xff, 0xf7, + 0xe0, 0xfe, 0x29, 0x68, 0x09, 0x69, 0x08, 0x1a, + 0x03, 0xf0, 0x6f, 0xff, 0x00, 0x28, 0x01, 0xd0, + 0xe0, 0x79, 0xa0, 0x71, 0xb0, 0xbd, 0x14, 0x7a, + 0x01, 0x00, 0xc1, 0xeb, 0x00, 0x00, 0xf8, 0xb5, + 0x04, 0x1c, 0x00, 0x26, 0x04, 0xf0, 0x21, 0xf8, + 0x05, 0x1c, 0x3c, 0x00, 0x6c, 0xed, 0x00, 0x00, + 0x22, 0x48, 0x00, 0x27, 0x07, 0x70, 0xa1, 0x07, + 0x04, 0xd0, 0xe1, 0x07, 0xc9, 0x0f, 0x01, 0x62, + 0xc5, 0x61, 0x01, 0x26, 0x41, 0x6b, 0x00, 0x29, + 0x34, 0xd1, 0x00, 0x2e, 0x32, 0xd0, 0x06, 0x1c, + 0xf9, 0xf7, 0x44, 0xff, 0x31, 0x6b, 0x1a, 0x4b, + 0x41, 0x1a, 0xa2, 0x07, 0x12, 0xd5, 0xda, 0x68, + 0x00, 0x2a, 0x08, 0xdd, 0x91, 0x42, 0x1a, 0x68, + 0x02, 0xda, 0x14, 0x09, 0x3c, 0x00, 0xa8, 0xed, + 0x00, 0x00, 0xa2, 0x18, 0x06, 0xe0, 0x14, 0x09, + 0x12, 0x1b, 0x03, 0xe0, 0x0a, 0x43, 0x02, 0xd1, + 0x1a, 0x68, 0x52, 0x00, 0x1a, 0x60, 0xb7, 0x63, + 0x0a, 0xe0, 0xb2, 0x6b, 0x01, 0x32, 0xb2, 0x63, + 0x02, 0x2a, 0x1a, 0x68, 0x01, 0xdd, 0x94, 0x08, + 0x00, 0xe0, 0x14, 0x09, 0x12, 0x1b, 0x1a, 0x60, + 0xd9, 0x60, 0x30, 0x63, 0xf5, 0x62, 0x18, 0x68, + 0x08, 0x49, 0x88, 0x42, 0x01, 0xd9, 0x3c, 0x00, + 0xe4, 0xed, 0x00, 0x00, 0x19, 0x60, 0x03, 0xe0, + 0x64, 0x28, 0x01, 0xd2, 0x64, 0x20, 0x18, 0x60, + 0xf5, 0xf7, 0xfc, 0xfd, 0xf8, 0xbd, 0x00, 0x00, + 0x60, 0x6c, 0x01, 0x00, 0xb0, 0x57, 0x01, 0x00, + 0x20, 0xa1, 0x07, 0x00, 0xfe, 0xb5, 0x04, 0x1c, + 0x00, 0x20, 0x50, 0x4d, 0x00, 0x21, 0x68, 0x61, + 0x20, 0x69, 0xfb, 0xf7, 0xb3, 0xfc, 0x07, 0x1c, + 0x20, 0x69, 0x03, 0x21, 0xfb, 0xf7, 0xae, 0xfc, + 0x3c, 0x00, 0x20, 0xee, 0x00, 0x00, 0x00, 0x28, + 0x03, 0xd0, 0x80, 0x78, 0x29, 0x78, 0x88, 0x42, + 0x63, 0xd1, 0x47, 0x4d, 0x20, 0x1c, 0x14, 0x30, + 0x39, 0x1c, 0x06, 0x1c, 0x2a, 0x78, 0x02, 0xf0, + 0x5a, 0xfa, 0x00, 0x28, 0x59, 0xd1, 0xe0, 0x68, + 0x05, 0x68, 0x41, 0x48, 0x01, 0x95, 0x58, 0x30, + 0x02, 0x90, 0xfb, 0xf7, 0x6a, 0xff, 0x3e, 0x4d, + 0x19, 0x35, 0x00, 0x28, 0x0b, 0xd0, 0x28, 0x1c, + 0xfb, 0xf7, 0x3c, 0x00, 0x5c, 0xee, 0x00, 0x00, + 0x55, 0xff, 0x00, 0x28, 0x1e, 0xd1, 0x31, 0x1c, + 0x28, 0x1c, 0xfb, 0xf7, 0x65, 0xff, 0x00, 0x28, + 0x42, 0xd0, 0x17, 0xe0, 0x28, 0x1c, 0xfb, 0xf7, + 0x49, 0xff, 0x00, 0x28, 0x06, 0xd0, 0x39, 0x1c, + 0x02, 0x98, 0xfb, 0xf7, 0x63, 0xff, 0x00, 0x28, + 0x36, 0xd0, 0x0b, 0xe0, 0x39, 0x1c, 0x02, 0x98, + 0xfb, 0xf7, 0x5c, 0xff, 0x00, 0x28, 0x2f, 0xd0, + 0x31, 0x1c, 0x28, 0x1c, 0x3c, 0x00, 0x98, 0xee, + 0x00, 0x00, 0xfb, 0xf7, 0x4c, 0xff, 0x00, 0x28, + 0x29, 0xd0, 0x30, 0x1c, 0xf6, 0xf7, 0xad, 0xfc, + 0x29, 0x4a, 0x18, 0x32, 0x11, 0x7c, 0x00, 0x29, + 0x04, 0xd0, 0x51, 0x6a, 0x00, 0x29, 0x01, 0xd0, + 0x00, 0x28, 0x1c, 0xd1, 0x90, 0x6a, 0x00, 0x28, + 0x3b, 0xd0, 0x13, 0x78, 0x01, 0x9d, 0x01, 0x21, + 0x6d, 0x89, 0x01, 0x20, 0x2b, 0x40, 0x9b, 0x07, + 0x11, 0xd0, 0xa3, 0x6b, 0x1e, 0x4e, 0x3c, 0x00, + 0xd4, 0xee, 0x00, 0x00, 0x1d, 0x1c, 0x7f, 0x35, + 0x98, 0x36, 0x00, 0x2d, 0x14, 0xd0, 0x55, 0x8a, + 0x00, 0x2d, 0x08, 0xd1, 0x55, 0x69, 0xab, 0x42, + 0x0f, 0xda, 0x00, 0x20, 0x17, 0x4d, 0x01, 0x23, + 0x6b, 0x61, 0x0a, 0xe0, 0x29, 0xe0, 0xf5, 0x78, + 0x02, 0x2d, 0x06, 0xd1, 0x14, 0x4f, 0x55, 0x69, + 0x3f, 0x68, 0xed, 0x19, 0xab, 0x42, 0x00, 0xda, + 0x00, 0x20, 0x23, 0x6c, 0x1d, 0x1c, 0x7f, 0x35, + 0x3c, 0x00, 0x10, 0xef, 0x00, 0x00, 0x10, 0xd0, + 0x55, 0x8a, 0x00, 0x2d, 0x03, 0xd1, 0x95, 0x69, + 0xab, 0x42, 0x0a, 0xd2, 0x08, 0xe0, 0xf5, 0x78, + 0x02, 0x2d, 0x06, 0xd1, 0x0b, 0x4e, 0x95, 0x69, + 0x36, 0x68, 0xad, 0x19, 0xab, 0x42, 0x00, 0xd2, + 0x00, 0x21, 0x08, 0x43, 0x08, 0xd0, 0x10, 0x6a, + 0x00, 0x28, 0x01, 0xd0, 0xf1, 0xf7, 0x4b, 0xfa, + 0x00, 0x21, 0x20, 0x1c, 0x01, 0xf0, 0xb9, 0xf9, + 0xfe, 0xbd, 0x3c, 0x00, 0x4c, 0xef, 0x00, 0x00, + 0xec, 0x65, 0x01, 0x00, 0xc4, 0x67, 0x01, 0x00, + 0xcc, 0x67, 0x01, 0x00, 0x3e, 0xb5, 0x05, 0x6a, + 0x04, 0x1c, 0xc0, 0x68, 0xf2, 0xf7, 0x34, 0xfb, + 0xe1, 0x69, 0xf2, 0xf7, 0x57, 0xfa, 0x20, 0x1c, + 0x40, 0x30, 0xc1, 0x8b, 0x04, 0x31, 0xc1, 0x83, + 0x2b, 0x69, 0x10, 0x49, 0x98, 0x79, 0x06, 0x28, + 0x0a, 0xd1, 0x98, 0x88, 0x01, 0x91, 0x02, 0x94, + 0x00, 0x90, 0x60, 0x69, 0x3c, 0x00, 0x88, 0xef, + 0x00, 0x00, 0x1b, 0x68, 0x01, 0x68, 0xe0, 0x68, + 0x03, 0x22, 0xc0, 0x68, 0x0a, 0xe0, 0x02, 0x28, + 0x0b, 0xd1, 0x10, 0x20, 0x00, 0x90, 0x01, 0x91, + 0x02, 0x94, 0xe0, 0x68, 0xa3, 0x69, 0xc0, 0x68, + 0x00, 0x22, 0x00, 0x21, 0xf7, 0xf7, 0x0f, 0xfb, + 0x3e, 0xbd, 0xf2, 0xf7, 0xa6, 0xf9, 0xfb, 0xe7, + 0x00, 0x00, 0xbd, 0xef, 0x00, 0x00, 0x80, 0xb5, + 0xd1, 0x68, 0x50, 0x69, 0xc9, 0x68, 0x3c, 0x00, + 0xc4, 0xef, 0x00, 0x00, 0xc1, 0x60, 0xd1, 0x68, + 0xc8, 0x60, 0x11, 0x1c, 0x40, 0x31, 0xcb, 0x8b, + 0x00, 0x89, 0x18, 0x18, 0xc8, 0x83, 0x10, 0x68, + 0x00, 0x28, 0x02, 0xd0, 0xff, 0xf7, 0xbc, 0xff, + 0x80, 0xbd, 0x03, 0x48, 0xfb, 0xf7, 0xcc, 0xf8, + 0x00, 0x6a, 0xfe, 0xf7, 0xf5, 0xf9, 0x80, 0xbd, + 0xa0, 0x6a, 0x01, 0x00, 0xf8, 0xb5, 0x06, 0x1c, + 0x0a, 0x24, 0x30, 0x07, 0x01, 0x09, 0xa0, 0x07, + 0x3c, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x01, 0x43, + 0x0f, 0x1c, 0x0a, 0x4d, 0x2f, 0x60, 0x04, 0xf0, + 0xfa, 0xfe, 0xad, 0x68, 0x28, 0x01, 0x00, 0x0f, + 0xb0, 0x42, 0x05, 0xd0, 0x01, 0x3c, 0xf4, 0xd2, + 0x01, 0x21, 0x9b, 0x20, 0xf2, 0xf7, 0x41, 0xf9, + 0x28, 0x02, 0x00, 0x0a, 0x08, 0x2e, 0x01, 0xd1, + 0x31, 0x05, 0x08, 0x43, 0xf8, 0xbd, 0x60, 0x00, + 0x07, 0x00, 0x01, 0x22, 0xd2, 0x05, 0x80, 0xb5, + 0x00, 0x21, 0x3c, 0x00, 0x3c, 0xf0, 0x00, 0x00, + 0x04, 0x20, 0x04, 0xf0, 0xdd, 0xfc, 0x0f, 0x20, + 0xff, 0xf7, 0xd6, 0xff, 0x0f, 0x21, 0x09, 0x04, + 0x08, 0x40, 0x00, 0x0c, 0x80, 0xbd, 0x00, 0x00, + 0x80, 0xb5, 0x05, 0x48, 0xfd, 0xf7, 0x4a, 0xf9, + 0x04, 0x48, 0xfd, 0xf7, 0x7b, 0xf8, 0x04, 0x48, + 0xfd, 0xf7, 0x6c, 0xf8, 0x80, 0xbd, 0x00, 0x00, + 0x89, 0x34, 0x01, 0x00, 0xed, 0x24, 0x00, 0x00, + 0x11, 0x1c, 0x00, 0x00, 0x3c, 0x00, 0x78, 0xf0, + 0x00, 0x00, 0x80, 0xb5, 0x02, 0x48, 0xf3, 0xf7, + 0x2a, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0xd1, 0x24, + 0x00, 0x00, 0x80, 0xb5, 0xf2, 0xf7, 0x53, 0xf9, + 0x80, 0xbd, 0x80, 0xb5, 0x00, 0x21, 0x00, 0x20, + 0x01, 0xf0, 0x51, 0xfe, 0x03, 0x20, 0x02, 0xf0, + 0x46, 0xff, 0x80, 0xbd, 0x00, 0x00, 0x06, 0x48, + 0x80, 0xb5, 0xc1, 0x69, 0x00, 0x29, 0x06, 0xd1, + 0x01, 0x6a, 0x00, 0x29, 0x03, 0xd1, 0x3c, 0x00, + 0xb4, 0xf0, 0x00, 0x00, 0x81, 0x6b, 0x03, 0x48, + 0x00, 0xf0, 0x5e, 0xf9, 0x80, 0xbd, 0x00, 0x00, + 0xc4, 0x69, 0x01, 0x00, 0x34, 0x63, 0x01, 0x00, + 0x10, 0xb5, 0x04, 0x4c, 0x20, 0x6a, 0xfc, 0xf7, + 0xb3, 0xfb, 0x03, 0x48, 0x21, 0x6a, 0x00, 0xf0, + 0x4f, 0xf9, 0x10, 0xbd, 0x1c, 0x75, 0x01, 0x00, + 0x34, 0x63, 0x01, 0x00, 0xb0, 0xb5, 0x0d, 0x4c, + 0x20, 0x7c, 0x00, 0x28, 0x02, 0xd0, 0x01, 0x21, + 0x3c, 0x00, 0xf0, 0xf0, 0x00, 0x00, 0xfd, 0xf7, + 0x86, 0xf9, 0x00, 0x25, 0x25, 0x70, 0xa0, 0x68, + 0x01, 0x28, 0x03, 0xd1, 0x00, 0x20, 0xa5, 0x60, + 0x01, 0xf0, 0x8f, 0xf8, 0xa0, 0x78, 0x01, 0x28, + 0x05, 0xd1, 0x03, 0x48, 0x98, 0x38, 0x00, 0x69, + 0xfc, 0xf7, 0xef, 0xfb, 0xa5, 0x70, 0xb0, 0xbd, + 0x00, 0x00, 0x84, 0x66, 0x01, 0x00, 0x80, 0xb5, + 0x00, 0x21, 0x01, 0x20, 0x01, 0xf0, 0x09, 0xfe, + 0x80, 0xbd, 0x3c, 0x00, 0x2c, 0xf1, 0x00, 0x00, + 0x38, 0xb5, 0x69, 0x46, 0x00, 0x25, 0xf8, 0xf7, + 0xb7, 0xfe, 0x04, 0x1c, 0x01, 0xd1, 0x01, 0x20, + 0x38, 0xbd, 0xa0, 0x68, 0x00, 0x28, 0x04, 0xd0, + 0x00, 0x99, 0xa1, 0x31, 0x08, 0x20, 0x04, 0xf0, + 0x73, 0xfa, 0x1c, 0x21, 0x20, 0x1c, 0xf1, 0xf7, + 0xa3, 0xf9, 0x28, 0x1c, 0xf0, 0xe7, 0x00, 0x00, + 0xfe, 0xb5, 0x07, 0x1c, 0x4c, 0x23, 0x39, 0x49, + 0x58, 0x43, 0x44, 0x18, 0x3c, 0x00, 0x68, 0xf1, + 0x00, 0x00, 0x25, 0x1c, 0x40, 0x35, 0x28, 0x7a, + 0x37, 0x49, 0x48, 0x76, 0x21, 0x1c, 0x30, 0x31, + 0x02, 0x91, 0x0c, 0x23, 0xc8, 0x56, 0x42, 0x1c, + 0x0a, 0x73, 0x49, 0x7b, 0x88, 0x42, 0x46, 0xda, + 0x32, 0x48, 0x00, 0x78, 0x80, 0x07, 0x3e, 0xd5, + 0x00, 0x20, 0x01, 0x90, 0xf6, 0xf7, 0xaf, 0xfa, + 0x00, 0x28, 0x2e, 0xd0, 0xac, 0x21, 0x09, 0x58, + 0x00, 0x29, 0x01, 0xd0, 0xe4, 0x30, 0x3c, 0x00, + 0xa4, 0xf1, 0x00, 0x00, 0x00, 0xe0, 0xcc, 0x30, + 0x06, 0x1c, 0x40, 0x68, 0x00, 0x28, 0x25, 0xd0, + 0x02, 0x99, 0x08, 0x7b, 0x01, 0x28, 0x11, 0xd1, + 0x20, 0x1c, 0x2e, 0x30, 0x29, 0x78, 0xf6, 0xf7, + 0xed, 0xf9, 0x71, 0x68, 0x03, 0xe0, 0x72, 0x18, + 0x12, 0x7a, 0x82, 0x42, 0x03, 0xd9, 0xff, 0x31, + 0x09, 0x06, 0x09, 0x0e, 0xf7, 0xd1, 0xa9, 0x70, + 0x01, 0x20, 0x01, 0x90, 0x23, 0x1c, 0x3e, 0x33, + 0x3c, 0x00, 0xe0, 0xf1, 0x00, 0x00, 0x1a, 0x1d, + 0x30, 0x1c, 0x00, 0x97, 0x01, 0x99, 0xf8, 0xf7, + 0x58, 0xfa, 0x00, 0x28, 0x11, 0xd0, 0xa8, 0x78, + 0x80, 0x19, 0x00, 0x7a, 0x00, 0xe0, 0x00, 0x20, + 0x68, 0x70, 0x68, 0x78, 0x01, 0x21, 0xfb, 0xf7, + 0xe0, 0xfd, 0x60, 0x60, 0x38, 0x1c, 0x01, 0xf0, + 0x14, 0xfe, 0x38, 0x1c, 0x01, 0xf0, 0xa5, 0xfb, + 0xfe, 0xbd, 0x02, 0x99, 0x08, 0x7b, 0xff, 0x30, + 0x48, 0x73, 0x3c, 0x00, 0x1c, 0xf2, 0x00, 0x00, + 0x38, 0x1c, 0xfc, 0xf7, 0x19, 0xfc, 0x03, 0xf0, + 0xc3, 0xfd, 0x06, 0x1c, 0xfb, 0xf7, 0x8e, 0xfe, + 0x41, 0x00, 0x76, 0x18, 0x68, 0x78, 0x61, 0x68, + 0xfb, 0xf7, 0x6a, 0xfe, 0x31, 0x18, 0x20, 0x8d, + 0x3b, 0x1c, 0x05, 0x4a, 0x03, 0xf0, 0x12, 0xfe, + 0xe5, 0xe7, 0x00, 0x00, 0x58, 0xe3, 0x01, 0x00, + 0x30, 0x80, 0x07, 0x00, 0x1d, 0x75, 0x01, 0x00, + 0xd5, 0x4e, 0x00, 0x00, 0x3c, 0x00, 0x58, 0xf2, + 0x00, 0x00, 0x03, 0x1c, 0x04, 0x48, 0x80, 0xb5, + 0x02, 0x79, 0x20, 0x30, 0x03, 0x49, 0x00, 0xf0, + 0x30, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0xac, 0x7c, + 0x01, 0x00, 0xc4, 0x67, 0x01, 0x00, 0x03, 0x1c, + 0x04, 0x48, 0x80, 0xb5, 0xc2, 0x78, 0x38, 0x30, + 0x03, 0x49, 0x00, 0xf0, 0x22, 0xf8, 0x80, 0xbd, + 0x00, 0x00, 0xac, 0x7c, 0x01, 0x00, 0xc8, 0x67, + 0x01, 0x00, 0x03, 0x1c, 0x04, 0x48, 0x3c, 0x00, + 0x94, 0xf2, 0x00, 0x00, 0x80, 0xb5, 0x82, 0x79, + 0x50, 0x30, 0x03, 0x49, 0x00, 0xf0, 0x14, 0xf8, + 0x80, 0xbd, 0x00, 0x00, 0xac, 0x7c, 0x01, 0x00, + 0xcc, 0x67, 0x01, 0x00, 0x03, 0x1c, 0x04, 0x48, + 0x80, 0xb5, 0x42, 0x79, 0x68, 0x30, 0x03, 0x49, + 0x00, 0xf0, 0x06, 0xf8, 0x80, 0xbd, 0x00, 0x00, + 0xac, 0x7c, 0x01, 0x00, 0xd0, 0x67, 0x01, 0x00, + 0x10, 0xb5, 0x00, 0x24, 0x84, 0x80, 0x0b, 0x60, + 0x3c, 0x00, 0xd0, 0xf2, 0x00, 0x00, 0x19, 0x1c, + 0x51, 0x43, 0x01, 0x60, 0x19, 0x06, 0x09, 0x16, + 0x10, 0x22, 0x06, 0x30, 0xf1, 0xf7, 0x9f, 0xf9, + 0x10, 0xbd, 0xb0, 0xb5, 0x06, 0x4d, 0x00, 0x24, + 0xac, 0x60, 0xec, 0x60, 0xec, 0x61, 0x2c, 0x62, + 0x02, 0xf0, 0xf1, 0xfc, 0x00, 0xf0, 0x0d, 0xf8, + 0xec, 0x62, 0x2c, 0x70, 0xb0, 0xbd, 0x44, 0x7d, + 0x01, 0x00, 0x80, 0xb5, 0x80, 0x21, 0x01, 0x48, + 0xf1, 0xf7, 0x3c, 0x00, 0x0c, 0xf3, 0x00, 0x00, + 0xc7, 0xf8, 0x80, 0xbd, 0x04, 0x66, 0x01, 0x00, + 0xf8, 0xb5, 0x07, 0x4f, 0x00, 0x24, 0x00, 0x26, + 0x18, 0x20, 0x60, 0x43, 0xc5, 0x19, 0xee, 0x60, + 0x03, 0xf0, 0x42, 0xfd, 0x10, 0x35, 0x01, 0x34, + 0x02, 0x2c, 0x41, 0xc5, 0xf4, 0xdb, 0xf8, 0xbd, + 0xb8, 0x7d, 0x01, 0x00, 0x00, 0x23, 0x03, 0x60, + 0x04, 0x4b, 0x00, 0x29, 0x00, 0xd1, 0x19, 0x1c, + 0x41, 0x60, 0x00, 0x2a, 0x3c, 0x00, 0x48, 0xf3, + 0x00, 0x00, 0x00, 0xd1, 0x1a, 0x1c, 0x82, 0x60, + 0x70, 0x47, 0xbd, 0x75, 0x00, 0x00, 0x10, 0xb5, + 0x07, 0x4c, 0x20, 0x68, 0x01, 0x30, 0x20, 0x60, + 0x20, 0x28, 0x03, 0xd9, 0x58, 0x21, 0x58, 0x20, + 0xf1, 0xf7, 0x9d, 0xff, 0x21, 0x68, 0x01, 0x20, + 0x01, 0x39, 0x88, 0x40, 0x10, 0xbd, 0x60, 0x5b, + 0x01, 0x00, 0xb0, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, + 0x21, 0x68, 0x00, 0x20, 0x00, 0x29, 0x3c, 0x00, + 0x84, 0xf3, 0x00, 0x00, 0x0a, 0xd0, 0xa9, 0x43, + 0x21, 0x60, 0x07, 0xd1, 0xa0, 0x68, 0xf1, 0xf7, + 0x23, 0xf8, 0x00, 0x28, 0x02, 0xd1, 0x21, 0x68, + 0x29, 0x43, 0x21, 0x60, 0xb0, 0xbd, 0x00, 0x00, + 0xb0, 0xb5, 0x0d, 0x1c, 0x04, 0x1c, 0x21, 0x68, + 0x00, 0x20, 0x29, 0x43, 0x21, 0x60, 0xa9, 0x42, + 0x07, 0xd1, 0x60, 0x68, 0xf1, 0xf7, 0x10, 0xf8, + 0x00, 0x28, 0x02, 0xd1, 0x21, 0x68, 0xa9, 0x43, + 0x3c, 0x00, 0xc0, 0xf3, 0x00, 0x00, 0x21, 0x60, + 0xb0, 0xbd, 0x1a, 0x4b, 0xb0, 0xb5, 0x9a, 0x6a, + 0x00, 0x28, 0x0b, 0xd0, 0x00, 0x2a, 0x07, 0xdb, + 0xb8, 0x24, 0x24, 0x58, 0x01, 0x3c, 0xa4, 0x1a, + 0x00, 0x19, 0xb0, 0x30, 0x00, 0x7b, 0x02, 0xe0, + 0x0e, 0x20, 0x00, 0xe0, 0x0d, 0x20, 0x5d, 0x6a, + 0x12, 0x4c, 0x00, 0x2d, 0x01, 0xd0, 0x20, 0x78, + 0x00, 0xe0, 0x20, 0x5c, 0xff, 0x24, 0xa8, 0x34, + 0xc4, 0x40, 0x3c, 0x00, 0xfc, 0xf3, 0x00, 0x00, + 0x9c, 0x60, 0xf5, 0x24, 0xc4, 0x40, 0x9c, 0x61, + 0xfd, 0x24, 0xc4, 0x40, 0xdc, 0x61, 0xff, 0x24, + 0x29, 0x34, 0xc4, 0x40, 0x5c, 0x61, 0xff, 0x24, + 0x53, 0x34, 0xc4, 0x40, 0x00, 0x20, 0x0c, 0x33, + 0x11, 0xc3, 0x00, 0x29, 0x05, 0xd0, 0x00, 0x2a, + 0x03, 0xdc, 0x02, 0x21, 0x50, 0x42, 0x00, 0xf0, + 0x65, 0xfb, 0xb0, 0xbd, 0xac, 0x7e, 0x01, 0x00, + 0xb8, 0x52, 0x01, 0x00, 0x3c, 0x00, 0x38, 0xf4, + 0x00, 0x00, 0x10, 0xb5, 0x13, 0x4c, 0x13, 0x48, + 0x21, 0x1c, 0xff, 0x31, 0x69, 0x31, 0x0e, 0xc9, + 0x0e, 0xc0, 0x21, 0x1c, 0xff, 0x31, 0x24, 0x22, + 0x75, 0x31, 0x0f, 0x48, 0xf1, 0xf7, 0x51, 0xf8, + 0x21, 0x1c, 0xff, 0x31, 0x3c, 0x22, 0x99, 0x31, + 0x0d, 0x48, 0xf1, 0xf7, 0xa6, 0xf8, 0xfc, 0xf7, + 0xa2, 0xff, 0x21, 0x1c, 0xff, 0x31, 0x10, 0x22, + 0xd5, 0x31, 0x09, 0x48, 0xf1, 0xf7, 0x3c, 0x00, + 0x74, 0xf4, 0x00, 0x00, 0x41, 0xf8, 0x21, 0x1c, + 0xff, 0x31, 0x28, 0x22, 0xe5, 0x31, 0x07, 0x48, + 0xf1, 0xf7, 0x96, 0xf8, 0x10, 0xbd, 0x00, 0x00, + 0x40, 0x63, 0x01, 0x00, 0x00, 0x80, 0x07, 0x00, + 0x0c, 0x80, 0x07, 0x00, 0x30, 0x80, 0x07, 0x00, + 0x80, 0x80, 0x07, 0x00, 0xa0, 0x80, 0x07, 0x00, + 0xf8, 0xb5, 0x00, 0x28, 0x59, 0xd0, 0x04, 0xf0, + 0x4b, 0xf9, 0xf8, 0xf7, 0xb3, 0xfb, 0x00, 0x22, + 0x3c, 0x00, 0xb0, 0xf4, 0x00, 0x00, 0x01, 0x21, + 0x13, 0x20, 0x04, 0xf0, 0x7c, 0xf9, 0x2a, 0x49, + 0x29, 0x48, 0x49, 0x6c, 0x01, 0x60, 0x00, 0x21, + 0x29, 0x48, 0xc9, 0x43, 0x41, 0x60, 0x26, 0x4c, + 0x14, 0x34, 0x61, 0x6c, 0x81, 0x60, 0xa1, 0x6c, + 0xc1, 0x60, 0x00, 0x20, 0x25, 0x4d, 0x02, 0x26, + 0x01, 0x01, 0x6e, 0x50, 0x0a, 0x19, 0x4f, 0x19, + 0x50, 0x32, 0x04, 0x37, 0x0e, 0xca, 0x01, 0x30, + 0x08, 0x28, 0x3c, 0x00, 0xec, 0xf4, 0x00, 0x00, + 0x0e, 0xc7, 0xf4, 0xdb, 0x14, 0x22, 0x21, 0x1c, + 0xcc, 0x31, 0x1e, 0x48, 0xf1, 0xf7, 0x5a, 0xf8, + 0x1d, 0x48, 0x81, 0x78, 0x09, 0x09, 0x09, 0x01, + 0x81, 0x70, 0x00, 0x21, 0xc1, 0x70, 0x41, 0x70, + 0x21, 0x1c, 0xe0, 0x31, 0x0a, 0x78, 0x02, 0x70, + 0x49, 0x78, 0x41, 0x70, 0x21, 0x1c, 0xe8, 0x31, + 0x30, 0x22, 0x08, 0x30, 0xf1, 0xf7, 0x46, 0xf8, + 0x21, 0x1c, 0xff, 0x31, 0x3c, 0x00, 0x28, 0xf5, + 0x00, 0x00, 0x50, 0x22, 0x19, 0x31, 0x12, 0x48, + 0xf1, 0xf7, 0x3f, 0xf8, 0x83, 0x20, 0x80, 0x00, + 0x14, 0x22, 0x21, 0x18, 0x10, 0x48, 0xf1, 0xf7, + 0x38, 0xf8, 0x11, 0x20, 0x40, 0x01, 0x84, 0x22, + 0x21, 0x18, 0x0d, 0x48, 0xf1, 0xf7, 0x31, 0xf8, + 0xff, 0xf7, 0x73, 0xff, 0x20, 0x1c, 0xf1, 0xf7, + 0x28, 0xfd, 0xf8, 0xbd, 0xff, 0xf7, 0x6d, 0xff, + 0xfb, 0xe7, 0x08, 0x20, 0x07, 0x00, 0x3c, 0x00, + 0x64, 0xf5, 0x00, 0x00, 0x2c, 0x63, 0x01, 0x00, + 0x40, 0x20, 0x07, 0x00, 0x00, 0x30, 0x07, 0x00, + 0x00, 0x40, 0x07, 0x00, 0x00, 0x50, 0x07, 0x00, + 0x00, 0x60, 0x07, 0x00, 0x10, 0x00, 0x07, 0x00, + 0x00, 0x90, 0x07, 0x00, 0xf8, 0xb5, 0x05, 0x1c, + 0x18, 0x48, 0xc0, 0x68, 0x00, 0x28, 0x25, 0xd0, + 0x16, 0x4e, 0x01, 0x36, 0x74, 0x78, 0x30, 0x78, + 0x27, 0x1a, 0x79, 0x19, 0x20, 0x1c, 0xf1, 0xf7, + 0x3c, 0x00, 0xa0, 0xf5, 0x00, 0x00, 0x4b, 0xf8, + 0x00, 0x90, 0x29, 0x1c, 0x20, 0x1c, 0xf1, 0xf7, + 0xb2, 0xf8, 0xc1, 0x19, 0x20, 0x1c, 0xf1, 0xf7, + 0x42, 0xf8, 0x60, 0x1a, 0x30, 0x70, 0x70, 0x1e, + 0x80, 0x68, 0x00, 0x28, 0x0d, 0xd0, 0x53, 0x36, + 0xf4, 0x78, 0x00, 0x99, 0x20, 0x1c, 0xf1, 0xf7, + 0xa2, 0xf8, 0xb1, 0x78, 0x61, 0x1a, 0x41, 0x18, + 0x20, 0x1c, 0xf1, 0xf7, 0x9c, 0xf8, 0x60, 0x1a, + 0xb0, 0x70, 0x3c, 0x00, 0xdc, 0xf5, 0x00, 0x00, + 0x03, 0x48, 0x5c, 0x30, 0x01, 0x69, 0xc2, 0x68, + 0x69, 0x43, 0x51, 0x18, 0xc1, 0x60, 0xf8, 0xbd, + 0x44, 0x7d, 0x01, 0x00, 0xb0, 0xb5, 0x0c, 0x4d, + 0xe8, 0x68, 0x29, 0x69, 0x40, 0x18, 0x7d, 0x21, + 0x09, 0x01, 0x44, 0x18, 0x20, 0x1c, 0x03, 0xf0, + 0x0b, 0xfb, 0x00, 0x28, 0x0a, 0xd0, 0x03, 0xf0, + 0xcf, 0xfb, 0x01, 0x1b, 0x28, 0x69, 0xf1, 0xf7, + 0x7d, 0xf8, 0x01, 0x30, 0x3c, 0x00, 0x18, 0xf6, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x0c, 0xff, 0xf7, + 0xb2, 0xff, 0xb0, 0xbd, 0x00, 0x00, 0xa0, 0x7d, + 0x01, 0x00, 0x70, 0xb5, 0x10, 0x4c, 0x60, 0x68, + 0x80, 0x25, 0xa8, 0x43, 0x60, 0x60, 0x20, 0x68, + 0x28, 0x43, 0x20, 0x60, 0x0d, 0x4e, 0x30, 0x1c, + 0x10, 0x30, 0xf3, 0xf7, 0xc8, 0xfc, 0x00, 0x28, + 0x03, 0xd1, 0x07, 0x21, 0x85, 0x20, 0xf1, 0xf7, + 0x2a, 0xfe, 0x08, 0x48, 0x00, 0x21, 0x3c, 0x00, + 0x54, 0xf6, 0x00, 0x00, 0x80, 0x68, 0x41, 0x63, + 0xc0, 0x6c, 0x10, 0x30, 0x70, 0x61, 0x01, 0x20, + 0x30, 0x61, 0x20, 0x68, 0xa8, 0x43, 0x20, 0x60, + 0x70, 0xbd, 0x00, 0x00, 0xf4, 0x00, 0x07, 0x00, + 0x00, 0x30, 0x07, 0x00, 0x24, 0x7e, 0x01, 0x00, + 0x01, 0x1c, 0x00, 0x20, 0x05, 0x29, 0x80, 0xb5, + 0x09, 0xd2, 0x02, 0xa3, 0x5b, 0x5c, 0x5b, 0x00, + 0x9f, 0x44, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, + 0x3c, 0x00, 0x90, 0xf6, 0x00, 0x00, 0x03, 0x00, + 0xff, 0xf7, 0xcf, 0xfc, 0x80, 0xbd, 0x01, 0x22, + 0x92, 0x02, 0x80, 0xb5, 0x00, 0x21, 0x07, 0x20, + 0x04, 0xf0, 0xab, 0xf9, 0x80, 0xbd, 0x80, 0xb5, + 0x40, 0x22, 0x00, 0x21, 0x00, 0x20, 0x04, 0xf0, + 0xa4, 0xf9, 0x03, 0x22, 0x00, 0x21, 0x00, 0x20, + 0x04, 0xf0, 0x9f, 0xf9, 0x80, 0xbd, 0x70, 0xb5, + 0x0e, 0x1c, 0x05, 0x1c, 0x14, 0x1c, 0x08, 0x28, + 0x0e, 0xd1, 0x3c, 0x00, 0xcc, 0xf6, 0x00, 0x00, + 0x00, 0xf0, 0x00, 0xfc, 0x0e, 0x28, 0x01, 0xd1, + 0x14, 0x20, 0x00, 0xe0, 0x10, 0x20, 0xe1, 0x03, + 0x00, 0xd5, 0x01, 0x38, 0xc0, 0x06, 0x0a, 0x49, + 0xc0, 0x0e, 0x88, 0x71, 0x08, 0xe0, 0x09, 0x2d, + 0x06, 0xd1, 0xa0, 0x04, 0x01, 0xd5, 0x00, 0x20, + 0x00, 0xe0, 0x01, 0x20, 0xf3, 0xf7, 0xb0, 0xf9, + 0x34, 0x40, 0x21, 0x1c, 0x32, 0x1c, 0x28, 0x1c, + 0x04, 0xf0, 0x7a, 0xf9, 0x3c, 0x00, 0x08, 0xf7, + 0x00, 0x00, 0x70, 0xbd, 0x00, 0x00, 0x00, 0x80, + 0x07, 0x00, 0x70, 0xb5, 0x00, 0x24, 0x13, 0x29, + 0x11, 0xd8, 0x00, 0x28, 0x01, 0xd1, 0x08, 0x4e, + 0x08, 0x25, 0x01, 0x28, 0x01, 0xd1, 0x07, 0x4e, + 0x09, 0x25, 0x00, 0xf0, 0x78, 0xfa, 0x00, 0x28, + 0x05, 0xd0, 0x02, 0x1c, 0x31, 0x1c, 0x28, 0x1c, + 0xff, 0xf7, 0xc3, 0xff, 0x01, 0x24, 0x20, 0x1c, + 0x70, 0xbd, 0xf8, 0xff, 0x07, 0x00, 0x3c, 0x00, + 0x44, 0xf7, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, + 0x01, 0x22, 0xd2, 0x02, 0x80, 0xb5, 0x00, 0x21, + 0x07, 0x20, 0x04, 0xf0, 0x53, 0xf9, 0x80, 0xbd, + 0x0f, 0x22, 0x12, 0x04, 0x07, 0x21, 0x49, 0x04, + 0x80, 0xb5, 0x09, 0x20, 0x04, 0xf0, 0x4a, 0xf9, + 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x00, 0x21, + 0x04, 0x20, 0x04, 0xf0, 0x1b, 0xfc, 0x40, 0x21, + 0x00, 0x20, 0x04, 0xf0, 0x17, 0xfc, 0x04, 0x49, + 0x3c, 0x00, 0x80, 0xf7, 0x00, 0x00, 0x00, 0x20, + 0x88, 0x60, 0x02, 0x48, 0x09, 0x69, 0x20, 0x30, + 0xff, 0xf7, 0x09, 0xfe, 0x80, 0xbd, 0x64, 0x73, + 0x01, 0x00, 0xb0, 0xb5, 0x60, 0x21, 0x00, 0x20, + 0x04, 0xf0, 0x07, 0xfc, 0x11, 0x4d, 0x00, 0x24, + 0x00, 0x22, 0x04, 0x20, 0x29, 0x5d, 0x04, 0xf0, + 0x28, 0xf9, 0x0c, 0x20, 0x03, 0xf0, 0x9b, 0xfb, + 0x01, 0x34, 0x24, 0x06, 0x24, 0x0e, 0x05, 0x2c, + 0xf2, 0xd3, 0x3c, 0x00, 0xbc, 0xf7, 0x00, 0x00, + 0x0f, 0x22, 0x00, 0x21, 0x0a, 0x20, 0x04, 0xf0, + 0x1b, 0xf9, 0x61, 0x21, 0x00, 0x20, 0x04, 0xf0, + 0xef, 0xfb, 0x06, 0x49, 0x01, 0x20, 0x88, 0x60, + 0x04, 0x48, 0x09, 0x69, 0x20, 0x30, 0xff, 0xf7, + 0xcd, 0xfd, 0xff, 0x20, 0x2d, 0x30, 0xb0, 0xbd, + 0xa8, 0x58, 0x01, 0x00, 0x64, 0x73, 0x01, 0x00, + 0xf8, 0xb5, 0x06, 0x1c, 0x12, 0x48, 0xc6, 0x70, + 0x01, 0x20, 0xff, 0xf7, 0x3c, 0x00, 0xf8, 0xf7, + 0x00, 0x00, 0xfd, 0xfb, 0x01, 0x27, 0xbf, 0x02, + 0x04, 0x1c, 0xb8, 0x43, 0x01, 0x1c, 0x01, 0x20, + 0x04, 0xf0, 0xd1, 0xfb, 0x03, 0x20, 0xff, 0xf7, + 0xf2, 0xfb, 0x05, 0x1c, 0xb8, 0x43, 0x01, 0x1c, + 0x03, 0x20, 0x04, 0xf0, 0xc8, 0xfb, 0x30, 0x1c, + 0x00, 0xf0, 0x9f, 0xf9, 0x00, 0xf0, 0x57, 0xf8, + 0x21, 0x1c, 0x01, 0x20, 0x04, 0xf0, 0xbf, 0xfb, + 0x29, 0x1c, 0x03, 0x20, 0x04, 0xf0, 0x3c, 0x00, + 0x34, 0xf8, 0x00, 0x00, 0xbb, 0xfb, 0x00, 0x20, + 0xf8, 0xbd, 0x00, 0x00, 0x64, 0x73, 0x01, 0x00, + 0x80, 0xb5, 0x00, 0x22, 0x40, 0x21, 0x00, 0x20, + 0x04, 0xf0, 0xd8, 0xf8, 0x80, 0xbd, 0x00, 0x00, + 0x70, 0xb5, 0x05, 0x1c, 0x01, 0x24, 0x09, 0x20, + 0xff, 0xf7, 0xcc, 0xfb, 0x0f, 0x21, 0x09, 0x04, + 0x88, 0x43, 0x03, 0x21, 0x89, 0x04, 0xe2, 0x04, + 0x05, 0x2d, 0x12, 0x4e, 0x20, 0xd2, 0x02, 0xa3, + 0x3c, 0x00, 0x70, 0xf8, 0x00, 0x00, 0x5b, 0x5d, + 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x00, 0x06, 0x09, + 0x0c, 0x10, 0x03, 0x00, 0x03, 0x21, 0x09, 0x04, + 0x0c, 0xe0, 0x01, 0x21, 0x09, 0x04, 0x09, 0xe0, + 0x01, 0x21, 0x49, 0x04, 0x06, 0xe0, 0xf3, 0x68, + 0x04, 0x2b, 0x05, 0xd9, 0x02, 0xe0, 0xf3, 0x68, + 0x04, 0x2b, 0x01, 0xd8, 0x01, 0x43, 0x01, 0xe0, + 0x10, 0x43, 0x01, 0x1c, 0x09, 0x20, 0x04, 0xf0, + 0x80, 0xfb, 0x3c, 0x00, 0xac, 0xf8, 0x00, 0x00, + 0x20, 0x1c, 0x70, 0xbd, 0x00, 0x24, 0xfb, 0xe7, + 0x64, 0x73, 0x01, 0x00, 0x01, 0x21, 0xc9, 0x05, + 0x00, 0x28, 0x80, 0xb5, 0x02, 0xd0, 0x0a, 0x1c, + 0x00, 0x21, 0x00, 0xe0, 0x00, 0x22, 0x04, 0x20, + 0x04, 0xf0, 0x96, 0xf8, 0x80, 0xbd, 0x00, 0x00, + 0xf0, 0xb5, 0x91, 0xb0, 0x00, 0x26, 0x40, 0x21, + 0x01, 0xa8, 0xf0, 0xf7, 0xdd, 0xfd, 0x2a, 0x4f, + 0xb8, 0x79, 0x01, 0x22, 0x3c, 0x00, 0xe8, 0xf8, + 0x00, 0x00, 0x52, 0x03, 0x00, 0x90, 0x00, 0x21, + 0x06, 0x20, 0x04, 0xf0, 0x84, 0xf8, 0x60, 0x21, + 0x00, 0x20, 0x04, 0xf0, 0x58, 0xfb, 0x61, 0x21, + 0x00, 0x20, 0x04, 0xf0, 0x54, 0xfb, 0x08, 0x20, + 0x03, 0xf0, 0xef, 0xfa, 0x00, 0x24, 0x0f, 0x20, + 0xff, 0xf7, 0x71, 0xfb, 0x40, 0x05, 0x05, 0x0f, + 0xa8, 0x00, 0x01, 0xa9, 0x09, 0x58, 0x01, 0xaa, + 0x01, 0x31, 0x01, 0x34, 0x0c, 0x2c, 0x3c, 0x00, + 0x24, 0xf9, 0x00, 0x00, 0x11, 0x50, 0xf1, 0xd3, + 0x00, 0x20, 0x81, 0x00, 0x01, 0xaa, 0x51, 0x58, + 0xb1, 0x42, 0x01, 0xd9, 0x0e, 0x1c, 0x05, 0x1c, + 0x01, 0x30, 0x10, 0x28, 0xf5, 0xd3, 0x06, 0x20, + 0xff, 0xf7, 0x58, 0xfb, 0x0f, 0x21, 0x49, 0x02, + 0x88, 0x43, 0x69, 0x02, 0x08, 0x43, 0x01, 0x21, + 0x49, 0x03, 0x01, 0x43, 0x06, 0x20, 0x04, 0xf0, + 0x29, 0xfb, 0x0d, 0x48, 0x84, 0x68, 0x64, 0x34, + 0x3c, 0x00, 0x60, 0xf9, 0x00, 0x00, 0x08, 0xe0, + 0x20, 0x1c, 0x03, 0xf0, 0x5a, 0xf9, 0x00, 0x28, + 0x03, 0xd0, 0x01, 0x21, 0x95, 0x20, 0xf1, 0xf7, + 0x98, 0xfc, 0x0f, 0x20, 0xff, 0xf7, 0x3d, 0xfb, + 0x00, 0x04, 0xf1, 0xd5, 0x87, 0x20, 0x03, 0xf0, + 0xb2, 0xfa, 0x00, 0x98, 0xb8, 0x71, 0x11, 0xb0, + 0xf0, 0xbd, 0x20, 0x10, 0x07, 0x00, 0x00, 0x01, + 0x07, 0x00, 0x10, 0xb5, 0x17, 0x4c, 0x61, 0x69, + 0x00, 0x29, 0x3c, 0x00, 0x9c, 0xf9, 0x00, 0x00, + 0x04, 0xd0, 0x0a, 0x21, 0x13, 0x20, 0x03, 0xf0, + 0x47, 0xfe, 0x10, 0xbd, 0x01, 0x1c, 0x12, 0x48, + 0x01, 0x29, 0x00, 0x78, 0x0c, 0xd0, 0x11, 0x29, + 0xf7, 0xd1, 0x05, 0x28, 0x03, 0xd1, 0x01, 0x21, + 0x13, 0x20, 0xf1, 0xf7, 0x71, 0xfc, 0x20, 0x78, + 0x07, 0x28, 0xee, 0xd1, 0x02, 0x21, 0x0a, 0xe0, + 0x05, 0x28, 0x07, 0xd0, 0x06, 0x28, 0x0a, 0xd0, + 0x07, 0x28, 0xf7, 0xd0, 0x3c, 0x00, 0xd8, 0xf9, + 0x00, 0x00, 0x08, 0x28, 0xe4, 0xd1, 0x00, 0x20, + 0x05, 0xe0, 0x01, 0x21, 0x13, 0x20, 0xf1, 0xf7, + 0x5e, 0xfc, 0x10, 0xbd, 0x01, 0x20, 0x02, 0xf0, + 0x6c, 0xfd, 0x10, 0xbd, 0x00, 0x00, 0x7c, 0x78, + 0x01, 0x00, 0x0d, 0x49, 0x80, 0xb5, 0x09, 0x78, + 0x03, 0x29, 0x01, 0xd1, 0x00, 0x28, 0x0b, 0xd0, + 0x07, 0x29, 0x01, 0xd1, 0x00, 0x28, 0x07, 0xd0, + 0x02, 0x29, 0x01, 0xd1, 0x00, 0x28, 0x3c, 0x00, + 0x14, 0xfa, 0x00, 0x00, 0x03, 0xd1, 0x05, 0x29, + 0x09, 0xd1, 0x00, 0x28, 0x07, 0xd0, 0x00, 0x20, + 0xfc, 0xf7, 0x28, 0xfd, 0x00, 0x22, 0x13, 0x21, + 0x11, 0x20, 0x03, 0xf0, 0xc1, 0xfe, 0x80, 0xbd, + 0x7c, 0x78, 0x01, 0x00, 0x80, 0xb5, 0x06, 0x22, + 0x08, 0x21, 0x00, 0x20, 0x03, 0xf0, 0xde, 0xff, + 0x80, 0xbd, 0x00, 0x00, 0x07, 0x48, 0x80, 0xb5, + 0x40, 0x69, 0x00, 0x28, 0x01, 0xd1, 0xf1, 0xf7, + 0x3c, 0x00, 0x50, 0xfa, 0x00, 0x00, 0x33, 0xff, + 0x05, 0x49, 0x05, 0x4a, 0x08, 0x68, 0x50, 0x61, + 0x48, 0x68, 0x90, 0x61, 0x01, 0x20, 0x80, 0xbd, + 0x00, 0x00, 0x64, 0x73, 0x01, 0x00, 0xb0, 0x58, + 0x01, 0x00, 0x10, 0x00, 0x07, 0x00, 0x07, 0x48, + 0x80, 0xb5, 0x40, 0x69, 0x00, 0x28, 0x01, 0xd1, + 0xf1, 0xf7, 0x1d, 0xff, 0x05, 0x49, 0x05, 0x4a, + 0x08, 0x68, 0x90, 0x61, 0x48, 0x68, 0x50, 0x61, + 0x01, 0x20, 0x3c, 0x00, 0x8c, 0xfa, 0x00, 0x00, + 0x80, 0xbd, 0x00, 0x00, 0x64, 0x73, 0x01, 0x00, + 0xb0, 0x58, 0x01, 0x00, 0x10, 0x00, 0x07, 0x00, + 0x11, 0xb5, 0x00, 0xab, 0x59, 0x78, 0x14, 0x48, + 0x01, 0x23, 0xc0, 0x56, 0x00, 0x22, 0x09, 0x18, + 0x0b, 0x06, 0x1b, 0x16, 0x13, 0x21, 0x13, 0x2b, + 0x02, 0xdd, 0x00, 0xab, 0x59, 0x70, 0x07, 0xe0, + 0x00, 0x2b, 0x02, 0xda, 0x00, 0xab, 0x5a, 0x70, + 0x02, 0xe0, 0x1c, 0x1c, 0x3c, 0x00, 0xc8, 0xfa, + 0x00, 0x00, 0x00, 0xab, 0x5c, 0x70, 0x00, 0xab, + 0x1b, 0x78, 0x18, 0x18, 0x00, 0x06, 0x00, 0x16, + 0x13, 0x28, 0x02, 0xdd, 0x00, 0xab, 0x19, 0x70, + 0x06, 0xe0, 0x00, 0x28, 0x02, 0xda, 0x00, 0xab, + 0x1a, 0x70, 0x01, 0xe0, 0x00, 0xab, 0x18, 0x70, + 0x00, 0x98, 0x18, 0xbd, 0x00, 0x00, 0x64, 0x73, + 0x01, 0x00, 0x38, 0xb5, 0x0c, 0x1c, 0x15, 0x49, + 0x00, 0xab, 0x49, 0x68, 0x13, 0x25, 0x3c, 0x00, + 0x04, 0xfb, 0x00, 0x00, 0x00, 0x91, 0x59, 0x78, + 0x09, 0x18, 0x59, 0x70, 0x19, 0x78, 0x08, 0x18, + 0x18, 0x70, 0x19, 0x88, 0x10, 0x48, 0x02, 0x2c, + 0xc1, 0x80, 0x01, 0xd0, 0x00, 0x2c, 0x0b, 0xd1, + 0x00, 0xab, 0x18, 0x78, 0x13, 0x28, 0x00, 0xd9, + 0x1d, 0x70, 0x00, 0xab, 0x19, 0x78, 0x00, 0x20, + 0xff, 0xf7, 0xee, 0xfd, 0x02, 0x2c, 0x01, 0xd0, + 0x01, 0x2c, 0x09, 0xd1, 0x00, 0xab, 0x58, 0x78, + 0x3c, 0x00, 0x40, 0xfb, 0x00, 0x00, 0x13, 0x28, + 0x00, 0xd9, 0x5d, 0x70, 0x00, 0xab, 0x59, 0x78, + 0x01, 0x20, 0xff, 0xf7, 0xe0, 0xfd, 0x38, 0xbd, + 0x00, 0x00, 0x64, 0x73, 0x01, 0x00, 0xa0, 0x58, + 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0xb0, 0xb5, + 0x04, 0x1c, 0x0e, 0x28, 0x13, 0x4d, 0x04, 0xd0, + 0x12, 0x49, 0xa0, 0x00, 0x00, 0x19, 0x4d, 0x39, + 0x45, 0x18, 0x06, 0x20, 0xff, 0xf7, 0x3d, 0xfa, + 0x0f, 0x49, 0x3c, 0x00, 0x7c, 0xfb, 0x00, 0x00, + 0xe0, 0x22, 0x09, 0x19, 0x10, 0x39, 0xc9, 0x7b, + 0x90, 0x43, 0x49, 0x01, 0x11, 0x40, 0x01, 0x43, + 0x06, 0x20, 0x04, 0xf0, 0x0d, 0xfa, 0x29, 0x1c, + 0x05, 0x20, 0x09, 0x4a, 0x03, 0xf0, 0x30, 0xff, + 0x08, 0x48, 0x1f, 0x22, 0x00, 0x19, 0x10, 0x38, + 0xc0, 0x7b, 0xc1, 0x04, 0xd2, 0x04, 0x08, 0x20, + 0x03, 0xf0, 0x26, 0xff, 0xb0, 0xbd, 0x00, 0x00, + 0xb4, 0x09, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xfb, + 0x00, 0x00, 0x14, 0x45, 0x01, 0x00, 0xff, 0x0f, + 0x00, 0x00, 0xc0, 0x58, 0x01, 0x00, 0x70, 0x47, + 0x00, 0x00, 0x80, 0xb5, 0x06, 0x49, 0x00, 0x28, + 0x01, 0xd1, 0x08, 0x68, 0x80, 0xbd, 0x01, 0x28, + 0x01, 0xd1, 0x48, 0x68, 0x80, 0xbd, 0xf1, 0xf7, + 0x90, 0xfb, 0x00, 0x20, 0x80, 0xbd, 0x7c, 0x73, + 0x01, 0x00, 0x01, 0x48, 0x40, 0x68, 0x70, 0x47, + 0x00, 0x00, 0xa0, 0x58, 0x01, 0x00, 0x3c, 0x00, + 0xf4, 0xfb, 0x00, 0x00, 0x04, 0x48, 0x01, 0x23, + 0x04, 0x49, 0xc0, 0x56, 0xc9, 0x56, 0x40, 0x18, + 0x00, 0x04, 0x00, 0x0c, 0x70, 0x47, 0x00, 0x00, + 0xa0, 0x58, 0x01, 0x00, 0xa2, 0x58, 0x01, 0x00, + 0x01, 0x48, 0x40, 0x68, 0x70, 0x47, 0x00, 0x00, + 0x64, 0x73, 0x01, 0x00, 0xf8, 0xb5, 0x05, 0x1c, + 0x0e, 0x1c, 0x00, 0xf0, 0x55, 0xf9, 0x04, 0x1c, + 0x00, 0xf0, 0x58, 0xf9, 0x00, 0x28, 0x2c, 0xd0, + 0x3c, 0x00, 0x30, 0xfc, 0x00, 0x00, 0xb3, 0x00, + 0x60, 0x1e, 0x00, 0x2d, 0x1c, 0x4e, 0x19, 0x49, + 0x1a, 0x4a, 0x06, 0xd1, 0x0b, 0x25, 0x0e, 0x2c, + 0x00, 0xd1, 0x19, 0x4a, 0xd2, 0x58, 0x08, 0x56, + 0x08, 0xe0, 0x01, 0x2d, 0x1c, 0xd1, 0x9a, 0x18, + 0x04, 0x36, 0x08, 0x18, 0x08, 0x25, 0x0e, 0x23, + 0x12, 0x6d, 0xc0, 0x56, 0x07, 0x1c, 0x47, 0x43, + 0xfb, 0x00, 0xdf, 0x19, 0x12, 0x4b, 0x3f, 0x21, + 0x58, 0x43, 0x3c, 0x00, 0x6c, 0xfc, 0x00, 0x00, + 0x11, 0x4b, 0xa9, 0x40, 0x0c, 0x1c, 0x38, 0x18, + 0xc0, 0x18, 0x14, 0x40, 0xec, 0x40, 0xc0, 0x11, + 0x60, 0x43, 0x1b, 0x0a, 0xc0, 0x18, 0x80, 0x12, + 0x03, 0xd1, 0x01, 0x20, 0x04, 0xe0, 0x00, 0x20, + 0xf8, 0xbd, 0x3f, 0x28, 0x00, 0xdd, 0x3f, 0x20, + 0x30, 0x60, 0xa8, 0x40, 0x08, 0x40, 0x8a, 0x43, + 0x10, 0x43, 0xf5, 0xe7, 0xcc, 0x59, 0x01, 0x00, + 0xdc, 0x58, 0x01, 0x00, 0x3c, 0x00, 0xa8, 0xfc, + 0x00, 0x00, 0x7c, 0x73, 0x01, 0x00, 0x7c, 0x59, + 0x01, 0x00, 0x06, 0x06, 0x00, 0x00, 0x26, 0x00, + 0x02, 0x00, 0x03, 0x48, 0x08, 0xb5, 0xc0, 0x88, + 0x00, 0xab, 0x18, 0x80, 0x00, 0x98, 0x08, 0xbd, + 0x00, 0x00, 0xa0, 0x58, 0x01, 0x00, 0xb0, 0xb5, + 0x0b, 0x4d, 0x09, 0x4c, 0x0e, 0x20, 0x6c, 0x60, + 0xff, 0xf7, 0x8d, 0xf9, 0x09, 0x49, 0x02, 0x1c, + 0xc8, 0x60, 0x01, 0x06, 0x09, 0x0e, 0x3c, 0x00, + 0xe4, 0xfc, 0x00, 0x00, 0x13, 0x3a, 0x02, 0x2a, + 0x02, 0xd9, 0x17, 0x38, 0x04, 0x28, 0x00, 0xd8, + 0x00, 0x21, 0x08, 0x1c, 0x6c, 0x60, 0xb0, 0xbd, + 0x04, 0x18, 0x02, 0x00, 0x60, 0x00, 0x07, 0x00, + 0x64, 0x73, 0x01, 0x00, 0x0a, 0x48, 0x98, 0xb5, + 0x02, 0x78, 0x13, 0x21, 0x14, 0x2a, 0x00, 0xd3, + 0x01, 0x70, 0x42, 0x78, 0x14, 0x2a, 0x00, 0xd3, + 0x41, 0x70, 0x06, 0x4c, 0x60, 0x68, 0xff, 0xf7, + 0x3c, 0x00, 0x20, 0xfd, 0x00, 0x00, 0xbd, 0xfe, + 0x00, 0x90, 0x00, 0xab, 0x18, 0x88, 0xe0, 0x80, + 0x00, 0xf0, 0x75, 0xff, 0x98, 0xbd, 0xa4, 0x58, + 0x01, 0x00, 0xa0, 0x58, 0x01, 0x00, 0x03, 0x48, + 0x80, 0xb5, 0x41, 0x78, 0x01, 0x20, 0xff, 0xf7, + 0xe6, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0xa6, 0x58, + 0x01, 0x00, 0x03, 0x48, 0x80, 0xb5, 0x01, 0x78, + 0x00, 0x20, 0xff, 0xf7, 0xdc, 0xfc, 0x80, 0xbd, + 0x00, 0x00, 0x3c, 0x00, 0x5c, 0xfd, 0x00, 0x00, + 0xa6, 0x58, 0x01, 0x00, 0xb0, 0xb5, 0x05, 0x4d, + 0x00, 0x24, 0x20, 0x1c, 0xff, 0xf7, 0x44, 0xf9, + 0x01, 0x34, 0x10, 0x2c, 0x01, 0xc5, 0xf8, 0xd3, + 0xb0, 0xbd, 0x00, 0x00, 0xd4, 0x44, 0x01, 0x00, + 0x04, 0x49, 0x80, 0xb5, 0x88, 0x70, 0x04, 0x49, + 0x80, 0x00, 0x09, 0x58, 0x07, 0x20, 0x04, 0xf0, + 0x0f, 0xf9, 0x80, 0xbd, 0x64, 0x73, 0x01, 0x00, + 0xd0, 0x58, 0x01, 0x00, 0x3c, 0x00, 0x98, 0xfd, + 0x00, 0x00, 0xb0, 0xb5, 0x3f, 0x24, 0x02, 0x1c, + 0x00, 0x2a, 0x01, 0xd1, 0x08, 0x20, 0x0b, 0x23, + 0x01, 0x2a, 0x01, 0xd1, 0x09, 0x20, 0x08, 0x23, + 0x25, 0x1c, 0x9d, 0x40, 0x00, 0x29, 0x00, 0xd1, + 0x01, 0x21, 0x3f, 0x29, 0x00, 0xd9, 0x21, 0x1c, + 0x99, 0x40, 0x0a, 0x1c, 0x29, 0x1c, 0xff, 0xf7, + 0x7c, 0xfc, 0xb0, 0xbd, 0x00, 0x00, 0x91, 0xb5, + 0x12, 0x49, 0x00, 0xab, 0x1a, 0x78, 0x3c, 0x00, + 0xd4, 0xfd, 0x00, 0x00, 0x08, 0x78, 0x11, 0x4c, + 0x80, 0x18, 0x00, 0x06, 0x00, 0x0e, 0x20, 0x70, + 0x49, 0x78, 0x5a, 0x78, 0x89, 0x18, 0x09, 0x06, + 0x09, 0x0e, 0x13, 0x22, 0x13, 0x28, 0x61, 0x70, + 0x00, 0xd9, 0x22, 0x70, 0x13, 0x29, 0x00, 0xd9, + 0x62, 0x70, 0x08, 0x49, 0x08, 0x48, 0x06, 0x39, + 0xc9, 0x88, 0x81, 0x80, 0x21, 0x78, 0x00, 0x20, + 0xff, 0xf7, 0x82, 0xfc, 0x61, 0x78, 0x01, 0x20, + 0x3c, 0x00, 0x10, 0xfe, 0x00, 0x00, 0xff, 0xf7, + 0x7e, 0xfc, 0x98, 0xbd, 0x00, 0x00, 0xa4, 0x58, + 0x01, 0x00, 0xa6, 0x58, 0x01, 0x00, 0x64, 0x73, + 0x01, 0x00, 0x70, 0xb5, 0x1d, 0x4d, 0x04, 0x1c, + 0x28, 0x78, 0x0e, 0x1c, 0x03, 0x28, 0x03, 0xd1, + 0x02, 0x21, 0x11, 0x20, 0xf1, 0xf7, 0x35, 0xfa, + 0x20, 0x1c, 0x00, 0xf0, 0x4e, 0xf8, 0x00, 0x28, + 0x25, 0xd0, 0x28, 0x78, 0x01, 0x28, 0x0a, 0xd1, + 0x68, 0x68, 0x3c, 0x00, 0x4c, 0xfe, 0x00, 0x00, + 0x00, 0x28, 0x07, 0xd0, 0x01, 0x21, 0x11, 0x20, + 0x03, 0xf0, 0xee, 0xfb, 0x01, 0x20, 0x69, 0x68, + 0xf0, 0xf7, 0xbd, 0xfa, 0x6c, 0x70, 0x6e, 0x60, + 0x20, 0x1c, 0xff, 0xf7, 0xc1, 0xfc, 0x04, 0x1c, + 0x00, 0xf0, 0xd4, 0xfe, 0x00, 0x2c, 0x02, 0xd0, + 0x68, 0x68, 0x00, 0x28, 0x02, 0xd1, 0xf6, 0xf7, + 0xd9, 0xf8, 0x70, 0xbd, 0x01, 0x20, 0x28, 0x70, + 0x01, 0x22, 0x21, 0x1c, 0x3c, 0x00, 0x88, 0xfe, + 0x00, 0x00, 0x11, 0x20, 0x03, 0xf0, 0x9f, 0xfb, + 0x70, 0xbd, 0x02, 0x21, 0x11, 0x20, 0xf1, 0xf7, + 0x06, 0xfa, 0x70, 0xbd, 0x00, 0x00, 0x9c, 0x73, + 0x01, 0x00, 0x80, 0xb5, 0x01, 0x28, 0x05, 0xd1, + 0x00, 0x29, 0x04, 0xd0, 0x01, 0x29, 0x01, 0xd1, + 0xf6, 0xf7, 0xbf, 0xf8, 0x80, 0xbd, 0x05, 0x49, + 0x08, 0x78, 0x03, 0x28, 0x02, 0xd0, 0x00, 0x20, + 0x08, 0x70, 0x80, 0xbd, 0x03, 0x21, 0x3c, 0x00, + 0xc4, 0xfe, 0x00, 0x00, 0x11, 0x20, 0xf1, 0xf7, + 0xed, 0xf9, 0x80, 0xbd, 0x9c, 0x73, 0x01, 0x00, + 0x01, 0x48, 0x40, 0x78, 0x70, 0x47, 0x00, 0x00, + 0x9c, 0x73, 0x01, 0x00, 0x01, 0x1c, 0x01, 0x39, + 0x01, 0x20, 0x0e, 0x29, 0x00, 0xd3, 0x00, 0x20, + 0x70, 0x47, 0x00, 0x00, 0x10, 0xb5, 0x13, 0x4c, + 0x20, 0x78, 0x01, 0x28, 0x0e, 0xd1, 0x60, 0x68, + 0x00, 0x28, 0x0d, 0xd0, 0x01, 0x21, 0x11, 0x20, + 0x3c, 0x00, 0x00, 0xff, 0x00, 0x00, 0x03, 0xf0, + 0x98, 0xfb, 0x01, 0x20, 0x61, 0x68, 0xf0, 0xf7, + 0x67, 0xfa, 0x00, 0x20, 0x60, 0x60, 0x20, 0x70, + 0x01, 0xe0, 0x03, 0x28, 0x0e, 0xd0, 0x00, 0x21, + 0x11, 0x20, 0x03, 0xf0, 0x8a, 0xfb, 0xff, 0xf7, + 0x24, 0xfc, 0xff, 0xf7, 0xc0, 0xfb, 0x05, 0x49, + 0x08, 0x7b, 0x40, 0x08, 0x40, 0x00, 0x08, 0x73, + 0x03, 0x20, 0x20, 0x70, 0x01, 0x20, 0x10, 0xbd, + 0x00, 0x00, 0x3c, 0x00, 0x3c, 0xff, 0x00, 0x00, + 0x9c, 0x73, 0x01, 0x00, 0x88, 0x00, 0x07, 0x00, + 0x10, 0xb5, 0x0d, 0x4c, 0x20, 0x78, 0x03, 0x28, + 0x13, 0xd1, 0x00, 0x20, 0x20, 0x70, 0x0b, 0x48, + 0x01, 0x7b, 0x01, 0x22, 0x11, 0x43, 0x01, 0x73, + 0xff, 0xf7, 0x70, 0xfc, 0xff, 0xf7, 0x18, 0xfc, + 0x00, 0x28, 0x06, 0xd0, 0x02, 0x21, 0x21, 0x70, + 0x01, 0x1c, 0x00, 0x22, 0x11, 0x20, 0x03, 0xf0, + 0x2b, 0xfb, 0x01, 0x20, 0x3c, 0x00, 0x78, 0xff, + 0x00, 0x00, 0x10, 0xbd, 0x00, 0x00, 0x9c, 0x73, + 0x01, 0x00, 0x88, 0x00, 0x07, 0x00, 0x80, 0xb5, + 0x05, 0x49, 0x00, 0x28, 0x04, 0xd0, 0x00, 0x20, + 0x08, 0x60, 0x03, 0xf0, 0x5a, 0xfa, 0x80, 0xbd, + 0x01, 0x20, 0x08, 0x60, 0x80, 0xbd, 0x80, 0x5a, + 0x01, 0x00, 0xfe, 0xb5, 0x05, 0x1c, 0x80, 0x35, + 0x04, 0x1c, 0xa8, 0x68, 0x29, 0x79, 0x06, 0x68, + 0x20, 0x1c, 0xa0, 0x30, 0x02, 0x29, 0x3c, 0x00, + 0xb4, 0xff, 0x00, 0x00, 0x1c, 0xd1, 0x69, 0x79, + 0x08, 0x29, 0x01, 0xd0, 0x0c, 0x29, 0x17, 0xd1, + 0x01, 0x21, 0x61, 0x62, 0xa9, 0x68, 0x09, 0x68, + 0x09, 0x8b, 0x01, 0x82, 0xa9, 0x69, 0x01, 0x91, + 0x00, 0x8a, 0xc0, 0x06, 0x05, 0xd5, 0x60, 0x68, + 0x00, 0x88, 0x40, 0x05, 0x01, 0xd4, 0x01, 0x20, + 0x00, 0xe0, 0x00, 0x20, 0x02, 0x90, 0x05, 0x20, + 0x01, 0xa9, 0x02, 0xf0, 0xb7, 0xf9, 0x02, 0xe0, + 0x3c, 0x00, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x21, + 0x61, 0x62, 0x01, 0x82, 0xa9, 0x68, 0x1a, 0x23, + 0x0a, 0x89, 0x67, 0x6a, 0x18, 0x1c, 0x00, 0x2f, + 0x00, 0xd1, 0x18, 0x20, 0x10, 0x1a, 0x08, 0x81, + 0xa8, 0x68, 0x01, 0x68, 0x62, 0x6a, 0x00, 0x2a, + 0x00, 0xd1, 0x18, 0x23, 0xc9, 0x18, 0x01, 0x60, + 0xa8, 0x68, 0x41, 0xc4, 0x30, 0x88, 0x08, 0x3c, + 0x40, 0x04, 0x03, 0xd5, 0x20, 0x1c, 0xf7, 0xf7, + 0xbc, 0xf9, 0x3c, 0x00, 0x2c, 0x00, 0x01, 0x00, + 0xfe, 0xbd, 0x00, 0x21, 0xe1, 0x61, 0x30, 0x79, + 0xc0, 0x07, 0x03, 0xd4, 0x20, 0x1c, 0xf7, 0xf7, + 0x91, 0xfe, 0xf5, 0xe7, 0x20, 0x1c, 0xf7, 0xf7, + 0x43, 0xff, 0xf1, 0xe7, 0xf7, 0xb5, 0x05, 0x1c, + 0x0a, 0x30, 0x06, 0x1c, 0xf5, 0xf7, 0xa4, 0xfa, + 0x14, 0x4f, 0x04, 0x1c, 0x39, 0x88, 0xf2, 0xf7, + 0x83, 0xfe, 0x32, 0x88, 0x78, 0x68, 0x02, 0x80, + 0x72, 0x88, 0x02, 0x30, 0x3c, 0x00, 0x68, 0x00, + 0x01, 0x00, 0x02, 0x80, 0xb1, 0x88, 0x41, 0x80, + 0x69, 0x88, 0x02, 0x9a, 0x20, 0x1c, 0xfa, 0xf7, + 0xce, 0xfe, 0x0b, 0x4d, 0x08, 0x35, 0x68, 0x80, + 0xfb, 0xf7, 0x2b, 0xfe, 0x01, 0x21, 0x09, 0x03, + 0x00, 0x28, 0x28, 0x88, 0x01, 0xd0, 0x88, 0x43, + 0x00, 0xe0, 0x08, 0x43, 0x28, 0x80, 0x04, 0x48, + 0x00, 0x22, 0x00, 0x21, 0x14, 0x30, 0xf2, 0xf7, + 0x32, 0xfe, 0x20, 0x1c, 0xfc, 0xf7, 0x3c, 0x00, + 0xa4, 0x00, 0x01, 0x00, 0x85, 0xfa, 0xfe, 0xbd, + 0x24, 0x7b, 0x01, 0x00, 0x10, 0xb5, 0x13, 0x4c, + 0x11, 0x49, 0x20, 0x1c, 0xff, 0x30, 0x69, 0x30, + 0x0e, 0xc9, 0x0e, 0xc0, 0x20, 0x1c, 0xff, 0x30, + 0x24, 0x22, 0x75, 0x30, 0x0e, 0x49, 0xf0, 0xf7, + 0x17, 0xfa, 0x20, 0x1c, 0xff, 0x30, 0x3c, 0x22, + 0x99, 0x30, 0x0c, 0x49, 0xf0, 0xf7, 0x6c, 0xfa, + 0x20, 0x1c, 0xff, 0x30, 0x10, 0x22, 0xd5, 0x30, + 0x3c, 0x00, 0xe0, 0x00, 0x01, 0x00, 0x09, 0x49, + 0xf0, 0xf7, 0x09, 0xfa, 0x20, 0x1c, 0xff, 0x30, + 0x28, 0x22, 0xe5, 0x30, 0x07, 0x49, 0xf0, 0xf7, + 0x5e, 0xfa, 0x10, 0xbd, 0x00, 0x00, 0x00, 0x80, + 0x07, 0x00, 0x40, 0x63, 0x01, 0x00, 0x0c, 0x80, + 0x07, 0x00, 0x30, 0x80, 0x07, 0x00, 0x80, 0x80, + 0x07, 0x00, 0xa0, 0x80, 0x07, 0x00, 0xb0, 0xb5, + 0x00, 0x28, 0x3f, 0xd0, 0x21, 0x48, 0x41, 0x68, + 0x21, 0x4c, 0x3c, 0x00, 0x1c, 0x01, 0x01, 0x00, + 0x61, 0x60, 0xc1, 0x68, 0xe1, 0x60, 0x01, 0x69, + 0x21, 0x61, 0x80, 0x6a, 0xa0, 0x62, 0x1e, 0x49, + 0x1c, 0x48, 0x09, 0x68, 0x14, 0x38, 0x41, 0x64, + 0x1c, 0x48, 0x25, 0x1c, 0x3c, 0x35, 0x0f, 0xc8, + 0x0f, 0xc5, 0x20, 0x1c, 0x80, 0x22, 0x4c, 0x30, + 0x19, 0x49, 0xf0, 0xf7, 0x33, 0xfa, 0x14, 0x22, + 0x20, 0x1c, 0xcc, 0x30, 0x17, 0x49, 0xf0, 0xf7, + 0x2d, 0xfa, 0x38, 0x22, 0x3c, 0x00, 0x58, 0x01, + 0x01, 0x00, 0x20, 0x1c, 0xe0, 0x30, 0x15, 0x49, + 0xf0, 0xf7, 0x27, 0xfa, 0x20, 0x1c, 0xff, 0x30, + 0x50, 0x22, 0x19, 0x30, 0x13, 0x49, 0xf0, 0xf7, + 0x20, 0xfa, 0x83, 0x20, 0x80, 0x00, 0x14, 0x22, + 0x20, 0x18, 0x10, 0x49, 0xf0, 0xf7, 0x19, 0xfa, + 0x11, 0x20, 0x40, 0x01, 0x84, 0x22, 0x20, 0x18, + 0x0e, 0x49, 0xf0, 0xf7, 0x12, 0xfa, 0xff, 0xf7, + 0x8e, 0xff, 0xf8, 0xf7, 0x94, 0xfb, 0x3c, 0x00, + 0x94, 0x01, 0x01, 0x00, 0xb0, 0xbd, 0xff, 0xf7, + 0x89, 0xff, 0xb0, 0xbd, 0x00, 0x10, 0x07, 0x00, + 0x40, 0x63, 0x01, 0x00, 0x08, 0x20, 0x07, 0x00, + 0x40, 0x20, 0x07, 0x00, 0x00, 0x30, 0x07, 0x00, + 0x00, 0x40, 0x07, 0x00, 0x00, 0x50, 0x07, 0x00, + 0x00, 0x60, 0x07, 0x00, 0x10, 0x00, 0x07, 0x00, + 0x00, 0x90, 0x07, 0x00, 0x0c, 0x49, 0x80, 0xb5, + 0x01, 0x20, 0x48, 0x60, 0x0a, 0x48, 0x14, 0x38, + 0x3c, 0x00, 0xd0, 0x01, 0x01, 0x00, 0x00, 0x78, + 0x01, 0x28, 0x04, 0xd0, 0x08, 0x48, 0x94, 0x38, + 0x40, 0x6f, 0x00, 0x28, 0x03, 0xd0, 0x00, 0x20, + 0x00, 0xf0, 0x1f, 0xf8, 0x80, 0xbd, 0x08, 0x68, + 0x00, 0x28, 0xfb, 0xd0, 0x03, 0x48, 0xf2, 0xf7, + 0x7a, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x98, 0x66, + 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0x80, 0xb5, + 0x00, 0x28, 0x09, 0xd1, 0xf2, 0x21, 0x0f, 0x20, + 0x03, 0xf0, 0x3c, 0x00, 0x0c, 0x02, 0x01, 0x00, + 0x13, 0xfa, 0x00, 0x22, 0x0f, 0x21, 0xf1, 0x20, + 0x03, 0xf0, 0xcc, 0xfa, 0x80, 0xbd, 0x01, 0x20, + 0xf8, 0xf7, 0x6a, 0xfe, 0x80, 0xbd, 0x00, 0x00, + 0x10, 0xb5, 0x04, 0x1c, 0x03, 0x20, 0x00, 0xf0, + 0xc9, 0xf9, 0x00, 0x21, 0x0f, 0x20, 0x03, 0xf0, + 0xff, 0xf9, 0xff, 0xf7, 0x65, 0xf8, 0x0b, 0x49, + 0x00, 0x20, 0x48, 0x74, 0xfb, 0xf7, 0xe6, 0xfa, + 0x09, 0x48, 0x00, 0x68, 0x3c, 0x00, 0x48, 0x02, + 0x01, 0x00, 0x00, 0x28, 0x03, 0xdc, 0x02, 0x21, + 0x40, 0x42, 0xff, 0xf7, 0x52, 0xfc, 0x04, 0x48, + 0x14, 0x30, 0x00, 0x68, 0x00, 0x28, 0x02, 0xd0, + 0x20, 0x1c, 0xf2, 0xf7, 0x42, 0xfe, 0x10, 0xbd, + 0x00, 0x00, 0x84, 0x66, 0x01, 0x00, 0xd4, 0x7e, + 0x01, 0x00, 0x06, 0x49, 0x80, 0xb5, 0x09, 0x78, + 0x04, 0x29, 0x05, 0xd0, 0x05, 0x29, 0x03, 0xd0, + 0x06, 0x29, 0x01, 0xd0, 0x07, 0x29, 0x3c, 0x00, + 0x84, 0x02, 0x01, 0x00, 0x01, 0xd1, 0xfe, 0xf7, + 0xbd, 0xfd, 0x80, 0xbd, 0x74, 0x66, 0x01, 0x00, + 0x10, 0xb5, 0x09, 0x4c, 0xe0, 0x68, 0x00, 0x28, + 0x0b, 0xd1, 0x07, 0x48, 0x2c, 0x38, 0x00, 0x8a, + 0xc0, 0x07, 0x04, 0xd5, 0x00, 0x21, 0x01, 0x20, + 0x62, 0x68, 0xf9, 0xf7, 0xc9, 0xfa, 0x01, 0x20, + 0xe0, 0x60, 0x01, 0x20, 0x10, 0xbd, 0x00, 0x00, + 0xf4, 0x6e, 0x01, 0x00, 0x8c, 0xb5, 0x02, 0x1c, + 0x3c, 0x00, 0xc0, 0x02, 0x01, 0x00, 0x08, 0x1c, + 0x11, 0x1c, 0xfd, 0xf7, 0x28, 0xff, 0x01, 0x90, + 0x00, 0x28, 0x05, 0xd0, 0x17, 0x20, 0x00, 0xab, + 0x18, 0x80, 0x68, 0x46, 0xfd, 0xf7, 0xff, 0xf8, + 0x8c, 0xbd, 0xf1, 0xb5, 0x2e, 0x4c, 0xae, 0xb0, + 0x00, 0x25, 0x25, 0x63, 0x20, 0x69, 0x01, 0x28, + 0x03, 0xd1, 0x01, 0xa8, 0x01, 0xf0, 0xa1, 0xf8, + 0x4e, 0xe0, 0x01, 0x26, 0x28, 0x4f, 0x26, 0x70, + 0x50, 0x3f, 0x3c, 0x00, 0xfc, 0x02, 0x01, 0x00, + 0xb8, 0x69, 0xf8, 0xf7, 0x4f, 0xf8, 0x25, 0x49, + 0x2c, 0x39, 0x00, 0x28, 0x1d, 0xd0, 0xe0, 0x6a, + 0x01, 0x28, 0x1a, 0xd1, 0x08, 0x8a, 0x0f, 0x1c, + 0x80, 0x07, 0x04, 0xd5, 0x00, 0x21, 0x02, 0x20, + 0x62, 0x68, 0xf9, 0xf7, 0x8f, 0xfa, 0x38, 0x8a, + 0x00, 0x07, 0x07, 0xd5, 0xe0, 0x68, 0x01, 0x28, + 0x04, 0xd1, 0x00, 0x21, 0x08, 0x20, 0x62, 0x68, + 0xf9, 0xf7, 0x84, 0xfa, 0x3c, 0x00, 0x38, 0x03, + 0x01, 0x00, 0x00, 0x22, 0x18, 0x21, 0x82, 0x20, + 0x26, 0x63, 0x03, 0xf0, 0x36, 0xfa, 0x25, 0xe0, + 0x08, 0x8a, 0x0e, 0x1c, 0x80, 0x07, 0x04, 0xd5, + 0x00, 0x21, 0x02, 0x20, 0x62, 0x68, 0xf9, 0xf7, + 0x74, 0xfa, 0x30, 0x8a, 0x00, 0x07, 0x07, 0xd5, + 0xe0, 0x68, 0x01, 0x28, 0x04, 0xd1, 0x00, 0x21, + 0x08, 0x20, 0x62, 0x68, 0xf9, 0xf7, 0x69, 0xfa, + 0x30, 0x8a, 0x40, 0x07, 0x04, 0xd5, 0x3c, 0x00, + 0x74, 0x03, 0x01, 0x00, 0x00, 0x22, 0x00, 0x21, + 0x04, 0x20, 0xf9, 0xf7, 0x61, 0xfa, 0x2e, 0x98, + 0x01, 0x28, 0x04, 0xd0, 0x1e, 0x95, 0x09, 0x21, + 0x1b, 0xa8, 0xff, 0xf7, 0x97, 0xff, 0xe5, 0x62, + 0xbd, 0x61, 0xe5, 0x60, 0x2f, 0xb0, 0xf0, 0xbd, + 0xf4, 0x6e, 0x01, 0x00, 0x80, 0xb5, 0x07, 0x20, + 0xfe, 0xf7, 0xa0, 0xfe, 0x00, 0x21, 0x0f, 0x20, + 0x03, 0xf0, 0x44, 0xf9, 0x0c, 0x48, 0x01, 0x78, + 0x3c, 0x00, 0xb0, 0x03, 0x01, 0x00, 0x00, 0x29, + 0x0f, 0xd0, 0x02, 0x21, 0x01, 0x70, 0x88, 0x38, + 0x00, 0x78, 0x00, 0x28, 0x04, 0xd0, 0x07, 0x49, + 0x10, 0x31, 0x48, 0x7c, 0x01, 0x30, 0x48, 0x74, + 0xf2, 0x22, 0x0f, 0x20, 0x05, 0x49, 0x03, 0xf0, + 0xfc, 0xf8, 0x00, 0x22, 0x0f, 0x21, 0xf3, 0x20, + 0x03, 0xf0, 0xe9, 0xf9, 0x80, 0xbd, 0x74, 0x66, + 0x01, 0x00, 0x80, 0x84, 0x1e, 0x00, 0x10, 0xb5, + 0x04, 0x1c, 0x3c, 0x00, 0xec, 0x03, 0x01, 0x00, + 0xf2, 0x21, 0x0f, 0x20, 0x03, 0xf0, 0x20, 0xf9, + 0x01, 0x2c, 0x0a, 0xd1, 0x08, 0x48, 0x08, 0x49, + 0x00, 0x68, 0x14, 0x39, 0x00, 0x28, 0x05, 0xd0, + 0xc8, 0x78, 0x02, 0x28, 0x02, 0xd1, 0xf7, 0xf7, + 0xaf, 0xfa, 0x10, 0xbd, 0x00, 0x20, 0x48, 0x70, + 0x05, 0x20, 0xfe, 0xf7, 0x65, 0xfe, 0x10, 0xbd, + 0x98, 0x66, 0x01, 0x00, 0xf8, 0xb5, 0x28, 0x4e, + 0x30, 0x21, 0x35, 0x1c, 0x3c, 0x00, 0x28, 0x04, + 0x01, 0x00, 0x60, 0x35, 0x28, 0x89, 0x89, 0x5d, + 0x88, 0x42, 0x03, 0xd1, 0x00, 0x20, 0xff, 0xf7, + 0xf6, 0xfe, 0xf8, 0xbd, 0x34, 0x1c, 0x70, 0x34, + 0x01, 0x21, 0x21, 0x70, 0x41, 0x18, 0x80, 0x19, + 0x30, 0x30, 0x29, 0x81, 0x40, 0x78, 0x1d, 0x4f, + 0x18, 0x3f, 0x38, 0x70, 0x00, 0x28, 0x08, 0xd0, + 0x00, 0x21, 0xfb, 0xf7, 0xc2, 0xf9, 0x00, 0x28, + 0x07, 0xd1, 0x20, 0x78, 0xff, 0xf7, 0x3c, 0x00, + 0x64, 0x04, 0x01, 0x00, 0x9b, 0xff, 0xe7, 0xe7, + 0x01, 0x21, 0x0f, 0x20, 0xf0, 0xf7, 0x1a, 0xff, + 0x14, 0x48, 0x01, 0x21, 0x80, 0x30, 0x81, 0x70, + 0x38, 0x69, 0xfb, 0xf7, 0x55, 0xfa, 0x20, 0x73, + 0x00, 0x21, 0x0f, 0x20, 0x03, 0xf0, 0xd6, 0xf8, + 0x70, 0x7a, 0x01, 0x28, 0x0e, 0xd1, 0x0e, 0x48, + 0x00, 0x68, 0x00, 0x28, 0x04, 0xd0, 0x38, 0x78, + 0x02, 0xf0, 0xda, 0xfa, 0x00, 0x28, 0x05, 0xd0, + 0x3c, 0x00, 0xa0, 0x04, 0x01, 0x00, 0x30, 0x7f, + 0x60, 0x73, 0x03, 0x20, 0x20, 0x70, 0x71, 0x89, + 0x05, 0xe0, 0x05, 0x20, 0x20, 0x70, 0xa8, 0x88, + 0xfa, 0xf7, 0x3b, 0xfb, 0x01, 0x1c, 0x00, 0x22, + 0x0f, 0x20, 0x03, 0xf0, 0x86, 0xf8, 0xba, 0xe7, + 0x00, 0x00, 0x04, 0x66, 0x01, 0x00, 0xe4, 0x62, + 0x01, 0x00, 0x70, 0xb5, 0x04, 0x1c, 0x02, 0xf0, + 0x6c, 0xfc, 0x36, 0x4b, 0x19, 0x1c, 0xa0, 0x31, + 0x0a, 0x78, 0x3c, 0x00, 0xdc, 0x04, 0x01, 0x00, + 0x10, 0x2a, 0x02, 0xd2, 0x0a, 0x79, 0x10, 0x2a, + 0x01, 0xd3, 0x01, 0x25, 0x00, 0xe0, 0x00, 0x25, + 0x30, 0x4e, 0xca, 0x79, 0x80, 0x36, 0x01, 0x2c, + 0x12, 0xd0, 0x00, 0x25, 0x02, 0x2c, 0x2e, 0xd0, + 0x04, 0x2c, 0x3c, 0xd1, 0x5c, 0x6b, 0x00, 0x2c, + 0x39, 0xd1, 0x9c, 0x6f, 0x00, 0x1b, 0x2a, 0x4c, + 0xa0, 0x42, 0x34, 0xd9, 0xb2, 0x68, 0x98, 0x6a, + 0x82, 0x42, 0x31, 0xd0, 0x3c, 0x00, 0x18, 0x05, + 0x01, 0x00, 0x4d, 0x72, 0x34, 0xe0, 0xb0, 0x68, + 0x9c, 0x6a, 0x02, 0x22, 0xa0, 0x42, 0x21, 0xd1, + 0x58, 0x6b, 0x00, 0x28, 0x1e, 0xd1, 0x00, 0x2d, + 0x1c, 0xd1, 0x48, 0x7a, 0x19, 0x28, 0x20, 0xd0, + 0x34, 0x68, 0x98, 0x6f, 0x64, 0x00, 0x00, 0x1b, + 0x74, 0x68, 0x00, 0x19, 0xff, 0x30, 0x1c, 0x4c, + 0x39, 0x30, 0xa0, 0x42, 0x16, 0xd2, 0x48, 0x79, + 0x8c, 0x79, 0x00, 0x19, 0x30, 0x28, 0x3c, 0x00, + 0x54, 0x05, 0x01, 0x00, 0x11, 0xd3, 0x10, 0x22, + 0x0f, 0xe0, 0x5c, 0x6b, 0x01, 0x2c, 0x06, 0xd1, + 0xb0, 0x68, 0x9a, 0x6a, 0x90, 0x42, 0x00, 0xd1, + 0x4d, 0x72, 0x00, 0x22, 0x05, 0xe0, 0x9c, 0x6f, + 0x00, 0x1b, 0x12, 0x4c, 0xa0, 0x42, 0x00, 0xd3, + 0x20, 0x22, 0x06, 0xe0, 0x4a, 0x7a, 0x19, 0x2a, + 0x01, 0xd2, 0x01, 0x32, 0x4a, 0x72, 0x20, 0x22, + 0xb0, 0x60, 0x30, 0x68, 0x9b, 0x6f, 0x98, 0x42, + 0x3c, 0x00, 0x90, 0x05, 0x01, 0x00, 0x04, 0xd1, + 0x00, 0x2a, 0x00, 0xd1, 0x48, 0x79, 0x4a, 0x71, + 0x06, 0xe0, 0x10, 0x2a, 0x04, 0xd3, 0x70, 0x60, + 0x33, 0x60, 0x48, 0x79, 0x88, 0x71, 0xf6, 0xe7, + 0xca, 0x71, 0x70, 0xbd, 0x00, 0x00, 0xa4, 0x6c, + 0x01, 0x00, 0xa3, 0x04, 0x00, 0x00, 0x71, 0x02, + 0x00, 0x00, 0x35, 0x0c, 0x00, 0x00, 0x05, 0x48, + 0x80, 0xb5, 0x81, 0x7b, 0x00, 0x29, 0x05, 0xd0, + 0x00, 0x21, 0x3c, 0x00, 0xcc, 0x05, 0x01, 0x00, + 0x81, 0x73, 0x03, 0x49, 0x0f, 0x20, 0x01, 0xf0, + 0x0f, 0xff, 0x80, 0xbd, 0x74, 0x66, 0x01, 0x00, + 0xe9, 0x03, 0x01, 0x00, 0xf8, 0xb5, 0x04, 0x1c, + 0x02, 0xf0, 0xe2, 0xfb, 0x05, 0x1c, 0x38, 0x4e, + 0x20, 0x1c, 0x37, 0x49, 0x34, 0x1c, 0xa0, 0x34, + 0x10, 0x22, 0x44, 0x39, 0x01, 0x28, 0x2c, 0xd0, + 0x04, 0x28, 0x4e, 0xd1, 0x37, 0x1c, 0x74, 0x36, + 0x09, 0xce, 0x26, 0x78, 0x3c, 0x00, 0x08, 0x06, + 0x01, 0x00, 0xc0, 0x1a, 0x20, 0x2e, 0x04, 0xd1, + 0x30, 0x4e, 0xb0, 0x42, 0x01, 0xd9, 0x00, 0x26, + 0x4e, 0x61, 0x3e, 0x1c, 0x3f, 0x6c, 0x00, 0x2f, + 0x48, 0xd1, 0x77, 0x6c, 0x00, 0x2f, 0x45, 0xd1, + 0xb7, 0x6a, 0x00, 0x2f, 0x3d, 0xd0, 0x77, 0x6b, + 0x00, 0x2f, 0x3a, 0xd0, 0x27, 0x4f, 0xb8, 0x42, + 0x37, 0xd2, 0x60, 0x78, 0x10, 0x28, 0x06, 0xd3, + 0xf0, 0x6f, 0x18, 0x1a, 0x24, 0x4b, 0x3c, 0x00, + 0x44, 0x06, 0x01, 0x00, 0x98, 0x42, 0x01, 0xd2, + 0xe2, 0x70, 0xf5, 0x66, 0x48, 0x69, 0x06, 0x28, + 0x2f, 0xd2, 0x01, 0x30, 0x2c, 0xe0, 0x20, 0x78, + 0x20, 0x28, 0x01, 0xd1, 0x06, 0x23, 0x4b, 0x61, + 0x02, 0x23, 0x23, 0x71, 0xb3, 0x6a, 0x00, 0x2b, + 0x19, 0xd0, 0x49, 0x69, 0x03, 0x29, 0x16, 0xd9, + 0x71, 0x6b, 0x73, 0x6d, 0x59, 0x40, 0x12, 0xd0, + 0xe1, 0x78, 0x10, 0x29, 0x10, 0xd3, 0x61, 0x78, + 0x3c, 0x00, 0x80, 0x06, 0x01, 0x00, 0x33, 0x1c, + 0x10, 0x29, 0x0c, 0xd3, 0xd9, 0x6f, 0x69, 0x1a, + 0x13, 0x4d, 0xa9, 0x42, 0x07, 0xd2, 0x58, 0x6c, + 0x00, 0x28, 0x02, 0xd0, 0x98, 0x6c, 0x00, 0x28, + 0x00, 0xd1, 0x22, 0x71, 0xf8, 0xbd, 0x02, 0x28, + 0xfc, 0xd1, 0x22, 0x70, 0xfa, 0xe7, 0x48, 0x69, + 0x00, 0x28, 0x01, 0xd0, 0x01, 0x38, 0x48, 0x61, + 0x0a, 0x49, 0xf0, 0x6e, 0x40, 0x18, 0x02, 0xf0, + 0xb0, 0xfa, 0x3c, 0x00, 0xbc, 0x06, 0x01, 0x00, + 0x00, 0x28, 0xee, 0xd0, 0x01, 0x20, 0xe0, 0x70, + 0x06, 0x48, 0x28, 0x18, 0xf0, 0x66, 0xe8, 0xe7, + 0xa4, 0x6c, 0x01, 0x00, 0xe2, 0x04, 0x00, 0x00, + 0x1a, 0x06, 0x00, 0x00, 0x53, 0x07, 0x00, 0x00, + 0x00, 0x2d, 0x31, 0x01, 0x00, 0x5a, 0x62, 0x02, + 0x80, 0xb5, 0x41, 0x68, 0x09, 0x79, 0xc9, 0x07, + 0x13, 0xd5, 0xc1, 0x69, 0x00, 0x29, 0x0d, 0xd0, + 0x89, 0x79, 0x02, 0x29, 0x3c, 0x00, 0xf8, 0x06, + 0x01, 0x00, 0x0a, 0xd1, 0x08, 0x21, 0x01, 0x86, + 0x01, 0x1c, 0x38, 0x31, 0x81, 0x62, 0x02, 0x1c, + 0x06, 0x48, 0x04, 0x49, 0xf9, 0xf7, 0xfd, 0xfc, + 0x80, 0xbd, 0xf7, 0xf7, 0xdc, 0xfb, 0x80, 0xbd, + 0xf7, 0xf7, 0x23, 0xfb, 0x80, 0xbd, 0xb9, 0x71, + 0x00, 0x00, 0xa0, 0x6a, 0x01, 0x00, 0x10, 0xb5, + 0x00, 0x24, 0x00, 0x28, 0x03, 0xd0, 0x02, 0xf0, + 0xe8, 0xfe, 0x00, 0x28, 0x17, 0xd0, 0x3c, 0x00, + 0x34, 0x07, 0x01, 0x00, 0x0c, 0x4c, 0x01, 0x20, + 0xa0, 0x72, 0x20, 0x68, 0x00, 0x21, 0x41, 0x62, + 0x0a, 0x49, 0x02, 0x68, 0xc9, 0x78, 0x60, 0x32, + 0x91, 0x71, 0x21, 0x89, 0x01, 0x31, 0x21, 0x81, + 0x00, 0x68, 0x40, 0x30, 0x81, 0x83, 0xfb, 0xf7, + 0x31, 0xfc, 0x20, 0x68, 0x00, 0x68, 0xfc, 0xf7, + 0xa1, 0xf9, 0x01, 0x24, 0x20, 0x1c, 0x10, 0xbd, + 0x14, 0x7a, 0x01, 0x00, 0x0e, 0x61, 0x01, 0x00, + 0x3c, 0x00, 0x70, 0x07, 0x01, 0x00, 0x7f, 0xb5, + 0x06, 0x1c, 0x1e, 0x48, 0x1d, 0x1c, 0x43, 0x88, + 0x02, 0x88, 0x1c, 0x21, 0x00, 0x20, 0x90, 0xb0, + 0xf0, 0xf7, 0x45, 0xff, 0x03, 0x90, 0x04, 0x68, + 0xff, 0x21, 0x01, 0x31, 0x21, 0x80, 0x08, 0x20, + 0x60, 0x80, 0x06, 0x20, 0x20, 0x71, 0x04, 0x20, + 0x60, 0x71, 0xc0, 0x01, 0x00, 0x2d, 0x00, 0xd1, + 0x08, 0x1c, 0xe0, 0x80, 0x01, 0xa8, 0x02, 0x30, + 0x31, 0x1c, 0x3c, 0x00, 0xac, 0x07, 0x01, 0x00, + 0x05, 0x1c, 0xfa, 0xf7, 0x5f, 0xfa, 0x10, 0x49, + 0x68, 0x46, 0xfa, 0xf7, 0x5b, 0xfa, 0x20, 0x1c, + 0x08, 0x30, 0x69, 0x46, 0xfa, 0xf7, 0x56, 0xfa, + 0x29, 0x1c, 0x20, 0x1c, 0x12, 0x30, 0xfa, 0xf7, + 0x51, 0xfa, 0x10, 0xab, 0x98, 0x88, 0x00, 0x22, + 0x01, 0x21, 0x20, 0x83, 0xd8, 0x88, 0x60, 0x83, + 0x18, 0x89, 0xe0, 0x81, 0x58, 0x89, 0x20, 0x82, + 0x68, 0x46, 0xf9, 0xf7, 0x3c, 0x00, 0xe8, 0x07, + 0x01, 0x00, 0x17, 0xff, 0x14, 0xb0, 0x70, 0xbd, + 0x00, 0x00, 0x14, 0x6e, 0x01, 0x00, 0x12, 0x61, + 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x18, 0x48, + 0x25, 0x1c, 0x00, 0x78, 0x60, 0x35, 0x80, 0x07, + 0x00, 0x28, 0x08, 0xda, 0xe8, 0x79, 0x00, 0x28, + 0x05, 0xd0, 0xf4, 0xf7, 0x70, 0xff, 0x01, 0x1c, + 0x20, 0x1c, 0x00, 0xf0, 0x78, 0xf9, 0x29, 0x88, + 0x2e, 0x20, 0x00, 0x5d, 0xf2, 0xf7, 0x3c, 0x00, + 0x24, 0x08, 0x01, 0x00, 0x9f, 0xfa, 0xe8, 0x79, + 0x00, 0x28, 0x0b, 0xd1, 0x20, 0x1c, 0x40, 0x30, + 0x01, 0x8b, 0x22, 0x69, 0x11, 0x80, 0x41, 0x8b, + 0x22, 0x69, 0x51, 0x80, 0x80, 0x8b, 0x21, 0x69, + 0xc8, 0x82, 0x07, 0xe0, 0x01, 0x28, 0x05, 0xd1, + 0x20, 0x69, 0x01, 0x22, 0x01, 0x88, 0xd2, 0x02, + 0x11, 0x43, 0x01, 0x80, 0x6a, 0x7a, 0xe0, 0x68, + 0x02, 0x49, 0xf2, 0xf7, 0x53, 0xfa, 0xb0, 0xbd, + 0x3c, 0x00, 0x60, 0x08, 0x01, 0x00, 0x1d, 0x75, + 0x01, 0x00, 0xd1, 0x4f, 0x00, 0x00, 0x90, 0xb5, + 0x04, 0x1c, 0x38, 0x23, 0x0c, 0x49, 0x58, 0x43, + 0x43, 0x18, 0x85, 0xb0, 0x00, 0x20, 0x0a, 0x49, + 0x02, 0x90, 0x18, 0x1c, 0x01, 0x22, 0x03, 0x91, + 0x09, 0x49, 0x04, 0x92, 0x30, 0x30, 0x42, 0x78, + 0x09, 0x88, 0x01, 0x92, 0x00, 0x91, 0x01, 0x78, + 0x5a, 0x6b, 0x0c, 0x33, 0x20, 0x1c, 0xfb, 0xf7, + 0x7c, 0xf8, 0x3c, 0x00, 0x9c, 0x08, 0x01, 0x00, + 0x05, 0xb0, 0x90, 0xbd, 0xd4, 0xe4, 0x01, 0x00, + 0x5d, 0x4e, 0x00, 0x00, 0x48, 0x7b, 0x01, 0x00, + 0x90, 0xb5, 0x85, 0xb0, 0x03, 0x1c, 0x00, 0x20, + 0x02, 0x90, 0x0a, 0x49, 0x18, 0x1c, 0x00, 0x22, + 0x04, 0x92, 0x60, 0x30, 0x03, 0x91, 0xc2, 0x79, + 0x01, 0x88, 0x01, 0x92, 0x00, 0x91, 0x5a, 0x6a, + 0xdc, 0x68, 0x20, 0x33, 0x99, 0x7b, 0x40, 0x7a, + 0x23, 0x1c, 0xfb, 0xf7, 0x3c, 0x00, 0xd8, 0x08, + 0x01, 0x00, 0x5d, 0xf8, 0x05, 0xb0, 0x90, 0xbd, + 0x00, 0x00, 0x0d, 0x4f, 0x00, 0x00, 0x07, 0x49, + 0x80, 0xb5, 0x88, 0x6a, 0x00, 0x28, 0x08, 0xd1, + 0x01, 0x20, 0x88, 0x62, 0xf0, 0xf7, 0xaf, 0xfc, + 0x01, 0x1c, 0x03, 0x48, 0x00, 0x22, 0xf2, 0xf7, + 0xb8, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x78, 0x69, + 0x01, 0x00, 0x41, 0xe4, 0x00, 0x00, 0xf0, 0xb5, + 0x9b, 0xb0, 0x00, 0x28, 0x20, 0xd0, 0x3c, 0x00, + 0x14, 0x09, 0x01, 0x00, 0x01, 0x1c, 0x08, 0xa8, + 0xfc, 0xf7, 0xb2, 0xfd, 0x01, 0x20, 0x11, 0x90, + 0x03, 0x20, 0x10, 0xad, 0x28, 0x72, 0x04, 0x20, + 0x68, 0x72, 0x05, 0xa8, 0x00, 0x22, 0x69, 0x46, + 0xf4, 0xf7, 0x00, 0xff, 0x00, 0x24, 0x00, 0x26, + 0x05, 0xa9, 0x00, 0x20, 0xf9, 0xf7, 0xfc, 0xfa, + 0x69, 0x46, 0xf9, 0xf7, 0xf9, 0xfa, 0x0b, 0x90, + 0x08, 0xa8, 0xfc, 0xf7, 0xbb, 0xfd, 0x01, 0x34, + 0x3c, 0x00, 0x50, 0x09, 0x01, 0x00, 0x02, 0x2c, + 0x2e, 0x72, 0xf0, 0xdb, 0x1b, 0xb0, 0xf0, 0xbd, + 0x00, 0x00, 0x90, 0xb5, 0x04, 0x1c, 0x4c, 0x23, + 0x0c, 0x49, 0x58, 0x43, 0x43, 0x18, 0x85, 0xb0, + 0x00, 0x20, 0x0a, 0x49, 0x02, 0x90, 0x00, 0x22, + 0x04, 0x92, 0x3c, 0x20, 0x03, 0x91, 0xc2, 0x5c, + 0x08, 0x48, 0x41, 0x88, 0x01, 0x92, 0x41, 0x20, + 0x00, 0x91, 0xc1, 0x5c, 0x5a, 0x68, 0x08, 0x33, + 0x20, 0x1c, 0x3c, 0x00, 0x8c, 0x09, 0x01, 0x00, + 0xfb, 0xf7, 0x02, 0xf8, 0x05, 0xb0, 0x90, 0xbd, + 0x58, 0xe3, 0x01, 0x00, 0x75, 0x4f, 0x00, 0x00, + 0x3c, 0x7c, 0x01, 0x00, 0xf8, 0xb5, 0x0e, 0x1c, + 0x22, 0x4c, 0x38, 0x21, 0x17, 0x1c, 0x05, 0x1c, + 0x20, 0x1c, 0xef, 0xf7, 0x75, 0xfd, 0x23, 0x1c, + 0x25, 0x33, 0x21, 0x1c, 0x24, 0x31, 0x10, 0x20, + 0x6a, 0x46, 0xf9, 0xf7, 0x1d, 0xf8, 0x00, 0xab, + 0x18, 0x88, 0x07, 0x21, 0x3c, 0x00, 0xc8, 0x09, + 0x01, 0x00, 0x1a, 0x4a, 0x02, 0x38, 0x20, 0x84, + 0x20, 0x1c, 0x20, 0x30, 0x81, 0x70, 0xc5, 0x70, + 0x11, 0x1c, 0x06, 0x73, 0x47, 0x73, 0x34, 0x31, + 0x21, 0x63, 0x30, 0x32, 0x62, 0x63, 0x01, 0x79, + 0x25, 0x1c, 0x10, 0x35, 0x21, 0x81, 0x20, 0x60, + 0xe5, 0x60, 0x18, 0x88, 0x40, 0x1a, 0x20, 0x83, + 0x20, 0x1c, 0x28, 0x30, 0x20, 0x61, 0x20, 0x1c, + 0xf9, 0xf7, 0x11, 0xf8, 0x0d, 0x48, 0x3c, 0x00, + 0x04, 0x0a, 0x01, 0x00, 0x00, 0x68, 0x00, 0x28, + 0x07, 0xd0, 0x06, 0x21, 0x20, 0x1c, 0xf8, 0xf7, + 0x47, 0xfd, 0x10, 0x21, 0x28, 0x1c, 0xf8, 0xf7, + 0x43, 0xfd, 0x08, 0x48, 0x02, 0x21, 0x01, 0x62, + 0x44, 0x62, 0x01, 0x21, 0x01, 0x62, 0x06, 0x48, + 0x00, 0x68, 0xef, 0xf7, 0xd5, 0xfc, 0xf8, 0xbd, + 0x8c, 0x8e, 0x01, 0x00, 0xe4, 0xfe, 0x01, 0x00, + 0xcc, 0x5c, 0x01, 0x00, 0x00, 0x30, 0x07, 0x00, + 0x3c, 0x00, 0x40, 0x0a, 0x01, 0x00, 0x5c, 0x5b, + 0x01, 0x00, 0xf0, 0xb5, 0x06, 0x1c, 0x40, 0x36, + 0x31, 0x8b, 0x04, 0x1c, 0x25, 0x1c, 0x08, 0x07, + 0x80, 0x0f, 0x60, 0x35, 0x01, 0x28, 0x85, 0xb0, + 0x3b, 0xd0, 0xe8, 0x79, 0x00, 0x28, 0x05, 0xd1, + 0x20, 0x69, 0x01, 0x80, 0xb0, 0x8b, 0x21, 0x69, + 0xc8, 0x82, 0x07, 0xe0, 0x01, 0x28, 0x05, 0xd1, + 0x20, 0x69, 0x01, 0x22, 0x01, 0x88, 0xd2, 0x02, + 0x11, 0x43, 0x3c, 0x00, 0x7c, 0x0a, 0x01, 0x00, + 0x01, 0x80, 0x20, 0x48, 0x00, 0x78, 0x80, 0x07, + 0x26, 0xd5, 0xe8, 0x79, 0x00, 0x28, 0x23, 0xd0, + 0xa0, 0x6b, 0x00, 0x28, 0x1c, 0xd0, 0xf4, 0xf7, + 0x2f, 0xfe, 0x00, 0x28, 0x09, 0xd0, 0xb8, 0x21, + 0x09, 0x58, 0x00, 0x29, 0x05, 0xd0, 0x30, 0x21, + 0x09, 0x5d, 0xb4, 0x30, 0x08, 0x18, 0x07, 0x7a, + 0x00, 0xe0, 0x00, 0x27, 0x01, 0x21, 0x38, 0x1c, + 0xfa, 0xf7, 0x86, 0xf9, 0x3c, 0x00, 0xb8, 0x0a, + 0x01, 0x00, 0x04, 0x90, 0x20, 0x69, 0x04, 0x30, + 0x39, 0x1c, 0xf4, 0xf7, 0x6c, 0xfd, 0x04, 0x99, + 0xfa, 0xf7, 0xd3, 0xf9, 0x02, 0xe0, 0x20, 0x1c, + 0xf7, 0xf7, 0xf9, 0xfb, 0x70, 0x83, 0x70, 0x8b, + 0x21, 0x69, 0x00, 0x22, 0x48, 0x80, 0x09, 0x49, + 0x0a, 0x48, 0x04, 0x92, 0x03, 0x91, 0x02, 0x90, + 0xea, 0x79, 0x29, 0x88, 0x01, 0x92, 0x00, 0x91, + 0x62, 0x6a, 0xe3, 0x68, 0x20, 0x34, 0x3c, 0x00, + 0xf4, 0x0a, 0x01, 0x00, 0xa1, 0x7b, 0x68, 0x7a, + 0xfa, 0xf7, 0x4c, 0xff, 0x05, 0xb0, 0xf0, 0xbd, + 0x1d, 0x75, 0x01, 0x00, 0xd1, 0x4f, 0x00, 0x00, + 0xdd, 0x2f, 0x01, 0x00, 0xfe, 0xb5, 0x04, 0x1c, + 0x26, 0x1c, 0x01, 0x20, 0x20, 0x36, 0x00, 0x29, + 0x02, 0x90, 0x2e, 0xd0, 0x58, 0x20, 0x00, 0x5b, + 0x00, 0x07, 0x80, 0x0f, 0x01, 0x28, 0x01, 0xd1, + 0xcc, 0x31, 0x00, 0xe0, 0xb4, 0x31, 0x48, 0x68, + 0x3c, 0x00, 0x30, 0x0b, 0x01, 0x00, 0x0d, 0x1c, + 0x00, 0x28, 0x24, 0xd0, 0x20, 0x1c, 0x60, 0x30, + 0xc2, 0x79, 0x01, 0x21, 0x01, 0x2a, 0x00, 0xd0, + 0x00, 0x21, 0x27, 0x1c, 0x62, 0x6d, 0x30, 0x37, + 0x00, 0x2a, 0x04, 0xd0, 0x3a, 0x1c, 0x28, 0x1c, + 0xf6, 0xf7, 0xe7, 0xfd, 0x07, 0xe0, 0x42, 0x7a, + 0x23, 0x1c, 0x68, 0x33, 0x00, 0x92, 0x3a, 0x1c, + 0x28, 0x1c, 0xf6, 0xf7, 0x9a, 0xfd, 0x02, 0x90, + 0x38, 0x78, 0x3c, 0x00, 0x6c, 0x0b, 0x01, 0x00, + 0x40, 0x19, 0x00, 0x7a, 0x01, 0x21, 0xb0, 0x73, + 0xfa, 0xf7, 0x26, 0xf9, 0x01, 0xe0, 0x00, 0x20, + 0xb0, 0x73, 0x60, 0x62, 0xb0, 0x7b, 0x0d, 0x28, + 0x01, 0xd9, 0xf0, 0xf7, 0xbb, 0xfb, 0x02, 0x98, + 0xfe, 0xbd, 0x00, 0x00, 0xff, 0xb5, 0x04, 0x1c, + 0x80, 0x30, 0x25, 0x1c, 0x5e, 0x35, 0x00, 0x78, + 0xae, 0x1d, 0xaf, 0x1f, 0x00, 0x28, 0x83, 0xb0, + 0x12, 0xd1, 0xf4, 0xf7, 0x3c, 0x00, 0xa8, 0x0b, + 0x01, 0x00, 0xc7, 0xfb, 0x00, 0x28, 0x07, 0xd0, + 0x06, 0x98, 0x05, 0x99, 0x02, 0x90, 0x04, 0x98, + 0x01, 0x90, 0xa6, 0x61, 0x67, 0x61, 0x0d, 0xe0, + 0x04, 0x98, 0x06, 0x99, 0x02, 0x90, 0x05, 0x98, + 0x01, 0x90, 0x66, 0x61, 0x05, 0xe0, 0x04, 0xa9, + 0x03, 0xc9, 0x02, 0x90, 0x06, 0x98, 0x01, 0x90, + 0x67, 0x61, 0xa5, 0x61, 0x06, 0x22, 0x38, 0x1c, + 0xef, 0xf7, 0x8b, 0xfc, 0x06, 0x22, 0x3c, 0x00, + 0xe4, 0x0b, 0x01, 0x00, 0x28, 0x1c, 0x02, 0x99, + 0xef, 0xf7, 0x86, 0xfc, 0x06, 0x22, 0x30, 0x1c, + 0x01, 0x99, 0xef, 0xf7, 0x81, 0xfc, 0x07, 0xb0, + 0xf0, 0xbd, 0x00, 0x00, 0xb0, 0xb5, 0x0d, 0x1c, + 0x04, 0x1c, 0x05, 0x28, 0x01, 0xd3, 0xf0, 0xf7, + 0x7b, 0xfb, 0x02, 0x49, 0xa0, 0x00, 0x08, 0x58, + 0x85, 0x60, 0xb0, 0xbd, 0x10, 0x7b, 0x01, 0x00, + 0xf8, 0xb5, 0xff, 0xf7, 0x59, 0xf9, 0x05, 0x1c, + 0x3c, 0x00, 0x20, 0x0c, 0x01, 0x00, 0xfe, 0xf7, + 0xe8, 0xff, 0x04, 0x1c, 0x28, 0x1c, 0xff, 0xf7, + 0x58, 0xf9, 0x00, 0x28, 0x42, 0xd0, 0x69, 0x1e, + 0x21, 0x4d, 0x4a, 0x00, 0x20, 0x4b, 0x1c, 0x3d, + 0xae, 0x5c, 0x98, 0x5c, 0x30, 0x40, 0xd6, 0x18, + 0x01, 0x23, 0xf6, 0x56, 0x52, 0x19, 0xd2, 0x56, + 0x96, 0x42, 0x01, 0xdd, 0x15, 0x1c, 0x00, 0xe0, + 0x35, 0x1c, 0x18, 0x4b, 0x2a, 0x3b, 0x59, 0x56, + 0x51, 0x18, 0x3c, 0x00, 0x5c, 0x0c, 0x01, 0x00, + 0xb1, 0x42, 0x00, 0xdb, 0x31, 0x1c, 0x0e, 0x1c, + 0x00, 0x28, 0x26, 0xd0, 0xfe, 0xf7, 0xbe, 0xff, + 0x00, 0x90, 0x00, 0xab, 0x18, 0x78, 0x12, 0x49, + 0x00, 0x23, 0xc9, 0x56, 0x00, 0xab, 0x15, 0x22, + 0x10, 0x1a, 0x5b, 0x78, 0x00, 0x1b, 0x40, 0x18, + 0xd2, 0x1a, 0x12, 0x1b, 0x51, 0x18, 0x00, 0x22, + 0x85, 0x42, 0x02, 0xdb, 0x00, 0xab, 0x1a, 0x70, + 0x02, 0xe0, 0x40, 0x1b, 0x3c, 0x00, 0x98, 0x0c, + 0x01, 0x00, 0x00, 0xab, 0x18, 0x70, 0x8e, 0x42, + 0x02, 0xdb, 0x00, 0xab, 0x5a, 0x70, 0x02, 0xe0, + 0x88, 0x1b, 0x00, 0xab, 0x58, 0x70, 0x00, 0x98, + 0xff, 0xf7, 0x8d, 0xf8, 0x01, 0xf0, 0xff, 0xf8, + 0xf8, 0xbd, 0xe6, 0x78, 0x01, 0x00, 0x65, 0x73, + 0x01, 0x00, 0x70, 0xb5, 0x08, 0x4e, 0x06, 0x4d, + 0x00, 0x24, 0x06, 0x20, 0x60, 0x43, 0x80, 0x19, + 0x06, 0x22, 0x29, 0x1c, 0xef, 0xf7, 0x3c, 0x00, + 0xd4, 0x0c, 0x01, 0x00, 0x11, 0xfc, 0x01, 0x34, + 0x05, 0x2c, 0xf5, 0xdb, 0x70, 0xbd, 0x00, 0x00, + 0x4e, 0x47, 0x01, 0x00, 0xe6, 0x7a, 0x01, 0x00, + 0x03, 0x48, 0x80, 0xb5, 0x01, 0x68, 0x03, 0x48, + 0xfe, 0xf7, 0x42, 0xfb, 0x80, 0xbd, 0x00, 0x00, + 0xa8, 0x79, 0x01, 0x00, 0xc4, 0x60, 0x01, 0x00, + 0x03, 0x48, 0x80, 0xb5, 0x01, 0x68, 0x03, 0x48, + 0xfe, 0xf7, 0x4a, 0xfb, 0x80, 0xbd, 0x00, 0x00, + 0x3c, 0x00, 0x10, 0x0d, 0x01, 0x00, 0xa8, 0x79, + 0x01, 0x00, 0xc4, 0x60, 0x01, 0x00, 0x10, 0xb5, + 0x00, 0x28, 0x0a, 0xd0, 0x06, 0x4c, 0xa1, 0x69, + 0x00, 0x29, 0x01, 0xd1, 0x00, 0x20, 0x00, 0xe0, + 0x09, 0x68, 0xf7, 0xf7, 0x38, 0xfb, 0xa0, 0x61, + 0x10, 0xbd, 0x00, 0x20, 0x10, 0xbd, 0xa4, 0x6e, + 0x01, 0x00, 0xf3, 0xb5, 0x37, 0x48, 0x83, 0xb0, + 0x02, 0x90, 0x80, 0x79, 0x0e, 0x1c, 0x00, 0x27, + 0x01, 0x90, 0x3c, 0x00, 0x4c, 0x0d, 0x01, 0x00, + 0x34, 0x48, 0x35, 0x4a, 0x01, 0x6a, 0x03, 0x9c, + 0x03, 0x1c, 0x1b, 0x69, 0xa1, 0x42, 0x01, 0xd0, + 0x93, 0x61, 0x00, 0xe0, 0x53, 0x61, 0x31, 0x49, + 0x8a, 0x68, 0x96, 0x42, 0x3f, 0xd0, 0x2d, 0x48, + 0x8e, 0x60, 0xc1, 0x68, 0x00, 0x24, 0x25, 0x1c, + 0x00, 0x29, 0x2d, 0x48, 0x09, 0xd0, 0x00, 0x2e, + 0x0b, 0xd0, 0x28, 0x48, 0x01, 0x24, 0xc0, 0x6a, + 0x24, 0x03, 0x00, 0x28, 0x3c, 0x00, 0x88, 0x0d, + 0x01, 0x00, 0x06, 0xd0, 0x01, 0x27, 0x04, 0xe0, + 0x00, 0x2e, 0x01, 0xd0, 0x05, 0x1c, 0xf9, 0xe7, + 0x04, 0x1c, 0x00, 0x2f, 0x06, 0xd0, 0xfb, 0xf7, + 0x1e, 0xfb, 0x1f, 0x48, 0x01, 0x68, 0x22, 0x48, + 0xfe, 0xf7, 0xfb, 0xfa, 0x20, 0x1c, 0x28, 0x43, + 0x0e, 0xd0, 0x2a, 0x1c, 0x21, 0x1c, 0x01, 0x20, + 0x02, 0xf0, 0x21, 0xfe, 0x2a, 0x1c, 0x21, 0x1c, + 0x02, 0x20, 0x02, 0xf0, 0x1c, 0xfe, 0x3c, 0x00, + 0xc4, 0x0d, 0x01, 0x00, 0x2a, 0x1c, 0x21, 0x1c, + 0x03, 0x20, 0x02, 0xf0, 0x17, 0xfe, 0x00, 0x2f, + 0x06, 0xd1, 0x13, 0x48, 0x01, 0x68, 0x16, 0x48, + 0xfe, 0xf7, 0xce, 0xfa, 0xfa, 0xf7, 0x42, 0xfd, + 0x03, 0x9c, 0x00, 0x2c, 0x01, 0xd1, 0x01, 0xf0, + 0xe1, 0xff, 0x01, 0xa9, 0x03, 0xc9, 0x88, 0x71, + 0x01, 0xf0, 0xdc, 0xff, 0x0a, 0x4c, 0x0a, 0x4b, + 0x44, 0x3c, 0xa1, 0x69, 0x22, 0x69, 0x08, 0x3b, + 0x3c, 0x00, 0x00, 0x0e, 0x01, 0x00, 0x41, 0x1a, + 0x00, 0x2a, 0x03, 0xd0, 0x1a, 0x68, 0x51, 0x18, + 0x19, 0x60, 0x02, 0xe0, 0x5a, 0x68, 0x51, 0x18, + 0x59, 0x60, 0xa0, 0x61, 0x26, 0x61, 0x05, 0xb0, + 0xf0, 0xbd, 0x20, 0x10, 0x07, 0x00, 0xa4, 0x6c, + 0x01, 0x00, 0x10, 0x00, 0x07, 0x00, 0xb0, 0x57, + 0x01, 0x00, 0x00, 0x10, 0x60, 0x00, 0x84, 0x73, + 0x01, 0x00, 0x1c, 0xb5, 0x4c, 0x23, 0x08, 0x49, + 0x58, 0x43, 0x3c, 0x00, 0x3c, 0x0e, 0x01, 0x00, + 0x44, 0x18, 0x20, 0x1c, 0x40, 0x30, 0x41, 0x78, + 0x62, 0x68, 0x00, 0x91, 0x01, 0x92, 0x3f, 0x21, + 0x0b, 0x5d, 0x61, 0x8f, 0x00, 0x78, 0x62, 0x6c, + 0xfa, 0xf7, 0x28, 0xf8, 0xa0, 0x85, 0x1c, 0xbd, + 0x58, 0xe3, 0x01, 0x00, 0xb0, 0xb5, 0x16, 0x4d, + 0xa9, 0x69, 0x00, 0x29, 0x25, 0xd0, 0x2c, 0x1c, + 0x30, 0x34, 0x20, 0x7a, 0x00, 0x28, 0x20, 0xd0, + 0x00, 0x23, 0x81, 0x22, 0x3c, 0x00, 0x78, 0x0e, + 0x01, 0x00, 0x18, 0x20, 0x02, 0xf0, 0x89, 0xfc, + 0x20, 0x7a, 0xff, 0x30, 0x00, 0x06, 0x00, 0x0e, + 0x20, 0x72, 0x12, 0xd1, 0x0c, 0x48, 0x28, 0x21, + 0x2c, 0x38, 0x09, 0x5c, 0x21, 0x72, 0x29, 0x7a, + 0x00, 0x29, 0x01, 0xd1, 0x00, 0x6a, 0x00, 0xe0, + 0x40, 0x6a, 0xa9, 0x69, 0x80, 0x02, 0x81, 0x42, + 0x03, 0xd2, 0x49, 0x00, 0x81, 0x42, 0x01, 0xd2, + 0xa9, 0x61, 0xb0, 0xbd, 0xa8, 0x61, 0x3c, 0x00, + 0xb4, 0x0e, 0x01, 0x00, 0xb0, 0xbd, 0x01, 0xf0, + 0x1d, 0xf9, 0xb0, 0xbd, 0xf4, 0x6e, 0x01, 0x00, + 0x7f, 0xb5, 0x05, 0x1c, 0x04, 0x20, 0x6b, 0x46, + 0x1b, 0x18, 0x02, 0x90, 0x00, 0x26, 0x28, 0x18, + 0x6a, 0x46, 0x02, 0xa9, 0xfc, 0xf7, 0x8a, 0xfb, + 0x00, 0x28, 0x06, 0xd1, 0x00, 0xab, 0x18, 0x79, + 0x04, 0x28, 0x08, 0xd0, 0x18, 0x79, 0x03, 0x28, + 0x05, 0xd0, 0x00, 0xab, 0x18, 0x79, 0x10, 0x21, + 0x3c, 0x00, 0xf0, 0x0e, 0x01, 0x00, 0x08, 0x43, + 0x04, 0xb0, 0x70, 0xbd, 0x03, 0xa9, 0xe8, 0x68, + 0xf6, 0xf7, 0xd3, 0xff, 0x00, 0x28, 0x05, 0xd0, + 0x03, 0x98, 0x20, 0x21, 0x08, 0x43, 0x00, 0x06, + 0x00, 0x0e, 0xf1, 0xe7, 0x03, 0xa9, 0x00, 0x20, + 0xf6, 0xf7, 0xc7, 0xff, 0x04, 0x1c, 0x01, 0xd1, + 0x02, 0x20, 0xe9, 0xe7, 0xe8, 0x68, 0x00, 0xab, + 0x20, 0x60, 0x00, 0x98, 0x60, 0x60, 0x18, 0x79, + 0xa0, 0x76, 0x3c, 0x00, 0x2c, 0x0f, 0x01, 0x00, + 0xa8, 0x8c, 0x60, 0x76, 0xe8, 0x69, 0x20, 0x61, + 0x68, 0x8c, 0xa0, 0x82, 0x28, 0x8c, 0x20, 0x76, + 0x69, 0x69, 0x09, 0x48, 0x81, 0x42, 0x00, 0xd9, + 0x08, 0x1c, 0xa0, 0x60, 0x20, 0x1c, 0x02, 0xf0, + 0xa1, 0xfd, 0xa1, 0x68, 0x00, 0x29, 0x04, 0xd0, + 0x03, 0x9a, 0xa1, 0x32, 0x08, 0x20, 0x02, 0xf0, + 0x37, 0xfb, 0x30, 0x1c, 0xc7, 0xe7, 0x00, 0x00, + 0xa0, 0x86, 0x01, 0x00, 0x3c, 0x00, 0x68, 0x0f, + 0x01, 0x00, 0xfe, 0xb5, 0x06, 0x1c, 0x40, 0x78, + 0x01, 0x24, 0x06, 0x28, 0x50, 0xd3, 0xc1, 0x1e, + 0x03, 0x20, 0xef, 0xf7, 0x5e, 0xfb, 0x00, 0x90, + 0x0e, 0x28, 0x49, 0xd8, 0x00, 0x20, 0x0a, 0xe0, + 0x41, 0x00, 0x09, 0x18, 0x89, 0x19, 0x4a, 0x79, + 0x89, 0x79, 0x51, 0x18, 0x01, 0x39, 0x0e, 0x29, + 0x00, 0xd9, 0x00, 0x24, 0x01, 0x30, 0x00, 0x99, + 0x88, 0x42, 0xf1, 0xdb, 0x00, 0x2c, 0x3c, 0x00, + 0xa4, 0x0f, 0x01, 0x00, 0x37, 0xd0, 0x03, 0x22, + 0xb1, 0x1c, 0x1b, 0x48, 0xef, 0xf7, 0xa4, 0xfa, + 0x1a, 0x4c, 0x1c, 0x21, 0x20, 0x1c, 0xef, 0xf7, + 0x4d, 0xfa, 0x00, 0x25, 0x28, 0xe0, 0x69, 0x00, + 0x49, 0x19, 0x02, 0x91, 0x8a, 0x19, 0x53, 0x79, + 0x15, 0x48, 0x43, 0x54, 0x93, 0x79, 0x0f, 0x18, + 0x7b, 0x70, 0xd3, 0x79, 0xbb, 0x70, 0x07, 0x23, + 0xd2, 0x56, 0x01, 0x92, 0x44, 0x5c, 0x0f, 0xe0, + 0x3c, 0x00, 0xe0, 0x0f, 0x01, 0x00, 0x20, 0x1c, + 0xfe, 0xf7, 0x7b, 0xff, 0x00, 0x28, 0x07, 0xd0, + 0x0c, 0x4a, 0x60, 0x00, 0x80, 0x18, 0x01, 0x21, + 0x10, 0x38, 0x81, 0x73, 0x01, 0x99, 0xc1, 0x73, + 0x01, 0x34, 0x24, 0x06, 0x24, 0x0e, 0x07, 0x48, + 0x02, 0x99, 0x40, 0x5c, 0x79, 0x78, 0x40, 0x18, + 0xa0, 0x42, 0xe8, 0xd8, 0x01, 0x35, 0x00, 0x98, + 0x85, 0x42, 0xd3, 0xdb, 0xfe, 0xbd, 0xe8, 0x62, + 0x01, 0x00, 0x3c, 0x00, 0x1c, 0x10, 0x01, 0x00, + 0xe6, 0x78, 0x01, 0x00, 0xeb, 0x62, 0x01, 0x00, + 0x01, 0x68, 0x0f, 0x29, 0x01, 0xdd, 0x0f, 0x21, + 0x01, 0x60, 0x01, 0x68, 0x00, 0x29, 0x01, 0xda, + 0x00, 0x21, 0x01, 0x60, 0x70, 0x47, 0x00, 0x00, + 0xf8, 0xb5, 0x04, 0x1c, 0x1e, 0x48, 0x22, 0x1d, + 0x05, 0x68, 0x00, 0x92, 0x16, 0x1c, 0x23, 0x1c, + 0x0f, 0x1c, 0xcc, 0x33, 0x2a, 0x1c, 0x20, 0x1c, + 0x70, 0x30, 0xa1, 0x6d, 0x3c, 0x00, 0x58, 0x10, + 0x01, 0x00, 0x00, 0xf0, 0x3e, 0xf9, 0x00, 0x96, + 0xa1, 0x6d, 0x27, 0x20, 0x01, 0x40, 0x23, 0x1c, + 0xe4, 0x33, 0x20, 0x1c, 0x2a, 0x1c, 0x5c, 0x30, + 0x00, 0xf0, 0x33, 0xf9, 0x13, 0x48, 0x00, 0x78, + 0x0e, 0x28, 0x01, 0xd2, 0x01, 0x25, 0x85, 0x40, + 0x11, 0x48, 0xa1, 0x69, 0x00, 0x78, 0x29, 0x40, + 0x00, 0x07, 0x0b, 0xd4, 0x48, 0x07, 0x03, 0xd5, + 0x08, 0x07, 0x01, 0xd5, 0x04, 0x20, 0x3c, 0x00, + 0x94, 0x10, 0x01, 0x00, 0x81, 0x43, 0x88, 0x06, + 0x03, 0xd5, 0x48, 0x06, 0x01, 0xd5, 0x20, 0x20, + 0x81, 0x43, 0x23, 0x1c, 0xb4, 0x33, 0x2a, 0x1c, + 0x20, 0x1c, 0x30, 0x30, 0x00, 0x96, 0x00, 0xf0, + 0x13, 0xf9, 0x39, 0x1c, 0x20, 0x1c, 0xf0, 0xf7, + 0x47, 0xfc, 0xf8, 0xbd, 0x2c, 0x7d, 0x01, 0x00, + 0x10, 0x67, 0x01, 0x00, 0x1d, 0x75, 0x01, 0x00, + 0xb0, 0xb5, 0xf2, 0xf7, 0x27, 0xfc, 0xfe, 0xf7, + 0x3c, 0x00, 0xd0, 0x10, 0x01, 0x00, 0x09, 0xf9, + 0x0f, 0x48, 0x00, 0x25, 0x45, 0x70, 0x0e, 0x48, + 0x0d, 0x4c, 0x00, 0x88, 0x5b, 0x34, 0xa0, 0x82, + 0xf9, 0xf7, 0x23, 0xfd, 0x20, 0x61, 0xa0, 0x8a, + 0x00, 0x28, 0x04, 0xd0, 0x01, 0x21, 0x89, 0x05, + 0xef, 0xf7, 0x0d, 0xfb, 0xe1, 0x82, 0x05, 0x48, + 0x01, 0x38, 0x45, 0x60, 0x01, 0xf0, 0x55, 0xfe, + 0x02, 0x1c, 0x23, 0x1c, 0x00, 0x21, 0x00, 0x20, + 0xf4, 0xf7, 0x3c, 0x00, 0x0c, 0x11, 0x01, 0x00, + 0x49, 0xfd, 0xb0, 0xbd, 0x45, 0x7d, 0x01, 0x00, + 0xf4, 0x67, 0x01, 0x00, 0x70, 0xb5, 0x16, 0x1c, + 0x5a, 0x89, 0x04, 0x1c, 0x04, 0x98, 0x92, 0x07, + 0x92, 0x0f, 0x00, 0x25, 0x00, 0x29, 0xa2, 0x71, + 0x09, 0xd0, 0x05, 0x21, 0xf9, 0xf7, 0x24, 0xfb, + 0x00, 0x28, 0x01, 0xd0, 0xc0, 0x78, 0x00, 0xe0, + 0x01, 0x20, 0xe0, 0x71, 0x00, 0xe0, 0xe5, 0x71, + 0xe5, 0x60, 0xa6, 0x60, 0x3c, 0x00, 0x48, 0x11, + 0x01, 0x00, 0x70, 0xbd, 0x00, 0x00, 0xfe, 0xb5, + 0x05, 0x1c, 0x0e, 0x22, 0x9c, 0x30, 0x16, 0x49, + 0xef, 0xf7, 0xcf, 0xf9, 0x29, 0x1c, 0x28, 0x1c, + 0x80, 0x30, 0x88, 0x31, 0x00, 0x24, 0x2f, 0x1c, + 0x60, 0x37, 0x02, 0x91, 0x01, 0x90, 0x20, 0x06, + 0x00, 0x0e, 0x06, 0x1c, 0xf9, 0xf7, 0x0d, 0xfe, + 0x00, 0x28, 0x03, 0xd0, 0x01, 0x98, 0x42, 0x68, + 0x02, 0x99, 0x01, 0xe0, 0xea, 0x6d, 0x3c, 0x00, + 0x84, 0x11, 0x01, 0x00, 0x39, 0x1c, 0x00, 0x2a, + 0x0d, 0xd0, 0x00, 0x20, 0x03, 0xe0, 0x0b, 0x5c, + 0xb3, 0x42, 0x02, 0xd8, 0x01, 0x30, 0x90, 0x42, + 0xf9, 0xdb, 0x08, 0x18, 0x10, 0x38, 0xc0, 0x7b, + 0x29, 0x19, 0x90, 0x31, 0x08, 0x73, 0x01, 0x34, + 0x0e, 0x2c, 0xdf, 0xd3, 0xfe, 0xbd, 0x00, 0x00, + 0xcc, 0x47, 0x01, 0x00, 0xff, 0xb5, 0x81, 0xb0, + 0x14, 0x1c, 0x10, 0x1c, 0x06, 0x22, 0x0d, 0x1c, + 0x3c, 0x00, 0xc0, 0x11, 0x01, 0x00, 0x19, 0x1c, + 0x0b, 0x9e, 0x0a, 0x9f, 0xef, 0xf7, 0x97, 0xf9, + 0x06, 0x22, 0x39, 0x1c, 0xa0, 0x18, 0xef, 0xf7, + 0x92, 0xf9, 0xe6, 0x60, 0x2c, 0x60, 0x10, 0x20, + 0x28, 0x81, 0x6e, 0x60, 0x01, 0x98, 0xe8, 0x60, + 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0x70, 0xb5, + 0x04, 0x1c, 0x00, 0x20, 0x20, 0x61, 0x58, 0x20, + 0x00, 0x5d, 0x0e, 0x1c, 0x15, 0x1c, 0xc0, 0x07, + 0xc0, 0x17, 0x3c, 0x00, 0xfc, 0x11, 0x01, 0x00, + 0x01, 0x30, 0xe0, 0x61, 0x21, 0x6b, 0x00, 0x29, + 0x36, 0xd1, 0x1e, 0x49, 0x09, 0x68, 0x29, 0x43, + 0x32, 0xd0, 0xa1, 0x68, 0x89, 0x8a, 0x00, 0x29, + 0x2e, 0xd0, 0x00, 0x28, 0x0b, 0xd0, 0x20, 0x1c, + 0x58, 0x30, 0x00, 0xf0, 0xf3, 0xfd, 0x00, 0x28, + 0x1b, 0xd0, 0x81, 0x6a, 0x02, 0x6a, 0x40, 0x6a, + 0x09, 0x78, 0x00, 0x78, 0x06, 0xe0, 0x14, 0x4a, + 0x3c, 0x23, 0x11, 0x78, 0x3c, 0x00, 0x38, 0x12, + 0x01, 0x00, 0x50, 0x78, 0x43, 0x43, 0x9a, 0x18, + 0x04, 0x32, 0x00, 0x2d, 0x03, 0xd1, 0x02, 0x29, + 0x01, 0xd0, 0x03, 0x29, 0x02, 0xd1, 0x6d, 0x21, + 0x22, 0x61, 0x08, 0x55, 0x20, 0x69, 0x00, 0x28, + 0x0d, 0xd0, 0x81, 0x88, 0x00, 0x29, 0x01, 0xd1, + 0x01, 0x20, 0x70, 0xbd, 0x80, 0x79, 0x02, 0x28, + 0x05, 0xd1, 0x22, 0x1c, 0x07, 0x49, 0x07, 0x48, + 0xf8, 0xf7, 0x4b, 0xff, 0x02, 0xe0, 0x3c, 0x00, + 0x74, 0x12, 0x01, 0x00, 0x20, 0x1c, 0xef, 0xf7, + 0xb5, 0xf8, 0x00, 0x20, 0x70, 0xbd, 0x00, 0x00, + 0x28, 0x61, 0x01, 0x00, 0x68, 0x61, 0x01, 0x00, + 0xa1, 0xda, 0x00, 0x00, 0xa0, 0x6a, 0x01, 0x00, + 0x10, 0xb5, 0x00, 0x21, 0x00, 0x20, 0xf9, 0xf7, + 0x39, 0xfe, 0xc4, 0x00, 0xf9, 0xf7, 0x54, 0xfe, + 0x24, 0x18, 0xf9, 0xf7, 0x47, 0xfe, 0x08, 0x49, + 0x20, 0x18, 0x09, 0x88, 0x08, 0x4c, 0x40, 0x18, + 0x3c, 0x00, 0xb0, 0x12, 0x01, 0x00, 0x06, 0x49, + 0x09, 0x88, 0x40, 0x18, 0x60, 0x61, 0xf9, 0xf7, + 0x46, 0xfe, 0x05, 0x49, 0x09, 0x88, 0x40, 0x18, + 0x40, 0x00, 0xa0, 0x61, 0x10, 0xbd, 0x02, 0x61, + 0x01, 0x00, 0x04, 0x61, 0x01, 0x00, 0xd4, 0x79, + 0x01, 0x00, 0xa6, 0x69, 0x01, 0x00, 0x11, 0x40, + 0x08, 0x1c, 0x10, 0xb5, 0x1c, 0x1c, 0x19, 0x1c, + 0x08, 0x31, 0x18, 0x60, 0xf1, 0xf7, 0x31, 0xfe, + 0x60, 0x60, 0x3c, 0x00, 0xec, 0x12, 0x01, 0x00, + 0x10, 0xbd, 0x00, 0x00, 0xf8, 0xb5, 0x06, 0x1c, + 0x22, 0x48, 0x0f, 0x1c, 0x41, 0x68, 0x91, 0x42, + 0x03, 0xd0, 0x00, 0x21, 0x81, 0x60, 0xc1, 0x60, + 0x42, 0x60, 0xc4, 0x68, 0x15, 0xe0, 0x28, 0x20, + 0x1d, 0x49, 0x60, 0x43, 0x40, 0x18, 0x05, 0x1c, + 0x06, 0x22, 0x31, 0x1c, 0xef, 0xf7, 0x70, 0xf8, + 0x00, 0x28, 0x07, 0xd1, 0xa8, 0x1d, 0x39, 0x1c, + 0xf9, 0xf7, 0x10, 0xfd, 0x3c, 0x00, 0x28, 0x13, + 0x01, 0x00, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x20, + 0xf8, 0xbd, 0x01, 0x34, 0x24, 0x07, 0x24, 0x0f, + 0x12, 0x48, 0x80, 0x68, 0x84, 0x42, 0xe5, 0xd1, + 0x10, 0x4c, 0x28, 0x23, 0xa0, 0x68, 0x0f, 0x4d, + 0x58, 0x43, 0x40, 0x19, 0x06, 0x22, 0x31, 0x1c, + 0xef, 0xf7, 0xd3, 0xf8, 0xa0, 0x68, 0x28, 0x23, + 0x58, 0x43, 0x40, 0x19, 0x06, 0x30, 0x22, 0x22, + 0x39, 0x1c, 0xef, 0xf7, 0xca, 0xf8, 0x3c, 0x00, + 0x64, 0x13, 0x01, 0x00, 0xa0, 0x68, 0x01, 0x30, + 0x00, 0x07, 0x00, 0x0f, 0xa0, 0x60, 0xe1, 0x68, + 0x81, 0x42, 0x03, 0xd1, 0x01, 0x31, 0x08, 0x07, + 0x00, 0x0f, 0xe0, 0x60, 0x00, 0x20, 0xd6, 0xe7, + 0xec, 0x65, 0x01, 0x00, 0xa0, 0xf4, 0x01, 0x00, + 0x10, 0xb5, 0x00, 0x21, 0x03, 0x20, 0x00, 0xf0, + 0xe5, 0xff, 0x05, 0x4c, 0xa0, 0x68, 0x00, 0x28, + 0x04, 0xd1, 0x01, 0xf0, 0x07, 0xfd, 0x61, 0x68, + 0x3c, 0x00, 0xa0, 0x13, 0x01, 0x00, 0x40, 0x1a, + 0x60, 0x60, 0x10, 0xbd, 0x00, 0x00, 0xd0, 0x60, + 0x01, 0x00, 0x02, 0x68, 0x0a, 0x60, 0x01, 0x60, + 0x70, 0x47, 0x01, 0x1c, 0x00, 0x68, 0x00, 0x28, + 0x01, 0xd0, 0x02, 0x68, 0x0a, 0x60, 0x70, 0x47, + 0x00, 0x00, 0xfe, 0xb5, 0x14, 0x1c, 0x1d, 0x1c, + 0x00, 0x22, 0xd2, 0x43, 0x01, 0xab, 0xf3, 0xf7, + 0x82, 0xff, 0x01, 0x98, 0x00, 0x26, 0x28, 0x40, + 0x01, 0x90, 0x3c, 0x00, 0xdc, 0x13, 0x01, 0x00, + 0x00, 0x25, 0x00, 0x27, 0x20, 0x60, 0x1e, 0xe0, + 0x01, 0x21, 0xb9, 0x40, 0x0a, 0x1c, 0x02, 0x40, + 0x18, 0xd0, 0x88, 0x43, 0x01, 0x90, 0x39, 0x06, + 0x09, 0x0e, 0x70, 0x19, 0x00, 0x19, 0x02, 0x91, + 0x01, 0x77, 0x08, 0x1c, 0xf9, 0xf7, 0xc6, 0xfc, + 0x00, 0x28, 0x06, 0xd0, 0x30, 0x1c, 0x00, 0x19, + 0x01, 0x36, 0x02, 0x99, 0x30, 0x30, 0x01, 0x70, + 0x04, 0xe0, 0x28, 0x1c, 0x3c, 0x00, 0x18, 0x14, + 0x01, 0x00, 0x01, 0x35, 0x02, 0x99, 0x00, 0x19, + 0x01, 0x72, 0x01, 0x37, 0x01, 0x98, 0x00, 0x28, + 0xdd, 0xd1, 0x70, 0x19, 0xa0, 0x61, 0x65, 0x60, + 0xe6, 0x62, 0xfe, 0xbd, 0x00, 0x00, 0xb0, 0xb5, + 0x14, 0x4d, 0x04, 0x1c, 0x28, 0x7a, 0x01, 0x28, + 0x02, 0xd1, 0x04, 0x20, 0xf6, 0xf7, 0xad, 0xf9, + 0x21, 0x1c, 0xa8, 0x6a, 0xf5, 0xf7, 0x21, 0xfc, + 0x00, 0x28, 0x03, 0xd1, 0x04, 0x20, 0x3c, 0x00, + 0x54, 0x14, 0x01, 0x00, 0xf6, 0xf7, 0xa4, 0xf9, + 0xb0, 0xbd, 0x02, 0x20, 0x28, 0x70, 0x28, 0x8c, + 0x00, 0x28, 0x00, 0xd0, 0x60, 0x81, 0x68, 0x8c, + 0x00, 0x28, 0x00, 0xd0, 0xa0, 0x81, 0xa8, 0x8c, + 0x00, 0x28, 0x00, 0xd0, 0xe0, 0x81, 0xe8, 0x69, + 0x01, 0x23, 0x02, 0x04, 0x12, 0x0c, 0x20, 0x1c, + 0x02, 0x49, 0xfc, 0xf7, 0x19, 0xff, 0xb0, 0xbd, + 0xf4, 0x6e, 0x01, 0x00, 0xa1, 0x77, 0x00, 0x00, + 0x3c, 0x00, 0x90, 0x14, 0x01, 0x00, 0xf8, 0xb5, + 0x19, 0x4e, 0x05, 0x1c, 0xb0, 0x69, 0x00, 0x28, + 0x00, 0xd1, 0x30, 0x68, 0xff, 0xf7, 0x3b, 0xfc, + 0x15, 0x4f, 0x04, 0x1c, 0x50, 0x37, 0x00, 0x28, + 0x0b, 0xd0, 0x60, 0x68, 0x29, 0x1c, 0x78, 0x60, + 0x01, 0x20, 0x38, 0x63, 0x20, 0x1c, 0xf5, 0xf7, + 0xea, 0xfb, 0x00, 0x28, 0x04, 0xd1, 0x00, 0x20, + 0xf8, 0xbd, 0x00, 0x23, 0xfb, 0x62, 0xfa, 0xe7, + 0x00, 0x23, 0x3c, 0x00, 0xcc, 0x14, 0x01, 0x00, + 0x23, 0x77, 0xf8, 0x6a, 0x00, 0x28, 0x01, 0xd1, + 0x01, 0x20, 0xf8, 0x62, 0x38, 0x7a, 0x01, 0x28, + 0x07, 0xd0, 0xf8, 0x69, 0x06, 0x49, 0x02, 0x04, + 0x12, 0x0c, 0x28, 0x1c, 0xfc, 0xf7, 0xe6, 0xfe, + 0x01, 0xe0, 0xfb, 0x62, 0xb3, 0x61, 0x01, 0x20, + 0xe5, 0xe7, 0x00, 0x00, 0xa4, 0x6e, 0x01, 0x00, + 0xdd, 0x02, 0x01, 0x00, 0x70, 0xb5, 0x0d, 0x1c, + 0x04, 0x1c, 0x16, 0x1c, 0x3c, 0x00, 0x08, 0x15, + 0x01, 0x00, 0x04, 0x2c, 0x1b, 0xd2, 0x10, 0x48, + 0x83, 0x42, 0x07, 0xd2, 0x58, 0x00, 0x0f, 0x49, + 0xef, 0xf7, 0xfb, 0xf8, 0xff, 0x30, 0x00, 0x0a, + 0x01, 0x38, 0x00, 0xe0, 0x00, 0x20, 0x1f, 0x35, + 0xea, 0x06, 0x61, 0x07, 0x09, 0x0e, 0xd2, 0x0e, + 0x11, 0x43, 0x72, 0x07, 0x52, 0x0d, 0x11, 0x43, + 0x00, 0x06, 0x00, 0x0a, 0x08, 0x43, 0x06, 0x4a, + 0xa1, 0x00, 0x50, 0x50, 0x70, 0xbd, 0x3c, 0x00, + 0x44, 0x15, 0x01, 0x00, 0x01, 0x21, 0x8d, 0x20, + 0xef, 0xf7, 0xac, 0xfe, 0x70, 0xbd, 0x00, 0x00, + 0x40, 0x9c, 0x00, 0x00, 0x00, 0x80, 0x38, 0x01, + 0xe8, 0x60, 0x01, 0x00, 0x09, 0x4a, 0x80, 0x00, + 0x10, 0x58, 0x40, 0x09, 0x40, 0x01, 0x07, 0x22, + 0x02, 0x43, 0x07, 0x48, 0x03, 0x68, 0x00, 0x2b, + 0xfc, 0xdb, 0x42, 0x60, 0x09, 0x06, 0x01, 0x60, + 0x01, 0x68, 0x00, 0x29, 0xfc, 0xdb, 0x08, 0x20, + 0x3c, 0x00, 0x80, 0x15, 0x01, 0x00, 0x70, 0x47, + 0x00, 0x00, 0xe8, 0x60, 0x01, 0x00, 0x30, 0x20, + 0x07, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x0d, 0x1c, + 0x07, 0x49, 0xa0, 0x00, 0x08, 0x58, 0x00, 0x28, + 0x03, 0xd1, 0x02, 0x21, 0x8d, 0x20, 0xef, 0xf7, + 0x80, 0xfe, 0x29, 0x1c, 0x20, 0x1c, 0xf6, 0xf7, + 0xa8, 0xfa, 0xb0, 0xbd, 0x00, 0x00, 0xe8, 0x60, + 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, 0x0d, 0x1c, + 0x07, 0x49, 0x3c, 0x00, 0xbc, 0x15, 0x01, 0x00, + 0xa0, 0x00, 0x08, 0x58, 0x00, 0x28, 0x03, 0xd1, + 0x02, 0x21, 0x8d, 0x20, 0xef, 0xf7, 0x6c, 0xfe, + 0x29, 0x1c, 0x20, 0x1c, 0xff, 0xf7, 0xc4, 0xff, + 0xb0, 0xbd, 0x00, 0x00, 0xe8, 0x60, 0x01, 0x00, + 0xf8, 0xb5, 0x0d, 0x1c, 0x16, 0x1c, 0xf7, 0xf7, + 0x17, 0xf9, 0x04, 0x1c, 0x28, 0x68, 0x40, 0x4f, + 0x81, 0x78, 0x00, 0x29, 0x3b, 0xd1, 0xc1, 0x78, + 0x00, 0x29, 0x58, 0xd1, 0x3c, 0x00, 0xf8, 0x15, + 0x01, 0x00, 0xf8, 0xf7, 0xf8, 0xf9, 0x22, 0x8e, + 0x61, 0x8e, 0x8a, 0x42, 0x04, 0xd0, 0xa1, 0x6a, + 0x09, 0x18, 0xe0, 0x69, 0x81, 0x42, 0x10, 0xd9, + 0x38, 0x49, 0x32, 0x1c, 0x48, 0x6b, 0x01, 0x30, + 0x48, 0x63, 0x20, 0x6a, 0x01, 0x30, 0x20, 0x62, + 0x38, 0x68, 0x01, 0x30, 0x38, 0x60, 0xe0, 0x68, + 0x63, 0x69, 0x29, 0x1c, 0xee, 0xf7, 0xd8, 0xfe, + 0xf8, 0xbd, 0x01, 0x32, 0x12, 0x04, 0x3c, 0x00, + 0x34, 0x16, 0x01, 0x00, 0x12, 0x0c, 0x22, 0x86, + 0xa1, 0x62, 0xb8, 0x68, 0x00, 0x28, 0x34, 0xd1, + 0x2c, 0x48, 0x0c, 0x23, 0x00, 0x68, 0x1b, 0x1a, + 0x9a, 0x42, 0x07, 0xd2, 0x19, 0x23, 0x9b, 0x01, + 0xaf, 0x22, 0x92, 0x01, 0x58, 0x43, 0x10, 0x1a, + 0x81, 0x42, 0x26, 0xd3, 0x01, 0x20, 0xb8, 0x60, + 0x01, 0x21, 0x0c, 0x20, 0x00, 0xf0, 0x7a, 0xfe, + 0x1f, 0xe0, 0x01, 0x29, 0x1d, 0xd1, 0xc0, 0x78, + 0x3c, 0x00, 0x70, 0x16, 0x01, 0x00, 0x17, 0x28, + 0x1a, 0xd1, 0xa0, 0x8e, 0xe1, 0x8e, 0x88, 0x42, + 0x14, 0xd3, 0xe9, 0x68, 0x09, 0x68, 0x09, 0x79, + 0x09, 0x06, 0x0f, 0xd5, 0x60, 0x6a, 0x32, 0x1c, + 0x01, 0x30, 0x60, 0x62, 0xe0, 0x68, 0x63, 0x69, + 0x29, 0x1c, 0xee, 0xf7, 0xa3, 0xfe, 0xe8, 0x68, + 0x01, 0x68, 0x08, 0x31, 0x0b, 0x20, 0x00, 0xf0, + 0x5c, 0xfe, 0xc3, 0xe7, 0x01, 0x30, 0xa0, 0x86, + 0xa0, 0x8d, 0x3c, 0x00, 0xac, 0x16, 0x01, 0x00, + 0xe1, 0x8d, 0x88, 0x42, 0x04, 0xd1, 0x03, 0x21, + 0x02, 0x20, 0xef, 0xf7, 0xf5, 0xfd, 0xb8, 0xe7, + 0x60, 0x68, 0x45, 0x60, 0x86, 0x60, 0x00, 0x68, + 0x60, 0x60, 0xf8, 0x68, 0x01, 0x30, 0xf8, 0x60, + 0xa0, 0x8d, 0x41, 0x1c, 0xa1, 0x85, 0x00, 0x28, + 0xab, 0xd1, 0x08, 0x48, 0xb9, 0x69, 0xfd, 0xf7, + 0x61, 0xfe, 0x22, 0x1c, 0x02, 0x21, 0xf1, 0x20, + 0x02, 0xf0, 0x64, 0xf8, 0x3c, 0x00, 0xe8, 0x16, + 0x01, 0x00, 0xa1, 0xe7, 0x00, 0x00, 0xfc, 0x5a, + 0x01, 0x00, 0x90, 0x5c, 0x01, 0x00, 0x18, 0x57, + 0x01, 0x00, 0xc4, 0x60, 0x01, 0x00, 0x80, 0xb5, + 0x02, 0x1c, 0x02, 0x21, 0xf0, 0x20, 0x02, 0xf0, + 0x54, 0xf8, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x28, + 0x03, 0xd1, 0x02, 0x48, 0x41, 0x78, 0xc9, 0x07, + 0xfc, 0xd5, 0x70, 0x47, 0x00, 0x00, 0x04, 0x00, + 0x07, 0x00, 0x80, 0xb5, 0x00, 0x06, 0x3c, 0x00, + 0x24, 0x17, 0x01, 0x00, 0x01, 0xd1, 0xf1, 0xf7, + 0x71, 0xfe, 0x80, 0xbd, 0x80, 0xb5, 0xf4, 0xf7, + 0xe5, 0xfa, 0x80, 0xbd, 0x80, 0xb5, 0xf6, 0xf7, + 0xeb, 0xf8, 0x80, 0xbd, 0x01, 0x49, 0x00, 0x20, + 0x08, 0x74, 0x70, 0x47, 0x78, 0x69, 0x01, 0x00, + 0x80, 0xb5, 0xc0, 0x07, 0x03, 0xd5, 0x02, 0x49, + 0x01, 0x20, 0x00, 0xf0, 0x1d, 0xfc, 0x80, 0xbd, + 0x50, 0xc3, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0e, + 0x3c, 0x00, 0x60, 0x17, 0x01, 0x00, 0x01, 0x28, + 0x80, 0xb5, 0x02, 0xd1, 0xf6, 0xf7, 0xe1, 0xf9, + 0x80, 0xbd, 0x00, 0x28, 0xfc, 0xd1, 0xf1, 0xf7, + 0x4c, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, + 0xf6, 0xf7, 0xd7, 0xf9, 0x80, 0xbd, 0x03, 0x49, + 0x80, 0xb5, 0x00, 0x20, 0x08, 0x74, 0xf6, 0xf7, + 0xfe, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x78, 0x69, + 0x01, 0x00, 0x80, 0xb5, 0x00, 0x06, 0x00, 0x0e, + 0xf1, 0xf7, 0x3c, 0x00, 0x9c, 0x17, 0x01, 0x00, + 0x71, 0xfe, 0x80, 0xbd, 0x10, 0xb5, 0x01, 0x28, + 0x08, 0xd0, 0x02, 0x28, 0x03, 0xd0, 0x03, 0x28, + 0x01, 0xd0, 0xef, 0xf7, 0xa7, 0xfd, 0xf6, 0xf7, + 0xe9, 0xf9, 0x10, 0xbd, 0x01, 0xf0, 0xf8, 0xfa, + 0x04, 0x1c, 0xfa, 0xf7, 0x5d, 0xfd, 0x24, 0x1a, + 0xfa, 0xf7, 0x3e, 0xfd, 0x08, 0x49, 0x00, 0x28, + 0x0b, 0xd0, 0x48, 0x6a, 0x00, 0x28, 0x08, 0xd0, + 0x06, 0x48, 0x84, 0x42, 0x3c, 0x00, 0xd8, 0x17, + 0x01, 0x00, 0x05, 0xd2, 0x01, 0x1b, 0x01, 0x22, + 0x07, 0x20, 0x01, 0xf0, 0xf4, 0xfe, 0xe5, 0xe7, + 0x00, 0x20, 0x48, 0x61, 0xe2, 0xe7, 0x78, 0x69, + 0x01, 0x00, 0x50, 0xc3, 0x00, 0x00, 0x09, 0x49, + 0x80, 0xb5, 0x48, 0x69, 0x00, 0x28, 0x0c, 0xd0, + 0x08, 0x6a, 0xca, 0x69, 0x80, 0x1a, 0x00, 0x28, + 0x07, 0xdd, 0x00, 0x20, 0x48, 0x61, 0x01, 0x21, + 0x07, 0x20, 0x01, 0xf0, 0x10, 0xff, 0x3c, 0x00, + 0x14, 0x18, 0x01, 0x00, 0xf6, 0xf7, 0xb8, 0xf9, + 0x80, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, + 0x80, 0xb5, 0x00, 0xf0, 0xe7, 0xfb, 0x80, 0xbd, + 0x80, 0xb5, 0x00, 0xf0, 0x3f, 0xfc, 0x00, 0x20, + 0xf7, 0xf7, 0xd4, 0xfc, 0x80, 0xbd, 0x00, 0x00, + 0x80, 0xb5, 0x00, 0xf0, 0x37, 0xfc, 0xfd, 0xf7, + 0x6f, 0xfc, 0xf5, 0xf7, 0x73, 0xfd, 0x30, 0xf0, + 0x47, 0xfb, 0x80, 0xbd, 0x04, 0x48, 0x80, 0xb5, + 0x3c, 0x00, 0x50, 0x18, 0x01, 0x00, 0xc1, 0x6a, + 0x00, 0x6b, 0xf2, 0xf7, 0xde, 0xff, 0x01, 0x20, + 0xf7, 0xf7, 0x89, 0xf8, 0x80, 0xbd, 0xa4, 0x6c, + 0x01, 0x00, 0x10, 0xb5, 0xf3, 0xf7, 0x41, 0xf8, + 0x0d, 0x4c, 0x00, 0x28, 0x04, 0xd0, 0x01, 0x20, + 0xe0, 0x64, 0xf7, 0xf7, 0xb2, 0xfc, 0x10, 0xbd, + 0x01, 0x21, 0x01, 0x20, 0xf3, 0xf7, 0xe9, 0xf8, + 0xfd, 0xf7, 0x4d, 0xfc, 0x60, 0x6d, 0x00, 0x28, + 0x03, 0xd0, 0x3c, 0x00, 0x8c, 0x18, 0x01, 0x00, + 0xf3, 0xf7, 0x82, 0xf8, 0x00, 0x28, 0x01, 0xd0, + 0xf5, 0xf7, 0x4a, 0xfd, 0x01, 0x20, 0xf2, 0xf7, + 0xc1, 0xfc, 0x10, 0xbd, 0xa4, 0x6c, 0x01, 0x00, + 0x04, 0x48, 0x80, 0xb5, 0xc1, 0x6a, 0x00, 0x6b, + 0xf2, 0xf7, 0xb2, 0xff, 0x01, 0x20, 0xf7, 0xf7, + 0x5d, 0xf8, 0x80, 0xbd, 0xa4, 0x6c, 0x01, 0x00, + 0x80, 0xb5, 0x00, 0xf0, 0xf5, 0xfb, 0xf5, 0xf7, + 0x33, 0xfd, 0xfc, 0xf7, 0x3c, 0x00, 0xc8, 0x18, + 0x01, 0x00, 0x31, 0xfd, 0xf9, 0xf7, 0xcb, 0xff, + 0x04, 0x20, 0xf2, 0xf7, 0xa6, 0xfc, 0x80, 0xbd, + 0x00, 0x00, 0x03, 0x48, 0x80, 0xb5, 0xc1, 0x6a, + 0x00, 0x6b, 0xf2, 0xf7, 0x98, 0xff, 0x80, 0xbd, + 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x80, 0xb5, + 0x00, 0xf0, 0xdd, 0xfb, 0x00, 0x20, 0xf7, 0xf7, + 0x3c, 0xf8, 0x30, 0xf0, 0xee, 0xfa, 0x80, 0xbd, + 0x00, 0x00, 0x80, 0xb5, 0x00, 0x21, 0x3c, 0x00, + 0x04, 0x19, 0x01, 0x00, 0x01, 0x20, 0xff, 0xf7, + 0x19, 0xfa, 0x01, 0x20, 0xf2, 0xf7, 0x88, 0xfc, + 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x00, 0xf0, + 0xc9, 0xfb, 0xfc, 0xf7, 0x07, 0xfd, 0x01, 0x21, + 0x01, 0x20, 0xff, 0xf7, 0x0b, 0xfa, 0x04, 0x20, + 0xf2, 0xf7, 0x7a, 0xfc, 0x80, 0xbd, 0x00, 0x00, + 0x80, 0xb5, 0x00, 0x22, 0x00, 0x21, 0x00, 0x20, + 0x00, 0xf0, 0x8a, 0xfb, 0x80, 0xbd, 0x00, 0x00, + 0x3c, 0x00, 0x40, 0x19, 0x01, 0x00, 0x03, 0x48, + 0x80, 0xb5, 0x82, 0x6a, 0x01, 0x21, 0x04, 0x20, + 0x00, 0xf0, 0x81, 0xfb, 0x80, 0xbd, 0xd4, 0x79, + 0x01, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x00, 0x21, + 0x03, 0x20, 0x00, 0xf0, 0x78, 0xfb, 0x80, 0xbd, + 0x00, 0x00, 0x03, 0x48, 0x80, 0xb5, 0x82, 0x6a, + 0x01, 0x21, 0x04, 0x20, 0x00, 0xf0, 0x6f, 0xfb, + 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x80, 0xb5, + 0x00, 0x22, 0x3c, 0x00, 0x7c, 0x19, 0x01, 0x00, + 0x00, 0x21, 0x03, 0x20, 0x00, 0xf0, 0x66, 0xfb, + 0x80, 0xbd, 0x00, 0x00, 0x06, 0x48, 0x80, 0xb5, + 0x81, 0x68, 0x42, 0x69, 0x00, 0x69, 0x51, 0x18, + 0x81, 0x42, 0x03, 0xd9, 0x01, 0x21, 0x01, 0x20, + 0x00, 0xf0, 0x58, 0xfb, 0x80, 0xbd, 0x00, 0x00, + 0xd4, 0x79, 0x01, 0x00, 0x06, 0x48, 0x80, 0xb5, + 0x82, 0x88, 0x81, 0x68, 0x00, 0x69, 0x51, 0x18, + 0x81, 0x42, 0x03, 0xd9, 0x3c, 0x00, 0xb8, 0x19, + 0x01, 0x00, 0x01, 0x21, 0x02, 0x20, 0x00, 0xf0, + 0x48, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0xd4, 0x79, + 0x01, 0x00, 0x10, 0xb5, 0x08, 0x4c, 0x20, 0x7b, + 0x21, 0x6a, 0xf9, 0xf7, 0x9c, 0xfa, 0xa1, 0x69, + 0x42, 0x18, 0xa0, 0x68, 0x21, 0x69, 0x80, 0x18, + 0x88, 0x42, 0x03, 0xd9, 0x01, 0x21, 0x02, 0x20, + 0x00, 0xf0, 0x33, 0xfb, 0x10, 0xbd, 0xd4, 0x79, + 0x01, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x3c, 0x00, + 0xf4, 0x19, 0x01, 0x00, 0x00, 0x21, 0x00, 0x20, + 0x00, 0xf0, 0x2a, 0xfb, 0x80, 0xbd, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x0e, 0x01, 0x28, 0x80, 0xb5, + 0x02, 0xd1, 0xf6, 0xf7, 0x8f, 0xf8, 0x80, 0xbd, + 0x00, 0x28, 0xfc, 0xd1, 0xf1, 0xf7, 0xfa, 0xfc, + 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0xf6, 0xf7, + 0x85, 0xf8, 0x80, 0xbd, 0x80, 0xb5, 0x00, 0x06, + 0x00, 0x0e, 0xf1, 0xf7, 0x29, 0xfd, 0x80, 0xbd, + 0x3c, 0x00, 0x30, 0x1a, 0x01, 0x00, 0xb0, 0xb5, + 0x02, 0x25, 0x02, 0x28, 0x10, 0x4c, 0x0b, 0xd1, + 0xfb, 0xf7, 0x47, 0xfc, 0x00, 0x28, 0x01, 0xd1, + 0xfe, 0xf7, 0x4f, 0xff, 0x25, 0x70, 0xa1, 0x68, + 0x0c, 0x48, 0xfd, 0xf7, 0xa8, 0xfc, 0xb0, 0xbd, + 0x03, 0x28, 0x0d, 0xd1, 0x08, 0x48, 0x7d, 0x23, + 0x1c, 0x38, 0x00, 0x69, 0xdb, 0x00, 0x58, 0x43, + 0x19, 0x1c, 0x40, 0x18, 0x41, 0x08, 0x02, 0x20, + 0x00, 0xf0, 0x3c, 0x00, 0x6c, 0x1a, 0x01, 0x00, + 0x91, 0xfa, 0x25, 0x70, 0xb0, 0xbd, 0xf8, 0xf7, + 0x31, 0xf9, 0xb0, 0xbd, 0x78, 0x69, 0x01, 0x00, + 0x34, 0x63, 0x01, 0x00, 0x10, 0xb5, 0x05, 0x4c, + 0xe0, 0x68, 0x00, 0x28, 0x01, 0xd1, 0xef, 0xf7, + 0x39, 0xfc, 0x02, 0x20, 0x20, 0x70, 0x00, 0xf0, + 0xaf, 0xfa, 0x10, 0xbd, 0x78, 0x69, 0x01, 0x00, + 0x03, 0x48, 0x80, 0xb5, 0x82, 0x6a, 0x01, 0x21, + 0x04, 0x20, 0x00, 0xf0, 0x3c, 0x00, 0xa8, 0x1a, + 0x01, 0x00, 0xd3, 0xfa, 0x80, 0xbd, 0xd4, 0x79, + 0x01, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x00, 0x21, + 0x03, 0x20, 0x00, 0xf0, 0xca, 0xfa, 0x80, 0xbd, + 0x00, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x00, 0x21, + 0x00, 0x20, 0x00, 0xf0, 0xc2, 0xfa, 0x80, 0xbd, + 0x00, 0x00, 0x03, 0x48, 0x80, 0xb5, 0x42, 0x69, + 0x01, 0x21, 0x01, 0x20, 0x00, 0xf0, 0xb9, 0xfa, + 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, 0x3c, 0x00, + 0xe4, 0x1a, 0x01, 0x00, 0x06, 0x48, 0x80, 0xb5, + 0x82, 0x88, 0x00, 0x2a, 0x02, 0xd0, 0x01, 0x21, + 0x02, 0x20, 0x02, 0xe0, 0x00, 0x22, 0x00, 0x21, + 0x00, 0x20, 0x00, 0xf0, 0xa9, 0xfa, 0x80, 0xbd, + 0xd4, 0x79, 0x01, 0x00, 0x10, 0xb5, 0x06, 0x4c, + 0x20, 0x7b, 0x21, 0x6a, 0xf9, 0xf7, 0xfe, 0xf9, + 0xa1, 0x69, 0x42, 0x18, 0x01, 0x21, 0x02, 0x20, + 0x00, 0xf0, 0x9a, 0xfa, 0x10, 0xbd, 0x00, 0x00, + 0x3c, 0x00, 0x20, 0x1b, 0x01, 0x00, 0xd4, 0x79, + 0x01, 0x00, 0x80, 0xb5, 0x00, 0x22, 0x00, 0x21, + 0x00, 0x20, 0x00, 0xf0, 0x90, 0xfa, 0x80, 0xbd, + 0x00, 0x00, 0x38, 0xb5, 0xfa, 0xf7, 0x41, 0xfe, + 0x00, 0x20, 0xf0, 0xf7, 0x80, 0xf8, 0x00, 0x90, + 0x00, 0xab, 0x1c, 0x88, 0x5d, 0x88, 0xf8, 0xf7, + 0x3c, 0xf9, 0x00, 0x2c, 0x02, 0xd0, 0xfd, 0xf7, + 0x9e, 0xfa, 0x02, 0xe0, 0x01, 0x20, 0xf6, 0xf7, + 0x0a, 0xff, 0x3c, 0x00, 0x5c, 0x1b, 0x01, 0x00, + 0x29, 0x1c, 0x20, 0x1c, 0xfc, 0xf7, 0xb8, 0xfc, + 0x00, 0x2c, 0x02, 0xd0, 0xf5, 0xf7, 0xe0, 0xfb, + 0x02, 0xe0, 0x00, 0x20, 0x00, 0xf0, 0xdc, 0xf9, + 0x03, 0x20, 0x00, 0x2c, 0x00, 0xd1, 0x02, 0x20, + 0x00, 0x06, 0x00, 0x0e, 0xf2, 0xf7, 0x4e, 0xfb, + 0x38, 0xbd, 0x00, 0x00, 0x03, 0x48, 0x80, 0xb5, + 0x82, 0x6a, 0x01, 0x21, 0x04, 0x20, 0x00, 0xf0, + 0x5d, 0xfa, 0x80, 0xbd, 0x3c, 0x00, 0x98, 0x1b, + 0x01, 0x00, 0xd4, 0x79, 0x01, 0x00, 0x80, 0xb5, + 0x30, 0xf0, 0x9b, 0xf9, 0x80, 0xbd, 0x80, 0xb5, + 0x00, 0x22, 0x00, 0x21, 0x03, 0x20, 0x00, 0xf0, + 0x50, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x03, 0x48, + 0x80, 0xb5, 0x42, 0x69, 0x01, 0x21, 0x01, 0x20, + 0x00, 0xf0, 0x47, 0xfa, 0x80, 0xbd, 0xd4, 0x79, + 0x01, 0x00, 0x04, 0x48, 0x80, 0xb5, 0x82, 0x88, + 0x00, 0x2a, 0x03, 0xd0, 0x01, 0x21, 0x3c, 0x00, + 0xd4, 0x1b, 0x01, 0x00, 0x02, 0x20, 0x00, 0xf0, + 0x3b, 0xfa, 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, + 0x10, 0xb5, 0x06, 0x4c, 0x20, 0x7b, 0x21, 0x6a, + 0xf9, 0xf7, 0x90, 0xf9, 0xa1, 0x69, 0x42, 0x18, + 0x01, 0x21, 0x02, 0x20, 0x00, 0xf0, 0x2c, 0xfa, + 0x10, 0xbd, 0x00, 0x00, 0xd4, 0x79, 0x01, 0x00, + 0x80, 0xb5, 0xfc, 0xf7, 0x93, 0xfb, 0x01, 0x21, + 0x01, 0x20, 0xff, 0xf7, 0x97, 0xf8, 0x04, 0x20, + 0x3c, 0x00, 0x10, 0x1c, 0x01, 0x00, 0xf2, 0xf7, + 0x06, 0xfb, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, + 0x2f, 0xf0, 0x6b, 0xfb, 0x00, 0x28, 0x0a, 0xd0, + 0x01, 0x20, 0xf2, 0xf7, 0xfc, 0xfa, 0xfa, 0xf7, + 0x2a, 0xfc, 0x00, 0x28, 0x02, 0xd1, 0x04, 0x20, + 0xf6, 0xf7, 0x5d, 0xf8, 0x80, 0xbd, 0x03, 0x21, + 0x16, 0x20, 0xef, 0xf7, 0x32, 0xfb, 0x80, 0xbd, + 0x00, 0x00, 0x02, 0x48, 0x80, 0xb5, 0x00, 0x68, + 0xee, 0xf7, 0x3c, 0x00, 0x4c, 0x1c, 0x01, 0x00, + 0xc5, 0xfb, 0x80, 0xbd, 0xd4, 0x79, 0x01, 0x00, + 0x03, 0x48, 0x80, 0xb5, 0x42, 0x69, 0x01, 0x21, + 0x01, 0x20, 0x00, 0xf0, 0xf7, 0xf9, 0x80, 0xbd, + 0xd4, 0x79, 0x01, 0x00, 0x80, 0xb5, 0x30, 0xf0, + 0x35, 0xf9, 0x80, 0xbd, 0xb0, 0xb5, 0x18, 0x4c, + 0xaa, 0x20, 0x00, 0x5d, 0x04, 0x28, 0x19, 0xd1, + 0x01, 0x25, 0xe5, 0x62, 0x25, 0x63, 0x01, 0xf0, + 0x93, 0xf8, 0xa0, 0x66, 0x3c, 0x00, 0x88, 0x1c, + 0x01, 0x00, 0x01, 0xf0, 0xfc, 0xfd, 0xf2, 0xf7, + 0x2e, 0xfe, 0x00, 0x28, 0x0e, 0xd0, 0x02, 0x20, + 0xf2, 0xf7, 0xc3, 0xfa, 0xa5, 0x60, 0x01, 0xf0, + 0x86, 0xf8, 0x64, 0x30, 0x60, 0x60, 0xfa, 0xf7, + 0x8a, 0xfd, 0x01, 0x21, 0x01, 0x20, 0xff, 0xf7, + 0x46, 0xf8, 0xb0, 0xbd, 0x01, 0x20, 0xf2, 0xf7, + 0xb4, 0xfa, 0x00, 0x20, 0xa0, 0x60, 0x00, 0x21, + 0x01, 0x20, 0xff, 0xf7, 0x3c, 0xf8, 0x3c, 0x00, + 0xc4, 0x1c, 0x01, 0x00, 0xf2, 0xf7, 0x66, 0xfe, + 0x00, 0x28, 0xf1, 0xd0, 0xfa, 0xf7, 0x76, 0xfd, + 0xb0, 0xbd, 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, + 0x80, 0xb5, 0x00, 0x20, 0xef, 0xf7, 0xd6, 0xfe, + 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, 0x01, 0x20, + 0xef, 0xf7, 0xd0, 0xfe, 0x80, 0xbd, 0x00, 0x00, + 0xac, 0x21, 0x09, 0x5c, 0x02, 0x4a, 0x09, 0x02, + 0x89, 0x18, 0xc0, 0x31, 0x81, 0x60, 0x70, 0x47, + 0x3c, 0x00, 0x00, 0x1d, 0x01, 0x00, 0x70, 0x75, + 0x01, 0x00, 0x80, 0xb5, 0x01, 0x28, 0x04, 0xd1, + 0x03, 0xc9, 0x09, 0x68, 0xee, 0xf7, 0x64, 0xfb, + 0x80, 0xbd, 0x01, 0x21, 0x14, 0x20, 0xef, 0xf7, + 0xc4, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x28, + 0x02, 0xd1, 0x02, 0x48, 0x40, 0x68, 0x70, 0x47, + 0x40, 0x68, 0x70, 0x47, 0x00, 0x00, 0x58, 0x75, + 0x01, 0x00, 0x10, 0xb5, 0x00, 0x24, 0xf8, 0xf7, + 0x1c, 0xfb, 0x3c, 0x00, 0x3c, 0x1d, 0x01, 0x00, + 0x00, 0x28, 0x04, 0xd0, 0x40, 0x30, 0x80, 0x7a, + 0x05, 0x28, 0x00, 0xd1, 0x01, 0x24, 0x20, 0x1c, + 0x10, 0xbd, 0x00, 0x00, 0x04, 0x48, 0x00, 0x21, + 0x40, 0x68, 0x01, 0xe0, 0x01, 0x63, 0x40, 0x68, + 0x00, 0x28, 0xfb, 0xd1, 0x70, 0x47, 0x00, 0x00, + 0x58, 0x75, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, + 0x0d, 0x1c, 0xf7, 0xf7, 0xa5, 0xf8, 0x40, 0x34, + 0xe5, 0x72, 0xb0, 0xbd, 0x3c, 0x00, 0x78, 0x1d, + 0x01, 0x00, 0xf8, 0xb5, 0x07, 0x1c, 0xf8, 0xf7, + 0xfa, 0xfa, 0x04, 0x1c, 0x04, 0xd0, 0x05, 0x21, + 0x14, 0x20, 0xef, 0xf7, 0x8c, 0xfa, 0x28, 0xe0, + 0x00, 0x25, 0x14, 0x49, 0x28, 0x02, 0x46, 0x18, + 0x30, 0x1c, 0x44, 0x30, 0x06, 0x22, 0x12, 0x49, + 0xee, 0xf7, 0x2d, 0xfb, 0x00, 0x28, 0x02, 0xd1, + 0xac, 0x20, 0x85, 0x55, 0x34, 0x1c, 0x01, 0x35, + 0x03, 0x2d, 0xee, 0xd3, 0x00, 0x2c, 0x3c, 0x00, + 0xb4, 0x1d, 0x01, 0x00, 0x14, 0xd0, 0x39, 0x1c, + 0x20, 0x1c, 0xf8, 0xf7, 0x2b, 0xf8, 0x09, 0x49, + 0x00, 0x20, 0x20, 0x60, 0x18, 0x39, 0x48, 0x68, + 0x60, 0x60, 0x00, 0x28, 0x00, 0xd0, 0x04, 0x60, + 0x4c, 0x60, 0xca, 0x68, 0x00, 0x2a, 0x03, 0xd0, + 0x01, 0x21, 0x20, 0x1c, 0xee, 0xf7, 0xfe, 0xfa, + 0x20, 0x1c, 0xf8, 0xbd, 0x70, 0x75, 0x01, 0x00, + 0x58, 0x46, 0x01, 0x00, 0x80, 0xb5, 0xf8, 0xf7, + 0x3c, 0x00, 0xf0, 0x1d, 0x01, 0x00, 0xc1, 0xfa, + 0x00, 0x28, 0x04, 0xd1, 0x06, 0x21, 0x14, 0x20, + 0xef, 0xf7, 0x53, 0xfa, 0x80, 0xbd, 0xf5, 0xf7, + 0x16, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x80, 0xb5, + 0xf8, 0xf7, 0xb3, 0xfa, 0x80, 0xbd, 0x10, 0xb5, + 0x09, 0x4c, 0x21, 0x88, 0x02, 0x29, 0x03, 0xd1, + 0x14, 0x20, 0xef, 0xf7, 0x42, 0xfa, 0x04, 0xe0, + 0xa3, 0x68, 0x8a, 0x00, 0x98, 0x50, 0x48, 0x1c, + 0x20, 0x80, 0x3c, 0x00, 0x2c, 0x1e, 0x01, 0x00, + 0x20, 0x88, 0x01, 0x38, 0x00, 0x04, 0x00, 0x0c, + 0x10, 0xbd, 0x00, 0x00, 0x58, 0x75, 0x01, 0x00, + 0x0b, 0x1c, 0x11, 0x1c, 0x08, 0x4a, 0x80, 0xb5, + 0x12, 0x88, 0x90, 0x42, 0x06, 0xd2, 0xda, 0x68, + 0xc0, 0x00, 0x12, 0x18, 0x14, 0x20, 0x01, 0xf0, + 0xbb, 0xfb, 0x80, 0xbd, 0x03, 0x21, 0x14, 0x20, + 0xef, 0xf7, 0x22, 0xfa, 0x80, 0xbd, 0x00, 0x00, + 0x58, 0x75, 0x01, 0x00, 0x3c, 0x00, 0x68, 0x1e, + 0x01, 0x00, 0x08, 0x4a, 0x80, 0xb5, 0x12, 0x88, + 0x90, 0x42, 0x06, 0xd2, 0xc9, 0x68, 0xc0, 0x00, + 0x09, 0x18, 0x14, 0x20, 0x01, 0xf0, 0xdb, 0xfb, + 0x80, 0xbd, 0x04, 0x21, 0x14, 0x20, 0xef, 0xf7, + 0x0e, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x58, 0x75, + 0x01, 0x00, 0x01, 0x49, 0xc8, 0x60, 0x70, 0x47, + 0x00, 0x00, 0x58, 0x75, 0x01, 0x00, 0x80, 0xb5, + 0x06, 0x22, 0x44, 0x30, 0xee, 0xf7, 0x3c, 0x00, + 0xa4, 0x1e, 0x01, 0x00, 0xab, 0xfa, 0x00, 0x28, + 0x01, 0xd1, 0x01, 0x20, 0x80, 0xbd, 0x00, 0x20, + 0x80, 0xbd, 0x00, 0x00, 0x1c, 0xb5, 0x14, 0x4c, + 0x20, 0x69, 0x00, 0x28, 0x23, 0xd0, 0x20, 0x78, + 0x0a, 0x28, 0x01, 0xd0, 0x00, 0xf0, 0xfc, 0xf8, + 0x00, 0x20, 0x60, 0x61, 0x0f, 0x48, 0x40, 0x79, + 0xa0, 0x70, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x28, + 0x15, 0xd1, 0xfd, 0xf7, 0xed, 0xfe, 0x01, 0x90, + 0x3c, 0x00, 0xe0, 0x1e, 0x01, 0x00, 0xfd, 0xf7, + 0x82, 0xfe, 0x00, 0x90, 0x00, 0xab, 0x18, 0x79, + 0x19, 0x78, 0x40, 0x1a, 0x18, 0x71, 0x58, 0x79, + 0x59, 0x78, 0x40, 0x1a, 0x58, 0x71, 0x01, 0x98, + 0xf2, 0xf7, 0x89, 0xfe, 0x05, 0x20, 0x20, 0x70, + 0x00, 0xf0, 0xbf, 0xf9, 0x1c, 0xbd, 0x7c, 0x78, + 0x01, 0x00, 0x0c, 0x5a, 0x01, 0x00, 0x08, 0xb5, + 0x04, 0x4a, 0x00, 0x90, 0x14, 0x32, 0x00, 0x20, + 0x02, 0x4b, 0x3c, 0x00, 0x1c, 0x1f, 0x01, 0x00, + 0x02, 0x49, 0xf1, 0xf7, 0x7d, 0xf9, 0x08, 0xbd, + 0x2c, 0x75, 0x01, 0x00, 0xb1, 0xa8, 0x00, 0x00, + 0xb0, 0xb5, 0x00, 0x28, 0x06, 0xd0, 0x01, 0x28, + 0x06, 0xd0, 0x02, 0x28, 0x07, 0xd1, 0x0c, 0x4c, + 0x01, 0x25, 0x07, 0xe0, 0x0b, 0x4c, 0x04, 0xe0, + 0x0a, 0x4c, 0x2a, 0x3c, 0x01, 0xe0, 0x08, 0x4c, + 0xb6, 0x34, 0x00, 0x25, 0x00, 0xf0, 0x2c, 0xff, + 0x07, 0x49, 0x89, 0x6e, 0x3c, 0x00, 0x58, 0x1f, + 0x01, 0x00, 0x09, 0x19, 0x09, 0x1a, 0xa1, 0x42, + 0x00, 0xd9, 0x00, 0x21, 0x2a, 0x1c, 0x16, 0x20, + 0x01, 0xf0, 0x31, 0xfb, 0xb0, 0xbd, 0x71, 0x02, + 0x00, 0x00, 0x0c, 0x05, 0x00, 0x00, 0xa4, 0x6c, + 0x01, 0x00, 0x8c, 0xb5, 0x00, 0xab, 0x8e, 0x21, + 0x19, 0x80, 0xfc, 0xf7, 0x38, 0xf9, 0x01, 0x90, + 0x68, 0x46, 0xfb, 0xf7, 0xa6, 0xfa, 0x8c, 0xbd, + 0x00, 0x00, 0xbf, 0xb5, 0x13, 0x4a, 0x3c, 0x00, + 0x94, 0x1f, 0x01, 0x00, 0x01, 0x91, 0x0d, 0x1c, + 0x11, 0x7c, 0x88, 0x43, 0x04, 0x1c, 0x21, 0x43, + 0x08, 0x1c, 0x10, 0x74, 0xa0, 0x07, 0x0b, 0xd5, + 0x0e, 0x48, 0x00, 0x90, 0x01, 0x20, 0x02, 0x90, + 0x00, 0xf0, 0xfc, 0xfe, 0x0c, 0x49, 0x40, 0x18, + 0x03, 0x90, 0x68, 0x46, 0xf9, 0xf7, 0x6a, 0xff, + 0xe0, 0x07, 0x0c, 0xd5, 0xf1, 0xf7, 0x2c, 0xfd, + 0x00, 0x28, 0x03, 0xd0, 0x07, 0x48, 0x85, 0x42, + 0x3c, 0x00, 0xd0, 0x1f, 0x01, 0x00, 0x00, 0xd2, + 0x01, 0x90, 0x06, 0x48, 0x00, 0x90, 0x68, 0x46, + 0xf9, 0xf7, 0x09, 0xff, 0xbf, 0xbd, 0x78, 0x69, + 0x01, 0x00, 0x81, 0xea, 0x00, 0x00, 0x10, 0x27, + 0x00, 0x00, 0xa0, 0x86, 0x01, 0x00, 0x75, 0xea, + 0x00, 0x00, 0x10, 0xb5, 0x0a, 0x4c, 0x60, 0x69, + 0x00, 0x28, 0x0e, 0xd1, 0x01, 0x20, 0x60, 0x61, + 0xa1, 0x68, 0x07, 0x48, 0xfd, 0xf7, 0xcb, 0xf9, + 0x00, 0x21, 0x3c, 0x00, 0x0c, 0x20, 0x01, 0x00, + 0xa0, 0x68, 0xf9, 0xf7, 0xd1, 0xfb, 0x01, 0x22, + 0x07, 0x20, 0x04, 0x49, 0x01, 0xf0, 0xd8, 0xfa, + 0x10, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, + 0x34, 0x63, 0x01, 0x00, 0x98, 0x3a, 0x00, 0x00, + 0x10, 0xb5, 0x0c, 0x1c, 0x11, 0x1c, 0x06, 0x4a, + 0x00, 0x2b, 0x10, 0x70, 0x03, 0xd0, 0x00, 0x28, + 0x02, 0xd1, 0xf9, 0xf7, 0xf5, 0xfd, 0x10, 0xbd, + 0x20, 0x1c, 0xf9, 0xf7, 0x3c, 0x00, 0x48, 0x20, + 0x01, 0x00, 0x01, 0xfe, 0x10, 0xbd, 0xa0, 0x79, + 0x01, 0x00, 0xb0, 0xb5, 0x0a, 0x4c, 0x05, 0x1c, + 0xe3, 0x6a, 0x20, 0x1f, 0x01, 0x33, 0xe3, 0x62, + 0x00, 0x88, 0x00, 0x29, 0x06, 0xd0, 0xa1, 0x68, + 0x89, 0x18, 0x21, 0x61, 0x05, 0x4a, 0x00, 0xf0, + 0xfc, 0xfe, 0x01, 0xe0, 0x00, 0xf0, 0xcf, 0xfe, + 0x25, 0x77, 0xb0, 0xbd, 0x00, 0x00, 0xd4, 0x79, + 0x01, 0x00, 0x55, 0xe3, 0x00, 0x00, 0x3c, 0x00, + 0x84, 0x20, 0x01, 0x00, 0x01, 0x1c, 0x03, 0x48, + 0x80, 0xb5, 0x40, 0x88, 0xff, 0xf7, 0xec, 0xfe, + 0x80, 0xbd, 0x00, 0x00, 0x98, 0x7c, 0x01, 0x00, + 0x03, 0x48, 0x80, 0xb5, 0xc1, 0x68, 0x18, 0x38, + 0x80, 0x88, 0xff, 0xf7, 0xe1, 0xfe, 0x80, 0xbd, + 0x70, 0x7c, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x21, + 0x16, 0x20, 0x01, 0xf0, 0xbf, 0xfa, 0x01, 0x21, + 0x16, 0x20, 0x01, 0xf0, 0xbb, 0xfa, 0x80, 0xbd, + 0x3c, 0x00, 0xc0, 0x20, 0x01, 0x00, 0x10, 0xb5, + 0x0b, 0x4c, 0x20, 0x78, 0x0a, 0x28, 0x10, 0xd0, + 0x01, 0x20, 0x60, 0x61, 0x0a, 0x21, 0x13, 0x20, + 0x01, 0xf0, 0xaf, 0xfa, 0x0a, 0x20, 0x60, 0x70, + 0x20, 0x70, 0xfd, 0xf7, 0x3c, 0xfb, 0x01, 0x20, + 0xfd, 0xf7, 0xe9, 0xfb, 0x00, 0x20, 0xfa, 0xf7, + 0xc4, 0xf9, 0x10, 0xbd, 0x00, 0x00, 0x7c, 0x78, + 0x01, 0x00, 0x10, 0xb5, 0x0c, 0x4c, 0x00, 0x20, + 0x0b, 0x49, 0x3c, 0x00, 0xfc, 0x20, 0x01, 0x00, + 0x20, 0x63, 0xe0, 0x62, 0x50, 0x39, 0x88, 0x61, + 0x20, 0x70, 0x08, 0x48, 0x38, 0x21, 0x0c, 0x38, + 0x00, 0x7a, 0x08, 0x55, 0x81, 0x21, 0x18, 0x20, + 0x01, 0xf0, 0x8e, 0xfa, 0x20, 0x69, 0x01, 0x28, + 0x02, 0xd1, 0x00, 0x20, 0xf5, 0xf7, 0x3e, 0xfb, + 0x10, 0xbd, 0x00, 0x00, 0xf4, 0x6e, 0x01, 0x00, + 0xb0, 0xb5, 0x1c, 0x4c, 0x00, 0x25, 0x2c, 0x22, + 0x01, 0x1d, 0x20, 0x1c, 0x3c, 0x00, 0x38, 0x21, + 0x01, 0x00, 0x9a, 0xb0, 0xee, 0xf7, 0x39, 0xfa, + 0x18, 0x49, 0x2c, 0x31, 0x08, 0x1c, 0x00, 0x7a, + 0x8a, 0x69, 0x00, 0x2a, 0x13, 0xd1, 0x02, 0x28, + 0x03, 0xd1, 0xa0, 0x68, 0x00, 0x28, 0x20, 0xd0, + 0x04, 0xe0, 0x00, 0x28, 0x1d, 0xd1, 0x60, 0x68, + 0x00, 0x28, 0x1a, 0xd0, 0x80, 0x02, 0x88, 0x61, + 0x0e, 0x48, 0x69, 0x46, 0x24, 0x38, 0x00, 0x68, + 0xef, 0xf7, 0xcb, 0xfb, 0x11, 0xe0, 0x3c, 0x00, + 0x74, 0x21, 0x01, 0x00, 0x00, 0x22, 0x02, 0x28, + 0x03, 0xd1, 0xa0, 0x68, 0x00, 0x28, 0x09, 0xd1, + 0x04, 0xe0, 0x00, 0x28, 0x08, 0xd1, 0x60, 0x68, + 0x00, 0x28, 0x03, 0xd1, 0x8a, 0x61, 0xff, 0xf7, + 0xb1, 0xff, 0x01, 0xe0, 0x80, 0x02, 0x88, 0x61, + 0x28, 0x1c, 0x1a, 0xb0, 0xb0, 0xbd, 0x00, 0x00, + 0xc8, 0x6e, 0x01, 0x00, 0xf8, 0xb5, 0x0c, 0x49, + 0x02, 0x20, 0x48, 0x60, 0x0b, 0x49, 0x00, 0x05, + 0x3c, 0x00, 0xb0, 0x21, 0x01, 0x00, 0x08, 0x60, + 0x0b, 0x4f, 0xb8, 0x68, 0xf9, 0x68, 0x7c, 0x68, + 0x45, 0x1a, 0x2e, 0x1c, 0x04, 0xe0, 0xa0, 0x68, + 0x61, 0x68, 0xee, 0xf7, 0x09, 0xf9, 0x24, 0x68, + 0x01, 0x3d, 0xf8, 0xd2, 0x7c, 0x60, 0xf8, 0x68, + 0x80, 0x19, 0xf8, 0x60, 0xf8, 0xbd, 0x40, 0x20, + 0x07, 0x00, 0x00, 0x10, 0x07, 0x00, 0x44, 0xe3, + 0x01, 0x00, 0xf8, 0xb5, 0x1f, 0x4e, 0x04, 0x1c, + 0x30, 0x69, 0x3c, 0x00, 0xec, 0x21, 0x01, 0x00, + 0x01, 0x21, 0xf9, 0xf7, 0x99, 0xfa, 0x1d, 0x49, + 0x60, 0x00, 0x40, 0x18, 0x10, 0x38, 0x81, 0x7b, + 0x1b, 0x4a, 0x51, 0x72, 0xc0, 0x7b, 0x10, 0x74, + 0x1a, 0x4f, 0x1b, 0x4d, 0x0e, 0x2c, 0x0a, 0xd1, + 0x01, 0x22, 0x02, 0x21, 0x08, 0x20, 0x01, 0xf0, + 0xf3, 0xfb, 0x03, 0x20, 0xff, 0x21, 0x41, 0x31, + 0x39, 0x86, 0x14, 0x21, 0x08, 0xe0, 0x02, 0x22, + 0x01, 0x21, 0x08, 0x20, 0x3c, 0x00, 0x28, 0x22, + 0x01, 0x00, 0x01, 0xf0, 0xe8, 0xfb, 0x12, 0x49, + 0x02, 0x20, 0x39, 0x86, 0x10, 0x21, 0xa9, 0x71, + 0xe8, 0x71, 0x10, 0x48, 0x11, 0x4a, 0x00, 0x19, + 0x10, 0x38, 0xc0, 0x7b, 0x00, 0x28, 0x03, 0xd0, + 0x01, 0x21, 0x51, 0x73, 0x10, 0x73, 0x01, 0xe0, + 0x00, 0x20, 0x50, 0x73, 0x00, 0x21, 0x20, 0x1c, + 0xfd, 0xf7, 0xe5, 0xfd, 0x30, 0x69, 0xf9, 0xf7, + 0x08, 0xfb, 0xf8, 0xbd, 0x00, 0x00, 0x3c, 0x00, + 0x64, 0x22, 0x01, 0x00, 0x40, 0x7c, 0x01, 0x00, + 0x76, 0x46, 0x01, 0x00, 0x0c, 0x80, 0x07, 0x00, + 0x30, 0x80, 0x07, 0x00, 0x00, 0x80, 0x07, 0x00, + 0xff, 0x01, 0x00, 0x00, 0x5c, 0x57, 0x01, 0x00, + 0xd0, 0x80, 0x07, 0x00, 0x10, 0xb5, 0x15, 0x4c, + 0x14, 0x4a, 0x21, 0x78, 0x00, 0x20, 0x18, 0x32, + 0x05, 0x29, 0x1d, 0xd0, 0x06, 0x29, 0x1b, 0xd0, + 0x07, 0x29, 0x01, 0xd0, 0x08, 0x29, 0x06, 0xd1, + 0x3c, 0x00, 0xa0, 0x22, 0x01, 0x00, 0x91, 0x68, + 0x05, 0x20, 0x10, 0x29, 0x00, 0xdb, 0x06, 0x20, + 0x20, 0x70, 0x01, 0x20, 0xa1, 0x78, 0x00, 0x28, + 0x61, 0x70, 0x0b, 0xd0, 0x00, 0x20, 0xfa, 0xf7, + 0xdc, 0xf8, 0x00, 0x21, 0x60, 0x78, 0xf4, 0xf7, + 0x3c, 0xfa, 0x0a, 0x22, 0x1e, 0x21, 0x13, 0x20, + 0x01, 0xf0, 0x7f, 0xf9, 0x10, 0xbd, 0xd1, 0x69, + 0x07, 0x20, 0x10, 0x29, 0xe8, 0xdb, 0x08, 0x20, + 0xe6, 0xe7, 0x3c, 0x00, 0xdc, 0x22, 0x01, 0x00, + 0x7c, 0x78, 0x01, 0x00, 0xb0, 0xb5, 0x0d, 0x1c, + 0x01, 0x1c, 0x04, 0x1c, 0x44, 0x31, 0x00, 0x20, + 0xf6, 0xf7, 0x40, 0xfa, 0x30, 0x34, 0x00, 0x2d, + 0x07, 0xd0, 0x0e, 0xc8, 0x0e, 0xc4, 0x08, 0xc8, + 0x10, 0x38, 0x08, 0xc4, 0xf4, 0xf7, 0xc4, 0xf9, + 0xb0, 0xbd, 0x1e, 0xcc, 0x1e, 0xc0, 0xb0, 0xbd, + 0xf8, 0xb5, 0x08, 0x1c, 0x11, 0x1c, 0xf4, 0xf7, + 0x87, 0xfa, 0x08, 0x4c, 0x3c, 0x00, 0x18, 0x23, + 0x01, 0x00, 0x00, 0x25, 0x08, 0x4e, 0x08, 0x4f, + 0x06, 0xe0, 0x30, 0x6b, 0x00, 0x28, 0x03, 0xd0, + 0x35, 0x63, 0x20, 0x68, 0xee, 0xf7, 0x55, 0xf8, + 0x38, 0x68, 0x00, 0x28, 0xf5, 0xd0, 0xf8, 0xbd, + 0x00, 0x00, 0x5c, 0x5b, 0x01, 0x00, 0xe4, 0xfe, + 0x01, 0x00, 0x84, 0x5a, 0x01, 0x00, 0x80, 0xb5, + 0x00, 0x06, 0x00, 0x0e, 0x00, 0xf0, 0x07, 0xf8, + 0x80, 0xbd, 0x80, 0xb5, 0x0a, 0x1c, 0x3c, 0x00, + 0x54, 0x23, 0x01, 0x00, 0x23, 0x21, 0x01, 0xf0, + 0x2b, 0xfa, 0x80, 0xbd, 0xb0, 0xb5, 0x0d, 0x1c, + 0x04, 0x1c, 0x12, 0x28, 0x03, 0xd3, 0x01, 0x21, + 0x23, 0x20, 0xee, 0xf7, 0x9b, 0xff, 0x06, 0x49, + 0xa0, 0x00, 0x08, 0x58, 0x04, 0xe0, 0x12, 0xc8, + 0x28, 0x1c, 0xee, 0xf7, 0x2e, 0xf8, 0x20, 0x1c, + 0x00, 0x28, 0xf8, 0xd1, 0xb0, 0xbd, 0x00, 0x00, + 0x68, 0x5b, 0x01, 0x00, 0xf8, 0xb5, 0x0e, 0x1c, + 0x3c, 0x00, 0x90, 0x23, 0x01, 0x00, 0x00, 0x25, + 0x04, 0x1c, 0x12, 0x28, 0x03, 0xd3, 0x01, 0x21, + 0x23, 0x20, 0xee, 0xf7, 0x82, 0xff, 0x13, 0x48, + 0xa7, 0x00, 0xc4, 0x59, 0x08, 0xe0, 0x20, 0x68, + 0xb0, 0x42, 0x03, 0xd1, 0x03, 0x21, 0x23, 0x20, + 0xee, 0xf7, 0x77, 0xff, 0x25, 0x1c, 0x64, 0x68, + 0x00, 0x2c, 0xf4, 0xd1, 0x0c, 0x4a, 0x04, 0x3a, + 0x10, 0x68, 0x00, 0x28, 0x01, 0xd0, 0x41, 0x68, + 0x11, 0x60, 0x3c, 0x00, 0xcc, 0x23, 0x01, 0x00, + 0x00, 0x28, 0x04, 0xd1, 0x02, 0x21, 0x23, 0x20, + 0xee, 0xf7, 0x66, 0xff, 0xf8, 0xbd, 0x00, 0x21, + 0x41, 0x60, 0x06, 0x60, 0x00, 0x2d, 0x01, 0xd0, + 0x68, 0x60, 0xf7, 0xe7, 0x01, 0x49, 0xc8, 0x51, + 0xf4, 0xe7, 0x00, 0x00, 0x68, 0x5b, 0x01, 0x00, + 0x70, 0xb5, 0x0e, 0x1c, 0x05, 0x1c, 0x00, 0x24, + 0x12, 0x28, 0x03, 0xd3, 0x01, 0x21, 0x23, 0x20, + 0xee, 0xf7, 0x4e, 0xff, 0x3c, 0x00, 0x08, 0x24, + 0x01, 0x00, 0x0d, 0x4b, 0xaa, 0x00, 0x98, 0x58, + 0x04, 0xe0, 0x01, 0x68, 0xb1, 0x42, 0x04, 0xd0, + 0x04, 0x1c, 0x40, 0x68, 0x00, 0x28, 0xf8, 0xd1, + 0x70, 0xbd, 0x00, 0x28, 0xfc, 0xd0, 0x00, 0x2c, + 0x41, 0x68, 0x01, 0xd1, 0x99, 0x50, 0x00, 0xe0, + 0x61, 0x60, 0x00, 0x21, 0x03, 0x4a, 0x01, 0x60, + 0x04, 0x3a, 0x11, 0x68, 0x41, 0x60, 0x10, 0x60, + 0x70, 0xbd, 0x68, 0x5b, 0x01, 0x00, 0x3c, 0x00, + 0x44, 0x24, 0x01, 0x00, 0xf3, 0xb5, 0x81, 0xb0, + 0x00, 0x28, 0x17, 0xd0, 0x01, 0x78, 0xff, 0x29, + 0x14, 0xd0, 0x45, 0x78, 0x44, 0x19, 0x02, 0x34, + 0x80, 0x27, 0x01, 0x3c, 0x26, 0x78, 0x01, 0x3d, + 0xbe, 0x43, 0x30, 0x1c, 0xf8, 0xf7, 0x82, 0xfc, + 0x01, 0x21, 0x81, 0x40, 0x02, 0x98, 0x01, 0x40, + 0x02, 0xd0, 0x3e, 0x43, 0x30, 0x1c, 0x20, 0x70, + 0x00, 0x2d, 0xee, 0xd1, 0xfe, 0xbd, 0x00, 0x00, + 0x3c, 0x00, 0x80, 0x24, 0x01, 0x00, 0x10, 0x4b, + 0x10, 0xb5, 0x59, 0x68, 0x41, 0x1a, 0x0f, 0x29, + 0x0d, 0xdc, 0x0e, 0x22, 0xd2, 0x43, 0x91, 0x42, + 0x09, 0xdb, 0x1a, 0x1c, 0x92, 0x68, 0x00, 0x29, + 0x01, 0xdd, 0x00, 0x2a, 0x03, 0xda, 0x00, 0x29, + 0x0d, 0xda, 0x00, 0x2a, 0x0b, 0xdc, 0x04, 0x33, + 0x03, 0xc3, 0xfd, 0xf7, 0x10, 0xfd, 0x04, 0x1c, + 0xfd, 0xf7, 0x13, 0xfd, 0x00, 0x28, 0x02, 0xd0, + 0x20, 0x1c, 0x3c, 0x00, 0xbc, 0x24, 0x01, 0x00, + 0xff, 0xf7, 0x92, 0xfe, 0x10, 0xbd, 0x00, 0x00, + 0x18, 0x63, 0x01, 0x00, 0xf8, 0xb5, 0x64, 0x4c, + 0x07, 0x1c, 0x60, 0x78, 0xa1, 0x78, 0x88, 0x42, + 0x0f, 0xd1, 0x08, 0x1c, 0xfd, 0xf7, 0xce, 0xf8, + 0xe0, 0x60, 0x04, 0x20, 0x60, 0x70, 0x0a, 0x22, + 0x1e, 0x21, 0x13, 0x20, 0x01, 0xf0, 0x70, 0xf8, + 0x00, 0x21, 0x60, 0x78, 0xf4, 0xf7, 0x24, 0xf9, + 0xf8, 0xbd, 0x04, 0x28, 0x3c, 0x00, 0xf8, 0x24, + 0x01, 0x00, 0x6e, 0xd1, 0x58, 0x4e, 0xfd, 0xf7, + 0xbc, 0xf8, 0x00, 0x90, 0x71, 0x78, 0x04, 0x1c, + 0x00, 0x20, 0x05, 0x29, 0x21, 0xd2, 0x01, 0xa3, + 0x5b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x0b, 0x0f, + 0x14, 0x1a, 0x02, 0x00, 0x51, 0x48, 0x51, 0x49, + 0x60, 0x43, 0x41, 0x18, 0x7d, 0x20, 0xc0, 0x00, + 0xee, 0xf7, 0x87, 0xf8, 0x11, 0xe0, 0x87, 0x20, + 0x60, 0x43, 0x4d, 0x49, 0x02, 0xe0, 0x3c, 0x00, + 0x34, 0x25, 0x01, 0x00, 0x45, 0x20, 0x4d, 0x49, + 0x60, 0x43, 0x40, 0x18, 0x08, 0xe0, 0x4c, 0x48, + 0xcd, 0x21, 0x09, 0x01, 0x60, 0x43, 0x40, 0x1a, + 0x02, 0xe0, 0x46, 0x20, 0x60, 0x43, 0x82, 0x38, + 0x06, 0x06, 0x48, 0x48, 0x07, 0x21, 0x00, 0x79, + 0x36, 0x16, 0x08, 0x1a, 0x00, 0x19, 0x00, 0x90, + 0x68, 0x46, 0xfe, 0xf7, 0x5f, 0xfd, 0x38, 0x1c, + 0xfd, 0xf7, 0x2e, 0xfb, 0x00, 0x99, 0x42, 0x4a, + 0x3c, 0x00, 0x70, 0x25, 0x01, 0x00, 0x49, 0x00, + 0x51, 0x5a, 0x48, 0x43, 0x39, 0x49, 0x04, 0x1c, + 0x88, 0x78, 0x00, 0x28, 0x01, 0xd0, 0x01, 0x28, + 0x1e, 0xd1, 0x35, 0x49, 0x00, 0x28, 0x03, 0xd1, + 0x3a, 0x48, 0x05, 0x78, 0x04, 0x20, 0x02, 0xe0, + 0x38, 0x48, 0x45, 0x78, 0x0c, 0x20, 0x30, 0x49, + 0xc9, 0x68, 0x49, 0x1b, 0x08, 0x18, 0x00, 0x90, + 0x68, 0x46, 0xfe, 0xf7, 0x3e, 0xfd, 0x00, 0x98, + 0x33, 0x49, 0x3c, 0x00, 0xac, 0x25, 0x01, 0x00, + 0x40, 0x00, 0x20, 0x31, 0x08, 0x5a, 0x2a, 0x49, + 0x44, 0x43, 0xc8, 0x68, 0xa8, 0x42, 0x01, 0xd9, + 0x01, 0x25, 0x00, 0xe0, 0x00, 0x25, 0x2e, 0x48, + 0x21, 0x18, 0x40, 0x00, 0xee, 0xf7, 0xa2, 0xf8, + 0x04, 0x1c, 0x00, 0x2d, 0x03, 0xd0, 0xfd, 0xf7, + 0xc3, 0xfa, 0x02, 0xe0, 0x3d, 0xe0, 0xfd, 0xf7, + 0xf3, 0xfa, 0x00, 0x2f, 0x02, 0xd1, 0x25, 0x48, + 0x0e, 0x38, 0x01, 0xe0, 0x3c, 0x00, 0xe8, 0x25, + 0x01, 0x00, 0x23, 0x48, 0x0a, 0x38, 0x01, 0x68, + 0x61, 0x1a, 0xcb, 0x1c, 0x01, 0xdb, 0x03, 0x29, + 0x00, 0xdd, 0x04, 0x60, 0x01, 0x68, 0xa1, 0x42, + 0x01, 0xd2, 0x01, 0x31, 0x04, 0xe0, 0xa1, 0x42, + 0x03, 0xd9, 0x00, 0x29, 0x01, 0xd0, 0x01, 0x39, + 0x01, 0x60, 0x01, 0x68, 0x38, 0x1c, 0xfd, 0xf7, + 0xc0, 0xfb, 0x10, 0x4c, 0x0a, 0x20, 0x60, 0x70, + 0x0a, 0x22, 0x13, 0x20, 0xa1, 0x68, 0x3c, 0x00, + 0x24, 0x26, 0x01, 0x00, 0x00, 0xf0, 0xd2, 0xff, + 0x60, 0x68, 0x00, 0xf0, 0xf7, 0xfa, 0x00, 0x28, + 0x00, 0xd1, 0x5f, 0xe7, 0x00, 0xf0, 0xba, 0xfb, + 0x11, 0x49, 0x00, 0x23, 0x40, 0x18, 0x0e, 0x49, + 0x60, 0x60, 0x1e, 0x39, 0xc8, 0x56, 0xb0, 0x42, + 0xf3, 0xd0, 0x0e, 0x70, 0x31, 0x1c, 0x00, 0x20, + 0xff, 0xf7, 0x84, 0xfe, 0x4e, 0xe7, 0xff, 0xf7, + 0x15, 0xfe, 0x4b, 0xe7, 0x7c, 0x78, 0x01, 0x00, + 0x3c, 0x00, 0x60, 0x26, 0x01, 0x00, 0x60, 0xd7, + 0xff, 0xff, 0x60, 0x8f, 0x01, 0x00, 0x54, 0x0b, + 0x00, 0x00, 0xc9, 0x09, 0x00, 0x00, 0x8e, 0xfe, + 0xff, 0xff, 0x0c, 0x5a, 0x01, 0x00, 0x12, 0x5a, + 0x01, 0x00, 0x20, 0xa1, 0x07, 0x00, 0x40, 0x42, + 0x0f, 0x00, 0x30, 0xb5, 0x0c, 0x4b, 0xfe, 0x24, + 0x1b, 0x88, 0x04, 0x40, 0xc0, 0x07, 0x5d, 0x07, + 0x6d, 0x0f, 0xdb, 0x08, 0xc0, 0x0f, 0x9c, 0x42, + 0x0b, 0xd8, 0x3c, 0x00, 0x9c, 0x26, 0x01, 0x00, + 0xa2, 0x18, 0x04, 0x3a, 0x9a, 0x42, 0x07, 0xd3, + 0x1a, 0x1b, 0x89, 0x5c, 0x01, 0x22, 0xaa, 0x40, + 0x11, 0x40, 0x01, 0xd0, 0x02, 0x21, 0x08, 0x43, + 0x30, 0xbd, 0x00, 0x00, 0xfa, 0x60, 0x01, 0x00, + 0x80, 0xb5, 0x00, 0x28, 0x03, 0xd0, 0x01, 0x1c, + 0x14, 0x20, 0xf5, 0xf7, 0xff, 0xfa, 0x80, 0xbd, + 0xb0, 0xb5, 0x04, 0x1c, 0xf7, 0xf7, 0x08, 0xfd, + 0x13, 0x4d, 0x00, 0x28, 0x3c, 0x00, 0xd8, 0x26, + 0x01, 0x00, 0x1d, 0xd1, 0xa0, 0x07, 0x16, 0xd5, + 0x02, 0x20, 0x84, 0x43, 0x11, 0x48, 0x01, 0x22, + 0x2a, 0x62, 0x40, 0x68, 0x00, 0x28, 0x13, 0xd0, + 0xf2, 0xf7, 0x51, 0xf9, 0x00, 0x28, 0x0f, 0xd1, + 0x0b, 0x48, 0xe4, 0x30, 0x80, 0x7a, 0x01, 0x28, + 0x00, 0xd0, 0x00, 0x22, 0x11, 0x1c, 0x01, 0x20, + 0xf2, 0xf7, 0xa5, 0xf9, 0x04, 0xe0, 0x00, 0xf0, + 0x4e, 0xfb, 0xe8, 0x61, 0xf2, 0xf7, 0x3c, 0x00, + 0x14, 0x27, 0x01, 0x00, 0x6b, 0xf9, 0xa9, 0x6a, + 0x00, 0x29, 0x02, 0xd0, 0x20, 0x1c, 0xed, 0xf7, + 0x5c, 0xfe, 0xb0, 0xbd, 0x60, 0x6c, 0x01, 0x00, + 0xb0, 0x57, 0x01, 0x00, 0x20, 0x48, 0xb0, 0xb5, + 0x81, 0x68, 0x01, 0x29, 0x04, 0xd1, 0x00, 0x78, + 0x00, 0x28, 0x01, 0xd1, 0xfd, 0xf7, 0x72, 0xfd, + 0x1b, 0x4d, 0x80, 0x3d, 0x2c, 0x1c, 0x70, 0x34, + 0x20, 0x78, 0x03, 0x38, 0x05, 0x28, 0x18, 0xd2, + 0x3c, 0x00, 0x50, 0x27, 0x01, 0x00, 0x01, 0xa3, + 0x1b, 0x5c, 0x5b, 0x00, 0x9f, 0x44, 0x04, 0x15, + 0x27, 0x27, 0x27, 0x00, 0xfb, 0xf7, 0xf1, 0xff, + 0x60, 0x7b, 0x01, 0x1c, 0xff, 0x31, 0x61, 0x73, + 0x00, 0x28, 0xf7, 0xd1, 0x04, 0x20, 0x20, 0x70, + 0xa8, 0x89, 0xf8, 0xf7, 0xda, 0xf9, 0x01, 0x1c, + 0x00, 0x22, 0x0f, 0x20, 0x00, 0xf0, 0x25, 0xff, + 0xb0, 0xbd, 0xef, 0xf7, 0xce, 0xff, 0x6a, 0x21, + 0x49, 0x5b, 0x3c, 0x00, 0x8c, 0x27, 0x01, 0x00, + 0x88, 0x42, 0x0b, 0xd0, 0xe8, 0x89, 0xf8, 0xf7, + 0xcb, 0xf9, 0x01, 0x1c, 0x00, 0x23, 0x00, 0x22, + 0x0f, 0x20, 0x00, 0xf0, 0xf7, 0xff, 0x07, 0x20, + 0x20, 0x70, 0xb0, 0xbd, 0xfd, 0xf7, 0x3a, 0xfe, + 0xb0, 0xbd, 0x00, 0x00, 0x84, 0x66, 0x01, 0x00, + 0xf0, 0xb5, 0x85, 0xb0, 0x04, 0x1c, 0x03, 0x80, + 0x18, 0x0c, 0x60, 0x80, 0x0d, 0x1c, 0x51, 0x78, + 0x10, 0x78, 0x09, 0x02, 0x3c, 0x00, 0xc8, 0x27, + 0x01, 0x00, 0x48, 0x40, 0xa0, 0x80, 0xd1, 0x78, + 0x90, 0x78, 0x09, 0x02, 0x48, 0x40, 0xe0, 0x80, + 0x51, 0x79, 0x10, 0x79, 0x09, 0x02, 0x48, 0x40, + 0x20, 0x81, 0x68, 0x46, 0x1a, 0x49, 0x14, 0x22, + 0xed, 0xf7, 0xe3, 0xfe, 0x00, 0x23, 0x00, 0x20, + 0xd9, 0x07, 0xc9, 0x0f, 0x8c, 0x46, 0x42, 0x00, + 0x56, 0x07, 0x76, 0x0f, 0x61, 0x46, 0x89, 0x19, + 0x49, 0x00, 0x6e, 0x5c, 0x49, 0x19, 0x3c, 0x00, + 0x04, 0x28, 0x01, 0x00, 0x49, 0x78, 0x6f, 0x46, + 0x09, 0x02, 0x4e, 0x40, 0x81, 0x00, 0x79, 0x58, + 0x0f, 0x4f, 0x49, 0x00, 0x61, 0x5a, 0x01, 0x30, + 0x4e, 0x40, 0x31, 0x06, 0x36, 0x0a, 0x76, 0x00, + 0xc9, 0x0d, 0x79, 0x5a, 0xf6, 0x19, 0x01, 0x27, + 0x7f, 0x02, 0xf6, 0x19, 0x36, 0x88, 0x71, 0x40, + 0xa6, 0x5a, 0x89, 0x19, 0xa1, 0x52, 0x05, 0x28, + 0xdc, 0xdb, 0x20, 0x89, 0xc0, 0x18, 0x01, 0x33, + 0x3c, 0x00, 0x40, 0x28, 0x01, 0x00, 0x08, 0x2b, + 0x20, 0x81, 0xd2, 0xdb, 0x05, 0xb0, 0xf0, 0xbd, + 0x00, 0x00, 0xd8, 0x56, 0x01, 0x00, 0xd8, 0x52, + 0x01, 0x00, 0xf0, 0xb5, 0x05, 0x1c, 0x0c, 0x1c, + 0x1e, 0x1c, 0x00, 0x20, 0x89, 0xb0, 0x41, 0x00, + 0x53, 0x5a, 0x01, 0x30, 0x06, 0xaf, 0x7b, 0x52, + 0x05, 0x28, 0xf8, 0xdb, 0x10, 0x89, 0x00, 0xab, + 0x3a, 0x49, 0x80, 0x19, 0x58, 0x84, 0x68, 0x46, + 0x18, 0x22, 0x3c, 0x00, 0x7c, 0x28, 0x01, 0x00, + 0xed, 0xf7, 0x98, 0xfe, 0x00, 0x20, 0x41, 0x00, + 0x0a, 0x19, 0x52, 0x78, 0x63, 0x5c, 0x6f, 0x46, + 0x12, 0x02, 0x53, 0x40, 0x82, 0x00, 0xba, 0x58, + 0x06, 0xaf, 0x52, 0x00, 0xba, 0x5a, 0x31, 0x4f, + 0x01, 0x30, 0x53, 0x40, 0x1a, 0x06, 0x1b, 0x0a, + 0x5b, 0x00, 0xd2, 0x0d, 0xba, 0x5a, 0xdb, 0x19, + 0x01, 0x27, 0x7f, 0x02, 0xdb, 0x19, 0x1b, 0x88, + 0x5a, 0x40, 0x06, 0xab, 0x3c, 0x00, 0xb8, 0x28, + 0x01, 0x00, 0x5b, 0x5a, 0xd2, 0x18, 0x06, 0xab, + 0x5a, 0x52, 0x06, 0x28, 0xde, 0xdb, 0x61, 0x7b, + 0x20, 0x7b, 0x00, 0xab, 0x09, 0x02, 0x48, 0x40, + 0x59, 0x8c, 0x48, 0x40, 0x41, 0x08, 0xc0, 0x03, + 0x48, 0x40, 0x19, 0x8b, 0x40, 0x18, 0x18, 0x83, + 0xe1, 0x7b, 0xa0, 0x7b, 0x09, 0x02, 0x48, 0x40, + 0x19, 0x8b, 0x48, 0x40, 0x41, 0x08, 0xc0, 0x03, + 0x48, 0x40, 0x59, 0x8b, 0x40, 0x18, 0x3c, 0x00, + 0xf4, 0x28, 0x01, 0x00, 0x58, 0x83, 0x02, 0x20, + 0x41, 0x00, 0x06, 0xaa, 0x8a, 0x18, 0x20, 0x3a, + 0xd2, 0x8b, 0x01, 0x30, 0x53, 0x08, 0xd2, 0x03, + 0x5a, 0x40, 0x06, 0xab, 0x5b, 0x5a, 0xd2, 0x18, + 0x06, 0xab, 0x5a, 0x52, 0x06, 0x28, 0xef, 0xdb, + 0x30, 0x0a, 0x28, 0x70, 0x70, 0x04, 0x40, 0x0e, + 0x20, 0x21, 0x08, 0x43, 0x68, 0x70, 0xae, 0x70, + 0x61, 0x78, 0x20, 0x78, 0x00, 0xab, 0x09, 0x02, + 0x3c, 0x00, 0x30, 0x29, 0x01, 0x00, 0x48, 0x40, + 0x59, 0x8c, 0x48, 0x40, 0xc0, 0x05, 0x00, 0x0e, + 0xe8, 0x70, 0x00, 0x20, 0x41, 0x00, 0x06, 0xaa, + 0x53, 0x5a, 0x4a, 0x19, 0x01, 0x30, 0x13, 0x71, + 0x06, 0xab, 0x59, 0x5a, 0x09, 0x0a, 0x51, 0x71, + 0x06, 0x28, 0xf3, 0xdb, 0x09, 0xb0, 0xf0, 0xbd, + 0x00, 0x00, 0xec, 0x56, 0x01, 0x00, 0xd8, 0x52, + 0x01, 0x00, 0xf0, 0xb5, 0x46, 0x68, 0x05, 0x1c, + 0x60, 0x30, 0x3c, 0x00, 0x6c, 0x29, 0x01, 0x00, + 0x85, 0xb0, 0x04, 0x90, 0x60, 0xe0, 0x68, 0x68, + 0x0c, 0x21, 0x07, 0x69, 0x00, 0x20, 0xee, 0xf7, + 0x2d, 0xfe, 0x70, 0x61, 0x01, 0x89, 0x04, 0x39, + 0x09, 0x04, 0x09, 0x0c, 0x01, 0x81, 0x70, 0x69, + 0x00, 0x68, 0x40, 0x18, 0x04, 0x21, 0xee, 0xf7, + 0x21, 0xfe, 0xf0, 0x61, 0x70, 0x69, 0x20, 0x21, + 0x04, 0x68, 0x04, 0x98, 0x04, 0x22, 0x40, 0x7b, + 0x80, 0x01, 0x08, 0x43, 0x3c, 0x00, 0xa8, 0x29, + 0x01, 0x00, 0xe0, 0x70, 0x28, 0x69, 0x40, 0x89, + 0xa0, 0x70, 0x28, 0x69, 0x40, 0x89, 0x00, 0x0a, + 0x20, 0x70, 0x29, 0x69, 0x0c, 0x31, 0xa0, 0x18, + 0xed, 0xf7, 0x9b, 0xfd, 0x20, 0x78, 0x20, 0x21, + 0x40, 0x06, 0x40, 0x0e, 0x08, 0x43, 0x60, 0x70, + 0x28, 0x69, 0x0a, 0x30, 0x01, 0x88, 0x01, 0x31, + 0x09, 0x04, 0x09, 0x0c, 0x01, 0x80, 0x04, 0xd1, + 0x28, 0x69, 0x0c, 0x30, 0x01, 0x68, 0x3c, 0x00, + 0xe4, 0x29, 0x01, 0x00, 0x01, 0x31, 0x01, 0x60, + 0x35, 0x62, 0x61, 0x79, 0x20, 0x79, 0x09, 0x02, + 0x40, 0x18, 0xa1, 0x79, 0x09, 0x04, 0x40, 0x18, + 0xe1, 0x79, 0x09, 0x06, 0x43, 0x18, 0x00, 0x93, + 0xa0, 0x78, 0x21, 0x78, 0x09, 0x02, 0x40, 0x18, + 0x04, 0x04, 0x24, 0x0c, 0x10, 0x20, 0xee, 0xf7, + 0x13, 0xff, 0xb0, 0x61, 0x28, 0x69, 0x3a, 0x1c, + 0x01, 0x68, 0x00, 0x9b, 0x01, 0xa8, 0x0a, 0x32, + 0x3c, 0x00, 0x20, 0x2a, 0x01, 0x00, 0xff, 0xf7, + 0xc8, 0xfe, 0x28, 0x69, 0x23, 0x1c, 0x01, 0x68, + 0xb0, 0x69, 0x01, 0xaa, 0xff, 0xf7, 0x11, 0xff, + 0x36, 0x68, 0x00, 0x2e, 0x9c, 0xd1, 0x03, 0x49, + 0x04, 0x48, 0x6a, 0x68, 0xf7, 0xf7, 0x63, 0xfb, + 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xfd, 0x6b, + 0x00, 0x00, 0xa0, 0x6a, 0x01, 0x00, 0x01, 0x38, + 0x07, 0x49, 0x40, 0x00, 0x09, 0x5c, 0x00, 0x29, + 0x06, 0xd0, 0x3c, 0x00, 0x5c, 0x2a, 0x01, 0x00, + 0x04, 0x49, 0x1c, 0x39, 0x08, 0x5c, 0x00, 0x28, + 0x01, 0xd0, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, + 0x70, 0x47, 0x00, 0x00, 0xe6, 0x78, 0x01, 0x00, + 0xfe, 0xb5, 0x05, 0x1c, 0x00, 0x20, 0x02, 0x90, + 0x13, 0x48, 0x17, 0x1c, 0x00, 0x68, 0x0c, 0x1c, + 0x86, 0x78, 0x30, 0x1c, 0xfd, 0xf7, 0x28, 0xfa, + 0x00, 0x28, 0x01, 0xd1, 0x02, 0x98, 0xfe, 0xbd, + 0x00, 0x2d, 0x08, 0xd1, 0x3c, 0x00, 0x98, 0x2a, + 0x01, 0x00, 0x20, 0x68, 0x00, 0xab, 0x18, 0x71, + 0x60, 0x68, 0x58, 0x71, 0xa0, 0x68, 0x98, 0x71, + 0x03, 0x20, 0x38, 0x80, 0x29, 0x1c, 0x30, 0x1c, + 0x01, 0xaa, 0x00, 0xf0, 0x0e, 0xf8, 0x00, 0x2d, + 0xec, 0xd0, 0x00, 0xab, 0x19, 0x79, 0x21, 0x60, + 0x59, 0x79, 0x61, 0x60, 0x99, 0x79, 0xa1, 0x60, + 0x0c, 0x21, 0x39, 0x80, 0xe2, 0xe7, 0xf8, 0x6b, + 0x01, 0x00, 0xf8, 0xb5, 0x15, 0x1c, 0x3c, 0x00, + 0xd4, 0x2a, 0x01, 0x00, 0x42, 0x1e, 0x01, 0x38, + 0x47, 0x00, 0x3f, 0x18, 0x1f, 0x48, 0x3e, 0x18, + 0x00, 0x29, 0x06, 0xd0, 0x01, 0x24, 0x03, 0x22, + 0x31, 0x1c, 0x28, 0x1c, 0xed, 0xf7, 0x04, 0xfd, + 0x32, 0xe0, 0x68, 0x78, 0x01, 0x24, 0x00, 0x28, + 0x05, 0xd0, 0x29, 0x78, 0x08, 0x18, 0x01, 0x38, + 0x0e, 0x28, 0x00, 0xd9, 0x00, 0x24, 0x00, 0x2c, + 0x26, 0xd0, 0x00, 0x2a, 0x07, 0xd1, 0x2a, 0x21, + 0x3c, 0x00, 0x10, 0x2b, 0x01, 0x00, 0x12, 0x48, + 0xed, 0xf7, 0x9f, 0xfc, 0x1c, 0x21, 0x11, 0x48, + 0xed, 0xf7, 0x9b, 0xfc, 0x0f, 0x48, 0x03, 0x22, + 0x29, 0x1c, 0x30, 0x1c, 0xed, 0xf7, 0xe7, 0xfc, + 0x0c, 0x48, 0x71, 0x78, 0xc0, 0x5d, 0xb2, 0x78, + 0x00, 0x29, 0x0e, 0xd0, 0x00, 0x2a, 0x0c, 0xd0, + 0x01, 0x22, 0x43, 0x18, 0x08, 0x4d, 0x06, 0xe0, + 0x41, 0x00, 0x49, 0x19, 0x10, 0x39, 0x8a, 0x73, + 0xb7, 0x78, 0x3c, 0x00, 0x4c, 0x2b, 0x01, 0x00, + 0x01, 0x30, 0xcf, 0x73, 0x83, 0x42, 0xf6, 0xd8, + 0xfe, 0xf7, 0x60, 0xf8, 0x20, 0x1c, 0xf8, 0xbd, + 0xeb, 0x62, 0x01, 0x00, 0xca, 0x78, 0x01, 0x00, + 0x70, 0xb5, 0x05, 0x1c, 0x1c, 0x48, 0x00, 0x23, + 0xc0, 0x56, 0x43, 0x1c, 0x32, 0xd1, 0xa8, 0x7a, + 0xf8, 0xf7, 0x0c, 0xf9, 0x00, 0x26, 0x00, 0x28, + 0x18, 0x4c, 0x08, 0xd0, 0xe8, 0x69, 0xe1, 0x6b, + 0x00, 0x29, 0x0b, 0xd1, 0x3c, 0x00, 0x88, 0x2b, + 0x01, 0x00, 0x66, 0x63, 0x01, 0x21, 0xe1, 0x63, + 0xa6, 0x63, 0x06, 0xe0, 0xa8, 0x69, 0xe1, 0x6b, + 0x00, 0x29, 0x02, 0xd0, 0x66, 0x63, 0xa6, 0x63, + 0xe6, 0x63, 0xa1, 0x6b, 0x01, 0x31, 0xa1, 0x63, + 0x82, 0x03, 0x01, 0xd5, 0x0e, 0x4a, 0x10, 0x43, + 0xe2, 0x6b, 0x00, 0x2a, 0x00, 0xd0, 0x40, 0x42, + 0x62, 0x6b, 0x10, 0x18, 0x60, 0x63, 0x08, 0x29, + 0x0b, 0xd1, 0x00, 0x28, 0x01, 0xdd, 0x3c, 0x00, + 0xc4, 0x2b, 0x01, 0x00, 0x01, 0x20, 0x03, 0xe0, + 0x00, 0x28, 0x03, 0xda, 0x00, 0x20, 0xc0, 0x43, + 0xef, 0xf7, 0x62, 0xfe, 0x66, 0x63, 0xa6, 0x63, + 0x70, 0xbd, 0x00, 0x00, 0xf4, 0x6b, 0x01, 0x00, + 0x84, 0x6a, 0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, + 0x0c, 0x21, 0x05, 0x4a, 0x41, 0x43, 0x89, 0x18, + 0x80, 0xb5, 0x89, 0x78, 0x00, 0x29, 0x01, 0xd1, + 0xf3, 0xf7, 0xf2, 0xfa, 0x80, 0xbd, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x60, 0x7b, + 0x01, 0x00, 0x80, 0xb5, 0x01, 0x1c, 0x00, 0x20, + 0xf7, 0xf7, 0x03, 0xfa, 0x80, 0xbd, 0x80, 0xb5, + 0x01, 0x1c, 0x01, 0x20, 0xf7, 0xf7, 0xfd, 0xf9, + 0x80, 0xbd, 0x02, 0x49, 0x89, 0x68, 0x40, 0x1a, + 0xc0, 0x0f, 0x70, 0x47, 0x00, 0x00, 0x00, 0x01, + 0x07, 0x00, 0x02, 0x49, 0x89, 0x68, 0x08, 0x1a, + 0xc0, 0x17, 0x01, 0x30, 0x70, 0x47, 0x00, 0x01, + 0x07, 0x00, 0x3c, 0x00, 0x3c, 0x2c, 0x01, 0x00, + 0x05, 0x49, 0x4a, 0x68, 0x01, 0x23, 0x1a, 0x43, + 0x4a, 0x60, 0x8a, 0x68, 0x10, 0x18, 0x88, 0x60, + 0x48, 0x68, 0x98, 0x43, 0x48, 0x60, 0x70, 0x47, + 0x00, 0x01, 0x07, 0x00, 0x10, 0xb5, 0x15, 0x4b, + 0x00, 0x21, 0x0a, 0x01, 0x9a, 0x58, 0x00, 0x2a, + 0x17, 0xd1, 0x01, 0x24, 0x0a, 0x01, 0x9c, 0x50, + 0xd2, 0x18, 0x10, 0x73, 0x00, 0x23, 0x53, 0x73, + 0x02, 0x23, 0x01, 0x28, 0x3c, 0x00, 0x78, 0x2c, + 0x01, 0x00, 0x0e, 0x4a, 0x05, 0xd1, 0xc8, 0x00, + 0x80, 0x18, 0x10, 0x30, 0x02, 0x78, 0x9a, 0x43, + 0x04, 0xe0, 0xc8, 0x00, 0x80, 0x18, 0x10, 0x30, + 0x02, 0x78, 0x1a, 0x43, 0x02, 0x70, 0x02, 0xe0, + 0x01, 0x31, 0x08, 0x29, 0xe0, 0xdb, 0x08, 0x29, + 0x04, 0xd1, 0x01, 0x21, 0x99, 0x20, 0xee, 0xf7, + 0xfe, 0xfa, 0x03, 0x49, 0x08, 0x04, 0x00, 0x0c, + 0x10, 0xbd, 0xac, 0x73, 0x01, 0x00, 0x3c, 0x00, + 0xb4, 0x2c, 0x01, 0x00, 0x00, 0x60, 0x07, 0x00, + 0xff, 0xff, 0x00, 0x00, 0xf7, 0xb5, 0x19, 0x4f, + 0x19, 0x4e, 0x0c, 0x1c, 0xc1, 0x00, 0xc9, 0x19, + 0xb2, 0x68, 0x10, 0x31, 0x81, 0xb0, 0x01, 0x3a, + 0x4a, 0x60, 0x0b, 0x78, 0x1d, 0x1c, 0x0d, 0x22, + 0x93, 0x43, 0x0b, 0x70, 0x01, 0x22, 0x82, 0x40, + 0x3a, 0x73, 0x12, 0x4b, 0x00, 0x01, 0x03, 0x9a, + 0xc0, 0x18, 0x82, 0x60, 0x10, 0x4a, 0x10, 0x1c, + 0x3c, 0x00, 0xf0, 0x2c, 0x01, 0x00, 0x20, 0x30, + 0x87, 0x79, 0x00, 0xab, 0x1f, 0x70, 0xc0, 0x79, + 0x58, 0x70, 0xb0, 0x68, 0x03, 0x30, 0x00, 0x23, + 0x26, 0x1a, 0x01, 0xd5, 0x04, 0x1c, 0x01, 0x23, + 0x4c, 0x60, 0x0d, 0x70, 0x00, 0x2b, 0x04, 0xd0, + 0x20, 0x1c, 0xff, 0xf7, 0x8a, 0xff, 0x00, 0x28, + 0xfa, 0xd0, 0x00, 0xab, 0x18, 0x88, 0xd0, 0x84, + 0xff, 0xbd, 0x00, 0x60, 0x07, 0x00, 0x00, 0x01, + 0x07, 0x00, 0x3c, 0x00, 0x2c, 0x2d, 0x01, 0x00, + 0xac, 0x73, 0x01, 0x00, 0x00, 0x10, 0x07, 0x00, + 0x30, 0xb5, 0x00, 0x20, 0xc0, 0x43, 0x0b, 0x4c, + 0x09, 0x4b, 0x00, 0x22, 0xd1, 0x00, 0x09, 0x19, + 0x0d, 0x7c, 0xed, 0x07, 0x07, 0xd5, 0x49, 0x69, + 0x9d, 0x68, 0x49, 0x1b, 0x00, 0xd5, 0x00, 0x21, + 0x81, 0x42, 0x00, 0xd2, 0x08, 0x1c, 0x01, 0x32, + 0x08, 0x2a, 0xef, 0xdb, 0x30, 0xbd, 0x00, 0x00, + 0x00, 0x01, 0x07, 0x00, 0x3c, 0x00, 0x68, 0x2d, + 0x01, 0x00, 0x00, 0x60, 0x07, 0x00, 0xb0, 0xb5, + 0x08, 0x28, 0x0b, 0xd2, 0x08, 0x4d, 0x04, 0x01, + 0x29, 0x59, 0x00, 0x29, 0x04, 0xd0, 0x00, 0xf0, + 0x4a, 0xf8, 0x00, 0x20, 0x28, 0x51, 0xb0, 0xbd, + 0x02, 0x21, 0x00, 0xe0, 0x03, 0x21, 0x99, 0x20, + 0xee, 0xf7, 0x89, 0xfa, 0xb0, 0xbd, 0xac, 0x73, + 0x01, 0x00, 0x03, 0x49, 0x00, 0x01, 0x40, 0x18, + 0x41, 0x7b, 0x08, 0x22, 0x11, 0x43, 0x3c, 0x00, + 0xa4, 0x2d, 0x01, 0x00, 0x41, 0x73, 0x70, 0x47, + 0xac, 0x73, 0x01, 0x00, 0x01, 0x48, 0x80, 0x68, + 0x70, 0x47, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, + 0x70, 0xb5, 0x0b, 0x4e, 0x09, 0x4d, 0x00, 0x22, + 0xd0, 0x00, 0x84, 0x19, 0x20, 0x7c, 0xc0, 0x07, + 0x07, 0xd5, 0x60, 0x69, 0xff, 0xf7, 0x26, 0xff, + 0x00, 0x28, 0x02, 0xd0, 0xa8, 0x68, 0x32, 0x30, + 0x60, 0x61, 0x01, 0x32, 0x08, 0x2a, 0xef, 0xdb, + 0x3c, 0x00, 0xe0, 0x2d, 0x01, 0x00, 0x70, 0xbd, + 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x60, + 0x07, 0x00, 0x02, 0x4a, 0xc0, 0x00, 0x80, 0x18, + 0x01, 0x74, 0x70, 0x47, 0x00, 0x00, 0x00, 0x60, + 0x07, 0x00, 0x04, 0x49, 0xc0, 0x00, 0x41, 0x18, + 0x08, 0x7c, 0x08, 0x23, 0x02, 0x1c, 0x9a, 0x43, + 0x0a, 0x74, 0x70, 0x47, 0x00, 0x00, 0x00, 0x60, + 0x07, 0x00, 0x70, 0xb5, 0x08, 0x28, 0x17, 0xd2, + 0x0e, 0x49, 0x3c, 0x00, 0x1c, 0x2e, 0x01, 0x00, + 0x8a, 0x68, 0x0e, 0x4d, 0x01, 0x3a, 0xc1, 0x00, + 0x49, 0x19, 0x4a, 0x61, 0x0c, 0x4b, 0x9a, 0x79, + 0x10, 0x31, 0x0c, 0x78, 0x0d, 0x26, 0xb4, 0x43, + 0x0c, 0x70, 0x01, 0x21, 0x81, 0x40, 0x29, 0x73, + 0x9a, 0x71, 0x09, 0x4a, 0x07, 0x49, 0x00, 0x01, + 0x80, 0x18, 0x41, 0x60, 0x70, 0xbd, 0x05, 0x21, + 0x99, 0x20, 0xee, 0xf7, 0x29, 0xfa, 0x70, 0xbd, + 0x00, 0x01, 0x07, 0x00, 0x3c, 0x00, 0x58, 0x2e, + 0x01, 0x00, 0x00, 0x60, 0x07, 0x00, 0x20, 0x10, + 0x07, 0x00, 0xd1, 0x75, 0x00, 0x00, 0xac, 0x73, + 0x01, 0x00, 0xf8, 0xb5, 0x9e, 0x46, 0x1a, 0x4b, + 0x94, 0x46, 0x9b, 0x68, 0x1a, 0x4c, 0xc2, 0x00, + 0x12, 0x19, 0x01, 0x3b, 0x53, 0x61, 0x15, 0x1c, + 0x18, 0x4c, 0xa6, 0x79, 0x2a, 0x1c, 0x10, 0x32, + 0x13, 0x78, 0x0d, 0x27, 0xbb, 0x43, 0x13, 0x70, + 0x01, 0x27, 0x12, 0x4b, 0x87, 0x40, 0x3c, 0x00, + 0x94, 0x2e, 0x01, 0x00, 0x1f, 0x73, 0xa6, 0x71, + 0x12, 0x4e, 0x00, 0x01, 0x80, 0x19, 0x63, 0x46, + 0x43, 0x60, 0x73, 0x46, 0x83, 0x60, 0x13, 0x78, + 0x40, 0x7b, 0xa6, 0x79, 0x01, 0x27, 0x18, 0x43, + 0x38, 0x43, 0x14, 0x35, 0x00, 0xab, 0x1e, 0x70, + 0xe4, 0x79, 0x5c, 0x70, 0x06, 0x4b, 0x9b, 0x68, + 0x03, 0x33, 0xcc, 0x1a, 0x00, 0xd5, 0x19, 0x1c, + 0x29, 0x60, 0x10, 0x70, 0x00, 0xab, 0x18, 0x88, + 0x3c, 0x00, 0xd0, 0x2e, 0x01, 0x00, 0x03, 0x4c, + 0x20, 0x3c, 0xe0, 0x84, 0xf8, 0xbd, 0x00, 0x01, + 0x07, 0x00, 0x00, 0x60, 0x07, 0x00, 0x20, 0x10, + 0x07, 0x00, 0xac, 0x73, 0x01, 0x00, 0x00, 0xb5, + 0x01, 0x1c, 0xff, 0xf7, 0x5e, 0xff, 0x42, 0x18, + 0x10, 0x1c, 0xff, 0xf7, 0x92, 0xfe, 0x00, 0x28, + 0xfa, 0xd0, 0x00, 0xbd, 0x00, 0x00, 0x89, 0x1a, + 0x40, 0x1a, 0x99, 0x18, 0x88, 0x42, 0x01, 0xd8, + 0x01, 0x20, 0x3c, 0x00, 0x0c, 0x2f, 0x01, 0x00, + 0x70, 0x47, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, + 0xf8, 0xb5, 0x0f, 0x1c, 0x04, 0x1c, 0x00, 0x28, + 0x01, 0xd1, 0xee, 0xf7, 0xef, 0xf9, 0x21, 0x1c, + 0x01, 0x20, 0xff, 0xf7, 0x19, 0xfa, 0x41, 0x20, + 0x00, 0x5d, 0x00, 0x28, 0x01, 0xd1, 0x00, 0x25, + 0x04, 0xe0, 0x02, 0x28, 0x01, 0xd1, 0x05, 0x25, + 0x00, 0xe0, 0x01, 0x25, 0xe0, 0x68, 0xee, 0xf7, + 0x29, 0xfb, 0xa6, 0x6b, 0x3c, 0x00, 0x48, 0x2f, + 0x01, 0x00, 0x00, 0x2e, 0x10, 0xd0, 0x00, 0x2f, + 0x06, 0xd0, 0x2f, 0x20, 0x02, 0x5d, 0x20, 0x6a, + 0x41, 0x6b, 0x28, 0x1c, 0xed, 0xf7, 0x44, 0xfa, + 0xa0, 0x69, 0x00, 0x28, 0x01, 0xd0, 0xee, 0xf7, + 0x46, 0xfc, 0x20, 0x6a, 0xee, 0xf7, 0x43, 0xfc, + 0x20, 0x1c, 0xee, 0xf7, 0x40, 0xfc, 0x30, 0x1c, + 0xf8, 0xbd, 0xb0, 0xb5, 0x04, 0x1c, 0xc0, 0x6b, + 0x00, 0x28, 0x09, 0xd0, 0x20, 0x69, 0x3c, 0x00, + 0x84, 0x2f, 0x01, 0x00, 0x00, 0x8b, 0xee, 0xf7, + 0x55, 0xf9, 0x00, 0x28, 0x03, 0xd0, 0x21, 0x1c, + 0x06, 0x20, 0xff, 0xf7, 0xe3, 0xf9, 0x08, 0x4d, + 0x20, 0x1c, 0xa9, 0x6d, 0xff, 0xf7, 0xba, 0xff, + 0x00, 0x28, 0x07, 0xd0, 0xe8, 0x68, 0x01, 0x30, + 0xe8, 0x60, 0x28, 0x6a, 0x01, 0x38, 0x28, 0x62, + 0xfc, 0xf7, 0x78, 0xf8, 0xb0, 0xbd, 0x00, 0x00, + 0xc4, 0x69, 0x01, 0x00, 0x10, 0xb5, 0x06, 0x4c, + 0x3c, 0x00, 0xc0, 0x2f, 0x01, 0x00, 0xe1, 0x6d, + 0xff, 0xf7, 0xa7, 0xff, 0x00, 0x28, 0x04, 0xd0, + 0xe0, 0x69, 0x01, 0x38, 0xe0, 0x61, 0xfc, 0xf7, + 0x68, 0xf8, 0x10, 0xbd, 0x00, 0x00, 0xc4, 0x69, + 0x01, 0x00, 0x0c, 0x23, 0x0c, 0x49, 0x58, 0x43, + 0x40, 0x18, 0x10, 0xb5, 0x44, 0x68, 0xa1, 0x68, + 0x00, 0x29, 0x02, 0xd0, 0x20, 0x1c, 0xed, 0xf7, + 0xf3, 0xf9, 0xe0, 0x6b, 0x00, 0x28, 0x08, 0xd0, + 0x20, 0x69, 0x3c, 0x00, 0xfc, 0x2f, 0x01, 0x00, + 0x00, 0x8b, 0xee, 0xf7, 0x19, 0xf9, 0x00, 0x28, + 0x02, 0xd0, 0x20, 0x1c, 0xf9, 0xf7, 0x26, 0xf9, + 0x10, 0xbd, 0x00, 0x00, 0x60, 0x7b, 0x01, 0x00, + 0xf8, 0xb5, 0x22, 0x49, 0x48, 0x68, 0x80, 0x00, + 0x06, 0xd4, 0x01, 0x20, 0x40, 0x07, 0x08, 0x60, + 0x4a, 0x69, 0x92, 0x00, 0x00, 0xd4, 0x48, 0x60, + 0x1d, 0x4f, 0x78, 0x7e, 0xc3, 0x06, 0x01, 0x20, + 0x02, 0x1c, 0xdb, 0x0e, 0x3c, 0x00, 0x38, 0x30, + 0x01, 0x00, 0x9a, 0x40, 0x0a, 0x60, 0x79, 0x69, + 0x8c, 0x68, 0x8c, 0x60, 0x21, 0x07, 0x89, 0x0f, + 0x09, 0xd0, 0x21, 0x07, 0x04, 0xd5, 0x0b, 0x21, + 0x9e, 0x20, 0xee, 0xf7, 0x28, 0xf9, 0x00, 0xe0, + 0x78, 0x64, 0x0c, 0x20, 0x84, 0x43, 0x12, 0x48, + 0x3d, 0x68, 0x06, 0x5d, 0x6c, 0x68, 0x2c, 0x34, + 0x06, 0xe0, 0xa0, 0x68, 0x00, 0x68, 0xa0, 0x60, + 0xe9, 0x68, 0x28, 0x1c, 0xed, 0xf7, 0x3c, 0x00, + 0x74, 0x30, 0x01, 0x00, 0xb2, 0xf9, 0x01, 0x3e, + 0xf6, 0xd2, 0xa0, 0x68, 0x80, 0x68, 0x00, 0x28, + 0x0d, 0xd0, 0x40, 0x89, 0x00, 0x28, 0x0a, 0xd0, + 0x78, 0x6c, 0x00, 0x28, 0x07, 0xd1, 0x78, 0x69, + 0x80, 0x68, 0x80, 0x07, 0x03, 0xd1, 0x0c, 0x21, + 0x9e, 0x20, 0xee, 0xf7, 0x03, 0xf9, 0xf8, 0xbd, + 0x00, 0x10, 0x07, 0x00, 0xcc, 0x6d, 0x01, 0x00, + 0xb4, 0x44, 0x01, 0x00, 0x09, 0x49, 0x80, 0xb5, + 0x3c, 0x00, 0xb0, 0x30, 0x01, 0x00, 0x08, 0x7e, + 0xc2, 0x06, 0xd2, 0x0e, 0x01, 0x20, 0x90, 0x40, + 0x07, 0x4a, 0x10, 0x60, 0x00, 0x20, 0x0a, 0x69, + 0xc0, 0x43, 0x90, 0x60, 0x08, 0x68, 0x24, 0x31, + 0x06, 0xc9, 0x03, 0x69, 0xed, 0xf7, 0x86, 0xf9, + 0x80, 0xbd, 0xcc, 0x6d, 0x01, 0x00, 0x00, 0x10, + 0x07, 0x00, 0xf8, 0xb5, 0x44, 0x68, 0x06, 0x1c, + 0x2c, 0x34, 0x20, 0x68, 0x0d, 0x1c, 0x80, 0x68, + 0x00, 0x90, 0x3c, 0x00, 0xec, 0x30, 0x01, 0x00, + 0x00, 0x28, 0x00, 0xd0, 0xc5, 0x60, 0x20, 0x68, + 0x00, 0x68, 0x20, 0x60, 0x40, 0x68, 0x00, 0x28, + 0x03, 0xd0, 0x0a, 0x21, 0x9e, 0x20, 0xee, 0xf7, + 0xcf, 0xf8, 0x20, 0x68, 0x45, 0x60, 0x28, 0x1c, + 0x02, 0xe0, 0x00, 0x22, 0x42, 0x60, 0x08, 0x1c, + 0xc1, 0x68, 0x00, 0x29, 0xf9, 0xd1, 0x71, 0x68, + 0x60, 0x27, 0x0b, 0x1c, 0x40, 0x33, 0x9c, 0x46, + 0x9b, 0x78, 0xca, 0x7e, 0x3c, 0x00, 0x28, 0x31, + 0x01, 0x00, 0x5b, 0x01, 0x12, 0x07, 0x12, 0x0f, + 0x3b, 0x40, 0x1a, 0x43, 0x8b, 0x8f, 0xff, 0x27, + 0x3f, 0x04, 0x1b, 0x04, 0x3b, 0x40, 0x1a, 0x43, + 0x90, 0x23, 0x1a, 0x43, 0x42, 0x60, 0x63, 0x46, + 0x9a, 0x78, 0x01, 0x32, 0xd2, 0x07, 0xd2, 0x0f, + 0x9a, 0x70, 0x89, 0x6b, 0xc1, 0x60, 0x21, 0x68, + 0x88, 0x60, 0x00, 0x98, 0x00, 0x28, 0x01, 0xd0, + 0x00, 0x98, 0xc5, 0x60, 0x0a, 0x4f, 0x3c, 0x00, + 0x64, 0x31, 0x01, 0x00, 0xbd, 0x79, 0xa0, 0x69, + 0x00, 0x28, 0x0c, 0xd0, 0x00, 0x22, 0xa2, 0x61, + 0x74, 0x68, 0x60, 0x69, 0xef, 0xf7, 0x2e, 0xff, + 0xe0, 0x6a, 0x61, 0x69, 0x40, 0x68, 0x48, 0x60, + 0x61, 0x69, 0x01, 0x20, 0x08, 0x60, 0xbd, 0x71, + 0xf8, 0xbd, 0x00, 0x00, 0x20, 0x10, 0x07, 0x00, + 0xfe, 0xb5, 0x44, 0x68, 0x0f, 0x1c, 0x01, 0x94, + 0x2c, 0x34, 0x20, 0x1c, 0x12, 0x30, 0x02, 0x90, + 0x3c, 0x00, 0xa0, 0x31, 0x01, 0x00, 0x2c, 0xe0, + 0x0c, 0x20, 0xee, 0xf7, 0x00, 0xfb, 0x05, 0x1c, + 0x60, 0x68, 0x00, 0x28, 0x1d, 0xd1, 0x02, 0x98, + 0x00, 0x21, 0x00, 0x90, 0x00, 0x20, 0xee, 0xf7, + 0x0e, 0xfa, 0x06, 0x1c, 0x00, 0x98, 0x04, 0x21, + 0xee, 0xf7, 0x09, 0xfa, 0x01, 0x1c, 0x01, 0x98, + 0xc0, 0x7e, 0x00, 0x07, 0x00, 0x0f, 0xd0, 0x30, + 0x70, 0x60, 0x01, 0x98, 0xc0, 0x7e, 0x00, 0x07, + 0x00, 0x0f, 0x3c, 0x00, 0xdc, 0x31, 0x01, 0x00, + 0xf0, 0x30, 0x48, 0x60, 0x30, 0x1c, 0xee, 0xf7, + 0x19, 0xf9, 0x65, 0x60, 0xe6, 0x60, 0x01, 0xe0, + 0x20, 0x68, 0x05, 0x60, 0x60, 0x68, 0x28, 0x60, + 0x25, 0x60, 0x00, 0x20, 0x68, 0x60, 0xa8, 0x60, + 0x38, 0x1c, 0xff, 0x30, 0x00, 0x06, 0x00, 0x0e, + 0x39, 0x1c, 0x07, 0x1c, 0x00, 0x29, 0xca, 0xd1, + 0x60, 0x68, 0xa0, 0x60, 0xfe, 0xbd, 0x00, 0x00, + 0xff, 0xb5, 0x05, 0x1c, 0x3c, 0x00, 0x18, 0x32, + 0x01, 0x00, 0x08, 0x1c, 0x00, 0x26, 0x81, 0xb0, + 0xf4, 0xf7, 0x2f, 0xfe, 0x04, 0x1c, 0x02, 0xd0, + 0x60, 0x68, 0xff, 0x28, 0x01, 0xd1, 0x06, 0x26, + 0x28, 0xe0, 0x21, 0x1c, 0x20, 0x31, 0x0a, 0x78, + 0x01, 0x2a, 0x01, 0xd1, 0x03, 0x26, 0x21, 0xe0, + 0x01, 0x27, 0x25, 0x60, 0x0f, 0x70, 0x11, 0xc5, + 0x1d, 0x48, 0x08, 0x3d, 0x68, 0x61, 0x03, 0x98, + 0x6a, 0x46, 0xe8, 0x60, 0x04, 0x98, 0x3c, 0x00, + 0x54, 0x32, 0x01, 0x00, 0x28, 0x61, 0x1a, 0x48, + 0xa8, 0x61, 0x1a, 0x48, 0xe8, 0x61, 0x1a, 0x48, + 0x28, 0x62, 0x1a, 0x48, 0x68, 0x62, 0x20, 0x7e, + 0xa1, 0x68, 0xed, 0xf7, 0xb3, 0xfe, 0x00, 0x28, + 0x06, 0xd1, 0x60, 0x7e, 0xe1, 0x68, 0x6a, 0x46, + 0xed, 0xf7, 0xac, 0xfe, 0x00, 0x28, 0x07, 0xd0, + 0x04, 0x26, 0x31, 0x1c, 0x9e, 0x20, 0xee, 0xf7, + 0x0d, 0xf8, 0x30, 0x1c, 0x05, 0xb0, 0xf0, 0xbd, + 0x3c, 0x00, 0x90, 0x32, 0x01, 0x00, 0x6a, 0x46, + 0x0f, 0x49, 0x1d, 0x20, 0xed, 0xf7, 0x9d, 0xfe, + 0x01, 0x21, 0x0d, 0x48, 0x49, 0x07, 0x01, 0x60, + 0x22, 0x7e, 0x3b, 0x1c, 0xd2, 0x06, 0xd2, 0x0e, + 0x93, 0x40, 0x43, 0x60, 0x62, 0x7e, 0xd2, 0x06, + 0xd2, 0x0e, 0x97, 0x40, 0x47, 0x60, 0x41, 0x60, + 0xe6, 0xe7, 0x31, 0x33, 0x01, 0x00, 0xd9, 0x32, + 0x01, 0x00, 0x91, 0x31, 0x01, 0x00, 0xdd, 0x30, + 0x01, 0x00, 0x3c, 0x00, 0xcc, 0x32, 0x01, 0x00, + 0xfd, 0x32, 0x01, 0x00, 0x71, 0x33, 0x01, 0x00, + 0x00, 0x10, 0x07, 0x00, 0x42, 0x68, 0x2c, 0x32, + 0x50, 0x68, 0x43, 0x68, 0x0b, 0x60, 0x81, 0x68, + 0x4b, 0x89, 0x0b, 0x81, 0x83, 0x68, 0x00, 0x21, + 0xd9, 0x60, 0x41, 0x60, 0x81, 0x60, 0x00, 0x68, + 0x50, 0x60, 0x00, 0x20, 0x70, 0x47, 0x00, 0x00, + 0x70, 0xb5, 0x42, 0x68, 0xff, 0x26, 0x91, 0x87, + 0x10, 0x6b, 0x0c, 0x04, 0x3c, 0x00, 0x08, 0x33, + 0x01, 0x00, 0x05, 0x1c, 0x36, 0x04, 0x34, 0x40, + 0x43, 0x68, 0x59, 0x68, 0xb1, 0x43, 0x21, 0x43, + 0x59, 0x60, 0x00, 0x68, 0xa8, 0x42, 0xf7, 0xd1, + 0x10, 0x6b, 0x51, 0x69, 0x40, 0x68, 0x48, 0x60, + 0x51, 0x69, 0x01, 0x20, 0x08, 0x60, 0x70, 0xbd, + 0x00, 0x00, 0xb0, 0xb5, 0x43, 0x68, 0x08, 0x1c, + 0x59, 0x62, 0x9a, 0x62, 0x00, 0x25, 0x0a, 0xe0, + 0x45, 0x81, 0xc4, 0x68, 0x2a, 0x1c, 0x3c, 0x00, + 0x44, 0x33, 0x01, 0x00, 0x00, 0x2c, 0x03, 0xd1, + 0x9a, 0x7e, 0x12, 0x07, 0x12, 0x0f, 0x10, 0x32, + 0x42, 0x60, 0x20, 0x1c, 0x00, 0x28, 0xf2, 0xd1, + 0x18, 0x69, 0x41, 0x60, 0x19, 0x69, 0x01, 0x20, + 0x08, 0x60, 0x02, 0x48, 0x00, 0x68, 0xed, 0xf7, + 0x37, 0xf8, 0xb0, 0xbd, 0x5c, 0x5b, 0x01, 0x00, + 0x01, 0x20, 0x05, 0x49, 0x40, 0x07, 0x80, 0xb5, + 0x88, 0x60, 0x04, 0x48, 0x01, 0x68, 0x0d, 0x20, + 0x3c, 0x00, 0x80, 0x33, 0x01, 0x00, 0xfe, 0xf7, + 0xe6, 0xff, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x10, + 0x07, 0x00, 0xc4, 0x60, 0x01, 0x00, 0xf8, 0xb5, + 0x0e, 0x4f, 0x0c, 0x4e, 0x00, 0x24, 0x48, 0x20, + 0x60, 0x43, 0xc5, 0x19, 0x48, 0x21, 0x28, 0x1c, + 0xed, 0xf7, 0x7b, 0xf8, 0x1c, 0x20, 0x60, 0x43, + 0x81, 0x19, 0x28, 0x1d, 0x1c, 0x22, 0xed, 0xf7, + 0xfe, 0xf8, 0x1c, 0x23, 0xe8, 0x56, 0x05, 0x49, + 0xfb, 0xf7, 0x3c, 0x00, 0xbc, 0x33, 0x01, 0x00, + 0xcd, 0xf8, 0x01, 0x34, 0x01, 0x2c, 0xe9, 0xd3, + 0xf8, 0xbd, 0x00, 0x00, 0xb8, 0x44, 0x01, 0x00, + 0xcc, 0x6d, 0x01, 0x00, 0x15, 0x32, 0x01, 0x00, + 0xff, 0xb5, 0x05, 0x1c, 0x0a, 0x30, 0x06, 0x1c, + 0x81, 0xb0, 0xf2, 0xf7, 0xdd, 0xf8, 0x18, 0x4f, + 0x04, 0x1c, 0x39, 0x88, 0xef, 0xf7, 0xbc, 0xfc, + 0x32, 0x88, 0x78, 0x68, 0x02, 0x80, 0x72, 0x88, + 0x02, 0x30, 0x02, 0x80, 0x3c, 0x00, 0xf8, 0x33, + 0x01, 0x00, 0xb1, 0x88, 0x12, 0x4e, 0x41, 0x80, + 0x28, 0x88, 0x08, 0x36, 0x40, 0x05, 0x00, 0x28, + 0x05, 0xda, 0x69, 0x88, 0x03, 0x9a, 0x20, 0x1c, + 0xf7, 0xf7, 0x01, 0xfd, 0x00, 0xe0, 0x00, 0x20, + 0x70, 0x80, 0xf8, 0xf7, 0x5e, 0xfc, 0x01, 0x21, + 0x09, 0x03, 0x00, 0x28, 0x30, 0x88, 0x01, 0xd0, + 0x88, 0x43, 0x00, 0xe0, 0x08, 0x43, 0x30, 0x80, + 0x05, 0x48, 0x00, 0x22, 0x00, 0x21, 0x3c, 0x00, + 0x34, 0x34, 0x01, 0x00, 0x14, 0x30, 0xef, 0xf7, + 0x65, 0xfc, 0x20, 0x1c, 0xf9, 0xf7, 0x74, 0xf8, + 0x05, 0xb0, 0xf0, 0xbd, 0xb0, 0x7a, 0x01, 0x00, + 0x10, 0xb5, 0x0e, 0x4c, 0x60, 0x68, 0xf8, 0xf7, + 0x95, 0xf9, 0x20, 0x68, 0x00, 0x6a, 0x00, 0x28, + 0x13, 0xd1, 0xf8, 0xf7, 0xbf, 0xfc, 0x00, 0x28, + 0x08, 0xd0, 0x21, 0x68, 0x01, 0x20, 0x08, 0x62, + 0x1f, 0x21, 0x00, 0x22, 0x83, 0x20, 0x00, 0xf0, + 0x3c, 0x00, 0x70, 0x34, 0x01, 0x00, 0x9f, 0xf9, + 0x02, 0xe0, 0x60, 0x68, 0xf8, 0xf7, 0x21, 0xfa, + 0xff, 0xf7, 0x97, 0xfc, 0x21, 0x68, 0x08, 0x61, + 0x10, 0xbd, 0x14, 0x7a, 0x01, 0x00, 0xfe, 0xb5, + 0x1b, 0x4e, 0x0f, 0x1c, 0x1d, 0x1c, 0x14, 0x1c, + 0xb0, 0x60, 0x08, 0x1c, 0xf7, 0xf7, 0x2b, 0xff, + 0xb0, 0x80, 0x34, 0x73, 0x35, 0x62, 0x38, 0x1c, + 0x01, 0xaa, 0x02, 0xa9, 0xf7, 0xf7, 0x25, 0xff, + 0x00, 0xab, 0x3c, 0x00, 0xac, 0x34, 0x01, 0x00, + 0x18, 0x7a, 0x01, 0x28, 0x18, 0xd1, 0x18, 0x79, + 0x0b, 0x28, 0x08, 0xd1, 0x30, 0x7f, 0x24, 0x23, + 0x0f, 0x49, 0x58, 0x43, 0x40, 0x18, 0x80, 0x68, + 0xec, 0xf7, 0x88, 0xff, 0xfe, 0xbd, 0x00, 0xab, + 0x18, 0x79, 0x0a, 0x28, 0x08, 0xd1, 0xf7, 0xf7, + 0x39, 0xfd, 0x07, 0x1c, 0x29, 0x1c, 0x20, 0x1c, + 0xf7, 0xf7, 0x16, 0xfd, 0x38, 0x18, 0xb0, 0x80, + 0x30, 0x7f, 0x24, 0x23, 0x3c, 0x00, 0xe8, 0x34, + 0x01, 0x00, 0x04, 0x49, 0x58, 0x43, 0x40, 0x18, + 0x40, 0x68, 0xec, 0xf7, 0x72, 0xff, 0xe8, 0xe7, + 0x00, 0x00, 0xd4, 0x79, 0x01, 0x00, 0x94, 0x46, + 0x01, 0x00, 0xb0, 0xb5, 0xff, 0xf7, 0x53, 0xfc, + 0x04, 0x1c, 0xfb, 0xf7, 0xfc, 0xfa, 0x0c, 0x4d, + 0x29, 0x68, 0x09, 0x69, 0x09, 0x1b, 0x0c, 0x1a, + 0x02, 0x21, 0x1f, 0x20, 0x00, 0xf0, 0x8b, 0xf8, + 0x14, 0x2c, 0x06, 0xdd, 0x02, 0x22, 0x3c, 0x00, + 0x24, 0x35, 0x01, 0x00, 0x21, 0x1c, 0x1f, 0x20, + 0x00, 0xf0, 0x50, 0xf8, 0x01, 0x20, 0xb0, 0xbd, + 0x29, 0x68, 0x01, 0x20, 0x89, 0x6a, 0x00, 0x29, + 0xf9, 0xd0, 0x00, 0x20, 0xb0, 0xbd, 0x00, 0x00, + 0x14, 0x7a, 0x01, 0x00, 0xf8, 0xb5, 0x1a, 0x4d, + 0x07, 0x1c, 0xae, 0x79, 0x01, 0x21, 0x19, 0x4c, + 0x00, 0x20, 0x22, 0x68, 0x00, 0x2a, 0x14, 0xd1, + 0xae, 0x71, 0xa2, 0x68, 0xd0, 0x68, 0x06, 0xca, + 0x3c, 0x00, 0x60, 0x35, 0x01, 0x00, 0xec, 0xf7, + 0x3c, 0xff, 0xae, 0x79, 0x00, 0x21, 0x13, 0x4a, + 0x50, 0x69, 0x01, 0x30, 0x50, 0x61, 0xa0, 0x68, + 0x80, 0x68, 0xa0, 0x60, 0x62, 0x68, 0x90, 0x42, + 0x06, 0xd1, 0x01, 0x20, 0x20, 0x60, 0x03, 0xe0, + 0x01, 0x30, 0x0c, 0x34, 0x03, 0x28, 0xe3, 0xdb, + 0x00, 0x2f, 0x08, 0xd1, 0x00, 0x29, 0x0a, 0xd0, + 0x0a, 0x48, 0x40, 0x68, 0x00, 0x28, 0x06, 0xd0, + 0xfa, 0xf7, 0x3c, 0x00, 0x9c, 0x35, 0x01, 0x00, + 0xf5, 0xff, 0x03, 0xe0, 0x01, 0x2f, 0x03, 0xd0, + 0x00, 0x29, 0x01, 0xd1, 0xae, 0x71, 0xce, 0xe7, + 0xae, 0x71, 0xf8, 0xbd, 0x20, 0x10, 0x07, 0x00, + 0x18, 0xd9, 0x01, 0x00, 0xa8, 0x60, 0x01, 0x00, + 0x70, 0x5d, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x23, + 0xf5, 0xf7, 0x7c, 0xf8, 0x80, 0xbd, 0x00, 0x00, + 0x80, 0xb5, 0x00, 0x23, 0xf5, 0xf7, 0x76, 0xf8, + 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0x35, + 0x01, 0x00, 0xf8, 0xb5, 0x13, 0x4b, 0x00, 0x24, + 0x1b, 0x88, 0x98, 0x42, 0x1b, 0xd2, 0x11, 0x4b, + 0xc0, 0x00, 0xc0, 0x18, 0x45, 0x68, 0x06, 0x68, + 0x28, 0x68, 0x00, 0x28, 0x17, 0xd1, 0x0e, 0x4f, + 0xa8, 0x68, 0x43, 0x68, 0xb3, 0x42, 0x09, 0xd1, + 0xc3, 0x68, 0x8b, 0x42, 0x06, 0xd1, 0x03, 0x68, + 0x93, 0x42, 0x01, 0xd0, 0x53, 0x1c, 0x01, 0xd1, + 0x01, 0x24, 0x47, 0x60, 0x80, 0x68, 0x3c, 0x00, + 0x14, 0x36, 0x01, 0x00, 0x6b, 0x68, 0x83, 0x42, + 0xee, 0xd1, 0x03, 0xe0, 0x01, 0x21, 0x80, 0x20, + 0xed, 0xf7, 0x40, 0xfe, 0x20, 0x1c, 0xf8, 0xbd, + 0x56, 0x57, 0x01, 0x00, 0x84, 0x5d, 0x01, 0x00, + 0x29, 0xe3, 0x00, 0x00, 0xf8, 0xb5, 0x17, 0x4f, + 0x0a, 0x1c, 0xbe, 0x79, 0x16, 0x4d, 0x00, 0x23, + 0x6c, 0x68, 0x07, 0xe0, 0x21, 0x68, 0x91, 0x42, + 0x02, 0xd1, 0x21, 0x79, 0x81, 0x42, 0x04, 0xd0, + 0x3c, 0x00, 0x50, 0x36, 0x01, 0x00, 0x23, 0x1c, + 0xe4, 0x68, 0x00, 0x2c, 0xf5, 0xd1, 0x17, 0xe0, + 0x00, 0x2c, 0x15, 0xd0, 0x00, 0x2b, 0x0d, 0xd1, + 0xe3, 0x68, 0x0d, 0x48, 0x6b, 0x60, 0x00, 0x88, + 0x00, 0x2b, 0x02, 0xd1, 0xff, 0xf7, 0xd1, 0xfb, + 0x06, 0xe0, 0x0a, 0x4a, 0x99, 0x68, 0xff, 0xf7, + 0xf6, 0xfb, 0x01, 0xe0, 0xe0, 0x68, 0xd8, 0x60, + 0x28, 0x68, 0xe0, 0x60, 0x2c, 0x60, 0x02, 0xe0, + 0x01, 0x21, 0x3c, 0x00, 0x8c, 0x36, 0x01, 0x00, + 0xff, 0xf7, 0xa4, 0xff, 0xbe, 0x71, 0xf8, 0xbd, + 0x20, 0x10, 0x07, 0x00, 0x7c, 0x5d, 0x01, 0x00, + 0x2c, 0x74, 0x01, 0x00, 0x21, 0x38, 0x01, 0x00, + 0x70, 0xb5, 0x09, 0x4e, 0xb5, 0x79, 0xf9, 0xf7, + 0xaf, 0xfe, 0x04, 0x1c, 0x09, 0xd0, 0x20, 0x1c, + 0xed, 0xf7, 0x0c, 0xfb, 0x05, 0x49, 0x8a, 0x68, + 0x80, 0x18, 0x88, 0x60, 0x08, 0x68, 0x01, 0x30, + 0x08, 0x60, 0xb5, 0x71, 0x3c, 0x00, 0xc8, 0x36, + 0x01, 0x00, 0x20, 0x1c, 0x70, 0xbd, 0x20, 0x10, + 0x07, 0x00, 0xa8, 0x60, 0x01, 0x00, 0x09, 0x48, + 0x80, 0xb5, 0x40, 0x68, 0x02, 0x1c, 0x0b, 0xe0, + 0x01, 0x69, 0x00, 0x29, 0x07, 0xd0, 0x82, 0x42, + 0x04, 0xd0, 0x81, 0x68, 0x05, 0x48, 0x00, 0x88, + 0xff, 0xf7, 0xe5, 0xfa, 0x80, 0xbd, 0xc0, 0x68, + 0x00, 0x28, 0xf1, 0xd1, 0x80, 0xbd, 0x7c, 0x5d, + 0x01, 0x00, 0x2c, 0x74, 0x01, 0x00, 0x3c, 0x00, + 0x04, 0x37, 0x01, 0x00, 0x05, 0x48, 0x80, 0xb5, + 0x42, 0x68, 0x00, 0x2a, 0x04, 0xd0, 0x04, 0x48, + 0x00, 0x88, 0x91, 0x68, 0xff, 0xf7, 0xd2, 0xfa, + 0x80, 0xbd, 0x00, 0x00, 0x7c, 0x5d, 0x01, 0x00, + 0x2c, 0x74, 0x01, 0x00, 0x05, 0x48, 0x01, 0x68, + 0x00, 0x29, 0x04, 0xd0, 0xc0, 0x68, 0x00, 0x28, + 0x01, 0xd0, 0x01, 0x20, 0x70, 0x47, 0x00, 0x20, + 0x70, 0x47, 0x00, 0x00, 0x18, 0xd9, 0x01, 0x00, + 0x3c, 0x00, 0x40, 0x37, 0x01, 0x00, 0x80, 0xb5, + 0xf6, 0xf7, 0xd1, 0xfa, 0x80, 0xbd, 0x13, 0x1c, + 0x0d, 0x4a, 0xb0, 0xb5, 0x12, 0x88, 0x90, 0x42, + 0x0f, 0xd2, 0x03, 0x29, 0x0d, 0xd2, 0x0a, 0x4a, + 0xc0, 0x00, 0x14, 0x58, 0x0a, 0x4d, 0xac, 0x42, + 0x07, 0xd1, 0x13, 0x50, 0x0c, 0x23, 0x59, 0x43, + 0x08, 0x4b, 0xc9, 0x18, 0x80, 0x18, 0x41, 0x60, + 0xb0, 0xbd, 0x02, 0x21, 0x80, 0x20, 0xed, 0xf7, + 0x94, 0xfd, 0x3c, 0x00, 0x7c, 0x37, 0x01, 0x00, + 0xb0, 0xbd, 0x00, 0x00, 0x56, 0x57, 0x01, 0x00, + 0x84, 0x5d, 0x01, 0x00, 0x09, 0xa0, 0x00, 0x00, + 0x18, 0xd9, 0x01, 0x00, 0xf8, 0xb5, 0x0f, 0x1c, + 0x1e, 0x1c, 0x15, 0x1c, 0x04, 0x1c, 0x11, 0x1c, + 0xff, 0xf7, 0x4a, 0xff, 0x33, 0x1c, 0x2a, 0x1c, + 0x39, 0x1c, 0x20, 0x1c, 0xf4, 0xf7, 0x8a, 0xff, + 0xf8, 0xbd, 0x00, 0x00, 0xf7, 0xb5, 0x94, 0x46, + 0xff, 0x29, 0x21, 0xd0, 0x3c, 0x00, 0xb8, 0x37, + 0x01, 0x00, 0x15, 0x48, 0x00, 0x88, 0x81, 0x42, + 0x21, 0xd2, 0x14, 0x4a, 0x15, 0x4e, 0xc8, 0x00, + 0x85, 0x18, 0xb4, 0x79, 0x68, 0x68, 0x02, 0x68, + 0x00, 0x2a, 0x03, 0xd1, 0x03, 0x1d, 0x0c, 0xcb, + 0x9a, 0x42, 0x11, 0xd0, 0x43, 0x68, 0x9a, 0x68, + 0x42, 0x60, 0x0e, 0x4a, 0x17, 0x69, 0x01, 0x37, + 0x17, 0x61, 0xb4, 0x71, 0x00, 0x22, 0x02, 0x60, + 0x00, 0x98, 0xd8, 0x60, 0x60, 0x46, 0x3c, 0x00, + 0xf4, 0x37, 0x01, 0x00, 0x18, 0x60, 0x19, 0x74, + 0x28, 0x68, 0x58, 0x60, 0xfe, 0xbd, 0xb4, 0x71, + 0x06, 0x21, 0x00, 0xe0, 0x07, 0x21, 0x80, 0x20, + 0xed, 0xf7, 0x4c, 0xfd, 0xf6, 0xe7, 0x00, 0x00, + 0x56, 0x57, 0x01, 0x00, 0x84, 0x5d, 0x01, 0x00, + 0x20, 0x10, 0x07, 0x00, 0xa8, 0x60, 0x01, 0x00, + 0xb0, 0xb5, 0x14, 0x4d, 0x6c, 0x68, 0x00, 0x2c, + 0x01, 0xd0, 0x84, 0x42, 0x04, 0xd0, 0x0c, 0x21, + 0x3c, 0x00, 0x30, 0x38, 0x01, 0x00, 0x80, 0x20, + 0xed, 0xf7, 0x37, 0xfd, 0xb0, 0xbd, 0xff, 0xf7, + 0xb8, 0xfa, 0xa1, 0x68, 0x40, 0x1a, 0x0d, 0x49, + 0x88, 0x42, 0x03, 0xda, 0x10, 0x21, 0x80, 0x20, + 0xed, 0xf7, 0x2b, 0xfd, 0x21, 0x79, 0x22, 0x68, + 0x01, 0x20, 0xff, 0xf7, 0xac, 0xff, 0xe3, 0x68, + 0x6b, 0x60, 0x00, 0x2b, 0x05, 0xd0, 0x07, 0x48, + 0x06, 0x4a, 0x00, 0x88, 0x99, 0x68, 0xff, 0xf7, + 0xfe, 0xfa, 0x3c, 0x00, 0x6c, 0x38, 0x01, 0x00, + 0x28, 0x68, 0xe0, 0x60, 0x2c, 0x60, 0xb0, 0xbd, + 0x7c, 0x5d, 0x01, 0x00, 0x18, 0xfc, 0xff, 0xff, + 0x21, 0x38, 0x01, 0x00, 0x2c, 0x74, 0x01, 0x00, + 0xb0, 0xb5, 0x15, 0x4c, 0x08, 0x20, 0x21, 0x1c, + 0x80, 0x31, 0x08, 0x70, 0x13, 0x4a, 0x41, 0x04, + 0x11, 0x60, 0x13, 0x48, 0x00, 0x68, 0x13, 0x4d, + 0x6b, 0x69, 0x18, 0x40, 0x01, 0xd1, 0x10, 0x20, + 0x00, 0xe0, 0x00, 0x20, 0x3c, 0x00, 0xa8, 0x38, + 0x01, 0x00, 0xa8, 0x23, 0x5b, 0x5d, 0x18, 0x43, + 0x23, 0x1c, 0x40, 0x33, 0x18, 0x73, 0x51, 0x60, + 0x20, 0x78, 0x80, 0x08, 0x80, 0x00, 0x20, 0x70, + 0x00, 0x20, 0xff, 0xf7, 0x12, 0xfb, 0xff, 0xf7, + 0x72, 0xfa, 0x64, 0x30, 0x28, 0x66, 0x01, 0x38, + 0xa0, 0x61, 0x20, 0x78, 0x03, 0x21, 0x08, 0x43, + 0x20, 0x70, 0xb0, 0xbd, 0x00, 0x00, 0x00, 0x90, + 0x07, 0x00, 0x00, 0x10, 0x07, 0x00, 0x3c, 0x00, + 0xe4, 0x38, 0x01, 0x00, 0x10, 0x00, 0x07, 0x00, + 0xa4, 0x6c, 0x01, 0x00, 0x38, 0xb5, 0x0a, 0x4c, + 0x21, 0x1c, 0x20, 0x31, 0x8a, 0x79, 0x00, 0xab, + 0x1a, 0x70, 0xc9, 0x79, 0x07, 0x4d, 0x59, 0x70, + 0x69, 0x78, 0x88, 0x42, 0x03, 0xd1, 0xf8, 0xf7, + 0x13, 0xfc, 0xff, 0x20, 0x68, 0x70, 0x00, 0xab, + 0x18, 0x88, 0xe0, 0x84, 0x38, 0xbd, 0x00, 0x00, + 0x00, 0x10, 0x07, 0x00, 0x4c, 0x7b, 0x01, 0x00, + 0x3c, 0x00, 0x20, 0x39, 0x01, 0x00, 0xf8, 0xb5, + 0x0b, 0x1c, 0x06, 0x1c, 0x04, 0x1d, 0x7f, 0x33, + 0x14, 0xd0, 0x33, 0x68, 0x5d, 0x18, 0x35, 0x60, + 0x23, 0x88, 0x1f, 0x18, 0x06, 0x23, 0xff, 0x56, + 0xeb, 0x1b, 0x33, 0x60, 0x23, 0x88, 0x18, 0x18, + 0x81, 0x71, 0x20, 0x88, 0x01, 0x30, 0x00, 0x04, + 0x00, 0x0c, 0x20, 0x80, 0x90, 0x42, 0x01, 0xd3, + 0x00, 0x20, 0x20, 0x80, 0x10, 0x1c, 0x31, 0x68, + 0xec, 0xf7, 0x3c, 0x00, 0x5c, 0x39, 0x01, 0x00, + 0x6d, 0xfe, 0xf8, 0xbd, 0x0e, 0x49, 0x0a, 0x7c, + 0x83, 0x78, 0x1a, 0x43, 0x0a, 0x74, 0x42, 0x78, + 0x83, 0x78, 0x9a, 0x43, 0x0b, 0x7c, 0x93, 0x43, + 0x0b, 0x74, 0x8a, 0x7c, 0x43, 0x78, 0x1a, 0x43, + 0x8a, 0x74, 0x8a, 0x7c, 0x03, 0x78, 0x9a, 0x43, + 0x8a, 0x74, 0x02, 0x78, 0x43, 0x78, 0x1a, 0x43, + 0x4b, 0x7c, 0x1a, 0x43, 0x4a, 0x74, 0x4a, 0x7c, + 0xc0, 0x78, 0x82, 0x43, 0x3c, 0x00, 0x98, 0x39, + 0x01, 0x00, 0x4a, 0x74, 0x70, 0x47, 0x10, 0x00, + 0x07, 0x00, 0xb0, 0xb5, 0x06, 0x4d, 0x00, 0x24, + 0x20, 0x06, 0x00, 0x0e, 0xed, 0xf7, 0xf7, 0xf8, + 0xa1, 0x00, 0x69, 0x58, 0x08, 0x71, 0x01, 0x34, + 0x04, 0x2c, 0xf5, 0xdb, 0xb0, 0xbd, 0x10, 0x7b, + 0x01, 0x00, 0x0b, 0x48, 0x0c, 0x49, 0x7d, 0x23, + 0x42, 0x69, 0xdb, 0x00, 0x00, 0x2a, 0xc8, 0x6b, + 0x07, 0xd0, 0xc0, 0x18, 0x1a, 0x01, 0x3c, 0x00, + 0xd4, 0x39, 0x01, 0x00, 0x90, 0x42, 0xc8, 0x63, + 0x01, 0xd9, 0x07, 0x48, 0xc8, 0x63, 0x70, 0x47, + 0xff, 0x38, 0xf5, 0x38, 0xc8, 0x63, 0x98, 0x42, + 0xf9, 0xd2, 0xcb, 0x63, 0x70, 0x47, 0x00, 0x00, + 0xf4, 0x68, 0x01, 0x00, 0x44, 0x7d, 0x01, 0x00, + 0x70, 0x17, 0x00, 0x00, 0x70, 0xb5, 0x0d, 0x1c, + 0x04, 0x1c, 0x16, 0x1c, 0xfb, 0xf7, 0xf6, 0xfa, + 0xb0, 0x43, 0x28, 0x43, 0x01, 0x1c, 0x20, 0x1c, + 0x3c, 0x00, 0x10, 0x3a, 0x01, 0x00, 0x00, 0xf0, + 0xcc, 0xfa, 0x70, 0xbd, 0x00, 0x00, 0x80, 0xb5, + 0x0b, 0x4a, 0x00, 0x29, 0x09, 0xd0, 0x02, 0x29, + 0x0f, 0xd1, 0x01, 0x1c, 0x08, 0x48, 0xd2, 0x78, + 0x38, 0x30, 0xff, 0xf7, 0x78, 0xff, 0x06, 0x49, + 0x06, 0xe0, 0x01, 0x1c, 0x04, 0x48, 0x12, 0x79, + 0x20, 0x30, 0xff, 0xf7, 0x70, 0xff, 0x03, 0x49, + 0x08, 0x60, 0x80, 0xbd, 0x00, 0x00, 0xac, 0x7c, + 0x01, 0x00, 0x3c, 0x00, 0x4c, 0x3a, 0x01, 0x00, + 0xc8, 0x67, 0x01, 0x00, 0xc4, 0x67, 0x01, 0x00, + 0x80, 0xb5, 0x0b, 0x4a, 0x00, 0x29, 0x09, 0xd0, + 0x02, 0x29, 0x0f, 0xd1, 0x01, 0x1c, 0x08, 0x48, + 0x52, 0x79, 0x68, 0x30, 0xff, 0xf7, 0x5a, 0xff, + 0x06, 0x49, 0x06, 0xe0, 0x01, 0x1c, 0x04, 0x48, + 0x92, 0x79, 0x50, 0x30, 0xff, 0xf7, 0x52, 0xff, + 0x03, 0x49, 0x08, 0x60, 0x80, 0xbd, 0x00, 0x00, + 0xac, 0x7c, 0x01, 0x00, 0x3c, 0x00, 0x88, 0x3a, + 0x01, 0x00, 0xd0, 0x67, 0x01, 0x00, 0xcc, 0x67, + 0x01, 0x00, 0x08, 0xb5, 0x04, 0x21, 0x00, 0x91, + 0x81, 0x7e, 0x43, 0x68, 0x03, 0x29, 0x06, 0xd1, + 0x01, 0x1c, 0x0c, 0x31, 0x01, 0x20, 0x6a, 0x46, + 0xec, 0xf7, 0x9a, 0xfc, 0x08, 0xbd, 0x19, 0x68, + 0xc1, 0x60, 0xfb, 0xe7, 0x00, 0x00, 0x10, 0xb5, + 0x03, 0x1c, 0x00, 0x20, 0x08, 0x4c, 0x00, 0x21, + 0xca, 0x00, 0x12, 0x19, 0x92, 0x78, 0x3c, 0x00, + 0xc4, 0x3a, 0x01, 0x00, 0x9a, 0x42, 0x03, 0xd1, + 0xc8, 0x00, 0x00, 0x19, 0x40, 0x68, 0x10, 0xbd, + 0x01, 0x31, 0x09, 0x06, 0x09, 0x16, 0x06, 0x29, + 0xf1, 0xdb, 0x10, 0xbd, 0xcc, 0x5a, 0x01, 0x00, + 0xf8, 0xb5, 0x0f, 0x1c, 0x16, 0x1c, 0x00, 0x25, + 0xfe, 0xf7, 0x8e, 0xf9, 0x04, 0x1c, 0x0a, 0xd0, + 0x4a, 0x20, 0x00, 0x5d, 0x05, 0x28, 0x06, 0xd1, + 0x38, 0x1c, 0xf1, 0xf7, 0x81, 0xfe, 0x00, 0x28, + 0x3c, 0x00, 0x00, 0x3b, 0x01, 0x00, 0x01, 0xd0, + 0x01, 0x25, 0x34, 0x60, 0x28, 0x1c, 0xf8, 0xbd, + 0x00, 0x00, 0x70, 0xb5, 0x0d, 0x1c, 0x16, 0x1c, + 0x00, 0x24, 0xfe, 0xf7, 0x78, 0xf9, 0x00, 0x28, + 0x0b, 0xd0, 0x4a, 0x21, 0x09, 0x5c, 0x05, 0x29, + 0x07, 0xd1, 0x01, 0x69, 0x00, 0x29, 0x04, 0xd1, + 0x30, 0x60, 0xf1, 0xf7, 0x04, 0xfd, 0x01, 0x24, + 0x28, 0x60, 0x20, 0x1c, 0x70, 0xbd, 0xf8, 0xb5, + 0x06, 0x1c, 0x3c, 0x00, 0x3c, 0x3b, 0x01, 0x00, + 0x00, 0x25, 0x0c, 0x1c, 0x08, 0x1c, 0xf1, 0xf7, + 0x5d, 0xfe, 0x00, 0x28, 0x01, 0xd0, 0x00, 0x21, + 0x05, 0xe0, 0x20, 0x1c, 0xf1, 0xf7, 0x74, 0xfe, + 0x00, 0x28, 0x14, 0xd0, 0x01, 0x21, 0x30, 0x1c, + 0xf4, 0xf7, 0x80, 0xfb, 0x00, 0x90, 0x00, 0x28, + 0x0d, 0xd0, 0x08, 0x4f, 0x01, 0x25, 0x06, 0x22, + 0x31, 0x1c, 0x38, 0x1c, 0xec, 0xf7, 0xc2, 0xfc, + 0x06, 0x22, 0x21, 0x1c, 0x3c, 0x00, 0x78, 0x3b, + 0x01, 0x00, 0xb8, 0x18, 0xec, 0xf7, 0xbd, 0xfc, + 0x00, 0x98, 0xf8, 0x60, 0x28, 0x1c, 0xf8, 0xbd, + 0x00, 0x00, 0x70, 0x7c, 0x01, 0x00, 0x00, 0x21, + 0x00, 0x28, 0x06, 0xd0, 0x42, 0x78, 0x07, 0x2a, + 0x03, 0xd1, 0xc0, 0x79, 0x01, 0x28, 0x00, 0xd1, + 0x01, 0x21, 0x08, 0x1c, 0x70, 0x47, 0xf8, 0xb5, + 0x05, 0x1c, 0x00, 0x27, 0x16, 0x4e, 0xf1, 0xf7, + 0x28, 0xfe, 0x00, 0x28, 0x07, 0xd0, 0x3c, 0x00, + 0xb4, 0x3b, 0x01, 0x00, 0xf1, 0xf7, 0xc0, 0xfb, + 0x00, 0x28, 0x10, 0xd1, 0x00, 0x24, 0xf1, 0xf7, + 0xbb, 0xfc, 0x06, 0xe0, 0xf1, 0xf7, 0x02, 0xfe, + 0x00, 0x28, 0x08, 0xd0, 0x01, 0x24, 0xf1, 0xf7, + 0x99, 0xfd, 0x01, 0x1c, 0x06, 0x22, 0x30, 0x1c, + 0xec, 0xf7, 0x8e, 0xfc, 0x01, 0x27, 0x00, 0x2f, + 0x0d, 0xd0, 0x21, 0x1c, 0x28, 0x1c, 0xf4, 0xf7, + 0x3b, 0xfb, 0x01, 0x1c, 0x05, 0x48, 0x06, 0x22, + 0x3c, 0x00, 0xf0, 0x3b, 0x01, 0x00, 0x06, 0x38, + 0xc1, 0x60, 0x29, 0x1c, 0xec, 0xf7, 0x7f, 0xfc, + 0x01, 0x20, 0xf8, 0xbd, 0x00, 0x20, 0xfc, 0xe7, + 0x00, 0x00, 0x76, 0x7c, 0x01, 0x00, 0xf0, 0xb5, + 0x07, 0x1c, 0x00, 0x68, 0x02, 0x21, 0x04, 0x68, + 0x78, 0x69, 0x87, 0xb0, 0x01, 0x40, 0x00, 0x25, + 0x00, 0x29, 0x05, 0x91, 0x74, 0x4e, 0x12, 0xd0, + 0x22, 0x88, 0x01, 0x21, 0x13, 0x05, 0x02, 0xd4, + 0xc0, 0x07, 0x3c, 0x00, 0x2c, 0x3c, 0x01, 0x00, + 0xc1, 0x17, 0x01, 0x31, 0x6f, 0x48, 0x00, 0x29, + 0x00, 0x68, 0x01, 0xd0, 0x01, 0x30, 0x04, 0xe0, + 0x11, 0x06, 0x89, 0x0e, 0x2d, 0x29, 0x01, 0xd1, + 0x03, 0x30, 0x30, 0x60, 0x20, 0x88, 0x80, 0x07, + 0x67, 0xd1, 0x78, 0x69, 0xc0, 0x07, 0x64, 0xd5, + 0x03, 0xaa, 0x04, 0xa9, 0x20, 0x1c, 0xf7, 0xf7, + 0x4b, 0xfb, 0x00, 0xab, 0x18, 0x7c, 0x00, 0x28, + 0x07, 0xd0, 0x18, 0x7c, 0x3c, 0x00, 0x68, 0x3c, + 0x01, 0x00, 0x02, 0x28, 0x58, 0xd1, 0x18, 0x7b, + 0x40, 0x07, 0x40, 0x0f, 0x04, 0x28, 0x53, 0xd8, + 0x20, 0x79, 0x05, 0x99, 0xc0, 0x07, 0xc0, 0x17, + 0x01, 0x30, 0x02, 0x90, 0x00, 0x29, 0x02, 0xd1, + 0x02, 0x98, 0x00, 0x28, 0x48, 0xd1, 0x05, 0x99, + 0x00, 0x29, 0x04, 0xd0, 0x20, 0x88, 0x00, 0x05, + 0x01, 0xd4, 0x00, 0x20, 0x30, 0x60, 0xc0, 0x20, + 0xed, 0xf7, 0xcb, 0xfd, 0x05, 0x1c, 0x3c, 0x00, + 0xa4, 0x3c, 0x01, 0x00, 0x20, 0x1c, 0x0a, 0x30, + 0x06, 0x90, 0xfe, 0xf7, 0xad, 0xf8, 0x06, 0x1c, + 0x28, 0x1c, 0x08, 0x30, 0x23, 0x88, 0x02, 0x1d, + 0x11, 0x1d, 0xdb, 0x05, 0x06, 0xd5, 0x06, 0x9b, + 0x03, 0x60, 0x20, 0x1c, 0x10, 0x30, 0x10, 0x60, + 0x20, 0x1d, 0x0e, 0xe0, 0x23, 0x1d, 0x13, 0x60, + 0x22, 0x88, 0x92, 0x05, 0x05, 0xd5, 0x22, 0x1c, + 0x10, 0x32, 0x02, 0x60, 0x06, 0x9b, 0x0b, 0x60, + 0x3c, 0x00, 0xe0, 0x3c, 0x01, 0x00, 0x04, 0xe0, + 0x06, 0x9b, 0x03, 0x60, 0x20, 0x1c, 0x10, 0x30, + 0x08, 0x60, 0x28, 0x69, 0xf1, 0xf7, 0x43, 0xfc, + 0x00, 0x28, 0x08, 0xd0, 0x01, 0x28, 0x12, 0xd0, + 0x02, 0x28, 0x58, 0xd1, 0x00, 0xab, 0x18, 0x7c, + 0x00, 0x28, 0x54, 0xd1, 0x12, 0xe0, 0x00, 0xab, + 0x18, 0x7c, 0x02, 0x28, 0x0b, 0xd1, 0x00, 0x2e, + 0x4d, 0xd0, 0x4b, 0x20, 0x80, 0x5d, 0x02, 0x28, + 0x49, 0xd1, 0x3c, 0x00, 0x1c, 0x3d, 0x01, 0x00, + 0x07, 0xe0, 0x63, 0xe0, 0x00, 0xab, 0x18, 0x7c, + 0x00, 0x28, 0x02, 0xd1, 0x38, 0x1c, 0xfe, 0xf7, + 0x1b, 0xff, 0x20, 0x88, 0x41, 0x04, 0x30, 0x48, + 0x11, 0xd5, 0x00, 0x2e, 0x52, 0xd0, 0x00, 0xab, + 0x19, 0x7c, 0x00, 0x29, 0x26, 0xd0, 0x02, 0x99, + 0x00, 0x29, 0x02, 0xd0, 0xb0, 0x6a, 0x00, 0x78, + 0x00, 0xe0, 0x00, 0x78, 0x01, 0x28, 0x1d, 0xd0, + 0x03, 0x28, 0x43, 0xd1, 0x3c, 0x00, 0x58, 0x3d, + 0x01, 0x00, 0x1a, 0xe0, 0x00, 0xab, 0x19, 0x7c, + 0x02, 0x29, 0x16, 0xd1, 0x19, 0x7b, 0x04, 0x29, + 0x13, 0xd0, 0x19, 0x7b, 0x0c, 0x29, 0x10, 0xd0, + 0x22, 0x49, 0x09, 0x68, 0x00, 0x29, 0x0c, 0xd0, + 0x00, 0x2e, 0x0a, 0xd0, 0x02, 0x99, 0x00, 0x29, + 0x02, 0xd0, 0xb0, 0x6a, 0x00, 0x78, 0x00, 0xe0, + 0x00, 0x78, 0x01, 0x28, 0x29, 0xd0, 0x03, 0x28, + 0x27, 0xd0, 0x28, 0x22, 0x39, 0x1c, 0x3c, 0x00, + 0x94, 0x3d, 0x01, 0x00, 0x28, 0x1c, 0x88, 0x30, + 0xec, 0xf7, 0x0a, 0xfc, 0x00, 0xab, 0x19, 0x7c, + 0x28, 0x1c, 0x80, 0x30, 0x01, 0x71, 0x19, 0x7b, + 0x41, 0x71, 0x6c, 0x60, 0x6e, 0x61, 0x1b, 0xe0, + 0x05, 0x99, 0x00, 0x29, 0x14, 0xd0, 0x11, 0x48, + 0x84, 0x6c, 0x00, 0x2c, 0x10, 0xd0, 0x00, 0x22, + 0x00, 0x2e, 0x04, 0xd0, 0x40, 0x36, 0xb0, 0x7a, + 0x05, 0x28, 0x00, 0xd1, 0x01, 0x22, 0x00, 0x92, + 0x3c, 0x00, 0xd0, 0x3d, 0x01, 0x00, 0xf8, 0x7a, + 0xba, 0x7a, 0x29, 0x69, 0xc3, 0x07, 0xdb, 0x0f, + 0x06, 0x98, 0xec, 0xf7, 0x00, 0xfb, 0x28, 0x1c, + 0xed, 0xf7, 0x07, 0xfd, 0x00, 0x25, 0x28, 0x1c, + 0x07, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0xc4, 0x6a, + 0x01, 0x00, 0x68, 0x61, 0x01, 0x00, 0x28, 0x61, + 0x01, 0x00, 0xc4, 0x69, 0x01, 0x00, 0x80, 0xb5, + 0x02, 0x20, 0xff, 0xf7, 0x70, 0xf8, 0x80, 0xbd, + 0x00, 0x00, 0x3c, 0x00, 0x0c, 0x3e, 0x01, 0x00, + 0xb0, 0xb5, 0x1d, 0x4d, 0x01, 0x28, 0x17, 0xd0, + 0xa2, 0x28, 0x06, 0xd0, 0xa3, 0x28, 0x03, 0xd1, + 0x01, 0x21, 0x15, 0x20, 0xff, 0xf7, 0x08, 0xfc, + 0xb0, 0xbd, 0x00, 0x29, 0x01, 0xd1, 0x17, 0x48, + 0x02, 0xe0, 0x7d, 0x20, 0xc0, 0x00, 0x48, 0x43, + 0x00, 0x23, 0x01, 0x22, 0x01, 0x1c, 0x28, 0x60, + 0x15, 0x20, 0xff, 0xf7, 0xa7, 0xfc, 0xb0, 0xbd, + 0x01, 0x29, 0x04, 0xd0, 0x3c, 0x00, 0x48, 0x3e, + 0x01, 0x00, 0x02, 0x29, 0xfa, 0xd1, 0x00, 0xf0, + 0x2a, 0xf8, 0xb0, 0xbd, 0x6c, 0x68, 0xf5, 0xf7, + 0xde, 0xfc, 0xfe, 0xf7, 0xa8, 0xff, 0x68, 0x60, + 0x00, 0x2c, 0x09, 0xd0, 0x29, 0x68, 0x0a, 0x23, + 0x59, 0x43, 0x00, 0x1b, 0x88, 0x42, 0x03, 0xd9, + 0x01, 0x21, 0x15, 0x20, 0xed, 0xf7, 0x17, 0xfa, + 0x01, 0x22, 0x15, 0x20, 0x29, 0x68, 0xff, 0xf7, + 0xa6, 0xfb, 0xb0, 0xbd, 0x00, 0x00, 0x3c, 0x00, + 0x84, 0x3e, 0x01, 0x00, 0x04, 0x79, 0x01, 0x00, + 0x00, 0x87, 0x93, 0x03, 0x01, 0x20, 0x04, 0x49, + 0x40, 0x03, 0x80, 0xb5, 0x08, 0x60, 0x03, 0x21, + 0x15, 0x20, 0xed, 0xf7, 0x03, 0xfa, 0x80, 0xbd, + 0x00, 0x10, 0x07, 0x00, 0x07, 0x48, 0x80, 0xb5, + 0xbe, 0x21, 0x01, 0x73, 0x01, 0x7a, 0x10, 0x22, + 0x11, 0x43, 0x01, 0x72, 0x00, 0x23, 0x02, 0x22, + 0x15, 0x20, 0x03, 0x49, 0xff, 0xf7, 0x68, 0xfc, + 0x3c, 0x00, 0xc0, 0x3e, 0x01, 0x00, 0x80, 0xbd, + 0x00, 0x00, 0x00, 0x03, 0x07, 0x00, 0x80, 0x9f, + 0xd5, 0x00, 0x80, 0xb5, 0x00, 0x28, 0x03, 0xd0, + 0x0a, 0x1c, 0x15, 0x21, 0xa2, 0x20, 0x02, 0xe0, + 0x00, 0x22, 0x15, 0x21, 0xa3, 0x20, 0xff, 0xf7, + 0x66, 0xfc, 0x80, 0xbd, 0x00, 0x00, 0x10, 0xb5, + 0x00, 0xf0, 0x19, 0xf8, 0x0a, 0x48, 0xbe, 0x21, + 0x01, 0x73, 0x03, 0x7a, 0x10, 0x22, 0x93, 0x43, + 0x01, 0x24, 0x3c, 0x00, 0xfc, 0x3e, 0x01, 0x00, + 0x23, 0x43, 0x03, 0x72, 0x01, 0x73, 0x01, 0x7a, + 0x91, 0x43, 0x20, 0x22, 0x11, 0x43, 0x01, 0x72, + 0x02, 0x22, 0x15, 0x20, 0x02, 0x49, 0xff, 0xf7, + 0x5b, 0xfb, 0x10, 0xbd, 0x00, 0x03, 0x07, 0x00, + 0x80, 0x9f, 0xd5, 0x00, 0x80, 0xb5, 0x02, 0x21, + 0x15, 0x20, 0xff, 0xf7, 0x85, 0xfb, 0x04, 0x48, + 0xbe, 0x21, 0x01, 0x73, 0x01, 0x7a, 0x11, 0x22, + 0x91, 0x43, 0x01, 0x72, 0x3c, 0x00, 0x38, 0x3f, + 0x01, 0x00, 0x80, 0xbd, 0x00, 0x00, 0x00, 0x03, + 0x07, 0x00, 0xf8, 0xb5, 0x06, 0x1c, 0x05, 0x1c, + 0x60, 0x36, 0x00, 0x27, 0x44, 0x68, 0x22, 0xe0, + 0x08, 0x21, 0x00, 0x20, 0xed, 0xf7, 0x41, 0xfb, + 0x60, 0x61, 0x01, 0x89, 0x04, 0x39, 0x09, 0x04, + 0x09, 0x0c, 0x01, 0x81, 0x60, 0x69, 0x00, 0x68, + 0x40, 0x18, 0x04, 0x21, 0xed, 0xf7, 0x35, 0xfb, + 0xe0, 0x61, 0x60, 0x69, 0x71, 0x7b, 0x3c, 0x00, + 0x74, 0x3f, 0x01, 0x00, 0x00, 0x68, 0x89, 0x01, + 0xc1, 0x70, 0x29, 0x69, 0x0c, 0x31, 0x03, 0x22, + 0xec, 0xf7, 0xba, 0xfa, 0x28, 0x69, 0x0c, 0x30, + 0x01, 0x68, 0x01, 0x31, 0x01, 0x60, 0x25, 0x62, + 0xa7, 0x61, 0x24, 0x68, 0x00, 0x2c, 0xda, 0xd1, + 0x02, 0x49, 0x03, 0x48, 0x6a, 0x68, 0xf6, 0xf7, + 0xb3, 0xf8, 0xf8, 0xbd, 0xfd, 0x6b, 0x00, 0x00, + 0xa0, 0x6a, 0x01, 0x00, 0x80, 0xb5, 0x00, 0x07, + 0x3c, 0x00, 0xb0, 0x3f, 0x01, 0x00, 0x00, 0x09, + 0x09, 0x02, 0x09, 0x0a, 0x08, 0x43, 0x02, 0x49, + 0x08, 0x60, 0xff, 0xf7, 0x20, 0xff, 0x80, 0xbd, + 0x00, 0x00, 0x60, 0x00, 0x07, 0x00, 0x08, 0x00, + 0x14, 0x00, 0xc8, 0x00, 0x00, 0x00, 0xe8, 0x03, + 0x00, 0x00, 0x10, 0x00, 0x14, 0x00, 0xc8, 0x00, + 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, 0x1c, 0x00, + 0x14, 0x00, 0xc8, 0x00, 0x00, 0x00, 0xe8, 0x03, + 0x00, 0x00, 0x3c, 0x00, 0xec, 0x3f, 0x01, 0x00, + 0x24, 0x01, 0x07, 0x00, 0x32, 0x00, 0x00, 0x00, + 0xe8, 0x03, 0x00, 0x00, 0x40, 0x06, 0x01, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x41, 0x6e, 0x62, 0x69, 0x7e, 0x64, 0x61, 0x6f, + 0x6f, 0x00, 0x00, 0x00, 0x52, 0x65, 0x6c, 0x65, + 0x61, 0x73, 0x65, 0x20, 0x36, 0x5f, 0x37, 0x5f, + 0x31, 0x35, 0x20, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x20, 0x32, 0x3a, 0x35, 0x3c, 0x00, 0x28, 0x40, + 0x01, 0x00, 0x32, 0x39, 0x38, 0x20, 0x53, 0x65, + 0x70, 0x20, 0x30, 0x34, 0x20, 0x32, 0x30, 0x30, + 0x39, 0x20, 0x31, 0x37, 0x3a, 0x31, 0x33, 0x3a, + 0x32, 0x30, 0x20, 0x28, 0x48, 0x57, 0x3d, 0x34, + 0x3a, 0x33, 0x2c, 0x42, 0x54, 0x43, 0x4f, 0x45, + 0x58, 0x29, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, + 0x1c, 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3c, 0x00, + 0x64, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe8, 0x03, 0x70, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0xd0, 0x07, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x7c, 0x15, 0x15, 0x00, + 0x3c, 0x00, 0xa0, 0x40, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x70, 0x17, + 0x1e, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, + 0x00, 0x00, 0x28, 0x23, 0x16, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xf8, 0x2a, + 0x0b, 0x00, 0x3c, 0x00, 0xdc, 0x40, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, + 0xe0, 0x2e, 0x12, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x50, 0x46, 0x0e, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0xf0, 0x55, 0x08, 0x00, 0x3c, 0x00, 0x18, 0x41, + 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2c, 0x00, + 0x00, 0x00, 0xc0, 0x5d, 0x0e, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xe8, 0x80, + 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x42, 0x00, + 0x00, 0x00, 0xa0, 0x8c, 0x0a, 0x00, 0x3c, 0x00, + 0x54, 0x41, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x00, 0x00, 0x00, 0x80, 0xbb, 0x0a, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, + 0xf0, 0xd2, 0x0a, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6c, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x90, 0x00, + 0x3c, 0x00, 0x90, 0x41, 0x01, 0x00, 0xc0, 0x00, + 0x90, 0x00, 0xc0, 0x00, 0x90, 0x00, 0x14, 0x00, + 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0xc0, 0x00, + 0x90, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, + 0x10, 0x00, 0xc0, 0x00, 0x90, 0x00, 0x14, 0x00, + 0x10, 0x00, 0xc0, 0x00, 0x90, 0x00, 0x14, 0x00, + 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, + 0x10, 0x00, 0xc0, 0x00, 0x90, 0x00, 0x60, 0x00, + 0x48, 0x00, 0x3c, 0x00, 0xcc, 0x41, 0x01, 0x00, + 0x60, 0x00, 0x48, 0x00, 0x14, 0x00, 0x10, 0x00, + 0x14, 0x00, 0x10, 0x00, 0x60, 0x00, 0x48, 0x00, + 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, + 0x60, 0x00, 0x48, 0x00, 0x14, 0x00, 0x10, 0x00, + 0x60, 0x00, 0x48, 0x00, 0x14, 0x00, 0x10, 0x00, + 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x10, 0x00, + 0x02, 0x00, 0x04, 0x01, 0x0b, 0x02, 0x0c, 0x03, + 0x12, 0x04, 0x16, 0x05, 0x3c, 0x00, 0x08, 0x42, + 0x01, 0x00, 0x18, 0x06, 0x00, 0x0e, 0x00, 0x0e, + 0x24, 0x07, 0x00, 0x0e, 0x2c, 0x08, 0x30, 0x09, + 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x42, 0x0a, + 0x00, 0x0e, 0x48, 0x0b, 0x00, 0x0e, 0x00, 0x0e, + 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x60, 0x0c, + 0x00, 0x0e, 0x00, 0x0e, 0x6c, 0x0d, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0xc0, 0xff, 0xff, 0xff, 0x3c, 0x00, + 0x44, 0x42, 0x01, 0x00, 0xb6, 0xff, 0xff, 0xff, + 0xd3, 0xff, 0xff, 0xff, 0xc9, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x51, 0xb0, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x51, 0xb0, 0x00, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x59, 0xaf, 0x00, 0x00, + 0x3c, 0x00, 0x80, 0x42, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xa5, 0xaf, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x4d, 0xaf, 0x00, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x45, 0xb0, 0x00, 0x00, 0x06, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xd5, 0xaf, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xad, 0xb0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xbc, 0x42, 0x01, 0x00, + 0x95, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x95, 0xdb, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x99, 0xb0, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0x42, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x17, + 0x01, 0x00, 0x35, 0x17, 0x01, 0x00, 0x21, 0x17, + 0x01, 0x00, 0xd9, 0x9c, 0x00, 0x00, 0x49, 0x17, + 0x01, 0x00, 0x3d, 0x17, 0x01, 0x00, 0xd1, 0x9c, + 0x00, 0x00, 0xd1, 0x9c, 0x00, 0x00, 0x1d, 0x1a, + 0x01, 0x00, 0xd1, 0x9c, 0x00, 0x00, 0x01, 0x1a, + 0x01, 0x00, 0x31, 0x1a, 0x01, 0x00, 0x25, 0x1a, + 0x01, 0x00, 0x3d, 0x17, 0x01, 0x00, 0x3c, 0x00, + 0x34, 0x43, 0x01, 0x00, 0x81, 0x1a, 0x01, 0x00, + 0xd1, 0x9c, 0x00, 0x00, 0x79, 0x17, 0x01, 0x00, + 0xd9, 0x9c, 0x00, 0x00, 0x5d, 0x17, 0x01, 0x00, + 0xa1, 0x17, 0x01, 0x00, 0x95, 0x17, 0x01, 0x00, + 0x81, 0x17, 0x01, 0x00, 0x21, 0x18, 0x01, 0x00, + 0xf5, 0x17, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x0c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x70, 0x43, 0x01, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x19, 0x1c, + 0x01, 0x00, 0x89, 0x41, 0x00, 0x00, 0x89, 0x41, + 0x00, 0x00, 0x85, 0x41, 0x00, 0x00, 0x85, 0x41, + 0x00, 0x00, 0x85, 0x41, 0x00, 0x00, 0x85, 0x41, + 0x00, 0x00, 0x89, 0x41, 0x00, 0x00, 0x85, 0x41, + 0x00, 0x00, 0x85, 0x41, 0x00, 0x00, 0x35, 0x1b, + 0x01, 0x00, 0x3c, 0x00, 0xac, 0x43, 0x01, 0x00, + 0x9d, 0x1b, 0x01, 0x00, 0x01, 0x1c, 0x01, 0x00, + 0x89, 0x41, 0x00, 0x00, 0x89, 0x41, 0x00, 0x00, + 0x89, 0x41, 0x00, 0x00, 0x85, 0x41, 0x00, 0x00, + 0x65, 0x18, 0x01, 0x00, 0x29, 0x18, 0x01, 0x00, + 0x39, 0x18, 0x01, 0x00, 0xbd, 0x18, 0x01, 0x00, + 0x89, 0x41, 0x00, 0x00, 0x4d, 0x18, 0x01, 0x00, + 0xa5, 0x18, 0x01, 0x00, 0x85, 0x41, 0x00, 0x00, + 0x01, 0x19, 0x01, 0x00, 0x3c, 0x00, 0xe8, 0x43, + 0x01, 0x00, 0xd9, 0x18, 0x01, 0x00, 0xed, 0x18, + 0x01, 0x00, 0x15, 0x19, 0x01, 0x00, 0x89, 0x41, + 0x00, 0x00, 0x89, 0x41, 0x00, 0x00, 0x89, 0x41, + 0x00, 0x00, 0x85, 0x41, 0x00, 0x00, 0x89, 0x41, + 0x00, 0x00, 0x89, 0x41, 0x00, 0x00, 0x69, 0x1c, + 0x01, 0x00, 0x89, 0x41, 0x00, 0x00, 0x71, 0x1c, + 0x01, 0x00, 0x89, 0x41, 0x00, 0x00, 0x89, 0x41, + 0x00, 0x00, 0xfd, 0xdb, 0x00, 0x00, 0x3c, 0x00, + 0x24, 0x44, 0x01, 0x00, 0x1d, 0x7c, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x00, 0xf5, 0xda, 0x00, 0x00, + 0x14, 0x00, 0x81, 0x00, 0xfd, 0xdd, 0x00, 0x00, + 0x08, 0x00, 0x82, 0x00, 0xc5, 0xdd, 0x00, 0x00, + 0x38, 0x00, 0x83, 0x00, 0x45, 0xdc, 0x00, 0x00, + 0x10, 0x00, 0x84, 0x00, 0x99, 0xdc, 0x00, 0x00, + 0x0c, 0x00, 0x86, 0x00, 0x39, 0xdc, 0x00, 0x00, + 0x10, 0x00, 0x88, 0x00, 0x11, 0xde, 0x00, 0x00, + 0x3c, 0x00, 0x60, 0x44, 0x01, 0x00, 0x10, 0x00, + 0x8a, 0x00, 0x35, 0xdd, 0x00, 0x00, 0x0c, 0x00, + 0x8c, 0x00, 0xad, 0xdf, 0x00, 0x00, 0x1c, 0x00, + 0x8e, 0x00, 0xc9, 0xde, 0x00, 0x00, 0x38, 0x00, + 0x8f, 0x00, 0xed, 0xdc, 0x00, 0x00, 0x38, 0x00, + 0x90, 0x00, 0x75, 0xdf, 0x00, 0x00, 0x0c, 0x00, + 0x91, 0x00, 0x8d, 0xdc, 0x00, 0x00, 0x0c, 0x00, + 0x93, 0x00, 0xb9, 0xdd, 0x00, 0x00, 0x0c, 0x00, + 0x94, 0x00, 0x3c, 0x00, 0x9c, 0x44, 0x01, 0x00, + 0x00, 0x08, 0x08, 0x08, 0x10, 0x0c, 0x0c, 0x0c, + 0x08, 0x0c, 0x08, 0x0c, 0x08, 0x0c, 0x08, 0x08, + 0x08, 0x08, 0x14, 0x08, 0x08, 0x14, 0x00, 0x30, + 0x00, 0x01, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, + 0xad, 0x30, 0x01, 0x00, 0x15, 0x30, 0x01, 0x00, + 0x20, 0x30, 0x07, 0x00, 0x30, 0x30, 0x07, 0x00, + 0x06, 0x07, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0x44, + 0x01, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0xc9, 0x02, 0x00, 0x94, 0x3f, + 0x03, 0x00, 0xe0, 0x8b, 0x5a, 0x00, 0x05, 0x3a, + 0x85, 0x00, 0xc8, 0xf2, 0x06, 0x00, 0xf8, 0x4c, + 0x56, 0x00, 0x20, 0xa7, 0x3d, 0x00, 0xb7, 0x4a, + 0x00, 0x00, 0xb7, 0x4a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x14, 0x45, 0x01, 0x00, 0x01, 0x01, 0x01, 0x02, + 0x02, 0x02, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, + 0x05, 0x06, 0x00, 0x00, 0x2d, 0x7c, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x00, 0xfd, 0x95, 0x00, 0x00, + 0x08, 0x00, 0xff, 0x00, 0xed, 0x97, 0x00, 0x00, + 0x08, 0x00, 0x82, 0x00, 0xcd, 0x95, 0x00, 0x00, + 0x0c, 0x00, 0x83, 0x00, 0x4d, 0x96, 0x00, 0x00, + 0x0c, 0x00, 0x85, 0x00, 0x2d, 0x7c, 0x00, 0x00, + 0x3c, 0x00, 0x50, 0x45, 0x01, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x2d, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x2d, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x3d, 0x96, 0x00, 0x00, 0x0c, 0x00, + 0x89, 0x00, 0xd9, 0x97, 0x00, 0x00, 0x08, 0x00, + 0x8a, 0x00, 0x91, 0x95, 0x00, 0x00, 0x08, 0x00, + 0xff, 0x00, 0x2d, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x2d, 0x7c, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x00, 0x3c, 0x00, 0x8c, 0x45, 0x01, 0x00, + 0xf9, 0x97, 0x00, 0x00, 0x08, 0x00, 0x8d, 0x00, + 0x2d, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x2d, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, + 0xc9, 0x97, 0x00, 0x00, 0x30, 0x00, 0x90, 0x00, + 0x11, 0x95, 0x00, 0x00, 0x18, 0x00, 0x91, 0x00, + 0x15, 0x96, 0x00, 0x00, 0x08, 0x00, 0x92, 0x00, + 0x59, 0x95, 0x00, 0x00, 0x3c, 0x00, 0x93, 0x00, + 0x29, 0x96, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0x45, + 0x01, 0x00, 0x08, 0x00, 0x94, 0x00, 0xa1, 0x95, + 0x00, 0x00, 0x08, 0x00, 0x95, 0x00, 0x81, 0x97, + 0x00, 0x00, 0x0c, 0x00, 0x96, 0x00, 0x6d, 0x97, + 0x00, 0x00, 0x10, 0x00, 0x98, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x10, + 0x08, 0x00, 0x00, 0x08, 0x00, 0x10, 0x3c, 0x00, + 0x04, 0x46, 0x01, 0x00, 0x08, 0x0c, 0x0c, 0x0c, + 0x0c, 0x1c, 0x0c, 0x0c, 0x08, 0x00, 0x00, 0x00, + 0x0d, 0x8b, 0x00, 0x00, 0xf5, 0x8a, 0x00, 0x00, + 0xe9, 0x8a, 0x00, 0x00, 0x01, 0x8b, 0x00, 0x00, + 0x14, 0x08, 0x0c, 0x0c, 0x10, 0x0c, 0x00, 0x00, + 0xb1, 0x98, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x19, 0x99, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, + 0x3d, 0x7c, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x40, 0x46, 0x01, 0x00, 0x3d, 0x99, + 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x09, 0x99, + 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x3d, 0x7c, + 0x00, 0x00, 0x85, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x01, + 0x04, 0x04, 0x08, 0x08, 0x81, 0x37, 0x80, 0xf3, + 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00, 0xaa, 0xaa, + 0x03, 0x00, 0x00, 0xf8, 0x6d, 0xa9, 0x6d, 0xa9, + 0x6e, 0xa9, 0x3c, 0x00, 0x7c, 0x46, 0x01, 0x00, + 0x6e, 0xa8, 0x6e, 0xa8, 0x6e, 0xa8, 0x6f, 0xa7, + 0x6f, 0xa7, 0x6f, 0xa7, 0x6f, 0xa6, 0x6f, 0xa6, + 0x70, 0xa6, 0x70, 0xa5, 0x70, 0xa4, 0x00, 0x00, + 0xb5, 0x1b, 0x01, 0x00, 0xc9, 0x1b, 0x01, 0x00, + 0xe1, 0x1b, 0x01, 0x00, 0xe5, 0x9c, 0x00, 0x00, + 0xa5, 0x1b, 0x01, 0x00, 0xe5, 0x9c, 0x00, 0x00, + 0x89, 0x1b, 0x01, 0x00, 0xd5, 0x9c, 0x00, 0x00, + 0xd5, 0x9c, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0x46, + 0x01, 0x00, 0xd1, 0x1a, 0x01, 0x00, 0xe5, 0x1a, + 0x01, 0x00, 0x05, 0x1b, 0x01, 0x00, 0x25, 0x1b, + 0x01, 0x00, 0xb1, 0x1a, 0x01, 0x00, 0xe5, 0x9c, + 0x00, 0x00, 0x9d, 0x1a, 0x01, 0x00, 0xd5, 0x9c, + 0x00, 0x00, 0xc1, 0x1a, 0x01, 0x00, 0x89, 0x19, + 0x01, 0x00, 0xa9, 0x19, 0x01, 0x00, 0xc9, 0x19, + 0x01, 0x00, 0xf1, 0x19, 0x01, 0x00, 0x79, 0x19, + 0x01, 0x00, 0xe5, 0x9c, 0x00, 0x00, 0x3c, 0x00, + 0xf4, 0x46, 0x01, 0x00, 0x65, 0x19, 0x01, 0x00, + 0xd5, 0x9c, 0x00, 0x00, 0xd5, 0x9c, 0x00, 0x00, + 0xd5, 0x9c, 0x00, 0x00, 0xd5, 0x9c, 0x00, 0x00, + 0xd5, 0x9c, 0x00, 0x00, 0xd5, 0x9c, 0x00, 0x00, + 0xd5, 0x9c, 0x00, 0x00, 0x55, 0x1c, 0x01, 0x00, + 0x45, 0x1c, 0x01, 0x00, 0x45, 0x1c, 0x01, 0x00, + 0xd5, 0x9c, 0x00, 0x00, 0xd5, 0x9c, 0x00, 0x00, + 0xd5, 0x9c, 0x00, 0x00, 0xd5, 0x9c, 0x00, 0x00, + 0x3c, 0x00, 0x30, 0x47, 0x01, 0x00, 0xd5, 0x9c, + 0x00, 0x00, 0x55, 0x19, 0x01, 0x00, 0xe5, 0x9c, + 0x00, 0x00, 0x41, 0x19, 0x01, 0x00, 0x31, 0x19, + 0x01, 0x00, 0xd5, 0x9c, 0x00, 0x00, 0x02, 0x05, + 0x0a, 0x00, 0x00, 0x00, 0x02, 0x04, 0x0a, 0x00, + 0x00, 0x00, 0xc5, 0x20, 0x00, 0x00, 0x21, 0x21, + 0x00, 0x00, 0x25, 0x21, 0x00, 0x00, 0x39, 0x21, + 0x00, 0x00, 0x49, 0x21, 0x00, 0x00, 0x55, 0x21, + 0x00, 0x00, 0x3c, 0x00, 0x6c, 0x47, 0x01, 0x00, + 0x61, 0x21, 0x00, 0x00, 0xed, 0x21, 0x00, 0x00, + 0x0d, 0x22, 0x00, 0x00, 0x21, 0x22, 0x00, 0x00, + 0x3d, 0x22, 0x00, 0x00, 0x49, 0x22, 0x00, 0x00, + 0xc5, 0x22, 0x00, 0x00, 0xe1, 0x22, 0x00, 0x00, + 0xf5, 0x22, 0x00, 0x00, 0xe9, 0x1f, 0x00, 0x00, + 0xe9, 0x1f, 0x00, 0x00, 0xe9, 0x1f, 0x00, 0x00, + 0xe9, 0x1f, 0x00, 0x00, 0xe9, 0x1f, 0x00, 0x00, + 0x11, 0x23, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0x47, + 0x01, 0x00, 0x1d, 0x23, 0x00, 0x00, 0x89, 0x23, + 0x00, 0x00, 0xa5, 0x23, 0x00, 0x00, 0xb9, 0x23, + 0x00, 0x00, 0x11, 0x20, 0x00, 0x00, 0x1d, 0x20, + 0x00, 0x00, 0x6d, 0x20, 0x00, 0x00, 0x8d, 0x20, + 0x00, 0x00, 0xb9, 0x20, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x03, 0x03, 0x05, 0x06, 0x06, 0x08, 0x09, + 0x08, 0x09, 0x09, 0x09, 0xc4, 0x80, 0xca, 0x80, + 0x80, 0x80, 0x80, 0x80, 0xd0, 0x80, 0x3c, 0x00, + 0xe4, 0x47, 0x01, 0x00, 0xd6, 0xd9, 0xdc, 0xdf, + 0xe2, 0x80, 0x80, 0x80, 0xe5, 0xe8, 0x80, 0x80, + 0x80, 0x80, 0xeb, 0xee, 0xf1, 0xf4, 0xf7, 0xfa, + 0xfd, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, + 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, + 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, + 0x0c, 0x00, 0x0e, 0x00, 0x10, 0x00, 0x11, 0x00, + 0x13, 0x00, 0x16, 0x00, 0x18, 0x00, 0x1b, 0x00, + 0x3c, 0x00, 0x20, 0x48, 0x01, 0x00, 0x1e, 0x00, + 0x22, 0x00, 0x26, 0x00, 0x2b, 0x00, 0x30, 0x00, + 0x36, 0x00, 0x3c, 0x00, 0x44, 0x00, 0x4c, 0x00, + 0x55, 0x00, 0x5f, 0x00, 0x6b, 0x00, 0x78, 0x00, + 0x86, 0x00, 0x97, 0x00, 0xa9, 0x00, 0xbe, 0x00, + 0xd5, 0x00, 0xef, 0x00, 0xff, 0x7f, 0x0c, 0x00, + 0x06, 0x00, 0x02, 0x00, 0x00, 0x00, 0xfe, 0xff, + 0xfc, 0xff, 0xfb, 0xff, 0xfa, 0xff, 0xf9, 0xff, + 0xf8, 0xff, 0x3c, 0x00, 0x5c, 0x48, 0x01, 0x00, + 0xf7, 0xff, 0xf6, 0xff, 0xf5, 0xff, 0xf4, 0xff, + 0xf3, 0xff, 0xf2, 0xff, 0xf1, 0xff, 0xf0, 0xff, + 0xef, 0xff, 0xee, 0xff, 0xed, 0xff, 0xec, 0xff, + 0xeb, 0xff, 0xea, 0xff, 0xe9, 0xff, 0xe8, 0xff, + 0xe7, 0xff, 0xe6, 0xff, 0xe5, 0xff, 0xe4, 0xff, + 0xe3, 0xff, 0xe2, 0xff, 0xe1, 0xff, 0xe0, 0xff, + 0xdf, 0xff, 0xde, 0xff, 0xdd, 0xff, 0xdc, 0xff, + 0xdc, 0xff, 0x00, 0x00, 0x3c, 0x00, 0x98, 0x48, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xb1, 0x7c, 0x41, 0x00, 0x11, 0x5a, + 0x40, 0xe2, 0xb2, 0x7c, 0x41, 0x00, 0x05, 0x5a, + 0x40, 0xe2, 0xaf, 0x7c, 0x41, 0x00, 0xf9, 0x59, + 0x40, 0xe2, 0xb0, 0x7c, 0x41, 0x00, 0xed, 0x59, + 0x40, 0xe2, 0x24, 0x67, 0x01, 0x00, 0x0e, 0x00, + 0x00, 0xe3, 0x5c, 0x67, 0x01, 0x00, 0x0e, 0x00, + 0x00, 0xe3, 0x0a, 0x61, 0x01, 0x00, 0x3c, 0x00, + 0xd4, 0x48, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, + 0x0e, 0x61, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, + 0x32, 0x67, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, + 0x6a, 0x67, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, + 0x0b, 0x61, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, + 0x0f, 0x61, 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, + 0x40, 0x67, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, + 0x78, 0x67, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, + 0x3c, 0x00, 0x10, 0x49, 0x01, 0x00, 0x0c, 0x61, + 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, 0x10, 0x61, + 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, 0x4e, 0x67, + 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0x86, 0x67, + 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0x0d, 0x61, + 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, 0x11, 0x61, + 0x01, 0x00, 0x01, 0x00, 0x00, 0xe3, 0xc0, 0x48, + 0x01, 0x00, 0x04, 0x00, 0x00, 0x0a, 0xe0, 0x48, + 0x01, 0x00, 0x3c, 0x00, 0x4c, 0x49, 0x01, 0x00, + 0x04, 0x00, 0x00, 0x0a, 0x00, 0x49, 0x01, 0x00, + 0x04, 0x00, 0x00, 0x0a, 0x20, 0x49, 0x01, 0x00, + 0x04, 0x00, 0x00, 0x0a, 0x18, 0x67, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x28, 0x75, 0x01, 0x01, + 0x7d, 0xa9, 0x40, 0xe2, 0x2c, 0x75, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x20, 0x75, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x44, 0x75, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x3c, 0x00, 0x88, 0x49, + 0x01, 0x00, 0xf0, 0x59, 0x01, 0x00, 0x04, 0x00, + 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x24, 0x75, 0x01, 0x00, 0x04, 0x00, + 0x00, 0xe2, 0xb8, 0x7c, 0x01, 0x00, 0x04, 0x00, + 0x00, 0xe2, 0x8d, 0xa9, 0x00, 0x00, 0x01, 0x00, + 0x00, 0xda, 0x1d, 0x75, 0x01, 0x00, 0x01, 0x00, + 0x00, 0xe2, 0xc4, 0x67, 0x01, 0x00, 0x3c, 0x00, + 0xc4, 0x49, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x21, 0x59, 0x00, 0x00, 0x0e, 0x00, 0x00, 0xd9, + 0xc8, 0x67, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0xcc, 0x67, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0xd0, 0x67, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0x65, 0xd9, 0x00, 0x00, 0x04, 0x00, 0x00, 0xda, + 0xa5, 0xd9, 0x00, 0x00, 0x04, 0x00, 0x00, 0xda, + 0x3c, 0x00, 0x00, 0x4a, 0x01, 0x00, 0x01, 0x59, + 0x00, 0x00, 0x01, 0x00, 0x00, 0xda, 0x32, 0x67, + 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0x6a, 0x67, + 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, 0x11, 0x59, + 0x00, 0x00, 0x01, 0x00, 0x00, 0xda, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x48, + 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0xa0, 0x48, + 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x40, 0x49, + 0x01, 0x00, 0x3c, 0x00, 0x3c, 0x4a, 0x01, 0x00, + 0x05, 0x00, 0x00, 0x0a, 0x68, 0x49, 0x01, 0x00, + 0x09, 0x00, 0x00, 0x0a, 0x6c, 0x57, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x38, 0x61, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xac, 0x6e, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0xb0, 0x6e, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x70, 0x57, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x3c, 0x00, 0x78, 0x4a, + 0x01, 0x00, 0xe8, 0x59, 0x01, 0x00, 0x08, 0x00, + 0x00, 0xe3, 0xdc, 0x58, 0x01, 0x14, 0x4d, 0xfd, + 0x40, 0xe3, 0x2c, 0x59, 0x01, 0x14, 0x39, 0xfd, + 0x40, 0xe3, 0xc0, 0x58, 0x01, 0x00, 0x0e, 0x00, + 0x00, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x64, 0x73, 0x41, 0x00, 0x3d, 0x2e, + 0x44, 0xe2, 0x7c, 0x59, 0x01, 0x14, 0x3c, 0x00, + 0xb4, 0x4a, 0x01, 0x00, 0x9d, 0x2f, 0x44, 0xe3, + 0x5c, 0x57, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe2, + 0x79, 0x2e, 0x04, 0x00, 0x01, 0x00, 0x00, 0xdb, + 0xa0, 0x58, 0x01, 0x00, 0x02, 0x00, 0x00, 0xe3, + 0xa2, 0x58, 0x01, 0x00, 0x02, 0x00, 0x00, 0xe3, + 0xa0, 0x57, 0x01, 0x00, 0x0e, 0x00, 0x00, 0xe3, + 0xd1, 0x88, 0x01, 0x00, 0x01, 0x00, 0x00, 0xda, + 0x1d, 0x89, 0x01, 0x00, 0x04, 0x00, 0x00, 0xda, + 0x3c, 0x00, 0xf0, 0x4a, 0x01, 0x00, 0x95, 0x88, + 0x01, 0x00, 0x04, 0x00, 0x00, 0xdb, 0x31, 0x2f, + 0x04, 0x00, 0x0e, 0x00, 0x00, 0xd9, 0xc5, 0x2e, + 0x04, 0x00, 0x0e, 0x00, 0x00, 0xd9, 0x68, 0x6c, + 0x01, 0x01, 0x15, 0xd5, 0x40, 0xe2, 0xc0, 0x57, + 0x01, 0x00, 0x08, 0x00, 0x00, 0xe3, 0xc8, 0x57, + 0x01, 0x00, 0x34, 0x00, 0x00, 0xe3, 0x9c, 0x6c, + 0x01, 0x00, 0x08, 0x00, 0x00, 0xe3, 0xb0, 0x58, + 0x01, 0x03, 0x3c, 0x00, 0x2c, 0x4b, 0x01, 0x00, + 0xe9, 0xd4, 0x40, 0xe2, 0xbc, 0x58, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x9d, 0xa3, 0x00, 0x00, + 0x60, 0x00, 0x00, 0xd9, 0x70, 0x79, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x78, 0x79, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x7c, 0x5a, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x5d, 0x1c, 0x00, 0x00, + 0x11, 0x00, 0x00, 0xd9, 0x24, 0x6e, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x3c, 0x00, 0x68, 0x4b, + 0x01, 0x00, 0x18, 0x58, 0x01, 0x05, 0xd5, 0xd5, + 0x40, 0xe3, 0xfc, 0x57, 0x01, 0x00, 0x14, 0x00, + 0x00, 0xe3, 0x04, 0x8e, 0x01, 0x03, 0xe5, 0xd5, + 0x40, 0xe3, 0x00, 0x5b, 0x01, 0x00, 0x04, 0x00, + 0x00, 0xe2, 0x18, 0x5b, 0x01, 0x00, 0x40, 0x00, + 0x00, 0xe2, 0xd4, 0x67, 0x01, 0x00, 0x04, 0x00, + 0x00, 0xe2, 0x8d, 0x37, 0x00, 0x00, 0x04, 0x00, + 0x00, 0xdb, 0xbd, 0x36, 0x00, 0x00, 0x3c, 0x00, + 0xa4, 0x4b, 0x01, 0x00, 0x04, 0x00, 0x00, 0xdb, + 0xfc, 0x60, 0x01, 0x00, 0x02, 0x00, 0x00, 0xe2, + 0x90, 0x7d, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0x70, 0x69, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb0, 0x49, 0x01, 0x00, 0x1a, 0x00, 0x00, 0x0a, + 0x90, 0x4b, 0x01, 0x00, 0x06, 0x00, 0x00, 0x0a, + 0xa4, 0x58, 0x81, 0x00, 0x05, 0xfd, 0x40, 0xe3, + 0x3c, 0x00, 0xe0, 0x4b, 0x01, 0x00, 0x80, 0x4a, + 0x01, 0x00, 0x0c, 0x00, 0x00, 0x0a, 0x0c, 0x5a, + 0x81, 0x01, 0x25, 0x2d, 0x44, 0xe3, 0xe0, 0x4a, + 0x01, 0x00, 0x03, 0x00, 0x00, 0x0a, 0x18, 0x63, + 0x41, 0x00, 0xfd, 0xbb, 0x40, 0xe2, 0x08, 0x57, + 0x01, 0x00, 0x01, 0x00, 0x00, 0xe2, 0x9c, 0x48, + 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x4a, + 0x01, 0x00, 0x3c, 0x00, 0x1c, 0x4c, 0x01, 0x00, + 0x02, 0x00, 0x00, 0x0a, 0xcc, 0x74, 0x01, 0x00, + 0x03, 0x00, 0x00, 0xe3, 0x65, 0x73, 0x41, 0x00, + 0xa9, 0x2e, 0x44, 0xe2, 0xf6, 0x59, 0x01, 0x01, + 0xd1, 0x2c, 0x44, 0xe3, 0x08, 0x4b, 0x01, 0x00, + 0x04, 0x00, 0x00, 0x0a, 0x07, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x6a, 0x28, 0x4b, 0x01, 0x00, + 0x02, 0x00, 0x00, 0x0a, 0x88, 0x7d, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x3c, 0x00, 0x58, 0x4c, + 0x01, 0x00, 0x00, 0x75, 0x01, 0x04, 0x65, 0x6f, + 0x40, 0xe3, 0xbc, 0x78, 0x01, 0x00, 0x0e, 0x00, + 0x00, 0xe3, 0x38, 0x4b, 0x01, 0x00, 0x04, 0x00, + 0x00, 0x0a, 0x04, 0x57, 0x01, 0x00, 0x04, 0x00, + 0x00, 0x62, 0x58, 0x4b, 0x01, 0x00, 0x02, 0x00, + 0x00, 0x0a, 0x80, 0x4b, 0x01, 0x00, 0x02, 0x00, + 0x00, 0x0a, 0x68, 0x4b, 0x01, 0x00, 0x03, 0x00, + 0x00, 0x0a, 0x8c, 0x7d, 0x01, 0x00, 0x3c, 0x00, + 0x94, 0x4c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0x39, 0x2d, 0x04, 0x00, 0x04, 0x00, 0x00, 0xdb, + 0x94, 0x7d, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x40, 0x01, 0x00, 0x00, 0x00, 0x00, 0x64, + 0xa8, 0x4c, 0x01, 0x00, 0x04, 0x00, 0x00, 0x0a, + 0x3c, 0x00, 0xd0, 0x4c, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x4c, + 0x01, 0x00, 0x01, 0x00, 0x00, 0x0a, 0xd0, 0x4c, + 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x7a, + 0x01, 0x00, 0x01, 0x00, 0x00, 0xe2, 0xe8, 0x7a, + 0x01, 0x00, 0x01, 0x00, 0x00, 0xe2, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xed, 0x7a, + 0x01, 0x00, 0x3c, 0x00, 0x0c, 0x4d, 0x01, 0x00, + 0x01, 0x00, 0x00, 0xe2, 0xee, 0x7a, 0x01, 0x00, + 0x01, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf3, 0x7a, 0x01, 0x00, + 0x01, 0x00, 0x00, 0xe2, 0xf4, 0x7a, 0x01, 0x00, + 0x01, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf9, 0x7a, 0x01, 0x00, + 0x01, 0x00, 0x00, 0xe2, 0xfa, 0x7a, 0x01, 0x00, + 0x01, 0x00, 0x00, 0xe2, 0x3c, 0x00, 0x48, 0x4d, + 0x01, 0x00, 0xe8, 0x4c, 0x01, 0x00, 0x03, 0x00, + 0x00, 0x0a, 0x00, 0x4d, 0x01, 0x00, 0x03, 0x00, + 0x00, 0x0a, 0x18, 0x4d, 0x01, 0x00, 0x03, 0x00, + 0x00, 0x0a, 0x30, 0x4d, 0x01, 0x00, 0x03, 0x00, + 0x00, 0x0a, 0x90, 0x5c, 0x01, 0x00, 0x04, 0x00, + 0x00, 0xe2, 0x94, 0x5c, 0x01, 0x00, 0x04, 0x00, + 0x00, 0xe2, 0x98, 0x5c, 0x01, 0x00, 0x04, 0x00, + 0x00, 0xe2, 0x9c, 0x5c, 0x01, 0x00, 0x3c, 0x00, + 0x84, 0x4d, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0xa0, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0xa4, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0xa8, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0xac, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0xb0, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0xb4, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0xb8, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0x3c, 0x00, 0xc0, 0x4d, 0x01, 0x00, 0xbc, 0x5c, + 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xc0, 0x5c, + 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xc4, 0x5c, + 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x90, 0x5c, + 0x01, 0x00, 0x38, 0x00, 0x00, 0xe3, 0x68, 0x4d, + 0x01, 0x00, 0x0e, 0x00, 0x00, 0x0a, 0xd8, 0x4d, + 0x01, 0x00, 0x02, 0x00, 0x00, 0xfa, 0x12, 0x61, + 0x81, 0x01, 0x31, 0xd5, 0x40, 0xe3, 0x06, 0x61, + 0x01, 0x00, 0x3c, 0x00, 0xfc, 0x4d, 0x01, 0x00, + 0x02, 0x00, 0x00, 0xe2, 0x0b, 0x61, 0x01, 0x00, + 0x01, 0x00, 0x00, 0xe3, 0x0f, 0x61, 0x01, 0x00, + 0x01, 0x00, 0x00, 0xe3, 0x08, 0x61, 0x01, 0x00, + 0x02, 0x00, 0x00, 0xe2, 0x50, 0x7b, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x4e, 0x01, 0x00, + 0x0e, 0x00, 0x00, 0x64, 0x9c, 0x57, 0x01, 0x01, + 0x91, 0x88, 0x41, 0xe3, 0x3c, 0x00, 0x38, 0x4e, + 0x01, 0x00, 0x6e, 0x41, 0x67, 0x6f, 0xe2, 0x65, + 0x60, 0x69, 0x6f, 0x20, 0x41, 0x42, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x4d, 0x01, 0x00, 0x09, 0x00, + 0x00, 0x0a, 0x48, 0x4e, 0x01, 0x00, 0x01, 0x00, + 0x00, 0x0a, 0xe8, 0x4d, 0x01, 0x00, 0x01, 0x00, + 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x48, 0x4d, 0x01, 0x00, 0x04, 0x00, + 0x00, 0x0a, 0x28, 0x61, 0x01, 0x01, 0x3c, 0x00, + 0x74, 0x4e, 0x01, 0x00, 0xbd, 0xd5, 0x40, 0xe2, + 0x69, 0x61, 0x41, 0x00, 0x85, 0xd5, 0x40, 0xe2, + 0x30, 0x61, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0x34, 0x61, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0x3c, 0x61, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0x34, 0x61, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0x44, 0x61, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, + 0x3c, 0x00, 0xb0, 0x4e, 0x01, 0x00, 0x70, 0x4e, + 0x01, 0x00, 0x08, 0x00, 0x00, 0x0a, 0x18, 0x61, + 0x01, 0x00, 0x02, 0x00, 0x00, 0xe2, 0x1c, 0x61, + 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0x20, 0x61, + 0x01, 0x00, 0x02, 0x00, 0x00, 0xe2, 0x24, 0x61, + 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, 0xb8, 0x4e, + 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0xc8, 0x4e, + 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0xd8, 0x4e, + 0x01, 0x00, 0x3c, 0x00, 0xec, 0x4e, 0x01, 0x00, + 0x02, 0x00, 0x00, 0x0a, 0x96, 0x48, 0x01, 0x00, + 0x06, 0x00, 0x00, 0xe3, 0xe0, 0x62, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x6a, 0x9b, 0x7d, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x62, 0x9c, 0x7d, 0x01, 0x00, + 0x02, 0x00, 0x00, 0x62, 0x60, 0x7c, 0x01, 0x00, + 0x04, 0x00, 0x00, 0xe2, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x6a, 0x3c, 0x00, 0x28, 0x4f, + 0x01, 0x00, 0x2d, 0x63, 0x01, 0x00, 0x01, 0x00, + 0x00, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x49, 0xd5, 0x00, 0x00, 0x0e, 0x00, + 0x00, 0xd9, 0xf4, 0x67, 0x01, 0x00, 0x02, 0x00, + 0x00, 0x62, 0x46, 0x7d, 0x01, 0x00, 0x01, 0x00, + 0x00, 0x62, 0x9c, 0x7c, 0x01, 0x00, 0x04, 0x00, + 0x00, 0xe2, 0x98, 0x7c, 0x01, 0x00, 0x3c, 0x00, + 0x64, 0x4f, 0x01, 0x00, 0x02, 0x00, 0x00, 0x62, + 0xa0, 0x7c, 0x01, 0x00, 0x06, 0x00, 0x00, 0x62, + 0x58, 0x7c, 0x01, 0x00, 0x02, 0x00, 0x00, 0x62, + 0x64, 0x7c, 0x01, 0x00, 0x06, 0x00, 0x00, 0x62, + 0x5a, 0x7c, 0x01, 0x00, 0x02, 0x00, 0x00, 0x62, + 0x6a, 0x7c, 0x01, 0x00, 0x06, 0x00, 0x00, 0x62, + 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, + 0xe4, 0x62, 0x01, 0x00, 0x04, 0x00, 0x00, 0xe2, + 0x3c, 0x00, 0xa0, 0x4f, 0x01, 0x00, 0xe8, 0x62, + 0x01, 0x00, 0x03, 0x00, 0x00, 0xe2, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xdc, 0x4f, 0x01, 0x00, + 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x6a, 0x3c, 0x00, 0x18, 0x50, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x6a, 0xf0, 0x4e, 0x01, 0x00, 0x2a, 0x00, + 0x00, 0x0a, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, 0x3c, 0x00, + 0x54, 0x50, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, + 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, + 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, + 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, + 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, + 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, + 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, + 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, + 0x3c, 0x00, 0x90, 0x50, 0x01, 0x00, 0x75, 0x2a, + 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x06, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, + 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x07, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, + 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x08, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, + 0x01, 0x00, 0x0c, 0x00, 0x00, 0xdb, 0x09, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xcc, 0x50, 0x01, 0x00, + 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, + 0x0c, 0x00, 0x00, 0xdb, 0x0a, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, + 0x0c, 0x00, 0x00, 0xdb, 0x0b, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, + 0x0c, 0x00, 0x00, 0xdb, 0x0c, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, + 0x0c, 0x00, 0x00, 0xdb, 0x3c, 0x00, 0x08, 0x51, + 0x01, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, + 0x00, 0xdb, 0x0e, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x6a, 0x75, 0x2a, 0x01, 0x00, 0x0c, 0x00, + 0x00, 0xdb, 0x48, 0x50, 0x01, 0x00, 0x02, 0x00, + 0x00, 0x0a, 0x58, 0x50, 0x01, 0x00, 0x02, 0x00, + 0x00, 0x0a, 0x68, 0x50, 0x01, 0x00, 0x02, 0x00, + 0x00, 0x0a, 0x78, 0x50, 0x01, 0x00, 0x3c, 0x00, + 0x44, 0x51, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, + 0x88, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, + 0x98, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, + 0xa8, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, + 0xb8, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, + 0xc8, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, + 0xd8, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, + 0xe8, 0x50, 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, + 0x3c, 0x00, 0x80, 0x51, 0x01, 0x00, 0xf8, 0x50, + 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x08, 0x51, + 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x18, 0x51, + 0x01, 0x00, 0x02, 0x00, 0x00, 0x0a, 0x40, 0x50, + 0x01, 0x00, 0x01, 0x00, 0x00, 0x0a, 0xe8, 0x4e, + 0x01, 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x4e, + 0x01, 0x00, 0x3c, 0x00, 0xbc, 0x51, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x51, 0x01, 0x00, + 0x0e, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0x51, + 0x01, 0x00, 0x98, 0x51, 0x01, 0x00, 0x0c, 0x00, + 0x00, 0x0a, 0x50, 0x4e, 0x01, 0x00, 0x04, 0x00, + 0x00, 0x0a, 0xe0, 0x4c, 0x01, 0x00, 0x01, 0x00, + 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x4b, 0x01, 0x00, 0x1d, 0x00, + 0x00, 0x0a, 0xf8, 0x51, 0x01, 0x00, 0x05, 0x00, + 0x00, 0x0a, 0x24, 0x80, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1d, 0x80, 0x07, 0x00, 0x3c, 0x00, + 0x34, 0x52, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, + 0x2a, 0x80, 0x07, 0x00, 0x5c, 0x00, 0x00, 0x00, + 0x24, 0x80, 0x07, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x1d, 0x80, 0x07, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x2a, 0x80, 0x07, 0x00, 0x6a, 0x00, 0x00, 0x00, + 0x24, 0x80, 0x07, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x1d, 0x80, 0x07, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x2a, 0x80, 0x07, 0x00, 0x6a, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x70, 0x52, 0x01, 0x00, 0x00, 0x01, + 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, + 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, + 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, + 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x01, 0x63, + 0x00, 0x00, 0xa1, 0x63, 0x00, 0x00, 0xc5, 0x63, + 0x00, 0x00, 0xb1, 0x62, 0x00, 0x00, 0xc5, 0x63, + 0x00, 0x00, 0x21, 0x63, 0x00, 0x00, 0x4d, 0x63, + 0x00, 0x00, 0x3c, 0x00, 0xac, 0x52, 0x01, 0x00, + 0xa1, 0x63, 0x00, 0x00, 0x01, 0x63, 0x00, 0x00, + 0xa1, 0x63, 0x00, 0x00, 0x06, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x03, 0x05, 0x06, 0x07, 0x08, 0x09, + 0x0a, 0x0a, 0x0c, 0x0d, 0x0e, 0x0f, 0x0f, 0x10, + 0x11, 0x00, 0x00, 0x00, 0xa5, 0xc6, 0x84, 0xf8, + 0x99, 0xee, 0x8d, 0xf6, 0x0d, 0xff, 0xbd, 0xd6, + 0xb1, 0xde, 0x54, 0x91, 0x3c, 0x00, 0xe8, 0x52, + 0x01, 0x00, 0x50, 0x60, 0x03, 0x02, 0xa9, 0xce, + 0x7d, 0x56, 0x19, 0xe7, 0x62, 0xb5, 0xe6, 0x4d, + 0x9a, 0xec, 0x45, 0x8f, 0x9d, 0x1f, 0x40, 0x89, + 0x87, 0xfa, 0x15, 0xef, 0xeb, 0xb2, 0xc9, 0x8e, + 0x0b, 0xfb, 0xec, 0x41, 0x67, 0xb3, 0xfd, 0x5f, + 0xea, 0x45, 0xbf, 0x23, 0xf7, 0x53, 0x96, 0xe4, + 0x5b, 0x9b, 0xc2, 0x75, 0x1c, 0xe1, 0xae, 0x3d, + 0x6a, 0x4c, 0x5a, 0x6c, 0x41, 0x7e, 0x3c, 0x00, + 0x24, 0x53, 0x01, 0x00, 0x02, 0xf5, 0x4f, 0x83, + 0x5c, 0x68, 0xf4, 0x51, 0x34, 0xd1, 0x08, 0xf9, + 0x93, 0xe2, 0x73, 0xab, 0x53, 0x62, 0x3f, 0x2a, + 0x0c, 0x08, 0x52, 0x95, 0x65, 0x46, 0x5e, 0x9d, + 0x28, 0x30, 0xa1, 0x37, 0x0f, 0x0a, 0xb5, 0x2f, + 0x09, 0x0e, 0x36, 0x24, 0x9b, 0x1b, 0x3d, 0xdf, + 0x26, 0xcd, 0x69, 0x4e, 0xcd, 0x7f, 0x9f, 0xea, + 0x1b, 0x12, 0x9e, 0x1d, 0x74, 0x58, 0x2e, 0x34, + 0x3c, 0x00, 0x60, 0x53, 0x01, 0x00, 0x2d, 0x36, + 0xb2, 0xdc, 0xee, 0xb4, 0xfb, 0x5b, 0xf6, 0xa4, + 0x4d, 0x76, 0x61, 0xb7, 0xce, 0x7d, 0x7b, 0x52, + 0x3e, 0xdd, 0x71, 0x5e, 0x97, 0x13, 0xf5, 0xa6, + 0x68, 0xb9, 0x00, 0x00, 0x2c, 0xc1, 0x60, 0x40, + 0x1f, 0xe3, 0xc8, 0x79, 0xed, 0xb6, 0xbe, 0xd4, + 0x46, 0x8d, 0xd9, 0x67, 0x4b, 0x72, 0xde, 0x94, + 0xd4, 0x98, 0xe8, 0xb0, 0x4a, 0x85, 0x6b, 0xbb, + 0x2a, 0xc5, 0x3c, 0x00, 0x9c, 0x53, 0x01, 0x00, + 0xe5, 0x4f, 0x16, 0xed, 0xc5, 0x86, 0xd7, 0x9a, + 0x55, 0x66, 0x94, 0x11, 0xcf, 0x8a, 0x10, 0xe9, + 0x06, 0x04, 0x81, 0xfe, 0xf0, 0xa0, 0x44, 0x78, + 0xba, 0x25, 0xe3, 0x4b, 0xf3, 0xa2, 0xfe, 0x5d, + 0xc0, 0x80, 0x8a, 0x05, 0xad, 0x3f, 0xbc, 0x21, + 0x48, 0x70, 0x04, 0xf1, 0xdf, 0x63, 0xc1, 0x77, + 0x75, 0xaf, 0x63, 0x42, 0x30, 0x20, 0x1a, 0xe5, + 0x0e, 0xfd, 0x6d, 0xbf, 0x3c, 0x00, 0xd8, 0x53, + 0x01, 0x00, 0x4c, 0x81, 0x14, 0x18, 0x35, 0x26, + 0x2f, 0xc3, 0xe1, 0xbe, 0xa2, 0x35, 0xcc, 0x88, + 0x39, 0x2e, 0x57, 0x93, 0xf2, 0x55, 0x82, 0xfc, + 0x47, 0x7a, 0xac, 0xc8, 0xe7, 0xba, 0x2b, 0x32, + 0x95, 0xe6, 0xa0, 0xc0, 0x98, 0x19, 0xd1, 0x9e, + 0x7f, 0xa3, 0x66, 0x44, 0x7e, 0x54, 0xab, 0x3b, + 0x83, 0x0b, 0xca, 0x8c, 0x29, 0xc7, 0xd3, 0x6b, + 0x3c, 0x28, 0x79, 0xa7, 0xe2, 0xbc, 0x3c, 0x00, + 0x14, 0x54, 0x01, 0x00, 0x1d, 0x16, 0x76, 0xad, + 0x3b, 0xdb, 0x56, 0x64, 0x4e, 0x74, 0x1e, 0x14, + 0xdb, 0x92, 0x0a, 0x0c, 0x6c, 0x48, 0xe4, 0xb8, + 0x5d, 0x9f, 0x6e, 0xbd, 0xef, 0x43, 0xa6, 0xc4, + 0xa8, 0x39, 0xa4, 0x31, 0x37, 0xd3, 0x8b, 0xf2, + 0x32, 0xd5, 0x43, 0x8b, 0x59, 0x6e, 0xb7, 0xda, + 0x8c, 0x01, 0x64, 0xb1, 0xd2, 0x9c, 0xe0, 0x49, + 0xb4, 0xd8, 0xfa, 0xac, 0x07, 0xf3, 0x25, 0xcf, + 0x3c, 0x00, 0x50, 0x54, 0x01, 0x00, 0xaf, 0xca, + 0x8e, 0xf4, 0xe9, 0x47, 0x18, 0x10, 0xd5, 0x6f, + 0x88, 0xf0, 0x6f, 0x4a, 0x72, 0x5c, 0x24, 0x38, + 0xf1, 0x57, 0xc7, 0x73, 0x51, 0x97, 0x23, 0xcb, + 0x7c, 0xa1, 0x9c, 0xe8, 0x21, 0x3e, 0xdd, 0x96, + 0xdc, 0x61, 0x86, 0x0d, 0x85, 0x0f, 0x90, 0xe0, + 0x42, 0x7c, 0xc4, 0x71, 0xaa, 0xcc, 0xd8, 0x90, + 0x05, 0x06, 0x01, 0xf7, 0x12, 0x1c, 0xa3, 0xc2, + 0x5f, 0x6a, 0x3c, 0x00, 0x8c, 0x54, 0x01, 0x00, + 0xf9, 0xae, 0xd0, 0x69, 0x91, 0x17, 0x58, 0x99, + 0x27, 0x3a, 0xb9, 0x27, 0x38, 0xd9, 0x13, 0xeb, + 0xb3, 0x2b, 0x33, 0x22, 0xbb, 0xd2, 0x70, 0xa9, + 0x89, 0x07, 0xa7, 0x33, 0xb6, 0x2d, 0x22, 0x3c, + 0x92, 0x15, 0x20, 0xc9, 0x49, 0x87, 0xff, 0xaa, + 0x78, 0x50, 0x7a, 0xa5, 0x8f, 0x03, 0xf8, 0x59, + 0x80, 0x09, 0x17, 0x1a, 0xda, 0x65, 0x31, 0xd7, + 0xc6, 0x84, 0xb8, 0xd0, 0x3c, 0x00, 0xc8, 0x54, + 0x01, 0x00, 0xc3, 0x82, 0xb0, 0x29, 0x77, 0x5a, + 0x11, 0x1e, 0xcb, 0x7b, 0xfc, 0xa8, 0xd6, 0x6d, + 0x3a, 0x2c, 0xc6, 0xa5, 0xf8, 0x84, 0xee, 0x99, + 0xf6, 0x8d, 0xff, 0x0d, 0xd6, 0xbd, 0xde, 0xb1, + 0x91, 0x54, 0x60, 0x50, 0x02, 0x03, 0xce, 0xa9, + 0x56, 0x7d, 0xe7, 0x19, 0xb5, 0x62, 0x4d, 0xe6, + 0xec, 0x9a, 0x8f, 0x45, 0x1f, 0x9d, 0x89, 0x40, + 0xfa, 0x87, 0xef, 0x15, 0xb2, 0xeb, 0x3c, 0x00, + 0x04, 0x55, 0x01, 0x00, 0x8e, 0xc9, 0xfb, 0x0b, + 0x41, 0xec, 0xb3, 0x67, 0x5f, 0xfd, 0x45, 0xea, + 0x23, 0xbf, 0x53, 0xf7, 0xe4, 0x96, 0x9b, 0x5b, + 0x75, 0xc2, 0xe1, 0x1c, 0x3d, 0xae, 0x4c, 0x6a, + 0x6c, 0x5a, 0x7e, 0x41, 0xf5, 0x02, 0x83, 0x4f, + 0x68, 0x5c, 0x51, 0xf4, 0xd1, 0x34, 0xf9, 0x08, + 0xe2, 0x93, 0xab, 0x73, 0x62, 0x53, 0x2a, 0x3f, + 0x08, 0x0c, 0x95, 0x52, 0x46, 0x65, 0x9d, 0x5e, + 0x3c, 0x00, 0x40, 0x55, 0x01, 0x00, 0x30, 0x28, + 0x37, 0xa1, 0x0a, 0x0f, 0x2f, 0xb5, 0x0e, 0x09, + 0x24, 0x36, 0x1b, 0x9b, 0xdf, 0x3d, 0xcd, 0x26, + 0x4e, 0x69, 0x7f, 0xcd, 0xea, 0x9f, 0x12, 0x1b, + 0x1d, 0x9e, 0x58, 0x74, 0x34, 0x2e, 0x36, 0x2d, + 0xdc, 0xb2, 0xb4, 0xee, 0x5b, 0xfb, 0xa4, 0xf6, + 0x76, 0x4d, 0xb7, 0x61, 0x7d, 0xce, 0x52, 0x7b, + 0xdd, 0x3e, 0x5e, 0x71, 0x13, 0x97, 0xa6, 0xf5, + 0xb9, 0x68, 0x3c, 0x00, 0x7c, 0x55, 0x01, 0x00, + 0x00, 0x00, 0xc1, 0x2c, 0x40, 0x60, 0xe3, 0x1f, + 0x79, 0xc8, 0xb6, 0xed, 0xd4, 0xbe, 0x8d, 0x46, + 0x67, 0xd9, 0x72, 0x4b, 0x94, 0xde, 0x98, 0xd4, + 0xb0, 0xe8, 0x85, 0x4a, 0xbb, 0x6b, 0xc5, 0x2a, + 0x4f, 0xe5, 0xed, 0x16, 0x86, 0xc5, 0x9a, 0xd7, + 0x66, 0x55, 0x11, 0x94, 0x8a, 0xcf, 0xe9, 0x10, + 0x04, 0x06, 0xfe, 0x81, 0xa0, 0xf0, 0x78, 0x44, + 0x25, 0xba, 0x4b, 0xe3, 0x3c, 0x00, 0xb8, 0x55, + 0x01, 0x00, 0xa2, 0xf3, 0x5d, 0xfe, 0x80, 0xc0, + 0x05, 0x8a, 0x3f, 0xad, 0x21, 0xbc, 0x70, 0x48, + 0xf1, 0x04, 0x63, 0xdf, 0x77, 0xc1, 0xaf, 0x75, + 0x42, 0x63, 0x20, 0x30, 0xe5, 0x1a, 0xfd, 0x0e, + 0xbf, 0x6d, 0x81, 0x4c, 0x18, 0x14, 0x26, 0x35, + 0xc3, 0x2f, 0xbe, 0xe1, 0x35, 0xa2, 0x88, 0xcc, + 0x2e, 0x39, 0x93, 0x57, 0x55, 0xf2, 0xfc, 0x82, + 0x7a, 0x47, 0xc8, 0xac, 0xba, 0xe7, 0x3c, 0x00, + 0xf4, 0x55, 0x01, 0x00, 0x32, 0x2b, 0xe6, 0x95, + 0xc0, 0xa0, 0x19, 0x98, 0x9e, 0xd1, 0xa3, 0x7f, + 0x44, 0x66, 0x54, 0x7e, 0x3b, 0xab, 0x0b, 0x83, + 0x8c, 0xca, 0xc7, 0x29, 0x6b, 0xd3, 0x28, 0x3c, + 0xa7, 0x79, 0xbc, 0xe2, 0x16, 0x1d, 0xad, 0x76, + 0xdb, 0x3b, 0x64, 0x56, 0x74, 0x4e, 0x14, 0x1e, + 0x92, 0xdb, 0x0c, 0x0a, 0x48, 0x6c, 0xb8, 0xe4, + 0x9f, 0x5d, 0xbd, 0x6e, 0x43, 0xef, 0xc4, 0xa6, + 0x3c, 0x00, 0x30, 0x56, 0x01, 0x00, 0x39, 0xa8, + 0x31, 0xa4, 0xd3, 0x37, 0xf2, 0x8b, 0xd5, 0x32, + 0x8b, 0x43, 0x6e, 0x59, 0xda, 0xb7, 0x01, 0x8c, + 0xb1, 0x64, 0x9c, 0xd2, 0x49, 0xe0, 0xd8, 0xb4, + 0xac, 0xfa, 0xf3, 0x07, 0xcf, 0x25, 0xca, 0xaf, + 0xf4, 0x8e, 0x47, 0xe9, 0x10, 0x18, 0x6f, 0xd5, + 0xf0, 0x88, 0x4a, 0x6f, 0x5c, 0x72, 0x38, 0x24, + 0x57, 0xf1, 0x73, 0xc7, 0x97, 0x51, 0xcb, 0x23, + 0xa1, 0x7c, 0x3c, 0x00, 0x6c, 0x56, 0x01, 0x00, + 0xe8, 0x9c, 0x3e, 0x21, 0x96, 0xdd, 0x61, 0xdc, + 0x0d, 0x86, 0x0f, 0x85, 0xe0, 0x90, 0x7c, 0x42, + 0x71, 0xc4, 0xcc, 0xaa, 0x90, 0xd8, 0x06, 0x05, + 0xf7, 0x01, 0x1c, 0x12, 0xc2, 0xa3, 0x6a, 0x5f, + 0xae, 0xf9, 0x69, 0xd0, 0x17, 0x91, 0x99, 0x58, + 0x3a, 0x27, 0x27, 0xb9, 0xd9, 0x38, 0xeb, 0x13, + 0x2b, 0xb3, 0x22, 0x33, 0xd2, 0xbb, 0xa9, 0x70, + 0x07, 0x89, 0x33, 0xa7, 0x3c, 0x00, 0xa8, 0x56, + 0x01, 0x00, 0x2d, 0xb6, 0x3c, 0x22, 0x15, 0x92, + 0xc9, 0x20, 0x87, 0x49, 0xaa, 0xff, 0x50, 0x78, + 0xa5, 0x7a, 0x03, 0x8f, 0x59, 0xf8, 0x09, 0x80, + 0x1a, 0x17, 0x65, 0xda, 0xd7, 0x31, 0x84, 0xc6, + 0xd0, 0xb8, 0x82, 0xc3, 0x29, 0xb0, 0x5a, 0x77, + 0x1e, 0x11, 0x7b, 0xcb, 0xa8, 0xfc, 0x6d, 0xd6, + 0x2c, 0x3a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xe4, 0x56, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x01, 0x72, 0x65, 0x71, 0x45, 0x72, 0x72, 0x52, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x20, 0x57, 0x01, 0x00, 0xc4, 0x8e, + 0x01, 0x00, 0x24, 0x9a, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x24, 0x9a, + 0x01, 0x00, 0xa4, 0xb2, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0xa4, 0xb2, + 0x01, 0x00, 0x14, 0xc8, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x10, 0x20, + 0x30, 0x40, 0x50, 0xbb, 0x30, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x5c, 0x57, 0x01, 0x00, + 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e, 0x20, 0x22, + 0x24, 0x26, 0x28, 0x2a, 0x2b, 0x2c, 0x01, 0x00, + 0x70, 0x17, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x0d, 0x25, 0x00, 0x00, 0x41, 0x3f, 0x01, 0x00, + 0x65, 0x29, 0x01, 0x00, 0x0d, 0x25, 0x00, 0x00, + 0xf5, 0x5e, 0x00, 0x00, 0x41, 0x3f, 0x01, 0x00, + 0x41, 0x3f, 0x01, 0x00, 0x02, 0x04, 0x0b, 0x0c, + 0x12, 0x16, 0x18, 0x24, 0x3c, 0x00, 0x98, 0x57, + 0x01, 0x00, 0x30, 0x48, 0x60, 0x6c, 0x01, 0x00, + 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x10, 0x12, 0x11, 0x00, + 0x00, 0x01, 0x18, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xd4, 0x57, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0x93, 0x04, 0x00, + 0x40, 0x42, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0xdf, 0x40, 0xcf, 0xfd, 0x00, 0x40, 0x83, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, + 0x3c, 0x00, 0x10, 0x58, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x80, 0x81, 0x00, 0x00, + 0x80, 0x00, 0xbf, 0xff, 0x7f, 0x7e, 0x01, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x78, 0x6f, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb8, 0x6f, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x6f, + 0x01, 0x00, 0x3c, 0x00, 0x4c, 0x58, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x70, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x78, 0x70, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xb8, 0x70, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf8, 0x70, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x38, 0x71, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x78, 0x71, 0x01, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x90, 0x71, 0x01, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x3c, 0x00, 0x88, 0x58, + 0x01, 0x00, 0xa8, 0x71, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x05, 0x0a, 0x01, 0x06, 0x0b, + 0x02, 0x07, 0x0c, 0x03, 0x08, 0x0d, 0x04, 0x09, + 0x00, 0x00, 0x03, 0x03, 0x01, 0x01, 0x00, 0x04, + 0x00, 0x04, 0x04, 0x06, 0x16, 0x1e, 0x1f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, + 0xc4, 0x58, 0x01, 0x00, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, + 0x61, 0x8b, 0x4a, 0x00, 0x61, 0x8f, 0x4a, 0x00, + 0x61, 0x8b, 0x4a, 0x00, 0x05, 0xe3, 0xc0, 0x00, + 0x05, 0xcb, 0xc0, 0x00, 0x05, 0xbb, 0xc0, 0x00, + 0x85, 0xba, 0xc0, 0x00, 0x85, 0xa2, 0xc0, 0x00, + 0x85, 0x92, 0xc0, 0x00, 0x85, 0x8a, 0xc0, 0x00, + 0x85, 0x7a, 0xc0, 0x00, 0x45, 0x89, 0xc0, 0x00, + 0x3c, 0x00, 0x00, 0x59, 0x01, 0x00, 0x45, 0x71, + 0xc0, 0x00, 0x45, 0x69, 0xc0, 0x00, 0x45, 0x61, + 0xc0, 0x00, 0x45, 0x59, 0xc0, 0x00, 0x45, 0x51, + 0xc0, 0x00, 0x45, 0x49, 0xc0, 0x00, 0x45, 0x41, + 0xc0, 0x00, 0x45, 0x39, 0xc0, 0x00, 0x45, 0x31, + 0xc0, 0x00, 0x45, 0x29, 0xc0, 0x00, 0x45, 0x21, + 0xc0, 0x00, 0x60, 0x2d, 0x06, 0x00, 0x60, 0x2d, + 0x06, 0x00, 0x60, 0x2d, 0x06, 0x00, 0x60, 0x2d, + 0x06, 0x00, 0x3c, 0x00, 0x3c, 0x59, 0x01, 0x00, + 0x60, 0x2d, 0x06, 0x00, 0x60, 0x28, 0x06, 0x00, + 0x50, 0x26, 0x06, 0x00, 0x50, 0x21, 0x06, 0x00, + 0x50, 0x1f, 0x06, 0x00, 0x50, 0x1c, 0x06, 0x00, + 0x50, 0x1a, 0x06, 0x00, 0x50, 0x18, 0x06, 0x00, + 0x50, 0x16, 0x06, 0x00, 0x50, 0x14, 0x06, 0x00, + 0x50, 0x12, 0x06, 0x00, 0x50, 0x10, 0x06, 0x00, + 0x50, 0x0e, 0x06, 0x00, 0x50, 0x0c, 0x06, 0x00, + 0x50, 0x0a, 0x06, 0x00, 0x3c, 0x00, 0x78, 0x59, + 0x01, 0x00, 0x2b, 0x0b, 0x06, 0x00, 0x1d, 0x75, + 0xc0, 0x00, 0x1d, 0x75, 0xc0, 0x00, 0x1d, 0x75, + 0xc0, 0x00, 0x1d, 0x75, 0xc0, 0x00, 0x1d, 0x75, + 0xc0, 0x00, 0x1d, 0x75, 0xc0, 0x00, 0x1d, 0x6d, + 0xc0, 0x00, 0xdd, 0x5b, 0xc0, 0x00, 0xdd, 0x4b, + 0xc0, 0x00, 0xdd, 0x43, 0xc0, 0x00, 0xdd, 0x3b, + 0xc0, 0x00, 0xdd, 0x33, 0xc0, 0x00, 0xdd, 0x2b, + 0xc0, 0x00, 0xdd, 0x23, 0xc0, 0x00, 0x3c, 0x00, + 0xb4, 0x59, 0x01, 0x00, 0xdd, 0x1b, 0xc0, 0x00, + 0xdd, 0x13, 0xc0, 0x00, 0xdd, 0x13, 0xc0, 0x00, + 0xdd, 0x13, 0xc0, 0x00, 0xdd, 0x13, 0xc0, 0x00, + 0xdd, 0x13, 0xc0, 0x00, 0x05, 0x05, 0x05, 0x04, + 0x04, 0x03, 0x03, 0x02, 0x02, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x05, 0x05, 0x05, 0x04, 0x04, 0x03, + 0x03, 0x02, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x88, 0x13, 0x00, 0x00, + 0x3c, 0x00, 0xf0, 0x59, 0x01, 0x00, 0x07, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x5b, 0x00, 0x40, 0x02, + 0xe0, 0xfd, 0xf2, 0x00, 0xb8, 0xfc, 0xa4, 0x01, + 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0f, 0x00, + 0x00, 0x00, 0x03, 0x0b, 0x9f, 0x5f, 0x07, 0x01, + 0x2a, 0x04, 0x21, 0x04, 0x17, 0x04, 0x0e, 0x04, + 0x04, 0x04, 0xfb, 0x03, 0xf1, 0x03, 0xe8, 0x03, + 0xc9, 0x03, 0xaa, 0x03, 0x8a, 0x03, 0x6b, 0x03, + 0x4c, 0x03, 0x3c, 0x00, 0x2c, 0x5a, 0x01, 0x00, + 0x2d, 0x03, 0x0e, 0x03, 0xee, 0x02, 0xec, 0x02, + 0x01, 0x03, 0x16, 0x03, 0x2b, 0x03, 0x40, 0x03, + 0x55, 0x03, 0x6a, 0x03, 0x7f, 0x03, 0x94, 0x03, + 0xa9, 0x03, 0xbe, 0x03, 0xd3, 0x03, 0xe8, 0x03, + 0xbe, 0x03, 0x94, 0x03, 0x6a, 0x03, 0x00, 0x02, + 0x04, 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x00, 0x03, 0x3c, 0x00, 0x68, 0x5a, + 0x01, 0x00, 0x05, 0x08, 0x0b, 0x0e, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, + 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xa4, 0x5a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xe0, 0x5a, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x1c, 0x5b, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0x5b, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x94, 0x5b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xd0, 0x5b, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x0c, 0x5c, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0x5c, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x84, 0x5c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xc0, 0x5c, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xfc, 0x5c, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0x5d, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x74, 0x5d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xb0, 0x5d, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xec, 0x5d, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0x5e, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x64, 0x5e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xa0, 0x5e, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xdc, 0x5e, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0x5f, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x54, 0x5f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x90, 0x5f, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xcc, 0x5f, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0x60, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x44, 0x60, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x80, 0x60, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xbc, 0x60, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0x60, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x34, 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x70, 0x61, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xac, 0x61, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0x61, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x24, 0x62, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x60, 0x62, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x9c, 0x62, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0x62, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x14, 0x63, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x50, 0x63, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x8c, 0x63, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0x63, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x04, 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x40, 0x64, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x7c, 0x64, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0x64, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xf4, 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x30, 0x65, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x6c, 0x65, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0x65, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xe4, 0x65, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x20, 0x66, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x5c, 0x66, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0x66, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xd4, 0x66, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x10, 0x67, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x4c, 0x67, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0x67, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xc4, 0x67, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x68, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x3c, 0x68, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0x68, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xb4, 0x68, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xf0, 0x68, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x2c, 0x69, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0x69, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xa4, 0x69, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xe0, 0x69, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x1c, 0x6a, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0x6a, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x94, 0x6a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xd0, 0x6a, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x0c, 0x6b, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0x6b, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x84, 0x6b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xc0, 0x6b, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xfc, 0x6b, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0x6c, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x74, 0x6c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xb0, 0x6c, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xec, 0x6c, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0x6d, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x64, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xa0, 0x6d, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xdc, 0x6d, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0x6e, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x54, 0x6e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x90, 0x6e, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xcc, 0x6e, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0x6f, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x44, 0x6f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x80, 0x6f, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xbc, 0x6f, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0x6f, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x34, 0x70, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x70, 0x70, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xac, 0x70, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0x70, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x24, 0x71, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x60, 0x71, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x9c, 0x71, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0x71, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x14, 0x72, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x50, 0x72, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x8c, 0x72, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0x72, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x04, 0x73, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x40, 0x73, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x7c, 0x73, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0x73, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xf4, 0x73, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x30, 0x74, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x6c, 0x74, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0x74, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xe4, 0x74, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x20, 0x75, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x5c, 0x75, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0x75, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xd4, 0x75, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x10, 0x76, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x4c, 0x76, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0x76, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xc4, 0x76, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x77, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x3c, 0x77, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0x77, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xb4, 0x77, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xf0, 0x77, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x2c, 0x78, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0x78, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xa4, 0x78, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xe0, 0x78, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x1c, 0x79, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0x79, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x94, 0x79, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xd0, 0x79, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x0c, 0x7a, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0x7a, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x84, 0x7a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xc0, 0x7a, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xfc, 0x7a, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0x7b, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x74, 0x7b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xb0, 0x7b, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xec, 0x7b, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0x7c, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x64, 0x7c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xa0, 0x7c, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xdc, 0x7c, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0x7d, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x54, 0x7d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x90, 0x7d, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xcc, 0x7d, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0x7e, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x44, 0x7e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x80, 0x7e, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xbc, 0x7e, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0x7e, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x34, 0x7f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x70, 0x7f, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xac, 0x7f, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0x7f, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x70, 0xb5, 0x01, 0x25, 0x07, 0x4e, + 0xad, 0x03, 0x75, 0x61, 0x0a, 0x20, 0xfa, 0xf7, + 0x6c, 0xff, 0x30, 0x68, 0x80, 0x03, 0xc4, 0x0f, + 0xb5, 0x61, 0x0a, 0x20, 0xfa, 0xf7, 0x65, 0xff, + 0x20, 0x1c, 0x70, 0xbd, 0x00, 0x00, 0x3c, 0x00, + 0x24, 0x80, 0x01, 0x00, 0x10, 0x00, 0x07, 0x00, + 0x70, 0xb5, 0x01, 0x25, 0x6d, 0x04, 0x00, 0x28, + 0x10, 0x4c, 0x01, 0xd0, 0x65, 0x61, 0x00, 0xe0, + 0xa5, 0x61, 0x60, 0x68, 0x28, 0x43, 0x60, 0x60, + 0xa0, 0x68, 0x28, 0x43, 0xa0, 0x60, 0x0a, 0x20, + 0xfa, 0xf7, 0x4e, 0xff, 0x01, 0x26, 0xb6, 0x03, + 0x66, 0x61, 0x0a, 0x20, 0xfa, 0xf7, 0x48, 0xff, + 0xa6, 0x61, 0x01, 0x20, 0xfa, 0xf7, 0x44, 0xff, + 0x3c, 0x00, 0x60, 0x80, 0x01, 0x00, 0xa0, 0x68, + 0xa8, 0x43, 0xa0, 0x60, 0x60, 0x68, 0x28, 0x43, + 0x60, 0x60, 0x0a, 0x20, 0xfa, 0xf7, 0x3b, 0xff, + 0x70, 0xbd, 0x10, 0x00, 0x07, 0x00, 0x70, 0xb5, + 0x01, 0x25, 0x10, 0x4c, 0x6d, 0x04, 0x65, 0x61, + 0x60, 0x68, 0x28, 0x43, 0x60, 0x60, 0xa0, 0x68, + 0x28, 0x43, 0xa0, 0x60, 0xee, 0x08, 0xa6, 0x61, + 0x0a, 0x20, 0xfa, 0xf7, 0x28, 0xff, 0x66, 0x61, + 0x0a, 0x20, 0x3c, 0x00, 0x9c, 0x80, 0x01, 0x00, + 0xfa, 0xf7, 0x24, 0xff, 0xa5, 0x61, 0x0a, 0x20, + 0xfa, 0xf7, 0x20, 0xff, 0xa6, 0x61, 0x0a, 0x20, + 0xfa, 0xf7, 0x1c, 0xff, 0xa0, 0x68, 0xa8, 0x43, + 0xa0, 0x60, 0x60, 0x68, 0x28, 0x43, 0x60, 0x60, + 0x70, 0xbd, 0x00, 0x00, 0x10, 0x00, 0x07, 0x00, + 0x70, 0xb5, 0x01, 0x25, 0x0e, 0x4c, 0x6d, 0x04, + 0xa5, 0x61, 0x60, 0x68, 0x28, 0x43, 0x60, 0x60, + 0xa0, 0x68, 0x28, 0x43, 0x3c, 0x00, 0xd8, 0x80, + 0x01, 0x00, 0xa0, 0x60, 0xee, 0x08, 0x66, 0x61, + 0x0a, 0x20, 0xfa, 0xf7, 0x02, 0xff, 0x65, 0x61, + 0x0a, 0x20, 0xfa, 0xf7, 0xfe, 0xfe, 0xa6, 0x61, + 0x0a, 0x20, 0xfa, 0xf7, 0xfa, 0xfe, 0xa0, 0x68, + 0xa8, 0x43, 0xa0, 0x60, 0x60, 0x68, 0x28, 0x43, + 0x60, 0x60, 0x70, 0xbd, 0x00, 0x00, 0x10, 0x00, + 0x07, 0x00, 0x70, 0xb5, 0x05, 0x1c, 0x00, 0x24, + 0x80, 0x26, 0x28, 0x1c, 0x30, 0x40, 0x3c, 0x00, + 0x14, 0x81, 0x01, 0x00, 0xff, 0xf7, 0x88, 0xff, + 0x68, 0x06, 0x05, 0x0e, 0x01, 0x34, 0x08, 0x2c, + 0xf6, 0xdb, 0xff, 0xf7, 0x6d, 0xff, 0x70, 0xbd, + 0x80, 0xb5, 0x02, 0x1c, 0x0b, 0x21, 0x80, 0x20, + 0xfb, 0xf7, 0x3e, 0xfb, 0x80, 0xbd, 0x00, 0x00, + 0xf8, 0xb5, 0x12, 0x48, 0x00, 0x25, 0x07, 0x1c, + 0xff, 0x37, 0x06, 0x1d, 0x01, 0x37, 0x28, 0x1c, + 0xf9, 0xf7, 0xea, 0xfd, 0x04, 0x1c, 0x17, 0xd0, + 0x3c, 0x00, 0x50, 0x81, 0x01, 0x00, 0x20, 0x69, + 0x00, 0x28, 0x04, 0xd0, 0xe0, 0x6a, 0x00, 0x28, + 0x03, 0xd0, 0x00, 0x20, 0xe0, 0x62, 0x25, 0x1c, + 0xf0, 0xe7, 0x7b, 0x68, 0x00, 0x2b, 0x05, 0xd0, + 0x32, 0x1c, 0x21, 0x1c, 0x44, 0x31, 0x01, 0x20, + 0xe8, 0xf7, 0x34, 0xf9, 0x20, 0x1c, 0x44, 0x30, + 0xf9, 0xf7, 0x37, 0xfe, 0xe2, 0xe7, 0xf8, 0xbd, + 0x00, 0x00, 0x20, 0xf7, 0x01, 0x00, 0x11, 0x48, + 0x70, 0xb5, 0x3c, 0x00, 0x8c, 0x81, 0x01, 0x00, + 0x00, 0x68, 0xff, 0x28, 0x1d, 0xd1, 0xff, 0x20, + 0x32, 0x30, 0xfa, 0xf7, 0xa7, 0xfe, 0x0e, 0x4d, + 0x6c, 0x68, 0x0e, 0x48, 0xfa, 0xf7, 0xa2, 0xfe, + 0x68, 0x68, 0x24, 0x1a, 0x01, 0x20, 0x00, 0xf0, + 0x95, 0xfd, 0x6e, 0x68, 0x09, 0x48, 0xfa, 0xf7, + 0x99, 0xfe, 0x68, 0x68, 0x21, 0x1c, 0x0a, 0x39, + 0x30, 0x1a, 0x88, 0x42, 0x02, 0xd3, 0x0a, 0x34, + 0xa0, 0x42, 0x02, 0xd9, 0x3c, 0x00, 0xc8, 0x81, + 0x01, 0x00, 0x00, 0x20, 0x00, 0xf0, 0x85, 0xfd, + 0x70, 0xbd, 0xf4, 0x74, 0x01, 0x00, 0x00, 0x03, + 0x07, 0x00, 0x93, 0x03, 0x00, 0x00, 0x70, 0xb5, + 0x00, 0xf0, 0x4d, 0xf8, 0x01, 0x20, 0xed, 0xf7, + 0x34, 0xf9, 0x11, 0x4d, 0x18, 0x21, 0x68, 0x60, + 0x00, 0x20, 0xe9, 0xf7, 0xf2, 0xf9, 0x28, 0x60, + 0x04, 0x68, 0x80, 0x20, 0x20, 0x80, 0x00, 0x26, + 0x06, 0x22, 0xff, 0x21, 0x20, 0x1d, 0x3c, 0x00, + 0x04, 0x82, 0x01, 0x00, 0x66, 0x80, 0xe8, 0xf7, + 0x0b, 0xfa, 0x20, 0x1c, 0x0a, 0x30, 0x09, 0x49, + 0xf2, 0xf7, 0x2e, 0xfd, 0x20, 0x1c, 0x10, 0x30, + 0x07, 0x49, 0xf2, 0xf7, 0x29, 0xfd, 0xe6, 0x82, + 0x03, 0xcd, 0xe9, 0xf7, 0xf9, 0xf8, 0x02, 0x49, + 0x01, 0x20, 0x14, 0x39, 0x88, 0x60, 0x70, 0xbd, + 0x90, 0xd9, 0x01, 0x00, 0x12, 0x61, 0x01, 0x00, + 0x24, 0xf7, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x3c, 0x00, 0x40, 0x82, 0x01, 0x00, 0x10, 0xb5, + 0x06, 0x4c, 0x00, 0x22, 0x02, 0x20, 0xe1, 0x68, + 0xf0, 0xf7, 0x11, 0xfb, 0x60, 0x78, 0x02, 0x28, + 0x01, 0xd1, 0x00, 0xf0, 0x1a, 0xf9, 0x10, 0xbd, + 0x00, 0x00, 0x40, 0xd9, 0x01, 0x00, 0x80, 0xb5, + 0xa1, 0x20, 0xff, 0xf7, 0x50, 0xff, 0x80, 0xbd, + 0x00, 0x00, 0x40, 0x00, 0x0e, 0x21, 0x08, 0x40, + 0x80, 0xb5, 0xa0, 0x30, 0xff, 0xf7, 0x47, 0xff, + 0x80, 0xbd, 0x3c, 0x00, 0x7c, 0x82, 0x01, 0x00, + 0x10, 0xb5, 0x05, 0x4c, 0x20, 0x68, 0x00, 0x28, + 0x04, 0xd0, 0xe9, 0xf7, 0x87, 0xf9, 0x00, 0x20, + 0x20, 0x60, 0x60, 0x60, 0x10, 0xbd, 0x00, 0x00, + 0x90, 0xd9, 0x01, 0x00, 0x10, 0xb5, 0x07, 0x4c, + 0x01, 0x21, 0x07, 0x4a, 0x21, 0x61, 0x02, 0x20, + 0x10, 0x70, 0x61, 0x61, 0x00, 0xf0, 0xd6, 0xfc, + 0x00, 0xf0, 0xc8, 0xfb, 0x20, 0x1c, 0xed, 0xf7, + 0x9f, 0xfa, 0x10, 0xbd, 0x3c, 0x00, 0xb8, 0x82, + 0x01, 0x00, 0x20, 0xf7, 0x01, 0x00, 0x7c, 0xd9, + 0x01, 0x00, 0x70, 0xb5, 0x02, 0x1c, 0x08, 0x1c, + 0x02, 0x25, 0x00, 0x2a, 0x13, 0x4e, 0x14, 0xd0, + 0x00, 0xf0, 0x11, 0xfc, 0x30, 0x78, 0x01, 0x21, + 0x08, 0x43, 0x30, 0x70, 0x30, 0x78, 0x28, 0x43, + 0x30, 0x70, 0x00, 0x20, 0x7d, 0x21, 0x49, 0x01, + 0xb2, 0x79, 0x92, 0x07, 0x00, 0xd5, 0x01, 0x34, + 0x01, 0x30, 0x88, 0x42, 0xf8, 0xdb, 0x3c, 0x00, + 0xf4, 0x82, 0x01, 0x00, 0x20, 0x1c, 0x70, 0xbd, + 0x30, 0x78, 0xa8, 0x43, 0x30, 0x70, 0x30, 0x78, + 0x40, 0x08, 0x40, 0x00, 0x30, 0x70, 0x05, 0x49, + 0x48, 0x68, 0x01, 0x22, 0x12, 0x04, 0x90, 0x43, + 0x48, 0x60, 0x01, 0x20, 0x70, 0xbd, 0x00, 0x00, + 0x88, 0x00, 0x07, 0x00, 0x6c, 0x00, 0x07, 0x00, + 0xff, 0xb5, 0x09, 0xae, 0x00, 0x20, 0x60, 0xce, + 0x28, 0x60, 0x00, 0x23, 0x9c, 0x46, 0x30, 0x60, + 0x3c, 0x00, 0x30, 0x83, 0x01, 0x00, 0x69, 0x46, + 0x01, 0xaa, 0x17, 0xe0, 0xdb, 0x07, 0x0e, 0xd5, + 0x12, 0x4b, 0x1c, 0x56, 0x63, 0x1c, 0x0a, 0xd0, + 0x01, 0x27, 0x2b, 0x68, 0xa7, 0x40, 0x3b, 0x43, + 0x2b, 0x60, 0x13, 0x68, 0xdb, 0x07, 0x02, 0xd5, + 0x33, 0x68, 0x3b, 0x43, 0x33, 0x60, 0x0b, 0x68, + 0x5b, 0x08, 0x0b, 0x60, 0x13, 0x68, 0x5b, 0x08, + 0x13, 0x60, 0x01, 0x30, 0x0b, 0x68, 0x00, 0x2b, + 0x01, 0xd0, 0x3c, 0x00, 0x6c, 0x83, 0x01, 0x00, + 0x22, 0x28, 0xe2, 0xd3, 0x63, 0x46, 0x01, 0x33, + 0x20, 0x20, 0x02, 0x2b, 0x9c, 0x46, 0x02, 0xa9, + 0x03, 0xaa, 0xf2, 0xdb, 0xff, 0xbd, 0x00, 0x00, + 0xb4, 0x8d, 0x01, 0x00, 0xb0, 0xb5, 0x04, 0x1c, + 0x0d, 0x1c, 0x1e, 0x21, 0x00, 0x22, 0x03, 0x20, + 0x05, 0x4b, 0xf9, 0xf7, 0xb3, 0xf8, 0x21, 0x1c, + 0x03, 0x20, 0xf9, 0xf7, 0xf5, 0xf8, 0x29, 0x1c, + 0x03, 0x20, 0xf9, 0xf7, 0x3c, 0x00, 0xa8, 0x83, + 0x01, 0x00, 0xf1, 0xf8, 0xb0, 0xbd, 0x80, 0x38, + 0x01, 0x00, 0xb0, 0xb5, 0x1c, 0x4c, 0x1c, 0x4d, + 0x21, 0x78, 0x02, 0x29, 0x09, 0xd0, 0x03, 0x29, + 0x19, 0xd0, 0x04, 0x29, 0x1f, 0xd0, 0x05, 0x29, + 0x23, 0xd1, 0x00, 0x20, 0x00, 0xf0, 0x17, 0xfb, + 0x23, 0xe0, 0x68, 0x61, 0x14, 0x48, 0x1c, 0x30, + 0xc1, 0x68, 0x02, 0x69, 0x89, 0x18, 0xc1, 0x60, + 0x00, 0xf0, 0x2f, 0xfb, 0xe0, 0x68, 0x3c, 0x00, + 0xe4, 0x83, 0x01, 0x00, 0x01, 0x38, 0xe0, 0x60, + 0x16, 0xd1, 0x32, 0x20, 0xe0, 0x60, 0xff, 0xf7, + 0xa3, 0xfe, 0x11, 0xe0, 0x00, 0x20, 0x00, 0xf0, + 0x01, 0xfb, 0x00, 0xf0, 0x2d, 0xfc, 0x01, 0x20, + 0x20, 0x70, 0x09, 0xe0, 0x00, 0x20, 0x00, 0xf0, + 0xf9, 0xfa, 0xff, 0xf7, 0x45, 0xff, 0x03, 0xe0, + 0x05, 0x21, 0x0b, 0x20, 0xe8, 0xf7, 0x46, 0xff, + 0x68, 0x69, 0x61, 0x68, 0xe7, 0xf7, 0xdd, 0xff, + 0x3c, 0x00, 0x20, 0x84, 0x01, 0x00, 0xb0, 0xbd, + 0x00, 0x00, 0x7c, 0xd9, 0x01, 0x00, 0x20, 0xf7, + 0x01, 0x00, 0xf7, 0xb5, 0x04, 0x1c, 0x17, 0x1c, + 0xff, 0xf7, 0x21, 0xfe, 0x20, 0x0a, 0xff, 0xf7, + 0x18, 0xff, 0x20, 0x06, 0x00, 0x0e, 0xff, 0xf7, + 0x62, 0xfe, 0xff, 0xf7, 0x18, 0xfe, 0xa1, 0x20, + 0xff, 0xf7, 0x5d, 0xfe, 0x00, 0x25, 0x16, 0xe0, + 0x00, 0x20, 0x00, 0x24, 0x40, 0x06, 0x06, 0x0e, + 0xff, 0xf7, 0x3c, 0x00, 0x5c, 0x84, 0x01, 0x00, + 0xd1, 0xfd, 0x00, 0x06, 0x00, 0x0e, 0x30, 0x43, + 0x01, 0x34, 0x08, 0x2c, 0xf5, 0xdb, 0x29, 0x1c, + 0x01, 0x9a, 0x01, 0x35, 0xbd, 0x42, 0x50, 0x54, + 0x01, 0xda, 0x00, 0x20, 0x00, 0xe0, 0x01, 0x20, + 0xff, 0xf7, 0xd4, 0xfd, 0xbd, 0x42, 0xe6, 0xdb, + 0xff, 0xf7, 0x1e, 0xfe, 0xfe, 0xbd, 0x00, 0x00, + 0x80, 0xb5, 0xff, 0xf7, 0x19, 0xfe, 0x09, 0x21, + 0x89, 0x03, 0x00, 0x22, 0x3c, 0x00, 0x98, 0x84, + 0x01, 0x00, 0x02, 0x20, 0xf0, 0xf7, 0xe9, 0xf9, + 0x80, 0xbd, 0x09, 0x21, 0x89, 0x03, 0x80, 0xb5, + 0x00, 0x22, 0x02, 0x20, 0xf0, 0xf7, 0xc9, 0xf9, + 0x01, 0x21, 0x09, 0x48, 0x89, 0x03, 0x81, 0x61, + 0x42, 0x68, 0x0a, 0x43, 0x42, 0x60, 0x82, 0x68, + 0x11, 0x43, 0x81, 0x60, 0x01, 0x21, 0x49, 0x04, + 0x81, 0x61, 0x82, 0x68, 0x8a, 0x43, 0x82, 0x60, + 0x42, 0x68, 0x11, 0x43, 0x41, 0x60, 0x3c, 0x00, + 0xd4, 0x84, 0x01, 0x00, 0x80, 0xbd, 0x00, 0x00, + 0x10, 0x00, 0x07, 0x00, 0xf0, 0xb5, 0x04, 0x1c, + 0xc0, 0x68, 0x7b, 0x4e, 0x05, 0x68, 0x30, 0x78, + 0x85, 0xb0, 0x01, 0x28, 0x01, 0xd0, 0x02, 0x28, + 0x72, 0xd1, 0x00, 0x21, 0x20, 0x69, 0xf2, 0xf7, + 0x41, 0xf9, 0x76, 0x49, 0xf2, 0xf7, 0x24, 0xfc, + 0x00, 0x28, 0x69, 0xd0, 0x20, 0x1c, 0x20, 0x30, + 0x41, 0x7a, 0x08, 0x29, 0x02, 0xd1, 0x72, 0x4a, + 0x3c, 0x00, 0x10, 0x85, 0x01, 0x00, 0x00, 0x21, + 0x51, 0x61, 0x00, 0x7a, 0x22, 0x6a, 0x18, 0x21, + 0xf2, 0xf7, 0xc9, 0xfb, 0xe1, 0x6a, 0x37, 0x1c, + 0x40, 0x18, 0x6c, 0x49, 0x02, 0x90, 0x30, 0x78, + 0x0e, 0x1c, 0xff, 0x36, 0x0a, 0x1d, 0x01, 0x36, + 0x01, 0x28, 0x04, 0x92, 0x07, 0xd0, 0x65, 0x4a, + 0x02, 0x99, 0x1c, 0x32, 0x28, 0x1c, 0xed, 0xf7, + 0xe2, 0xfb, 0x00, 0x28, 0x6b, 0xd0, 0x32, 0x21, + 0x20, 0x69, 0x3c, 0x00, 0x4c, 0x85, 0x01, 0x00, + 0xf2, 0xf7, 0x16, 0xf9, 0x01, 0x90, 0x20, 0x69, + 0x01, 0x21, 0xf2, 0xf7, 0x11, 0xf9, 0x01, 0x1c, + 0x5e, 0x48, 0x01, 0x23, 0x01, 0x9a, 0xed, 0xf7, + 0x07, 0xfc, 0x00, 0x28, 0x04, 0xd1, 0x5b, 0x48, + 0xed, 0xf7, 0x92, 0xfa, 0x00, 0x21, 0xb9, 0x60, + 0x56, 0x48, 0x1c, 0x30, 0x81, 0x68, 0xea, 0xf7, + 0x19, 0xfc, 0x20, 0x1c, 0x14, 0x30, 0x03, 0x90, + 0x04, 0x99, 0xf2, 0xf7, 0x3c, 0x00, 0x88, 0x85, + 0x01, 0x00, 0xd5, 0xfb, 0x00, 0x28, 0x05, 0xd1, + 0x00, 0x22, 0xba, 0x60, 0x04, 0x98, 0x03, 0x99, + 0xf2, 0xf7, 0x6b, 0xfb, 0x4f, 0x49, 0x28, 0x89, + 0x09, 0x88, 0x88, 0x42, 0x03, 0xd0, 0x00, 0x22, + 0x4c, 0x49, 0xba, 0x60, 0x08, 0x80, 0x03, 0x21, + 0x20, 0x69, 0xf2, 0xf7, 0xe4, 0xf8, 0x00, 0x28, + 0x10, 0xd0, 0x46, 0x49, 0x82, 0x78, 0x20, 0x31, + 0x0b, 0x79, 0x94, 0x46, 0x9a, 0x42, 0x3c, 0x00, + 0xc4, 0x85, 0x01, 0x00, 0x09, 0xd0, 0x00, 0x22, + 0xba, 0x60, 0x62, 0x46, 0x0a, 0x71, 0x80, 0x78, + 0x01, 0x21, 0xf3, 0xf7, 0x05, 0xf9, 0x00, 0xe0, + 0x77, 0xe0, 0x06, 0x21, 0x20, 0x69, 0xf2, 0xf7, + 0xcd, 0xf8, 0x00, 0x28, 0x08, 0xd0, 0x81, 0x78, + 0x3a, 0x48, 0x40, 0x30, 0x82, 0x88, 0x91, 0x42, + 0x02, 0xd0, 0x00, 0x22, 0xba, 0x60, 0x81, 0x80, + 0x2a, 0x21, 0x20, 0x69, 0xf2, 0xf7, 0xbe, 0xf8, + 0x3c, 0x00, 0x00, 0x86, 0x01, 0x00, 0x00, 0x28, + 0x0d, 0xd0, 0x80, 0x78, 0xf1, 0x69, 0x33, 0x4a, + 0x81, 0x42, 0x08, 0xd0, 0x00, 0x21, 0xb9, 0x60, + 0xf0, 0x61, 0x10, 0x1c, 0xed, 0xf7, 0x09, 0xfb, + 0x2f, 0x48, 0xed, 0xf7, 0xfa, 0xfa, 0x38, 0x78, + 0x3b, 0x1c, 0x01, 0x28, 0x17, 0xd1, 0x02, 0x20, + 0x18, 0x70, 0x2a, 0x4f, 0x01, 0x23, 0x3b, 0x61, + 0x27, 0x4b, 0x03, 0xcd, 0x1c, 0x33, 0x08, 0x3d, + 0x02, 0x9a, 0x3c, 0x00, 0x3c, 0x86, 0x01, 0x00, + 0xed, 0xf7, 0xb0, 0xfa, 0x38, 0x1c, 0xed, 0xf7, + 0xd7, 0xf8, 0x32, 0x68, 0x00, 0x2a, 0x03, 0xd0, + 0x00, 0x21, 0x01, 0x20, 0xe7, 0xf7, 0xc4, 0xfe, + 0x00, 0xf0, 0xf4, 0xf9, 0x20, 0x1c, 0xf9, 0xf7, + 0xd5, 0xfb, 0x07, 0x1c, 0x11, 0xd1, 0x20, 0x1c, + 0xf9, 0xf7, 0x88, 0xfb, 0x07, 0x1c, 0x2e, 0xd0, + 0x01, 0x23, 0x3b, 0x61, 0x68, 0x89, 0x40, 0x21, + 0xc8, 0x53, 0x73, 0x68, 0x3c, 0x00, 0x78, 0x86, + 0x01, 0x00, 0x00, 0x2b, 0x04, 0xd0, 0x21, 0x1c, + 0x00, 0x20, 0x04, 0x9a, 0xe7, 0xf7, 0xac, 0xfe, + 0x01, 0x23, 0xfb, 0x62, 0x20, 0x69, 0x32, 0x21, + 0xf2, 0xf7, 0x75, 0xf8, 0x05, 0x1c, 0x20, 0x69, + 0x01, 0x21, 0xf2, 0xf7, 0x70, 0xf8, 0x0e, 0x4e, + 0x01, 0x1c, 0x2a, 0x1c, 0x30, 0x1c, 0xed, 0xf7, + 0xc0, 0xfb, 0x00, 0x28, 0x0e, 0xd1, 0x32, 0x21, + 0x20, 0x69, 0xf2, 0xf7, 0x64, 0xf8, 0x3c, 0x00, + 0xb4, 0x86, 0x01, 0x00, 0x05, 0x1c, 0x20, 0x69, + 0x01, 0x21, 0xf2, 0xf7, 0x5f, 0xf8, 0x01, 0x1c, + 0x3b, 0x1c, 0x2a, 0x1c, 0x30, 0x1c, 0xed, 0xf7, + 0xd7, 0xfa, 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, + 0x7c, 0xd9, 0x01, 0x00, 0x40, 0xf8, 0x01, 0x00, + 0x20, 0xf7, 0x01, 0x00, 0x02, 0x1c, 0x08, 0x1c, + 0x80, 0x2a, 0x80, 0xb5, 0x06, 0xd0, 0x81, 0x2a, + 0x03, 0xd0, 0x04, 0x21, 0x0b, 0x20, 0xe8, 0xf7, + 0x3c, 0x00, 0xf0, 0x86, 0x01, 0x00, 0xd9, 0xfd, + 0x80, 0xbd, 0xff, 0xf7, 0x5c, 0xfe, 0x80, 0xbd, + 0x00, 0x00, 0x03, 0x48, 0x81, 0x78, 0xff, 0x29, + 0x01, 0xd0, 0x00, 0x79, 0x70, 0x47, 0x00, 0x20, + 0x70, 0x47, 0x80, 0xf8, 0x01, 0x00, 0x30, 0xb5, + 0x89, 0xb0, 0x00, 0x93, 0x0e, 0x4d, 0x13, 0x1c, + 0x04, 0x1c, 0x2a, 0x1c, 0xec, 0xf7, 0x25, 0xfd, + 0x01, 0xa9, 0x06, 0xa8, 0xa2, 0x68, 0xec, 0xf7, + 0xce, 0xfe, 0x3c, 0x00, 0x2c, 0x87, 0x01, 0x00, + 0x01, 0xaa, 0x06, 0xa9, 0x28, 0x1c, 0x63, 0x6a, + 0xed, 0xf7, 0x44, 0xfa, 0x04, 0x1c, 0x01, 0x28, + 0x04, 0xd1, 0x28, 0x1c, 0xed, 0xf7, 0x2c, 0xf8, + 0x00, 0xf0, 0x4a, 0xf8, 0x20, 0x1c, 0x09, 0xb0, + 0x30, 0xbd, 0x00, 0x00, 0x20, 0xf7, 0x01, 0x00, + 0x80, 0xb5, 0xed, 0xf7, 0x2b, 0xf8, 0x00, 0xf0, + 0x7d, 0xf8, 0x02, 0x48, 0xed, 0xf7, 0x02, 0xfa, + 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0x68, 0x87, + 0x01, 0x00, 0x20, 0xf7, 0x01, 0x00, 0x80, 0xb5, + 0x00, 0x28, 0x0b, 0xd1, 0x06, 0x48, 0xed, 0xf7, + 0xf8, 0xf9, 0x00, 0xf0, 0x6e, 0xf8, 0x01, 0x20, + 0xed, 0xf7, 0xeb, 0xfa, 0x03, 0x49, 0x03, 0x20, + 0xf9, 0xf7, 0x35, 0xfe, 0x80, 0xbd, 0x20, 0xf7, + 0x01, 0x00, 0x6d, 0x87, 0x01, 0x00, 0xb0, 0xb5, + 0x10, 0x4d, 0x04, 0x1c, 0x13, 0x1c, 0x2a, 0x1c, + 0x88, 0xb0, 0xec, 0xf7, 0x02, 0xfd, 0x3c, 0x00, + 0xa4, 0x87, 0x01, 0x00, 0x21, 0x1c, 0x0a, 0x31, + 0x06, 0x22, 0x28, 0x1d, 0xe7, 0xf7, 0xa4, 0xfe, + 0x69, 0x46, 0x05, 0xa8, 0x62, 0x69, 0xec, 0xf7, + 0x87, 0xfe, 0x28, 0x1c, 0xec, 0xf7, 0xee, 0xff, + 0x7f, 0x23, 0xdb, 0x43, 0x28, 0x1c, 0x6a, 0x46, + 0x05, 0xa9, 0xed, 0xf7, 0xf9, 0xf9, 0x00, 0xf0, + 0x1d, 0xf8, 0x08, 0xb0, 0xb0, 0xbd, 0x00, 0x00, + 0x20, 0xf7, 0x01, 0x00, 0x0a, 0x48, 0x80, 0xb5, + 0x3c, 0x00, 0xe0, 0x87, 0x01, 0x00, 0x01, 0x78, + 0x00, 0x29, 0x06, 0xd0, 0x02, 0x29, 0x01, 0xd0, + 0x05, 0x29, 0x07, 0xd1, 0x03, 0x21, 0x01, 0x70, + 0x80, 0xbd, 0x01, 0x21, 0x01, 0x70, 0x00, 0xf0, + 0x2e, 0xfa, 0x80, 0xbd, 0x03, 0x21, 0x0b, 0x20, + 0xe8, 0xf7, 0x4f, 0xfd, 0x80, 0xbd, 0x7c, 0xd9, + 0x01, 0x00, 0x09, 0x49, 0x80, 0xb5, 0x08, 0x78, + 0x00, 0x28, 0x06, 0xd0, 0x02, 0x28, 0x01, 0xd0, + 0x05, 0x28, 0x3c, 0x00, 0x1c, 0x88, 0x01, 0x00, + 0x05, 0xd1, 0x04, 0x20, 0x08, 0x70, 0x80, 0xbd, + 0xff, 0xf7, 0x38, 0xfd, 0x80, 0xbd, 0x02, 0x21, + 0x0b, 0x20, 0xe8, 0xf7, 0x39, 0xfd, 0x80, 0xbd, + 0x7c, 0xd9, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, + 0x0b, 0x20, 0x04, 0x4a, 0xfa, 0xf7, 0x82, 0xff, + 0xf6, 0xf7, 0x86, 0xfd, 0x02, 0x49, 0x08, 0x61, + 0x80, 0xbd, 0x00, 0x00, 0xdd, 0x86, 0x01, 0x00, + 0x7c, 0xd9, 0x01, 0x00, 0x3c, 0x00, 0x58, 0x88, + 0x01, 0x00, 0x0c, 0x48, 0x80, 0xb5, 0x01, 0x78, + 0x06, 0x29, 0x0e, 0xd2, 0x02, 0xa3, 0x5b, 0x5c, + 0x5b, 0x00, 0x9f, 0x44, 0x00, 0x00, 0x06, 0x03, + 0x07, 0x07, 0x07, 0x06, 0x00, 0x20, 0x00, 0xf0, + 0xc2, 0xf8, 0x80, 0xbd, 0x05, 0x21, 0x01, 0x70, + 0x80, 0xbd, 0x04, 0x21, 0x0b, 0x20, 0xe8, 0xf7, + 0x0e, 0xfd, 0x80, 0xbd, 0x00, 0x00, 0x7c, 0xd9, + 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, + 0x94, 0x88, 0x01, 0x00, 0x10, 0xb5, 0x0d, 0x4b, + 0x04, 0x1c, 0x18, 0x1c, 0x10, 0x30, 0x00, 0x2c, + 0x08, 0xd0, 0xdb, 0x88, 0x5b, 0x04, 0x5b, 0x0c, + 0x0b, 0x80, 0x80, 0x7b, 0x48, 0x80, 0x04, 0x20, + 0x10, 0x80, 0x08, 0xe0, 0xda, 0x88, 0x01, 0x24, + 0xe4, 0x03, 0x22, 0x40, 0x0c, 0x88, 0x22, 0x43, + 0xda, 0x80, 0x49, 0x88, 0x81, 0x73, 0x01, 0x20, + 0x10, 0xbd, 0x00, 0x00, 0x30, 0x00, 0x07, 0x00, + 0x3c, 0x00, 0xd0, 0x88, 0x01, 0x00, 0x70, 0xb5, + 0x10, 0x4e, 0x02, 0x1c, 0x00, 0x23, 0xf0, 0x56, + 0x00, 0x2a, 0x02, 0xd0, 0x08, 0x70, 0x01, 0x24, + 0x15, 0xe0, 0x00, 0x23, 0xcd, 0x56, 0x85, 0x42, + 0x01, 0xd1, 0x01, 0x20, 0x70, 0xbd, 0x28, 0x1c, + 0x00, 0xf0, 0x5f, 0xf9, 0x04, 0x1c, 0x0a, 0xd0, + 0x07, 0x48, 0x35, 0x70, 0x00, 0x68, 0x00, 0x28, + 0x03, 0xd0, 0x00, 0x21, 0x0a, 0x20, 0xf9, 0xf7, + 0x28, 0xfd, 0x3c, 0x00, 0x0c, 0x89, 0x01, 0x00, + 0x00, 0xf0, 0x16, 0xfa, 0x20, 0x1c, 0x70, 0xbd, + 0xf4, 0x6b, 0x01, 0x00, 0x3c, 0xd9, 0x01, 0x00, + 0x03, 0x1c, 0x08, 0x1c, 0x00, 0x2b, 0x80, 0xb5, + 0x06, 0xd0, 0x04, 0x21, 0x11, 0x80, 0x04, 0x22, + 0x04, 0x49, 0xe7, 0xf7, 0xe3, 0xfd, 0x02, 0xe0, + 0x00, 0x68, 0x00, 0xf0, 0xcf, 0xf9, 0x01, 0x20, + 0x80, 0xbd, 0x00, 0x00, 0xf4, 0x74, 0x01, 0x00, + 0x10, 0xb5, 0xff, 0xf7, 0x3c, 0x00, 0x48, 0x89, + 0x01, 0x00, 0x97, 0xfb, 0xff, 0xf7, 0x89, 0xfc, + 0x04, 0x1c, 0xff, 0xf7, 0xb8, 0xfb, 0xff, 0xf7, + 0x84, 0xfc, 0x00, 0x2c, 0x02, 0xd1, 0x01, 0x28, + 0x00, 0xd1, 0x10, 0xbd, 0x00, 0x20, 0x10, 0xbd, + 0x00, 0x00, 0xf8, 0xb5, 0x20, 0x4f, 0x04, 0x1c, + 0x78, 0x78, 0x0e, 0x1c, 0x02, 0x28, 0x2e, 0xd0, + 0x1e, 0x4a, 0xf9, 0x68, 0x91, 0x61, 0x14, 0x23, + 0x1d, 0x49, 0x58, 0x43, 0x40, 0x18, 0x3c, 0x00, + 0x84, 0x89, 0x01, 0x00, 0x41, 0x7b, 0xb8, 0x78, + 0xf8, 0xf7, 0x14, 0xfe, 0x00, 0xf0, 0x8a, 0xf9, + 0x00, 0x25, 0x04, 0xe0, 0x00, 0x21, 0xb8, 0x78, + 0xf8, 0xf7, 0x0c, 0xfe, 0x01, 0x35, 0x78, 0x78, + 0x14, 0x23, 0x14, 0x49, 0x58, 0x43, 0x40, 0x18, + 0x80, 0x7a, 0xa8, 0x42, 0xf2, 0xdc, 0x00, 0x25, + 0x08, 0xe0, 0x00, 0x21, 0xb8, 0x78, 0xf8, 0xf7, + 0xfd, 0xfd, 0x0f, 0x48, 0x00, 0x68, 0x20, 0x70, + 0x3c, 0x00, 0xc0, 0x89, 0x01, 0x00, 0x01, 0x34, + 0x01, 0x35, 0xb5, 0x42, 0xf4, 0xdb, 0x09, 0x4a, + 0xf8, 0x68, 0x50, 0x61, 0x78, 0x78, 0x02, 0x28, + 0x06, 0xd1, 0xb8, 0x68, 0x32, 0x1c, 0x21, 0x1c, + 0x00, 0x04, 0x00, 0x0c, 0xff, 0xf7, 0x25, 0xfd, + 0xb8, 0x68, 0x80, 0x19, 0xb8, 0x60, 0xf8, 0xbd, + 0x00, 0x00, 0x40, 0xd9, 0x01, 0x00, 0x10, 0x00, + 0x07, 0x00, 0x64, 0x8d, 0x01, 0x00, 0x30, 0x20, + 0x07, 0x00, 0x3c, 0x00, 0xfc, 0x89, 0x01, 0x00, + 0x70, 0xb5, 0x06, 0x1c, 0x0c, 0x4d, 0x00, 0x24, + 0x2c, 0x70, 0xff, 0xf7, 0x39, 0xfc, 0x0a, 0x48, + 0x18, 0x21, 0x1c, 0x30, 0xac, 0x60, 0xe7, 0xf7, + 0x43, 0xfd, 0x08, 0x48, 0x44, 0x61, 0xf9, 0xf7, + 0x63, 0xf9, 0x00, 0x2e, 0x06, 0xd1, 0x06, 0x48, + 0x29, 0x69, 0xf6, 0xf7, 0xa7, 0xfc, 0x00, 0x20, + 0xec, 0xf7, 0xb0, 0xfe, 0x70, 0xbd, 0x00, 0x00, + 0x7c, 0xd9, 0x01, 0x00, 0x3c, 0x00, 0x38, 0x8a, + 0x01, 0x00, 0x20, 0xf7, 0x01, 0x00, 0x34, 0x63, + 0x01, 0x00, 0x30, 0xb5, 0x12, 0x4c, 0x85, 0xb0, + 0x20, 0x68, 0x00, 0x28, 0x1c, 0xd0, 0x0f, 0x48, + 0x14, 0x38, 0x80, 0x68, 0x00, 0x28, 0x01, 0xd1, + 0xff, 0xf7, 0xc1, 0xfb, 0x20, 0x68, 0x00, 0x23, + 0x00, 0x68, 0x01, 0xaa, 0x04, 0x30, 0x01, 0x21, + 0xec, 0xf7, 0xd1, 0xfd, 0x08, 0x49, 0x08, 0x4a, + 0x08, 0x31, 0x0c, 0x31, 0x00, 0x92, 0x3c, 0x00, + 0x74, 0x8a, 0x01, 0x00, 0x03, 0xc9, 0x00, 0xab, + 0x45, 0x18, 0x99, 0x7b, 0x01, 0x9a, 0x20, 0x68, + 0x2b, 0x1c, 0xf2, 0xf7, 0x2b, 0xfe, 0x05, 0xb0, + 0x30, 0xbd, 0x00, 0x00, 0x90, 0xd9, 0x01, 0x00, + 0x29, 0x81, 0x01, 0x00, 0x10, 0xb5, 0x13, 0x4c, + 0x14, 0x23, 0x60, 0x70, 0x58, 0x43, 0x12, 0x4b, + 0xc1, 0x18, 0x8a, 0x88, 0xe2, 0x80, 0x18, 0x58, + 0xe0, 0x60, 0x08, 0x7a, 0xa0, 0x70, 0xff, 0x28, + 0x3c, 0x00, 0xb0, 0x8a, 0x01, 0x00, 0x12, 0xd0, + 0x00, 0x22, 0x08, 0x21, 0x0d, 0x4b, 0xf8, 0xf7, + 0x22, 0xfd, 0x00, 0x22, 0x02, 0x20, 0xe1, 0x68, + 0xef, 0xf7, 0xbd, 0xfe, 0x0a, 0x49, 0xe0, 0x68, + 0x48, 0x61, 0x4a, 0x68, 0x02, 0x43, 0x4a, 0x60, + 0x8a, 0x68, 0x10, 0x43, 0x88, 0x60, 0x60, 0x78, + 0x02, 0x28, 0x01, 0xd1, 0xff, 0xf7, 0xdf, 0xfc, + 0x10, 0xbd, 0x40, 0xd9, 0x01, 0x00, 0x64, 0x8d, + 0x01, 0x00, 0x3c, 0x00, 0xec, 0x8a, 0x01, 0x00, + 0xb8, 0x0b, 0x00, 0x00, 0x10, 0x00, 0x07, 0x00, + 0xfe, 0x30, 0x00, 0x06, 0x00, 0x0e, 0x06, 0x21, + 0x15, 0x4b, 0x41, 0x43, 0x58, 0x5c, 0x82, 0x06, + 0x14, 0x48, 0x92, 0x0e, 0x42, 0x71, 0xc9, 0x18, + 0x4a, 0x78, 0xd2, 0x06, 0xd2, 0x0e, 0x02, 0x71, + 0x42, 0x78, 0x0c, 0x23, 0x1a, 0x43, 0x42, 0x70, + 0x42, 0x78, 0x8b, 0x78, 0x92, 0x08, 0x92, 0x00, + 0x9b, 0x07, 0x9b, 0x0f, 0x3c, 0x00, 0x28, 0x8b, + 0x01, 0x00, 0x1a, 0x43, 0x42, 0x70, 0x02, 0x78, + 0xc0, 0x23, 0x9a, 0x43, 0x40, 0x32, 0x02, 0x70, + 0x02, 0x78, 0x38, 0x23, 0x1a, 0x43, 0x02, 0x70, + 0x02, 0x78, 0xc9, 0x78, 0x04, 0x23, 0x9a, 0x43, + 0x89, 0x00, 0x19, 0x40, 0x11, 0x43, 0x01, 0x70, + 0x01, 0x20, 0x70, 0x47, 0x00, 0x00, 0xd8, 0x8d, + 0x01, 0x00, 0x88, 0x00, 0x07, 0x00, 0x8f, 0xb5, + 0x00, 0x20, 0x02, 0x90, 0x03, 0x90, 0x3c, 0x00, + 0x64, 0x8b, 0x01, 0x00, 0x07, 0x48, 0x02, 0xaa, + 0x03, 0xa9, 0x00, 0x91, 0x01, 0x92, 0x43, 0x89, + 0x02, 0x89, 0x03, 0xc8, 0xff, 0xf7, 0xd4, 0xfb, + 0x03, 0x98, 0x02, 0x99, 0xff, 0xf7, 0x04, 0xfc, + 0x8f, 0xbd, 0x00, 0x00, 0x04, 0x8e, 0x01, 0x00, + 0x08, 0x49, 0x4a, 0x78, 0x00, 0x2a, 0x03, 0xd1, + 0x88, 0x80, 0x00, 0x20, 0x88, 0x60, 0x70, 0x47, + 0x14, 0x23, 0x5a, 0x43, 0x04, 0x4b, 0xd2, 0x18, + 0x3c, 0x00, 0xa0, 0x8b, 0x01, 0x00, 0xd2, 0x88, + 0x42, 0x43, 0xc8, 0x88, 0x42, 0x43, 0x8a, 0x60, + 0x70, 0x47, 0x40, 0xd9, 0x01, 0x00, 0x64, 0x8d, + 0x01, 0x00, 0xf8, 0xb5, 0x25, 0x4e, 0x04, 0x1c, + 0x30, 0x7a, 0x40, 0x08, 0x40, 0x00, 0x30, 0x72, + 0xb0, 0x7a, 0x00, 0x20, 0xb0, 0x72, 0x01, 0x27, + 0x01, 0x2c, 0x20, 0x4d, 0x01, 0xd0, 0xfc, 0x42, + 0x13, 0xd1, 0x30, 0x7b, 0x38, 0x43, 0x30, 0x73, + 0x00, 0x22, 0x3c, 0x00, 0xdc, 0x8b, 0x01, 0x00, + 0x21, 0x1c, 0x00, 0x20, 0xff, 0xf7, 0x6e, 0xfb, + 0x63, 0x1c, 0x01, 0xd1, 0x3f, 0x21, 0xe9, 0x73, + 0xb1, 0x7a, 0xa0, 0x22, 0x11, 0x43, 0xb1, 0x72, + 0x31, 0x7a, 0x39, 0x43, 0x31, 0x72, 0xf8, 0xbd, + 0x30, 0x7b, 0x40, 0x08, 0x40, 0x00, 0x30, 0x73, + 0x01, 0x22, 0x21, 0x1c, 0x01, 0x20, 0xff, 0xf7, + 0x59, 0xfb, 0x01, 0x20, 0x00, 0x21, 0xe9, 0x73, + 0xb1, 0x7a, 0x02, 0x22, 0x3c, 0x00, 0x18, 0x8c, + 0x01, 0x00, 0x11, 0x43, 0xb1, 0x72, 0xb1, 0x7a, + 0x04, 0x22, 0x11, 0x43, 0xb1, 0x72, 0xb1, 0x7a, + 0x30, 0x22, 0x11, 0x43, 0xb1, 0x72, 0x31, 0x7a, + 0x39, 0x43, 0x31, 0x72, 0x08, 0x49, 0x4a, 0x68, + 0x80, 0x23, 0x9a, 0x43, 0x4a, 0x60, 0x0a, 0x68, + 0x1a, 0x43, 0x0a, 0x60, 0x31, 0x7b, 0x39, 0x43, + 0x31, 0x73, 0xd7, 0xe7, 0x00, 0x00, 0x88, 0x00, + 0x07, 0x00, 0x40, 0x00, 0x07, 0x00, 0x3c, 0x00, + 0x54, 0x8c, 0x01, 0x00, 0x6c, 0x00, 0x07, 0x00, + 0xb0, 0xb5, 0x0e, 0x4d, 0x0e, 0x48, 0x29, 0x69, + 0xf6, 0xf7, 0x9e, 0xfb, 0x0d, 0x48, 0xec, 0xf7, + 0x93, 0xfd, 0x0d, 0x48, 0x09, 0x4c, 0x00, 0x88, + 0x1c, 0x34, 0xa0, 0x82, 0xf1, 0xf7, 0x5a, 0xff, + 0x20, 0x61, 0xfa, 0xf7, 0x97, 0xf8, 0x02, 0x1c, + 0x23, 0x1c, 0x00, 0x21, 0x00, 0x20, 0xec, 0xf7, + 0x8b, 0xff, 0x32, 0x20, 0xe8, 0x60, 0xff, 0xf7, + 0x3c, 0x00, 0x90, 0x8c, 0x01, 0x00, 0xa5, 0xfa, + 0xb0, 0xbd, 0x7c, 0xd9, 0x01, 0x00, 0x34, 0x63, + 0x01, 0x00, 0xdd, 0x84, 0x01, 0x00, 0x20, 0xf7, + 0x01, 0x00, 0xb0, 0xb5, 0x0a, 0x4d, 0x68, 0x78, + 0x00, 0x28, 0x0e, 0xd0, 0x14, 0x23, 0x08, 0x49, + 0x58, 0x43, 0x40, 0x18, 0x44, 0x7a, 0x06, 0xe0, + 0xa8, 0x68, 0xe0, 0x40, 0x01, 0x06, 0x09, 0x0e, + 0xa8, 0x78, 0xf8, 0xf7, 0x76, 0xfc, 0x08, 0x3c, + 0xf6, 0xd5, 0x3c, 0x00, 0xcc, 0x8c, 0x01, 0x00, + 0xb0, 0xbd, 0x00, 0x00, 0x40, 0xd9, 0x01, 0x00, + 0x64, 0x8d, 0x01, 0x00, 0x01, 0x1c, 0x14, 0x48, + 0xb0, 0xb5, 0x01, 0x60, 0x13, 0x48, 0x02, 0x7f, + 0x02, 0x23, 0x9a, 0x43, 0x02, 0x77, 0x02, 0x7f, + 0x01, 0x24, 0x22, 0x43, 0x02, 0x77, 0x10, 0x4d, + 0x00, 0x29, 0x0c, 0xd0, 0x01, 0x22, 0x00, 0x21, + 0x03, 0x20, 0xef, 0xf7, 0x9f, 0xfd, 0x0d, 0x49, + 0x48, 0x7c, 0xa0, 0x43, 0x3c, 0x00, 0x08, 0x8d, + 0x01, 0x00, 0x48, 0x74, 0x68, 0x7a, 0x20, 0x43, + 0x68, 0x72, 0xb0, 0xbd, 0x01, 0x7f, 0x21, 0x43, + 0x01, 0x77, 0x68, 0x7a, 0x40, 0x08, 0x40, 0x00, + 0x68, 0x72, 0x01, 0x22, 0x00, 0x21, 0x03, 0x20, + 0xef, 0xf7, 0xb1, 0xfd, 0xb0, 0xbd, 0xf4, 0x74, + 0x01, 0x00, 0x30, 0x00, 0x07, 0x00, 0x88, 0x00, + 0x07, 0x00, 0x10, 0x00, 0x07, 0x00, 0x10, 0xb5, + 0x07, 0x4c, 0x21, 0x1c, 0x00, 0x20, 0x3c, 0x00, + 0x44, 0x8d, 0x01, 0x00, 0xf9, 0xf7, 0x56, 0xfb, + 0x05, 0x48, 0x00, 0x23, 0xc0, 0x56, 0x01, 0x28, + 0x03, 0xdd, 0x21, 0x1c, 0x00, 0x20, 0xf9, 0xf7, + 0x19, 0xfb, 0x10, 0xbd, 0x65, 0x1a, 0x00, 0x00, + 0xf4, 0x6b, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, + 0x08, 0x01, 0x01, 0x00, 0x02, 0x18, 0x04, 0xff, + 0x82, 0xe8, 0xd7, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, + 0x3c, 0x00, 0x80, 0x8d, 0x01, 0x00, 0x00, 0x18, + 0x00, 0x06, 0x02, 0x03, 0x05, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, + 0x01, 0x00, 0xff, 0x10, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x20, 0x00, 0x01, 0x00, 0x02, 0x10, + 0x00, 0x06, 0x02, 0x03, 0x05, 0x01, 0x01, 0x00, + 0x00, 0x00, 0x04, 0x05, 0x06, 0x07, 0x08, 0x0c, + 0x0d, 0x0e, 0x3c, 0x00, 0xbc, 0x8d, 0x01, 0x00, + 0xff, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1b, + 0x1c, 0x1d, 0xff, 0x1a, 0x11, 0x13, 0x12, 0x0f, + 0x10, 0xff, 0x02, 0x00, 0xff, 0x01, 0x03, 0x09, + 0x0a, 0x0b, 0x00, 0x00, 0x30, 0x0d, 0x02, 0x00, + 0x00, 0x00, 0x28, 0x0e, 0x03, 0x00, 0x00, 0x00, + 0x1e, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x30, 0x0d, + 0x02, 0x01, 0x00, 0x00, 0x1e, 0x0c, 0x00, 0x01, + 0x00, 0x00, 0x23, 0x0d, 0x3c, 0x00, 0xf8, 0x8d, + 0x01, 0x00, 0x02, 0x01, 0x00, 0x00, 0x1d, 0x0d, + 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, + 0xfb, 0x6d, 0x00, 0x00, 0x80, 0x00, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x34, 0x8e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x70, 0x8e, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xac, 0x8e, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0x8e, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x24, 0x8f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x60, 0x8f, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x9c, 0x8f, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0x8f, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x14, 0x90, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x50, 0x90, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x8c, 0x90, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0x90, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x04, 0x91, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x40, 0x91, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x7c, 0x91, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0x91, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xf4, 0x91, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x30, 0x92, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x6c, 0x92, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0x92, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xe4, 0x92, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x20, 0x93, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x5c, 0x93, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0x93, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xd4, 0x93, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x10, 0x94, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x4c, 0x94, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0x94, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xc4, 0x94, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0x95, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x3c, 0x95, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0x95, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xb4, 0x95, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xf0, 0x95, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x2c, 0x96, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0x96, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xa4, 0x96, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xe0, 0x96, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x1c, 0x97, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0x97, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x94, 0x97, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xd0, 0x97, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x0c, 0x98, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0x98, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x84, 0x98, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xc0, 0x98, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xfc, 0x98, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0x99, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x74, 0x99, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xb0, 0x99, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xec, 0x99, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0x9a, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x64, 0x9a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xa0, 0x9a, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xdc, 0x9a, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0x9b, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x54, 0x9b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x90, 0x9b, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xcc, 0x9b, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0x9c, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x44, 0x9c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x80, 0x9c, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xbc, 0x9c, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0x9c, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x34, 0x9d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x70, 0x9d, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xac, 0x9d, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0x9d, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x24, 0x9e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x60, 0x9e, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x9c, 0x9e, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0x9e, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x14, 0x9f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x50, 0x9f, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x8c, 0x9f, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0x9f, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x04, 0xa0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x40, 0xa0, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x7c, 0xa0, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xa0, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xf4, 0xa0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x30, 0xa1, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x6c, 0xa1, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0xa1, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xe4, 0xa1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x20, 0xa2, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x5c, 0xa2, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xa2, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xd4, 0xa2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x10, 0xa3, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x4c, 0xa3, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0xa3, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xc4, 0xa3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0xa4, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x3c, 0xa4, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0xa4, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xb4, 0xa4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xf0, 0xa4, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x2c, 0xa5, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0xa5, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xa4, 0xa5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xe0, 0xa5, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x1c, 0xa6, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0xa6, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x94, 0xa6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xd0, 0xa6, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x0c, 0xa7, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0xa7, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x84, 0xa7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xc0, 0xa7, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xfc, 0xa7, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0xa8, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x74, 0xa8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xb0, 0xa8, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xec, 0xa8, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0xa9, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x64, 0xa9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xa0, 0xa9, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xdc, 0xa9, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0xaa, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x54, 0xaa, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x90, 0xaa, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xcc, 0xaa, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0xab, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x44, 0xab, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x80, 0xab, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xbc, 0xab, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0xab, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x34, 0xac, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x70, 0xac, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xac, 0xac, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0xac, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x24, 0xad, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x60, 0xad, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x9c, 0xad, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0xad, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x14, 0xae, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x50, 0xae, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x8c, 0xae, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0xae, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x04, 0xaf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x40, 0xaf, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x7c, 0xaf, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xaf, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xf4, 0xaf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x30, 0xb0, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x6c, 0xb0, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0xb0, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xe4, 0xb0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x20, 0xb1, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x5c, 0xb1, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xb1, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xd4, 0xb1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x10, 0xb2, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x4c, 0xb2, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0xb2, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xc4, 0xb2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0xb3, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x3c, 0xb3, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0xb3, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xb4, 0xb3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xf0, 0xb3, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x2c, 0xb4, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0xb4, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xa4, 0xb4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xe0, 0xb4, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x1c, 0xb5, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0xb5, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x94, 0xb5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xd0, 0xb5, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x0c, 0xb6, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0xb6, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x84, 0xb6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xc0, 0xb6, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xfc, 0xb6, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0xb7, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x74, 0xb7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xb0, 0xb7, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xec, 0xb7, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0xb8, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x64, 0xb8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xa0, 0xb8, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xdc, 0xb8, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0xb9, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x54, 0xb9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x90, 0xb9, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xcc, 0xb9, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0xba, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x44, 0xba, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x80, 0xba, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xbc, 0xba, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0xba, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x34, 0xbb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x70, 0xbb, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xac, 0xbb, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0xbb, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x24, 0xbc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x60, 0xbc, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x9c, 0xbc, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0xbc, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x14, 0xbd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x50, 0xbd, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x8c, 0xbd, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0xbd, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x04, 0xbe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x40, 0xbe, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x7c, 0xbe, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xbe, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xf4, 0xbe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x30, 0xbf, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x6c, 0xbf, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0xbf, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xe4, 0xbf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x20, 0xc0, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x5c, 0xc0, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xc0, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xd4, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x10, 0xc1, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x4c, 0xc1, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0xc1, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xc4, 0xc1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0xc2, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x3c, 0xc2, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0xc2, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xb4, 0xc2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xf0, 0xc2, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x2c, 0xc3, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0xc3, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xa4, 0xc3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xe0, 0xc3, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x1c, 0xc4, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0xc4, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x94, 0xc4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xd0, 0xc4, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x0c, 0xc5, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0xc5, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x84, 0xc5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xc0, 0xc5, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xfc, 0xc5, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0xc6, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x74, 0xc6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xb0, 0xc6, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xec, 0xc6, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0xc7, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x64, 0xc7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xa0, 0xc7, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xdc, 0xc7, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0xc8, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x54, 0xc8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x90, 0xc8, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xcc, 0xc8, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0xc9, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x44, 0xc9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x80, 0xc9, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xbc, 0xc9, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0xc9, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x34, 0xca, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x70, 0xca, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xac, 0xca, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0xca, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x24, 0xcb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x60, 0xcb, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x9c, 0xcb, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0xcb, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x14, 0xcc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x50, 0xcc, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x8c, 0xcc, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0xcc, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x04, 0xcd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x40, 0xcd, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x7c, 0xcd, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xcd, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xf4, 0xcd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x30, 0xce, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x6c, 0xce, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0xce, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xe4, 0xce, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x20, 0xcf, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x5c, 0xcf, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xcf, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xd4, 0xcf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x10, 0xd0, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x4c, 0xd0, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0xd0, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xc4, 0xd0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0xd1, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x3c, 0xd1, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0xd1, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xb4, 0xd1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xf0, 0xd1, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x2c, 0xd2, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0xd2, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xa4, 0xd2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xe0, 0xd2, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x1c, 0xd3, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0xd3, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x94, 0xd3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xd0, 0xd3, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x0c, 0xd4, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0xd4, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x84, 0xd4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xc0, 0xd4, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xfc, 0xd4, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0xd5, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x74, 0xd5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xb0, 0xd5, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xec, 0xd5, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0xd6, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x64, 0xd6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xa0, 0xd6, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xdc, 0xd6, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0xd7, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x54, 0xd7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x90, 0xd7, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xcc, 0xd7, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0xd8, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x44, 0xd8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x80, 0xd8, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xbc, 0xd8, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0xd8, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x34, 0xd9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x70, 0xd9, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xac, 0xd9, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0xd9, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x24, 0xda, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x60, 0xda, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x9c, 0xda, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0xda, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x14, 0xdb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x50, 0xdb, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x8c, 0xdb, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0xdb, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x04, 0xdc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x40, 0xdc, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x7c, 0xdc, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xdc, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xf4, 0xdc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x30, 0xdd, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x6c, 0xdd, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0xdd, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xe4, 0xdd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x20, 0xde, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x5c, 0xde, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xde, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xd4, 0xde, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x10, 0xdf, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x4c, 0xdf, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0xdf, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xc4, 0xdf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x3c, 0xe0, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0xe0, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xb4, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xf0, 0xe0, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x2c, 0xe1, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0xe1, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xa4, 0xe1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xe0, 0xe1, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x1c, 0xe2, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0xe2, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x94, 0xe2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xd0, 0xe2, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x0c, 0xe3, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0xe3, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x84, 0xe3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xc0, 0xe3, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xfc, 0xe3, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0xe4, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x74, 0xe4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xb0, 0xe4, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xec, 0xe4, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0xe5, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x64, 0xe5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xa0, 0xe5, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xdc, 0xe5, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0xe6, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x54, 0xe6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x90, 0xe6, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xcc, 0xe6, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0xe7, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x44, 0xe7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x80, 0xe7, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xbc, 0xe7, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0xe7, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x34, 0xe8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x70, 0xe8, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xac, 0xe8, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0xe8, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x24, 0xe9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x60, 0xe9, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x9c, 0xe9, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0xe9, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x14, 0xea, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x50, 0xea, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x8c, 0xea, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0xea, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x04, 0xeb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x40, 0xeb, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x7c, 0xeb, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xeb, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xf4, 0xeb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x30, 0xec, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x6c, 0xec, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0xec, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xe4, 0xec, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x20, 0xed, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x5c, 0xed, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xed, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xd4, 0xed, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x10, 0xee, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x4c, 0xee, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0xee, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xc4, 0xee, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0xef, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x3c, 0xef, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0xef, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xb4, 0xef, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xf0, 0xef, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x2c, 0xf0, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x68, 0xf0, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xa4, 0xf0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xe0, 0xf0, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x1c, 0xf1, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x58, 0xf1, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x94, 0xf1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xd0, 0xf1, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x0c, 0xf2, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x48, 0xf2, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x84, 0xf2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xc0, 0xf2, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xfc, 0xf2, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x38, 0xf3, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x74, 0xf3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xb0, 0xf3, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xec, 0xf3, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x28, 0xf4, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x64, 0xf4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xa0, 0xf4, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xdc, 0xf4, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x18, 0xf5, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x54, 0xf5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x90, 0xf5, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xcc, 0xf5, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x08, 0xf6, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x44, 0xf6, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x80, 0xf6, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xbc, 0xf6, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xf8, 0xf6, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x34, 0xf7, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x70, 0xf7, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0xac, 0xf7, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xe8, 0xf7, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x24, 0xf8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x60, 0xf8, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x9c, 0xf8, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xd8, 0xf8, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x14, 0xf9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x50, 0xf9, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x8c, 0xf9, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xc8, 0xf9, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x04, 0xfa, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x40, 0xfa, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x7c, 0xfa, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xb8, 0xfa, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xf4, 0xfa, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x30, 0xfb, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x6c, 0xfb, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0xa8, 0xfb, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xe4, 0xfb, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x20, 0xfc, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x5c, 0xfc, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x98, 0xfc, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xd4, 0xfc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x10, 0xfd, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x4c, 0xfd, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x88, 0xfd, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xc4, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0x00, 0xfe, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x3c, 0xfe, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x78, 0xfe, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0xb4, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x00, 0xf0, 0xfe, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3c, 0x00, 0x2c, 0xff, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x68, 0xff, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, + 0x00, 0x10, 0x04, 0x00, 0x70, 0xb5, 0x2b, 0x48, + 0x06, 0x21, 0x81, 0x75, 0xc1, 0x75, 0x01, 0x7e, + 0x49, 0x08, 0x49, 0x00, 0x01, 0x76, 0x01, 0x7e, + 0x02, 0x22, 0x91, 0x43, 0x01, 0x76, 0x26, 0x49, + 0x0b, 0x78, 0x5b, 0x08, 0x5b, 0x00, 0x0b, 0x70, + 0x04, 0x23, 0x8b, 0x70, 0x0c, 0x23, 0x43, 0x76, + 0x20, 0x23, 0x03, 0x75, 0x1a, 0x24, 0x44, 0x75, + 0x24, 0x24, 0x84, 0x76, 0x10, 0x24, 0xc4, 0x76, + 0x3c, 0x00, 0x3c, 0x10, 0x04, 0x00, 0x2a, 0x25, + 0x4d, 0x70, 0x05, 0x7a, 0x30, 0x26, 0xb5, 0x43, + 0x20, 0x35, 0x05, 0x72, 0x85, 0x7a, 0x6d, 0x08, + 0x6d, 0x00, 0x85, 0x72, 0x85, 0x7a, 0x95, 0x43, + 0x85, 0x72, 0x85, 0x7a, 0x04, 0x26, 0x35, 0x43, + 0x85, 0x72, 0x85, 0x7a, 0x08, 0x26, 0x35, 0x43, + 0x85, 0x72, 0x85, 0x7a, 0xa5, 0x43, 0x85, 0x72, + 0x05, 0x7b, 0x2c, 0x43, 0x04, 0x73, 0x04, 0x7b, + 0x1c, 0x43, 0x3c, 0x00, 0x78, 0x10, 0x04, 0x00, + 0x04, 0x73, 0x04, 0x7b, 0x40, 0x25, 0x2c, 0x43, + 0x04, 0x73, 0x84, 0x7a, 0x23, 0x43, 0x83, 0x72, + 0x83, 0x7a, 0xab, 0x43, 0x83, 0x72, 0x03, 0x7b, + 0x80, 0x24, 0x23, 0x43, 0x03, 0x73, 0x08, 0x78, + 0x90, 0x43, 0x08, 0x70, 0x08, 0x78, 0x01, 0x22, + 0x10, 0x43, 0x08, 0x70, 0x08, 0x78, 0x04, 0x22, + 0x90, 0x43, 0x08, 0x70, 0x70, 0xbd, 0x00, 0x00, + 0x0c, 0x80, 0x07, 0x00, 0x3c, 0x00, 0xb4, 0x10, + 0x04, 0x00, 0x80, 0x80, 0x07, 0x00, 0x01, 0x49, + 0x04, 0x20, 0x48, 0x73, 0x70, 0x47, 0x40, 0x80, + 0x07, 0x00, 0x03, 0x49, 0x80, 0xb5, 0x00, 0x20, + 0x08, 0x80, 0x00, 0xf0, 0x0a, 0xfb, 0x80, 0xbd, + 0x00, 0x00, 0xfc, 0x6b, 0x01, 0x00, 0x70, 0x47, + 0x00, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x67, 0xfb, + 0x80, 0xbd, 0x80, 0xb5, 0x0a, 0x49, 0x18, 0x20, + 0xc1, 0xf7, 0x3b, 0xfa, 0x09, 0x49, 0x3c, 0x00, + 0xf0, 0x10, 0x04, 0x00, 0x02, 0x20, 0xc1, 0xf7, + 0x37, 0xfa, 0x08, 0x49, 0x1f, 0x20, 0xc1, 0xf7, + 0x33, 0xfa, 0x07, 0x49, 0x1c, 0x20, 0xc1, 0xf7, + 0x2f, 0xfa, 0x06, 0x49, 0x03, 0x20, 0xc1, 0xf7, + 0x2b, 0xfa, 0x80, 0xbd, 0x99, 0x2a, 0x00, 0x00, + 0x41, 0x25, 0x00, 0x00, 0x55, 0x25, 0x00, 0x00, + 0x5d, 0x25, 0x00, 0x00, 0x39, 0x25, 0x00, 0x00, + 0x80, 0xb5, 0xbf, 0xf7, 0x91, 0xfd, 0x80, 0xbd, + 0x3c, 0x00, 0x2c, 0x11, 0x04, 0x00, 0x80, 0xb5, + 0x05, 0x4a, 0x05, 0x49, 0x0a, 0x20, 0xbf, 0xf7, + 0x4e, 0xff, 0x01, 0x20, 0x04, 0x49, 0x80, 0x02, + 0x08, 0x60, 0x48, 0x60, 0x80, 0xbd, 0xb4, 0x74, + 0x01, 0x00, 0xb1, 0x64, 0x00, 0x00, 0x00, 0x10, + 0x07, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x91, 0xfe, + 0x80, 0xbd, 0x80, 0xb5, 0x05, 0x4a, 0x05, 0x49, + 0x1b, 0x20, 0xbf, 0xf7, 0x38, 0xff, 0x01, 0x20, + 0x04, 0x49, 0x3c, 0x00, 0x68, 0x11, 0x04, 0x00, + 0xc0, 0x06, 0x08, 0x60, 0x48, 0x60, 0x80, 0xbd, + 0xb8, 0x74, 0x01, 0x00, 0x2d, 0x6e, 0x00, 0x00, + 0x00, 0x10, 0x07, 0x00, 0x80, 0xb5, 0x04, 0x48, + 0x00, 0xf0, 0x80, 0xfe, 0x03, 0x49, 0x00, 0x20, + 0x48, 0x60, 0x88, 0x60, 0x80, 0xbd, 0x00, 0x00, + 0x41, 0x4b, 0x00, 0x00, 0xbc, 0x74, 0x01, 0x00, + 0x80, 0xb5, 0xc5, 0xf7, 0xd5, 0xfe, 0xce, 0xf7, + 0xd9, 0xf8, 0x03, 0x49, 0x3c, 0x00, 0xa4, 0x11, + 0x04, 0x00, 0x08, 0x60, 0x03, 0x49, 0x0a, 0x20, + 0xd1, 0xf7, 0xef, 0xf8, 0x80, 0xbd, 0xbc, 0x74, + 0x01, 0x00, 0x49, 0x6e, 0x00, 0x00, 0x80, 0xb5, + 0x01, 0x22, 0x20, 0x21, 0x06, 0x20, 0xc8, 0xf7, + 0x56, 0xfc, 0xbf, 0xf7, 0x70, 0xfe, 0x03, 0x49, + 0x00, 0x20, 0x08, 0x60, 0x20, 0x21, 0x02, 0x48, + 0xbf, 0xf7, 0x63, 0xf9, 0x80, 0xbd, 0xcc, 0x5c, + 0x01, 0x00, 0x64, 0x6d, 0x01, 0x00, 0x3c, 0x00, + 0xe0, 0x11, 0x04, 0x00, 0x08, 0x48, 0x80, 0xb5, + 0x00, 0x68, 0x00, 0x28, 0x05, 0xd0, 0x06, 0x48, + 0x54, 0x30, 0x42, 0x6a, 0x00, 0x21, 0xbf, 0xf7, + 0xf3, 0xf8, 0x04, 0x4a, 0x04, 0x49, 0x03, 0x20, + 0xbf, 0xf7, 0xac, 0xfd, 0x80, 0xbd, 0x00, 0x00, + 0x50, 0x6d, 0x01, 0x00, 0x89, 0x98, 0x00, 0x00, + 0x91, 0x98, 0x00, 0x00, 0x80, 0xb5, 0x00, 0xf0, + 0x03, 0xf8, 0x00, 0xf0, 0x19, 0xf8, 0x80, 0xbd, + 0x3c, 0x00, 0x1c, 0x12, 0x04, 0x00, 0x10, 0xb5, + 0x09, 0x4c, 0x60, 0x21, 0x20, 0x1c, 0xbf, 0xf7, + 0x3a, 0xf9, 0x00, 0x20, 0xc0, 0x43, 0xa0, 0x60, + 0x20, 0x60, 0xff, 0x20, 0x02, 0x30, 0xe0, 0x84, + 0x20, 0x22, 0x20, 0x1c, 0x40, 0x30, 0x02, 0x49, + 0xbf, 0xf7, 0x5b, 0xf9, 0x10, 0xbd, 0x00, 0x10, + 0x07, 0x00, 0x70, 0x52, 0x01, 0x00, 0x00, 0x20, + 0x0a, 0x49, 0xc0, 0x43, 0x88, 0x60, 0x09, 0x4b, + 0x0a, 0x49, 0x3c, 0x00, 0x58, 0x12, 0x04, 0x00, + 0x00, 0x20, 0x82, 0x00, 0x01, 0x30, 0x00, 0x06, + 0x00, 0x0e, 0x20, 0x28, 0x99, 0x50, 0xf8, 0xd3, + 0x06, 0x49, 0x04, 0x4a, 0x08, 0x1c, 0x10, 0x30, + 0x08, 0x3a, 0x03, 0xc2, 0x70, 0x47, 0x00, 0x00, + 0x00, 0x10, 0x07, 0x00, 0xe0, 0x7e, 0x01, 0x00, + 0x75, 0x75, 0x00, 0x00, 0x00, 0xa0, 0x07, 0x00, + 0x04, 0x48, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, + 0x0e, 0xc0, 0x0c, 0x38, 0x3c, 0x00, 0x94, 0x12, + 0x04, 0x00, 0x01, 0x21, 0x41, 0x60, 0x70, 0x47, + 0x00, 0x00, 0x70, 0x78, 0x01, 0x00, 0x70, 0x47, + 0x00, 0x00, 0x03, 0x48, 0x00, 0x21, 0x00, 0x22, + 0x00, 0x23, 0x0e, 0xc0, 0x08, 0xc0, 0x70, 0x47, + 0x00, 0x00, 0x88, 0x5a, 0x01, 0x00, 0x04, 0x49, + 0x80, 0xb5, 0x00, 0x20, 0x48, 0x61, 0x02, 0x48, + 0x40, 0x21, 0x1c, 0x30, 0xbf, 0xf7, 0xe9, 0xf8, + 0x80, 0xbd, 0xfc, 0x5a, 0x01, 0x00, 0x3c, 0x00, + 0xd0, 0x12, 0x04, 0x00, 0x80, 0xb5, 0xce, 0xf7, + 0x3f, 0xf8, 0x03, 0x49, 0x88, 0x61, 0x03, 0x49, + 0x03, 0x20, 0xd1, 0xf7, 0x55, 0xf8, 0x80, 0xbd, + 0xfc, 0x5a, 0x01, 0x00, 0x0d, 0x17, 0x01, 0x00, + 0x80, 0xb5, 0xc0, 0xf7, 0xa5, 0xf9, 0x80, 0xbd, + 0xfe, 0xb5, 0x6c, 0x49, 0x00, 0x20, 0x00, 0x90, + 0xc8, 0x78, 0x6b, 0x4c, 0x6b, 0x4f, 0x43, 0x07, + 0xc0, 0x06, 0xc0, 0x17, 0xdb, 0x0e, 0xe3, 0x58, + 0x3c, 0x00, 0x0c, 0x13, 0x04, 0x00, 0x01, 0x30, + 0x38, 0x62, 0x3b, 0x61, 0x08, 0x1c, 0x80, 0x78, + 0x66, 0x4e, 0x03, 0x22, 0x41, 0x07, 0xa0, 0x36, + 0x02, 0x96, 0x49, 0x0f, 0x31, 0x72, 0x89, 0x00, + 0x61, 0x58, 0x3c, 0x1c, 0x61, 0x61, 0x01, 0x91, + 0xc0, 0x06, 0xc0, 0x0f, 0x78, 0x62, 0x20, 0x1c, + 0x00, 0x27, 0x87, 0x61, 0x00, 0x20, 0x21, 0x1c, + 0xc8, 0x61, 0x59, 0x48, 0x59, 0x49, 0x00, 0x78, + 0x09, 0x79, 0x3c, 0x00, 0x48, 0x13, 0x04, 0x00, + 0x5a, 0x4c, 0x4e, 0x07, 0x76, 0x0f, 0x71, 0x1c, + 0x8c, 0x46, 0xb1, 0x00, 0x8e, 0x46, 0x56, 0x49, + 0x80, 0x31, 0x00, 0x28, 0x24, 0xd0, 0x52, 0x4f, + 0x01, 0x28, 0x7f, 0x78, 0x1a, 0xd0, 0x02, 0x28, + 0x71, 0xd1, 0x4f, 0x48, 0x00, 0x2f, 0x0c, 0xd0, + 0x01, 0x2f, 0x6c, 0xd1, 0x40, 0x79, 0x4d, 0x4d, + 0x40, 0x07, 0x40, 0x0f, 0x82, 0x00, 0xaa, 0x58, + 0x4b, 0x4d, 0x01, 0x30, 0x3c, 0x00, 0x84, 0x13, + 0x04, 0x00, 0xea, 0x61, 0xa0, 0x73, 0x04, 0x22, + 0x4b, 0x48, 0x48, 0x4d, 0xc8, 0x61, 0x4a, 0x48, + 0x00, 0x2f, 0x00, 0xd0, 0x4a, 0x48, 0x2f, 0x1c, + 0x11, 0xe0, 0x42, 0x48, 0x00, 0x2f, 0x55, 0xd1, + 0x07, 0x70, 0x02, 0x27, 0x47, 0x70, 0x3f, 0x48, + 0x40, 0x78, 0x00, 0x28, 0x10, 0xd0, 0x01, 0x28, + 0x01, 0xd0, 0x02, 0x28, 0x4a, 0xd1, 0x3f, 0x48, + 0x3d, 0x4f, 0xc8, 0x61, 0x3f, 0x48, 0x3c, 0x00, + 0xc0, 0x13, 0x04, 0x00, 0x88, 0x61, 0x3a, 0x49, + 0x70, 0x46, 0x08, 0x58, 0x35, 0x1c, 0xb8, 0x61, + 0x60, 0x46, 0x60, 0x73, 0x04, 0xe0, 0x3c, 0x48, + 0x02, 0x22, 0x88, 0x61, 0x3b, 0x48, 0xc8, 0x61, + 0x00, 0x20, 0x32, 0x49, 0x06, 0xe0, 0x0e, 0x18, + 0xb6, 0x78, 0x76, 0x07, 0x76, 0x0f, 0x04, 0x2e, + 0x2f, 0xd8, 0x01, 0x30, 0x90, 0x42, 0xf6, 0xd3, + 0xc8, 0x79, 0x2e, 0x4f, 0xc0, 0x07, 0xc0, 0x0f, + 0x3c, 0x00, 0xfc, 0x13, 0x04, 0x00, 0xf8, 0x60, + 0x33, 0x48, 0x41, 0x68, 0x19, 0x43, 0x41, 0x60, + 0x81, 0x68, 0x19, 0x43, 0x81, 0x60, 0x01, 0x9a, + 0xb9, 0x69, 0x8c, 0x46, 0x11, 0x43, 0xfa, 0x69, + 0x86, 0x68, 0x11, 0x43, 0x8e, 0x43, 0x86, 0x60, + 0x46, 0x68, 0x31, 0x43, 0x41, 0x60, 0x01, 0x99, + 0x0b, 0x43, 0x18, 0x1c, 0x61, 0x46, 0x08, 0x43, + 0x10, 0x43, 0x01, 0x1c, 0x00, 0x22, 0x02, 0x20, + 0xc7, 0xf7, 0x3c, 0x00, 0x38, 0x14, 0x04, 0x00, + 0x03, 0xfa, 0x1e, 0x4e, 0x40, 0x3e, 0x70, 0x78, + 0xc0, 0x08, 0xc0, 0x00, 0x28, 0x43, 0x70, 0x70, + 0x70, 0x1c, 0x01, 0x78, 0x00, 0xe0, 0x29, 0xe0, + 0x08, 0x25, 0xa9, 0x43, 0x01, 0x70, 0x01, 0x20, + 0xc0, 0x43, 0xb0, 0x80, 0x00, 0x21, 0x01, 0x20, + 0xcf, 0xf7, 0x6c, 0xfc, 0x30, 0x1c, 0x80, 0x30, + 0x81, 0x78, 0x09, 0x09, 0x09, 0x01, 0x81, 0x70, + 0x0f, 0x21, 0x01, 0x70, 0x3c, 0x00, 0x74, 0x14, + 0x04, 0x00, 0x16, 0x4a, 0x69, 0x04, 0x11, 0x60, + 0x51, 0x60, 0x02, 0x9e, 0x10, 0x21, 0x32, 0x7a, + 0x7b, 0x6a, 0x00, 0x2b, 0x00, 0xd1, 0x00, 0x21, + 0x11, 0x43, 0x21, 0x73, 0x81, 0x78, 0x29, 0x43, + 0x81, 0x70, 0xe0, 0x78, 0x01, 0x21, 0x08, 0x43, + 0xe0, 0x70, 0xd2, 0xf7, 0xf2, 0xf9, 0x01, 0x20, + 0x00, 0x90, 0x00, 0x98, 0xfe, 0xbd, 0xc0, 0x57, + 0x01, 0x00, 0x6c, 0x43, 0x01, 0x00, 0x3c, 0x00, + 0xb0, 0x14, 0x04, 0x00, 0xa4, 0x6c, 0x01, 0x00, + 0x40, 0x90, 0x07, 0x00, 0xc9, 0x1d, 0x00, 0x00, + 0x81, 0x1d, 0x00, 0x00, 0xa5, 0x1d, 0x00, 0x00, + 0x99, 0x1d, 0x00, 0x00, 0xf1, 0x1d, 0x00, 0x00, + 0x10, 0x00, 0x07, 0x00, 0x00, 0x10, 0x07, 0x00, + 0x03, 0x49, 0x00, 0x20, 0x88, 0x62, 0x08, 0x70, + 0x48, 0x70, 0x08, 0x71, 0x08, 0x62, 0x70, 0x47, + 0xac, 0x7e, 0x01, 0x00, 0x80, 0xb5, 0x01, 0x21, + 0x3c, 0x00, 0xec, 0x14, 0x04, 0x00, 0x00, 0x20, + 0xcd, 0xf7, 0x69, 0xff, 0x80, 0xbd, 0xb0, 0xb5, + 0x0f, 0x48, 0xc0, 0xf7, 0x18, 0xfc, 0x0e, 0x4d, + 0x03, 0x20, 0x28, 0x70, 0x0d, 0x49, 0x0d, 0x48, + 0x0c, 0x39, 0x48, 0x60, 0x0d, 0x48, 0x0a, 0x4c, + 0x88, 0x60, 0x40, 0x21, 0x18, 0x34, 0x20, 0x1c, + 0xbe, 0xf7, 0xc1, 0xff, 0xff, 0x21, 0x68, 0x68, + 0x09, 0x06, 0x08, 0x43, 0x20, 0x60, 0xff, 0x21, + 0x06, 0x22, 0x3c, 0x00, 0x28, 0x15, 0x04, 0x00, + 0x20, 0x1d, 0xbf, 0xf7, 0x79, 0xf8, 0x01, 0x20, + 0xe0, 0x60, 0xb0, 0xbd, 0xc0, 0xa8, 0x13, 0x0a, + 0x20, 0x6e, 0x01, 0x00, 0xc0, 0xa8, 0x13, 0x01, + 0xff, 0xff, 0xff, 0x00, 0x80, 0xb5, 0x02, 0x49, + 0x01, 0x20, 0xc8, 0xf7, 0x45, 0xff, 0x80, 0xbd, + 0x9d, 0x1c, 0x00, 0x00, 0x98, 0xb5, 0x0c, 0x4c, + 0x00, 0x20, 0x60, 0x60, 0xe0, 0x60, 0x0b, 0x4b, + 0x0b, 0x49, 0x82, 0x00, 0x3c, 0x00, 0x64, 0x15, + 0x04, 0x00, 0x01, 0x30, 0x20, 0x28, 0x99, 0x50, + 0xfa, 0xdb, 0x6a, 0x46, 0x09, 0x49, 0x05, 0x20, + 0xbf, 0xf7, 0x2f, 0xfd, 0x00, 0x20, 0xc0, 0x43, + 0x20, 0x60, 0x06, 0x49, 0x20, 0x20, 0x08, 0x60, + 0x48, 0x60, 0x98, 0xbd, 0x00, 0x00, 0x00, 0x40, + 0x07, 0x00, 0x30, 0x74, 0x01, 0x00, 0xa9, 0x75, + 0x00, 0x00, 0xb5, 0x9f, 0x00, 0x00, 0x00, 0x10, + 0x07, 0x00, 0x05, 0x49, 0x00, 0x20, 0x3c, 0x00, + 0xa0, 0x15, 0x04, 0x00, 0x08, 0x60, 0x05, 0x48, + 0x81, 0x78, 0x28, 0x22, 0x91, 0x43, 0x81, 0x70, + 0x81, 0x78, 0x11, 0x43, 0x81, 0x70, 0x70, 0x47, + 0x78, 0x6e, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, + 0x70, 0x47, 0x00, 0x00, 0x41, 0x48, 0x10, 0xb5, + 0x00, 0x68, 0x02, 0x21, 0x88, 0x43, 0x3f, 0x49, + 0x08, 0x60, 0x08, 0x1c, 0x00, 0x68, 0x02, 0x21, + 0x08, 0x43, 0x3c, 0x49, 0x08, 0x60, 0x3c, 0x48, + 0x3c, 0x00, 0xdc, 0x15, 0x04, 0x00, 0x40, 0x68, + 0x80, 0x21, 0x88, 0x43, 0x3a, 0x49, 0x48, 0x60, + 0x08, 0x1c, 0x00, 0x68, 0x80, 0x21, 0x08, 0x43, + 0x37, 0x49, 0x08, 0x60, 0x37, 0x48, 0x01, 0x7a, + 0x01, 0x24, 0x21, 0x43, 0x01, 0x72, 0x01, 0x7a, + 0x02, 0x22, 0x11, 0x43, 0x01, 0x72, 0x01, 0x7a, + 0x04, 0x22, 0x91, 0x43, 0x01, 0x72, 0x01, 0x7a, + 0x08, 0x22, 0x11, 0x43, 0x01, 0x72, 0x01, 0x7b, + 0x21, 0x43, 0x3c, 0x00, 0x18, 0x16, 0x04, 0x00, + 0x01, 0x73, 0x01, 0x7b, 0x02, 0x22, 0x11, 0x43, + 0x01, 0x73, 0x01, 0x7b, 0x04, 0x22, 0x11, 0x43, + 0x01, 0x73, 0x01, 0x7b, 0x08, 0x22, 0x11, 0x43, + 0x01, 0x73, 0x2e, 0x21, 0x41, 0x73, 0x81, 0x7b, + 0x38, 0x22, 0x91, 0x43, 0x28, 0x31, 0x81, 0x73, + 0x20, 0x21, 0x41, 0x74, 0x81, 0x7b, 0xc9, 0x08, + 0xc9, 0x00, 0x03, 0x31, 0x81, 0x73, 0x22, 0x21, + 0xc1, 0x73, 0x20, 0x49, 0x3c, 0x00, 0x54, 0x16, + 0x04, 0x00, 0x09, 0x7a, 0x41, 0x72, 0x1e, 0x49, + 0x49, 0x7a, 0x01, 0x74, 0x3c, 0x22, 0x02, 0x77, + 0x01, 0x1c, 0x10, 0x31, 0x4a, 0x73, 0x50, 0x23, + 0x8b, 0x73, 0x5a, 0x23, 0xcb, 0x73, 0x0d, 0x23, + 0x01, 0x1c, 0x20, 0x31, 0x0b, 0x70, 0x17, 0x4b, + 0x43, 0x84, 0x0e, 0x23, 0x4b, 0x70, 0x00, 0x21, + 0x41, 0x82, 0x30, 0x21, 0x01, 0x70, 0x05, 0x21, + 0x41, 0x70, 0x04, 0x21, 0x41, 0x71, 0x3c, 0x00, + 0x90, 0x16, 0x04, 0x00, 0x84, 0x71, 0xc4, 0x71, + 0x0c, 0x21, 0x01, 0x71, 0xf8, 0x21, 0x41, 0x80, + 0x0f, 0x49, 0xca, 0x72, 0x8a, 0x72, 0x03, 0x22, + 0x0a, 0x72, 0x09, 0x22, 0x4a, 0x72, 0x08, 0x22, + 0x0a, 0x73, 0x02, 0x7a, 0x40, 0x23, 0x1a, 0x43, + 0x02, 0x72, 0x4c, 0x73, 0xff, 0xf7, 0xa2, 0xfc, + 0x08, 0x48, 0x01, 0x78, 0x21, 0x43, 0x01, 0x70, + 0x10, 0xbd, 0x00, 0x00, 0xf0, 0x00, 0x07, 0x00, + 0x3c, 0x00, 0xcc, 0x16, 0x04, 0x00, 0xf4, 0x00, + 0x07, 0x00, 0x0c, 0x80, 0x07, 0x00, 0x76, 0x46, + 0x01, 0x00, 0x24, 0x09, 0x00, 0x00, 0x80, 0x80, + 0x07, 0x00, 0xa0, 0x80, 0x07, 0x00, 0x80, 0xb5, + 0x18, 0x21, 0x09, 0x48, 0xbe, 0xf7, 0xd7, 0xfe, + 0x08, 0x48, 0x00, 0x21, 0x3c, 0x38, 0x41, 0x60, + 0x81, 0x60, 0xc1, 0x60, 0x01, 0x61, 0x41, 0x61, + 0x81, 0x61, 0x01, 0x21, 0x01, 0x62, 0xff, 0xf7, + 0x5c, 0xff, 0x3c, 0x00, 0x08, 0x17, 0x04, 0x00, + 0xc0, 0xf7, 0x6c, 0xff, 0x80, 0xbd, 0x00, 0x00, + 0x24, 0x7e, 0x01, 0x00, 0xb0, 0xb5, 0x21, 0x48, + 0x00, 0x68, 0x40, 0x08, 0x1f, 0x49, 0x40, 0x00, + 0x08, 0x60, 0x08, 0x1c, 0x00, 0x68, 0x01, 0x21, + 0x08, 0x43, 0x1c, 0x49, 0x08, 0x60, 0x1c, 0x4a, + 0x10, 0x79, 0x01, 0x21, 0x08, 0x43, 0x10, 0x71, + 0x10, 0x79, 0x02, 0x21, 0x88, 0x43, 0x10, 0x71, + 0x00, 0xf0, 0x6c, 0xf8, 0x3c, 0x00, 0x44, 0x17, + 0x04, 0x00, 0x10, 0x7a, 0x01, 0x21, 0x08, 0x43, + 0x10, 0x72, 0x10, 0x7a, 0xfe, 0x21, 0x88, 0x43, + 0x0a, 0x30, 0x10, 0x72, 0x28, 0x20, 0x90, 0x72, + 0x5a, 0x20, 0xd0, 0x72, 0x11, 0x4d, 0x14, 0x20, + 0x28, 0x77, 0x2c, 0x1c, 0x10, 0x34, 0xa0, 0x73, + 0x16, 0x20, 0xa8, 0x75, 0x18, 0x20, 0xe8, 0x75, + 0xff, 0xf7, 0xa1, 0xfc, 0x0c, 0x48, 0x68, 0x86, + 0xe0, 0x7b, 0x40, 0x06, 0x40, 0x0e, 0x3c, 0x00, + 0x80, 0x17, 0x04, 0x00, 0x0e, 0x21, 0x08, 0x43, + 0xe0, 0x73, 0xe0, 0x7b, 0x80, 0x21, 0x08, 0x43, + 0xe0, 0x73, 0x07, 0x48, 0x41, 0x79, 0x04, 0x22, + 0x11, 0x43, 0x41, 0x71, 0xb0, 0xbd, 0x00, 0x00, + 0xf0, 0x00, 0x07, 0x00, 0x00, 0x80, 0x07, 0x00, + 0x30, 0x80, 0x07, 0x00, 0xff, 0x01, 0x00, 0x00, + 0x50, 0x00, 0x07, 0x00, 0x80, 0xb5, 0xff, 0xf7, + 0xaf, 0xff, 0x00, 0x20, 0x14, 0x49, 0xc0, 0x43, + 0x3c, 0x00, 0xbc, 0x17, 0x04, 0x00, 0x88, 0x60, + 0xc1, 0xf7, 0x0b, 0xf9, 0x13, 0x49, 0x00, 0x20, + 0x48, 0x62, 0xc8, 0x60, 0x48, 0x61, 0x08, 0x61, + 0x88, 0x61, 0xc8, 0x61, 0x0f, 0x4b, 0x08, 0x62, + 0x0f, 0x4a, 0x08, 0x63, 0x38, 0x33, 0x1a, 0x80, + 0x01, 0x22, 0x5a, 0x71, 0x0b, 0x4a, 0x40, 0x32, + 0xd0, 0x60, 0x13, 0x60, 0x08, 0x23, 0x13, 0x81, + 0x50, 0x60, 0x09, 0x4a, 0x8a, 0x62, 0xff, 0x22, + 0x0a, 0x70, 0x3c, 0x00, 0xf8, 0x17, 0x04, 0x00, + 0x48, 0x70, 0x05, 0x48, 0x00, 0x21, 0x00, 0x22, + 0x50, 0x30, 0x00, 0x23, 0x0e, 0xc0, 0xc1, 0xf7, + 0xff, 0xf8, 0x80, 0xbd, 0x00, 0x30, 0x07, 0x00, + 0x04, 0x6c, 0x01, 0x00, 0xbe, 0xba, 0x00, 0x00, + 0x85, 0x75, 0x00, 0x00, 0x03, 0x48, 0x10, 0x21, + 0x81, 0x71, 0x02, 0x21, 0xc1, 0x71, 0x30, 0x21, + 0x41, 0x72, 0x70, 0x47, 0x00, 0x80, 0x07, 0x00, + 0x70, 0x47, 0x00, 0x00, 0x3c, 0x00, 0x34, 0x18, + 0x04, 0x00, 0x00, 0xb5, 0xc1, 0xf7, 0xdb, 0xfb, + 0x00, 0xbd, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, + 0xcd, 0xf7, 0x87, 0xfd, 0x01, 0x49, 0x88, 0x60, + 0x80, 0xbd, 0x50, 0xd9, 0x01, 0x00, 0x80, 0xb5, + 0x06, 0x21, 0x05, 0x48, 0xbe, 0xf7, 0xfd, 0xfd, + 0x04, 0x49, 0x00, 0x20, 0x04, 0x39, 0x08, 0x60, + 0x00, 0xf0, 0x67, 0xf8, 0x00, 0xf0, 0x03, 0xf8, + 0x80, 0xbd, 0xec, 0x67, 0x01, 0x00, 0x3c, 0x00, + 0x70, 0x18, 0x04, 0x00, 0x10, 0xb5, 0x07, 0x4c, + 0x2c, 0x21, 0x20, 0x1c, 0xbe, 0xf7, 0x10, 0xfe, + 0x01, 0x20, 0x20, 0x70, 0x03, 0x49, 0x00, 0x20, + 0x1c, 0x39, 0xc8, 0x60, 0x08, 0x61, 0x88, 0x61, + 0x10, 0xbd, 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, + 0x80, 0xb5, 0xcd, 0xf7, 0x5d, 0xfd, 0x09, 0x49, + 0x88, 0x60, 0x09, 0x49, 0x08, 0x20, 0xd0, 0xf7, + 0x73, 0xfd, 0x08, 0x49, 0x09, 0x20, 0xd0, 0xf7, + 0x3c, 0x00, 0xac, 0x18, 0x04, 0x00, 0x6f, 0xfd, + 0x07, 0x49, 0x11, 0x20, 0xd0, 0xf7, 0x6b, 0xfd, + 0x06, 0x48, 0xc2, 0xf7, 0x74, 0xf9, 0x80, 0xbd, + 0x00, 0x00, 0x78, 0x69, 0x01, 0x00, 0x21, 0x35, + 0x00, 0x00, 0xa1, 0x38, 0x00, 0x00, 0x45, 0x34, + 0x00, 0x00, 0xbd, 0x26, 0x01, 0x00, 0x80, 0xb5, + 0x86, 0xb0, 0x0f, 0x48, 0xc4, 0xf7, 0x45, 0xf9, + 0x00, 0xf0, 0x45, 0xf8, 0xff, 0xf7, 0xd7, 0xff, + 0xff, 0xf7, 0x3c, 0x00, 0xe8, 0x18, 0x04, 0x00, + 0xab, 0xff, 0x0c, 0x49, 0x03, 0x20, 0xd0, 0xf7, + 0x4d, 0xfd, 0x0b, 0x48, 0x69, 0x46, 0x00, 0x90, + 0x00, 0x20, 0x01, 0x90, 0x09, 0x48, 0x04, 0x90, + 0x09, 0x48, 0x02, 0x90, 0x09, 0x48, 0x03, 0x90, + 0x09, 0x48, 0x05, 0x90, 0x00, 0x20, 0xc4, 0xf7, + 0xcf, 0xf8, 0x06, 0xb0, 0x80, 0xbd, 0x00, 0x00, + 0xf4, 0x67, 0x01, 0x00, 0x45, 0x35, 0x00, 0x00, + 0x95, 0x32, 0x00, 0x00, 0x3c, 0x00, 0x24, 0x19, + 0x04, 0x00, 0xa0, 0x7d, 0x01, 0x00, 0xfd, 0x32, + 0x00, 0x00, 0xcd, 0x31, 0x00, 0x00, 0x45, 0x7d, + 0x01, 0x00, 0x10, 0xb5, 0xcd, 0xf7, 0xd5, 0xfc, + 0x09, 0x48, 0x09, 0x4c, 0x30, 0x21, 0x60, 0x61, + 0x08, 0x48, 0x74, 0x30, 0xbe, 0xf7, 0xa9, 0xfd, + 0x00, 0x20, 0xa0, 0x62, 0x06, 0x49, 0x20, 0x61, + 0xe1, 0x63, 0x60, 0x64, 0xa0, 0x64, 0x14, 0x21, + 0x21, 0x65, 0x60, 0x62, 0x10, 0xbd, 0x3c, 0x00, + 0x60, 0x19, 0x04, 0x00, 0xb9, 0x75, 0x00, 0x00, + 0x44, 0x7d, 0x01, 0x00, 0x70, 0x17, 0x00, 0x00, + 0x80, 0xb5, 0x02, 0x21, 0x09, 0x20, 0x04, 0x4a, + 0xd1, 0xf7, 0xe8, 0xfe, 0xcd, 0xf7, 0xec, 0xfc, + 0x02, 0x49, 0x08, 0x63, 0x80, 0xbd, 0x00, 0x00, + 0x39, 0x39, 0x00, 0x00, 0x44, 0x7d, 0x01, 0x00, + 0x80, 0xb5, 0xac, 0x21, 0x03, 0x48, 0xbe, 0xf7, + 0x83, 0xfd, 0x00, 0xf0, 0x51, 0xf8, 0x00, 0xf0, + 0x3c, 0x00, 0x9c, 0x19, 0x04, 0x00, 0x49, 0xf8, + 0x80, 0xbd, 0xa4, 0x6c, 0x01, 0x00, 0x08, 0xb5, + 0x00, 0xf0, 0x4d, 0xf8, 0x00, 0xf0, 0x45, 0xf8, + 0x00, 0x21, 0x16, 0x20, 0x18, 0x4a, 0xd1, 0xf7, + 0xc8, 0xfe, 0x17, 0x4a, 0x04, 0x21, 0x10, 0x1c, + 0x40, 0x30, 0x01, 0x70, 0x00, 0x21, 0x81, 0x70, + 0x11, 0x21, 0xc1, 0x80, 0x14, 0x49, 0x01, 0x81, + 0x10, 0x1c, 0x80, 0x30, 0xc1, 0x78, 0x08, 0x22, + 0x91, 0x43, 0x3c, 0x00, 0xd8, 0x19, 0x04, 0x00, + 0xc1, 0x70, 0xc1, 0x78, 0x11, 0x43, 0xc1, 0x70, + 0x6a, 0x46, 0x0f, 0x49, 0x14, 0x20, 0xbf, 0xf7, + 0xf5, 0xfa, 0x0e, 0x49, 0x07, 0x20, 0xd0, 0xf7, + 0xcd, 0xfc, 0x0d, 0x49, 0x0f, 0x20, 0xd0, 0xf7, + 0xc9, 0xfc, 0xcd, 0xf7, 0xab, 0xfc, 0x0b, 0x49, + 0x08, 0x60, 0x0a, 0x48, 0x44, 0x38, 0x80, 0x68, + 0x00, 0x28, 0x02, 0xd0, 0x00, 0x20, 0xc6, 0xf7, + 0x6f, 0xf9, 0x08, 0xbd, 0x3c, 0x00, 0x14, 0x1a, + 0x04, 0x00, 0xb5, 0x3b, 0x00, 0x00, 0x00, 0x90, + 0x07, 0x00, 0xe7, 0xfd, 0x00, 0x00, 0x8d, 0x41, + 0x00, 0x00, 0xcd, 0x48, 0x00, 0x00, 0xd9, 0x49, + 0x00, 0x00, 0xa4, 0x6c, 0x01, 0x00, 0x80, 0xb5, + 0x00, 0xf0, 0x6f, 0xfc, 0x80, 0xbd, 0x70, 0x47, + 0x00, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x61, 0xfc, + 0x80, 0xbd, 0x70, 0x47, 0x00, 0x00, 0xb0, 0xb5, + 0x30, 0x21, 0x0c, 0x48, 0xbe, 0xf7, 0x3c, 0x00, + 0x50, 0x1a, 0x04, 0x00, 0x25, 0xfd, 0x0b, 0x4c, + 0x00, 0x25, 0x0a, 0x48, 0x84, 0x3c, 0x38, 0x22, + 0x03, 0x21, 0x70, 0x38, 0x65, 0x60, 0xbe, 0xf7, + 0xdd, 0xfd, 0x06, 0x48, 0x38, 0x22, 0x01, 0x21, + 0x38, 0x38, 0xbe, 0xf7, 0xd7, 0xfd, 0x0e, 0x20, + 0xa5, 0x60, 0x60, 0x70, 0x20, 0x70, 0x00, 0xf0, + 0x1d, 0xf8, 0xb0, 0xbd, 0x94, 0x67, 0x01, 0x00, + 0x04, 0x49, 0x00, 0xb5, 0x01, 0x20, 0x48, 0x60, + 0x3c, 0x00, 0x8c, 0x1a, 0x04, 0x00, 0x88, 0x60, + 0xc8, 0x60, 0xc3, 0xf7, 0xf8, 0xff, 0x00, 0xbd, + 0x00, 0x00, 0xd4, 0x67, 0x01, 0x00, 0x80, 0xb5, + 0x02, 0x21, 0x0a, 0x20, 0x02, 0x4a, 0xd1, 0xf7, + 0x50, 0xfe, 0x80, 0xbd, 0x00, 0x00, 0x1d, 0x5a, + 0x00, 0x00, 0x80, 0xb5, 0x00, 0xf0, 0x05, 0xf8, + 0x80, 0xbd, 0x80, 0xb5, 0x00, 0xf0, 0xfd, 0xfb, + 0x80, 0xbd, 0x80, 0xb5, 0x02, 0x49, 0x04, 0x20, + 0xd0, 0xf7, 0x3c, 0x00, 0xc8, 0x1a, 0x04, 0x00, + 0x61, 0xfc, 0x80, 0xbd, 0x65, 0x1f, 0x00, 0x00, + 0x00, 0x21, 0x17, 0x48, 0xc9, 0x43, 0x80, 0xb5, + 0x16, 0x4b, 0x01, 0x70, 0x18, 0x1c, 0x10, 0x22, + 0x20, 0x30, 0x02, 0x71, 0x00, 0x22, 0x10, 0x33, + 0x9a, 0x73, 0x42, 0x79, 0x04, 0x23, 0x1a, 0x43, + 0x42, 0x71, 0x42, 0x79, 0x18, 0x23, 0x9a, 0x43, + 0x08, 0x32, 0x42, 0x71, 0x08, 0x1c, 0xd7, 0xf7, + 0x59, 0xf8, 0x00, 0x28, 0x3c, 0x00, 0x04, 0x1b, + 0x04, 0x00, 0x03, 0xd1, 0x01, 0x21, 0x9a, 0x20, + 0xbf, 0xf7, 0xcb, 0xfb, 0x50, 0x20, 0x09, 0x49, + 0x50, 0x22, 0x0a, 0x60, 0xc8, 0x60, 0x88, 0x60, + 0x48, 0x60, 0x08, 0x61, 0x01, 0x20, 0x48, 0x61, + 0x00, 0x20, 0xd7, 0xf7, 0xd8, 0xf8, 0x04, 0x49, + 0xff, 0x20, 0x08, 0x60, 0x80, 0xbd, 0xf4, 0x6b, + 0x01, 0x00, 0x30, 0x00, 0x07, 0x00, 0x04, 0x02, + 0x07, 0x00, 0xf4, 0x74, 0x01, 0x00, 0x3c, 0x00, + 0x40, 0x1b, 0x04, 0x00, 0x80, 0xb5, 0xd7, 0xf7, + 0xfb, 0xf8, 0x80, 0xbd, 0x10, 0xb5, 0xff, 0xf7, + 0xab, 0xfb, 0xbf, 0xf7, 0xdd, 0xfb, 0x81, 0x48, + 0xcd, 0xf7, 0x98, 0xfa, 0x00, 0x24, 0x23, 0x1c, + 0x04, 0x22, 0x04, 0x21, 0x00, 0x20, 0x01, 0xf0, + 0x39, 0xfa, 0x00, 0x28, 0x01, 0xd0, 0xbf, 0xf7, + 0xc9, 0xfb, 0x23, 0x1c, 0x00, 0x22, 0xff, 0x21, + 0x00, 0x20, 0x01, 0xf0, 0x2f, 0xfa, 0x00, 0x28, + 0x3c, 0x00, 0x7c, 0x1b, 0x04, 0x00, 0x01, 0xd0, + 0xbf, 0xf7, 0xbf, 0xfb, 0x23, 0x1c, 0x00, 0x22, + 0xff, 0x21, 0x00, 0x20, 0x01, 0xf0, 0x25, 0xfa, + 0x00, 0x28, 0x01, 0xd0, 0xbf, 0xf7, 0xb5, 0xfb, + 0xc4, 0xf7, 0x27, 0xff, 0x70, 0x48, 0x84, 0x70, + 0x6f, 0x49, 0x7f, 0x20, 0x88, 0x70, 0x6e, 0x49, + 0x0c, 0x60, 0x03, 0x20, 0x08, 0x60, 0x6b, 0x48, + 0x44, 0x70, 0x6c, 0x48, 0x04, 0x80, 0x69, 0x48, + 0xc0, 0x78, 0x3c, 0x00, 0xb8, 0x1b, 0x04, 0x00, + 0x08, 0x21, 0x08, 0x43, 0x67, 0x49, 0xc8, 0x70, + 0x08, 0x1c, 0xc0, 0x78, 0x04, 0x21, 0x08, 0x43, + 0x64, 0x49, 0xc8, 0x70, 0x01, 0xf0, 0x7e, 0xfa, + 0xff, 0xf7, 0x7e, 0xff, 0xff, 0xf7, 0x2c, 0xfe, + 0x01, 0xf0, 0x46, 0xfb, 0xff, 0xf7, 0x18, 0xfb, + 0x01, 0xf0, 0x52, 0xfa, 0xff, 0xf7, 0x82, 0xfb, + 0x5f, 0x48, 0xc1, 0x68, 0x10, 0x22, 0x91, 0x43, + 0xc1, 0x60, 0x01, 0x69, 0x3c, 0x00, 0xf4, 0x1b, + 0x04, 0x00, 0x5d, 0x4a, 0x11, 0x43, 0x01, 0x61, + 0x01, 0x69, 0xd2, 0x0a, 0x91, 0x43, 0x01, 0x61, + 0xc1, 0x68, 0x5a, 0x4a, 0x11, 0x43, 0xc1, 0x60, + 0x81, 0x6a, 0x59, 0x4a, 0x11, 0x43, 0x81, 0x62, + 0x00, 0xf0, 0x77, 0xf9, 0x01, 0xf0, 0x1f, 0xf8, + 0x00, 0xf0, 0x93, 0xfa, 0x01, 0xf0, 0x99, 0xfb, + 0x00, 0xf0, 0xf1, 0xff, 0x00, 0xf0, 0x99, 0xfc, + 0x00, 0xf0, 0xdd, 0xfc, 0x00, 0xf0, 0x3c, 0x00, + 0x30, 0x1c, 0x04, 0x00, 0x83, 0xfc, 0xff, 0xf7, + 0xb3, 0xfc, 0x01, 0xf0, 0x31, 0xfa, 0x01, 0xf0, + 0x71, 0xfa, 0xff, 0xf7, 0x87, 0xfa, 0xff, 0xf7, + 0x9b, 0xfa, 0x01, 0x21, 0x01, 0x20, 0x4b, 0x4a, + 0xd1, 0xf7, 0x7c, 0xfd, 0x01, 0x21, 0x02, 0x20, + 0x49, 0x4a, 0xd1, 0xf7, 0x77, 0xfd, 0x02, 0x21, + 0x03, 0x20, 0x48, 0x4a, 0xd1, 0xf7, 0x72, 0xfd, + 0x02, 0x21, 0x04, 0x20, 0x46, 0x4a, 0xd1, 0xf7, + 0x3c, 0x00, 0x6c, 0x1c, 0x04, 0x00, 0x6d, 0xfd, + 0x02, 0x21, 0x05, 0x20, 0x45, 0x4a, 0xd1, 0xf7, + 0x68, 0xfd, 0x02, 0x21, 0x06, 0x20, 0x43, 0x4a, + 0xd1, 0xf7, 0x63, 0xfd, 0x01, 0x21, 0x07, 0x20, + 0x42, 0x4a, 0xd1, 0xf7, 0x5e, 0xfd, 0x02, 0x21, + 0x17, 0x20, 0x40, 0x4a, 0xd1, 0xf7, 0x59, 0xfd, + 0x02, 0x21, 0x08, 0x20, 0x3f, 0x4a, 0xd1, 0xf7, + 0x54, 0xfd, 0xff, 0xf7, 0xc8, 0xfd, 0x3d, 0x48, + 0x04, 0x60, 0x3c, 0x00, 0xa8, 0x1c, 0x04, 0x00, + 0x44, 0x60, 0xff, 0xf7, 0x17, 0xfa, 0xff, 0xf7, + 0x09, 0xfa, 0xff, 0xf7, 0x4f, 0xfc, 0x00, 0xf0, + 0x43, 0xf9, 0xff, 0xf7, 0x33, 0xfa, 0xff, 0xf7, + 0xfb, 0xfa, 0x01, 0xf0, 0x85, 0xf8, 0x01, 0xf0, + 0xeb, 0xf9, 0x01, 0xf0, 0x23, 0xfa, 0x01, 0xf0, + 0x71, 0xf9, 0x00, 0xf0, 0xe3, 0xff, 0xff, 0xf7, + 0x6f, 0xfa, 0x00, 0xf0, 0xaf, 0xf9, 0x00, 0xf0, + 0xbd, 0xf9, 0x00, 0xf0, 0x3c, 0x00, 0xe4, 0x1c, + 0x04, 0x00, 0xad, 0xfc, 0x00, 0xf0, 0x9b, 0xfe, + 0xff, 0xf7, 0xcd, 0xfa, 0xff, 0xf7, 0xab, 0xfe, + 0x00, 0xf0, 0xc3, 0xf9, 0xff, 0xf7, 0xab, 0xfd, + 0x00, 0xf0, 0x8d, 0xff, 0x00, 0xf0, 0x21, 0xff, + 0x00, 0xf0, 0x65, 0xf9, 0x00, 0xf0, 0x97, 0xf9, + 0x00, 0xf0, 0xfd, 0xfe, 0x00, 0xf0, 0xe5, 0xfe, + 0x00, 0xf0, 0x3f, 0xf9, 0x00, 0xf0, 0x73, 0xf9, + 0xff, 0xf7, 0x37, 0xfe, 0x00, 0xf0, 0x3c, 0x00, + 0x20, 0x1d, 0x04, 0x00, 0x21, 0xf9, 0x00, 0xf0, + 0x73, 0xfb, 0xff, 0xf7, 0xe5, 0xfb, 0x00, 0xf0, + 0xd3, 0xfb, 0xff, 0xf7, 0xa9, 0xfe, 0x00, 0xf0, + 0xbb, 0xfb, 0x00, 0xf0, 0x09, 0xff, 0x00, 0xf0, + 0xdb, 0xf9, 0x18, 0x48, 0xc9, 0xf7, 0x56, 0xf8, + 0x17, 0x48, 0xc9, 0xf7, 0x2b, 0xf8, 0x00, 0x22, + 0x01, 0x21, 0xf0, 0x20, 0xd1, 0xf7, 0x2e, 0xfd, + 0x00, 0x20, 0x10, 0xbd, 0xa9, 0x69, 0x00, 0x00, + 0x3c, 0x00, 0x5c, 0x1d, 0x04, 0x00, 0x00, 0x00, + 0x07, 0x00, 0xf0, 0x00, 0x07, 0x00, 0x2c, 0x00, + 0x07, 0x00, 0x00, 0x10, 0x07, 0x00, 0x3c, 0x00, + 0x08, 0x00, 0xc0, 0x3f, 0x74, 0x38, 0xfc, 0xdf, + 0x7f, 0x38, 0x55, 0x69, 0x00, 0x00, 0xe5, 0x13, + 0x00, 0x00, 0x61, 0x0c, 0x00, 0x00, 0x6d, 0x0c, + 0x00, 0x00, 0x3d, 0x0c, 0x00, 0x00, 0xf1, 0x0d, + 0x00, 0x00, 0xc5, 0x33, 0x00, 0x00, 0x3d, 0x0f, + 0x00, 0x00, 0x3c, 0x00, 0x98, 0x1d, 0x04, 0x00, + 0xad, 0xd8, 0x00, 0x00, 0x80, 0x00, 0x07, 0x00, + 0x50, 0x57, 0x01, 0x00, 0x04, 0x40, 0x01, 0x00, + 0x80, 0xb5, 0x01, 0xf0, 0xa9, 0xf9, 0x00, 0xf0, + 0xc9, 0xf8, 0xff, 0xf7, 0xc5, 0xfe, 0x01, 0xf0, + 0x03, 0xfb, 0x01, 0xf0, 0x93, 0xfa, 0xff, 0xf7, + 0xcb, 0xf9, 0x2c, 0x48, 0xff, 0xf7, 0xe8, 0xf9, + 0x00, 0xf0, 0xaa, 0xf8, 0x00, 0xf0, 0x58, 0xff, + 0xff, 0xf7, 0x34, 0xfd, 0x3c, 0x00, 0xd4, 0x1d, + 0x04, 0x00, 0xff, 0xf7, 0xf2, 0xfb, 0xff, 0xf7, + 0x7a, 0xfa, 0xff, 0xf7, 0x00, 0xfa, 0x00, 0xf0, + 0x34, 0xf9, 0x00, 0xf0, 0x3c, 0xf9, 0x01, 0xf0, + 0xe2, 0xf8, 0xff, 0xf7, 0x7a, 0xf9, 0xff, 0xf7, + 0x72, 0xf9, 0xff, 0xf7, 0x9a, 0xf9, 0x01, 0xf0, + 0x66, 0xf9, 0x01, 0xf0, 0x8e, 0xf9, 0x01, 0xf0, + 0xe0, 0xf8, 0x00, 0xf0, 0x06, 0xff, 0x00, 0xf0, + 0xf0, 0xfb, 0x00, 0xf0, 0x46, 0xfb, 0x3c, 0x00, + 0x10, 0x1e, 0x04, 0x00, 0x00, 0xf0, 0xbc, 0xff, + 0x00, 0xf0, 0xe4, 0xfc, 0x00, 0xf0, 0x20, 0xfe, + 0xff, 0xf7, 0x40, 0xfa, 0xff, 0xf7, 0x46, 0xfe, + 0xff, 0xf7, 0x56, 0xfd, 0x00, 0xf0, 0x2c, 0xf9, + 0x00, 0xf0, 0xfa, 0xfe, 0x00, 0xf0, 0x8a, 0xfe, + 0x00, 0xf0, 0xd4, 0xf8, 0x00, 0xf0, 0xb4, 0xf8, + 0x00, 0xf0, 0x78, 0xfe, 0x00, 0xf0, 0x4e, 0xfe, + 0x00, 0xf0, 0xde, 0xf8, 0xff, 0xf7, 0xac, 0xfd, + 0x3c, 0x00, 0x4c, 0x1e, 0x04, 0x00, 0x00, 0xf0, + 0x8c, 0xf8, 0x00, 0xf0, 0xf8, 0xfa, 0xff, 0xf7, + 0x76, 0xfb, 0xff, 0xf7, 0x20, 0xfe, 0x01, 0xf0, + 0xa6, 0xfa, 0x00, 0xf0, 0x48, 0xfb, 0x00, 0xf0, + 0x7c, 0xfe, 0x00, 0xf0, 0x5c, 0xf9, 0xbe, 0xf7, + 0x57, 0xfd, 0x00, 0x20, 0x80, 0xbd, 0x80, 0x38, + 0x01, 0x00, 0x01, 0x49, 0x00, 0x20, 0x08, 0x60, + 0x70, 0x47, 0xa8, 0x7e, 0x01, 0x00, 0x10, 0xb5, + 0x04, 0x1c, 0x3c, 0x00, 0x88, 0x1e, 0x04, 0x00, + 0x01, 0xd1, 0xbf, 0xf7, 0x39, 0xfa, 0x0f, 0x48, + 0x7d, 0x21, 0xc9, 0x00, 0x84, 0x60, 0x01, 0x80, + 0x0d, 0x49, 0x01, 0x61, 0x80, 0x21, 0x41, 0x80, + 0x00, 0x21, 0xc1, 0x60, 0x01, 0x62, 0x0b, 0x48, + 0x41, 0x80, 0x14, 0x21, 0x81, 0x80, 0x07, 0x21, + 0x41, 0x81, 0x06, 0x4a, 0x46, 0x23, 0x04, 0x32, + 0x05, 0x24, 0x13, 0x70, 0x54, 0x70, 0x0a, 0x21, + 0x91, 0x70, 0x81, 0x76, 0x3c, 0x00, 0xc4, 0x1e, + 0x04, 0x00, 0x03, 0x76, 0x04, 0x81, 0x10, 0xbd, + 0x00, 0x00, 0xc8, 0x74, 0x01, 0x00, 0x00, 0x87, + 0x93, 0x03, 0x30, 0x00, 0x07, 0x00, 0x09, 0x48, + 0x80, 0xb5, 0x01, 0x69, 0x42, 0x69, 0x11, 0x43, + 0x82, 0x69, 0xc0, 0x69, 0x11, 0x43, 0x01, 0x43, + 0x00, 0x22, 0x03, 0x20, 0xc6, 0xf7, 0xbf, 0xfc, + 0xcc, 0xf7, 0x1b, 0xfa, 0x00, 0x20, 0xc2, 0xf7, + 0x92, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x3c, 0x00, + 0x00, 0x1f, 0x04, 0x00, 0xa4, 0x6c, 0x01, 0x00, + 0x05, 0x48, 0x80, 0xb5, 0x00, 0x21, 0x81, 0x60, + 0x02, 0x21, 0xc1, 0x60, 0x03, 0x39, 0x41, 0x60, + 0xc7, 0xf7, 0x3a, 0xff, 0x80, 0xbd, 0x00, 0x00, + 0x40, 0x20, 0x07, 0x00, 0x08, 0xb5, 0x6a, 0x46, + 0x04, 0x49, 0x15, 0x20, 0xbf, 0xf7, 0x54, 0xf8, + 0x01, 0x20, 0x03, 0x49, 0x40, 0x05, 0x08, 0x60, + 0x48, 0x60, 0x08, 0xbd, 0xa5, 0x21, 0x01, 0x00, + 0x3c, 0x00, 0x3c, 0x1f, 0x04, 0x00, 0x00, 0x10, + 0x07, 0x00, 0x70, 0x47, 0x00, 0x00, 0x06, 0x48, + 0x80, 0xb5, 0x80, 0x68, 0xc0, 0x01, 0x80, 0x0f, + 0x05, 0xd1, 0x03, 0x22, 0xc1, 0x43, 0xc6, 0xf7, + 0xba, 0xfc, 0xd6, 0xf7, 0x00, 0xfe, 0x80, 0xbd, + 0x00, 0x00, 0x10, 0x00, 0x07, 0x00, 0x70, 0x47, + 0x00, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x2a, 0x20, + 0x06, 0x4a, 0xd1, 0xf7, 0xea, 0xfb, 0x00, 0x22, + 0x07, 0x20, 0x3c, 0x00, 0x78, 0x1f, 0x04, 0x00, + 0x04, 0x49, 0xbe, 0xf7, 0xed, 0xfe, 0x04, 0x48, + 0xc7, 0xf7, 0x58, 0xfc, 0x80, 0xbd, 0x00, 0x00, + 0x8d, 0x89, 0x00, 0x00, 0xd5, 0x9b, 0x00, 0x00, + 0x10, 0x46, 0x01, 0x00, 0x02, 0x48, 0x00, 0x21, + 0x00, 0x22, 0x00, 0x23, 0x0e, 0xc0, 0x70, 0x47, + 0x80, 0x6e, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, + 0x2c, 0x20, 0x06, 0x4a, 0xd1, 0xf7, 0xcc, 0xfb, + 0x00, 0x22, 0x00, 0x20, 0x3c, 0x00, 0xb4, 0x1f, + 0x04, 0x00, 0x04, 0x49, 0xbe, 0xf7, 0xcf, 0xfe, + 0x04, 0x49, 0x02, 0x20, 0xc8, 0xf7, 0x0b, 0xfa, + 0x80, 0xbd, 0x05, 0x8a, 0x00, 0x00, 0xe9, 0x9b, + 0x00, 0x00, 0xb1, 0x8b, 0x00, 0x00, 0x02, 0x48, + 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x0e, 0xc0, + 0x70, 0x47, 0x10, 0x75, 0x01, 0x00, 0x80, 0xb5, + 0x02, 0x21, 0x2b, 0x20, 0x04, 0x4a, 0xd1, 0xf7, + 0xae, 0xfb, 0x00, 0x22, 0x02, 0x20, 0x3c, 0x00, + 0xf0, 0x1f, 0x04, 0x00, 0x02, 0x49, 0xbe, 0xf7, + 0xb1, 0xfe, 0x80, 0xbd, 0x2d, 0x8a, 0x00, 0x00, + 0x8d, 0x8c, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x80, 0xb5, 0x02, 0x21, 0x2d, 0x20, 0x07, 0x4a, + 0xd1, 0xf7, 0x9c, 0xfb, 0x00, 0x22, 0x01, 0x20, + 0x05, 0x49, 0xbe, 0xf7, 0x9f, 0xfe, 0x05, 0x48, + 0xcb, 0xf7, 0x56, 0xfa, 0x04, 0x48, 0xcc, 0xf7, + 0xf7, 0xf8, 0x80, 0xbd, 0xad, 0x8a, 0x00, 0x00, + 0x3c, 0x00, 0x2c, 0x20, 0x04, 0x00, 0x21, 0xe2, + 0x00, 0x00, 0xf9, 0xdf, 0x00, 0x00, 0x20, 0x44, + 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x02, 0x49, + 0x00, 0x20, 0x08, 0x60, 0x01, 0x20, 0x48, 0x60, + 0x70, 0x47, 0xac, 0x79, 0x01, 0x00, 0x80, 0xb5, + 0x02, 0x49, 0x0d, 0x20, 0xd0, 0xf7, 0x9b, 0xf9, + 0x80, 0xbd, 0x61, 0x98, 0x00, 0x00, 0x70, 0x47, + 0x00, 0x00, 0x80, 0xb5, 0xcd, 0xf7, 0x77, 0xf9, + 0x03, 0x49, 0x3c, 0x00, 0x68, 0x20, 0x04, 0x00, + 0x08, 0x60, 0x01, 0x1c, 0x02, 0x48, 0xcd, 0xf7, + 0x97, 0xf9, 0x80, 0xbd, 0xa8, 0x79, 0x01, 0x00, + 0xc4, 0x60, 0x01, 0x00, 0x80, 0xb5, 0x00, 0xf0, + 0x29, 0xf8, 0x80, 0xbd, 0x80, 0xb5, 0x86, 0xb0, + 0x0c, 0x48, 0xc3, 0xf7, 0x6d, 0xfd, 0xd6, 0xf7, + 0xd3, 0xfb, 0x0b, 0x48, 0x0d, 0x49, 0x00, 0x90, + 0x0a, 0x48, 0x04, 0x91, 0x01, 0x90, 0x0a, 0x48, + 0x69, 0x46, 0x02, 0x90, 0x3c, 0x00, 0xa4, 0x20, + 0x04, 0x00, 0x00, 0x20, 0x03, 0x90, 0x05, 0x90, + 0x01, 0x20, 0xc3, 0xf7, 0x00, 0xfd, 0x07, 0x49, + 0x03, 0x20, 0xd0, 0xf7, 0x6a, 0xf9, 0x06, 0xb0, + 0x80, 0xbd, 0x20, 0xf7, 0x01, 0x00, 0x11, 0x87, + 0x01, 0x00, 0x95, 0x87, 0x01, 0x00, 0x55, 0x87, + 0x01, 0x00, 0x98, 0xd9, 0x01, 0x00, 0x6d, 0x87, + 0x01, 0x00, 0x80, 0xb5, 0x01, 0x20, 0xd6, 0xf7, + 0x90, 0xfc, 0x03, 0x49, 0x00, 0x20, 0x3c, 0x00, + 0xe0, 0x20, 0x04, 0x00, 0x08, 0x60, 0x48, 0x60, + 0x02, 0x48, 0x14, 0x39, 0x48, 0x60, 0x80, 0xbd, + 0x90, 0xd9, 0x01, 0x00, 0x3d, 0x82, 0x01, 0x00, + 0x70, 0xb5, 0x00, 0x26, 0x09, 0x4c, 0x09, 0x4d, + 0x26, 0x60, 0x66, 0x60, 0x44, 0x21, 0x50, 0x35, + 0x28, 0x1c, 0xa6, 0x61, 0xbe, 0xf7, 0xc8, 0xf9, + 0x14, 0x20, 0xe0, 0x60, 0xe8, 0x63, 0x28, 0x20, + 0xe8, 0x61, 0xa0, 0x60, 0x28, 0x64, 0x2e, 0x70, + 0x3c, 0x00, 0x1c, 0x21, 0x04, 0x00, 0x70, 0xbd, + 0x00, 0x00, 0xa4, 0x6e, 0x01, 0x00, 0x80, 0xb5, + 0x02, 0x21, 0x18, 0x20, 0x04, 0x4a, 0xd1, 0xf7, + 0x0c, 0xfb, 0x03, 0x49, 0x08, 0x20, 0xd0, 0xf7, + 0x2a, 0xf9, 0x80, 0xbd, 0x00, 0x00, 0x15, 0x9c, + 0x00, 0x00, 0x69, 0x9c, 0x00, 0x00, 0xfe, 0xb5, + 0x26, 0x4d, 0x28, 0x78, 0xc0, 0x07, 0x0c, 0xd4, + 0x25, 0x49, 0x00, 0x20, 0x08, 0x70, 0x28, 0x70, + 0x24, 0x48, 0x3c, 0x00, 0x58, 0x21, 0x04, 0x00, + 0x81, 0x78, 0x49, 0x08, 0x49, 0x00, 0x81, 0x70, + 0x81, 0x78, 0x01, 0x22, 0x11, 0x43, 0x81, 0x70, + 0x00, 0x24, 0xff, 0x26, 0x1f, 0x4f, 0x01, 0x36, + 0x21, 0x1c, 0x01, 0xa8, 0xc6, 0xf7, 0x32, 0xf8, + 0x00, 0xab, 0x18, 0x79, 0x01, 0x28, 0x1f, 0xd0, + 0x02, 0x28, 0x19, 0xd0, 0x03, 0x28, 0x1e, 0xd1, + 0xb8, 0x68, 0x00, 0x21, 0xb0, 0x43, 0xb8, 0x60, + 0x78, 0x68, 0x30, 0x43, 0x3c, 0x00, 0x94, 0x21, + 0x04, 0x00, 0x78, 0x60, 0x3a, 0x68, 0x32, 0x40, + 0xa0, 0x20, 0x05, 0xe0, 0x3b, 0x68, 0x33, 0x40, + 0x93, 0x42, 0x01, 0xd0, 0x01, 0x21, 0x01, 0xe0, + 0x01, 0x38, 0xf7, 0xd2, 0x78, 0x68, 0xb0, 0x43, + 0x78, 0x60, 0x00, 0x29, 0x03, 0xd0, 0x01, 0xa8, + 0x00, 0xf0, 0x27, 0xff, 0x02, 0xe0, 0x01, 0xa8, + 0x00, 0xf0, 0x45, 0xff, 0x01, 0x34, 0x24, 0x06, + 0x24, 0x16, 0x06, 0x2c, 0xcf, 0xdb, 0x3c, 0x00, + 0xd0, 0x21, 0x04, 0x00, 0x04, 0x49, 0x02, 0x22, + 0x08, 0x78, 0x10, 0x43, 0x08, 0x70, 0x28, 0x70, + 0xfe, 0xbd, 0x00, 0x00, 0x04, 0x00, 0x07, 0x00, + 0xe0, 0x60, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, + 0x10, 0x00, 0x07, 0x00, 0xb0, 0xb5, 0x00, 0x20, + 0x15, 0x23, 0x14, 0x49, 0x01, 0x25, 0x42, 0x00, + 0x8d, 0x54, 0x52, 0x18, 0x01, 0x30, 0x0e, 0x28, + 0x53, 0x70, 0xf8, 0xd3, 0x0f, 0x48, 0x1c, 0x22, + 0x3c, 0x00, 0x0c, 0x22, 0x04, 0x00, 0x1c, 0x38, + 0xbe, 0xf7, 0x73, 0xf9, 0x0d, 0x48, 0x0e, 0x21, + 0x2a, 0x38, 0xbe, 0xf7, 0x1c, 0xf9, 0x0b, 0x49, + 0x00, 0x20, 0x08, 0x60, 0x0b, 0x4c, 0x2a, 0x21, + 0x20, 0x1c, 0xbe, 0xf7, 0x14, 0xf9, 0x25, 0x70, + 0x0e, 0x20, 0x60, 0x70, 0x17, 0x20, 0xa0, 0x70, + 0x07, 0x48, 0x53, 0x21, 0x01, 0x70, 0x45, 0x21, + 0x41, 0x70, 0x20, 0x21, 0x81, 0x70, 0xb0, 0xbd, + 0x00, 0x00, 0x3c, 0x00, 0x48, 0x22, 0x04, 0x00, + 0xe6, 0x78, 0x01, 0x00, 0xe4, 0x62, 0x01, 0x00, + 0xeb, 0x62, 0x01, 0x00, 0xe8, 0x62, 0x01, 0x00, + 0x0c, 0x49, 0x0d, 0x48, 0x00, 0x22, 0x41, 0x60, + 0x0c, 0x49, 0x81, 0x60, 0x0c, 0x49, 0xc1, 0x60, + 0x0c, 0x49, 0x01, 0x61, 0x0c, 0x49, 0x41, 0x61, + 0x0c, 0x49, 0x82, 0x61, 0xc1, 0x61, 0x0c, 0x49, + 0x01, 0x62, 0x0c, 0x49, 0x41, 0x62, 0x0c, 0x49, + 0x81, 0x62, 0x0c, 0x49, 0x3c, 0x00, 0x84, 0x22, + 0x04, 0x00, 0xc1, 0x62, 0xc2, 0x63, 0x70, 0x47, + 0x00, 0x00, 0xc9, 0x75, 0x00, 0x00, 0x28, 0x7a, + 0x01, 0x00, 0xc1, 0x75, 0x00, 0x00, 0x81, 0x75, + 0x00, 0x00, 0x99, 0x75, 0x00, 0x00, 0xcd, 0x75, + 0x00, 0x00, 0x89, 0x75, 0x00, 0x00, 0x91, 0x75, + 0x00, 0x00, 0xb5, 0x75, 0x00, 0x00, 0x8d, 0x75, + 0x00, 0x00, 0xc5, 0x75, 0x00, 0x00, 0xb0, 0xb5, + 0x0e, 0x48, 0x0e, 0x49, 0x08, 0x60, 0x3c, 0x00, + 0xc0, 0x22, 0x04, 0x00, 0x08, 0x31, 0xc0, 0xf7, + 0x43, 0xfe, 0x0c, 0x49, 0x00, 0x25, 0x48, 0x60, + 0x0b, 0x48, 0x0a, 0x4c, 0x05, 0x60, 0x0b, 0x48, + 0x80, 0x3c, 0x05, 0x60, 0x10, 0x20, 0x20, 0x71, + 0xe0, 0x70, 0xa0, 0x71, 0x60, 0x71, 0x27, 0x20, + 0xc0, 0x43, 0xc3, 0xf7, 0xf7, 0xfb, 0x28, 0x20, + 0xc3, 0xf7, 0xfc, 0xfb, 0x25, 0x72, 0xb0, 0xbd, + 0xff, 0x3f, 0x00, 0x00, 0x2c, 0x7d, 0x01, 0x00, + 0x3c, 0x00, 0xfc, 0x22, 0x04, 0x00, 0x1c, 0x67, + 0x01, 0x00, 0x20, 0x67, 0x01, 0x00, 0x80, 0xb5, + 0x2c, 0x21, 0x01, 0x48, 0xbe, 0xf7, 0xc7, 0xf8, + 0x80, 0xbd, 0x3c, 0x7e, 0x01, 0x00, 0x80, 0xb5, + 0x38, 0x21, 0x01, 0x48, 0xbe, 0xf7, 0xbf, 0xf8, + 0x80, 0xbd, 0x68, 0x7e, 0x01, 0x00, 0x80, 0xb5, + 0x02, 0x21, 0x0e, 0x20, 0x02, 0x4a, 0xd1, 0xf7, + 0x0c, 0xfa, 0x80, 0xbd, 0x00, 0x00, 0x21, 0xe0, + 0x00, 0x00, 0x3c, 0x00, 0x38, 0x23, 0x04, 0x00, + 0x70, 0x47, 0x00, 0x00, 0xf0, 0xb5, 0x85, 0xb0, + 0x00, 0x27, 0x00, 0xab, 0x2f, 0x4e, 0x1f, 0x81, + 0x00, 0x25, 0x00, 0x24, 0x28, 0x1c, 0xd6, 0xf7, + 0xa1, 0xfb, 0x02, 0x2d, 0x03, 0xd1, 0xd6, 0xf7, + 0xf5, 0xfa, 0x00, 0x28, 0x0c, 0xd0, 0x01, 0x24, + 0x01, 0x2d, 0x03, 0xd1, 0x07, 0x20, 0x00, 0xab, + 0x18, 0x71, 0x01, 0xe0, 0x00, 0xab, 0x1f, 0x71, + 0x00, 0xab, 0x18, 0x79, 0x3c, 0x00, 0x74, 0x23, + 0x04, 0x00, 0xd6, 0xf7, 0x08, 0xfc, 0x00, 0x2c, + 0x39, 0xd0, 0x08, 0x21, 0x03, 0xa8, 0xd6, 0xf7, + 0xf2, 0xfa, 0x00, 0xab, 0x18, 0x7b, 0xfe, 0x28, + 0x31, 0xd1, 0x58, 0x7b, 0x01, 0x28, 0x2a, 0xd1, + 0x02, 0x21, 0x02, 0xa8, 0xd6, 0xf7, 0xe7, 0xfa, + 0x00, 0xab, 0x18, 0x89, 0x00, 0x28, 0x26, 0xd0, + 0x18, 0x89, 0x18, 0x49, 0x88, 0x42, 0x22, 0xd0, + 0x19, 0x89, 0x00, 0x20, 0xbf, 0xf7, 0x3c, 0x00, + 0xb0, 0x23, 0x04, 0x00, 0x13, 0xf9, 0x04, 0x1c, + 0x00, 0x69, 0x00, 0xab, 0x19, 0x89, 0xd6, 0xf7, + 0xd5, 0xfa, 0x20, 0x68, 0x00, 0xab, 0x1a, 0x89, + 0x01, 0x1c, 0x08, 0x31, 0x08, 0x3a, 0xcb, 0xf7, + 0xa1, 0xf9, 0x00, 0x28, 0x06, 0xd0, 0x02, 0x28, + 0x04, 0xd0, 0x02, 0x21, 0x94, 0x20, 0x37, 0x60, + 0xbe, 0xf7, 0x62, 0xff, 0x20, 0x1c, 0xbf, 0xf7, + 0xc7, 0xf8, 0xd4, 0xe7, 0x01, 0x21, 0x94, 0x20, + 0x3c, 0x00, 0xec, 0x23, 0x04, 0x00, 0xbe, 0xf7, + 0x5a, 0xff, 0xd5, 0xf7, 0x26, 0xff, 0x01, 0x35, + 0x2d, 0x06, 0x2d, 0x0e, 0x04, 0x2d, 0xa5, 0xd3, + 0x05, 0xb0, 0xf0, 0xbd, 0x00, 0x00, 0x58, 0x57, + 0x01, 0x00, 0xff, 0xff, 0x00, 0x00, 0x0a, 0x48, + 0x00, 0x21, 0x02, 0x1c, 0x18, 0x32, 0x80, 0xb5, + 0x09, 0x4b, 0x02, 0xe0, 0x01, 0x60, 0x83, 0x80, + 0x08, 0x30, 0x82, 0x42, 0xfa, 0xd1, 0x04, 0x48, + 0x6c, 0x21, 0x3c, 0x00, 0x28, 0x24, 0x04, 0x00, + 0x6c, 0x38, 0xbe, 0xf7, 0x37, 0xf8, 0x04, 0x49, + 0x02, 0x20, 0xc7, 0xf7, 0xd1, 0xff, 0x80, 0xbd, + 0x7c, 0x79, 0x01, 0x00, 0xfc, 0x05, 0x00, 0x00, + 0x9d, 0x75, 0x00, 0x00, 0x80, 0xb5, 0x02, 0x21, + 0x26, 0x20, 0x0d, 0x4a, 0xd1, 0xf7, 0x7c, 0xf9, + 0x0c, 0x48, 0xc8, 0xf7, 0x73, 0xff, 0x0c, 0x48, + 0xc8, 0xf7, 0x76, 0xff, 0x0b, 0x49, 0x10, 0x20, + 0xcf, 0xf7, 0x94, 0xff, 0x3c, 0x00, 0x64, 0x24, + 0x04, 0x00, 0x0a, 0x49, 0x0c, 0x20, 0xcf, 0xf7, + 0x90, 0xff, 0x09, 0x49, 0x00, 0x20, 0xc7, 0xf7, + 0xb2, 0xff, 0xcc, 0xf7, 0x6e, 0xff, 0x07, 0x49, + 0x08, 0x60, 0x80, 0xbd, 0x00, 0x00, 0x9d, 0xa6, + 0x00, 0x00, 0xa9, 0xa4, 0x00, 0x00, 0x81, 0xa4, + 0x00, 0x00, 0x31, 0xa7, 0x00, 0x00, 0xb9, 0x6d, + 0x00, 0x00, 0xbd, 0xa6, 0x00, 0x00, 0x0c, 0x79, + 0x01, 0x00, 0x02, 0x49, 0x08, 0x78, 0x3c, 0x00, + 0xa0, 0x24, 0x04, 0x00, 0x40, 0x08, 0x40, 0x00, + 0x08, 0x70, 0x70, 0x47, 0x58, 0x00, 0x07, 0x00, + 0x00, 0x21, 0x08, 0x48, 0x80, 0xb5, 0x41, 0x61, + 0x81, 0x61, 0x01, 0x70, 0x41, 0x70, 0x41, 0x60, + 0x81, 0x60, 0x14, 0x22, 0xc2, 0x60, 0x01, 0x61, + 0x42, 0x62, 0xc1, 0x61, 0xff, 0xf7, 0x04, 0xf8, + 0x80, 0xbd, 0x00, 0x00, 0x1c, 0x75, 0x01, 0x00, + 0x80, 0xb5, 0x02, 0x21, 0x1d, 0x20, 0x04, 0x4a, + 0x3c, 0x00, 0xdc, 0x24, 0x04, 0x00, 0xd1, 0xf7, + 0x34, 0xf9, 0x03, 0x49, 0x08, 0x20, 0xcf, 0xf7, + 0x52, 0xff, 0x80, 0xbd, 0x00, 0x00, 0x11, 0xe3, + 0x00, 0x00, 0x09, 0xe4, 0x00, 0x00, 0x80, 0xb5, + 0x01, 0x21, 0x25, 0x20, 0x0a, 0x4a, 0xd1, 0xf7, + 0x24, 0xf9, 0xcc, 0xf7, 0x28, 0xff, 0x08, 0x49, + 0x08, 0x62, 0x08, 0x49, 0x01, 0x20, 0xcf, 0xf7, + 0x3e, 0xff, 0x07, 0x49, 0x02, 0x20, 0xcf, 0xf7, + 0x3a, 0xff, 0x3c, 0x00, 0x18, 0x25, 0x04, 0x00, + 0xfe, 0xf7, 0xe6, 0xff, 0x05, 0x48, 0xc1, 0xf7, + 0xe1, 0xf9, 0x80, 0xbd, 0x29, 0xa9, 0x00, 0x00, + 0x1c, 0x75, 0x01, 0x00, 0xa1, 0xaa, 0x00, 0x00, + 0x2d, 0x19, 0x00, 0x00, 0x45, 0xa8, 0x00, 0x00, + 0x10, 0xb5, 0x06, 0x4c, 0x0c, 0x22, 0x22, 0x70, + 0xa0, 0x18, 0x05, 0x49, 0xbd, 0xf7, 0xd8, 0xff, + 0x00, 0x20, 0xc8, 0xf7, 0x85, 0xfb, 0x01, 0x20, + 0xa0, 0x60, 0x10, 0xbd, 0x3c, 0x00, 0x54, 0x25, + 0x04, 0x00, 0xa4, 0x69, 0x01, 0x00, 0x90, 0x57, + 0x01, 0x00, 0xb0, 0xb5, 0x1f, 0x4c, 0x00, 0x25, + 0x65, 0x80, 0x01, 0x20, 0x20, 0x70, 0x0a, 0x20, + 0xa0, 0x80, 0x90, 0x20, 0xe0, 0x80, 0x30, 0x20, + 0x20, 0x81, 0x90, 0x20, 0x60, 0x81, 0x30, 0x20, + 0xa0, 0x81, 0x17, 0x48, 0x04, 0x22, 0x07, 0x21, + 0x12, 0x30, 0xbe, 0xf7, 0x4c, 0xf8, 0x14, 0x48, + 0x04, 0x22, 0x05, 0x21, 0x16, 0x30, 0x3c, 0x00, + 0x90, 0x25, 0x04, 0x00, 0xbe, 0xf7, 0x46, 0xf8, + 0x12, 0x48, 0x11, 0x4a, 0xe0, 0x81, 0x20, 0x82, + 0x70, 0x32, 0x15, 0x70, 0x55, 0x70, 0x00, 0x20, + 0x3c, 0x23, 0x41, 0x01, 0x43, 0x43, 0x89, 0x18, + 0xf4, 0x31, 0x9b, 0x18, 0x01, 0x30, 0x04, 0x28, + 0x59, 0x60, 0xf5, 0xdb, 0x08, 0x48, 0x06, 0x22, + 0x1a, 0x30, 0x09, 0x49, 0xbd, 0xf7, 0x9a, 0xff, + 0x07, 0x48, 0x05, 0x4c, 0x0c, 0x30, 0x0f, 0xc8, + 0x3c, 0x00, 0xcc, 0x25, 0x04, 0x00, 0x20, 0x34, + 0x0f, 0xc4, 0x20, 0x21, 0x20, 0x1c, 0xbd, 0xf7, + 0x62, 0xff, 0xb0, 0xbd, 0x00, 0x00, 0xf8, 0x60, + 0x01, 0x00, 0x2c, 0x09, 0x00, 0x00, 0x58, 0x40, + 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x07, 0x48, + 0x10, 0xb5, 0x00, 0x68, 0x00, 0x28, 0x08, 0xd0, + 0x06, 0x48, 0xbe, 0xf7, 0x9c, 0xfe, 0x04, 0x1c, + 0xff, 0xf7, 0x9d, 0xfe, 0x20, 0x1c, 0xbe, 0xf7, + 0x96, 0xfe, 0x3c, 0x00, 0x08, 0x26, 0x04, 0x00, + 0x10, 0xbd, 0x00, 0x00, 0x58, 0x57, 0x01, 0x00, + 0xb5, 0xad, 0x00, 0x00, 0x04, 0x49, 0x80, 0xb5, + 0x00, 0x20, 0x88, 0x70, 0x02, 0x21, 0x20, 0x20, + 0x02, 0x4a, 0xd1, 0xf7, 0x91, 0xf8, 0x80, 0xbd, + 0xb4, 0x79, 0x01, 0x00, 0x25, 0xb5, 0x00, 0x00, + 0x80, 0xb5, 0xcc, 0xf7, 0x8f, 0xfe, 0x01, 0x49, + 0x48, 0x61, 0x80, 0xbd, 0xb4, 0x79, 0x01, 0x00, + 0x80, 0xb5, 0x18, 0x21, 0x3c, 0x00, 0x44, 0x26, + 0x04, 0x00, 0x14, 0x48, 0xbd, 0xf7, 0x29, 0xff, + 0x14, 0x48, 0x01, 0x21, 0x01, 0x70, 0x00, 0x21, + 0xc1, 0x60, 0x41, 0x70, 0x01, 0x61, 0x00, 0xf0, + 0x02, 0xf9, 0x00, 0xf0, 0xaa, 0xf8, 0x00, 0xf0, + 0x1e, 0xf8, 0x00, 0xf0, 0xba, 0xf9, 0x00, 0xf0, + 0xcc, 0xf9, 0x00, 0xf0, 0x20, 0xf9, 0x00, 0xf0, + 0x64, 0xf9, 0x00, 0xf0, 0xce, 0xf9, 0x00, 0xf0, + 0xfc, 0xf8, 0x00, 0xf0, 0x82, 0xf9, 0x3c, 0x00, + 0x80, 0x26, 0x04, 0x00, 0x00, 0xf0, 0x28, 0xf8, + 0x00, 0xf0, 0x6e, 0xf8, 0x00, 0xf0, 0x4a, 0xf8, + 0xff, 0xf7, 0xc2, 0xff, 0x00, 0xf0, 0x72, 0xf9, + 0x80, 0xbd, 0x00, 0x00, 0x40, 0x7c, 0x01, 0x00, + 0x18, 0x63, 0x01, 0x00, 0xb0, 0xb5, 0x08, 0x4c, + 0x00, 0x25, 0x08, 0x48, 0x25, 0x77, 0x20, 0x60, + 0xce, 0xf7, 0xf0, 0xfd, 0x00, 0x20, 0xe5, 0x62, + 0xd0, 0xf7, 0xd0, 0xfa, 0x21, 0x1f, 0x08, 0x80, + 0x3c, 0x00, 0xbc, 0x26, 0x04, 0x00, 0xd0, 0xf7, + 0x6c, 0xfb, 0xb0, 0xbd, 0x00, 0x00, 0xd4, 0x79, + 0x01, 0x00, 0x95, 0x75, 0x00, 0x00, 0x80, 0xb5, + 0xcc, 0xf7, 0xc1, 0xfc, 0x80, 0xbd, 0x05, 0x49, + 0x80, 0xb5, 0x00, 0x20, 0x08, 0x70, 0x48, 0x70, + 0x03, 0x48, 0x04, 0x49, 0x03, 0x4a, 0x08, 0x30, + 0xcc, 0xf7, 0x27, 0xfe, 0x80, 0xbd, 0x2c, 0x63, + 0x01, 0x00, 0xed, 0xbc, 0x00, 0x00, 0x4d, 0xbd, + 0x00, 0x00, 0x3c, 0x00, 0xf8, 0x26, 0x04, 0x00, + 0x80, 0xb5, 0xcc, 0xf7, 0x2b, 0xfe, 0x05, 0x49, + 0x48, 0x60, 0x01, 0x1c, 0x04, 0x48, 0xcc, 0xf7, + 0x4b, 0xfe, 0x04, 0x49, 0x03, 0x20, 0xcf, 0xf7, + 0x3d, 0xfe, 0x80, 0xbd, 0x2c, 0x63, 0x01, 0x00, + 0xc4, 0x60, 0x01, 0x00, 0xc1, 0xbc, 0x00, 0x00, + 0x04, 0x48, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, + 0x0e, 0xc0, 0x08, 0xc0, 0x02, 0x49, 0x10, 0x38, + 0x01, 0x60, 0x70, 0x47, 0x3c, 0x00, 0x34, 0x27, + 0x04, 0x00, 0x04, 0x7a, 0x01, 0x00, 0x1c, 0xe6, + 0x01, 0x00, 0x80, 0xb5, 0xcc, 0xf7, 0x09, 0xfe, + 0x05, 0x49, 0x05, 0x4a, 0x48, 0x60, 0x02, 0x21, + 0x24, 0x20, 0xd0, 0xf7, 0xfc, 0xff, 0x03, 0x48, + 0xc9, 0xf7, 0x6b, 0xfd, 0x80, 0xbd, 0x04, 0x7a, + 0x01, 0x00, 0x69, 0xbe, 0x00, 0x00, 0x71, 0xeb, + 0x00, 0x00, 0x10, 0xb5, 0x04, 0x4c, 0x14, 0x21, + 0x20, 0x1c, 0xbd, 0xf7, 0x96, 0xfe, 0x3c, 0x00, + 0x70, 0x27, 0x04, 0x00, 0x02, 0x48, 0x20, 0x60, + 0x10, 0xbd, 0x00, 0x00, 0x14, 0x7a, 0x01, 0x00, + 0xec, 0xe5, 0x01, 0x00, 0x80, 0xb5, 0xcc, 0xf7, + 0xe7, 0xfd, 0x07, 0x49, 0x07, 0x4a, 0x48, 0x60, + 0x02, 0x21, 0x1f, 0x20, 0xd0, 0xf7, 0xda, 0xff, + 0x05, 0x49, 0x01, 0x20, 0x08, 0x60, 0x05, 0x49, + 0x0c, 0x20, 0xcf, 0xf7, 0xf5, 0xfd, 0x80, 0xbd, + 0x14, 0x7a, 0x01, 0x00, 0xd5, 0xbf, 0x00, 0x00, + 0x3c, 0x00, 0xac, 0x27, 0x04, 0x00, 0x80, 0x5a, + 0x01, 0x00, 0x85, 0xff, 0x00, 0x00, 0x80, 0xb5, + 0xff, 0xf7, 0x4f, 0xfd, 0x01, 0x21, 0x21, 0x20, + 0x02, 0x4a, 0xd0, 0xf7, 0xc2, 0xff, 0x80, 0xbd, + 0x00, 0x00, 0xc9, 0xc1, 0x00, 0x00, 0x80, 0xb5, + 0xcc, 0xf7, 0xc1, 0xfd, 0x02, 0x49, 0x08, 0x63, + 0xc9, 0xf7, 0x57, 0xfd, 0x80, 0xbd, 0x28, 0x7a, + 0x01, 0x00, 0x10, 0xb5, 0xcc, 0xf7, 0xb7, 0xfd, + 0x16, 0x4c, 0x3c, 0x00, 0xe8, 0x27, 0x04, 0x00, + 0x20, 0x61, 0xcc, 0xf7, 0xb3, 0xfd, 0x60, 0x61, + 0x14, 0x48, 0x15, 0x49, 0x08, 0x60, 0x16, 0x49, + 0x14, 0x48, 0x08, 0x60, 0xcc, 0xf7, 0xaa, 0xfd, + 0x14, 0x49, 0x08, 0x60, 0x00, 0xf0, 0x34, 0xf8, + 0xff, 0xf7, 0xe0, 0xff, 0xff, 0xf7, 0x5e, 0xff, + 0x00, 0xf0, 0x04, 0xf9, 0x00, 0xf0, 0x8e, 0xf8, + 0xff, 0xf7, 0x6e, 0xff, 0xff, 0xf7, 0xb0, 0xff, + 0xff, 0xf7, 0x8c, 0xff, 0x3c, 0x00, 0x24, 0x28, + 0x04, 0x00, 0xff, 0xf7, 0x04, 0xff, 0x00, 0xf0, + 0xaa, 0xf8, 0x0a, 0x48, 0xbf, 0xf7, 0xbd, 0xff, + 0xc9, 0xf7, 0xbb, 0xfd, 0x09, 0x49, 0x00, 0x20, + 0xcf, 0xf7, 0xa7, 0xfd, 0x10, 0xbd, 0x40, 0x7c, + 0x01, 0x00, 0x7d, 0xb7, 0x00, 0x00, 0x18, 0x7e, + 0x01, 0x00, 0xbd, 0xb8, 0x00, 0x00, 0x1c, 0x7e, + 0x01, 0x00, 0x20, 0x7e, 0x01, 0x00, 0xb9, 0xba, + 0x00, 0x00, 0x81, 0x24, 0x01, 0x00, 0x3c, 0x00, + 0x60, 0x28, 0x04, 0x00, 0x80, 0xb5, 0x38, 0x21, + 0x01, 0x48, 0xbd, 0xf7, 0x19, 0xfe, 0x80, 0xbd, + 0x90, 0x5c, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, + 0xb0, 0xb5, 0x0c, 0x4c, 0x0b, 0x4d, 0x00, 0x20, + 0x0c, 0x34, 0x60, 0x60, 0x25, 0x60, 0xe0, 0x60, + 0x0a, 0x20, 0x20, 0x81, 0x28, 0x1c, 0xc8, 0xf7, + 0x3f, 0xfd, 0x28, 0x1c, 0xc8, 0xf7, 0x3a, 0xfd, + 0x08, 0x3d, 0x68, 0x60, 0x04, 0x48, 0xc9, 0xf7, + 0x3c, 0x00, 0x9c, 0x28, 0x04, 0x00, 0x1b, 0xfd, + 0x20, 0x1c, 0xc0, 0xf7, 0x6e, 0xfa, 0x28, 0x80, + 0xb0, 0xbd, 0xb8, 0x7a, 0x01, 0x00, 0xd5, 0x33, + 0x01, 0x00, 0xf8, 0xb5, 0x1f, 0x4e, 0x1d, 0x4c, + 0x00, 0x20, 0x0c, 0x21, 0x41, 0x43, 0x82, 0x00, + 0x01, 0x30, 0x09, 0x19, 0x08, 0x31, 0x00, 0x06, + 0x00, 0x0e, 0x04, 0x28, 0xb1, 0x50, 0xf4, 0xd3, + 0x18, 0x48, 0x0c, 0x38, 0x30, 0x61, 0xce, 0xf7, + 0xf4, 0xf9, 0x3c, 0x00, 0xd8, 0x28, 0x04, 0x00, + 0x14, 0x4c, 0xa0, 0x78, 0x00, 0x09, 0x00, 0x01, + 0xa0, 0x70, 0x00, 0x27, 0xe7, 0x70, 0x67, 0x70, + 0x00, 0x24, 0xa5, 0x00, 0x70, 0x59, 0x07, 0x70, + 0x20, 0x1c, 0xbe, 0xf7, 0x53, 0xf9, 0x71, 0x59, + 0x08, 0x71, 0x00, 0x21, 0x20, 0x1c, 0xce, 0xf7, + 0x7d, 0xf9, 0x01, 0x34, 0x24, 0x06, 0x24, 0x0e, + 0x04, 0x2c, 0xee, 0xd3, 0x07, 0x4c, 0x20, 0x78, + 0x00, 0x09, 0x00, 0x01, 0x3c, 0x00, 0x14, 0x29, + 0x04, 0x00, 0x0a, 0x30, 0x20, 0x70, 0x20, 0x78, + 0xf0, 0x21, 0x88, 0x43, 0x30, 0x30, 0x20, 0x70, + 0xa0, 0x78, 0x0f, 0x21, 0x08, 0x43, 0xa0, 0x70, + 0xf8, 0xbd, 0x00, 0x50, 0x07, 0x00, 0x10, 0x7b, + 0x01, 0x00, 0x80, 0xb5, 0xcc, 0xf7, 0x9f, 0xfb, + 0x80, 0xbd, 0xb0, 0xb5, 0x0c, 0x4c, 0x0b, 0x4d, + 0x00, 0x20, 0x0c, 0x34, 0x60, 0x60, 0x25, 0x60, + 0xe0, 0x60, 0x0a, 0x20, 0x20, 0x81, 0x3c, 0x00, + 0x50, 0x29, 0x04, 0x00, 0x28, 0x1c, 0xc8, 0xf7, + 0xe1, 0xfc, 0x28, 0x1c, 0xc8, 0xf7, 0xd4, 0xfc, + 0x08, 0x3d, 0x68, 0x60, 0x20, 0x1c, 0xc0, 0xf7, + 0x0d, 0xfa, 0x28, 0x80, 0x02, 0x48, 0xc9, 0xf7, + 0x9b, 0xfc, 0xb0, 0xbd, 0x2c, 0x7b, 0x01, 0x00, + 0x49, 0x00, 0x01, 0x00, 0x80, 0xb5, 0xca, 0xf7, + 0x2f, 0xf8, 0x80, 0xbd, 0x70, 0x47, 0x00, 0x00, + 0xb0, 0xb5, 0x12, 0x4d, 0x3c, 0x21, 0x28, 0x1c, + 0x3c, 0x00, 0x8c, 0x29, 0x04, 0x00, 0xbd, 0xf7, + 0x86, 0xfd, 0x0f, 0x48, 0x28, 0x21, 0x3c, 0x30, + 0xbd, 0xf7, 0x81, 0xfd, 0x0d, 0x48, 0x00, 0x21, + 0x14, 0x38, 0x01, 0x61, 0xc1, 0x60, 0xff, 0x21, + 0x01, 0x70, 0x41, 0x70, 0x0a, 0x49, 0x0a, 0x4a, + 0x41, 0x60, 0x01, 0x21, 0x0c, 0x20, 0xd0, 0xf7, + 0xc8, 0xfe, 0x2c, 0x1c, 0x30, 0x34, 0x0c, 0x3d, + 0x00, 0x20, 0xd0, 0xf7, 0x4a, 0xf9, 0x20, 0x80, + 0x0c, 0x3c, 0x3c, 0x00, 0xc8, 0x29, 0x04, 0x00, + 0xac, 0x42, 0xf8, 0xd1, 0xb0, 0xbd, 0x00, 0x00, + 0x60, 0x7b, 0x01, 0x00, 0x20, 0xa1, 0x07, 0x00, + 0x35, 0xcd, 0x00, 0x00, 0x08, 0x49, 0x00, 0x20, + 0x0c, 0x22, 0x42, 0x43, 0x52, 0x18, 0x10, 0x71, + 0x01, 0x30, 0x05, 0x28, 0xf8, 0xdb, 0x04, 0x48, + 0x00, 0x21, 0x08, 0x38, 0x01, 0x70, 0x41, 0x60, + 0xff, 0x21, 0x41, 0x70, 0x70, 0x47, 0x00, 0x00, + 0x74, 0x7a, 0x01, 0x00, 0x3c, 0x00, 0x04, 0x2a, + 0x04, 0x00, 0x80, 0xb5, 0x78, 0x21, 0x01, 0x48, + 0xbd, 0xf7, 0x47, 0xfd, 0x80, 0xbd, 0xc4, 0x7b, + 0x01, 0x00, 0x80, 0xb5, 0xca, 0xf7, 0x97, 0xfa, + 0x80, 0xbd, 0x70, 0x47, 0x00, 0x00, 0x10, 0xb5, + 0x0b, 0x4c, 0xff, 0x21, 0x05, 0x31, 0x20, 0x1c, + 0xbd, 0xf7, 0x37, 0xfd, 0x09, 0x48, 0xf0, 0x21, + 0x08, 0x51, 0x20, 0x1c, 0x40, 0x30, 0xc5, 0xf7, + 0x8e, 0xf9, 0x6c, 0x21, 0x06, 0x48, 0x3c, 0x00, + 0x40, 0x2a, 0x04, 0x00, 0xbd, 0xf7, 0x2c, 0xfd, + 0x04, 0x48, 0xc0, 0x21, 0x6c, 0x30, 0xbd, 0xf7, + 0x27, 0xfd, 0x10, 0xbd, 0xc4, 0x69, 0x01, 0x00, + 0xb0, 0xd9, 0x01, 0x00, 0xc8, 0x6a, 0x01, 0x00, + 0xb0, 0xb5, 0x0b, 0x4d, 0x00, 0x24, 0x1c, 0x20, + 0x60, 0x43, 0x40, 0x19, 0x6c, 0x30, 0xc3, 0xf7, + 0x0f, 0xfe, 0x01, 0x34, 0x04, 0x2c, 0xf6, 0xdb, + 0xcc, 0xf7, 0x6e, 0xfc, 0xa8, 0x63, 0xc7, 0xf7, + 0x3c, 0x00, 0x7c, 0x2a, 0x04, 0x00, 0x75, 0xf9, + 0x04, 0x48, 0xc9, 0xf7, 0x1c, 0xfc, 0x03, 0x48, + 0xcf, 0xf7, 0x03, 0xfa, 0xb0, 0xbd, 0xc4, 0x69, + 0x01, 0x00, 0xfd, 0x80, 0x00, 0x00, 0xe1, 0x22, + 0x01, 0x00, 0x10, 0xb5, 0x05, 0x4c, 0x00, 0x20, + 0x20, 0x80, 0x03, 0x48, 0x06, 0x21, 0x08, 0x30, + 0xbd, 0xf7, 0xd5, 0xfc, 0x14, 0x20, 0x60, 0x60, + 0x10, 0xbd, 0x98, 0x7c, 0x01, 0x00, 0x10, 0xb5, + 0x08, 0x4c, 0x3c, 0x00, 0xb8, 0x2a, 0x04, 0x00, + 0x00, 0x20, 0x20, 0x80, 0x60, 0x80, 0x06, 0x48, + 0x06, 0x21, 0x0c, 0x30, 0xbd, 0xf7, 0xc6, 0xfc, + 0x03, 0x48, 0x06, 0x21, 0x12, 0x30, 0xbd, 0xf7, + 0xc1, 0xfc, 0x14, 0x20, 0xa0, 0x60, 0x10, 0xbd, + 0x58, 0x7c, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x80, 0xb5, 0x02, 0x21, 0x0d, 0x20, 0x05, 0x4a, + 0xd0, 0xf7, 0x2e, 0xfe, 0x04, 0x48, 0xc8, 0xf7, + 0x1f, 0xfc, 0x04, 0x48, 0x3c, 0x00, 0xf4, 0x2a, + 0x04, 0x00, 0xca, 0xf7, 0x44, 0xfc, 0x80, 0xbd, + 0x00, 0x00, 0x31, 0xd4, 0x00, 0x00, 0x51, 0xb1, + 0x00, 0x00, 0x09, 0xb1, 0x00, 0x00, 0x08, 0x49, + 0x80, 0xb5, 0x00, 0x20, 0x08, 0x60, 0xff, 0xf7, + 0xd0, 0xff, 0xff, 0xf7, 0xc0, 0xff, 0xff, 0xf7, + 0x04, 0xfc, 0x00, 0xf0, 0x4a, 0xf8, 0xff, 0xf7, + 0x0a, 0xfc, 0x00, 0xf0, 0x3c, 0xf8, 0x80, 0xbd, + 0x00, 0x00, 0xe4, 0x65, 0x01, 0x00, 0x3c, 0x00, + 0x30, 0x2b, 0x04, 0x00, 0x80, 0xb5, 0x00, 0xf0, + 0x29, 0xf8, 0x00, 0xf0, 0x1b, 0xf8, 0x00, 0xf0, + 0x51, 0xf8, 0x00, 0xf0, 0x31, 0xf8, 0x80, 0xbd, + 0x70, 0x47, 0x00, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x80, 0xb5, 0xff, 0x21, 0x89, 0x31, 0x02, 0x48, + 0xbd, 0xf7, 0xa2, 0xfc, 0x80, 0xbd, 0x00, 0x00, + 0xdc, 0x71, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x49, + 0x08, 0x20, 0xcf, 0xf7, 0x11, 0xfc, 0x80, 0xbd, + 0x3c, 0x00, 0x6c, 0x2b, 0x04, 0x00, 0x59, 0xd9, + 0x00, 0x00, 0x80, 0xb5, 0x03, 0x48, 0xcf, 0xf7, + 0x4c, 0xf9, 0x02, 0x49, 0x48, 0x80, 0x80, 0xbd, + 0x00, 0x00, 0x8d, 0x1f, 0x00, 0x00, 0x98, 0x7c, + 0x01, 0x00, 0x80, 0xb5, 0x03, 0x48, 0xcf, 0xf7, + 0x40, 0xf9, 0x02, 0x49, 0x88, 0x80, 0x80, 0xbd, + 0x00, 0x00, 0xd5, 0x23, 0x00, 0x00, 0x58, 0x7c, + 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x80, 0xb5, + 0x02, 0x48, 0x3c, 0x00, 0xa8, 0x2b, 0x04, 0x00, + 0xca, 0xf7, 0xe4, 0xfb, 0x80, 0xbd, 0x00, 0x00, + 0x71, 0xe0, 0x00, 0x00, 0x80, 0xb5, 0xcc, 0xf7, + 0xa5, 0xfb, 0x02, 0x21, 0x0f, 0x20, 0x06, 0x4a, + 0xd0, 0xf7, 0xc2, 0xfd, 0x14, 0x21, 0x05, 0x48, + 0xbd, 0xf7, 0x68, 0xfc, 0x03, 0x48, 0x78, 0x21, + 0x14, 0x30, 0xbd, 0xf7, 0x63, 0xfc, 0x80, 0xbd, + 0x35, 0xe2, 0x00, 0x00, 0x84, 0x66, 0x01, 0x00, + 0x80, 0xb5, 0xcc, 0xf7, 0x3c, 0x00, 0xe4, 0x2b, + 0x04, 0x00, 0xb7, 0xfb, 0x05, 0x49, 0x08, 0x61, + 0x05, 0x49, 0x0e, 0x20, 0xcf, 0xf7, 0xcd, 0xfb, + 0x04, 0x49, 0x08, 0x20, 0xcf, 0xf7, 0xc9, 0xfb, + 0x80, 0xbd, 0xec, 0x65, 0x01, 0x00, 0x01, 0x02, + 0x01, 0x00, 0xc1, 0x2e, 0x00, 0x00, 0x01, 0x49, + 0x00, 0x20, 0x08, 0x70, 0x70, 0x47, 0x40, 0xd9, + 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x01, 0x49, + 0x00, 0x20, 0x08, 0x70, 0x70, 0x47, 0x3c, 0x00, + 0x20, 0x2c, 0x04, 0x00, 0xa0, 0x79, 0x01, 0x00, + 0x80, 0xb5, 0x07, 0x48, 0xc8, 0xf7, 0xf2, 0xff, + 0x06, 0x49, 0x48, 0x60, 0x06, 0x48, 0xc0, 0xf7, + 0x07, 0xfb, 0x06, 0x48, 0xc0, 0xf7, 0x86, 0xfb, + 0x05, 0x48, 0xc9, 0xf7, 0xa3, 0xfa, 0x80, 0xbd, + 0xa9, 0xe4, 0x00, 0x00, 0xa0, 0x79, 0x01, 0x00, + 0xb9, 0xe4, 0x00, 0x00, 0x85, 0x2e, 0x00, 0x00, + 0x81, 0xe4, 0x00, 0x00, 0x07, 0x48, 0x80, 0xb5, + 0x3c, 0x00, 0x5c, 0x2c, 0x04, 0x00, 0x00, 0x21, + 0x00, 0x22, 0x00, 0x23, 0x0e, 0xc0, 0x08, 0xc0, + 0x10, 0x38, 0xc8, 0x21, 0x01, 0x60, 0x00, 0x21, + 0x0c, 0x38, 0x02, 0x4a, 0xcc, 0xf7, 0x61, 0xfb, + 0x80, 0xbd, 0xd0, 0x60, 0x01, 0x00, 0xfd, 0xe5, + 0x00, 0x00, 0x80, 0xb5, 0xcc, 0xf7, 0x67, 0xfb, + 0x04, 0x49, 0x08, 0x60, 0x01, 0x1c, 0x02, 0x48, + 0x04, 0x30, 0xcc, 0xf7, 0x86, 0xfb, 0x80, 0xbd, + 0x00, 0x00, 0x3c, 0x00, 0x98, 0x2c, 0x04, 0x00, + 0xc0, 0x60, 0x01, 0x00, 0x09, 0x48, 0x80, 0xb5, + 0x0a, 0x21, 0x01, 0x70, 0x41, 0x70, 0x08, 0x49, + 0x08, 0x4a, 0x81, 0x60, 0x00, 0x21, 0xc1, 0x60, + 0x52, 0x79, 0x82, 0x70, 0x01, 0x61, 0x41, 0x61, + 0x28, 0x21, 0x18, 0x30, 0xbd, 0xf7, 0xee, 0xfb, + 0x80, 0xbd, 0x00, 0x00, 0x7c, 0x78, 0x01, 0x00, + 0xa0, 0x86, 0x01, 0x00, 0x0c, 0x5a, 0x01, 0x00, + 0xf8, 0xb5, 0x0f, 0x49, 0x3c, 0x00, 0xd4, 0x2c, + 0x04, 0x00, 0x0f, 0x48, 0x0d, 0x88, 0x4f, 0x88, + 0x06, 0x79, 0x00, 0x24, 0x30, 0x1b, 0x68, 0x43, + 0x68, 0x23, 0x0c, 0x49, 0x58, 0x43, 0x41, 0x18, + 0x7d, 0x20, 0xc0, 0x00, 0xbd, 0xf7, 0x0f, 0xfd, + 0x61, 0x00, 0x09, 0x4a, 0xa6, 0x42, 0x50, 0x52, + 0x00, 0xd1, 0x3d, 0x1c, 0x01, 0x34, 0x24, 0x06, + 0x24, 0x0e, 0x10, 0x2c, 0xea, 0xd3, 0x05, 0x49, + 0x01, 0x20, 0x08, 0x61, 0xf8, 0xbd, 0x3c, 0x00, + 0x10, 0x2d, 0x04, 0x00, 0xf6, 0x59, 0x01, 0x00, + 0x0c, 0x5a, 0x01, 0x00, 0x34, 0x44, 0x0f, 0x00, + 0x12, 0x5a, 0x01, 0x00, 0x7c, 0x78, 0x01, 0x00, + 0x80, 0xb5, 0x00, 0xf0, 0xe7, 0xfa, 0x02, 0x49, + 0x01, 0x20, 0x08, 0x61, 0x80, 0xbd, 0x00, 0x00, + 0x7c, 0x78, 0x01, 0x00, 0x10, 0xb5, 0x04, 0x1c, + 0x08, 0x1c, 0x0f, 0x49, 0x49, 0x79, 0x00, 0x29, + 0x01, 0xd1, 0x0e, 0x4b, 0x00, 0xe0, 0x0e, 0x4b, + 0x3c, 0x00, 0x4c, 0x2d, 0x04, 0x00, 0x00, 0x2c, + 0x07, 0xd0, 0x04, 0x21, 0x11, 0x80, 0x0a, 0x1c, + 0x01, 0x24, 0x19, 0x1c, 0xbd, 0xf7, 0xcd, 0xfb, + 0x0a, 0xe0, 0x01, 0x24, 0x01, 0x1c, 0x18, 0x1c, + 0x12, 0x88, 0xbd, 0xf7, 0xc6, 0xfb, 0x00, 0xf0, + 0xc4, 0xfa, 0x05, 0x49, 0x01, 0x20, 0x08, 0x61, + 0x20, 0x1c, 0x10, 0xbd, 0x00, 0x00, 0x0c, 0x5a, + 0x01, 0x00, 0xfe, 0x59, 0x01, 0x00, 0xfa, 0x59, + 0x01, 0x00, 0x3c, 0x00, 0x88, 0x2d, 0x04, 0x00, + 0x7c, 0x78, 0x01, 0x00, 0x0d, 0x48, 0x8c, 0xb5, + 0xc1, 0x88, 0x00, 0xab, 0x0c, 0x4a, 0x99, 0x80, + 0x01, 0x89, 0x04, 0x20, 0xd9, 0x80, 0x18, 0x80, + 0x02, 0x21, 0x13, 0x20, 0xd0, 0xf7, 0xd0, 0xfc, + 0x00, 0xf0, 0xa6, 0xfa, 0x07, 0x49, 0x01, 0x20, + 0x08, 0x61, 0xff, 0xf7, 0x8d, 0xff, 0x6a, 0x46, + 0x01, 0xa9, 0x00, 0x20, 0xff, 0xf7, 0xbc, 0xff, + 0x8c, 0xbd, 0x00, 0x00, 0x3c, 0x00, 0xc4, 0x2d, + 0x04, 0x00, 0xf4, 0x59, 0x01, 0x00, 0x95, 0xf9, + 0x00, 0x00, 0x7c, 0x78, 0x01, 0x00, 0xf8, 0xb5, + 0x13, 0x4e, 0x01, 0x25, 0xb5, 0x70, 0x05, 0x20, + 0xf0, 0x70, 0x11, 0x49, 0x10, 0x48, 0x0e, 0xc9, + 0x2c, 0x30, 0x0e, 0xc0, 0x00, 0x20, 0x70, 0x61, + 0x0f, 0x48, 0x0f, 0x49, 0x10, 0x4f, 0x00, 0x24, + 0x48, 0x60, 0xa0, 0x00, 0x39, 0x58, 0x20, 0x1c, + 0xd1, 0xf7, 0xd7, 0xf8, 0x01, 0x34, 0x3c, 0x00, + 0x00, 0x2e, 0x04, 0x00, 0x10, 0x2c, 0xf7, 0xd3, + 0x06, 0x4c, 0x0b, 0x4a, 0x20, 0x34, 0x20, 0x1c, + 0x0a, 0x49, 0xb5, 0x60, 0xcc, 0xf7, 0x92, 0xfa, + 0xcc, 0xf7, 0x9e, 0xfa, 0x30, 0x61, 0x20, 0x60, + 0xf8, 0xbd, 0x00, 0x00, 0x64, 0x73, 0x01, 0x00, + 0xb0, 0x58, 0x01, 0x00, 0x04, 0x18, 0x02, 0x00, + 0x60, 0x00, 0x07, 0x00, 0xd4, 0x44, 0x01, 0x00, + 0x45, 0xfa, 0x00, 0x00, 0x71, 0xfa, 0x00, 0x00, + 0x3c, 0x00, 0x3c, 0x2e, 0x04, 0x00, 0x0c, 0x49, + 0x30, 0xb5, 0x00, 0x23, 0xcc, 0x56, 0x0b, 0x4b, + 0x00, 0x20, 0xf0, 0x25, 0x1a, 0x5c, 0x11, 0x07, + 0x09, 0x0f, 0x09, 0x19, 0x0f, 0x29, 0x01, 0xdd, + 0x0f, 0x21, 0x02, 0xe0, 0x00, 0x29, 0x00, 0xda, + 0x00, 0x21, 0x2a, 0x40, 0x51, 0x18, 0x19, 0x54, + 0x01, 0x30, 0x0e, 0x28, 0xee, 0xdb, 0x30, 0xbd, + 0x00, 0x00, 0x64, 0x73, 0x01, 0x00, 0xc0, 0x58, + 0x01, 0x00, 0x3c, 0x00, 0x78, 0x2e, 0x04, 0x00, + 0xb0, 0xb5, 0x0d, 0x1c, 0x00, 0x28, 0x08, 0xd0, + 0x01, 0x24, 0x14, 0x80, 0x05, 0x20, 0xcc, 0xf7, + 0xb5, 0xf8, 0x80, 0x03, 0xc0, 0x0f, 0x28, 0x70, + 0x07, 0xe0, 0x28, 0x78, 0x01, 0x22, 0x41, 0x04, + 0x52, 0x04, 0x05, 0x20, 0xd0, 0xf7, 0xae, 0xfd, + 0x01, 0x24, 0x20, 0x1c, 0xb0, 0xbd, 0x00, 0x00, + 0x98, 0xb5, 0x05, 0x4c, 0x60, 0x68, 0xcc, 0xf7, + 0xf5, 0xfd, 0x00, 0x90, 0x3c, 0x00, 0xb4, 0x2e, + 0x04, 0x00, 0x00, 0xab, 0x18, 0x88, 0xe0, 0x80, + 0xce, 0xf7, 0xfb, 0xff, 0x98, 0xbd, 0xa0, 0x58, + 0x01, 0x00, 0x38, 0xb5, 0x03, 0x1c, 0x08, 0x1c, + 0x00, 0x24, 0x00, 0x2b, 0x17, 0x4d, 0x07, 0xd0, + 0x0e, 0x21, 0x11, 0x80, 0x0a, 0x1c, 0x01, 0x24, + 0x29, 0x1c, 0xbd, 0xf7, 0x0c, 0xfb, 0x22, 0xe0, + 0x11, 0x88, 0x04, 0x29, 0x17, 0xd1, 0x01, 0x1c, + 0x68, 0x46, 0x12, 0x88, 0xbd, 0xf7, 0x3c, 0x00, + 0xf0, 0x2e, 0x04, 0x00, 0x03, 0xfb, 0x00, 0x98, + 0x00, 0x28, 0x01, 0xdb, 0x32, 0x30, 0x00, 0xe0, + 0x32, 0x38, 0x00, 0x90, 0x01, 0x1c, 0x64, 0x20, + 0xbd, 0xf7, 0x98, 0xfb, 0x01, 0x06, 0x09, 0x16, + 0x00, 0x90, 0x0e, 0x22, 0x28, 0x1c, 0xbd, 0xf7, + 0x85, 0xfb, 0x06, 0xe0, 0x0e, 0x29, 0x05, 0xd1, + 0x0a, 0x1c, 0x01, 0x1c, 0x28, 0x1c, 0xbd, 0xf7, + 0xe9, 0xfa, 0x01, 0x24, 0x20, 0x1c, 0x38, 0xbd, + 0x3c, 0x00, 0x2c, 0x2f, 0x04, 0x00, 0xda, 0x59, + 0x01, 0x00, 0x38, 0xb5, 0x03, 0x1c, 0x08, 0x1c, + 0x00, 0x24, 0x00, 0x2b, 0x17, 0x4d, 0x07, 0xd0, + 0x0e, 0x21, 0x11, 0x80, 0x0a, 0x1c, 0x01, 0x24, + 0x29, 0x1c, 0xbd, 0xf7, 0xd6, 0xfa, 0x22, 0xe0, + 0x11, 0x88, 0x04, 0x29, 0x17, 0xd1, 0x01, 0x1c, + 0x68, 0x46, 0x12, 0x88, 0xbd, 0xf7, 0xcd, 0xfa, + 0x00, 0x98, 0x00, 0x28, 0x01, 0xdb, 0x32, 0x30, + 0x00, 0xe0, 0x3c, 0x00, 0x68, 0x2f, 0x04, 0x00, + 0x32, 0x38, 0x00, 0x90, 0x01, 0x1c, 0x64, 0x20, + 0xbd, 0xf7, 0x62, 0xfb, 0x01, 0x06, 0x09, 0x16, + 0x00, 0x90, 0x0e, 0x22, 0x28, 0x1c, 0xbd, 0xf7, + 0x4f, 0xfb, 0x06, 0xe0, 0x0e, 0x29, 0x05, 0xd1, + 0x0a, 0x1c, 0x01, 0x1c, 0x28, 0x1c, 0xbd, 0xf7, + 0xb3, 0xfa, 0x01, 0x24, 0x20, 0x1c, 0x38, 0xbd, + 0xcc, 0x59, 0x01, 0x00, 0x03, 0x48, 0x80, 0xb5, + 0x01, 0x78, 0x00, 0x20, 0x3c, 0x00, 0xa4, 0x2f, + 0x04, 0x00, 0xcc, 0xf7, 0xb4, 0xfb, 0x80, 0xbd, + 0x00, 0x00, 0xa6, 0x58, 0x01, 0x00, 0x70, 0x47, + 0x00, 0x00, 0x02, 0x49, 0x03, 0x20, 0x08, 0x70, + 0x00, 0x20, 0x48, 0x70, 0x70, 0x47, 0x9c, 0x73, + 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, 0x11, 0x20, + 0x02, 0x4a, 0xd0, 0xf7, 0xbc, 0xfb, 0x80, 0xbd, + 0x00, 0x00, 0xa1, 0xfe, 0x00, 0x00, 0xf0, 0xb5, + 0x0b, 0x4f, 0x1c, 0x1c, 0x00, 0x23, 0x3c, 0x00, + 0xe0, 0x2f, 0x04, 0x00, 0xfd, 0x56, 0x2b, 0x1c, + 0x06, 0x2d, 0x01, 0xd1, 0x01, 0x20, 0xf0, 0xbd, + 0x06, 0x4e, 0x05, 0x1c, 0xd8, 0x00, 0x34, 0x36, + 0x35, 0x54, 0x80, 0x19, 0x41, 0x70, 0x82, 0x70, + 0x44, 0x60, 0x58, 0x1c, 0x38, 0x70, 0x00, 0x20, + 0xf0, 0xbd, 0x00, 0x00, 0x98, 0x5a, 0x01, 0x00, + 0x10, 0xb5, 0x04, 0x1c, 0x0c, 0x48, 0x00, 0xf0, + 0x21, 0xf9, 0x60, 0x78, 0xff, 0x28, 0x04, 0xd0, + 0x3c, 0x00, 0x1c, 0x30, 0x04, 0x00, 0x01, 0x23, + 0xe0, 0x56, 0x06, 0x21, 0x00, 0xf0, 0xcd, 0xf8, + 0x08, 0x4a, 0x01, 0x21, 0x10, 0x78, 0x08, 0x43, + 0x07, 0x49, 0x08, 0x70, 0x20, 0x23, 0x18, 0x43, + 0x08, 0x70, 0x80, 0x23, 0x18, 0x43, 0x10, 0x70, + 0x08, 0x70, 0x10, 0xbd, 0x00, 0x00, 0x91, 0x9b, + 0x00, 0x00, 0xe0, 0x60, 0x01, 0x00, 0x04, 0x00, + 0x07, 0x00, 0x10, 0xb5, 0x0a, 0x49, 0x04, 0x1c, + 0x08, 0x78, 0x3c, 0x00, 0x58, 0x30, 0x04, 0x00, + 0x40, 0x08, 0x40, 0x00, 0x08, 0x70, 0x08, 0x49, + 0x08, 0x70, 0x08, 0x48, 0x00, 0xf0, 0xf8, 0xf8, + 0x60, 0x78, 0xff, 0x28, 0x04, 0xd0, 0x01, 0x23, + 0xe0, 0x56, 0x05, 0x21, 0x00, 0xf0, 0xa4, 0xf8, + 0x10, 0xbd, 0x00, 0x00, 0xe0, 0x60, 0x01, 0x00, + 0x04, 0x00, 0x07, 0x00, 0x91, 0x9b, 0x00, 0x00, + 0x03, 0x48, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, + 0x0e, 0xc0, 0x08, 0xc0, 0x3c, 0x00, 0x94, 0x30, + 0x04, 0x00, 0x70, 0x47, 0x00, 0x00, 0xe8, 0x60, + 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, 0x10, 0xb5, + 0x07, 0x4c, 0x00, 0x20, 0x60, 0x60, 0x20, 0x80, + 0xe0, 0x60, 0x02, 0x21, 0x14, 0x20, 0x04, 0x4a, + 0xd0, 0xf7, 0x49, 0xfb, 0x02, 0x48, 0x10, 0x30, + 0xa0, 0x60, 0x10, 0xbd, 0x00, 0x00, 0x58, 0x75, + 0x01, 0x00, 0x05, 0x1d, 0x01, 0x00, 0x70, 0x47, + 0x00, 0x00, 0x10, 0xb5, 0x48, 0x21, 0x3c, 0x00, + 0xd0, 0x30, 0x04, 0x00, 0x0a, 0x48, 0xbd, 0xf7, + 0xe3, 0xf9, 0x09, 0x4c, 0xe0, 0x21, 0x48, 0x34, + 0x20, 0x1c, 0xbd, 0xf7, 0xdd, 0xf9, 0x00, 0x20, + 0xc1, 0x00, 0x09, 0x19, 0x0a, 0x1c, 0x08, 0x32, + 0x01, 0x30, 0x1b, 0x28, 0x4a, 0x60, 0xf7, 0xd3, + 0x01, 0x48, 0x04, 0x38, 0x04, 0x60, 0x10, 0xbd, + 0x68, 0x5b, 0x01, 0x00, 0x80, 0xb5, 0x02, 0x21, + 0x23, 0x20, 0x02, 0x4a, 0xd0, 0xf7, 0x1e, 0xfb, + 0x3c, 0x00, 0x0c, 0x31, 0x04, 0x00, 0x80, 0xbd, + 0x00, 0x00, 0x45, 0x23, 0x01, 0x00, 0x80, 0xb5, + 0xff, 0xf7, 0x6b, 0xf8, 0x80, 0xbd, 0x70, 0x47, + 0x00, 0x00, 0xf8, 0xb5, 0x01, 0x20, 0x1d, 0x49, + 0xc0, 0x07, 0x48, 0x60, 0x1d, 0x49, 0xff, 0x20, + 0x08, 0x73, 0x1c, 0x4e, 0x10, 0x20, 0x30, 0x60, + 0x05, 0x01, 0x35, 0x60, 0x1b, 0x4c, 0x80, 0x21, + 0x20, 0x1c, 0xbd, 0xf7, 0xac, 0xf9, 0x00, 0x21, + 0x19, 0x4a, 0x3c, 0x00, 0x48, 0x31, 0x04, 0x00, + 0x15, 0x4f, 0x00, 0x20, 0x0b, 0x01, 0x1b, 0x19, + 0x5a, 0x60, 0xcb, 0x00, 0xdb, 0x19, 0x18, 0x74, + 0x01, 0x31, 0x08, 0x29, 0xf6, 0xdb, 0x0f, 0x4c, + 0xfa, 0x21, 0x21, 0x80, 0x12, 0x49, 0x61, 0x80, + 0xa0, 0x60, 0x6a, 0x46, 0x11, 0x49, 0x04, 0x20, + 0xbd, 0xf7, 0x30, 0xff, 0x6a, 0x46, 0x10, 0x49, + 0x08, 0x20, 0xbd, 0xf7, 0x2b, 0xff, 0x10, 0x20, + 0x70, 0x60, 0x75, 0x60, 0x3c, 0x00, 0x84, 0x31, + 0x04, 0x00, 0x60, 0x68, 0x02, 0x21, 0x08, 0x43, + 0x60, 0x60, 0x0b, 0x49, 0x06, 0x4a, 0x08, 0x1c, + 0x10, 0x30, 0x08, 0x3a, 0x03, 0xc2, 0xf8, 0xbd, + 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x60, + 0x07, 0x00, 0x00, 0x10, 0x07, 0x00, 0xac, 0x73, + 0x01, 0x00, 0xd1, 0x75, 0x00, 0x00, 0x20, 0x4e, + 0x00, 0x00, 0x05, 0x2c, 0x01, 0x00, 0x11, 0x2c, + 0x01, 0x00, 0x00, 0xa0, 0x07, 0x00, 0x3c, 0x00, + 0xc0, 0x31, 0x04, 0x00, 0x70, 0xb5, 0x0e, 0x1c, + 0x00, 0x24, 0xc4, 0xf7, 0x5b, 0xfe, 0x00, 0x28, + 0x3b, 0xd0, 0x45, 0x68, 0xff, 0x2d, 0x38, 0xd0, + 0x0c, 0x2e, 0x28, 0xd2, 0x01, 0xa3, 0x9b, 0x5d, + 0x5b, 0x00, 0x9f, 0x44, 0x05, 0x07, 0x09, 0x0b, + 0x0d, 0x10, 0x13, 0x16, 0x18, 0x1b, 0x1e, 0x21, + 0x18, 0x24, 0x20, 0xe0, 0x30, 0x24, 0x1e, 0xe0, + 0x60, 0x24, 0x1c, 0xe0, 0xc0, 0x24, 0x1a, 0xe0, + 0x3c, 0x00, 0xfc, 0x31, 0x04, 0x00, 0xff, 0x24, + 0x81, 0x34, 0x17, 0xe0, 0x09, 0x24, 0xa4, 0x01, + 0x14, 0xe0, 0x09, 0x24, 0xe4, 0x01, 0x11, 0xe0, + 0x0f, 0x4c, 0x0f, 0xe0, 0x09, 0x24, 0x24, 0x02, + 0x0c, 0xe0, 0x09, 0x24, 0x64, 0x02, 0x09, 0xe0, + 0x03, 0x24, 0xe4, 0x02, 0x06, 0xe0, 0x09, 0x24, + 0xa4, 0x02, 0x03, 0xe0, 0x09, 0x21, 0x9e, 0x20, + 0xbe, 0xf7, 0x39, 0xf8, 0x60, 0x00, 0x00, 0x19, + 0x40, 0x08, 0x3c, 0x00, 0x38, 0x32, 0x04, 0x00, + 0x05, 0x49, 0x80, 0x04, 0x40, 0x18, 0x05, 0x4a, + 0xa9, 0x00, 0x89, 0x18, 0x48, 0x60, 0x64, 0x20, + 0x60, 0x43, 0x70, 0xbd, 0xdc, 0x07, 0x00, 0x00, + 0x80, 0x38, 0x01, 0x00, 0x04, 0x00, 0x07, 0x00, + 0x02, 0x49, 0x80, 0xb5, 0x08, 0x60, 0xd0, 0xf7, + 0x97, 0xf8, 0x80, 0xbd, 0x5c, 0x5b, 0x01, 0x00, + 0xf8, 0xb5, 0x00, 0x26, 0x17, 0x4c, 0x17, 0x4b, + 0x19, 0x49, 0x26, 0x70, 0x3c, 0x00, 0x74, 0x32, + 0x04, 0x00, 0x00, 0x20, 0x14, 0x33, 0x0d, 0x88, + 0x15, 0x4e, 0x15, 0x4a, 0x04, 0xe0, 0xc1, 0x00, + 0xcf, 0x18, 0x7a, 0x60, 0x5e, 0x50, 0x01, 0x30, + 0xa8, 0x42, 0xf8, 0xdb, 0xc6, 0xf7, 0x2b, 0xfd, + 0xff, 0x21, 0x11, 0x4d, 0xa5, 0x31, 0x28, 0x1c, + 0xbd, 0xf7, 0xff, 0xf8, 0x00, 0x21, 0x28, 0x1c, + 0x02, 0x1c, 0x14, 0x32, 0xc2, 0x60, 0x10, 0x1c, + 0x01, 0x31, 0x14, 0x29, 0xf8, 0xdb, 0x3c, 0x00, + 0xb0, 0x32, 0x04, 0x00, 0x00, 0x26, 0xc6, 0x60, + 0x05, 0x48, 0x0c, 0x30, 0x60, 0xc0, 0x09, 0x48, + 0x18, 0x21, 0xbd, 0xf7, 0xed, 0xf8, 0x01, 0x20, + 0x04, 0x34, 0x41, 0xc4, 0x00, 0x20, 0xf8, 0xbd, + 0x70, 0x5d, 0x01, 0x00, 0x09, 0xa0, 0x00, 0x00, + 0x30, 0xd9, 0x01, 0x00, 0x56, 0x57, 0x01, 0x00, + 0x04, 0x5f, 0x01, 0x00, 0xa8, 0x60, 0x01, 0x00, + 0x80, 0xb5, 0x00, 0x20, 0xcf, 0xf7, 0xb6, 0xfc, + 0x3c, 0x00, 0xec, 0x32, 0x04, 0x00, 0x01, 0x49, + 0x08, 0x80, 0x80, 0xbd, 0x00, 0x00, 0x2c, 0x74, + 0x01, 0x00, 0x11, 0x48, 0xf8, 0xb5, 0x41, 0x79, + 0x00, 0x29, 0x02, 0xd1, 0x05, 0x78, 0x0f, 0x4e, + 0x01, 0xe0, 0x45, 0x78, 0x0f, 0x4e, 0x02, 0x23, + 0xf7, 0x5e, 0x00, 0x24, 0x60, 0x1b, 0x78, 0x43, + 0x64, 0x23, 0x0c, 0x49, 0x58, 0x43, 0x41, 0x18, + 0x7d, 0x20, 0xc0, 0x00, 0xbd, 0xf7, 0xf5, 0xf9, + 0x61, 0x00, 0x3c, 0x00, 0x28, 0x33, 0x04, 0x00, + 0x09, 0x4a, 0xac, 0x42, 0x50, 0x52, 0x01, 0xd1, + 0x00, 0x23, 0xf7, 0x5e, 0x01, 0x34, 0x24, 0x06, + 0x24, 0x0e, 0x10, 0x2c, 0xe9, 0xd3, 0xf8, 0xbd, + 0x0c, 0x5a, 0x01, 0x00, 0xfe, 0x59, 0x01, 0x00, + 0xfa, 0x59, 0x01, 0x00, 0x34, 0x44, 0x0f, 0x00, + 0x32, 0x5a, 0x01, 0x00, 0x38, 0xb5, 0x10, 0x4c, + 0xbe, 0x25, 0x25, 0x73, 0x20, 0x7a, 0x18, 0x21, + 0x88, 0x43, 0x20, 0x72, 0x3c, 0x00, 0x64, 0x33, + 0x04, 0x00, 0x6a, 0x46, 0x0d, 0x49, 0x0d, 0x20, + 0xbd, 0xf7, 0x33, 0xfe, 0x01, 0x20, 0x0b, 0x49, + 0x40, 0x03, 0x08, 0x60, 0x48, 0x60, 0x25, 0x73, + 0x2d, 0x20, 0xc0, 0x03, 0x20, 0x60, 0x25, 0x73, + 0x20, 0x7a, 0x10, 0x21, 0x08, 0x43, 0x20, 0x72, + 0x06, 0x48, 0x06, 0x49, 0x08, 0x60, 0x00, 0x20, + 0x48, 0x60, 0x38, 0xbd, 0x00, 0x00, 0x00, 0x03, + 0x07, 0x00, 0x8d, 0x3e, 0x01, 0x00, 0x24, 0x00, + 0xa0, 0x33, 0x04, 0x00, 0x00, 0x10, 0x07, 0x00, + 0x00, 0x87, 0x93, 0x03, 0x04, 0x79, 0x01, 0x00, + 0x80, 0xb5, 0x02, 0x21, 0x15, 0x20, 0x02, 0x4a, + 0xd0, 0xf7, 0xc8, 0xf9, 0x80, 0xbd, 0x00, 0x00, + 0x0d, 0x3e, 0x01, 0x00, 0x70, 0x47, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x60, 0x04, 0x00, 0x44, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x40, 0x20, 0x07, 0x00, + 0xff, 0xff, 0xff, 0xff, +}; +const uint32_t fw_len = sizeof(fw_buf) / sizeof(fw_buf[0]); diff --git a/firmware/libraries/WiFi/extras/wifi_dnld/wifi_dnld.cproj b/firmware/libraries/WiFi/extras/wifi_dnld/wifi_dnld.cproj new file mode 100644 index 0000000..790db3c --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifi_dnld/wifi_dnld.cproj @@ -0,0 +1,495 @@ + + + + 2.0 + 6.0 + com.Atmel.AVRGCC32 + eb9606bc-de32-4edd-9cda-ae3bf36977a2 + wifi_dnld + AT32uc3a1256 + none + Importer + Executable + C + wifi_dnld + .elf + $(MSBuildProjectDirectory)\$(Configuration) + Native + + true + false + + 0 + 3.5.0 + + + + + True + True + True + True + false + false + + + BOARD=ARDUINO + + + + + ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG + ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS + ../src/CONFIG + ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX + ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART + ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI + ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM + ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO + ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC + ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE + ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR + ../src/SOFTWARE_FRAMEWORK/UTILS + ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC + ../src/SOFTWARE_FRAMEWORK/BOARDS + ../src + + + -fdata-sections + true + false + false + false + false + true + false + false + false + false + + false + false + true + false + false + false + false + -c -fmessage-length=0 + false + true + false + false + false + false + + + newlib_addons-at32ucr2-speed_opt + + + + + ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS + ../src/SOFTWARE_FRAMEWORK/BOARDS + + + true + false + false + false + false + true + true + + + ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG + ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS + ../src/CONFIG + ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX + ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART + ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI + ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM + ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO + ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC + ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE + ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR + ../src/SOFTWARE_FRAMEWORK/UTILS + ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC + ../src/SOFTWARE_FRAMEWORK/BOARDS + + + false + -Wa,-g + + + ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG + ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS + ../src/CONFIG + ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX + ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART + ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI + ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM + ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO + ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC + ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE + ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR + ../src/SOFTWARE_FRAMEWORK/UTILS + ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC + ../src/SOFTWARE_FRAMEWORK/BOARDS + + + false + false + + + + + + + True + True + True + True + false + false + + + BOARD=ARDUINO + + + + + ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG + ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS + ../src/CONFIG + ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX + ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART + ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI + ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM + ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO + ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC + ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE + ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR + ../src/SOFTWARE_FRAMEWORK/UTILS + ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC + ../src/SOFTWARE_FRAMEWORK/BOARDS + ../src + + + -fdata-sections + true + false + false + false + false + true + false + false + false + false + Maximum (-g3) + + false + false + true + false + false + false + false + -c -fmessage-length=0 + false + true + false + false + false + false + + + newlib_addons-at32ucr2-speed_opt + + + + + ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS + ../src/SOFTWARE_FRAMEWORK/BOARDS + + + true + false + false + false + false + true + true + + + ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG + ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS + ../src/CONFIG + ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX + ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART + ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI + ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM + ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO + ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC + ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE + ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR + ../src/SOFTWARE_FRAMEWORK/UTILS + ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC + ../src/SOFTWARE_FRAMEWORK/BOARDS + + + false + Default (-g) + -Wa,-g + + + ../src/SOFTWARE_FRAMEWORK/UTILS/DEBUG + ../src/SOFTWARE_FRAMEWORK/SERVICES/MEMORY/CTRL_ACCESS + ../src/CONFIG + ../src/SOFTWARE_FRAMEWORK/COMPONENTS/MEMORY/DATA_FLASH/AT45DBX + ../src/SOFTWARE_FRAMEWORK/DRIVERS/USART + ../src/SOFTWARE_FRAMEWORK/DRIVERS/SPI + ../src/SOFTWARE_FRAMEWORK/DRIVERS/PM + ../src/SOFTWARE_FRAMEWORK/DRIVERS/GPIO + ../src/SOFTWARE_FRAMEWORK/DRIVERS/FLASHC + ../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE + ../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR + ../src/SOFTWARE_FRAMEWORK/UTILS + ../src/SOFTWARE_FRAMEWORK/DRIVERS/INTC + ../src/SOFTWARE_FRAMEWORK/BOARDS + + + false + false + Default (-Wa,-g) + + + + + + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + + compile + + + compile + + + + compile + + + compile + + + + + compile + + + + compile + + + compile + + + + compile + + + compile + + + compile + + + + + + + compile + + + compile + + + compile + + + compile + + + + + compile + + + compile + + + + compile + + + compile + + + + compile + + + compile + + + compile + + + + compile + + + compile + + + compile + + + compile + + + compile + + + + compile + + + compile + + + + compile + + + compile + + + + + + compile + + + compile + + + + compile + + + compile + + + compile + + + + compile + + + compile + + + compile + + + compile + + + + + compile + + + + compile + + + compile + + + compile + + + compile + + + compile + + + + + + + compile + + + + + compile + + + + compile + + + compile + + + compile + + + compile + + + + + compile + + + \ No newline at end of file diff --git a/firmware/libraries/WiFi/extras/wifishield.atsln b/firmware/libraries/WiFi/extras/wifishield.atsln new file mode 100644 index 0000000..e9a149b --- /dev/null +++ b/firmware/libraries/WiFi/extras/wifishield.atsln @@ -0,0 +1,36 @@ + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Atmel Studio Solution File, Format Version 11.00 +Project("{54F91283-7BC4-4236-8FF9-10F437C3AD48}") = "wifi_dnld", "wifi_dnld\wifi_dnld.cproj", "{EB9606BC-DE32-4EDD-9CDA-AE3BF36977A2}" +EndProject +Project("{54F91283-7BC4-4236-8FF9-10F437C3AD48}") = "wifiHD", "wifiHD\wifiHD.cproj", "{417E15DB-488A-4B56-8D4E-FBE832B2B649}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug_512|AVR = Debug_512|AVR + Debug|AVR = Debug|AVR + Release_512|AVR = Release_512|AVR + Release|AVR = Release|AVR + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {EB9606BC-DE32-4EDD-9CDA-AE3BF36977A2}.Debug_512|AVR.ActiveCfg = Debug|AVR + {EB9606BC-DE32-4EDD-9CDA-AE3BF36977A2}.Debug_512|AVR.Build.0 = Debug|AVR + {EB9606BC-DE32-4EDD-9CDA-AE3BF36977A2}.Debug|AVR.ActiveCfg = Debug|AVR + {EB9606BC-DE32-4EDD-9CDA-AE3BF36977A2}.Debug|AVR.Build.0 = Debug|AVR + {EB9606BC-DE32-4EDD-9CDA-AE3BF36977A2}.Release_512|AVR.ActiveCfg = Release|AVR + {EB9606BC-DE32-4EDD-9CDA-AE3BF36977A2}.Release_512|AVR.Build.0 = Release|AVR + {EB9606BC-DE32-4EDD-9CDA-AE3BF36977A2}.Release|AVR.ActiveCfg = Release|AVR + {EB9606BC-DE32-4EDD-9CDA-AE3BF36977A2}.Release|AVR.Build.0 = Release|AVR + {417E15DB-488A-4B56-8D4E-FBE832B2B649}.Debug_512|AVR.ActiveCfg = Debug_512|AVR + {417E15DB-488A-4B56-8D4E-FBE832B2B649}.Debug_512|AVR.Build.0 = Debug_512|AVR + {417E15DB-488A-4B56-8D4E-FBE832B2B649}.Debug|AVR.ActiveCfg = Debug|AVR + {417E15DB-488A-4B56-8D4E-FBE832B2B649}.Debug|AVR.Build.0 = Debug|AVR + {417E15DB-488A-4B56-8D4E-FBE832B2B649}.Release_512|AVR.ActiveCfg = Release_512|AVR + {417E15DB-488A-4B56-8D4E-FBE832B2B649}.Release_512|AVR.Build.0 = Release_512|AVR + {417E15DB-488A-4B56-8D4E-FBE832B2B649}.Release|AVR.ActiveCfg = Release|AVR + {417E15DB-488A-4B56-8D4E-FBE832B2B649}.Release|AVR.Build.0 = Release|AVR + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/firmware/libraries/WiFi/keywords.txt b/firmware/libraries/WiFi/keywords.txt new file mode 100644 index 0000000..341114d --- /dev/null +++ b/firmware/libraries/WiFi/keywords.txt @@ -0,0 +1,59 @@ +####################################### +# Syntax Coloring Map For WiFi +####################################### + +####################################### +# Library (KEYWORD1) +####################################### + +WiFi KEYWORD1 WiFi +WiFiUdp KEYWORD1 WiFiUDPConstructor + +####################################### +# Datatypes (KEYWORD1) +####################################### + +Client KEYWORD1 WiFiClientConstructor +Server KEYWORD1 WiFiServerConstructor + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +firmwareVersion KEYWORD2 +status KEYWORD2 +connect KEYWORD2 +write KEYWORD2 +available KEYWORD2 +config KEYWORD2 +setDNS KEYWORD2 +read KEYWORD2 +flush KEYWORD2 +stop KEYWORD2 +connected KEYWORD2 +begin KEYWORD2 +disconnect KEYWORD2 +macAddress KEYWORD2 +localIP KEYWORD2 +subnetMask KEYWORD2 +gatewayIP KEYWORD2 +SSID KEYWORD2 +BSSID KEYWORD2 +RSSI KEYWORD2 +encryptionType KEYWORD2 +getResult KEYWORD2 +getSocket KEYWORD2 +WiFiClient KEYWORD2 WiFiClient +WiFiServer KEYWORD2 WiFiServer +WiFiUDP KEYWORD2 WiFiUDPConstructor +beginPacket KEYWORD2 +endPacket KEYWORD2 +parsePacket KEYWORD2 +remoteIP KEYWORD2 +remotePort KEYWORD2 + + +####################################### +# Constants (LITERAL1) +####################################### + diff --git a/firmware/libraries/WiFi/library.properties b/firmware/libraries/WiFi/library.properties new file mode 100644 index 0000000..94e8308 --- /dev/null +++ b/firmware/libraries/WiFi/library.properties @@ -0,0 +1,9 @@ +name=WiFi +version=1.2.7 +author=Arduino +maintainer=Arduino +sentence=Enables network connection (local and Internet) using the Arduino WiFi shield. +paragraph=With this library you can instantiate Servers, Clients and send/receive UDP packets through WiFi. The shield can connect either to open or encrypted networks (WEP, WPA). The IP address can be assigned statically or through a DHCP. The library can also manage DNS. +category=Communication +url=http://www.arduino.cc/en/Reference/WiFi +architectures=* diff --git a/firmware/libraries/WiFi/src/WiFi.cpp b/firmware/libraries/WiFi/src/WiFi.cpp new file mode 100644 index 0000000..88b18b0 --- /dev/null +++ b/firmware/libraries/WiFi/src/WiFi.cpp @@ -0,0 +1,248 @@ +/* + WiFi.cpp - Library for Arduino Wifi shield. + Copyright (c) 2011-2014 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "utility/wifi_drv.h" +#include "WiFi.h" + +extern "C" { + #include "utility/wl_definitions.h" + #include "utility/wl_types.h" + #include "utility/debug.h" +} + +// XXX: don't make assumptions about the value of MAX_SOCK_NUM. +int16_t WiFiClass::_state[MAX_SOCK_NUM] = { NA_STATE, NA_STATE, NA_STATE, NA_STATE }; +uint16_t WiFiClass::_server_port[MAX_SOCK_NUM] = { 0, 0, 0, 0 }; + +WiFiClass::WiFiClass() +{ +} + +void WiFiClass::init() +{ + WiFiDrv::wifiDriverInit(); +} + +uint8_t WiFiClass::getSocket() +{ + for (uint8_t i = 0; i < MAX_SOCK_NUM; ++i) + { + if (WiFiClass::_server_port[i] == 0) + { + return i; + } + } + return NO_SOCKET_AVAIL; +} + +char* WiFiClass::firmwareVersion() +{ + return WiFiDrv::getFwVersion(); +} + +int WiFiClass::begin(char* ssid) +{ + uint8_t status = WL_IDLE_STATUS; + uint8_t attempts = WL_MAX_ATTEMPT_CONNECTION; + + if (WiFiDrv::wifiSetNetwork(ssid, strlen(ssid)) != WL_FAILURE) + { + do + { + delay(WL_DELAY_START_CONNECTION); + status = WiFiDrv::getConnectionStatus(); + } + while ((( status == WL_IDLE_STATUS)||(status == WL_SCAN_COMPLETED))&&(--attempts>0)); + }else + { + status = WL_CONNECT_FAILED; + } + return status; +} + +int WiFiClass::begin(char* ssid, uint8_t key_idx, const char *key) +{ + uint8_t status = WL_IDLE_STATUS; + uint8_t attempts = WL_MAX_ATTEMPT_CONNECTION; + + // set encryption key + if (WiFiDrv::wifiSetKey(ssid, strlen(ssid), key_idx, key, strlen(key)) != WL_FAILURE) + { + do + { + delay(WL_DELAY_START_CONNECTION); + status = WiFiDrv::getConnectionStatus(); + }while ((( status == WL_IDLE_STATUS)||(status == WL_SCAN_COMPLETED))&&(--attempts>0)); + }else{ + status = WL_CONNECT_FAILED; + } + return status; +} + +int WiFiClass::begin(char* ssid, const char *passphrase) +{ + uint8_t status = WL_IDLE_STATUS; + uint8_t attempts = WL_MAX_ATTEMPT_CONNECTION; + + // set passphrase + if (WiFiDrv::wifiSetPassphrase(ssid, strlen(ssid), passphrase, strlen(passphrase))!= WL_FAILURE) + { + do + { + delay(WL_DELAY_START_CONNECTION); + status = WiFiDrv::getConnectionStatus(); + } + while ((( status == WL_IDLE_STATUS)||(status == WL_SCAN_COMPLETED))&&(--attempts>0)); + }else{ + status = WL_CONNECT_FAILED; + } + return status; +} + +void WiFiClass::config(IPAddress local_ip) +{ + WiFiDrv::config(1, (uint32_t)local_ip, 0, 0); +} + +void WiFiClass::config(IPAddress local_ip, IPAddress dns_server) +{ + WiFiDrv::config(1, (uint32_t)local_ip, 0, 0); + WiFiDrv::setDNS(1, (uint32_t)dns_server, 0); +} + +void WiFiClass::config(IPAddress local_ip, IPAddress dns_server, IPAddress gateway) +{ + WiFiDrv::config(2, (uint32_t)local_ip, (uint32_t)gateway, 0); + WiFiDrv::setDNS(1, (uint32_t)dns_server, 0); +} + +void WiFiClass::config(IPAddress local_ip, IPAddress dns_server, IPAddress gateway, IPAddress subnet) +{ + WiFiDrv::config(3, (uint32_t)local_ip, (uint32_t)gateway, (uint32_t)subnet); + WiFiDrv::setDNS(1, (uint32_t)dns_server, 0); +} + +void WiFiClass::setDNS(IPAddress dns_server1) +{ + WiFiDrv::setDNS(1, (uint32_t)dns_server1, 0); +} + +void WiFiClass::setDNS(IPAddress dns_server1, IPAddress dns_server2) +{ + WiFiDrv::setDNS(2, (uint32_t)dns_server1, (uint32_t)dns_server2); +} + +int WiFiClass::disconnect() +{ + return WiFiDrv::disconnect(); +} + +uint8_t* WiFiClass::macAddress(uint8_t* mac) +{ + uint8_t* _mac = WiFiDrv::getMacAddress(); + memcpy(mac, _mac, WL_MAC_ADDR_LENGTH); + return mac; +} + +IPAddress WiFiClass::localIP() +{ + IPAddress ret; + WiFiDrv::getIpAddress(ret); + return ret; +} + +IPAddress WiFiClass::subnetMask() +{ + IPAddress ret; + WiFiDrv::getSubnetMask(ret); + return ret; +} + +IPAddress WiFiClass::gatewayIP() +{ + IPAddress ret; + WiFiDrv::getGatewayIP(ret); + return ret; +} + +char* WiFiClass::SSID() +{ + return WiFiDrv::getCurrentSSID(); +} + +uint8_t* WiFiClass::BSSID(uint8_t* bssid) +{ + uint8_t* _bssid = WiFiDrv::getCurrentBSSID(); + memcpy(bssid, _bssid, WL_MAC_ADDR_LENGTH); + return bssid; +} + +int32_t WiFiClass::RSSI() +{ + return WiFiDrv::getCurrentRSSI(); +} + +uint8_t WiFiClass::encryptionType() +{ + return WiFiDrv::getCurrentEncryptionType(); +} + + +int8_t WiFiClass::scanNetworks() +{ + uint8_t attempts = 10; + uint8_t numOfNetworks = 0; + + if (WiFiDrv::startScanNetworks() == WL_FAILURE) + return WL_FAILURE; + do + { + delay(2000); + numOfNetworks = WiFiDrv::getScanNetworks(); + } + while (( numOfNetworks == 0)&&(--attempts>0)); + return numOfNetworks; +} + +char* WiFiClass::SSID(uint8_t networkItem) +{ + return WiFiDrv::getSSIDNetoworks(networkItem); +} + +int32_t WiFiClass::RSSI(uint8_t networkItem) +{ + return WiFiDrv::getRSSINetoworks(networkItem); +} + +uint8_t WiFiClass::encryptionType(uint8_t networkItem) +{ + return WiFiDrv::getEncTypeNetowrks(networkItem); +} + +uint8_t WiFiClass::status() +{ + return WiFiDrv::getConnectionStatus(); +} + +int WiFiClass::hostByName(const char* aHostname, IPAddress& aResult) +{ + return WiFiDrv::getHostByName(aHostname, aResult); +} + +WiFiClass WiFi; diff --git a/firmware/libraries/WiFi/src/WiFi.h b/firmware/libraries/WiFi/src/WiFi.h new file mode 100644 index 0000000..ef49428 --- /dev/null +++ b/firmware/libraries/WiFi/src/WiFi.h @@ -0,0 +1,246 @@ +/* + WiFi.h - Library for Arduino Wifi shield. + Copyright (c) 2011-2014 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef WiFi_h +#define WiFi_h + +#include + +extern "C" { + #include "utility/wl_definitions.h" + #include "utility/wl_types.h" +} + +#include "IPAddress.h" +#include "WiFiClient.h" +#include "WiFiServer.h" + +class WiFiClass +{ +private: + + static void init(); +public: + static int16_t _state[MAX_SOCK_NUM]; + static uint16_t _server_port[MAX_SOCK_NUM]; + + WiFiClass(); + + /* + * Get the first socket available + */ + static uint8_t getSocket(); + + /* + * Get firmware version + */ + static char* firmwareVersion(); + + + /* Start Wifi connection for OPEN networks + * + * param ssid: Pointer to the SSID string. + */ + int begin(char* ssid); + + /* Start Wifi connection with WEP encryption. + * Configure a key into the device. The key type (WEP-40, WEP-104) + * is determined by the size of the key (5 bytes for WEP-40, 13 bytes for WEP-104). + * + * param ssid: Pointer to the SSID string. + * param key_idx: The key index to set. Valid values are 0-3. + * param key: Key input buffer. + */ + int begin(char* ssid, uint8_t key_idx, const char* key); + + /* Start Wifi connection with passphrase + * the most secure supported mode will be automatically selected + * + * param ssid: Pointer to the SSID string. + * param passphrase: Passphrase. Valid characters in a passphrase + * must be between ASCII 32-126 (decimal). + */ + int begin(char* ssid, const char *passphrase); + + /* Change Ip configuration settings disabling the dhcp client + * + * param local_ip: Static ip configuration + */ + void config(IPAddress local_ip); + + /* Change Ip configuration settings disabling the dhcp client + * + * param local_ip: Static ip configuration + * param dns_server: IP configuration for DNS server 1 + */ + void config(IPAddress local_ip, IPAddress dns_server); + + /* Change Ip configuration settings disabling the dhcp client + * + * param local_ip: Static ip configuration + * param dns_server: IP configuration for DNS server 1 + * param gateway : Static gateway configuration + */ + void config(IPAddress local_ip, IPAddress dns_server, IPAddress gateway); + + /* Change Ip configuration settings disabling the dhcp client + * + * param local_ip: Static ip configuration + * param dns_server: IP configuration for DNS server 1 + * param gateway: Static gateway configuration + * param subnet: Static Subnet mask + */ + void config(IPAddress local_ip, IPAddress dns_server, IPAddress gateway, IPAddress subnet); + + /* Change DNS Ip configuration + * + * param dns_server1: ip configuration for DNS server 1 + */ + void setDNS(IPAddress dns_server1); + + /* Change DNS Ip configuration + * + * param dns_server1: ip configuration for DNS server 1 + * param dns_server2: ip configuration for DNS server 2 + * + */ + void setDNS(IPAddress dns_server1, IPAddress dns_server2); + + /* + * Disconnect from the network + * + * return: one value of wl_status_t enum + */ + int disconnect(void); + + /* + * Get the interface MAC address. + * + * return: pointer to uint8_t array with length WL_MAC_ADDR_LENGTH + */ + uint8_t* macAddress(uint8_t* mac); + + /* + * Get the interface IP address. + * + * return: Ip address value + */ + IPAddress localIP(); + + /* + * Get the interface subnet mask address. + * + * return: subnet mask address value + */ + IPAddress subnetMask(); + + /* + * Get the gateway ip address. + * + * return: gateway ip address value + */ + IPAddress gatewayIP(); + + /* + * Return the current SSID associated with the network + * + * return: ssid string + */ + char* SSID(); + + /* + * Return the current BSSID associated with the network. + * It is the MAC address of the Access Point + * + * return: pointer to uint8_t array with length WL_MAC_ADDR_LENGTH + */ + uint8_t* BSSID(uint8_t* bssid); + + /* + * Return the current RSSI /Received Signal Strength in dBm) + * associated with the network + * + * return: signed value + */ + int32_t RSSI(); + + /* + * Return the Encryption Type associated with the network + * + * return: one value of wl_enc_type enum + */ + uint8_t encryptionType(); + + /* + * Start scan WiFi networks available + * + * return: Number of discovered networks + */ + int8_t scanNetworks(); + + /* + * Return the SSID discovered during the network scan. + * + * param networkItem: specify from which network item want to get the information + * + * return: ssid string of the specified item on the networks scanned list + */ + char* SSID(uint8_t networkItem); + + /* + * Return the encryption type of the networks discovered during the scanNetworks + * + * param networkItem: specify from which network item want to get the information + * + * return: encryption type (enum wl_enc_type) of the specified item on the networks scanned list + */ + uint8_t encryptionType(uint8_t networkItem); + + /* + * Return the RSSI of the networks discovered during the scanNetworks + * + * param networkItem: specify from which network item want to get the information + * + * return: signed value of RSSI of the specified item on the networks scanned list + */ + int32_t RSSI(uint8_t networkItem); + + /* + * Return Connection status. + * + * return: one of the value defined in wl_status_t + */ + uint8_t status(); + + /* + * Resolve the given hostname to an IP address. + * param aHostname: Name to be resolved + * param aResult: IPAddress structure to store the returned IP address + * result: 1 if aIPAddrString was successfully converted to an IP address, + * else error code + */ + int hostByName(const char* aHostname, IPAddress& aResult); + + friend class WiFiClient; + friend class WiFiServer; +}; + +extern WiFiClass WiFi; + +#endif diff --git a/firmware/libraries/WiFi/src/WiFiClient.cpp b/firmware/libraries/WiFi/src/WiFiClient.cpp new file mode 100644 index 0000000..eb8e6af --- /dev/null +++ b/firmware/libraries/WiFi/src/WiFiClient.cpp @@ -0,0 +1,199 @@ +/* + WiFiClient.cpp - Library for Arduino Wifi shield. + Copyright (c) 2011-2014 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +extern "C" { + #include "utility/wl_definitions.h" + #include "utility/wl_types.h" + #include "string.h" + #include "utility/debug.h" +} + +#include "WiFi.h" +#include "WiFiClient.h" +#include "WiFiServer.h" +#include "utility/server_drv.h" + + +uint16_t WiFiClient::_srcport = 1024; + +WiFiClient::WiFiClient() : _sock(MAX_SOCK_NUM) { +} + +WiFiClient::WiFiClient(uint8_t sock) : _sock(sock) { +} + +int WiFiClient::connect(const char* host, uint16_t port) { + IPAddress remote_addr; + if (WiFi.hostByName(host, remote_addr)) + { + return connect(remote_addr, port); + } + return 0; +} + +int WiFiClient::connect(IPAddress ip, uint16_t port) { + _sock = getFirstSocket(); + if (_sock != NO_SOCKET_AVAIL) + { + ServerDrv::startClient(uint32_t(ip), port, _sock); + WiFiClass::_state[_sock] = _sock; + + unsigned long start = millis(); + + // wait 4 second for the connection to close + while (!connected() && millis() - start < 10000) + delay(1); + + if (!connected()) + { + return 0; + } + }else{ + Serial.println("No Socket available"); + return 0; + } + return 1; +} + +size_t WiFiClient::write(uint8_t b) { + return write(&b, 1); +} + +size_t WiFiClient::write(const uint8_t *buf, size_t size) { + if (_sock >= MAX_SOCK_NUM) + { + setWriteError(); + return 0; + } + if (size==0) + { + setWriteError(); + return 0; + } + + + if (!ServerDrv::sendData(_sock, buf, size)) + { + setWriteError(); + return 0; + } + if (!ServerDrv::checkDataSent(_sock)) + { + setWriteError(); + return 0; + } + + return size; +} + +int WiFiClient::available() { + if (_sock != 255) + { + return ServerDrv::availData(_sock); + } + + return 0; +} + +int WiFiClient::read() { + uint8_t b; + if (!available()) + return -1; + + ServerDrv::getData(_sock, &b); + return b; +} + + +int WiFiClient::read(uint8_t* buf, size_t size) { + // sizeof(size_t) is architecture dependent + // but we need a 16 bit data type here + uint16_t _size = size; + if (!ServerDrv::getDataBuf(_sock, buf, &_size)) + return -1; + return 0; +} + +int WiFiClient::peek() { + uint8_t b; + if (!available()) + return -1; + + ServerDrv::getData(_sock, &b, 1); + return b; +} + +void WiFiClient::flush() { + // TODO: a real check to ensure transmission has been completed +} + +void WiFiClient::stop() { + + if (_sock == 255) + return; + + ServerDrv::stopClient(_sock); + WiFiClass::_state[_sock] = NA_STATE; + + int count = 0; + // wait maximum 5 secs for the connection to close + while (status() != CLOSED && ++count < 50) + delay(100); + + _sock = 255; +} + +uint8_t WiFiClient::connected() { + + if (_sock == 255) { + return 0; + } else { + uint8_t s = status(); + + return !(s == LISTEN || s == CLOSED || s == FIN_WAIT_1 || + s == FIN_WAIT_2 || s == TIME_WAIT || + s == SYN_SENT || s== SYN_RCVD || + (s == CLOSE_WAIT)); + } +} + +uint8_t WiFiClient::status() { + if (_sock == 255) { + return CLOSED; + } else { + return ServerDrv::getClientState(_sock); + } +} + +WiFiClient::operator bool() { + return _sock != 255; +} + +// Private Methods +uint8_t WiFiClient::getFirstSocket() +{ + for (int i = 0; i < MAX_SOCK_NUM; i++) { + if (WiFiClass::_state[i] == NA_STATE) + { + return i; + } + } + return SOCK_NOT_AVAIL; +} + diff --git a/firmware/libraries/WiFi/src/WiFiClient.h b/firmware/libraries/WiFi/src/WiFiClient.h new file mode 100644 index 0000000..caac8fd --- /dev/null +++ b/firmware/libraries/WiFi/src/WiFiClient.h @@ -0,0 +1,59 @@ +/* + WiFiClient.cpp - Library for Arduino Wifi shield. + Copyright (c) 2011-2014 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef wificlient_h +#define wificlient_h +#include "Arduino.h" +#include "Print.h" +#include "Client.h" +#include "IPAddress.h" + +class WiFiClient : public Client { + +public: + WiFiClient(); + WiFiClient(uint8_t sock); + + uint8_t status(); + virtual int connect(IPAddress ip, uint16_t port); + virtual int connect(const char *host, uint16_t port); + virtual size_t write(uint8_t); + virtual size_t write(const uint8_t *buf, size_t size); + virtual int available(); + virtual int read(); + virtual int read(uint8_t *buf, size_t size); + virtual int peek(); + virtual void flush(); + virtual void stop(); + virtual uint8_t connected(); + virtual operator bool(); + + friend class WiFiServer; + + using Print::write; + +private: + static uint16_t _srcport; + uint8_t _sock; //not used + uint16_t _socket; + + uint8_t getFirstSocket(); +}; + +#endif diff --git a/firmware/libraries/WiFi/src/WiFiServer.cpp b/firmware/libraries/WiFi/src/WiFiServer.cpp new file mode 100644 index 0000000..cab1dee --- /dev/null +++ b/firmware/libraries/WiFi/src/WiFiServer.cpp @@ -0,0 +1,108 @@ +/* + WiFiServer.cpp - Library for Arduino Wifi shield. + Copyright (c) 2011-2014 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include +#include "utility/server_drv.h" + +extern "C" { + #include "utility/debug.h" +} + +#include "WiFi.h" +#include "WiFiClient.h" +#include "WiFiServer.h" + +WiFiServer::WiFiServer(uint16_t port) +{ + _port = port; +} + +void WiFiServer::begin() +{ + uint8_t _sock = WiFiClass::getSocket(); + if (_sock != NO_SOCKET_AVAIL) + { + ServerDrv::startServer(_port, _sock); + WiFiClass::_server_port[_sock] = _port; + WiFiClass::_state[_sock] = _sock; + } +} + +WiFiClient WiFiServer::available(byte* status) +{ + static int cycle_server_down = 0; + const int TH_SERVER_DOWN = 50; + + for (int sock = 0; sock < MAX_SOCK_NUM; sock++) + { + if (WiFiClass::_server_port[sock] == _port) + { + WiFiClient client(sock); + uint8_t _status = client.status(); + uint8_t _ser_status = this->status(); + + if (status != NULL) + *status = _status; + + //server not in listen state, restart it + if ((_ser_status == 0)&&(cycle_server_down++ > TH_SERVER_DOWN)) + { + ServerDrv::startServer(_port, sock); + cycle_server_down = 0; + } + + if (_status == ESTABLISHED) + { + return client; //TODO + } + } + } + + return WiFiClient(255); +} + +uint8_t WiFiServer::status() { + return ServerDrv::getServerState(0); +} + + +size_t WiFiServer::write(uint8_t b) +{ + return write(&b, 1); +} + +size_t WiFiServer::write(const uint8_t *buffer, size_t size) +{ + size_t n = 0; + + for (int sock = 0; sock < MAX_SOCK_NUM; sock++) + { + if (WiFiClass::_server_port[sock] != 0) + { + WiFiClient client(sock); + + if (WiFiClass::_server_port[sock] == _port && + client.status() == ESTABLISHED) + { + n+=client.write(buffer, size); + } + } + } + return n; +} diff --git a/firmware/libraries/WiFi/src/WiFiServer.h b/firmware/libraries/WiFi/src/WiFiServer.h new file mode 100644 index 0000000..d2adea2 --- /dev/null +++ b/firmware/libraries/WiFi/src/WiFiServer.h @@ -0,0 +1,46 @@ +/* + WiFiServer.h - Library for Arduino Wifi shield. + Copyright (c) 2011-2014 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef wifiserver_h +#define wifiserver_h + +extern "C" { + #include "utility/wl_definitions.h" +} + +#include "Server.h" + +class WiFiClient; + +class WiFiServer : public Server { +private: + uint16_t _port; + void* pcb; +public: + WiFiServer(uint16_t); + WiFiClient available(uint8_t* status = NULL); + void begin(); + virtual size_t write(uint8_t); + virtual size_t write(const uint8_t *buf, size_t size); + uint8_t status(); + + using Print::write; +}; + +#endif diff --git a/firmware/libraries/WiFi/src/WiFiUdp.cpp b/firmware/libraries/WiFi/src/WiFiUdp.cpp new file mode 100644 index 0000000..9540243 --- /dev/null +++ b/firmware/libraries/WiFi/src/WiFiUdp.cpp @@ -0,0 +1,180 @@ +/* + WiFiUdp.cpp - Library for Arduino Wifi shield. + Copyright (c) 2011-2014 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +extern "C" { + #include "utility/debug.h" + #include "utility/wifi_spi.h" +} +#include +#include "utility/server_drv.h" +#include "utility/wifi_drv.h" + +#include "WiFi.h" +#include "WiFiUdp.h" +#include "WiFiClient.h" +#include "WiFiServer.h" + + +/* Constructor */ +WiFiUDP::WiFiUDP() : _sock(NO_SOCKET_AVAIL) {} + +/* Start WiFiUDP socket, listening at local port PORT */ +uint8_t WiFiUDP::begin(uint16_t port) { + + uint8_t sock = WiFiClass::getSocket(); + if (sock != NO_SOCKET_AVAIL) + { + ServerDrv::startServer(port, sock, UDP_MODE); + WiFiClass::_server_port[sock] = port; + _sock = sock; + _port = port; + return 1; + } + return 0; + +} + +/* return number of bytes available in the current packet, + will return zero if parsePacket hasn't been called yet */ +int WiFiUDP::available() { + if (_sock != NO_SOCKET_AVAIL) + { + return ServerDrv::availData(_sock); + } + return 0; +} + +/* Release any resources being used by this WiFiUDP instance */ +void WiFiUDP::stop() +{ + if (_sock == NO_SOCKET_AVAIL) + return; + + ServerDrv::stopClient(_sock); + + _sock = NO_SOCKET_AVAIL; +} + +int WiFiUDP::beginPacket(const char *host, uint16_t port) +{ + // Look up the host first + int ret = 0; + IPAddress remote_addr; + if (WiFi.hostByName(host, remote_addr)) + { + return beginPacket(remote_addr, port); + } + return ret; +} + +int WiFiUDP::beginPacket(IPAddress ip, uint16_t port) +{ + if (_sock == NO_SOCKET_AVAIL) + _sock = WiFiClass::getSocket(); + if (_sock != NO_SOCKET_AVAIL) + { + ServerDrv::startClient(uint32_t(ip), port, _sock, UDP_MODE); + WiFiClass::_state[_sock] = _sock; + return 1; + } + return 0; +} + +int WiFiUDP::endPacket() +{ + return ServerDrv::sendUdpData(_sock); +} + +size_t WiFiUDP::write(uint8_t byte) +{ + return write(&byte, 1); +} + +size_t WiFiUDP::write(const uint8_t *buffer, size_t size) +{ + ServerDrv::insertDataBuf(_sock, buffer, size); + return size; +} + +int WiFiUDP::parsePacket() +{ + return available(); +} + +int WiFiUDP::read() +{ + uint8_t b; + if (available()) + { + ServerDrv::getData(_sock, &b); + return b; + }else{ + return -1; + } +} + +int WiFiUDP::read(unsigned char* buffer, size_t len) +{ + if (available()) + { + uint16_t size = 0; + if (!ServerDrv::getDataBuf(_sock, buffer, &size)) + return -1; + // TODO check if the buffer is too smal respect to buffer size + return size; + }else{ + return -1; + } +} + +int WiFiUDP::peek() +{ + uint8_t b; + if (!available()) + return -1; + + ServerDrv::getData(_sock, &b, 1); + return b; +} + +void WiFiUDP::flush() +{ + // TODO: a real check to ensure transmission has been completed +} + +IPAddress WiFiUDP::remoteIP() +{ + uint8_t _remoteIp[4] = {0}; + uint8_t _remotePort[2] = {0}; + + WiFiDrv::getRemoteData(_sock, _remoteIp, _remotePort); + IPAddress ip(_remoteIp); + return ip; +} + +uint16_t WiFiUDP::remotePort() +{ + uint8_t _remoteIp[4] = {0}; + uint8_t _remotePort[2] = {0}; + + WiFiDrv::getRemoteData(_sock, _remoteIp, _remotePort); + uint16_t port = (_remotePort[0]<<8)+_remotePort[1]; + return port; +} + diff --git a/firmware/libraries/WiFi/src/WiFiUdp.h b/firmware/libraries/WiFi/src/WiFiUdp.h new file mode 100644 index 0000000..039b804 --- /dev/null +++ b/firmware/libraries/WiFi/src/WiFiUdp.h @@ -0,0 +1,80 @@ +/* + WiFiUdp.h - Library for Arduino Wifi shield. + Copyright (c) 2011-2014 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef wifiudp_h +#define wifiudp_h + +#include + +#define UDP_TX_PACKET_MAX_SIZE 24 + +class WiFiUDP : public UDP { +private: + uint8_t _sock; // socket ID for Wiz5100 + uint16_t _port; // local port to listen on + +public: + WiFiUDP(); // Constructor + virtual uint8_t begin(uint16_t); // initialize, start listening on specified port. Returns 1 if successful, 0 if there are no sockets available to use + virtual void stop(); // Finish with the UDP socket + + // Sending UDP packets + + // Start building up a packet to send to the remote host specific in ip and port + // Returns 1 if successful, 0 if there was a problem with the supplied IP address or port + virtual int beginPacket(IPAddress ip, uint16_t port); + // Start building up a packet to send to the remote host specific in host and port + // Returns 1 if successful, 0 if there was a problem resolving the hostname or port + virtual int beginPacket(const char *host, uint16_t port); + // Finish off this packet and send it + // Returns 1 if the packet was sent successfully, 0 if there was an error + virtual int endPacket(); + // Write a single byte into the packet + virtual size_t write(uint8_t); + // Write size bytes from buffer into the packet + virtual size_t write(const uint8_t *buffer, size_t size); + + using Print::write; + + // Start processing the next available incoming packet + // Returns the size of the packet in bytes, or 0 if no packets are available + virtual int parsePacket(); + // Number of bytes remaining in the current packet + virtual int available(); + // Read a single byte from the current packet + virtual int read(); + // Read up to len bytes from the current packet and place them into buffer + // Returns the number of bytes read, or 0 if none are available + virtual int read(unsigned char* buffer, size_t len); + // Read up to len characters from the current packet and place them into buffer + // Returns the number of characters read, or 0 if none are available + virtual int read(char* buffer, size_t len) { return read((unsigned char*)buffer, len); }; + // Return the next byte from the current packet without moving on to the next byte + virtual int peek(); + virtual void flush(); // Finish reading the current packet + + // Return the IP address of the host who sent the current incoming packet + virtual IPAddress remoteIP(); + // Return the port of the host who sent the current incoming packet + virtual uint16_t remotePort(); + + friend class WiFiDrv; +}; + +#endif diff --git a/firmware/libraries/WiFi/src/utility/debug.h b/firmware/libraries/WiFi/src/utility/debug.h new file mode 100644 index 0000000..5569e45 --- /dev/null +++ b/firmware/libraries/WiFi/src/utility/debug.h @@ -0,0 +1,95 @@ +/* + debug.h - Library for Arduino Wifi shield. + Copyright (c) 2011-2014 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ +//*********************************************/ +// +// File: debug.h +// +// Author: dlf (Metodo2 srl) +// +//********************************************/ + + +#ifndef Debug_H +#define Debug_H + +#include +#include + +#define PRINT_FILE_LINE() do { \ + Serial.print("[");Serial.print(__FILE__); \ + Serial.print("::");Serial.print(__LINE__);Serial.print("]");\ +}while (0); + +#ifdef _DEBUG_ + +#define INFO(format, args...) do { \ + char buf[250]; \ + sprintf(buf, format, args); \ + Serial.println(buf); \ +} while(0); + +#define INFO1(x) do { PRINT_FILE_LINE() Serial.print("-I-");\ + Serial.println(x); \ +}while (0); + + +#define INFO2(x,y) do { PRINT_FILE_LINE() Serial.print("-I-");\ + Serial.print(x,16);Serial.print(",");Serial.println(y,16); \ +}while (0); + + +#else +#define INFO1(x) do {} while(0); +#define INFO2(x,y) do {} while(0); +#define INFO(format, args...) do {} while(0); +#endif + +#if 0 +#define WARN(args) do { PRINT_FILE_LINE() \ + Serial.print("-W-"); Serial.println(args); \ +}while (0); +#else +#define WARN(args) do {} while (0); +#endif + +#if _DEBUG_SPI_ +#define DBG_PIN2 5 +#define DBG_PIN 4 + +#define START() digitalWrite(DBG_PIN2, HIGH); +#define END() digitalWrite(DBG_PIN2, LOW); +#define SET_TRIGGER() digitalWrite(DBG_PIN, HIGH); +#define RST_TRIGGER() digitalWrite(DBG_PIN, LOW); + +#define INIT_TRIGGER() pinMode(DBG_PIN, OUTPUT); \ + pinMode(DBG_PIN2, OUTPUT); \ + RST_TRIGGER() +#define TOGGLE_TRIGGER() SET_TRIGGER() \ + delayMicroseconds(2); \ + RST_TRIGGER() +#else +#define START() +#define END() +#define SET_TRIGGER() +#define RST_TRIGGER() +#define INIT_TRIGGER() +#define TOGGLE_TRIGGER() +#endif + +#endif diff --git a/firmware/libraries/WiFi/src/utility/server_drv.cpp b/firmware/libraries/WiFi/src/utility/server_drv.cpp new file mode 100644 index 0000000..fc96473 --- /dev/null +++ b/firmware/libraries/WiFi/src/utility/server_drv.cpp @@ -0,0 +1,327 @@ +/* + server_drv.cpp - Library for Arduino Wifi shield. + Copyright (c) 2011-2014 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +//#define _DEBUG_ + +#include "utility/server_drv.h" + +#include "Arduino.h" +#include "utility/spi_drv.h" + +extern "C" { +#include "utility/wl_types.h" +#include "utility/debug.h" +} + + +// Start server TCP on port specified +void ServerDrv::startServer(uint16_t port, uint8_t sock, uint8_t protMode) +{ + WAIT_FOR_SLAVE_SELECT(); + // Send Command + SpiDrv::sendCmd(START_SERVER_TCP_CMD, PARAM_NUMS_3); + SpiDrv::sendParam(port); + SpiDrv::sendParam(&sock, 1); + SpiDrv::sendParam(&protMode, 1, LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _data = 0; + uint8_t _dataLen = 0; + if (!SpiDrv::waitResponseCmd(START_SERVER_TCP_CMD, PARAM_NUMS_1, &_data, &_dataLen)) + { + WARN("error waitResponse"); + } + SpiDrv::spiSlaveDeselect(); +} + +// Start server TCP on port specified +void ServerDrv::startClient(uint32_t ipAddress, uint16_t port, uint8_t sock, uint8_t protMode) +{ + WAIT_FOR_SLAVE_SELECT(); + // Send Command + SpiDrv::sendCmd(START_CLIENT_TCP_CMD, PARAM_NUMS_4); + SpiDrv::sendParam((uint8_t*)&ipAddress, sizeof(ipAddress)); + SpiDrv::sendParam(port); + SpiDrv::sendParam(&sock, 1); + SpiDrv::sendParam(&protMode, 1, LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _data = 0; + uint8_t _dataLen = 0; + if (!SpiDrv::waitResponseCmd(START_CLIENT_TCP_CMD, PARAM_NUMS_1, &_data, &_dataLen)) + { + WARN("error waitResponse"); + } + SpiDrv::spiSlaveDeselect(); +} + +// Start server TCP on port specified +void ServerDrv::stopClient(uint8_t sock) +{ + WAIT_FOR_SLAVE_SELECT(); + // Send Command + SpiDrv::sendCmd(STOP_CLIENT_TCP_CMD, PARAM_NUMS_1); + SpiDrv::sendParam(&sock, 1, LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _data = 0; + uint8_t _dataLen = 0; + if (!SpiDrv::waitResponseCmd(STOP_CLIENT_TCP_CMD, PARAM_NUMS_1, &_data, &_dataLen)) + { + WARN("error waitResponse"); + } + SpiDrv::spiSlaveDeselect(); +} + + +uint8_t ServerDrv::getServerState(uint8_t sock) +{ + WAIT_FOR_SLAVE_SELECT(); + // Send Command + SpiDrv::sendCmd(GET_STATE_TCP_CMD, PARAM_NUMS_1); + SpiDrv::sendParam(&sock, sizeof(sock), LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _data = 0; + uint8_t _dataLen = 0; + if (!SpiDrv::waitResponseCmd(GET_STATE_TCP_CMD, PARAM_NUMS_1, &_data, &_dataLen)) + { + WARN("error waitResponse"); + } + SpiDrv::spiSlaveDeselect(); + return _data; +} + +uint8_t ServerDrv::getClientState(uint8_t sock) +{ + WAIT_FOR_SLAVE_SELECT(); + // Send Command + SpiDrv::sendCmd(GET_CLIENT_STATE_TCP_CMD, PARAM_NUMS_1); + SpiDrv::sendParam(&sock, sizeof(sock), LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _data = 0; + uint8_t _dataLen = 0; + if (!SpiDrv::waitResponseCmd(GET_CLIENT_STATE_TCP_CMD, PARAM_NUMS_1, &_data, &_dataLen)) + { + WARN("error waitResponse"); + } + SpiDrv::spiSlaveDeselect(); + return _data; +} + +uint16_t ServerDrv::availData(uint8_t sock) +{ + WAIT_FOR_SLAVE_SELECT(); + // Send Command + SpiDrv::sendCmd(AVAIL_DATA_TCP_CMD, PARAM_NUMS_1); + SpiDrv::sendParam(&sock, sizeof(sock), LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _dataLen = 0; + uint16_t len = 0; + + SpiDrv::waitResponseCmd(AVAIL_DATA_TCP_CMD, PARAM_NUMS_1, (uint8_t*)&len, &_dataLen); + + SpiDrv::spiSlaveDeselect(); + + return len; +} + +bool ServerDrv::getData(uint8_t sock, uint8_t *data, uint8_t peek) +{ + WAIT_FOR_SLAVE_SELECT(); + // Send Command + SpiDrv::sendCmd(GET_DATA_TCP_CMD, PARAM_NUMS_2); + SpiDrv::sendParam(&sock, sizeof(sock)); + SpiDrv::sendParam(peek, LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _data = 0; + uint8_t _dataLen = 0; + if (!SpiDrv::waitResponseData8(GET_DATA_TCP_CMD, &_data, &_dataLen)) + { + WARN("error waitResponse"); + } + SpiDrv::spiSlaveDeselect(); + if (_dataLen!=0) + { + *data = _data; + return true; + } + return false; +} + +bool ServerDrv::getDataBuf(uint8_t sock, uint8_t *_data, uint16_t *_dataLen) +{ + WAIT_FOR_SLAVE_SELECT(); + // Send Command + SpiDrv::sendCmd(GET_DATABUF_TCP_CMD, PARAM_NUMS_1); + SpiDrv::sendBuffer(&sock, sizeof(sock), LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + if (!SpiDrv::waitResponseData16(GET_DATABUF_TCP_CMD, _data, _dataLen)) + { + WARN("error waitResponse"); + } + SpiDrv::spiSlaveDeselect(); + if (*_dataLen!=0) + { + return true; + } + return false; +} + +bool ServerDrv::insertDataBuf(uint8_t sock, const uint8_t *data, uint16_t _len) +{ + WAIT_FOR_SLAVE_SELECT(); + // Send Command + SpiDrv::sendCmd(INSERT_DATABUF_CMD, PARAM_NUMS_2); + SpiDrv::sendBuffer(&sock, sizeof(sock)); + SpiDrv::sendBuffer((uint8_t *)data, _len, LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _data = 0; + uint8_t _dataLen = 0; + if (!SpiDrv::waitResponseData8(INSERT_DATABUF_CMD, &_data, &_dataLen)) + { + WARN("error waitResponse"); + } + SpiDrv::spiSlaveDeselect(); + if (_dataLen!=0) + { + return (_data == 1); + } + return false; +} + +bool ServerDrv::sendUdpData(uint8_t sock) +{ + WAIT_FOR_SLAVE_SELECT(); + // Send Command + SpiDrv::sendCmd(SEND_DATA_UDP_CMD, PARAM_NUMS_1); + SpiDrv::sendParam(&sock, sizeof(sock), LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _data = 0; + uint8_t _dataLen = 0; + if (!SpiDrv::waitResponseData8(SEND_DATA_UDP_CMD, &_data, &_dataLen)) + { + WARN("error waitResponse"); + } + SpiDrv::spiSlaveDeselect(); + if (_dataLen!=0) + { + return (_data == 1); + } + return false; +} + + +bool ServerDrv::sendData(uint8_t sock, const uint8_t *data, uint16_t len) +{ + WAIT_FOR_SLAVE_SELECT(); + // Send Command + SpiDrv::sendCmd(SEND_DATA_TCP_CMD, PARAM_NUMS_2); + SpiDrv::sendBuffer(&sock, sizeof(sock)); + SpiDrv::sendBuffer((uint8_t *)data, len, LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _data = 0; + uint8_t _dataLen = 0; + if (!SpiDrv::waitResponseData8(SEND_DATA_TCP_CMD, &_data, &_dataLen)) + { + WARN("error waitResponse"); + } + SpiDrv::spiSlaveDeselect(); + if (_dataLen!=0) + { + return (_data == 1); + } + return false; +} + + +uint8_t ServerDrv::checkDataSent(uint8_t sock) +{ + const uint16_t TIMEOUT_DATA_SENT = 25; + uint16_t timeout = 0; + uint8_t _data = 0; + uint8_t _dataLen = 0; + + do { + WAIT_FOR_SLAVE_SELECT(); + // Send Command + SpiDrv::sendCmd(DATA_SENT_TCP_CMD, PARAM_NUMS_1); + SpiDrv::sendParam(&sock, sizeof(sock), LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + if (!SpiDrv::waitResponseCmd(DATA_SENT_TCP_CMD, PARAM_NUMS_1, &_data, &_dataLen)) + { + WARN("error waitResponse isDataSent"); + } + SpiDrv::spiSlaveDeselect(); + + if (_data) timeout = 0; + else{ + ++timeout; + delay(100); + } + + }while((_data==0)&&(timeout +#include "utility/wifi_spi.h" + +typedef enum eProtMode {TCP_MODE, UDP_MODE}tProtMode; + +class ServerDrv +{ +public: + + // Start server TCP on port specified + static void startServer(uint16_t port, uint8_t sock, uint8_t protMode=TCP_MODE); + + static void startClient(uint32_t ipAddress, uint16_t port, uint8_t sock, uint8_t protMode=TCP_MODE); + + static void stopClient(uint8_t sock); + + static uint8_t getServerState(uint8_t sock); + + static uint8_t getClientState(uint8_t sock); + + static bool getData(uint8_t sock, uint8_t *data, uint8_t peek = 0); + + static bool getDataBuf(uint8_t sock, uint8_t *data, uint16_t *len); + + static bool insertDataBuf(uint8_t sock, const uint8_t *_data, uint16_t _dataLen); + + static bool sendData(uint8_t sock, const uint8_t *data, uint16_t len); + + static bool sendUdpData(uint8_t sock); + + static uint16_t availData(uint8_t sock); + + static uint8_t checkDataSent(uint8_t sock); +}; + +extern ServerDrv serverDrv; + +#endif diff --git a/firmware/libraries/WiFi/src/utility/spi_drv.cpp b/firmware/libraries/WiFi/src/utility/spi_drv.cpp new file mode 100644 index 0000000..2bf1bb7 --- /dev/null +++ b/firmware/libraries/WiFi/src/utility/spi_drv.cpp @@ -0,0 +1,496 @@ +/* + spi_drv.cpp - Library for Arduino Wifi shield. + Copyright (c) 2011-2014 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "Arduino.h" +#include +#include "utility/spi_drv.h" +#include "pins_arduino.h" +//#define _DEBUG_ +extern "C" { +#include "utility/debug.h" +} + +#define DATAOUT 11 // MOSI +#define DATAIN 12 // MISO +#define SPICLOCK 13 // sck +#define SLAVESELECT 10 // ss +#define SLAVEREADY 7 // handshake pin +#define WIFILED 9 // led on wifi shield + +#define DELAY_SPI(X) { int ii=0; do { asm volatile("nop"); } while (++ii < (X*F_CPU/16000000)); } +#define DELAY_TRANSFER() DELAY_SPI(10) + +void SpiDrv::begin() +{ + SPI.begin(); + pinMode(SLAVESELECT, OUTPUT); + pinMode(SLAVEREADY, INPUT); + pinMode(WIFILED, OUTPUT); + + // digitalWrite(SCK, LOW); + // digitalWrite(MOSI, LOW); + digitalWrite(SS, HIGH); + digitalWrite(SLAVESELECT, HIGH); + digitalWrite(WIFILED, LOW); + +#ifdef _DEBUG_ + INIT_TRIGGER() +#endif +} + +void SpiDrv::end() { + SPI.end(); +} + +void SpiDrv::spiSlaveSelect() +{ + digitalWrite(SLAVESELECT,LOW); +} + + +void SpiDrv::spiSlaveDeselect() +{ + digitalWrite(SLAVESELECT,HIGH); +} + + +char SpiDrv::spiTransfer(volatile char data) +{ + char result = SPI.transfer(data); + DELAY_TRANSFER(); + + return result; // return the received byte +} + +int SpiDrv::waitSpiChar(unsigned char waitChar) +{ + int timeout = TIMEOUT_CHAR; + unsigned char _readChar = 0; + do{ + _readChar = readChar(); //get data byte + if (_readChar == ERR_CMD) + { + WARN("Err cmd received\n"); + return -1; + } + }while((timeout-- > 0) && (_readChar != waitChar)); + return (_readChar == waitChar); +} + +int SpiDrv::readAndCheckChar(char checkChar, char* readChar) +{ + getParam((uint8_t*)readChar); + + return (*readChar == checkChar); +} + +char SpiDrv::readChar() +{ + uint8_t readChar = 0; + getParam(&readChar); + return readChar; +} + +#define WAIT_START_CMD(x) waitSpiChar(START_CMD) + +#define IF_CHECK_START_CMD(x) \ + if (!WAIT_START_CMD(_data)) \ + { \ + TOGGLE_TRIGGER() \ + WARN("Error waiting START_CMD"); \ + return 0; \ + }else \ + +#define CHECK_DATA(check, x) \ + if (!readAndCheckChar(check, &x)) \ + { \ + TOGGLE_TRIGGER() \ + WARN("Reply error"); \ + INFO2(check, (uint8_t)x); \ + return 0; \ + }else \ + +#define waitSlaveReady() (digitalRead(SLAVEREADY) == LOW) +#define waitSlaveSign() (digitalRead(SLAVEREADY) == HIGH) +#define waitSlaveSignalH() while(digitalRead(SLAVEREADY) != HIGH){} +#define waitSlaveSignalL() while(digitalRead(SLAVEREADY) != LOW){} + +void SpiDrv::waitForSlaveSign() +{ + while (!waitSlaveSign()); +} + +void SpiDrv::waitForSlaveReady() +{ + while (!waitSlaveReady()); +} + +void SpiDrv::getParam(uint8_t* param) +{ + // Get Params data + *param = spiTransfer(DUMMY_DATA); + DELAY_TRANSFER(); +} + +int SpiDrv::waitResponseCmd(uint8_t cmd, uint8_t numParam, uint8_t* param, uint8_t* param_len) +{ + char _data = 0; + int ii = 0; + + IF_CHECK_START_CMD(_data) + { + CHECK_DATA(cmd | REPLY_FLAG, _data){}; + + CHECK_DATA(numParam, _data); + { + readParamLen8(param_len); + for (ii=0; ii<(*param_len); ++ii) + { + // Get Params data + //param[ii] = spiTransfer(DUMMY_DATA); + getParam(¶m[ii]); + } + } + + readAndCheckChar(END_CMD, &_data); + } + + return 1; +} +/* +int SpiDrv::waitResponse(uint8_t cmd, uint8_t numParam, uint8_t* param, uint16_t* param_len) +{ + char _data = 0; + int i =0, ii = 0; + + IF_CHECK_START_CMD(_data) + { + CHECK_DATA(cmd | REPLY_FLAG, _data){}; + + CHECK_DATA(numParam, _data); + { + readParamLen16(param_len); + for (ii=0; ii<(*param_len); ++ii) + { + // Get Params data + param[ii] = spiTransfer(DUMMY_DATA); + } + } + + readAndCheckChar(END_CMD, &_data); + } + + return 1; +} +*/ + +int SpiDrv::waitResponseData16(uint8_t cmd, uint8_t* param, uint16_t* param_len) +{ + char _data = 0; + uint16_t ii = 0; + + IF_CHECK_START_CMD(_data) + { + CHECK_DATA(cmd | REPLY_FLAG, _data){}; + + uint8_t numParam = readChar(); + if (numParam != 0) + { + readParamLen16(param_len); + for (ii=0; ii<(*param_len); ++ii) + { + // Get Params data + param[ii] = spiTransfer(DUMMY_DATA); + } + } + + readAndCheckChar(END_CMD, &_data); + } + + return 1; +} + +int SpiDrv::waitResponseData8(uint8_t cmd, uint8_t* param, uint8_t* param_len) +{ + char _data = 0; + int ii = 0; + + IF_CHECK_START_CMD(_data) + { + CHECK_DATA(cmd | REPLY_FLAG, _data){}; + + uint8_t numParam = readChar(); + if (numParam != 0) + { + readParamLen8(param_len); + for (ii=0; ii<(*param_len); ++ii) + { + // Get Params data + param[ii] = spiTransfer(DUMMY_DATA); + } + } + + readAndCheckChar(END_CMD, &_data); + } + + return 1; +} + +int SpiDrv::waitResponseParams(uint8_t cmd, uint8_t numParam, tParam* params) +{ + char _data = 0; + int i =0, ii = 0; + + + IF_CHECK_START_CMD(_data) + { + CHECK_DATA(cmd | REPLY_FLAG, _data){}; + + uint8_t _numParam = readChar(); + if (_numParam != 0) + { + for (i=0; i<_numParam; ++i) + { + params[i].paramLen = readParamLen8(); + for (ii=0; ii maxNumParams) + { + numParam = maxNumParams; + } + *numParamRead = numParam; + if (numParam != 0) + { + for (i=0; i maxNumParams) + { + numParam = maxNumParams; + } + *numParamRead = numParam; + if (numParam != 0) + { + for (i=0; i>8)); + spiTransfer((uint8_t)(param_len & 0xff)); +} + +uint8_t SpiDrv::readParamLen8(uint8_t* param_len) +{ + uint8_t _param_len = spiTransfer(DUMMY_DATA); + if (param_len != NULL) + { + *param_len = _param_len; + } + return _param_len; +} + +uint16_t SpiDrv::readParamLen16(uint16_t* param_len) +{ + uint16_t _param_len = spiTransfer(DUMMY_DATA)<<8 | (spiTransfer(DUMMY_DATA)& 0xff); + if (param_len != NULL) + { + *param_len = _param_len; + } + return _param_len; +} + + +void SpiDrv::sendBuffer(uint8_t* param, uint16_t param_len, uint8_t lastParam) +{ + uint16_t i = 0; + + // Send Spi paramLen + sendParamLen16(param_len); + + // Send Spi param data + for (i=0; i>8)); + spiTransfer((uint8_t)(param & 0xff)); + + // if lastParam==1 Send Spi END CMD + if (lastParam == 1) + spiTransfer(END_CMD); +} + +/* Cmd Struct Message */ +/* _________________________________________________________________________________ */ +/*| START CMD | C/R | CMD |[TOT LEN]| N.PARAM | PARAM LEN | PARAM | .. | END CMD | */ +/*|___________|______|______|_________|_________|___________|________|____|_________| */ +/*| 8 bit | 1bit | 7bit | 8bit | 8bit | 8bit | nbytes | .. | 8bit | */ +/*|___________|______|______|_________|_________|___________|________|____|_________| */ + +void SpiDrv::sendCmd(uint8_t cmd, uint8_t numParam) +{ + // Send Spi START CMD + spiTransfer(START_CMD); + + //waitForSlaveSign(); + //wait the interrupt trigger on slave + delayMicroseconds(SPI_START_CMD_DELAY); + + // Send Spi C + cmd + spiTransfer(cmd & ~(REPLY_FLAG)); + + // Send Spi totLen + //spiTransfer(totLen); + + // Send Spi numParam + spiTransfer(numParam); + + // If numParam == 0 send END CMD + if (numParam == 0) + spiTransfer(END_CMD); + +} + +SpiDrv spiDrv; diff --git a/firmware/libraries/WiFi/src/utility/spi_drv.h b/firmware/libraries/WiFi/src/utility/spi_drv.h new file mode 100644 index 0000000..ab8d97d --- /dev/null +++ b/firmware/libraries/WiFi/src/utility/spi_drv.h @@ -0,0 +1,106 @@ +/* + spi_drv.h - Library for Arduino Wifi shield. + Copyright (c) 2011-2014 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef SPI_Drv_h +#define SPI_Drv_h + +#include +#include "utility/wifi_spi.h" + +#define SPI_START_CMD_DELAY 10 + +#define NO_LAST_PARAM 0 +#define LAST_PARAM 1 + +#define DUMMY_DATA 0xFF + +#define WAIT_FOR_SLAVE_SELECT() \ + if (!initialized) { \ + SpiDrv::begin(); \ + initialized = true; \ + } \ + SpiDrv::waitForSlaveReady(); \ + SpiDrv::spiSlaveSelect(); + +static bool initialized = false; + +class SpiDrv +{ +private: + //static bool waitSlaveReady(); + static void waitForSlaveSign(); + static void getParam(uint8_t* param); +public: + + static void begin(); + + static void end(); + + static void spiDriverInit(); + + static void spiSlaveSelect(); + + static void spiSlaveDeselect(); + + static char spiTransfer(volatile char data); + + static void waitForSlaveReady(); + + //static int waitSpiChar(char waitChar, char* readChar); + + static int waitSpiChar(unsigned char waitChar); + + static int readAndCheckChar(char checkChar, char* readChar); + + static char readChar(); + + static int waitResponseParams(uint8_t cmd, uint8_t numParam, tParam* params); + + static int waitResponseCmd(uint8_t cmd, uint8_t numParam, uint8_t* param, uint8_t* param_len); + + static int waitResponseData8(uint8_t cmd, uint8_t* param, uint8_t* param_len); + + static int waitResponseData16(uint8_t cmd, uint8_t* param, uint16_t* param_len); + /* + static int waitResponse(uint8_t cmd, tParam* params, uint8_t* numParamRead, uint8_t maxNumParams); + + static int waitResponse(uint8_t cmd, uint8_t numParam, uint8_t* param, uint16_t* param_len); +*/ + static int waitResponse(uint8_t cmd, uint8_t* numParamRead, uint8_t** params, uint8_t maxNumParams); + + static void sendParam(uint8_t* param, uint8_t param_len, uint8_t lastParam = NO_LAST_PARAM); + + static void sendParamLen8(uint8_t param_len); + + static void sendParamLen16(uint16_t param_len); + + static uint8_t readParamLen8(uint8_t* param_len = NULL); + + static uint16_t readParamLen16(uint16_t* param_len = NULL); + + static void sendBuffer(uint8_t* param, uint16_t param_len, uint8_t lastParam = NO_LAST_PARAM); + + static void sendParam(uint16_t param, uint8_t lastParam = NO_LAST_PARAM); + + static void sendCmd(uint8_t cmd, uint8_t numParam); +}; + +extern SpiDrv spiDrv; + +#endif diff --git a/firmware/libraries/WiFi/src/utility/wifi_drv.cpp b/firmware/libraries/WiFi/src/utility/wifi_drv.cpp new file mode 100644 index 0000000..bee61bf --- /dev/null +++ b/firmware/libraries/WiFi/src/utility/wifi_drv.cpp @@ -0,0 +1,579 @@ +/* + wifi_drv.cpp - Library for Arduino Wifi shield. + Copyright (c) 2011-2014 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include +#include +#include + +#include "Arduino.h" +#include "utility/spi_drv.h" +#include "utility/wifi_drv.h" + +#define _DEBUG_ + +extern "C" { +#include "utility/wifi_spi.h" +#include "utility/wl_types.h" +#include "utility/debug.h" +} + +// Array of data to cache the information related to the networks discovered +char WiFiDrv::_networkSsid[][WL_SSID_MAX_LENGTH] = {{"1"},{"2"},{"3"},{"4"},{"5"}}; +int32_t WiFiDrv::_networkRssi[WL_NETWORKS_LIST_MAXNUM] = { 0 }; +uint8_t WiFiDrv::_networkEncr[WL_NETWORKS_LIST_MAXNUM] = { 0 }; + +// Cached values of retrieved data +char WiFiDrv::_ssid[] = {0}; +uint8_t WiFiDrv::_bssid[] = {0}; +uint8_t WiFiDrv::_mac[] = {0}; +uint8_t WiFiDrv::_localIp[] = {0}; +uint8_t WiFiDrv::_subnetMask[] = {0}; +uint8_t WiFiDrv::_gatewayIp[] = {0}; +// Firmware version +char WiFiDrv::fwVersion[] = {0}; + + +// Private Methods + +void WiFiDrv::getNetworkData(uint8_t *ip, uint8_t *mask, uint8_t *gwip) +{ + tParam params[PARAM_NUMS_3] = { {0, (char*)ip}, {0, (char*)mask}, {0, (char*)gwip}}; + + WAIT_FOR_SLAVE_SELECT(); + + // Send Command + SpiDrv::sendCmd(GET_IPADDR_CMD, PARAM_NUMS_1); + + uint8_t _dummy = DUMMY_DATA; + SpiDrv::sendParam(&_dummy, sizeof(_dummy), LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + SpiDrv::waitResponseParams(GET_IPADDR_CMD, PARAM_NUMS_3, params); + + SpiDrv::spiSlaveDeselect(); +} + +void WiFiDrv::getRemoteData(uint8_t sock, uint8_t *ip, uint8_t *port) +{ + tParam params[PARAM_NUMS_2] = { {0, (char*)ip}, {0, (char*)port} }; + + WAIT_FOR_SLAVE_SELECT(); + + // Send Command + SpiDrv::sendCmd(GET_REMOTE_DATA_CMD, PARAM_NUMS_1); + SpiDrv::sendParam(&sock, sizeof(sock), LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + SpiDrv::waitResponseParams(GET_REMOTE_DATA_CMD, PARAM_NUMS_2, params); + + SpiDrv::spiSlaveDeselect(); +} + + +// Public Methods + + +void WiFiDrv::wifiDriverInit() +{ + SpiDrv::begin(); +} + +int8_t WiFiDrv::wifiSetNetwork(char* ssid, uint8_t ssid_len) +{ + WAIT_FOR_SLAVE_SELECT(); + // Send Command + SpiDrv::sendCmd(SET_NET_CMD, PARAM_NUMS_1); + SpiDrv::sendParam((uint8_t*)ssid, ssid_len, LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _data = 0; + uint8_t _dataLen = 0; + if (!SpiDrv::waitResponseCmd(SET_NET_CMD, PARAM_NUMS_1, &_data, &_dataLen)) + { + WARN("error waitResponse"); + _data = WL_FAILURE; + } + SpiDrv::spiSlaveDeselect(); + + return(_data == WIFI_SPI_ACK) ? WL_SUCCESS : WL_FAILURE; +} + +int8_t WiFiDrv::wifiSetPassphrase(char* ssid, uint8_t ssid_len, const char *passphrase, const uint8_t len) +{ + WAIT_FOR_SLAVE_SELECT(); + // Send Command + SpiDrv::sendCmd(SET_PASSPHRASE_CMD, PARAM_NUMS_2); + SpiDrv::sendParam((uint8_t*)ssid, ssid_len, NO_LAST_PARAM); + SpiDrv::sendParam((uint8_t*)passphrase, len, LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _data = 0; + uint8_t _dataLen = 0; + if (!SpiDrv::waitResponseCmd(SET_PASSPHRASE_CMD, PARAM_NUMS_1, &_data, &_dataLen)) + { + WARN("error waitResponse"); + _data = WL_FAILURE; + } + SpiDrv::spiSlaveDeselect(); + return _data; +} + + +int8_t WiFiDrv::wifiSetKey(char* ssid, uint8_t ssid_len, uint8_t key_idx, const void *key, const uint8_t len) +{ + WAIT_FOR_SLAVE_SELECT(); + // Send Command + SpiDrv::sendCmd(SET_KEY_CMD, PARAM_NUMS_3); + SpiDrv::sendParam((uint8_t*)ssid, ssid_len, NO_LAST_PARAM); + SpiDrv::sendParam(&key_idx, KEY_IDX_LEN, NO_LAST_PARAM); + SpiDrv::sendParam((uint8_t*)key, len, LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _data = 0; + uint8_t _dataLen = 0; + if (!SpiDrv::waitResponseCmd(SET_KEY_CMD, PARAM_NUMS_1, &_data, &_dataLen)) + { + WARN("error waitResponse"); + _data = WL_FAILURE; + } + SpiDrv::spiSlaveDeselect(); + return _data; +} + +void WiFiDrv::config(uint8_t validParams, uint32_t local_ip, uint32_t gateway, uint32_t subnet) +{ + WAIT_FOR_SLAVE_SELECT(); + // Send Command + SpiDrv::sendCmd(SET_IP_CONFIG_CMD, PARAM_NUMS_4); + SpiDrv::sendParam((uint8_t*)&validParams, 1, NO_LAST_PARAM); + SpiDrv::sendParam((uint8_t*)&local_ip, 4, NO_LAST_PARAM); + SpiDrv::sendParam((uint8_t*)&gateway, 4, NO_LAST_PARAM); + SpiDrv::sendParam((uint8_t*)&subnet, 4, LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _data = 0; + uint8_t _dataLen = 0; + if (!SpiDrv::waitResponseCmd(SET_IP_CONFIG_CMD, PARAM_NUMS_1, &_data, &_dataLen)) + { + WARN("error waitResponse"); + _data = WL_FAILURE; + } + SpiDrv::spiSlaveDeselect(); +} + +void WiFiDrv::setDNS(uint8_t validParams, uint32_t dns_server1, uint32_t dns_server2) +{ + WAIT_FOR_SLAVE_SELECT(); + // Send Command + SpiDrv::sendCmd(SET_DNS_CONFIG_CMD, PARAM_NUMS_3); + SpiDrv::sendParam((uint8_t*)&validParams, 1, NO_LAST_PARAM); + SpiDrv::sendParam((uint8_t*)&dns_server1, 4, NO_LAST_PARAM); + SpiDrv::sendParam((uint8_t*)&dns_server2, 4, LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _data = 0; + uint8_t _dataLen = 0; + if (!SpiDrv::waitResponseCmd(SET_DNS_CONFIG_CMD, PARAM_NUMS_1, &_data, &_dataLen)) + { + WARN("error waitResponse"); + _data = WL_FAILURE; + } + SpiDrv::spiSlaveDeselect(); +} + + + +int8_t WiFiDrv::disconnect() +{ + WAIT_FOR_SLAVE_SELECT(); + // Send Command + SpiDrv::sendCmd(DISCONNECT_CMD, PARAM_NUMS_1); + + uint8_t _dummy = DUMMY_DATA; + SpiDrv::sendParam(&_dummy, 1, LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _data = 0; + uint8_t _dataLen = 0; + int8_t result = SpiDrv::waitResponseCmd(DISCONNECT_CMD, PARAM_NUMS_1, &_data, &_dataLen); + + SpiDrv::spiSlaveDeselect(); + + return result; +} + +uint8_t WiFiDrv::getConnectionStatus() +{ + WAIT_FOR_SLAVE_SELECT(); + + // Send Command + SpiDrv::sendCmd(GET_CONN_STATUS_CMD, PARAM_NUMS_0); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _data = -1; + uint8_t _dataLen = 0; + SpiDrv::waitResponseCmd(GET_CONN_STATUS_CMD, PARAM_NUMS_1, &_data, &_dataLen); + + SpiDrv::spiSlaveDeselect(); + + return _data; +} + +uint8_t* WiFiDrv::getMacAddress() +{ + WAIT_FOR_SLAVE_SELECT(); + + // Send Command + SpiDrv::sendCmd(GET_MACADDR_CMD, PARAM_NUMS_1); + + uint8_t _dummy = DUMMY_DATA; + SpiDrv::sendParam(&_dummy, 1, LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _dataLen = 0; + SpiDrv::waitResponseCmd(GET_MACADDR_CMD, PARAM_NUMS_1, _mac, &_dataLen); + + SpiDrv::spiSlaveDeselect(); + + return _mac; +} + +void WiFiDrv::getIpAddress(IPAddress& ip) +{ + getNetworkData(_localIp, _subnetMask, _gatewayIp); + ip = _localIp; +} + + void WiFiDrv::getSubnetMask(IPAddress& mask) + { + getNetworkData(_localIp, _subnetMask, _gatewayIp); + mask = _subnetMask; + } + + void WiFiDrv::getGatewayIP(IPAddress& ip) + { + getNetworkData(_localIp, _subnetMask, _gatewayIp); + ip = _gatewayIp; + } + +char* WiFiDrv::getCurrentSSID() +{ + WAIT_FOR_SLAVE_SELECT(); + + // Send Command + SpiDrv::sendCmd(GET_CURR_SSID_CMD, PARAM_NUMS_1); + + uint8_t _dummy = DUMMY_DATA; + SpiDrv::sendParam(&_dummy, 1, LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _dataLen = 0; + SpiDrv::waitResponseCmd(GET_CURR_SSID_CMD, PARAM_NUMS_1, (uint8_t*)_ssid, &_dataLen); + + SpiDrv::spiSlaveDeselect(); + + return _ssid; +} + +uint8_t* WiFiDrv::getCurrentBSSID() +{ + WAIT_FOR_SLAVE_SELECT(); + + // Send Command + SpiDrv::sendCmd(GET_CURR_BSSID_CMD, PARAM_NUMS_1); + + uint8_t _dummy = DUMMY_DATA; + SpiDrv::sendParam(&_dummy, 1, LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _dataLen = 0; + SpiDrv::waitResponseCmd(GET_CURR_BSSID_CMD, PARAM_NUMS_1, _bssid, &_dataLen); + + SpiDrv::spiSlaveDeselect(); + + return _bssid; +} + +int32_t WiFiDrv::getCurrentRSSI() +{ + WAIT_FOR_SLAVE_SELECT(); + + // Send Command + SpiDrv::sendCmd(GET_CURR_RSSI_CMD, PARAM_NUMS_1); + + uint8_t _dummy = DUMMY_DATA; + SpiDrv::sendParam(&_dummy, 1, LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _dataLen = 0; + int32_t rssi = 0; + SpiDrv::waitResponseCmd(GET_CURR_RSSI_CMD, PARAM_NUMS_1, (uint8_t*)&rssi, &_dataLen); + + SpiDrv::spiSlaveDeselect(); + + return rssi; +} + +uint8_t WiFiDrv::getCurrentEncryptionType() +{ + WAIT_FOR_SLAVE_SELECT(); + + // Send Command + SpiDrv::sendCmd(GET_CURR_ENCT_CMD, PARAM_NUMS_1); + + uint8_t _dummy = DUMMY_DATA; + SpiDrv::sendParam(&_dummy, 1, LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t dataLen = 0; + uint8_t encType = 0; + SpiDrv::waitResponseCmd(GET_CURR_ENCT_CMD, PARAM_NUMS_1, (uint8_t*)&encType, &dataLen); + + SpiDrv::spiSlaveDeselect(); + + return encType; +} + +int8_t WiFiDrv::startScanNetworks() +{ + WAIT_FOR_SLAVE_SELECT(); + + // Send Command + SpiDrv::sendCmd(START_SCAN_NETWORKS, PARAM_NUMS_0); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _data = 0; + uint8_t _dataLen = 0; + + if (!SpiDrv::waitResponseCmd(START_SCAN_NETWORKS, PARAM_NUMS_1, &_data, &_dataLen)) + { + WARN("error waitResponse"); + _data = WL_FAILURE; + } + + SpiDrv::spiSlaveDeselect(); + + return (_data == WL_FAILURE)? _data : WL_SUCCESS; +} + + +uint8_t WiFiDrv::getScanNetworks() +{ + WAIT_FOR_SLAVE_SELECT(); + + // Send Command + SpiDrv::sendCmd(SCAN_NETWORKS, PARAM_NUMS_0); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t ssidListNum = 0; + SpiDrv::waitResponse(SCAN_NETWORKS, &ssidListNum, (uint8_t**)_networkSsid, WL_NETWORKS_LIST_MAXNUM); + + SpiDrv::spiSlaveDeselect(); + + return ssidListNum; +} + +char* WiFiDrv::getSSIDNetoworks(uint8_t networkItem) +{ + if (networkItem >= WL_NETWORKS_LIST_MAXNUM) + return NULL; + + return _networkSsid[networkItem]; +} + +uint8_t WiFiDrv::getEncTypeNetowrks(uint8_t networkItem) +{ + if (networkItem >= WL_NETWORKS_LIST_MAXNUM) + return NULL; + + WAIT_FOR_SLAVE_SELECT(); + + // Send Command + SpiDrv::sendCmd(GET_IDX_ENCT_CMD, PARAM_NUMS_1); + + SpiDrv::sendParam(&networkItem, 1, LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t dataLen = 0; + uint8_t encType = 0; + SpiDrv::waitResponseCmd(GET_IDX_ENCT_CMD, PARAM_NUMS_1, (uint8_t*)&encType, &dataLen); + + SpiDrv::spiSlaveDeselect(); + + return encType; +} + +int32_t WiFiDrv::getRSSINetoworks(uint8_t networkItem) +{ + if (networkItem >= WL_NETWORKS_LIST_MAXNUM) + return NULL; + int32_t networkRssi = 0; + + WAIT_FOR_SLAVE_SELECT(); + + // Send Command + SpiDrv::sendCmd(GET_IDX_RSSI_CMD, PARAM_NUMS_1); + + SpiDrv::sendParam(&networkItem, 1, LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t dataLen = 0; + SpiDrv::waitResponseCmd(GET_IDX_RSSI_CMD, PARAM_NUMS_1, (uint8_t*)&networkRssi, &dataLen); + + SpiDrv::spiSlaveDeselect(); + + return networkRssi; +} + +uint8_t WiFiDrv::reqHostByName(const char* aHostname) +{ + WAIT_FOR_SLAVE_SELECT(); + + // Send Command + SpiDrv::sendCmd(REQ_HOST_BY_NAME_CMD, PARAM_NUMS_1); + SpiDrv::sendParam((uint8_t*)aHostname, strlen(aHostname), LAST_PARAM); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _data = 0; + uint8_t _dataLen = 0; + uint8_t result = SpiDrv::waitResponseCmd(REQ_HOST_BY_NAME_CMD, PARAM_NUMS_1, &_data, &_dataLen); + + SpiDrv::spiSlaveDeselect(); + + return result; +} + +int WiFiDrv::getHostByName(IPAddress& aResult) +{ + uint8_t _ipAddr[WL_IPV4_LENGTH]; + IPAddress dummy(0xFF,0xFF,0xFF,0xFF); + int result = 0; + + WAIT_FOR_SLAVE_SELECT(); + // Send Command + SpiDrv::sendCmd(GET_HOST_BY_NAME_CMD, PARAM_NUMS_0); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _dataLen = 0; + if (!SpiDrv::waitResponseCmd(GET_HOST_BY_NAME_CMD, PARAM_NUMS_1, _ipAddr, &_dataLen)) + { + WARN("error waitResponse"); + }else{ + aResult = _ipAddr; + result = (aResult != dummy); + } + SpiDrv::spiSlaveDeselect(); + return result; +} + +int WiFiDrv::getHostByName(const char* aHostname, IPAddress& aResult) +{ + uint8_t retry = 10; + if (reqHostByName(aHostname)) + { + while(!getHostByName(aResult) && --retry > 0) + { + delay(1000); + } + }else{ + return 0; + } + return (retry>0); +} + +char* WiFiDrv::getFwVersion() +{ + WAIT_FOR_SLAVE_SELECT(); + // Send Command + SpiDrv::sendCmd(GET_FW_VERSION_CMD, PARAM_NUMS_0); + + //Wait the reply elaboration + SpiDrv::waitForSlaveReady(); + + // Wait for reply + uint8_t _dataLen = 0; + if (!SpiDrv::waitResponseCmd(GET_FW_VERSION_CMD, PARAM_NUMS_1, (uint8_t*)fwVersion, &_dataLen)) + { + WARN("error waitResponse"); + } + SpiDrv::spiSlaveDeselect(); + return fwVersion; +} + +WiFiDrv wiFiDrv; diff --git a/firmware/libraries/WiFi/src/utility/wifi_drv.h b/firmware/libraries/WiFi/src/utility/wifi_drv.h new file mode 100644 index 0000000..423865f --- /dev/null +++ b/firmware/libraries/WiFi/src/utility/wifi_drv.h @@ -0,0 +1,267 @@ +/* + wifi_drv.h - Library for Arduino Wifi shield. + Copyright (c) 2011-2014 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef WiFi_Drv_h +#define WiFi_Drv_h + +#include +#include "utility/wifi_spi.h" +#include "IPAddress.h" +#include "WiFiUdp.h" + +// Key index length +#define KEY_IDX_LEN 1 +// 5 secs of delay to have the connection established +#define WL_DELAY_START_CONNECTION 5000 +// firmware version string length +#define WL_FW_VER_LENGTH 6 + +class WiFiDrv +{ +private: + // settings of requested network + static char _networkSsid[WL_NETWORKS_LIST_MAXNUM][WL_SSID_MAX_LENGTH]; + static int32_t _networkRssi[WL_NETWORKS_LIST_MAXNUM]; + static uint8_t _networkEncr[WL_NETWORKS_LIST_MAXNUM]; + + // firmware version string in the format a.b.c + static char fwVersion[WL_FW_VER_LENGTH]; + + // settings of current selected network + static char _ssid[WL_SSID_MAX_LENGTH]; + static uint8_t _bssid[WL_MAC_ADDR_LENGTH]; + static uint8_t _mac[WL_MAC_ADDR_LENGTH]; + static uint8_t _localIp[WL_IPV4_LENGTH]; + static uint8_t _subnetMask[WL_IPV4_LENGTH]; + static uint8_t _gatewayIp[WL_IPV4_LENGTH]; + + /* + * Get network Data information + */ + static void getNetworkData(uint8_t *ip, uint8_t *mask, uint8_t *gwip); + + static uint8_t reqHostByName(const char* aHostname); + + static int getHostByName(IPAddress& aResult); + + /* + * Get remote Data information on UDP socket + */ + static void getRemoteData(uint8_t sock, uint8_t *ip, uint8_t *port); + +public: + + /* + * Driver initialization + */ + static void wifiDriverInit(); + + /* + * Set the desired network which the connection manager should try to + * connect to. + * + * The ssid of the desired network should be specified. + * + * param ssid: The ssid of the desired network. + * param ssid_len: Lenght of ssid string. + * return: WL_SUCCESS or WL_FAILURE + */ + static int8_t wifiSetNetwork(char* ssid, uint8_t ssid_len); + + /* Start Wifi connection with passphrase + * the most secure supported mode will be automatically selected + * + * param ssid: Pointer to the SSID string. + * param ssid_len: Lenght of ssid string. + * param passphrase: Passphrase. Valid characters in a passphrase + * must be between ASCII 32-126 (decimal). + * param len: Lenght of passphrase string. + * return: WL_SUCCESS or WL_FAILURE + */ + static int8_t wifiSetPassphrase(char* ssid, uint8_t ssid_len, const char *passphrase, const uint8_t len); + + /* Start Wifi connection with WEP encryption. + * Configure a key into the device. The key type (WEP-40, WEP-104) + * is determined by the size of the key (5 bytes for WEP-40, 13 bytes for WEP-104). + * + * param ssid: Pointer to the SSID string. + * param ssid_len: Lenght of ssid string. + * param key_idx: The key index to set. Valid values are 0-3. + * param key: Key input buffer. + * param len: Lenght of key string. + * return: WL_SUCCESS or WL_FAILURE + */ + static int8_t wifiSetKey(char* ssid, uint8_t ssid_len, uint8_t key_idx, const void *key, const uint8_t len); + + /* Set ip configuration disabling dhcp client + * + * param validParams: set the number of parameters that we want to change + * i.e. validParams = 1 means that we'll change only ip address + * validParams = 3 means that we'll change ip address, gateway and netmask + * param local_ip: Static ip configuration + * param gateway: Static gateway configuration + * param subnet: Static subnet mask configuration + */ + static void config(uint8_t validParams, uint32_t local_ip, uint32_t gateway, uint32_t subnet); + + /* Set DNS ip configuration + * + * param validParams: set the number of parameters that we want to change + * i.e. validParams = 1 means that we'll change only dns_server1 + * validParams = 2 means that we'll change dns_server1 and dns_server2 + * param dns_server1: Static DNS server1 configuration + * param dns_server2: Static DNS server2 configuration + */ + static void setDNS(uint8_t validParams, uint32_t dns_server1, uint32_t dns_server2); + + /* + * Disconnect from the network + * + * return: WL_SUCCESS or WL_FAILURE + */ + static int8_t disconnect(); + + /* + * Disconnect from the network + * + * return: one value of wl_status_t enum + */ + static uint8_t getConnectionStatus(); + + /* + * Get the interface MAC address. + * + * return: pointer to uint8_t array with length WL_MAC_ADDR_LENGTH + */ + static uint8_t* getMacAddress(); + + /* + * Get the interface IP address. + * + * return: copy the ip address value in IPAddress object + */ + static void getIpAddress(IPAddress& ip); + + /* + * Get the interface subnet mask address. + * + * return: copy the subnet mask address value in IPAddress object + */ + static void getSubnetMask(IPAddress& mask); + + /* + * Get the gateway ip address. + * + * return: copy the gateway ip address value in IPAddress object + */ + static void getGatewayIP(IPAddress& ip); + + /* + * Return the current SSID associated with the network + * + * return: ssid string + */ + static char* getCurrentSSID(); + + /* + * Return the current BSSID associated with the network. + * It is the MAC address of the Access Point + * + * return: pointer to uint8_t array with length WL_MAC_ADDR_LENGTH + */ + static uint8_t* getCurrentBSSID(); + + /* + * Return the current RSSI /Received Signal Strength in dBm) + * associated with the network + * + * return: signed value + */ + static int32_t getCurrentRSSI(); + + /* + * Return the Encryption Type associated with the network + * + * return: one value of wl_enc_type enum + */ + static uint8_t getCurrentEncryptionType(); + + /* + * Start scan WiFi networks available + * + * return: Number of discovered networks + */ + static int8_t startScanNetworks(); + + /* + * Get the networks available + * + * return: Number of discovered networks + */ + static uint8_t getScanNetworks(); + + /* + * Return the SSID discovered during the network scan. + * + * param networkItem: specify from which network item want to get the information + * + * return: ssid string of the specified item on the networks scanned list + */ + static char* getSSIDNetoworks(uint8_t networkItem); + + /* + * Return the RSSI of the networks discovered during the scanNetworks + * + * param networkItem: specify from which network item want to get the information + * + * return: signed value of RSSI of the specified item on the networks scanned list + */ + static int32_t getRSSINetoworks(uint8_t networkItem); + + /* + * Return the encryption type of the networks discovered during the scanNetworks + * + * param networkItem: specify from which network item want to get the information + * + * return: encryption type (enum wl_enc_type) of the specified item on the networks scanned list + */ + static uint8_t getEncTypeNetowrks(uint8_t networkItem); + + /* + * Resolve the given hostname to an IP address. + * param aHostname: Name to be resolved + * param aResult: IPAddress structure to store the returned IP address + * result: 1 if aIPAddrString was successfully converted to an IP address, + * else error code + */ + static int getHostByName(const char* aHostname, IPAddress& aResult); + + /* + * Get the firmware version + * result: version as string with this format a.b.c + */ + static char* getFwVersion(); + + friend class WiFiUDP; + +}; + +extern WiFiDrv wiFiDrv; + +#endif diff --git a/firmware/libraries/WiFi/src/utility/wifi_spi.h b/firmware/libraries/WiFi/src/utility/wifi_spi.h new file mode 100644 index 0000000..d0cc754 --- /dev/null +++ b/firmware/libraries/WiFi/src/utility/wifi_spi.h @@ -0,0 +1,173 @@ +/* + wifi_spi.h - Library for Arduino Wifi shield. + Copyright (c) 2011-2014 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef WiFi_Spi_h +#define WiFi_Spi_h + +#include +#include "utility/wl_definitions.h" + +#define CMD_FLAG 0 +#define REPLY_FLAG 1<<7 +#define DATA_FLAG 0x40 + +#define WIFI_SPI_ACK 1 +#define WIFI_SPI_ERR 0xFF + +#define TIMEOUT_CHAR 1000 + +//#define MAX_SOCK_NUM 4 /**< Maxmium number of socket */ +#define NO_SOCKET_AVAIL 255 + +#define START_CMD 0xE0 +#define END_CMD 0xEE +#define ERR_CMD 0xEF +#define CMD_POS 1 // Position of Command OpCode on SPI stream +#define PARAM_LEN_POS 2 // Position of Param len on SPI stream + + +enum { + SET_NET_CMD = 0x10, + SET_PASSPHRASE_CMD = 0x11, + SET_KEY_CMD = 0x12, + TEST_CMD = 0x13, + SET_IP_CONFIG_CMD = 0x14, + SET_DNS_CONFIG_CMD = 0x15, + + GET_CONN_STATUS_CMD = 0x20, + GET_IPADDR_CMD = 0x21, + GET_MACADDR_CMD = 0x22, + GET_CURR_SSID_CMD = 0x23, + GET_CURR_BSSID_CMD = 0x24, + GET_CURR_RSSI_CMD = 0x25, + GET_CURR_ENCT_CMD = 0x26, + SCAN_NETWORKS = 0x27, + START_SERVER_TCP_CMD= 0x28, + GET_STATE_TCP_CMD = 0x29, + DATA_SENT_TCP_CMD = 0x2A, + AVAIL_DATA_TCP_CMD = 0x2B, + GET_DATA_TCP_CMD = 0x2C, + START_CLIENT_TCP_CMD= 0x2D, + STOP_CLIENT_TCP_CMD = 0x2E, + GET_CLIENT_STATE_TCP_CMD= 0x2F, + DISCONNECT_CMD = 0x30, + GET_IDX_SSID_CMD = 0x31, + GET_IDX_RSSI_CMD = 0x32, + GET_IDX_ENCT_CMD = 0x33, + REQ_HOST_BY_NAME_CMD= 0x34, + GET_HOST_BY_NAME_CMD= 0x35, + START_SCAN_NETWORKS = 0x36, + GET_FW_VERSION_CMD = 0x37, + GET_TEST_CMD = 0x38, + SEND_DATA_UDP_CMD = 0x39, + GET_REMOTE_DATA_CMD = 0x3A, + + // All command with DATA_FLAG 0x40 send a 16bit Len + + SEND_DATA_TCP_CMD = 0x44, + GET_DATABUF_TCP_CMD = 0x45, + INSERT_DATABUF_CMD = 0x46, +}; + + +enum wl_tcp_state { + CLOSED = 0, + LISTEN = 1, + SYN_SENT = 2, + SYN_RCVD = 3, + ESTABLISHED = 4, + FIN_WAIT_1 = 5, + FIN_WAIT_2 = 6, + CLOSE_WAIT = 7, + CLOSING = 8, + LAST_ACK = 9, + TIME_WAIT = 10 +}; + + +enum numParams{ + PARAM_NUMS_0, + PARAM_NUMS_1, + PARAM_NUMS_2, + PARAM_NUMS_3, + PARAM_NUMS_4, + PARAM_NUMS_5, + MAX_PARAM_NUMS +}; + +#define MAX_PARAMS MAX_PARAM_NUMS-1 +#define PARAM_LEN_SIZE 1 + +typedef struct __attribute__((__packed__)) +{ + uint8_t paramLen; + char* param; +}tParam; + +typedef struct __attribute__((__packed__)) +{ + uint16_t dataLen; + char* data; +}tDataParam; + + +typedef struct __attribute__((__packed__)) +{ + unsigned char cmd; + unsigned char tcmd; + unsigned char nParam; + tParam params[MAX_PARAMS]; +}tSpiMsg; + +typedef struct __attribute__((__packed__)) +{ + unsigned char cmd; + unsigned char tcmd; + unsigned char nParam; + tDataParam params[MAX_PARAMS]; +}tSpiMsgData; + + +typedef struct __attribute__((__packed__)) +{ + unsigned char cmd; + unsigned char tcmd; + //unsigned char totLen; + unsigned char nParam; +}tSpiHdr; + +typedef struct __attribute__((__packed__)) +{ + uint8_t paramLen; + uint32_t param; +}tLongParam; + +typedef struct __attribute__((__packed__)) +{ + uint8_t paramLen; + uint16_t param; +}tIntParam; + +typedef struct __attribute__((__packed__)) +{ + uint8_t paramLen; + uint8_t param; +}tByteParam; + +#endif diff --git a/firmware/libraries/WiFi/src/utility/wl_definitions.h b/firmware/libraries/WiFi/src/utility/wl_definitions.h new file mode 100644 index 0000000..70d1de4 --- /dev/null +++ b/firmware/libraries/WiFi/src/utility/wl_definitions.h @@ -0,0 +1,72 @@ +/* + wl_definitions.h - Library for Arduino Wifi shield. + Copyright (c) 2011-2014 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ +/* + * wl_definitions.h + * + * Created on: Mar 6, 2011 + * Author: dlafauci + */ + +#ifndef WL_DEFINITIONS_H_ +#define WL_DEFINITIONS_H_ + +// Maximum size of a SSID +#define WL_SSID_MAX_LENGTH 32 +// Length of passphrase. Valid lengths are 8-63. +#define WL_WPA_KEY_MAX_LENGTH 63 +// Length of key in bytes. Valid values are 5 and 13. +#define WL_WEP_KEY_MAX_LENGTH 13 +// Size of a MAC-address or BSSID +#define WL_MAC_ADDR_LENGTH 6 +// Size of a MAC-address or BSSID +#define WL_IPV4_LENGTH 4 +// Maximum size of a SSID list +#define WL_NETWORKS_LIST_MAXNUM 10 +// Maxmium number of socket +#define MAX_SOCK_NUM 4 +// Socket not available constant +#define SOCK_NOT_AVAIL 255 +// Default state value for Wifi state field +#define NA_STATE -1 +//Maximum number of attempts to establish wifi connection +#define WL_MAX_ATTEMPT_CONNECTION 10 + +typedef enum { + WL_NO_SHIELD = 255, + WL_IDLE_STATUS = 0, + WL_NO_SSID_AVAIL, + WL_SCAN_COMPLETED, + WL_CONNECTED, + WL_CONNECT_FAILED, + WL_CONNECTION_LOST, + WL_DISCONNECTED +} wl_status_t; + +/* Encryption modes */ +enum wl_enc_type { /* Values map to 802.11 encryption suites... */ + ENC_TYPE_WEP = 5, + ENC_TYPE_TKIP = 2, + ENC_TYPE_CCMP = 4, + /* ... except these two, 7 and 8 are reserved in 802.11-2007 */ + ENC_TYPE_NONE = 7, + ENC_TYPE_AUTO = 8 +}; + + +#endif /* WL_DEFINITIONS_H_ */ diff --git a/firmware/libraries/WiFi/src/utility/wl_types.h b/firmware/libraries/WiFi/src/utility/wl_types.h new file mode 100644 index 0000000..b9fd5fa --- /dev/null +++ b/firmware/libraries/WiFi/src/utility/wl_types.h @@ -0,0 +1,49 @@ +/* + wl_types.h - Library for Arduino Wifi shield. + Copyright (c) 2011-2014 Arduino. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ +/* + * wl_types.h + * + * Created on: Jul 30, 2010 + * Author: dlafauci + */ + + +#ifndef _WL_TYPES_H_ +#define _WL_TYPES_H_ + +#include + +typedef enum { + WL_FAILURE = -1, + WL_SUCCESS = 1, +} wl_error_code_t; + +/* Authentication modes */ +enum wl_auth_mode { + AUTH_MODE_INVALID, + AUTH_MODE_AUTO, + AUTH_MODE_OPEN_SYSTEM, + AUTH_MODE_SHARED_KEY, + AUTH_MODE_WPA, + AUTH_MODE_WPA2, + AUTH_MODE_WPA_PSK, + AUTH_MODE_WPA2_PSK +}; + +#endif //_WL_TYPES_H_ diff --git a/firmware/libraries/WiFiManager/LICENSE b/firmware/libraries/WiFiManager/LICENSE new file mode 100644 index 0000000..1dabff5 --- /dev/null +++ b/firmware/libraries/WiFiManager/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 tzapu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/firmware/libraries/WiFiManager/README.md b/firmware/libraries/WiFiManager/README.md new file mode 100644 index 0000000..3782339 --- /dev/null +++ b/firmware/libraries/WiFiManager/README.md @@ -0,0 +1,374 @@ +## Current development going on here :arrow_right: [Development Branch](https://github.com/tzapu/WiFiManager/tree/development) + +# WiFiManager +ESP8266 WiFi Connection manager with fallback web configuration portal + +[![Build Status](https://travis-ci.org/tzapu/WiFiManager.svg?branch=master)](https://travis-ci.org/tzapu/WiFiManager) + +The configuration portal is of the captive variety, so on various devices it will present the configuration dialogue as soon as you connect to the created access point. + +First attempt at a library. Lots more changes and fixes to do. Contributions are welcome. + +#### This works with the ESP8266 Arduino platform with a recent stable release(2.0.0 or newer) https://github.com/esp8266/Arduino + +## Contents + - [How it works](#how-it-works) + - [Wishlist](#wishlist) + - [Quick start](#quick-start) + - Installing + - [Through Library Manager](#install-through-library-manager) + - [From Github](#checkout-from-github) + - [Using](#using) + - [Documentation](#documentation) + - [Access Point Password](#password-protect-the-configuration-access-point) + - [Callbacks](#callbacks) + - [Configuration Portal Timeout](#configuration-portal-timeout) + - [On Demand Configuration](#on-demand-configuration-portal) + - [Custom Parameters](#custom-parameters) + - [Custom IP Configuration](#custom-ip-configuration) + - [Filter Low Quality Networks](#filter-networks) + - [Debug Output](#debug) + - [Troubleshooting](#troubleshooting) + - [Releases](#releases) + - [Contributors](#contributions-and-thanks) + + +## How It Works +- when your ESP starts up, it sets it up in Station mode and tries to connect to a previously saved Access Point +- if this is unsuccessful (or no previous network saved) it moves the ESP into Access Point mode and spins up a DNS and WebServer (default ip 192.168.4.1) +- using any wifi enabled device with a browser (computer, phone, tablet) connect to the newly created Access Point +- because of the Captive Portal and the DNS server you will either get a 'Join to network' type of popup or get any domain you try to access redirected to the configuration portal +- choose one of the access points scanned, enter password, click save +- ESP will try to connect. If successful, it relinquishes control back to your app. If not, reconnect to AP and reconfigure. + +## How It Looks +![ESP8266 WiFi Captive Portal Homepage](http://i.imgur.com/YPvW9eql.png) ![ESP8266 WiFi Captive Portal Configuration](http://i.imgur.com/oicWJ4gl.png) + +## Wishlist +- [x] remove dependency on EEPROM library +- [x] move HTML Strings to PROGMEM +- [x] cleanup and streamline code (although this is ongoing) +- [x] if timeout is set, extend it when a page is fetched in AP mode +- [x] add ability to configure more parameters than ssid/password +- [x] maybe allow setting ip of ESP after reboot +- [x] add to Arduino Library Manager +- [x] add to PlatformIO +- [ ] add multiple sets of network credentials +- [x] allow users to customize CSS +- [ ] ESP32 support or instructions +- [ ] rewrite documentation for simplicity, based on scenarios/goals +- [ ] rely on the SDK's built in auto connect more than forcing a connect + +## Quick Start + +### Installing +You can either install through the Arduino Library Manager or checkout the latest changes or a release from github + +#### Install through Library Manager +__Currently version 0.8+ works with release 2.0.0 or newer of the [ESP8266 core for Arduino](https://github.com/esp8266/Arduino)__ + - in Arduino IDE got to Sketch/Include Library/Manage Libraries + ![Manage Libraries](http://i.imgur.com/9BkEBkR.png) + + - search for WiFiManager + ![WiFiManager package](http://i.imgur.com/18yIai8.png) + + - click Install and start [using it](#using) + +#### Checkout from github +__Github version works with release 2.0.0 or newer of the [ESP8266 core for Arduino](https://github.com/esp8266/Arduino)__ +- Checkout library to your Arduino libraries folder + +### Using +- Include in your sketch +```cpp +#include //ESP8266 Core WiFi Library (you most likely already have this in your sketch) + +#include //Local DNS Server used for redirecting all requests to the configuration portal +#include //Local WebServer used to serve the configuration portal +#include //https://github.com/tzapu/WiFiManager WiFi Configuration Magic +``` + +- Initialize library, in your setup function add +```cpp +WiFiManager wifiManager; +``` + +- Also in the setup function add +```cpp +//first parameter is name of access point, second is the password +wifiManager.autoConnect("AP-NAME", "AP-PASSWORD"); +``` +if you just want an unsecured access point +```cpp +wifiManager.autoConnect("AP-NAME"); +``` +or if you want to use and auto generated name from 'ESP' and the esp's Chip ID use +```cpp +wifiManager.autoConnect(); +``` + +After you write your sketch and start the ESP, it will try to connect to WiFi. If it fails it starts in Access Point mode. +While in AP mode, connect to it then open a browser to the gateway IP, default 192.168.4.1, configure wifi, save and it should reboot and connect. + +Also see [examples](https://github.com/tzapu/WiFiManager/tree/master/examples). + +## Documentation + +#### Password protect the configuration Access Point +You can and should password protect the configuration access point. Simply add the password as a second parameter to `autoConnect`. +A short password seems to have unpredictable results so use one that's around 8 characters or more in length. +The guidelines are that a wifi password must consist of 8 to 63 ASCII-encoded characters in the range of 32 to 126 (decimal) +```cpp +wifiManager.autoConnect("AutoConnectAP", "password") +``` + +#### Callbacks +##### Enter Config mode +Use this if you need to do something when your device enters configuration mode on failed WiFi connection attempt. +Before `autoConnect()` +```cpp +wifiManager.setAPCallback(configModeCallback); +``` +`configModeCallback` declaration and example +```cpp +void configModeCallback (WiFiManager *myWiFiManager) { + Serial.println("Entered config mode"); + Serial.println(WiFi.softAPIP()); + + Serial.println(myWiFiManager->getConfigPortalSSID()); +} +``` + +##### Save settings +This gets called when custom parameters have been set **AND** a connection has been established. Use it to set a flag, so when all the configuration finishes, you can save the extra parameters somewhere. + +See [AutoConnectWithFSParameters Example](https://github.com/tzapu/WiFiManager/tree/master/examples/AutoConnectWithFSParameters). +```cpp +wifiManager.setSaveConfigCallback(saveConfigCallback); +``` +`saveConfigCallback` declaration and example +```cpp +//flag for saving data +bool shouldSaveConfig = false; + +//callback notifying us of the need to save config +void saveConfigCallback () { + Serial.println("Should save config"); + shouldSaveConfig = true; +} +``` + +#### Configuration Portal Timeout +If you need to set a timeout so the ESP doesn't hang waiting to be configured, for instance after a power failure, you can add +```cpp +wifiManager.setConfigPortalTimeout(180); +``` +which will wait 3 minutes (180 seconds). When the time passes, the autoConnect function will return, no matter the outcome. +Check for connection and if it's still not established do whatever is needed (on some modules I restart them to retry, on others I enter deep sleep) + +#### On Demand Configuration Portal +If you would rather start the configuration portal on demand rather than automatically on a failed connection attempt, then this is for you. + +Instead of calling `autoConnect()` which does all the connecting and failover configuration portal setup for you, you need to use `startConfigPortal()`. __Do not use BOTH.__ + +Example usage +```cpp +void loop() { + // is configuration portal requested? + if ( digitalRead(TRIGGER_PIN) == LOW ) { + WiFiManager wifiManager; + wifiManager.startConfigPortal("OnDemandAP"); + Serial.println("connected...yeey :)"); + } +} +``` +See example for a more complex version. [OnDemandConfigPortal](https://github.com/tzapu/WiFiManager/tree/master/examples/OnDemandConfigPortal) + +#### Custom Parameters +You can use WiFiManager to collect more parameters than just SSID and password. +This could be helpful for configuring stuff like MQTT host and port, [blynk](http://www.blynk.cc) or [emoncms](http://emoncms.org) tokens, just to name a few. +**You are responsible for saving and loading these custom values.** The library just collects and displays the data for you as a convenience. +Usage scenario would be: +- load values from somewhere (EEPROM/FS) or generate some defaults +- add the custom parameters to WiFiManager using + ```cpp + // id/name, placeholder/prompt, default, length + WiFiManagerParameter custom_mqtt_server("server", "mqtt server", mqtt_server, 40); + wifiManager.addParameter(&custom_mqtt_server); + + ``` +- if connection to AP fails, configuration portal starts and you can set /change the values (or use on demand configuration portal) +- once configuration is done and connection is established [save config callback]() is called +- once WiFiManager returns control to your application, read and save the new values using the `WiFiManagerParameter` object. + ```cpp + mqtt_server = custom_mqtt_server.getValue(); + ``` +This feature is a lot more involved than all the others, so here are some examples to fully show how it is done. +You should also take a look at adding custom HTML to your form. + +- Save and load custom parameters to file system in json form [AutoConnectWithFSParameters](https://github.com/tzapu/WiFiManager/tree/master/examples/AutoConnectWithFSParameters) +- *Save and load custom parameters to EEPROM* (not done yet) + +#### Custom IP Configuration +You can set a custom IP for both AP (access point, config mode) and STA (station mode, client mode, normal project state) + +##### Custom Access Point IP Configuration +This will set your captive portal to a specific IP should you need/want such a feature. Add the following snippet before `autoConnect()` +```cpp +//set custom ip for portal +wifiManager.setAPStaticIPConfig(IPAddress(10,0,1,1), IPAddress(10,0,1,1), IPAddress(255,255,255,0)); +``` + +##### Custom Station (client) Static IP Configuration +This will make use the specified IP configuration instead of using DHCP in station mode. +```cpp +wifiManager.setSTAStaticIPConfig(IPAddress(192,168,0,99), IPAddress(192,168,0,1), IPAddress(255,255,255,0)); +``` +There are a couple of examples in the examples folder that show you how to set a static IP and even how to configure it through the web configuration portal. + +#### Custom HTML, CSS, Javascript +There are various ways in which you can inject custom HTML, CSS or Javascript into the configuration portal. +The options are: +- inject custom head element +You can use this to any html bit to the head of the configuration portal. If you add a `"); +``` +- inject a custom bit of html in the configuration form +```cpp +WiFiManagerParameter custom_text("

This is just a text paragraph

"); +wifiManager.addParameter(&custom_text); +``` +- inject a custom bit of html in a configuration form element +Just add the bit you want added as the last parameter to the custom parameter constructor. +```cpp +WiFiManagerParameter custom_mqtt_server("server", "mqtt server", "iot.eclipse", 40, " readonly"); +``` + +#### Filter Networks +You can filter networks based on signal quality and show/hide duplicate networks. + +- If you would like to filter low signal quality networks you can tell WiFiManager to not show networks below an arbitrary quality %; +```cpp +wifiManager.setMinimumSignalQuality(10); +``` +will not show networks under 10% signal quality. If you omit the parameter it defaults to 8%; + +- You can also remove or show duplicate networks (default is remove). +Use this function to show (or hide) all networks. +```cpp +wifiManager.setRemoveDuplicateAPs(false); +``` + +#### Debug +Debug is enabled by default on Serial. To disable add before autoConnect +```cpp +wifiManager.setDebugOutput(false); +``` + +## Troubleshooting +If you get compilation errors, more often than not, you may need to install a newer version of the ESP8266 core for Arduino. + +Changes added on 0.8 should make the latest trunk work without compilation errors. Tested down to ESP8266 core 2.0.0. **Please update to version 0.8** + +I am trying to keep releases working with release versions of the core, so they can be installed through boards manager, but if you checkout the latest version directly from github, sometimes, the library will only work if you update the ESP8266 core to the latest version because I am using some newly added function. + +If you connect to the created configuration Access Point but the configuration portal does not show up, just open a browser and type in the IP of the web portal, by default `192.168.4.1`. + +If trying to connect ends up in an endless loop, try to add `setConnectTimeout(60)` before `autoConnect();`. The parameter is timeout to try connecting in seconds. + +## Releases +#### 0.12 +- removed 204 header response +- fixed incompatibility with other libs using isnan and other std:: functions without namespace + +##### 0.11 +- a lot more reliable reconnecting to networks +- custom html in custom parameters (for read only params) +- custom html in custom parameter form (like labels) +- custom head element (like custom css) +- sort networks based on signal quality +- remove duplicate networks + +##### 0.10 +- some css changes +- bug fixes and speed improvements +- added an alternative to waitForConnectResult() for debugging +- changed `setTimeout(seconds)` to `setConfigPortalTimeout(seconds)` + +##### 0.9 + - fixed support for encoded characters in ssid/pass + +##### 0.8 + - made it compile on older versions of ESP8266 core as well, tested down to 2.0.0 + - added simple example for Custom IP + +##### 0.7 + - added static IP in station mode + - added example of persisting custom IP to FS config.json + - more option on portal homepage + - added on PlatformIO + +##### 0.6 + - custom parameters + - prettier + - on demand config portal + - commit #100 :D + +##### 0.5 + - Added to Arduino Boards Manager - Thanks Max + - moved most stuff to PROGMEM + - added signal quality and a nice little padlock to show which networks are encrypted + +##### v0.4 - all of it user contributed changes - Thank you + - added ability to password protect the configuration Access Point + - callback for enter configuration mode + - memory allocation improvements + +##### v0.3 + - removed the need for EEPROM and works with the 2.0.0 and above stable release of the ESP8266 for Arduino IDE package + - removed restart on save of credentials + - updated examples + +##### v0.2 +needs the latest staging version (or at least a recent release of the staging version) to work + +##### v0.1 +works with the staging release ver. 1.6.5-1044-g170995a, built on Aug 10, 2015 of the ESP8266 Arduino library. + + +### Contributions and thanks +The support and help I got from the community has been nothing short of phenomenal. I can't thank you guys enough. This is my first real attept in developing open source stuff and I must say, now I understand why people are so dedicated to it, it is because of all the wonderful people involved. + +__THANK YOU__ + +[Shawn A](https://github.com/tablatronix) + +[Maximiliano Duarte](https://github.com/domonetic) + +[alltheblinkythings](https://github.com/alltheblinkythings) + +[Niklas Wall](https://github.com/niklaswall) + +[Jakub Piasecki](https://github.com/zaporylie) + +[Peter Allan](https://github.com/alwynallan) + +[John Little](https://github.com/j0hnlittle) + +[markaswift](https://github.com/markaswift) + +[franklinvv](https://github.com/franklinvv) + +[Alberto Ricci Bitti](https://github.com/riccibitti) + +[SebiPanther](https://github.com/SebiPanther) + +[jonathanendersby](https://github.com/jonathanendersby) + +[walthercarsten](https://github.com/walthercarsten) + +Sorry if i have missed anyone. + +#### Inspiration +- http://www.esp8266.com/viewtopic.php?f=29&t=2520 diff --git a/firmware/libraries/WiFiManager/WiFiManager.cpp b/firmware/libraries/WiFiManager/WiFiManager.cpp new file mode 100644 index 0000000..1e6d805 --- /dev/null +++ b/firmware/libraries/WiFiManager/WiFiManager.cpp @@ -0,0 +1,804 @@ +/************************************************************** + WiFiManager is a library for the ESP8266/Arduino platform + (https://github.com/esp8266/Arduino) to enable easy + configuration and reconfiguration of WiFi credentials using a Captive Portal + inspired by: + http://www.esp8266.com/viewtopic.php?f=29&t=2520 + https://github.com/chriscook8/esp-arduino-apboot + https://github.com/esp8266/Arduino/tree/master/libraries/DNSServer/examples/CaptivePortalAdvanced + Built by AlexT https://github.com/tzapu + Licensed under MIT license + **************************************************************/ + +#include "WiFiManager.h" + +WiFiManagerParameter::WiFiManagerParameter(const char *custom) { + _id = NULL; + _placeholder = NULL; + _length = 0; + _value = NULL; + + _customHTML = custom; +} + +WiFiManagerParameter::WiFiManagerParameter(const char *id, const char *placeholder, const char *defaultValue, int length) { + init(id, placeholder, defaultValue, length, ""); +} + +WiFiManagerParameter::WiFiManagerParameter(const char *id, const char *placeholder, const char *defaultValue, int length, const char *custom) { + init(id, placeholder, defaultValue, length, custom); +} + +void WiFiManagerParameter::init(const char *id, const char *placeholder, const char *defaultValue, int length, const char *custom) { + _id = id; + _placeholder = placeholder; + _length = length; + _value = new char[length + 1]; + for (int i = 0; i < length + 1; i++) { + _value[i] = 0; + } + if (defaultValue != NULL) { + strncpy(_value, defaultValue, length); + } + + _customHTML = custom; +} + +WiFiManagerParameter::~WiFiManagerParameter() { + if (_value != NULL) { + delete[] _value; + } +} + +const char* WiFiManagerParameter::getValue() { + return _value; +} +const char* WiFiManagerParameter::getID() { + return _id; +} +const char* WiFiManagerParameter::getPlaceholder() { + return _placeholder; +} +int WiFiManagerParameter::getValueLength() { + return _length; +} +const char* WiFiManagerParameter::getCustomHTML() { + return _customHTML; +} + + +WiFiManager::WiFiManager() { + _max_params = WIFI_MANAGER_MAX_PARAMS; + _params = (WiFiManagerParameter**)malloc(_max_params * sizeof(WiFiManagerParameter*)); +} + +WiFiManager::~WiFiManager() +{ + if (_params != NULL) + { + DEBUG_WM(F("freeing allocated params!")); + free(_params); + } +} + +bool WiFiManager::addParameter(WiFiManagerParameter *p) { + if(_paramsCount + 1 > _max_params) + { + // rezise the params array + _max_params += WIFI_MANAGER_MAX_PARAMS; + DEBUG_WM(F("Increasing _max_params to:")); + DEBUG_WM(_max_params); + WiFiManagerParameter** new_params = (WiFiManagerParameter**)realloc(_params, _max_params * sizeof(WiFiManagerParameter*)); + if (new_params != NULL) { + _params = new_params; + } else { + DEBUG_WM(F("ERROR: failed to realloc params, size not increased!")); + return false; + } + } + + _params[_paramsCount] = p; + _paramsCount++; + DEBUG_WM(F("Adding parameter")); + DEBUG_WM(p->getID()); + return true; +} + +void WiFiManager::setupConfigPortal() { + dnsServer.reset(new DNSServer()); + server.reset(new ESP8266WebServer(80)); + + DEBUG_WM(F("")); + _configPortalStart = millis(); + + DEBUG_WM(F("Configuring access point... ")); + DEBUG_WM(_apName); + if (_apPassword != NULL) { + if (strlen(_apPassword) < 8 || strlen(_apPassword) > 63) { + // fail passphrase to short or long! + DEBUG_WM(F("Invalid AccessPoint password. Ignoring")); + _apPassword = NULL; + } + DEBUG_WM(_apPassword); + } + + //optional soft ip config + if (_ap_static_ip) { + DEBUG_WM(F("Custom AP IP/GW/Subnet")); + WiFi.softAPConfig(_ap_static_ip, _ap_static_gw, _ap_static_sn); + } + + if (_apPassword != NULL) { + WiFi.softAP(_apName, _apPassword);//password option + } else { + WiFi.softAP(_apName); + } + + delay(500); // Without delay I've seen the IP address blank + DEBUG_WM(F("AP IP address: ")); + DEBUG_WM(WiFi.softAPIP()); + + /* Setup the DNS server redirecting all the domains to the apIP */ + dnsServer->setErrorReplyCode(DNSReplyCode::NoError); + dnsServer->start(DNS_PORT, "*", WiFi.softAPIP()); + + /* Setup web pages: root, wifi config pages, SO captive portal detectors and not found. */ + server->on(String(F("/")), std::bind(&WiFiManager::handleRoot, this)); + server->on(String(F("/wifi")), std::bind(&WiFiManager::handleWifi, this, true)); + server->on(String(F("/0wifi")), std::bind(&WiFiManager::handleWifi, this, false)); + server->on(String(F("/wifisave")), std::bind(&WiFiManager::handleWifiSave, this)); + server->on(String(F("/i")), std::bind(&WiFiManager::handleInfo, this)); + server->on(String(F("/r")), std::bind(&WiFiManager::handleReset, this)); + //server->on("/generate_204", std::bind(&WiFiManager::handle204, this)); //Android/Chrome OS captive portal check. + server->on(String(F("/fwlink")), std::bind(&WiFiManager::handleRoot, this)); //Microsoft captive portal. Maybe not needed. Might be handled by notFound handler. + server->onNotFound (std::bind(&WiFiManager::handleNotFound, this)); + server->begin(); // Web server start + DEBUG_WM(F("HTTP server started")); + +} + +boolean WiFiManager::autoConnect() { + String ssid = "ESP" + String(ESP.getChipId()); + return autoConnect(ssid.c_str(), NULL); +} + +boolean WiFiManager::autoConnect(char const *apName, char const *apPassword) { + DEBUG_WM(F("")); + DEBUG_WM(F("AutoConnect")); + + // read eeprom for ssid and pass + //String ssid = getSSID(); + //String pass = getPassword(); + + // attempt to connect; should it fail, fall back to AP + WiFi.mode(WIFI_STA); + + if (connectWifi("", "") == WL_CONNECTED) { + DEBUG_WM(F("IP Address:")); + DEBUG_WM(WiFi.localIP()); + //connected + return true; + } + + return startConfigPortal(apName, apPassword); +} + +boolean WiFiManager::configPortalHasTimeout(){ + if(_configPortalTimeout == 0 || wifi_softap_get_station_num() > 0){ + _configPortalStart = millis(); // kludge, bump configportal start time to skew timeouts + return false; + } + return (millis() > _configPortalStart + _configPortalTimeout); +} + +boolean WiFiManager::startConfigPortal() { + String ssid = "ESP" + String(ESP.getChipId()); + return startConfigPortal(ssid.c_str(), NULL); +} + +boolean WiFiManager::startConfigPortal(char const *apName, char const *apPassword) { + //setup AP + WiFi.mode(WIFI_AP_STA); + DEBUG_WM(F("SET AP STA")); + + _apName = apName; + _apPassword = apPassword; + + //notify we entered AP mode + if ( _apcallback != NULL) { + _apcallback(this); + } + + connect = false; + setupConfigPortal(); + + while(1){ + + // check if timeout + if(configPortalHasTimeout()) break; + + //DNS + dnsServer->processNextRequest(); + //HTTP + server->handleClient(); + + + if (connect) { + connect = false; + delay(2000); + DEBUG_WM(F("Connecting to new AP")); + + // using user-provided _ssid, _pass in place of system-stored ssid and pass + if (connectWifi(_ssid, _pass) != WL_CONNECTED) { + DEBUG_WM(F("Failed to connect.")); + } else { + //connected + WiFi.mode(WIFI_STA); + //notify that configuration has changed and any optional parameters should be saved + if ( _savecallback != NULL) { + //todo: check if any custom parameters actually exist, and check if they really changed maybe + _savecallback(); + } + break; + } + + if (_shouldBreakAfterConfig) { + //flag set to exit after config after trying to connect + //notify that configuration has changed and any optional parameters should be saved + if ( _savecallback != NULL) { + //todo: check if any custom parameters actually exist, and check if they really changed maybe + _savecallback(); + } + break; + } + } + yield(); + } + + server.reset(); + dnsServer.reset(); + + return WiFi.status() == WL_CONNECTED; +} + + +int WiFiManager::connectWifi(String ssid, String pass) { + DEBUG_WM(F("Connecting as wifi client...")); + + // check if we've got static_ip settings, if we do, use those. + if (_sta_static_ip) { + DEBUG_WM(F("Custom STA IP/GW/Subnet")); + WiFi.config(_sta_static_ip, _sta_static_gw, _sta_static_sn); + DEBUG_WM(WiFi.localIP()); + } + //fix for auto connect racing issue + if (WiFi.status() == WL_CONNECTED) { + DEBUG_WM(F("Already connected. Bailing out.")); + return WL_CONNECTED; + } + //check if we have ssid and pass and force those, if not, try with last saved values + if (ssid != "") { + WiFi.begin(ssid.c_str(), pass.c_str()); + } else { + if (WiFi.SSID()) { + DEBUG_WM(F("Using last saved values, should be faster")); + //trying to fix connection in progress hanging + ETS_UART_INTR_DISABLE(); + wifi_station_disconnect(); + ETS_UART_INTR_ENABLE(); + + WiFi.begin(); + } else { + DEBUG_WM(F("No saved credentials")); + } + } + + int connRes = waitForConnectResult(); + DEBUG_WM ("Connection result: "); + DEBUG_WM ( connRes ); + //not connected, WPS enabled, no pass - first attempt + if (_tryWPS && connRes != WL_CONNECTED && pass == "") { + startWPS(); + //should be connected at the end of WPS + connRes = waitForConnectResult(); + } + return connRes; +} + +uint8_t WiFiManager::waitForConnectResult() { + if (_connectTimeout == 0) { + return WiFi.waitForConnectResult(); + } else { + DEBUG_WM (F("Waiting for connection result with time out")); + unsigned long start = millis(); + boolean keepConnecting = true; + uint8_t status; + while (keepConnecting) { + status = WiFi.status(); + if (millis() > start + _connectTimeout) { + keepConnecting = false; + DEBUG_WM (F("Connection timed out")); + } + if (status == WL_CONNECTED || status == WL_CONNECT_FAILED) { + keepConnecting = false; + } + delay(100); + } + return status; + } +} + +void WiFiManager::startWPS() { + DEBUG_WM(F("START WPS")); + WiFi.beginWPSConfig(); + DEBUG_WM(F("END WPS")); +} +/* + String WiFiManager::getSSID() { + if (_ssid == "") { + DEBUG_WM(F("Reading SSID")); + _ssid = WiFi.SSID(); + DEBUG_WM(F("SSID: ")); + DEBUG_WM(_ssid); + } + return _ssid; + } + + String WiFiManager::getPassword() { + if (_pass == "") { + DEBUG_WM(F("Reading Password")); + _pass = WiFi.psk(); + DEBUG_WM("Password: " + _pass); + //DEBUG_WM(_pass); + } + return _pass; + } +*/ +String WiFiManager::getConfigPortalSSID() { + return _apName; +} + +void WiFiManager::resetSettings() { + DEBUG_WM(F("settings invalidated")); + DEBUG_WM(F("THIS MAY CAUSE AP NOT TO START UP PROPERLY. YOU NEED TO COMMENT IT OUT AFTER ERASING THE DATA.")); + WiFi.disconnect(true); + //delay(200); +} +void WiFiManager::setTimeout(unsigned long seconds) { + setConfigPortalTimeout(seconds); +} + +void WiFiManager::setConfigPortalTimeout(unsigned long seconds) { + _configPortalTimeout = seconds * 1000; +} + +void WiFiManager::setConnectTimeout(unsigned long seconds) { + _connectTimeout = seconds * 1000; +} + +void WiFiManager::setDebugOutput(boolean debug) { + _debug = debug; +} + +void WiFiManager::setAPStaticIPConfig(IPAddress ip, IPAddress gw, IPAddress sn) { + _ap_static_ip = ip; + _ap_static_gw = gw; + _ap_static_sn = sn; +} + +void WiFiManager::setSTAStaticIPConfig(IPAddress ip, IPAddress gw, IPAddress sn) { + _sta_static_ip = ip; + _sta_static_gw = gw; + _sta_static_sn = sn; +} + +void WiFiManager::setMinimumSignalQuality(int quality) { + _minimumQuality = quality; +} + +void WiFiManager::setBreakAfterConfig(boolean shouldBreak) { + _shouldBreakAfterConfig = shouldBreak; +} + +/** Handle root or redirect to captive portal */ +void WiFiManager::handleRoot() { + DEBUG_WM(F("Handle root")); + if (captivePortal()) { // If caprive portal redirect instead of displaying the page. + return; + } + + String page = FPSTR(HTTP_HEAD); + page.replace("{v}", "Options"); + page += FPSTR(HTTP_SCRIPT); + page += FPSTR(HTTP_STYLE); + page += _customHeadElement; + page += FPSTR(HTTP_HEAD_END); + page += String(F("

")); + page += _apName; + page += String(F("

")); + page += String(F("

WiFiManager

")); + page += FPSTR(HTTP_PORTAL_OPTIONS); + page += FPSTR(HTTP_END); + + server->sendHeader("Content-Length", String(page.length())); + server->send(200, "text/html", page); + +} + +/** Wifi config page handler */ +void WiFiManager::handleWifi(boolean scan) { + + String page = FPSTR(HTTP_HEAD); + page.replace("{v}", "Config ESP"); + page += FPSTR(HTTP_SCRIPT); + page += FPSTR(HTTP_STYLE); + page += _customHeadElement; + page += FPSTR(HTTP_HEAD_END); + + if (scan) { + int n = WiFi.scanNetworks(); + DEBUG_WM(F("Scan done")); + if (n == 0) { + DEBUG_WM(F("No networks found")); + page += F("No networks found. Refresh to scan again."); + } else { + + //sort networks + int indices[n]; + for (int i = 0; i < n; i++) { + indices[i] = i; + } + + // RSSI SORT + + // old sort + for (int i = 0; i < n; i++) { + for (int j = i + 1; j < n; j++) { + if (WiFi.RSSI(indices[j]) > WiFi.RSSI(indices[i])) { + std::swap(indices[i], indices[j]); + } + } + } + + /*std::sort(indices, indices + n, [](const int & a, const int & b) -> bool + { + return WiFi.RSSI(a) > WiFi.RSSI(b); + });*/ + + // remove duplicates ( must be RSSI sorted ) + if (_removeDuplicateAPs) { + String cssid; + for (int i = 0; i < n; i++) { + if (indices[i] == -1) continue; + cssid = WiFi.SSID(indices[i]); + for (int j = i + 1; j < n; j++) { + if (cssid == WiFi.SSID(indices[j])) { + DEBUG_WM("DUP AP: " + WiFi.SSID(indices[j])); + indices[j] = -1; // set dup aps to index -1 + } + } + } + } + + //display networks in page + for (int i = 0; i < n; i++) { + if (indices[i] == -1) continue; // skip dups + DEBUG_WM(WiFi.SSID(indices[i])); + DEBUG_WM(WiFi.RSSI(indices[i])); + int quality = getRSSIasQuality(WiFi.RSSI(indices[i])); + + if (_minimumQuality == -1 || _minimumQuality < quality) { + String item = FPSTR(HTTP_ITEM); + String rssiQ; + rssiQ += quality; + item.replace("{v}", WiFi.SSID(indices[i])); + item.replace("{r}", rssiQ); + if (WiFi.encryptionType(indices[i]) != ENC_TYPE_NONE) { + item.replace("{i}", "l"); + } else { + item.replace("{i}", ""); + } + //DEBUG_WM(item); + page += item; + delay(0); + } else { + DEBUG_WM(F("Skipping due to quality")); + } + + } + page += "
"; + } + } + + page += FPSTR(HTTP_FORM_START); + char parLength[5]; + // add the extra parameters to the form + for (int i = 0; i < _paramsCount; i++) { + if (_params[i] == NULL) { + break; + } + + String pitem = FPSTR(HTTP_FORM_PARAM); + if (_params[i]->getID() != NULL) { + pitem.replace("{i}", _params[i]->getID()); + pitem.replace("{n}", _params[i]->getID()); + pitem.replace("{p}", _params[i]->getPlaceholder()); + snprintf(parLength, 5, "%d", _params[i]->getValueLength()); + pitem.replace("{l}", parLength); + pitem.replace("{v}", _params[i]->getValue()); + pitem.replace("{c}", _params[i]->getCustomHTML()); + } else { + pitem = _params[i]->getCustomHTML(); + } + + page += pitem; + } + if (_params[0] != NULL) { + page += "
"; + } + + if (_sta_static_ip) { + + String item = FPSTR(HTTP_FORM_PARAM); + item.replace("{i}", "ip"); + item.replace("{n}", "ip"); + item.replace("{p}", "Static IP"); + item.replace("{l}", "15"); + item.replace("{v}", _sta_static_ip.toString()); + + page += item; + + item = FPSTR(HTTP_FORM_PARAM); + item.replace("{i}", "gw"); + item.replace("{n}", "gw"); + item.replace("{p}", "Static Gateway"); + item.replace("{l}", "15"); + item.replace("{v}", _sta_static_gw.toString()); + + page += item; + + item = FPSTR(HTTP_FORM_PARAM); + item.replace("{i}", "sn"); + item.replace("{n}", "sn"); + item.replace("{p}", "Subnet"); + item.replace("{l}", "15"); + item.replace("{v}", _sta_static_sn.toString()); + + page += item; + + page += "
"; + } + + page += FPSTR(HTTP_FORM_END); + page += FPSTR(HTTP_SCAN_LINK); + + page += FPSTR(HTTP_END); + + server->sendHeader("Content-Length", String(page.length())); + server->send(200, "text/html", page); + + + DEBUG_WM(F("Sent config page")); +} + +/** Handle the WLAN save form and redirect to WLAN config page again */ +void WiFiManager::handleWifiSave() { + DEBUG_WM(F("WiFi save")); + + //SAVE/connect here + _ssid = server->arg("s").c_str(); + _pass = server->arg("p").c_str(); + + //parameters + for (int i = 0; i < _paramsCount; i++) { + if (_params[i] == NULL) { + break; + } + //read parameter + String value = server->arg(_params[i]->getID()).c_str(); + //store it in array + value.toCharArray(_params[i]->_value, _params[i]->_length + 1); + DEBUG_WM(F("Parameter")); + DEBUG_WM(_params[i]->getID()); + DEBUG_WM(value); + } + + if (server->arg("ip") != "") { + DEBUG_WM(F("static ip")); + DEBUG_WM(server->arg("ip")); + //_sta_static_ip.fromString(server->arg("ip")); + String ip = server->arg("ip"); + optionalIPFromString(&_sta_static_ip, ip.c_str()); + } + if (server->arg("gw") != "") { + DEBUG_WM(F("static gateway")); + DEBUG_WM(server->arg("gw")); + String gw = server->arg("gw"); + optionalIPFromString(&_sta_static_gw, gw.c_str()); + } + if (server->arg("sn") != "") { + DEBUG_WM(F("static netmask")); + DEBUG_WM(server->arg("sn")); + String sn = server->arg("sn"); + optionalIPFromString(&_sta_static_sn, sn.c_str()); + } + + String page = FPSTR(HTTP_HEAD); + page.replace("{v}", "Credentials Saved"); + page += FPSTR(HTTP_SCRIPT); + page += FPSTR(HTTP_STYLE); + page += _customHeadElement; + page += FPSTR(HTTP_HEAD_END); + page += FPSTR(HTTP_SAVED); + page += FPSTR(HTTP_END); + + server->sendHeader("Content-Length", String(page.length())); + server->send(200, "text/html", page); + + DEBUG_WM(F("Sent wifi save page")); + + connect = true; //signal ready to connect/reset +} + +/** Handle the info page */ +void WiFiManager::handleInfo() { + DEBUG_WM(F("Info")); + + String page = FPSTR(HTTP_HEAD); + page.replace("{v}", "Info"); + page += FPSTR(HTTP_SCRIPT); + page += FPSTR(HTTP_STYLE); + page += _customHeadElement; + page += FPSTR(HTTP_HEAD_END); + page += F("
"); + page += F("
Chip ID
"); + page += ESP.getChipId(); + page += F("
"); + page += F("
Flash Chip ID
"); + page += ESP.getFlashChipId(); + page += F("
"); + page += F("
IDE Flash Size
"); + page += ESP.getFlashChipSize(); + page += F(" bytes
"); + page += F("
Real Flash Size
"); + page += ESP.getFlashChipRealSize(); + page += F(" bytes
"); + page += F("
Soft AP IP
"); + page += WiFi.softAPIP().toString(); + page += F("
"); + page += F("
Soft AP MAC
"); + page += WiFi.softAPmacAddress(); + page += F("
"); + page += F("
Station MAC
"); + page += WiFi.macAddress(); + page += F("
"); + page += F("
"); + page += FPSTR(HTTP_END); + + server->sendHeader("Content-Length", String(page.length())); + server->send(200, "text/html", page); + + DEBUG_WM(F("Sent info page")); +} + +/** Handle the reset page */ +void WiFiManager::handleReset() { + DEBUG_WM(F("Reset")); + + String page = FPSTR(HTTP_HEAD); + page.replace("{v}", "Info"); + page += FPSTR(HTTP_SCRIPT); + page += FPSTR(HTTP_STYLE); + page += _customHeadElement; + page += FPSTR(HTTP_HEAD_END); + page += F("Module will reset in a few seconds."); + page += FPSTR(HTTP_END); + + server->sendHeader("Content-Length", String(page.length())); + server->send(200, "text/html", page); + + DEBUG_WM(F("Sent reset page")); + delay(5000); + ESP.reset(); + delay(2000); +} + +void WiFiManager::handleNotFound() { + if (captivePortal()) { // If captive portal redirect instead of displaying the error page. + return; + } + String message = "File Not Found\n\n"; + message += "URI: "; + message += server->uri(); + message += "\nMethod: "; + message += ( server->method() == HTTP_GET ) ? "GET" : "POST"; + message += "\nArguments: "; + message += server->args(); + message += "\n"; + + for ( uint8_t i = 0; i < server->args(); i++ ) { + message += " " + server->argName ( i ) + ": " + server->arg ( i ) + "\n"; + } + server->sendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); + server->sendHeader("Pragma", "no-cache"); + server->sendHeader("Expires", "-1"); + server->sendHeader("Content-Length", String(message.length())); + server->send ( 404, "text/plain", message ); +} + + +/** Redirect to captive portal if we got a request for another domain. Return true in that case so the page handler do not try to handle the request again. */ +boolean WiFiManager::captivePortal() { + if (!isIp(server->hostHeader()) ) { + DEBUG_WM(F("Request redirected to captive portal")); + server->sendHeader("Location", String("http://") + toStringIp(server->client().localIP()), true); + server->send ( 302, "text/plain", ""); // Empty content inhibits Content-length header so we have to close the socket ourselves. + server->client().stop(); // Stop is needed because we sent no content length + return true; + } + return false; +} + +//start up config portal callback +void WiFiManager::setAPCallback( void (*func)(WiFiManager* myWiFiManager) ) { + _apcallback = func; +} + +//start up save config callback +void WiFiManager::setSaveConfigCallback( void (*func)(void) ) { + _savecallback = func; +} + +//sets a custom element to add to head, like a new style tag +void WiFiManager::setCustomHeadElement(const char* element) { + _customHeadElement = element; +} + +//if this is true, remove duplicated Access Points - defaut true +void WiFiManager::setRemoveDuplicateAPs(boolean removeDuplicates) { + _removeDuplicateAPs = removeDuplicates; +} + + + +template +void WiFiManager::DEBUG_WM(Generic text) { + if (_debug) { + Serial.print("*WM: "); + Serial.println(text); + } +} + +int WiFiManager::getRSSIasQuality(int RSSI) { + int quality = 0; + + if (RSSI <= -100) { + quality = 0; + } else if (RSSI >= -50) { + quality = 100; + } else { + quality = 2 * (RSSI + 100); + } + return quality; +} + +/** Is this an IP? */ +boolean WiFiManager::isIp(String str) { + for (size_t i = 0; i < str.length(); i++) { + int c = str.charAt(i); + if (c != '.' && (c < '0' || c > '9')) { + return false; + } + } + return true; +} + +/** IP to String? */ +String WiFiManager::toStringIp(IPAddress ip) { + String res = ""; + for (int i = 0; i < 3; i++) { + res += String((ip >> (8 * i)) & 0xFF) + "."; + } + res += String(((ip >> 8 * 3)) & 0xFF); + return res; +} diff --git a/firmware/libraries/WiFiManager/WiFiManager.h b/firmware/libraries/WiFiManager/WiFiManager.h new file mode 100644 index 0000000..3da163e --- /dev/null +++ b/firmware/libraries/WiFiManager/WiFiManager.h @@ -0,0 +1,203 @@ +/************************************************************** + WiFiManager is a library for the ESP8266/Arduino platform + (https://github.com/esp8266/Arduino) to enable easy + configuration and reconfiguration of WiFi credentials using a Captive Portal + inspired by: + http://www.esp8266.com/viewtopic.php?f=29&t=2520 + https://github.com/chriscook8/esp-arduino-apboot + https://github.com/esp8266/Arduino/tree/master/libraries/DNSServer/examples/CaptivePortalAdvanced + Built by AlexT https://github.com/tzapu + Licensed under MIT license + **************************************************************/ + +#ifndef WiFiManager_h +#define WiFiManager_h + +#include +#include +#include +#include + +extern "C" { + #include "user_interface.h" +} + +const char HTTP_HEAD[] PROGMEM = "{v}"; +const char HTTP_STYLE[] PROGMEM = ""; +const char HTTP_SCRIPT[] PROGMEM = ""; +const char HTTP_HEAD_END[] PROGMEM = "
"; +const char HTTP_PORTAL_OPTIONS[] PROGMEM = "



"; +const char HTTP_ITEM[] PROGMEM = "
{v} {r}%
"; +const char HTTP_FORM_START[] PROGMEM = "


"; +const char HTTP_FORM_PARAM[] PROGMEM = "
"; +const char HTTP_FORM_END[] PROGMEM = "
"; +const char HTTP_SCAN_LINK[] PROGMEM = "
"; +const char HTTP_SAVED[] PROGMEM = "
Credentials Saved
Trying to connect ESP to network.
If it fails reconnect to AP to try again
"; +const char HTTP_END[] PROGMEM = "
"; + +#ifndef WIFI_MANAGER_MAX_PARAMS +#define WIFI_MANAGER_MAX_PARAMS 10 +#endif + +class WiFiManagerParameter { + public: + /** + Create custom parameters that can be added to the WiFiManager setup web page + @id is used for HTTP queries and must not contain spaces nor other special characters + */ + WiFiManagerParameter(const char *custom); + WiFiManagerParameter(const char *id, const char *placeholder, const char *defaultValue, int length); + WiFiManagerParameter(const char *id, const char *placeholder, const char *defaultValue, int length, const char *custom); + ~WiFiManagerParameter(); + + const char *getID(); + const char *getValue(); + const char *getPlaceholder(); + int getValueLength(); + const char *getCustomHTML(); + private: + const char *_id; + const char *_placeholder; + char *_value; + int _length; + const char *_customHTML; + + void init(const char *id, const char *placeholder, const char *defaultValue, int length, const char *custom); + + friend class WiFiManager; +}; + + +class WiFiManager +{ + public: + WiFiManager(); + ~WiFiManager(); + + boolean autoConnect(); + boolean autoConnect(char const *apName, char const *apPassword = NULL); + + //if you want to always start the config portal, without trying to connect first + boolean startConfigPortal(); + boolean startConfigPortal(char const *apName, char const *apPassword = NULL); + + // get the AP name of the config portal, so it can be used in the callback + String getConfigPortalSSID(); + + void resetSettings(); + + //sets timeout before webserver loop ends and exits even if there has been no setup. + //useful for devices that failed to connect at some point and got stuck in a webserver loop + //in seconds setConfigPortalTimeout is a new name for setTimeout + void setConfigPortalTimeout(unsigned long seconds); + void setTimeout(unsigned long seconds); + + //sets timeout for which to attempt connecting, useful if you get a lot of failed connects + void setConnectTimeout(unsigned long seconds); + + + void setDebugOutput(boolean debug); + //defaults to not showing anything under 8% signal quality if called + void setMinimumSignalQuality(int quality = 8); + //sets a custom ip /gateway /subnet configuration + void setAPStaticIPConfig(IPAddress ip, IPAddress gw, IPAddress sn); + //sets config for a static IP + void setSTAStaticIPConfig(IPAddress ip, IPAddress gw, IPAddress sn); + //called when AP mode and config portal is started + void setAPCallback( void (*func)(WiFiManager*) ); + //called when settings have been changed and connection was successful + void setSaveConfigCallback( void (*func)(void) ); + //adds a custom parameter, returns false on failure + bool addParameter(WiFiManagerParameter *p); + //if this is set, it will exit after config, even if connection is unsuccessful. + void setBreakAfterConfig(boolean shouldBreak); + //if this is set, try WPS setup when starting (this will delay config portal for up to 2 mins) + //TODO + //if this is set, customise style + void setCustomHeadElement(const char* element); + //if this is true, remove duplicated Access Points - defaut true + void setRemoveDuplicateAPs(boolean removeDuplicates); + + private: + std::unique_ptr dnsServer; + std::unique_ptr server; + + //const int WM_DONE = 0; + //const int WM_WAIT = 10; + + //const String HTTP_HEAD = "{v}"; + + void setupConfigPortal(); + void startWPS(); + + const char* _apName = "no-net"; + const char* _apPassword = NULL; + String _ssid = ""; + String _pass = ""; + unsigned long _configPortalTimeout = 0; + unsigned long _connectTimeout = 0; + unsigned long _configPortalStart = 0; + + IPAddress _ap_static_ip; + IPAddress _ap_static_gw; + IPAddress _ap_static_sn; + IPAddress _sta_static_ip; + IPAddress _sta_static_gw; + IPAddress _sta_static_sn; + + int _paramsCount = 0; + int _minimumQuality = -1; + boolean _removeDuplicateAPs = true; + boolean _shouldBreakAfterConfig = false; + boolean _tryWPS = false; + + const char* _customHeadElement = ""; + + //String getEEPROMString(int start, int len); + //void setEEPROMString(int start, int len, String string); + + int status = WL_IDLE_STATUS; + int connectWifi(String ssid, String pass); + uint8_t waitForConnectResult(); + + void handleRoot(); + void handleWifi(boolean scan); + void handleWifiSave(); + void handleInfo(); + void handleReset(); + void handleNotFound(); + void handle204(); + boolean captivePortal(); + boolean configPortalHasTimeout(); + + // DNS server + const byte DNS_PORT = 53; + + //helpers + int getRSSIasQuality(int RSSI); + boolean isIp(String str); + String toStringIp(IPAddress ip); + + boolean connect; + boolean _debug = true; + + void (*_apcallback)(WiFiManager*) = NULL; + void (*_savecallback)(void) = NULL; + + int _max_params; + WiFiManagerParameter** _params; + + template + void DEBUG_WM(Generic text); + + template + auto optionalIPFromString(T *obj, const char *s) -> decltype( obj->fromString(s) ) { + return obj->fromString(s); + } + auto optionalIPFromString(...) -> bool { + DEBUG_WM("NO fromString METHOD ON IPAddress, you need ESP8266 core 2.1.0 or newer for Custom IP configuration to work."); + return false; + } +}; + +#endif diff --git a/firmware/libraries/WiFiManager/examples/AutoConnect/AutoConnect.ino b/firmware/libraries/WiFiManager/examples/AutoConnect/AutoConnect.ino new file mode 100644 index 0000000..0c44909 --- /dev/null +++ b/firmware/libraries/WiFiManager/examples/AutoConnect/AutoConnect.ino @@ -0,0 +1,38 @@ +#include //https://github.com/esp8266/Arduino + +//needed for library +#include +#include +#include //https://github.com/tzapu/WiFiManager + + +void setup() { + // put your setup code here, to run once: + Serial.begin(115200); + + //WiFiManager + //Local intialization. Once its business is done, there is no need to keep it around + WiFiManager wifiManager; + //reset saved settings + //wifiManager.resetSettings(); + + //set custom ip for portal + //wifiManager.setAPStaticIPConfig(IPAddress(10,0,1,1), IPAddress(10,0,1,1), IPAddress(255,255,255,0)); + + //fetches ssid and pass from eeprom and tries to connect + //if it does not connect it starts an access point with the specified name + //here "AutoConnectAP" + //and goes into a blocking loop awaiting configuration + wifiManager.autoConnect("AutoConnectAP"); + //or use this for auto generated name ESP + ChipID + //wifiManager.autoConnect(); + + + //if you get here you have connected to the WiFi + Serial.println("connected...yeey :)"); +} + +void loop() { + // put your main code here, to run repeatedly: + +} diff --git a/firmware/libraries/WiFiManager/examples/AutoConnectWithFSParameters/AutoConnectWithFSParameters.ino b/firmware/libraries/WiFiManager/examples/AutoConnectWithFSParameters/AutoConnectWithFSParameters.ino new file mode 100644 index 0000000..1d58e5c --- /dev/null +++ b/firmware/libraries/WiFiManager/examples/AutoConnectWithFSParameters/AutoConnectWithFSParameters.ino @@ -0,0 +1,156 @@ +#include //this needs to be first, or it all crashes and burns... + +#include //https://github.com/esp8266/Arduino + +//needed for library +#include +#include +#include //https://github.com/tzapu/WiFiManager + +#include //https://github.com/bblanchon/ArduinoJson + +//define your default values here, if there are different values in config.json, they are overwritten. +char mqtt_server[40]; +char mqtt_port[6] = "8080"; +char blynk_token[34] = "YOUR_BLYNK_TOKEN"; + +//flag for saving data +bool shouldSaveConfig = false; + +//callback notifying us of the need to save config +void saveConfigCallback () { + Serial.println("Should save config"); + shouldSaveConfig = true; +} + + +void setup() { + // put your setup code here, to run once: + Serial.begin(115200); + Serial.println(); + + //clean FS, for testing + //SPIFFS.format(); + + //read configuration from FS json + Serial.println("mounting FS..."); + + if (SPIFFS.begin()) { + Serial.println("mounted file system"); + if (SPIFFS.exists("/config.json")) { + //file exists, reading and loading + Serial.println("reading config file"); + File configFile = SPIFFS.open("/config.json", "r"); + if (configFile) { + Serial.println("opened config file"); + size_t size = configFile.size(); + // Allocate a buffer to store contents of the file. + std::unique_ptr buf(new char[size]); + + configFile.readBytes(buf.get(), size); + DynamicJsonBuffer jsonBuffer; + JsonObject& json = jsonBuffer.parseObject(buf.get()); + json.printTo(Serial); + if (json.success()) { + Serial.println("\nparsed json"); + + strcpy(mqtt_server, json["mqtt_server"]); + strcpy(mqtt_port, json["mqtt_port"]); + strcpy(blynk_token, json["blynk_token"]); + + } else { + Serial.println("failed to load json config"); + } + } + } + } else { + Serial.println("failed to mount FS"); + } + //end read + + + + // The extra parameters to be configured (can be either global or just in the setup) + // After connecting, parameter.getValue() will get you the configured value + // id/name placeholder/prompt default length + WiFiManagerParameter custom_mqtt_server("server", "mqtt server", mqtt_server, 40); + WiFiManagerParameter custom_mqtt_port("port", "mqtt port", mqtt_port, 6); + WiFiManagerParameter custom_blynk_token("blynk", "blynk token", blynk_token, 32); + + //WiFiManager + //Local intialization. Once its business is done, there is no need to keep it around + WiFiManager wifiManager; + + //set config save notify callback + wifiManager.setSaveConfigCallback(saveConfigCallback); + + //set static ip + wifiManager.setSTAStaticIPConfig(IPAddress(10,0,1,99), IPAddress(10,0,1,1), IPAddress(255,255,255,0)); + + //add all your parameters here + wifiManager.addParameter(&custom_mqtt_server); + wifiManager.addParameter(&custom_mqtt_port); + wifiManager.addParameter(&custom_blynk_token); + + //reset settings - for testing + //wifiManager.resetSettings(); + + //set minimu quality of signal so it ignores AP's under that quality + //defaults to 8% + //wifiManager.setMinimumSignalQuality(); + + //sets timeout until configuration portal gets turned off + //useful to make it all retry or go to sleep + //in seconds + //wifiManager.setTimeout(120); + + //fetches ssid and pass and tries to connect + //if it does not connect it starts an access point with the specified name + //here "AutoConnectAP" + //and goes into a blocking loop awaiting configuration + if (!wifiManager.autoConnect("AutoConnectAP", "password")) { + Serial.println("failed to connect and hit timeout"); + delay(3000); + //reset and try again, or maybe put it to deep sleep + ESP.reset(); + delay(5000); + } + + //if you get here you have connected to the WiFi + Serial.println("connected...yeey :)"); + + //read updated parameters + strcpy(mqtt_server, custom_mqtt_server.getValue()); + strcpy(mqtt_port, custom_mqtt_port.getValue()); + strcpy(blynk_token, custom_blynk_token.getValue()); + + //save the custom parameters to FS + if (shouldSaveConfig) { + Serial.println("saving config"); + DynamicJsonBuffer jsonBuffer; + JsonObject& json = jsonBuffer.createObject(); + json["mqtt_server"] = mqtt_server; + json["mqtt_port"] = mqtt_port; + json["blynk_token"] = blynk_token; + + File configFile = SPIFFS.open("/config.json", "w"); + if (!configFile) { + Serial.println("failed to open config file for writing"); + } + + json.printTo(Serial); + json.printTo(configFile); + configFile.close(); + //end save + } + + Serial.println("local ip"); + Serial.println(WiFi.localIP()); + +} + +void loop() { + // put your main code here, to run repeatedly: + + +} diff --git a/firmware/libraries/WiFiManager/examples/AutoConnectWithFSParametersAndCustomIP/AutoConnectWithFSParametersAndCustomIP.ino b/firmware/libraries/WiFiManager/examples/AutoConnectWithFSParametersAndCustomIP/AutoConnectWithFSParametersAndCustomIP.ino new file mode 100644 index 0000000..3f391ae --- /dev/null +++ b/firmware/libraries/WiFiManager/examples/AutoConnectWithFSParametersAndCustomIP/AutoConnectWithFSParametersAndCustomIP.ino @@ -0,0 +1,188 @@ +#include //this needs to be first, or it all crashes and burns... + +#include //https://github.com/esp8266/Arduino + +//needed for library +#include +#include +#include //https://github.com/tzapu/WiFiManager + +#include //https://github.com/bblanchon/ArduinoJson + +//define your default values here, if there are different values in config.json, they are overwritten. +//length should be max size + 1 +char mqtt_server[40]; +char mqtt_port[6] = "8080"; +char blynk_token[33] = "YOUR_BLYNK_TOKEN"; +//default custom static IP +char static_ip[16] = "10.0.1.56"; +char static_gw[16] = "10.0.1.1"; +char static_sn[16] = "255.255.255.0"; + +//flag for saving data +bool shouldSaveConfig = false; + +//callback notifying us of the need to save config +void saveConfigCallback () { + Serial.println("Should save config"); + shouldSaveConfig = true; +} + +void setup() { + // put your setup code here, to run once: + Serial.begin(115200); + Serial.println(); + + //clean FS, for testing + //SPIFFS.format(); + + //read configuration from FS json + Serial.println("mounting FS..."); + + if (SPIFFS.begin()) { + Serial.println("mounted file system"); + if (SPIFFS.exists("/config.json")) { + //file exists, reading and loading + Serial.println("reading config file"); + File configFile = SPIFFS.open("/config.json", "r"); + if (configFile) { + Serial.println("opened config file"); + size_t size = configFile.size(); + // Allocate a buffer to store contents of the file. + std::unique_ptr buf(new char[size]); + + configFile.readBytes(buf.get(), size); + DynamicJsonBuffer jsonBuffer; + JsonObject& json = jsonBuffer.parseObject(buf.get()); + json.printTo(Serial); + if (json.success()) { + Serial.println("\nparsed json"); + + strcpy(mqtt_server, json["mqtt_server"]); + strcpy(mqtt_port, json["mqtt_port"]); + strcpy(blynk_token, json["blynk_token"]); + + if(json["ip"]) { + Serial.println("setting custom ip from config"); + //static_ip = json["ip"]; + strcpy(static_ip, json["ip"]); + strcpy(static_gw, json["gateway"]); + strcpy(static_sn, json["subnet"]); + //strcat(static_ip, json["ip"]); + //static_gw = json["gateway"]; + //static_sn = json["subnet"]; + Serial.println(static_ip); +/* Serial.println("converting ip"); + IPAddress ip = ipFromCharArray(static_ip); + Serial.println(ip);*/ + } else { + Serial.println("no custom ip in config"); + } + } else { + Serial.println("failed to load json config"); + } + } + } + } else { + Serial.println("failed to mount FS"); + } + //end read + Serial.println(static_ip); + Serial.println(blynk_token); + Serial.println(mqtt_server); + + + // The extra parameters to be configured (can be either global or just in the setup) + // After connecting, parameter.getValue() will get you the configured value + // id/name placeholder/prompt default length + WiFiManagerParameter custom_mqtt_server("server", "mqtt server", mqtt_server, 40); + WiFiManagerParameter custom_mqtt_port("port", "mqtt port", mqtt_port, 5); + WiFiManagerParameter custom_blynk_token("blynk", "blynk token", blynk_token, 34); + + //WiFiManager + //Local intialization. Once its business is done, there is no need to keep it around + WiFiManager wifiManager; + + //set config save notify callback + wifiManager.setSaveConfigCallback(saveConfigCallback); + + //set static ip + IPAddress _ip,_gw,_sn; + _ip.fromString(static_ip); + _gw.fromString(static_gw); + _sn.fromString(static_sn); + + wifiManager.setSTAStaticIPConfig(_ip, _gw, _sn); + + //add all your parameters here + wifiManager.addParameter(&custom_mqtt_server); + wifiManager.addParameter(&custom_mqtt_port); + wifiManager.addParameter(&custom_blynk_token); + + //reset settings - for testing + //wifiManager.resetSettings(); + + //set minimu quality of signal so it ignores AP's under that quality + //defaults to 8% + wifiManager.setMinimumSignalQuality(); + + //sets timeout until configuration portal gets turned off + //useful to make it all retry or go to sleep + //in seconds + //wifiManager.setTimeout(120); + + //fetches ssid and pass and tries to connect + //if it does not connect it starts an access point with the specified name + //here "AutoConnectAP" + //and goes into a blocking loop awaiting configuration + if (!wifiManager.autoConnect("AutoConnectAP", "password")) { + Serial.println("failed to connect and hit timeout"); + delay(3000); + //reset and try again, or maybe put it to deep sleep + ESP.reset(); + delay(5000); + } + + //if you get here you have connected to the WiFi + Serial.println("connected...yeey :)"); + + //read updated parameters + strcpy(mqtt_server, custom_mqtt_server.getValue()); + strcpy(mqtt_port, custom_mqtt_port.getValue()); + strcpy(blynk_token, custom_blynk_token.getValue()); + + //save the custom parameters to FS + if (shouldSaveConfig) { + Serial.println("saving config"); + DynamicJsonBuffer jsonBuffer; + JsonObject& json = jsonBuffer.createObject(); + json["mqtt_server"] = mqtt_server; + json["mqtt_port"] = mqtt_port; + json["blynk_token"] = blynk_token; + + json["ip"] = WiFi.localIP().toString(); + json["gateway"] = WiFi.gatewayIP().toString(); + json["subnet"] = WiFi.subnetMask().toString(); + + File configFile = SPIFFS.open("/config.json", "w"); + if (!configFile) { + Serial.println("failed to open config file for writing"); + } + + json.prettyPrintTo(Serial); + json.printTo(configFile); + configFile.close(); + //end save + } + + Serial.println("local ip"); + Serial.println(WiFi.localIP()); + Serial.println(WiFi.gatewayIP()); + Serial.println(WiFi.subnetMask()); +} + +void loop() { + // put your main code here, to run repeatedly: + + +} diff --git a/firmware/libraries/WiFiManager/examples/AutoConnectWithFeedback/AutoConnectWithFeedback.ino b/firmware/libraries/WiFiManager/examples/AutoConnectWithFeedback/AutoConnectWithFeedback.ino new file mode 100644 index 0000000..9491760 --- /dev/null +++ b/firmware/libraries/WiFiManager/examples/AutoConnectWithFeedback/AutoConnectWithFeedback.ino @@ -0,0 +1,47 @@ +#include //https://github.com/esp8266/Arduino + +//needed for library +#include +#include +#include "WiFiManager.h" //https://github.com/tzapu/WiFiManager + +void configModeCallback (WiFiManager *myWiFiManager) { + Serial.println("Entered config mode"); + Serial.println(WiFi.softAPIP()); + //if you used auto generated SSID, print it + Serial.println(myWiFiManager->getConfigPortalSSID()); +} + +void setup() { + // put your setup code here, to run once: + Serial.begin(115200); + + //WiFiManager + //Local intialization. Once its business is done, there is no need to keep it around + WiFiManager wifiManager; + //reset settings - for testing + //wifiManager.resetSettings(); + + //set callback that gets called when connecting to previous WiFi fails, and enters Access Point mode + wifiManager.setAPCallback(configModeCallback); + + //fetches ssid and pass and tries to connect + //if it does not connect it starts an access point with the specified name + //here "AutoConnectAP" + //and goes into a blocking loop awaiting configuration + if(!wifiManager.autoConnect()) { + Serial.println("failed to connect and hit timeout"); + //reset and try again, or maybe put it to deep sleep + ESP.reset(); + delay(1000); + } + + //if you get here you have connected to the WiFi + Serial.println("connected...yeey :)"); + +} + +void loop() { + // put your main code here, to run repeatedly: + +} diff --git a/firmware/libraries/WiFiManager/examples/AutoConnectWithFeedbackLED/AutoConnectWithFeedbackLED.ino b/firmware/libraries/WiFiManager/examples/AutoConnectWithFeedbackLED/AutoConnectWithFeedbackLED.ino new file mode 100644 index 0000000..77b264b --- /dev/null +++ b/firmware/libraries/WiFiManager/examples/AutoConnectWithFeedbackLED/AutoConnectWithFeedbackLED.ino @@ -0,0 +1,68 @@ +#include //https://github.com/esp8266/Arduino + +//needed for library +#include +#include +#include //https://github.com/tzapu/WiFiManager + +//for LED status +#include +Ticker ticker; + +void tick() +{ + //toggle state + int state = digitalRead(BUILTIN_LED); // get the current state of GPIO1 pin + digitalWrite(BUILTIN_LED, !state); // set pin to the opposite state +} + +//gets called when WiFiManager enters configuration mode +void configModeCallback (WiFiManager *myWiFiManager) { + Serial.println("Entered config mode"); + Serial.println(WiFi.softAPIP()); + //if you used auto generated SSID, print it + Serial.println(myWiFiManager->getConfigPortalSSID()); + //entered config mode, make led toggle faster + ticker.attach(0.2, tick); +} + +void setup() { + // put your setup code here, to run once: + Serial.begin(115200); + + //set led pin as output + pinMode(BUILTIN_LED, OUTPUT); + // start ticker with 0.5 because we start in AP mode and try to connect + ticker.attach(0.6, tick); + + //WiFiManager + //Local intialization. Once its business is done, there is no need to keep it around + WiFiManager wifiManager; + //reset settings - for testing + //wifiManager.resetSettings(); + + //set callback that gets called when connecting to previous WiFi fails, and enters Access Point mode + wifiManager.setAPCallback(configModeCallback); + + //fetches ssid and pass and tries to connect + //if it does not connect it starts an access point with the specified name + //here "AutoConnectAP" + //and goes into a blocking loop awaiting configuration + if (!wifiManager.autoConnect()) { + Serial.println("failed to connect and hit timeout"); + //reset and try again, or maybe put it to deep sleep + ESP.reset(); + delay(1000); + } + + //if you get here you have connected to the WiFi + Serial.println("connected...yeey :)"); + ticker.detach(); + //keep LED on + digitalWrite(BUILTIN_LED, LOW); +} + +void loop() { + // put your main code here, to run repeatedly: + +} diff --git a/firmware/libraries/WiFiManager/examples/AutoConnectWithReset/AutoConnectWithReset.ino b/firmware/libraries/WiFiManager/examples/AutoConnectWithReset/AutoConnectWithReset.ino new file mode 100644 index 0000000..5af3b1f --- /dev/null +++ b/firmware/libraries/WiFiManager/examples/AutoConnectWithReset/AutoConnectWithReset.ino @@ -0,0 +1,49 @@ +#include //this needs to be first, or it all crashes and burns... + +#include //https://github.com/esp8266/Arduino + +//needed for library +#include +#include +#include //https://github.com/tzapu/WiFiManager + +void setup() { + // put your setup code here, to run once: + Serial.begin(115200); + Serial.println(); + + //WiFiManager + //Local intialization. Once its business is done, there is no need to keep it around + WiFiManager wifiManager; + + //exit after config instead of connecting + wifiManager.setBreakAfterConfig(true); + + //reset settings - for testing + //wifiManager.resetSettings(); + + + //tries to connect to last known settings + //if it does not connect it starts an access point with the specified name + //here "AutoConnectAP" with password "password" + //and goes into a blocking loop awaiting configuration + if (!wifiManager.autoConnect("AutoConnectAP", "password")) { + Serial.println("failed to connect, we should reset as see if it connects"); + delay(3000); + ESP.reset(); + delay(5000); + } + + //if you get here you have connected to the WiFi + Serial.println("connected...yeey :)"); + + + Serial.println("local ip"); + Serial.println(WiFi.localIP()); +} + +void loop() { + // put your main code here, to run repeatedly: + + +} diff --git a/firmware/libraries/WiFiManager/examples/AutoConnectWithStaticIP/AutoConnectWithStaticIP.ino b/firmware/libraries/WiFiManager/examples/AutoConnectWithStaticIP/AutoConnectWithStaticIP.ino new file mode 100644 index 0000000..86556d3 --- /dev/null +++ b/firmware/libraries/WiFiManager/examples/AutoConnectWithStaticIP/AutoConnectWithStaticIP.ino @@ -0,0 +1,80 @@ +#include //this needs to be first, or it all crashes and burns... + +#include //https://github.com/esp8266/Arduino + +//needed for library +#include +#include +#include //https://github.com/tzapu/WiFiManager + + +/************************************************************************************** + * this example shows how to set a static IP configuration for the ESP + * although the IP shows in the config portal, the changes will revert + * to the IP set in the source file. + * if you want the ability to configure and persist the new IP configuration + * look at the FS examples, which save the config to file + *************************************************************************************/ + + + +//default custom static IP +//char static_ip[16] = "10.0.1.59"; +//char static_gw[16] = "10.0.1.1"; +//char static_sn[16] = "255.255.255.0"; + +void setup() { + // put your setup code here, to run once: + Serial.begin(115200); + Serial.println(); + + //WiFiManager + //Local intialization. Once its business is done, there is no need to keep it around + WiFiManager wifiManager; + + //reset settings - for testing + //wifiManager.resetSettings(); + + //set static ip + //block1 should be used for ESP8266 core 2.1.0 or newer, otherwise use block2 + + //start-block1 + //IPAddress _ip,_gw,_sn; + //_ip.fromString(static_ip); + //_gw.fromString(static_gw); + //_sn.fromString(static_sn); + //end-block1 + + //start-block2 + IPAddress _ip = IPAddress(10, 0, 1, 78); + IPAddress _gw = IPAddress(10, 0, 1, 1); + IPAddress _sn = IPAddress(255, 255, 255, 0); + //end-block2 + + wifiManager.setSTAStaticIPConfig(_ip, _gw, _sn); + + + //tries to connect to last known settings + //if it does not connect it starts an access point with the specified name + //here "AutoConnectAP" with password "password" + //and goes into a blocking loop awaiting configuration + if (!wifiManager.autoConnect("AutoConnectAP", "password")) { + Serial.println("failed to connect, we should reset as see if it connects"); + delay(3000); + ESP.reset(); + delay(5000); + } + + //if you get here you have connected to the WiFi + Serial.println("connected...yeey :)"); + + + Serial.println("local ip"); + Serial.println(WiFi.localIP()); +} + +void loop() { + // put your main code here, to run repeatedly: + + +} diff --git a/firmware/libraries/WiFiManager/examples/AutoConnectWithTimeout/AutoConnectWithTimeout.ino b/firmware/libraries/WiFiManager/examples/AutoConnectWithTimeout/AutoConnectWithTimeout.ino new file mode 100644 index 0000000..c90cf10 --- /dev/null +++ b/firmware/libraries/WiFiManager/examples/AutoConnectWithTimeout/AutoConnectWithTimeout.ino @@ -0,0 +1,45 @@ +#include //https://github.com/esp8266/Arduino + +//needed for library +#include +#include +#include //https://github.com/tzapu/WiFiManager + + + +void setup() { + // put your setup code here, to run once: + Serial.begin(115200); + + //WiFiManager + //Local intialization. Once its business is done, there is no need to keep it around + WiFiManager wifiManager; + //reset settings - for testing + //wifiManager.resetSettings(); + + //sets timeout until configuration portal gets turned off + //useful to make it all retry or go to sleep + //in seconds + wifiManager.setTimeout(180); + + //fetches ssid and pass and tries to connect + //if it does not connect it starts an access point with the specified name + //here "AutoConnectAP" + //and goes into a blocking loop awaiting configuration + if(!wifiManager.autoConnect("AutoConnectAP")) { + Serial.println("failed to connect and hit timeout"); + delay(3000); + //reset and try again, or maybe put it to deep sleep + ESP.reset(); + delay(5000); + } + + //if you get here you have connected to the WiFi + Serial.println("connected...yeey :)"); + +} + +void loop() { + // put your main code here, to run repeatedly: + +} diff --git a/firmware/libraries/WiFiManager/examples/OnDemandConfigPortal/OnDemandConfigPortal.ino b/firmware/libraries/WiFiManager/examples/OnDemandConfigPortal/OnDemandConfigPortal.ino new file mode 100644 index 0000000..2f2d0cc --- /dev/null +++ b/firmware/libraries/WiFiManager/examples/OnDemandConfigPortal/OnDemandConfigPortal.ino @@ -0,0 +1,60 @@ +#include //https://github.com/esp8266/Arduino + +//needed for library +#include +#include +#include //https://github.com/tzapu/WiFiManager + +// select which pin will trigger the configuration portal when set to LOW +// ESP-01 users please note: the only pins available (0 and 2), are shared +// with the bootloader, so always set them HIGH at power-up +#define TRIGGER_PIN 0 + + +void setup() { + // put your setup code here, to run once: + Serial.begin(115200); + Serial.println("\n Starting"); + + pinMode(TRIGGER_PIN, INPUT); +} + + +void loop() { + // is configuration portal requested? + if ( digitalRead(TRIGGER_PIN) == LOW ) { + //WiFiManager + //Local intialization. Once its business is done, there is no need to keep it around + WiFiManager wifiManager; + + //reset settings - for testing + //wifiManager.resetSettings(); + + //sets timeout until configuration portal gets turned off + //useful to make it all retry or go to sleep + //in seconds + //wifiManager.setTimeout(120); + + //it starts an access point with the specified name + //here "AutoConnectAP" + //and goes into a blocking loop awaiting configuration + + //WITHOUT THIS THE AP DOES NOT SEEM TO WORK PROPERLY WITH SDK 1.5 , update to at least 1.5.1 + //WiFi.mode(WIFI_STA); + + if (!wifiManager.startConfigPortal("OnDemandAP")) { + Serial.println("failed to connect and hit timeout"); + delay(3000); + //reset and try again, or maybe put it to deep sleep + ESP.reset(); + delay(5000); + } + + //if you get here you have connected to the WiFi + Serial.println("connected...yeey :)"); + } + + + // put your main code here, to run repeatedly: + +} diff --git a/firmware/libraries/WiFiManager/extras/WiFiManager.template.html b/firmware/libraries/WiFiManager/extras/WiFiManager.template.html new file mode 100644 index 0000000..e15593b --- /dev/null +++ b/firmware/libraries/WiFiManager/extras/WiFiManager.template.html @@ -0,0 +1,80 @@ + + + + + + {v} + + + + + + + + + + +
+ + + + + + + + +



+ + +
{v} {r}%
+
PMisa 100%
+ +
PMisa 8%
+ + +
{v} {r}%
+ + +


+ + +
+ + +
+ + +
+ + +
Credentials Saved
Trying to connect ESP to network.
If it fails reconnect to AP to try again
+ + + + + + +
+ + + diff --git a/firmware/libraries/WiFiManager/extras/parse.js b/firmware/libraries/WiFiManager/extras/parse.js new file mode 100644 index 0000000..97a3e38 --- /dev/null +++ b/firmware/libraries/WiFiManager/extras/parse.js @@ -0,0 +1,60 @@ +'use strict'; + +const fs = require('fs'); + +console.log('starting'); + +const inFile = 'WiFiManager.template.html'; +const outFile = 'template.h'; + +const defineRegEx = //gm; +console.log('parsing', inFile); + +fs.readFile(inFile, 'utf8', function (err,data) { + if (err) { + return console.log(err); + } + //console.log(data); + + let defines = data.match(defineRegEx); + + //console.log(defines); + var stream = fs.createWriteStream(outFile); + stream.once('open', function(fd) { + for (const i in defines) { + + const start = defines[i]; + const end = start.replace('