Added entirety of CAD files, Software and the translated documentation

This commit is contained in:
Raphael Maenle
2019-11-12 19:55:35 +01:00
commit 134990e892
266 changed files with 48020 additions and 0 deletions

View File

@ -0,0 +1,561 @@
/**************************************************************************/
/*!
@file ams_as5048b.cpp
@author SOSAndroid (E. Ha.)
@license BSD (see license.txt)
Library to interface the AS5048B magnetic rotary encoder from AMS over the I2C bus
@section HISTORY
v1.0.0 - First release
v1.0.1 - Typo to allow compiling on Codebender.cc (Math.h vs math.h)
v1.0.2 - setZeroReg() issue raised by @MechatronicsWorkman
v1.0.3 - Small bug fix and improvement by @DavidHowlett
*/
/**************************************************************************/
#include <stdlib.h>
#include <math.h>
#include <Wire.h>
#include "ams_as5048b.h"
/*========================================================================*/
/* CONSTRUCTORS */
/*========================================================================*/
/**************************************************************************/
/*!
Constructor
*/
/**************************************************************************/
AMS_AS5048B::AMS_AS5048B(void) {
_chipAddress = AS5048_ADDRESS;
_debugFlag = false;
}
AMS_AS5048B::AMS_AS5048B(uint8_t chipAddress) {
_chipAddress = chipAddress;
_debugFlag = false;
}
/*========================================================================*/
/* PUBLIC FUNCTIONS */
/*========================================================================*/
/**************************************************************************/
/*!
@brief init values and overall behaviors for AS5948B use
@params
none
@returns
none
*/
/**************************************************************************/
void AMS_AS5048B::begin(void) {
#ifdef USE_WIREBEGIN_ENABLED
Wire.begin();
#endif
#ifdef SERIAL_DEBUG_ENABLED
_debugFlag = true;
if (!Serial) {
Serial.begin(9600);
}
#endif
_clockWise = false;
_lastAngleRaw = 0.0;
_zeroRegVal = AMS_AS5048B::zeroRegR();
_addressRegVal = AMS_AS5048B::addressRegR();
AMS_AS5048B::resetMovingAvgExp();
return;
}
/**************************************************************************/
/*!
@brief Toggle debug output to serial
@params
none
@returns
none
*/
/**************************************************************************/
void AMS_AS5048B::toggleDebug(void) {
_debugFlag = !_debugFlag;
return;
}
/**************************************************************************/
/*!
@brief Set / unset clock wise counting - sensor counts CCW natively
@params[in]
boolean cw - true: CW, false: CCW
@returns
none
*/
/**************************************************************************/
void AMS_AS5048B::setClockWise(boolean cw) {
_clockWise = cw;
_lastAngleRaw = 0.0;
AMS_AS5048B::resetMovingAvgExp();
return;
}
/**************************************************************************/
/*!
@brief writes OTP control register
@params[in]
unit8_t register value
@returns
none
*/
/**************************************************************************/
void AMS_AS5048B::progRegister(uint8_t regVal) {
AMS_AS5048B::writeReg(AS5048B_PROG_REG, regVal);
return;
}
/**************************************************************************/
/*!
@brief Burn values to the slave address OTP register
@params[in]
none
@returns
none
*/
/**************************************************************************/
void AMS_AS5048B::doProg(void) {
//enable special programming mode
AMS_AS5048B::progRegister(0xFD);
delay(10);
//set the burn bit: enables automatic programming procedure
AMS_AS5048B::progRegister(0x08);
delay(10);
//disable special programming mode
AMS_AS5048B::progRegister(0x00);
delay(10);
return;
}
/**************************************************************************/
/*!
@brief Burn values to the zero position OTP register
@params[in]
none
@returns
none
*/
/**************************************************************************/
void AMS_AS5048B::doProgZero(void) {
//this will burn the zero position OTP register like described in the datasheet
//enable programming mode
AMS_AS5048B::progRegister(0x01);
delay(10);
//set the burn bit: enables automatic programming procedure
AMS_AS5048B::progRegister(0x08);
delay(10);
//read angle information (equals to 0)
AMS_AS5048B::readReg16(AS5048B_ANGLMSB_REG);
delay(10);
//enable verification
AMS_AS5048B::progRegister(0x40);
delay(10);
//read angle information (equals to 0)
AMS_AS5048B::readReg16(AS5048B_ANGLMSB_REG);
delay(10);
return;
}
/**************************************************************************/
/*!
@brief write I2C address value (5 bits) into the address register
@params[in]
unit8_t register value
@returns
none
*/
/**************************************************************************/
void AMS_AS5048B::addressRegW(uint8_t regVal) {
// write the new chip address to the register
AMS_AS5048B::writeReg(AS5048B_ADDR_REG, regVal);
// update our chip address with our 5 programmable bits
// the MSB is internally inverted, so we flip the leftmost bit
_chipAddress = ((regVal << 2) | (_chipAddress & 0b11)) ^ (1 << 6);
return;
}
/**************************************************************************/
/*!
@brief reads I2C address register value
@params[in]
none
@returns
uint8_t register value
*/
/**************************************************************************/
uint8_t AMS_AS5048B::addressRegR(void) {
return AMS_AS5048B::readReg8(AS5048B_ADDR_REG);
}
/**************************************************************************/
/*!
@brief sets current angle as the zero position
@params[in]
none
@returns
none
*/
/**************************************************************************/
void AMS_AS5048B::setZeroReg(void) {
AMS_AS5048B::zeroRegW((uint16_t) 0x00); //Issue closed by @MechatronicsWorkman and @oilXander. The last sequence avoids any offset for the new Zero position
uint16_t newZero = AMS_AS5048B::readReg16(AS5048B_ANGLMSB_REG);
AMS_AS5048B::zeroRegW(newZero);
return;
}
/**************************************************************************/
/*!
@brief writes the 2 bytes Zero position register value
@params[in]
unit16_t register value
@returns
none
*/
/**************************************************************************/
void AMS_AS5048B::zeroRegW(uint16_t regVal) {
AMS_AS5048B::writeReg(AS5048B_ZEROMSB_REG, (uint8_t) (regVal >> 6));
AMS_AS5048B::writeReg(AS5048B_ZEROLSB_REG, (uint8_t) (regVal & 0x3F));
return;
}
/**************************************************************************/
/*!
@brief reads the 2 bytes Zero position register value
@params[in]
none
@returns
uint16_t register value trimmed on 14 bits
*/
/**************************************************************************/
uint16_t AMS_AS5048B::zeroRegR(void) {
return AMS_AS5048B::readReg16(AS5048B_ZEROMSB_REG);
}
/**************************************************************************/
/*!
@brief reads the 2 bytes magnitude register value
@params[in]
none
@returns
uint16_t register value trimmed on 14 bits
*/
/**************************************************************************/
uint16_t AMS_AS5048B::magnitudeR(void) {
return AMS_AS5048B::readReg16(AS5048B_MAGNMSB_REG);
}
uint16_t AMS_AS5048B::angleRegR(void) {
return AMS_AS5048B::readReg16(AS5048B_ANGLMSB_REG);
}
/**************************************************************************/
/*!
@brief reads the 1 bytes auto gain register value
@params[in]
none
@returns
uint8_t register value
*/
/**************************************************************************/
uint8_t AMS_AS5048B::getAutoGain(void) {
return AMS_AS5048B::readReg8(AS5048B_GAIN_REG);
}
/**************************************************************************/
/*!
@brief reads the 1 bytes diagnostic register value
@params[in]
none
@returns
uint8_t register value
*/
/**************************************************************************/
uint8_t AMS_AS5048B::getDiagReg(void) {
return AMS_AS5048B::readReg8(AS5048B_DIAG_REG);
}
/**************************************************************************/
/*!
@brief reads current angle value and converts it into the desired unit
@params[in]
String unit : string expressing the unit of the angle. Sensor raw value as default
@params[in]
Boolean newVal : have a new measurement or use the last read one. True as default
@returns
Double angle value converted into the desired unit
*/
/**************************************************************************/
double AMS_AS5048B::angleR(int unit, boolean newVal) {
double angleRaw;
if (newVal) {
if(_clockWise) {
angleRaw = (double) (0b11111111111111 - AMS_AS5048B::readReg16(AS5048B_ANGLMSB_REG));
}
else {
angleRaw = (double) AMS_AS5048B::readReg16(AS5048B_ANGLMSB_REG);
}
_lastAngleRaw = angleRaw;
}
else {
angleRaw = _lastAngleRaw;
}
return AMS_AS5048B::convertAngle(unit, angleRaw);
}
/**************************************************************************/
/*!
@brief Performs an exponential moving average on the angle.
Works on Sine and Cosine of the angle to avoid issues 0°/360° discontinuity
@params[in]
none
@returns
none
*/
/**************************************************************************/
void AMS_AS5048B::updateMovingAvgExp(void) {
//sine and cosine calculation on angles in radian
double angle = AMS_AS5048B::angleR(U_RAD, true);
if (_movingAvgCountLoop < EXP_MOVAVG_LOOP) {
_movingAvgExpSin += sin(angle);
_movingAvgExpCos += cos(angle);
if (_movingAvgCountLoop == (EXP_MOVAVG_LOOP - 1)) {
_movingAvgExpSin = _movingAvgExpSin / EXP_MOVAVG_LOOP;
_movingAvgExpCos = _movingAvgExpCos / EXP_MOVAVG_LOOP;
}
_movingAvgCountLoop ++;
}
else {
double movavgexpsin = _movingAvgExpSin + _movingAvgExpAlpha * (sin(angle) - _movingAvgExpSin);
double movavgexpcos = _movingAvgExpCos + _movingAvgExpAlpha * (cos(angle) - _movingAvgExpCos);
_movingAvgExpSin = movavgexpsin;
_movingAvgExpCos = movavgexpcos;
_movingAvgExpAngle = getExpAvgRawAngle();
}
return;
}
/**************************************************************************/
/*!
@brief sent back the exponential moving averaged angle in the desired unit
@params[in]
String unit : string expressing the unit of the angle. Sensor raw value as default
@returns
Double exponential moving averaged angle value
*/
/**************************************************************************/
double AMS_AS5048B::getMovingAvgExp(int unit) {
return AMS_AS5048B::convertAngle(unit, _movingAvgExpAngle);
}
void AMS_AS5048B::resetMovingAvgExp(void) {
_movingAvgExpAngle = 0.0;
_movingAvgCountLoop = 0;
_movingAvgExpAlpha = 2.0 / (EXP_MOVAVG_N + 1.0);
return;
}
/*========================================================================*/
/* PRIVATE FUNCTIONS */
/*========================================================================*/
uint8_t AMS_AS5048B::readReg8(uint8_t address) {
uint8_t readValue;
byte requestResult;
uint8_t nbByte2Read = 1;
Wire.beginTransmission(_chipAddress);
Wire.write(address);
requestResult = Wire.endTransmission(false);
if (requestResult){
Serial.print("I2C error: ");
Serial.println(requestResult);
}
Wire.requestFrom(_chipAddress, nbByte2Read);
readValue = (uint8_t) Wire.read();
return readValue;
}
uint16_t AMS_AS5048B::readReg16(uint8_t address) {
//16 bit value got from 2 8bits registers (7..0 MSB + 5..0 LSB) => 14 bits value
uint8_t nbByte2Read = 2;
byte requestResult;
byte readArray[2];
uint16_t readValue = 0;
Wire.beginTransmission(_chipAddress);
Wire.write(address);
requestResult = Wire.endTransmission(false);
if (requestResult){
Serial.print("I2C error: ");
Serial.println(requestResult);
}
Wire.requestFrom(_chipAddress, nbByte2Read);
for (byte i=0; i < nbByte2Read; i++) {
readArray[i] = Wire.read();
}
readValue = (((uint16_t) readArray[0]) << 6);
readValue += (readArray[1] & 0x3F);
/*
Serial.println(readArray[0], BIN);
Serial.println(readArray[1], BIN);
Serial.println(readValue, BIN);
*/
return readValue;
}
void AMS_AS5048B::writeReg(uint8_t address, uint8_t value) {
Wire.beginTransmission(_chipAddress);
Wire.write(address);
Wire.write(value);
Wire.endTransmission();
return;
}
double AMS_AS5048B::convertAngle(int unit, double angle) {
// convert raw sensor reading into angle unit
double angleConv;
switch (unit) {
case U_RAW:
//Sensor raw measurement
angleConv = angle;
break;
case U_TRN:
//full turn ratio
angleConv = (angle / AS5048B_RESOLUTION);
break;
case U_DEG:
//degree
angleConv = (angle / AS5048B_RESOLUTION) * 360.0;
break;
case U_RAD:
//Radian
angleConv = (angle / AS5048B_RESOLUTION) * 2 * M_PI;
break;
case U_MOA:
//minute of arc
angleConv = (angle / AS5048B_RESOLUTION) * 60.0 * 360.0;
break;
case U_SOA:
//second of arc
angleConv = (angle / AS5048B_RESOLUTION) * 60.0 * 60.0 * 360.0;
break;
case U_GRAD:
//grade
angleConv = (angle / AS5048B_RESOLUTION) * 400.0;
break;
case U_MILNATO:
//NATO MIL
angleConv = (angle / AS5048B_RESOLUTION) * 6400.0;
break;
case U_MILSE:
//Swedish MIL
angleConv = (angle / AS5048B_RESOLUTION) * 6300.0;
break;
case U_MILRU:
//Russian MIL
angleConv = (angle / AS5048B_RESOLUTION) * 6000.0;
break;
default:
//no conversion => raw angle
angleConv = angle;
break;
}
return angleConv;
}
double AMS_AS5048B::getExpAvgRawAngle(void) {
double angle;
double twopi = 2 * M_PI;
if (_movingAvgExpSin < 0.0) {
angle = twopi - acos(_movingAvgExpCos);
}
else {
angle = acos(_movingAvgExpCos);
}
angle = (angle / twopi) * AS5048B_RESOLUTION;
return angle;
}
void AMS_AS5048B::printDebug(void) {
return;
}

View File

@ -0,0 +1,150 @@
/**************************************************************************/
/*!
@file ams_as5048b.h
@author SOSAndroid.fr (E. Ha.)
@section HISTORY
v1.0 - First release
v1.0.1 - Typo to allow compiling on Codebender.cc (Math.h vs math.h)
v1.0.2 - Small bug fix and improvement by @DavidHowlett
Library to interface the AS5048B magnetic rotary encoder from AMS over the I2C bus
@section LICENSE
Software License Agreement (BSD License)
Copyright (c) 2013, SOSAndroid.fr (E. Ha.)
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.
*/
/**************************************************************************/
#if ARDUINO >= 100
#include <Arduino.h>
#else
#include <WProgram.h>
#endif
#include <math.h>
#include <Wire.h>
#ifndef _AMS_AS5048B_H_
#define _AMS_AS5048B_H_
// OPERATIONS
#define SERIAL_DEBUG_ENABLED
#define USE_WIREBEGIN_ENABLED // to comment if Wire.begin() function is called in Setup() for instance. Usefull to manage one or several I2C devices in the same sketch
// Default addresses for AS5048B
#define AS5048_ADDRESS 0x40 // 0b10000 + ( A1 & A2 to GND)
#define AS5048B_PROG_REG 0x03
#define AS5048B_ADDR_REG 0x15
#define AS5048B_ZEROMSB_REG 0x16 //bits 0..7
#define AS5048B_ZEROLSB_REG 0x17 //bits 0..5
#define AS5048B_GAIN_REG 0xFA
#define AS5048B_DIAG_REG 0xFB
#define AS5048B_MAGNMSB_REG 0xFC //bits 0..7
#define AS5048B_MAGNLSB_REG 0xFD //bits 0..5
#define AS5048B_ANGLMSB_REG 0xFE //bits 0..7
#define AS5048B_ANGLLSB_REG 0xFF //bits 0..5
#define AS5048B_RESOLUTION 16384.0 //14 bits
// Moving Exponential Average on angle - beware heavy calculation for some Arduino boards
// This is a 1st order low pass filter
// Moving average is calculated on Sine et Cosine values of the angle to provide an extrapolated accurate angle value.
#define EXP_MOVAVG_N 5 //history length impact on moving average impact - keep in mind the moving average will be impacted by the measurement frequency too
#define EXP_MOVAVG_LOOP 1 //number of measurements before starting mobile Average - starting with a simple average - 1 allows a quick start. Value must be 1 minimum
//unit consts - just to make the units more readable
#define U_RAW 1
#define U_TRN 2
#define U_DEG 3
#define U_RAD 4
#define U_GRAD 5
#define U_MOA 6
#define U_SOA 7
#define U_MILNATO 8
#define U_MILSE 9
#define U_MILRU 10
class AMS_AS5048B {
public:
AMS_AS5048B(void);
AMS_AS5048B(uint8_t chipAddress);
void begin(void); // to init the object, must be called in the setup loop
void toggleDebug(void); // start / stop debug through serial at anytime
void setClockWise(boolean cw = true); //set clockwise counting, default is false (native sensor)
void progRegister(uint8_t regVal); //nothing so far - manipulate the OTP register
void doProg(void); //progress programming slave address OTP
void doProgZero(void); //progress programming zero position OTP
void addressRegW(uint8_t regVal); //change the chip address
uint8_t addressRegR(void); //read chip address
void setZeroReg(void); //set Zero to current angle position
void zeroRegW(uint16_t regVal); //write Zero register value
uint16_t zeroRegR(void); //read Zero register value
uint16_t angleRegR(void); //read raw value of the angle register
uint8_t diagR(void); //read diagnostic register
uint16_t magnitudeR(void); //read current magnitude
double angleR(int unit = U_RAW, boolean newVal = true); //Read current angle or get last measure with unit conversion : RAW, TRN, DEG, RAD, GRAD, MOA, SOA, MILNATO, MILSE, MILRU
uint8_t getAutoGain(void);
uint8_t getDiagReg(void);
void updateMovingAvgExp(void); //measure the current angle and feed the Exponential Moving Average calculation
double getMovingAvgExp(int unit = U_RAW); //get Exponential Moving Average calculation
void resetMovingAvgExp(void); //reset Exponential Moving Average calculation values
private:
//variables
boolean _debugFlag;
boolean _clockWise;
uint8_t _chipAddress;
uint8_t _addressRegVal;
uint16_t _zeroRegVal;
double _lastAngleRaw;
double _movingAvgExpAngle;
double _movingAvgExpSin;
double _movingAvgExpCos;
double _movingAvgExpAlpha;
int _movingAvgCountLoop;
//methods
uint8_t readReg8(uint8_t address);
uint16_t readReg16(uint8_t address); //16 bit value got from 2x8bits registers (7..0 MSB + 5..0 LSB) => 14 bits value
void writeReg(uint8_t address, uint8_t value);
double convertAngle(int unit, double angle); //RAW, TRN, DEG, RAD, GRAD, MOA, SOA, MILNATO, MILSE, MILRU
double getExpAvgRawAngle(void);
void printDebug(void);
};
#endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,593 @@
:100000000C9463000C948B000C948B000C94690589
:100010000C9469050C9469050C948B000C948B006E
:100020000C948B000C948B000C948B000C94A80403
:100030000C948B000C948B000C948B000C948B0014
:100040000C9434080C948B000C9448030C942203F9
:100050000C948B000C948B000C948B000C948B00F4
:100060000C947A030C948B000000000024002700FD
:100070002A0000000008000201000003040700003D
:1000800000000000000000000000250028002B00F8
:1000900000000000230026002900040404040404D6
:1000A0000404020202020202030303030303010227
:1000B00004081020408001020408102001020408F6
:1000C00010200C0CF00B11241FBECFEFD8E0DEBFC8
:1000D000CDBF11E0A0E0B1E0E4E8F4E202C0059099
:1000E0000D92AA36B107D9F723E0AAE6B1E001C024
:1000F0001D92A03CB207E1F710E0C2E6D0E004C0D8
:100100002197FE010E942310C136D107C9F70E9432
:10011000A5080C9435120C940000CF92DF92EF9258
:10012000FF920F931F93CF93DF936C017A018B01A2
:10013000C0E0D0E0CE15DF0589F0D8016D918D01CA
:10014000D601ED91FC910190F081E02DC601099559
:10015000892B11F47E0102C02196ECCFC701DF91FB
:10016000CF911F910F91FF90EF90DF90CF90089566
:10017000FC01538D448D252F30E0842F90E0821BAD
:10018000930B541710F0CF96089501970895FC0132
:10019000918D828D981761F0828DDF01A80FB11DBE
:1001A0005D968C91928D9F5F9F73928F90E00895E2
:1001B0008FEF9FEF0895FC01918D828D981731F09C
:1001C000828DE80FF11D858D90E008958FEF9FEFF0
:1001D0000895FC01918D228D892F90E0805C9F4FC6
:1001E000821B91098F739927089585E692E00E94FA
:1001F000E90021E0892B09F420E0822F0895FC0119
:10020000848DDF01A80FB11DA35ABF4F2C91848D9F
:1002100090E001968F739927848FA689B7892C93D4
:10022000A089B1898C9180648C93938D848D98136F
:1002300006C00288F389E02D80818F7D8083089538
:10024000EF92FF920F931F93CF93DF93EC0181E026
:10025000888F9B8D8C8D981305C0E889F9898081E2
:1002600085FD24C0F62E0B8D10E00F5F1F4F0F731E
:100270001127E02E8C8DE8120CC00FB607FCFACFC8
:10028000E889F989808185FFF5CFCE010E94FF00C2
:10029000F1CF8B8DFE01E80FF11DE35AFF4FF08285
:1002A0000B8FEA89FB898081806207C0EE89FF8914
:1002B0006083E889F98980818064808381E090E0AF
:1002C000DF91CF911F910F91FF90EF900895CF9301
:1002D000DF93EC01888D8823C9F0EA89FB8980814E
:1002E00085FD05C0A889B9898C9186FD0FC00FB620
:1002F00007FCF5CF808185FFF2CFA889B9898C9161
:1003000085FFEDCFCE010E94FF00E7CFDF91CF91B7
:10031000089580E090E0892B29F00E94F50081117A
:100320000C940000089585ED8093BC008091BC0082
:1003300084FDFCCF1092400208954091D101262FF8
:1003400030E0240F311D21323105DCF420914002D0
:100350002430C9F4FC0180E090E0861758F4309115
:10036000D1012191DC01A155BE4FA30FB11D2C93EA
:100370000196F3CF8091D101680F6093D10180E0A5
:10038000089581E0089582E008952091AC013091B4
:10039000AD012817390771F49091AB018091AA0142
:1003A000981741F0E091AB01F0E0E659FE4F8081F3
:1003B00090E008958FEF9FEF089508951F93CF93D6
:1003C000DF93DC015C962D913C915D972115310501
:1003D00039F481E090E013969C938E9312973DC080
:1003E0005196ED91FC91529750969C915097892F80
:1003F00080951FB75E964C915E9741FB772770F909
:1004000041FD6095F8944081772311F0492B01C09C
:1004100048234083E9012197F1F748E0508160FFCC
:1004200002C0592B01C058235083E9012197F1F7ED
:100430006695415099F7772321F090818923808335
:1004400003C08081982B90831FBF5C968D919C91F7
:100450005D970197F1F721E030E0C901DF91CF917D
:100460001F9108952091AC013091AD0128173907F3
:1004700071F48091AA012091AB0190E0805C9F4FC4
:10048000821B910960E470E00E94FB0F089580E0F8
:1004900090E008952091AC013091AD012817390703
:1004A000B9F49091AB018091AA01981789F0E0917D
:1004B000AB01F0E0E659FE4F80812091AB0130E0C6
:1004C0002F5F3F4F2F7333272093AB0190E00895A8
:1004D0008FEF9FEF08950895E091F9018091F80161
:1004E000E81730F4F0E0E650FE4F808190E0089588
:1004F0008FEF9FEF08959091F9018091F80198177F
:1005000050F4E92FF0E0E650FE4F208130E09F5F8D
:100510009093F90102C02FEF3FEFC9010895809138
:10052000F80190E02091F901821B91090895CF9282
:10053000DF92EF92FF920F931F93CF93DF937C0193
:10054000262F972F8A0180914102882391F0C62F90
:10055000D72F6E01C40ED51ECC15DD0571F0699143
:10056000D701ED91FC910190F081E02DC701099533
:10057000F3CF642F822F0E949D01C801DF91CF919C
:100580001F910F91FF90EF90DF90CF900895CF9340
:10059000DF931F92CDB7DEB76983209141022223FA
:1005A000D1F020916402203240F021E030E0FC01E3
:1005B0003383228380E090E015C080914202E82FCF
:1005C000F0E0ED5BFD4F998190838F5F8093420255
:1005D0008093640205C061E0CE0101960E949D01F6
:1005E00081E090E00F90DF91CF910895089580E031
:1005F00090E008950E9420121092F9011092F801E3
:1006000010924202109264021092400281E08093A4
:100610003F0210921A0261E082E10E94870761E0C6
:1006200083E10E948707E9EBF0E080818E7F808381
:1006300080818D7F808388E48093B80085E48093F7
:10064000BC0008951F920F920FB60F9211242F93A2
:100650003F934F935F936F937F938F939F93AF934A
:10066000BF93EF93FF9385E692E00E94FF00FF9116
:10067000EF91BF91AF919F918F917F916F915F911A
:100680004F913F912F910F900FBE0F901F90189593
:100690001F920F920FB60F9211242F938F939F9357
:1006A000EF93FF93E0917502F09176028081E091E3
:1006B0007B02F0917C0282FD12C0908180917E02CB
:1006C0008F5F8F7320917F02821751F0E0917E023D
:1006D000F0E0EB59FD4F958F80937E0201C0808141
:1006E000FF91EF919F918F912F910F900FBE0F90DF
:1006F0001F9018951F920F920FB60F9211242F93EF
:100700003F934F935F936F937F938F939F93AF9399
:10071000BF93EF93FF938091B900887F803609F4EF
:100720009CC068F5883209F45BC090F4803109F40C
:1007300054C038F4882309F4F6C0883009F44DC059
:10074000F6C0883109F44CC0803209F45DC0EFC0B6
:10075000803409F468C048F4803309F455C0883304
:1007600009F0E5C080933E02D8C0803509F44FC03F
:10077000883509F45DC0883409F0D9C0D6C08839FD
:1007800009F4C7C0A8F4883709F467C038F488367C
:1007900009F463C0803709F460C0C9C0883809F41F
:1007A000B8C0803909F45FC0803809F0C0C05BC0B0
:1007B000803B09F486C038F4803A09F466C0883A70
:1007C00009F47FC0B4C0803C09F4A7C0883C09F498
:1007D000A4C0883B09F48AC0AAC080911B0210C043
:1007E00090913D0280913C02981770F5E0913D0296
:1007F00081E08E0F80933D02F0E0E45EFD4F80814A
:100800008093BB0085EC86C080933E028EC0E09151
:100810003D0281E08E0F80933D028091BB00F0E0AD
:10082000E45EFD4F808390913D0280913C026EC05A
:10083000E0913D0281E08E0F80933D028091BB00EC
:10084000F0E0E45EFD4F808380913F0281116DC036
:1008500081E080931A0284EA61C083E080934002C1
:100860001092F501CFCF8091F501803208F051C090
:10087000E091F50181E08E0F8093F5018091BB003E
:10088000F0E0EB52FE4F8083BDCF85EC8093BC003F
:10089000109240028091F501803230F4E091F50130
:1008A000F0E0EB52FE4F10826091F50170E0E091B4
:1008B000D301F091D40185ED91E009951092F501F5
:1008C00036C084E0809340021092D2011092D10190
:1008D000E091CF01F091D00109958091D101811172
:1008E00005C081E08093D1011092AF01E091D20167
:1008F00081E08E0F8093D201F0E0E155FE4F8081C0
:100900008093BB009091D2018091D101981708F497
:1009100079CF85E88093BC000AC085EC8093BC0049
:100920001092400204C010923E020E949301FF9177
:10093000EF91BF91AF919F918F917F916F915F9157
:100940004F913F912F910F900FBE0F901F901895D0
:100950001F920F920FB60F9211242F933F934F9334
:100960005F936F937F938F939F93AF93BF93EF9317
:10097000FF938091AE0187FF05C010928500109211
:1009800084001BC02091AE01022E000C330B80911D
:10099000320390E02817390784F48091AE01082EC5
:1009A000000C990BFC01EE0FFF1F8E0F9F1FFC0127
:1009B000E25FFC4F808186FD15C08091AE018F5FA4
:1009C0008093AE012091AE01022E000C330B80917A
:1009D000320390E028173907C4F48091AE018C30BF
:1009E00064F113C08091AE01082E000C990BFC013C
:1009F000EE0FFF1F8E0F9F1FFC01E25FFC4F8081F7
:100A000060E08F730E948707D8CF80918400909117
:100A10008500049680349C4918F480E49CE905C064
:100A20008091840090918500049690938900809332
:100A300088008FEF8093AE013BC0209184003091FD
:100A400085008091AE01082E000C990BFC01EE0F81
:100A5000FF1F8E0F9F1FFC01E25FFC4F818192817F
:100A6000820F931F90938900809388008091AE013C
:100A7000082E000C990BFC01EE0FFF1F8E0F9F1F1D
:100A8000FC01E25FFC4F808186FF12C08091AE01C5
:100A9000082E000C990BFC01EE0FFF1F8E0F9F1FFD
:100AA000FC01E25FFC4F808161E08F730E94870749
:100AB000FF91EF91BF91AF919F918F917F916F9136
:100AC0005F914F913F912F910F900FBE0F901F900C
:100AD00018951F920F920FB60F9211242F933F93E8
:100AE0004F935F936F937F938F939F93AF93BF9336
:100AF000EF93FF93E091AC01F091AD01309709F4D1
:100B000051C0968DA685B785858591FF04C09C91BF
:100B1000892329F447C09C91892309F043C0A38904
:100B2000B4899C918589809589238C93868997893E
:100B30000197F1F7608D718DA685B785558538E0F1
:100B400020E0CB010197F1F7822F90E095958795F2
:100B5000282F4C91452309F02068315091F7868D5C
:100B600081FD20958091AA0190E001968F739927CD
:100B70003091AB01381749F0A091AA01B0E0A65915
:100B8000BE4F2C938093AA0103C0868D8160868F0F
:100B9000828D938D0197F1F7A389B4899C91858902
:100BA000892B8C93FF91EF91BF91AF919F918F9182
:100BB0007F916F915F914F913F912F910F900FBE59
:100BC0000F901F901895009769F0FC01019000208C
:100BD000E9F73197AF01481B590BBC0185E692E05C
:100BE0000C948D0080E090E008958F929F92AF92D8
:100BF000BF920F931F93CF93DF93CDB7DEB7A1972B
:100C00000FB6F894DEBF0FBECDBF19A2423008F474
:100C10004AE08E010F5D1F4F842E912CA12CB12C28
:100C2000A50194010E94A60EE62FB901CA01015048
:100C30001109EA3014F4E05D01C0E95CD801EC93DD
:100C4000232B242B252B61F7C8010E94E305A196D5
:100C50000FB6F894DEBF0FBECDBFDF91CF911F91CD
:100C60000F91BF90AF909F908F900895382F209153
:100C7000640290916302213208F049C080914002E1
:100C80008111FCCF42E04093400230933F023FEF9E
:100C900030933E0210923D0220933C02A3E4B2E066
:100CA0004CE152E0FA013E2F341B321718F43D910B
:100CB0003193F9CF10921B0220911B02990F922BB6
:100CC00090931B0290911A02913061F410921A02D3
:100CD00090911B029093BB009091BC0093FDF8CFC4
:100CE00095EC01C095EE9093BC009091400292303B
:100CF000E1F390913E029F3F79F080913E02803275
:100D000041F080913E02803331F084E005C081E003
:100D100003C082E001C083E010924202109264029C
:100D2000109241020895909140029111FCCF6132DE
:100D300008F060E291E09093400290933F022FEF21
:100D400020933E0210923D02260F20933C02909386
:100D50001B0290911B02880F892B80931B028091AC
:100D60001A02813061F410921A0280911B02809362
:100D7000BB008091BC0083FDF8CF85EC01C085EEFF
:100D80008093BC00809140028130E1F380913D026C
:100D9000861710F460913D02ACE1B2E02AEF31E039
:100DA000F9018E2F821B861718F48D918193F9CF4C
:100DB0001092F9016093F801862F0895CF93DF9385
:100DC0009091350321E020934102909363021092A9
:100DD000420210926402682F82E093E00E94C702F0
:100DE00080E00E943606C82F882379F08CE391E0DA
:100DF0000E94E3056C2F70E080E090E04AE00E94E2
:100E0000F50588E491E00E94E30562E080913503F6
:100E10000E94930682E093E00E947B02EC0182E054
:100E200093E00E947B02DD2796E0CC0FDD1F9A95B0
:100E3000E1F78F739E01280F311DC901DF91CF911A
:100E400008952FB7F8948091B8039091B903A091B9
:100E5000BA03B091BB032FBF80939C0390939D0373
:100E6000A0939E03B0939F03E0919403F0919503A8
:100E70000284F385E02D84E993E0099597FF26C06D
:100E80002FB7F8948091B8039091B903A091BA0359
:100E9000B091BB032FBF40919C0350919D03609183
:100EA0009E0370919F03841B950BA60BB70B40917B
:100EB00098035091990360919A0370919B03841752
:100EC0009507A607B70780F28FEF9FEF089560E0C0
:100ED00082E093E00C94C702CF93C62F90919303C6
:100EE00021E02093410290936302109242021092FB
:100EF0006402682F82E093E00E94C7026C2F82E0B8
:100F000093E00E94C70281E0CF910C94360690E0F6
:100F1000FC01EE58FF4F3491FC01E255FF4F249144
:100F2000FC01E656FF4FE491EE2309F43BC0332366
:100F300039F1333091F038F43130A9F0323001F525
:100F400084B58F7D12C0373091F03830A1F0343045
:100F5000B9F4809180008F7D03C0809180008F77ED
:100F6000809380000DC084B58F7784BD09C08091C7
:100F7000B0008F7703C08091B0008F7D8093B00068
:100F8000F0E0EE0FFF1FEA57FF4FA591B4918FB726
:100F9000F894EC91611103C020952E2301C02E2BF3
:100FA0002C938FBF0895CF93DF9390E0FC01E2551F
:100FB000FF4F2491FC01E656FF4F8491882361F195
:100FC00090E0880F991FFC01E859FF4FC591D4911B
:100FD000FC01EA57FF4FA591B491611109C09FB779
:100FE000F8948881209582238883EC912E230BC06E
:100FF000623061F49FB7F8943881822F8095832303
:101000008883EC912E2B2C939FBF06C08FB7F8944A
:10101000E8812E2B28838FBFDF91CF9108953FB7B2
:10102000F8948091B4039091B503A091B603B09168
:10103000B70326B5A89B05C02F3F19F00196A11D47
:10104000B11D3FBFBA2FA92F982F8827820F911D5E
:10105000A11DB11DBC01CD0142E0660F771F881FA5
:10106000991F4A95D1F708951F920F920FB60F92CC
:1010700011242F933F938F939F93AF93BF938091AE
:10108000B8039091B903A091BA03B091BB0330911A
:10109000B30323E0230F2D3720F40196A11DB11DCA
:1010A00005C026E8230F0296A11DB11D2093B303AE
:1010B0008093B8039093B903A093BA03B093BB0392
:1010C0008091B4039091B503A091B603B091B7039A
:1010D0000196A11DB11D8093B4039093B503A09315
:1010E000B603B093B703BF91AF919F918F913F919A
:1010F0002F910F900FBE0F901F9018950F931F9375
:10110000CF93DF93EC0188819981009729F02A81A0
:101110003B812617370788F48B016F5F7F4F0E9452
:101120005611009761F0998388831B830A832C8171
:101130003D81232B11F4FC01108281E001C080E08D
:10114000DF91CF911F910F910895CF93DF93CDB78A
:10115000DEB728970FB6F894DEBF0FBECDBF7894E8
:1011600084B5826084BD84B5816084BD85B58260AC
:1011700085BD85B5816085BD80916E00816080935D
:101180006E001092810080918100826080938100C6
:1011900080918100816080938100809180008160D6
:1011A000809380008091B10084608093B100809131
:1011B000B00081608093B00080917A008460809359
:1011C0007A0080917A00826080937A0080917A0020
:1011D000816080937A0080917A00806880937A00A1
:1011E0001092C100E0917502F091760282E0808356
:1011F000E0917102F09172021082E0917302F0911D
:1012000074028FEC808310927D02E0917902F0915C
:101210007A0286E08083E0917702F0917802808103
:1012200080618083E0917702F0917802808188600C
:101230008083E0917702F0917802808180688083DA
:10124000E0917702F091780280818F7D808382E047
:1012500093E090935703809356030E94FC0282E030
:1012600093E00E94FC0260E080E00E946C0780E452
:1012700096E090935A03809359038091930391E0F1
:101280009093410280936302109242021092640292
:1012900060E082E093E00E94C70281E00E9436068F
:1012A00061E0809193030E94930682E093E00E94A4
:1012B0007B02182F682F6F76606180E00E946C07B8
:1012C00063E08EEF0E946C07612F80E00E946C0744
:1012D0000E940F084B015C0195E0C92ED12CE12C36
:1012E000F12C0E940F08DC01CB0188199909AA0989
:1012F000BB09883E9340A105B10558F021E0C21A10
:10130000D108E108F10888EE880E83E0981EA11C40
:10131000B11CC114D104E104F10419F7612F616A11
:1013200080E00E946C0716E001E080919303009337
:101330004102809363021092420210926402612F74
:1013400082E093E00E94C7020E9467070E9467073D
:101350000E9467070E94670781E00E9436061C5FB3
:10136000163419F70091540310915503F8012285A2
:101370003385AAE0B0E00E94C80E9B01AC01C12CED
:1013800087E8D82E83E9E82E83E0F82EC701B6015E
:101390000E94A60EF801208331834283538300917B
:1013A000520310915303F80122853385AAE0B0E07F
:1013B0000E94C80E9B01AC01C701B6010E94A60E97
:1013C000F801208331834283538380914F038C3013
:1013D00008F051C061E088E00E94D30780914F037C
:1013E000E82FF0E09F01220F331FE20FF31FE25FAF
:1013F000FC4F9081907C98609083109250031092E3
:1014000051036CE00E94EF0FFCE08F9FB0011124AC
:1014100040E050E09A01260F371FF901EE0FFF1F41
:101420002E0F3F1FF901E25FFC4F908196FD16C021
:101430004F5F5F4F4C30510569F781110FC010921B
:10144000800082E0809381001092850010928400D9
:10145000B19A80916F00826080936F00E0914F039A
:10146000F0E0CF01880F991FE80FF91FE25FFC4FF2
:1014700080818064808382E093E00E94FC0211E01E
:1014800010933303109234031092390310923A03ED
:1014900010923B0310923C0386E10E94DE0690937B
:1014A0003803809337038091350310934102809372
:1014B0006302109242021092640265E182E093E0BE
:1014C0000E94C70280E00E943606182F882379F018
:1014D0008CE391E00E94E305612F70E080E090E0F2
:1014E0004AE00E94F50588E491E00E94E30561E08E
:1014F000809135030E94930682E093E00E947B0274
:101500008093360310923D0310923E0310923F03E6
:101510001092400310924E0310924D038BEA9AEA08
:10152000AAEABEE38093490390934A03A0934B0336
:10153000B0934C0322242394312C02E010E084E980
:1015400093E00E943202892B09F448C01A82198262
:101550001C821B821E821D8260E070E0CE0101961B
:101560000E947E0829813A8181110DC02115310523
:1015700019F0C9010E94BE101A8219821E821D82B2
:101580001C821B8223C01E821D826AE471E0C90195
:101590000E942E121BC08F831886ED80FE802FEFD5
:1015A000E21AF20AB701CE0101960E947E08882352
:1015B00069F029813A818D819E81BE01695F7F4FEB
:1015C000820F931F0E942E12FE82ED820E9421073D
:1015D00097FFE1CF89819A810E94BE1085E692E053
:1015E0000E94E90080913403882341F08EEF0E942D
:1015F000DE066FEF7FE3681B790B04C08EEF0E945D
:10160000DE06BC0180E090E00E94500D609339033B
:1016100070933A0380933B0390933C0320E030E0C7
:1016200040E858E30E94B10D20E030E044EB53E481
:101630000E94B10D6B017C014B015C019B01AC016F
:101640000E94EA0F882319F08BE491E01AC026016A
:101650003701E89477F82FEF3FEF4FE75FE7C301DB
:10166000B2010E94EA0F81110FC02FEF3FEF4FE749
:101670005FE7C301B2010E944B0D18162CF48FE4F2
:1016800091E00E94E3058CC02FEF3FEF4FE75FE44E
:10169000C701B6010E94E50F18161CF483E591E01E
:1016A000F0CF2FEF3FEF4FE75FECC701B6010E948D
:1016B0004B0D87FDF3CF20E030E0A901C701B60153
:1016C0000E944B0D87FF11C0E0916502F091660208
:1016D0000190F081E02D6DE285E692E009954601EA
:1016E0005701B7FAB094B7F8B0949AE0F92E60E0D9
:1016F00070E080E09FE320E030E040E251E40E94AF
:10170000440FFA94F110F7CF9B01AC01C501B4016D
:101710000E94D80E6B017C010E94B60F4B015C0148
:101720000E94500D9B01AC01C701B6010E94D70E6B
:101730006B017C014AE0C501B4010E94F505E0910E
:101740006502F09166020190F081E02D6EE285E67F
:1017500092E009958BE0B82EBA94BB2009F120E005
:1017600030E040E251E4C701B6010E94B10D2B0107
:101770003C010E94B60F6B01E12CF12C4AE0C7013D
:10178000B6010E94F505C701B6010E94500D9B01EC
:10179000AC01C301B2010E94D70E6B017C01DCCF0A
:1017A00088E491E00E94E3058091F6019091F701B1
:1017B000009739F0019789F41093F7010093F6012F
:1017C0000CC087E591E00E94E30588E491E00E9467
:1017D000E3053092F7012092F6010E948901AFCE15
:1017E0008EE291E090939503809394038091AC01F5
:1017F0009091AD018459934071F4E091A703F09169
:10180000A80390818091A9038095892380831092F9
:10181000AD011092AC010895109268021092670217
:1018200088EE93E0A0E0B0E08093690290936A02B2
:10183000A0936B02B0936C022AE031E03093660211
:101840002093650225EC30E0309372022093710200
:1018500024EC30E0309374022093730220EC30E0EB
:10186000309376022093750221EC30E030937802B9
:101870002093770222EC30E030937A0220937902B1
:1018800026EC30E030937C0220937B0210927E02A3
:1018900010927F0210928002109281021092050332
:1018A000109204038093060390930703A093080308
:1018B000B09309032CE131E030930303209302033A
:1018C0001092970310929603809398039093990334
:1018D000A0939A03B0939B038EE291E090939503BB
:1018E000809394031092AB031092AA031092AD035D
:1018F0001092AC031092AF031092AE031092B1039A
:101900001092B0036091B2036E7F6D7F6093B2035B
:101910006695617081E0682784E00E94870761E036
:1019200084E00E94D307E2EBF0E0E491E093A403AB
:10193000EEE9F0E0E491F0E0EE0FFF1FEA57FF4F11
:10194000859194919093A6038093A50360E082E033
:101950000E94D3078091B20381FD04C061E082E060
:101960000E94870782E08093A003E0EBF0E0E4911F
:10197000E093A103ECE9F0E0E491F0E0EE0FFF1F4B
:10198000E057FF4F859194919093A3038093A20316
:10199000EDE5F3E01282118213821082DF011197CC
:1019A0001C9211971C92369683E0E537F80791F761
:1019B00086E593E010927F031092820310928F03CA
:1019C00021E6209358032093930321E02093920370
:1019D00028EC30E030938E0320938D039093910395
:1019E0008093900342E04093870347E040938A034B
:1019F00044E04093880343E04093890345E04093EB
:101A00008B0346E040938C0343E853E05093550327
:101A10004093540330937E0320937D03909381037E
:101A20008093800388E0809377038DE080937A032E
:101A30008AE08093780389E0809379038BE0809338
:101A40007B038CE080937C0383E793E090935303C4
:101A500080935203809132038C30A0F491E0980F70
:101A60009093320380934F0390E0FC01EE0FFF1F31
:101A70008E0F9F1FFC01E25FFC4F88EB9BE092837F
:101A8000818303C08FEF80934F0380E480933503FD
:101A90001092330308950E948D0D08F481E008959B
:101AA000E89409C097FB3EF49095809570956195F8
:101AB0007F4F8F4F9F4F9923A9F0F92F96E9BB27AE
:101AC0009395F695879577956795B795F111F8CF2A
:101AD000FAF4BB0F11F460FF1BC06F5F7F4F8F4F95
:101AE0009F4F16C0882311F096E911C0772321F08B
:101AF0009EE8872F762F05C0662371F096E8862F23
:101B000070E060E02AF09A95660F771F881FDAF779
:101B1000880F9695879597F90895990F0008550FA6
:101B2000AA0BE0E8FEEF16161706E807F907C0F063
:101B300012161306E407F50798F0621B730B840B6B
:101B4000950B39F40A2661F0232B242B252B21F445
:101B500008950A2609F4A140A6958FEF811D811DE5
:101B600008950E94C40D0C94350E0E94270E38F083
:101B70000E942E0E20F0952311F00C941E0E0C9452
:101B8000240E11240C94690E0E94460E70F3959F4A
:101B9000C1F3950F50E0551F629FF001729FBB2764
:101BA000F00DB11D639FAA27F00DB11DAA1F649F00
:101BB0006627B00DA11D661F829F2227B00DA11DB3
:101BC000621F739FB00DA11D621F839FA00D611D39
:101BD000221F749F3327A00D611D231F849F600D5A
:101BE000211D822F762F6A2F11249F5750409AF083
:101BF000F1F088234AF0EE0FFF1FBB1F661F771F0F
:101C0000881F91505040A9F79E3F510580F00C94D9
:101C10001E0E0C94690E5F3FE4F3983ED4F3869554
:101C200077956795B795F795E7959F5FC1F7FE2B79
:101C3000880F911D9695879597F9089597F99F6755
:101C400080E870E060E008959FEF80EC0895002444
:101C50000A941616170618060906089500240A9411
:101C600012161306140605060895092E0394000C97
:101C700011F4882352F0BB0F40F4BF2B11F460FF26
:101C800004C06F5F7F4F8F4F9F4F089557FD90584F
:101C9000440F551F59F05F3F71F04795880F97FB30
:101CA000991F61F09F3F79F08795089512161306EA
:101CB0001406551FF2CF4695F1DF08C01616170619
:101CC0001806991FF1CF869571056105089408954E
:101CD000E894BB2766277727CB0197F908952F92C1
:101CE0003F924F925F926F927F928F929F92AF92AC
:101CF000BF92CF92DF92EF92FF920F931F93CF93F9
:101D0000DF93CDB7DEB7CA1BDB0B0FB6F894DEBF8F
:101D10000FBECDBF09942A88398848885F846E84B5
:101D20007D848C849B84AA84B984C884DF80EE80FF
:101D3000FD800C811B81AA81B981CE0FD11D0FB608
:101D4000F894DEBF0FBECDBFED010895A1E21A2EBB
:101D5000AA1BBB1BFD010DC0AA1FBB1FEE1FFF1F4F
:101D6000A217B307E407F50720F0A21BB30BE40B9F
:101D7000F50B661F771F881F991F1A9469F76095E6
:101D80007095809590959B01AC01BD01CF010895A0
:101D9000A29FB001B39FC001A39F700D811D1124AC
:101DA000911DB29F700D811D1124911D08955058F1
:101DB000BB27AA270E94EF0E0C94350E0E94270E17
:101DC00038F00E942E0E20F039F49F3F19F426F4CB
:101DD0000C94240E0EF4E095E7FB0C941E0EE92FF4
:101DE0000E94460E58F3BA176207730784079507D7
:101DF00020F079F4A6F50C94680E0EF4E0950B2E05
:101E0000BA2FA02D0B01B90190010C01CA01A0014C
:101E10001124FF27591B99F0593F50F4503E68F1A7
:101E20001A16F040A22F232F342F4427585FF3CFE8
:101E3000469537952795A795F0405395C9F77EF4B9
:101E40001F16BA0B620B730B840BBAF09150A1F002
:101E5000FF0FBB1F661F771F881FC2F70EC0BA0F88
:101E6000621F731F841F48F4879577956795B79510
:101E7000F7959E3F08F0B0CF9395880F08F099270B
:101E8000EE0F9795879508950E94580F0C94350E84
:101E90000E942E0E58F00E94270E40F029F45F3F5A
:101EA00029F00C941E0E51110C94690E0C94240E02
:101EB0000E94460E68F39923B1F3552391F3951BC5
:101EC000550BBB27AA2762177307840738F09F5F5B
:101ED0005F4F220F331F441FAA1FA9F335D00E2EC8
:101EE0003AF0E0E832D091505040E695001CCAF735
:101EF0002BD0FE2F29D0660F771F881FBB1F2617F8
:101F000037074807AB07B0E809F0BB0B802DBF01CE
:101F1000FF2793585F4F3AF09E3F510578F00C949D
:101F20001E0E0C94690E5F3FE4F3983ED4F3869541
:101F300077956795B795F7959F5FC9F7880F911DBE
:101F40009695879597F90895E1E0660F771F881FAA
:101F5000BB1F621773078407BA0720F0621B730B5D
:101F6000840BBA0BEE1F88F7E09508950E944E0E81
:101F700088F09F5798F0B92F9927B751B0F0E1F04A
:101F8000660F771F881F991F1AF0BA95C9F714C0FA
:101F9000B13091F00E94680EB1E008950C94680E83
:101FA000672F782F8827B85F39F0B93FCCF3869533
:101FB00077956795B395D9F73EF490958095709590
:101FC00061957F4F8F4F9F4F08950E948D0D08F4AC
:101FD0008FEF08950E948D0D880B990B0895991B22
:101FE00079E004C0991F961708F0961B881F7A9510
:101FF000C9F78095089597FB072E16F4009407D033
:1020000077FD09D00E940F1007FC05D03EF4909593
:1020100081959F4F0895709561957F4F0895AA1BF4
:10202000BB1B51E107C0AA1FBB1FA617B70710F0C3
:10203000A61BB70B881F991F5A95A9F780959095F5
:10204000BC01CD010895EE0FFF1F0590F491E02D26
:102050000994CF93DF938230910510F482E090E0F1
:10206000E091BE03F091BF0320E030E0C0E0D0E09B
:10207000309711F14081518148175907C0F0481736
:10208000590761F482819381209719F09B838A8399
:102090002BC09093BF038093BE0326C0211531054A
:1020A00019F04217530718F49A01BE01DF01EF013E
:1020B0000280F381E02DDCCF2115310509F1281BC9
:1020C000390B2430310590F412968D919C91139721
:1020D0006115710521F0FB019383828304C0909305
:1020E000BF038093BE03FD01329644C0FD01E20FA1
:1020F000F31F81939193225031092D933C933AC061
:102100002091BC033091BD03232B41F420910201A7
:10211000309103013093BD032093BC032091000153
:10212000309101012115310541F42DB73EB74091A1
:10213000040150910501241B350BE091BC03F09183
:10214000BD03E217F307A0F42E1B3F0B2817390736
:1021500078F0AC014E5F5F4F2417350748F04E0F03
:102160005F1F5093BD034093BC038193919302C0C2
:10217000E0E0F0E0CF01DF91CF9108950F931F933E
:10218000CF93DF93009709F48CC0FC013297138240
:1021900012820091BE031091BF030115110581F455
:1021A00020813181820F931F2091BC033091BD03A8
:1021B0002817390779F5F093BD03E093BC0371C08C
:1021C000D80140E050E0AE17BF0750F412962D91B1
:1021D0003C911397AD012115310509F1D901F3CFD8
:1021E0009D01DA013383228360817181860F971FFD
:1021F0008217930769F4EC0128813981260F371F74
:102200002E5F3F4F318320838A819B81938382831A
:10221000452B29F4F093BF03E093BE0342C013960D
:10222000FC93EE931297ED01499159919E01240F71
:10223000351FE217F30771F480819181840F951F98
:10224000029611969C938E938281938113969C9310
:102250008E931297E0E0F0E0D80112968D919C9158
:102260001397009719F0F8018C01F6CF8D919C918E
:1022700098012E5F3F4F820F931F2091BC03309136
:10228000BD032817390769F4309729F41092BF036A
:102290001092BE0302C0138212821093BD030093FA
:1022A000BC03DF91CF911F910F910895A0E0B0E0A2
:1022B000ECE5F1E10C94730EEC01009721F4CB01F5
:1022C0000E942910B8C0FC01E60FF71F9C012250A4
:1022D0003109E217F30708F4ACC0D9010D911C9144
:1022E000119706171707B0F00530110508F49FC0C5
:1022F000C80104978617970708F499C0025011097E
:10230000061B170B019311936D937C93CF010E94D1
:10231000BE108DC05B01A01AB10A4C01800E911E47
:10232000A091BE03B091BF0340E050E0E12CF12C3E
:10233000109709F44AC0A815B905D1F56D907C90A5
:102340001197630182E0C80ED11CCA14DB0480F12E
:10235000A3014A195B096A0182E0C80ED11C1296DA
:10236000BC9012971396AC91B5E0CB16D10440F017
:10237000B282A38351834083D9016D937C930AC0B9
:102380000E5F1F4FC301800F911FF901918380835E
:10239000EB2DFA2FE114F10431F0D7011396FC93E1
:1023A000EE93129744C0F093BF03E093BE033FC087
:1023B0008D919C9111974817590708F4AC017D0144
:1023C00012960D90BC91A02DB3CF8091BC0390913B
:1023D000BD0388159905E1F446175707C8F48091A5
:1023E000000190910101009741F48DB79EB7409193
:1023F000040150910501841B950BE817F907C8F4F7
:10240000F093BD03E093BC03F901718360830FC0B7
:10241000CB010E9429107C01009759F0A801BE0150
:102420000E942512CE010E94BE10C70104C0CE0139
:1024300002C080E090E0CDB7DEB7EEE00C948F0EE6
:1024400081E090E0F8940C943512FB01DC0102C0AD
:1024500001900D9241505040D8F70895FB01DC01E6
:1024600001900D920020E1F7089510E0C2E6D0E05F
:1024700004C0FE010E9423102196C336D107C9F77C
:04248000F894FFCFFE
:102484000000C00380000000000020018D00B8009F
:102494006701E900C700DB0000000000C7029702E3
:1024A400F7026B028F027B026C0200000000DE0167
:1024B4008D00F702DD0132024A02C5014932432090
:1024C4006572726F723A20000D0A006E616E0069C7
:1024D4006E66006F76660073746174652073776945
:0A24E40074636820302D3E310000C3
:00000001FF